2014-06-19 3 views
1

spatstat 라이브러리의 dirichlet() 함수에 의해 생성 된 Voronoi 테셀레이션 (일명 Dirichlet tessellations 또는 Thiessen 다각형)을 기반으로 다각형 이웃 테이블을 만들려고합니다. 예를 들어 아래 그림에서 오른쪽 위 타일과 오른쪽 아래 타일은 각각 2 개의 이웃과 가운데 오른쪽 타일 4 이웃, 나머지 두 타일은 각각 이웃합니다. 나는 이웃 쌍을 테이블에 담아 공유하고 그들이 공유하는 경계선의 길이를 이상적으로 포착하려고합니다. 예 : 'Tile1', 'Tile2', 'shared_edge_length'.보로 노이 tesslleation에 대한 공유 가장자리의 테이블

처음에, 나는 통해 루프를 시도하고 intersect.tess(), intersect.own()뿐만 아니라 polyclip 기능을 사용하여 테셀레이션에서 다각형의 각 쌍을 비교,하지만 난 타일 정의에 중복하지 않음으로써 때문에이 작동하지 않습니다 같은데요 지역, 공유 가장자리에도 불구하고. 이 기능을 수행하는 간단한 기능이 있습니까 ($bdry 점을 반복하는 대안이 될 수 있습니다)? regeos 패키지에 gTouches이있는 것 같지만 spatstat과 비슷한 것을 찾을 수 없습니다.

이 내 현재의 비 작동 방법입니다 : 난 그냥 롤프 터너에게 물었다

library(spatstat) 
points <- ppp(x=c(-77.308703, -77.256582, -77.290600, -77.135668, -77.097144), 
     y=c(39.288603, 39.147019, 39.372818, 39.401898, 39.689203), 
     window=owin(xrange=c(-77.7,-77), yrange=c(39.1, 39.7))) 
vt <- dirichlet(points) # Dirichlet tesselation 
plot(vt) 

tilesA <- tiles(vt) 
n_tiles <- length(tilesA) 
boundary_calcs <- data.frame('area1_id'=numeric(), 'area2_id'=numeric(), 'neighbor'=logical()) # Store boundary pairs 
for (i in 1:n_tiles) { 
    for (j in 1:n_tiles) { 
    intersection <- intersect.owin(tilesA[[i]], tilesA[[j]], fatal=FALSE) # does not work 
    if (!is.empty(intersection)) { 
     boundary_calcs[nrow(boundary_calcs)+1, ] <- c(i, j, TRUE) # add to data table as new row 
} } } 

enter image description here

답변

2

다음 기능은 패키지 작성자가 제공했습니다. deldir() 함수의 dirsgs 구조가 지점 인덱스와 함께 테셀레이션의 각 줄의 시작/끝 좌표를 출력한다는 사실을 사용합니다. 이들은 lengths.psp()을 사용하여 각 세그먼트의 길이를 쉽게 제공 할 수있는 psp 선분 패턴으로 변환 될 수 있습니다. 아래의 코드는 위에있는 플롯에서 볼 수있는 7 개의 모서리 각각에 대해 하나의 행이있는 표를 생성합니다.

library(spatstat) 
library(deldir) 
points <- ppp(x=c(-77.308703, -77.256582, -77.290600, -77.135668, -77.097144), 
     y=c(39.288603, 39.147019, 39.372818, 39.401898, 39.689203), 
     window=owin(xrange=c(-77.7,-77), yrange=c(39.1, 39.7))) 

sharededge <- function(X) { 
    verifyclass(X, "ppp") 
    Y <- X[as.rectangle(X)] 
    dX <- deldir(Y) 
    DS <- dX$dirsgs 
    xyxy <- DS[,1:4] 
    names(xyxy) <- c("x0","y0","x1","y1") 
    sX <- as.psp(xyxy,window=dX$rw) 
    marks(sX) <- 1:nobjects(sX) 
    sX <- sX[as.owin(X)] 
    tX <- tapply(lengths.psp(sX), marks(sX), sum) 
    jj <- as.integer(names(tX)) 
    ans <- data.frame(ind1=DS[jj,5], 
        ind2=DS[jj,6], 
        leng=as.numeric(tX)) 
    return(ans) 
} 

shared_edge_lengths <- sharededge(points) 

shared_edge_lengths에 저장 출력 : 질문에 대한 자세한 독서 후

ind1 ind2  leng 
1 2 1 0.17387212 
2 3 1 0.13444458 
3 4 1 0.05791519 
4 4 2 0.10039321 
5 4 3 0.25842530 
6 5 3 0.09818828 
7 5 4 0.17162429 
0

패키지 deldir의 저자이며, 그는 이웃의 수를 찾기 위해 아래의 코드를 제공 타일마다. 나는 "그들이 공유하는 경계선의 길이를 이상적으로 포착"하고자하는 당신의 희망을 아직 보지 못했습니다.

x <- c(-77.308703, -77.256582, -77.290600, -77.135668, -77.097144) 
y <- c(39.288603, 39.147019, 39.372818, 39.401898, 39.689203) 
rw <- c(-77.7,-77,39.1,39.7) 
require(deldir) 
dxy <- deldir(x,y,rw=rw) 

dxy$summary$n.tside 
+0

, 나는이 모든 답을 제공하지 않는 것을 알 수있다. 그것은 이웃들의 숫자 일 뿐이며 어떤 쌍이 이웃들인지를 나타내지 않습니다. 다행히도 나중에 다시 돌아갈 시간이 있습니다. (당신은 이웃 쌍들을 찾기 위해'delaunay'를 시도 할 수 있습니다, 그러나 나는 그것이 유용하다는 것을 절대적으로 확신하지 못합니다. 개념적으로 Delaunay 그래프는 볼거리입니다.). 노트에 대해 –

+0

주셔서 감사합니다. 나는 당신의 제안을 탐색 해 왔지만 Delaunay 그래프를 사용하는 방법을 찾지 못했습니다. 'dirichlet '으로 이미 생성 된 타일 쌍을 사용하여 이것을 수행 할 방법이없는가요? – Bryan

관련 문제