Réponses:
PostGIS 1.5 a introduit un nouveau type de GEOGRAPHIE . Le GEOGRAPHY
type permet de stocker des coordonnées non projetées sur un sphéroïde dans une table PostGIS et d'effectuer certaines fonctions d'analyse sur celles-ci.
ST_Area
des requêtes peuvent être effectuées sur des polygones de type GÉOGRAPHIE afin de calculer leur surface en mètres carrés.
La requête suivante génère la zone de tous les polygones à l'aide du sphéroïde (actuellement seul le WGS-84
sphéroïde est pris en charge), en supposant qu'ils sont stockés à l'aide du GEOGRAPHY
type:
SELECT ST_Area(the_geom) FROM table_of_polygons;
L'algorithme utilisé pour calculer l'aire sur un sphéroïde peut être dérivé du code source .
Voici un lien vers un code qui donnera l'aire d'un simple polygone (originaire du World Wind Forum): http://forum.worldwindcentral.com/showthread.php?t=20724 . Cela résout le problème sur une sphère, basée en gros sur la relation:
S = aire du polygone; thêta est la somme des angles intérieurs en radians; n est le nombre de sommets; r est le rayon de la sphère.
Voir aussi (source de l'image de la formule): http://www.geom.uiuc.edu/docs/reference/CRC-formulas/node59.html
Je serais ravi de voir des liens et / ou du code pour la zone de polygone sur un sphéroïde oblat.
Voici la source du calcul simplifié que nous faisons dans OpenLayers. Cette méthode provient de "Quelques algorithmes pour les polygones sur une sphère" (Robert. G. Chamberlain et William H. Duquette, NASA JPL Publication 07-03). Le code lié à ci-dessus sert à déterminer l'aire d'un anneau linéaire (avec coordonnées géographiques). Les zones de polygones et de multi-polygones sont résumées à partir des anneaux.
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;
}
Les composants d'anneau sont deux tableaux d'éléments de coords x, y (lon, lat) dans le code ci-dessus. La méthode OpenLayers.Util.rad convertit simplement les degrés en radians (deg * PI / 180).
Vous devrez convertir vos coordonnées géographiques en une projection dotée d'un système de coordonnées qui vous permet d'utiliser les mathématiques cartésiennes pour calculer l'aire.
Je crois que l' UTM est la projection standard acceptée, car il est très simple de sélectionner une zone en fonction de votre latitude et longitude, et la distorsion est également minime, même entre les zones. Donc, si vous avez un polygone de la taille du Texas, vous pouvez utiliser UTM Zone 14 N et il sera toujours assez précis.
Si vos polygones sont au-dessus du pôle Nord ou Sud, vous devez utiliser UPS à la place, car les projections UTM sont moins précises sur les pôles, et vous les traverserez rapidement à mesure que les limites deviennent plus petites (car elles suivent les lignes de longitude)
Une fois que vos points sont dans un système de coordonnées cartésien, vous pouvez les traiter comme des polygones sur une grille et calculer la zone.
Une classe PolygonArea a été ajoutée à GeographicLib en 2011-07. Cela calcule la véritable zone ellipsoïdale d'un polygone dont les bords sont des géodésiques. Contrairement à PostGIS, la méthode n'implique pas d'intégration numérique. Pour la documentation (et un lien vers l'article où les formules sont dérivées), voir
http://geographiclib.sf.net/html/classGeographicLib_1_1PolygonAreaT.html
(Lien corrigé pour refléter la généralisation de PolygonArea à une classe de modèle.)