是否可以通过编程方式或其他方式生成DEM,并将其输入到ArcGIS Desktop中以进行进一步的空间分析?
也许需要将其分解为较小的增量步骤:
/>
生成网格
用以下值填充网格:
0 > value < maxElevation
相邻单元格:
(x1-x2) < maxSlope
#1 楼
请尝试或阅读此页面以获取一些有用的信息。第二个链接为您展示了随机数字Elevatin模型的方法。 />
#2 楼
您可以为此使用分形:。上一行生成的分形维数为d = 2.0005(左:高程图,右:纵横图),下一行的分形维数为d = 2.90 (左:高程图,右:长宽图)。我使用了GRASS GIS的r.surf.fractal。然后只需将带有r.out.gdal(或GUI)的人工DEM导出到GeoTIFF。
评论
这看起来真的很有趣-您可以添加一些有关r.surf.fractal的用法的详细信息吗?
–Simbamangu
2014年12月16日上午8:34
您可以在此处找到用于以上图像的命令:grass.osgeo.org/grass70/manuals/r.surf.fractal.html#example
– markusN
2014年12月16日16:56
#3 楼
您也可以考虑使用一个脚本,该脚本随机包含现有真实DEM的一部分。评论
另外,它还需要在末尾进行某种填充以使随机零件的那些镶嵌边缘变得生动。
– najuste
2012年11月26日在8:02
#4 楼
这是vterrain.org上有关地形生成算法和软件的大量资源:http://vterrain.org/Elevation/Artificial/#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")
#6 楼
您可以尝试使用Perlin噪声创建一些随机的分形地形。关于Stackoverflow的答案说明了您可以开始使用Python的方式。诀窍是将嘈杂的网格放大到很小的区域,这样看起来就不会太不规则。#7 楼
libnoise给您您想要的。您可能必须在某种程度上对其进行自定义。查看“复杂行星表面”示例。libnoise是一个便携式C ++库,用于生成相干噪声,该噪声是一种平滑变化的噪声。 libnoise可以生成Perlin噪声,脊形多重分形噪声以及其他类型的相干噪声。
图形程序员通常使用相干噪声来生成
自然的,行星状的纹理。地形等。上面显示的
山景是在Terragen中使用libnoise生成的terrain
文件渲染的。您还可以查看libnoise可以做什么的其他示例。
在libnoise中,相干噪声发生器封装在称为噪声模块的类中。噪声模块有很多不同的类型。
一些噪声模块可以通过各种方式组合或修改其他噪声模块的输出。您可以将这些模块结合在一起以产生非常复杂的相干噪声。
#8 楼
此代码可用于创建几乎任意数量的行和列的“山坡” 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)
评论
@Igor网站指出您建议需要澄清此问题。它专注于“合成地形”,显然是为游戏等创建背景。这些技术中的大多数似乎都不专注于重建实际的DEM:“现实”在旁观者眼中,而不具有任何科学内容。在您的问题中,“进一步的空间分析”建议您需要使用合成DEM来再现某些实际DEM的某些特征。如果是这样,那么您需要捕获哪些功能?@Aragon的第一个链接已断开,但应指向此链接。没有足够的积分来评论他的答案。
也看看这个。