Comprendere il filtro di curvatura dell'analisi del terreno raster QGIS?


12

Ho letto il codice sorgente di diversi filtri raster QGis-1.7.4 che calcolano pendenza, aspetto e curvatura.

C'è una formula nel filtro che calcola la curvatura totale che mi confonde.

Il file di origine è nella versione corrente di QGis, con il seguente percorso:

qgis-1.7.4 / src / analisi / raster / qgstotalcurvaturefilter.cpp

Lo scopo di questo filtro è calcolare la curvatura totale della superficie in una finestra di nove celle. Il codice funzione è il seguente:

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

Sto bene con la formula "dxx" e con l'espressione return. Ma penso che le formule "dyy" e "dxy" siano invertite: questo rende il risultato totale asimmetrico rispetto alle dimensioni xey.

Mi sto perdendo qualcosa o devo sostituire le doppie espressioni derivate con:

  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

Potresti dirmi la tua opinione su queste formule, se sono errate come pensavo o se sbaglio? In quest'ultimo caso, sai perché le formule devono essere asimmetriche rispetto a xey?


3
Si prega di segnalare questi problemi in modo che possano essere fissati hub.qgis.org/projects/quantum-gis/issues/new
Sottosuolo

Hum, come accedere a questo link? Il sito non sembra avere account condivisi con il forum, ovviamente, ma non vedo alcun "crea account" ... Grazie in anticipo per la tua risposta.
Tapadi,

1

Risposte:


8

Le tue ipotesi sono corrette. Controllare la simmetria è un'idea eccellente: la curvatura (gaussiana) è una proprietà intrinseca di una superficie. Pertanto, la rotazione di una griglia non dovrebbe modificarla. Tuttavia, le rotazioni introducono errori di discretizzazione, ad eccezione delle rotazioni per multipli di 90 gradi. Pertanto, tale rotazione dovrebbe preservare la curvatura.

Possiamo capire cosa sta succedendo capitalizzando la primissima idea del calcolo differenziale: i derivati ​​sono limiti dei quozienti di differenza. Questo è tutto ciò che dobbiamo davvero sapere.

dxxdovrebbe essere un'approssimazione discreta per la seconda derivata parziale nella direzione x. Questa particolare approssimazione (tra le tante possibili) viene calcolata campionando la superficie lungo un transetto orizzontale attraverso la cellula. Individuando la cella centrale nella riga 2 e nella colonna 2, scritta (2,2), il transetto passa attraverso le celle in (1,2), (2,2) e (3,2).

Lungo questo transetto, i primi derivati ​​sono approssimati dai loro quozienti di differenza, (* x32- * x22) / L e (* x22- * x12) / L dove L è la distanza (comune) tra le cellule (evidentemente uguale a cellSizeAvg). I secondi derivati ​​sono ottenuti dai quozienti di differenza di questi, cedendo

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

Notare la divisione per L ^ 2!

Allo stesso modo, dyysi suppone che rappresenti un'approssimazione discreta per la seconda derivata parziale nella direzione y. Il transetto è verticale, passando attraverso le celle in (2,1), (2,2) e (2,3). La formula sarà identica a quella per dxxma con gli script trasposti. Questa sarebbe la terza formula nella domanda - ma devi ancora dividere per L ^ 2.

Il secondo derivato parziale misto dxy, può essere stimato prendendo le differenze tra due celle. Ad esempio, la prima derivata rispetto a x nella cella (2,3) (la cella centrale superiore, non la cella centrale!) Può essere stimata sottraendo il valore alla sua sinistra, * x13, dal valore alla sua destra, * x33, e dividendo per la distanza tra quelle cellule, 2L. La prima derivata rispetto a x nella cella (2,1) (la cella centrale inferiore) è stimata da (* x31 - * x11) / (2L). La loro differenza, divisa per 2L, stima il parziale misto, dando

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

Non sono davvero sicuro di cosa si intenda per curvatura "totale", ma probabilmente è intesa come la curvatura gaussiana (che è il prodotto delle curvature principali). Secondo Meek & Walton 2000 , Equazione 2.4, la curvatura gaussiana si ottiene dividendo dxx * dyy - dxy ^ 2 (notare il segno meno! - questo è un fattore determinante ) per il quadrato della norma del gradiente della superficie. Pertanto, il valore di ritorno indicato nella domanda non è del tutto una curvatura, ma sembra un'espressione parziale incasinata per la curvatura gaussiana.

Troviamo, quindi, sei errori nel codice , molti dei quali critici:

  1. dxx deve essere diviso per L ^ 2, non 1.

  2. il dyy deve essere diviso per L ^ 2, non 1.

  3. Il segno di dxy non è corretto. (Questo non ha alcun effetto sulla formula di curvatura, però.)

  4. Le formule per dyy e dxy sono confuse, come si nota.

  5. Manca un segno negativo da un termine nel valore restituito.

  6. In realtà non calcola una curvatura, ma solo il numeratore di un'espressione razionale per la curvatura.


Come controllo molto semplice, verifichiamo che la formula modificata restituisca valori ragionevoli per posizioni orizzontali su superfici quadratiche. Prendendo una tale posizione per essere l'origine del sistema di coordinate e prendendo la sua elevazione per essere ad altezza zero, tutte queste superfici hanno equazioni della forma

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

per costante a, b e c. Con il quadrato centrale alle coordinate (0,0), quello alla sua sinistra ha coordinate (-L, 0), ecc. Le nove quote sono

*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

Da cui, con la formula modificata,

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.

La curvatura è stimata come 2a * 2c - (2b) ^ 2 = 4 (ac - b ^ 2). (Il denominatore nella formula Meek & Walton è uno in questo caso.) Ha senso? Prova alcuni semplici valori di a, b e c:

  • a = c = 1, b = 0. Questo è un paraboloide circolare; la sua curvatura gaussiana dovrebbe essere positiva. Il valore di 4 (ac-b ^ 2) è effettivamente positivo (uguale a 4).

  • a = c = 0, b = 1. Questo è un iperboloide di un foglio - una sella - l'esempio standard di una superficie di curvatura negativa . Abbastanza sicuro, 4 (ac-b ^ 2) = -4.

  • a = 1, b = 0, c = -1. Questa è un'altra equazione dell'iperboloide di un foglio (ruotata di 45 gradi). Ancora una volta, 4 (ac-b ^ 2) = -4.

  • a = 1, b = 0, c = 0. Questa è una superficie piana piegata in una forma parabolica. Ora, 4 (ac-b ^ 2) = 0: la curvatura gaussiana zero rileva correttamente la planarità di questa superficie.

Se provi il codice nella domanda su questi esempi, scoprirai che ottiene sempre un valore errato.


È sempre interessante leggere le tue elaborazioni esplicite al mattino.
Tomek,

@Tomek Ora c'è un commento diplomatico (= delicato e molto ambiguo)! :-)
whuber

1
Grazie mille per una risposta così completa! Riporterò gli errori di formula poiché ora sono sicuro che c'è qualcosa da segnalare. :)
Tapadi,

@whuber: posso confermare la risposta di Tomek che è sempre interessante leggere i tuoi commenti su questo forum e imparo sempre qualcosa di nuovo da loro !! Grazie per aver condiviso le tue preziose conoscenze gratuitamente con noi !! Ti dispiacerebbe se faccio un'altra domanda: in qualsiasi applicazione GIS, quando viene eseguita l'analisi della curvatura del terreno (raster), è sempre la curvatura gaussiana ? Mai la curvatura media ?
marco,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.