Cesium 计算多边形面积

将多边形分解成三角形,计算多个三角形面积后进行累加得出多边形面积

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

  • 33
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值