ทำความเข้าใจกับตัวกรองความโค้งของการวิเคราะห์ภูมิประเทศแบบแรสเตอร์ QGIS หรือไม่?


12

ฉันได้อ่านซอร์สโค้ดของตัวกรองแรสเตอร์ QGis-1.7.4 หลายตัวซึ่งคำนวณความชันด้านและความโค้ง

มีสูตรในตัวกรองการคำนวณความโค้งทั้งหมดที่ทำให้ฉันเป็น

ไฟล์ต้นฉบับอยู่ใน QGis เวอร์ชันปัจจุบันโดยมีพา ธ ต่อไปนี้:

QGIS-1.7.4 / src / วิเคราะห์ / แรสเตอร์ / qgstotalcurvaturefilter.cpp

จุดประสงค์ของตัวกรองนี้คือการคำนวณความโค้งทั้งหมดของพื้นผิวในหน้าต่างเก้าเซลล์ รหัสฟังก์ชั่นมีดังนี้:

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
Underdark

ฮัม, วิธีการเข้าสู่ลิงค์นี้? เว็บไซต์ดูเหมือนจะไม่มีบัญชีที่ใช้ร่วมกันกับฟอรัม แต่ฉันไม่เห็น "สร้างบัญชี" ... ขอบคุณล่วงหน้าสำหรับคำตอบของคุณ
Tapadi

1
เว็บไซต์ใช้การเข้าสู่ระบบosgeo www2.osgeo.org/cgi-bin/ldap_create_user.py
underdark

คำตอบ:


8

การคาดเดาของคุณถูกต้อง การตรวจสอบความสมมาตรเป็นความคิดที่ดี: ความโค้ง (เกาส์เซียน) เป็นคุณสมบัติที่แท้จริงของพื้นผิว ดังนั้นการหมุนกริดไม่ควรเปลี่ยน อย่างไรก็ตามการหมุนแนะนำข้อผิดพลาด discretization - ยกเว้นการหมุนด้วยทวีคูณ 90 องศา ดังนั้นการหมุนใด ๆ ดังกล่าวควรรักษาความโค้ง

เราสามารถเข้าใจได้ว่าเกิดอะไรขึ้นโดยการใช้ประโยชน์จากแนวคิดแรกของแคลคูลัสที่แตกต่างกัน: อนุพันธ์คือขีด จำกัด ของผลต่างของผลต่าง นั่นคือทั้งหมดที่เราต้องรู้

dxxควรจะเป็นการประมาณที่ไม่ต่อเนื่องสำหรับอนุพันธ์อันดับสองในทิศทาง x การประมาณแบบพิเศษนี้ (คำนวณจากจำนวนที่เป็นไปได้) คำนวณโดยการสุ่มตัวอย่างพื้นผิวตามแนวขวางตัดขวางผ่านเซลล์ ค้นหาเซลล์ส่วนกลางที่แถว 2 และคอลัมน์ 2 เขียน (2,2) การตัดผ่านผ่านเซลล์ที่ (1,2) (2,2) และ (3,2)

ตาม transect นี้อนุพันธ์อันดับแรกจะถูกประมาณด้วยผลต่างของผลคูณ (* 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เป็นที่ควรจะเป็นประมาณไม่ต่อเนื่องของอนุพันธ์บางส่วนที่สองในปีทิศทาง การตัดขวางเป็นแนวดิ่งผ่านเซลล์ที่ (2,1), (2,2) และ (2,3) สูตรจะมีลักษณะเช่นเดียวกับที่ใช้dxxกับ แต่ตัวห้อยถูกย้าย นั่นจะเป็นสูตรที่สามในคำถาม - แต่คุณยังต้องหารด้วย L ^ 2

อนุพันธ์อันดับสองบางส่วนที่ผสมกันdxyสามารถประมาณได้โดยแยกความแตกต่างของสองเซลล์ออกจากกัน เช่นอนุพันธ์อันดับแรกที่เกี่ยวกับ x ที่เซลล์ (2,3) (เซลล์กลางด้านบนไม่ใช่เซลล์กลาง!) สามารถประมาณได้โดยการลบค่าทางซ้าย * x13 จากค่าที่อยู่ทางขวา * x33 และหารด้วยระยะห่างระหว่างเซลล์เหล่านั้น 2L อนุพันธ์อันดับแรกที่เกี่ยวกับ x ที่เซลล์ (2,1) (เซลล์กลางด้านล่าง) ประมาณโดย (* x31 - * x11) / (2L) ความแตกต่างของพวกเขาหารด้วย 2Lประมาณส่วนที่ผสมกันให้

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

ฉันไม่แน่ใจจริงๆว่าความโค้ง "รวม" หมายถึงอะไร แต่อาจเป็นเพราะความโค้งแบบเกาส์เซียน (ซึ่งเป็นผลิตภัณฑ์ของความโค้งหลัก) ตามMeek & Walton 2000 , Equation 2.4, ความโค้งแบบเกาส์เซียนนั้นได้มาจากการหาร dxx * dyy - dxy ^ 2 (สังเกตเครื่องหมายลบ! - นี่คือดีเทอร์มีแนนต์ ) โดยสแควร์ของบรรทัดฐานของความชันของพื้นผิว ดังนั้นค่าส่งคืนที่ยกมาในคำถามนั้นไม่ได้เป็นความโค้ง แต่ดูเหมือนว่าการแสดงออกบางส่วนที่ยุ่งเหยิงสำหรับความโค้งแบบเกาส์เซียน

เราพบว่าหกข้อผิดพลาดในรหัสส่วนใหญ่มีความสำคัญ:

  1. dxx ต้องหารด้วย L ^ 2 ไม่ใช่ 1

  2. สีย้อมจะต้องหารด้วย L ^ 2 ไม่ใช่ 1

  3. สัญลักษณ์ของ dxy ไม่ถูกต้อง (สิ่งนี้ไม่มีผลกับสูตรความโค้ง)

  4. สูตรสำหรับ dyy และ dxy ผสมกันตามที่คุณทราบ

  5. เครื่องหมายลบหายไปจากคำหนึ่งในค่าส่งคืน

  6. มันไม่ได้คำนวณความโค้ง แต่เป็นเพียงตัวเศษของการแสดงออกเชิงเหตุผลสำหรับความโค้ง


เป็นการตรวจสอบที่ง่ายมากมาตรวจสอบว่าสูตรที่แก้ไขแล้วส่งคืนค่าที่เหมาะสมสำหรับตำแหน่งแนวนอนบนพื้นผิวกำลังสอง การใช้ตำแหน่งดังกล่าวเป็นจุดกำเนิดของระบบพิกัดและการยกระดับให้อยู่ที่ความสูงเป็นศูนย์พื้นผิวดังกล่าวทั้งหมดจะมีสมการของรูปแบบ

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

สำหรับค่าคงที่ a, b และ c ด้วยจตุรัสกลางที่พิกัด (0,0), หนึ่งทางด้านซ้ายมีพิกัด (-L, 0), ฯลฯ ระดับความสูงเก้าระดับคือ

*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.