Generujesz przypadkowy, ale wiarygodny cyfrowy model wysokości? [Zamknięte]


32

Czy istnieje sposób na wygenerowanie DEM, programowo lub w inny sposób, który zasila ArcGIS Desktop w celu dalszej analizy przestrzennej?

Być może należy to podzielić na mniejsze etapy:

  1. Wygeneruj siatkę
  2. Wypełnij siatkę wartościami, w których: 0 > value < maxElevation
  3. Sąsiednie komórki: (x1-x2) < maxSlope

4
Witryna @Igor wskazuje na potrzebę wyjaśnienia tego pytania. Koncentruje się na „syntetycznych terenach”, najwyraźniej w celu tworzenia tła dla gier i tym podobnych. Wydaje się, że większość tych technik nie koncentruje się na odtwarzaniu rzeczywistych DEM: „realistyczny” zależy od obserwatora, a nie ma treści naukowych. W twoim pytaniu „dalsza analiza przestrzenna” sugeruje, że potrzebujesz syntetycznych DEM do odtworzenia niektórych cech niektórych klas rzeczywistych DEM. Jeśli tak, to jakie funkcje musisz uchwycić?
whuber

Pierwszy link z @Aragon jest uszkodzony, ale powinna ona wskazywać na to . Za mało kredytów, by skomentować jego odpowiedź.
Matthieu,

Spójrz także na to .
Rodrigo,

Odpowiedzi:



16

Można użyć do tego fraktale: Sztuczne DEM tworzone za pomocą fraktali.

Górny rząd został wygenerowany z wymiarem fraktalnym d = 2.0005 (lewy: mapa wysokości, prawy: mapa aspektu), dolny rząd z wymiarem fraktalnym d = 2,90 (lewy: mapa elewacji, prawy: mapa aspektu). Użyłem r.surf.fractal GRASS GIS. Następnie wystarczy wyeksportować sztuczny DEM za pomocą r.out.gdal (lub GUI) do GeoTIFF.


Wygląda to naprawdę interesująco - czy możesz dodać kilka szczegółów na temat tego, jak używasz r.surf.fractal?
Simbamangu

Polecenie zastosowane do powyższych zdjęć można znaleźć tutaj: grass.osgeo.org/grass70/manuals/r.surf.fractal.html#example
markusN

8

Możesz także rozważyć utworzenie skryptu, który losowo bierze udział w istniejącym prawdziwym DEM.


Do tego trzeba by było na końcu wypełnienia, aby niwelować te mozaikowe krawędzie przypadkowych części ..
najuste


5

Oto rozwiązanie R wykorzystujące jądro Gaussa do dodania autokorelacji do losowego rastra. Chociaż muszę powiedzieć, że funkcja GRASS r.surf.fractal, sugerowana przez @markusN, wydaje się najlepszym podejściem.

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 daje ci to, czego chcesz. Prawdopodobnie będziesz musiał go w pewnym stopniu dostosować. Sprawdź przykład „złożonej powierzchni planety”.

libnoise to przenośna biblioteka C ++, która służy do generowania spójnego szumu, rodzaju płynnie zmieniającego się szumu. libnoise może generować szum Perlina, prążkowany hałas multifraktalny i inne rodzaje hałasu spójnego.

Spójny hałas jest często wykorzystywany przez programistów graficznych do generowania naturalnie wyglądających tekstur, terenu planetarnego i innych rzeczy. Scena górska pokazana powyżej została zrenderowana w Terragen z plikiem terenu wygenerowanym przez libnoise. Możesz także zobaczyć inne przykłady tego, co może zrobić libnoise.

W libnoise generatory szumów spójnych są zamknięte w klasach zwanych modułami szumu. Istnieje wiele różnych rodzajów modułów szumów. Niektóre moduły hałasu mogą łączyć lub modyfikować wyjścia innych modułów hałasu na różne sposoby; możesz połączyć te moduły razem, aby wygenerować bardzo złożony spójny hałas.


3

Za pomocą tego kodu można utworzyć DEM „nachylenie wzgórza” o dowolnej liczbie wierszy i kolumn:

# 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)
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.