Respuestas:
PostGIS 1.5 introdujo un nuevo tipo de GEOGRAFÍA . El GEOGRAPHY
tipo permite que las coordenadas no proyectadas en un esferoide se almacenen en una tabla PostGIS, y que se realicen algunas funciones de análisis sobre ellas.
ST_Area
Se pueden realizar consultas sobre polígonos de tipo GEOGRAFÍA para calcular su área en metros cuadrados.
La siguiente consulta genera el área de todos los polígonos que usan el esferoide (actualmente solo WGS-84
se admite el esferoide), suponiendo que se almacenen usando el GEOGRAPHY
tipo:
SELECT ST_Area(the_geom) FROM table_of_polygons;
El algoritmo utilizado para calcular el área en un esferoide puede derivarse del código fuente .
Aquí hay un enlace a algún código que generará el área de un polígono simple (originalmente del Foro Mundial del Viento): http://forum.worldwindcentral.com/showthread.php?t=20724 . Esto resuelve el problema en una esfera, basada aproximadamente en la relación:
S = área del polígono; theta es la suma de los ángulos interiores en radianes; n es el número de vértices; r es el radio de la esfera.
Ver también (fuente de la imagen de la fórmula): http://www.geom.uiuc.edu/docs/reference/CRC-formulas/node59.html
Me encantaría ver enlaces y / o códigos para el área de polígonos en un esferoide achatado.
Aquí está la fuente del cálculo simplificado que hacemos en OpenLayers. Este método proviene de "Algunos algoritmos para polígonos en una esfera" (Robert. G. Chamberlain y William H. Duquette, NASA JPL Publication 07-03). El código vinculado a lo anterior es para determinar el área de un anillo lineal (con coordenadas geográficas). Las áreas para polígonos y polígonos múltiples se resumen a partir de los anillos.
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;
}
Los componentes de anillo son conjuntos de dos elementos de coordenadas x, y (lon, lat) en el código anterior. El método OpenLayers.Util.rad solo convierte grados a radianes (deg * PI / 180).
Deberá convertir sus coordenadas geográficas en una proyección que tenga un sistema de coordenadas que le permita usar las matemáticas cartesianas para calcular el área.
Creo que UTM es la proyección estándar aceptada, ya que es muy simple seleccionar una zona en función de su latitud y longitud, y también la distorsión es mínima, incluso en todas las zonas. Entonces, si tiene un polígono del tamaño de Texas, puede usar UTM Zone 14 N y aún será bastante preciso.
Si sus polígonos están sobre el polo norte o sur, entonces debería usar UPS en su lugar, ya que las proyecciones UTM son menos precisas sobre los polos, y los atravesará rápidamente a medida que los límites se hagan más pequeños (ya que siguen líneas de longitud)
Una vez que sus puntos están en un sistema de coordenadas amigable con los cartesianos, puede tratarlos como polígonos en una cuadrícula y calcular el área.
Se agregó una clase PolygonArea a GeographicLib en 2011-07. Esto calcula el área elipsoidal verdadera de un polígono cuyos bordes son geodésicos. A diferencia de PostGIS, el método no implica integración numérica. Para obtener documentación (y un enlace al documento donde se derivan las fórmulas), vea
http://geographiclib.sf.net/html/classGeographicLib_1_1PolygonAreaT.html
(Enlace arreglado para reflejar la generalización de PolygonArea a una clase de plantilla).