有个使用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));
}
网友评论