QGIS raster arazi analizinin eğrilik filtresini anlama?


12

Birkaç QGis-1.7.4 raster filtresinin kaynak eğimini, yönünü ve eğriliğini okudum.

Filtrede, beni şaşırtan toplam eğriliği hesaplayan bir formül var.

Kaynak dosya, QGis'in geçerli sürümünde ve aşağıdaki yolla:

/ Kafes / qgstotalcurvaturefilter.cpp QGIS-1.7.4 / src / analizi

Bu filtrenin amacı, dokuz hücreli bir pencerede yüzeyin toplam eğriliğini hesaplamaktır. Fonksiyon kodu aşağıdaki gibidir:

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;
}

Ben "dxx" formülü ve dönüş ifadesi ile iyiyim. Ancak "dyy" ve "dxy" formüllerinin ters çevrildiğini düşünüyorum: bu, x ve y boyutlarıyla ilgili toplam sonucu asimetrik hale getirir.

Bir şey eksik miyim veya çift türev ifadelerini şu şekilde değiştirmeli miyim:

  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

Düşündüğüm gibi yanlışlarsa veya yanılıyorsam, bu formüller hakkındaki fikrinizi söyleyebilir misiniz? Bu son durumda, formüllerin neden x ve y ile ilgili asimetrik olması gerektiğini biliyor musunuz?


3
lütfen bu sorunları bildirin
underdark

Hum, bu linke nasıl giriş yapılır? Site elbette forum ile paylaşılan hesaplara sahip değil gibi görünüyor, ancak herhangi bir "hesap oluştur" görmüyorum ... Cevabınız için şimdiden teşekkürler.
Tapadi

1
logins osgeo sitesi kullanımları www2.osgeo.org/cgi-bin/ldap_create_user.py
Underdark

Yanıtlar:


8

Tahminleriniz doğrudur. Simetriyi kontrol etmek mükemmel bir fikirdir: (Gauss) eğriliği bir yüzeyin kendine özgü bir özelliğidir. Bu nedenle, bir ızgarayı döndürmek onu değiştirmemelidir. Bununla birlikte, rotasyonlar, 90 derecenin katları ile rotasyonlar hariç, ayrıklaştırma hatası verir. Bu nedenle, bu tür herhangi bir rotasyon, eğriliği korumalıdır.

İlk diferansiyel diferansiyel fikrinden yararlanarak neler olup bittiğini anlayabiliriz : türevler fark bölümlerinin sınırlarıdır. Gerçekten bilmemiz gereken bu.

dxxx-yönündeki ikinci kısmi türev için ayrı bir yaklaşım olduğu varsayılmaktadır. Bu özel yaklaşım (mümkün olanların çoğundan), hücre boyunca yatay bir enine boyunca yüzey örneklenerek hesaplanır. (2) yazılan satır 2 ve sütun 2'deki merkezi hücrenin yerini alan transekt, (1,2), (2,2) ve (3,2) 'deki hücrelerden geçer.

Bu transect boyunca, ilk türevler, kendi fark bölümleri ile yakınlaştırılır, (* x32- * x22) / L ve (* x22- * x12) / L, burada L, hücreler arasındaki (ortak olarak eşit) mesafedir cellSizeAvg. İkinci türevler, bunların fark bölümleri ile elde edilir.

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

L ^ 2 bölünmesine dikkat edin!

Benzer şekilde, y-yönündeki ikinci kısmi türev için ayrık bir yaklaşım dyyolduğu varsayılmaktadır . Transect dikeydir, (2,1), (2,2) ve (2,3) 'te hücrelerden geçer. Formül içindekiyle aynı görünecek, dxxancak aktarılan aboneliklerle. Bu sorudaki üçüncü formül olabilir - ancak yine de L ^ 2'ye bölmeniz gerekir.

Karışık ikinci kısmi türev, ikidxy fark alınarak tahmin edilebilir hücre birbirinden . Örneğin, hücredeki (2,3) x'e göre ilk türev (merkezi hücre değil, en üst orta hücre!), Değeri solundan, * x13, sağındaki değerden çıkararak tahmin edilebilir, * x33 ve bu hücreler arasındaki mesafeye bölünerek, 2L. (2,1) hücresindeki (alt orta hücre) x'e göre ilk türev (* x31 - * x11) / (2L) ile tahmin edilir. Bunların fark, 2L bölünmesiyle, karışık kısmi bağışları tahmin

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

