プログラムやその他の方法でDEMを生成して、さらに空間分析するためにArcGIS Desktopにフィードする方法はありますか?
おそらく、これは小さな増分ステップに分割する必要があります。
- グリッドを生成する
- グリッドに値を入力します:
0 > value < maxElevation
- 隣接セル:
(x1-x2) < maxSlope
プログラムやその他の方法でDEMを生成して、さらに空間分析するためにArcGIS Desktopにフィードする方法はありますか?
おそらく、これは小さな増分ステップに分割する必要があります。
0 > value < maxElevation
(x1-x2) < maxSlope
回答:
いくつかの良い情報については、このページを試すか読んでください。2番目のリンクは、ランダムなデジタルエレベータモデルの方法を示しています。
これにはフラクタルを使用できます。
上段はフラクタル次元d = 2.0005(左:標高マップ、右:アスペクトマップ)で生成され、下段はフラクタル次元d = 2.90(左:標高マップ、右:アスペクトマップ)で生成されました。GRASS GISのr.surf.fractalを使用しました。次に、r.out.gdal(またはGUI)を使用してGeoTIFFに人工DEMをエクスポートするだけです。
r.surf.fractal
か?
また、既存の実際のDEMのランダムな部分を取るスクリプトを用意することも検討できます。
:ここではvterrain.org上の地形生成アルゴリズムやソフトウェアに多大なリソースだhttp://vterrain.org/Elevation/Artificial/は、
ガウスカーネルを使用してランダムラスタに自己相関を追加するRソリューションを次に示します。しかし、@ markusNによって提案されたGRASS r.surf.fractal関数が最良のアプローチのように思えます。
require(raster)
# Create 100x100 random raster with a Z range of 500-1500
r <- raster(ncols=100, nrows=100, xmn=0)
r[] <- runif(ncell(r), min=500, max=1500)
# Gaussian Kernel Function
GaussianKernel <- function(sigma=s, n=d) {
m <- matrix(nc=n, nr=n)
col <- rep(1:n, n)
row <- rep(1:n, each=n)
x <- col - ceiling(n/2)
y <- row - ceiling(n/2)
m[cbind(row, col)] <- 1/(2*pi*sigma^2) * exp(-(x^2+y^2)/(2*sigma^2))
m / sum(m)
}
# Create autocorrelated raster using 9x9 Gaussian Kernel with a sigma of 1
r.sim <- focal(r, w=GaussianKernel(sigma=1, n=9))
# Plot results
par(mfcol=c(1,2))
plot(r, main="Random Raster")
plot(r.sim, main="Autocorrelated Random Raster sigma=1, n=9")
Perlinノイズを使用して、ランダムなフラクタル地形を作成してみてください。Stackoverflowに関するこの回答は、Pythonで始める方法を説明しています。トリックは、ノイズの多いグリッドの非常に小さな領域にズームインして、見た目が不規則にならないようにすることです。
libnoiseはあなたが欲しいものを提供します。おそらくある程度カスタマイズする必要があります。「複雑な惑星表面」の例を確認してください。
libnoiseは、スムーズに変化するノイズの一種であるコヒーレントノイズを生成するために使用されるポータブルC ++ライブラリです。libnoiseは、Perlinノイズ、リッジ付きマルチフラクタルノイズ、およびその他のタイプのコヒーレントノイズを生成できます。
コヒーレントノイズは、多くの場合、グラフィックプログラマーが自然なテクスチャ、惑星の地形などを生成するために使用します。上記の山のシーンは、Terragenでlibnoiseによって生成された地形ファイルでレンダリングされました。libnoiseでできることの他の例を表示することもできます。
libnoiseでは、コヒーレントノイズジェネレーターは、ノイズモジュールと呼ばれるクラスにカプセル化されます。ノイズモジュールにはさまざまな種類があります。一部のノイズモジュールは、他のノイズモジュールの出力をさまざまな方法で結合または変更できます。これらのモジュールを結合して、非常に複雑なコヒーレントノイズを生成できます。
このコードを使用して、ほぼ任意の数の行と列の「ヒルスロープ」DEMを作成できます。
# Building a fake hillslope
# hisllop is 5 rows by 6 columns
x <- seq(-15, 15, by=0.01)
z <- 1/(1+1.5^-x)
plot(z)
z <- 150 - (1-z)*5
plot(z)
# Doing it by hand - DELETE if needed - JUST HERE AS AN EXAMPLE!!!
elev <- c(mean(z[0:500]), mean(z[501:1000]), mean(z[1001:1500]), mean(z[1501:2000]), mean(z[2001:2500]),mean(z[2501:3000]))
plot(elev, type="l")
# doing it by loop
bins <- 6 # could also be considered the length or the hillslope - AKa the number of columns
elev1 <- numeric(bins)
for(i in 0:(bins-1))
{
begin <- floor( (0 + (length(z)/bins)*i) )
print(begin)
end <- floor( ( (length(z)/bins) * (i+1) ) )
print(end)
print(mean(z[begin:end]))
elev1[i+1] <- mean(z[begin:end])
}
plot(elev1, type="l")
# Making the hillslope wide - AKA creating identical rows
width <- 5
# creating empty matric
hillslope <- matrix(0, nrow=bins, ncol=width)
#overwriting the matrix with the elevation column
system.time(
{
for(i in 1:width)
hillslope[,i] <- elev1;
hillslope <- as.data.frame(hillslope)
}
)
# applying random error grid
error <- rnorm((width*bins), mean = 0, sd = 0.25)
error.matrix <- as.matrix(error, nrow=bins )
random.hillslope <- as.matrix(hillslope + error.matrix)
image(random.hillslope)