js根据经纬度计算多边形面积,折线段长度

1.面积计算
computeSignedArea(path) {
//传入path:[{lat:,lng:},{lat:,lng:}]
let _this = this;
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/180Math.PI) / 2));
let prevLng = (prev.lng)/180
Math.PI;
for (let i in path) {
let tanLat = Math.tan((Math.PI / 2 -
(path[i].lat)/180Math.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));
let areaResult = '';
if(area>100*1000){
areaResult = ((area/1000)/1000).toFixed(2)+"km²"
}else{
areaResult = area.toFixed(2)+"m²"
}
return areaResult;
}
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));
}

2.折线长度计算
getLineLength(arr) {
//传入arr:[{lat:,lng:},{lat:,lng:}]
let d = 0;
var _this = this;
arr.forEach((v, i) => {
if (i < arr.length - 1) {
d += getDistance(v.lat, v.lng, arr[i + 1].lat, arr[i + 1].lng);
}
});
if (d > 1) {
return d.toFixed(2) + "km"
} else {
return (d * 1000).toFixed(2) + "m";
}
}
getDistance(lat1, lng1, lat2, lng2) {
var radLat1 = lat1 * Math.PI / 180.0;
var radLat2 = lat2 * Math.PI / 180.0;
var a = radLat1 - radLat2;
var b = lng1 * Math.PI / 180.0 - lng2 * Math.PI / 180.0;
var s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2) +
Math.cos(radLat1) * Math.cos(radLat2) * Math.pow(Math.sin(b / 2), 2)));
s = s * 6378.137;
s = Math.round(s * 10000) / 10000;
return s;
}

posted @ 2020-12-07 14:13  KaypoGeng  阅读(1091)  评论(0)    收藏  举报