अधिक

खराब व्यवहार/अनियमित बहुभुजों को R . में घोलना/एकीकृत करना

खराब व्यवहार/अनियमित बहुभुजों को R . में घोलना/एकीकृत करना


मैं एक ऐसी परियोजना पर काम कर रहा हूं जिसमें एक छवि के कुछ हिस्सों को खोजने में मुश्किल से चक्कर लगाने वाले कई विषयों को एक साथ लाना शामिल है। यूजर्स का आउटपुट काफी शानदार है।

बिल्कुल सटीक?

हालांकि, मैं जो चाहता हूं वह छवि का क्षेत्र प्राप्त करना है जिसमें 1, 2, 3, 4, आदि हैं। उपयोगकर्ता इसे चुनते हैं। और मैं एसपी, रास्टर, और मैपटूल पैकेज के साथ विश्लेषण के लिए आर का उपयोग कर रहा हूं (जरूरत पड़ने पर थोड़ा rgeos फेंक के साथ)। अनिवार्य रूप से, मेरा वर्कफ़्लो 1 है) प्रत्येक उपयोगकर्ता के इनपुट से एक एकल बहुभुज बनाएं (मेरे पास वास्तव में प्रति उपयोगकर्ता प्रत्येक व्यक्तिगत चयन का ट्रैक है, लेकिन उन्हें प्रति उपयोगकर्ता एकल SpatialPolygon में संयोजित करना आसान लग रहा था) 2) उन सभी को एक साथ मर्ज करें एक एकल SpatialPolygonsDataFrame ऑब्जेक्ट 3) गिनती फ़ंक्शन का उपयोग करके ऑब्जेक्ट को रैस्टराइज़ करें 4) रास्टर के क्षेत्र का आकलन करें जिसमें n संख्या में उपयोगकर्ता इसे चुनते हैं

यहाँ आउटपुट SpatialPolygonsDataFrame के साथ खेलने के लिए है

यह बहुत अच्छा काम करता है, लेकिन रास्टरराइजेशन के कारण धीमा है। मुझे ऐसा लगता है कि मुझे SpatialPolygons ऑब्जेक्ट के साथ कुछ करने में सक्षम होना चाहिए। और मैंने संघ, gIntersects, gUnion, और प्रतिच्छेदन के साथ कुछ चीज़ें आज़माई हैं। हालाँकि, मुझे निम्नलिखित जैसी त्रुटियाँ मिलती रहती हैं:

RGEOSBinTopoFunc(spgeom1, spgeom2, byid, id, drop_lower_td, "rgeos_difference") में त्रुटि: TopologyException: इनपुट geom 1 अमान्य है: स्वयं-चौराहे पर या निकट बिंदु

काफी उचित। जब मैं gIsValid का उपयोग करके उनका परीक्षण करता हूं तो अक्सर दिए गए उपयोगकर्ता SpatialPolygons अमान्य होते हैं। केवल पहले दो को देखने पर, यह स्पष्ट हो जाता है कि कई अतिव्यापी बिंदु हैं।

आप प्रतिच्छेदन बिंदुओं को बहुत स्पष्ट रूप से देख सकते हैं। इसके अलावा, पॉली 2 (नीला) में कुछ आत्म-चौराहे प्रतीत होता है, जिससे gIsValid झूठी वापसी करता है।

मैंने UnionSpatialPolygons (बचाने के साथ) की भी कोशिश की हैRGEOS=T) जो एक एकीकृत वस्तु बनाता हैUnionSpatialPolygons(polysData[1:2,], IDs=names(polysData[1:2,]@polygons))लेकिन सीमाएं अभी भी ऊपर की छवि की तरह ओवरलैप होती हैं, बजाय एक चिकनी बहुभुज बाहरी सीमा होने के - यानी, बहुभुज एक साथ भंग नहीं होते हैं। फिर इस नए SpatialPolygons ऑब्जेक्ट पर किसी और फ़ंक्शन का उपयोग करते हुए, मुझे वही समस्याएं हैं।

तो, क्या चूहों में जाने के बजाय बहुभुजों का उपयोग करने का कोई तरीका है? यह निश्चित रूप से मेरे जीवन को तेज कर देगा, जो उत्कृष्ट होगा। मुझे ऐसा लगता है कि आविष्कार किए गए पहिये के साथ यह एक आम समस्या होनी चाहिए जो मुझे अभी तक नहीं मिली है। विचार?


