मैं एक पर्यावरणीय महामारी विज्ञान परियोजना पर काम कर रहा हूं जहां मेरे पास प्वाइंट एक्सपोजर (~ 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?