Générer un modèle numérique d'élévation aléatoire mais crédible? [fermé]


32

Existe-t-il un moyen de générer un DEM, par programme ou autrement, qui alimentera ArcGIS Desktop pour une analyse spatiale plus poussée?

Cela doit peut-être être décomposé en étapes plus petites:

  1. Générer une grille
  2. Remplir la grille avec des valeurs où: 0 > value < maxElevation
  3. Cellules voisines: (x1-x2) < maxSlope

4
Le site @Igor vous indique qu'il est nécessaire de clarifier cette question. Il se concentre sur les "terrains synthétiques", apparemment pour créer des arrière-plans de jeux et autres. La plupart de ces techniques ne semblent pas viser à recréer des MNE réels : le mot "réaliste" est dans l'oeil du spectateur plutôt que de posséder un contenu scientifique. Dans votre question, "analyse spatiale approfondie" suggère que vous ayez besoin de vos MNA synthétiques pour reproduire certaines caractéristiques de certaines classes de MNE réels. Si tel est le cas, quelles fonctionnalités devez-vous capturer?
whuber

Le premier lien de @Aragon est cassé, mais il devrait pointer sur ceci . Pas assez de crédits pour commenter sa réponse.
Matthieu

Regardez aussi ça .
Rodrigo

Réponses:



16

Vous pouvez utiliser Fractales pour cela: MAN artificiels créés avec des fractales.

La ligne supérieure a été générée avec la dimension fractale d = 2.0005 (à gauche: carte d'élévation, à droite: carte d'aspect), la ligne inférieure avec une dimension fractale d = 2,90 (à gauche: carte d'élévation, à droite: carte d'aspect). J'ai utilisé r.surf.fractal de GRASS GIS. Ensuite, exportez simplement le DEM artificiel avec r.out.gdal (ou l'interface graphique) vers GeoTIFF.


Cela semble vraiment intéressant - pourriez-vous ajouter quelques détails sur la façon dont vous utilisez r.surf.fractal?
Simbamangu

Vous pouvez trouver la commande utilisée pour les images ci-dessus ici: grass.osgeo.org/grass70/manuals/r.surf.fractal.html#example
markusN

8

Vous pouvez également envisager de créer un script prenant au hasard une partie d’un DEM réel existant.


De plus, il faudrait un peu de remplissage à la fin pour niveler les bords de mosaïque de parties aléatoires ..
najuste


5

Voici une solution R utilisant un noyau gaussien pour ajouter une autocorrélation à un raster aléatoire. Bien que, je dois dire que la fonction GRASS r.surf.fractal, suggérée par @markusN, semble être la meilleure approche.

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 vous donne ce que vous voulez. Vous devrez probablement le personnaliser dans une certaine mesure. Vérifiez l'exemple de «surface planétaire complexe».

libnoise est une bibliothèque C ++ portable utilisée pour générer du bruit cohérent, un type de bruit à évolution constante. libnoise peut générer du bruit Perlin, du bruit multifractal strié et d'autres types de bruit cohérent.

Les programmeurs graphiques utilisent souvent le bruit cohérent pour générer des textures d'apparence naturelle, un terrain planétaire, etc. La scène montagnarde montrée ci-dessus a été rendue à Terragen avec un fichier de terrain généré par libnoise. Vous pouvez aussi voir d'autres exemples de ce que libnoise peut faire.

En libnoise, les générateurs de bruit cohérent sont encapsulés dans des classes appelées modules de bruit. Il existe de nombreux types de modules de bruit. Certains modules de bruit peuvent combiner ou modifier les sorties d’autres modules de bruit de différentes manières; vous pouvez joindre ces modules pour générer un bruit cohérent très complexe.


3

Ce code peut être utilisé pour créer un DEM "pente de colline" comprenant à peu près n'importe quel nombre de lignes et de colonnes:

# 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)
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.