【问题标题】:Calculating area of a polygon drawn on google map计算在谷歌地图上绘制的多边形的面积
【发布时间】:2012-02-20 15:58:51
【问题描述】:

我正在寻找一种精确的算法或服务来计算地球上的表面积,其中的点是根据 GPS 坐标计算的。

我使用的是 Google Map Api 版本 3,并且正在根据记录的坐标绘制多边形,但我认为计算多边形面积的标准方法不会考虑坡度(山)。我需要为这样的事情处理轮廓吗?

是否有任何第三方服务可能是 ArcGis 或其他考虑坡度的服务。

【问题讨论】:

    标签: google-maps map google-maps-api-3 gps polygon


    【解决方案1】:

    是的,这绝对是可能的。这里有一个带有示例代码的快速教程:

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

    相关部分是这样的:

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

    官方文档:

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

    【讨论】:

    • 这个 API 会考虑土地的海拔高度吗?我将从 GPS 设备获取坐标。
    • 不,它假定一个完美光滑的球形地球。听起来您真正想要的是数字高程模型的表面积。这可以通过 GRASS GIS 中的 r.surf.area 函数计算,但如果您想了解更多信息,您可能应该在 gis.stackexchange.com 上询问
    • @Brad 嘿,我打开了第一个链接,但找不到页面。你能发给我其他相关的链接吗?
    • @Google 你是 Google,你找不到吗? :-D 抱歉,我不知道替换链接。如果有人想在archive.org 上找到它,我会保留链接。无论如何,该行就是您要查找的内容,您可以在文档中阅读有关它的更多信息。
    • @Brad ya 我是谷歌,但有时谷歌也会对此感到困惑。bdw 我想在两个地方之间画线路径。
    【解决方案2】:

    布拉德的回答

    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

    【讨论】:

    • 能否请您提一下您在此答案中显示的代码。这会更有帮助。
    • @PawanGupta 这是错误报告中某人创建的 jsfiddle jsfiddle.net/kaiser/VjQjg 检查您的控制台,您会发现计算错误的输出
    猜你喜欢
    • 2012-07-03
    • 2018-06-26
    • 2015-05-04
    • 1970-01-01
    • 1970-01-01
    • 2012-05-31
    • 2012-10-14
    • 2020-06-28
    • 1970-01-01
    相关资源
    最近更新 更多