0

完全に重なり合う 2 つのラスターがあります (範囲とセル サイズが同じ)。1 つのラスター内のすべてのセル (つまり、すべての XY) について、ラスター間の特定のしきい値の差内で最も近いセルまでのユークリッドの地理的距離を決定したいと考えています。

別の言い方をすれば、raster1 と raster2 はいくつかの変数 Z を測定します。私は、Z 値 (t) のしきい値の差を持っています。ラスタ 1 の参照セルごとに、1) abs(Z2-Z1) の Z 値を持つラスタ 2 のすべてのセルを見つける必要があります。

各ラスターには約 2,600 万個のセルがあり、そのうちの約 1,000 万個は非 NA 値です。この問題に対して、ラスターベースではない回避策を考え出しましたが、ラスターを XYZ テーブル/ベクターに変換し、参照セルごとにループ関数を実行することによってのみです。これは、私が扱っているデータ サイズに対して計算負荷が高すぎます (処理に 10 日ほどかかります!)。ただし、私の質問の理解を助けるために、そのコードは次のとおりです。

library(SDMTools)
c.in <- asc2dataframe("reference.asc"); names(c.in) <- c("X","Y","Z")
f.in <- asc2dataframe("destination.asc"); names(f.in) <- c("X","Y","Z")

x=c.in$X
y=c.in$Y
c=c.in$Z
f=f.in$Z
dist=vector(length=length(c))
threshold <- 0.01

id <- 1:length(c)
for (i in length(id)) {
  # First, find all rows within the threshold
  t <- id[abs(f-c[i])<threshold]
  # Second, find the distance to the closest row
  dist[i] <- round(sqrt(min((x[t]-x[i])^2+(y[t]-y[i])^2)))
}

library(raster)
dist.rast <- rasterFromXYZ(x,y,dist)
4

1 に答える 1

1

しきい値を超える値を NA に設定し、パッケージ内のdistance()関数と一緒に関数を使用して、「カラスが飛ぶように」最短距離を計算できます。次に、ラスター解像度を組み込んだ小さなピタゴラス計算の後、各セルの正確な位置 (距離と方向) を指定する 2 つのラスター レイヤーまたはマトリックスを作成します。簡単にするために、事前にラスターから空間投影を削除して、距離と方向の計算の楕円体コンポーネントを削除することをお勧めします。後で簡単に追加できます。これらすべてが遅すぎる場合は、IDL または MATLAB で試すかコーディングすることをお勧めします。MKL 最適化に同梱されている RRO を使用すると、行列演算のパフォーマンスが向上するはずです。direction()rastersparseMatrix()

ところで、あなたは優れた研究を行っています :) Andreas によろしくお伝えください。

于 2016-01-19T20:59:34.457 に答える