Menghasilkan model elevasi digital acak tetapi dapat dipercaya? [Tutup]

32

Apakah ada cara untuk menghasilkan DEM, secara terprogram atau tidak, yang akan dimasukkan ke dalam ArcGIS Desktop untuk analisis spasial lebih lanjut?

Mungkin ini perlu dipecah menjadi langkah-langkah inkremental yang lebih kecil:

  1. Buat kisi-kisi
  2. Isi kisi dengan nilai di mana: 0 > value < maxElevation
  3. Sel tetangga: (x1-x2) < maxSlope
Michael Markieta
sumber
4
Situs @Igor menunjukkan Anda menyarankan perlunya mengklarifikasi pertanyaan ini. Ini berfokus pada "medan sintetis," tampaknya menciptakan latar belakang untuk game dan sejenisnya. Sebagian besar teknik tersebut tampaknya tidak fokus pada pembuatan ulang DEM yang sebenarnya : "realistis" ada di mata yang melihatnya daripada memiliki konten ilmiah. Dalam pertanyaan Anda, "analisis spasial lebih lanjut" menyarankan Anda membutuhkan DEM sintetis untuk mereproduksi karakteristik tertentu dari beberapa kelas DEM aktual. Jika demikian, hanya fitur apa yang perlu Anda ambil?
whuber
Tautan pertama dari @Aragon rusak, tetapi harus mengarah ke ini . Tidak cukup kredit untuk mengomentari jawabannya.
Matthieu
Lihat juga ini .
Rodrigo

Jawaban:

16

Anda dapat menggunakan fraktal untuk ini: DEM buatan dibuat dengan fraktal.

Baris atas dihasilkan dengan dimensi fraktal d = 2.0005 (kiri: peta ketinggian, kanan: peta aspek), baris bawah dengan dimensi fraktal d = 2.90 (kiri: peta elevasi, kanan: peta aspek). Saya menggunakan r.surf.fractal dari GRASS GIS. Kemudian cukup ekspor DEM buatan dengan r.out.gdal (atau GUI) ke GeoTIFF.

markN
sumber
Ini terlihat sangat menarik - dapatkah Anda menambahkan beberapa spesifik tentang bagaimana Anda menggunakan r.surf.fractal?
Simbamangu
Anda dapat menemukan perintah yang digunakan untuk gambar di atas di sini: grass.osgeo.org/grass70/manuals/r.surf.fractal.html#example
markusN
8

Anda juga dapat mempertimbangkan memiliki skrip yang mengambil bagian acak dari DEM nyata yang ada.

johanvdw
sumber
Plus itu akan membutuhkan semacam pengisi pada akhirnya untuk mencitrakan bagian-bagian mosaik dari bagian-bagian acak ..
najuste
5

Berikut ini adalah solusi R menggunakan Gaussian Kernel untuk menambahkan autokorelasi ke raster acak. Meskipun, saya harus mengatakan bahwa fungsi GRASS r.surf.fractal, disarankan oleh @markusN, sepertinya pendekatan terbaik.

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
sumber
4

Anda bisa mencoba menggunakan Perlin noise untuk membuat beberapa medan fraktal acak. Jawaban di Stackoverflow ini menjelaskan cara Anda bisa memulai dengan Python. Caranya adalah dengan memperbesar area yang sangat kecil dari grid yang bising sehingga tidak terlihat terlalu tidak teratur.

Jason Scheirer
sumber
3

Libnoise memberi Anda apa yang Anda inginkan. Anda mungkin harus menyesuaikannya sampai batas tertentu. Lihat contoh 'permukaan planet yang kompleks'.

libnoise adalah pustaka C ++ portabel yang digunakan untuk menghasilkan suara yang koheren, sejenis suara yang berubah dengan lancar. Libnoise dapat menghasilkan kebisingan Perlin, kebisingan multifraktal yang bergerigi, dan jenis kebisingan koheren lainnya.

Noise koheren sering digunakan oleh programmer grafis untuk menghasilkan tekstur yang tampak alami, medan planet, dan hal-hal lainnya. Adegan gunung yang ditunjukkan di atas ditampilkan di Terragen dengan file medan yang dihasilkan oleh libnoise. Anda juga dapat melihat beberapa contoh lain tentang apa yang dapat dilakukan libnoise.

Dalam libnoise, generator derau koheren diringkas dalam kelas yang disebut modul derau. Ada banyak jenis modul kebisingan. Beberapa modul noise dapat menggabungkan atau memodifikasi output dari modul noise lainnya dengan berbagai cara; Anda dapat bergabung dengan modul-modul ini bersama-sama untuk menghasilkan suara koheren yang sangat kompleks.

KarlM
sumber
3

Kode ini dapat digunakan untuk membuat DEM "Kemiringan bukit" dengan hampir semua jumlah baris dan kolom:

# 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
sumber