¿Generando un modelo de elevación digital aleatorio pero creíble? [cerrado]


32

¿Hay alguna forma de generar un DEM, programáticamente o de otro modo, que se incorpore a ArcGIS Desktop para un análisis espacial adicional?

Quizás esto deba dividirse en pasos incrementales más pequeños:

  1. Generar una cuadrícula
  2. Rellene la cuadrícula con valores donde: 0 > value < maxElevation
  3. Células vecinas: (x1-x2) < maxSlope

44
El sitio @Igor señala que sugiere la necesidad de aclarar esta pregunta. Se centra en "terrenos sintéticos", aparentemente para crear fondos para juegos y similares. La mayoría de esas técnicas no parecen centrarse en recrear DEM reales : "realista" está en el ojo del espectador en lugar de tener ningún contenido científico. En su pregunta, "análisis espacial adicional" sugiere que necesita sus DEM sintéticos para reproducir ciertas características de alguna clase de DEM reales. Si es así, ¿qué características necesita capturar?
whuber

El primer enlace de @Aragon está roto, pero debería apuntar a esto . No hay suficientes créditos para comentar su respuesta.
Matthieu

También eche un vistazo a esto .
Rodrigo

Respuestas:



16

Puede utilizar fractales para esto: DEM artificiales creados con fractales.

La fila superior se generó con la dimensión fractal d = 2.0005 (izquierda: mapa de elevación, derecha: mapa de aspecto), la fila inferior con dimensión fractal d = 2.90 (izquierda: mapa de elevación, derecha: mapa de aspecto). Solía r.surf.fractal de GRASS GIS. Luego, simplemente exporte el DEM artificial con r.out.gdal (o la GUI) a GeoTIFF.


Esto parece realmente interesante, ¿podría agregar algunos detalles de cómo lo usa r.surf.fractal?
Simbamangu

Puede encontrar el comando utilizado para las imágenes de arriba aquí: grass.osgeo.org/grass70/manuals/r.surf.fractal.html#example
markusN

8

También podría considerar tener un script que tome parte aleatoria de un DEM real existente.


Además de que necesitaría algún tipo de filltering al final de nivelate los bordes de mosaico de piezas al azar ..
najuste


5

Aquí hay una solución R que usa un kernel gaussiano para agregar autocorrelación a un ráster aleatorio. Aunque, tengo que decir que la función GRASS r.surf.fractal, sugerida por @markusN, parece ser el mejor enfoque.

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 te da lo que quieres. Es probable que tenga que personalizarlo hasta cierto punto. Verifique el ejemplo de 'superficie planetaria compleja'.

libnoise es una biblioteca portátil de C ++ que se usa para generar ruido coherente, un tipo de ruido que cambia suavemente. libnoise puede generar ruido de Perlin, ruido multifractal ondulado y otros tipos de ruido coherente.

Los programadores gráficos suelen utilizar el ruido coherente para generar texturas de aspecto natural, terreno planetario y otras cosas. La escena de la montaña que se muestra arriba se renderizó en Terragen con un archivo de terreno generado por libnoise. También puede ver algunos otros ejemplos de lo que puede hacer libnoise.

En libnoise, los generadores de ruido coherente se encapsulan en clases llamadas módulos de ruido. Hay muchos tipos diferentes de módulos de ruido. Algunos módulos de ruido pueden combinar o modificar las salidas de otros módulos de ruido de varias maneras; Puede unir estos módulos para generar un ruido coherente muy complejo.


3

Este código se puede usar para crear un DEM de "pendiente de la colina" de casi cualquier número de filas y columnas:

# 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)
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.