web-dev-qa-db-fra.com

Calcul de l'aire d'un polygone dessiné sur google map

Je recherche un algorithme précis ou un service pour calculer la surface sur terre où les points sont calculés sur la base des coordonnées GPS.

J'utilise Google Map Api version 3 et je dessine des polygones sur la base de coordonnées enregistrées, mais je ne pense pas que les méthodes standard de calcul de l'aire du polygone tiendront compte des pentes (collines). Dois-je travailler sur les contours pour une telle chose?

Existe-t-il des services tiers peuvent être ArcGis ou un autre qui prend également en compte les pentes.

20
Kunal Uppal

Oui, c'est définitivement possible. Il y a un tutoriel rapide avec un exemple de code ici:

https://web.archive.org/web/20130301120148/http://geojason.info/demos/line-length-polygon-area-google-maps-v

La partie pertinente est la suivante:

google.maps.geometry.spherical.computeArea(yourPolygon.getPath());

Documentation officielle:

http://code.google.com/apis/maps/documentation/javascript/reference.html#spherical

40
Brad

La réponse de Brad

google.maps.geometry.spherical.computeArea(yourPolygon.getPath());

est correct, mais attention, il ne s'applique qu'aux polygones qui ne s'entrecoupent pas. Lorsque le polygone commence à s'entrecroiser, les choses vont terriblement mal. Vous pouvez l'essayer avec le lien que Brad a donné http://geojason.info/demos/line-length-polygon-area-google-maps-v3/ . Tracez simplement 4-5 lignes qui se croisent et commencez à jouer avec les sommets. Le calcul de l'aire paraîtra certainement faux.

Si vous n'êtes pas convaincu, voici un exemple:

   var map;

    google.maps.visualRefresh = true;

    google.maps.event.addDomListener(window, 'load', initialize);

    function initialize() {
        var mapOptions = {
            center : new google.maps.LatLng(55.874, -4.287),
            zoom : 16,
            mapTypeId : google.maps.MapTypeId.ROADMAP
        };
        map = new google.maps.Map(document.getElementById("map-canvas"), mapOptions)

        drawExample();
    }

    function drawExample() {
        var pathLeft = [new google.maps.LatLng(55.874, -4.292),
            new google.maps.LatLng(55.875, -4.292),
            new google.maps.LatLng(55.875, -4.290),
            new google.maps.LatLng(55.876, -4.290),
            new google.maps.LatLng(55.876, -4.291),
            new google.maps.LatLng(55.874, -4.291)]

        var polygonLeft = new google.maps.Polygon({
            path : pathLeft,
            map: map
        });

        var areaLeft = google.maps.geometry.spherical.computeArea(polygonLeft.getPath());

        var pathRight = [new google.maps.LatLng(55.874, -4.282),
            new google.maps.LatLng(55.875, -4.282),
            new google.maps.LatLng(55.875, -4.280),
            new google.maps.LatLng(55.8753, -4.2807),
            new google.maps.LatLng(55.876, -4.281),
            new google.maps.LatLng(55.874, -4.281)]

        var polygonRight = new google.maps.Polygon({
            path : pathRight,
            map: map
        });

        var areaRight = google.maps.geometry.spherical.computeArea(polygonRight.getPath());

        console.log("areaLeft: " + areaLeft + "\nareaRight: " + areaRight);
    }

Le rapport de bogue http://code.google.com/p/gmaps-api-issues/issues/detail?id=5624&colspec=ID%20Type%20Status%20Introduced%20Fixed%20Summary%20Stars%20ApiType%20Internal&start = 700 # makechanges

10
Kostis