QGIS 래스터 지형 분석의 곡률 필터를 이해하고 있습니까?


12

경사, 종횡비 및 곡률을 계산하는 여러 QGis-1.7.4 래스터 필터의 소스 코드를 읽었습니다.

필터에는 저를 괴롭히는 전체 곡률을 계산하는 공식이 있습니다.

소스 파일은 현재 경로의 QGis에 있으며 다음 경로가 있습니다.

qgis-1.7.4 / src / 분석 / 래스터 /qgstotalcurvaturefilter.cpp

이 필터의 목적은 9 셀 윈도우에서 표면의 전체 곡률을 계산하는 것입니다. 기능 코드는 다음과 같습니다.

float QgsTotalCurvatureFilter::processNineCellWindow( 
   float* x11, float* x21, float* x31, 
   float* x12, float* x22, float* x32, 
   float* x13, float* x23, float* x33 ) {

  ... some code deleted ...

  double dxx = ( *x32 - 2 * *x22 + *x12 ) / ( 1 );
  double dyy = ( -*x11 + *x31 + *x13 - *x33 ) / ( 4 * cellSizeAvg*cellSizeAvg );
  double dxy = ( *x21 - 2 * *x22 + *x23 ) / ( 1 );

  return dxx*dxx + 2*dxy*dxy + dyy*dyy;
}

"dxx"수식과 반환 식에 문제가 없습니다. 그러나 나는 "dyy"와 "dxy"공식이 반전되었다고 생각합니다. 이것은 x와 y 차원에 대한 총 결과를 비대칭으로 만듭니다.

뭔가 빠졌거나 이중 파생 표현을 다음과 같이 바꿔야합니까?

  double dxx = ( *x32 - 2 * *x22 + *x12 ) / ( 1 ); // unchanged
  // inversion of the two following:
  double dxy = ( -*x11 + *x31 + *x13 - *x33 ) / ( 4 * cellSizeAvg*cellSizeAvg );
  double dyy = ( *x21 - 2 * *x22 + *x23 ) / ( 1 );
  return dxx*dxx + 2*dxy*dxy + dyy*dyy; // unchanged

내가 생각한대로 틀렸거나 틀렸다면이 공식들에 대한 당신의 의견을 말씀해 주시겠습니까? 이 마지막 경우에 왜 수식이 x와 y에 대해 비대칭이어야하는지 알고 있습니까?


3
가 고정 될 수 있도록이 문제를보고하십시오 hub.qgis.org/projects/quantum-gis/issues/new
언더 다크

흠,이 링크에 로그인하는 방법? 사이트가 포럼과 공유 계정을 가지고 있지 않은 것 같습니다. 그러나 "계정 만들기"가 표시되지 않습니다 ... 미리 답변 해 주셔서 감사합니다.
Tapadi

1
로그인를 OSGeo 사이트 사용 www2.osgeo.org/cgi-bin/ldap_create_user.py
언더 다크

답변:


8

당신의 추측은 맞습니다. 대칭 검사는 훌륭한 아이디어입니다. (가우스) 곡률은 표면의 고유 속성입니다. 따라서 그리드를 회전해도 변경되지 않아야합니다. 그러나 90 도의 배수로 회전을 제외한 회전은 이산화 오차를 발생시킵니다. 따라서 이러한 회전은 곡률을 유지해야합니다.

미분 미적분학의 첫 번째 아이디어를 활용하여 진행 상황을 이해할 수 있습니다 . 미분은 미분 몫의 한계입니다. 그것이 우리가 정말로 알아야 할 전부입니다.

dxxx- 방향의 2 차 도함수에 대한 이산 근사값이어야합니다. 이 특정 근사치는 (많은 것들 중에서) 셀을 통한 수평 트랜스 섹트를 따라 표면을 샘플링함으로써 계산됩니다. (2,2)로 쓰여진 행 2와 열 2에서 중앙 셀을 찾은 상태에서 트랜스 펙트는 (1,2), (2,2) 및 (3,2)의 셀을 통과합니다.

이러한 전환을 따라, 제 1 도함수는 그들의 차분 지수, (* x32- * x22) / L 및 (* x22- * x12) / L에 의해 근사된다. 여기서 L은 셀들 사이의 (공통) 거리이다 (명확하게 동일 함 cellSizeAvg). 이차 미분은 이들의 차이 지수에 의해 얻어지고,

dxx = ((*x32-*x22)/L - (*x22-*x12)/L)/L
    = (*x32 - 2 * *x22 + *x12) / L^2.

L ^ 2에 의한 구분에 주목하십시오!

마찬가지로 dyy된다 되어 Y 방향의 제 2 부분 유도체 이산 근사한다. transect는 수직이며 (2,1), (2,2) 및 (2,3)에서 셀을 통과합니다. 수식은 dxx아래 첨자가 바뀌었을 때와 동일하게 보입니다 . 그것은 문제 의 세 번째 공식 일 것입니다. 그러나 여전히 L ^ 2로 나눌 필요가 있습니다.

