Respostas:
O PostGIS 1.5 introduziu um novo tipo de GEOGRAFIA . O GEOGRAPHY
tipo permite que coordenadas não projetadas em um esferóide sejam armazenadas em uma tabela PostGIS e que algumas funções de análise sejam executadas sobre elas.
ST_Area
consultas podem ser realizadas nos polígonos do tipo GEOGRAFIA para calcular sua área em metros quadrados.
A consulta a seguir gera a área de todos os polígonos usando o esferóide (atualmente apenas o WGS-84
esferóide é suportado), supondo que eles sejam armazenados usando o GEOGRAPHY
tipo:
SELECT ST_Area(the_geom) FROM table_of_polygons;
O algoritmo usado para calcular a área em um esferóide pode ser derivado do código-fonte .
Aqui está um link para algum código que produzirá a área de um polígono simples (originalmente do World Wind Forum): http://forum.worldwindcentral.com/showthread.php?t=20724 . Isso resolve o problema em uma esfera, aproximadamente com base no relacionamento:
S = área do polígono; teta é a soma dos ângulos interiores em radianos; n é o número de vértices; r é o raio da esfera.
Consulte também (fonte da imagem da fórmula): http://www.geom.uiuc.edu/docs/reference/CRC-formulas/node59.html
Eu ficaria encantado em ver links e / ou código da área de polígono em um esferóide oblato.
Aqui está a fonte do cálculo simplificado que fazemos nos OpenLayers. Este método vem de "Algoritmos para polígonos em uma esfera" (Robert. G. Chamberlain e William H. Duquette, Publicação JPL da NASA 07-03). O código vinculado acima é para determinar a área de um anel linear (com coordenadas geográficas). As áreas para polígonos e multi-polígonos são resumidas a partir dos anéis.
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;
}
Os componentes de anel são duas matrizes de elementos das cordas x, y (lon, lat) no código acima. O método OpenLayers.Util.rad apenas converte graus em radianos (deg * PI / 180).
Você precisará converter suas coordenadas geográficas em uma projeção que possui um sistema de coordenadas que permite usar a matemática cartesiana para calcular a área.
Acredito que UTM é a projeção padrão aceita, pois é muito simples selecionar uma zona com base em sua latitude e longitude, e também a distorção é mínima, mesmo entre zonas. Portanto, se você tiver um polígono do tamanho do Texas, poderá usar a Zona 14 N do UTM e ele ainda será bastante preciso.
Se seus polígonos estão sobre o polo norte ou sul, você deve usar o UPS , pois as projeções UTM são menos precisas sobre os pólos e você as atravessará rapidamente à medida que os limites diminuem (uma vez que seguem as linhas de longitude)
Quando seus pontos estiverem em um sistema de coordenadas compatível com Cartesiano, você poderá tratá-los como polígonos em uma grade e calcular a área.
Uma classe PolygonArea foi adicionada ao GeographicLib em 2011-07. Isso calcula a verdadeira área elipsoidal de um polígono cujas bordas são geodésicas. Ao contrário do PostGIS, o método não implica integração numérica. Para documentação (e um link para o artigo em que as fórmulas são derivadas), consulte
http://geographiclib.sf.net/html/classGeographicLib_1_1PolygonAreaT.html
(Link corrigido para refletir a generalização de PolygonArea para uma classe de modelo.)