2014-10-28 7 views
13

मैं शीर्ष स्थानों, पहला, दूसरा स्वरूप में सहेजी से बहुभुज का एक सेट बनाने के लेने के लिए कोशिश कर रहा हूँ से आर में बहुभुज का एक सेट बना रहा है। कृपया मेरे साथ नंगे क्योंकि मैं आर के लिए नया हूं और आज अन्य पदों की खोज करने में काफी समय लगा हूं।SpatialPolygons - निर्देशांक

यहाँ मेरी डेटा का एक उदाहरण है - प्रत्येक पंक्ति एक बहुभुज के लिए कोने प्रतिनिधित्व करता है। बहुभुज

square <- rbind(c(255842.4, 4111578, 255862.4, 4111578, 255862.4, 4111558, 
        255842.4, 4111558, 255842.4, 4111578, 255842.4, 4111578), 
       c(257397.0, 4111309, 257417.0, 4111309, 257417.0, 4111289, 
        257397.0, 4111289, 257397.0, 4111309, 257397.0, 4111309)) 

ID <- c("SJER1", "SJER2")' 

मैं SpatialPolygons का उपयोग कर रहा है, इस प्रकार अपने डेटा एक सूची में होना चाहिए वर्गों रहे हैं। इसलिए मैंने मैट्रिक्स से सूची प्रारूप में अपना डेटा प्राप्त करने का प्रयास करने के लिए एक लूप बनाया।

मैं कोड है कि मैं इस साइट पर कुछ अन्य प्रश्न में पाया निम्नलिखित एक पाश पैदा करते हैं। मैंने समझने की कोशिश करने के लिए प्रत्येक चरण को तोड़ दिया कि मुझे आउटपुट के रूप में केवल एक बहुभुज क्यों मिल रहा है, इसके माध्यम से मेरे पास 2 अंक हैं।

for (i in 1:2) { 
    pts <- rbind(c(square[i,1], square[i,2]), c(square[i,3], square[i,4]), 
       c(square[i,5],square[i,6]), c(square[i,7],square[i,8]), 
       c(square[i,9],square[i,10])) 
    sp1 <- list(Polygon(pts)) 
    sp2 <- list(Polygons(sp1,i)) 
    sp = SpatialPolygons(sp2) 
} 
plot(sp) 

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

मेरे अंतिम लक्ष्य SpatialPolygons वस्तु में दो बहुभुज, आईडी SJER1 के साथ पहली और आईडी SJER2SpatialPolygons वस्तु में संग्रहीत के साथ दूसरे स्थान पर है।

तब मैं इस एक शेपफ़ाइल के लिए बाहर लिखेंगे।

किसी भी मार्गदर्शन के लिए और आपके धैर्य के लिए धन्यवाद। लिआ

उत्तर

23

वहाँ ?'SpatialPolygons-class' में कुछ जानकारी है, लेकिन आप अधिक या कम निम्न कार्य करना चाहते हैं:

polys <- SpatialPolygons(list(
    Polygons(list(Polygon(matrix(square[1, ], ncol=2, byrow=TRUE))), ID[1]), 
    Polygons(list(Polygon(matrix(square[2, ], ncol=2, byrow=TRUE))), ID[2]) 
)) 

plot(polys) 

enter image description here

बुनियादी सार है कि आप Polygon वस्तुओं बनाने की आवश्यकता है (उदाहरण के लिए , पहले कॉलम में x निर्देशांक के साथ 2-कॉलम मैट्रिस से और दूसरे में निर्देशांक y निर्देशांक)। ये Polygons ऑब्जेक्ट्स बनाने के लिए सूचियों में संयुक्त होते हैं (जिनमें से प्रत्येक में एक अद्वितीय आईडी होनी चाहिए)। ऑब्जेक्ट्स को SpatialPolygons ऑब्जेक्ट बनाने के लिए एक सूची में जोड़ा गया है। proj4stringSpatialPolygons पर देखें) के साथ आप CRS जोड़ सकते हैं।

