2014-06-10 7 views
5

मेरा प्रश्न सरल है। क्या आपको डेटा ऑर्डर करने का कोई स्वचालित तरीका है ताकि यह "साफ" बहुभुज बनाता है? मेरे पास ऐसे कार्य हैं जो अंगूठियां उत्पन्न कर रहे हैं (विशेष रूप से आह कार्य), और मैं ऐसे कार्यों का उपयोग करके बहुभुज को साफ करने का एक तरीका चाहूंगा। यहाँ एक उदाहरण है।बहुभुज के लिए पंक्ति क्रम

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

+0

मुझे यकीन नहीं है कि आपके पॉलीगॉन किनारों को एक-दूसरे को पार करने से बचने के लिए अपने आकृतियों को ऑर्डर करने के लिए "समझें" के लिए कोई आसान एल्गोरिदम है। क्या आपने 'स्पैटस्टैट' जैसे पैकेजों के माध्यम से यह देखने के लिए खोला है कि उनके पास कोई प्रासंगिक उपकरण है या नहीं? मुझे पता है कि इसमें 'crossing.psp' जैसे परीक्षण हैं लेकिन मुझे सभी सेगमेंट जोड़े का परीक्षण करने से नफरत है। –

उत्तर

5

एक मायने में, आप अपने खुद के सवाल का जवाब दे दिया है।

मान लिया जाये कि आप अंक का एक सेट है, और आप 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) 

संपादित ओपी अपने डाटासेट प्रदान करने के लिए उत्तर: यहाँ एक उदाहरण है।

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 हल बनाता है।

+0

अच्छा समाधान। मैं संभावित गलतफहमी के तहत था कि वह एक बहुभुज चाहता था जो उसके सभी शिखरों का * सभी * इस्तेमाल करता था, न केवल बाध्यकारी सेट। चलो देखते हैं कि ओपी क्या वापस आती है। –

+0

मैं सहमत हूं। अच्छा समाधान और यह काम करना चाहिए। लेकिन मेरे असली डेटा के साथ, यह नहीं है। इससे मुझे लगता है कि मुझे कुछ बुनियादी बात याद आ रही है (मैं स्थानिक मॉडलिंग के लिए नया हूं)। क्या एहल फ़ंक्शन में जाने से पहले डेटा को किसी विशेष तरीके से आदेश दिया जाना चाहिए? – mgslocum

+0

कहीं भी अपना वास्तविक डेटा अपलोड करें और अपने प्रश्न में एक लिंक पोस्ट करें। – jlhoward

संबंधित मुद्दे