Risposte:
PostGIS 1.5 ha introdotto un nuovo tipo di GEOGRAFIA . Il GEOGRAPHY
tipo consente di memorizzare coordinate non proiettate su uno sferoide in una tabella PostGIS e di eseguire alcune funzioni di analisi su di esse.
ST_Area
le query possono essere eseguite su poligoni di tipo GEOGRAFIA al fine di calcolare la loro area in metri quadrati.
La query seguente genera l'area di tutti i poligoni usando lo sferoide (attualmente WGS-84
è supportato solo lo sferoide), supponendo che siano memorizzati usando il GEOGRAPHY
tipo:
SELECT ST_Area(the_geom) FROM table_of_polygons;
L'algoritmo utilizzato per calcolare l'area su uno sferoide può essere derivato dal codice sorgente .
Ecco un link ad alcuni codici che daranno l'area di un semplice poligono (originariamente dal World Wind Forum): http://forum.worldwindcentral.com/showthread.php?t=20724 . Questo risolve il problema su una sfera, approssimativamente basata sulla relazione:
S = area del poligono; theta è la somma degli angoli interni in radianti; n è il numero di vertici; r è il raggio della sfera.
Vedi anche (fonte dell'immagine della formula): http://www.geom.uiuc.edu/docs/reference/CRC-formulas/node59.html
Sarei felice di vedere collegamenti e / o codici per l'area poligonale su uno sferoide oblato.
Ecco la fonte per il calcolo semplificato che eseguiamo in OpenLayers. Questo metodo deriva da "Alcuni algoritmi per poligoni su una sfera" (Robert. G. Chamberlain e William H. Duquette, Pubblicazione JPL della NASA 07-03). Il codice collegato sopra serve per determinare l'area di un anello lineare (con coordinate geografiche). Le aree per poligoni e poligoni sono riassunte dagli anelli.
var area = 0.0;
var len = ring.components && ring.components.length;
if (len > 2) {
var p1, p2;
for (var i=0; i<len-1; i++) {
p1 = ring.components[i];
p2 = ring.components[i+1];
area += OpenLayers.Util.rad(p2.x - p1.x) *
(2 + Math.sin(OpenLayers.Util.rad(p1.y)) +
Math.sin(OpenLayers.Util.rad(p2.y)));
}
area = area * 6378137.0 * 6378137.0 / 2.0;
}
I componenti dell'anello sono due array di elementi di x, y (lon, lat) nel codice sopra. Il metodo OpenLayers.Util.rad converte i gradi in radianti (deg * PI / 180).
Dovrai convertire le tue coordinate geografiche in una proiezione che ha un sistema di coordinate che ti consente di usare la matematica cartesiana per calcolare l'area.
Credo che UTM sia la proiezione standard accettata, in quanto è molto semplice selezionare una zona in base alla latitudine e alla longitudine, e anche la distorsione è minima, anche attraverso le zone. Quindi, se hai un poligono delle dimensioni del Texas, puoi usare UTM Zone 14 N e sarà comunque abbastanza preciso.
Se i tuoi poligoni si trovano sopra il polo nord o sud, dovresti invece utilizzare UPS , poiché le proiezioni UTM sono meno precise sui poli e li attraverserai rapidamente man mano che i confini si restringono (poiché seguono linee di longitudine)
Una volta che i tuoi punti si trovano in un sistema di coordinate amico delle cartesiane, puoi trattarli come poligoni su una griglia e calcolare l'area.
Una classe PolygonArea è stata aggiunta a GeographicLib nel 2011-07. Questo calcola la vera area ellissoidale di un poligono i cui bordi sono geodetici. A differenza di PostGIS, il metodo non implica l'integrazione numerica. Per la documentazione (e un collegamento al documento da cui derivano le formule), vedere
http://geographiclib.sf.net/html/classGeographicLib_1_1PolygonAreaT.html
(Collegamento corretto per riflettere la generalizzazione di PolygonArea a una classe modello.)