Generazione di un modello di elevazione digitale casuale ma credibile? [chiuso]


32

Esiste un modo per generare un DEM, programmaticamente o meno, che verrà inserito in ArcGIS Desktop per ulteriori analisi spaziali?

Forse questo deve essere suddiviso in piccoli passi incrementali:

  1. Genera una griglia
  2. Riempi la griglia con valori in cui: 0 > value < maxElevation
  3. Celle vicine: (x1-x2) < maxSlope

4
Il sito @Igor indica che è necessario chiarire questa domanda. Si concentra su "terreni sintetici", apparentemente per creare sfondi per giochi e simili. La maggior parte di queste tecniche non sembrano concentrarsi sulla ricostruzione di DEM reali : "realistico" è negli occhi di chi guarda piuttosto che avere alcun contenuto scientifico. Nella tua domanda, "ulteriori analisi spaziali" suggeriscono che hai bisogno dei tuoi DEM sintetici per riprodurre alcune caratteristiche di una qualche classe di DEM effettivi. In tal caso, quali funzioni devi acquisire?
whuber

Il primo link da @Aragon è interrotto, ma dovrebbe puntare a questo . Non ci sono abbastanza crediti per commentare la sua risposta.
Matthieu,

Dai anche un'occhiata a questo .
Rodrigo,

Risposte:



16

È possibile utilizzare i frattali per questo: DEM artificiali creati con frattali.

La riga superiore è stata generata con la dimensione frattale d = 2.0005 (a sinistra: mappa altimetrica, a destra: mappa aspetto), la riga inferiore con dimensione frattale d = 2.90 (sinistra: mappa altezza, a destra: mappa aspetto). Ho usato r.surf.fractal di GRASS GIS. Quindi esporta semplicemente il DEM artificiale con r.out.gdal (o la GUI) in GeoTIFF.


Questo sembra davvero interessante - potresti aggiungere alcuni dettagli su come usi r.surf.fractal?
Simbamangu,

Puoi trovare il comando usato per le immagini sopra qui: grass.osgeo.org/grass70/manuals/r.surf.fractal.html#example
markusN

8

Potresti anche considerare di avere uno script che prende parte casuale di un vero DEM esistente.


Inoltre avrebbe bisogno di una sorta di riempimento alla fine per ravvivare quei bordi a mosaico di parti casuali ..
najuste,


5

Ecco una soluzione R che utilizza un kernel gaussiano per aggiungere autocorrelazione a un raster casuale. Tuttavia, devo dire che la funzione GRASS r.surf.fractal, suggerita da @markusN, sembra l'approccio migliore.

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 ti dà quello che vuoi. Probabilmente dovrai personalizzarlo in una certa misura. Controlla l'esempio della "superficie planetaria complessa".

libnoise è una libreria C ++ portatile che viene utilizzata per generare rumore coerente, un tipo di rumore che cambia in modo uniforme. la libnoise può generare rumore di Perlin, rumore multifrattale increspato e altri tipi di rumore coerente.

Il rumore coerente viene spesso utilizzato dai programmatori grafici per generare trame dall'aspetto naturale, terreno planetario e altre cose. La scena di montagna mostrata sopra è stata resa in Terragen con un file del terreno generato dalla libnoise. Puoi anche vedere alcuni altri esempi di cosa può fare la libnoise.

In libnoise, i generatori di rumore coerente sono incapsulati in classi chiamate moduli di rumore. Esistono molti tipi diversi di moduli di rumore. Alcuni moduli di rumore possono combinare o modificare le uscite di altri moduli di rumore in vari modi; puoi unire questi moduli per generare un rumore coerente molto complesso.


3

Questo codice può essere utilizzato per creare un DEM "Pendio in pendenza" di quasi un numero qualsiasi di righe e colonne:

# 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)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.