Modo più accurato per calcolare l'area dei raster


11

Nel mio lavoro quotidiano, mi viene costantemente chiesto di calcolare aree di set di dati raster globali nella proiezione geografica con una risoluzione di 30 secondi d'arco. Questi set di dati sono normalmente il risultato di un'operazione Combina (un esempio tipico sono le classi di vegetazione combinate con il livello del paese). Per fare ciò, la nostra unità ha creato un set di dati raster con l'area di ciascun pixel in proiezione geografica a 30 secondi d'arco. Con questa griglia di area, viene eseguito uno zonalstat per sommare le aree per ogni classe. Dal momento che non sono sicuro di come sia stata creata questa griglia di area, mi sono sempre chiesto se questo approccio fosse più accurato di riproiettare il raster in una proiezione di area uguale (dai semplici test i risultati dei due metodi sono simili). Qualcuno ha vissuto una situazione simile?


@radouxju Sembra che tu stia suggerendo che il manuale Bugayevskiy & Snyder che cito non è né credibile né ufficiale. (Al contrario, entrambe le cose - soprattutto considerando che è il risultato di una collaborazione di autorità riconosciute a livello mondiale negli Stati Uniti e in Russia!) Quali sono le basi di questo scetticismo? Cosa vorresti di più? Si noti inoltre che questi calcoli sono perfettamente accurati. La precisione è limitata solo dalla precisione con cui vengono forniti i parametri ellissoidali e dalla precisione dei calcoli: non è possibile una precisione maggiore.
whuber

@whuber Non stavo suggerendo che la tua citazione non fosse credibile. Il mio commento con la generosità è stato fatto PRIMA della risposta, e quando sono arrivato sul sito l'ultima volta era troppo presto per premiare la generosità.
Radouxju,

@radouxju Grazie per la tua spiegazione! Non mi sono reso conto della generosità fino a poche ore dopo aver pubblicato la risposta.
whuber

Risposte:


14

Esiste una formula esatta relativamente semplice per l'area di qualsiasi quadrangolo sferico delimitata da paralleli (linee di latitudine) e meridiani (linee di longitudine). Può essere derivato semplicemente utilizzando le proprietà fondamentali dell'ellisse (di asse maggiore di e minore asse b ) che viene fatto ruotare attorno al suo asse minore per produrre dell'ellissoide. (La derivazione fa un buon esercizio di calcolo integrale ma credo che sarebbe di scarso interesse su questo sito.)

La formula viene semplificata suddividendo il calcolo in passaggi di base.

Innanzitutto, la distanza tra i confini est e ovest - i meridiani l0 e l1 - è una frazione di un cerchio intero pari a q = (l1 - l0) / 360 (quando i meridiani sono misurati in gradi) o 1 = ( l1 - l0) / (2 * pi) (quando i meridiani sono misurati in radianti). Trova l'area dell'intera sezione situata tra i paralleli f0 e f1 e moltiplicala per q .

In secondo luogo, utilizzeremo una formula per l'area di una porzione orizzontale dell'ellissoide delimitata dall'equatore (a f0 = 0) e un parallelo alla latitudine f (= f1). L'area della sezione tra due latitudini f0 e f1 (situata nello stesso emisfero) sarà la differenza tra l'area più grande e quella più piccola.

Infine, a condizione che il modello sia veramente un ellissoide (e non una sfera), l'area di tale sezione tra l'equatore e il parallelo alla latitudine f è data da

area(f) = pi * b^2 * (log(zp/zm) / (2*e) + sin(f) / (zp*zm))

dove ae bsono le lunghezze degli assi maggiore e minore dell'ellisse generatrice, rispettivamente,

e = sqrt(1 - (b/a)^2)

è la sua eccentricità e

zm = 1 - e*sin(f); zp = 1 + e*sin(f)

(Questo è molto più semplice del calcolo con la geodetica, che sono comunque solo approssimazioni ai parallelismi. Nota il commento di @cffk su un modo di calcolare log(zp/zm)in modo da evitare la perdita di precisione alle basse latitudini.)

figura

