便签贴附:等待地形provider就绪后再采样

This commit is contained in:
2026-09-19 17:23:15 +08:00
parent d4e0999506
commit 10b2b77887
+22 -4
View File
@@ -343,14 +343,32 @@ export class CesiumGlobe {
// 把便签锚点贴到地形表面(否则在椭球面高度 0 上,放大旋转时会飘)
async _clampMarkersToTerrain() {
const scene = this.viewer.scene;
const tp = scene && scene.terrainProvider;
if (!tp) return;
if (!scene) 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) =>
Cesium.Cartographic.fromDegrees(m.lng, m.lat),
);
try {
// 用固定层级 15(约 30m)采样:ArcGIS 高程服务没有 availability,
// sampleTerrainMostDetailed 会 reject,改用 sampleTerrain 更稳。
// 固定层级 15(约 30m):ArcGIS 高程服务无 availability,不用 sampleTerrainMostDetailed
await Cesium.sampleTerrain(tp, 15, cartos);
} catch (err) {
console.warn('[CesiumGlobe] 地形高度采样失败,便签保持椭球面高度:', err);