Генерация случайной, но правдоподобной цифровой модели рельефа? [закрыто]

32

Есть ли способ сгенерировать ЦМР, программно или иным образом, который будет поступать в ArcGIS Desktop для дальнейшего пространственного анализа?

Возможно, это нужно разбить на более мелкие пошаговые шаги:

  1. Создать сетку
  2. Заполните сетку значениями где: 0 > value < maxElevation
  3. Соседние клетки: (x1-x2) < maxSlope
Майкл Маркиета
источник
4
Сайт @Igor указывает на необходимость прояснить этот вопрос. Он фокусируется на «синтетических ландшафтах», по-видимому, для создания фонов для игр и тому подобного. Большинство из этих методов не появляется , чтобы сосредоточиться на воссоздание реальных ЦМРОВ: «реалистичный» находится в глазах смотрящего , а не имея никакого научного содержание. В вашем вопросе «дальнейший пространственный анализ» предполагает, что вам нужны ваши синтетические матрицы высот, чтобы воспроизвести определенные характеристики некоторого класса реальных матриц высот. Если это так, то какие именно функции вам нужны?
whuber
Первая ссылка от @Aragon не работает, но она должна указывать на это . Недостаточно кредитов, чтобы прокомментировать его ответ.
Матье
Также взгляните на это .
Родриго

Ответы:

16

Вы можете использовать фракталы для этого: Искусственные матрицы высот, созданные с помощью фракталов.

Верхний ряд был создан с фрактальной размерностью d = 2.0005 (слева: карта высот, справа: карта аспекта), нижний ряд с фрактальной размерностью d = 2.90 (слева: карта высот, справа: карта аспекта). Я использовал r.surf.fractal из GRASS GIS. Затем просто экспортируйте искусственную матрицу высот с помощью r.out.gdal (или GUI) в GeoTIFF.

markusN
источник
Это выглядит действительно интересно - не могли бы вы добавить некоторые особенности того, как вы используете r.surf.fractal?
Симбамангу
Команду,
markusN
8

Вы также можете рассмотреть возможность использования сценария, который принимает случайную часть существующей реальной матрицы высот.

johanvdw
источник
Кроме того, в конце понадобится какое-то заполнение, чтобы оживить эти мозаичные края случайных частей ..
najuste
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 может генерировать шум Перлина, шум мультифрактального гребня и другие виды когерентного шума.

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

В libnoise генераторы когерентного шума инкапсулированы в классы, называемые шумовыми модулями. Существует много разных типов шумовых модулей. Некоторые шумовые модули могут комбинировать или модифицировать выходы других шумовых модулей различными способами; Вы можете объединить эти модули вместе для создания очень сложного когерентного шума.

KarlM
источник
3

Этот код может быть использован для создания матрицы высот «наклона холма», состоящей из практически любого числа строк и столбцов:

# 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
источник