V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
jarlyyn
V2EX  ›  问与答

百度地图算面积的开源库是逗你玩的吗?

  •  
  •   jarlyyn · 2015-04-19 00:41:42 +08:00 · 5135 次点击
    这是一个创建于 3266 天前的主题,其中的信息可能已经有所发展或是发生改变。

    应为业务需要,需要紧急做一个计算面积的功能。

    写了一个简单的demo,然后一测试,崩溃了。

    计算多边形大量负数/天文数字面积我也忍了。毕竟多边形难计算。

    可是我画个直角三角形,再多个点补充为矩形面积会变小是什么意思?

    好吧,我忍,可我画个三角形,面积会是负数,我无语了啊。我哭了啊。

    相关的测试代码大概是这样的

    map.centerAndZoom(point, 22);
                        map.addEventListener('click',function(e){
                          var point=new BMap.Point(e.point.lng,e.point.lat);
                          points.push(point);
                          polygon.setPath(points);
                          area=BMapLib.GeoUtils.getPolygonArea(points);
                          $('#area').html(area.toFixed(0)+'平方米')
                        })
    

    好吧,继续找有没有算面积的代码,谁叫我算法差呢。

    7 条回复    2015-04-24 19:07:47 +08:00
    Septembers
        1
    Septembers  
       2015-04-19 01:13:30 +08:00 via Android
    百度已经有很多API和文档对不上了
    sumhat
        2
    sumhat  
       2015-04-19 02:48:27 +08:00
    从算法来说,算出来负数应该是向量方向搞错了,你在添加顶点的时候按顺序来,可能可以避免这类问题。不过多边形面积是向量类的基础算法了,能写错也真是丢脸。
    xiaofami
        3
    xiaofami  
       2015-04-19 06:14:29 +08:00 via Android
    QGIS是开源的,可以参考一下面积算法。
    laoyuan
        4
    laoyuan  
       2015-04-19 08:07:48 +08:00
    关键就是按顺序来,按逆时针顺序应该就可以了
    jarlyyn
        5
    jarlyyn  
    OP
       2015-04-19 13:18:02 +08:00
    找了个 算法。

    http://bbs.csdn.net/topics/330043103

    试了下基本还算靠谱,不过的大了大概1.4左右

    估计是有什么系数我乘错了。
    dingyaguang117
        6
    dingyaguang117  
       2015-04-19 14:24:24 +08:00
    多边形面积先顶点排序,然后分割三角形算一下加起来就是了吧
    jarlyyn
        7
    jarlyyn  
    OP
       2015-04-24 19:07:47 +08:00
    精度问题是因为纬度和米的换算的误差造成的。

    具体可以使用

    http://tech.meituan.com/lucene-distance.html

    中4.2的方法。

    以地一个点为原点,把每个点换算一下,再计算面积。

    大概是这样的js

    var convertPoint=function(point,point0)
    {
    var result={}
    var dx=point.lng-point0.lng;
    var dy=point.lat-point0.lat;
    b=(point.lat+point0.lat)/2;
    result.lat=degreeToRad(dy);
    result.lng=degreeToRad(dx)*Math.cos(degreeToRad(b));
    return result;
    }
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5255 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 09:37 · PVG 17:37 · LAX 02:37 · JFK 05:37
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.