在谷歌地图上绘制的多边形面积计算

22

我正在寻找一种精确的算法或服务,用于根据GPS坐标计算地球表面积。

我正在使用Google地图API版本3,并根据记录的坐标绘制多边形,但我认为标准的计算多边形面积的方式不会考虑到斜坡(山丘)因素。我需要针对这种情况处理等高线吗?

是否有第三方服务可以考虑斜坡因素,例如ArcGis或其他服务。

2个回答

49

这个API会考虑到地形的高程吗?我将从GPS设备获取坐标。 - Kunal
1
不,它假设地球是一个完美的光滑球体。听起来你真正想要的是数字高程模型的表面积。这可以通过GRASS GIS中的r.surf.area函数计算,但如果你想了解更多,最好在gis.stackexchange.com上提问。 - Spacedman
2
@Google 你是谷歌,难道找不到吗? :-D 抱歉,我不知道有没有替代链接。我会保留这个链接,以防有人想在archive.org上找到它。无论如何,那行代码就是你要找的,你可以在文档中了解更多信息。 - Brad
@Brad,geojason.info的链接已经失效。 - knownasilya
在加载谷歌地图时,请不要忘记包含几何库(最初这里的computeArea调用未能正常工作)--请参见此处 - Greg Sadetsky
显示剩余2条评论

11

布拉德的答案

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

这是正确的,但要注意,它仅适用于不自相交的多边形。当多边形开始自相交时,事情就会变得非常糟糕。您可以使用Brad提供的链接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


你能否为你在这个答案中展示的代码提供一个 JSFiddle?这将更有帮助。 - Pawan Gupta
@PawanGupta 这里有一个 JSFiddle,是由报告中的某个人创建的 http://jsfiddle.net/kaiser/VjQjg/。检查你的控制台,你会发现错误计算的输出内容。 - Kostis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接