地理多边形面积计算

2022-06-30  本文已影响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));
}
上一篇下一篇

猜你喜欢

热点阅读