area(f) è l'area della sezione opaca dall'equatore fino alla latitudine f (circa 30 gradi a nord nell'illustrazione. X e Y sono assi di coordinate cartesiane geocentriche mostrate come riferimento.

Per l'ellissoide WGS 84, utilizzare i valori costanti

a = 6 378 137 meters,  b =  6 356 752.3142 meters,

comportando

e = 0.08181919084296

(Per un modello sferico con a = b , la formula diventa indefinita. Devi prendere un limite come e -> 0 dall'alto, che poi si riduce alla formula standard 2 * pi * a^2 * sin(f).)

Secondo queste formule, un quadrangolo di 30 'per 30' basato sull'equatore ha un'area di 3077.2300079129 chilometri quadrati, mentre un quadrangolo di 30 'per 30' che tocca un palo (che in realtà è solo un triangolo) ha un'area di soli 13.6086152 quadrati chilometri.

Come controllo, le formule applicate a tutte le celle di una griglia di 720 per 360 che copre la superficie terrestre forniscono una superficie totale di 4 * pi * (6371.0071809) ^ 2 chilometri quadrati, indicando che il raggio autico della terra dovrebbe essere di 6371.0071809 chilometri. Ciò differisce dal valore di Wikipedia solo nell'ultima cifra significativa (circa un decimo di millimetro). (Penso che i calcoli di Wikipedia siano un po 'fuori :-).

Come controlli aggiuntivi, ho usato le versioni di queste formule per riprodurre le Appendici 4 e 5 in Lev M. Bugayevskiy e John P. Snyder, Proiezioni cartografiche: un manuale di riferimento (Taylor e Francis, 1995). L'Appendice 4 mostra lunghezze d'arco di sezioni lunghe 30 'di meridiani e paralleli, dati al metro più vicino. Un controllo a campione dei risultati ha mostrato un perfetto accordo. Ho quindi ricreato la tabella con incrementi di 0,0005 ', anziché con incrementi di 0,5', e ho integrato numericamente le aree quadrangolari stimate con queste lunghezze d'arco. L'area totale dell'ellissoide è stata accuratamente riprodotta a una cifra migliore di otto cifre significative. L'Appendice 5 mostra i valori di area(f)per f = 0, 1/2, 1, ..., 90 gradi, moltiplicati per 1 / (2 * pi). Questi valori sono dati al chilometro quadrato più vicino. Un controllo visivo di valori vicini a 0, 45 e 90 gradi ha mostrato un perfetto accordo.


Questa formula esatta può essere applicata usando l'algebra raster che inizia con una griglia che indica le latitudini dei limiti superiori di ogni cella e un'altra che fornisce le latitudini dei limiti inferiori. Ognuno di questi è essenzialmente una griglia di coordinate y. (In ogni caso potresti voler creare sin(f)e quindi zme zpcome risultati intermedi.) Sottrai i due risultati, prendi il valore assoluto di quello e moltiplica per la frazione q ottenuta nel primo passo (uguale a 0,5 / 360 = 1/720 per una larghezza di cella di 30 ', ad esempio). Questa sarà una griglia i cui valori contengono l' esattoaree di ogni cella (fino alla precisione numerica della griglia). Assicurati solo di esprimere le latitudini nella forma prevista dalla funzione seno: molti calcolatori raster ti daranno coordinate in gradi ma si aspettano radianti per le loro funzioni di innesco!


Per la cronaca, ecco le aree esatte di 30 'per 30' celle sull'ellissoide WGS 84 dall'Equatore fino a un polo, a intervalli di 30 ', a 11 cifre (lo stesso numero usato per il raggio minore b ):

3077.2300079,3077.0019391,3076.5458145,3075.8616605,3074.9495164,3073.8094348,3072.4414813,3070.8457347,3069.0222870,3066.9712434,3064.6927222,3062.1868550,3059.4537865,3056.4936748,3053.3066912,3049.8930202,3046.2528597,3042.3864209,3038.2939285,3033.9756204,3029.4317480,3024.6625762,3019.6683833,3014.4494612,3009.0061153,3003.3386648,2997.4474422,2991.3327939,2984.9950800,2978.4346744,2971.6519646,2964.6473522,2957.4212526,2949.9740951,2942.3063230,2934.4183938,2926.3107788,2917.9839636,2909.4384482,2900.6747464,2891.6933866,2882.4949115,2873.0798782,2863.4488581,2853.6024374,2843.5412166,2833.2658109,2822.7768503,2812.0749792,2801.1608571,2790.0351582,2778.6985716,2767.1518013,2755.3955665,2743.4306011,2731.2576543,2718.8774905,2706.2908892,2693.4986451,2680.5015685,2667.3004848,2653.8962347,2640.2896746,2626.4816763,2612.4731271,2598.2649300,2583.8580035,2569.2532818,2554.4517149,2539.4542684,2524.2619238,2508.8756783,2493.2965451,2477.5255533,2461.5637477,2445.4121891,2429.0719545,2412.5441367,2395.8298444,2378.9302026,2361.8463521,2344.5794500,2327.1306692,2309.5011988,2291.6922441,2273.7050264,2255.5407830,2237.2007674,2218.6862492,2199.9985139,2181.1388633,2162.1086151,2142.9091030,2123.5416769,2104.0077025,2084.3085615,2064.4456516,2044.4203864,2024.2341953,2003.8885234,1983.3848318,1962.7245972,1941.9093120,1920.9404843,1899.8196375,1878.5483108,1857.1280585,1835.5604507,1813.8470724,1791.9895239,1769.9894206,1747.8483931,1725.5680867,1703.1501618,1680.5962932,1657.9081707,1635.0874985,1612.1359952,1589.0553936,1565.8474409,1542.5138984,1519.0565410,1495.4771578,1471.7775513,1447.9595378,1424.0249466,1399.9756206,1375.8134157,1351.5402005,1327.1578567,1302.6682785,1278.0733724,1253.3750574,1228.5752643,1203.6759360,1178.6790272,1153.5865040,1128.4003439,1103.1225355,1077.7550785,1052.2999830,1026.7592702,1001.1349711,975.42912705,949.64378940,923.78101904,897.84288636,871.83147097,845.74886152,819.59715539,793.37845851,767.09488512,740.74855748,714.34160569,687.87616739,661.35438752,634.77841811,608.15041795,581.47255240,554.74699308,527.97591765,501.16150951,474.30595754,447.41145586,420.48020351,393.51440422,366.51626611,339.48800143,312.43182627,285.34996030,258.24462644,231.11805066,203.97246162,176.81009042,149.63317034,122.44393648,95.244625564,68.037475592,40.824725575,13.608615243

I valori sono in chilometri quadrati.


Se desideri approssimare queste aree o semplicemente comprenderne meglio il comportamento, la formula si riduce a una serie di potenze seguendo questo schema:

area(f) = 2 * pi * b^2 * z * (1 + (4/3)y + (6/5)y^2 + (8/7)y^3 + ...)

dove

z = sin(f), y = (e*z)^2.

(Una formula equivalente appare in Bugayevskiy e Snyder, op. Cit. , Equazione (2.1).)

Poiché e ^ 2 è così piccolo (circa 1/150 per tutti i modelli ellissoidali della terra) e z si trova tra 0 e 1, anche y è piccolo. Quindi i termini y ^ 2, y ^ 3, ... si riducono rapidamente, aggiungendo precisione di due decimali in più ad ogni termine. Se dovessimo ignorare del tutto y , la formula sarebbe quella dell'area di una sfera di raggio b . I termini rimanenti possono essere intesi come correttivi per il rigonfiamento equatoriale della terra.


modificare

Sono state sollevate alcune domande sul modo in cui un calcolo della distanza geodetica dell'area si confronta con queste formule esatte. Il metodo della distanza geodetica si avvicina a ciascun quadrangolo in base alla geodetica, piuttosto che ai paralleli, che collegano i suoi angoli in orizzontale e applica la formula euclidea per un trapezio. Per i quadrangoli piccoli, come i quadrupli da 30 ', questo è distorto leggermente basso e ha una precisione relativa tra 6 e 10 parti per milione. Ecco un diagramma dell'errore per WGS 84 (o qualsiasi ragionevole ellissoide terrestre, per quella materia):

figura 2

Pertanto, se (1) si ha un facile accesso ai calcoli della distanza geodetica e (2) è in grado di tollerare errori a livello di ppm, è possibile considerare l'utilizzo di tali calcoli geodetici e moltiplicare i loro risultati per 1,00000791 per correggere la distorsione. Per altre due posizioni decimali di precisione, sottrarre pi / 2 * cos (2f) / 10 ^ 6 dal fattore di correzione: il risultato sarà accurato entro 0,04 ppm.


1
Se il sistema fornisce una funzione atanh, è possibile ottenere risultati leggermente più accurati (meno arrotondamenti) sostituendo il registro (zp / zm) con 2 * atanh (e * sin (f)).
Cffk,

@cffk Questo è un buon punto. Ho ottenuto le formule originariamente in termini di atanh, ma le ho convertite in logaritmi aspettandomi che (a) la maggior parte degli utenti GIS non avesse familiarità con questa funzione e (b) molti utenti non avrebbero accesso ai sistemi in cui è fornita. Sebbene la perdita di precisione sia una potenziale preoccupazione, un rapido controllo dell'entità dell'eccentricità mostra che si perde poco quando si lavora con gli ellissoidi terrestri, forse poco più di due decimali. Ho fornito in parte le serie di potenze per consentire ai lettori di ottenere la massima precisione possibile, se lo desiderano.
whuber

3

La risposta alla domanda di radouxju dipende dalla forma del pixel quando proiettato sull'ellissoide. Se il sistema di coordinate del raster è longitudine e latitudine, allora il pixel è un rettangolo di linea rombo e la risposta di whuber può essere usata, oppure, più in generale, puoi usare la formula per un poligono i cui bordi sono linee di rombo. Se il sistema di coordinate è una proiezione conforme su larga scala (UTM, piano di stato, ecc.), Sarebbe più preciso approssimare i bordi mediante geodetica e utilizzare la formula per un poligono geodetico. I poligoni geodetici sono probabilmente i migliori per l'uso generale, poiché, a differenza dei poligoni della linea romboidale, sono "ben educati" vicino ai poli.

Le implementazioni delle formule per i poligoni geodetici e del rombo sono fornite dalla mia biblioteca GeographicLib . L'area geodetica è disponibile in diverse lingue; l'area della linea rombo è solo C ++. C'è una versione online (geodetica + rombi) disponibile qui . L'accuratezza di questi calcoli è in genere migliore di 0,1 metri quadrati.

Dovrai giudicare credibile / ufficiale ... Le formule geodetiche sono derivate in L'area sotto il geodetico (Danielsen, 1989, è richiesto l'abbonamento) e Algorithms for geodesics (Karney, 2013, open access). Le formule della linea rombo sono fornite qui .


(+1) Sto votando questo post per le informazioni utili in esso contenute, anche se in realtà non affronta la domanda (o la generosità), entrambi i quali riguardano specificamente i raster nei sistemi di coordinate geografiche .
whuber

1

Mi sono imbattuto in questa domanda quando ho cercato di determinare una formula per l'area di un pixel WGS84. Sebbene la risposta di @ whuber contenga queste informazioni, è stato comunque necessario lavorare per ottenere una formula per l'area di un pixel di grado quadrato a una determinata latitudine. Ho incluso una funzione Python che ho scritto di seguito che riassume questo in una singola chiamata. Sebbene non risponda direttamente alla domanda del poster sull'area di un INTERO raster (sebbene si possano sommare le aree di tutti i pixel), penso che siano comunque informazioni utili per qualcuno che potrebbe essere alla ricerca di un calcolo simile.

def area_of_pixel(pixel_size, center_lat):
    """Calculate m^2 area of a wgs84 square pixel.

    Adapted from: /gis//a/127327/2397

    Parameters:
        pixel_size (float): length of side of pixel in degrees.
        center_lat (float): latitude of the center of the pixel. Note this
            value +/- half the `pixel-size` must not exceed 90/-90 degrees
            latitude or an invalid area will be calculated.

    Returns:
        Area of square pixel of side length `pixel_size` centered at
        `center_lat` in m^2.

    """
    a = 6378137  # meters
    b = 6356752.3142  # meters
    e = math.sqrt(1 - (b/a)**2)
    area_list = []
    for f in [center_lat+pixel_size/2, center_lat-pixel_size/2]:
        zm = 1 - e*math.sin(math.radians(f))
        zp = 1 + e*math.sin(math.radians(f))
        area_list.append(
            math.pi * b**2 * (
                math.log(zp/zm) / (2*e) +
                math.sin(math.radians(f)) / (zp*zm)))
    return pixel_size / 360. * (area_list[0] - area_list[1])
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.