2014-06-10 20 views
5

La mia domanda è semplice. Esiste un modo automatico per ordinare i dati in modo da rendere poligoni "puliti"? Ho funzioni che generano anelli (in particolare la funzione ahull) e vorrei un modo per produrre poligoni in modo pulito usando tali funzioni. Ecco un esempio.Ordinamento riga per poligoni

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) 

Qui è la mia vera dati: https://drive.google.com/file/d/0B8QG4cbDqH0UOUlobnlWaDgwOWs/edit?usp=sharing

+0

Non sono sicuro che esista un semplice algoritmo per "capire" come ordinare i vertici in modo da evitare che i bordi dei poligoni si incrocino. Hai scavato attraverso pacchetti come 'spatstat' per vedere se hanno strumenti pertinenti? So che ha test come 'crossing.psp', ma odio dover testare in modo esaustivo tutte le coppie di segmenti. –

risposta

5

In un certo senso, di aver risposto alla tua domanda.

Supponendo di avere un insieme di punti, e si utilizza ahull(...) nel pacchetto alphahull per generare convesso, è possibile estrarre i punti sul contorno, nell'ordine corretto, direttamente dall'oggetto ahull. Ecco un esempio:

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 risposta a OP di fornire il loro set di dati.

ahull(...) sembra fallire, senza preavviso, con il set di dati - non produce scafi convessi. Dopo un po 'di sperimentazione, sembra che il problema abbia a che fare con la grandezza dei valori x, y. Se divido tutto per 1000, funziona. Non ho idea di cosa ne faccia uno (forse qualcun altro fornirà una visione ??). Comunque, ecco il codice e il risultato:

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]) 

Si noti inoltre che alpha=2. L'impostazione di alpha=1 con questo set di dati genera in realtà 2 scafi, uno con 1 punto e uno con tutti gli altri punti. L'impostazione alpha=2 crea 1 scafo.

+0

Bella soluzione. Ero sotto la possibile incomprensione che voleva un poligono che usasse * tutti * i suoi vertici, non solo il set di delimitazione. Vediamo cosa restituisce l'OP. –

+0

Sono d'accordo. Bella soluzione E dovrebbe funzionare. Ma con i miei dati reali, non è così. Questo mi fa pensare che mi manca qualcosa di base qui (io sono nuovo alla modellazione spaziale). I dati devono essere ordinati in un modo particolare prima di entrare nella funzione ahull? – mgslocum

+0

Carica i tuoi dati reali da qualche parte e pubblica un link nella tua domanda. – jlhoward