2010-07-28 14 views
0

J'essaie de trouver un moyen de calculer l'aire d'un polygone en utilisant des coordonnées lat longues dans un site Flex 3. Hong007 sur Google Maps pour le groupe Flash a été assez cool pour afficher la fonction suivante:Calcul de la surface d'un polygone lorsque les points du polygone sont lat Longs: quelle fonction est la plus précise?

private function GetPolygonArea (polygon : Polygon):Number 
     { 
      var nVer : int = polygon.getOuterVertexCount(); 
      var sz : Number =0; 
      var s : Number =0; 
      var x : Number =0; 
      var y0 : Number =0; 
      var y1 : Number =0; 
      var Maplatlng:LatLng; 
      if (nVer>=3){ 
       for (var i:int=0; i<nVer; i++){ 
        Maplatlng = polygon.getOuterVertex(i); 
        x = Maplatlng.lng(); 
        if (i>0){ 
         Maplatlng = polygon.getOuterVertex(i-1); 
         y0 = Maplatlng.lat(); 
        } 
        else{ 
         Maplatlng = polygon.getOuterVertex(nVer-1); 
         y0 = Maplatlng.lat(); 
        }; 
        if (i<(nVer-1)){ 
         Maplatlng = polygon.getOuterVertex(i+1); 
         y1 = Maplatlng.lat(); 
        } 
        else{ 
         Maplatlng = polygon.getOuterVertex(0); 
         y1 = Maplatlng.lat(); 
        }; 
        s = x * (y0-y1); 
        sz+=s; 
       }; 
       //경위도시 1도의 m값을 곱한다(대략 면적 환산) 
       Maplatlng = polygon.getOuterVertex(0); 
       var Maplatlng1:LatLng = new 
com.google.maps.LatLng(Maplatlng.lat()+1, Maplatlng.lng()+1); 
       var TempDISTANCE:Number = 
Maplatlng.distanceFrom(Maplatlng1)/Math.sqrt(2); 
       return Math.abs((sz/2.0) * Math.pow(TempDISTANCE, 2)); 
      }; 
      return 0.0; 
     } 

je aussi jouer avec la calculatrice de la zone à http://www.freemaptools.com/area-calculator.htm.

Ces fonctions produisent des résultats légèrement différents. J'essaie de savoir lequel est le plus précis. Il semble que la fonction de hong007 produise des résultats en moyenne légèrement supérieurs à la fonction de freemaptools. Cependant, je ne sais pas lequel est le plus précis. Aucun conseil?

Répondre

0

La méthode implémentée ici est assez rapide et sale. Il fait une paire d'hypothèses qui peuvent conduire à des résultats incorrects.

La première chose à savoir est que l'espace Lat/Long est mis à l'échelle de manière non uniforme par rapport à la distance mesurée sur le sol. Cela signifie qu'un vecteur de longueur d'un mètre a une longueur différente dans l'espace lat/long, selon que le vecteur pointe approximativement vers l'est-ouest ou le nord-sud. En outre, l'ampleur de la différence entre la carte des axes latéraux/longs et celle des unités terrestres varie en fonction de l'endroit où vous vous trouvez sur le globe (beaucoup plus différent aux pôles qu'à l'équateur.)

solution de contournement très rapide et sale pour cela, qui est de générer une valeur d'échelle basée sur la distance calculée pour l'hypoténuse d'un triangle rectangle unitaire. Cela essaie de faire la moyenne des échelles des deux axes lat/long pour ce point sur le globe.

Il y a quelques problèmes avec ceci. Si le polygone est très grand (plusieurs géocellules), cette valeur d'échelle moyenne sera désactivée car elle est calculée uniquement pour la géocellule locale autour du sommet 0. Deuxièmement, l'approximation de l'échelle moyenne est vraiment très grossière et se décompose de manière significative si vous avez des polygones qui varient grandement dans une dimension mais pas dans l'autre (un long polygone maigre orienté selon l'un des axes). C'est parce que l'échelle sera calculée comme une moyenne de l'échelle des deux axes, mais l'un des axes devrait avoir très peu d'influence en raison de la distribution des sommets.

Je n'ai pas regardé l'autre calculatrice de zone mais je devinerais si vous voyez des différences que ce code est la version la moins précise.

+0

Bonjour bshields, Merci pour la réponse très détaillée. Maintenant, je comprends mieux comment cette fonction fonctionne et quelles sont ses faiblesses. Mes polygones sont des quartiers d'une ville de la côte est des États-Unis. En moyenne, les polygones sont de 1-3 kilomètres carrés. Donc, j'espère que les problèmes que vous avez soulignés ne causeront pas de grandes inexactitudes. Malheureusement, la calculatrice de zone ne fournit pas la fonction employée. Donc, je devrais entrer chaque polygone séparément et ce serait une douleur. Pensez-vous que la fonction du hong007 est raisonnablement précise au niveau de la ville? Je vous remercie! – Laxmidi

+0

@Laxmidi Seule la première chose que j'ai mentionnée est liée à la taille du polygone. Le problème le plus important est la méthode de moyennage de l'échelle entre les deux axes.Cela donnera des résultats corrects pour un carré, mais les polygones de forme irrégulière auront une zone incorrecte, les cas les plus défavorables étant ceux qui sont très oblongs et orientés selon l'un des axes. Si vous voulez faire cela correctement, je pense que vous devez projeter ces points sur un système de coordonnées projeté comme UTM et calculer la surface dans cet espace. – bshields

1

J'ai ajouté une chaîne à cet algorithme. Pour google maps expérimentalement j'ai trouvé ce nombre:

are = area-(area*0.2187); 

et il fonctionne pour moi pour un maximum (échelle = 5 mètres) et minimum (500 km) niveaux de zoom.