通视分析

检测观察点是否可视,设置起终点创建射线,通过求交函数pickFromRay计算与一段射线相交的碰撞点并返回相交点。最后绘制相交位置点,以此为分析点绘制通视线

环视分析(3dtileset)

通过绘制椭圆计算椭圆边的位置点,通过中心点和边界点计算线段差值。将计算的差值点数组与场景范围内的3dtileset数据,使用clampToHeightMostDetailed查询每个位置点与当前场景内的3dtileset的clipToHeight夹紧位置,通过线段差值计算相邻的两点高度是否递增

部分实现

射线求交实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
/**
* 获取相交对象
* @param {*} startPos
* @param {*} endPos
* @param {*} excludeArr
* @param {*} bDrillPick
*/
_getIntersectObj(startPos, endPos, excludeArr = [], bDrillPick = false) {
var viewer = this._viewer;
var direction = Cesium.Cartesian3.normalize(Cesium.Cartesian3.subtract(endPos, startPos, new Cesium.Cartesian3()), new Cesium.Cartesian3());
var ray = new Cesium.Ray(startPos, direction); //无限延长的射线

var results = [];

if (bDrillPick) {
results = viewer.scene.drillPickFromRay(ray, 10, excludeArr);
} else //只pick首个物体
{
var result = viewer.scene.pickFromRay(ray, excludeArr);
if (Cesium.defined(result)) {
results = [result];
}
}
return results;
}