本篇推文翻译自Manuel Gimond的在线教程Intro to GIS and Spatial Analysis的附录F Raster operations in R,网址为https://mgimond.github.io/Spatial/raster-operations-in-r.html。原教程遵循CC BY-NC 4.0共享协议(https://creativecommons.org/licenses/by-nc/4.0/deed.zh)。

原文篇幅较长,共有6小节,这里翻译的是第5、6节。

5 Global operations and functions

全局操作符和函数在计算输出对象的像元值时,会使用输入对象中的所有像元。

全局函数的一个例子是计算欧几里得距离的distance()函数,它的功能是计算每个像元与对象最近位置的距离。为了描述distance()函数的功能,我们首先定义一个具有两个非空像元的栅格。

library(raster)
r1   <- raster(ncol = 100, nrow=100, xmn = 0, xmx = 100,ymn = 0, ymx = 100)
r1[] <- NA              # Assign NoData values to all pixels
r1[c(850, 5650)] <- 1   # Change the pixels #850 and #5650  to 1
crs(r1) <- "+proj=ortho"  # Assign an arbitrary coordinate system (needed for mapping with tmap)library(tmap)
tm_shape(r1) + tm_raster(palette="red") + tm_legend(outside = TRUE, text.size = .8)

接下来,我们来计算到这两个非空像元的距离,输出结果是栅格对象。默认情况下,它的范围与输入栅格对象相同。

r1.d <- distance(r1)
  • 译者注:raster工具包中的distance(x, y,...)函数,当输入对应只有一个栅格对象xy缺省)时,它计算的是x中每个空值像元与最近的非空像元之间的距离。

tm_shape(r1.d) + tm_raster(palette = "Greens", style = "order", title = "Distance") + tm_legend(outside = TRUE, text.size = .8) +tm_shape(r1) + tm_raster(palette = "red", title = "Points")

你也可以使用SpatialPoints类型的对象或简单的x/y表来得到一个距离栅格。接下来的例子中,我们计算的是输出栅格对象每个像元与点(25,30)和(87,80)之间的距离。但是,我们现在要使用的是点对象(而不是前面例子中使用的栅格对象),因此我们需要创建一个新的栅格对象,来定义输出栅格对象的范围。

# Create a blank raster
r2 <- raster(ncol = 100, nrow = 100, xmn = 0, xmx = 100, ymn = 0, ymx = 100)
crs(r2) <- "+proj=ortho"  # Assign an arbitrary coordinate system # Create a point layer
xy <- matrix(c(25,30,87,80), nrow = 2, byrow = T)
p1 <- SpatialPoints(xy)
crs(p1) <- "+proj=ortho"  # Assign an arbitrary coordinate system

现在,让我们使用distanceFromPoints()函数来计算到这两个点的欧几里得距离。

r2.d <- distanceFromPoints(r2, p1)

让我们来绘制输出结果。

tm_shape(r2.d) + tm_raster(palette = "Greens", style = "order") + tm_legend(outside = TRUE, text.size = .8) +tm_shape(p1) + tm_bubbles(col = "red")

6 Computing cumulative distances

这个练习将展示如何使用gdistance工具包中的函数得到累积距离栅格(cumulative distance raster)。目标之一就是说明“邻近像元”(adjacency cells)的定义对计算结果的影响。

加载gdistance工具包。

library(gdistance)

首先,我们定义一个100*100的栅格,并将每个像元的值设定为1。这个值表示穿过该像元的旅行成本(而不是距离本身)。在这个例子中,我们假定成本在整个范围内是相同的。

r   <- raster(nrows = 100, ncols = 100,xmn = 0, ymn = 0,xmx = 100, ymx = 100)
r[] <- rep(1, ncell(r))

如果想包括除距离以外的旅行成本(如海拔),你应该分别定义每个像元的值,而不是使用常量1。

可以使用转移矩阵(translation matrix)来定义邻近像元之间的旅行成本。因为我们假定从一个像元移动到它邻近的像元,除距离外没有其他成本,因此可以使用function(x) {1}来表示将一个像元转移到它邻近的像元上(也就是说,各个方向的转移成本是相同的)。

transition()函数中,有四种定义“邻近”的方式。接下来的四段代码分别对其进行演示。

在第一个例子中,邻近被定义成四节点(水平和垂直)连接(也就是"rook"型)。

h4 <- transition(r, transitionFunction = function(x){1},directions = 4)

第二个例子中,邻接被定义成八节点连接(也就是“queen”型)。

h8 <- transition(r, transitionFunction = function(x){1},directions = 8)

第三个例子中,邻近是十六节点连接(也就是“queen”和“knight”相结合型)。

h16 <- transition(r, transitionFunction=function(x){1},16, symm=FALSE)

第四个例子中,邻近是四节点对角线连接(也就是“bishop”型)。

hb <- transition(r, transitionFunction = function(x){1},"bishop", symm=FALSE)

transition()函数将所有邻近像元到源像元的距离看作是相同的。geoCorrection()函数则将其纠正为“真实”的局部距离。实际上,它是给一个像元到它邻近的像元添加了额外的成本(原始距离成本是通过transition()定义的)。纠正的必要性将在后文呈现。

注:geoCorrection()函数还可以校正由于地理坐标系统导致的距离失真,但请确保已经使用projection()函数定义了图层的坐标系统。

h4 <- geoCorrection(h4,  scl=FALSE)
h8 <- geoCorrection(h8,  scl=FALSE)
h16 <- geoCorrection(h16, scl=FALSE)
hb <- geoCorrection(hb,  scl=FALSE)

