- A+
所属分类:Web前端
前面 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