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
Michael Markieta
la source
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.

markusN
la source
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.

johanvdw
la source
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")
Jeffrey Evans
la source
4

Vous pouvez essayer d’utiliser le bruit Perlin pour créer un terrain fractal aléatoire. Cette réponse sur Stackoverflow explique une manière de commencer à utiliser Python. L'astuce serait de zoomer sur une très petite zone de la grille bruyante pour qu'elle ne soit pas trop irrégulière.

Jason Scheirer
la source
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.

KarlM
la source
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)
traggatmot
la source