2010-05-18 33 views
3

Étant donné une série de coordonnées GPS paires, je dois calculer la surface d'un polygone (n-gon). C'est relativement petit (pas plus de 50 000 pieds carrés). Les géocodes sont créés en appliquant une transformation affine avec les données d'un fichier mondial.calcul de la superficie Polygon en utilisant Latitude et Longitude produite à partir de l'espace cartésien et un fichier mondial

j'ai essayé d'utiliser une approche en deux étapes en effectuant la conversion des codes géographiques de coordonnées cartésiennes:

double xPos = (lon-lonAnchor)*(Math.toRadians(6378137))*Math.cos(latAnchor); 
double yPos = (lat-latAnchor)*(Math.toRadians(6378137)); 

puis-je utiliser un calcul cross product pour déterminer la zone.

Le problème est que les résultats sont un peu hors de la précision (environ 1%). Y a-t-il quelque chose que je peux examiner pour améliorer cela?

Merci.

Répondre

2

1% erreur semble un peu élevé en raison de seulement votre approximation. Comparez-vous des mesures réelles ou un calcul idéal? Rappelez-vous qu'il y a une erreur dans le GPS qui pourrait aussi contribuer.

Si vous voulez une méthode plus précise pour ce faire, il y a une bonne réponse à la question this. Si vous allez plus vite, vous pouvez utiliser le géoïde WGS84 à la place de votre sphère de référence pour la conversion en coordonnées cartésiennes (ECEF). Voici le wiki link pour cette conversion.

+0

je compare contre des mesures réelles des zones connues.Une remarque intéressante est que si j'utilise les coordonnées GPS à l'aide d'une méthode de Haversine, j'obtiens des calculs de distance très précis qui donnent des valeurs de périmètre précises. –

+0

Désolé pour la réponse tardive, a fini par utiliser le géoïde WGs84 avec la bibliothèque java proj4. J'ai bien travaillé, merci pour l'aide. –

3

Je suis en train de modifier une carte Google afin qu'un utilisateur puisse calculer la zone d'un polygone en cliquant sur les sommets. Il ne donnait pas les zones correctes jusqu'à ce que je me suis assuré le Math.cos (latAnchor) était en radians premier

Alors:

double xPos = (lon-lonAnchor)*(Math.toRadians(6378137))*Math.cos(latAnchor); 

est devenu:

double xPos = (lon-lonAnchor)*(6378137*PI/180))*Math.cos(latAnchor*PI/180); 

où lon, et lonAnchor LatAnchor sont en degrés. ça fonctionne parfaitement maintenant.

-1

J'ai vérifié sur internet pour différentes formules de polygones (ou code) mais je n'en ai trouvé aucune bonne ou facile à implémenter.

Maintenant, j'ai écrit l'extrait de code pour calculer la surface d'un polygone dessiné sur la surface de la terre. Le polygone peut avoir n sommets, chaque sommet ayant sa propre longitude.

quelques points importants

  1. L'entrée de tableau à cette fonction aura "n + 1" éléments. Le dernier élément aura les mêmes valeurs que celui du premier.
  2. J'ai écrit très basique du code C#, de sorte que les gars peuvent également adapter dans d'autres langues.
  3. 6378137 est la valeur du rayon de la terre en mètres.
  4. La zone de sortie aura unité de mètres carrés

    private static double CalculatePolygonArea(IList<MapPoint> coordinates) 
    { 
        double area = 0; 
    
        if (coordinates.Count > 2) 
        { 
         for (var i = 0; i < coordinates.Count - 1; i++) 
         { 
          MapPoint p1 = coordinates[i]; 
          MapPoint p2 = coordinates[i + 1]; 
          area += (p2.Longitude - p1.Longitude) * (2 + Math.Sin(ConvertToRadian(p1.Latitude)) + Math.Sin(ConvertToRadian(p2.Latitude))); 
         } 
    
         area = area * 6378137 * 6378137/2; 
        } 
    
        return Math.Abs(area); 
    } 
    
    private static double ConvertToRadian(double input) 
    { 
        return input * Math.PI/180; 
    } 
    
+0

J'ai essayé votre code mais quelque chose ne va pas. des idées? Voir: [code] (http://stackoverflow.com/questions/36022883/calculate-the-area-of-a-polygon-with-latitude-and-longitude) – pogorman

+0

vous avez mis "area = area * R * R/2; " à l'intérieur de la boucle for alors qu'il devrait être en boucle extérieure. –

+0

Je pense que vous devriez convertir 'p1.Longitude' et' p2.Longitude' en radians aussi. Après avoir fait cette modification, j'ai obtenu un résultat très similaire à celui obtenu avec la fonction 'google.maps.geometry.spherical.computeArea'. – zxue