我的问题很简单。有没有一种自动的方法可以对数据进行排序,以使其成为“干净的”多边形?我有一些生成环的函数(特别是ahull函数),我想使用这种函数干净地生成多边形的方法。这是一个例子。
x <- c(1:3, 3:1, 1)
y <- c(1,1,1,3,3,2, 1)
xy <- cbind(x,y)
Sr1 <- Polygon(xy)
Srs1 = Polygons(list(Sr1), "s1")
SpP = SpatialPolygons(list(Srs1))
plot(SpP)
z <- runif(7)
xyz <- cbind(x,y,z)
xyz <- xyz[order(z),]
xy <- xyz[,-3]
xy <- rbind(xy, xy[1,])
Sr1 <- Polygon(xy)
Srs1 = Polygons(list(Sr1), "s1")
SpP = SpatialPolygons(list(Srs1))
SpP = SpatialPolygons(list(Srs1))
plot(SpP)
这是我的真实数据:https://drive.google.com/file/d/0B8QG4cbDqH0UOUlobnlWaDgwOWs/edit?usp=sharing
最佳答案
从某种意义上说,您已经回答了自己的问题。
假设您有一组点,并使用ahull(...)
包中的alphahull
生成凸包,则可以按照正确的顺序直接从ahull
对象中提取边界上的点。这是一个例子:
library(sp)
library(alphahull)
set.seed(1) # for reproducible example
X <- rnorm(100)
Y <- rnorm(100)
plot(X,Y)
XY <- cbind(X,Y)
hull <- ahull(XY,alpha=1)
plot(hull)
# extract the row numbers of the boundary points, in convex order.
indx=hull$arcs[,"end1"]
points <- XY[indx,] # extract the boundary points from XY
points <- rbind(points,points[1,]) # add the closing point
# create the SpatialPolygonsDataFrame
SpP = SpatialPolygons(list(Polygons(list(Polygon(points)),ID="s1")))
plot(SpP)
points(XY)
EDIT 对OP提供其数据集的响应。
ahull(...)
似乎在没有警告的情况下对您的数据集失败-它不会产生任何凸包。经过一番实验后,问题似乎与x,y值的大小有关。如果我将所有内容都除以1000,就可以了。不知道这是怎么回事(也许别人会提供一个见解?)。无论如何,这是代码和结果:library(sp)
library(alphahull)
df <- read.csv("ahull problem.csv")
hull <- ahull(df[2:3]/1000,alpha=2)
plot(hull)
# extract the row numbers of the boundary points, in convex order.
indx=hull$arcs[,"end1"]
points <- df[indx,2:3] # extract the boundary points from df
points <- rbind(points,points[1,]) # add the closing point
# create the SpatialPolygonsDataFrame
SpP = SpatialPolygons(list(Polygons(list(Polygon(points)),ID="s1")))
plot(SpP)
points(df[2:3])
另请注意
alpha=2
。使用此数据集设置alpha=1
实际上会生成2个船体,一个包含1个点,一个包含所有其他点。设置alpha=2
可创建1个船体。关于多边形的行顺序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24143052/