जब r में मान एकत्र करते हैं, तो% बहुभुज पर स्थानिक बहुभुज% कैसे काम करता है?


12

मैं एक पर्यावरणीय महामारी विज्ञान परियोजना पर काम कर रहा हूं जहां मेरे पास प्वाइंट एक्सपोजर (~ 2,000 औद्योगिक हॉग संचालन - IHOs) हैं। ये IHO आस-पास के खेतों पर स्प्रे करते हैं, लेकिन मल पानी की बूंदें और गंध मीलों की यात्रा कर सकते हैं। तो इन बिंदु एक्सपोज़र में 3 मिमी बफ़र मिलते हैं, और मैं NC प्रति जनगणना ब्लॉकों के अनुसार IHO एक्सपोज़र की संख्या (विभिन्न प्रकार के - खाद की मात्रा, हॉग की संख्या, जो भी हो; सबसे सरल, बस ओवरलैपिंग एक्सपोजर की संख्या) जानना चाहता हूं। (~ 200,000)। बहिष्करण जनगणना ब्लॉक (नीला) शीर्ष 5 सबसे अधिक आबादी वाले शहरों में (1) कुछ भी हैं और (2) काउंटी, जो इसमें IHO के साथ एक काउंटी की सीमा नहीं रखते हैं (ध्यान दें: यह gRelate फ़ंक्शन और DE-9IM कोड के साथ किया गया था - बहुत चालाक!)। एक दृश्य के लिए छवि के नीचे देखें

यहाँ छवि विवरण दर्ज करें

अंतिम चरण हर जनगणना ब्लॉक में बफर एक्सपोज़र प्रतिनिधित्व को एकत्रित करना है। यहीं पर मैं ठहरा हूं।

मेरे पास अभी तक sp पैकेज में% से अधिक कार्यों के% के साथ अच्छा समय है, लेकिन ओवर विगनेट से समझते हैं कि पॉली-पॉली और पॉली-लाइन ओवर रेज में कार्यान्वित किए जाते हैं। विगनेट केवल लाइन-पॉली और सेल्फ-रेफ़रिंग पॉली को कवर करता है, और एकत्रीकरण के साथ नहीं, इसलिए मैं इस बात पर थोड़ा भ्रमित हूं कि मेरे विकल्प पॉली-पॉली के लिए फ़ंक्शन एग्रीगेशन के साथ हैं, जैसे योग या मतलब।

एक परीक्षण के मामले के लिए, नीचे, कुछ हद तक वर्बोज़ स्निपेट पर काम करने पर विचार करें, जो देश की सीमाओं की फ़ाइल के साथ हो। इसे कॉपी और रन करने में सक्षम होना चाहिए, क्योंकि मैं अंकों के लिए एक यादृच्छिक बीज का उपयोग कर रहा हूं और जब से मैं कोड में विश्व फ़ाइल डाउनलोड और अनज़िप कर रहा हूं।

सबसे पहले, हम 100 अंक बनाते हैं, फिर डेटा फ्रेम में तत्व को जोड़ने के लिए fn तर्क के साथ ओवर फंक्शन का उपयोग करते हैं। यहां बहुत सारे बिंदु हैं, लेकिन एक लेबल के रूप में ऑस्ट्रेलिया: 3 अंक, नंबर 3 पर एक नज़र डालें। अब तक सब ठीक है।

यहाँ छवि विवरण दर्ज करें

अब हम ज्यामितीय रूपांतरित करते हैं, इसलिए हम बफ़र्स बना सकते हैं, रूपांतरण कर सकते हैं और उन बफ़र्स को मैप कर सकते हैं। (पिछले नक्शे पर शामिल, जब से मैं दो लिंक तक सीमित हूं।) हम जानना चाहते हैं कि प्रत्येक बफ़र प्रत्येक देश को ओवरलैप करता है - ऑस्ट्रेलिया के मामले में, आंख से, कि 4. मैं मेरे जीवन के आंकड़े के लिए नहीं जा सकता कि क्या चल रहा है हालांकि अधिक समारोह के साथ प्राप्त करने के लिए। कोड की अंतिम पंक्तियों में मेरे प्रयास की गड़बड़ी देखें।

संपादित करें: ध्यान दें कि r-sis-geo पर एक टिप्पणीकार ने कुल कार्य का उल्लेख किया है - स्टैक एक्सचेंज प्रश्न 63577 पर भी संदर्भित है - इसलिए उस फ़ंक्शन के आसपास / प्रवाह के आसपास एक काम हो सकता है, लेकिन मुझे समझ नहीं आता कि मुझे जाने की आवश्यकता क्यों है जब अन्य स्थानिक वस्तुओं के लिए यह कार्यक्षमता होती है, तो पॉलीपोलि के लिए कुल मिलाकर।

require(maptools)
require(sp)
require(rgdal)
require(rgeos)

