r - 从一组 map 区域内的 voronoi 多边形查找邻居

标签 r spatial nearest-neighbor polygons voronoi

在相当失败的写作之后question ,我希望这个更加清晰和直接,非常感谢任何帮助。

我想围绕给定“ map ”中的一组点创建 voronoi/thiessen 多边形,以确定在给定区域内哪些点彼此相邻(共享边界线)。

library(sp); library(rgeos); library(deldir)

考虑我有 14 个我感兴趣的位置的情况:

x<-c(0.9,1.7,2.4,2.9,4.83, 0.73, 2.31, 3.69, 4.23, 2.86, 1.91, 4.32, 4.60, 1.82)
y<-c(1.9,0.9,2.8,1.9,1.81, 1.66, 4.54, 5.66, 1.99, 4.03, 4.32, 5.98, 5.56, 3.41)
crds<-cbind(x,y)

在给定的多边形( map )内

x.p<-c(0.1,0.1,3.5,3,5,1,6,6,0.1)
y.p<-c(0.1,5,4.8,1,5,5.5,6.5,1,0.1)
poly<-cbind(x.p,y.p)

并且这个多边形( map )中有一个固定孔:

x.h<-c(1,1.1,1.5,2.1,1.9,2.3,3,1)
y.h<-c(1,2.9,3.1,3,2.8,2.2,1.5,1)
hole<-cbind(x.h,y.h)

我现在需要知道每个兴趣点之间的一阶邻域,但兴趣点周围的 voronoi 多边形不能延伸出 map 边界或进入/穿过洞。

deldir(crds[,1],crds[,2]) 

在没有这些约束的情况下简单地给出 voronoi 多边形(和一阶邻居)。

仅用于说明目的并进一步解释我的意思,如果我们以通常的方式绘制多边形:

voronoipolygons <- function(crds) {
z <- deldir(crds[,1], crds[,2],rw=c(0,7,0,7))
w <- tile.list(z)
polys <- vector(mode='list', length=length(w))
for (i in seq(along=polys)) {
pcrds <- cbind(w[[i]]$x, w[[i]]$y)
pcrds <- rbind(pcrds, pcrds[1,])
polys[[i]] <- Polygons(list(Polygon(pcrds)), ID=(1:nrow(crds))[i])
}
SP <- SpatialPolygons(polys)
voronoi <- SpatialPolygonsDataFrame(SP, data=data.frame(x=crds[,1],y=crds[,2], row.names=sapply(slot(SP, 'polygons'),function(x) slot(x, 'ID'))))
return(voronoi)
}
SP<-voronoipolygons(crds[,1:2])
plot(SP)

然后如果我绘制我对此的限制以证明我的意思

ybox<-xbox<-c(0,7)

polypath(c(poly[,1], NA, c(xbox, rev(xbox))), c(poly[,2], NA, rep(ybox, each=2)), col="light blue", rule="evenodd")
polygon(hole[,1],hole[,2],col="light blue")
text(crds[,1],crds[,2],1:nrow(crds))

我想要它,这样当我使用 deldir 命令(或类似命令?)时,“3”不会被归类为与“1”或“2”相邻,“10”和“8”也不会彼此归类为邻居等。

编辑:

我已经找到了 this .这听起来与我需要的类似(带有“范围”选项),但我希望在不使用 ArcGIS 软件的情况下执行它。

最佳答案

以下似乎有助于解决更简单的问题(没有漏洞)。

https://github.com/cran/deldir/blob/master/inst/code.discarded/triang.list.R.save

特别是第 24 行定义的“tlist”对象。

您可能不希望将那些瓷砖仅在绘图区域外相交很远的地方包括为邻居。在这种情况下,将“deldir”输出的“dirsgs”组件的“ind1”和“ind2”列中的每对点作为邻居会更容易。同样,这是针对问题的简单版本(没有漏洞)。

尼尔

关于r - 从一组 map 区域内的 voronoi 多边形查找邻居,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20922815/

相关文章:

postgresql - PostGIS 中的 K 最近邻查询

java - 如果算法使用堆栈找不到具有精确总和的子集,则找到与目标值最接近的子集

r - 如何在R中计算国家之间的边界长度?

r - 映射澳大利亚城市 - R 空间

r - sf:如何从 GEOMETRYCOLLECTION 回到 MULTIPOLYGON?

r - 通过 shapefile 平滑(经度、纬度、值)数据

r - 在 R 中,如何根据数据框每一行的条件更改字符串的值

r - 合并具有一个共同元素的集合 R

r - 用几个条件改变一个变量

python - kNN 在 Python 中具有大的稀疏矩阵