कर्नेल घनत्व का उपयोग करते हुए आर में सड़क घनत्व की गणना? [बन्द है]


13

मेरे पास सड़कों का एक बड़ा (~ 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

Imgur

अच्छा लग रहा है, लेकिन स्केलेबल नहीं है! कुछ अन्य प्रश्नों में इस 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

लेकिन, न तो मामले में, कर्नेल दृष्टिकोण ऊपर के अधिक प्रत्यक्ष दृष्टिकोण के साथ संरेखित करने के करीब आता है।

तो, मेरे सवाल हैं:

  1. मैं density.pspफ़ंक्शन के आउटपुट की व्याख्या कैसे कर सकता हूं ? इकाइयाँ क्या हैं?
  2. मैं sigmaपैरामीटर का चयन कैसे कर सकता हूं density.pspताकि परिणाम अधिक प्रत्यक्ष, सहज ज्ञान युक्त दृष्टिकोण के साथ संरेखित हो?
  3. बोनस: कर्नेल लाइन घनत्व वास्तव में क्या कर रहा है? मुझे कुछ समझ है कि ये दृष्टिकोण बिंदुओं के लिए कैसे काम करते हैं, लेकिन यह नहीं देखते कि यह कैसे लाइनों तक फैली हुई है।

जवाबों:


8

मैंने इस प्रश्न को आर-सिग-जियो सूचीपत्र पर पोस्ट किया और एड्रियन बैडले से एक स्पैटस्टैट लेखकों में से एक उपयोगी उत्तर प्राप्त किया । मैं उनकी प्रतिक्रिया की अपनी व्याख्या यहां पोस्टीरिटी के लिए पोस्ट करूंगा।

एड्रियन ध्यान दें कि फ़ंक्शन spatstat::pixellate.psp()मेरे कार्य के लिए एक बेहतर मैच है। यह फ़ंक्शन एक रेखा खंड पैटर्न (या SpatialLinesरूपांतरण के साथ वस्तु) को एक पिक्सेल छवि (या RasterLayerरूपांतरण के साथ) में परिवर्तित करता है, जहां प्रत्येक सेल में मूल्य उस सेल से गुजरने वाले लाइन खंडों की लंबाई है। बिल्कुल मैं क्या देख रहा हूँ!

परिणामी छवि के रिज़ॉल्यूशन को epsपैरामीटर या पैरामीटर के साथ परिभाषित किया जा सकता है dimyx, जो आयाम (पंक्तियों और स्तंभों की संख्या) निर्धारित करता है।

require(sp)
require(raster)
require(maptools)
require(spatstat)

# 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))

# Convert SpatialLines to psp object using maptools library
pspSl <- as.psp(sl)
# Pixellate with resolution of 0.5, i.e. 2x2 pixels
px <- pixellate(pspSl, eps=0.5)
# This can be converted to raster as desired
rLength <- raster(px)
# Values:
round(as.matrix(rLength),3)

     [,1] [,2]
[1,]  0.5  0.0
[2,]  1.0  0.5

परिणाम बिल्कुल वांछित हैं।

एड्रियन ने मेरे सवालों के जवाब भी दिए spatstat::density.psp()। वह बताते हैं कि यह समारोह:

लाइनों के साथ गाऊसी कर्नेल के दृढ़ीकरण की गणना करता है। सहज रूप से, इसका मतलब है कि density.pspलाइनों को दो-आयामी स्थान में 'स्मीयर' करता है। तो density(L)एक धुंधला संस्करण की तरह है pixellate(L)। वास्तव में density(L)बहुत के समान है blur(pixellate(L))जहां blurएक और है spatstatसमारोह है कि एक छवि blurs। [पैरामीटर] sigmaगॉसियन कर्नेल की बैंडविड्थ है। density.psp(L)किसी दिए गए पिक्सेल u का मान , पिक्सेल u के आसपास त्रिज्या सिग्मा के एक सर्कल में लाइन की लंबाई की कुल राशि की तरह कुछ है, सिवाय इसके कि यह वास्तव में अलग-अलग सर्कल radii से इस तरह के योगदान का एक भारित औसत है। इकाइयाँ लंबाई ^ (- 1) हैं, अर्थात प्रति इकाई क्षेत्र की लंबाई।

यह मेरे लिए कुछ हद तक अस्पष्ट है जब गौसियन कर्नेल के density.psp()दृष्टिकोण को सीधे लाइन लंबाई में गणना करने के अधिक सहज दृष्टिकोण पर पसंद किया जाएगा pixellate()। मुझे लगता है कि मुझे विशेषज्ञों के लिए छोड़ना होगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.