¿Cómo generar un modelo de elevación digital aleatorio pero creíble?

31

¿Hay una manera de generar un DEM, programáticamente o de otro modo (arcpy o R?), que se incorporará a ArcGIS 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. Celdas vecinas: (x1-x2) < maxSlope

¿Extraña solicitud? ¿Alguien tiene alguna idea?

    
pregunta Michael Markieta 28.02.2012 - 06:13

8 respuestas

6

intente o lea esta página para obtener una buena información. y el segundo enlace le muestra el camino del modelo digital aleatorio de elevatin ...

  1. Python numérico y científico y visualización de datos
  2. creando un campo de elevación / altura gdal numpy python

espero que te ayude

    
respondido por el Aragon 28.02.2012 - 09:09
15

Puedes usar fractales para esto: .

Lafilasuperiorsegeneróconladimensiónfractald=2.0005(izquierda:mapadeelevación,derecha:mapadeaspecto),lafilainferiorconladimensiónfractald=2.90(izquierda:mapadeelevación,derecha:mapadeaspecto).Utilicé r.surf.fractal de GRASS GIS. Luego simplemente exporte el DEM artificial con r.out.gdal (o la GUI) a GeoTIFF.

    
respondido por el markusN 27.11.2012 - 01:39
8

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

    
respondido por el johanvdw 28.02.2012 - 09:22
7

Aquí hay un gran recurso sobre algoritmos de generación de terreno y software en vterrain.org: enlace

    
respondido por el Igor Brejc 28.02.2012 - 08:57
4

Puedes intentar usar ruido Perlin para crear un terreno fractal aleatorio. Esta respuesta en Stackoverflow explica una forma de comenzar a usar Python. El truco sería hacer zoom en un área muy pequeña de la cuadrícula ruidosa para que no sea demasiado de aspecto irregular.

    
respondido por el Jason Scheirer 28.02.2012 - 09:47
4

Aquí hay una solución R que usa un kernel gaussiano para agregar autocorrelación a un raster aleatorio. Aunque, debo 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")
    
respondido por el Jeffrey Evans 27.11.2012 - 02:46
3

libnoise le ofrece lo que desea. Es probable que tengas que personalizarlo hasta cierto punto. Verifique el ejemplo de 'superficie planetaria compleja'.

  

libnoise es una biblioteca portátil de C ++ que se utiliza para generar coherente   El ruido, un tipo de ruido que cambia suavemente. libnoise puede generar Perlin   ruido, ruido multifractal acanalado 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. los   La escena de la montaña mostrada arriba fue renderizada en Terragen con un terreno.   archivo generado por libnoise. También puedes ver algunos otros ejemplos de   lo que libnoise puede hacer.

     

En libnoise, los generadores de ruido coherente se encapsulan en clases   llamados 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 otro ruido.   módulos de varias maneras; Puedes unir estos módulos para   generar ruido coherente muy complejo.

    
respondido por el KarlM 26.11.2012 - 03:59
3

Este código se puede usar para crear un DEM de "pendiente de 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)
    
respondido por el traggatmot 08.12.2014 - 04:03

Lea otras preguntas en las etiquetas