大数据集的空间匹配

时间:2013-04-13 19:46:38

标签: r matching spatial spatial-index

我有一个包含大约100000个点的数据集和另一个包含大约3000个多边形的数据集。对于每个点我需要找到最近的多边形(空间匹配)。多边形内的点应与该多边形匹配。

计算所有对距离是可行的,但需要的时间比必要的长。是否有一个R包将利用空间索引来解决这种匹配问题?

我知道sp包和over函数,但文档没有说明索引。

2 个答案:

答案 0 :(得分:5)

您可以尝试使用gDistance包中的rgeos函数。作为示例,请看下面的示例,我从此old thread重新编写了该示例。希望它有所帮助。

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 )

enter image description here

# 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"

答案 1 :(得分:-1)

我对R一无所知,但我将使用PostGIS提供一种可能的解决方案。您可以在PostGIS中加载数据并比单独使用R更快地处理它。

给定两个表planet_osm_point(80k行)和planet_osm_polygon(30k行),以下查询在30s左右执行

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
);

结果是基于点与多边形边界框的中心点之间的距离(不是多边形本身的中心点)的近似值。通过更多的工作,可以调整此查询以基于多边形本身的中心点获取最近的多边形,尽管它不会快速执行。