カーネル密度を使用してRの道路密度を計算しますか?[閉まっている]


13

道路の大きな(〜70MB)シェープファイルがあり、これを各セルの道路密度を持つラスターに変換したい。理想的には、必要に応じてGDALコマンドラインツールとともにRでこれを実行したいと思います。

私の最初のアプローチは、このスレッドごとに各セルの線分セグメントの長さを直接計算することでした。これにより目的の結果が得られますが、シェープファイルが私のものよりはるかに小さい場合でも非常に遅くなります。正しいセル値が明らかな非常に単純化された例は次のとおりです。

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

ただし、どちらの場合も、カーネルアプローチは上記のより直接的なアプローチとほぼ一致します。

だから、私の質問は次のとおりです。

  1. density.psp関数の出力をどのように解釈できますか?単位は何ですか?
  2. 上記のより直接的で直感的なアプローチと結果が一致するように、どのようにsigmaパラメーターを選択できますdensity.pspか?
  3. おまけ:カーネルの線密度は実際には何ですか?これらのアプローチがポイントに対してどのように機能するかについてある程度の感覚はありますが、それが線にどのように拡張されるかはわかりません。

回答:


8

この質問をR-sig-Geo listservに投稿し、spatstatsの作成者の1人であるAdrian Baddeleyから有益な回答を受け取りました。後世のために彼の応答の解釈をここに掲載します。

エイドリアンは、この関数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))います。[パラメータ] は、ガウスカーネルの帯域幅です。特定のピクセルu の値は、ピクセルuを中心とする半径sigmaの円内の線の長さの合計に似ていますが、異なる円半径からのそのような寄与の実際の加重平均です。単位はlength ^(-1)、つまり単位面積あたりの行の長さです。 blurspatstatsigmadensity.psp(L)

のガウスカーネルアプローチが、のdensity.psp()直線長を直接計算するより直観的なアプローチよりも優先される場合、それはいくぶん明確ではありませんpixellate()。専門家に任せる必要があると思います。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.