download.file("http://thematicmapping.org/downloads/TM_WORLD_BORDERS_SIMPL-0.3.zip", destfile="world.zip")
unzip("world.zip")
world.map = readOGR(dsn=".", "TM_WORLD_BORDERS_SIMPL-0.3", stringsAsFactors = F)
orig.world.map = world.map #hold the object, since I'm going to mess with it.

#Let's create 500 random lat/long points with a single value in the data frame: the number 1
set.seed(1)
n=100
lat.v = runif(n, -90, 90)
lon.v = runif(n, -180, 180)
coords.df = data.frame(lon.v, lat.v)
val.v = data.frame(rep(1,n))
names(val.v) = c("val")
names(coords.df) = c("lon", "lat")
points.spdf = SpatialPointsDataFrame(coords=coords.df, proj4string=CRS("+proj=longlat +datum=WGS84"), data=val.v)
points.spdf = spTransform(points.spdf, CRS(proj4string(world.map)))
plot(world.map, main="World map and points") #replot the map
plot(points.spdf, col="red", pch=20, cex=1, add=T) #...and add points.

#Let's use over with the point data
join.df = over(geometry(world.map), points.spdf,  fn=sum)
plot(world.map, main="World with sum of points, 750mi buffers") #Note - happens to be the count of points, but only b/c val=1.
plot(points.spdf, col="red", pch=20, cex=1, add=T) #...and add points.
world.map@data = data.frame(c(world.map@data, join.df))
#world.map@data = data.frame(c(world.map@data, over(world.map, points.spdf, fun="sum")))
invisible(text(getSpPPolygonsLabptSlots(world.map), labels=as.character(world.map$val), cex=1))
#Note I don't love making labels like above, and am open to better ways... plus I think it's deprecated/ing

#Now buffer...
pointbuff.spdf = gBuffer(spTransform(points.spdf, CRS("+init=EPSG:3358")), width=c(750*1609.344), byid=T)
pointbuff.spdf = spTransform(pointbuff.spdf, world.map@proj4string)
plot(pointbuff.spdf, col=NA, border="pink", add=T)



#Now over with the buffer (poly %over% poly).  How do I do this?
world.map = orig.world.map
join.df = data.frame(unname(over(geometry(world.map), pointbuff.spdf, fn=sum, returnList = F)) ) #Seems I need to unname this...?
names(join.df) = c("val")
world.map@data = data.frame(c(world.map@data, join.df)) #If I don't mess with the join.df, world.map's df is a mess..
plot(world.map, main="World map, points, buffers...and a mess of wrong counts") #replot the map
plot(points.spdf, col="red", pch=20, cex=1, add=T) #...and add points.
plot(pointbuff.spdf, col=NA, border="pink", add=T)
invisible(text(getSpPPolygonsLabptSlots(world.map), labels=as.character(world.map$val), cex=1)) 
#^ But if I do strip it of labels, it seems to be misassigning the results?
# Australia should now show 4 instead of 3.  I'm obviously super confused, probably about the structure of over poly-poly returns.  Help?

पुनर्निर्देशन की सराहना करें - क्या मुझे यहां से हटा देना चाहिए और वहां पर फिर से भेजना चाहिए? सबसे अच्छा कदम क्या है? धन्यवाद।
माइक डोलन फ्लश

जवाबों:


5

स्पष्ट प्रश्न और प्रतिलिपि प्रस्तुत करने योग्य उदाहरण के लिए धन्यवाद।

आपकी समझ सही है, और यह rgeos :: over पर एक बग में उबलता है, जो एक महीने पहले तय किया गया था लेकिन अभी तक इसे CRAN रिलीज़ में नहीं बनाया है। यदि आप केवल चौराहों की संख्या में रुचि रखते हैं तो निम्नलिखित कार्य है:

world.map$val = sapply(over(geometry(world.map), pointbuff.spdf, returnList = TRUE), NROW)

मैं NROWयहाँ का उपयोग कर रहा हूँ lengthताकि यह गलत rgeos (0.3-8, CRAN से) के साथ-साथ सही (0.3-10, r-forge) के साथ काम करे। उपयोग करने का पहले का सुझाव

a = aggregate(pointbuff.spdf, world.map, sum)

चौराहों की संख्या को भी गिना जाता है, लेकिन केवल निर्धारित रेजोस संस्करण के साथ। इसका लाभ, एक अधिक सहज नाम के अलावा, यह है कि यह सीधे एक Spatialवस्तु लौटाता है , की ज्यामिति के साथ world.map

0.3-8 वर्किंग rgeos प्राप्त करने के लिए, जोड़ें

setMethod("over",
    signature(x = "SpatialPolygons", y = "SpatialPolygonsDataFrame"),
        rgeos:::overGeomGeomDF)

अपनी स्क्रिप्ट के लिए, उपयोग करने से पहले over


