กำลังสร้างแบบจำลองระดับความสูงแบบดิจิทัลที่สุ่ม แต่เชื่อหรือไม่ [ปิด]


32

มีวิธีสร้าง DEM แบบเป็นโปรแกรมหรืออื่น ๆ ที่จะป้อนเข้าสู่ ArcGIS Desktop เพื่อการวิเคราะห์เชิงพื้นที่เพิ่มเติมหรือไม่

บางทีนี่อาจจำเป็นต้องแบ่งออกเป็นขั้นตอนที่เพิ่มขึ้นเล็กน้อย:

  1. สร้างกริด
  2. เติมกริดด้วยค่าที่: 0 > value < maxElevation
  3. เซลล์ใกล้เคียง: (x1-x2) < maxSlope

4
เว็บไซต์ @Igor ชี้ให้คุณเห็นถึงความจำเป็นในการชี้แจงคำถามนี้ มันมุ่งเน้นไปที่ "ภูมิประเทศสังเคราะห์" เพื่อสร้างพื้นหลังสำหรับเกมและสิ่งที่คล้ายคลึง เทคนิคเหล่านั้นส่วนใหญ่ไม่ได้ให้ความสำคัญกับการสร้างDEM จริง : "สมจริง" อยู่ในสายตาของคนดูแทนที่จะมีเนื้อหาทางวิทยาศาสตร์ใด ๆ ในคำถามของคุณ "การวิเคราะห์เชิงพื้นที่เพิ่มเติม" แนะนำให้คุณต้องการ DEM สังเคราะห์ของคุณเพื่อสร้างลักษณะบางอย่างของ DEM จริงบางคลาส หากเป็นเช่นนั้นคุณต้องใช้ฟีเจอร์อะไรในการถ่ายภาพ
whuber

การเชื่อมโยงแรกจาก @Aragon เสีย แต่มันควรจะชี้ไปนี้ เครดิตไม่เพียงพอที่จะแสดงความคิดเห็นกับคำตอบของเขา
Matthieu

นอกจากนี้ยังจะดูที่นี้
Rodrigo

คำตอบ:


6

ลองหรืออ่านหน้านี้เพื่อดูข้อมูลที่ดี และลิงก์ที่สองแสดงให้คุณเห็นถึงรูปแบบการสุ่มของแบบจำลองระดับความสูงแบบดิจิทัล

  1. Python เชิงตัวเลขและวิทยาศาสตร์และการแสดงข้อมูล
  2. สร้างเขตข้อมูลระดับความสูง / ความสูง gdal numpy python

16

คุณสามารถใช้สำหรับ fractals DEM ประดิษฐ์ที่สร้างขึ้นด้วย fractalsนี้:

แถวบนถูกสร้างขึ้นด้วยมิติเศษส่วน d = 2.0005 (ซ้าย: แผนที่ระดับความสูง, ขวา: แผนที่ด้านข้าง), แถวล่างที่มีมิติเศษส่วน d = 2.90 (ซ้าย: แผนที่ระดับความสูง, ด้านขวา: แผนที่มุมมอง) ฉันใช้r.surf.fractalของ GRASS GIS จากนั้นเพียงส่งออก DEM ปลอมด้วย r.out.gdal (หรือ GUI) ไปยัง GeoTIFF


สิ่งนี้ดูน่าสนใจจริงๆ - คุณช่วยเพิ่มรายละเอียดเกี่ยวกับวิธีการใช้งานของคุณได้r.surf.fractalไหม?
Simbamangu

คุณสามารถค้นหาคำสั่งที่ใช้สำหรับรูปภาพด้านบนได้ที่นี่: grass.osgeo.org/grass70/manuals/r.surf.fractal.html#example
markusN

8

คุณสามารถลองใช้สคริปต์ที่มีส่วนร่วมแบบสุ่มของ DEM จริงที่มีอยู่


นอกจากนี้ยังจะต้องมีการกรอกข้อมูลบางอย่างในตอนท้ายเพื่อหมุนขอบโมเสกเหล่านั้นของชิ้นส่วนแบบสุ่ม ..
najuste


5

นี่คือโซลูชัน R ที่ใช้เคอร์เนล Gaussian เพื่อเพิ่มความสัมพันธ์อัตโนมัติลงในแรสเตอร์แบบสุ่ม แม้ว่าฉันจะต้องบอกว่าฟังก์ชั่น 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

คุณสามารถลองใช้เสียง Perlinเพื่อสร้างภูมิประเทศเศษส่วนแบบสุ่ม คำตอบของ Stackoverflow นี้อธิบายวิธีที่คุณสามารถเริ่มต้นใช้งาน Python ได้ เคล็ดลับคือการซูมเข้าไปในพื้นที่ที่เล็กมากของกริดที่มีเสียงรบกวนดังนั้นมันจึงไม่ได้ดูผิดปกติเกินไป


3

libnoiseให้สิ่งที่คุณต้องการ คุณอาจจะต้องปรับแต่งมันบ้าง ตรวจสอบตัวอย่าง 'พื้นผิวดาวเคราะห์ที่ซับซ้อน'

libnoise เป็นไลบรารี C ++ แบบพกพาที่ใช้ในการสร้างเสียงที่สอดคล้องกันซึ่งเป็นเสียงที่เปลี่ยนแปลงได้อย่างราบรื่น libnoise สามารถสร้างเสียงเพอร์ลิน, เสียงรบกวนหลายรอบและเสียงรบกวนอื่น ๆ

สัญญาณรบกวนที่ต่อเนื่องกันมักใช้โดยโปรแกรมเมอร์กราฟิกเพื่อสร้างพื้นผิวที่ดูเป็นธรรมชาติภูมิประเทศของดาวเคราะห์และสิ่งอื่น ๆ ฉากบนภูเขาที่แสดงด้านบนถูกแสดงผลใน Terragen พร้อมไฟล์ภูมิประเทศที่สร้างโดย libnoise คุณยังสามารถดูตัวอย่างอื่น ๆ ของสิ่งที่ libnoise สามารถทำได้

ใน 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)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.