Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R具有一定公差的重叠点和多边形_R_Spatial_Sp_Sf - Fatal编程技术网

R具有一定公差的重叠点和多边形

R具有一定公差的重叠点和多边形,r,spatial,sp,sf,R,Spatial,Sp,Sf,使用R,我想覆盖一些空间点和多边形,以便为这些点指定我考虑过的地理区域的一些属性 我通常使用sp包的命令。我的问题是,我正在处理全球范围内发生的大量地理参考事件,在某些情况下(特别是在沿海地区),经纬度组合略低于国家/地区边界。 这里有一个基于此的可复制示例 这与@Gilles在其回答中提出的输出完全相同。 我只是想知道是否还有比这更有效的方法。我认为你不能在或其他常见的相交算法上添加“容差”。 通过缓冲多边形,可以添加一些公差,但有些点可能会落入两个不同的多边形中 一种可能是在多边形区域外的点

使用R,我想覆盖一些空间点和多边形,以便为这些点指定我考虑过的地理区域的一些属性

我通常使用
sp
包的
命令。我的问题是,我正在处理全球范围内发生的大量地理参考事件,在某些情况下(特别是在沿海地区),经纬度组合略低于国家/地区边界。
这里有一个基于此的可复制示例

这与@Gilles在其回答中提出的输出完全相同。
我只是想知道是否还有比这更有效的方法。

我认为你不能在
或其他常见的相交算法上添加“容差”。
通过缓冲多边形,可以添加一些公差,但有些点可能会落入两个不同的多边形中

一种可能是在多边形区域外的点周围创建缓冲区,将这些缓冲区与多边形相交,计算面积,并为每个点仅保留面积最大的线。与您建议的方法(查找最近的多边形)相比,这种方法的优点是,您不必计算所有多边形的距离

可能还有更直接的可能性

下面是一个使用
sf
操纵空间对象的示例,但是您当然可以使用
sp
rgeos
操纵空间对象
一个困难是找到合适的“容差”(缓冲区大小)级别。这里我使用了2km的公差

##你的例子
种子(1)
图书馆(光栅)
#>正在加载所需的包:sp
图书馆(rgdal)
图书馆(sp)

p以下是我使用sf的尝试。如果您盲目地想要将多边形特征连接到构成其最近邻的点,则使用
join=st\u nearest\u特征调用
st\u join
就足够了

library(sf)

# convert data to sf
pts_sf = st_as_sf(pts)
p_sf = st_as_sf(p)

# this is enough for joining polygon attributes to points from their nearest neighbor
st_join(pts_sf, p_sf, join = st_nearest_feature)
如果您希望能够设置一些公差,以便距离此公差更远的点不会连接任何多边形属性,我们需要创建自己的连接函数

st_nearest_feature2 = function(x, y, tolerance = 100) {
  isec = st_intersects(x, y)
  no_isec = which(lengths(isec) == 0)

  for (i in no_isec) {
    nrst = st_nearest_points(st_geometry(x)[i], y)
    nrst_len = st_length(nrst)
    nrst_mn = which.min(nrst_len)
    isec[i] = ifelse(as.vector(nrst_len[nrst_mn]) > tolerance, integer(0), nrst_mn)
  }

  unlist(isec)

}

st_join(pts_sf, p_sf, join = st_nearest_feature2, tolerance = 1000)
这与预期一样有效,即当您将
公差设置为零时,您将得到与over相同的结果,对于较大的值,您将接近上面的
st_最近_特征
结果

示例数据-

set.seed(1)
library(raster)
library(rgdal)
library(sp)
p <- shapefile(system.file("external/lux.shp", package="raster"))
p2 <- as(0.30*extent(p), "SpatialPolygons")
proj4string(p2) <- proj4string(p)
pts1 <- spsample(p2-p, n=3, type="random")
pts2<- spsample(p, n=10, type="random")
pts<-rbind(pts1, pts2)

## Plot to visualize
plot(p, col=colorRampPalette(blues9)(12))
plot(pts, pch=16, cex=.5,col="red", add=TRUE)
显示连接了哪些多边形和点的绘图-

# Visuzlize join
l = st_connect(pts, p, dist = 1)
plot(st_geometry(p))
plot(st_geometry(pts), add = TRUE)
plot(st_geometry(l), col = "red", lwd = 2, add = TRUE)

