百度地图 - 基础学习(7): 折线构成闭合图形面积计算

时间:2021-01-08 17:40:00 来源:互联网 作者: 神秘的大神 字体:

前面  GeoUtils 类可以很好的计算密闭多边形、矩形框出的区域面积,但没有解决折线自相交框出的区域面积计算,这就需要开发人员自己去解决了。

度娘了几篇文章,最终找到了一个计算方法,经实测效果不错,结果也比较精准。

// 计算图形面积
// path:[{lat:,lng:}],[{lat:,lng:}],[{lat:,lng:}]  路劲坐标点数组
computeSignedArea(path) {
  let radius = 6370996.81; // 地球平均半径
  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 = 0; i < len; i++) {
    let tanLat = Math.tan(
      (Math.PI / 2 - (path[i].lat / 180) * Math.PI) / 2
    );
    let lng = (path[i].lng / 180) * Math.PI;
    total += this.polarTriangleArea(tanLat, lng, prevTanLat, prevLng);
    prevTanLat = tanLat;
    prevLng = lng;
  }
  return Math.abs(total * (radius * radius));
},


// 计算图形面积
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));
}

 

方法使用也比较简单,直接将自相交折线 各个点的坐标组成一个数组,传入 computeSignedArea(path) 就行。

由于方法返回的面积是以平方米作为单位的,所以需要处理下(毕竟地图区域那么大,以平方米计算,数字显得很大,但区域却不见得有多大。故用平方千米作为单位,以此来和我大中国960万平方千米比较,显得你这个区域有多大点)

geoUtilsValue = that.computeSignedArea(overlayList) / 1000000 + "平方千米";

 

参考博文链接:https://blog.csdn.net/qq_38615014/article/details/89207005