ऐसा लगता है कि ज्यामिति को साफ करने से आप अपने गैर-रेखापुंज समाधान के रास्ते पर पहुंच जाएंगे ... इसके साथ कुछ कीचड़ है जो खराब ज्यामिति को ठीक करने में मदद करता है:

# लाइब्रेरी और समस्याग्रस्त डेटा लाइब्रेरी लोड करें (rgeos) लोड ("oneImage2_spdf.Rdata")> gIsValid (polysData, कारण = T) RGEOSBinTopoFunc (spgeom1, spgeom2, byid, id, drop_lower_td, "rgeos_union") में त्रुटि: टोपोलॉजी अपवाद: इनपुट geom 0 अमान्य है: बिंदु -119.84228271000001 34.349193950783807 पर -119.84228271000001 34.349193950783807 पर या उसके निकट आत्म-चौराहे

वह आपत्तिजनक डेटा है; शायद केवल एक ही बिंदु, लेकिन 0 चौड़ाई से बफर करने से इसे ठीक करना चाहिए।

# आइए 0 से बफ़र करें: polysData <- gBuffer(polysData, चौड़ाई = 0, byid = T)

gBuffer को यह पसंद नहीं है - इसमें एक अप्रमाणित CRS जुड़ा हुआ है!

चेतावनी संदेश: gBuffer(polysData, width = 0, byid = T) में: स्थानिक वस्तु अनुमानित नहीं है; GEOS को प्लानर निर्देशांक की अपेक्षा है

rgeos को चकमा देने का समय:

# अनुमानित CRS पर सेट करें - कुछ भी हो सकता है polysCRS <- [email protected] [email protected] <- CRS("+init=epsg:32737") # अब इसे बफर करें लेकिन अलग-अलग ऑब्जेक्ट्स को संरक्षित करें polysData <- gBuffer(polysData, width = 0 , byid = T) # मूल CRS [email protected] <- polysCRS को रीसेट करें

जांचें कि क्या ज्यामिति मान्य है:

>gIsValid(polysData, कारण = T) "वैध ज्यामिति"

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

सबसे पहले, मैं कुछ स्थानिक बहुभुज बनाता हूँ

पॉलीपॉइंट 1 <- मैट्रिक्स (सी (1,2,2,1,1,2,2,1,1,2), एनसीओएल = 2) पॉलीपॉइंट्स 2 <- मैट्रिक्स (सी (1,3,3,1,1,3) ,3,1,1,3),ncol=2) पॉलीपॉइंट्स3 <- मैट्रिक्स(सी(1,2,2,1,1,2,2,1,1,2)+1.1,ncol=2) पॉलीपॉइंट4 < - मैट्रिक्स (सी(1,2,2,1,1,2,2,1,1,2)+0.5,ncol=2) p1 <- बहुभुज (पॉलीपॉइंट्स1) ps1 <- बहुभुज (सूची (p1),1 ) sps1 <- SpatialPolygons(list(ps1)) p2 <- Polygon(polypoints2) ps2 <- Polygons(list(p2),2) sps2 <- SpatialPolygons(list(ps2)) p3 <- Polygon(polypoints3) ps3 <- बहुभुज(सूची(p3),3) sps3 <- SpatialPolygons(list(ps3)) p4 <- Polygon(polypoints4) ps4 <- Polygons(list(p4),4) sps4 <- SpatialPolygons(list(ps4))

मैंने उन्हें सिर्फ देखने के लिए साजिश रची

प्लॉट (sps2, col = 'ग्रीन') प्लॉट (sps1, add = T, col = 'ब्लू') प्लॉट (sps3, add = T, col = 'पीला') प्लॉट (sps4, add = T, col = 'पर्पल') ')

मैंने उन्हें एक spdf . में मिला दिया है

data=data.frame(c(x=rep(1,4)),row.names=c(1:4)) sps <- SpatialPolygons(list(ps1,ps2,ps3,ps4)) spdf <- SpatialPolygonsDataFrame( एसपीएस, डेटा)

आप पहचान सकते हैं कि कौन सा बहुभुज ओवरलैप करता है जो इसे पसंद करता है:

gIntersects(spdf,spdf,byid=T)

उपरोक्त आदेश से आप नीचे दिए गए ओवरलैपिंग संयोजनों को करने के लिए कुछ प्रकार के लूप बना सकते हैं (मैं इस बिंदु पर संक्षिप्तता के लिए केवल sps4 को अनदेखा कर रहा हूं)

