1

ライブラリのdirichlet()関数によって生成されたボロノイ テッセレーション (別名ディリクレ テッセレーションまたはティーセン ポリゴン) に基づいて、隣接するポリゴンのテーブルを作成しようとしています。spatstatたとえば、下の図では、右上と右下のタイルにはそれぞれ 2 つの隣接タイルがあり、中央右のタイルには 4 つの隣接タイルがあり、残りの 2 つのタイルにはそれぞれ 3 つの隣接タイルがあります。テーブル内の隣接ペアをキャプチャし、理想的にはそれらが共有する境界線の長さをキャプチャしたいと考えています。たとえば、「Tile1」、「Tile2」、「shared_edge_length」などです。

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
} } }

ここに画像の説明を入力

4

2 に答える 2

2

次の関数は、パッケージの作成者によって提供されました。これは、deldir()関数のdirsgs構造がテッセレーションの各ラインの開始/終了座標をポイント インデックスと共に出力するという事実を利用しています。pspこれらは、 を使用して各セグメントの長さを簡単に提供できる線分パターンに変換できますlengths.psp()。以下のコードは、上のプロットに見られる 7 つのエッジのそれぞれに対して 1 つの行を含むテーブルを生成します。

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
于 2014-08-11T19:03:23.833 に答える
0

パッケージの作成者である Rolf Turner に尋ねたところ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
于 2014-06-20T10:12:16.300 に答える