Odpowiedzi:
PostGIS 1.5 wprowadził nowy typ GEOGRAFII . Ten GEOGRAPHY
typ umożliwia przechowywanie nie rzutowanych współrzędnych na sferoidie w tabeli PostGIS i wykonywanie na nich niektórych funkcji analitycznych.
ST_Area
zapytania można wykonywać na wielokątach typu GEOGRAFIA w celu obliczenia ich powierzchni w metrach kwadratowych.
Poniższe zapytanie wyprowadza obszar wszystkich wielokątów wykorzystujących sferoidę (obecnie WGS-84
obsługiwana jest tylko sferoida), zakładając, że są one przechowywane przy użyciu GEOGRAPHY
typu:
SELECT ST_Area(the_geom) FROM table_of_polygons;
Algorytm zastosowany do obliczenia pola powierzchni sferoidy można uzyskać z kodu źródłowego .
Oto link do kodu, który da obszar prostego wielokąta (pierwotnie z World Wind Forum): http://forum.worldwindcentral.com/showthread.php?t=20724 . To rozwiązuje problem na sferze, z grubsza opartej na relacji:
S = powierzchnia wielokąta; theta jest sumą kątów wewnętrznych w radianach; n jest liczbą wierzchołków; r jest promieniem kuli.
Zobacz też (źródło obrazu wzoru): http://www.geom.uiuc.edu/docs/reference/CRC-formulas/node59.html
Byłbym zachwycony, widząc linki i / lub kodowanie obszaru wielokąta na spłaszczonej sferoidie.
Oto źródło uproszczonych obliczeń , które wykonujemy w OpenLayers. Ta metoda pochodzi z „Some Algorytm for Polygons on a Sphere” (Robert. G. Chamberlain i William H. Duquette, publikacja NASA JPL 07-03). Kod powiązany z powyższym służy do określania obszaru pierścienia liniowego (ze współrzędnymi geograficznymi). Obszary dla wielokątów i wielokątów są sumowane z pierścieni.
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;
}
Składniki pierścieniowe to tablice dwuelementowe współrzędnych x, y (lon, lat) w powyższym kodzie. Metoda OpenLayers.Util.rad konwertuje stopnie na radiany (deg * PI / 180).
Musisz przekonwertować swoje współrzędne geograficzne na rzut, który ma układ współrzędnych, który pozwala użyć matematyki kartezjańskiej do obliczenia powierzchni.
Uważam, że UTM jest przyjętą standardową projekcją, ponieważ bardzo łatwo jest wybrać strefę na podstawie szerokości i długości geograficznej, a także zniekształcenie jest minimalne, nawet w strefach. Tak więc, jeśli masz wielokąt wielkości Teksasu, możesz użyć strefy UTM 14 N i nadal będzie dość dokładny.
Jeśli twoje wielokąty znajdują się ponad biegunem północnym lub południowym, powinieneś zamiast tego użyć zasilacza UPS , ponieważ rzuty UTM są mniej dokładne na biegunach i szybko je przemierzasz, gdy granice stają się mniejsze (ponieważ podążają wzdłuż linii długości)
Gdy punkty znajdą się w układzie współrzędnych przyjaznym kartezjańczykom, możesz traktować je jak wielokąty na siatce i obliczać obszar.
Klasa GeygonArea została dodana do GeographicLib w 2011-07. Oblicza to prawdziwy elipsoidalny obszar wielokąta, którego krawędzie są geodezyjne. W przeciwieństwie do PostGIS metoda nie wymaga integracji numerycznej. Dokumentacja (i link do artykułu, z którego pochodzą formuły), patrz
http://geographiclib.sf.net/html/classGeographicLib_1_1PolygonAreaT.html
(Link naprawiono, aby odzwierciedlić uogólnienie PolygonArea do klasy szablonu).