web-dev-qa-db-ja.com

グーグルマップに描かれたポリゴンの面積を計算する

GPS座標に基づいてポイントが計算される地球上の表面積を計算するための正確なアルゴリズムまたはサービスを探しています。

私はGoogle Map Apiバージョン3を使用しており、記録された座標に基づいてポリゴンを描画していますが、ポリゴンの面積を計算する標準的な方法では、傾斜(丘)が考慮されていないと思います。そのようなことのために輪郭に取り組む必要がありますか?

サードパーティのサービスには、ArcGisやスロープを考慮したその他のサービスがありますか?.

20
Kunal Uppal

はい、これは間違いなく可能です。ここにサンプルコードのクイックチュートリアルがあります:

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

関連する部分はこれです:

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

公式ドキュメント:

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

40
Brad

ブラッドの答え

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

正しいですが、注意してください、それは自己交差しないポリゴンにのみ適用されます。ポリゴンが自己交差し始めると、事態はひどく間違っています。ブラッドのリンク http://geojason.info/demos/line-length-polygon-area-google-maps-v3/ で試してみることができます。 4-5本の交差する線を描き、頂点で遊んでください。面積計算は間違いなく間違っているように見えます。

確信が持てない場合は、次の例をご覧ください。

   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);
    }

バグレポート 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