gpt4 book ai didi

r - R中点要素到最近多边形的距离

转载 作者:行者123 更新时间:2023-12-04 09:33:26 26 4
gpt4 key购买 nike

我目前在做一个项目,我有一个点特征——点特征包括 142 个点——和多个多边形(大约 10 个)。我想计算 R 中每个点和最近的多边形特征之间的距离。

我目前的方法很乏味,而且有点啰嗦。我目前正计划计算每个点和每个多边形之间的距离。例如,我将计算 142 个点与多边形 A 之间的距离、142 个点与多边形 B 之间的距离、142 个点与多边形 C 之间的距离等。这是这些距离计算之一的示例代码:

dist_cen_polya <- dist2Line(centroids_coor, polygonA_shp)

完成这些计算后,我会编写一个代码来选择每个点和最近的多边形之间的最小/最近距离。问题是这个过程很乏味。

有谁知道可以最大限度地减少计算工作量/计算时间的包/代码?我真的很想使用一个包,将单个点与最近的多边形特征进行比较或计算一个点与所有感兴趣的多边形之间的距离?

谢谢你。

最佳答案

这里我使用的是 gDistance rgeos 拓扑库中的函数。我正在使用蛮力双循环,但速度惊人。 142 个点和 10 个多边形只需不到 2 秒。我确信有一种更优雅的方式来执行循环。

   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 向量包含要素投影单位中的实际笛卡尔最小距离。

关于r - R中点要素到最近多边形的距离,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16448402/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com