poly2a <- gIntersection(spdf[2,],spdf[1,],drop_lower_td=T) poly2a <- SpatialPolygonsDataFrame(poly2a,data.frame(c(x=1),row.names=c(1))) प्लॉट (पॉली 2 ए, ऐड = टी, कर्नल = 'रेड')

इस बार हमें आईडी बदलने की जरूरत है क्योंकि हम इन्हें बाद में rbind करने जा रहे हैं

poly2b <- gIntersection(spdf[2,],spdf[3,],drop_lower_td=T) poly2b <- spChFIDs(poly2b,"2") poly2b <- SpatialPolygonsDataFrame(poly2b,data.frame(c(x=1), row.names=c(2))) प्लॉट(poly2b,add=T,col='red')

अतिव्यापी बहुभुजों को दूसरे एसपीडीएफ में मिलाएं

spdf_overlaps <- rbind(poly2a,poly2b) poly2 <- UnionSpatialPolygons(spdf_overlaps,rep(1,2)) प्लॉट(poly2,add=T,col='blue')

अब हमारे पास पॉली 2 है, जहां हमारे पास 2 परतें ओवरलैपिंग हैं (एसपीएस 4 के साथ संयोजन को छोड़कर), फिर 3 परतों का पता लगाने के लिए, हमें बस यह देखना होगा कि पॉली 2 और एसपीडीएफ ओवरलैप कहां हैं (यदि आप इसका अधिक स्वचालित संस्करण बनाते हैं, तो आप करेंगे यह सुनिश्चित करने की आवश्यकता है कि 'poly2' में sps4 शामिल नहीं है जैसा कि इस उदाहरण में है)

gIntersects(poly2,spdf[4,],byid =T) poly3 <- gIntersection(poly2,spdf[4,],drop_lower_td=T) प्लॉट (poly3,add=T,col="red")

इसकी जांच - पड़ताल करें

gIsValid(poly2) gIsValid(poly3)

वैकल्पिक, आप हमेशा एक छद्म रास्टरराइजेशन कर सकते हैं, बहुत आसान, लेकिन आप अपने सेल आकार के आधार पर कुछ विवरण खो देते हैं:

पहले ग्रिड बनाएं:

bb <- bbox(spdf) cs <- c(0.1,0.1) # सेल आकार cc <- bb[, 1] + (cs/2) # सेल ऑफ़सेट cd <- छत (diff(t(bb))/cs ) # प्रति दिशा कोशिकाओं की संख्या जीआर <- ग्रिड टोपोलॉजी (सेलसेंटर.ऑफसेट = सीसी, सेलसाइज = सीएस, सेल। डीआईएम = सीडी) sp_grd <- SpatialGridDataFrame(grd, data=data.frame(id=1:prod(cd)) )

फिर, एक बहुभुज में ग्रिड बनाएं जो ओवरलैप के लिए उपयोग किया जाता है

लाइब्रेरी (ग्रिड2पॉलीगॉन) ग्रिड <- Grid2Polygons(sp_grd) प्लॉट (ग्रिड)

फिर प्रत्येक ग्रिड सेल को ओवरलैप करने वाले बहुभुजों की संख्या गिनें

गिनती <- लागू करें (gContains(spdf,grid,byid=T),1,sum)

अंत में, इसे प्लॉट करें!

प्लॉट (ग्रिड) के लिए (i में १: लंबाई (ग्रिड)) {प्लॉट (ग्रिड [i,], col=rev(heat.colors(३)) [गिनती [i]], जोड़ें = T) }

चौड़ाई = 0 के साथ बफर लागू करना कुछ बहुभुजों के लिए जोखिम भरा हो सकता है, उदा। बोटी पॉलीगॉन के मामले, बहुत सारे स्रोत ज्यामिति को बदलना। आप क्लीनजियो पैकेज का उपयोग करने का प्रयास कर सकते हैं जिसका उद्देश्य स्थानिक वस्तुओं को ठीक करना है। आप इसे Github या CRAN से इंस्टॉल कर सकते हैं। आप अपनी स्थानिक वस्तु को ठीक करने के लिए इस सरल कोड का उपयोग कर सकते हैं:

लाइब्रेरी (क्लीनजियो) पॉलीसडाटा.क्लीन <- clgeo_Clean(polysData) #चेक ज्योमेट्री वैलिडिटी ऑफ़ आउटपुट gIsValid(polysData.clean)

वीडियो देखना: 1218 Connaître le nom des polygones