编辑:

# Spatial join with 100 meters threshold
p2 = st_join(pts, p, join = st_nn, maxdist = 100)
p2
## Simple feature collection with 13 features and 5 fields
## geometry type:  POINT
## dimension:      XY
## bbox:           xmin: 5.795068 ymin: 49.54622 xmax: 6.518138 ymax: 50.1426
## epsg (SRID):    4326
## proj4string:    +proj=longlat +datum=WGS84 +no_defs
## First 10 features:
##   ID_1       NAME_1 ID_2           NAME_2 AREA                  geometry
## 1    NA         <NA> <NA>             <NA>   NA POINT (6.235953 49.91801)
## 2    NA         <NA> <NA>             <NA>   NA POINT (6.251893 49.92177)
## 3     1     Diekirch    4          Vianden   76  POINT (6.236712 49.9023)
## 4     1     Diekirch    1         Clervaux  312  POINT (6.090294 50.1426)
## 5     1     Diekirch    5            Wiltz  263  POINT (5.948738 49.8796)
## 6     2 Grevenmacher   12     Grevenmacher  210 POINT (6.302851 49.66278)
## 7     2 Grevenmacher    6       Echternach  188 POINT (6.518138 49.76773)
## 8     3   Luxembourg    9 Esch-sur-Alzette  251 POINT (6.116905 49.56184)
## 9     1     Diekirch    3          Redange  259 POINT (5.932418 49.78505)
## 10    2 Grevenmacher    7           Remich  129 POINT (6.285379 49.54622)
#与100米阈值的空间连接
p2=st_连接(pts,p,连接=st_nn,最大距离=100)
p2
##具有13个功能和5个字段的简单功能集合
##几何图形类型:点
##尺寸:XY
##bbox:xmin:5.795068 ymin:49.54622 xmax:6.518138 ymax:50.1426
##epsg(SRID):4326
##proj4string:+proj=longlat+datum=WGS84+no_defs
##前10个功能:
##ID\u 1名称\u 1 ID\u 2名称\u 2区域几何图形
##1纳纳点(6.235953 49.91801)
##2纳纳点(6.251893 49.92177)
##迪基尔奇4维亚登76点(6.236712 49.9023)
##4迪基尔奇1克莱沃312点(6.090294 50.1426)
##5 1迪基尔奇5威尔茨263点(5.948738 49.8796)
##6 2格雷文马赫12格雷文马赫210分(6.302851 49.66278)
##7.2格雷文马赫6埃切特纳赫188点(6.518138 49.76773)
##8 3卢森堡9埃什苏尔阿尔泽特251点(6.116905 49.56184)
##9 1迪基尔奇3 Redange 259点(5.932418 49.78505)
##102格雷文马赫7雷米奇129分(6.285379.54622)

Hi@Gilles,非常感谢您的尝试。这将完成工作,但这仍然是一个相当长的过程。我将继续悬赏,寻找其他(更有效的)解决方案。是的,当然。。。我也很想看到其他的方法。您应该考虑方法的简单性(较短/更简单的代码)和计算效率……关于<代码>的输出超过
,我的歉意,我错误地报告了<代码> SET。我现在将编辑我的问题,使其与您的回答一致。要清楚,当您说寻找最近的邻居是一个缓慢的过程时,您的意思是从运行时的角度?对我来说是乏味的code@CalumYou,无论是在运行时还是在编码方面。我的意思是编码非常简单和直接,但是最好在
上有一个选项,它可以避免额外的编码来分配非常接近多边形边界的点,这是非常好的答案!请注意,要使st_nearest_功能正常工作,您需要最新的R软件包版本(不是在CRAN上,而是在github上):sf>=0.6.4和units>=0.6.0。您还需要GEOS>3.6。1@TimSalabim:回答得很好。这看起来是最有效的方法@吉勒斯:说得好。目前在CRAN(0.6-3版)中可用的
sf
软件包中没有
st\u最近点功能
st\u最近点
软件包sf的发布周期约为2个月,所以应该不会太长away@TimSalabim谢谢!我会等到明天再接受你的回答(并分配赏金),这样最终也可以提出和考虑其他方法。嗨,迈克尔。非常感谢这个非常好的答案。我喜欢这种简单的方法。我只有一点(次要)的意见:从你的绘图来看,即使是落在多边形内的点也被指定给最近的邻居,事实并非如此,因为你在空间连接中正确地计算了。现在,我在接受您的答案(基于当前可用的软件包)和@TimSalabim的答案(该答案还提供了设置公差半径的可能性)之间进行了辩论。这些都是我的时刻
set.seed(1)
library(raster)
library(rgdal)
library(sp)
p <- shapefile(system.file("external/lux.shp", package="raster"))
p2 <- as(0.30*extent(p), "SpatialPolygons")
proj4string(p2) <- proj4string(p)
pts1 <- spsample(p2-p, n=3, type="random")
pts2<- spsample(p, n=10, type="random")
pts<-rbind(pts1, pts2)