在“queen”型下,对角线方向的邻近像元到源像元的距离是像元宽距的倍。

接下来,我们将使用四种邻近的定义分别计算从中心点A到栅格所有像元的累积距离(accCost()函数)。

A <- c(50,50) # Location of source cell
h4.acc <- accCost(h4, A)
h8.acc <- accCost(h8, A)
h16.acc <- accCost(h16, A)
hb.acc <- accCost(hb, A)

如果在前面的步骤中没有使用geoCorrection()函数,那么累积距离的计算结果会有所不同。下面两幅图展示了在十六节点连接的邻近定义下二者的区别。

未校正(也就是没有对h16使用geoCorrection()函数):

校正(也就是对h16使用了geoCorrection()函数):

在“bishop”型情况下还会出现一个特殊的问题。因为只有对角线方向被定义成邻近像元,从而会存在一些与源像元不存在任意阶邻近关系的像元,它们在计算结果中值被标记为无穷(Inf)。我们将把无穷值像元改成空值像元。

hb.acc[hb.acc == Inf] <- NA

接下来,让我们比较以A为中心、7*7范围内的计算结果。

为了强调四种计算结果的差异,我们将与A点距离在20单位以内的像元标记为红色。

很显然,累积距离栅格的精度极大地受邻近定义的影响。红色像元(也就是累积距离在20单位以内)的个数从925到2749不等。

raster | R中的栅格操作符(下)[翻译]相关推荐

  1. raster | R中的栅格操作符(上)[翻译]

    本篇推文翻译自Manuel Gimond的在线教程Intro to GIS and Spatial Analysis的附录F Raster operations in R,网址为https://mgi ...

  2. magrittr | R语言的管道操作符

    管道操作符(Pipe Operator)是一个特定的符号,它可以将前一行代码的输出传递给后一行代码作为输入,从而将原本相互独立的两行代码连接在一起.而通过不断地使用管道操作符,最终可以将多行代码写成& ...

  3. raster | R语言中的空间栅格对象及其基本处理方法(Ⅰ)

    前面的系列推文已经完成了对R语言中的两个管理空间矢量数据的工具包(sf和sp)的介绍,以及空间自相关.空间插值等空间分析方法. 这里小编再推出一个系列来介绍R语言中管理空间栅格数据的工具包:raste ...

  4. 用博文中的方法-r -d \t试了下conlleval测试crf++的输出

     看到这篇 http://argcv.com/articles/2104.c 觉得不错 后来到官网上看了下http://www.cnts.ua.ac.be/conll2000/chunking/o ...

  5. python数据可视化库_python和r中用于数据可视化的前9个库

    python数据可视化库 In the rapidly growing world of today, when technology is expanding at a rate like neve ...

  6. linux 命令连接符,Linux 中命令链接操作符的十个最佳实例

    Linux 中命令链接操作符的十个最佳实例 日期:2017-12-14 浏览:1416次 评论:0条 侧边栏 英文:Tecmint,翻译:Linux中国/geekpi https://linux.cn ...

  7. 独家 | 在R中使用LIME解释机器学习模型

    作者:PURVAHUILGOL 翻译:陈丹 校对:欧阳锦 本文约3200字,建议阅读15分钟 本文为大家介绍如何在R中使用LIME来解释机器学习模型,并提供了相关代码. 关键词:机器学习模型解释.R语 ...

  8. 如何在R中正确使用列表?

    本文翻译自:How to Correctly Use Lists in R? Brief background: Many (most?) contemporary programming langu ...

  9. 如何找出R中加载的软件包版本?

    本文翻译自:How to find out which package version is loaded in R? I am in a process of figuring out how to ...

最新文章

  1. (纯干货)万字长文,数据分析利器 pandas 全教程
  2. ASCII码对照表 转帖
  3. 【POI word】使用POI实现对Word的读取以及生成
  4. C++CLR类库封装Native类库并用C#调用
  5. Matlab 2017a笔记
  6. javascript怎么判断对象为空
  7. 如何给硬盘分1T整数的空间
  8. java排除文件夹某文件,.gitignore排除文件夹,但包括特定的子文件夹
  9. 在mac11以上系统可用的cocosbuilder3.0,12也可用。
  10. 一键修改QQ运动刷步助手 V3.0
  11. pythonlinux安装 pandas_linux pandas安装
  12. 关于单链表中temp.next、head.next的理解
  13. hah4h4h4h4 im her3
  14. Unity不规则碰撞
  15. linux执行scp命令出错
  16. 用调整图层给照片上色
  17. canvas画圆和线条动画
  18. 怎样实现微信公众号点击菜单自动回复文字信息
  19. 区块链溯源:重塑咖啡产业链
  20. 关于adb指令安装卸载apk的几个常用命令

热门文章

  1. Docker学习总结(43)——Docker Compose 搭建Mysql主从复制集群
  2. 项目管理学习总结(4)——项目团队,如何展开有效沟通?
  3. echarts地图动画和java_echarts 实现中国地图
  4. php 面向对象问题,PHP 面向对象开发的一些问题
  5. python批量打印机excel_python批量设置多个Excel文件页眉页脚的脚本
  6. java重div获取下拉框值_获取下拉框的value和值
  7. linux动态调试工具od,OllyDBG(OD动态调试工具)
  8. mysql 查询所有鎖_mysql查询锁
  9. Homework-201521410028
  10. Oracle ORA-02069: 此操作的 global_names 参数必须设置为 TRUE