便签贴附:等待地形provider就绪后再采样
This commit is contained in:
@@ -343,14 +343,32 @@ export class CesiumGlobe {
|
|||||||
// 把便签锚点贴到地形表面(否则在椭球面高度 0 上,放大旋转时会飘)
|
// 把便签锚点贴到地形表面(否则在椭球面高度 0 上,放大旋转时会飘)
|
||||||
async _clampMarkersToTerrain() {
|
async _clampMarkersToTerrain() {
|
||||||
const scene = this.viewer.scene;
|
const scene = this.viewer.scene;
|
||||||
const tp = scene && scene.terrainProvider;
|
if (!scene) return;
|
||||||
if (!tp) return;
|
|
||||||
|
// 等待地形 provider 就绪(setTerrain 是异步的,调用时 provider 可能还没准备好)
|
||||||
|
let tp = scene.terrainProvider;
|
||||||
|
if (!tp) {
|
||||||
|
tp = await new Promise((resolve) => {
|
||||||
|
const started = Date.now();
|
||||||
|
const poll = () => {
|
||||||
|
const p = scene.terrainProvider;
|
||||||
|
if (p) { resolve(p); return; }
|
||||||
|
if (Date.now() - started > 30000) { resolve(undefined); return; }
|
||||||
|
setTimeout(poll, 500);
|
||||||
|
};
|
||||||
|
poll();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
if (!tp) {
|
||||||
|
console.warn('[CesiumGlobe] 地形 provider 未就绪,便签保持椭球面高度');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
const cartos = this.markers.map((m) =>
|
const cartos = this.markers.map((m) =>
|
||||||
Cesium.Cartographic.fromDegrees(m.lng, m.lat),
|
Cesium.Cartographic.fromDegrees(m.lng, m.lat),
|
||||||
);
|
);
|
||||||
try {
|
try {
|
||||||
// 用固定层级 15(约 30m)采样:ArcGIS 高程服务没有 availability,
|
// 固定层级 15(约 30m):ArcGIS 高程服务无 availability,不用 sampleTerrainMostDetailed
|
||||||
// sampleTerrainMostDetailed 会 reject,改用 sampleTerrain 更稳。
|
|
||||||
await Cesium.sampleTerrain(tp, 15, cartos);
|
await Cesium.sampleTerrain(tp, 15, cartos);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
console.warn('[CesiumGlobe] 地形高度采样失败,便签保持椭球面高度:', err);
|
console.warn('[CesiumGlobe] 地形高度采样失败,便签保持椭球面高度:', err);
|
||||||
|
|||||||
Reference in New Issue
Block a user