在给定的地图区域内从Voronoi多边形中找到邻居

3
在写了一个不太成功的问题之后,我希望这个更加清晰和直接,并且非常感谢任何对它的帮助。
我想在给定的“地图”中创建沃罗诺伊/泰森多边形,以确定在此给定区域内哪些点是相邻的(共享边界线)。请注意保留HTML标记。
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)

在给定的多边形(地图)内。
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)

而且这个多边形(地图)内有一个设定好的洞:

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)

我现在需要知道每个感兴趣点的一阶邻居,但是在感兴趣点周围的沃罗诺伊多边形不能超出地图边界,或进入/穿过孔洞。
deldir(crds[,1],crds[,2]) 

这只是简单地给出了沃罗诺伊多边形(和一级邻居),没有这些限制。

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

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。它听起来与我需要的相似(具有'extent'选项),但是希望不使用ArcGIS软件执行它。

另外,如果有人有任何想法,即使没有多边形中间的孔,也可以做到这一点,那就太好了。谢谢。 - user3122539
在以前的相关帖子中,我认为@Spacedman建议可以通过虚拟点实现这样的目标,但我不确定如何操作。祝愿任何尝试的人好运。 - user3122539
1个回答

1
以下内容似乎对于简单问题有所帮助(不包含洞)。

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

特别是第24行定义的“tlist”对象。
您可能不想将那些瓦片仅在绘图区域外相遇的邻居包括在内。在这种情况下,更容易将每个具有“deldir”输出的“dirsgs”组件中“ind1”和“ind2”列条目的点对作为邻居。同样,这适用于简化版本的问题(没有孔)。
尼尔

1
欢迎来到StackOverflow!请考虑将链接资源的关键部分包含在您的答案中。仅提供链接的答案被认为是不好的答案,很可能会很快被删除。 - VMai

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接