हाल ही के एक प्रश्न के बाद , आप अपनी समस्या को हल करने के लिए rgeos पैकेज द्वारा दी गई कार्यप्रणाली का उपयोग करना चाहते हैं । प्रजनन क्षमता के कारणों के लिए, मैंने DIVA-GIS से तंजानिया की सड़कों का एक आकार-प्रकार डाउनलोड किया और इसे अपनी वर्तमान कार्यशील निर्देशिका में रखा। आगामी कार्यों के लिए, आपको तीन पैकेजों की आवश्यकता होगी:
- सामान्य स्थानिक डेटा हैंडलिंग के लिए rgdal
- आकृति डेटा के रेखापुंज के लिए रेखापुंज
- rgeos रास्टर टेम्पलेट के साथ सड़कों के चौराहे की जांच करने और सड़क की लंबाई की गणना करने के लिए
नतीजतन, आपकी पहली लाइनें इस तरह दिखनी चाहिए:
library(rgdal)
library(raster)
library(rgeos)
उसके बाद, आपको शेपफाइल डेटा आयात करने की आवश्यकता है। ध्यान दें कि DIVA-GIS शेपफाइल्स को EPSG: 4326 में वितरित किया जाता है, इसलिए मैं शेपफाइल को EPSG: 21037 (UTM 37S) में डिग्री के बजाय मीटर से निपटने के लिए प्रोजेक्ट करूंगा।
roads <- readOGR(dsn = ".", layer = "TZA_roads")
roads_utm <- spTransform(roads, CRS("+init=epsg:21037"))
बाद के रेखांकन के लिए, आपको एक रेखापुंज टेम्पलेट की आवश्यकता होगी जो आपके शेपफाइल की स्थानिक सीमा को कवर करता है। रेखापुंज टेम्पलेट में 10 पंक्तियाँ और 10 कॉलम डिफ़ॉल्ट रूप से होते हैं, इस प्रकार बहुत व्यापक गणना समय से बचते हैं।
roads_utm_rst <- raster(extent(roads_utm), crs = projection(roads_utm))
अब जब टेम्प्लेट सेट हो गया है, तो रेखापुंज की सभी कोशिकाओं के माध्यम से लूप (जो वर्तमान में केवल NA मान से युक्त है)। वर्तमान सेल को '1' का मान rasterToPolygons
देकर और बाद में निष्पादित करने के परिणामस्वरूप, परिणामी आकृति 'tmp_shp' स्वचालित रूप से वर्तमान में संसाधित पिक्सेल की सीमा रखता है। gIntersects
पता लगाता है कि क्या यह सीमा सड़कों के साथ ओवरलैप है। यदि नहीं, तो फ़ंक्शन '0' का मान लौटाएगा। अन्यथा, सड़क आकृति को चालू सेल द्वारा क्रॉप किया जाता है और उस सेल के भीतर 'स्पैटियललाइन' की कुल लंबाई का उपयोग करके गणना की जाती है gLength
।
lengths <- sapply(1:ncell(roads_utm_rst), function(i) {
tmp_rst <- roads_utm_rst
tmp_rst[i] <- 1
tmp_shp <- rasterToPolygons(tmp_rst)
if (gIntersects(roads_utm, tmp_shp)) {
roads_utm_crp <- crop(roads_utm, tmp_shp)
roads_utm_crp_length <- gLength(roads_utm_crp)
return(roads_utm_crp_length)
} else {
return(0)
}
})
अंत में, आप गणना किए गए लंबाई (जो किलोमीटर में परिवर्तित हो जाते हैं) को रेखापुंज टेम्पलेट में सम्मिलित कर सकते हैं और अपने परिणामों को नेत्रहीन रूप से सत्यापित कर सकते हैं।
roads_utm_rst[] <- lengths / 1000
library(RColorBrewer)
spplot(roads_utm_rst, scales = list(draw = TRUE), xlab = "x", ylab = "y",
col.regions = colorRampPalette(brewer.pal(9, "YlOrRd")),
sp.layout = list("sp.lines", roads_utm),
par.settings = list(fontsize = list(text = 15)), at = seq(0, 1800, 200))
vignette('over', package = 'sp')
मदद कर सकता है।