使用R的多个多边形中的点

时间:2018-05-12 06:17:44

标签: r gis point-in-polygon

目前我有两个data.frames,一个多边形(poly.x, poly.y, enum)和一个点(pt.x, pt.y),其中enum是多边形的id。我正在尝试确定哪些点属于哪些多边形,因此我获得了(pt.x, pt.y, enum)的data.frame。

我的第一次尝试使用point.in.polygon包中的splapply函数来查找该点所属的多边形。虽然我的代码有效,但在大型数据集上需要时间。

我的第二次尝试也使用来自over包的sp,从gis stackexchange上的问题拼凑而成。虽然很多更快,但我似乎无法从over获得正确的输出,因为它是1 s和NA s的数据框。

下面我已经包含了一个简化的工作示例(npoly可以更改以测试不同方法的速度)以及我使用sp::point.in.polygon的工作尝试和来自{{1}的无意义输出尝试我不会讨论我最终使用哪种方法,只要速度很快。

非常感谢任何帮助!

sp::over

2 个答案:

答案 0 :(得分:1)

rules = [{'condition':{'A':'A0','B':'B0'},'value':5}, {'condition':{'B':'B1'},'value':3}] for rule in rules: d = rule['condition'] indexer = [d[name] if name in d else slice(None) for name in df.index.names] df.loc[tuple(indexer),] = rule['value'] print (df) first x y second m n A B A0 B0 5 5 B1 3 3 A1 B0 0 0 B1 3 3 返回几何体内的点索引。也许是这样的:

over

register a user-defined function

答案 1 :(得分:1)

使用over的替代方法是使用sf::intersection,因为sf包变得越来越流行。

将数据导入到sf对象中需要我一些工作,但如果您正在使用外部数据,则可以使用st_read读取它,并且它已经是正确的形式。

以下是如何处理:

library(tidyverse)
library(sf)

# convert into st_polygon friendly format (all polygons must be closed)
# must be a nicer way to do this!
localpoly <- localpolydf %>% split(localpolydf$enum) %>% 
lapply(function(x) rbind(x,x[1,])) %>%
lapply(function(x) x[,1:2]) %>%
lapply(function(x) list(as.matrix(x))) %>%
lapply(function(x) st_polygon(x))

# convert points into sf object
points <- st_as_sf(offsetdf,coords=c('x','y'),remove = F)

#convert polygons to sf object and add id column
polys <- localpoly %>% st_sfc() %>% st_sf(geom=.) %>% 
mutate(id=factor(1:100)) 

#find intersection
joined <- polys  %>% st_intersection(points) 


# Sample plot
ggplot() + geom_sf(data=polys) +
geom_sf(data=joined %>% filter(id %in% c(1:10)),aes(col=id)) +
lims(x=c(0,10))

请注意,要在编写本文时使用geom_sf,您需要安装ggp​​lot的开发版本。

情节输出: plot output