我有一个包含大约 100000 个点的数据集和另一个包含大约 3000 个多边形的数据集。对于每个点,我需要找到最近的多边形(空间匹配)。多边形内的点应与该多边形匹配。
计算所有对的距离是可行的,但需要的时间比必要的要长一些。是否有一个 R 包可以利用空间索引来解决这种匹配问题?
我知道sp
包和over
功能,但文档没有说明任何关于索引的信息。
我有一个包含大约 100000 个点的数据集和另一个包含大约 3000 个多边形的数据集。对于每个点,我需要找到最近的多边形(空间匹配)。多边形内的点应与该多边形匹配。
计算所有对的距离是可行的,但需要的时间比必要的要长一些。是否有一个 R 包可以利用空间索引来解决这种匹配问题?
我知道sp
包和over
功能,但文档没有说明任何关于索引的信息。
为此,您可以尝试使用包中的gDistance
功能rgeos
。作为一个例子,看看下面的例子,我从这个旧线程中修改了它。希望能帮助到你。
require( rgeos )
require( sp )
# Make some polygons
grd <- GridTopology(c(1,1), c(1,1), c(10,10))
polys <- as.SpatialPolygons.GridTopology(grd)
# Make some points and label with letter ID
set.seed( 1091 )
pts = matrix( runif( 20 , 1 , 10 ) , ncol = 2 )
sp_pts <- SpatialPoints( pts )
row.names(pts) <- letters[1:10]
# Plot
plot( polys )
text( pts , labels = row.names( pts ) , col = 2 , cex = 2 )
text( coordinates(polys) , labels = row.names( polys ) , col = "#313131" , cex = 0.75 )
# Find which polygon each point is nearest
cbind( row.names( pts ) , apply( gDistance( sp_pts , polys , byid = TRUE ) , 2 , which.min ) )
# [,1] [,2]
#1 "a" "86"
#2 "b" "54"
#3 "c" "12"
#4 "d" "13"
#5 "e" "78"
#6 "f" "25"
#7 "g" "36"
#8 "h" "62"
#9 "i" "40"
#10 "j" "55"
我对 R 一无所知,但我将提供一种使用 PostGIS 的可能解决方案。您可能能够在 PostGIS 中加载数据并比单独使用 R 更快地处理它。
给定两个表planet_osm_point
(80k 行)和planet_osm_polygon
(30k 行),以下查询在大约 30 秒内执行
create table knn as
select
pt.osm_id point_osm_id,
poly.osm_id poly_osm_id
from planet_osm_point pt, planet_osm_polygon poly
where poly.osm_id = (
select p2.osm_id
from planet_osm_polygon p2
order by pt.way <-> p2.way limit 1
);
结果是基于点与多边形边界框的中心点(而不是多边形本身的中心点)之间的距离的近似值。再做一些工作,这个查询可以适应基于多边形本身的中心点获取最近的多边形,尽管它不会很快执行。