Comment puis-je mesurer une zone à partir de coordonnées géographiques?

12

Si j'ai des polygones en coordonnées géographiques (WGS84), comment mesurer la surface totale que chacun prend à la surface de la terre, en tenant compte de la courbure de la terre?

scw
la source

Réponses:

7

PostGIS 1.5 a introduit un nouveau type de GEOGRAPHIE . Le GEOGRAPHYtype 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-84sphéroïde est pris en charge), en supposant qu'ils sont stockés à l'aide du GEOGRAPHYtype:

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 .

fmark
la source
Cool. Merci pour l'info. Je vais devoir essayer ça.
glennon
Que fait PostGIS sous le capot?
mwalker du
@mwalker Je n'ai pas pris le temps d'apprendre, mais j'ai ajouté un lien vers le code source si vous le souhaitez :)
fmark
par mon œil inexpérimenté, PostGIS utilise une sommation, découpant la zone en bandes et les additionnant toutes.
mwalker
10

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:

texte alternatif

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.

glennon
la source
1
@glennon Le code de l'aire d'un polygone géodésique sur un sphéroïde est disponible dans GeographicLib . Le code contient un lien vers l'article où l'algorithme est dérivé.
cffk
Cette méthode, basée sur la formule de Gauss-Bonnet, est d'un grand intérêt mathématique mais est presque sans valeur pour les petites figures de la terre: il y a une énorme annulation pour trouver le minuscule `` excès '' entre parenthèses, conduisant souvent à une perte catastrophique de précision - il est facile de perdre presque toute la précision entièrement, même en travaillant en arithmétique double précision. Pour les calculs SIG de routine, cela ne fonctionne tout simplement pas.
whuber
7

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).

Tim Schaub
la source
1
Le rayon que vous utilisez, 6378137,0 m, correspond au rayon équatorial de la Terre. Y a-t-il une raison à cela? L'utilisation d'un rayon moyen ne serait-elle pas plus précise?
FredB
Math.radians = fonction (degrés) {retour degrés * Math.PI / 180.0; }; x = latitude, y = longitude
Stefan Steiger
4

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.

mwalker
la source
3

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.)

cffk
la source