From d4e099950634a5fd0031a80b511b8a0bdf945f60 Mon Sep 17 00:00:00 2001 From: fukunee Date: Sat, 19 Sep 2026 17:19:46 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BE=BF=E7=AD=BE=E5=9C=B0=E5=BD=A2=E9=87=87?= =?UTF-8?q?=E6=A0=B7=E6=94=B9=E7=94=A8=E5=9B=BA=E5=AE=9A=E5=B1=82=E7=BA=A7?= =?UTF-8?q?=20sampleTerrain=EF=BC=8C=E5=B9=B6=E8=BE=93=E5=87=BA=E8=B4=B4?= =?UTF-8?q?=E9=99=84=E6=95=B0=E9=87=8F=E6=97=A5=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/scene/CesiumGlobe.js | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/scene/CesiumGlobe.js b/src/scene/CesiumGlobe.js index f523d16..12db1df 100644 --- a/src/scene/CesiumGlobe.js +++ b/src/scene/CesiumGlobe.js @@ -343,24 +343,30 @@ export class CesiumGlobe { // 把便签锚点贴到地形表面(否则在椭球面高度 0 上,放大旋转时会飘) async _clampMarkersToTerrain() { const scene = this.viewer.scene; - if (!scene || !scene.globe || !scene.terrainProvider) return; + const tp = scene && scene.terrainProvider; + if (!tp) return; const cartos = this.markers.map((m) => Cesium.Cartographic.fromDegrees(m.lng, m.lat), ); try { - await Cesium.sampleTerrainMostDetailed(scene.terrainProvider, cartos); + // 用固定层级 15(约 30m)采样:ArcGIS 高程服务没有 availability, + // sampleTerrainMostDetailed 会 reject,改用 sampleTerrain 更稳。 + await Cesium.sampleTerrain(tp, 15, cartos); } catch (err) { console.warn('[CesiumGlobe] 地形高度采样失败,便签保持椭球面高度:', err); return; } + let clamped = 0; for (let i = 0; i < this.markers.length; i++) { const h = cartos[i] && cartos[i].height; if (h != null && isFinite(h)) { const m = this.markers[i]; m.position = Cesium.Cartesian3.fromDegrees(m.lng, m.lat, h); m.r2 = Cesium.Cartesian3.magnitudeSquared(m.position); + clamped++; } } + console.log(`[CesiumGlobe] 便签已贴附地形:${clamped}/${this.markers.length}`); } // 便签用 DOM 覆盖层渲染:始终在城市/国家名上层,且缩放到最近也不会漂移