生成随机但可信的数字高程模型?[关闭]


32

是否有一种以编程方式或其他方式生成DEM的方法,该方法将输入到ArcGIS Desktop中以进行进一步的空间分析?

也许这需要分解成较小的增量步骤:

  1. 生成网格
  2. 用以下值填充网格: 0 > value < maxElevation
  3. 相邻单元格: (x1-x2) < maxSlope

4
@Igor网站指出您建议需要澄清此问题。它专注于“合成地形”,显然是为游戏等创建背景。这些技术中的大多数似乎都不专注于重新创建实际的 DEM:“现实”在旁观者眼中,而不具有任何科学内容。在您的问题中,“进一步的空间分析”建议您需要使用合成DEM来再现某些实际DEM的某些特征。如果是这样,那么您需要捕获哪些功能?
ub

@Aragon的第一个链接已损坏,但应指向this。没有足够的学分来评论他的答案。
马修(Matthieu)

也看看这个
罗德里戈

Answers:



16

您可以为此使用分形:分形创建的人工DEM

上一行的分形维数为d = 2.0005(左:高程图,右:纵横图),下一行的分形维数为d = 2.90(左:高程图,右:纵横图)。我使用了GRASS GIS的r.surf.fractal。然后只需将带有r.out.gdal(或GUI)的人工DEM导出到GeoTIFF。


这看起来真的很有趣-您能添加一些使用细节r.surf.fractal吗?
Simbamangu 2014年

您可以在此处找到用于以上图像的命令:grass.osgeo.org/grass70/manuals/r.surf.fractal.html#example
markusN 2014年

8

您也可以考虑使用一个脚本,该脚本随机包含现有真实DEM的一部分。


加上它会需要某种末filltering到nivelate随机配件那些镶嵌边..
najuste


5

这是一个使用高斯核将自相关添加到随机栅格的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")


3

libnoise给您您想要的。您可能必须在某种程度上对其进行自定义。检查“复杂的行星表面”示例。

libnoise是一个可移植的C ++库,用于生成相干噪声(一种平滑变化的噪声)。libnoise可以生成Perlin噪声,脊形多重分形噪声以及其他类型的相干噪声。

图形程序员通常使用相干噪声来生成看起来自然的纹理,行星地形和其他事物。上面显示的山景是在Terragen中使用libnoise生成的地形文件渲染的。您还可以查看libnoise可以执行的其他一些示例。

在libnoise中,相干噪声发生器封装在称为噪声模块的类中。噪声模块有很多不同的类型。某些噪声模块可以通过各种方式组合或修改其他噪声模块的输出。您可以将这些模块结合在一起以产生非常复杂的相干噪声。


3

此代码可用于创建几乎任意数量的行和列的“山坡” 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)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.