在写了一篇相当失败的question之后,我希望这篇文章更加清晰直接,并且对它的任何帮助都非常感激。
我想在给定的地图中围绕一组点创建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)
在给定的多边形(地图)
中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)
我现在需要知道每个感兴趣点之间的第一阶邻域,但是感兴趣点周围的voronoi多边形不能延伸到地图边界之外,或者进入/穿过洞。
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命令(或类似的东西?)时,我想拥有它,&#39; 3&#39;不会被归类为&#39; 1&#39;或&#39; 2&#39;,也不会&#39; 10&#39;和&#39; 8&#39;被列为彼此的邻居等。
修改:
此后我发现了this。它听起来与我需要的相似(使用&#39;范围&#39;选项)但希望在不使用ArcGIS软件的情况下执行它。
答案 0 :(得分:1)
以下似乎有助于解决更简单的问题(没有漏洞)。
https://github.com/cran/deldir/blob/master/inst/code.discarded/triang.list.R.save
特别是,&#t; tlist&#39;第24行定义的对象。
您可能不希望将那些瓷砖仅在绘图区域外很远的地方包括为邻居。在这种情况下,通过&#39; ind1&#39;中的条目,更容易将每对点作为邻居。和&#39; ind2&#39; &#39; dirsgs&#39;的列&#39; deldir&#39;的组成部分输出。同样,这是针对更简单的问题版本(无洞)。
尼尔