Створення випадкової, але правдоподібної цифрової моделі висоти? [зачинено]


32

Чи існує спосіб, програмно чи іншим способом створити DEM, який подаватиметься в ArcGIS Desktop для подальшого просторового аналізу?

Можливо, це потрібно розбити на більш дрібні кроки:

  1. Створити сітку
  2. Заповніть сітку значеннями, де: 0 > value < maxElevation
  3. Суміжні клітини: (x1-x2) < maxSlope

4
Сайт @Igor вказує вам на необхідність уточнити це питання. Він зосереджується на "синтетичних місцевостях", мабуть, щоб створити фони для ігор тощо. Більшість із цих методів, як видається, не зосереджені на відтворенні реальних DEM: "реалістично" є в очах глядача, а не будь-якого наукового змісту. У вашому запитанні "подальший просторовий аналіз" передбачає, що вам потрібні ваші синтетичні DEM для відтворення певних характеристик деякого класу фактичних DEM. Якщо це так, то які саме функції вам потрібно зробити?
whuber

Перше посилання від @Aragon розірвано, але воно повинно вказувати на це . Не вистачає кредитів, щоб прокоментувати його відповідь.
Матьє

Також погляньте на це .
Родріго

Відповіді:



16

Ви можете використовувати фрактали для цього: Штучні DEM, створені за допомогою фракталів.

Верхній ряд генерували з фрактальним розміром d = 2.0005 (зліва: карта висоти, праворуч: карта аспектів), нижній рядок із фрактальним розміром d = 2,90 (зліва: карта висоти, праворуч: карта аспектів). Я використав r.surf.fractal GRASS GIS. Потім просто експортуйте штучну DEM за допомогою r.out.gdal (або GUI) в GeoTIFF.


Це виглядає насправді цікаво - ви могли б додати деякі специфіки використання вами r.surf.fractal?
Сімбамангу

Ви можете знайти команду, використану для наведених вище зображень тут: grass.osgeo.org/grass70/manuals/r.surf.fractal.html#example
markusN

8

Ви також можете розглянути можливість створення сценарію, який займає випадкову частину наявної реальної DEM.


Плюс, знадобиться якась заповнення в кінці, щоб нівелювати ці мозаїчні краї випадкових частин ..
найкраще


5

Ось R-рішення з використанням ядра Гаусса для додання автокореляції до випадкового растру. Хоча, я мушу сказати, що функція GRASS r.surf.fractal, запропонована @markusN, здається найкращим підходом.

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")

4

Ви можете спробувати використати шум Перліна для створення якоїсь випадкової фрактальної місцевості. Ця відповідь на Stackoverflow пояснює те, як можна почати роботу в Python. Хитрість полягає в тому, щоб збільшити масштаб на дуже маленькій ділянці галасливої ​​сітки, щоб не надто нерегулярно виглядати.


3

libnoise дає вам те, що ви хочете. Ймовірно, вам доведеться певною мірою налаштувати його. Перевірте приклад "складної планетарної поверхні".

libnoise - це портативна бібліотека C ++, яка використовується для генерування когерентного шуму, типу плавно мінливого шуму. libnoise може генерувати шум Перліна, багатофункціональний шум, що пролягає, та інші типи когерентного шуму.

Когерентний шум часто використовується графічними програмістами для створення природних виглядів текстур, планетарного рельєфу та інших речей. Гірська сцена, показана вище, була виведена в Terragen з файлом місцевості, згенерованим libnoise. Ви також можете переглянути деякі інші приклади того, що може зробити лібноаз.

У лібноазі генератори когерентного шуму інкапсульовані у класи, що називаються модулями шуму. Існує багато різних типів шумових модулів. Деякі шумові модулі можуть комбінувати або змінювати виходи інших шумових модулів різними способами; Ви можете приєднати ці модулі разом для створення дуже складного когерентного шуму.


3

Цей код можна використовувати для створення DEM "нахилу пагорба" приблизно з будь-якої кількості рядків і стовпців:

# 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)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.