Yolların büyük bir (~ 70MB) şekil dosyası var ve bunu her hücrede yol yoğunluğu olan bir raster dönüştürmek istiyorum. İdeal olarak bunu GDAL komut satırı araçlarıyla birlikte R'de yapmak istiyorum.
İlk yaklaşımım, bu iş parçacığına göre her bir hücredeki çizgi parçalarının uzunluklarını doğrudan hesaplamaktı . Bu istenen sonuçları üretir, ancak benimkinden çok daha küçük şekil dosyaları için bile oldukça yavaştır. Doğru hücre değerlerinin açık olduğu çok basitleştirilmiş bir örnek:
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
İyi görünüyor, ancak ölçeklenebilir değil! Diğer birkaç soruda spatstat::density.psp()
bu görev için işlev önerilmiştir. Bu işlev bir çekirdek yoğunluğu yaklaşımı kullanır. Bunu uygulayabiliyorum ve yukarıdaki yaklaşımdan daha hızlı görünüyor, ancak parametreleri nasıl seçeceğimizi veya sonuçları nasıl yorumlayacağımı bilmiyorum. Yukarıdaki örnek şöyledir 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
Çekirdek yaklaşımının yoğunluğu hücre başına uzunluk yerine hesapladığını düşündüm, bu yüzden dönüştürdüm:
# 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
Ancak, her iki durumda da, çekirdek yaklaşımı yukarıdaki daha doğrudan yaklaşımla hizalanmaya yaklaşmaz.
Yani, sorularım:
density.psp
Fonksiyonun çıktısını nasıl yorumlayabilirim ? Birimler nelerdir?- Sonuçları yukarıdaki daha doğrudan, sezgisel bir yaklaşımla hizalanacak şekilde
sigma
parametreyi nasıl seçebilirimdensity.psp
? - Bonus: Çekirdek çizgi yoğunluğu gerçekte ne yapıyor? Bu yaklaşımların puanlar için nasıl çalıştığına dair bir fikrim var, ama bunun çizgilere nasıl yayıldığını görmüyorum.