## Plot to visualize
plot(p, col=colorRampPalette(blues9)(12))
plot(pts, pch=16, cex=.5,col="red", add=TRUE)
library(nngeo)

# Convert to 'sf'
pts = st_as_sf(pts)
p = st_as_sf(p)

# Spatial join
p1 = st_join(pts, p, join = st_nn)
p1

## Simple feature collection with 13 features and 5 fields
## geometry type:  POINT
## dimension:      XY
## bbox:           xmin: 5.795068 ymin: 49.54622 xmax: 6.518138 ymax: 50.1426
## epsg (SRID):    4326
## proj4string:    +proj=longlat +datum=WGS84 +no_defs
## First 10 features:
##   ID_1       NAME_1 ID_2           NAME_2 AREA                  geometry
## 1     1     Diekirch    4          Vianden   76 POINT (6.235953 49.91801)
## 2     1     Diekirch    4          Vianden   76 POINT (6.251893 49.92177)
## 3     1     Diekirch    4          Vianden   76  POINT (6.236712 49.9023)
## 4     1     Diekirch    1         Clervaux  312  POINT (6.090294 50.1426)
## 5     1     Diekirch    5            Wiltz  263  POINT (5.948738 49.8796)
## 6     2 Grevenmacher   12     Grevenmacher  210 POINT (6.302851 49.66278)
## 7     2 Grevenmacher    6       Echternach  188 POINT (6.518138 49.76773)
## 8     3   Luxembourg    9 Esch-sur-Alzette  251 POINT (6.116905 49.56184)
## 9     1     Diekirch    3          Redange  259 POINT (5.932418 49.78505)
## 10    2 Grevenmacher    7           Remich  129 POINT (6.285379 49.54622)
# Visuzlize join
l = st_connect(pts, p, dist = 1)
plot(st_geometry(p))
plot(st_geometry(pts), add = TRUE)
plot(st_geometry(l), col = "red", lwd = 2, add = TRUE)
# Spatial join with 100 meters threshold
p2 = st_join(pts, p, join = st_nn, maxdist = 100)
p2
## Simple feature collection with 13 features and 5 fields
## geometry type:  POINT
## dimension:      XY
## bbox:           xmin: 5.795068 ymin: 49.54622 xmax: 6.518138 ymax: 50.1426
## epsg (SRID):    4326
## proj4string:    +proj=longlat +datum=WGS84 +no_defs
## First 10 features:
##   ID_1       NAME_1 ID_2           NAME_2 AREA                  geometry
## 1    NA         <NA> <NA>             <NA>   NA POINT (6.235953 49.91801)
## 2    NA         <NA> <NA>             <NA>   NA POINT (6.251893 49.92177)
## 3     1     Diekirch    4          Vianden   76  POINT (6.236712 49.9023)
## 4     1     Diekirch    1         Clervaux  312  POINT (6.090294 50.1426)
## 5     1     Diekirch    5            Wiltz  263  POINT (5.948738 49.8796)
## 6     2 Grevenmacher   12     Grevenmacher  210 POINT (6.302851 49.66278)
## 7     2 Grevenmacher    6       Echternach  188 POINT (6.518138 49.76773)
## 8     3   Luxembourg    9 Esch-sur-Alzette  251 POINT (6.116905 49.56184)
## 9     1     Diekirch    3          Redange  259 POINT (5.932418 49.78505)
## 10    2 Grevenmacher    7           Remich  129 POINT (6.285379 49.54622)