8
votes

Calcul de la zone de polygone à l'aide de la latitude et de la longitude générée à partir d'espace cartésien et d'un fichier mondial

Étant donné une série de paires de coordonnées GPS, je dois calculer la zone d'un polygone (N-gon). Ceci est relativement petit (pas plus de 50 000 pieds carrés). Les géocodes sont créés en appliquant une transformation affine avec des données d'un fichier mondial.

J'ai essayé d'utiliser une approche en deux étapes en convertissant les géocodes en coordonnées cartésiennes: p>

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


0 commentaires

7 Réponses :


2
votes

Une erreur de 1% semble un peu élevé en raison de votre approximation. Comparez-vous contre des mesures réelles ou un calcul idéal? N'oubliez pas qu'il existe une erreur dans le GPS qui pourrait contribuer.

Si vous voulez une méthode plus précise pour le faire, il y a une bonne réponse à cette question. Si vous utilisez un moyen plus rapide, vous pouvez utiliser la géoïde WGS84 au lieu de votre sphère de référence pour la conversion des coordonnées cartésiennes (ECEF). Voici le Lien Wiki pour cette conversion.


2 commentaires

Je comparais des mesures réelles des zones connues. Une note latérale intéressante est que si j'exécute les coordonnées GPS via une méthode Haversine, je reçois des calculs de distance très précis qui donnent des valeurs de périmètre précises.


Désolé pour la réponse tardive, terminé par l'utilisation du Geoid WGS84 avec la bibliothèque Java Proj4. Travaillé bien, merci pour l'aide.



3
votes

Je modifie une carte Google afin qu'un utilisateur puisse calculer la zone d'un polygone en cliquant sur les sommets. Ça ne donnait pas correct Zones jusqu'à ce que je me suis assuré que le Math.Cos (Latanchhor) était dans les radians d'abord

donc: xxx

est devenu: xxx

Où Lon, Lonanchhor et Latinchor sont en degrés. Fonctionne comme un charme maintenant.


0 commentaires

8
votes

J'ai vérifié sur Internet pour divers formules de zone de polygone (ou code) mais n'a trouvé aucun bien ou facile à mettre en œuvre.

Maintenant, j'ai écrit l'extrait de code pour calculer la zone d'un polygone dessiné sur la surface de la Terre. Le polygone peut avoir n sommets avec chaque sommet a sa propre longitude de latitude. P>

quelques points importants forts> p>

  1. L'entrée de la matrice à cette fonction aura des éléments "N + 1". Le dernier élément aura les mêmes valeurs que celle de la première. Li>
  2. J'ai écrit le code C # très basique, afin que les gars puissent également l'adapter dans une autre langue. Li>
  3. 6378137 est la valeur du rayon de la terre en mètres. Li>
  4. La zone de sortie aura une unité de mètres carrés p>

    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 += ConvertToRadian(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;
    }
    


4 commentaires

J'ai essayé votre code mais quelque chose ne va pas. des idées? Voir: Code


vous avez mis "zone = zone * r * r / 2;" à l'intérieur de la boucle pendant que cela devrait être une boucle extérieure.


Je pense que vous devriez convertir p1.longitude et p2.longitude aux radians aussi. Après cette modification, j'ai eu un résultat vraiment similaire que j'ai reçu de google.maps.getometry.sphérical.cuTrea fonction.


Après correction, cela semble bien. Et est très similaire que getgeodesicarea en couches ouvertes (partie de projection moins). Voir: Github.com/openlayers/ OpenLayers / Blob / V2.13.1 / Lib / Openlayers / ...



0
votes

Basé sur la solution de Paysy Pathak Voici la solution pour SQL (Redshift) pour calculer les zones pour Geojson Multiplolygons (avec l'hypothèse que la linetring 0 est le polygone le plus externe) xxx


0 commentaires

0
votes

Snippet de Riskathak adapté à PHP

function CalculatePolygonArea($coordinates) {
    $area = 0;
    $coordinatesCount = sizeof($coordinates);
    if ($coordinatesCount > 2) {
      for ($i = 0; $i < $coordinatesCount - 1; $i++) {
        $p1 = $coordinates[$i];
        $p2 = $coordinates[$i + 1];
        $p1Longitude = $p1[0];
        $p2Longitude = $p2[0];
        $p1Latitude = $p1[1];
        $p2Latitude = $p2[1];
        $area += ConvertToRadian($p2Longitude - $p1Longitude) * (2 + sin(ConvertToRadian($p1Latitude)) + sin(ConvertToRadian($p2Latitude)));
      }
    $area = $area * 6378137 * 6378137 / 2;
    }
    return abs(round(($area));
}

function ConvertToRadian($input) {
    $output = $input * pi() / 180;
    return $output;
}


0 commentaires

0
votes

Merci Risky Pathak!

Dans l'esprit de partage, voici mon adaptation à Delphi: P>

interface

uses 
  System.Math; 

TMapGeoPoint = record
  Latitude: Double;
  Longitude: Double;
end;


function AreaInAcres(AGeoPoints: TList<TMapGeoPoint>): Double;

implementation

function AreaInAcres(AGeoPoints: TList<TMapGeoPoint>): Double;
var
  Area: Double;
  i: Integer;
  P1, P2: TMapGeoPoint;
begin
 Area := 0;

 // We need at least 2 points
 if (AGeoPoints.Count > 2) then
 begin
   for I := 0 to AGeoPoints.Count - 1 do
   begin
     P1 := AGeoPoints[i];
     if i < AGeoPoints.Count - 1  then
       P2 := AGeoPoints[i + 1]
     else
       P2 := AGeoPoints[0];
     Area := Area + DegToRad(P2.Longitude - P1.Longitude) * (2 + 
        Sin(DegToRad(P1.Latitude)) + Sin(DegToRad(P2.Latitude)));
    end;

    Area := Area * 6378137 * 6378137 / 2;

  end;

  Area := Abs(Area); //Area (in sq meters)

  // 1 Square Meter = 0.000247105 Acres
  result := Area * 0.000247105;
end;


0 commentaires

0
votes

Snippet de Riskathak adapté à Ruby

def deg2rad(input)
  input * Math::PI / 180.0
end

def polygone_area(coordinates)
  return 0.0 unless coordinates.size > 2

  area = 0.0
  coor_p = coordinates.first
  coordinates[1..-1].each{ |coor|
    area += deg2rad(coor[1] - coor_p[1]) * (2 + Math.sin(deg2rad(coor_p[0])) + Math.sin(deg2rad(coor[0])))
    coor_p = coor
  }

  (area * 6378137 * 6378137 / 2.0).abs # 6378137 Earth's radius in meters
end


0 commentaires