Tạo mô hình độ cao kỹ thuật số ngẫu nhiên nhưng đáng tin cậy? [đóng cửa]


32

Có cách nào để tạo DEM, theo chương trình hay cách khác, sẽ cung cấp cho ArcGIS Desktop để phân tích không gian hơn nữa không?

Có lẽ điều này cần được chia thành các bước gia tăng nhỏ hơn:

  1. Tạo lưới
  2. Điền vào lưới với các giá trị trong đó: 0 > value < maxElevation
  3. Các tế bào lân cận: (x1-x2) < maxSlope

4
Trang web @Igor chỉ cho bạn một gợi ý cần làm rõ câu hỏi này. Nó tập trung vào "địa hình tổng hợp", rõ ràng là để tạo nền cho các trò chơi và những thứ tương tự. Hầu hết các kỹ thuật đó dường như không tập trung vào việc tái tạo các DEM thực tế : "thực tế" nằm trong mắt của người hành xử hơn là có bất kỳ nội dung khoa học nào. Trong câu hỏi của bạn, "phân tích không gian xa hơn" cho thấy bạn cần các DEM tổng hợp của mình để tái tạo các đặc điểm nhất định của một số loại DEM thực tế. Nếu điều này là như vậy, bạn cần nắm bắt những tính năng nào?
whuber

Liên kết đầu tiên từ @Aragon bị hỏng, nhưng nó nên chỉ ra điều này . Không đủ tín dụng để bình luận về câu trả lời của mình.
Matthieu

Cũng hãy xem điều này .
Rodrigo

Câu trả lời:



16

Bạn có thể sử dụng fractals cho việc này : DEM nhân tạo được tạo ra với fractals.

Hàng trên được tạo với kích thước fractal d = 2.0005 (bên trái: bản đồ độ cao, bên phải: bản đồ khía cạnh), hàng dưới với kích thước fractal d = 2.90 (bên trái: bản đồ độ cao, bên phải: bản đồ khía cạnh). Tôi đã sử dụng r.surf.fractal của GRASS GIS. Sau đó, chỉ cần xuất DEM nhân tạo với r.out.gdal (hoặc GUI) sang GeoTIFF.


Điều này trông thực sự thú vị - bạn có thể thêm một số chi tiết cụ thể về cách bạn sử dụng r.surf.fractal?
Simbamangu

Bạn có thể tìm thấy lệnh sử dụng cho hình ảnh trên đây: grass.osgeo.org/grass70/manuals/r.surf.fractal.html#example
markusN

8

Bạn cũng có thể xem xét việc có một tập lệnh lấy một phần ngẫu nhiên của một DEM thực sự hiện có.


Thêm vào đó, nó sẽ cần một số loại filler ở cuối để xoay các cạnh khảm của các bộ phận ngẫu nhiên ..
najuste


5

Đây là một giải pháp R sử dụng Hạt nhân Gaussian để thêm tự động tương quan vào một raster ngẫu nhiên. Mặc dù, tôi phải nói rằng hàm GRASS r.surf.fractal, được đề xuất bởi @markusN, có vẻ như là cách tiếp cận tốt nhất.

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 cung cấp cho bạn những gì bạn muốn. Bạn có thể sẽ phải tùy chỉnh nó ở một mức độ nào đó. Kiểm tra ví dụ 'bề mặt hành tinh phức tạp'.

libnoise là một thư viện C ++ di động được sử dụng để tạo ra tiếng ồn kết hợp, một loại tiếng ồn thay đổi trơn tru. libnoise có thể tạo ra nhiễu Perlin, nhiễu đa âm và các loại nhiễu kết hợp khác.

Tiếng ồn kết hợp thường được sử dụng bởi các lập trình viên đồ họa để tạo ra kết cấu trông tự nhiên, địa hình hành tinh và những thứ khác. Khung cảnh núi được hiển thị ở trên được hiển thị ở Terragen với tệp địa hình được tạo bởi libnoise. Bạn cũng có thể xem một số ví dụ khác về những gì libnoise có thể làm.

Trong libnoise, các bộ tạo nhiễu kết hợp được gói gọn trong các lớp được gọi là các mô-đun nhiễu. Có nhiều loại mô-đun tiếng ồn khác nhau. Một số mô-đun nhiễu có thể kết hợp hoặc sửa đổi đầu ra của các mô-đun nhiễu khác theo nhiều cách khác nhau; bạn có thể nối các mô-đun này lại với nhau để tạo ra nhiễu kết hợp rất phức tạp.


3

Mã này có thể được sử dụng để tạo DEM "Độ dốc đồi" với khoảng bất kỳ số lượng hàng và cột nào:

# 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)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.