커널 밀도를 사용하여 R의 도로 밀도를 계산합니까? [닫은]


13

나는 도로의 큰 (~ 70MB) 모양 파일을 가지고 있으며 이것을 각 셀의 도로 밀도를 가진 래스터로 변환하려고합니다. 이상적으로 필요한 경우 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

그러나 어느 경우에도 커널 접근 방식은 위의 더 직접적인 접근 방식과 거의 일치합니다.

그래서 내 질문은 :

  1. density.psp함수 의 출력을 어떻게 해석 할 수 있습니까? 단위는 무엇입니까?
  2. 결과가 위의보다 직접적이고 직관적 인 접근 방식과 일치하도록 sigma매개 변수를 어떻게 선택할 수 density.psp있습니까?
  3. 보너스 : 커널 라인 밀도는 실제로 무엇입니까? 이러한 접근 방식이 포인트에서 어떻게 작동하는지 이해하지만 그것이 어떻게 선으로 확장되는지는 알지 못합니다.

답변:


8

질문을 R-sig-Geo listserv에 게시 했으며 spatstats 저자 중 하나 인 Adrian Baddeley로부터 유용한 답변 을 받았습니다 . 나는 그의 후손에 대한 그의 반응에 대한 해석을 여기에 올릴 것이다.

Adrian은이 기능 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

결과는 정확히 원하는대로입니다.

Adrian도에 대한 내 질문에 답변했습니다 spatstat::density.psp(). 그는이 기능을 다음과 같이 설명합니다.

가우스 커널과 회선의 컨볼 루션을 계산합니다. 직관적으로 이것은 density.psp선을 2 차원 공간으로 '바르게' 의미합니다 . 그래서 density(L)흐리게 버전 같다 pixellate(L). 실제로 이미지를 흐리게 처리하는 다른 기능이 있는 위치 density(L)와 매우 유사합니다 . [파라미터] 는 가우스 커널의 대역폭입니다. 주어진 픽셀 u에서 의 값은 픽셀 u 주위의 반경 시그마 원에서의 총 라인 길이의 양과 같습니다. 단, 다른 원 반경의 기여의 가중 평균이라는 점을 제외하고는. 단위는 길이 ^ (-1), 즉 단위 면적당 선 길이입니다. blur(pixellate(L))blurspatstatsigmadensity.psp(L)

density.psp()에서 직선 길이를 직접 계산하는보다 직관적 인 접근 방식보다 가우시안 커널 접근 방식 이 선호되는 경우에는 다소 불분명합니다 pixellate(). 전문가들에게 맡겨야 할 것 같습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.