测距分为:空间距离和贴地距离;
测面积分为:水平面积和贴地面积。
文章来源地址https://uudwc.com/A/k14j
下面讲解这4个工具的相关思路和代码:
1、空间距离
思路:
Cesium.Cartesian3.distance()计算出两点之间的距离
一条线上的所有点,每2个点依次计算距离,汇总之后得到总长度。
代码:
let lengthAll = 0;
for (let i = 0; i < arrPosCartesian3.length - 1; i++) {
let cartesianFirst = arrPosCartesian3[i];
let cartesianSecond = arrPosCartesian3[i + 1];
let lengthSegment = Cesium.Cartesian3.distance(
cartesianFirst,
cartesianSecond
);
lengthAll += lengthSegment;
}
return lengthAll;
2、贴地距离
思路:
1、Cesium.Cartesian3.lerp()根据点击的所有点,在中间插值出多个点
2、对于插值点,获取实际对应的高度点后,计算距离来作为贴地距离
代码:
let step = 1; //抽稀的时候用
for (let i = 0; i < arrCartoClamped.length - 2; i += step) {
let cartoStart = arrCartoClamped[i];
let cartoEnd = arrCartoClamped[i + step];
cartoStart.height = globe.getHeight(cartoStart);
cartoEnd.height = globe.getHeight(cartoEnd);
let lengthOf2Point = CartographicUtil.getDistanceFrom2Cartographic(
cartoStart,
cartoEnd
);
lengthALl += lengthOf2Point;
}
3、水平面积
思路:
面也是一个点、一个点的单击出来的
如上图,依次点击1、2、3、4、5共五个点,形成了一个多边形
计算面积就是依次对所有三角形的面积求和
即:
三角形1、2、3
三角形1、3、4
三角形1、4、5
上述所有三角形的面积和就是多边形的面积。
三角形面积,可以使用叉积来求得
代码:
function getAreaFromArrayCartesians(arrCartesian3) {
let areaAll = 0;
let cartesianFirst = arrCartesian3[0];
for (let i = 1; i < arrCartesian3.length - 1; i++) {
let cartesianStart = arrCartesian3[i];
let cartesianEnd = arrCartesian3[i + 1];
let vecStart = Cesium.Cartesian3.subtract(
cartesianStart,
cartesianFirst,
new Cesium.Cartesian3()
);
let vecEnd = Cesium.Cartesian3.subtract(
cartesianEnd,
cartesianFirst,
new Cesium.Cartesian3()
);
let vecCross = Cesium.Cartesian3.cross(
vecStart,
vecEnd,
new Cesium.Cartesian3()
);
let areaTriangle = Cesium.Cartesian3.magnitude(vecCross) * 0.5;
areaAll += areaTriangle;
}
return areaAll;
}
4、贴地面积
文章来源:https://uudwc.com/A/k14j