From 10b2b7788723ac49025455e001a1ed0ee92edab6 Mon Sep 17 00:00:00 2001 From: fukunee Date: Sat, 19 Sep 2026 17:23:15 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BE=BF=E7=AD=BE=E8=B4=B4=E9=99=84=EF=BC=9A?= =?UTF-8?q?=E7=AD=89=E5=BE=85=E5=9C=B0=E5=BD=A2provider=E5=B0=B1=E7=BB=AA?= =?UTF-8?q?=E5=90=8E=E5=86=8D=E9=87=87=E6=A0=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/scene/CesiumGlobe.js | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/scene/CesiumGlobe.js b/src/scene/CesiumGlobe.js index 12db1df..a4c9ce9 100644 --- a/src/scene/CesiumGlobe.js +++ b/src/scene/CesiumGlobe.js @@ -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);