Gerando modelo de elevação digital aleatório, mas crível? [fechadas]


32

Existe uma maneira de gerar um DEM, programaticamente ou não, que será alimentado no ArcGIS Desktop para análises espaciais adicionais?

Talvez isso precise ser dividido em etapas incrementais menores:

  1. Gere uma grade
  2. Preencha a grade com os valores em que: 0 > value < maxElevation
  3. Células vizinhas: (x1-x2) < maxSlope

4
O site @Igor indica que você precisa esclarecer esta questão. Ele se concentra em "terrenos sintéticos", aparentemente para criar cenários para jogos e afins. A maioria dessas técnicas não parece se concentrar em recriar DEMs reais : "realista" está nos olhos de quem vê, ao invés de ter qualquer conteúdo científico. Na sua pergunta, "análise espacial adicional" sugere que você precisa de seus DEMs sintéticos para reproduzir certas características de alguma classe de DEMs reais. Nesse caso, apenas quais recursos você precisa capturar?
whuber

O primeiro link do @Aragon está quebrado, mas deve apontar para isso . Não há créditos suficientes para comentar sua resposta.
Matthieu

Também dê uma olhada nisso .
Rodrigo

Respostas:



16

Você pode usar fractais para isso: DEMs artificiais criados com fractais.

A linha superior foi gerada com a dimensão fractal d = 2.0005 (esquerda: mapa de elevação, direita: mapa de aspectos), a linha inferior com dimensão fractal d = 2.90 (esquerda: mapa de elevação, direita: mapa de aspectos). Eu usei o r.surf.fractal do GRASS GIS. Em seguida, basta exportar o DEM artificial com r.out.gdal (ou a GUI) para o GeoTIFF.


Isso parece realmente interessante - você poderia adicionar alguns detalhes de como usar r.surf.fractal?
Simbamangu

Você pode encontrar o comando usado para imagens acima aqui: grass.osgeo.org/grass70/manuals/r.surf.fractal.html#example
markusN

8

Você também pode considerar ter um script que faça parte aleatória de um DEM real existente.


Além disso, seria necessário algum tipo de filltering no final para nivelate essas bordas mosaico de peças aleatórias ..
najuste


5

Aqui está uma solução R usando um Kernel Gaussiano para adicionar correlação automática a uma varredura aleatória. No entanto, devo dizer que a função GRASS r.surf.fractal, sugerida por @markusN, parece ser a melhor abordagem.

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 dá o que você deseja. Você provavelmente precisará personalizá-lo até certo ponto. Veja o exemplo da 'superfície planetária complexa'.

libnoise é uma biblioteca C ++ portátil usada para gerar ruído coerente, um tipo de ruído que muda suavemente. libnoise pode gerar ruído Perlin, ruído multifractal estriado e outros tipos de ruído coerente.

O ruído coerente é frequentemente usado pelos programadores gráficos para gerar texturas com aparência natural, terreno planetário e outras coisas. A cena da montanha mostrada acima foi renderizada em Terragen com um arquivo de terreno gerado por libnoise. Você também pode ver alguns outros exemplos do que o libnoise pode fazer.

Em libnoise, geradores de ruído coerente são encapsulados em classes chamadas módulos de ruído. Existem muitos tipos diferentes de módulos de ruído. Alguns módulos de ruído podem combinar ou modificar as saídas de outros módulos de ruído de várias maneiras; você pode unir esses módulos para gerar um ruído coerente muito complexo.


3

Esse código pode ser usado para criar um DEM "Hill Slope" de praticamente qualquer número de linhas e colunas:

# 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)
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.