मेरे पास सड़कों का एक बड़ा (~ 70 एमबी) आकार है और इसे प्रत्येक सेल में सड़क घनत्व के साथ एक रेखापुंज में बदलना चाहते हैं। यदि आवश्यक हो तो आदर्श रूप में मैं R में GDAL कमांड लाइन टूल के साथ ऐसा करना चाहूंगा।
मेरा प्रारंभिक दृष्टिकोण इस थ्रेड के अनुसार प्रत्येक सेल में लाइन सेगमेंट की लंबाई की सीधे गणना करना था । यह वांछित परिणाम पैदा करता है, लेकिन आकार में खदानों की तुलना में काफी छोटा है। यहाँ एक बहुत ही सरल उदाहरण दिया गया है जिसके लिए सही सेल मान स्पष्ट हैं:
require(sp)
require(raster)
require(rgeos)
require(RColorBrewer)
# Create some sample lines
l1 <- Lines(Line(cbind(c(0,1),c(.25,0.25))), ID="a")
l2 <- Lines(Line(cbind(c(0.25,0.25),c(0,1))), ID="b")
sl <- SpatialLines(list(l1,l2))
# Function to calculate lengths of lines in given raster cell
lengthInCell <- function(i, r, l) {
r[i] <- 1
rpoly <- rasterToPolygons(r, na.rm=T)
lc <- crop(l, rpoly)
if (!is.null(lc)) {
return(gLength(lc))
} else {
return(0)
}
}
# Make template
rLength <- raster(extent(sl), res=0.5)
# Calculate lengths
lengths <- sapply(1:ncell(rLength), lengthInCell, rLength, sl)
rLength[] <- lengths
# Plot results
spplot(rLength, scales = list(draw=TRUE), xlab="x", ylab="y",
col.regions=colorRampPalette(brewer.pal(9, "YlOrRd")),
sp.layout=list("sp.lines", sl),
par.settings=list(fontsize=list(text=15)))
round(as.matrix(rLength),3)
#### Results
[,1] [,2]
[1,] 0.5 0.0
[2,] 1.0 0.5
अच्छा लग रहा है, लेकिन स्केलेबल नहीं है! कुछ अन्य प्रश्नों में इस spatstat::density.psp()
कार्य के लिए फ़ंक्शन की सिफारिश की गई है। यह फ़ंक्शन कर्नेल घनत्व दृष्टिकोण का उपयोग करता है। मैं इसे लागू करने में सक्षम हूं और यह उपरोक्त दृष्टिकोण से तेज है, लेकिन मैं स्पष्ट नहीं हूं कि मापदंडों का चयन कैसे करें या परिणामों की व्याख्या कैसे करें। यहाँ उपर्युक्त उदाहरण का उपयोग किया गया है density.psp()
:
require(spatstat)
require(maptools)
# Convert SpatialLines to psp object using maptools library
pspSl <- as.psp(sl)
# Kernel density, sigma chosen more or less arbitrarily
d <- density(pspSl, sigma=0.01, eps=0.5)
# Convert to raster
rKernDensity <- raster(d)
# Values:
round(as.matrix(rKernDensity),3)
#### Results
[,1] [,2]
[1,] 0.100 0.0
[2,] 0.201 0.1
मैंने सोचा कि ऐसा हो सकता है कि कर्नेल दृष्टिकोण घनत्व की गणना प्रति सेल की लंबाई के विपरीत करता है, इसलिए मैंने रूपांतरण किया:
# Convert from density to length per cell for comparison
rKernLength <- rKernDensity * res(rKernDensity)[1] * res(rKernDensity)[2]
round(as.matrix(rKernLength),3)
#### Results
[,1] [,2]
[1,] 0.025 0.000
[2,] 0.050 0.025
लेकिन, न तो मामले में, कर्नेल दृष्टिकोण ऊपर के अधिक प्रत्यक्ष दृष्टिकोण के साथ संरेखित करने के करीब आता है।
तो, मेरे सवाल हैं:
- मैं
density.psp
फ़ंक्शन के आउटपुट की व्याख्या कैसे कर सकता हूं ? इकाइयाँ क्या हैं? - मैं
sigma
पैरामीटर का चयन कैसे कर सकता हूंdensity.psp
ताकि परिणाम अधिक प्रत्यक्ष, सहज ज्ञान युक्त दृष्टिकोण के साथ संरेखित हो? - बोनस: कर्नेल लाइन घनत्व वास्तव में क्या कर रहा है? मुझे कुछ समझ है कि ये दृष्टिकोण बिंदुओं के लिए कैसे काम करते हैं, लेकिन यह नहीं देखते कि यह कैसे लाइनों तक फैली हुई है।