将空间点子集提取到多边形内部(国家边界)

3

我有一个包含纬度和经度坐标的数据框:

df<-data.frame(
     lat=c(40, 30, 40.864),
     lon=c(0, 20, 1.274)
    )

国境线 (西班牙),

library(raster)
border <- getData("GADM",country="Spain",level=0)

我希望为df选择仅border内部的点。
我该怎么做? 注意:在我可重复的示例中,df的第一个点在内部,第二个点明显在外面,第三个点在外面但靠近海岸。

https://dev59.com/ImEh5IYBdhLWcg3w0WZP - M--
实际上,@Masoud链接的问题与我的问题非常相似。但是它不起作用。sapply(1:nrow(df), function(i){gContains(spa.mask, SpatialPoints(df[i,], proj4string = CRS(proj4string(spa.mask))))})对于这三个点,它返回 FALSE。我不明白为什么。也许是因为我的边界包含多个多边形(岛屿和半岛)? - Javi_VM
正如我在问题中所说的,其中一个在边界内。我不明白你所说的“地图”是什么意思。我绘制了一张图,并检查了该点是否落在多边形内,而另外两个点则在多边形外... - Javi_VM
1
请检查我的答案。我猜想你在实现那个解决方案的某个部分上出了问题。 - M--
1个回答

1

虽然我相信我所提到的帖子回答了这个问题,但我认为需要一些澄清,因此发布一个答案。

要找到两个地理特征的交点,我们需要有相同的投影。库可以帮助我们做到这一点。确保将经度和纬度放在正确的位置:

sp::SpatialPoints(c(my_point$long,my_point$lat),proj4string=CRS(proj4string(my_raster)))

使用库,我们可以检查两个空间数据集/特征之间是否存在交集:

rgeos::gContains(my_raster,my_projected_point)

因此,以下是OP示例的工作原理:

library(sp)        #for projection
library(raster)    #for getting the border data
library(rgeos)     #for finding intersection
library(tidyverse) #for illustration only

#data
border <- getData("GADM",country="Spain",level=0)
df <- data.frame(
 lat=c(40, 30, 40.864),
 lon=c(0, 20, 1.274)
                )

#this is the part that actually check if a point is inside the border
#adapted from https://dev59.com/ImEh5IYBdhLWcg3w0WZP
sapply(1:3,function(i)
  list(id=i,
       intersect= gContains(border,SpatialPoints(df[i,2:1],proj4string=CRS(proj4string(border))))))

#           [,1] [,2]  [,3] 
# id        1    2     3    
# intersect TRUE FALSE FALSE

#a map for better understanding
ggplot()+
  geom_polygon(data=border, aes(x=long, y=lat, group=group), 
                       fill=NA, color="grey50", size=0.25) +
  geom_point(data=df,aes(x=lon,y=lat), color="red", size=1)

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接