美文网首页
地理多边形面积计算

地理多边形面积计算

作者: 很好就这样吧 | 来源:发表于2022-06-30 23:50 被阅读0次

    有个使用leaflet.pm绘制多边形后计算面积的需求,
    绘制后拿到的点阵信息如下:

    [
      {lat:39.96493472183506,lng:116.29163503646852},
      {lat:39.967401572621604,lng:116.29169940948488},
      {lat:39.967401572621604,lng:116.29515409469606},
      {lat:39.964836052530494,lng:116.29513263702394}
    ]
    

    搜索解决方法有以下几种:
    1、使用数学公式计算;
    2、使用第三方工具计算,如turf.js这是个地理空间分析库,可处理各种地图算法
    官网:http://turfjs.org/
    中文网:https://turfjs.fenxianglu.cn/
    3、使用超图的地图服务计算,参考文章:https://www.lmlphp.com/user/57791/article/item/1461826/

    由于我需求简单,所以选择了直接使用数学公式计算,可减少代码体积。
    如果需求复杂,需要多种计算和判断的话,推荐turf.js,工具函数超多

    // 1、使用数学公式计算
    export function computeSignedArea(path) {
      let radius = 6371009
      let len = path.length;
      if (len < 3) return 0;
      let total = 0;
      let prev = path[len - 1];
      let prevTanLat = Math.tan(((Math.PI / 2 - prev.lat / 180 * Math.PI) / 2));
      let prevLng = (prev.lng) / 180 * Math.PI;
      for (let i in path) {
        let tanLat = Math.tan((Math.PI / 2 -
          (path[i].lat) / 180 * Math.PI) / 2);
        let lng = (path[i].lng) / 180 * Math.PI;
        total += polarTriangleArea(tanLat, lng, prevTanLat, prevLng);
        prevTanLat = tanLat;
        prevLng = lng;
      }
      let area = Math.abs(total * (radius * radius))
      return (area / 1000000).toFixed(2);  // 我的面积单位是平方公里
    }
    function polarTriangleArea(tan1, lng1, tan2, lng2) {
      let deltaLng = lng1 - lng2;
      let t = tan1 * tan2;
      return 2 * Math.atan2(t * Math.sin(deltaLng), 1 + t * Math.cos(deltaLng));
    }
    

    相关文章

      网友评论

          本文标题:地理多边形面积计算

          本文链接:https://www.haomeiwen.com/subject/vfiqbrtx.html