무작위이지만 믿을만한 디지털 고도 모델을 생성하십니까? [닫은]


32

추가 공간 분석을 위해 ArcGIS Desktop에 공급 될 프로그래밍 방식 또는 기타 방식으로 DEM을 생성하는 방법이 있습니까?

아마도 이것은 더 작은 증분 단계로 나눌 필요가 있습니다.

  1. 그리드 생성
  2. 다음과 같은 값으로 그리드를 채우십시오. 0 > value < maxElevation
  3. 인접 셀 : (x1-x2) < maxSlope

4
@Igor 사이트는이 질문을 명확히 할 필요성을 제시합니다. "합성 지형"에 중점을두고 게임 등을위한 배경을 만드는 것 같습니다. 이러한 기술의 대부분은 실제 DEM 을 재생성하는 데 초점을 맞추지 않는 것 같습니다. 귀하의 질문에 따르면, "추가 공간 분석"은 실제 DEM 클래스의 특정 특성을 재현하기 위해 합성 DEM이 필요하다는 것을 나타냅니다. 그렇다면 그렇다면 어떤 기능을 캡처해야합니까?
whuber

@Aragon의 첫 번째 링크가 끊어졌지만 this를 가리켜 야 합니다 . 그의 답변에 대해 언급 할만한 크레딧이 충분하지 않습니다.
Matthieu

이것 좀 봐 .
로드리고

답변:



16

이를 위해 프랙탈을 사용할 수 있습니다 프랙탈로 만든 인공 DEM.

상단 차원은 프랙탈 차원 d = 2.0005 (왼쪽 : 고도 맵, 오른쪽 : 종횡비 맵)로, 하단 행은 프랙탈 차원 d = 2.90 (왼쪽 : 고도 맵, 오른쪽 : 종횡비 맵)으로 생성되었습니다. GRASS GIS의 r.surf.fractal 을 사용 했습니다 . 그런 다음 r.out.gdal (또는 GUI)을 사용하여 인공 DEM을 GeoTIFF로 내 보냅니다.


이것은 정말 흥미로워 보입니다. 사용 방법에 대한 구체적인 내용을 추가 할 수 r.surf.fractal있습니까?
Simbamangu

위의 이미지에 사용 된 명령은 여기에서 찾을 수 있습니다. grass.osgeo.org/grass70/manuals/r.surf.fractal.html#example
markusN

8

기존 실제 DEM의 임의 부분을 차지하는 스크립트를 고려할 수도 있습니다.


또한 임의의 부품의 모자이크 모서리를 없애기 위해 마지막에는 일종의 필터가 필요합니다.
najuste


5

다음은 가우스 커널을 사용하여 임의 래스터에 자기 상관을 추가하는 R 솔루션입니다. @markusN이 제안한 GRASS r.surf.fractal 함수가 최선의 접근 방법 인 것 같습니다.

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 는 원하는 것을 제공합니다. 당신은 어느 정도 그것을 사용자 정의해야 할 것입니다. '복잡한 행성 표면'예를 확인하십시오.

libnoise는 휴대용 C ++ 라이브러리로, 매끄럽게 변화하는 노이즈의 한 유형 인 코 히어 런트 노이즈를 생성하는 데 사용됩니다. libnoise는 Perlin 노이즈, 리지드 다 프랙탈 노이즈 및 기타 유형의 코 히어 런트 노이즈를 생성 할 수 있습니다.

코 히어 런트 노이즈는 종종 그래픽 프로그래머가 자연스럽게 보이는 텍스처, 행성 지형 등을 생성하는 데 사용됩니다. 위에 표시된 산악 장면은 libnoise에 의해 생성 된 지형 파일과 함께 Terragen에서 렌더링되었습니다. libnoise가 수행 할 수있는 다른 예를 볼 수도 있습니다.

libnoise에서 코 히어 런트 노이즈 생성기는 노이즈 모듈이라는 클래스로 캡슐화됩니다. 다양한 유형의 노이즈 모듈이 있습니다. 일부 노이즈 모듈은 다양한 방식으로 다른 노이즈 모듈의 출력을 결합하거나 수정할 수 있습니다. 이 모듈들을 결합하여 매우 복잡한 간섭 잡음을 생성 할 수 있습니다.


3

이 코드는 행과 열의 개수에 따라 "Hill slope"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.