बहुत मददगार, धन्यवाद। मैं विशेष रूप से आपके प्रस्ताव को एक समाधान का जश्न मनाना चाहता हूं जो पूर्व और बाद के फिक्स का काम करता है। क्या आप इस बात पर विस्तार से विचार करेंगे: (1) क्या बग है जो मैं यहां मार रहा हूं- rgeos :: over एक स्थानिक बहुभुज भूगोल लौटा रहा है, न कि एक स्थानिक पॉली डेटा फ़्रेम? क्या कुछ फ़ंक्शंस सिर्फ डेटा फ़्रेम वापस नहीं करते हैं ...? (२) यह आम तौर पर कुल और ओवर के साथ कैसे काम करना चाहिए? मैं उनके इच्छित मतभेदों और मामलों का उपयोग करने के लिए थोड़ा भ्रमित हूं। वास्तव में अपने वजन की सराहना करते हैं, धन्यवाद। और सिडेनोट: सीआरएएन रिलीज चक्र को समझने के लिए कोई सुझाव?
माइक डोलन फ्लिस

इसके अलावा, मूल प्रश्न के रूप में: मुझे एक्सपोज़र की संख्या की गणना करने की आवश्यकता है, लेकिन मुझे वास्तव में उन्हें योग करने की आवश्यकता है - प्रत्येक एक्सपोज़र में हॉग की संख्या जैसी चीजें। ओवरलैपिंग की गिनती एक शुरुआत है ... लेकिन यह लगता है कि मुझे जिस समाधान की आवश्यकता है वह नवीनतम रागों में खींचना है, हाँ? इसके बिना उस कार्यात्मक एकत्रीकरण (सिर्फ गिनती नहीं) करने का कोई तरीका नहीं है?
माइक डोलन फ्लिस

(1) rgeos :: हस्ताक्षर के लिए ओवर को SpatialPolygons,SpatialPolygonsDataFrameएक लौटना चाहिए data.frame, लेकिन एक इंडेक्स वेक्टर को उसी समय लौटाता है जब yवह होता SpatialPolygonssp::aggregateक्या आप अधिक उपयोगकर्ता के अनुकूल तरीके से करते हैं, Spatialइसके बजाय ऑब्जेक्ट को वापस करते हैं data.frame। स्वयंसेवकों द्वारा CRAN पैकेज बनाए रखे जाते हैं।
एडज़र पेबसेमा

ठीक है, धन्यवाद एडजर। ऐसा लगता है कि समग्र rgeos पर निर्भर करता है, इसलिए CRAN रिलीज़ चक्र (जब भी है) से आगे इस कार्यक्षमता को प्राप्त करने के लिए, मुझे यह पता लगाना होगा कि नवीनतम rgeos को कैसे डाउनलोड किया जाए और उससे काम कैसे किया जाए। धन्यवाद। और पैकेज पर आपके सभी काम के लिए धन्यवाद !!
माइक डोलन फ्लिस

इसके अलावा, एडज़र, आर-सीस-जियो पर नोट के लिए बहुत बहुत धन्यवाद। यकीन नहीं था कि पोस्ट करने के लिए बेहतर जगह कहां थी, इसलिए मुझे खुशी है कि अब थ्रेड यहां इंगित करता है।
माइक डोलन फ्लिस

1

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

यह फ़ंक्शन स्पष्ट रूप से (1) अपूर्ण है (ध्यान दें कि मैं fn तर्क को कैसे अनदेखा करता हूं) और (2) अक्षम है, क्योंकि मैं आर के शक्तिशाली सरणी जोड़तोड़ / नीलम के बिना आ रहा हूं ... (स्पष्ट रूप से मैं अन्य भाषाओं के बिना आ रहा हूं वह शक्ति) लेकिन ईमानदारी से, मैं अभी भी उलझन में हूं कि ओवर फंक्शन की संरचना क्या है (सूचियों की सूची ... और? रिक्त सूची यदि NA?)। इसके लायक क्या है (संपादन का स्वागत), यह कार्य उस कार्य को करता है जिसकी मुझे आवश्यकता है, सफलतापूर्वक, और अन्य कार्यों की क्रिया की नकल करता है।

संपादन में आपका स्वागत है:

overhelper <- function(pol, pol.df, fn=sum, verbose=F){
   if(verbose) {cat("Building over geometry...\n"); t=Sys.time(); t}
   geolist = over(geometry(pol), pol.df, returnList = T)
   if(verbose) {cat("Geometry done. Aggregating df. \n"); Sys.time()-t;t=Sys.time();t;}
   results = data.frame(matrix(0,nrow=length(pol), ncol=ncol(pol.df)))
   names(results) = names(pol.df)
   end = length(geolist)

   for (i in 1:end){
     if(verbose) cat(i, "...")
     results[i,] = sapply(pol.df@data[unlist(geolist[i]),], fn)
   }
   if(verbose) cat("Aggregation done! (", Sys.time()-t, ") \n Returning result vector.")
   return (results)
}

1
मैंने अपने उत्तर के लिए rgeos 0.3-8 निश्चित करने के लिए एक विकल्प जोड़ा।
एडज़र पेबस्मा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.