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

  • A+
所属分类:Web前端
摘要

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

前面  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 + "平方千米";

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

 

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