是否有一种以编程方式或其他方式生成DEM的方法,该方法将输入到ArcGIS Desktop中以进行进一步的空间分析?
也许这需要分解成较小的增量步骤:
- 生成网格
- 用以下值填充网格:
0 > value < maxElevation
- 相邻单元格:
(x1-x2) < maxSlope
是否有一种以编程方式或其他方式生成DEM的方法,该方法将输入到ArcGIS Desktop中以进行进一步的空间分析?
也许这需要分解成较小的增量步骤:
0 > value < maxElevation
(x1-x2) < maxSlope
Answers:
请尝试或阅读此页面以获取一些有用的信息。第二个链接为您展示了随机数字Elevatin模型的方法。
您可以为此使用分形:。
上一行的分形维数为d = 2.0005(左:高程图,右:纵横图),下一行的分形维数为d = 2.90(左:高程图,右:纵横图)。我使用了GRASS GIS的r.surf.fractal。然后只需将带有r.out.gdal(或GUI)的人工DEM导出到GeoTIFF。
r.surf.fractal
吗?
这是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)