尝试一下在线预览此示例演示如何使用 LineOfSight widget 微件检查从 SceneView 中的观察者视点是否可以看到一个或多个目标。
在此示例中,观察者设置在现有建筑物的上层。该示例显示了如果在其前面建造了新建筑物,观察者的视线是如何受到阻碍的。打开和关闭开发层,看看河流的景色是如何被遮挡的。移动观察者或目标以探索视野不受阻碍的点。点击 Continue analysis
将更多目标添加到分析中。
可以使用以下代码片段将微件添加到场景中:
1
2
3
4
5
const lineOfSight = new LineOfSight({
view: view
});
view.ui.add(lineOfSight, "top-right");
LineOfSightViewModel 可用于最初添加观察者和多个目标点。
1
2
3
4
5
6
7
8
9
10
11
12
13
const viewModel = lineOfSight.viewModel;
viewModel.observer = new Point({
latitude: 42.3521,
longitude: -71.0559,
z: 147.139
});
viewModel.targets = [
createTarget(42.3492, -71.0529),
createTarget(42.3477, -71.0542)
];
这些属性也可用于监视更改,例如添加或移动新目标或观察者。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// watch when the observer changes
viewModel.watch("observer", () => {
setIntersectionMarkers();
});
// watch when a new target is added or removed
viewModel.targets.on("change", (event) => {
event.added.forEach((target) => {
setIntersectionMarkers();
// for each target watch when the intersection changes
target.watch("intersectedLocation", () => {
setIntersectionMarkers();
});
});
});
LineOfSightTarget 类允许访问分析结果,例如交叉点的位置或阻碍从观察者到目标的视图的图形。
1
2
3
4
5
6
7
8
9
viewModel.targets.forEach((target) => {
if (target.intersectedLocation) {
const graphic = new Graphic({
symbol: intersectionSymbol,
geometry: target.intersectedLocation
});
view.graphics.add(graphic);
}
});