目前我有两个data.frames,一个多边形(poly.x, poly.y, enum)
和一个点(pt.x, pt.y)
,其中enum
是多边形的id。我正在尝试确定哪些点属于哪些多边形,因此我获得了(pt.x, pt.y, enum)
的data.frame。
我的第一次尝试使用point.in.polygon
包中的sp
和lapply
函数来查找该点所属的多边形。虽然我的代码有效,但在大型数据集上需要长时间。
我的第二次尝试也使用来自over
包的sp
,从gis stackexchange上的问题拼凑而成。虽然很多更快,但我似乎无法从over
获得正确的输出,因为它是1
s和NA
s的数据框。
下面我已经包含了一个简化的工作示例(npoly
可以更改以测试不同方法的速度)以及我使用sp::point.in.polygon
的工作尝试和来自{{1}的无意义输出尝试我不会讨论我最终使用哪种方法,只要速度很快。
非常感谢任何帮助!
sp::over
答案 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
答案 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,您需要安装ggplot的开发版本。