多边形的行排序

时间:2014-06-10 14:02:49

标签: r

我的问题很简单。是否有一种自动方式来订购您的数据,以便它可以清理"清洁"多边形?我有生成环的函数(特别是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

1 个答案:

答案 0 :(得分:5)

从某种意义上说,你已经回答了自己的问题。

假设您有一组点,并且在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)

编辑对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会创建一个外壳。