Antworten:
PostGIS 1.5 führte einen neuen GEOGRAPHY-Typ ein . Mit diesem GEOGRAPHY
Typ können nicht projizierte Koordinaten auf einem Sphäroid in einer PostGIS-Tabelle gespeichert und einige Analysefunktionen ausgeführt werden.
ST_Area
Abfragen können für GEOGRAPHY-Polygone durchgeführt werden, um deren Fläche in Quadratmetern zu berechnen.
Die folgende Abfrage gibt die Fläche aller Polygone mit dem Sphäroid aus (derzeit wird nur das WGS-84
Sphäroid unterstützt), sofern sie mit dem GEOGRAPHY
Typ gespeichert werden :
SELECT ST_Area(the_geom) FROM table_of_polygons;
Der Algorithmus zur Berechnung der Fläche auf einem Sphäroid kann aus dem Quellcode abgeleitet werden .
Hier ist ein Link zu einem Code, der die Fläche eines einfachen Polygons (ursprünglich aus dem World Wind Forum) ergibt: http://forum.worldwindcentral.com/showthread.php?t=20724 . Dies löst das Problem auf einer Kugel, grob basierend auf der Beziehung:
S = Fläche des Polygons; Theta ist die Summe der Innenwinkel im Bogenmaß; n ist die Anzahl der Eckpunkte; r ist der Radius der Kugel.
Siehe auch (Quelle des Formelbildes): http://www.geom.uiuc.edu/docs/reference/CRC-formulas/node59.html
Ich würde mich freuen, Links und / oder Codes für die Polygonfläche auf einem abgeflachten Sphäroid zu sehen.
Hier ist die Quelle für die vereinfachte Berechnung , die wir in OpenLayers durchführen. Diese Methode stammt aus "Some Algorithms for Polygons on a Sphere" (Robert G. Chamberlain und William H. Duquette, JPL-Publikation 07-03 der NASA). Der oben angegebene Code dient zur Bestimmung der Fläche eines linearen Rings (mit geografischen Koordinaten). Bereiche für Polygone und MultiPolygone werden aus den Ringen summiert.
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;
}
Ringkomponenten sind zwei Elementarrays von x-, y- (lon-, lat-) Koordinaten im obigen Code. Die OpenLayers.Util.rad-Methode konvertiert nur Grad in Bogenmaß (Grad * PI / 180).
Sie müssen Ihre geografischen Koordinaten in eine Projektion mit einem Koordinatensystem konvertieren, mit dem Sie die Fläche mithilfe der kartesischen Mathematik berechnen können.
Ich glaube, UTM ist die akzeptierte Standardprojektion, da es sehr einfach ist, eine Zone basierend auf Ihrem Breiten- und Längengrad auszuwählen, und auch die Verzerrung selbst über Zonen hinweg minimal ist. Wenn Sie also ein Polygon in der Größe von Texas haben, können Sie UTM Zone 14 N verwenden, und es ist immer noch ziemlich genau.
Wenn sich Ihre Polygone über dem Nord- oder Südpol befinden, sollten Sie stattdessen UPS verwenden, da die UTM-Projektionen über den Polen weniger genau sind und Sie sie schnell durchqueren, wenn die Grenzen kleiner werden (da sie Längenlinien folgen).
Sobald sich Ihre Punkte in einem kartesisch freundlichen Koordinatensystem befinden, können Sie sie wie Polygone in einem Raster behandeln und die Fläche berechnen.
Eine PolygonArea-Klasse wurde 2011-07 zu GeographicLib hinzugefügt. Dies berechnet die wahre Ellipsoidfläche eines Polygons, dessen Kanten geodätisch sind. Im Gegensatz zu PostGIS erfordert die Methode keine numerische Integration. Informationen zur Dokumentation (und einen Link zu dem Artikel, aus dem die Formeln abgeleitet wurden) finden Sie unter
http://geographiclib.sf.net/html/classGeographicLib_1_1PolygonAreaT.html
(Der Link wurde korrigiert, um die Verallgemeinerung von PolygonArea auf eine Vorlagenklasse widerzuspiegeln.)