"Toplam" eğriliğin ne anlama geldiğinden emin değilim, ama muhtemelen Gauss eğriliği (temel eğrilerin ürünü olan) olması amaçlanmıştır. Göre Meek & Walton 2000 , Denklem 2.4, Gauss d xy ^ 2 - eğrilik dxx * DYY bölünmesiyle elde edilir (haber eksi işareti! - bu bir olan belirleyici ) yüzeyinin eğim norm karesine. Bu nedenle, soruda belirtilen geri dönüş değeri bir eğrilik değildir, ancak Gauss eğriliği için dağınık bir kısmi ifade gibi görünür.

Öyleyse buluruz, kodda , çoğu kritik olan altı hata:

  1. dxx 1'e değil L ^ 2'ye bölünmelidir.

  2. dyy'nin 1 değil L ^ 2'ye bölünmesi gerekir.

  3. Dxy işareti yanlış. (Bunun eğrilik formülü üzerinde hiçbir etkisi yoktur.)

  4. Dyy ve dxy için formüller, not ettiğiniz gibi karıştırılır.

  5. Dönüş değerindeki bir terimde negatif işaret eksik.

  6. Aslında bir eğriliği hesaplamaz, sadece eğrilik için rasyonel ifadenin payını hesaplar.


Çok basit bir kontrol olarak, değiştirilen formülün ikinci dereceden yüzeylerdeki yatay konumlar için makul değerler döndürdüğünü doğrulayalım. Böyle bir konumu koordinat sisteminin kaynağı olacak şekilde ve yüksekliğini sıfır yükseklikte alarak, bu tür yüzeylerin hepsinin form denklemleri vardır.

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

sabit a, b ve c için. Merkezi kare koordinatlarda (0,0), sol tarafındaki koordinatlar (-L, 0) vb. Vardır. Dokuz yükseklik

*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

Bu nedenle, değiştirilmiş formülle,

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.

Eğrilik, 2a * 2c - (2b) ^ 2 = 4 (ac - b ^ 2) olarak tahmin edilir. (Meek & Walton formülündeki payda bu durumda birdir.) Bu mantıklı mı? A, b ve c gibi basit değerleri deneyin:

  • a = c = 1, b = 0. Bu dairesel bir paraboloiddir; Gauss eğriliği pozitif olmalıdır. 4 (ac-b ^ 2) değeri gerçekten pozitiftir (4'e eşit).

  • a = c = 0, b = 1. Bu, bir tabakanın hiperboloididir - bir eyer - negatif eğrilik yüzeyinin standart örneği . Tabii ki, 4 (ac-b ^ 2) = -4.

  • a = 1, b = 0, c = -1. Bu, bir tabakanın hiperboloidinin (45 derece döndürülmüş) başka bir denklemidir. Bir kez daha 4 (ac-b ^ 2) = -4.

  • a = 1, b = 0, c = 0. Bu parabolik bir şekle katlanmış düz bir yüzeydir. Şimdi, 4 (ac-b ^ 2) = 0: sıfır Gauss eğriliği bu yüzeyin düzlüğünü doğru bir şekilde algılar.

Bu örneklerdeki sorudaki kodu denerseniz, her zaman hatalı bir değer elde ettiğini görürsünüz.


Sabah açık detaylarınızı okumak her zaman ilginçtir.
Tomek

@Tomek Şimdi orada bir diplomatik (= düşünceli ve son derece belirsiz) yorumdur! :-)
whuber

1
Böyle eksiksiz bir cevap için çok teşekkür ederim! Şimdi bildirilecek bir şey olduğundan emin olduğum için formül hatalarını bildireceğim. :)
Tapadi

@whuber: Tomek'in bu forumdaki yorumlarınızı okumanın her zaman ilginç olduğunu yanıtlayabilirim ve her zaman onlardan yeni bir şeyler öğrenirim !! Değerli bilgilerinizi bizimle ücretsiz paylaştığınız için teşekkür ederiz !! Sadece bir soru daha sormamın bir sakıncası var mı: Herhangi bir CBS uygulamasında, arazinin eğim analizi (raster) yapıldığında, her zaman Gauss eğriliği olur mu? Asla Ortalama eğrilik?
marco
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.