【问题标题】:Row ordering for polygons多边形的行排序
【发布时间】:2014-06-10 14:02:48
【问题描述】:

我的问题很简单。有没有一种自动的方式来为你的数据排序,以便它产生“干净”的多边形?我有生成环的函数(特别是 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

【问题讨论】:

  • 我不确定是否有任何简单的算法可以“弄清楚”如何对顶点进行排序,以避免任何多边形边缘相互交叉。你有没有通过像spatstat 这样的包来查看它们是否有任何相关的工具?我知道它有像 crossing.psp 这样的测试,但我不想必须详尽地测试所有段对。

标签: r


【解决方案1】:

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

假设您有一组点,并且您使用alphahull 包中的ahull(...) 来生成凸包,您可以直接从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 会创建 1 个船体。

【讨论】:

  • 不错的解决方案。我可能会误解他想要一个使用 all 他的顶点的多边形,而不仅仅是边界集。让我们看看 OP 带来了什么。
  • 我同意。很好的解决方案。它应该工作。但根据我的真实数据,事实并非如此。这让我觉得我在这里缺少一些基本的东西(我是空间建模的新手)。在进入 ahull 函数之前,是否应该以某种特定的方式对数据进行排序?
  • 在某处上传您的真实数据并在您的问题中发布链接。
  • 好的,我添加了一个链接。提前致谢。
  • 是的,一个有趣/烦人的问题!如果我使用 alpha = 1200,则 plot(hull) 可以正常工作,但是行的排序会发生一些事情,因此 plot(SpP) 最终会生成一个具有许多交叉点的多边形。
猜你喜欢
  • 2015-01-09
  • 2011-11-14
  • 1970-01-01
  • 2011-06-11
  • 2015-04-07
  • 2014-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多