इसे ईएसआरआई आकार के लिए लिखने के लिए, आपको ऑब्जेक्ट को polys ऑब्जेक्ट को हमारे द्वारा बनाए गए और कुछ डेटा के संयोजन से परिवर्तित करने की आवश्यकता होगी। हम कुछ और अधिक दिलचस्प की कमी के लिए डेटा के रूप में आईडी जोड़ देंगे।

polys.df <- SpatialPolygonsDataFrame(polys, data.frame(id=ID, row.names=ID)) 

और फिर इसे लिखने ...

writeOGR(polys.df, '.', 'fancysquares', 'ESRI Shapefile') 

दूसरा तर्क ('.') वर्तमान कार्यशील निर्देशिका के लिए इसे बाहर लिखने के लिए कहते हैं।


संपादित

जल्दी से बनाने के लिए एक SpatialPolygonsDataFrame आप बहुभुज का वर्णन कई पंक्तियों हो तब आप इस्तेमाल कर सकते हैं निम्नलिखित:

# Example data 
square <- t(replicate(50, { 
    o <- runif(2) 
    c(o, o + c(0, 0.1), o + 0.1, o + c(0.1, 0), o) 
})) 
ID <- paste0('sq', seq_len(nrow(square))) 

# Create SP 
polys <- SpatialPolygons(mapply(function(poly, id) { 
    xy <- matrix(poly, ncol=2, byrow=TRUE) 
    Polygons(list(Polygon(xy)), ID=id) 
}, split(square, row(square)), ID)) 

# Create SPDF 
polys.df <- SpatialPolygonsDataFrame(polys, data.frame(id=ID, row.names=ID)) 

plot(polys.df, col=rainbow(50, alpha=0.5)) 

enter image description here

+0

आपको बहुत बहुत धन्यवाद। मुझे लगता है कि मैं इसे बेहतर समझता हूं, लेकिन क्या आप कृपया मुझे बता सकते हैं कि क्यों: '(i में 1: 2) { polys <- स्थानिक पालीगन्स (सूची ( बहुभुज (सूची (बहुभुज (मैट्रिक्स (वर्ग [i, ], ncol = 2, byrow = TRUE))), आईडी [i]) )) } ' या ' एक <- वेक्टर ('सूची', लंबाई (2)) के लिए (1 में मैं : 2) { एक [[i]] <- सूची ( बहुभुज (सूची (बहुभुज (मैट्रिक्स (वर्ग [i,], ncol = 2, बाई = TRUE)), आईडी [i]) ) } स्पेटियल पॉलीगन्स (ए) ' काम नहीं करते? मुझे इसे कई बिंदुओं पर चलाने की ज़रूरत है इसलिए मुझे किसी प्रकार की लूप की आवश्यकता होगी। आपका समय और स्पष्टीकरण बहुत सराहना की जाती है। मैंने दस्तावेज़ीकरण की समीक्षा भी की। –

+0

@LWasser पहली बार लूप के माध्यम से पहली बार 'polys' ओवरराइट करता है, इसलिए आप' स्पैटियल पॉलीगन्स 'ऑब्जेक्ट के साथ समाप्त होते हैं जिसमें केवल अंतिम पॉली होती है। दूसरा काम करेगा यदि आप बाहरी 'सूची() 'को हटाते हैं, यानी बस एक [[i]] <- बहुभुज (सूची (बहुभुज (मैट्रिक्स (वर्ग [i,], ncol = 2, byrow = TRUE)), आईडी [i]) '। ऐसा इसलिए है क्योंकि 'ए' पहले से ही एक सूची है। – jbaums

+0

@LWasser, मेरे दृष्टिकोण को एक ऐसे दृष्टिकोण के लिए देखें जिसका उपयोग प्रक्रिया को स्वचालित करने के लिए किया जा सकता है यदि आपके पास कई पंक्तियां हैं। (इसके अलावा, माफ करना, मैं किसी भी तरह से कोड शामिल करना भूल गया जो एसपीडीएफ बनाता है।) – jbaums

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