/** * 地图助手(Mapbox) * replace/restore 移动 #map 容器后必须 resize() */ class MapHelper { _map = null _originParent = null _savedView = null setMap(map) { this._map = map } getMap() { return this._map } toggleMapMode({ is2D = false, is3D = false } = {}) { if (!this._map) return if (is3D) { this._map.easeTo({ pitch: 45, bearing: 0, duration: 0 }) this._map.dragRotate.enable() this._map.touchZoomRotate.enableRotation() this._map.dragRotate.enablePitch?.() this._map.touchPitch?.enable?.() } if (is2D) { // 只锁俯仰/旋转;投影由 setProjection 单独控制 // 监控要 globe 圆形地球,航线编辑要 mercator this._map.easeTo({ pitch: 0, bearing: 0, duration: 0 }) this._map.dragRotate.disable() this._map.touchZoomRotate.disableRotation() this._map.dragRotate.disablePitch?.() this._map.touchPitch?.disable?.() } } setProjection(name) { if (!this._map || !name) return try { this._map.setProjection(name) } catch (_) { /* ignore */ } } replaceMapContainer(newParent) { if (!this._map || !newParent) return const el = this._map.getContainer() this._originParent = this._originParent || el.parentNode const c = this._map.getCenter() this._savedView = { center: [c.lng, c.lat], zoom: this._map.getZoom(), pitch: this._map.getPitch(), bearing: this._map.getBearing(), } newParent.appendChild(el) this._map.resize() } restoreMapContainer() { if (!this._map || !this._originParent) return const el = this._map.getContainer() this._originParent.appendChild(el) if (this._savedView) { this._map.jumpTo({ center: this._savedView.center, zoom: this._savedView.zoom, pitch: this._savedView.pitch, bearing: this._savedView.bearing, }) } this._map.resize() this._originParent = null this._savedView = null } } const g = typeof globalThis !== 'undefined' ? globalThis : undefined const singleton = (g && g.__LAIC_MAP_HELPER__) || new MapHelper() if (g) g.__LAIC_MAP_HELPER__ = singleton export default singleton