将多边形分解成三角形,计算多个三角形面积后进行累加得出多边形面积
let radiansPerDegree = Math.PI / 180.0;//角度转化为弧度(rad)
let degreesPerRadian = 180.0 / Math.PI;//弧度转化为角度
// 方向
const Bearing = (from, to) => {
let fromCartographic = Cesium.Cartographic.fromCartesian(from)
let toCartographic = Cesium.Cartographic.fromCartesian(to)
let lat1 = fromCartographic.latitude * radiansPerDegree;
let lon1 = fromCartographic.longitude * radiansPerDegree;
let lat2 = toCartographic.latitude * radiansPerDegree;
let lon2 = toCartographic.longitude * radiansPerDegree;
let angle = -Math.atan2(Math.sin(lon1 - lon2) * Math.cos(lat2), Math.cos(lat1) * Math.sin(lat2) - Math.sin(lat1) * Math.cos(lat2) * Math.cos(lon1 - lon2))
if (angle < 0) {
angle += Math.PI * 2.0
}
angle = angle * degreesPerRadian;//角度
return angle
}
// 角度
const pointAngle = (point1, point2, point3) => {
let bearing21 = Bearing(point2, point1)
let bearing23 = Bearing(point2, point3)
let angle = bearing21 - bearing23
if (angle < 0) {
angle += 360
}
return angle
}
const getLength = (start, end) => {
// 将起点与终点位置信息从笛卡尔坐标形式转换为Cartographic形式
let startCartographic = Cesium.Cartographic.fromCartesian(start)
let endCartographic = Cesium.Cartographic.fromCartesian(end)
/**根据经纬度计算出距离**/
let geodesic = new Cesium.EllipsoidGeodesic()
// 地线起点和终点
geodesic.setEndPoints(startCartographic, endCartographic)
let sfd = geodesic.surfaceDistance;
sfd = Math.sqrt(Math.pow(sfd, 2) + Math.pow(endCartographic.height - startCartographic.height, 2));
return sfd
}
//计算面积
const getMarkArea = (positions) => {
let res = 0
for (let i = 0; i < positions.length - 2; i++) {
let j = (i + 1) % positions.length
let k = (i + 2) % positions.length
let totalAngle = pointAngle(positions[i], positions[j], positions[k])
let tempLength1 = getLength(positions[i], positions[j])
let tempLength2 = getLength(positions[j], positions[k])
res += tempLength1 * tempLength2 * Math.abs(Math.sin(totalAngle))
}
return res.toFixed(2)
}
参考:
https://blog.csdn.net/irisMoon06/article/details/129119260?spm=1001.2014.3001.5506
https://blog.csdn.net/qq_40323256/article/details/128178560?spm=1001.2014.3001.5506
https://blog.csdn.net/qq_39390694/article/details/89326671