혼합 된 두 번째 부분 도함수는 셀의 dxy차이를 차감하여 추정 할 수 있습니다 . 예를 들어, 셀 (2,3) (중앙 셀이 아닌 맨 위 중간 셀!)에서 x에 대한 첫 번째 미분 값은 오른쪽의 값에서 왼쪽의 값 * x13을 빼서 추정 할 수 있습니다. x33, 그리고 그 세포들 사이의 거리, 2L로 나눔. 셀 (2,1) (하단 중간 셀)에서 x에 대한 1 차 도함수는 (* x31-* x11) / (2L)로 추정됩니다. 2L로 나눈 그들의 차이 는 혼합 부분을 추정하여

dxy = ((*x33 - *x13)/(2L) - (*x31 - *x11)/(2L))/(2L)
    = (*x33 - *x13 - *x31 + *x11) / (4 L^2).

"전체"곡률의 의미가 확실하지 않지만 가우시안 곡률 (주 곡률의 곱)이 될 수 있습니다. 따르면 선량 및 월튼 2,000 , 수학 식 2.4은 가우시안 DXY ^ 2 - 곡률있는 Dxx * dyy 나눔으로써 얻어진다 (통지 마이너스 기호! - 이것은 인 결정 ) 표면의 기울기의 놈의 제곱. 따라서 질문에 인용 된 반환 값은 곡률이 아니지만 가우시안 곡률에 대한 엉망 부분 표현처럼 보입니다.

그러면 코드에서 6 개의 오류가 발견 되는데 ,이 중 대부분은 매우 중요합니다.

  1. dxx는 1이 아니라 L ^ 2로 나누어야합니다.

  2. dyy는 1이 아니라 L ^ 2로 나누어야합니다.

  3. dxy의 부호가 잘못되었습니다. (그러나 이것은 곡률 공식에는 영향을 미치지 않습니다.)

  4. dyy와 dxy에 대한 공식은주의하십시오.

  5. 반환 값의 용어에 음수 부호가 없습니다.

  6. 실제로 곡률을 계산하는 것이 아니라 곡률에 대한 합리적인 표현의 분자 만 계산합니다.


매우 간단한 점검으로 수정 된 수식이 2 차 표면의 수평 위치에 대해 합리적인 값을 반환하는지 확인합니다. 이러한 위치를 좌표계의 원점으로 삼고 높이를 0으로 설정하면 모든 표면의 형태는 다음과 같습니다.

elevation = a*x^2 + 2b*x*y + c*y^2.

상수 a, b 및 c의 경우. 중앙 정사각형이 좌표 (0,0) 인 경우 왼쪽의 좌표는 (-L, 0) 등입니다. 9 개의 표고는

*x13 *x23 *x33     (a-2b+c)L^2, (c)L^2, (a+2b+c)L^2
*x12 *x22 *x32  =  (a)L^2,      0,      (a)L^2
*x11 *x21 *x31     (a+2b+c)L^2, (c)L^2, (a-2b+c)L^2

수정 된 수식에 따라

dxx = (a*L^2 - 2*0 + a*L^2) / L^2
    = 2a;

dxy = ((a+2b+c)L^2 - (a-2b+c)L^2 - (a-2b+c)L^2 + (a+2b+c)L^2)/(4L^2)
    = 2b;

dyy = ... [computed as in dxx] ... = 2c.

곡률은 2a * 2c-(2b) ^ 2 = 4 (ac-b ^ 2)로 추정됩니다. (Meek & Walton 공식의 분모는이 경우에 하나입니다.) 이것이 의미가 있습니까? 간단한 a, b 및 c 값을 사용해보십시오.

  • a = c = 1, b = 0. 이것은 원형 포물면입니다. 가우스 곡률은 양수 여야합니다. 실제로 4 (ac-b ^ 2)의 값은 양수입니다 (4와 같음).

  • a = c = 0, b = 1 이것은 음의 곡률 표면의 표준 예인 한 장의 안장-새들 입니다. 물론, 4 (ac-b ^ 2) = -4입니다.

  • a = 1, b = 0, c = -1. 이것은 한 장의 쌍곡선에 대한 또 다른 방정식입니다 (45도 회전). 다시 한번, 4 (ac-b ^ 2) = -4입니다.

  • a = 1, b = 0, c = 0. 이것은 포물선 모양으로 접힌 평평한 표면입니다. 이제 4 (ac-b ^ 2) = 0 : 제로 가우스 곡률이이 표면의 평탄도를 정확하게 감지합니다.

이 예제에서 질문의 코드를 시도하면 항상 잘못된 값을 얻습니다.


아침에 당신의 명백한 정교함을 읽는 것은 항상 흥미 롭습니다.
Tomek

@Tomek 지금 외교 (= 재치 매우 모호한) 주석입니다! :-)
whuber

1
완전한 답변을 주셔서 감사합니다! 보고 할 내용이 있는지 확인 했으므로 수식 오류를보고하겠습니다. :)
Tapadi

@ whuber : 나는이 포럼에 대한 귀하의 의견을 읽는 것이 항상 흥미 롭다는 Tomek의 답변을 확인할 수 있으며, 항상 그들로부터 새로운 것을 배웁니다! 소중한 지식을 무료로 공유해 주셔서 감사합니다 !! GIS 응용 프로그램에서 지형 (래스터)의 곡률 분석을 수행 할 때는 항상 가우스 곡률입니까? 결코 평균 곡률?
marco
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.