r-一个确定一系列点和一系列多边形是否相交的函数



我有一个点列表和一个多边形列表,我希望找到每个点所在的多边形。虽然在sf包中使用命令st_intersects很简单,但我发现这在这里不好,因为点和多边形都太多了,结果矩阵太大,我的计算机无法工作。

我试图通过制作一个函数来解决这个问题,这个函数可以查看所有多边形,为每个点找到合适的多边形。我做了一个,但效果不好,我不知道它有什么问题。所以我需要一些帮助!谢谢

以下是我如何创建点列表

pts = st_sfc(st_point(c(.5,.5)), st_point(c(1.5, 1.5)), st_point(c(2.5, 
2.5))) %>% st_sf() %>% mutate(namepoint=c(1,2,3))
Simple feature collection with 3 features and 1 field
geometry type:  POINT
dimension:      XY
bbox:           xmin: 0.5 ymin: 0.5 xmax: 2.5 ymax: 2.5
epsg (SRID):    NA
proj4string:    NA
namepoint        geometry
1         1 POINT (0.5 0.5)
2         2 POINT (1.5 1.5)
3         3 POINT (2.5 2.5)

以下是我如何创建多边形列表

pol_down = st_polygon(list(rbind(c(0,0), c(2,0), c(2,2), c(0,2), c(0,0))))
pol_up=pol_down+c(2,1) 
pol_add <- list(pol_down,pol_up) %>% st_sfc() %>% st_sf %>% 
mutate(namepgn=c('A','B'))
Simple feature collection with 2 features and 1 field
geometry type:  POLYGON
dimension:      XY
bbox:           xmin: 0 ymin: 0 xmax: 4 ymax: 3
epsg (SRID):    NA
proj4string:    NA
namepgn                       geometry
1       A POLYGON ((0 0, 2 0, 2 2, 0 ...
2       B POLYGON ((2 1, 4 1, 4 3, 2 ...

我做的功能是

fun_pgn <- function(x,y){
location_m<- st_intersects(x,
y,
sparse = F)
name <- pull(y,1) %>% .[location_m]
return(name)
}

使用命令st_intersects获取它们之间的关系

st_intersects(pts,pol,sparse = F)
[,1]  [,2]
[1,]  TRUE FALSE
[2,]  TRUE FALSE
[3,] FALSE  TRUE

然后我想要的是在数据pts中添加一个变量,比如pgnname,来记录每个点的多边形,

namepoint    pgnname    geometry
1               1       "A"     POINT (0.5 0.5)
2               2       "A"     POINT (1.5 1.5)
3               3       "B"     POINT (2.5 2.5)

但是我的功能不起作用。运行以下代码后

pts %>% mutate(pgnname=fun_pgn(geometry,pol))

它遵循

Simple feature collection with 3 features and 2 fields
geometry type:  POINT
dimension:      XY
bbox:           xmin: 0.5 ymin: 0.5 xmax: 2.5 ymax: 2.5
epsg (SRID):    NA
proj4string:    NA
namepoint pgnname        geometry
1         1       A POINT (0.5 0.5)
2         2       B POINT (1.5 1.5)
3         3    <NA> POINT (2.5 2.5)   

多边形的名称不正确!但我的功能的关键部分运行良好。例如

> pull(pol,1) %>% .[st_intersects(pts[3,],pol,sparse = F)]
[1] "B"

所以我很困惑。运行函数时会发生什么?

您说不能使用st_intersects,因为"生成的矩阵对我的计算机来说太大了"。最简单的解决方案是不生成密集矩阵,通过使用sparse = F强制生成。不带此参数的st_intersects的默认行为是生成稀疏列表,这正是您试图使用函数所做的。

x = st_intersects(pts, pol)
pts %>% mutate(pgnname = pol$namepgn[unlist(x)])
# Simple feature collection with 3 features and 2 fields
# geometry type:  POINT
# dimension:      XY
# bbox:           xmin: 0.5 ymin: 0.5 xmax: 2.5 ymax: 2.5
# epsg (SRID):    NA
# proj4string:    NA
#   namepoint pgnname        geometry
# 1         1       A POINT (0.5 0.5)
# 2         2       A POINT (1.5 1.5)
# 3         3       B POINT (2.5 2.5)

请注意,如果一个点可能位于多个多边形中,并且您只想为该点指定一个多边形,则可以使用以下方法:

pgn = sapply(x, `[`, 1)
pts %>% mutate(pgnname = pol$namepgn[pgn])

最新更新