我工作的一个项目的那一刻,我在那里有一个点要素 - 点要素包括142点 - 和多个多边形(约10)。 我想计算每一个点和R.最近的多边形要素之间的距离
我目前的做法是乏味的,有点长篇大论。 我目前打算计算每一个点和每一个多边形之间的距离。 例如,我将计算142点和多边形A之间的距离,所述142点和多边形B,142点和多边形C,等。这里之间的距离之间的距离是这些距离计算中的一个的示例代码:
dist_cen_polya <- dist2Line(centroids_coor, polygonA_shp)
做这些计算后,我会写代码来选择每一个点和最近的多边形之间的最小/最近距离。 问题是,这个过程是单调乏味的。
有谁知道一个软件包/代码这将减少计算的工作量/计算时间? 我真的想用一个包,比较单一指向最近的面要素或计算点和所有感兴趣的多边形之间的距离?
谢谢。
在这里,我现在用的是gDistance在rgeos拓扑库函数。 我用的是蛮力双环却是出奇的快。 它只需不到2秒142分10周的多边形。 我相信,有执行循环更elgant方式。
require(rgeos)
# CREATE SOME DATA USING meuse DATASET
data(meuse)
coordinates(meuse) <- ~x+y
pts <- meuse[sample(1:dim(meuse)[1],142),]
data(meuse.grid)
coordinates(meuse.grid) = c("x", "y")
gridded(meuse.grid) <- TRUE
meuse.grid[["idist"]] = 1 - meuse.grid[["dist"]]
polys <- as(meuse.grid, "SpatialPolygonsDataFrame")
polys <- polys[sample(1:dim(polys)[1],10),]
plot(polys)
plot(pts,pch=19,cex=1.25,add=TRUE)
# LOOP USING gDistance, DISTANCES STORED IN LIST OBJECT
Fdist <- list()
for(i in 1:dim(pts)[1]) {
pDist <- vector()
for(j in 1:dim(polys)[1]) {
pDist <- append(pDist, gDistance(pts[i,],polys[j,]))
}
Fdist[[i]] <- pDist
}
# RETURN POLYGON (NUMBER) WITH THE SMALLEST DISTANCE FOR EACH POINT
( min.dist <- unlist(lapply(Fdist, FUN=function(x) which(x == min(x))[1])) )
# RETURN DISTANCE TO NEAREST POLYGON
( PolyDist <- unlist(lapply(Fdist, FUN=function(x) min(x)[1])) )
# CREATE POLYGON-ID AND MINIMUM DISTANCE COLUMNS IN POINT FEATURE CLASS
pts@data <- data.frame(pts@data, PolyID=min.dist, PDist=PolyDist)
# PLOT RESULTS
require(classInt)
( cuts <- classIntervals(pts@data$PDist, 10, style="quantile") )
plotclr <- colorRampPalette(c("cyan", "yellow", "red"))( 20 )
colcode <- findColours(cuts, plotclr)
plot(polys,col="black")
plot(pts, col=colcode, pch=19, add=TRUE)
所述min.dist矢量表示多边形的行号。 例如,你可以使用此向量作为这样的子集最近的多边形。
near.polys <- polys[unique(min.dist),]
所述PolyDist载体包含的特征的投影单元的实际笛卡尔最小距离。
在多边形你有相当多的线路。 多边形之间的距离是零,如果点位于多边形内或位于边缘。
所以实际上你正在寻找两种情况:
- 检查点位于任何多边形的内部(记住它可能会更然后一个多边形
- 获取所有边的集合,并计算边缘点的每个距离。 最近的距离,让您边属于太多边形的距离。
因此,这是,如果我们认为每个多边形10层的边缘一个简单的算法需要O(10 * 10)* 142为您的所有点。 这使得100 * 142 = 14200点的操作。 => O(M * DeltaE值)* N(m是polygones的数目,DeltaE值是每个多边形的边的平均数目,n是点的数量)。
现在,我们检查,如果我们能够加快这。 正在添加到脑海的第一件事是,我们可以使用边框支票或边界界为每个多边形。
另一个想法是为每个多边形为一组角度的制备最近边缘。 例如,如果你有8角(每45°),则可以从由另一个边缘(因此被去除的边缘的任何点superseeded将总是产生比相同的另一边缘的任何点更大的距离的列表中删除所有的边缘多边形。
这种方式通常可以减少可能在很大余量的复杂性。 如果你觉得一个矩形的你只有一个或两个边缘,而不是4.如果你认为你可能会与通常是一个或两个在最高每多边形三边结束了常规的8边的多边形。
如果添加了法向矢量每条边你可以计算出,如果点可能在里面,你必须执行扫描线或任何检查(或你知道它konvex)是肯定的。
也有可能像在一个等距离mannor分离由x和y的二维空间映射索引。 Thisway你只需要测试polygones躺在9个部门。
下一版本可能使用R-树,每个节点的每个边界框(圆圈)具有要检查的最小期望距离与最大预期的距离。 因此,人们并不需要检查一个节点,它导致比其他节点的最大距离更大的最小距离的多边形。
另一件事是,如果你有一个给定的树,如订单就像你有地图数据。 在街道地图,你总是有世界 - >区域 - >国家 - >县 - >城市 - >城市板块 - > ...
Thisway你可以在地图上包含数百万多边形在合理的时间大多<10ms的整个世界对最近的位置进行搜索。
可以这么说,你有很多选择这里。 和预处理的多边形列表,或者通过使用多边形的二进制空间分割树提取相关的边缘或使用角度的方式,甚至去一些更票友。 由你决定。 我希望你在对数范围内做一些像点结束了(日志(N)*日志(DeltaE值))成为O(日志(N))作为平均的复杂性。