From 35db4003a1d3faffd4151458279cc61c198c78dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=85=B4=E5=87=AF?= <2448379534@qq.com> Date: Fri, 28 Aug 2026 10:08:15 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B0=86=E6=95=B0=E6=8D=AE=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E5=AD=90=E7=B3=BB=E7=BB=9F=E7=9A=84=E9=A1=B5=E9=9D=A2=E6=8C=AA?= =?UTF-8?q?=E5=88=B0=E5=85=A8=E8=BF=87=E7=A8=8B=E6=96=B0=E6=A1=86=E6=9E=B6?= =?UTF-8?q?=EF=BC=8C=E8=87=AA=E5=AE=9A=E4=B9=89=E7=AD=9B=E9=80=89=E5=88=97?= =?UTF-8?q?=E6=89=93=E5=BC=80=E6=97=B6=E4=BC=9A=E8=87=AA=E5=B7=B1=E5=88=B7?= =?UTF-8?q?=E6=96=B0=E8=A1=A8=E6=A0=BC=E4=B8=80=E4=B8=8B=EF=BC=8C=20?= =?UTF-8?q?=E7=8E=AF=E4=BF=9D=E6=95=B0=E6=8D=AE=E6=94=B9=E4=B8=BA=E7=9B=91?= =?UTF-8?q?=E6=B5=8B=E6=95=B0=E6=8D=AE=EF=BC=8C=E6=93=8D=E4=BD=9C=E5=88=97?= =?UTF-8?q?=E5=8E=BB=E6=8E=89,,,=E6=8A=8A=E5=9C=B0=E5=9B=BE=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=EF=BC=8C=E6=97=A0=E7=94=A8api,=E6=97=A0=E7=94=A8?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=EF=BC=8C=E7=BB=84=E4=BB=B6=E5=8E=BB=E6=8E=89?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../docs/地图模块-3D Cesium实施计划.md | 479 -- .../docs/地图模块-OpenLayers抽吸与碰撞分析.md | 343 -- .../docs/地图模块-抽吸规则与参数说明.md | 316 - frontend-sjgl/docs/地图模块-详细说明.md | 621 -- frontend-sjgl/docs/地图模块现状与改造方案.md | 1158 ---- frontend-sjgl/docs/地图模块重构实施清单.md | 380 -- frontend-sjgl/package.json | 11 +- frontend-sjgl/src/api/map.ts | 61 - .../src/assets/icons/locationIcon.png | Bin 162 -> 0 bytes .../src/assets/images/map-dixingtu.png | Bin 42802 -> 0 bytes .../src/assets/images/map-shiliangtu.png | Bin 19358 -> 0 bytes .../src/assets/images/map-yingxiangtu.png | Bin 39613 -> 0 bytes .../src/assets/images/nineSections-dixing.png | Bin 297595 -> 0 bytes .../assets/images/nineSections-shiliang.png | Bin 67410 -> 0 bytes .../assets/images/nineSections-yingxiang.png | Bin 310250 -> 0 bytes .../src/components/MapModal/setting.config.ts | 13 - frontend-sjgl/src/components/gis/GisView.vue | 195 - .../src/components/gis/TjCascadeChart.vue | 673 --- .../src/components/gis/TjLayerModal.vue | 537 -- frontend-sjgl/src/components/gis/gisUtils.ts | 537 -- .../src/components/gis/map.cesium.ts | 2809 --------- frontend-sjgl/src/components/gis/map.class.ts | 297 - frontend-sjgl/src/components/gis/map.d.ts | 245 - .../src/components/gis/map.leaflet.ts | 440 -- frontend-sjgl/src/components/gis/map.ol.ts | 2616 --------- .../src/components/gis/mapurlManage.ts | 759 --- .../components/gis/ol/point-layer-manager.ts | 391 -- .../src/components/gis/ol/popup-manager.ts | 530 -- .../components/gis/ol/region-mask-manager.ts | 341 -- frontend-sjgl/src/components/gis/osgbUtils.ts | 747 --- .../src/layout/components/Sidebar/index.vue | 17 - frontend-sjgl/src/main.ts | 4 +- frontend-sjgl/src/modules/jidiSelectorMod.vue | 110 - .../map/application/map-orchestrator.ts | 806 --- .../src/modules/map/domain/legend-deriver.ts | 147 - .../src/modules/map/domain/map-layer-rules.ts | 80 - .../modules/map/domain/nearby-point-rules.ts | 418 -- .../modules/map/stores/map-config.store.ts | 251 - .../src/modules/map/stores/map-data.store.ts | 192 - .../src/modules/map/stores/map-view.store.ts | 92 - frontend-sjgl/src/store/modules/map.ts | 1490 ----- .../src/store/modules/shuJuTianBao.ts | 1 + frontend-sjgl/src/utils/GisUrlList.ts | 5158 ----------------- .../tempMit/EditDwModal.vue | 4 +- .../shiPinJianKong/shiPinJianKongZhuanTi.vue | 1805 ------ frontend-sjgl/vite.config.ts | 3 - frontend/src/api/DataQueryMenuModule/index.ts | 153 + frontend/src/components/BasicTable/index.vue | 14 +- .../shuidianhuangjingjieruMod/DataTable.vue | 12 +- .../conventionalHydropower/Approval/index.vue | 2 +- .../BasicData/index.vue | 39 +- .../aiBox/AiBoxSearch.vue | 77 + .../conventionalHydropower/aiBox/index.vue | 214 + .../aquaEco/OtweSearch.vue | 118 + .../conventionalHydropower/aquaEco/index.vue | 203 + .../fishSurvey/FishSearch.vue | 117 + .../fishSurvey/index.vue | 222 + .../guoYuSheShi/FpSearch.vue | 40 + .../guoYuSheShi/index.vue | 219 + .../luShengShengTaiDiaoCha/TeSearch.vue | 117 + .../luShengShengTaiDiaoCha/index.vue | 186 + .../photoBase/PhotoSearch.vue | 121 + .../photoBase/index.vue | 275 + .../qiXiDi/FhSearch.vue | 80 + .../conventionalHydropower/qiXiDi/index.vue | 74 + .../rescueStation/VaSearch.vue | 118 + .../rescueStation/index.vue | 185 + .../shengTaiLiuLiang/EqSearch.vue | 42 + .../shengTaiLiuLiang/index.vue | 201 + .../shiPinJianKong/VdSearch.vue | 40 + .../shiPinJianKong/index.vue | 165 + .../shuiShengShengTaiDiaoCha/WeSearch.vue | 116 + .../shuiShengShengTaiDiaoCha/index.vue | 206 + .../shuiWenJianCe/WtSearch.vue | 116 + .../shuiWenJianCe/index.vue | 188 + .../shuiZhiJianCe/WqSearch.vue | 118 + .../shuiZhiJianCe/index.vue | 189 + .../sonarCam/SonarSearch.vue | 117 + .../conventionalHydropower/sonarCam/index.vue | 202 + .../spawnGround/EditSpawnModal.vue | 506 ++ .../spawnGround/SpawnSearch.vue | 121 + .../spawnGround/index.vue | 295 + .../tempMit/DwSearch.vue | 116 + .../conventionalHydropower/tempMit/index.vue | 200 + .../terrEco/OtteSearch.vue | 118 + .../conventionalHydropower/terrEco/index.vue | 202 + .../yunXingGaoJing/EditWarnModal.vue | 394 ++ .../yunXingGaoJing/WarnSearch.vue | 82 + .../yunXingGaoJing/index.vue | 255 + .../zengZhiFangLiu/FbSearch.vue | 92 + .../zengZhiFangLiu/index.vue | 259 + .../zhenXIZhiWuYuan/VpSearch.vue | 39 + .../zhenXIZhiWuYuan/index.vue | 197 + .../FlowStation/EditFlowStationModal.vue | 327 -- .../monitorData/FlowStation/index.vue | 74 +- .../SurfaceTemp/EditSurfaceTempModal.vue | 252 - .../monitorData/SurfaceTemp/index.vue | 79 +- .../VerticalTemp/EditVerticalTempModal.vue | 288 - .../monitorData/VerticalTemp/index.vue | 87 +- .../WaterData/EditWaterDataModal.vue | 405 -- .../monitorData/WaterData/index.vue | 79 +- .../conventionalHydropower.vue | 68 + 102 files changed, 7201 insertions(+), 26697 deletions(-) delete mode 100644 frontend-sjgl/docs/地图模块-3D Cesium实施计划.md delete mode 100644 frontend-sjgl/docs/地图模块-OpenLayers抽吸与碰撞分析.md delete mode 100644 frontend-sjgl/docs/地图模块-抽吸规则与参数说明.md delete mode 100644 frontend-sjgl/docs/地图模块-详细说明.md delete mode 100644 frontend-sjgl/docs/地图模块现状与改造方案.md delete mode 100644 frontend-sjgl/docs/地图模块重构实施清单.md delete mode 100644 frontend-sjgl/src/api/map.ts delete mode 100644 frontend-sjgl/src/assets/icons/locationIcon.png delete mode 100644 frontend-sjgl/src/assets/images/map-dixingtu.png delete mode 100644 frontend-sjgl/src/assets/images/map-shiliangtu.png delete mode 100644 frontend-sjgl/src/assets/images/map-yingxiangtu.png delete mode 100644 frontend-sjgl/src/assets/images/nineSections-dixing.png delete mode 100644 frontend-sjgl/src/assets/images/nineSections-shiliang.png delete mode 100644 frontend-sjgl/src/assets/images/nineSections-yingxiang.png delete mode 100644 frontend-sjgl/src/components/gis/GisView.vue delete mode 100644 frontend-sjgl/src/components/gis/TjCascadeChart.vue delete mode 100644 frontend-sjgl/src/components/gis/TjLayerModal.vue delete mode 100644 frontend-sjgl/src/components/gis/gisUtils.ts delete mode 100644 frontend-sjgl/src/components/gis/map.cesium.ts delete mode 100644 frontend-sjgl/src/components/gis/map.class.ts delete mode 100644 frontend-sjgl/src/components/gis/map.d.ts delete mode 100644 frontend-sjgl/src/components/gis/map.leaflet.ts delete mode 100644 frontend-sjgl/src/components/gis/map.ol.ts delete mode 100644 frontend-sjgl/src/components/gis/mapurlManage.ts delete mode 100644 frontend-sjgl/src/components/gis/ol/point-layer-manager.ts delete mode 100644 frontend-sjgl/src/components/gis/ol/popup-manager.ts delete mode 100644 frontend-sjgl/src/components/gis/ol/region-mask-manager.ts delete mode 100644 frontend-sjgl/src/components/gis/osgbUtils.ts delete mode 100644 frontend-sjgl/src/modules/jidiSelectorMod.vue delete mode 100644 frontend-sjgl/src/modules/map/application/map-orchestrator.ts delete mode 100644 frontend-sjgl/src/modules/map/domain/legend-deriver.ts delete mode 100644 frontend-sjgl/src/modules/map/domain/map-layer-rules.ts delete mode 100644 frontend-sjgl/src/modules/map/domain/nearby-point-rules.ts delete mode 100644 frontend-sjgl/src/modules/map/stores/map-config.store.ts delete mode 100644 frontend-sjgl/src/modules/map/stores/map-data.store.ts delete mode 100644 frontend-sjgl/src/modules/map/stores/map-view.store.ts delete mode 100644 frontend-sjgl/src/store/modules/map.ts delete mode 100644 frontend-sjgl/src/utils/GisUrlList.ts delete mode 100644 frontend-sjgl/src/views/shiPinJianKong/shiPinJianKongZhuanTi.vue create mode 100644 frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/aiBox/AiBoxSearch.vue create mode 100644 frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/aiBox/index.vue create mode 100644 frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/aquaEco/OtweSearch.vue create mode 100644 frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/aquaEco/index.vue create mode 100644 frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/fishSurvey/FishSearch.vue create mode 100644 frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/fishSurvey/index.vue create mode 100644 frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/guoYuSheShi/FpSearch.vue create mode 100644 frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/guoYuSheShi/index.vue create mode 100644 frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/luShengShengTaiDiaoCha/TeSearch.vue create mode 100644 frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/luShengShengTaiDiaoCha/index.vue create mode 100644 frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/photoBase/PhotoSearch.vue create mode 100644 frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/photoBase/index.vue create mode 100644 frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/qiXiDi/FhSearch.vue create mode 100644 frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/qiXiDi/index.vue create mode 100644 frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/rescueStation/VaSearch.vue create mode 100644 frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/rescueStation/index.vue create mode 100644 frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/shengTaiLiuLiang/EqSearch.vue create mode 100644 frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/shengTaiLiuLiang/index.vue create mode 100644 frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/shiPinJianKong/VdSearch.vue create mode 100644 frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/shiPinJianKong/index.vue create mode 100644 frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/shuiShengShengTaiDiaoCha/WeSearch.vue create mode 100644 frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/shuiShengShengTaiDiaoCha/index.vue create mode 100644 frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/shuiWenJianCe/WtSearch.vue create mode 100644 frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/shuiWenJianCe/index.vue create mode 100644 frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/shuiZhiJianCe/WqSearch.vue create mode 100644 frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/shuiZhiJianCe/index.vue create mode 100644 frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/sonarCam/SonarSearch.vue create mode 100644 frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/sonarCam/index.vue create mode 100644 frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/spawnGround/EditSpawnModal.vue create mode 100644 frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/spawnGround/SpawnSearch.vue create mode 100644 frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/spawnGround/index.vue create mode 100644 frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/tempMit/DwSearch.vue create mode 100644 frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/tempMit/index.vue create mode 100644 frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/terrEco/OtteSearch.vue create mode 100644 frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/terrEco/index.vue create mode 100644 frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/yunXingGaoJing/EditWarnModal.vue create mode 100644 frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/yunXingGaoJing/WarnSearch.vue create mode 100644 frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/yunXingGaoJing/index.vue create mode 100644 frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/zengZhiFangLiu/FbSearch.vue create mode 100644 frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/zengZhiFangLiu/index.vue create mode 100644 frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/zhenXIZhiWuYuan/VpSearch.vue create mode 100644 frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/zhenXIZhiWuYuan/index.vue delete mode 100644 frontend/src/views/DataQueryMenuModule/components/monitorData/FlowStation/EditFlowStationModal.vue delete mode 100644 frontend/src/views/DataQueryMenuModule/components/monitorData/SurfaceTemp/EditSurfaceTempModal.vue delete mode 100644 frontend/src/views/DataQueryMenuModule/components/monitorData/VerticalTemp/EditVerticalTempModal.vue delete mode 100644 frontend/src/views/DataQueryMenuModule/components/monitorData/WaterData/EditWaterDataModal.vue diff --git a/frontend-sjgl/docs/地图模块-3D Cesium实施计划.md b/frontend-sjgl/docs/地图模块-3D Cesium实施计划.md deleted file mode 100644 index 9b22b1b0..00000000 --- a/frontend-sjgl/docs/地图模块-3D Cesium实施计划.md +++ /dev/null @@ -1,479 +0,0 @@ -# 地图模块 3D Cesium 实施计划 - -## 1. 目标 - -在现有地图体系下补齐 `3D(Cesium)` 视图能力,使其尽量复用 `2D(OpenLayers)` 的业务编排结果,满足以下要求: - -- 3D 默认进入中国视角,不再落到美国区域。 -- 3D 初始化时显示过渡动画,再定位到中国。 -- 3D 保留基础底图加载能力,但不提供底图切换面板。 -- 3D 支持锚点展示。 -- 3D 支持与 2D 一致的鼠标悬停 popup,样式复用现有 popup。 -- 3D 支持与 2D 一致的锚点点击行为,点击后打开同一套详情弹框逻辑。 -- 菜单切换、图层树勾选、图例勾选后,3D 锚点与 2D 一样联动变化。 -- 3D 必须复用 `eng_point` 的层级显示规则,中型水电站仅在 `ENG_POINT_MEDIUM_VISIBLE_ZOOM = 7.5` 以上显示。 - -## 2. 2D 现状梳理 - -当前 `2D` 的能力并不是散落在页面里,而是已经形成了比较清晰的分层: - -### 2.1 页面入口 - -- `src/components/gis/GisView.vue` -- 负责挂载地图容器、popup 容器、地图控制器、图例、图层树。 -- 页面只调用 `mapOrchestrator.mountView()` 和 `handlePageChange()`,不直接拼地图业务。 - -### 2.2 地图编排层 - -- `src/modules/map/application/map-orchestrator.ts` -- 负责页面初始化、菜单切换、图层配置加载、图例配置加载、基地切换、缩放联动。 -- 2D/3D 都应尽量复用这一层,避免在 Cesium 侧另起一套业务流程。 - -### 2.3 地图统一门面 - -- `src/components/gis/map.class.ts` -- 对外暴露统一接口,如: - - `addBaseDataLayer` - - `addInitDataLayer` - - `mdLayerTreeShowOrHidden` - - `setLegendPointVisible` - - `controlBaseLayerTreeShowAndHidden` - - `initPopupOverlay` - - `flyTopanto` -- 业务层只认这套接口,不应感知底层是 `OpenLayers` 还是 `Cesium`。 - -### 2.4 2D 地图能力落点 - -- `src/components/gis/map.ol.ts` -- 已实现的关键能力: - - 默认中国视角初始化 - - 基础底图加载与切换 - - 点位图层注册和显隐 - - 图例控制单类锚点显隐 - - 鼠标 hover popup - - click 打开详情弹窗 - - 基地裁切与底图遮罩 - - 缩放/移动后的批量 popup 和标签刷新 - -### 2.5 2D 锚点与 popup 支撑 - -- `src/components/gis/ol/point-layer-manager.ts` - - 负责将点位数据转成地图要素、分层、索引、图例显隐。 -- `src/components/gis/ol/popup-manager.ts` - - 负责 hover 命中、popup DOM 内容复用、批量 popup。 - -### 2.6 图层树和图例交互 - -- `src/components/mapController/LayerController.vue` - - 图层树勾选后走 `mapOrchestrator.applyLayerSelection()` -- `src/components/mapLegend/index.vue` - - 图例点击后走 `mapOrchestrator.toggleLegend()` / `toggleLegendBatch()` -- `src/store/modules/map.ts` - - 真正把缓存数据、图层状态、图例状态应用到地图实例 - - 也就是说,`3D` 只要把统一接口补齐,就能直接接住现有业务流 - -### 2.7 2D 已有特殊业务规则 - -- 锚点点击逻辑已在 `src/components/gis/map.ol.ts` 实现: - - 命中锚点后,`ylfb` 走 `ylfbModalVisible` - - 其他锚点走 `modalVisible` - - 标题和参数都直接取当前锚点数据 -- `eng_point` 的中型水电站显示阈值已在现有链路中实现: - - 阈值常量位于 `src/modules/map/application/map-orchestrator.ts` - - 过滤逻辑位于 `src/store/modules/map.ts` 的 `filterPointLayerDataForDisplay()` - - `3D` 不应重新发明一套规则,而应复用这套现有过滤结果 -- 部分点位会随着缩放级别提升显示得更多,不是简单的“图层开/关”: - - `eng_point` 的中型电站要到 `ENG_POINT_MEDIUM_VISIBLE_ZOOM = 7.5` 以上才显示 - - 水电开发页在缩放跨过 `12` 级时会自动补开一批动态图层 - - `2D` 内部还存在点位密度阈值、近邻点展开、批量 popup 阈值等缩放联动规则 -- `2D` 对锚点存在碰撞检测与密度控制,不是所有点始终全量显示: - - 图标和标签会分别经过碰撞计算 - - 低缩放下会因为密度、碰撞、区域裁切、图例状态而隐藏部分点 - - 高缩放下会逐步放开限制,显示更多锚点和标签 - -## 3. 3D 当前现状与缺口 - -### 3.1 已有内容 - -- `src/components/gis/map.cesium.ts` -- 当前只完成了最小化 `Cesium.Viewer` 初始化。 -- 已有基础缩放、截图、`flyTopanto()` 雏形。 - -### 3.2 当前主要缺口 - -- `init()` 里虽然定义了 `flyToChina()`,但没有真正执行,也没有 `resolve(viewer)`,初始化流程不完整。 -- 默认底图仍是 ArcGIS 全球影像,因此启动时容易落到美国默认视角。 -- `addBaseDataLayer()` 为空,无法接住当前 `GISMap/customBaseLayer` 逻辑。 -- `addInitDataLayer()` 为空,无法展示锚点。 -- `mdLayerTreeShowOrHidden()` 为空,菜单切换时 3D 锚点不会同步显隐。 -- `setLegendPointVisible()` 为空,图例勾选不会影响 3D 锚点。 -- `initPopupOverlay()` 为空,无法复用 2D popup 容器。 -- 缺少点击命中与详情弹框联动,3D 当前无法做到“点击锚点与 2D 同行为”。 -- `controlBaseLayerTreeShowAndHidden()` 为空,3D 基础底图和叠加层无法受现有图层树控制。 -- 尚未验证 `eng_point` 的缩放阈值规则在 3D 下是否能完全复用,存在实现时遗漏中型站点显隐的风险。 -- 目前没有承接 `2D` 中“放大到具体层级显示更多锚点”的缩放联动显示机制。 -- 目前没有承接 `2D` 中图标/标签的碰撞检测逻辑,后续若直接全量渲染,视觉效果会与 `2D` 明显不一致。 -- 当前没有建立 `Cesium entity / datasource / imageryLayer` 的注册表,后续联动无从下手。 - -## 4. 实施原则 - -- 不重做业务编排,优先复用 `map-orchestrator.ts` 和 `src/store/modules/map.ts`。 -- 不额外引入一套 3D 专用图例和图层状态,仍以现有 store 为唯一运行态来源。 -- 不单独复制 `eng_point` 的中型站显示规则,优先复用现有 `mapStore` 过滤结果。 -- 不单独新建一套点击弹框协议,优先保持与 `map.ol.ts` 相同的命中后行为。 -- 对“缩放越大显示越多锚点”这类规则,优先复用现有缩放阈值与显示门闩,不做拍脑袋的新规则。 -- 对碰撞检测,优先与 `2D` 保持同方向行为:低缩放控量,高缩放放开,而不是 3D 全量堆点。 -- 先做最小闭环,再逐步补能力: - - 第一步保证 3D 能正确初始化并定位中国。 - - 第二步保证基础底图能显示。 - - 第三步保证锚点能显示。 - - 第四步保证 popup、图层树、图例联动打通。 -- 3D 不做“基础地图切换 UI”,但底层仍要支持 `customBaseLayer + addBaseDataLayer(..., true)` 这一逻辑。 - -## 5. 分步骤实施计划 - -### Step 1:修正 3D 初始化并默认定位中国 ✅️ - -目标: - -- 切到 3D 后稳定初始化 viewer。 -- 首屏出现一个轻量加载动画。 -- 初始化完成后飞到中国默认视角。 - -计划: - -- 修复 `map.cesium.ts` 的 `init()`: - - 保证初始化后一定 `resolve(this.viewer)`。 - - 执行 `flyToChina()`。 - - 补一个可控的启动过渡动画。 -- 统一中国默认参数: - - 中心经纬度建议复用 `104.5, 36.5` - - 相机高度先按全国视角收口,后续再微调 -- 如果切回 2D 再切到 3D,仍然要能正确重建 viewer。 - -验收: - -- 点击 `3D` 按钮后,不再出现美国默认视角。 -- 首屏有加载过渡。 -- 进入后稳定落在中国。 - -### Step 2:展示 3D 基础底图 ✅️ - -目标: - -- 3D 不显示空球。 -- 保留“基础底图 + 3D 专用底图地址”能力。 -- 不提供底图切换面板,但底层能吃现有配置。 - -计划: - -- 在 `MapCesium` 内建立基础图层注册表。 -- 实现 `addBaseDataLayer(layer, isShow)`: - - 对 `customBaseLayer` 使用 `url_3d` - - 对 `BASEMAP-img`、`BASEMAP-white` 预留兼容能力 - - **必须处理 `wmts` 类型图层**:2D 通过 `WMTS` source 加载,3D 使用 `Cesium.WebMapTileServiceImageryProvider`,从 URL 参数中提取 LAYER/TILEMATRIXSET - - **必须提供 `tileMatrixLabels`**:Cesium 默认用纯数字作为 tileMatrix 参数值,但本系统 WMTS 服务器要求 `TileMatrixSet:zoom` 格式(如 `EPSG:3857_hbb_zrbhq_l13:4`)。需构建 `["TileMatrixSet:0", "TileMatrixSet:1", ...]` 传入 `tileMatrixLabels`。 - - 其他类型:`raster-dem`→XYZ、MapServer→ArcGIS、其余 →WMS -- **注意**:还存在一个 `key = "powerBaseStation"` 的基地底图图层,该图层**初始化时不加载**(已在 `IGNORED_BASE_LAYER_KEYS` 中忽略),但后续可通过图层树手动勾选显示。 -- 实现 `controlBaseLayerTreeShowAndHidden()`: - - 让图层树勾选能控制 3D 底图显隐 -- 根据你的要求,UI 层先不开放 `BaseLayerSwitcher` 的 3D 切换行为,只保留默认基础底图加载。 - -验收: - -- 切到 3D 后可稳定看到基础底图。 -- 图层初始化时 `addBaseDataLayer(this.baseLayerConfig, checked, true)` 的思路在 3D 可落地。 - -### Step 3:打通 3D 锚点展示 ✅️ - -目标: - -- 3D 能展示和 2D 同源的锚点数据。 -- 菜单切换后,3D 能跟随页面数据切换。 - -计划: - -- 在 `MapCesium` 内建立点位图层注册结构,按 `layerKey -> entity[]` 管理。 -- 实现 `addInitDataLayer(pointData, layerType)`: - - 复用当前点位数据结构 - - 解析 `lgtd/lttd/iconCode/titleName/stnm/anchoPointState/popupHtml` - - 复用现有图标资源路径 - - Entity ID 使用 `${layerKey}:${item._id || `${iconType || 'point'}_${stcd}`}`,与 2D 对齐,确保同 stcd 不同 sttpMap 的点不被覆盖 - - 确保 `eng_point` 仍按现有 `mapStore` 过滤后的数据展示,中型站点只在 `7.5` 以上层级出现 - - 为后续缩放驱动的增量显示预留运行态字段(`_legendVisible`、`_regionVisible`、`_densityVisible`),不把所有点简单一次性硬渲染 -- 实现 `mdLayerTreeShowOrHidden(layerType, checked)`: - - 图层树控制整个点图层显隐 -- 实现 `removePointLayer()` / `hasLayer()` - - 便于后续页面切换和重载 - -验收: - -- 切到 3D 后当前页默认勾选图层的锚点能显示。 -- 切换菜单后,3D 锚点跟随变化。 -- 取消勾选图层后,对应锚点消失。 -- `eng_point` 在低于 `7.5` 时不显示中型水电站,高于 `7.5` 时正常显示。 - -### Step 4:打通 3D 基地裁切(jdPanelControlShowAndHidden) ✅️ - -目标: - -- 3D 点击基地面板后,与 2D 行为一致。 -- 加载基地边界 GeoJSON,只显示区域内锚点,隐藏区域外锚点。 -- 取消基地时恢复显示所有锚点。 - -计划: - -- 在 `MapCesium` 中捕获 `hydropBase` 配置,与 2D 一样在 `addBaseDataLayer` 中记录。 -- 实现 `jdPanelControlShowAndHidden(baseid, isAll)`: - - `isAll=false`:清除 3D 球面遮罩实体、恢复所有锚点区域可见性、清除裁切状态。 - - `isAll=true`:先隐藏所有锚点,异步加载基地边界 GeoJSON,执行点在面判断后仅显示区域内锚点,同时在球面绘制裁切边界多边形(`applyRegionMask`),最后飞行到区域视野。 -- 在 `createEntityPropertiesBag` 中新增 `_regionVisible` 属性,初始为 `true`。 -- 在 `applyPointVisibilityRefresh` 中跳过 `_regionVisible !== false` 的实体,确保裁切后碰撞检测不会把区域外锚点重新显示出来。 -- 复用 `extractPolygonCoords` / `isPointInRing` 射线法判断逻辑(与 `region-mask-manager.ts` 一致)。 -- 支持 `AbortController` 取消前一次未完成的请求,避免响应顺序错乱。 -- `applyRegionMask` 将 GeoJSON 多边形转换为 Cesium `PolygonHierarchy`,在球面绘制半透明填充 + 可见边界的区域多边形,模拟 2D 底图 Canvas 裁切遮罩的视觉效果。 - -验收: - -- 点击基地后,3D 只显示该基地区域内的锚点,区域外锚点隐藏。 -- 取消基地后,所有锚点恢复正常显示。 -- 快速切换基地不会出现旧数据覆盖新数据的问题。 -- 多次切换 2D/3D 后基地裁切行为正常。 - -### Step 5:打通 3D popup 与 hover ✅️ - -目标: - -- 3D 鼠标悬停时显示与 2D 一样的 popup。 -- popup 样式复用现有 DOM 和样式,不再单独做一版。 - -计划: - -- 实现 `initPopupOverlay(popupContainer)` - - 继续复用 `GisView.vue` 中现有 popup 容器 -- 在 Cesium 中增加鼠标移动命中: - - 基于 `ScreenSpaceEventHandler` - - hover 到锚点时读取 entity 附带属性 -- popup 内容生成逻辑复用 2D 现有字段: - - 优先使用 `popupHtml` - - 否则走通用字段渲染 -- 处理离开锚点时隐藏 popup。 - -验收: - -- 鼠标移入锚点出现 popup。 -- 样式和 2D 保持一致。 -- 移出后 popup 正常消失。 - -### Step 6:补齐缩放驱动显示与碰撞检测 - -目标: - -- 3D 在低缩放下控制锚点数量,避免全量堆叠。 -- 3D 在放大到具体层级后,逐步显示更多锚点。 -- 3D 的图标/标签显示效果尽量接近 2D,不出现严重遮挡。 - -计划: - -- 先承接现有明确可复用的缩放规则: - - `eng_point` 的 `7.5` 阈值 - - 水电开发页的 `12` 级动态图层联动 -- 再补 3D 侧的显示门闩: - - 低缩放下根据缩放级别、图层状态、图例状态控制 entity 显隐 - - 高缩放下逐步放开限制,显示更多锚点 -- 为 3D 补一版轻量碰撞控制: - - 至少先控制标签碰撞,避免名称完全叠在一起 - - 如有必要,再补图标级碰撞或屏幕网格抽稀 -- 明确与 2D 对齐的目标不是“算法完全一样”,而是“视觉行为一致”: - - 低缩放控量 - - 高缩放增量显示 - - 关键锚点不被完全淹没 - -验收: - -- 3D 在全国视角下不会一次性挤满所有锚点。 -- 放大到具体层级后会看到更多锚点逐步出现。 -- 标签和锚点不会大面积重叠到不可读。 - -### Step 7:打通 3D 锚点点击详情 ✅️ - -目标: - -- 3D 点击锚点后,行为与 2D 一致。 -- 继续复用现有详情弹框状态和参数结构。 - -计划: - -- 在 Cesium 中增加点击命中: - - 基于 `ScreenSpaceEventHandler` - - 命中锚点后读取 entity 绑定的原始业务数据 -- 复用 `2D` 当前点击行为: - - `sttpMap === 'ylfb'` 时打开 `ylfbModalVisible` - - 其他锚点打开 `modalVisible` - - `params`、`title` 赋值逻辑与 `map.ol.ts` 保持一致 -- 避免 hover popup 与 click 弹框互相干扰。 - -验收: - -- 点击 3D 锚点后可打开与 2D 一致的详情弹框。 -- `ylfb` 和普通锚点分支行为一致。 -- 点击空白区域不会误触发弹框。 - -### Step 8:打通图例联动 ✅️ - -目标: - -- 图例勾选后,3D 只显示对应状态的锚点。 - -计划: - -- 实现 `setLegendPointVisible(layerKey, anchoPointState, checked)`: - - 复用 `anchoPointState` 作为图例匹配字段 - - entity 级别维护显示状态 -- 如果后续需要,也可补一个 3D 版本的图例索引表,避免每次全量遍历。 - -验收: - -- 图例单项勾选/取消时,3D 对应类别锚点同步显隐。 -- 图例分组勾选/取消时,3D 行为与 2D 保持一致。 - -### Step 9:补足收口与稳定性 ✅️ - -目标: - -- 让 3D 能稳定参与现有地图生命周期。 - -计划: - -- 清理 Cesium 事件监听、viewer、entity、datasource,避免重复切换内存泄漏。 -- 检查 `switchView('2D' | '3D')` 前后 popup、底图、图层注册是否被正确重置。 -- 检查 hover、click、图例、图层树、缩放阈值这几条联动链路在 3D 是否完全闭环。 -- 视情况补最小诊断日志,确认菜单切换与图层联动没有漏项。 - -验收: - -- 2D/3D 多次来回切换不报错。 -- 菜单切换、图层切换、图例切换行为稳定。 - -## 6. 推荐落地顺序 - -按你的要求,建议严格按下面顺序推进: - -1. 默认定位到中国 + 启动动画 -2. 展示基础底图 -3. 展示锚点 3.5. 补基地裁切(jdPanelControlShowAndHidden) -4. 补 hover popup -5. 补缩放驱动显示与碰撞检测 -6. 补锚点点击详情 -7. 补图层树联动 -8. 补图例联动 -9. 做切换稳定性收口 - -## 7. 预计修改文件 - -- `src/components/gis/map.cesium.ts` - - 3D 地图主体实现,主改动文件 -- `src/components/gis/map.class.ts` - - 视情况补齐 2D/3D 切换后 popup 初始化和服务切换细节 -- `src/components/gis/GisView.vue` - - 视情况控制 3D 下的底图切换器显示策略、加载态挂载位置 -- `src/components/mapController/index.vue` - - 若需要补 3D 初始化后的交互控制 - -## 8. 当前建议 - -建议先只做 `Step 1`,也就是: - -- 修正 Cesium 初始化完成逻辑 -- 增加 3D 启动加载动画 -- 默认飞到中国 - -这一步最小、最容易验证,也能先把“打开 3D 看起来不对”的核心问题解决掉。 - -## 9. 必须补齐的隐藏逻辑清单 - -下面这些逻辑不是表面接口能直接看出来的,但如果 `3D` 不补,最终效果就会和 `2D` 明显不一致。 - -### 9.1 图层与菜单切换 ✅️ - -- ✅ 菜单切换时,只隐藏旧页点图层,不隐藏底图。(编排器 `handlePageChange` 控制,Cesium 被动接收数据) -- ✅ 图层树勾选前要先经过互斥规则归一化:(store 层 `updateLayerData` 处理,Cesium 不感知) - - `rare_fish_point` 与 `fish_along_point` 互斥 - - `stinfo/stinfo_video_point` 与 `stinfo_ai_video_point` 互斥 - - `facilities` 与 `facilities_built` 两个分支互斥 -- ✅ 点图层取消勾选时只隐藏,不删除缓存;重新勾选时优先从缓存恢复。`mdLayerTreeShowOrHidden` 设置 `_layerVisible` 标志,不删除 `pointLayerRegistry` 条目。 -- ✅ **图层树勾选时按 `type` 字段走不同分支**(见 `updateLayerData`,store 层处理): - - `type === 'pointMap'` → 走 `handlePointMapLayer` → 调用 `mdLayerTreeShowOrHidden`(已实现,L1624) - - `type === 'GISMap'` → 走 `controlBaseLayerTreeShowAndHidden`(已实现,L1345) - - 3D Cesium 已同时实现这两个方法。 - -### 9.2 图例与点内显隐 ✅️ - -- ✅ 图例控制的是图层内部锚点是否可见,不是图层本身是否可见。`setLegendPointVisible` 使用 `_legendVisible` 标志,与 `_layerVisible` 独立。 -- ✅ 图层恢复显示时,图例要先整层全关,再按当前 checked 状态逐项恢复。支持 `anchoPointState=''` 全关 → 逐项 `(state, true)` 恢复两步模式(L1764-1787)。 -- ✅ 环保设施图例组当前是只展示不交互。(编排器层面控制,Cesium 不感知) - -### 9.3 缩放驱动显示 ✅️ - -- ✅ `eng_point` 的中型水电站只在 `ENG_POINT_MEDIUM_VISIBLE_ZOOM = 7.5` 以上显示。(store `filterPointLayerDataForDisplay` 在数据进入 Cesium 前过滤) -- ✅ 水电开发页缩放跨过 `12` 级时,会自动补开一批动态图层;缩回去时再自动收口。(编排器层面处理) -- ✅ `2D` 存在"缩放越大显示越多"的行为。碰撞检测中密度门控逐级放开。 -- ✅ `2D` 还存在 hover、批量 popup、密度控制等缩放阈值: - - hover 低于 ~zoom 4.5 不触发(`HOVER_POPUP_MAX_HEIGHT = 9_000_000`) - - 高缩放进入批量 popup 模式(`BATCH_POPUP_MODE_ZOOM = 14.9`) - - 点位随着缩放提升逐步放开密度限制(密度门控 + `DENSITY_ISOLATION_THRESHOLD`) -- ✅ **图标动态缩放**:`CallbackProperty` 实现 `billboard.scale`,公式 `clamp(0.7 + (zoom - 4.5) * 0.035, 0.4, 1.2)`(L1522)。 -- ✅ **字体动态大小**:`CallbackProperty` 实现 `label.font`,钳位 `[10, 20]`(L1535)。 -- ✅ **文字在图标上方**:`CallbackProperty` 实现 `label.pixelOffset`,负 Y 偏移(L1549)。 -- ✅ **Cesium 中必须使用 `CallbackProperty` 实现动态缩放**:已使用 3 个 `CallbackProperty`(scale/font/offset),`isConstant=false` 每帧重算。 - -### 9.4 锚点碰撞与控量 ✅️ - -- ✅ `2D` 中锚点是否可见,不只受图层开关控制,还受以下门闩共同影响: - - 图例可见性 `_legendVisible` - - 区域裁切可见性 `_regionVisible` - - 密度阈值(碰撞循环中 inline 计算,逐级放开) - - 图标碰撞结果 `_iconCollisionVisible` - - 标签碰撞结果 `_labelCollisionVisible` -- ✅ 低缩放下,为避免堆叠,部分锚点或标签会被主动隐藏。(`refreshPointLabelVisibility` 碰撞检测,L2117-2455) -- ✅ 高缩放下,会逐步放开图标/标签限制,显示更多内容。(密度门控 + 碰撞容差随 zoom 调整) -- ✅ 因此 `3D` 不能简单把所有 entity 永久全开。所有 entity 初始 `_iconCollisionVisible = _labelCollisionVisible = true`,碰撞检测运行后动态调整。 - -### 9.5 Popup 与点击 ✅️ - -- ✅ hover popup 不是全时开启的,有缩放门槛。相机高度 > `HOVER_POPUP_MAX_HEIGHT` 时不触发 hover。 -- ✅ 点击和 hover 的命中对象是图标本体,不是任意文字区域。`ScreenSpaceEventHandler` 基于 `scene.pick` 命中 entity。 -- ✅ `ylfb` 与普通锚点的点击详情弹框走不同业务分支。`sttpMap === 'ylfb'` 打开 `ylfbModalVisible`,其他走 `modalVisible`(L366-375)。 - -### 9.6 基地与区域裁切 ✅️ - -- ✅ 基地切换不仅影响搜索候选,还会影响地图上的点位可见范围。`jdPanelControlShowAndHidden` 实现(L1684-1748)。 -- ✅ 区域裁切会直接把区域外点位隐藏,不是只改底图遮罩。`filterPointsByRegion` 设置 `_regionVisible = false`(L1824-1848),遮罩多边形 + 裁剪双重处理。 - -### 9.7 筛选器特殊逻辑 ✅️ - -- ✅ 装机容量筛选本质是批量切 `eng_point` 图例状态,不是简单切图层。(store 层处理,Cesium 通过 `setLegendPointVisible` 响应) -- ✅ 鱼类分布模式会接管 `ylfb_point` 的数据、缓存、图例与显隐。(store 层处理) -- ✅ 时间筛选当前只重载指定时间相关图层,不是全量重载。(store 层处理) - -### 9.8 数据进入 addInitDataLayer 前的预处理 ✅️ - -- ✅ 所有点位数据在进入 `addInitDataLayer` 前会经过 `normalizePointLayerItems()` 过滤:(store 层 `map.ts` 执行,Cesium 接收时已过滤) - - 没有 `iconCode` 且 `code !== 'colorLayer'` 的项会被抛弃 - - `baseId == 'all'` 且 `anchoPointState` 结尾为 `_nbuilt` 的项会被抛弃 -- ✅ `_id` 默认值生成规则:store 层生成 `${sttpMap || iconType || 'point'}_${stcd}`。 -- ✅ **stcd+经纬度重复锚点处理**:Cesium entity ID 使用 `${layerKey}:${item._id}`,与 2D 对齐,同 stcd 不同 sttpMap 的点不会互相覆盖。 - -### 9.9 图标渐进加载机制 - -- ❌ 2D 中图标不是一次性全加载完。有 `loading → loaded → error` 三种状态跟踪。 -- ❌ 只有 `loaded` 状态的图标才参与样式渲染,loader 失败的不渲染。 -- ❌ 如果在图标加载过程中就触发了样式刷新,需要通过 `requestAnimationFrame` 回刷。 -- ❌ 3D Cesium 中当前所有 entity 同步创建,billboard `image` URL 直接赋值,无渐进加载。Cesium 内部纹理加载无显式状态跟踪。 - -### 9.10 密度分档与近邻点元数据 ✅️ - -- ✅ 每个锚点的 `distance` 字段表示密度分档值(不是物理距离),值越大表示越稀疏。(已使用 `getEntityDensityValue` 从 `_rawData.distance` 读取,L2460) -- ✅ 不同 density 值对应不同的 `minZoom` 显示门槛。`getEntityDensityMinZoom` 映射 `nearby-point-rules.ts` 的 `densityDisplayRules`(L2491)。 -- ✅ 全量数据加载后,store 会调用 `attachNearbyPointRuntimeMeta()` 给所有点打上 `_nearbyRule`、`_nearbyGroupId`、`_nearbyPriority` 等元数据。(store 层处理,Cesium 碰撞检测中读取) -- ✅ **孤立点例外规则**:如果一个点在当前视口内 ~56px 范围内没有同 layerKey 的其他可见点,它可以绕过密度门槛直接显示。`DENSITY_ISOLATION_THRESHOLD = 56` + `shouldBypassDensityGateForIsolatedEntity`(L2506-2556)。 diff --git a/frontend-sjgl/docs/地图模块-OpenLayers抽吸与碰撞分析.md b/frontend-sjgl/docs/地图模块-OpenLayers抽吸与碰撞分析.md deleted file mode 100644 index 3c0e97d0..00000000 --- a/frontend-sjgl/docs/地图模块-OpenLayers抽吸与碰撞分析.md +++ /dev/null @@ -1,343 +0,0 @@ -# 地图模块-OpenLayers抽吸与碰撞分析 - -## 1. 背景 - -当前地图 2D 主引擎已经切换为 OpenLayers,项目依赖版本为 `ol@^10.8.0`。 -本次关注的问题有两个: - -- 点位“抽吸”逻辑不符合业务预期; -- 文字碰撞时把整个点位一起隐藏,而不是仅隐藏文字。 - -典型场景是两个相邻电站,例如“积石峡”和“公伯峡”: - -- 可用代号 `1`、`2` 表示两个相邻点; -- 默认缩放下只展示 `1`; -- 放大到某个层级后,`1` 隐藏,`2` 展示; -- 再继续放大后,`1` 和 `2` 都展示,但 `2` 需要“抽吸/拉开”显示,避免与 `1` 重叠; -- 如果只是文字发生碰撞,希望点图标保留,仅文字隐藏或延后显示。 - -本文件先整理当前代码现状和问题成因,不直接修改实现。 -如果需要查看**当前已经落地的抽吸规则、默认参数和调参入口**,请同时参考: - -- `docs/地图模块-抽吸规则与参数说明.md` - -## 2. 当前代码结构 - -当前前端 GIS 运行链路如下: - -1. `src/components/gis/GisView.vue` -2. `src/modules/map/application/map-orchestrator.ts` -3. `src/components/gis/map.class.ts` -4. `src/components/gis/map.ol.ts` -5. `src/components/gis/ol/point-layer-manager.ts` -6. `src/components/gis/ol/popup-manager.ts` - -各层职责简述: - -- `GisView.vue` - - 地图入口组件; - - 挂载地图容器、图例、筛选器、控制器; - - 通过 `mapOrchestrator.mountView()` 初始化地图; - - 菜单切换时通过 `handlePageChange()` 触发页面地图重载。 - -- `map.class.ts` - - 地图门面类; - - 当前 2D 实现实际绑定的是 `MapOl`; - - 3D 实现才会切到 `MapCesium`。 - -- `map.ol.ts` - - OpenLayers 主实现; - - 负责地图初始化、底图加载、点位样式、Popup、区域裁切、量算等; - - 当前“点位渲染规则”和“碰撞相关逻辑”主要集中在这个文件。 - -- `point-layer-manager.ts` - - 负责点图层创建、Feature 灌入、按图层控制显隐; - - 点位图层统一使用 `VectorLayer + VectorSource`。 - -- `popup-manager.ts` - - 管理 hover popup 和高缩放下的批量 popup; - - 内部额外做了一套基于边界框的碰撞判断。 - -## 3. 当前点位渲染链路 - -### 3.1 点图层创建 - -`point-layer-manager.ts` 中的 `ensureLayer()` 会统一创建点图层: - -- 图层类型为 `VectorLayer`; -- 图层上开启了 `declutter: true`; -- 样式函数统一走 `map.ol.ts` 中的 `createPointStyle()`。 - -也就是说,当前所有点位的“是否显示”和“图标/文字如何避让”,都收敛到 OpenLayers 的 declutter 机制和样式函数里。 - -### 3.2 点样式生成 - -`map.ol.ts` 的 `createPointStyle()` 当前做了这些事: - -- 读取 `_iconUrl` 和 `_labelText`; -- 如果图例不可见、区域不可见,则直接返回 `null`; -- 如果 `distance` 不满足当前缩放级别要求,也直接返回 `null`; -- 图标使用 `Icon`; -- 文字使用 `Text`; -- 图标和文字都设置了 `declutterMode: 'declutter'`; -- 最终把图标和文字一起放进同一个 `Style` 返回。 - -这意味着: - -- 点图标和文字不是两个独立的渲染对象; -- 它们在当前实现中属于同一个样式结果; -- 只要这组样式参与碰撞判定,图标和文字的命运就是绑定的。 - -### 3.3 当前已有的“抽稀”逻辑 - -当前项目中确实有一层“缩放越小,显示越少”的处理,但它不是精细的“抽吸”。 - -`map.ol.ts` 的 `shouldRenderFeatureByDistance()` 逻辑是: - -- 小缩放下要求 `distance` 更大才允许显示; -- 缩放越大,允许显示的点逐渐增多; -- 本质上是基于后端数据字段 `distance` 做全局抽稀。 - -这个逻辑的特点是: - -- 是全局阈值,不是成对点位或同组点位的专属规则; -- 只能决定“这个点显示还是不显示”; -- 不能表达“1 和 2 是近邻关系,并且在不同缩放阶段按业务优先级切换显示”。 - -### 3.4 当前批量 Popup 的碰撞检测 - -`popup-manager.ts` 在高缩放批量 popup 模式下,又额外做了一层碰撞判断: - -- 先估算图标和文字合并后的锚点边界框; -- 如果边界框碰撞,则当前要素直接不参与 popup 渲染; -- 随后再判断 popup 矩形之间是否碰撞。 - -这说明当前“图标 + 文字”被视为一个整体,不仅体现在 OpenLayers 的 declutter 里,也体现在 popup 的辅助判断里。 - -## 4. 当前仓库里“抽吸”相关代码现状 - -仓库中确实存在历史上的“抽吸”实现,但不在当前 OpenLayers 主链路里。 - -相关文件: - -- `src/utils/leaflet/leaflet.inflatable-markers-group.js` -- `src/components/gis/map.leaflet.ts` - -现状判断: - -- `leaflet.inflatable-markers-group.js` 是旧 Leaflet 时代的抽吸插件; -- 它内部有 `inflateAsManyAsPossible()`、`_zoomend()` 等典型抽吸逻辑; -- 但当前 `map.class.ts` 实际实例化的是 `new MapOl()`; -- `map.leaflet.ts` 已经不在主运行路径上。 - -结论是: - -- 当前页面上看到的点位行为,不是 Leaflet 抽吸插件在工作; -- 现在的显示结果主要来自 OpenLayers 的 `declutter`、当前样式函数和 `distance` 抽稀逻辑; -- 因此“已经有抽吸但是不太对”,更准确地说是“历史上有抽吸代码,但现在主链路没有真正使用那套机制”。 - -## 5. 问题分析 - -### 5.1 为什么当前实现做不到你要的分阶段抽吸 - -你描述的目标并不是简单“避让”,而是一个明确的分阶段显示策略: - -1. 默认只显示 `1`; -2. 缩放到阶段 A 时,隐藏 `1`,改为显示 `2`; -3. 缩放到阶段 B 时,`1` 和 `2` 都显示; -4. 阶段 B 下,`2` 还要相对 `1` 做抽吸/偏移,避免完全重叠。 - -而当前代码缺少以下能力: - -- 没有“近邻点关系”配置 - - 代码里没有看到类似 `groupId`、`neighborIds`、`priority`、`displayLevel` 这样的结构; - - 系统不知道“积石峡”和“公伯峡”是一组特殊近邻点。 - -- 没有“分阶段显示规则”配置 - - 当前只有全局的 `distance` 阈值判断; - - 没有按缩放阶段表达“谁替代谁显示、谁先隐藏、谁后展示”。 - -- 没有“抽吸偏移”计算 - - 当前点要素坐标就是原始经纬度转换结果; - - 没有根据缩放级别和邻近关系生成偏移坐标; - - 也没有“展开后沿圆周/沿固定方向偏移”的逻辑。 - -- 当前 declutter 是被动避让,不是主动编排 - - declutter 只会尽量避免重叠; - - 它不会理解业务上的“1 是主点、2 是附点”; - - 也不会自动实现“先 1,后 2,再两个都展示且 2 偏移”的规则。 - -所以当前看到的结果不稳定,本质原因不是某一个参数不对,而是“现有机制和目标能力不是一类问题”。 - -### 5.2 为什么文字碰撞会把整个点隐藏 - -这是当前实现里最关键的原因: - -- 点图标和文字是在同一个 `Style` 里返回的; -- 图层开启了 `declutter: true`; -- 图标和文字又都设置了 `declutterMode: 'declutter'`。 - -在这种组织方式下,当前要素的碰撞判定是按“一个整体渲染单元”处理的,而不是“图标一套规则,文字一套规则”。 - -因此会出现下面的现象: - -- 图标本身其实不冲突; -- 但文字边界框发生碰撞; -- 最终被隐藏的是整条样式结果; -- 用户视觉上就会觉得“明明只是字挤了,为什么点也没了”。 - -这和你现在观察到的问题是一致的。 - -### 5.3 为什么当前逻辑还会进一步放大这个问题 - -除了 OpenLayers 自身的 declutter 组织方式,代码里还有两层因素会继续放大问题: - -- `shouldRenderFeatureByDistance()` 会先根据 `distance` 直接过滤点位; -- `popup-manager.ts` 在批量 popup 模式下,也把“图标 + 文字”当作合并边界框做碰撞模拟。 - -也就是说,当前系统对近邻点位的处理是: - -- 先用全局 `distance` 规则筛掉一部分; -- 再用 OpenLayers declutter 继续过滤; -- 高缩放时 popup 层再做一轮碰撞跳过。 - -这三层叠加后,显示行为更偏向“谁先撞谁消失”,而不是“按业务规则分阶段展开”。 - -## 6. 结合你的案例做具体映射 - -如果以近邻点 `1`、`2` 为例,当前代码里实际上缺的是下面这些业务语义: - -- `1` 和 `2` 属于同一近邻组; -- 组内有主次优先级; -- 在不同 zoom 区间内有不同展示策略; -- 在最大放大阶段需要给 `2` 一个偏移位; -- 偏移后图标和文字还要分别控制碰撞策略。 - -当前实现只能表达: - -- 某个点在当前 zoom 下是否允许渲染; -- 某个点图例是否可见; -- 某个点是否被区域裁切隐藏; -- 某个点的图标和文字整体是否参与 declutter。 - -它并不能表达: - -- “1 替代 2 展示”; -- “2 替代 1 展示”; -- “1 和 2 一起展示,但 2 抽吸展开”; -- “只隐藏文字,不隐藏图标”。 - -所以你现在遇到的问题是结构性问题,不是简单调一个 `declutter` 参数就能彻底解决。 - -## 7. 后续修改时建议优先动的层 - -如果下一步要真正改这块,建议优先从下面几层入手: - -### 7.1 先补“近邻点显示规则” - -建议不要直接把业务规则写死在样式函数里,而是先增加一层近邻点编排规则,例如: - -- `groupId` -- `priority` -- `showZoomMin` -- `showZoomMax` -- `replaceAtZoom` -- `expandAtZoom` -- `expandOffset` - -这样才能表达: - -- 默认只显示主点; -- 中间层级切换成副点; -- 更大层级两个都显示; -- 副点在展示时做偏移。 - -### 7.2 抽吸不要依赖 declutter 自动完成 - -抽吸本质上是“主动布局”问题,不是“被动避让”问题。 - -建议后续把近邻点抽吸拆成单独逻辑: - -- 先根据原始点数据识别近邻组; -- 再根据当前 zoom 产出“本次真正参与渲染的点集合”; -- 对需要展开的点,生成偏移后的渲染坐标; -- 最后再交给图层渲染。 - -这样会比直接指望 OpenLayers 的 declutter 更可控。 - -### 7.3 图标层和文字层要分开控制 - -要实现“文字碰撞时只隐藏文字,不隐藏点图标”,后续最重要的一点是把图标和文字的渲染职责拆开。 - -至少要做到下面二选一: - -- 图标层和文字层拆成两个独立图层; -- 或者把图标与文字拆成可独立决策的渲染单元。 - -目标是: - -- 图标优先保留; -- 文字单独避让; -- 文本碰撞时只压文字,不压图标。 - -如果仍然维持“同一个样式对象里同时放 image 和 text”的组织方式,这个问题大概率还会持续存在。 - -### 7.4 Popup 碰撞策略也要和新规则同步 - -后续如果点位抽吸和文字单独避让改了,`popup-manager.ts` 里的边界框逻辑也要一起调整。 - -否则会出现: - -- 图标已经正常显示; -- 文字也按新规则显示了; -- 但 popup 层仍然沿用旧的合并边界框; -- 最终又在 popup 阶段把结果打回去。 - -## 8. 建议的改造顺序 - -为了降低风险,建议后续改造按以下顺序推进: - -1. 先梳理近邻点数据结构 - - 确定近邻点如何分组; - - 确定主次优先级和缩放阈值从哪里来。 - -2. 再实现“显示决策层” - - 在真正生成 Style 之前,先决定哪些点应该显示; - - 哪些点应该隐藏; - - 哪些点需要偏移展开。 - -3. 然后拆分图标和文字碰撞 - - 先保证点图标稳定显示; - - 再单独做文字避让。 - -4. 最后调整 popup 逻辑 - - 保证 popup 的碰撞判定和最终可见点保持一致。 - -## 9. 涉及文件清单 - -本次分析重点涉及以下文件: - -- `src/components/gis/GisView.vue` -- `src/components/gis/map.class.ts` -- `src/components/gis/map.ol.ts` -- `src/components/gis/ol/point-layer-manager.ts` -- `src/components/gis/ol/popup-manager.ts` -- `src/utils/leaflet/leaflet.inflatable-markers-group.js` -- `src/components/gis/map.leaflet.ts` -- `package.json` - -## 10. 当前结论 - -当前地图问题可以归纳为两点: - -1. 现在的 OpenLayers 主链路并没有真正使用旧 Leaflet 的抽吸机制; -2. 当前点图标和文字被作为一个整体参与 declutter,所以文字碰撞时会连点一起隐藏。 - -所以后续如果要改,方向不应该只是“调避让参数”,而应该是: - -- 增加近邻点分阶段显示规则; -- 增加主动抽吸/偏移布局; -- 把图标和文字拆成可独立控制的渲染单元; -- 同步修正 popup 的碰撞判断。 - -在这个基础上,再进入代码修改会更稳。 diff --git a/frontend-sjgl/docs/地图模块-抽吸规则与参数说明.md b/frontend-sjgl/docs/地图模块-抽吸规则与参数说明.md deleted file mode 100644 index 65c9e71e..00000000 --- a/frontend-sjgl/docs/地图模块-抽吸规则与参数说明.md +++ /dev/null @@ -1,316 +0,0 @@ -# 地图模块-抽吸规则与参数说明 - -## 1. 文档目的 - -本文档用于记录当前地图点位“抽吸”功能的现行实现、默认参数、分层级显示规则和后续调参方式。 -本文件描述的是**当前已经落地并验证通过**的规则,适合作为后续维护和继续调参的依据。 - -相关文档: - -- `docs/地图模块-详细说明.md`:地图整体架构说明 -- `docs/地图模块-OpenLayers抽吸与碰撞分析.md`:问题成因与改造分析 - -## 2. 当前实现范围 - -当前抽吸逻辑运行在 OpenLayers 主链路中,核心文件如下: - -1. `src/modules/map/domain/nearby-point-rules.ts` -2. `src/store/modules/map.ts` -3. `src/components/gis/map.ol.ts` -4. `src/components/gis/ol/point-layer-manager.ts` - -各文件职责: - -- `nearby-point-rules.ts` - - 近邻点规则入口 - - 自动识别配置入口 - - 近邻点运行时元数据挂载 -- `map.ts` - - 点位数据加载完成后,统一触发近邻点分组和元数据写回 -- `map.ol.ts` - - 决定某个点在当前缩放级别是否显示 - - 决定文字是否允许显示 - - 承担图标与文字的手工碰撞控制 -- `point-layer-manager.ts` - - 负责展开阶段的几何偏移 - - 负责把同组点位按扇形/环形布局散开 - -## 3. 当前抽吸规则 - -### 3.1 近邻点自动识别 - -当前采用自动识别近邻点,不再靠固定站名手工枚举。 - -识别原则: - -- 只在同一 `layerKey` 内做近邻识别 -- 按点位空间距离自动聚组 -- 满足最小组大小后,才认为是近邻组 -- 组内自动生成显示优先级 `priority` - -这样做的目的: - -- 避免跨图层混组 -- 避免后续新增点位还要手工补名字 -- 让抽吸能力可以覆盖整批业务点 - -### 3.2 分层级显示规则 - -当前显示规则以 `replaceAtZoom` 和 `expandAtZoom` 为核心: - -1. `zoom < replaceAtZoom` - - 只显示组内主点 - - 即 `priority = 1` -2. `replaceAtZoom <= zoom < expandAtZoom` - - 显示组内前两个点 - - 即 `priority <= 2` - - 当前这样设计是为了避免主点在放大过程中突然消失 -3. `zoom >= expandAtZoom` - - 同组点全部显示 - - 同时进入展开布局阶段 - -补充规则: - -- 如果某个点配置了 `showZoomMin` 或 `showZoomMax`,则先受这两个值约束 -- 没有进入近邻组的点,不受抽吸规则影响 - -### 3.3 文字显示规则 - -当前文字显示必须依赖点位显示。 - -也就是说: - -- 点不显示,文字一定不显示 -- 点显示后,文字还要继续通过碰撞判断才会显示 - -当前文字碰撞规则: - -- 文字要避让已保留的图标占位盒 -- 文字要避让已保留的其他文字 -- 图标与文字不再分别交给 OpenLayers 的 `declutter` 自动处理 -- 当前走的是项目内的手工碰撞控制 - -## 4. 当前默认参数 - -当前默认参数集中维护在: - -- `src/modules/map/domain/nearby-point-rules.ts` - -当前采用统一配置对象: - -```ts -type NearbyPointConfig = { - autoRule: NearbyPointAutoRule; - layoutRule: NearbyPointLayoutRule; - densityDisplayRules: NearbyPointDensityDisplayRule[]; -}; -``` - -其中: - -- `autoRule`:控制近邻点自动识别、缩放切换和基础展开半径 -- `layoutRule`:控制展开阶段的单圈容量、扇形角度和外圈间距 -- `densityDisplayRules`:控制 `distance` 密度分档在不同缩放级别的基础显示资格 - -### 4.1 自动识别与缩放阶段参数 - -当前值如下: - -| 参数 | 当前值 | 作用 | -|---|---:|---| -| `distanceThresholdMeters` | `9000` | 近邻点自动识别距离阈值 | -| `replaceAtZoom` | `10.5` | 进入“主点 + 次点”阶段的缩放级别 | -| `expandAtZoom` | `12.2` | 进入“全部显示并展开”阶段的缩放级别 | -| `expandOffsetPx` | `48` | 第一圈展开的基础偏移半径 | -| `angleStepDeg` | `55` | 默认角度步长参考值 | -| `minGroupSize` | `2` | 最小成组数量 | - -### 4.2 展开布局参数 - -当前值如下: - -| 参数 | 当前值 | 作用 | -|---|---:|---| -| `ringSize` | `5` | 单圈最多容纳的次点数量 | -| `fanAngleForTwoDeg` | `110` | 单圈剩余 `2` 个点时的扇形总角度 | -| `fanAngleForFourDeg` | `150` | 单圈剩余 `3` 到 `4` 个点时的扇形总角度 | -| `fanAngleForManyDeg` | `180` | 单圈剩余 `5` 个及以上点时的扇形总角度 | -| `ringGapPx` | `22` | 外圈最小增量半径 | -| `ringGapFactor` | `0.85` | 外圈相对基础半径的增量系数 | - -### 4.3 密度分档显示参数 - -这里的 `distance` 不是物理距离,而是点位密度分档值。 -数值越大表示越稀疏,越早参与显示候选;数值越小表示越密集,需要更高缩放级别才参与显示。 - -当前值如下: - -| `minDensityValue` | `minZoom` | 作用 | -|---:|---:|---| -| `1500000` | `0` | 很稀疏的点,从小缩放级别就可参与显示 | -| `800000` | `6.1` | 稍密集的点,从中低缩放开始参与显示 | -| `400000` | `8.1` | 中密度点,需要进一步放大 | -| `50000` | `10.6` | 高密度点,需要较高缩放级别 | -| `0` | `12.2` | 极密集点,只有更高缩放才进入候选 | - -## 5. 当前展开布局 - -展开阶段由 `point-layer-manager.ts` 控制。 - -### 5.1 布局特点 - -当前布局不是简单把点随机散开,而是按以下方式处理: - -- 主点保留原位置 -- 同组其他点围绕主点展开 -- 展开方向优先偏下方 -- 单圈数量由 `ringSize` 控制 -- 点数较多时进入第二圈 -- 第二圈半径按 `ringGapPx` 和 `ringGapFactor` 继续增大,避免继续叠在一起 - -### 5.2 为什么优先向下展开 - -当前优先向下展开,主要是为了: - -- 尽量给上方文字留空间 -- 降低文字压住上方点的概率 -- 让地图上的抽吸形态更稳定 - -## 6. 当前实现的几个关键约束 - -### 6.1 不使用淡入淡出动画 - -目前已移除点和文字的淡入淡出动画。 - -原因: - -- 抽吸状态切换和动画叠加时,容易让点和文字出现闪烁 -- 会干扰对“当前到底该不该显示”的判断 - -当前阶段优先保证: - -- 显示规则稳定 -- 点和文字状态一致 -- 放大缩小时不出现明显错位 - -### 6.2 不再依赖 OL 的自动 declutter 决定图标命运 - -当前图标和文字都设置为 `declutterMode: 'none'`,由项目内逻辑统一控制。 - -这样做的原因: - -- 避免图标和文字落在两套碰撞体系里 -- 避免出现“文字先出来、点没出来” -- 避免文字压住其他点却仍然显示 - -## 7. 常见现象与调参建议 - -### 7.1 成组太少 - -表现: - -- 相近点仍然容易互相盖住 -- 进入展开前看起来还是压在一起 - -优先调整: - -- 增大 `distanceThresholdMeters` - -### 7.2 成组太多 - -表现: - -- 距离并不算近的点也被当成一组 -- 放大后过早进入抽吸关系 - -优先调整: - -- 减小 `distanceThresholdMeters` - -### 7.3 展开太晚 - -表现: - -- 放大到较深层级前仍然挤在一起 - -优先调整: - -- 减小 `expandAtZoom` - -### 7.4 展开太早 - -表现: - -- 中等缩放时地图上就出现较明显散开效果 - -优先调整: - -- 增大 `expandAtZoom` - -### 7.5 展开后间距不够 - -表现: - -- 虽然已经展开,但图标还是比较挤 - -优先调整: - -- 增大 `expandOffsetPx` -- 或增大 `ringGapPx` -- 或增大 `ringGapFactor` - -### 7.6 单圈散开角度不合适 - -表现: - -- 次点虽然已经展开,但仍然集中在一侧 -- 或者扇形过大,展开形态显得太散 - -优先调整: - -- 调整 `fanAngleForTwoDeg` -- 调整 `fanAngleForFourDeg` -- 调整 `fanAngleForManyDeg` - -### 7.7 主点在放大过程中突然消失 - -当前已经通过 `replaceAtZoom <= zoom < expandAtZoom` 阶段显示 `priority <= 2` 进行修正。 -如果后续又出现类似现象,优先检查: - -- `map.ol.ts` 中 `shouldRenderNearbyFeature()` 的阶段逻辑 -- 是否误改成只显示 `priority = 2` - -### 7.8 明明周围看起来空,文字还是不显示 - -优先检查: - -- 图标碰撞盒是否过大 -- 文字碰撞盒是否过于保守 -- 候选集是否发生重复统计 - -相关代码主要在: - -- `src/components/gis/map.ol.ts` - -## 8. 后续维护建议 - -建议后续继续保持以下约定: - -1. 抽吸参数继续统一放在 `nearby-point-rules.ts` -2. 显示决策继续集中在 `map.ol.ts` -3. 几何偏移继续集中在 `point-layer-manager.ts` -4. 后续调参优先改 `DEFAULT_NEARBY_POINT_CONFIG`,不要直接把数值散落回业务代码 -5. 如果继续加动画,必须放在抽吸状态机完全稳定之后 -6. 如果继续优化 popup,也要同步遵循“点先于文字”的显示原则 - -## 9. 当前结论 - -当前这版抽吸实现已经形成了比较稳定的主线: - -- 自动识别近邻点 -- 统一缩放阶段显示规则 -- 展开阶段几何偏移 -- 文字依赖点显示 -- 文字避让图标与文字 - -后续如果继续调优,建议先从参数层开始,不要先动主逻辑结构。 diff --git a/frontend-sjgl/docs/地图模块-详细说明.md b/frontend-sjgl/docs/地图模块-详细说明.md deleted file mode 100644 index 1dbede0c..00000000 --- a/frontend-sjgl/docs/地图模块-详细说明.md +++ /dev/null @@ -1,621 +0,0 @@ -# 地图模块-详细说明 - -## 1. 文档目的 - -本文档用于说明当前地图模块的真实运行结构、初始化时序、图层与图例联动、点位渲染规则、筛选与缩放行为,以及近期已经落地的关键约束。 - -本文档描述的是“当前可运行版本”的现状,不展开抽吸参数细节与专项问题分析。相关补充文档如下: - -- `docs/地图模块-抽吸规则与参数说明.md` -- `docs/地图模块-OpenLayers抽吸与碰撞分析.md` - -## 2. 当前技术栈 - -- 前端框架:Vue 3 + TypeScript + Ant Design Vue -- 状态管理:Pinia -- 2D 地图引擎:OpenLayers 10.8.0 -- 3D 地图引擎:Cesium -- 地图服务:GeoServer / WMTS / XYZ -- 运行模式:后台配置驱动 + 前台运行时编排 - -说明: - -- 当前 2D 主链路已经完全围绕 OpenLayers 组织。 -- 项目中仍保留 Leaflet 相关依赖和旧代码,但不是当前主执行路径。 - -## 3. 模块分层 - -当前地图模块可以按 6 层理解: - -1. 页面入口层 -2. 应用编排层 -3. 地图能力门面层 -4. 地图引擎执行层 -5. Store 运行态层 -6. 前台交互组件层 - -对应核心文件如下: - -- 页面入口层 - - `src/components/gis/GisView.vue` -- 应用编排层 - - `src/modules/map/application/map-orchestrator.ts` -- 地图能力门面层 - - `src/components/gis/map.class.ts` -- 地图引擎执行层 - - `src/components/gis/map.ol.ts` - - `src/components/gis/map.cesium.ts` - - `src/components/gis/ol/point-layer-manager.ts` - - `src/components/gis/ol/popup-manager.ts` -- Store 运行态层 - - `src/store/modules/map.ts` - - `src/modules/map/stores/map-config.store.ts` - - `src/modules/map/stores/map-data.store.ts` - - `src/modules/map/stores/map-view.store.ts` -- 前台交互组件层 - - `src/components/mapLegend/index.vue` - - `src/components/mapFilter/index.vue` - - `src/components/mapController/index.vue` - - `src/components/mapController/LayerController.vue` - - `src/components/BaseLayerSwitcher/index.vue` - -## 4. 整体原则 - -当前地图模块遵循以下几个运行原则: - -### 4.1 地图容器全局常驻 - -地图由 `GisView.vue` 常驻挂载,不会随着菜单切换被销毁重建。页面切换本质上是: - -- 重新计算 `pageKey` -- 重新加载该页图层配置和图例配置 -- 用新的运行态覆盖旧页面显示内容 - -### 4.2 配置驱动 - -前端不把全部图层和图例硬编码死,而是依赖后端返回的: - -- 图层树配置 -- 图例配置 -- 页面级图例配置 -- 各业务点位接口数据 - -### 4.3 运行态绝对优先 - -初始化默认值只在第一次派生时生效;一旦进入运行态,后续图层勾选、图例勾选、筛选器切换,都必须以当前用户操作后的状态为准,不能在加载完成后回退到默认状态。 - -## 5. 页面入口层 - -### 5.1 `GisView.vue` - -`GisView.vue` 的职责主要是: - -- 提供地图容器 `#mapContainer` -- 提供 popup 挂载容器 -- 挂载图例、筛选器、控制器、底图切换器 -- 根据路由计算 `pageKey` -- 在挂载时调用 `mapOrchestrator.mountView()` -- 在页面切换时交给编排器重载页面 - -当前页面层已经不再直接承载复杂业务逻辑,复杂链路都收敛到了编排器和 Store。 - -## 6. 应用编排层 - -### 6.1 `map-orchestrator.ts` 的职责 - -`map-orchestrator.ts` 是当前地图业务的总调度中心,主要负责: - -- 初始化地图壳与 popup -- 加载页面图层配置和图例配置 -- 初始化 GIS 基础图层 -- 触发点位图层加载 -- 管理缩放监听和基地切换监听 -- 处理图层树勾选 -- 处理图例勾选 -- 处理时间筛选、容量筛选、搜索定位 -- 处理水电开发菜单下的缩放联动图层 - -### 6.2 页面初始化链路 - -当前初始化顺序如下: - -1. `GisView.vue` 调用 `mapOrchestrator.mountView()` -2. `MapClass.init()` 初始化地图实例 -3. 页面级 popup 容器挂到地图实例 -4. 绑定缩放监听和基地监听 -5. 并行请求图层树配置与图例配置 -6. 图例接口先返回时,立即生成图例运行态 -7. 图层树接口返回后,生成默认勾选图层并初始化 GIS 基础图层 -8. 再按图层配置批量加载点位数据 - -这里有两个当前已落地的关键时序调整: - -- 图例转圈只跟图例接口绑定,不再等待所有锚点接口完成。 -- 筛选器数据会随着已加载图层逐步出现,不再必须等全量点位接口结束。 - -### 6.3 页面切换 - -页面切换时地图不销毁,只重载当前页面的: - -- 图层树配置 -- 图例配置 -- 点位数据 -- 当前页面的默认运行态 - -如果仍处于同一个 `pageKey` 且用户之前修改过勾选态,会尽量复用当前运行态,而不是重新回放默认勾选。 - -### 6.4 缩放联动 - -当前编排层主要有两类缩放联动: - -- `eng_point` 缩放联动 - - 大型电站始终允许显示 - - 中型电站仅在 `zoom > 7.5` 时进入显示候选 -- 水电开发菜单动态图层联动 - - `HYDRO_DYNAMIC_LAYER_KEYS` 在缩放跨越阈值时参与加载与显隐编排 - -## 7. 地图能力门面层 - -### 7.1 `map.class.ts` - -`MapClass` 是地图能力统一门面,屏蔽 2D / 3D 引擎差异,对外暴露统一方法。 - -当前常用能力包括: - -- `init()` -- `initPopupOverlay()` -- `addBaseDataLayer()` -- `addInitDataLayer()` -- `mdLayerTreeShowOrHidden()` -- `controlBaseLayerTreeShowAndHidden()` -- `setLegendPointVisible()` -- `hasLayer()` -- `hasBaseLayer()` -- `removePointLayer()` -- `flyTopanto()` -- `switchView()` - -当前业务主执行层仍然是 `MapOl`。 - -## 8. 地图引擎执行层 - -### 8.1 OpenLayers 主执行层 - -`map.ol.ts` 负责 OpenLayers 地图的实际渲染与交互,是当前 2D 地图主执行文件。 - -当前承担的核心能力包括: - -- 地图实例初始化 -- 底图与 GIS 图层管理 -- 点位图层渲染 -- 图标与文字样式生成 -- hover popup 与批量 popup -- 基地范围裁切 -- 高缩放交互 -- 测量、截图、飞行定位等基础地图能力 - -### 8.2 Cesium 执行层 - -`map.cesium.ts` 目前更多是保留 3D 入口和部分基础能力,复杂业务点位与碰撞规则并未与 OpenLayers 完全对齐。 - -结论上,当前真实业务规则仍然以 OpenLayers 链路为准。 - -## 9. Store 分层 - -### 9.1 `map-config.store.ts` - -负责配置态数据: - -- 图层树配置 -- 图层配置索引 -- 全量原始图例配置 -- 图例索引 -- 页面级图例配置 -- 配置接口加载状态 - -当前这里拆分出了两个加载态: - -- `configLoading` -- `legendLoading` - -其中 `legendLoading` 单独控制图例转圈。 - -### 9.2 `map-data.store.ts` - -负责数据态: - -- `pointData` -- `pointDataCache` -- `layerLoadState` -- 地图整体 `loading` - -这里的关键设计是: - -- 每个点图层有独立缓存 -- `pointData` 是由缓存合并出来的运行态数据 -- 单个图层命中缓存或接口返回后,就会立即回填 `pointData` - -因此当前搜索筛选下拉已经支持“渐进可用”,不再只能等全部接口结束。 - -### 9.3 `map-view.store.ts` - -负责视图运行态: - -- 当前勾选图层 `checkedLayerKeys` -- 图例勾选状态 `legendCheckedState` -- 搜索时间范围 -- 当前基地 -- 当前缩放级别 - -### 9.4 `src/store/modules/map.ts` - -这是当前地图运行逻辑最重的 Store,负责串联配置、缓存和地图实例。 - -主要职责包括: - -- 生成图例运行态 -- 批量加载点位数据 -- 控制图层显隐 -- 控制图例显隐 -- 管理请求缓存与并发加载 -- 刷新点图层显示数据 -- 处理 `eng_point` 的显示过滤 -- 在全量点位准备完成后挂载近邻点元数据 - -## 10. 图层分类 - -当前地图里的图层大体可以分成三类: - -### 10.1 `GISMap` - -这类图层对应 GIS 基础图层或专题底图,由 `addBaseDataLayer()` 加载到 `layerRegistry`。 - -当前已补充的规则: - -- 勾选 `GISMap` 时,不能只做显示/隐藏。 -- 如果地图实例中不存在该图层,需要先重新加载,再显示。 - -### 10.2 点位图层 - -这类图层由接口返回锚点数据,最终进入 `PointLayerManager` 维护的 `VectorLayer`。 - -### 10.3 其他专题图层 - -例如梯级流域、区域裁切辅助层等,这些更多由 `map.ol.ts` 单独控制。 - -## 11. 图层数据加载机制 - -### 11.1 配置与数据分离 - -当前初始化时,配置加载与点位数据加载是两条链: - -- 图层树配置决定有哪些层、哪些默认勾选 -- 图例配置决定图例结构和图例项元数据 -- 点位数据接口决定地图上实际锚点内容 - -### 11.2 加载顺序 - -`loadAllLayerData()` 的主要逻辑是: - -1. 先收集所有带 URL 的图层 -2. 把默认勾选图层作为高优先级任务 -3. 收集完成后全量并发加载,不再按 4 个一组分批发起 -4. 每个图层完成后立即写入缓存 -5. 每个图层命中缓存或返回成功后,立即增量更新 `pointData` -6. 全部图层结束后,再统一: - - 回填每层原始数据 - - 挂载近邻点运行时元数据 - - 刷新各图层显示数据 - - 用最新运行态收尾 - -### 11.3 初始化阶段的图例绝对性 - -当前已修复一个关键问题: - -- 图例虽然可能在界面上还在 loading -- 但只要图例配置已经返回,默认隐藏的图例项在点位首批入图时就必须生效 - -也就是说,现在不会再出现: - -- loading 过程中先显示默认隐藏点 -- loading 结束后才消失 - -## 12. 图例机制 - -### 12.1 图例来源 - -图例运行态由以下数据共同决定: - -- 原始全量图例配置 -- 当前页面图例配置 -- 当前已勾选图层 -- 当前图例勾选状态 - -### 12.2 图例派生 - -图例最终显示的是 `legendDataSelected`,而不是全量图例。 - -派生逻辑核心原则如下: - -- 只有当前勾选图层对应的图例项才进入页面图例 -- 图例勾选状态是运行态绝对值 -- 环保设施分组有单独规则 - -### 12.3 图例加载时机 - -当前图例面板的 loading 只跟图例接口绑定: - -- 图例接口返回后立即停转 -- 图例内容在图层默认勾选同步后立即派生 -- 不再等待所有锚点接口完成 - -## 13. 筛选器机制 - -### 13.1 `MapFilter` 的职责 - -筛选器当前包含以下能力: - -- 时间范围筛选 -- 装机容量筛选 -- 搜索定位 -- 个别页面的专题筛选项 - -### 13.2 搜索下拉来源 - -搜索下拉使用 `mapDataStore.pointData` 作为数据源。 - -当前行为已经调整为: - -- 某个图层一旦命中缓存,筛选器即可出现该图层点位 -- 某个图层接口一旦返回成功,筛选器也会立即出现该图层点位 - -因此筛选器当前是“渐进展示”,而不是“全量完成后一次性展示”。 - -### 13.3 装机容量筛选 - -装机容量筛选针对 `eng_point` 图层,当前规则如下: - -- `all` - - 恢复大型与中型图例 -- `large_eng_built` - - 只保留 `large_eng_` 前缀相关图例 - - 地图上只显示大型电站点位 -- `mid_eng_built` - - 只保留 `mid_eng_` 前缀相关图例 - - 地图上只显示中型电站点位 - -当前容量切换不再只是影响筛选器本地下拉,而是会同步驱动: - -- 图例运行态 -- `eng_point` 点位显示 - -## 14. `eng_point` 专项规则 - -`eng_point` 是当前地图模块中的特殊图层,存在独立显示规则。 - -### 14.1 缩放规则 - -在数据入图阶段就生效: - -- 大型电站始终允许显示 -- 中型电站仅在 `zoom > 7.5` 时允许进入显示候选 - -这不是单纯的图例控制,而是点位入图时的过滤逻辑。 - -### 14.2 图例规则 - -点位入图之后,仍然必须再经过图例运行态控制: - -- 允许入图,不等于最终可见 -- 只要图例勾选为隐藏,该类点位就必须隐藏 - -### 14.3 容量筛选规则 - -装机容量下拉会进一步批量控制 `eng_point` 的图例项,使图例与点位同步切换。 - -## 15. 点位显示裁决链 - -当前点位最终是否显示,至少会经过以下几层判断: - -1. 图层是否勾选 -2. 图例是否勾选 -3. 基地范围是否允许 -4. `eng_point` 缩放过滤是否通过 -5. `distance` 密度分档是否通过 -6. 近邻点显示阶段是否通过 -7. 图标是否已加载完成 -8. 当前缩放下是否进入碰撞控制 - -这几层不是互斥关系,而是叠加裁决。 - -## 16. 点位渲染与样式 - -### 16.1 基础样式 - -当前点位渲染包括: - -- 图标 -- 文字标签 -- 标签换行与截断 -- 缩放相关的图标与文字样式变化 - -### 16.2 图标加载约束 - -当前已经补充图标加载状态缓存: - -- 图标未加载完成时,不显示该点 -- 图标未加载完成时,文字也不先显示 -- 图标未加载完成时,不参与碰撞候选 - -这样可以避免“文字先出来、图标还是空的”的问题。 - -## 17. 抽吸、密度与碰撞 - -### 17.1 专项文档 - -抽吸与密度分档的详细参数请查看: - -- `docs/地图模块-抽吸规则与参数说明.md` - -### 17.2 当前裁决顺序 - -当前点位显示顺序可以理解为: - -1. 密度分档 -2. 近邻抽吸 -3. 图标碰撞 -4. 文字碰撞 - -补充约束: - -- 只有满足可见性条件的点,才能进入碰撞候选集 -- 被图例或缩放过滤掉的点,不能再去占用碰撞资格 -- 视图内无近邻的孤立点允许局部放行 - -### 17.3 高缩放特例 - -当前在高缩放层级 `zoom >= 15` 时,行为与中低缩放不同: - -- 只处理视口内点位 -- 点与文字不再做碰撞淘汰 -- 视口内符合基础显示条件的点和文字全部显示 -- 同时进入批量 popup 模式 - -这条规则的目标是: - -- 保证深度放大后信息完整可见 -- 避免高缩放下还因为碰撞把点或文字压掉 - -## 18. Popup 机制 - -### 18.1 两类 popup - -当前 popup 分成两类: - -- hover popup -- batch popup - -### 18.2 hover popup - -鼠标悬停时由 `pointermove` 驱动,只在非 batch popup 模式下显示。 - -### 18.3 batch popup - -在 `zoom >= 15` 时进入批量 popup 模式: - -- 只基于当前视口内点位 -- 拖动地图时持续刷新 -- 但通过 `requestAnimationFrame` 做节流 -- `moveend` 后立即再做一次强制刷新 - -当前这样做是为了兼顾两件事: - -- 保留“拖动时 popup 跟着更新”的原交互 -- 避免拖动过程中每个事件都重建整批 DOM - -### 18.4 惯性平移已关闭 - -当前地图拖动已经关闭 OpenLayers 默认惯性平移: - -- 普通拖动仍然保留 -- 松手后不再继续滑动一小段 - -这样可以减少高缩放 popup 场景下“松手还轻微位移”的观感问题。 - -## 19. 基地与区域过滤 - -基地切换是当前地图模块的关键能力之一,主要影响: - -- 地图裁切范围 -- 当前基地相关点位的可见性 -- 部分专题图层显示 - -整体过程通常是: - -1. 外部基地选择源变化 -2. 编排器接收到基地 ID -3. 地图实例切换基地范围 -4. 点位更新 `_regionVisible` -5. 样式函数按区域可见性决定是否显示 - -## 20. 典型交互链路 - -### 20.1 图层树勾选 - -1. `LayerController` 触发勾选变化 -2. 编排器归一化图层 key -3. `map.ts` 更新运行态图层勾选 -4. 地图实例更新图层显隐 -5. 图例重新派生 - -补充: - -- `GISMap` 勾选时,如果地图里没有该图层,会先补载,再显示 - -### 20.2 图例勾选 - -1. 图例组件触发点击 -2. 编排器转发图例切换 -3. `map.ts` 更新图例运行态 -4. 对应点位立即更新显隐 -5. 图例树同步更新灰态 - -### 20.3 筛选器操作 - -1. 用户切换时间、容量、搜索等条件 -2. 编排器接收命令 -3. 视情况更新视图运行态或重载数据 -4. 地图实例与图例运行态同步刷新 - -### 20.4 缩放操作 - -1. OpenLayers 视图触发 `change:resolution` -2. 编排器更新当前缩放级别 -3. 处理 `eng_point` 阈值联动 -4. 水电开发菜单下处理动态图层联动 -5. `map.ol.ts` 处理高缩放 popup 与点位显示策略 - -## 21. 当前重点文件清单 - -- `src/components/gis/GisView.vue` -- `src/components/gis/map.class.ts` -- `src/components/gis/map.ol.ts` -- `src/components/gis/map.cesium.ts` -- `src/components/gis/gisUtils.ts` -- `src/components/gis/mapurlManage.ts` -- `src/components/gis/ol/point-layer-manager.ts` -- `src/components/gis/ol/popup-manager.ts` -- `src/modules/map/application/map-orchestrator.ts` -- `src/modules/map/stores/map-config.store.ts` -- `src/modules/map/stores/map-data.store.ts` -- `src/modules/map/stores/map-view.store.ts` -- `src/store/modules/map.ts` -- `src/components/mapLegend/index.vue` -- `src/components/mapFilter/index.vue` -- `src/components/mapController/index.vue` -- `src/components/mapController/LayerController.vue` -- `src/components/BaseLayerSwitcher/index.vue` - -## 22. 当前结论 - -当前地图模块已经形成比较清晰的主干结构: - -- `GisView` 负责挂载与页面入口 -- `map-orchestrator` 负责业务编排 -- `MapClass` 负责能力门面 -- `MapOl` 负责 2D 主执行 -- `map.ts + 三个拆分 store` 共同维护配置、数据与视图运行态 -- 图层树、图例、筛选器、popup、高缩放规则都已经围绕这条主干收口 - -相较旧版说明,当前最重要的现状变化有 8 点: - -1. 图例 loading 已与锚点全量加载解耦 -2. 筛选器数据已支持渐进展示 -3. 初始化阶段默认隐藏图例项会立即生效 -4. 运行态勾选不会在 loading 完成后被默认值覆盖 -5. `eng_point` 有独立的缩放与容量规则 -6. 高缩放下视口内点和文字全部显示,不再做碰撞淘汰 -7. batch popup 保留拖动跟随,但增加了节流 -8. 地图拖动惯性已关闭 - -后续如果继续扩展地图功能,建议仍然优先沿着“编排层 + Store 分层 + OpenLayers 执行层”这条主干扩展,不要再把复杂业务回填到页面组件里。 diff --git a/frontend-sjgl/docs/地图模块现状与改造方案.md b/frontend-sjgl/docs/地图模块现状与改造方案.md deleted file mode 100644 index 181bb0e0..00000000 --- a/frontend-sjgl/docs/地图模块现状与改造方案.md +++ /dev/null @@ -1,1158 +0,0 @@ -# 地图模块现状与改造方案 - -## 1. 文档目的 - -本文档用于完整梳理当前地图模块的技术实现、业务能力、数据流转、关键规则、已知问题与性能瓶颈,并给出可分阶段落地的重构方案。目标是: - -- 让地图模块职责边界清晰,便于后续新增功能; -- 降低组件、Store、地图引擎之间的耦合; -- 优化基础图层、锚点、图例、筛选、基地裁切等功能的响应速度; -- 为后续 2D/3D 扩展、复杂专题图层、更多筛选维度、更多交互能力预留稳定结构。 - ---- - -## 2. 当前模块范围 - -当前地图模块覆盖以下业务能力: - -- 地图初始化与 2D/3D 切换; -- GeoServer 基础底图、叠加图层、区域矢量图层加载; -- Java 后端锚点数据请求、缓存、渲染; -- 右侧图层树勾选控制图层显示与隐藏; -- 左侧图例基于图层选中结果动态生成; -- 图例项点击控制锚点显隐; -- 基地选择后底图裁切与区域外锚点隐藏; -- 地图悬停 Popup、点击详情弹窗; -- 搜索、时间筛选、容量筛选、基地筛选; -- 某些业务图层的互斥显示与特殊联动; -- 局部专题菜单下的缩放级别联动动态图层。 - ---- - -## 3. 当前技术实现概览 - -## 3.1 技术栈 - -- 地图引擎:OpenLayers 作为 2D 主引擎,Cesium 作为 3D 引擎入口; -- 状态管理:Pinia; -- UI 框架:Vue 3 + `script setup` + Ant Design Vue; -- 数据来源: - - GeoServer:基础底图、WMTS、XYZ、GeoJSON 边界; - - Java 后端接口:图层配置、图例配置、锚点数据; -- 业务配置: - - 图层配置与图例配置来自后端; - - 锚点接口映射规则由 `src/store/modules/GisUrlList.ts` 维护。 - -## 3.2 核心文件职责 - -- `src/components/gis/GisView.vue` - - - 地图容器入口; - - 地图初始化; - - 拉取图层配置与图例配置; - - 监听菜单切换、基地切换、缩放联动; - - 挂载 `MapLegend`、`MapFilter`、`MapController`、`BaseLayerSwitcher`。 - -- `src/components/gis/map.class.ts` - - - 地图能力门面类; - - 对外屏蔽 OpenLayers / Cesium 差异; - - 当前主要起到转发作用。 - -- `src/components/gis/map.ol.ts` - - - OpenLayers 主实现; - - 负责底图、锚点图层、Popup、图层显隐、区域裁切、量算、定位等; - - 当前承担了过多业务规则与渲染控制逻辑。 - -- `src/store/modules/map.ts` - - - 地图图层树、图例、锚点、缓存的核心 Store; - - 负责图层选中状态、图例选中状态、锚点请求、缓存、图例联动、图层联动; - - 当前是业务与渲染耦合最重的文件之一。 - -- `src/components/mapController/LayerController.vue` - - - 图层树 UI; - - 负责初始基础图层加载; - - 勾选事件直接调用 Store 更新图层与图例状态; - - 包含多个互斥业务规则。 - -- `src/components/mapLegend/index.vue` - - - 图例展示; - - 基于当前选中图层动态显示; - - 图例点击后直接驱动地图锚点显隐。 - -- `src/components/mapFilter/index.vue` - - - 搜索、基地筛选、容量筛选、时间筛选; - - 直接依赖 `mapStore` 和地图实例; - - 部分筛选逻辑通过直接修改图例和锚点实现。 - -- `src/components/BaseLayerSwitcher/index.vue` - - - 底图模式切换器; - - 切换矢量 / 地形 / 影像底图。 - -- `src/components/gis/gisUtils.ts` - - - 图层结构拍平; - - 基础图层 URL 处理; - - 图例数据转对象; - - 若干地图布局相关工具。 - -- `src/api/map.ts` - - 拉取地图配置和图例配置。 - ---- - -## 4. 当前业务能力与逻辑链路 - -## 4.1 初始化流程 - -当前初始化主要发生在 `GisView.vue`: - -1. 调用 `MapClass.init()` 初始化 OpenLayers; -2. 调用 `initPopupOverlay()` 挂载悬停 Popup; -3. 调用 `fetchMapConfigs()` 并行请求: - - 地图图层配置; - - 全量图例配置; - - 当前页面图例配置; -4. `mapStore.setLegendData()` 初始化图例原始数据与映射; -5. `mapStore.setLayerData()` 初始化图层树和选中图层 key; -6. `mapStore.loadAllLayerData()` 递归加载所有有 URL 的图层数据; -7. `loadLayerData()` 将锚点数据写入缓存并直接调用 `mapClass.addInitDataLayer()` 预创建锚点图层; -8. 全部锚点加载完成后,再调用 `updateLayerData()` 统一控制初始显示状态; -9. 图例根据当前选中的图层动态生成并展示。 - -### 现状特点 - -- 当前是“初始化阶段一次性预加载大多数锚点图层,再通过显隐控制”的策略; -- 图例显示被设计为“锚点完成后再显示”; -- 地图实例、Store、UI 组件三方互相直接调用。 - -## 4.2 基础图层加载与切换 - -基础底图主要由 `LayerController.vue` 和 `map.ol.ts` 协同完成: - -- `LayerController.vue` 中监听图层树配置; -- 对类型为 `GISMap` 的节点解析 `paramJson`,通过 `getMapConfig()` 补齐 GeoServer 地址; -- 调用 `mapClass.addBaseDataLayer()` 初始化基础图层; -- 同时调用 `controlBaseLayerTreeShowAndHidden()` 控制显隐; -- `BaseLayerSwitcher` 再通过 `baseLayerSwitcher()` 在矢量 / 地形 / 影像底图之间切换。 - -当前基础图层类型主要包括: - -- WMTS:GeoServer WMTS 瓦片; -- XYZ:例如 DEM 或其他切片图层; -- vector:部分矢量底图或区域配置。 - -### 自然保护区图层特点 - -- 属于叠加在底图之上的 GIS 图层; -- 显隐仍通过基础图层控制逻辑处理; -- 与区域裁切场景存在较强耦合。 - -## 4.3 图层树勾选控制 - -右侧图层树由 `LayerController.vue` 驱动: - -- 树节点勾选结果通过 `broadcast()` 调用 `mapStore.updateLayerData()`; -- 图层树中包含多种特殊规则: - - 视频监控站与 AI 视频监控站互斥; - - 环保设施和环保设施在建互斥; - - 珍稀鱼类与沿程鱼类互斥; -- 初始选中状态通过递归遍历图层树生成。 - -### 现状问题 - -- 互斥逻辑分散在 UI 组件和 Store 两处; -- “图层树状态”与“地图真实状态”并非单向流; -- 图层节点既承担展示,又携带业务配置与运行态字段。 - -## 4.4 锚点数据加载 - -锚点数据由 `mapStore.loadAllLayerData()` 和 `loadLayerData()` 负责: - -- 遍历图层树中全部带 URL 的图层; -- 使用 `GisUrlList.ts` 将图层 key / title / url 映射成真实请求地址、筛选条件、排序规则; -- 请求 Java 接口; -- 将返回记录补充: - - `iconCode` - - `code` - - `_id` - - `tm` -- 然后缓存到: - - `pointDataCache[layerKey]` - - `layer.data` - - 合并后的 `pointData` -- 若地图上还不存在该图层,则直接调用 `mapClass.addInitDataLayer()` 创建 `VectorLayer`。 - -### 当前锚点渲染方式 - -- 每个 `pointMap` 图层对应一个 `VectorLayer`; -- 每个点被转为 `Feature`; -- Feature 上维护多个运行态字段: - - `_iconUrl` - - `_labelText` - - `_legendVisible` - - `_regionVisible` - - `_layerKey` -- 样式函数 `createPointStyle()` 在渲染时综合判断: - - 图例是否显示; - - 是否在基地区域内; - - 当前缩放级别; - - 点之间距离阈值; - - 是否悬停。 - -## 4.5 图例动态生成与点击联动 - -图例数据来源于两部分: - -- `legendDataOriginal`:后端返回的全量图例; -- `legendDataSelected`:根据当前选中的图层动态筛选后的图例结构。 - -当前机制: - -1. 初始化时拉取全部图例; -2. 通过 `layerCode` 与图层树选中结果建立关联; -3. `mapStore.updateLayerData()` 重新计算当前选中的图例树; -4. `MapLegend` 监听 `legendDataSelected` 进行展示; -5. 点击图例项后: - - 更新 Store 中图例 checked 状态; - - 若是锚点图层,则调用 `mapClass.setLegendPointVisible()`; - - 若是 GIS 图层,则调用 `controlBaseLayerTreeShowAndHidden()`。 - -### 环保设施特殊逻辑 - -- 勾选 `fp_point`、`eq_point`、`fb_point`、`vp_point`、`va_point`、`sg_point`、`dw_point` 中任意图层时,图例自动补充“环保设施”分组; -- 全部取消时自动移除该图例分组。 - -## 4.6 筛选与搜索 - -`MapFilter` 负责以下功能: - -- 装机容量筛选; -- 锚点关键字搜索; -- 时间筛选; -- 基地筛选; -- 个别专题下的鱼类分布筛选。 - -当前实现方式: - -- 搜索下拉列表从 `pointData` 里计算; -- 只展示当前已选中图层中的锚点; -- 容量筛选直接修改图例状态,并调用 `map.mdLayerShowOrHidden()` 控制 feature 显隐; -- 时间筛选通过 `mapStore.updateSearchTimeRange()` 清缓存、删图层、重新请求; -- 基地切换通过监听 `JidiSelectEventStore.selectedItem` 联动地图区域裁切。 - -## 4.7 基地选择与区域裁切 - -基地逻辑入口在 `GisView.vue` 监听器中: - -- 当基地变化时,调用 `mapClass.jdPanelControlShowAndHidden()`; -- `map.ol.ts` 内会: - - 更新当前 `BASEID`; - - 请求基地 GeoJSON 边界; - - 隐藏所有锚点; - - 通过射线法判断锚点是否在区域内; - - 标记 `_regionVisible`; - - 调整视角; - - 对底图应用遮罩。 - -### 该能力的业务效果 - -- 只显示当前基地区域内的锚点; -- 底图裁切到当前基地范围; -- 全选时取消遮罩并显示全部锚点。 - -## 4.8 Popup 与点击详情 - -当前交互如下: - -- `pointermove` 时调用 `detectFeatureAtPixel()` 检查命中点要素; -- 若命中图标区域,则: - - 更新鼠标指针; - - 更新 `hoveredFeatureId`; - - 调用 `showPopup()` 展示悬停浮窗; - - 重绘所有点图层; -- `click` 命中点要素时,打开详情弹窗并将 feature 属性写入 `modelStore`。 - -### 当前特点 - -- Popup 内容由 `popupHtml` 或 `generatePopupHtml(props)` 生成; -- 命中检测采用逐像素回调加距离二次判断; -- 所有点图层在 hover 状态切换时都会 `layer.changed()`。 - -## 4.9 菜单与缩放级别联动 - -在水电开发状况菜单下: - -- 地图缩放级别大于等于 12 时自动添加一组动态图层; -- 缩回 12 以下时自动移除; -- 菜单切换时会根据当前层级重新判断是否添加。 - -当前动态图层 key 包括: - -- `dw_point` -- `stinfo_video_point` -- `stinfo_gjllz_point` -- `wt_point` -- `wq_ownWq_point` -- `wq_countryWq_point` -- `fp_point` -- `eq_point` -- `fb_point` -- `vp_point` -- `va_point` -- `sg_point` - ---- - -## 5. 当前数据流与调用关系 - -当前主数据流可概括为: - -1. `GisView.vue` 拉取配置; -2. `mapStore` 保存图层树、图例、缓存; -3. `LayerController.vue` / `MapLegend.vue` / `MapFilter.vue` 直接操作 `mapStore`; -4. `mapStore` 又直接调用 `mapClass`; -5. `mapClass` 继续转发到 `map.ol.ts`; -6. `map.ol.ts` 内部维护图层注册表和 Feature 运行态; -7. 地图状态变化后,组件又通过监听 Store 再次更新 UI。 - -### 现有结构本质 - -当前是“多入口、多方向写状态”的结构: - -- 组件可以改 Store; -- 组件可以直接调地图; -- Store 可以直接调地图; -- 地图内部又维护一套运行态; -- 图例、图层树、地图显隐存在多份状态镜像。 - -这会导致: - -- 状态同步成本高; -- 某些场景下容易出现 UI 勾选状态与实际地图状态不一致; -- 新增规则时只能继续在现有逻辑上叠加 `if/else`。 - ---- - -## 6. 当前存在的主要问题 - -## 6.1 架构层面问题 - -### 1. UI、业务编排、地图渲染耦合过深 - -- `LayerController.vue`、`MapLegend.vue`、`MapFilter.vue` 都直接调 Store 和地图实例; -- `map.ts` 同时负责: - - 请求; - - 缓存; - - 图例结构整理; - - 图层勾选; - - 地图显隐; - - 业务互斥; -- `map.ol.ts` 同时负责: - - OpenLayers 适配; - - 业务过滤; - - 区域裁切; - - 弹窗; - - 图例控制; - - 锚点显示策略。 - -### 2. 缺乏清晰的单向数据流 - -- 图层树 checked、图例 checked、Feature `_legendVisible`、Layer visible 都是状态源; -- 任何一个点修改后都可能触发联动,难以推断最终状态; -- 某些流程依赖顺序正确才能表现正常。 - -### 3. 业务规则分散 - -- 互斥规则分散在 `LayerController.vue` 和 `map.ts`; -- 环保设施图例补充逻辑在 `map.ts`; -- 装机容量筛选逻辑在 `MapFilter.vue`; -- 基地区域过滤逻辑在 `map.ol.ts`; -- 这些规则没有统一归口,新增业务会继续扩大分散度。 - -## 6.2 性能问题 - -### 1. 初始化阶段预加载过重 - -- `loadAllLayerData()` 会递归处理大量图层; -- 即使图层未勾选,也会提前请求并建图层; -- 页面首次进入时网络压力和首屏渲染压力较大。 - -### 2. 递归遍历频繁 - -- 图层树查找 `findLayerByKey()` 多次递归; -- 图例生成 `getlegendData()` 递归; -- `updateLayerData()` 每次变化都要递归更新 checked 状态; -- 搜索项计算 `anchorPointOptions` 也会递归收集图层 key。 - -### 3. 锚点显隐是全量 feature 遍历 - -- 图例点击时逐个遍历 feature; -- 基地裁切时逐个 feature 做点在面内判断; -- hover 时所有点图层重绘; -- 缩放变化会重复执行样式计算。 - -### 4. 底图切换会 remove / add 图层 - -- `baseLayerSwitcher()` 每次切换都移除旧底图再新增; -- 对 WMTS / XYZ 来说会造成重复创建图层对象和重复请求开销。 - -## 6.3 一致性与可靠性问题 - -### 1. 存在明显临时代码与未收敛逻辑 - -- `GisView.vue` 中 `fetchMapConfigs()` 里对图层做了 `splice(0, 2)` 临时截断; -- 日志仍显示“临时限制”,说明线上逻辑可能仍处于测试状态。 - -### 2. 存在未定义引用 - -- `GisView.vue` 切换地图后调用 `fetchPointData()`,但项目中未找到定义; -- `map.ts` 中使用了 `wq_lineTime`、`wt_lineTime`,但项目中未找到定义。 - -### 3. 请求去重逻辑未真正落地 - -- `map.ts` 中生成了 `requestIdentifier`,但未实际用于请求去重; -- `requestParamsCopy` 也未参与有效逻辑。 - -### 4. 图层状态与渲染状态容易失同步 - -- `layer.checked`、`checkedLayerKeys`、图例 checked、Feature 可见状态是多份数据; -- 其中任意一份被跳过更新,就可能出现视觉不一致。 - -### 5. 部分代码存在明显遗留痕迹 - -- `addInitDataLayer()` 中存在无意义语句 `3;`; -- 有重复日志; -- 有注释掉的大量旧逻辑; -- 说明代码迁移过程中缺乏结构性收口。 - -## 6.4 可维护性问题 - -### 1. Store 过大 - -- `map.ts` 既是数据仓库,又是调度器,又是业务规则中心; -- 后续新增图层类型、筛选类型、专题逻辑时,文件会持续膨胀。 - -### 2. MapOl 职责过多 - -- 当前 `map.ol.ts` 既是 OpenLayers 适配器,又是图层经理、锚点经理、Popup 经理、区域裁切经理; -- 单文件理解和修改成本已经偏高。 - -### 3. 缺少规范化类型系统 - -- 大量 `any`; -- 图层配置、图例配置、锚点数据、请求映射结构都没有稳定类型; -- 特殊图层规则依赖字符串常量散落在各处。 - ---- - -## 7. 改造目标 - -本次改造建议达成以下目标: - -### 7.1 结构目标 - -- 建立清晰的四层结构:视图层、应用编排层、领域状态层、地图渲染层; -- 收拢业务规则,不再散落到多个 UI 组件和地图引擎实现中; -- 建立稳定的数据模型与类型定义。 - -### 7.2 性能目标 - -- 首屏只加载必要图层; -- 选中图层优先加载,未选中图层延后或懒加载;(待考虑) -- 图例切换、基地切换、搜索筛选尽量使用索引和差量更新; -- 减少重复递归、重复建图层、重复样式重算。 - -### 7.3 维护目标 - -- 新增图层类型、专题规则、图例规则时有固定扩展点; -- 2D/3D 共享统一业务层,底层只替换渲染适配器; -- 可以较容易增加埋点、日志、调试工具和单元测试。 - ---- - -## 8. 目标架构设计 - -建议将地图模块拆分为四层: - -## 8.1 视图层 - -只负责展示和用户交互,不直接编写复杂业务逻辑。 - -建议保留的组件: - -- `GisView.vue` -- `LayerController.vue` -- `MapLegend.vue` -- `MapFilter.vue` -- `BaseLayerSwitcher.vue` - -视图层职责: - -- 展示树、图例、筛选项、底图切换器; -- 分发用户动作; -- 订阅 Store 派生结果; -- 不直接调用 `map.ol.ts` 里的业务方法。 - -## 8.2 应用编排层 - -新增地图编排层,建议命名为: - -- `src/modules/map/application/map-orchestrator.ts` -- 或 `src/components/gis/core/orchestrator.ts` - -职责: - -- 承接 UI 动作; -- 统一处理“图层勾选、图例勾选、基地切换、时间筛选、搜索定位、底图切换”等命令; -- 控制加载顺序; -- 根据状态差异驱动地图渲染层; -- 管理互斥规则和特殊规则。 - -### 推荐模式 - -所有 UI 动作统一转换成 Command: - -- `toggleLayer(layerKey)` -- `toggleLegend(layerKey, legendKey)` -- `switchBaseMap(baseMapKey)` -- `changeBaseRegion(baseId)` -- `changeTimeRange(range)` -- `focusPoint(pointId)` - -## 8.3 领域状态层 - -保留 Pinia,但将当前大 Store 拆分为多个职责明确的 Store / Service: - -- `mapConfigStore` - - - 保存图层树、图例原始配置、页面配置; - -- `mapViewStateStore` - - - 保存当前选中图层、选中图例、当前底图、当前基地、当前时间范围、当前缩放级别; - -- `mapDataStore` - - - 保存锚点缓存、请求状态、加载状态、错误状态; - -- `mapRuleEngine` - - 保存互斥规则、派生规则、特殊专题规则。 - -## 8.4 地图渲染层 - -保留 `MapClass` 作为统一门面,但将 `MapOl` 拆分成多个 Manager: - -- `ol-map-adapter.ts` - - - 只负责地图实例生命周期; - -- `ol-base-layer-manager.ts` - - - 负责 WMTS / XYZ / GeoJSON / 底图切换; - -- `ol-point-layer-manager.ts` - - - 负责锚点图层创建、更新、索引、显隐; - -- `ol-popup-manager.ts` - - - 负责 hover / click / popup; - -- `ol-region-mask-manager.ts` - - - 负责基地裁切、遮罩、点在面内过滤; - -- `ol-interaction-manager.ts` - - 负责缩放监听、量算、定位等。 - -这样做后,`MapOl` 只保留聚合职责,不再直接承载全部细节。 - ---- - -## 9. 详细改造方案 - -## 9.1 统一领域模型 - -首先建立类型定义,避免继续依赖 `any`。 - -建议新增: - -- `types/map-layer.ts` -- `types/map-legend.ts` -- `types/map-point.ts` -- `types/map-rule.ts` - -### 图层类型建议 - -- `BaseMapLayer` -- `OverlayLayer` -- `PointLayer` -- `RegionMaskLayer` -- `DynamicLayer` - -### 图层运行态建议(待考虑) - -将运行态从后端配置中剥离,不再直接把运行态写回原始配置: - -- `config`: 后端返回配置,只读; -- `runtime`: - - `visible` - - `loaded` - - `loading` - - `error` - - `featureCount` - - `lastRequestKey` - - `lastUpdatedAt` - -## 9.2 统一图层树、图例、地图显隐状态源 - -建议明确一个唯一状态源: - -- 图层是否勾选:只认 `selectedLayerKeys`; -- 图例是否勾选:只认 `selectedLegendKeys`; -- 地图渲染层不再存业务真相,只接收派生后的可见性差量。 - -### 派生关系建议 - -- `selectedLayerKeys` -> 派生当前显示的图例组; -- `selectedLayerKeys + selectedLegendKeys + currentBaseId` -> 派生 Feature 可见性; -- `selectedBaseMapKey` -> 派生当前底图组合; -- `timeRange + filterConditions` -> 派生图层请求签名。 - -## 9.3 建立图层索引与图例索引 - -为提升速度,初始化配置后立即建立索引: - -- `layerByKey` -- `legendByNameEn` -- `legendByLayerCode` -- `childrenByParentKey` -- `layerDescendantsByKey` -- `featureIndexByLayerAndLegendKey` - -### 优化收益 - -- 避免每次 `findLayerByKey()` 递归; -- 图例切换时直接定位对应图层和对应 feature 集合; -- 图层树勾选联动时只处理差异节点。 - -## 9.4 抽离请求解析器 - -当前 `GisUrlList.ts` 的匹配逻辑散落在 `loadLayerData()` 中,建议拆出: - -- `map-layer-request-resolver.ts` - -职责: - -- 根据 `layer.key` / `layer.title` / `layer.url` 解析真实请求; -- 生成标准请求结构: - - `url` - - `method` - - `filter` - - `sort` - - `cacheKey` - -### 进一步建议 - -- 在应用启动时将 `GisUrlList.ts` 预编译成多索引字典; -- 不要在每次 `loadLayerData()` 内重新构建 `urlListDict`; -- 请求签名应真正参与去重和缓存。 - -## 9.5 重新设计锚点加载策略(待考虑) - -建议从“全量预加载”改为“分层加载”: - -### 第一阶段 - -- 首屏只加载默认勾选图层; -- 图例也只基于已加载的默认勾选图层生成; - -### 第二阶段(待考虑) - -- 对常用图层做后台低优先级预取; -- 非常规图层在首次勾选时再加载; - -### 第三阶段(待考虑) - -- 对时间敏感或高频筛选图层使用缓存失效策略: - - `cacheKey = layerKey + requestSignature` - - 基于时间范围、基地、专题条件生成。 - -### 配套措施(待考虑) - -- 增加并发控制,例如同时最多 4 到 6 个接口请求; -- 增加可取消请求,避免菜单切换时旧请求回写新页面; -- 记录每个图层单独 loading 和 error 状态。 - -## 9.6 重构点图层渲染管理 - -建议将点图层改造成“图层级管理 + 索引级更新”模式。 - -### 当前问题 - -- 图例点击靠遍历全量 feature; -- 基地裁切靠遍历全量 feature; -- hover 时所有点图层都重绘。 - -### 改造建议 - -在 `PointLayerManager` 中维护以下索引: - -- `featuresByLayerKey` -- `featuresByLegendKey` -- `featuresByBaseId` -- `featureById` - -### 改造后的显隐策略 - -- 图例点击时,只处理该图例对应 feature 集合; -- 基地切换时,优先按 `baseId` 做粗筛,再对边界交叉区域做点在面内判断; -- 图层勾选时只切换对应 `VectorLayer.visible`; -- 非必要不重新 `addFeatures()`。 - -### 样式策略建议 - -- 保留 style function,但减少在 style function 内做复杂业务判断; -- 将 `_legendVisible`、`_regionVisible`、`_layerVisible` 预先计算为单个 `renderVisible` 标记; -- 样式函数只做: - - 是否可见; - - 当前缩放级别; - - 当前 hover 状态; - - 图标与文本样式计算。 - -## 9.7 底图与叠加层管理重构(待考虑) - -建议明确区分三类图层: - -- 主底图:矢量 / 地形 / 影像三选一; -- 基础叠加层:自然保护区、行政边界等可附加; -- 专题锚点层:水电工程、生态流量、水质站、视频站等。 - -### 当前问题 - -- 底图切换会 remove / add `customBaseLayer`; -- 主底图和叠加底图概念混杂; -- `controlBaseLayerTreeShowAndHidden()` 实际控制的不全是底图。 - -### 改造建议 - -- 维护 `currentBaseMapKey`; -- 主底图预创建,切换时只改 visible; -- 叠加层作为独立 overlay 管理; -- 自然保护区等图层明确归类为 overlay,不与主底图复用同一逻辑。 - -## 9.8 图例模块重构 - -建议把“图例结构”和“图例选中态”彻底分离: - -- `legendSchema`: 后端原始图例树; -- `legendVisibleTree`: 根据当前图层选择派生; -- `legendCheckedSet`: 当前选中的图例 key 集。 - -### 这样做的好处 - -- 后端原始图例树不再被运行态污染; -- 图例点击只更新 `legendCheckedSet`; -- 图层变化只重算当前显示哪些图例,不直接修改原始结构; -- 更容易实现“重置图例”、“记忆用户图例偏好”。 - -## 9.9 基地裁切与区域过滤重构 - -建议将基地逻辑完全收口到 `RegionMaskManager`。 - -### 改造重点 - -- 缓存基地 GeoJSON; -- 一次解析边界,多次复用; -- 对点位先按 `baseId` 粗筛,再按 polygon 精筛; -- 避免每次基地切换都重新请求已缓存边界; -- 底图遮罩和锚点区域过滤使用同一份区域上下文。 - -### 进一步优化 - -- 若后端能返回基地与锚点的归属关系,可优先直接按 `baseId` 过滤; -- 点在面内判断只作为兜底校验; -- 对非常大的多边形可预处理 bbox,先做 bbox 命中,再做射线法。 - -- 有一个 baseID 来传值 直接请求接口数据加载 -- const url = this.hydropBaseConfig.geojson_url + `&cql_filter=BASEID='${this.BASEID}'`; console.log('正在请求裁切数据:', url); - - // 等待数据加载 - const geoJsonData = await this.loadGeoJsonData(url); - -## 9.10 Popup 与交互重构 - -建议将 Popup 逻辑从 `MapOl` 中抽离: - -- `PopupManager` 负责: - - hover 命中检测; - - popup 位置; - - popup 内容渲染; - - click 详情回调; - -### 优化方向 - -- 命中检测尽量只针对当前可见的点图层; -- 对 hover 更新增加最小移动阈值; -- 只重绘当前命中 feature 所在图层,而不是所有点图层; -- Popup 内容生成应支持模板注册,不直接在地图层拼接业务 HTML。 - -## 9.11 业务规则引擎化 - -建议把分散的特殊规则抽到统一规则层。 - -### 当前应纳入规则引擎的规则 - -- 视频监控站与 AI 视频监控站互斥; -- 环保设施与环保设施在建互斥; -- 珍稀鱼类与沿程鱼类互斥; -- 环保设施图例自动补充; -- 水电开发状况菜单的缩放级别动态图层; -- 水质断面多接口拼接; -- 生态流量三级数据结构处理。 - -### 建议实现方式 - -定义规则接口: - -```ts -interface MapBusinessRule { - id: string; - when(context: RuleContext): boolean; - apply(context: RuleContext): RulePatch; -} -``` - -这样新增业务时只加规则文件,不再继续往组件和 Store 塞判断。 - -## 9.12 组件层改造建议 - -### `GisView.vue` - -- 只保留地图容器、初始化、模块挂载; -- 配置请求交给 `mapOrchestrator.initialize(pageKey)`; -- 菜单切换、基地切换也只发送命令。 - -### `LayerController.vue` - -- 只处理树控件展示与事件抛出; -- 互斥逻辑不要写在组件中; -- 初始底图加载不要放在组件 watch 里,改到编排层统一处理。 - -### `MapLegend.vue` - -- 只负责展示图例树和发出切换事件; -- 不直接调用 `mapClass`。 - -### `MapFilter.vue` - -- 搜索、容量、时间、基地变化全部改为发送标准命令; -- 过滤后的锚点候选列表由 Store 派生,不在组件里自行拼装业务逻辑。 - -### `BaseLayerSwitcher.vue` - -- 只负责切换主底图; -- 不关心图层树中 `customBaseLayer` 的内部结构。 - -## 9.13 日志、监控与调试能力(待考虑) - -建议补充以下调试能力: - -- 图层加载耗时; -- 单图层接口耗时; -- 首屏加载耗时; -- 当前可见图层列表; -- 当前可见锚点数量; -- 当前选中图例数量; -- 当前缓存命中率; -- 当前基地裁切耗时。 - -可以在开发模式下提供一个简易的地图调试面板,便于排查性能与状态同步问题。 - ---- - -## 10. 分阶段落地方案 - -建议采用“四阶段渐进式改造”,避免一次性大改导致风险过高。 - -## 第 1 阶段:收口现状与止血 - -目标:不改变功能表现,先把明显风险收口。 - -建议内容: - -- 去掉测试遗留逻辑,如 `splice(0, 2)`; -- 修复未定义方法和未定义变量; -- 清理重复日志、无效代码、注释垃圾; -- 补充类型定义; -- 建立 `layerByKey`、`legendByNameEn` 等基础索引; -- 将互斥规则从组件内搬到 Store 或规则层统一处理; -- 实现真实请求去重和请求取消。 - -## 第 2 阶段:拆 Store 与编排层 - -目标:建立单向数据流。 - -建议内容: - -- 新增 `mapOrchestrator`; -- 拆 `map.ts` 为配置、状态、数据三个模块; -- UI 组件只发送命令; -- 图例派生、图层派生、筛选派生全部收口到编排层。 - -## 第 3 阶段:拆地图渲染层 - -目标:把 `MapOl` 大文件拆开。 - -建议内容: - -- 抽 `BaseLayerManager`; -- 抽 `PointLayerManager`; -- 抽 `PopupManager`; -- 抽 `RegionMaskManager`; -- 明确地图引擎层只负责“渲染执行”,不处理业务真相。 - -## 第 4 阶段:性能强化与能力扩展 - -目标:让模块适合长期迭代。 - -建议内容: - -- 实现懒加载与后台预取; -- feature 索引化; -- 地图交互性能优化; -- 支持规则插件化; -- 补充测试与性能指标看板; -- 为 3D 共用业务层做适配。 - ---- - -## 11. 推荐目录结构 - -建议重构后目录大致如下: - -```text -src/ - modules/ - map/ - application/ - map-orchestrator.ts - map-commands.ts - map-rule-engine.ts - domain/ - types/ - map-layer.ts - map-legend.ts - map-point.ts - map-filter.ts - services/ - layer-request-resolver.ts - legend-deriver.ts - layer-deriver.ts - infrastructure/ - stores/ - map-config.store.ts - map-view-state.store.ts - map-data.store.ts - repositories/ - map-config.repository.ts - map-point.repository.ts - render/ - map.class.ts - ol/ - ol-map-adapter.ts - ol-base-layer-manager.ts - ol-point-layer-manager.ts - ol-popup-manager.ts - ol-region-mask-manager.ts - ol-interaction-manager.ts - components/ - gis/ - GisView.vue - mapController/ - LayerController.vue - mapLegend/ - index.vue - mapFilter/ - index.vue - BaseLayerSwitcher/ - index.vue -``` - ---- - -## 12. 重点业务的改造策略 - -## 12.1 基础图层 - -策略: - -- 单独定义主底图与叠加图层; -- 预创建主底图; -- 切换时仅改 visible; -- `customBaseLayer` 不再作为特殊魔法 key 到处透传。 - -## 12.2 水电工程锚点 - -策略: - -- 作为标准 `PointLayer` 处理; -- 保留当前图标、标签、距离阈值、Popup 规则; -- 在 `PointLayerManager` 中建立 feature 索引。 - -## 12.3 生态流量三级数据 - -策略: - -- 在领域层定义树结构转换器; -- Store 不直接关心层级深浅; -- 图层树组件只拿已经标准化后的树。 - -## 12.4 水质监测断面三接口拼接 - -策略: - -- 不在 UI 或 Store 中散写拼接逻辑; -- 建立专题数据聚合器,例如 `water-quality-point-aggregator.ts`; -- 对外输出统一的 `PointLayerData`。 - -## 12.5 视频监控站与 AI 视频监控站互斥 - -策略: - -- 写成标准业务规则; -- 由规则引擎统一裁剪勾选结果; -- UI 不再内嵌业务互斥判断。 - -## 12.6 自然保护区与区域底图 - -策略: - -- 统一归类为 `OverlayLayer`; -- 与主底图切换分离; -- 与基地裁切共享区域上下文。 - ---- - -## 13. 测试与验收建议 - -## 13.1 功能验收清单 - -- 页面首次进入,默认勾选图层正确显示; -- 图层树勾选与取消勾选,地图表现与图例表现一致; -- 图例点击后,仅影响对应锚点; -- 基地切换后,区域外锚点正确隐藏; -- 底图切换不影响锚点和图例状态; -- 时间筛选后相关图层正确重载; -- 视频监控站与 AI 视频监控站互斥稳定; -- 菜单切换后图层、图例、筛选项正确重置; -- 悬停 Popup 与点击详情正常。 - -## 13.2 性能验收指标 - -建议至少跟踪: - -- 首屏地图可交互时间; -- 默认勾选图层加载总耗时; -- 单图层首次加载耗时; -- 图层勾选后锚点出现时间; -- 图例点击后的显隐响应时间; -- 基地切换后的裁切完成时间; -- 缓存命中率; -- 页面切换时旧请求是否被取消。 - -## 13.3 自动化测试建议 - -建议补充三类测试: - -- 单元测试: - - - 图例派生; - - 图层互斥规则; - - 请求解析器; - - 缓存 key 生成; - -- 集成测试: - - - 图层勾选 -> 图例变化 -> 地图显隐; - - 基地切换 -> 区域裁切 -> 搜索列表更新; - -- 端到端测试: - - 地图初始化; - - 图层切换; - - 图例切换; - - 筛选联动; - - Popup 和详情弹窗。 - ---- - -## 14. 优先级最高的首批改造项 - -如果本轮改造只做最有价值的一批,建议优先按以下顺序处理: - -1. 修复明显问题: - - - 去掉 `splice(0, 2)`; - - 修复 `fetchPointData()` 未定义; - - 修复 `wq_lineTime` / `wt_lineTime` 未定义; - - 清理无效代码与重复日志。 - -2. 建立统一状态源: - - - `selectedLayerKeys` - - `selectedLegendKeys` - - `currentBaseId` - - `currentBaseMapKey` - -3. 抽离请求解析器和规则引擎: - - - URL 映射规则统一; - - 互斥规则统一; - - 特殊图例补充规则统一。 - -4. 拆 `map.ts`: - - - 配置状态; - - 运行状态; - - 数据缓存; - - 行为编排。 - -5. 拆 `map.ol.ts`: - - 底图管理; - - 锚点管理; - - Popup 管理; - - 区域裁切管理。 - ---- - -## 15. 改造后的预期收益 - -完成改造后,地图模块应达到以下效果: - -- 新增图层和专题能力时,不需要修改多个组件和多个文件; -- 图层树、图例、地图显隐的状态不再互相打架; -- 首屏加载更快,图层切换更轻; -- 地图代码从“堆逻辑”变成“可扩展的稳定结构”; -- 后续增加 3D 共用逻辑、专题聚合图层、更多筛选条件时,改造成本明显下降。 - ---- - -## 16. 结论 - -当前地图模块功能已经较完整,但代码结构处于“功能可用、结构偏重、规则分散、性能隐患较多”的阶段。继续在现有结构上叠加新需求,后续维护成本会快速上升。 - -建议本次改造不要只做局部优化,而应围绕以下核心原则整体推进: - -- 单向数据流; -- 业务规则收口; -- 渲染层职责下沉; -- 类型与索引先行; -- 先止血,再拆层,再提速。 - -按照本文档的分阶段方案推进,可以在不一次性推翻现有功能的前提下,逐步完成地图模块的结构升级。 diff --git a/frontend-sjgl/docs/地图模块重构实施清单.md b/frontend-sjgl/docs/地图模块重构实施清单.md deleted file mode 100644 index 0a977c48..00000000 --- a/frontend-sjgl/docs/地图模块重构实施清单.md +++ /dev/null @@ -1,380 +0,0 @@ -# 地图模块重构实施清单 - -## 1. 使用说明 - -本文档是地图模块重构的执行清单,只保留当前已经明确、可以直接落地的实施项。 - -以下内容暂不纳入本清单: - -- 仍需进一步讨论的方案; -- 依赖后端配合后才能确定的优化项; -- 暂未确定收益与改造成本的预研项; -- 调试面板、埋点体系、长期性能平台化建设等扩展项。 - -执行原则: - -- 先止血,再拆层,再提速; -- 每一步都要保证现有业务可用; -- 每个阶段结束后都要做功能回归; -- 不在同一阶段同时改动 UI、Store、地图渲染层的大块逻辑。 - ---- - -## 2. 本轮重构目标 - -本轮只完成以下确定目标: - -- 收口当前明显缺陷和遗留代码; -- 建立基础类型和索引; -- 将分散在组件中的核心业务规则收口; -- 拆分地图 Store,建立更清晰的数据职责; -- 抽离统一编排层; -- 拆分 `map.ol.ts` 的核心管理职责; -- 保证图层树、图例、锚点显隐链路更清晰; -- 为后续继续重构预留稳定结构。 - ---- - -## 3. 阶段一:现状收口与问题修复 - -## 3.1 清理明显遗留问题 - -- [ ] 删除 `map.ol.ts` 中无意义代码和重复日志 -- [ ] 清理大段失效注释,保留必要说明 -- [ ] 统一地图相关文件中的临时 `console.log` - -涉及文件: - -- `src/components/gis/map.ol.ts` - -验收标准: - -- 页面可正常编译; -- 首次进入地图页面不报错; -- 控制台不再出现未定义函数或变量错误; -- 默认图层、图例、锚点仍可正常显示。 - -## 3.2 补充基础类型定义 - -- [ ] 新增地图图层类型定义 -- [ ] 新增图例结构类型定义 -- [ ] 新增锚点数据类型定义 -- [ ] 新增筛选参数类型定义 -- [ ] 为 `map.ts`、`map.class.ts`、`map.ol.ts` 替换第一批高频 `any` - -建议新增文件: - -- `src/modules/map/types/map-layer.ts` -- `src/modules/map/types/map-legend.ts` -- `src/modules/map/types/map-point.ts` -- `src/modules/map/types/map-filter.ts` - -验收标准: - -- 核心地图模块类型边界可读; -- 新增类型后不影响现有运行; -- `map.ts`、`map.ol.ts` 中关键方法参数不再全部使用 `any`。 - -## 3.3 建立基础索引 - -- [x] 建立 `layerByKey` 索引 -- [x] 建立 `legendByNameEn` 索引 -- [x] 建立 `legendByLayerCode` 索引 -- [x] 将 `findLayerByKey()` 的高频调用逐步替换为索引访问 -- [x] 将图例派生中的重复递归改为“初始化索引 + 增量查询” - -优先改造位置: - -- `src/store/modules/map.ts` - -验收标准: - -- 图层查找和图例查找不再完全依赖全量递归; -- 图层勾选、图例切换后响应速度不下降; -- 功能表现与现状一致。 - ---- - -## 4. 阶段二:规则收口 - -## 4.1 收口互斥规则 - -- [x] 将图层互斥逻辑从 `LayerController.vue` 中移出 -- [x] 将视频监控站与 AI 视频监控站互斥统一到规则函数 -- [x] 将环保设施与环保设施在建互斥统一到规则函数 -- [x] 将珍稀鱼类与沿程鱼类互斥统一到规则函数 -- [x] 保证互斥规则只有一个入口执行 - -建议新增文件: - -- `src/modules/map/domain/map-layer-rules.ts` - -涉及文件: - -- `src/components/mapController/LayerController.vue` -- `src/store/modules/map.ts` - -验收标准: - -- 图层树勾选时互斥结果稳定; -- 不再同时在组件和 Store 两处维护同一套互斥规则; -- 勾选结果、图例结果、地图显示结果保持一致。 - -## 4.2 收口图例派生规则 - -- [x] 将“图层选中后生成图例”逻辑提炼为独立函数 -- [x] 将“环保设施图例自动补充”逻辑提炼为独立规则 -- [x] 分离图例原始结构与图例选中状态 -- [x] 保证 `legendDataOriginal` 不再被运行态逻辑污染 - -建议新增文件: - -- `src/modules/map/domain/legend-deriver.ts` - -涉及文件: - -- `src/store/modules/map.ts` -- `src/components/mapLegend/index.vue` - -验收标准: - -- 图例显示仍按当前选中图层正确联动; -- 图例点击后锚点显隐正确; -- 图例原始结构与运行时状态职责更清晰。 - ---- - -## 5. 阶段三:拆分 Store - -## 5.1 拆分配置状态 - -- [ ] 抽离图层树配置状态 -- [ ] 抽离图例原始配置状态 -- [ ] 抽离页面地图配置加载逻辑 - -建议新增文件: - -- `src/modules/map/stores/map-config.store.ts` - -当前迁移来源: - -- `src/store/modules/map.ts` -- `src/api/map.ts` - -## 5.2 拆分运行状态 - -- [ ] 抽离当前选中图层 key -- [ ] 抽离当前选中图例 key -- [ ] 抽离当前基地、时间范围、缩放级别等运行态 -- [ ] 统一“当前地图状态”的唯一来源 - -建议新增文件: - -- `src/modules/map/stores/map-view.store.ts` - -## 5.3 拆分数据缓存 - -- [ ] 抽离锚点缓存 -- [ ] 抽离图层加载状态 -- [ ] 抽离锚点合并数据 `pointData` -- [ ] 为每个图层维护独立 `loading / loaded / error` - -建议新增文件: - -- `src/modules/map/stores/map-data.store.ts` - -验收标准: - -- 原 `map.ts` 体积明显下降; -- 配置、运行态、数据缓存职责分离; -- 现有组件仍可通过兼容方式读取数据; -- 默认图层、图例、锚点加载不受影响。 - ---- - -## 6. 阶段四:建立统一编排层 - -## 6.1 新增地图编排器 - -- [x] 新增地图模块统一编排入口 -- [x] 将地图初始化流程迁移到编排器 -- [x] 将图层勾选、图例勾选、基地切换、时间筛选、搜索定位改为统一命令 -- [x] 收口 `GisView.vue` 中的配置加载与监听联动逻辑 - -建议新增文件: - -- `src/modules/map/application/map-orchestrator.ts` - -## 6.2 统一入口命令 - -- [x] 定义 `initialize(pageKey)` -- [x] 定义 `toggleLayer(layerKey)` -- [x] 定义 `toggleLegend(layerKey, legendKey)` -- [x] 定义 `changeBaseId(baseId)` -- [x] 定义 `changeTimeRange(range)` -- [x] 定义 `focusPoint(pointId)` - -涉及文件: - -- `src/components/gis/GisView.vue` -- `src/components/mapController/LayerController.vue` -- `src/components/mapLegend/index.vue` -- `src/components/mapFilter/index.vue` - -验收标准: - -- 地图相关 UI 组件不再直接拼复杂业务逻辑; -- 组件交互都通过统一入口触发; -- 图层树、图例、筛选的联动链路更容易追踪。 - ---- - -## 7. 阶段五:拆分 OpenLayers 渲染层 - -## 7.1 拆分点图层管理 - -- [ ] 从 `map.ol.ts` 中抽离锚点图层创建逻辑 -- [ ] 从 `map.ol.ts` 中抽离锚点显隐逻辑 -- [ ] 从 `map.ol.ts` 中抽离图例控制锚点逻辑 -- [ ] 在点图层管理模块中维护图层注册表 - -建议新增文件: - -- `src/components/gis/ol/point-layer-manager.ts` - -当前迁移来源: - -- `src/components/gis/map.ol.ts` - -## 7.2 拆分 Popup 管理 - -- [ ] 抽离 `initPopupOverlay()` -- [ ] 抽离 `detectFeatureAtPixel()` -- [ ] 抽离 `showPopup()` -- [ ] 收口 hover 和 click 交互逻辑 - -建议新增文件: - -- `src/components/gis/ol/popup-manager.ts` - -## 7.3 拆分区域过滤管理 - -- [x] 抽离基地切换后的区域裁切逻辑 -- [x] 抽离点在面内判断逻辑 -- [x] 抽离区域外锚点显隐逻辑 -- [x] 抽离遮罩应用与清理逻辑 - -建议新增文件: - -- `src/components/gis/ol/region-mask-manager.ts` - -验收标准: - -- `map.ol.ts` 文件长度和职责明显收缩; -- 点图层、Popup、基地裁切三类逻辑各自独立; -- 现有地图交互行为不变。 - ---- - -## 8. 阶段六:组件瘦身 - -## 8.1 `GisView.vue` - -- [x] 仅保留地图容器、地图初始化调用、组件挂载 -- [x] 移除配置请求和复杂 watch 编排逻辑 -- [x] 只通过编排器触发初始化和页面切换 - -## 8.2 `LayerController.vue` - -- [x] 只保留树渲染与勾选事件 -- [x] 移除互斥规则 -- [x] 移除基础图层初始化编排逻辑 - -## 8.3 `MapLegend.vue` - -- [x] 只保留图例渲染与点击事件分发 -- [x] 不直接调用地图实例 - -## 8.4 `MapFilter.vue` - -- [x] 只保留表单与用户输入 -- [x] 搜索、容量、时间、基地变化全部通过编排器分发 -- [x] 不直接修改图例运行态和锚点显隐 - -验收标准: - -- 组件文件职责单一; -- UI 组件中不再出现大段业务逻辑; -- 地图相关行为主要集中在编排层和 Store。 - ---- - -## 9. 阶段七:性能优化 - -## 9.1 请求与缓存优化 - -- [x] 将 `GisUrlList.ts` 预编译为索引字典,而不是每次请求时重建 -- [x] 实现真实请求去重 -- [x] 增加请求取消能力,避免菜单切换时旧请求回写 -- [x] 对图层加载增加并发控制 -- [x] 将缓存 key 与图层 key、筛选条件绑定 - -## 9.2 锚点显示优化 - -- [x] 图例切换时只处理目标图例对应的锚点集合 -- [x] 图层切换时优先切换图层可见性,不重复加点 -- [x] 减少 hover 时全量点图层重绘 -- [x] 减少样式函数中的业务判断复杂度 - -验收标准: - -- 首屏加载时长不高于当前; -- 图层勾选、图例勾选、基地切换响应速度优于当前; -- 菜单快速切换时不出现旧数据回写。 - ---- - -## 10. 回归测试清单 - -每完成一个阶段,至少回归以下功能: - -- [x] 地图初始化正常 -- [x] 默认基础图层正常显示 -- [x] 图层树勾选与取消勾选正常 -- [x] 图例随图层选中动态显示 -- [x] 图例点击能正确控制锚点显隐 -- [x] 基地切换后区域裁切和锚点过滤正常 -- [x] 锚点 hover Popup 正常 -- [x] 锚点点击详情弹窗正常 -- [x] 时间筛选、容量筛选、搜索定位正常 -- [x] 视频监控站与 AI 视频监控站互斥正常 -- [x] 菜单切换后地图数据不串页 - ---- - -## 11. 实施顺序建议 - -推荐严格按以下顺序执行: - -1. 阶段一:现状收口与问题修复 -2. 阶段二:规则收口 -3. 阶段三:拆分 Store -4. 阶段四:建立统一编排层 -5. 阶段五:拆分 OpenLayers 渲染层 -6. 阶段六:组件瘦身 -7. 阶段七:性能优化 - -不建议直接跳到渲染层拆分或性能优化,否则会在旧结构上重复返工。 - ---- - -## 12. 本轮交付标准 - -当本清单全部完成后,应达到以下结果: - -- 地图模块核心职责划分清晰; -- 图层树、图例、锚点、筛选、基地切换链路可追踪; -- 关键规则不再散落在多个组件里; -- `map.ts` 和 `map.ol.ts` 体积明显下降; -- 新增地图业务时有明确扩展点; -- 后续继续做底图体系优化、长期性能建设时不需要再推翻本轮结构。 diff --git a/frontend-sjgl/package.json b/frontend-sjgl/package.json index 72fb6471..fcc7ec75 100644 --- a/frontend-sjgl/package.json +++ b/frontend-sjgl/package.json @@ -3,8 +3,8 @@ "version": "1.2.0", "scripts": { "dev": "vite serve --mode development", - "build": "vite build --mode production", - "build:mvn": "vite build --mode production", + "build": "cross-env NODE_OPTIONS=--max-old-space-size=8192 vite build --mode production", + "build:mvn": "cross-env NODE_OPTIONS=--max-old-space-size=8192 vite build --mode production", "serve": "vite preview", "lint": "eslint src/**/*.{ts,js,vue} --fix", "prettier": "prettier --write ." @@ -12,7 +12,6 @@ "dependencies": { "@ant-design/icons-vue": "^7.0.1", "@element-plus/icons-vue": "^2.0.10", - "@turf/turf": "^7.3.5", "@types/js-cookie": "^3.0.2", "@univerjs-pro/exchange-client": "0.15.0", "@univerjs/core": "0.14.0", @@ -25,24 +24,20 @@ "antdv-draggable-modal": "^1.1.6", "axios": "^1.2.0", "better-scroll": "^2.4.2", - "cesium": "^1.141.0", "dayjs": "^1.11.20", "default-passive-events": "^2.0.0", "dom-to-image": "^2.6.0", "echarts": "^5.2.2", "element-plus": "^2.2.27", - "esri-leaflet": "^3.0.19", "exceljs": "^4.4.0", "file-saver": "^2.0.5", "js-base64": "^3.7.5", "js-cookie": "^3.0.1", "jsencrypt": "^3.3.2", "jszip": "^3.10.1", - "leaflet": "^1.9.4", "lodash": "^4.18.1", "moment": "^2.30.1", "nprogress": "^0.2.0", - "ol": "^10.8.0", "path-browserify": "^1.0.1", "path-to-regexp": "^6.2.0", "pdfjs-dist": "^6.0.227", @@ -75,6 +70,7 @@ "@typescript-eslint/parser": "^5.19.0", "@vitejs/plugin-vue": "^4.0.0", "autoprefixer": "^10.4.13", + "cross-env": "^10.1.0", "eslint": "^8.14.0", "eslint-config-prettier": "^8.5.0", "eslint-plugin-prettier": "^4.0.0", @@ -87,7 +83,6 @@ "tailwindcss": "^3.2.4", "typescript": "latest", "vite": "^4.0.3", - "vite-plugin-cesium": "^1.2.22", "vite-plugin-svg-icons": "^2.0.1", "vue-tsc": "latest" }, diff --git a/frontend-sjgl/src/api/map.ts b/frontend-sjgl/src/api/map.ts deleted file mode 100644 index 35ad43ea..00000000 --- a/frontend-sjgl/src/api/map.ts +++ /dev/null @@ -1,61 +0,0 @@ -import request from '@/utils/request'; - -// 获取图例列表 -export function getModuleMapLegendList(params?: { moduleId?: string }) { - const url = params?.moduleId - ? `/mapLegend/getModuleMapLegendList?moduleId=${params.moduleId}` - : '/mapLegend/getModuleMapLegendList'; - return request({ - url, - method: 'get' - }); -} -// 获取地图配置列表 -export function getMapList(data: any) { - return request({ - url: '/mapmodule/getMapData', - method: 'post', - data - }); -} -// 获取梯级流域地图 -export function getQgcRvcd(data: any) { - return request({ - url: '/eng/base/rsvrcscdb/getQgcRvcd', - method: 'post', - data - }); -} -// 获取梯级流域下拉框列表 -export function getRvcdList(data: any) { - return request({ - url: '/eng/base/rsvrcscdb/rvcd', - method: 'post', - data - }); -} - -// 获取梯级流域下拉框图表数据 -export function getKendoList(data: any) { - return request({ - url: '/eng/base/rsvrcscdb/GetKendoList', - method: 'post', - data - }); -} -// 鱼类分布查询 - 站点查询 -export function getFishPointList(data: any) { - return request({ - url: '/wte/we/fishPoint/qgc/GetKendoListCust', - method: 'post', - data - }); -} -// 鱼类分布查询 -鱼查询 -export function getFishList(data: any) { - return request({ - url: '/wte/we/fishList/GetKendoListCust', - method: 'post', - data - }); -} diff --git a/frontend-sjgl/src/assets/icons/locationIcon.png b/frontend-sjgl/src/assets/icons/locationIcon.png deleted file mode 100644 index fc01013d3e82dcf4ca750d327b5fe4890f78102a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 162 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh1|;P@bT0xa#^NA%Cx&(BWL^R}Ea{HEjtmSN z`?>!lvI6;>1s;*bKn;gMnDKc2iWH!rxu=U`h=qUh0oJ-de~RT>7RK-#U|H(PrtGM! zyl%qp|Nr;%bfl%E)G&!TFsIz^5bimqd{atNf?>0zxX6)X&ldoVVDNPHb6Mw<&;$Th CdoHm6 diff --git a/frontend-sjgl/src/assets/images/map-dixingtu.png b/frontend-sjgl/src/assets/images/map-dixingtu.png deleted file mode 100644 index bc1969bfd5ab93d3bdd4b94abdc8d289a8231e8d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 42802 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%0AV~Kr9QK+4B$@EM7Q{rjgd)84)BDC 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 JPDHLkV1hA@j>`Z5 diff --git a/frontend-sjgl/src/assets/images/nineSections-dixing.png b/frontend-sjgl/src/assets/images/nineSections-dixing.png deleted file mode 100644 index f39453ca3332f24eb540d897523805008b834b68..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 297595 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%0DxLR2kH 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 z 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�h~I!R&b0_qp3{$1azf?GDU|;O+g}AO6J;t5!$q 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%0D@d|Iv5ey%;1e znJ9#ZRju`SJc`s|?4l|Ru2%>wB4O#fK~1HJHlvk7Lx?1@G-)~Wg@GSNKGyYJG^gsN zwInWK4Ihl)P@k@ZxRp=Oebqhe*{6VpiZ)^vQ8O5ZOo^xSwA=2w)XBv* z?0WHX&djue)U}<@$J6nIThP8BI09`;`uz_v&@q4fV1It}7d;HgpBMlDmvn<(z5MV4 zOild#`}fo1{o!!Fe>mK|*buR3H5UhS7ovD~V6h7-W~SS5w?7?mNC-Sl%QP*juI|h{ z*TsQT>8Cbtce}ay>xcV!GO*4esc~)CgdGqd)wa~*d1>m7ZusI3%&ByvQFBAi3Cu;& zktlU>2RLwe9wG*eVnq_hQb@Q^JcmYJ{`=**sQ%IpzxX4p`f_z}C$#8Siw0QP0=;Pl z;7G*B<4Htgz(~Z25y8NX@Ht#QY?e=zxYuDYK}VhD7Ev;S6XBhI|yC84Siwr3X#- zxokTWP9bt^O|ELs=yP2y+#?f8h{(i59A{*0{X{bl5fC-*co9=W;zA{UQ0Ou*dyK1A zJCe9(lD{?i`h0u*@o}?gV)9J>@i=dj94njqzjOO=lV?-Qsi=pL%FQ(By-|}f=gZQM zARtjn=_&aPeb$Q5)F{|0kmby)VGN^-HECE^zTh~H5u{2kfa^BtcDs$ZZl0Gb}tlJRI(zAks7~^W1XYCLHG`UDwZx4#Q0;8wb08 zI6dwsrXf)VWYK`MCr1|rPQ}pXMFLQB|F~Zkp=F&-PO%w^3i-Rw92A7mO6$LXy zLJHlmUYpRc0vj*UD%x4U5*e0XHVdy=V`!dKEqIRZKxl-NQW9G|8UZjiXV49i%@8St zW*ZR`C2%!&bYM(wt|GtpyT9{){$Kyc;k3WKy%jT2%Gkesd-$_IeX|)pI_#&%$8#>b zVcgbM0muLk$K!E2fpZnPf4INdz2ZdclCv9JoSWC1PW7UEj4aFnoe`N6r>tS~1VE8Y zg|aS^$%`Z~NSl#Hskn%QH?Zm|3%^+0hwi~r-}L|qiOhkBFQdsd9Ss7Onz}oX69X|K zBbXxwBLV?!t;pB512R30Y@=mNM89!6U9OH#n#^gF>Lsy5cdNCTc_eNk%}jDm{ZL}w z$xO?lwbq;Gneg6hp2B4 zUrlo*Oqo-rOq?>Mrj1$SGO8M58HYS{+k{zM2@5)J68_y!><@on4)BlvOgJU$xKe?>3BFF_LDi8 z=KF_}SsBK$RHj_-%j-aov)e|Q|maooI|tIy}|@v%zlVH`w}QywKf@W==pUB_zD8WlHD(5HXcR zPqHut^qkh$a)o9+1DFN;Yu&O5Q5h2xQRG2A$wl?=7aly^-`@lH&CRasI|u6fl5^pN zs%>7Tu5==8o@Yr8K&4R18P+u=QE9}Om{YdS(G9^hsy}x;pH7I_cinX)+FGmgQfn=x z>r0PJri$+7CaTl3H{|Z+iNjzx|t!kLP6}k$iXi z@#C@o;>Uk7_8&M5Ncoe`KYf3Hc({L1gS-54n|fvwk)=s(#A(xYH$wK30Ii+w|bb#8bnXk&93r#I0jf>)s+qVD`@sX|7n8ow ze}%tK6l=BCVHo0C&hunugy>*qU}mk=oD$;ma0`Ud4>CmOL;z+k?hVOQwJm}OIn&jd z{px{swRqfax9fyrQd-@5y|ukGw65#Mp^pgMw2|Pl%;)oYx83z!XX-hZ zn_cg?6Pv2e)3g`}BAm~s%>cvD?H|uW-iWlW8#3o+N|~ctBg|cw*8wpyA_FqI145th z-~WjIyO-tf{}0Evlb^&F19b&(W@_4)i&!fq*SUT5)mIOXhm<DGbO^Xf*A>ZtFId2{x>(_6Ns%Sz0C>7?(31ym^v`EIE z<5Mod1@N00(7NFMJTTxl{`&G0{9L*!h9 z=;{#ec+<25lCw5V6e&VNE@2T8%^6}85eFrrei*Cp`}@;UPal7H^WlrTq3hPqIUrFc zX3^Gcp-d0^`@`Pdnktxoh~5vwtpkeMm~ub#U2P8!hyDK0_1n{Fmgdr&D8G35Q7*kZ znpn_U)|M_3ta>B7T2#dd5X{xh%+_@I5?dmEgf>yM*<}mGv`K7rw-!KhzSL4zp+nC3 z;s<7lh;(&o^^4-xS3(YWiUjXMd%XgzVf`dMCBGL@Ln+HUultZu`+NLGSj&7{29ge43 z<>B$Lf7pNg>1S)%M5LnE8c%b+v(Y?0T^PUcYiN`?^vao-c;Q zzm&GNR}-Y?reQICODVNhYi%iUh@|GZiq>)L-8{Ae0Z>Iv9g(_D@!IxqbOVu#p=>k* zpGKH)QLK4N+;v@?f@N8lIpCNpimYR=`kYwW5rMdB2_|7PxD ztJ#`}B0?$sJlDs^!^a=(O76pWhRJd+vhIhi)_xc5q$2?#1|VwXKDzyfAJeJ%S7-mj zKdp@P_dch)&Q-O^*^F|L!|9N7+HAX8U8E8vKo_a!v#3tpfVa0V5+|{krx*aYCOM7h z0Orf|*s4E1o&e!^Jhw)O9Wh4;S`{15=pz6B@$(K`5x$%_=iHjqRzLHX*s|e{5utJ*DbzNcx#AnNJ#LOutz|1K#JuzUe)5BWpG)*bs zQ`h)%9r<0ICZ0DJuCMiK3vfxnE|&|w5vSm3!SM1$a|MkndU-Q`)ijzK5eHgKS39hA z90}Lq!?W0WJwo9buQ6gktjnkx0+y~zIRRkAnoCPdM5L5;fU2s*-n>zw9y<|Xq9%HUK=9t*R3-Q$}EQ z2};DOQ&q(k@&N{BpaghPgWG@o+dM1$&p(lW{#F63OZ4|XH)2?(n)0BgU0(=?Y4%!Y z10w=3Z>{E%KKr|9EC*RRo||6u3UO z;@qyb(*HIcf8}?3?Yt8Jf|$&8IZu;2rj+A`a0fA$wyuKKCiBu%A(E_6ry)|)I!#lp z6}uc_ViB!PiJ;3l=j0CNtj&-qF;BC8EsxVAFK%Ak+zctvFz){Jhkx?Rb-^l$Cv9)?lRuC_K ztQVmKAkx!iU8AWRtZiEKt8rljnb-oqY(_ux#{h_aITFS0xS6-M>PtloA+8Ij-V z3&dz)cWsu4kO~l(+3&uD|Kj`nqm%uMxAwok_5bNd@cmo+{w-6&(q#bn_~Vbi`s#k3 zmz0tLsR=Q4DKE>6$f|yS{|KNrw*yfw1p$%@rJ=7-yPQhix>Z$j1E7RRdigxSI{R_e zAOhjPU1965m{vX;Y@)d@wa&{dswsxXlvXnsv)W9>9HBLtmli~Zl=!mwPEADDO^=|J zQb-CAky1iR^E7kjsGk5yt(|9W^}H-NE%U1nhH>}e_Qi+dZjM~Kp=?Fqa6B%}h&l)0 zl!&;AGNrrQ7os-Jb+Z{i{q!?HJ{*qIynOxjo1x!`p@=^>nz^P_*GBNA&xLTwY~UhC z3d#GWPF&{_QL?D6Ta+oKei)kg+-#kxUZ@S%;>OKlOYTY^wTsST4V2ef^hqq^v0lV@ zeK}9-y5VfJW?pV!V1cfui`pzDjs$c4^oL3V)&+&orU&*aqACuV7*R3YtcjV-rRv>_8?cGFRFRU0#5p`o1M*Loe9+wj z%qK2OUBWep5;3Bf0^sj|#Q){@XcqtDd;e!|{I`Ar-@Bu}?>Q%Ju-R@}eX}gJ?>lf@ z>dc9`iWVZUaKiuBE>c=kSh@b#Ovw38_IIR&hfh}Dc!88aV_r`FnL+wZnJ&N*j(d_27U+EuF>yCGicHGAfp z^?af2IpObFAN*n~v<8{g<>FE;(ltIrQ>nG~%%W>84CB|Wj$uSt>k|5JW@jw3_KQ8dN=#LNnM_=H7_Urc9O|R;rde}bz5Ob=s zwkB0Y6gInUKWzG*kEeS%ANR+J({UJvT!!6leDl@A!^3Im`8?IWAJx!&MZ!n#a=mIy zYHF9!&;PqY;jj7eQzw>}JMh{j`9@?5z9xlT5>hUG21iUyEMP4}*c6(06(dRjDbj7k zM3gSQ;_#ZmuIn<>xh_qm6hN4<-E*G$))f5X_`BCM5uLP#`Ea}n2EdCa(N!GBF}nWH$8_< z#fbTNf9VQ=FqNEBDg92;GF74k7opcxw;$>Ok$5r(bU9t|Gf@LQ3(bL*g}&>jc?!mHWKywq zL&PZ;X#zk@%$&gOIni`kmauWnITNN<<#e1xWElEbs3r`}dQ`0IKqu6*Vbc~IH2^%F zkE(N%8sAlG-R*Ynet&;|cl*i{Pe--Zq&5@gluPOQ zv6>_m>^+z1YI9c!8lKxEXSVIiikltt^gj1pYdf88x;_XwOaF|xU?+rr_A zw8DZs4DD0OO{CVQ)s}XW38{%o2Rg~^tyadN((K$7DN~v^xpK<|5QA5#4xI%P9 z08E?`ACHG=Iv)-Xhr?rQ()Tya{k0y7q1lyF@cfiMXTal=)WPCLiz3lHye_UREoiMB z4u{j})S85!;dQ(4Y06LB_r1HPE4?(@^2@x4N^JZ^3e)%f<)$)bUY3Q(39~5zcoegU z5Qb~C2E}#xfH~z{2q}sSRk_6DFldWro+C!ehNcFHIbV5IwApN$h*_KGg(;T2F;=2m zYpN19w&OT%Hd_E(mSYgyyRIkV2)N8?oz%F82~a#OL-^O4m?{z1TK9+hX*v)6FmATd zRqVR1wa5GWhwXN^+wF+b={#rBaojxY?-S)|naEJV&Zo1XsVN|IUCF64LsccmoRfeg zEWWD2%|zWTC4T0i1fkDB;3nF%5>1rSbgo_L)yND#-Oz8{(La6dKRNn8{xkYJpTY0F zENHnaBe4O_K@CF_j~z(WH?O}woeuz#b3ydhd^%V6qv>@2?u1aly>tVtlN1Y2^5;|C zc#6bo`rq8b@GrmezidPQe7v(Z7Gks;Mjv4mvHGwZb4Dt_plTxPNizpwnYdtQC3j(8JsfbQp#a^4TB}?q})kRDbXwzqZ4>t_Q^X$HTk#kEe4pzwBgzwYKaJho#P7K$v1f z(@a~_*5>0;z!;$iU;w(5K=_v{onM&);fl?~Z{-Eg^g7>2D%D&pT+P>+RqV){DFBwj z=c&5QY8FJ6$RI+(=71vV2#NE&)Mc)KOhia2(Eh;8oQWuQLo+d(y&tf(tEQkJ!u&Np>uEd4{uw0K}>zO;W3~0dOFU8 zi8&*X8EE(`fVHagyqr$w$ZO_l>Pl9r;5v?76GsXUXN;-L1*Ys*aQja^=U4xSYsM52 zYFUaqS=5C~Mc{0%55d%+_0@}`$QOJYtr6Jp3m6DLQnRovYQo1r-&U@YfxG6!fP zdg)dmTBK1Tni7|inrf@_epwu>8**Ki+9a>3E|k)xRHV6ybD^B`yv$+0$6SE2IfIiM zy?*_6v$eaM4LG|wVq&)Ni9%um2V?+>kyM-wLUh$}w;B4vwCOvZ7ZWY&S#@1yx!k1x zPakjBQV}lthJl6`&PU>E3y(V!@?j8t(oO3b@n#vk1uY|3u zbSSbxa1WeIfb=gNDIh|;yjxXsGjK?Ol3)ro3WO{L{CVp590(Effy9YdcD-FgI3nKc zZpU#0XfZcYZM9a>R!T0Vgz;)TuW*&Im`COqT{)zba)2vDrHlw9>V%E}rf!bl%qbIPZRol>wq0lm0jsiK!GQJcO`@N2T%|zI z1VKK}RTWm1U>Hmwpc%NEp@^$ON}O_Ea&~ty1TzPAhv;)9Cn8MA9m&-Y9FP!zIUyLV zkV;ln0IIc#V#+K_8~WZ56fu&1;aC>`;Xs6TRc&^8jTf+-7 z2%aNie$HM5eba+^4R#rju*n+!`o15A;dnd*SAd-`7bea~g)+b-lT`EBLyR9pix@=U)RZ5v7y~E$nFsV^|pCtT5(|4FkN4UY|X3 z5t~TPg_xGPBJyUlU6xv1wws-(6Jg@agiHyX>mmp^&%%^SN*R_T#MrbwYHULEbnH$BwGRL!$ z(7#pST-kfIR`qC!#*m#ILa=T`#6X;&>q^)4#3W5fK~3G+5!_=2O-M)#;rnpy6-NE& zzRrk4V+e>MdVl}0-HiMFez)DUR$E;Fu`4B@b<8=HF36Eg$zA93gb=JZVovisF=b%x z%E)Om^nFUDa8XZ)v#Hmma%r49Z~#?AG(!YRoa<8Oc|yd~=`;>q>5|B@R8gI4y;%8P z?7}Wu2maTd>T6OKV03A+)Y_G<@B31Un=eZZb1YSy=cVh1*t&~UtCSLQ`G|n&IsF~L zL;ne|dTf|kDP2Uk_$i0O9x?5#cS*88quDB0neVhVR&t3 z$g9aL0M^=~Vd;*{37s%#x5nnE>Rm30q?9t0+)SC1x#rZ3qa$En`liCn1SCxekeJXx z#Z)U20fL(sE{j>4TjC6ixfCK~Dv7%ZX68->Pv_;X!8Fgu!wC_(KC4j9<2;}4?~g=H zEeJsr=vzlM69Wy%j~OOTL{94^W;alCdMb`$c)KFCf7%59SLb*hs;+-{ZrJxciix^` zGbNoQG-n6J#oOk8UX6m1lP^AhgJ>#bdDb@$jp30fxyx6~}fK;T&)JxqaG zYf^Gim1twvy3F&k-F8FY6H`p?4b3qIlYH6pgJ&K0EB@JFh1-9-5{^_k)U6>zaELum zCnR^MwFdl8w227PY9h2c!eT;VQ}=jY5F_E0Z6Ckx+6%mD{jaC{svimQ%RDb}Dx_&j zojbNFSh!1Nsf{riLQ|n&nhiIOT2fi2^P;u3>MKAhmDC$dX7Lm?Sp9g`2-p zTxzX{!vUEJ^_g=bR>iq3Vm1uB<7r;1o=$atzd!B|?q0e~Ohlz*ug%1cAyO`-qatURMNG_$5Ei9^NN#YPrVl^58T*attYXtNANR*rTi=hXN2epD zM3}s)s?}Oo@TW9WJskG#y}PCyO%Ee_Dx9AKdw*_Y>*;eAEYCm{jGMvT=Vh9viFu4_ zPo%Xb5u3~`@j6Dk2CVpJsn%r}`|CBkK4IczF;U`l)^pGi&eQpHI&L=Gl#&@F#+)(} zuVQ?JSY}>xD_|qP=z^mLwx3D%xF}^4r!b^36#!>W^ITi4(D$X|7~Q12A{inEsVc2- znn;DfRYf%LfomCjt%05>)KB5eukH!%r_cqv>F60R_H2^23oU@vqPA3ODO~=Q_$8H?@ZUh5$U8)|B z$F6KR=Vdue)AIOu*zb?ad2zSnX(EDDGIJorSPje+fG9DM8&WuvGm}%mr^rl9Eo@QD zz}&x~27dbQSF@kx?$K2JM%a4(iT`HITK|L`WwV;A8m!twX(9la*2!-e*0t6|&0~K6 zfYd;3oeQn2uLy{!X7M-yh!2D#D$&YXVZbmYHIrc+d+0J#&e<=IRRB1j&&Sj8gO{&P zhl5HjLk_=7A_{3SA_9?_KRi7A#^)cH!ufnymL=GorF1}SW(Xml%qFhtB9d|%#=+gX zuI%^kku>Kt^eLB|6CkClgG_X?g7y5fj%x?%y14q>hPl={O><-nBGPJ8)tpnueP|&1 zu@9H%*ps^!qzMqzL`{OQ4lAe+03jtJCO}oI`@^B{1~cDoZ~Jbe=57@X#%@#qVs?X- z@aKkr1#qL(v~{M{!`RXsy2*6*Ol7l?YJ}Z`}?n3 zQ(^=fy8tL-T5L{?rkc4V1XBXU#Eb;s$jh$dzog@@{JSnY13&d=eZ%465~1KJ$$I+B_zJG}QpDgOreN!? ziJC`{As}~mwb1kg)W{uDPJn0*Y9Jcp#kD&tW&{cZ=xAVKs{yI$ijqPEXSm!e(bIsG z2oP$W&2$_((ME{lW<+pvR9%UF&9tcik%B2GWdcHVAWG&A=zU+}HrZ@moKE+LLlP;| zNss5&tRM%Y4O1e-#7w5Lv}JB{Rq48vN{RT#DXZGD9Nnm7?uv*A0-1_wxUx&vb?e;i z>EifBT>c!9;2{AC`9cuB))iwUGnnUPUKRjMDHErsQ6sJL@@orgS(Y>mqnem2AY%~n z)zkzKD7onQ{`gR}9#8N4{?oe`FF*VAdnFClw6)o4<1#F@cHO2ef|znH!0{YcKu-Wj zCc2n5)5S6NeiC9rXY&L`fb2?cmYB%Fq&YNXV8o{4j1Dr4gQ`x`9Lgzl0;O2KNyMvR z5TJtrn5ZHFr{qy|`*j^6nuP|4NDk(z8lF8Oayp*I&8UKRw;#TI@!?XZuHzt~2T|sMMn(GW*43(1^v?k}+ zq9~)Kp-lt~Uw%1%1&=v*FJ6p^^YL&v9?q(1=yrFvufF=~_3q|nP94tGs4UAODyqmp z1dfa==**i++`Wn6>RIEifPe|R^#sIx`%3J4YVqY?a*Bn2#X8hiCb|FA?^|uDo}!gM zFCebp9tsb4H(&syoGE1ytIOi6s=cRH*+4o`}QjU zyuJNAPt((MGUA#Gaok-T?(QBUBys&!hd|wQ6OfSrFt@0*D*CTuh3F2lU`R+(bsFbd zR0Rx_prYDBUnf_NTC8)d)*4a@RmH8$v+n=^AOJ~3K~%JPUo};E6#xaSwUoK!7{f3A z@t1F|zL>M9Cs`gPUDdQ8hKv~ zoWAMm^^w!A-!aj}^-TyQTDp!!>hsf6O8oxrL)Z0P>H-HwW(t8Ll1bz3)J7#UL}G$K z7*(|jrVwix`?MROPE!?wi~dr~#!`TT84kltq~Ct?p=2mo`o2@OfNuL9QQ_g{RGVyd+c<5+7=sUyNtyek(&2#3Q} zh+&@dG)*}dRV8K)Tx<1e(W|{C9ufi(y3^Ojm+(ycTFa#dMl3yR5%DeBL``xnrHJS- zjF*=ehy-c|%jCaWwF;mZi5Z(q4H6)kiqGK!!s&F%Ip5vi`ABlJ84gL6s=++ZmPHjx zDLI#Eo-Qvh_xrt<8X?A7MMdAfeS3TRHfOzmc=m(#+{gD_tra%oT)1gsyi$Nz0U0wB zQB$XgcMi0B-!SLG5&M|zMaljewhE=pY98WP5#0F$U6KR|0aNT!jKm3r&}9-t5f-~@ zr){V{JUkA=;L@PD>SC#>DS!nI2uV~HNV0iqA{i49LYD%9A{we9k_ePs_g7a{1fjZ| ze2NK)nRvb7l$@Cvi4pyxFlzW25s)F_GBLIaZ?$^Rz_g+oAro*6-L8{|$NNAOI5A-i z-D$|vI0U|Ue0aFMeS3YlIqWVYCu`IMLZrUmou(%u%BrRnD5TgE@o{*%e|%uJFTVUt z=S;jSIU~^VR1qnqL)hFpw0R|eErpP7Bu}uZ8=Sox78Q@02zj{6zMza`(5AnKse`&h+Wr( z7!?eVoH}Idm5kVC#Rv&>^Jj7Ed$0{*+nIAjszovt-yo$_RdkW4T6L)x(1+@vO|*cS zAaU0PXH+dha#gA;u|o(^iZD@CMMRgxK_w}rR2NG|6~B46AVNe}00u$%zE_8sI1k5^ z(ys6NzQ4c!?sPi2$Oob3oE1q;BayDXwlfIWx}#3~T!#&P%Ej-vrBv5#pQhP`D497% z!$!Bl#k7!Ke0(0W<~;2BD1cfe=RD7)6k(>m@0cM^Wp}aD0;l6qdfM-9`nW?QAWCVc zqN3J!JA&AC{qynEBuX15U__xvAqoH#Lyx6uv))*2IMA4s2==>}%g9Vs)KuNMz>E-_ zWPr?(C=wF_)Y_Dxts%*1x?CB6goGRbc=eg`tDIm#JPZNNh=MU7pfRB`r&7wCr_{N# ztt&S~7wU_lySO+6P6+Ihc%{fN3x!ZM@4Cy${^OR3orOMOs@$UY;YJT(C=kGt< zaf&gd7yV&h6V(d}tkY|w^ID)g|iAt^^Mv(^5 z;o{%9GD67chr7;ykL&v~M_W{KKYrR~_-0EGg+*`)H@|Y;Wu@d0;(oUmRn^wQ_rAKQ z4#P0b^YihD0DZqBrdox1;i*0GQnld0w0TvyZ}a11e+ zL7t1KGogT)Lug)sRfGww`IDpPeQtpxqEbsJ;qvk_=Q#wxz00|x+_=CX?Ne0;iBkLNXf zpIi3r!)*ALj|o=iApx!;&bY`-ZijQiJdavuP-WnRA%zqunE{7TYZ-6=V?emRy4t17 z6n3?sRAi1!0g-A|si>g){Z&klA3i*VFzzq*w{RUVdo@K&<9G^*2@oMrgCE7*#|+e< zszJ_$m<*MOrfEjw+v{Fb0AiOI39`>}FYi52h#b^=oo9(I0y9uYw$Qu@+L}p-2Iq6- zvK~y%x+EmvaCLPJSQ^F7j4A9cFNR^fxH%XSheQy;f*MLyt#Em9bsFaH-ajZruyFtI z{B)Y9v8pIDGw(_sfA=5X-n_Z0dCYUkPorVaAl# ze0Hbr6B5Q4Q`KLws~PO}J2MEBz|!&bY?i02G3~n@P2<@0@$PQ?{EK&H!C@>!bx~6^H852{Fu-Q) zNE~A9##4TN9(ETOXuyjRB!B}};%$oNtYx4EG$Jr|KoRpF@%1e1t}3@DMbuA zj-jK6$5DWW_tMU zf*{1aq8o0HOpPHS0ASX4#8Zx*NhCkI0YmY)hb35a;_GciG5hZ z)G0}XNVSSoMPxOsVn|>{rs7qUna!oR24M^ygV3Zl)i$-&AZI-Z1}+juRTPmOCetd8 z*h)akIq{pY@hr5S9b-&oZ zHML=uX@V*&0(z3?=h}7o;qiELeSLR7Uf+-kp#qaO*(_85X(Lx+UFc7FBn2kk?+?T2 z@tg1Nf7M?jkw^hBrieerjZBT0$4PP} z=X#E#Fem1H&2gt;n#FU_UAU^wV3m%vEh6 zcWt-zS21fTG(VkbA=sv1Y;BnKt(5Bex_!U%3Fusk%bu8li@~9*`5?JoKW%CkN6=UP z!kX<7FraTzPdCt9GQhQZn?i(dP*ep&LIg1b5i+0bqpsW4T9Jqr{W5eL20%asBoD8p zh$x_#YB3cv<3{kd)ODaCrIb?deTGH~t)+^toj?qvrYgc5Rdt-k=wf?_Dn`s^rIaj& zQY)8o3z7gxMF1ZVi^3wb-rkW<`1;v77s{$;3V^%a&dfYu<(#K!n)9q?iyb84q7I6S z4WhNAn8NY*2YaH&52=jNN|X%KNf1#A#V+nXzldQkl}$sSZkl8`m99&v3&Tm@zdv3d zxYkf}{c!g@jw%wtq8S~JMe5TyPt#!IU|)ar$jl5HBklUo?_%nJm;s}LstHjd5(5^a z)Ln#F9-p43NjVWPF+!qlw%O&TnSc;Ql{f&I3lg=Uj>t@A3hI!xxeCitN;rJ2)~FUn zM2w+G5d%{+iw0W7U^ZkniXp~o43z+qK|mz6Iv0I<9*(Cn<$1rqBJN71VVK83N<|Jk zvs!8eqKGV_#AHAQ=m*6da;|X9E?{9sV5p`{q_t1ryefj$efW0+yW98VP3KDe zqhCM(Sk-8O+gKRrk`XPx>ACYppW+4fj%%0E?_#>d2Cm|Yy*4b{bCk%%HO zxYPRic+8W6CTFtn+iU?{T9|EpeQ?$dBDGm!Q$TN>H%Xht_Q@LyWTsV(o%0@il7p== zY1&&6GgC3O!{LU>RAHKDcWIfXkr_LTbD2X7=0o_*h~(K65Y<|V(>%}SZ&`Iw40VR5 zp2{jO(b74dAyY!Imc#I;_U_Fw?8m--G!fu6knT*Q|VFvh5&Rb8i$h{kHdH0J>`r5$xr<>>O74KHXH|q@ZrOW5Sf%%`xN#U z>GG<(I`kYPGfADZ08k?8%>q*5u&Z*sdpL5Wcb{E3jleT_cOD^P^l9pi0D<3Qa}JcTpW% zCKT3<{r8exeP76Gwf^g(;yj;VVCrKP*uJ%9O|Z%dy^vyCUSQ*5cgB3p!=2O6iI9*0 z8k4{j4MCgYD7d~zt=V(ju;P#H9Ex>@C0s zZxj{*V?r}?2BI2(C;<^U8`j%Rc71&_&qJv)&-L=MVL}WD;!DfgI*zSr#Mxbgkmy%17 zY6$y_3sc<14g>`lF){9{Las2+Hcj>J{@FmUt`2~vS|cX|QBX&)m}AwlTsC;VoUu5mCFa+cGO zb1_vE!910@f>{s&gaAe=h`@va%mBHK%-B|=6;08W>;MrIeX0r7UI(V_Zv08Et(3xx z1{1yD<}B0Z_C08?zn0&`&UA-WEY0`i!Z2uIVo`-eRjYnKS92xH#%OnBy&)=V)k7;G z&OVhVI_(p-Aroo+>t?nHsn{Cu01440j91x~vydFE({2k-)srqKI=Ky~xlaWK7miO| zA5%w!F$N+~k!27P05HW=E6ha@F~;QV3RN}37~?qR6p4^Tv`g{v@hKM}BsAkWU#RlS z+sp-8AMv{1-5Gs24gdsVwYp&kIZMm6LRVJp-xT5hk~ovnr^K@iilE- zuCPc%;Rh}zDfZ#_9)xOzQsD7%Ad)GY8c$Qr`RQ~T0SIGI5i_(UFK-1r zpaPmI0s_VT<^FKF-|bTj`>F+PXJ&|Qu+C4%;WSJSPp7#kVihf4fBhjPjvd`zUx&cV zohgdQs>uWP;#R#l#2KL(U`t!tbwdVF4b6xx`tRi`_m9KrG^XxaOdlU7Q`_w@Mjfa8 z^zbx{Q;MUD>msljiAbqFna`?LXYs)orU=F&ex)*4g~cIyfmGH@otyg0+1+Cq{X0Jg z0Tn)mH-AFwRo~M|cjtk?CB~>J0xcnHxdVOgOP*VG8+B4b0$2QK6EGsB)LJTsq@tyY zsH{e~;E=;I>CX0-Slu5^NP zI0nSiX&i=8MHfYRCL)n)YL|zrt_$;IuC=Y;zJjJ^waPrt-jrOL&&0$F>w-McFbDrb zQZ>(6iiA1uMfu|>jd;1=|HHetUr_kXhsW=pPvewJt;Aue@5B>W*TX`@=jWr7;1^nt ziijfsbE&I#&3eWxgtd+MLov&js(tuye0rWz*oDv$LC%JxL{Ul|ryN+2D27Nxr8d6C zxn=3;E|?R?yZ++syDx5T4v0ns!*eEsF~j}vRMi;x@%cEM<~&z1t^y+X%{TY^T{M(& zn7WP+hy89B)?&}G4_t1l&LhQD*iT(m0i0!OhU$P3GEvV6Vy2pN3FD0S57S)o!^Y0s3H;x_-_=Hqtg0xV;=- zs~i7hW7ZZ7I%giOHr7U5f02RN<~H!X>lM`JX$T=9lbV)NOR1__s;U8stHtR;H9}{W z78SyP1h5E%=ps?0dJZk?-&{&nLV`A@?{CoD7T#(VZ*MO;c`aTbQW0^Ij-Lr~K~!`{ za79ICS}tk#3@}6#F}LgrflE~)i>XVP`rSSRG()Khtga#KxtglZ^F$PgJ4BqOJm-qY zUDxj~cBxA$HKjz{wA)X|<2a6@hSPLW>;6+`zTfX|KYMp^ef=iz^}hSpZy$bt_xS$t z=sdDoYpuo4*Q!(Y_TAgA>-^hknjRk?@9yr@EOxza2-2%cR~0$ir2gn7rD}P^)E&@R zEFcjDL=0Z&yAVKNHqashcpgV+ikGcK2Qa7xROB>F2B2nv?Yj?m``s|*>GAGf5%=A0 z&ZT%FO0fv2qKeKa!*o18ANxN1<1aqj?cT)D0aj62*tacGEn_-vY3O1GgdB+y02h&I zEaOxaC`8wr#3DM3SR{S8ALg8=QHU53YPC`bpi3#J8j^aa#{9MkYHDU0m_ZSssqQ&& zbtX%0AVM(OM4zSbv8ATPS9#Xvxv#Yne6d2SPSOX6HR{(~t9@gGNM+8V6u1rmgO?Wqhi&3>KSp_fmjXWY}8b zX-oHA%Z%1B20&N=fn}Od!AukgNu4{&-gaswV>1>+Y@{4CH7&Wsz+KmOUF`b)`255S zr4$!$Ff%bVvs_B8l2SsB&!zbRE-mqePsbAx1+!4(lL3pE zZ{NMWxW3}R0C4EL|M?GZFS^JGABODGJqsz!mDBC=^75Cz{N?d@{LOEElXLD;a%n_H zWMa3E@Bp=%RIle20De4XncDE7#?Lwv00gE$Ozu7s0wa0mtS<7;A$Z=g6g#W5o*5`2 z&ZU0y-Mt6k7{f3QrkeIk*N^{oJY5s8c^z?KRC897_1w-O^JZ3|xRaKdI&mkDbQlSc(u_>tv82RSW z2B(lg0|6S@M?CHzApzL5sq@h}A`0f}4l$ax4Jn-z3pybR~9WKMC1X`V~2`~AL3VdfBG2$6`Uah56# zg9srom6}U&QHmO4%(_RZnlRoC~# zluId1xW~5Omp4({ZNu!xV-^6ESxC^EUtWBx34nzVM5WZ?g(!j|3V6_1;L0}PXJDX? zYu0uP12qLoRmm)-lyWHs!Mr^Lj1&x%L#$N@!|mIvkl^y7yF7G6WL8uJQ2})k3{-?= z#L&kTy*W%s6h-KC8sEQve0V$#V=-W6%tgQ`#Gn!=Mh74Q6B3DlshN@ih!{Zo44sdM zXowgP5L8MH9Kc8wz!V`g!mJA%Zkv4@e0{mKuCpj>pn5g3@{9{eB2Pu#Pe75RiW|05>l!tzosc-NDI(JX%D8Ia(yBhUeBjkz zY`jk*Z1hR*D4@B78G2M);~A(^TCn|Kt%Td;84xFopr8f`}Lr=Oqy%LWxd!8Dhd$q50r%;zkp54p+y z0avlRhsV47$7vQ(_cIJcY=(dg7!cSokM#xzW{AXyo~bY7RkybTIztXj#9*GpDxx5w zixe&!jy8hDYv1Sm0XsXSNpqje!@tL9Wt%U4WDv479hR8YpmNt@+zvOt3|kGeSKUHd z=QiT`)o>{$+e~s3@2(;ujS5HP`&dm36nyT>=@4M9*knY|%ng=)!16i0T)4UGfSD3P z6G<|sJdkVFs0tW1vu?0;dc!l3mZZTlIohf9=$uJkPk$m} z?7FKrZ_>+v&5e1_VA_A&-aH8eXTKYSF zYcfM1ZG076*s-wAqJX)grU4-P*pV0!nN@*_QwmA?9ynHnYL?9kf}%;8M@SJMIsvMv zxNV>NGYc311fVfb@9!U`Qh|bFs!sF*Kry9&Ud^rh1)DIsHc;R1d*BfWU>UJ>_F#+D z4a-w)odGo;cU-Arwz;@b*R#9qFFuqqBUBxb|+w3dx8x3`58 zu#C32Aq}o*-$Fn|uQOf{-q+6T!Zlqcv)UNo63}#sU?x^g5fO+nm+HdAVrHU%N|A^N z$jA+gHVzj{;$}d+xv}7?)wZ+@U0MO2fEa!J3kjHlLPjFy=+brm+r-pB2wS?S z0HR=QE@BRdF+@ZxIV(#@+;!2Vv2vbro>O8%W1<+S5SwUK1;Z4&n#I&Y=%=Zg(Z&97 zxV)a{0w{AXRfIJfQtCS*B&HyOPbVt!x;cs%QhM|G=ljFumXhM1>{RL>?w`MUJgP%N zs_V$1hz`RrO;gu(Z*Fg0IPCH9X>7X#O#&G|KxjLeNA?!I`#Q--nc9N`Ct1aVqmH zBBp0N*u+SA7gE4D={)PK%Q;0v#^9|Mfb)mAN#NI>-a0M;b`~~l6M#srZMdXgW-btD zmKElZBqohf0jg>Ns6<8vwaTvRfhp$_W6vCF5mH2ARWqfz%m`pXzJ33G${Bp1x=Hk{ zLQ!FYBDh;3DzAxxbzZ$^{#17o@{vZTQ1qmHhR^ zz2pD|onz{el!z8%V5z#1jxmRKTTt3=W5gG!R~ykWcd8&GPt#(EZph-}{EnOuqsr@Y zcpWD;wT44$JH<|YG{Y)_RXHG_5g{=mQcw!ah~~xMIyK;ov&Bz6l>)g)Og$0jTvONe z{k}*IOfkj7;R>Oa(-S_QV4U$)5(B^?9Byt7x7YO2T@V0@=r>Qpzkc^1hA!*A0*cru z6dXeMr+@mV!{NZpDRlsFad9CcbIw{ThqPKKo-Z$JbaDm=Z@&B@#JFmPqSBIM=c}5+ncMy)qb~2A)vR65wr~=5r+_gdCpSB zVhoW(6`N1voa^NU5954uxF|&)?jJ+wN;Q=iWy_0w@u?)|lmC9|-Tpvp?~`x#Tr3vn@`XA;gOER$J{^;VSl*1e*1>QYh+2(o~Qi# zhtqQr4s3F^t`Jp5OetMn9#V=SgbyD++}_@%lrAnV-o1M_&-4AmV~A;YaqyNaEGKab zXqs8Le*0$oSG(P=-|za1i!#56S?t2{VB$Vhf1$M<`u*ezA^ht9_=n3Kr4$-Sgy2>c zh!DA(^3;bu#a+%~%3$z(e18A_L(X!2U8ga>z4`L%ufLk6f}BjuT?78U1H|9kYF@8P zDTqrO8xgBpD?4hld3kwtxCF`LcklV>1XW%g2{G?3 zFK*tw?RNd^gETwN<@b-Lhp9UET{d!WUhDbY!L?zJ&(AkEH*Ry!%%zl4a_oBCY|m}L zTGeSkfx$;F6+c=AHpw*TSnc&Y`IFX*i{{5ZFd{e{E&|P>MXizvlj~%uhyfa71PDy9 zONm= z6gVKEXgS+hco*f&4EUjsV~tbW%_OkH>N=5~KL ze0-c!k*}YIuO7$R_^z^U@TMP6WM=a`55q7Fg8`gQr+J=L_1ka1egFQw8SHkw=_1y# z`Mb_V@Vftx;yU=sng^Z!f&puLk$vCuRpoem>^g~&y%%hDo_iIuuHOSBGmEqn!&;z= zmp9kl^Yfqrx3_Qa@1Fod3Y@DTvI4CnDW^lhiZ1=6$xwgg^-5Rwj7c}&(S@)FOU>l; z?)3p^sF3{;d53Mm(-$e#@{srAw$Sey)YepMJrq+fAk@dRmWf1MZtRVe)pp&|>ixc$ zwW4Xuft}xuGc7#a5R$-I#`A~H>^6=At~vqEfORYRzTYu(E$%hPNDQFJyxZ?%iaM(c z)Bze11He4z)TJg|Wm;Uca3r-4FfZm*kjyN>KEz2HA3W{o<@Um#%p z36J|B&hr!#M@~dwQv4$$#}px!A}O*6oW|#_zqq}Advir|&Ru$#=la>(&;Iq_en%L` zsfdA@A|oNMm+YVOc79&xb!KwBYqtZFRwAqb+!k_v`;crz{--7w>i|5%* z)8_U&HEts(G@Wl%F>}omLI<=7QNegc`adFz{lM*Q!RTJ15Y1Lc&eG<8%zIz)c#*p3 zYa=37EgX74tfGKeMW#82KnO5T^TmEgSYu3Ppkj!m;H8PyTBm8cxxMZCUIE3RRxtpg z0%hVdUX|(N!w4Z9Zf~yNz6ovwyjex${c-&2c|2vojcQ+vv6ND4l}*etGbwc(MkmnT z-rinbUd9;vUC$xHN+sAvs|~03Pm5XfV~m?WX01H$HN*PhPmTz$4u{lN=YlnyywQa% zQmRz|%jtQTCW+~ikWR<3)Vk~TDPrU>O%;qpfjIh{mwlot{CWMk%kcF!UYmou%<3-} zA1xV4QD37rhN zMZrDB!DgP+UZk0Z=Xd&otr9{&)GS#<2pg#9e5D^hy^X%_OflD@(92x~iV893;S}?5=svN{iRt3{`fzg{;wK`; z<23&E{^@a2Tp|_{1~=PSjog>g+j(S2IM4I1fBoxU{Nfk$Jc~+7aksxrDS68MQA}8K z=szW9F*3gD>Hcr5O$PnRpTE%IMC8Ex-5zPIGM6$3#1tYCsz|9-X-a87m-_Jd$kd;X z!!YId-`$VX98=f#`&vB{k6=LnrMAj)b2LB4tiRZL(Ggs7uVpT0DXE&??g~rSWm4h= ze$ig-qYV6I%7ZU|rTrGU{d4Ocf@=dT@H?(C%G%r%h7f8Mle!X6oq(mPTd2L=U*Vh> zZfepO6qlDrjjMJ?b8`SwQDAVOXU#souNmbUr<+~@n0f$>6c7+ZY#Ouw1d#&s{^B4C zAw(6OOHswHOCi`~vjI{FIhT^Nh>de0j%FBu-X^}q5I(A=4Bk_Jc6_8G#n0x zLd^P$tRDzf+b8$7 zyHFXyK%g#H#?PVZFTB=tX$wXylP=2{UyMl48PZ3402flsE0dw^#%@52p3!=vbHa{9 zrXX(e=Q1b;i#io;#IT&6h0M_mu?P_(xbQcaxIsbXhFil*HS+jqFOVi%E1C23WP6{q z${DMgdm#Fcd~|swtiC=EOH19+t20KX=8rJ*ZnrB^V@U4DO$5U*5@6r&a;|~nH0L>& z$b`g%NK}gm2kv*hnG*9b4E_G1PrFX*PIEB*IBIsg-OanVyNipDKdiar-+cJ)+ouzy z3r3#vT-A`UR-r`9VVi}lQQMs|n7Qx!r>Ey{zWL^KJh@CwjPb?wvAMJYGyIV=(wmFv zuZT}?fyPZ9-uee(VrC)4!~qbhRzgfMYMYH$H7U7NfetBz01(VjR7-YIz;^sT^VQzX zxmUQV!~eYgjJ4z~wt2v3>Ga$OvgJl?OFXkRPw~(G#l|q(wDwv6qo%F?A~d|{)tPH+ zx8XtufIcc-o9r?G`qUmEvhy;D4V=%_@}L(;mLv2Fbmrbx_7Zl1bHKtSQF59Bt(0yj zWo-l2D=Nba{hcM_T;7l}Gco&NBT=5GVwxg@X*Ek--1WOsN-i@Ixh=W1<^YJu?d|pc zVt+gi(>!tPu9Mzq*=zZ@jEX5;-rRKi{dNl4mx6u$bayvCJHfw2`6Zsd3UFJ?FaJ^B z@1CBXR86YH7@3)wYOTl-@WpxXRl)5YL#S5P!z6GX!KZPnfJ}gY76|`?YYE270EQWW zis&@uerN8TY(BIlLdb|_3PcbXFE96mxl|)&QCQq}L9_y3DMdsS&^}^~F2M_bZW{iX z%kTxwQdih$VJdB4_%oPD=VyVvg77yzWCG!|AFwUv_A&X1ib;xFPIz;>g) zDu>s+%!Btd&#CX2xvJHi0YVG`iOgUeXC&_us)`RA>&iUnx=vK9NY{0d!$Ie)#bI*?>fakh2#F?WXuKnDt^5=jZjmySCW}Y_p*4 zUa*&!p>1N;`oHZ2k8UvYCS^ry`m!pz$l6R?ks}Wu3*CWq0jU+vfxr(#WLt!8#cFU7 zZr>zCOLpdNxUC??b2K4bg_qCZ{ratI_HC7wY4NRG84Rxo94ljEH8;v(!76xa zHrpPXq5-T=SvrkpF$n+qRZ_D|wJwB*r7~Q3Sg--nHWSh0Itpuu*_L~-ezEio*D7uU ztG{4!ul4Nq)o_!et!Hw@>;Qm?s#mX@$5qwEi>nx^A`%A*99^z**Y61Xd7j2;GSgD( zG>wFKad8otMJfk=e0qL<9{b&8NNKb{I`$^CPQ4QL`~B_b?_x@?0~Ugj9rFpgkW!rH ztWs-HH3%G62Hd%O*b-QHMf&ag{);cZc>n%=&iQnDHiLe*1LPLhn&4w=tum8KgNaC( za|xlnqF5CWu)I0C?cx6C*sQOYb?fXtJsqDOpA*LrF>nBrS}OuD6PT&iTq_WpsR2|G zHAa*WQB_No!0fiB*vL7b1g?G#TYv6ax2&zn)Upk|J~BV~_WGAzyvkDbef&vmA)|$> zx#IONC{cunOzWhcQ``MunFAF+8aygB)B+ z<>My9tJt*qUv0Y$uYQY~h>foJTBB>#8e&paL`pFQrWljEr=%`1;`8&<>G&K11*Vuf zYVI|F03ifhD$S{ihA@Zz+Uj14_YFD3H(z{qd42tfCJCb?olB;y01yK&iHv8O?QEo! zLJX#zXS=o5t+tFyDi6c(^z<}MlZe(@4IrkTLRx0)VNs@MN3wj%r}aes%h%?UgO(Hm z_}eSF4ySp#$a_vesH(LTCLrP}1&K<{{cc}MtyRal%(IkAhr|8|bI!9`&Bd65s)E~2 z{S00G6_%}d$*WZA1uAdbhz4f-@#nD6%(vTn%PaJ~0cYC0ZLRSZc!<`LL{&v9Vp!D| z&Vv+7u<+zcx3LKwEI;Q;t2c}_!3Ee%%buZS_nlvk$kx%H2P~f8{pbR0p^cPaTn9ihY0C#XXqSQk?@~ zR;v^WXr>|s+UU6CJkE3N)9vBnn#0pHPl#w*R+*Fq2V5ZsY#G4M>&5!y#qhmnX`O<8 z^_+HJb;t81sM!i>s}XPT#kOl{sr7Wrds+U2O~JL1E`CvkAt5f*CvdVTB7uRpgo3LE z6FCW?H5iu!!I5|;9=jml#w@4(F*R$B5)J&CNZwKK_&yY^c-MkKYv=4J>E9y1IUTp67Wc-i63w z#1xHKq=pz#-4(G#-t*OB1^|b{;a~pcUk-=E=`>8!$RTiuO;Y=G4^o7ps7^4zTVy6 z5fSH%%mf7x0|M(g&vJxI!Qk&CZ2f25S6<6fzGMlsbm1JL3_#4p-Laa~9_V_LSRr|{ zmnt)4#!Z^FX+XkKeu3F)sSWN*iEYE18Je1>O}hG|+G2)dW<;hwWM@)UsuC$KBzsi_ zLJQZca_?`j==5szw|@Wo22I8#tSRK?n@?GHwEbHQU6M61!>@x;urawrY|# z7GUR^@m17nEJ}~0+*G~HnpSD(Vi$=6$3UE7OeuCLf|+PB({UX8zGI5a(F_p7Zg;_f zRUmQ#K^4tKz%X%Az?=&(Kku$~hyJGd2xU0Wsx*gF-gunjk?pyls-~aoscKcnHL9HT!pk*mi1sUfuBan(A1|lBk z(_A#hU6CPz-zrfB$d#1Oz??2&>#s-Q_zSN8ED4=OIDGrirlW_8iNngPvZj)}JP8(m z4%3FdFaN?KbG{Pd$u0#CJ?=Y_a` z5V+a75g{|XPlDf5o6V0WmP?WN5v6_=mp(t}x-Lz9!R!nS88Xo{jDdKbX8>iu7yJkbdNV~r5pmB+f9>TzS-0uWYqMU&EPrI(N{vmviCNHk zHrVp8RXBM8ZTu~{OBs~aMGdU~Fw>@LmQc(Dc%XL7%=Br2qHJ4i5A=Y{Seh_4zT~c^yrFO)9rNjJ9=KSkx-bC>Mzw2{8mv6KQr7KuEv_R7Fb_HN{2~ ztr#qXAjLT`akty`eLqd}=`@Vv7(&dYq?Ed@i!r+P(;6~LDK7vQTcfJWCeurUMcbak zS6{sPx}Eifr|3k1b>BMF)4CAg!#xsXB(x9$fQ{oYPE*&X!{Ja$E=7nigpg9|y1wf= zt<|SwLI}*&d9$jf>V{(oh==RT!_D>o^Kbv_V!uD6IGR4!%3X?qm@$|64}bXmyLWGQ zyWR{9^EedMB38+&8oPTS5h|i*NvcZ5PG=<|1xzUo!*F+ZcN&M3l2lPr=HRk9%dpc6 zR%laR`%7Nre}!d+22=%@x`&77BGc_{pE_mEyNhU6$*O@N=`tcx)qsFSBZdC$+jq}T zGh--aMk4a=VcP%-=r+!^l{?5_e-mBQzky{hzj(2uUTn4{kwRSTya5)U)pfhB`G`{$ znuVPih>*yOO}!;9dB1x>hF*5f7T`x4u(hb4A_Kb(Y8A0{Vg`ss%QBFNW>#tiRRE|W zA*TI)pHiBp>BEQnySuwu<#4$2kP%~K4msyqrIg}_Q>!#a#0J)|l>)Y;mbR3W+jsZz z7we0xmErpDVhvx-8b5O}bXd_Yy1cw32A_Qy$4RP8(>zb#g&2lmxW2v$fn!W5MNir0 zc^=0BAMS^_FvSi7hvq2eOVwgbQWi)%yUePWY5pfNP2Ox|JAR4+4sBmAMQk? zN-3pOwGdsU-M#Y6Sq|$R%L646&AIrGhGD3s?Du;jGBD4Px0Hy5iAQI($iKqn{+C<` z#LTDD)OBgfQ@NiIONgcG?CS72U*7wY= zl!^-rY*pYP#99kLh%pdhF7r5!rIZjNQ~2=V{o(2|r4(Z{Q>S5;Qb4ujvNFir&=A0w znFs@ON?dCJu&b-9Z1$MvI?u#btEg7hTIT83zy9^%a7o1X_xF!a$I~h2QUL+ch@A?l z2Ie*vv<&+CT(+K5jn5}?MUpX0RXVeUu-7o|MqJ`0K^#5G)-O4 zW+aNtDaL?U4VW+y3z*Ab7@`1}Au)zp@#*Q5XU(|=3h1UPranj33PUi!C33-^Alvj) zUyF^9Ek;Spqnkb$z~WrtbAs9??cim=TI)e*94@!olykdnnH*k8OdgWdu_V`lZ~=y< zM2vLS<05kBH$)~P=T4h}h}Np2=6_lml(h`UpqsITCV6Uv$fd|Q&Zl80rFQ);#^@b) z04zmnEjedtuYkC4DcW4gCbVPIj%g$bk6Gsi;;S-n`En(oo{6*TQ$D&Z&j|>jNF~Bj z3LuQ*Fin$>@&Ql?vFp0)>uWP53ibaZ?@gE7NRl)`JvO$7NakB={-wGcfAzHw=Mad(3jK>NHK>ncxtY z`Skw%L2WGpL=j8@7(fsWQ4ox9LY(pjKmYi&ZFO5KPL|?S)e)uC9yGLD+W_9k!~dVX z4Rway`LK@1#Exk*HHGH=rTvM06R>W~7_SH2@^lxk0B(f7j=gHw$WqFPSrRSk(iO>?OtX6~SaXsU$FAz;HjfQVLE^On7Vl~Q63yNRcR zx+ry@1Tza9kjV99b|MoUP1aA}t?nflu4v;!#t)qknz_h5u`eStEw@|5Yi|l(u}Grl6`%&zIwIIUessH&s*xv|y%y zKKWJl3J11RIv;RfO;fq z9gGIm(iR+cWaFXb=@d8ZW60408$FnOkJXT8yMyG5lwE__YaYq^`M5Mhk5_lzjTi3rzijWI6E0l+?g{`~N8#~fIcGplQ_Q6jaR~g=PoEwipJI$@ zjsU!FTGeVT2HttYK124ZFi`6ZveT*8b#<$YTI>0IUbmHYRI1y(x1(zM&G0LVSq+5K&-erU`&^ zUen}IKm|ZkH3V}L`?j9{r;S>K+7CMKqS)900UByQc5XB%|Zx7976IZyq2n_ z+-%sX$r+l7ikJ+fLNoXiskN#~2+<)|qt*4Mg1$Wqs(YZr7(O^L$bZGmh#*n{DR2lO z0zgtb9H*4h`TVSEDNU+!KA)?Uz>EY;1P~0U)>63uF){g=mYFHW6i9XsI_wbTf~62Lj1a7R;ThiJ<>0m5Mh-JWLsVX(>zT%+wXq&sY;$>{P>$V&wM^t zP@59b9iM0b03ZNKL_t)Pnt%HF%lTzPoJ|5C)>0z}u$G#-r|~WwAjdtLA>&t1{C|>d z7l3Zb3G99tFsD(q>=hhM_jiV2f15(T7|=7C&X-U_Q4=wu1~dh0(Pf86MO7Qk-Us&+gc8-J!L__4=%;IagDi=ed;n`SX`|@7`Z7S2fnHil8b{h#^K~ zQiWP8BNeS3_Mxr>zpkrK8BISPsxqXb zRfQNutEw_#h;xWD801{GwPv!MKQXh^QgZe}MGXiOQs|6IpYK9S5ztiKyaYVIRiC5) zG6w_&`wtS^`3G*VC!ZZu(8Jm|zT1rI250YoKk}hl^zl#S5Ww(8&qH!TU5J4wAyMPX z^p3LEgS(yERpJH)1h3SMy7*!XTj=(vepzh{8yk$yYY)F_(iqxmUgMdXB5E8U=tq)RL`X!>wZBYrFq$&Vz+m>@uB{K;j1ZD(?k+0Y7%j472 z^V4!ThQOr=GZC>!0kD+P{b^YaDFBs{Yc0z%PjgH$64B2;|6Hp)K7RS{|NVdd<~RSs zaWY^IahjKTIT?m^&1)_eZD<=hy4~@j*Y*0l-~I0X{=OEyT+S5RX>`-0@7~vK`_;rO z=Qs3cWv7shmTTdNkplvhQfs{+peX>PDtfsJfq1jBjg^qpP-HFS`~l{!G}Cd z?1BfL=6HL>VZCOf#oO!x$H#W!@#`;l1bnxQ8gip8^m;E08Gx);RNnFxwQb9$HqQ$s zE>%i(KN`rn5=V7fkb!%$6B38uxsDU7J^s32mY8Z4+KD>2zQEo;#{1%>R;jh`B={5R zS_G}c>%NI2rSeZ0+V<{D-!9)yU+|kv=+_t9<&0aGQABdC%;pj<*Xvqq72QM*NJd04 zh8S2m08)(cbUdD~n}a-=Tiip0z#)WYu2H2_$;=F(gaihUk59GKpMU;*y zr@J&A5rY`27?64E%2}uF!1=}{$fdlzy!`9G{_9Uaek!G&mc^rXD~i8+uq~MXT4ELe z96{s0b1+Z#`%{GterQZ?TtO--Ra7e>2M$cJ)MAFtj$p!+g3p^&Erdj*rB)Knb!EcS z-9ygwa=Dl&BLYY+Dh7mPU{xyq1(r?!8MfORjn<^s`Y&3oNAN0%c>U*St$)=?T?nSF zbV04EDu}LpN#1S!*p-)EVH+lv0{f42-3eDmfq!SqMB$ld5DX zDNaw1k6<{Z`Tp($Vu)#8rUQp5i=Hpr^?FvrfHdw!M~#el4FK~zdu|nDj3GLTuL)*+ zKh^S6`s;~Vq@oIK0c`ygRWOJ#s@AIF9TP_E3nMU->q{f4YZeB=c_CHwNswqp!n^zF zFwghzj$fW0c@son0uhlS3K+tI2(`LM4k(pMjV z-RRUnz3Qn_YLkdjLsN76Katjk=(2f+Xs!(_EvZ2xc&#$@YU)37uCMg|u;2IoTT=5X z@Ae_4s0t$Lic6|cOU+x(xe$dIn3+Uvr|t_tgr4A-i5MV|!43u5`rK`X!%T$TWMHIA z>isM?sUBiAo>Dk7X$L6vbiVbreDP>1(dGz)x^su7KNqlW=grK#VgMr@T0e-0R7w*( z_6-mLt(GcM)lk(8YR*~2h@+1eh6D_fsa7y^>g3@t5m_ykQZxe*_~D0-IagBzq~&m0 zmSYu^ysE0BaJQU29JiRYOE3xX{k!*0Ib4>7nA9u~0g;sYz07iCoxhft)wo68JLnm> zn!0?Nido~tV;BEWM-&=rh!|6{x)s^dl0LkD55Ql(JeML!7!!W{`0o9~1I4hG=a;i; zaV{DF0#op20{%zIM*qXN*E2y?1p)$cV!*IJ02}kf=5O`ZLje#B4ZsvcR8-ZVXx zUDwSNQzAlBgj&U=nOkf|GyrjhlUfmR5C?q_Nl5*T*t@?{JL18I^qxa`8_0oS&}HPi zGGKc%HC1Q?1Cw6q;>|G8qua>5_7~#MTyAs?i2#5oV2VT`gyg6K13n&?m|~1 z5CtoB+w#l#T#9l^%QTBr(5A|dNNVOM4T>M2jEK`T8G@-cjum~k7#`%UUs23z zVvhi-;!}o{VoI@S&bdQWT&Y8KScJ_>ygM!P5~N}-b~sEQJ}iOfd5P;aKfhq!Rt|bP z&Pw*-{Yhkde0(mYAo4WNNU>xo#br+TKk3|XzrE>RHL-uXQH$HmPNBg&M&{MK_f8iW zV`dQ(kt(XHrKsOmwd&=v)>@ataY_@S1rCT{R(G@c;qm}`6`Ho6_C4M~N3B{*4tE^n zVf;m-T7>57+$2||YR+5Uiim{}Rn?8%)r^_lNZhp%0I-Udmf$#;Mn|ai?)GS1HG{8R zv&l75m?@xkBG*K!w!A3#w?^3CNXv`c!OobhPpm#Y~bQVPslEd&q(J1$>pX~)hSVgi6=Swi3 zKGNU1w|x8C>#334bN3eUIS~`ibGkbnj`zn>x5vk)^W_XsQ<|7Ut(Lc~N=}L2y_aKkF@{{awH=*g)#+#C>~Wd@zJ3?0L1y`mgHIlMq>)hb@}5g0hTHE)?i znx>grab#nr))j}z1xa=h%IuYDppCoW^@1_58iT#)L_~Al1aCWQSDbMP2QNH{I8B7$ ztUzq=eMCS~LsPAyYD!4WiU|mMX?SyEG$cSVLG6O2BjMT^qsEw~dG?07h+?yPe&yxo zN!gpedyFZBm{M}>%~21&;i-HLuiKp;geKywh=N8A;qvca*Q>Wjn7QPl24>YvmhP7n7hacHMk6$t{nPc6HsA%{q0FE3Bq_F`rwm*=NvW`6(fgV$=JqO~9cGaZ&m zOjUs+d)7%r%rV4h2BhNBV~*yZrYUg9rH~>a)>;iQ#Ax#E1NM-Qe>+F|o3bt6Z21pm zuBM&P9iLhBT<`Acswu-Wr~!N`%O61%TM{&1@cba$1f~-fOc~;A_77c z0ae9zk_}9(f@m%o(dHPvB(0^06hgz`>Q=_g$J71wTE9F#r^HMQgfUWx#4Topm**Ec zPzY2-#8jjd$uaTic=~Vu&;R{z|MqXCY}0&Ht<$_5kBP$_MR-7a-i;>^Ir-ye3NA!v6^;)NC27urE=A@>ktBBKjv4Lzr zRIhAJFOM~BO+Q=t%2ppq<~w_j8XE2N@Cg`t^bhiuZ@pGp!n6RZ*W+s9pQkE zYE%Q@sEr(NI_d}mF{`4XDddg0AUL=kp=qVVE#Yd9kdMv?U{2{7AP|{~W8B2dJ3h>e z#DM5l$+su-wE}1BzV~~Htatri9o@i~LMI-Bs5IGl0|&k%aiZvh%Vw%-&8yiBNs;2v z4Fuu=;zU63V6Je(+P8Al8GS7i!;bIwKl46lE^RZj5F-)m4rjElBF!wuZ zbE;C+x?$H?U}9hnr`IXTC~A4j*vr6A)1#1X8uC)hZI%G^b^nLsPt}owERD zf@XK8)0T^5*{=C`gcOspg+$ZDWQwRrbiG~)h#9w%k9S9v^8Bp#_xBHXcbCh{&p-e8 z@#9A-7-CA(2?+A@_4(=Zm&Y%M!zpkIbZEMx2!t)Y@@YVMem2!A0;&k6T3whK&FD32 zbtq61vWsZ^^4f5h+y5D{Q->f9XF{1LG|eVk48gP- zsSk5S3ji)NrF3sHb({Q0$cDrqQdI;Y5Id{EM7nT!?~hXChljg$ecH;e-Ns^&ZocuWUDv}O zTkW?obzGkf3+KLd=Gt&wMz@6Uk92T=s*&e6E|Ay+7>t=hjECbrAXPCl=cm8&vl>98 zeGJ+MteZ;ISKFJ2wucn9{Lx7gDh7tg&bDcCT}UCt5Mr&m>J<=TOtrZ9Q0I8>c4IWZ zzmBS{V>Km2ETxp3Ma5?eIcJB?Hc`M3`ck2;0?N#_N*gA2d$K(a{^jN6a=wHRj)$Wg z){k%BpO(E%?0$z4QMJth+j2yJoo4KStlmm9Kqp|Ds&as3nbz$JU`SSLKAx84khZN- zpu5u?BR@ZV+SbZ!T1!AC3g`3s{CM%joiPPQtvIE_;c$9>x%~L!r}JgKZd;5?h!n$8 zMRAvUI~uENmP(Jm+6A?-1J+Qz6#_uy4aZw~@k_7{H_+mrd*_b!2~cZAMMN>vl*0YP z@xzDHvhcdT(3IYPI36M&mV31W2dYx4mNkQsbS$4&@}{WD>K16P=yh$34@l@9QMDR^ zq5*&)0udOZgQ4441;fL;`_Er4(p)xwy_$d6wa^DK@Kp#JSGH*{3>d*4mihXz?C)`j zm_F(6*oUqJ)&1YW)HUt=X9T8sTEr=PG>`%0t@pmq^cu2&oDb=$0*NQfl>TSCmxX4V&)`-27`0hR-_vVY^(;*XydLQ<_|s zAcQc_v&%er$}p_n4~GK)i`jX<5`2RHb6pC zFuc_btrZUN3-DR^HRa>$5cZ}|Zw<(ZHqGgDoMOT)zW|`&rdChKu&w9F%xJk>4U__@ zNv*{@H9mB}CIg^i7C1JKsom=CN`A#xVD37)qC|iMwBwL@-{){#08O0|_A8B7zTpk@ z+PXr!d0P`KZVg=+TI_w`*43T5s9x_X1AsO3)D49IM$N-~ggsRecVmtY3awRQh;`e% zm+d2f4y|;2!z~(&YqS#rBBFf(_{w7XwFnpV$GFpgkerPuqJSJZx)eHdL}C#sxt3Zl z*X!ka1+Z9+FaprNdfhW)-lR4oK!gxVDUM_C5|0pvRi6h1?tFkD@8?O@wrx*OPoXg-DUYMW<`c+7#1T=6fe6efa6qV^ zK0lTM&(ANPe*XFY`Y-?Ge15Ky?;jRW2CIZ2Ce#8d)z4T8k&huThsdV#`1pLio|olt zfB*3N-~aK;m!}x!!?K9MmMfwVMKm*Qd)p!u0UKMeT5mP&SSmU+t6vi$u)!GLanXJe zrWF0Q`X11JAF$Nl7MM$|wQPX2ZdJd$TrT$TZu#(V5-lmjs#oNIhN6X;VvGig=2HFb z_?=49^p4QFQylErt^Sx+LCM!gWF~u02x9tt@>vg?cuUp9g z5JJRG&>eHtA(*oltNMEL&~v?BozFbaQ&&|s*Z)&hMWqIOcj*;$!S$DymzS59CbSTf zr+zMQe7RiC=QASs2NHD%`#8qeb@9HnH$s5NM`q%V=^rox1u$UeX{U*az@Rp%9MoLo za@{_EdI1c~VVdT7nmDkkmb~RPFr;OgH0YO4kBrf8tQZp_)>7S5NJKt-_>gn{{P|NZ zvMk4t(pH2SQkp`D>$=@6`5FQai3zoxsD>}Sc}MU1Xe%8%T(0ZQKQBG>8okP4IeIkH+h#FX< z0Jk93XM*M!WFwp5pE5v9|L#P0%Hl$aqGEu|V5qOEJaT+6nWyZh6J z4tSXDtRiZenM{R{4~LoAww#||9^buxs8#2A79$k# z3e3+&j4iCYNv`+cYpvV1nX1ELhOhmIS%WK$Fw`S$cmMzL9z1?EG4z+o*K_fdMpclY zlr08Ii3~6%y1xq_Ki)muEyh~_5i2o-T(YSJj{S*LHECc!R9~S9IWU=7RY6lgaxh<8 zp1}~%wR@^4nYt7&L1-g&g{nST52l(||Hj6x`+N4Y{(dnKVNB--)p>L{+C4rfh2Lz= z3|XQ<3G6K8hGX!8i-<&F%yxF@4>!N_eW8wSM}y`m-wg?S*T5XC?(xnS7>AOBPx%N4 z5DdsQx%!^$j>kdUNM_n0_12HF<4eKCi>y>BrCzUFsm0|00g;Jgj7*`3FgAneb})Eb zTwBa)EIk~_mxx@iSFiO(YBP$;W@f?U&6>fBa-RrS_*<669c7q9hyejdr5Qt5mW7C% zcK0XlI!`&@3Zj`cOi6#Bhu^aQK!_r3WQS;dCk4@R*7aKAbck_&xL*#-3Big~LLeX$ zD_aiCVp_HWGX@UKSfm0dfL_;YpyTm0%Tq~--ha41pRc({S+|_?y4E#UVoE8-n1%+U z@40jVMKHTuE*`MPBoy|IkKMqD2+TmGwHJROcW2<3_b({`1||S3wK8Lj@v^RoBAJ8; zQ{w4xcXt<$N17Jkpv6`sF%v;k6lawnC?Yq#lQ#GQL?@ZKK#I90Bq9;BD?IsHPtLA0 zGf?c@gw}b7prV&+Cc==GoaOhQ|9#yy<_Z3;QRc7uu-ih~Pp9|VZgf0Cm9`My@+<#u z$7FSt#BKwPM1%rH-T_n-6O|E?=4z>I;TM`Mwyz3Hw!Jw!y)Mn7V9UDGBhSgV>r2$4C|Dx$em z%{k{;Db#MS?=PqeV-Zn| zF@#7+?v1*xD*#OM%*L!fvhBZKzH#Jg|TQY-enCIxcfg~!n09S;Co z7PBA%%o75c5ty2of*`~|0YC_7%b9?QV&H&GR#dbC3ZelNqHs8-DWwn$v2OWtxo+33 z=Hl&UNz+7xB`YBTftiYc??Ye~m6w;74<9~wQGYW)gF*0mbxN`M_!z)1(skH-K)iV! z%oI`8N0|zdaY}_^~~^QxI{n-RY4tH z<;-~`>axr&8Sz7e?s7n0`v4gb0x@9`xIS%9QngOKr&MmhWzPEPBaYS! z0}NrvkoTqjm3I+>f)aqDnvA{fdd6U6+RH?>2AFI1%V3UQAXoeFFl^36b!rES2m%rZ z0N8TQTP`A{ikTW9abQk};8+f5W=pTY7DM6BdXj>OA}$H3>$>KgU0cdifSwWDE?F0l zfj3uhc*eAphX@f$DLLos^_p|`KsJ8stHm1>$ZK4PjuF$4bMde61iVQ^sEIp(nN=eL zB|<-z>w3<46A=-+Ub7jSVN7$~!~{5Spa3SI#(=)U`H~PRG>M3s)hZJlkJCJ*H1YB7 zj+vgGo=aVGKIf8EF@zXHXf~?=70CpQSYiqf@0O20JWO*y7K2=6H4_9HOw=3e(_Q0k zs-fC#jr}opn=c}t3rZ&=Y5Nr-BQt^-)b^tJz>!3e!gRp!<@xgCk3W6>{8-dtoc|mk z_8+$G`F8!eR@V&~cQ8O6rh&wA{95fnVDVT$} zr38TX86)6Gn)YAU*Dh}djJAXCiJ1aO)z+DEP%$)hW+&euf&=eV4H&(>0n|KZDpYbl zp`oZ%bx?{AHOUN0t=m?%t&~~;k=Ui#VGIQP`~;@)!29V#w+!oP%id<)gVDg0zDAa{ z3Ap#Ie6~2Op5MUG1{k%}nz!w8xi|*Z`%px*BVfM;H0&eSn;!<6Y0H~`1ra0QFpfk3 zH6_HDQqH-@%1uN{g)M6?`r-Y@DIN0lIi-nNQ=FJN1uzvrRk8ci@#(lYBXZles+l7& zhY)$1!m_00Foh6*`st77%k#Fa-lyk~FeC&9Fk*Ip9dF?|E~M7x!8=XU=<(GmM1}~= zyt~6yZ|$0;B`ea73Vrj6syo=kn$A<>_%ZO62&yNAtRDA1N9cfK}^YT55h+C^cz)W^y9q`HGmFp9)m-= z001BWNkl5u-kGA^ z2|HY?kKNxOb%|)rTSw|Ud|X?K2f*x3&Un3ERn^2)<+^UUD2ExDr)3F&MI- z(hQIcgxr4s6G0Hc=jZDm{`mCe^SKn9(#g<7ilO^x{%_cBP`4h2#;w_2Zgq0Yhk7iz zExF@uFy7_$dG7q4XB4Q?zp^xgO1NY667H9ne9F~*c45^A{x&^H;@ zK6rV%ZLbnBByRTTC+odQKu5laPc6%36_H#^t>V{)1J4W9+A1N{ye!L2kR^dpWC^s}&cgjEd1umH;8m`?W# zv)$bvVlu={EvsFTECg27ylv592+0d?bv?B1mg+icntkP_u3D{T4B*;E)or6HA#?>e zFBz(I6c!OuAc|U`l=|}W^!d~F<@0vEDpH6Xj9gf=E0O=lZ?};3HVnPq-ad3Ae(x=( z+DEndU`uvXUy1C$8dSacRC9P1dRqg*{R2nua!;i2gvm#Ry(iVD{$qd8)2yyhIdTvt zh6WAunNestg`ufR^+ij~jADqvQKMjHxzwC9QD`(YMlim8 zn&;Vh*D9@K?(jM_sg$CpUF#}2XLp?DK*V-;JV-7aVL1k3i3y2nN-$4Th&C^&Rsh?G zMd}vfoU2(;LITi|i`JD0I5>|LL!4rmn4>C*YN=*Q%$()=<;$0`5(c->;Ba?$mvioD zK|dih5Qhz3wx93etqlVI06lm!Fb)_(K!W>+(}y4KkZMerV<(vof;Z3qLf}J;v-1f=UM)z6L z_(N}Cc@TN6G6tO~`D%NER=JH4-F?FqpF>~{O+U=737MrhTrfVvU>FIbj zeqqddbD|AEfpnhJ>6AFs`-j841d$p7)KWzYs;M;wSi6wSwG@}}cKZNF<#=<03j`P4S9Gm5KvV)U-PF=&+C-|j;(3qxS>`d{BQ7)9*Bk88jE{A zq26d{?z(jQ6WmP?UkzE>&qQd_x+JYNhQ07?Gn$<;-|fqr29u7dD|U!`kFD5E_@KAs zvBAY|@PVFdbTq*5?iu|~t11Sdt##arFP|Gaf|WTG5$Jk2qEc&BQP*ErHL+UU+OJW0 zv>iYLz4YdmhgfRuz1QEB&CaayY4TT z^ZSVbk#gQ*h^=)80IEm|sDuoFL>y^4Kfi35b7jMb$RYwj$c$)eYT`Dqe@oc9VG%|$ z_-cyxoxdWyF$k zpw-MZKGYGF)bA7BhfM%A1Sf-e^+Dq(n;h}D$8NmBk<{#x4g>`13kkSk(!f2n_Ye^_ z!j5B!)wI;=$&*xRq$5K>t0LRB0Srd8@80eq$EL+T1_&c{ebepk%Ot*u{;wh0`{Qa` zcZY6LcG$rO`)KHaX@tT)D{Mvau8#id8H0Y>ddQ0*#u#0_i-_{|3gD7w?p1-z7?=gK z6W3I#A#UzaD1tC9*|sb-u;!AHY`tDfy)4VS!*Z~BK3}d=3L!EOLTM|2 z0Rplas&P9$0zeT}Bxd3&VxT2&NE8CZbVz}(reKNyDMli!U7Tl}e=m3kvCR6aH|9dO z2j>^`vqm$6M!-T)K>6_D;kUniNXeKhK&g@=8LCllimGZY#Z;L|rK%bes%|cv1|U9N zM<7#WMmJdt909nBs2UM_5)y(T;+FGaKB*KRVG%K)A{ir!5aWU2`04ZK=NAy0je-Ii z89)J2@8%N#0Po!Q{^HG={5}p|+?f2mrqO(L{?N=lU~dHVA zNUfrZgzTD|4Wcz3|67su`hK<>NUEo^&Tsu%0B9feoG!C(kndH)-jttvsWNZ;_by)B z$<8UiLEnj}mKG7_G)?ndN=85_Rdb=>>;z*1Pyw_Qu~sxRWRxmT=a;ARio$3RcxB0x<>EW)Vpo z5vl4{@--4MGhi_&V(V!>9p+;d5!na~0p=7#;Pd$`fM!sNc@_y^zs`nt-fwn<~tx5>HG>L{ni@6B07ssn_vm9k?3>SmPQp#zua4jf`= zTK>{IYMpiJ8aloB8YRKkSMc?EK2qhkGuhWae}kp?)r+HYf76!w>SJ$$`M22TTr+QA z5vP!1OiWx1ORZ81Ap}AZWx~jWuCCp&x7)U!FE66H<(g7NCgc!fTBeD?K0ki>@Zn)w z&nYM{)tYPGOyxTFktsNP*GCcFk!x5s1q6yQ0*bkhUm&i?q%pwhG&5r0 zAT=XsU?ieMRMV78acLgeg zs%S|m1Y%JMj77E9Y^L)xnc8)`s!9lKppTDV)Z{=j6EFurkXo*nl>&#D9GIsnNJE^_ zh^b0Nfa`j7QC+{ZyA{tt)#35!S;W+w#^I2Lk*eUW&G9#!2;AM)FdAroKJe+dd$B(v zyN70<4v#osfF3IVjFE`~qKTMF#XczXB7y@Uao|YArRGt03=o`}Q5Tu=wH^QfsY#y$ zfH|?;ZUp--Zqw9?yQaEp&k}(4Fx#Q}eFSMuoNIL2&E@OS6rhyqNWuZjbju8n&2F*P zoTj{+*IMu-wRvzjsItpl!XSdQ5uVu~W`FMj?>%c@g(R>ym-73L60hF#=9RCj(Qj-w zyvSF#it1>%yVhVSbzQFrI!$3pVO=H06aqU@Dd)0nSD%5y)GW zvRyA%{P5094~GM2DaEI{Rn)BJ>vav6YY3r=M4lqgqFhB()F-xP0tUo!+pcDkQj9S$ zk-H>fj46igx=qtEh9ae81d1``TuLd-9D+N{jV0PfW!(WNG|oAq+R*MubwcNKJ7f!WaYdfe1^@xopSdahj5XfshPj~uuhv$!7&;EqAB8 z>v{!4U)gH4ZLN`Yz2lD*8CAZj!F_=wN)U~4=+>keCMppm|A(oQ2ZS#Is2#mDz4DM*SM(3o~ob@G14eXcH zhJH0iBLK!2tk0Q|i~}LSwOq@(#dLHz6swx+=3tkUlB#_A^wYA;%-~wFDpf5I!8FBf z%bz~~>^%!a3q%G`G;euLGELJQ0^i@?%}bi5DNtZ$G*_7=G&G+cY=dT8lo5%hfGPc5taJgRl_Z`sx!Sai$Bob*N=v8_FVc#<`A^4#tiR5B6fT%;OGxu0@|7&naODsa820kIa}tDkX@L2?IJjPm4gU=%N&+NQldnVhSM!sdC+} zs+Bn}Gfh(f>ax7oPpE&alBCQrr?Q1i*)fhj$O}39(vnM31ScRn@xYiX;ms15OU{supyt% zmy#>cj0j8!bTcye8;||noY9Okj3f4H!XvDp21O-D7Q3N!`U?|PJp?BaKPYBUK z476HRp%APaDMFt}c&uZJM%An#lGGFpMbu0f7?H6}#+;x=BTMp=&<&d%>4Clg4@jpA z?D^)>D{mr&7m3~p{q_~yY5whq;vT)^Z@4AiBvyY>%z7ny{$^6yCSIb|%tR{@g~%}l zXV)?l094WIx}DFLb=|6Hj7c>UvQ*8v5^(qcDdMmU%gqO@I93r>8GZ_xE?palT$J z_xBG~YON)NXhyjRGfng4dSo#KYpM^sQ?MIh^iF2aZSj}qS!iz_&C~I8I-LwIwN%kf z4IK3@QbZ~-naShhL#o{wIf@ z<#H`0rb%*4%7uR#-Ben_pkD^{&lv?tjr?;s4XavJD+ikA*^G## zlp14je`zGLE=+Bv*l9^`B7T!rC;Ek&f8RLs0JyICa=oNU2x+b5x~?Hm3PG(-Q{sRx zFV8P8&ySB^2KMFt{#0uD;fD{zbh)1ERuQ1qVy5#v8^E@0E=HuPsuhsdbz9ebJf1Gs z%lZ5Q0BA%;)v5uiK^60n%ID8d2q+4oK-}~azS`}-eG?IHB#z9YWh?IP`JJtg(f|f4 zVK|k#=%^0)Ea;4OQU&S6{nkqYHB%WBz?N~_?#o@W)kaCE03znHbO7k8T)~K`qu>Dz z&>bT|Q4mF;im4h=AVN`9l@0}Hz&WDsPY8{{OGw_tzg#Y^6%oRXweJlYx6~R$YiiQF z)|BA@y6QtGHuqsHaVr~ZtuAyGLP#kMH~Af^z|3fnw7+*P_WykY)7}5KKTh8bM&E2& z?H|JL+z@;J#PL_XKr$s@%2zg%I4M{NY^Fe{W=NDvaSiC4^RgV78C2(KIvftQ%68pM zfEIS;zsqGMgx`ET&2u`RA30Dd<$Ae@WCC;`7c&K(z#DZmS5iJ9;2?~cb~DLKUX%a_j&4-eGn{sk4+_40DQEXyIK^uxywV3yZhsB#F* zlN7C*c|L-|^?F4+_gGhz z`rN%U)h6|xgeefKf{2;k=t^GbHQsLP_K>wH1Q4Qv;O%KKH4`rkMN5$pF%i}Krd8A_ zI?du$8p=czR837#$y7w$Ap~Lwgl=@+I-AaS?R_F9LRIT?JnGTOI=R;ei!it>4zu)b zye}}LEAPEZRYRf>0wHaA+qTV#fgZ5N>D@j2Hdr!W;}UL=C>*WDeJMAPjo*lCU)?3P z4`<)ZvcKPh$Ne6P)DWVB#iuC|@uX!c7c|XGg#!}+xxlm%lDJf{R0BvUrIZ?#hcM?{ zO98VGI8d19>D|Nq={Sj05itOfYO;w+Q`2@9E=R&B5=t>B8K44aOc2=AbUDob{4XB? z@%iQDaz0-#&(F{K<>kpVzI*ua@bH_+^R}&kc6WDBt06F9^uizXMmYD&Ee2kLdzO9c zUG7e%-_Kqn{(b!oq4kEHH)JrSDFlv*Yb`l%T7;R*beWfBUP>*cl;`KiZ9A&f>-FlN z@b3LPpDDP&kQw~@zyJH)>CP8VW&*HM3xIOK;KQ)o9;@E9BYEMxI4*+I9q0^ zs?Ya2e^SW??%XNxCbGh!!4HhH>m zYv>x{LVkU<#G8}-O?JkOk+ofK-}gGYM`~kqId&<0f{-f$|#yS#hrVg~&9J($bCa|v7 zV2VVbVu4xeTxP*Ur4*v!-P8T)Jk?T|=sJz#WehQP>F(}u2w^bgs-NXv34PfT z1qzzQ-G-V02eVXl8E9tWz+M77&%@zh8--Z-8h=AaXswu+?OZm+7;7z}bBsC+9W!38 z=UTIvgvdl#N)genOJ?@r!^f05BrLgb;J)vNVJIb^PG{!89Hwb3r3Ma2IF>7O^bzSW zJUO#x7>g z`b4_56sIj)hX6oi)h$q;Dpt2|07T@aOGj%BOGv7ia~0K`GZC1HnKHYFi{)GpxkVp% z)}UBZKYEq(I=q(1Ht}oC+8Q{1CC!LbB;*jDG2}Nrkp+DAc2V}CZ}rw6{AvdNa#!#Q z)%9W({le$r#t>FbDY|S!N(m8lyo7lq6ExtONrm$al68MiAzYqe6LrNv%I9e@>|89Ue7r9iVp-X8P zb|U!04?q4t|MF*1tHo04x<19YXGT*2Kw>}x)hbeQo|rnOV8|SZ13PQA=Bv0nFNBp>;whr7c)(OBeKrNqPlwUjBP2yHNrr_=d(JU%_WL$rA= z?$6O3l9`3zrT|X(4qkr0d-uMI^s)2gpPBdjeM-HV&C?u1U!d&w2f{=c0wt!zkg5^@ z5d{?xF*GEK4$OYW^o3t*e@V!zBl6fP*69SiaiW$Y4I`ZY`Hq ztTncsS($T{DpDQ2007P{TV-Cn&|6NMEh>W0rj!UM)I6b8*O8H`iBxUu90y*v;xTYo zy={oN>zb$hde6T(xqD*;|F-V<=eKS8_BA^UAy$)RKq0B?0if$r2rRXP>nUhi$WeeI zECMEv_jlH(AEjPQ(Ub`|lH>MveJ?6Q8qB0iq3gmpP1BUGSBfDZ#T0|{wh#b`Bc+sL z-wz=qgJ`ON*|A4AcRGZay2D||-2M3D@y~z$_aA=vFbw+`yRPp-=mDZsDOC|AFsCl6 zRzNEy8&e1ofDG7W(0w+NbI!F8t!mT`pj-f!8}B9m^@Q~G_^g-E5-*8kh=w7T3sRlS zIL+g*>!vI*B^AxNir9D^bD6*W!?#`65pkc=I8SO)MOBPB5b|8I89qI}o8}n_H{vtF z)Jj#Um4-;fDFstDZC-l{fEZ$6A}(27=N1hY636eO>Dcqrx61vjpsE*zhBv2msgZ5D zSz$?VpN*XwtIzn2Wor5qC0YHsiGoP>do}53dTS_AcGYs2RCoHrPWA?Mt`5V;Zj~10>JTj9C~^G zz7Nb-sc5y7JkQr@>gG8c5EDP%KfQnaMx=iD^zncD}w280lmNsPWizCpqNn0UF(CCMbB6Y1%(3a*=BZdJJ zBeNgfZOuJzD#5DpaO)f?NEIQ1K(N3GwN8irvUuL#i3mt^u{zr?h^zwi113Ezcq=+YnV_MfKt zT=imB6}lKdeX6^C|Km@8eR_P1A@+S>rqsnQMMNPK(P~yztJbPgq!v>{B%lBm)QGup z8{B~nkgwxBP1kW8Yptq$fB&@G9jch~OaKjugAaB|YpsC-qIF$|z#*_1l`^^L*gA)C zL%QZ8Z8w1WdQY{x&sWt~dxgE&d~SI8@#nGYAMf^5YmLd=b+OhQLO7o;yZ!#@@hNbq zQul{D=15x1ESDmp9<>hmQiq7OWoK8|8j##4$rGJh2l3WGgJz(%5q?_y>Q#JqimQWzCrWDI^`;Y$-Qu*t+yT_tGK&nB z-M*HH0hUD442j%y9*LH8ZNV#h^zbqtnkYp(`y0?XA@WjRuUXQ%cG1jgk)<04t9a=O zD_t|G?Z3CD`d6to|0`^sPA)b)=#rm3IECS^??09Lmt4-% z+;#Ek-P8Tu?mzwUo5#l|sdbvBQf4#ghh7@ytuARThyrs8F*K)JBq9bw5EW6kViMK) ze9a{z#=ai_Fm*c-T2|A#DijciG3P=`h}d;W1dvdx<#`g7QgW3Nt#i~BHJY%W3uq7C zTg+O4jHdbzh*@SZj^n2ja_FwtYZ3sg%oJll>~fY`Wt!&@DkAQOom2t9uIqBiU|6e^ zl0%3O58dT*$+;Yl=Rf`F>Bpab82YYOIbY5(hQ1%J*C}#mOw3V4IRrCCAQj76FPH1z z{`!MjP{ov@R9wYOz646TjNa@9TQF;bzgu4!mh}E6qVWqYmCZQOT0C8v|?~*3FtR|`;E@$fAYM!*Miu8+K9)PVj3Pcn* z*fJ$0Vj@6Vh0So~BrdUHnc~^4f?F%-5E66nQPBd4Kq3;+Y0B%6k%&TQ#;6YGSzrye zmA-kiGbHIkJJ44_~hLEVdzz*NQsoj zaT2Z5ICXu`#Myv|nL;Vj_mPPcr81X?-CZeJ!~&z+L-lv}0NlsB>of=MFPAG?$hnre z&QrNu=V9mxp^AtgGkauc?2KneZLl(K-rCk4&5{Hxjs{@Fj)Pox=Gls_PyPiIu|Z@3 zAhFkI;yI7kfGvL^u!dt;)U{xnL2Psjyd<=oWo>w`04+h%zA>u_{RY-IH;>EA?gk(tm(~&ifDi*An|X=s9XImE91%XlG^;rUX9c*frh&^4 zP+XJAe@H2HG5%8`c9>GFrHZb>y4EJPw+8Fi)WYrT=|!LGmr$m^<33oTn15g~-wbzKNSRZNA5$OUVW*7V-Hqdp7&LY-1ve8+A^ zD`0>MXsYgOmQuHW;y;Y}Q#lq4X2j>qkwY4Wftf?(DymY?^H?=ouBX$dQp(DlJr*vt-~|RDb!4n{2K&-i$V@4Qe9As=!Q+U|5{x8=~D5mr3P1 z@dVC#&~7E6nl9;8qyKFt3mzmzEg-9ba}(9j6hzb< z3ZJVrM>S$(qDV}Hq$Z+u73FIpnH&C~fg*Zt<-id~Ea192T*%v3-EBspu)xf$4fnyQ z3G6_X>Q2rMp9M2wA_5mcY=UWSaAB(EAli+!%jyGUf? z!vW@b()x)=QglynG8IHJwRz4l^eKfZB!XGrta>3 z08~U4EoOz-TxS-5<~bt;1FW@7)9B8xMI@JE70360@%`gM08}|KhFpFLHU}U+LTBj^9?DoF$I8fD6B?A}*y?@x{ zTtmmXX1iWOh*gw;|M2a1j2Otwbl30HG{qi}vRD@*q!`2QbiVxX!v}jrUQ0%-%@n7h&0vAB zf;(0)k-4tChqATvN7yt05hxHEL4%bE0sw&_a188TF=%Gh{ST#9&(t=a>2K@*yg5mH z0W1A{*xJG-HYpV@a3Z&Mr0uu-Qu?+gtt*Ju1<`?gGNx0Wq?FyhzdP*yFr@uYe|wSo zBhj$iKYa84^)b(CGXR31WYqbar~N#C>Y~;8$US}c-5=%|Kt=%=b`bzoY)HdAO^4mX z&p#EFLS(hUE&~FWYNaX=CL%CVm_rDu3$>VLiHSnAQZFL;a5n_hTym|Ww{~4D2|zh? zb1qGAPh$wEk}>tYBhqAH6N4Z7CgI8OV+p^7+Pm?#(;qI_{}2+x&> zed2Ba5JNf~cK3G=DaL9S(GcSSka8aH?jE`n5xo;!&BV+P6z2K5cn1k$2!Rnf#^C9P zDS(lxAresx#Gwy>VI1Z7asKe(8rVug5 zfRw&$ID}^W+Xya9(HVy#CgK`Itxh(xmDQu-glYqWxoW$)+vo(BHoVwk4CrVjmkV7_ zF)Yx!HeXXTkXj@}WoBz?4K6ZlY9^(63^lb{>pbUDiYYQDpKP@FvBFv#jB@Gvy~rN6 zNzG!`#>@bGYtr3-@+Ew_ZM<*C;K_UJ;;!%S`mVoxdR-O973tDEvL_~~WQge|xXWQ*l0-LQMfC`jc?+(Lt$|Yw2-0gNEG|f8a ztYRT@6`>FkN8-gs-h>w0OI1bWS}P!m2m(1HOwFWzam-pS!RD?vKmyZRRVpGxv}hIs z@B1{=I-c-TiqRW+OH+fY6f+g6Da8=tG|kgE0zlvIh{&v%qESE1rIdoiDG^f&6ctz% zP2qaY^DGr}>JGKys!;q^foGflZsOB&A1&4mt7&b!hYY;LQ!Q$@5BeBb0V!}qB#~OG zIKu`IT{+KX02fQto57!Wiyd8u4^%|zBL3NiY>r)MjT>!>Rg3e*Dww6NwTEi{13uf885MorcBGt@N2z^RPD_<`!4}-AZ z?e=$fuYdA6mk|w-w9LS|+i{9`xO+N&n)@Ce9|qM+2(aIiUTO%LIf*F1_2HpIo(^~X zF!jV(6z5!vTmfTBkpig#pfp8aF+)WN0ht1Vidv0CQi@b0)S(Mq>gKsj<2lA53XkK2 z9Erj>=Hu~lK3~m%If`oEg_OEQ`$3t|*$?Z)+4)#Lb0A_dl`0}%9JA2YbYy+W8M39+ z>t#M3$12sJ5K}kwDeVFe2IG=Fn)hD;Y6uaLYOTB75JE7pz(fpSB9cJ^h|Lp#C62KQ zn^_15#HyrbB7n%MKorax)AE;_>97f1FHrEPZAC3n&!F0(eBR78tD3ptEh4!(JBLVU zsxr^nla3I`3{(_pY5%CGSkvC~L0AfYq^^~$B2`qXyGw;7Np54f)|?Vh@(gO}XtnEr z%n`^nNC{iBv5l+|!`kC&#^}g_QwTw1O%|S8V1E9}Zx9tebYBa!-_FrnUw_>RT5oJ( z%5!$ZbSH$ZbVX)*eW-sIT>G2bHb$&JlbK$`<&`J&tGjASuLcW$MT{_TV5Y<&n1=C; z`ck?p#xxxE@r@))&XQ+R$_kKc&Hb*wf7ri&x4*v=kqdD-9)B8?Q{ph!>*eRe;cgnI zpXT#^fB)%p?$Yj?Zw~kO`^%Wm*K)bmsmvf1n2Z<#$FD{2{mAp-#cfgvTcIZtDk z=;`VH?(Xh*Iv+pjG##1md0eEf9$_~A57C2$`@MC1@66RXPNaqA-iF$3lxq7M%b zF6$UV1j9Uy^E{h8-S_+}>Vh7CQIE|(DecTNl7?0zm6`7K??y>>eFU^8% zlUTic3;kV3Ks7$FRLQl}B2|TmMQW)E2E<@S2I6hwzUNZroa;2tV3xWrfs1}9QPbNH z&!BGU4^nf!Y38XOfmVsD1+~y5Y5Wic>;_+L))%%Iw2+F54}h@2Bc$1>p{FNi4$EwM zXLcjFtr!kl%JW}jUcNBAa)i_>hTBf&FCe5|p7Tw>dR;L&N2g%%FKR-7v^Ew0gEFko z3%-{xyWwzn-7GuK^Q4!@qTxAH;7*Ld;amKV@Q1nfx}Q`M&uA<4*@X{ zQB2)B?RAJ2Gd7zrfDl;K-oJleY9%5<7SWvZG)>Im>vSDf-1R1GF(wf`A18x~WFf*h z);Zh#VMra9;*BOIh=CG<5cTfCalOo?mT}Bo*To3TgiKN)b$6vmm0*JBvrKaqNz5Qs zj-Re7#2AdJirJ!&^$TnH`NZedk3kAx7aKV>2)-VAoT zNM@)4s)!sINvmGZD&;y}%iUe5Rbrx)x)`VnyApsX%`xaJ@_-I!|=HLeBMg9?b$`2q8|n5-|~PO^(-PwmEWq@!sZjQX`RCO3k_C zlAEi78Z!bB5+gAnTSGsQDv6-$m=i?~5s*ay3>@NM25MfixtFoy0H8|6rBm)BXJP~- zcb&O8-TL4WT^)Iubhv_6Lvex`jMJ=OF+?t^HyR;kM!ZG~)x0NCM7M9}0 z0epTq@WS`dKb3RNd1m6stfgSS#*$xs5{CW0-|b!}S=U;zOPF&A6gYJWQv#Lot{@WDcd>K`1N|BjD814_Lk5BgxyVLP{ zK8W-})q)5YVIPCf^M3G)<%yZrMe?Yd~p-(X&*fd|~JgJ6hs#A|2KaS_~nTh9I z%^;VNPI;O#5(SEC7-Nu{IYa~$sm^@a0@AkE-?pit{{RC6Qh_DCDy8J=`4TdRNFn*B ziWurT#1G6=#i{~Q3^4?b09Hi3Wb?-P5)W`e0H8Bk$h{%J!~ns)tX0HR)Q5?Pybx~u z0c{GPvb5OL42^)1VVp8DGDicfRi`PJG82U^rdmtjX5?fF#a*73<_m5QZ$W+7ixall zh{%lb|nDf*At)&y$dqWjs?HPd`E zjQ-ND{2y)(AaSs}*#{r&54p#faX`k_~-1~d%FTuVO305MXR z_A%7m5a(Q~6aY&xhQMeL2qDnr^r`OySQ*C>IdLS@VwMe3p7Zo)LtQ48&~i1{2Hocf;WjL@%X|eNQRHZ@+!KUKC)+C8yZk-zN&)IMwrIQneNT z?CGh9C|C^4L{+4eaySf^%O#|EJRWyDy<9G(magxazcA0T=l@%W*uEs)vdqj>s~M0P z8<1r=Y0X86?k>A@C=I<_|nqxZdG0b_^Q(moAOYr>6U!i3_wMTcxTMiwB%ZAW=_M9 z3@I=pu^7}`r#aVBI3SULVXX>KT_+>PM5GI)1{bK&t$9r3G#q^$eb5uy7+ulWO>WjS z?ZsT|vv=(6IrnO+xN20u3gut53}1(ae{{6kG@)K{bR6iofh_#GQpggaYS%Rf2iFvB zxO1t4lwRxW58gdK4TnAP^BfHz16DxD)zriUG#KhU%@2P#eEWxQ^ZaQVe+GaqrWiFc zs7juvaU6$!S8_o^M4G4Rc)C73ykm}HIShM3Q!Q$$N<-fbT?C9Z>)l~GpT^^9oW@-8 zq?!%#FbrwvA089aJmsrFG2l5@;vEx*(0@A4^IXh`*tzbtl)5xeFm^E@<~-M05e$h` zEu|1bn5L;nMMTfYh$y8L!k5>EFR$zxxz@++Hj24Ixe5l}1DI61ob_@(0Vv=IpdUYu zDTQ}4#zgyJ82TNdUB~M@DYN&%FaCB)jLbboi}K|ZAdpWHyxaGWk7SQ2#6u|stQSE5Mv8=p z#7!~|&~c2n@38H^-{{EL$}B`6Vk9;I70Wf3QfjeMY8As~f!HWlH@M~Ea=)>hX!25E z=xA3bv;Y8dKtyYL>#iuekXB$tRIE3{?R2RvrdYO4IhQ!stlp7Bh#~HFgz(7BsZTZ6 zT5B%Z)R;I9(Y@~wak@-I?AbVMi?_--*IHG@`OGWx@y!;` zZ`o9Jg`sV}PS+~(|4*B%H4MYx=S@T|muri0B0ZESZzNd{@7~4bdAx20P>5%RY0h0A zm@EWl&W!T-@bGYdk6h_rJ4^h2%D^iEA1hI0XkH{S%>SKy|t)N$zAunI#6A$Yu0q)1s8C+ zKi7^Lt!HE5>)>tn^sECCJW?=oj4{NB0IC{8FtZ?m0uphI!TSYL*WkhkP^IQvRK@u^ zt?5ZGlZdtc-Iic$ubl{CX@z^@xg~`E?lsifYH#E+|1mK4uiRdY4nP0L9;(*JUTgi+ zpZ?_J_Mo-1Os_FnUAKR@e=*-T071HNDDxyz+|MKi0$nrd7d(qj#Hj9BAdAiU<|QS)mkN`j=^fpDkY^DD7uCm5#^j~ zRd=*`>IH_0v^_yfMOU`KlZoOnEt#WqEd3-4XfwKU^Q8Nefl2WJ;jt>UJHN;;97H@M+8;L96_}Z)xHaT z7oEDPS`aOz1ZufxMi&vX>vcrrX`U44#g+*wG+EN+bZr6?z`_vR#Ml?H=J##> zQ5T+H#sbgWqW;;o&v6ONv`fRV8?M)D-w%j5&vOWYOa{=`ovfJR-P0rSvmS^66o8|Y zYn~;K%qn$?k!u~h&i4C#*O6I45-Brc=>j7pkrB;Oj8)`%y%O{H-+w=jqaoZsJY2?W zN*!}DR5ejm0SxMj*z6!{6>+V;IgfLh)H1Mf1TZ+BK3&H0^wjm;lgj*;znp&f>r^Z3 z@AP_|a>dm3L;*Rbm;kv}@3pIdF*CBe+pBwsi^1w45HY%^tf^VaP(bY~IMT1G!fk2x zdc)`8%(Ie}fq{rriePgOjU1wx#t^DhL!&_CgK((;YXATs07*naRDXr01F-E5-45eM z)xN!k&;FnHP;#l$JkN9S1d5o511KRdxW$7lEjJI4t%CB*OC9m&w{5Poo5(xX6q-eb z`5f?Bp0&BxahYGP3`2j7h#JbwXP}Dg@Cdi@6C36ss3(VXAdrJ%=*P6yfqwpz5F#<+yB?wvl+r$ zZ$mRE5$U?F zPXGi^iGc&=k_~Zxcwp|2r}D!Omw)}2566%C@c6*gBb*T-hRC54qbe29hzOWP1i{!x zW+rA1E@khxE^JmzDG>${DN?VEGcoHez~-|)`3ggA{Z}TkcIP=(g3M}z#jv?6 zu^BcvfcxE`Zg|eOfc2aM`H~o2MRKmW6qj;FBxE97^!5z34gQx*!v}J$BaTh*Z{tl- zMO#E@V#IF01c;{CGE7egZE;rzbQ`ZGNQ-Tm)53;ntJK4gA6j7NHJT?-Qi~b57b}{Y zf~ZKT(iB3qfhmA$t)9m@AZTk~vmJ7+4}b=L*n~5`)2L}w;0q0dg|MPu+A?3R_@b5U z((nK4_p@G&2-iIHGlCN~=h;v7JkQ<~yk4&lkY6TQ2qDIY_b)YP%%GT_q*f_v(kB9) znU#Ypj#jf81De%bu3!}r6^h8LT8SD@g2jr|Qsy)yVl>cU-(AjQE_2mVwH6VvibiCp zAtE6oJHyxlM@$?+k&y+-s?g)(Q`bLU&UiYGmy1plr}&W4<2Y784vgUaEOBF{rbf3k zl5QFxNaVhAP7-i%LrMvOToTghrhi{;<#u9!nFZ1y-R*Bo+l(I#5Qxc4$=Z0!OdLN_ zwK9RJ!!MiC%L-g-yM3Ku!5S&49h0Gfl~SfT*D6vQRNu&@-L0XbpeaznqR{86#Ly<4 z&&nhNU=DK$vMwc zsTB~I08F@sn*4ZIHcJu zsSp^NAs8|5@9)#lzxd*6da3m)70j5R>(Y1`QzT{pM#QQzBUX`Vo-Q#O5f>@7%mx-> za30@$y%rG;`0nXxDs!Y1W9Wyj6saZ8(^#`IMTU$a8qiUE=$8D_N_Q&6P9 zp_HsjDIG#k;=3yR>3Bj4DFib&QRWZ=5Q-Y8@CtKl&vi0`lFKwrF~ni$V@&(qzU#Y^ zYpu1G;!pZ7)^&K@aa`M5^hTbwz1;2dxVfUVD1O1JKM76PlgT`Mfp@zJVXK+x+Ld@4 z0xSy($=^UALofvqsqGmK2o#tB8408zssMl&ihff5(lP%tp0W?-{sAC2CJ zo;cWshwLmT&wx}R1PUA?EzSBCA`L-2LL*pY#DIue%arG-maI+vmYIRc4;w+i{nMCR zFTm3)0E)5qQ_&3_Gv}PuiaC7`(6OWH86iTmy?J@Xo^{-}V?=-LH}tb^N!;_@xAXj5 z#$I1f0AB8{A-Q1D{FT>Hb=!$kUFqLnzu9MVK!3#f0$jyi+d}8ayMEXAJ!MQ?S8_ps zzUxMUi((fnf~GPjl@P++`**Lt7{*#Z%~Muk0uw_BIa}97S6bWe`};!=lBemE^R@4H zOf=j*J2m3fY->$;R8X|>bo1WJc}B%+#i&Y40Gl~QXPc@Y_q zHLeFTlT5SO zDpH}CiPT~yfxq0}@HM^T)=>Y=J6UJ{x?Rc3MC8v9Ak)G2+Rm3Y67b6mD6BfuBgLI0HxNFXRVb$QzRw^Vh?rdI?1y3z7PyVEf)cU z5QvB<1TaipB;s7=s?`w{Z3Jlx8ovozJVQA+wrr6Pda3Za#*SZEE6*-2K7ZYO((oox z@fY`J4cO)6v$g-VEn2rJ+vodZpZ_lZlTEx{5Bu4tR;Zn~ToDP47LkmGkclChTFIFZ z$IAuGVh8{*nHA)mQa~V}PU>CkCyxEPtPv2Ps+{KeIF7DmBt`P9eZSxBI@ObE+3oKi z9(Gl(^L*{PNQ|}C%jE*7*YQjYdRlp00N z)H4G!S5E;XMhrkO&y%YP^t)l$tNu8pK7mH$n7Tnh#b9aCdXc4s1}aSvV(DuyTIFFs z?C$pauIug&djrVlv#KDtDzDL3_(=cK_JvK2&+l^!tXN@|h=4At{cI({a*3P!o~V=} zQmZy^`K5i-CUpqv9jAr{rHw5lE)jG~9D#MkdJ))s7H%h?4KoqkAb!QuJElVs6^X+T zm;*QB8d?hupaNjX>|XaGRaL}5q!Joq>(MV`O>L4gfG#}aH%|<~A!f{Bno3U$Xr&a@ z`E)vsGGIDAGssE?^7f?mvYLbs)i<>OXt(& zyYHWNJNo$XC*%?sfy_)|3Ni7&{_CH=`@?tt@-P1qQa}_S8>ed|Qq?@q_m2-8f7s$K!;|aBBj<`+|z{}FluYqYf~{pqbBtU=v1R^qOnwox8=IPAY4_Cz*g=atSxLc ztEDW5iPXNA5P-?pQS;uUcZ7u@0GTqNQ3wW>t-3{X(=2s8G(#}kSVMs0IT2actS2zF z%9n`6@$23VJDpCdy4&rVg8N$x!4)qHE82fM&iF@M&Q~?vXSOBA(R#u?_^wITQfA&B zI$ykPj%wZE=ams}CktP7b$w!}s!R-vRs<0RB6qViGXhhDQEfVp|5odvOFh}Qce}?f zeVpe}l{pd^6B~&e-iTBK=~9T1RjWuLg6s7%UdEs4Cz1NoUw`~>|MkBb>8Im|r@Q-a z-hK1&(}x%%g>cyK|NQU&cGo@b?+#O$0pxJlcX6i*P${MuLvnRoACsu5fd)pVpjKpece|F_=mdCsu#Z67d?dmecEJ16Gp2JkQm?LlqHAE~S?H z`-gwhm<7-pTChNyn$7bXBbozMky1-_&0=a($5x3Td5YBd<;^RHwmFtA(xtEQgX_cI zBSWL^EFCLvqO6(+t)^JgLr;-pY2XkV6VhUBkBG!9Dyy+DGY4iV1x$(EgR6x>Y}Ocv z2xN;T9D+MRfM^JT1Cx-MF|j|vcDo%eoG;(r2wUzauo_&2E;x`TS^`#5dVLU{KXui;tJxvrAQu<9G%; zm-3h*FdBy#h(KM0;OXh1$~@;BBklHmjBHX%nRA&5;N8=^|Lgz$KmYV!{&TX5CC(@ z#QgsK`+wq?)of<$*2B7?9?Vp<6!8qJm3~HIi@7?qDV;wH6%1V?aTA|()5KY{F>kFC z0ANNiX+13vomjCD5BM`+ACOJ$D>J2%$j@U3prhGI!cZWvM30SyM;Qer@dEP!|WmX6j7SHm{WbQR;ZwZ%-^A_7*;ypT7(h%_7k zDpGO&we(@lOgEAD_TQz~hO2~@KNSpAv^q9NO^KK|RI?a3#fYXcgysY2 zi4p`N3``*sv*Q6}s`=CL!-o$)ra*_gLzO!8!)~{`UWJ%q40*honO3Q#f?419K$vs! zfy_M5uAVYbLPA$tM8wc;9}&?!=V_XAnL~t_BBDLsJ(heP=QvMjVu#)E;m7l*<5>(S zL{soGrb+t2EfL+G9Dk?>WY;@#nBF=BpL0$r?GF2Sp8qLg)@POoZgO=$r=qG-RjNlL z!Zi*xG&_ldLe*)Tpl#%Y)^Ol}{up!U>SBg$U?AG?;^4Gna;$@iHpG znY)oLhJ1u1rtV$VK&VZFSr(5na%}_l^v3;k5nE=dO(}kHhV^DMRI@7LRCraWwU%0A zNPsUR!e?&aZLoMPs`>Z2qMLob{rcxMmlwi(qx-mYsyCVz?TRWYYO)y1eqomNs$9Lz zNBn!s`}RG*4~B7bJcu-#h5q%q7ia6QPmXUe%D`4s#425nPIIO*WS5$(|1)C zT4Rdt+H*i68h zR23pNOp=GLW^zW<+`XtFsSI6U2GQA2(7aL{x9yq_0H9SGUVlZJ61NNO8I?5;vb8a6 z*g*cWYSc8ymZ^7dy((oUGi7FPx*^#LJ9svx1Ogy45RpSacD&mlLCWtXI^U(JO z<_h<<)@?}IO1W==qf0$#H`Lk7yY-DH$|mA0F#F#&P+lYIXTl>kZ+2RM_|~jz?B=QA zwz8|}^H)~2YlpbWG+KiWzWMXl#7@qETk?T26h;TUUFUNB!<>~QVsm1(ZmMc;pL#Vk14t?ME z)E`er4)Jg}oX?l>c;t|fcn2z09c2wbNNlEtOpQgxF(smaR9zZc)KW|#41`0Mrqibx z!I;QE$!`^d5SY2irsrIwsqWk|EMF(8;^$!;M-j=TI+NGe>h*g4^zqX_Ma+T*H8it^ zNVs)iaH;jIK?STpHcR z-emQ^^^W+B`hrWsZ%DXMaC|HRMCLaUfiaU8b%+jmX8_2hiWo7ON>i0l;Ye;j;ddk$ zsx>&fXf0Js$vIa?*t@c`-`=VcLIi;QVJ{-n^wGQTTM)qZmVVyFTls*t?HsK&roR~i zt_X?s+N|;QccwYN5?-^IiJs6*VS75ImFCfLwvEe@_+D#8ye%X+N>eR%{;R-RoAQlmpdos z<}m({6kQ&q~rs@vWBK~7|oTi*b#4V$d z8Cu!I5JHkF%am@B4q5UE8y>J4)1w0%oRXy1ObL5#jFlhi7Kh3;>D*cO^1u#%Xj{S5;?4c=+S@ z*wz62o4Bysrr!Q1Z%(vV*3QQ9a&Jil|a!IT-B;MmC}aeQ5(2BF&lVkm6?bBq`JI$cpS&GgA95fL2k7@k1vPe@ZtICc)ELdxMxXK!*k9Y90iG}wQ8gmZ2yp0VkV>3S}R3zPDzNk z)l!z{rPS6?L=J;ALoM3%N!6Gj=T1_x=B1Qr8vA|#03!C?APgev#39o29Tt(AYO9@pE7G2EZwk8(BT5;`2`W5ZDQQCH>8Zb$)fC!0@ zggMlyTCLzf(K7|Qs^I`i2tr)9gm2n1@mjw6zi~K=tZ4HPV-VpkOU}v7>SAHGgGhas zoB8=Nw%SteauU_L;$ziYGY#NAkogK*pQdHC_#|c);xI`BG$15}RhaaAK7ai9@p8GG zj>oV#{X;i>t-SVJX)VupVqkn7^6)niWCalJ%E(u=z5B*q`eW0apS(7e)T<@eZgJ`W zIp+}V-K)YIVCSEF-Nx}-fWkHe#QjItmE_KNoicBtuO1RWIp?lRs`~!@J97u{<3SLy zHLXo!nIUp0H8K(kfLl&t)=Vi2RW$XM(omLZo*2kmvw2ziL6{g*N{MqKGi8y>a$#aL z5Rp=s29}Y*AW2$UX>=nk4Ik0G%q4KGyZ1+S+9t=V@kP zW>z!szXnX{j+2J>m2WDa2f|`K(-JA4@F37 z>gw7wr6kel-IESqJ1e`+=PseXLF^rDH;P!*0l|aG6IgsTQ*dG;NFqT+VFtv@%k%5Y zOUix9U9Gj2A~}~*TeB8~E@DFR=u_5e1|b^4oJc}1Fj(Jfucx(^Qi^uT;c)2seuq2U zZp)t`>#d!*$Q`!%BZg&p1cfkI+jS|nIl!jBQ2fBf3pF?u`LXb~yEbVTUZ`o3#zA#i38Mi)#%%WUH~OL8K6eZ6%3kP{KInG#{NHK%dx z`wkG?b(}8X_ISL@`5?qkpPugDJYL3&q!fe1l;m(2LSnFKtF?(_b$+pt4TtV-Nd5QU&wSSxUG5(SV6W#%S1>f2LhcfCNC2)tEh2K)K%6#pGH~~< z>&J0imL;W>yG)xOkN;J~tgU;!X@{;vnbkzgG=NBL(~yd04>@dFH`|s)@=lU4Ij&|! z=hw@pj~@Zx?(W#sBhaWCBB;5kn>s2mM@LGCOvEEQWMU)&WZ1;|(Uph;>)^FdBz8NY{0d#gu|(mSc&x1~7p;i)?x_(SKMElbf4zO|pJ5{$RJ^ zxvjl#f3#&@8fw&L>VEkm0+s}0N;`B!g$^~3Y~NOM$MZIwiVK^q6`Dw$=$g#$!10&7@1 zzkhgWt&Za~FGZWuUqwI5*B)mWM!-JAGWVvgO*d~)*y}$JHNn*rY$xlug?-H$v(}O8 z&IDW`=^R4}Ypu3c-Hn-|7_tqU9!{-+30yO@+YPj3gnQFHt{Z)owVE||Gg zMZ9X-5K)wh`-}eKwC-l+usxk$kGUQ97(ki$At4f>ss}EgIR-WX%3FbBEOa>Dn^~>( z_4SpI6L*-{!3oJcmI@NFh(r&F$=#Z1O9DA1)fzH$%hYO{%d!ZU>)w_IDgQt%lMZDDc?c2xiU(RGC$pJVCl_i?Pj6%d@*31l0 zH@GtG4To60A|k}Cwe$J%@#!NFcKz_z(u3d4qoN5P!xJ})=FX}Gw!%NR;{Y}mi*KYk zgDtVTDhFSM-2-*HjndqrqrC#*DBupd%4oTT{A^sbacANwZ+aYi3cXo8nEQ&-Zd!L~ zK-Jc?F7r}L6-kG~z?{0_Fi!K+hYuohcYh$9=A}9^5~svw07UMnX02*;NJC*Yn23ZS z><&5j#br`&4>>U#>dKS|&Bs=6#C>}>T$Z#o9sh@U<8 zAAxiF+3Pl?y<%S0r@q2vBNP8~R^CnR345rGc3vpi@2e=HJoCz4*b?)#QdVu+l!a1~ zlu}A8A}=p5K?P+>!g+O&-0oHL7LL>5lD z>)qy7m%VN!q*^Kw9ZyFD&m``UNIre~^z`!lPrv)eMaw-rm^LC37UH0D=*qZQ69hF| zC5vK1#GeM}wU(TFv#M6WyDrgJkB9dk%QU}qee&XFrPg9<+6W+K+EdCME`s z8*8S=<53;ny?giZ=|K#kN0b!-e5SbdKxuY-^`hZ@fsqKE_Rv2oYLq%}ObY z)&>rgvWS?&>+9>w>!sEfAW0+)ieyR|kkri70^1Q1v=Ma?Da>4hA|ApzwKfq!r2B_E zCVG9nL?3GJXZ<+fuHcQ8(;fX44!5z|>PC14Gp(%=(lveCtPgh}#VvB;^A3~+qUz6C z96tt&1(0sP&%34TFS9aRgX6|!y;{RY!l8kQ0SUmBM3d1?HEy_So9B61mgq4_8sdR0 zw9HG~|I_JImbSL!3?Lvcw2BS6xtVrZz#B2NHJ+ z$^x|(W`22n?y_`4A_Qt?wF#zoKfD8>loAk>WjQ|HpY9(@ZNviL+L|MvBp_s_rr~&_ zVGfF`YzS(oQ#h2ej8h}5B=_GwzEOX@{P6PaH{ZORm#3%q<2buHVYg9&z*G@|g;l|< ztq5usCPrdVY}yd8*7o7Uhg$3Dc+7nt_g~Qe6v3dGYiyb|iD6TErl~fbmDm35Ik`QCt5i)W*QzeYPvoX z+{UkU*0vT$YtaMXF^YugxF#$IKwB4#~_v{tsTI)EDLA|~Kh(}nVo40Q0L`1OvZ&go?IcimHMBG{{ zWyv{vRn=BoD@$puMT!xPBvp@D-uB$rPy7~Rv4--S8RZ{dFF*Ad_qEGuxAo(nwh+G* zHQnbej$s=RZ2|}vB1?%`NIu)0e*gd=07*naRG9jq@49TJ+8mt5%QQ}xWnM0qF+2_X zt{2H>pv}yDyiA0GBlb8A``B|$f4v9{`exT{)qw|Slqhoid_6S1ev zOlaPa+|g<)YGB&jY#B#}zRS!aU^b5<w-EO35jqRE(OI;gs^RM{OI??9s-;Y05^LH4Y2`2Pb=0L_Ob(!1sp8gnp8_^>L@AQ z=N^!1QwJwuH!yASEaq;l5lPo|wx%sBvLA7mr=ZqUBnR;F<#{|`UeD)q&K)tOwNAW3 ztF9$2Kxm~hvM{f`L02;{x7L=W%t=zyrruIFw5A4YA`_Yck>N*?cskv=TcADnkn}m6 z)mNXPb&P_4xMsXUZZ%Qb)@8pWDTU$3yuyPe}&9l(WO<>&#kNYD$So zOr0=3f(VpqS_4mGt-3WsE2S|4F{(NcwbmptCk8CX)2SPz>cpfZ?gpjKr^B%>^XYIP z1S^e5a_T6VX}dq&|F{4C-~RJI{QaAUH=kZ#yty}XbtGh<#K{dyX^1Q&F5u?oEhw_; zZlFj+kaGu9nNku-DQg=BCw|G2-+t|sr!F6ky}3?AdFc95(`9PI;n=jeBT!&u-4Td6 z=gdi>zYrswaT-Gso|8nxW@1@QZ2rVp@@HH>w-$fmEv!JO=+q#ndkci8ngx7x-J1b< zXWzg-H>&NsJ{;@)nz?soXISp$S5t1IeSj>6jDf<3Ro-MJ=8 zbPwkxGY?TK1V$h*icW#9`zi=VpponlQNkpEMBrFzH3J7QZ3q-H65iCbAy`g)9Qvge zH85KpIBwxo;J_rM7E=rLv|!HfpT%1E;5FY#%uHBoHEWqu&I!OvtJ*3Ms;gQh0#1ZX z>>`N(9i2l~KW@Yxur|zEbRKo9u-3wDoAIrPiXCD9N0xFwe#mXUb_<1Fk)Kz|rZ3mt z{;)j<+L0-MZa7R})FmIdSB&aGgnt>^-rp&AOpCdwWZp;)MnGuP> z$#rcyUP0FTL;#}SjlBIWO|`Wam7l7GZHk#jpPQL;mr`a0L0vbh#!6W4kume?ut>zr zeLoOUP&5L2fdGhz!~#)E3in;tbzLbX0t*2Jc(?2Ne&`}1hY6J{83G}xYpr!h zIWW^SjS;hUG}C^Ic3j2Y%l~s^MfYd^i~#r}SpOH-jyS!oTLaX!I#h0TXkfmAu$eN8 zq^|289v&o7smtXuj^i}Xb1i^~Id>_E8`~yaM}eE$P;a#scl~^2nu8HgR1RvkEQP=U zHIBfDqpChH<#M^)oxX}ClyeGW6lO5DTC1xfLcpw%uuC~JgL^HN99q+-r>Fn=U;nSS zU%&l-{_+1E4u_ocWtvotiB}e6)s!JE8>#Q=Y+lBz28l^BFJ^3*GSb{8+nM57mW|%=Lko#X5-?uhtKW8di zekfmW?S4Asj8*vq>C`YvAZw7lt5%V}4MMBYMA9Y3C+sFZc>J(Z>HCqR#s$iLia4%W0 z3vam95`B;{I{2xeoQtVMIIr)r~ln{(bYM$UeyR%#BjNDS2fXc`~Zgx0EV zu@)%vz9vurA)vikv;_QN7L7wh7{%zWyjYLI@2}>ih{7mWSY;BMY2aMvVM#uuYHUJa_MW7^KmzI0(m1@9y9i-_ddV{Uu*BoV;=*Wvw)N5} zNYY?c-ez>~Cx=mmv1jm0);J>IjI?$jn7X+6ncM5*)^pnZw!2LNR0B+K)#tTdzqPt} zB4%`3`B67y{JV5axy|x%c@K!>0TLb$wo;B@cRpAn+vf>v%fdpNoAaWG)5B>($%N5J z10YRyNa4|U{RXi+AW6b(@0e4TnVoK74y4C;$Ow^9J?go4NnN!87*Eb0h4c7yOkv!UD!o`S`P54k>mu3H^JupdD&KiX^I zk()+@yVB;e&&OtC{=^#hF|CT;-td=c!qNnOHI5bp2hu)j+rXpIr~9g<(n^bAep|n9 zesa*Yjt1n2p%^sa!39vuIB@^QS|rM%axBcVd|DER&3EhRl$pHP06tz6W=fp{mprm^LKlLnGZ&&40 zJ~j=2=)Yk}UIl1bdZc|6il!9qrSAW;F{^Gr@Nchm{~e|1M#~2fceDps58wiGprd&E zq%0z z)hztQDsmX5E7n8s#CzRm^fBElkm)$IX$w;e^<$wOTzz`)X8-o^_Ii5%#)n1G+s7+r z{r}nT2zusL!XdB+qx8D27Wvq*qad1NggwdgFHn#Vgmqwks z^c^Rme6e1deh>M5PlGM8$r9>%W9!e;0LjneZl3S<_Ur5O>TfSEr&DfjpNt*mE#C%d zFW^w&I}D=4U{PY_4V70f1yNAUb5#oS`WDJY3rY$q#dyRRBnwszp8F?8ynkSftEEG= zSv=$3<7D_C61;6Au9RDEe z*BKaA5y0>@*kU8N5I0r#1aKzr=FX{%tQ|qD*`+7Ze|T7o$SIttL%X5;{=;BrM|Rz( z6(^45Q)s;(44Mih%~VBm^iahv5&Tm@f#efz)MpHTNIjf z?gph50xO(q0{&qOi;B8Kt_)BZ%O~u#IWJG;b0mpn7n5C7UkA@H|5e*Js#^{`*r-4;Jzt z=eXw}aYw;cLSKaicqDk91dCGwc{bTu5HL3sMxSgemHFi*U7K_=6LC}h$qdnN)^02- z;Pk%I3~oz) zwP3@W^`k+!!Z^1=b0}LXu3g`~3;V5+ue7VV=#)z6#)iU3fFo6l-XhD1U2AT}G5pub zyIh6c&%3WUBic>=iFrOEu~cT;Ns+h*jXAWvJvjxP&v}KvH!ga)g{MP7K@4|BJl}SD zy1DdNGw{%lE9CrAGNKJs`iJOYzy{(0(cB<~NAT&Xwhvm3ZJ8tMp${f{ug*3;?6yhX zb0%!YQK4=Dt|$;Es=YQ*Ijd~mux zYbwBc30@{j5QNwV71aHtf9JURIU#iN2~q*#zy zFEo}myV&$CEwVyGc%?y)i0Nhj)00t`XQ!jQp^LaZT|NK1vHT+e8LX2qBCXurkxvUB z-Ih!#DlDS;bL@S(z24edfX5r_jx_LY$9At)gY1#$NsRos zqpm~wK7rMAaVSKpD=^pq(+(+6*Ik0gmh! z?q`pW&-0Q$tM0sv_!D4|+EhE~rd?kq&lcfrEd7gH+iV(T5D_eMKhewcgI5xhXS1{# zm`)FUCP3`dC~jJ?!aQHE?2M}VAY@Is5N1sKvv`f=Jpu#E`j&12J~zvETw$^luB$T(sloWOBE-vHQt1;E(7VLqQgjp`pt?H>I~CB% zC7D*9GU`U42S_F{C;p0`1!QU&Na2joJb8s0}jGVz>dlxAt z39T{(<*r*s!ZqJwKaDIv%L8^97aNpEGh;alVlTVy9ye5N)M{y#N>A_w>HZkfD(O2U zs36&Q>FasvpE^*8$N%Ptn^dK5*Fep&D5fyqI)ONDtLrQUQdt1c2tw+tzQ@VeJDRC9 z-;>W8;5cT;Kyd(z8D*d{;@B97b!x4K^2r<9HRV-`cl*uxbuvi1l-?|k#@)RUBoV&EE|d%Rbt2f`?C3rYa?m* z$m{aeZ9mdkw1HS9%PFTE+N1*}F003U`MiFPh#7qx&!aP}&_DE_g@dkNS2EIm65F^d z9tRR;kEqc$`6Xp{G3FKi5teRO=6nmKwI>6sx#6&3I`6&DA0oG<^>>nC zQI3Ro(yhM5uT<`Zmj}x2O`JaPuVpovg}-v26$qx;-;i*m4qUkSKoJi!i_ITv?N=8V z8#SH$7a+P#D?Y|ZEV){qN86aVM|u&uPB*Z)^q!KGC_x=Fp}jzprpW@Z#2~7|aPVsY z%SuEoTD0s>FtcYd4OFwONlb8f7^4 zg4<>#_6w}LY-*86mq}Ci<;kV)FWyeN1&H$l2-P^fA7~eM=64!qhA9Q(ao0ttLMc}zL(R%1^Hlc^+S=aN-0NQh5G8=l=ya}7%=KSc4)lo#)` zpOCB79i`|Q-cfpZ>q=XWW~O@zPULMxx4F7{DI|WI zIB<${7HO2;Kz!=V;H5Mg}_A(^SJ4ofcW^ECuSfxF7O%#ma!e1M^<2 z(4xEV@QwYE(LlvNHTx&Io0V9YE>CY}2z@0=0zwUyHFZulmgiGg;4m6&hm8y#p8Mtu z_^=LEVskUrGCkhIjwkO^N&Dh9Yj@}O2y#ivwS3C7^uI7X1k^7%5wjSeZWrIx+$6q2 zcyVpL=Hd1BBQf@W*w35Kh+Ow=TdnI3SIb(xGge;3_^})ev(FbzrK59E8`55@JyPn7 z2nh)ZXQl0vf4fRxMx=tRaVM^nr8-4q1S+rPD8&Ak^X%Li$Nbk`iUBKVp7!H*IY3oF zaBy%}cf`B)_SA_z$#bU}*FzuA)sl^cicK?aqF7j>0x&lFb50crxa3j&S`J&|=e;|z z6I*v%S6$w2f`yN`5Wej=7tH_fGz)z?Tvp z`1A0S>>6(#+0T^l4iuH#V)VWfAyj_q>a4BMYxA$Mo5P-=k;yHrlU=orQEPAA*X+_D0x#!ch;<_p(^E`>CaqiWBEX?=|;S3YPy9H>K z5^fOl=AKg2@878R!G$@525x~eQ~o<(cY>sdlS--*J(4u=BNg_hJX@-gbKv|(6~T>s zbW@|%)#tP7rNEg&@F=Bw=ll|FR0o5Lz{pCDDEsD z4biJkd~857PyAkhDbCTIiS}^zd2&LBqhEf-b=*wb=#iECD*C?|7NJ^STHKQ$K1t%| z<2krguE1Cq=yPK@R~*p~r`@KQM>(ycsH}!Y)0}oF|JV5*#JRUTdul~yTe(M@)kZLE z0}FG^$nV_=vWx~ieVr)KZxsG#uBc;{sm&tNpYOXkHC-yfGQmUI+9s;1q!c4CLPgjI zdc5DV&J$_wIi=AHxZW>#bzm|27b706z}s_>>$$oU zuDJDl$G~a&+H5N?@@_6GHR~|x^@SA6bZGEQMfNE z-PnrF${EjmkIEq3Fh7Gq8y0p;V|U&D-l!FF?@wr+Iog!~IjE!0FT4AnOGT9_fDKQ2T#J zGIo0pGM|7s>*a7)!$aiM);9+fwFpQOZiPq>v;oa{7Nb2Q4TQMkT<_LZtKaSa>?@+r zTTfZ{B7xg4ceugezGwO|&r$n!c^&sdp|TlRFYuV4YfZBpHDIDF@?6odj~F1h&Y+L( zqE@f39wKyce03EB&mKq;CoAAwU?F<9#{0u^?yVngG%<7ZoU7!EPO?>NB1U|z}0{qPH+OQmC0yN7%amWM5b!J zub?1*fR0j%BkJVlX1qpOIqd9W@Ae#jU4iop4&fAgm#YDN{%G*iIU&5CK>xzhCAS8n z_#eImZAuskyl6?PY2#X;yj{PR*~U*cp-*n$R$t-O2JRv<1CZYc{h@va`QZZj4q76O zr)OVg4<1E}d3t>Q9BxxFvgHiZbwyn;eZ%gR76a3_7@G3V~pxf!K1ITjg> zePE3;Vb;S4?(c0fBP}Ng>+Sxs{E1B*5|>T4xUfKolYCzM8TEIh;XmWm2{N9h;#khA z2D5~e&b3p(*I3`UoP_-)IXQ7V!#oDI|D<%s73lixS!hw{%}r$AGPeLXN0ZJE%SK1p zPZXmgl7@b`&3L&~`dGTbE^Hja$)aukTZeBB(thiUwue*U;K=$s%;_1NBwm?Y66F~1 zSNH$D07n$hw&)bfeBtoXU-X}u1Dd-=P~&xCViBjiOC6UtZz_pNEIgx>aJtzs>~9(cQ@j^{eUeV0ne!GJOuo-%@Zf(-x72sIrc(ZG1ZRK zBkiTzgKf!ZlJO+p9bY^IS2R&KDhx)OdQj2Uqa42KAnIiU`04q}Kg%=G!;!q0js{+j z>MjmF_1~s>AtvwLKe|w)+~$GLRadC=ALC(~cpIpmdzs5LrXfoQ$jH6KKz*7uc>l#V zf4@yDTV6gulTL{A#+2kUEDO?zhJMcEWtur;ZR6;PMrg3zOU;3d_p&3Fog~1L-gJjT zJ*XMl8=9(U0eWY9d-dgm-}-iCyYd0O$q4a@6JG^n1EQ2W{p5BwU(0#JvA5dlV%c==;$jr3ojT~S%QoB4zxTrl$EJ6?MRb@7*Qe;4qKuznpS zQ-05w-VX>&0GgMy*0&tlKb!gQvOC)FV+jD$6v5p*nq3gyGLpEcQjWd2`rl{!Wc}*k z?BMK-K<18-rN6_{FKzG@wj{7S7xjAV%kO7Z{;Ee!YOSJawYwijssDJw949YK4)vZ0 zD8nD9jU&&eD~!;vDw{b6+6+lO5IQyf*|?(iFOHMsor?_8#0oG5%1@6&bN|E9iJ31Y?$ojW{p5 z1!dYCtb58Qcvl|Dccpj)AN{M|M84X9Zv63Y+ifFC$bzNi{J_-A#Pze-w3#;{tbTo(FlL(B*0b)}Go>WHDNS z`->Wti+mz);D2t;_ZGx^f+DMECM|jz6YMCnNX$j}d39cLR){)5$+Y|%%g36|X|#75 zNQ3}>Ht$(R2V7;}l%r+@GqR_ZM2Ofe)=9jAcZveqn$4RWfZWA(7S63%y|Bhb62yUwh54+_xmDi?LJdlM_P?oANlxHrCkT=k| z-2J2I!7hoiCw)hnHcl|HR^V_ruded}!r5g;k-@uRlUJ{elmvmO7s$Ctc&|Tn~ml(G4oX!)B}d zqddUXbZ_z$9&vO==!DXU(9cu}4Kkx$y}qtQLx#;Q&zCQk2o-UwhtDwp9ykXTrhJ(e z2GcZy>Yo!ORGEGzINJj9F&(Wkk&l(F6I}WQ2$T9JC-D1$fYOD6FH2w zz2z5*46REb8=^iAzVTpc_J8>upx;AZnbM-m+-7A1^Kx0~zvs!tOELlSY@-C)N{Sr<(S_S;So(E~`{lYXVQ&jF-F3#Lvh*FS8P7G}e`V=cUZ zQ^frJj=T4923YnkC#syP7R;8@CtLA`hIJi} zwHgDmyy#7o8E^w-K$4mqJY**Ad*|u;mc6wFsx3UmWP2zi>7!&mz8&j=^*;ENSG`)r zq`mTar1TqiMh?3^x>6SW-&aeMZ^@o+RWU9SV$Ur#H|GI7o1!|t2iRP;2ia`EjOw?m zjlSgB!w}I;JyriqNDTJ+OY3>I%9{jkp8sY_PTmF32}b959Wd3Q6SZ+q-S^hlgLBJa z!@K9~XXuKG)G7~_xcnng)!Sc!hwr(X6A77EPK0+sWev$MU|1Zw;+t9e-vZ4KZg>$z zGIW-c0A7BAtUeBE>t2SIrH=2LJXMgx1Q))M0!kIUUoz4M6HZDQvimTwdGV^~DZS)A zmr+LlJj9t1}QcGK`l9U#5KBKayV+)gFH!8p3jDudU#3U!0L{d;P?V^gRa80K7# z#3ki~Ut`P&+WvK4-}TYaQC_nbp&JQ$$5yIu#5XuN{CsEG0QF5@z%jw$@Fqi*_SL)HdweyX}pU7~vntrP{^qFrNIF(p>MYv$!X@^ju(!(BZyO ztE|m$8$qj8jqwNR05ZUs_T00#w3B-iDyv4Z^#*zNa%U${N$)o}uLC_0D9$>5Tz|o% zuc59`@dxv~e`87Go!rk7e&a1n(=?vpj;CKBf7DNW;MDihe~*a=d)&i{5+HI*Cw}01 zZJeI>M>G-OVS;w$`rWDCru~1PIro}4m>ig*Hv;)~y-1z?K4W#=t6*pW^+^&P#78vd zBqvQzz%Fs?>k}q=DO=sAJzcv9@7!{1m8Gxo8|zOOM?)vUdGzolR$fr5s_f?PyRmUr z)TAOSuTcSo8_y}Mvz(Inhrx%DG{3)0-HDi&`x*E7$;A0HV_@BQDv{zG&7}J9%0Evz zOgT!FkCdsxbvDZw_^5uDP;~|Hb77tO-V%09k0P=Y(6iKar)d-AqtD8hGFk6Oh^mJb zAtiZ&mnzDo9s+Bzg`TXOl+?*XD8)y$21YXvoe%o;lja~B!MS)tEgjzn6Q^{i8cP_M zm17v| zw#Z$-an%THCW=hD(V{V?LI6Z*?TEr7=LE?#MoX#bZ#5DUcXK`>vTFtHXtn#xa~Y(5 zU?lIK+7G=NoSoH-hO(NPU(}|WJnp#vaLgy(rvvQT#A6utgy-+FH{!fJ=b_rtsoC-T zcw|?O+M;N(TJ=Tw-PXGFp!b;&ZOVR%F!@;^YivZ(C^y8D>$wx0Edm@?LjIcof`ygZ(6*83? z{q-J6liY*A`NEt#=|mw*j4$ASx}F$~9F3e$4<1G8&^%g)L8c2LOVcpOvW*zpV8LOFU2X zfRe1XR8>lHW5GGw1Mh&E+3ugaDQZ%gki4eRN*Rv95hWz7TKoRTQ&Y3{cmw&T*{zi@ zKW7UloiaP8rT-!519@aXf8vl3_NlL-r>SKC6k*f#(T(Po1vFs|ha(!Kc_7su7KubA z&q)az?je0P=ud`++%hu6TW#~3OfqK%AtcR-|2=v3@>|L$20z_Ou8Xeyk7fZ85nR<@ zWIFlkz5I!X6}VCf=b|HO{c?Yaz=WRs^Du|&2mH6}ge2Vin@3GZ^()rUsUh6Tbi%Vu z?D^~uhUzL2dQGIA8ENuy@Cen&y6>HQ@fwqO%!cBoKIxGOi}JkYrc;-dD56In1+`Zz zbqzrUus(K`Qr9p6&!)Vd*KVSXwEJF=?Q0A_P^)K;n}?5rk%wh&eCj0dp1#9z`ih2Q z4KrAt-Z^f+`xftY`>tuAhKMU^U4r_$K{&Yvl~{@u6sK}}<{yo%L6@`vO?h8|{8$DF zmlspWpVUXw3ETLS^Hphdut3JtauBu548gZhChzcNFF%%sHdxu&^9nnru{q^M3wmKY zk10s|AqgI0miACs3n~mAh1aaTwdZXD_&g}%@ z7aQAXHgq*eedFH&%Uzi(T_yuKvJ;s=)cGJ|+_yt4qXV`=HLl8=(f2i*P zg-Dpbus9DH)r)>5&Id#@q||-ofwL8=0PoNfk*r=jBX9b9MfAD?b#-;iO2x)OM=l15hfdQr?v zM(@A91{{gZfPBgut=`O)gN{9kw?d{DfzcVM%Wjyk`Z5#TP6d-@qDw-$=BNF>!|d>@ z<*;!=^YlpOeGehrxP=V4H7n3vBulY$h~1%aNZ(+0{c1Sbb&GjSqBMJIT~WESD~rE1 zb0pwm8?G95x=M%m3167#zKTX%dz)XY5F1Pf)J_x9Pt#yT&)4Kpp#CVU`a@}un!1en zMyx<50TludS%N)cDC!ywV+-(ZioFr5l?p)*WyzAI)6gq=IJoUqIIp{|@QWB-Xj`B^_c*TeSJO1$yR=;E( z`ua}^iFtQw&snQyIm1ZWhC}r0U8_UG!|Z$Q*$Ktls4OfqKTCW#`-Q#s^`wM7%E^L% z3Hi|OrDOvOA+GNviqkP+W#mY4#HBi$sOPY%7wyaY zsW}9XmQj%kq3A*3D%x}I%)_q%QWl-c z%>i>pHLHcMN%Iy2KP|Nd;gaH%?W5XicQ1*0%3TXLzdtyL{N3f*#VCQk_qBfu2q~<9 zx$h7onoPxzceNlMxZO}C-uI#MoJ-xRDk|*Yi=&(g%GuIv;-E>MS|wXFlJL!(hOOAM zI4A*hEeH+pMN6Hpul}y<75lStZSqBg+(6t6thETndARiw2Q3A3WF$j9St8I{@+3Z; z^0%aQ&cXS1(!{=9sY5x++;P6YZ*E?T$kpLsi1n`hcX;z-14)o%M+7lggdxWvC?dz+09s`E=U z=yBwTUfu>50fV)D;0eU6qxT_$wP3fCC;CQ{qFg*G-mhCR>B8Y z{~>ess&$qw)T=zy_g7Y=QvoxShFfgf(87*9y{Uw=CD@})R_$s3wBV=Rhp5*WnZ}f$ zlf3Tj@w7W*W!0c(@(G`0NohxebKET`8}+vR*;5AJSh$PGp++(`&v&|d(jPidj*zP8T$Eug^1R4!l|Bb^|PIpzmGQzwTX*6r^;!qC!FcDzXDNzD`e1pZK0+ zEVB`eD><<}EzWH}$0fr;LTs2RBD*r8!#k6#9*BXW6WM>#J$}@%;ETT=I4r9Egp$z` z$L%+L_|*RH+Du!?A-O(tDu9Er8Ea!}dwu_If7dS^c3lBak+;-nw3EeTPU~&E$m9}w7A)dT`WdpL&t|B;H5e*KO>5di&g`S;N?%^+bLF_S6I36 zy)5}HSJAw*$b|5;Z*76SnpeW+MFt+-Bkq5`Yo(_^O`#qVc5@u6Ot)|lq`Edsc%Fj# ze=ZMB)LEyZJ~T3@Pk;?>&C<@suI#K2=1rC6b9=|Uhp~^QlW1@eN+n+uIp}f_x5zWoEA<#b(+~>4+)B@z*4NBg zf1ObZ6MiVnk=Vb3`b-ADW9~>`$!p43V2?JYpFs1+r+`Yp)#?Vzs{x38uwu>T69P505%$PdI~2M%7c|AKA)}t<}vis4kbCYdibAWRh)lSsq6^ll4RF7|=#+vAh`&!~U z9CTsCX~8zWIq3I2L&*SYZGizMhvFgaRyTLe8OR!tQG&2*;8F>{IlVnQTF-Udaq~FJ zA3Ov)YBhiUxN!9)usx=C{n43FT)&MzCROc%HFFrE+0uONJ3co%HV(-4Z8HDe5+ioZsNJ(_RzU2gE zVug`TxpCpZbd^Be6=(;#94)zW=$*Z}o#V~Y-ac)u{}q^~oo7>VWg=SjVU4+Mb$ez# zx~^`|_u5y5fONk)-0Thy3D1$|)QW|X!Hcr7uUvLpUA{azaa!Maan)31 z$@mC+<|9qmQb_FGJQWbW9nrfRmCgNah)JU~Gup+t zlCpQpbVQ8_C`_&{j?pFUB74yTBw;W-I$qyC*|ZJ6J~%XHRAL7ts3+I&Ud=8rPiQNxQ?(R6 z-!4YizL1iN3B}00pVPHp&kef#Lq$=<)%Ftu^L^K~Z#`Uyw9@4P^Y`>+L;iy4?+@T$ zH1Yu)#?O1Y_POvW`q>}}jY^y-fBJmD8UDI*c;p0j$)nE5zt*ECk?!nI>yo2`eLV!*H5M+Zr0bAZU;9fjP$ez+vE2ksx5<8vaD%? zF5CasTFUq-Lcdf$r0VZtXZ$sHZywqQW&-da$!Iis+`}z~(dh5MFQZ2$oLmts@r*B& zPbyq9Dkkc{|HH|AA#jK<9_=!bTzck3`W5cV=+)-tp)sdA>D=_HaeJOXwKX-$ncN#> zZmVTyqlVzz+!qy9(HB2^SMK!W%2-xo+o&GBdRm+m-p}g7xEx1DGh^aCn2|1D%7>iI zC1HH+n~eO{S-4^;L;;wD_wxYA?^$L|<<3ljp=9iq3)e5B-J28Aqj??>_98;N13-^2 zcxkB^Oy3s4ib31iG)mnSkwm1S7M}rg2Q!n9@KC6mkVyi?jZysML{@EJ%KjHjHWPKX z=g98Rv$Iy&-9ckHYA_Mv(({Za53XvmSoL!Zk6o2@$DT#RI zzz6>Z# z`y91En+KGM`Mmb$7qRC7gQH?HVf%sDA~SNU20S)^F}^p|bK0Se=K&5x+F@!C7P<%) zW3COpqB>lUl{=p{)#T}6&<;eG5|KI2AvSR6A9^a@RkVYa^>EX(8AsxFecw7lWN7W# z=_V#@-2{##3kEc}-3(v?BMsEoaD8p({YB-fulaK)u>QxBh)K%!+)MtD*1wW)=)no( z_IOk5_B!I~LYexc%e~S-)2xb7!V^5yJeu>Cf3NQ>oKC@l zl>SYl;)HSh_kn|uaNS`2l@;r9jtHJKEO1o_k|{8$Q;yF5RIVys_pz`(?dg-`>tL;~rl8UpW6rVM3#dwU@=6{?WB4yBj5M zN{N9_k<-U3fUBEQg|L~Tm<9H*IxCxTx9<~(Un8?v5mnLRr zG$s;IiF<>B)*c*73XSyZsCAPYkB9_fsKZetu zpI}`gZgQ6L|8w*&a-3az(8R?s`Uh!gR@cAvT@j6eB<8gB^jIp0MgO*BGP>sR#WafD zgpwb}q=X$Tt&V{E2M1=W5*oZ-shbznS?YOqlf?;wGLDF`wK$=S8B>y0Bc&OLrAM#@ zp~vSX;JL%}Y?_WinLt`fJZ*i_hgEgKljXy+pa`yv$Ij{+Am`u~uCdX`iyI(u=6`x! zG5v1>N~S6}i7J8x72;PpC~P(=HySdwdrW5gwg)GSio}pOG21RBB~E=~n?`4A{xoK{ zvf3wIU5ISLhW78EYQ)7A-$Ra+c=+m}!~l^3p@1+33myv^n+|8({rRt^iYPmhIJ&Z3 z-a{$tMBL82;N?stH{hrIKVXfnGN)nLc&jt_U51S^5Lr6pZ!(3e3|rjg<-=G-u~+6d zaU-W@#A-c}Ja#SDF*7Ie(*hHI7JtobA7gDKC3@2fa$nA|9%lLeo69|UdlUFhqxRoO zllnnBfDo!zf^*WryS=_{N*ZX^bS22-f00<(EL+w%HG2|r&+ek;a&9C`_Z&KfRn#v76y8 z6gEhp*BS{p+EtOL`_L3I7#BS^mF zxZU5kMp(AiQ`031+puw);Zr$x+YZl&c{9IxX5Ic~Y0>WYUfRKPa`gAodw2%qCmztZ z*J||02=S0MGkhBpBw3IPoP#aics@}m%&}hEIvJ1em+MnMs#AAXr=^|Ha<7P_Zp%8! z*gatYY4+Fd7MrXA5f#Crt=TzC??468WdD7Qc}|oIzX)4_@8bs!yOKVR6AQ*W>I(or zMgpXz5|#dY?Z0cxG&25CA)hw>@=b`rBSHeDjfFUB!%A(>U!LJa&mzvA>3tU$fy%?6 zE;r#ZZXy}2BlH1kc$m4e8czt%t>bJ}!h^$ACY%ZA7`RgB{v~59Eu|%+nq0_t^1cNDF+HK8?sP2}H0*okGo`Sj-(mwYS6M7sU*XlL~OL=|3vNcwsfvL zA#t9i6owU}t)EyWF0rGx;YB}9-kX&=kHlul{G+CZjgaHLi3Lugo^WSuEEJ>p-6pYH z;wTVW763|Q!p3Yu*YV?qjqRDyAA-ZpL{V$5ENwroVZ<8{HvvxbLH3S@RZ&r!C6l>O zf&Py(pWFmIaz`@UbqU|p;D@A2qe}Pa)~+U)e2iB~7@U3ot!*2o(z1HJ;90XDYhXDB zMS}BS+f~nT;_LT_vvRYwxZ^3u!$Z*L0<7V!SKlZU=kP*C)}soiVf*em&~?M=?P2_v zKl6%ku3x8bst5@v!m5tYS6J(P@OAOmDdltB6oG$<`#qq?fXC9gHYK7JgO~f9hCIG| zZSEe?OnfdnZ>3M}NJySc34*8|JQ0Ji62}3o8%|RxVpzzjdWba}74?b*BGp&Aw3pTJ zWS|muh${8WH$+0gyDrQ$0uLv^p+~Dv*w@e?T}Vc!WyXWoa%@ez~Lgj zrB^TdR$(>XXjAq2+|g70&|8s^ijP0^o~ZYV*89#Lt?k4=@%1?SNjg;zPpJ&T8S4KZ z&fQTQb>cQ+7PQL)>}#+haU{w4OAN5q?F;HJ%kDiq3orD&KWM67rNTbYTjI<^kg8vY zwT*qpA*>BfuKr= zz${_=T=uj5-U^;#Ik3!mnCbrjjzMw00ucg>R1>!#gx1tl09Z`TIEH{6oMfzOqOH{C zr}dg7r{r$jRUK@OVe8pq9&0TNPC!a}}Id281ng zb8WKJK+R>M|GBb7_U4?K*gfyJ4jPFN%!mL{`#$zvmmv2w zr^?%FrAupsd07SEhkQC(U_4@ky@#kMZT$e(j8~Wqj{ky~IKEz%GS}v{TVeFrt zuQ7Ce-?iFuo~sljP|%Hr32V@v8Tp!yi4nCmTale@{|gA@mq$WBBx7qPhwcb~qBhUc zcSol1^!akV&fmTJ>C>mDR&Ac=6gom9l+&U6@yCak*ZJk888id}6lBlYTH3M=^#53<>s zxWNz}W z5D9x2##Gx+!Zb;&$?3i#LpZ9O|X1;9DT3ePSgfP$ZJkPt~ z&l^f&hK7!aq?8;le|~!U-A_LqkH>kQ=XvpiP^7gcE*D=hbl7J=-3&{OIUJAuFbqtj zW;y5SdabQGDdKoKrj(edwCeINAG`X#6EOr!F{T!={v$ERxJIAFF2z=`2`@8#C==90 z+jM`pqaIZ!LPTpOGZW|XSsR7;*su{%bhOLwPc$*{glA+&IZ;djnK?0AjACL-u1O%o zjypz`>H6yZ=VhK>FB3o~FXeRid!lzGCxV`^6D2ijRj*6=@bUA94_{u+Q#T%l@pL#o z98Y&$Kd52OIp;a&X*hJgvjVUs&+~i{wUjzhHBvw}2f4sNz*et&m#6r#5x{9Kt0;ZF zuL2RB&ldoAdU`&cPJxpMAX1-(wpb?V`op_N8oL9a#lX21u`=|h-~BL-WA6I&m!JQt z5OQlN^+YVI`rH6OK(Bh~aA5pOSxrpC;c)-%U9G>$*DFX9gSld4NB{u{kT8g?0=kv7 z^A<#o-ha7w`_?7d?uEK0{Gr?2_||U?SXd=vMr#!ZF!gP;r;qq#<`f=Yf3oL(yH6uB z2PAVNnzaPD0kfF_%BmpIHK-8)m;%rWo;LwRUVj|11Zkpb22Fj-2}Gt))qe+aMl0cF zVC3e}>%3)1gr-aw1BF1Y0ZK8Z7;3FsF1fKslYzH^@C{`CR^HJmTFN0_r~0Qq{pW{| zUpVv}I(NGUP$KTT5JE^@3{0l_54;(_vQ*x1A_o?C+S+>M)ZP-|_V()QS1INB`FWlv zAJ9D4=N8d()G6nDI2=++KmYvm!{g)ec-W32*-5QCCFL8gDQqTL$K%l_%Io#&xvH+> zb|Z?e>xN-iSzT(Yi&kJJh%ty1k%riHejr^|Kv z?uYOHeX21LK_hWyEA$74!@4BuVIKDML3dxn zJ=JFWH-80ifLrgs0V|tP+*bnq-A|^JH=(c7px5VWGkD##z6P>^_NW`+EN{<%*zPIA zZh8j_R!R#Y4CB!EJtEao=UhsyAlnRe<8|SyK-$@s-V(Wq0Xj6}QZ-QpX%(#zgphdX z)8%?qtG2F0;ie(_nykB<#{iguDu_ZU?d9e2`O8af?RYxGZUl;Egoq(^( z|KL${7nN_EHa0<}ese|EthSp^`{oPXOx@=-ziPWX;8t-~`hs_1A3uKlw}1P$>vfu@ zX<6oF$==7M7()AdqIO)38Fr|-{a`~CZ${@?%pC(&x8qR>Qg z&X?&cobiLl)9f^5fmX$xe^Fmg@dh0;| z4Aq)7v^B#4Q1;agfqR)WRU!;TIF7^J-RY;Fe&?-ntpyZ92$yO4_191D-+gyF9;LOG z+t7_*Cfdwqg&N|RIzFDpFHe^k5*T^}9IV;YKAp)`uL)C!!#7m*kmCLO_w!|%FPCpF zo)v|2hDZ>@?k>4~A?)svu!6R@4|MpgQf9-^+J&Ji{j}SQ~wY$yymP7x|ec|%;Qi_?y7#u=%->chk(!sJ) z@>b^Bvdq`ZrFb$GLX2@k;`!^JkTZWGz^0~rh3exitaAYs#;6+ zy1C}j=H;L4vxvCshG94YNZ$|3<;)a_LzjABQCUy`2~@<2N>c-m!X!in0<_g9U>nSL zMS-t|2#`QA5Qh}3!8A`IhSm`9a2QiZhq1q2=jWFz5~LIixkLh;8N&) z1cM#G+5WmWeB^ec^i`I@j?-_Ra9;U#RL|$++mh!SqCKE^SDfsl$E}^fej2Z2Y*=&g zTD}aF;j+Od&9uwt}EwH{OP8p>~X5+tR#w^t)XoF;Q*u@#E)Te)(WP!!Qy@qF_!1 z1Y#z4`)o~M8&m&rj^R!kP&IeV_V?3SPPd|E?|Sw-`?r6(W8Tir-Cs9X$A~PYG|zKN z-8hcZbZxDnd&zPDT!{|1XW0IGItg|^`J4}tV)Wa~+i-sZy?YHzu#arD3Iucp zu^Cg0v2{%Y2j^0oX{{B=?(UC<3}7Krw&n5tU4#63re(_K^Ywh0N@@Kt-aYj1-@iW| zkF{AXB3jLqiG)l=L6wo56jEz7k-%&Kt%{iv2EPw)UHM_lK}S$S+Jt%Lgfa1{0Lh2~ zZ_GF5P-~F}T}m-Ux2Yb-5zI=-Y3zXD`TCNVRR?3c$K0@hl? z?73T)^Ld(QL+rY-?-Nnbb?)0He$Q6(K#H5SDZZh)3Z`9`hAwoGW59^O3`8ci5|D1L zYOCSG%I5p(Wh)wm255$PXH-%hd9c zUq$ISNY3LB%&@lAyG69sT0}}KivcpEX}V~Fjs_nL*TG=rKA|C!5g_k-mX%3j4&cPT z!!8m)Tb8^m%QRh?@p$YW9`6C6>yv?{J{^wX>1Do7%XQAVRN{C#98dR;r_((VU#~B& z&y6w8ORlA=Dsvdev9tmJ(nQT@^^?)vQ*-x%e`74ImP!U{hM=kh7zhnebWJM*#87hX zQYtx{Xr7lCdu9@CZE3aU!(lv(BQP#?u2QBvdB7hBP-sgup5)s;g}S z?r^GYBteobC>W4;=I6#Cbf9b{Vc(jN?12>P(JkM~9&bw5da$W!)77qok=$q{=bTGk zrGZRtk_CvWU?xqPf^m#7rmh=YuH>>fKom3a`wC>enI8Ki3@)Pp1i)!te*O6A!^h7rFB63>#J=mtkosxLtqD`y zT#NCI!}|{<5x%2PQC0DYsq0pk1qX%@uZ~jfHOqNzx8L?F1>%+@6k}|yIi$6>!(abs zsLj-DT+Q3G_w~+q&smbBwX?yX}ly54F~+2Q{UXPN&m0CuZ5+@Yd?GEP2Vy z5qkJ%Uj|aOTB}u%O%2iDe7VlKk5F5!szL-YGI5C9pD!;eK*1?#xCWUJu3tr?hZ#LLyZdX<2f&N?ArPb1@-0L>@F)8k{FmpsqkPKd9I9Xg9~r4xBeLuNPH zR8-tfm$%!GHf!*mtVJuDzAfGT_BHzLkhr5`dpjm7>-q5YQ?x^f9)b7fyM(A_xs+Vo zIf%VO5cM}7RNN6gjE4hrVkS{gF$cep2$5TDOzx`ZqHZ|Tl zxvj#^hqw_ZsuM(Ot$p9`tv77ek7`Dnv(SF^w;#HGz-=U$`Et1cSZi%pWu=suX&lGn z@!&n3Q+7=~mPP?6rLHw?qK5y}?$8aO0|yb~6q{r;Tjrc=#UOwbm;nudQ_D_doKxX9HVZ*BSd76fKulsW@q2r;FO4N_uJt5s5m&o8g%vs}*Yg((4JY4}P#)t^ZvMkHerNkj(q!r|ikz~cEZ^8j= z&zD043UBG+o^IeQ#Z|{A82YXgRaFTbAYrYoNsB7PoKlQ|mojmRF~roRuJ609Ytp2( zT3cS)VZ2KLYe#?h>AlpCFRxhyn8<*nRwN?E){GDhuv%MmW()`&eLdn2hr{XNzO~v) zy*+j;3tY0@vjgZWEWH_h+jb`J9=lr^+_|H=SGOILq8rO_`G)Y*lhKQt*w!P8N}F~?(Rk8a+wU&c^F6xfYUSsQESq5 zOdJS6QN-3AwrT^_l)A&=kW!rIrDhAHsH=y4^j=I-VH1q@W=>FG-oYFe8V(MS|rb!CRCVtR8G{8`g= z2Zw+}?9yaL0whC3QjEvr!4MRh+fsKiAu^gaT>$a!{_e*gAI-j;&zX<_ z8KD6%BAYevz#gz_ZPp116Lz=276(4Pd%RvQt=6xOYBP9U?AY5TY2K6>W(J@F#4F3+ z-darnkk-}+Qco>J+Crwk60e#5ja%srr2iW1-_~|~i}+HA?lIu$70m47k`N;Tq?B?_ zp34(s*neylb+y`NS0Js4S82~M^TQ*BfkQZ+jv^XUM8WFGtcb*Hhzh7`fBwtQ^YwCf z9Pf_fVTb{(X${;10#WqHFi>QUh^SiCu(ta7>G?X%BGz?>*XPUg^D9wgir2XS#?+0( zvDFr03L&blz@c+nSG^-DN;^Srpv6cJ6+G)>d#bhv{mYUasfMd73AeM$}xG*j>GtIRgtQ|1+LSru&k5n&+;y7=c54em!^n5D{CG zz#(vVKA)eyJl#M1pw@DoLklVGt6>CV5nU;L8|z^M1zkf+Ce79c$BFygDooQN4TjV3 z%P$|8?{Zd=a6Vu1VoiddP-;+0lQ!pEYptRy|8^WlRU^bEDh*PKB8sbh1A4JEQZoWW zBZJjC*nBs_%&W46z`$a3NPK_OjF2J+4k3K_^~1mX%fArNJWt2dsg+D!ADC(rPjezB zKvio7&OEZ(3L$mf(Dg%WOViSY!?e7-e>^SobiKZ+G~z_09M;gS^~MD>(5#t(1IF74 z5dc!x9ZsjREZ?+Rur!zo9MYR2X9rPyLAr|iZF_8NYkY2-uU&6=qay*h&0M&B*luBt z+ri-$>)qBewC1F4M{|fN#6(Qe1c^BW_F$eEv}u#((QE$QJf+e-;}JM z!w?=H-~H!*{%2%HuvVL>gbkUIQAoV0MrkM5Lndlw~eN-w(Gc~62Fld;_aKZUBkDgW`Cbn zPuJE$2p>LtetmuIx-P`{>GS7#o*y3{Z!Hpcr|kWr?C8~Q+IQ1dui*XdmD*R9U`Cr; zgCA*o5B{5tu*bfG$ZER3|K`WzaU92#q8YxvzI^)h>G}D&*2+wvKG*PO@)4s}{D*ko z?Ohjc7T>kD`-dY^KA)fO?>OVEwtWBYgcQ%OugkLhG!CV22f?gpxlOPf77&Dsa6<=Z?4(t;eNhcFXiQ%kK<*5AprA6bKl;3 zHCR=4Z%B%%xY^-cY{9ZznFj(%p>Qk$rYZQOD|RF|CHyk(l_ z+8T#YTXU84+GSLUF%IMC-@MjZSFonh<$&+CLzYY9|qC>lAudlC888b6~v;v2HgEx}>GlSvwPTD+A0sHZA0L5_}z~p#%82hnFtFlbQdKrNbG5DqFR=!sxc)_tR}5h1XMGX zQfubXM3$ID@p?M(zx?6dG`E-Yyp(IM6}78P5)Bk0$T~?>Yl|)c?6_gBZ#DxrHR~Iy&i?wwb>MbAsQ|62ZpN?v zn7LbSt+m$T6Q8T())Zw`Gizd9*AK&>rqh($x-i8U{TwU)G?rR9gwLNppD&lo>&wvh z{m^%PZ|=zll)BV+F(f|01A-t(tNFStXtuO3M09G}r37fB_VcnBDhDp5yk0Kn>vVrV z#1JTS!yyunDUJOwf?3JA98kb$o{vMmi@HNx0GUqylT zuq7sAv^ElAqFs=v#LSPOt)LLF&TdgJMaz39gmvgPvi7{^6kwSYw#3_wICa*{+!DW!ynfP$n%#6SWDf{MmODKH`VGav5n z?o-!^$anAG*ILJM==)(mb1v5lAkK4E(<4(yW=%vI7_}zu)^eF&wCXq>ru>N^-rXM# z$Ihr;u2?GoLa8fW4sWs%Et+QxCq8|1(fY$74d-ua7F31YAn=A{t_%E|5%H~*tZXck zeVe@(A4J_5+dH;(DYVeiEG3tmx}Jz?T>^*m`QoNmB^M4HQbIBU!a&5qke8(f4v5@!ahcB3 zJR`t-nL`LUi>aDvOkrNGA<}pl&0t!V*p1zIQ~^&-Mv8_(j9RUi>%1&;Da8E;-(0Ny zX4!w@Z5i5!zBlXft#Nh@&}IfnyYeB#aCdhKfn1O68MGp}l;ZUL8}9LXClVogiW{?t zdu`}{fuCgxX#LRlLk|X`tu`Wzs*qa+#7I$0IDl|_|M-4duKhTK5WuXp5-6sK1SEBf z62vX~(&>4i;B0wNKqEq9WFx?p?whk9OW{F>TA+`>1YmoU^_#Y6mCoq@N7=hK zxs4=wg8qsKfMjOsQB}P?ySH{`XZQU-((a7yOjnmmQa(rmhzNJTKO6v=Quo*#t*n%y zn3*IH;o*dE;$~>^Z_6D&p?3H)wXSH2~flXAmMF1IB?9?iM|izeDC~ z&Axc`cHXh#t$S;&);3Mk<#I_WrJPdA0m4$V)_T~wsP$!8hEg!4XsY(!1AL?4x-4cU ziQRRYE;) zveecUiE_z#C`f3o)>mN$b3==IV->m!Z#N)9BY*$cEW*~qEWCaQCU4=UG?M zJEfe5VNlh1p3OX^#KG}IxZ^SZ|{Fvor1el8Xtrm$(Dk-76q_oy?8@5Bhr_&7b5D{9)yzuC4lvJi$|)sjt;UWfqFgc& zxCM#VuGh05e1HCPx?V-HBxa_=kW+dTd7LYqr`lUxssDGk&On>jg6|-AlBA3Si|BhL zcwD+~M>K4IY?4@e4B9q>?-usEwhV6Hb(d$k@2-G92dtlq#7NrAG{E@L+Ue$Tp&bA) z+&4H;-W>e^JmhW(i8j?(UzR%0vpdAFY#hfjjH*^^RWmm~pU-I}h%_Q35KhRnnk{uz zbM30FwWf`TYOC{n&B82Ha$?Ssg%A+f@l7&YTM~N8qsSmqdYh-Y4z*veOY1NWMN&pe z4%FQ>b~~eph_Jau)kC2Q;Tnw_Uo%VyKNT=Xb_Cq5XX7$P+hbkj8>w^E9X1bS`8Xc- z+-etH*b<)`%aVxh+%Pr+Xwx_y?p=0vJ`im1%FwzR598^0EIFIobiH1$Q){i&rPc)y zDQu10i7A(|EDNHy)+5qQ^SsP+Yke3>yu*-oXthN|BP13E*S&d{a{;ga#h4YF(Og@r zYRj0DnJ=|}d#)uPAIFi>Kq%+)-UB)T0x@m zLbHuyzL~b)#`x}`biDcmZCN(}_Etw3LX4CkN^}%S%mjd~w^loD9OYn>)mq=)s;MGT z$)%LzFb+&ZmYKF$C;^+V62wd@^=X4ShWa-8*Rq| zIJuGv!sCqgEOn!4`~ZRja5Qz{G>(UPnp>~Y8Z%P_Ts7U-{BFhaZ1f3gwQadDg&N-~ z6N4%s_fHp4+0uZ@Vp5{5H^yi=7j-`Bf z;9SPj!>8%`)=h^)vEG3J%n@-_lvFosLIiFpaw0HC#@)RE36agZx<#pI2vv2e)!dP2 zseN90>-_NWMcJ`>HG2V$%{pFtF-X zU4H;Qq+H54{ur~|p>`O=L$q$CCGT{eZDQE^8RHhn+~k;iZw zpq1Dd5r3r-!p#T_qSH7oOYOD086$-5Ubq~YTCYuV>P_97IZT)7I$f8UqpwuT zu?(g4-j=>Bb-K>(M#MuNdQ$>qmc(M@6asFxf}I#v{3J6AYD$t*jI@jh5m=ipORGyI z8UPa@fop62`dWL}d2+yXep}331bgf57)Y_YTzhXKA}j5E7+~PcfxQKU$)`~LS0V<#K>~W+N{^!tFrK(Tb+)ld7gXiIZGsLl2T}Smr^e0 zGa=_S?2#rZ40SRe$MMO%7g22K>D64fhK#(v8 zW+4Y#Y6W5-19u=L0ZA!ILW15KF(3m{kf97T3_2+hk-MzWY5-SQbw~_+1uBVmWzM~8 z?X{%h-RfM^Q$m1iogWUT%jGi96B3n_fDlwWz*6U_SCJx=^HA#4SPEngP(LBLfx7}U z#59hFl&IG3knXh^0NkKgpGQ30mw22cm+}urcvW2uc%86g(1Uh;;G66Q-Fsea+16eX z?&0jFq92vw>PLh`guy!B8z{EwCEg}eQ6!q#kmPhcfZ05`tF9Wo=F2?mDqV&-rPghp zYn=bR^^{M;aMIo-Wunw;Ra5O23d?EWl2hc0k`k|;eH5k)!M-FUMhepDka8&{67_Bk z49vYZZB<+Mlu}pJj$OgR%0?AHgp=ti_7P5;Yg4)R@M??9C4x5s?leWhwFw#E{$RJs zYARvz^;Wbg?ZP7#%uw9n>}FtSX0BaZT@_|_>C~L^#}6N0US8&T8cH$K-sx}{yXtkC zA0Hpxp=lovhgAiI=y*IZ%iG&|YcSa=%O^b52^`FIsdH-?U>r-HF3aOFU7+<-cE>d2 zsz3y-wstwYp;pUzzFaP^FK;>L!{N9otRc9s=oQrvY~0$YM8vjn`CDst_~$li?;p0E zkzJ#3E*~CG=9` z;ynhaDKlNW`F*h#q048R2Rhu}QX-O^BuNW!=|1{+|F~gq;1&nh%4O}m+#O*1SGU*y z*bXDU0o;EWCf<(}_eoYf7VV}QbNG+}uB|Q0<#M^Clv!9(Dy2BofM-RUI zWr-Wg%q$FxGjkFOSEnRA4D`qEufs67gGj1Pt2(Hql)3e#_Hcj=ZsWtlDW_a=jxZD_ zSzQ(fkKkTw?OnIKWBahOwdOAWxxU!lGDUFQ%oa^aYi*2SJ1_HG-_G@PY}99fx?Eo$ zJ{{*;vt$6zDG_3CT{wd~A*yL@bFB@9T(Z;pt^}n)w>YiLdshcfIW=wb(#ZA0$0xz3 z?_YnvzD>d>Ns=Q4VrFn9C#LW`7jaWm^&a}ifPlzEj-Es)NjG(X2yM}E19zsKr|*P- zOb*CILdb+dA;z@sGk04F-W#P=#>1g2=A09y=eL)q$Hxy(AAnF@hccv;#$28+`0eZ0 zhvV@uj>z0Es|a7bH{b@$>;q4fTl|72P0G7Q^hyM-sZNkiObUhxC(9SnaMu3xU#^W_{A zx%l4J>*acx=Xn^$u%f`tDmnN)h*U~prcM~0qh$$(o#dQ%OV@i?EQVmE_3bA>7`N_R zV%5G6!n&?Xc)fQL(ap&wAQyMSt*{U8?&YEYe9g`GIJm`V4Ycb$!ZTKu>b@2!K~d;9l)|M$1Ix7YJ@ zKEJ8<*4i{pdzUk=+sn&KNRp+LdT-M-+2oRihy_E-q)*r7ILhU^lrokwrabnS^X2um zc0-bsa#s*3XdbMTlq4h@mrdx6nF9u#67HJxz4th|-syAEes^}{My?5c6~cO9{Qp~B5jQ^d?cNTObrp7oq)4I&PkYJ9!&^L zY3Wn%J=88X#W7@I>K&k$!pGt8*MIr#%kP&~o2nvsNQff?6EdT^n|ey-PHK**NKAn0 zA&vy$3e(NNED5KS!YejTih3GNm#3a}ASrtEjIH>_3 zxccS#1~BZDwC(@f=Yw})rdw~+@gei*4uB#m1We(w{7-|?e;TUZz0B`le+z=E7Tyj7 zx*JeM%-TlmH>5QpN=nOI&zEa!ojLTpd>qD-OBn}54Dd^Bt+omd%#sTMKrrlLa9-}~ba2EynHhXP5fjkl9#FRS-Zi-ak04~eMFm|ha+ zoLaA+KAqfYS6c%7*N~+Stp#SOwZ6Q(Ama1$^Yim_t+kYb z04a9^AMr5FS0+4-W1D9oN}ME(4!qPw6}~^e{_SsnSD?egqXMdWO5x(6p)MC>qY$wR zaL2AC?{1M7*IHZax9l8%nGp^CYmXRA2W8L94#W82UZ8BjcTz8zYl2kj~3AT_^KOhmy1O-rO`L zWb#rVysJrRt?AtX42f6_t#|JTibMccfKHf&5-6GjAtokw1#Jkxn6eN6b~gobcijL( zw00Pfwv@q5LmfV3;c=Z#uNkwuiHAd|8v5s({?Q~c$dE2!-DQ{ z^F%x?^Z9Z`!a@`+iE%uza8oU%08sDt_If^_FQp8p(;;{vk)YJN>~iKi^fc`D0#)C7 zYpn%*BPF4Yc(P82-Bqb~>%F&HTWe8-39tHsA#=S4qZJD47KV&JGX(brc~E46yb`72 zy;J;sOyA@cSDe&PhNwCNSi585_7|`BVO67QBJ8eeDzeJk5}^p!y38{lkB|T7|NO_p zD3U4 zNeIx(>Sl=$5E7w8F+^a!n<{~=;*pyx9^neU>@l2QQ!T$^Vg*JI zYm7UUsB!g@K6K?$l@#=0zT%UkdLcs%}0SKfbp zt1ai=dpA>&ERq1clzcdhMEL#t>mOgfeSiM`@zaOr=jUm@K0cm4fBp<4b#sUa%xd5> z0`o;ghr_|l4u?bd;)HCOupnY@3Z`{gdab?J>*WmYEa@^$X26_9>Re5< zEQ?t{CHY?6NC8Z(^@f1HDo5%LLRQtqJ8qgENaSuxa_-J^BSy2G^N&l{*0gm+bP<`C zvRy8FSDp|_u_yC46A_&M_lFZ1i5b1f8fT47+#^xH3 zvQTR8X025~%{i6K?)5rfo<4kD7W@0(UcnZ^;tKAT1W%{@@#6yvwzeSSvb3%=lO{oC zT&mmL(SVo{kxFv##K`EO<4~DSMMSw=FVEl4 zzy11K?|m4C-kP?y)aqs>XJ&qSd^FXE;e-s2r^i~Cu3cC-AxW~F4ybT4aV_!Jf6aT zG!hU1sIA42Zml#$XcKI4Z>Hwpr_<@_>EVw*zNlKxIex;jEVb59#qF)9oJz_fDafml zy9rCxQ2V9Lqz6MIWdl8KQ0e!@^$+*@O7t9Q?ZMZ-qm4<1am+bIQOUyBsxPmXTykBiTL@>v zd8w^;L?eb^!njrl(kdceuIHE6*VE~gax%5J<)@6AZkLUU9rqlJxLS@X#?f}zXDU8Yx|;V@(*`^#^izkGSQUeO&wJ2Pq=cQrE+?ymk`nldI`e&=X) zmsr93)qiUhud3(x5BA{}vTgzoKM>ZUyL>M=vp>uXz@i}7y%=I|hp&8y0@l`6X+X2+ zLS3)d^X2UBB554QTn2ORs=e1x&Oii_U{S6+keRi&)_P#EQi?K>;5NL|WtlIROJsSf zT840`N*;Vr?Q2t$2@Q7*{dMxOU1^VLvnWLxPBU zSF@(7tB#mRzz)_Ef^JUV>xtF-E{_$&!}=wQXaE2p07*naRFtIF<=eOK(=;6p2SE7W z|LgZ*D36birZz8228shF+HFDUh)Wm!?+C0r>oDq%pqRKRvw*8Bwx$47h9iljlvB!_ zG9a-bGYSiCJ*)_bI}JV*YK9@vEiaTldQcfbS9k14}Q&n}6pmqz9kO;b%qA4LV zuKbhkX6mYLB+Mj4j6h5TC?qh=XHz^LkMlH7)2r%)m<|UvwPt1=37o*SEn25^Izmhx z`vrU!sve>ymSp z#I4Q9)NHA>j>F-@$A?;{)(sHNx&sm879$8&3%qyj`8_Hj{MdcJ+k_4dyVjDL-q$-n zr&+s3(w$bx-V2D1vOVBkQ~&+NgnKo878Vv}-Xvs|CFkkaX4Wb&zBfBofSou73v0s=yC zeS3W_13Z2x;C-Gi%XA@(!qBxhZC&`lNpi{a)QNGI9yBuqO@aV|pzD^l4z5hdBFyMu zrrm;c1cp03Y%|~pU`iRwSZmF9OA-)N)zq1Ip62l|F0E!s2v|yy#2}y)raFL#kB?7( ze*50Fmy%)if;48#S$dnh)>^N>{QC6u>$KF$oXs&9k95HoOCWB4I?H2g%W7d6)+d0y))wk9=MO^4@-bSJu3eDef{wFmgxYJdBPtsO-oLNPf3+G;ZrZVz%CC-Q0l3cijotHq%}* z8vxAH+^q+O&fFdzj=lHQTL@Oqg81p~Xb!FGb($07yfide7Cm2UN_;*q)6~Cw{r>r* zq%=C1gt;P%JK)L~#Y6>>TI+6&2#6vE15xlLJP3g1>_|lXa5`PCcDcMgefa$Fa6~fI zS=dc00*9!Fnbvu_o@JgVgI<@qiZUWHArLSjfJvg1NIPxd6$HSjOA%NYdQ-*~%SPmg zAne3$9^&Bpd=A!1761dMh9IdF2T(VJm?;1q>bfb(*cW z)8h%;zkU1q*Z=lcCK|>uX9<^i^#^fcMsYb^srNk_2EVzwQ{c^buB?rM}PYt@Ns$Q>CDP>ufaB66^Mrm_LEWhh3 z-a#eyXnucPZOT%x+!HdrO=<01P}?Vn}M30&ldnV91l5{z?7mg{f7^BNNP1NA%VfM8nNQ zFMbW9BNKyzt1uu1)gF*Q!qqIiF9U;YyZyO=QxJ(AT#&i9zO+R+p|H7K&gXfVhjBcf zj&X+r0y9mMnMz6y*y~cYwx!l-KK^AqpKDI?;o-yYfBp{Q<8dG+a6Hd%V>*_@*k?nq z-~RG>so%eSe*-{C8G5K(F%tfeK!wpBthDEw#`h1~0|4+{{JJgNI~BKgF2}^79lw`^ z_dn3Y4o<1h@@>l~I@A-WEXL>z{9ORY&{ zFQfKZXJA?TrkWr9<0v72obKI4rT4&ycQ3e&FPQgJq4lP^S7*3$q-ne3!qNd$9YBe= z6any*QrLOMFDhjePEJf}xbYwNH*>E=v){Y@>m7eUh~^eUv`sM}?9??hIpSz1K%$lM z9bJom*kM>1U7J7O{hNum6DDtKPy;{|04T$dOAaKLnQm&R>radT>342bwf5fn`R(oD zSW+HyO149Y#3r38dIG1-bE z2-7A3lVU%VI~9VOjJH%>aF8>Lf_#?hm@rIAun zKtMps(fQopAD(|UGMXK9*0A=@sqyDW+}l$2hGJLlfrz*;Bq|pUZ}$d@4zcbQ4C3=rgb^+v@UZ(w=sOsoh{pD2vPhJ{$YJ~_nJ8e&VR=+(dVamV?Jj|@aO{#@L-Gz1Dc%+$Eu6H4 zAHF+AJpxaO>i1CJ8aro`OFcMGkYTGL9VU(1I{SCyxHE2_NMomG8BkllZY>b!3ZB$` zJkbqqj-U%Z%I*%{d5#!%gQg$9JU(vP2>cY(kZgjZ!tyP)8}BYY;BDR4`B%|-j6+yZ z(*D{x$D_pqAffQdetY}7lixAFz9Y{(rU2C0RC3Aw>f;mFc@w5hj0&eDXKpr(WXoq` zCQ9EW7#vNv!lLmx5Pw#8d|d;nqv}%Y4=LJ@7q)X1UrN)6{I93>6?Y!pTFom=3gRJbHZC#o8btn*s^?} z>n2fZ0$uqX?rCIOj~Q+Q@n zsE(>6FDkzVFoL;5hTNvs=Nr%UKVv(;BnK>I=&~tflWirC7Zn6upP%lLJ%ge6(r?fG zuD56TXRkj3&inmQSdc^_N^IV4hxwdw|36w8db-8%gRW2Kvbru5H@v5vRVG0&&qo15 zk%s4X*O8A#cs4IM{In*1`kmBL(;qx&Raw!M(L3zqw3$9LRr^>?=$fRZwF?lRfHC*| zEdojtx#8Cds~4V{EeH+@J$zP_iusGduPoG#=zSn3^|Y5!FF2|{G&)>Z`0?M^uKgjN z<`jL56dA!7z>dZ^4E!*K@IhxDp%%i~)IluJss|PE>!?>pQ(CU$Pp&o)NSF7hK#Te` z`;XzP^7HuAbOr`qmPHy6`?Q*H3tQpdbr>F9pcv56Ummx0ux8}q^K`JF)HZ+D5~3>&rTG5P z^+g_AUVw2}N3~zZfcfQ1gj76-OGaTX5wUjktfxc9SR8)vdsX=;6OzSdS@S8kV)d_n zqM2oq4Hl!M<9|zY5;-}o4DxnM_3@ps?JJ)+UWq!x#VF4a21 zOnP6Dm$)d5ck`M%U-uUsF#ez}J`P**^k=T};xc16;?*J{=RQ-vhAKY)I92`I;+O`- z{xMAuA}+;`&*Zro_MyT@&yH^kd;>_KqYw#L9i5%@k%GDUiir!Ia@{hFT8tRmt!7~i z;_+AnnAwg_W)orR;%usp_lN&BnfjCUZUJw5Xh6)S&oRv};<>KCbDfI%P=aQO^G`YK zf5iy>-&z~LtEwog>At|7DN0bhME~}vd4VZkTO}b#<~+WB*cfHnC%CIHJ_hd&y1lqP z?gqr8nTAA!!n;@aNK{CChS18TmGdW}=76D%O9zapFy(} zY?BVze1$k2Z;5X~%o59;m$rs}$8K(J0IINGTlJ^^?_-NbW8dcEsr$PApMc=;hnlk< z@kal0U7c;s;+P(51umE9IEECI?GlL}D@z9Lf~@~y_9o&RalXuq^&-*Wx3_lqkA9&!W!Va300KH`&axD(33 zizeKOHVTbK%VX%A^XrXF5+(d6Z5j=wDKWr`h=aDzv7JRZ$(BIC!*=uajiVV@n5^n@ zZD+BWI|if4Tu$y#_?ey)@^S%ru(dV&ek4Rz3tgXy@|Kt{OJW@I2nY)D^*!9z9Qb7) zslM(0o@Vr_xjQhcG%{0-3_$eIM3f0&{3so&rSKRLOL+#0vov-7qqmJuDHzVNqWFZL z>A#Th!uoK9K1&%qr;l2Nl+>ZjNhL(r+lNXYAuTozOJp)7#jB|E1;^1%i^r|Un`2k{ zUcOy!VIW@2^p(_|=TjJw;5X<=p&nnVSFhx9APQuB^}#71Q6LNCZS*9J_uc9X`QxSk zj8i;~vmYAB_u45ueF)5Rz95`D4&JWT%skf}ybI0JX?xX2@p{zP7EcK4b7e1KJfUQi zCEc*F>BD08!@(HZOLcE!BPG+wNhy-`dTaPo1!_s@pF})>23_utNwy;2B4HM>(a-Sf zoV3*Skzxh`k1$GqA|#rqw{ejsfwc^%-JAOz4+BcXVfiZMizR=4HgmqkKXG`3-fnC6 zpIaZyEsHw%Sr-kBWuB%xNQ+qJ$w7Vepkm8;)y#H@iku!2JY$}uZwbE5wmiH(IMk>* zqzq%EF-AyO5)Bu$dm*D2`|yr~gXng$D_|#yaer)Nwnvgmhj4S=`j@C#Jp) z_h*WHB`P1cIIEsZhZu|OWVU4Xj~(dN15s9J48aT?s)ClV#6u$a{n@0G%X(KQIdSmy z!Qr<2~m@IiFnvzXK&MVPgfZ@mv!SIO15B(3!id-$@*X5^iaeYxSu z+rZlKK5~ll+9CD8n-{8Tv9LRa1IpJV{U0cR0iIGbHC47{$um4=>(DvWgF@(iN&Wdj z`{`?}Es5|vjVG>EH}*gDi+U&C2a-CEj3ioc*NcRo^tz6L$WmeqQjtf2;5TF^Bu!RS zOuCx9nc03iTSQPd8~bsE7J{Opc1d#99ldQM{rd_j{;>|C3OcQ_*;5R#ky~{#DNf$* z!2oN_lZNP4R_Y;U&mG_>!-G-}II7gN>OwvqBaDBx zWT9<~xjDKc7CaE*Ih*T|;$3qQm?8D^78K0F@Ry&&?1@!Rb}salpc~Q!?fM@(!p*Li z#d0W7Gc1NR2oD;*QxN)rlLBQ547u;eLvE9qa4JyUtt$zyH#?d48k)AjX%$y15vzoN9FEGb!W%2k|eTRw4r z5GG5ZOa8cj?m6GQxQ8BoiP_!sq#;!ZGfN_;xwOIGiXo~OkaWi7XrTW!uNRaZync^= ziN(Rnq<00(iWV1}O@u(LPRAI;K2UdYFDI0XHPS*p3Y&AlQ8lJNPa0y?o2HB~q0iG7 zoN^&AyCq;QG^~HZP$4F44P}aMM4n5<+a?wze>Tp^h_Uj{qhQKL%`$)C%_8mylt^4X zI}gzR(EtAC-}YEd@b#0jB8vfcsdy!bNeWKSJVuPuqK2s8+S{+7VSH0n*Zstf1x`D= zKk`t^@tDhJX&tt-UVzQ-a zsxQurDH5C79PashCVUJlvw#8lb<)8y;8)(!#eB!ZR!D%^%Hm~3ZfU96>GZp!a^&+BZBW{UuKU2qp!0iDhWo6mak7_?fu3Znk$P!~thPDcc zyDzIhG>9R_F)t#*FIP%cCdT6z{t@bmyR+7Y7JjPz3YBm2YY3$VGifiT%Sdg0u2x{} zJCfx`muf^0U>~`BT1e()RtVAl6$h2#>R^O-`_B_9h=}}%y{2mV-u|2Jt&C6vKXYc( zBkkA0-)p3+tyUII3v9>MEa3$l8~e1$I@3D3Z(tA%)Fs@LZ>AZ0W#ijfF=v)HP|cKcm|cXO&*6|AQ^EQm>>yh815=RDQ;Vg%5zLm)0jKn2PMpZ8%TsV4D8OD90+Te7$kZZ3&bk9A^Xz-qQq>(Ca9 zPp=qbV{3InQIY;5#3tC=BuR_;uhzSh?GeFUbJ~36WVTdnrQY-=;56 zX^XAvu8UOD&0wL(hjXyNe<_~n5!Zg-IsenHThYI|=xA|~sL^t3|4;44tcNZ9_(<^J z^43?2@knm#VGxt~#8{XE7fAq2anY@^2xBR%MaMI=}FcG+1;eB>YY9_tj^%RK|)!Rn(Ol_1DS0et) z;11%-YHh_r{^a3p|Ev6Mn%nzja@QX_c}&)g>f7+N!XW$r+U3c z`{wg6z7h=#@RR5IrD9RN+J$Ud0 zIx%y{0&_|Ik}x&Xj2%t8dAL7^9T=t#9nbyf{M{q2TD>vt$&%5hRE57W1O*HQja7JB zJ_luyX98hU=(%}t#l_m3Y|zc!`EB##Eq_@B&1aUYJ&9b+D0Im%^p&EJ_<7*)UpMdm z;59c^Yz4wBGY~OD5E;LQgX!1;-uch()$8=N%i=8RCbGlM-hCRrV^?C=cb`Jn258@` zixmtal4ywz%kW%0{yf;Kq{9DEmH0HI-7^!cvaBx1m>O_z%65eWx*SQ)^C<&itZLY^ zs??RXlgm%!(e5LPRSj4ROEnp-23vy9^JTMJ{h`3zSMNZ9wKzLM=*6qtX^ulxXPBl9 zC>@8?T8jRYuN#eHGlrN&y67)LZt_?aHw}%fy)yv-UotO+r<9v3a0XfE4T5nmwe%u# zKQUyG7$y_(4!nGUfj@2RHolUL`+RLR!?sEE)%C_jXSQ!C%_XYiVN<0L|34p0L*0L>kJks@SGvTY0N_`>0tT5{E?Ap^saCUnd z7puixWCF_ZV--owMv}g?r$w_m*%48 zM7z_47q&X9aQtr@8G6gGeELBqr8{Rod<89b8&{=_9fE;NLae0F_9!W5UVzN`Pt1rr zkz*}*U|K)tTXwQO&=Cqw;_-n*w&@-Sxxn{ce&dcGUBWjP+BWz6|9fU3mf!(#9& zPL@+Y6HFK`jC=k7SNh5j^KU@}@^<>f%kz}MoaPnyckZ}Mv6GQgp+?Kk7t4Mh^dnVS z#dqFq5#Xf1eeA64-HXAEzBd_it=pn!vSy^ZyQ2JG)0J)rrx|3p z4^FS^9A+4%8JwU_Q#f5?{)aE9`D({kxqfV$PQ8Mdy1nr9IFT6kcNO0wpNk^VmM+p$ zDsRUZ5dJ_TiW?`p{w(K^BR~bM+56`!_@r!gtrX{$#lyoJr9fIJ_LuBu`nkngmsgo6XA}39{+ru1e*wxE|DYk z?EZGFu`#JYljP*&j)7=TZezyKA&+c2)>`Wb?x9etkojfa2Jz)|~!& zo{WR})hJ7ee1^?S*KegbHzuqo{p03^?5xV6y-QN8h3EPY546EY5jZF3hldmDzEs~T z+}w5#&SOKO`Z?8=74wdnamuH0JqD`!T>adF}Dea}Kt)U!lS=Fy;4G z|9FSEs>H8JRsM;0>lQld|9=+%3ifdEdCSnEY7>pIm{mQ2{_BUkoU7E9shDwRJ7}vO z4J(fMYWmX3h6`0%ZLC_McGyNj=E!X`N4h5r{Jy|NR*8~0z53X3hVi4C46EVa`$_hM zk=$3ib*i>*d#?EW@}Rjd`Vgezf{zCBUQ_rD@q#U}A(PYNT2x37p(O&4-B@lbQa@GHpFa zkyH4*KBlE%I`H;sPpA|lDtkWs6U_ouAcRg>>NjS4_vCl^dXCcG`8>&J(UC}6bRS0~ zY7A|Wb|1)hDnt+yH97oaCVh?{F8M1ffcgk*zM`#sn;_*#?K)nI!gyRdgv;wL)rOB# zvLH;4&p7pb&A~t0-pzcTec*c@J*7d*MDuk81Y)<*VIwphwdMSt z9`u=%@n))^-IA%U4n?Lr$1@Z}Vg6F#KViJ5k;wwja1T#$43eG8*wxLaGyjV%D@$=4%q{UPaH|8_-Jf!x-V2cy2Bt%j^~?VzMiA7Fvmh% zw4-(DmDHm$;5Y7#uvNqdbOG}?{TB_3?b4fu;5tn0=>9!Ao$t1i1ye_KYMBZ>l+Y*{ z-t$|uUTnJW{>>lcOYCrQ)AuW%9`ibJnASG+L~G|8?2Y*j1UozkEawfEMkD5VmIQ;J zIW|d^Rbmt^e)4Y)qn?=VF?pvzWs=Jn6GKgzLWx4L3l61z7a)Qa@}#MFk(lW$Rx%9b zhz-Ar0Jrf?shOrrmNVu_73VDNx0%eYWG;_cD9#{fS1Bv$ zA&9m8#EBlqmd5k;*@(cuZ#|<7<4IBW;QtIsU8ObYIGBFLx3Zb<|(R3^R%4 zjU%`E+%ji3Y98FGO6XI#r%!ikx34UHvm?5GF$S<|%^%8U1tgY!JR!W?_NK*wb=wL} zH9VP_-e2rfx6ChFcKLhTHTSVybAH6wmo6Doa5xiu`mkZC_tYWrGcy)8>uZSHCz=XO zXm?`KBA4&s+v=i_i)=*~7fM1p!0rV@K;KB4v}rEti}W-pBNjzCWF-S$!DPNP>ovRa zwj9cz&1lfRbqe)0Qx*ikZ94Ii+Yl)5%3OGJjCGqTb-Wi2_R^Fkq%DhUzEI=jEb+~c zTm0qf!Y}(ui7@nM65exStdJP|kIe?}FLTOE(ri7#j;h;AD%(r@+A$s_Y3f-S(23Yj3f1_2twx@$6mX|M!AGLzgW%|X<5}&fA(pm(5!M9S z6HBokUN_Mh8R1rVcQQSEx4WfI7CVxf@yr6TB6`N@^XzR4J9!ov6VN^*z#yC32I+&x zme1*XW_XTfjGgyKB>}KZlu?RA?QwwDPjz|y2qPy|L)|hD%*N^i@k~;U+24O?pOXK` zv$~|FbCEUmx2i9xBH<>EQV#`PrRbu?*^PLB-jEAU#pPZj+NS|xgiR0*~A8kuSxwJlLN zAuKP2$vC4sXzJT>>*Aua%n5Q{jpkN$b?{hy$7W=Z4S2Z1`MWHVKCvG&N2%UJ_XS{X z-<{;}lj;qBcePOc8nSQE0WW4eVq|EO#9*0K%E+~un=DogCRvQl;pv}rX8wcy%pj1l~kAeeKXC!&Z~bJ-%Hz z-PX@AN>F7N{7RTW39Hpp!Yqxg%@pmK=Qh$)t+N9 zXQ%y)WpY>wRZqNBn87aq7Op91-!13?{J|{0AcP7sjxFCS0DmTd1p~ziuE-Vla9H_2 z$cj}&7tUGXRt<)RRp9A}ve=RIyN~`n4_l-_rDEDivc2_8H!7K5efo56AUp&*NXa6I zYyzuLhAqFL@RG~*jNA|rNf{n?Bl_Ry8pVg21gPl}wp6(Ou1KDeyvYK`pPw9m4B7`o z_`$uKXVAGhK}MWjiUOu_dCxTnyHC%M5yh0n@=L&f5 zGGfjRIbDT(iqs4jkU0A;T>wrzB}TE>wl$)Mc>rL0!z$93j1Jn(^wbPjB2N4|6J0-i z)Zv`3*;N^mW!GW&uk&qlJMk-^hWOCN7DLp8r$Qi4UuDW*DBAkkJ|IGnwLs_ zD^W+B-!;eAyx69Gznc}Cr>a8M&~{vZQW6S{nweh;v0lFv?6Pyk=&kz?75i3XfK@Y?O?G{i*k_a+Y~B0?-;~i}&st2`{GZhvJ!ze{4HG-O{bh^!oz?ihX}tE5W$=l{ znCgiq@=R81+2*(WhzubXV;|i)(Qn|aXe{y^4#Y%4zR$4J*GsEqBUe@|i?RCntrng* zm9guU%Ma8;kjL$UN4B9wOMwdHnrpMIVW|TK z@G)P%>{J5(^Q>*4h^AH$gTH! z5>YD5$`SfXyRE!vB8B3g-LtYtIW*H_V14KNgP@1NNQU}55+z+F4=)H}jMjo_C zlX792&_r{_*d-|`spQLscb#Ga%t9n5?!iLR!iFwsSYeXKWffvJM%m>A<(2yLxVh~E zj0{C1F@4^&$SK2YUR#F=tLX6;sA~p&(K2eN>;8Sv*Q|1WSJrqsp0`sCbog5oZRa}5 z^EfdOo73Fd@Iqdx2x4gt|Fsc*_MPGY&i3W0RNo3=|WW#w^UXPA###VkNKg`T#s69{-)&IOX0FQ9iFI- zHD+x2rj?YB=O^bLSvIT$bCwp^C0waTSNQ zwF7{vW2@L%iFc;1K3O~8_TJki!@cXJ!t+{gm%`DiyS&NdO>N60B@^7wt&7vZ?;$n#KRs>e7^BUkchtfO3&tRja}Zcf-$dX=^UWQ<{jH~ z#;c*YEc1s6H^AL5)lWX@iAxPslO6*+VT~50-_-|7G?o!8gdx+jvty?vq_pNvw#K8J@x(uJDY0l0)wTqv3C2z}syGtC9GVQ z&AKZLfIAwVAo`Cv;oRy*^baDwN1RRC6=0@+|o>*`I z?%=x=ePTRgAZz09lD;%V7D|Qch_!Tnp({=%X5vE&oHuERnf=&C#}g;lHEhLzGt$dG z-+X#sd6?;<+AMsm*)554J9TSy)$~Y8z7qM0A_JF*(^v57#C_2*3upt2D{YR<5Z{jD z|6Jcr`Lc`RK_9$ZZMu>2TjzjuXXjr@?*mWW=gKXK&W;WfzKna`_YA-Hw2Cvm#EDFu zTp*G4BEr&nZ3pKb5sxF>?(tZ=smTl3BU|Nr+#XZG_bH#fV4aU?EBl?|+b^~rO$D#2 zFpeY|PlMkD9xq808L1j}+^5dU`m#bxd+5A{E4=te_CqYloe;&N))w0GN+R&rX=&e{eK*2l`VEeuG7_R>wJoid z&eLKHP_X!1M5P@=B~O*i3C?nopPc2vWFCSvaEbBuS}m49{ANWo=AD_tee?gzjk!KL zijM|jbJ{YFncMaI_F!$_m|V}lAaxrI77}MGA2M-lqaAo`i<}OT;9w?s#r%RvVTNo# z$K&3Z7ATXU|FSH@D4RMG3=N@Em%{1k8orXQ%ybYu1i z05oQ^p#9jk1?w|kwW5GS7e?)ece?-G3*w!g^sS`ZUSAwK%|`6^c<97b^Evg^rKAuZ5iBWGhfjjf4HRi#~1NmT&FdSTw7x(0p%oot%(O zP4vuk(IN9NF7nu~)pe7Wo^xhS6E7D~VxmfY=slQvrRTmdnQ9(^kt!Vp$_RtTOF&N~ zo-QVAZg3zuh9IYqtGtK{11fLRM~P*>lbl77tj}9A4xP6)`=m@9O-8NVsj8t^aBKOe zO&GMmr9p#<310+yg0kMGIc1fETZc_NUeU==7SR-|X(AdXSbVc%;L$K#k4({Ir&UiT z&(FanD=zxYWMxT{ojxoL--#Fc5x`1T99t7HM`{%v`n8e`T7-Pht|-mD?LrtB*FY5F zxt?*M#H@s#()!{ZLNT}h)OPyD*nZ`MaSmh45hOSkgx5Qnl&b%~1o z-2`(|;s0ES&`*ONG7FAsjz61-p6ldhHs?owWlsFoV}u-wP10dE!5a>x-vrkAbQ_^? zCm{`;c+0F3M!$l}oEI*l1JR%o%GY~sM*&jvZR2R7AxXB;EJ5Nx6*41ak=HCf4LDRE zPwet09wxtukVe5nvKuBnX+c(B zhlwhg-ES2-byTWVk>GZrNsb8F!t&t--g@GiJFcM%-}N&D}G#kdf$pG1`k^ZCZJw7R>42& z5ZUE#l)lw6QFRptPROe&BKy830Ro>S_PYbUSDiSY-XesK7owKFOLtY;~acN2uqEQsSn zW`pIRs!rI(y?_0I8YAqByam--Xu{6Do%WwszcHSL=RA*YkEL?kY!Ng+sy9Aw`4aEc z32gm8mIdGNhn{Y1$nFN2EsdRDkUp+vJl=NSQ3%Enf>Vuld`ajAmP95>c*P70dZy@ybxecS@$%F7g7|dAG zU!3o!44S_TrX7rbj^QmK*Kx)L!(ONxyzthZFNFg5K-jGQXvJ}cuX^u|j%qL1xMI+G z^UXlEp+cg9;}Z4&{(P;dwg!Hk`l(-NS;pIjouHO7uN@tpHk9y$xxe%;GyNCLO<mw7^XXzDHcUb+g1Stn z1wO8+693*zENgJPfP1tjh`ebDx@z#7G@L9p39%>Nu)?5}ueD}+D0^Q8S8az5_XMtO z(@gxSYZLTW!x#t|JgJztw!h@SLl%JpNQ)lVN3H$iWcGom4 zB+6HR`*1Q9&WV$fZ=SCwK+I9>-8nhMFW&b{rDw{#>%G%ZLf=5K=K1!vlHRT5RWHew z4~=}z{!mgUx*OZ%O3>~eQnprj0t#kBOOdm>90(qMO7DztZ1VKfqdywpwx61L1(xMdO#w4!n(IAd954uD&WNpe#rq@v;+|@XlT#}#L}DmW!0`#B zO$9?hbL;Brsz@x@KcF>Xf%vivtvxC$)h_MJO!mhs{xWVC zYzXtYcL-=pix{&~8N)m9dg_^>P>IFj>BVekh1IyUB;vpuAnPOe1C5?t$#HON8hFM@ z_8EI|-+xwN36zQ3K=4%M<;(>r(l}h{{7u(<&zn7 z;8yD2JIhkNk)X8TLcQN4*S!4OwLa@}z+|cSL!w}f4o)zN7)>1|R=mz;7Zh-})AR#@ z08aIL4-ae1Wa@KGO@8sGM@O1^xy*Nb(^ncn)-cbJ=tn0`>0{Y##8zMTwd2dIo>e}3 z(mdm^rp_HZRaUF^5LpW0PaN0}gzZBe)L+pr2U5vDLqI@|GmiFbPuQJ}iJq{aDKi?* z{e{kG4|?Asy$gT4S;ZBaMTJvtrx5~9O_79;5`YI6DBfty@4wF(CKLSieTQv-QzjUUWtuGIn!}Tq?()cKo*02*h6hJ!d$p%WDyV zSV0m~4s9jEs8rAW@a}MmzVmC_prEXD!m{=a@5Fn7-^tk~ddlKYeuL+{>1tpV2SQ#r z&Zx;sw!u*CiAojXHP$sbIjA<9@Tr!gR$6CFt5T}QM$+c$_1c{0XsI&HqKCO$-_(|< z90jdJ3l&6KuY{#I-Vw zO5FC4i!&JFgaA@DcPiMr6?#oW(sk*%v1Io2-{#Hfu-B6IV#syfc?|*!h-UP~$p!;x z*B7|3*|`JJ&ieY}MRPZG2Y+P6n>48Rx~q2E<-9 zcKWXST)#=}ES14C`aN@a2=RNU2A}s^f2ip|O#cj?F%Q0K2q>eQcWSmTk$v8$_xIO1 z{we!bRq~J+-_Lcx58BtkGaJBNG5~IWI16aiMDth$uHXL~qiFCpog&k1CGem-y3vVV zy&Qh2r{o+>T$^2#Ne*MuFW(C2)W~Sn3=J3)i10*|q#+Xkl z(+3r{(o~)3(~q&eCOhydu^HRKg6oY`f0EC{1hj<%DuGezULQ(ypK!slp%L@g5%fa; zMXU5UodgaMw{Vpnh*6op{oN9HhK~&zKlLV*#d|H<9CG;_#}4*`v@@%tLxvRiqrR%F zmBTGBCxlQPQYYwj8yuzsqLTC(oM z#l|i_`knioF#qm6_mY_XLG(|@{pKRptoaj}Vf5Y=!#Y3mzV6!XsJZWA?Chb3PqA{j zu)ZL;13tPqFnVpn_3ub3kV;Ojo5$7>YTDGZcY5oU@m+#9_^Kb+<^n)HiO{GMtpS@Y`&qG zAFxp#K%>jw9nhYuDVI}EqwR=0-!nJD17)o*9~`plej`{FNE#Z&hZqn`ux687KQ9ph zpjc=VRo==S(@I~S(v90iY zE`EEyU*0iqMsdZqHs@Pw<>DQez0?lrfn+(k95gZ}Cui#xqX3`1s0&=PY)S)oe|hec zDe624&=lkW)}jyF+C9>@t`S%MX*tSF?1_`teIb;CARAyA#I!yM*3cjJFc`o zI*rr|OhWP0keupG>AU^NK7_0&?b77_yZF*;yRW$kbZXdj*TEG1`_d8GR^%ZMg*3ht4t#+;((w4W1G+O=QtmVE|IKMs= z{b-kja44mwyJZe$TR7yr4%%_*o06yTD zU3iJ%;vo3?V9RgPG3NpgiuLLmo&DRgE&jx2!vB6;Vxff#lLaJLPV?~ZU|LIZC zRt-5+E zm3-RtQV3P~r$hxvcYEq|a+D@;T)=0Zo$*^5Fft+Lj8^bJ>sGV;ZS>Uc-E1dydL>N4 z`~En{i{T&g8~F!v(p@jjEG5TJeRORPls&mr=zaOtzV(2ESn6prvg%w)J9*sD9y-iL zF6664TbC+dA_aMD7kEyKC!{Fw@u6JfwyVaa0(oIdZYyj!sxTLd(NkG)f76V?giT__ z?VA>z0ug{D$9{P!zKy%eDW%+E==7*paE*>e#cAy=0LT(%d(75q$ ziI5|lXuXcLkh~%O*t(uNE+liSOk;nRU+w7}y!U*)a;EroYN7CnqsrZ>0;G-bQ3b zm!}Hx$CYc$>N?R6SDt*R_jJ4Puf$|8(Hj6< zn7Gx#O(Uh!av)`(c=otXGsV3(jL~UkeUwpW9g@WSi~h}-oA>5pqTOPO)ji_u{LqCP zE&B1{hu|5WFvfcvq+ITQe`4DwpMOb62*=)u{p3jZY*#ko?(o6~VgZ?~#DpjkhGJ+d zy)H51qdLoeO&t#*cs=K6JeZR3Aq!esG@_7X~s z3eH?Vd`u_xU>cp%z3?+iygvMNVkwXlx#~=MI2I`u3;8Fpd84utb+nL~o46u_CgTTx znUiMEkT=(`)0YJ95 zTQHmh@CgtFxt+wv+;)d^A`VE=*B}-cSzYNL6$6$^UvGuS@&dKmUt1h#e$)ukz;$L#(Ma8=fGId`ViP4rbIu?l^`f3HN*%IIK zt-k&&9W=`CgP^ZLP0m(ESvyh+IFrJF%#IPa=060KS-3`R?AL^7_n{^Ie8HoiN+6@< zgKFBP)0=C>-#1i52Jtajou;Uyw0mQXCD)$QB}XP1CjUdK^~?R!541QMV%1i#(h@#8 zEa6&Augr|FfyIN7abQpsE#DX$ZOBAY`JOiC^XI0nvjRq*Zlqk*}5b&==FxSXBYa+n<=*`Q&>xwLhR1XGz+lvzOm zo>o0p6_veoe;@cuU?Pqym3>RMJwP^34!ph4D28Q?z4VLV;oFy@m@JGYE@&(rU3B-q zR|fy#NL4$_i7sA@8O==V<8)~u6LSC!HcOia1B!i1!n7KwX;`T@-XIzj&kSDiVF|b| zB!-f`o~$@-PlbN|w$DqGZhQJ&e?B^(@Z+sg+eCPDz}*>V_#eM!)Z9GoxA?41ttrYC zuyfhqHOFSy<}nf^{&Vv_^Rdpqq%vRgsC=>$zP87Smf5|N+FEYE6&%VXckUhOK2VUV zflubBj|iImCFFgO*py52TsXwj za0)SOA09S^S{owWolg(vJ_P&u=P&)xnKcTKGI4;Esma{+JkQsh8K5C4k%|<6nj(~C zIuEB-T3e(QlEx}&9!Y8rdl7DiUfg>Rjkxn+EQyZP(TbZ_PIka0s|C71yn)|A#`2e z59b(ja5Bd}8r)kp{_zo!8Sg!jozfXXL^W%TnAo`M@;Hu!V4$rvr>E3XoUJlVb8WSh z5-4z>$O#c!$071GPi8ufqgnd(g2qs^+9vT1ghUK$fw(r9kEbJSK3|8h`|FQG0|H)8 zcm)HkrK+f_`qokpJ#RexBH#^L9s;i(Zh`wgrxZk5S>{qot*w;og1NO`Ta%Rf7^CZp z)>63VT>_}JR%>e;@i?VqNIBZ=tD7I46a`5J@u7&elY&=h!$dC;!O%-l^cH7$vVyle>JOm z*Yoi;LDB{UQ9mo!b{L@-FzW}$6d=Mn z!`1!ppcq03UGAkdCpmQe;1Wd$wm2OG4M3V0R0Y7_{qE;hU;f?izlh4yGnF1tXAD^C5&rLX`5CWwXbDuU|C9S&8L1|<$=M^eXjb zW*(CEoY5;pLVOi|#aEz-3mk^68b)gBH=>JBGRgaFx}s$5Yp|sJbk|q&1!QD$V8xM z#%PIG@CG6(QUwD**Ja~Ytu;k}6fkwnp?&!i=!XCRWsXgjRvKbLV4|o3)7+}gbgj=%aDBSm-E|KS_jjknfec8+nlvxC z=Vb{9YfETFVZB)VDxNd|H#j2ZA06Khg<$|reM1xmpfY-6(uOG#`T-3g5 zcOAi9=fsas|EKRsBHr?PeK#JOruodL*d;`9vyY~wt||_6cYl^<0Pytmq@qKAiZOX& z;u8DgI66eYH-Shqv%c?ryjaCdbr|}t>&jGGTkZVz0J`f;{g{>bdl50;MQ{KR?A>|~ zSR&%r;3&uiu~zMe|E5|=LNgsuy^Q>dB^b!Q{BvgN-4!z z$G*;7q43}4@nar$OrVZ4mhIXI5nYJFWAScc1c0R!pL@LfIM#)WcS(!%wq^|RY$xL0><(ylq)?OZ;fBEt$A&c3!V69b~-LCV~x91NZPNf*a!*G{Yc`Iq4Qd^y;IjoIb1fq@J_ZqQQ8w>w% zMRb)IwpAj^Kw7h$vq(iWQHOJZFHIs2F{YeBFy{^cZsTOCfQg7qWt?x*JYHU;??1w8 zW@XzKYe$`#sBKb3#7v~NqId`oThX?F^*1^m>neRerQU9Y5gZB!U(mcuIIRgO!O9a7 zEv2;9si=W0Wh`YeXhfJ&Oex101LNg#d3=04pC4k(ZqqoN20y3W@|Kxbsh_P|Gz##f@kzxCr??YV2W9=i`qPn%-nZ9g5?y-GOJ1q!P{jq z5CRdRm)B_W_1p9P-Ir2JsS{D95Cfx`wfb_oKB_!_I)D0b&wx;i1un~YMX2|8Umos$ zBMZ%oG7bUzX@qZIuhYB`vwI!@=q4^|h!R5=LQrj@jVXQl_+c*J#_@3&;=C-m%cuSm zSpD|+GR^gN6Tko%%y3!SJj*;U9GJ*L(5}a>BPoigfXEurNQ@PjfHbgKC9#wp09X@2B!~7oEzn&JMHMlt3ej3TG6iFpaRIQ_ zWVE@~!W0cmTXT&{4k0juAgH#?afd^nBM^Ye2lrO&6+aB@7s5$qmf*fB&$&druM z@VjzsEnzn3qZdIA>?oyNuh)5=y!J24^7ZT2=jZ3k%UM)6sjt)Rc5}7T<3KR21_G~R z#~nfD0y|DZ+EH3g%l}JW*8hJzeznP3m%MWjI-iY^EY*l`v&SH1|x&DHD}x zlt298+cA0ARpvDKMO{>T5}A3yYW*UMwhi4p5GGSqX=Qpb;F5YEm}mK-M(Uu*wnoyF+dQVny?w>*gZ}qCzhrma;tE=%`Y#vapcxIL*c-~ z>AqDc#U7uZjbe%>T2r*sDNeV^w1FuQpa#d75m5*cLkCc&MPIIS>Ozdv5fV}eq0333 zh0XhOCHjM{^t#pHPt6#1W!qg)+)Sl4Y1LHKdQl01Oal=`N~YN54l^)E4&mkHays4B z+J@Y9xf8{vkh}hTy2}H8{biiz*(_|d!9xfF0DvZ98=Gru5c@xAjc&(Sw`z&nUkF(% zX7ZhHoi`!gO_z?$p0_G`VEf1ipznKCSxQkYfa>m!F67CCUO`OLI1EG18P|pD{ukys zRNwa^f`B0e;=mz#6nlAoDXsnK&wrYxDQxyfZ(6@z&>pJYBjV97byq0fJI8M;V%tFs zA~H?WIF2GM#=y)WMvtlVcRLfe!rBw?Xnvl7)b;^K6hR ztrRATAxLd1x-84k_aP)RV}dQjftji_Rf9-@&zF~0+f}rj&v+YZmqM3gp!{(6>E}-$ zZ{ySL<<@;pk@@NAdnxVy;inX7ygps8nw{Q27<^& zq69{zE-@0an(4AEkB^T(e>ny2Ok=CHEah?e`mcX@d48GA?l{I$Er%5239Zy}d49fh z-4Fu-l$iK*7r*}bSuCOnkQ$IF84#>`7!DgSzyuaHM+QJZ4jh$yhH8drZv{e$2+(zh zZBs80A~bU_Z&Pd1s`p=k#I#m ztgj1dh6>E6D&si1^}{?br_)^s!M!$?Wr;bqCgV7EUC$h+=@w(+5Dn1tol@%8uV1Uk z^Yb$R4*k&gy`T20DC6osi0>-0<6C++G}zT>{nOmPyGg$`X^n`OQ;fkIvePu>>_8R+ zfE7FHrXgE;0Dn7Rw)#J%b=@7A{?XS8pSll7-P&i)>hS8 zjFAYW7G`#DdUw_YU_Wq50TR9}HzIg=_>cn4lU!a}_!v{XLrQ_pIY|n)@ufgdfphHp zF6DWdTf2Sx`t9S#;VwVKfB+U4?jNv9P_U+@sfrPzV~;EZZn`i^m$;Vt_3KkkJPehY0`D+cAd}!N^LUhPp1%4t%ArYu~<{9XpJEenxbt5QrK*+ zR2t5++)@R^lmL14hzKhhYGpy$#(mjQ@6P*ml)UMt^nzrJF2PFLT3sr6O1%9%0GeT2 zS(|8v^#5}9W=)dhNSc@)0L=V|$jGd$s_q`nG`SQZDYF0ne~|Cw?Cj3;bXDaM84-S% z0Z>&wC;+#Jte#{2p(L|14nGWPs-J!bg{53+1rCXr!4yoG_}%^SbgoiCRKWz0sZ{|r z1R##cr9ueIL{(IzA_V{jQ$Tc&nPCb6?d81HSbUGWzlwuzJGw4;MF0c_LJV$;?r^FZ zgc!y}>7!gJ85dpE zC}#VY#c>1!1+$p8A6|Ni%X{QJY;?A{!x`U!FrKNUDZq zjVcF(BqHmoqJfB2DnKD(20>KvOGy#bMBwzYmYhpTQse!*Xke-Wgu!j?5L8W?17`=6 z{NfT7kB`Q{BGrkb!H)|wa)fG<>soc5_kkIRY{psyi4?$q(lqBH%n%Y6y_%@Oq_Wn! z5`{nf;m3daZ+`_uj}~D@BsNvm3WMBO6%k_!`Ld!?fk-18} zuGi~&g=Z}yAxuT=bY4U;7geY+L<1C2sRBl2E%UT{xPNHJ3GBPVgj@Oan^y;IJkByYpSRu3`8O`h z;yX&OdT-KnhL25G7n2rkP0D{tn)K@3xM5XqBmwQ|_0{lLt*WSrc!q%wWzLCl4lWU) zHFVYOUZim#0Er0M2ngJ!M!OFZ^=%Q}WYS>7ER~E9nL{K+t2I}xwbpf6i`04Adu>-% zQdJyd#@99`7F5pjNFDGk_4wdOl54`lo;T$B*xS z*zfjCv6>jLUBuJ4zCP+&7D9b_SuU4yU68|WzrQ1z z@(NQ3>-DU%5&=O_p{H-Ko8mO>*X8>B^rE_pX|A=ZEsTsTfeaC=v#>CLVG$6K5Om&g zuB=eigh+#RtzHjXwssD{RJGJBQe7tItT{7aLM8-vDC1DoOte&qQMHP1NthXsh*-qt zdGB|U7-6|Asup9cQp)M&aG37)dlMmILaePyg3l_9%!pEjm{oO}()qG9*IhLa&KZQO zA(?Qq({TpgIDBv0fqtKDq-S^f?nLmma1h@H)xt4=H6Y#@35ZsuaF_rQ2ss2*lVT!P zMJ|`j#H5B4h#{A1xR}}Xa#?c*BQ-;grdEm|u_!)>3lGo_{xX{GA-s0IBb?a4>|py#c&I zwc2+fY_wm#nA3qtzhU`q%b$okE5JGh?{A`&fBW&qjq8?lzr7v+o3YCv-<%f# zhjlHbr~Pg| z)Iw5M6I$1WLv=}sX*i$o3)gAFbtzBJYppRx1{5GM6C_EI0kPyo1m@k{^_o*kW>PA| zv{%!$2n7?9V5XkJu)zkm?n#QbJ9)n^nL%^?Y{5nzhXZ&irG%J>BQY}vL{d=n9;o>q zpaF%Dq`>p}vYT~IVVcsKo4VMCN&^D)0gy|nA+ecy#);cZxZk;S7L^a9gJcRG(AS5* z?HO>U^04%CfeVM=iJ<_1#DQtdKD8DX*&SjqfSlKU0C3*T*JVj5shV4Wo7Em|vZJ^F z03ZNKL_t&Z zzIxWC2!ff2T8qHE!4Av}MhL=znaJJ0+a3v^d4UYK5X8X>6v@lwy5H?fDeIaMFh)Qi z6=jYguo5Xp>0K-7q044zgwf#JHY%k_$oS}_3x zV^v(P^>cYffKrxR)+vQj%`Z~XoQMyHV+d?&YAdn|WR6KIAi4GNRZOOcW)?gv3ttnP zd_-#btT!1)=ZJ&Fz<~&j8Wokunjbt+h%s;okvXa=A=rmq#UTgmID)#{zqX1wZ=I@CSC zZiA1XZU66h{axT<`~AKY2_ZDo1w?5PJ38bzgQ{xHY@+KKy8#0ZiVn0OEEO>TFO+w8 zcdpcpF_v0P-xjP_I4-ugz_A-|oBh;zwQ{&hMa(R(ejl@1t5gw?bzM`8hvPBEaJihj z9>U|0+iCK5V|Z!ZkbckmfSa@8s8h7zYKFvEpSLNsc5M>?Bv|LOf< z4i67MmXa>#FQ=E2nB3pp9}fFzil4uHet7r36iM@(n6zY$VK?o6`gm6*{qw(mLnura+}=3}{ADf#>Pr z{{7*w3t`gFpRU(4F;rQ>be@lDm7Nf3NECuE?w$4oO^-zF?GO$=`>o*$(DR@$BYyP`)D$#9j+Manu9b?o;58Ul`Ip=njZ@}a4YgX&7 z2yfB$W~!QVJsyuKB_g-aSLo%#^HWPHm-88krfE7JkBC@n@eg!ZQjfmFH;gd^jaI|54ir3q&9w;CB7Aq1zYl z{i*st5H=A{f29~g^cKF9;^EkYp}j%@FIMh1(z($L2(>tG2oR9i=`1873KEzS&*iZ9 z0M|W`R4t`S6+|=DTvk(@LL`cWfhjTvky47) znxSQb`m#?&Oa(9!AyrvDIjxm@1=m`OfH?9DmJ5hb2x*>o?;ZeH|MD;YqUtpZ1nSHA zWlDma4P>`VV{iC|#N3$%uPs5C$qW?{Oqw?qAQ5{6!v?!|gP`UX5JE^Pq%d7C*GM}g zUQ0!yp&2QbJNS=CRQSGf=a(I_=p( zul-JK+#&qWV_XW%cXxMYHccs)(phQ!X;Z6oZz`7`eNV4-OpsiSO62>KmbU6&HgW(E zr)hHIjn7{`FU$4)`-dUA9B+|t7(GO1%gFtnKJtB7&Uk4(Mg+XD;^r}0G5>lFVM~~x z)~hht+wSZ?RIN72W7}|P7}x?d0@PT=8W@M|r`fJ?1ap41nGtp7^%zmm0Mz5md$^H; z5rCl+aXc>oTuGwL5F={^Qw3|TMqmo2A;$e~ZXR2PIaemK1canw*ULGjd0iHfysqp1 zI0u^ZQcW@L_Ia%UQwVWcvMQ+|QJAJ3K;7^62%uX3{CEHG>#v`_e))8~y91-EVT|9@V@xSUcf~?NqQI=o5s}@mMHO1^378=_%7z+{ zY6Vj+70#FZ_3LHL8Y2Ao`A@$_v zSB@nyMrQy_)AaOwGSe76Y!$n(rgdA+knYFC_mj6{yscUOf4$In89wfJC70dqP^nZKMW@7s4v6K;y+!py3FfF&}z@> zHV}?brNOkAr__7NwwoSsLPzxc*4T8NUdD+LS|$KEqVCC?2FOJI^Ta7#Xo$)I2}uPJ zfQdt3Rf>^Qh=^88^=A+W;%;IJ1el9ZhTWWg{q2|I-C>#%V_4S$W+|pxkcjT@KGb?T z>?Z)eKRkpm=gQA7az3A?G?je$aR1ZcxPN+lo?;TSDz(-UDIsFSh?vbVa9FFQDaI)R zV#!+a>hAWnmSw$s{P-aRzFx1TRH^1v7+0+oS(#%qUdL9^RZObJzzC2_MPe|%oXao2 zJWdl&JNg5@KOBzWYY7VH^C<>0gIw0rOI;UjQAPey>VVjxEu^$@piE75gfREH(U81t zFhWL(DLU@n?S0+c62RD0iYOxGnh`05=rkzNOcWl!eSUcN2ZMbnTC1K;wN?SCM9B?3 zz+g&A6;et_q+0rwzL^`KAu7LfvGxn?djjDWZN=uJ;BSJe8t@oZUfHuS^WEKDtwIDu z7nkWfX5@|7&1_F^aS4Mb1ppo%Incw~v}op`(A^{+)-|V;s#G@*XyzM;+B@5A7U8W9 zA`&xpZf7lJY#z6$|ByG=H6q2?L01)kznYb&NR(qBG&HG(9Y;z%9Z<2uoQ3BQc3st<|^Q)8x1FNW?y))G7cRLJ&~^6RCg{0s)|7EQlCm z0GP~_5RmkmYp57PlA2GaHD|soB9?#tr8d*o>H(b5aPgsih*Kh_=O0n+e^3!cpphpLn+dqlnxv9rv6HK}DIlTPI%~dai1%bzN6P-0gSFzNKxJUT$YT1W%(# zbtrw*-sT|%y>aoLotaf{W`S?ut)?X9n~RHWgfH$K-Kq9@v{xzuo4U4rEB>?vc6+sJ3(;Us@=bzul6t350_&%Cxslv$D%f-yf zWw~D0>yAT&5HQ9mrCGJc7-NdlG~KDayu2tt2tidqN`ck5yu3WQvK5H|pcd&v05W@b zVo1||; z%}k_j?B{O?2dt;vZhNsd2{Jp-*7;&4a_eP!{k`ovy{35xXdk$2bWCks z*I^hlo2KbzF}RH^?F}`yZ{ZEhXI+DG+tzPeCj=ZTLS_O4U%WaNR;&A#^Nk_3l}z@Z zmO}EH2;*VPz!3ltM~Ds;X$q8%3EShZtIZ zD7v!&s;(Sxw<9Dl3kCFACxm z(=^RsurABGE-Dftr!1?08#(|I5;v2q+u_g_Vr=T0^jp{82Qu&82U0kWD-jGeS)+X4uG$+9+e?)v zyuSsB#*CxdWYvI(BvQfJJ{SQowA*TvNwzkG01)(s(OBP4^(Vg}E;O7Dh^X%q-kwAE z_I=Y$v>YHc^7g8`#SgQsanyY^>0ONf(xyjoo+_Yc&h%4$+qJy`-8VZmC*|Vn|JmB# z0bTiX@Zat%maX5`%>p6#=;6;_ws)XW=mEa(t$+XFFJU`-Zdj|Z1qyCmIYKGb3`A~z z{LCBzn^}y3*cBvgJB-+rK?pic(agZ4s{%m*f``1ITCKHE076R1I5b;GDS{wG!I7DmCZfocT*<1+BCxJ`o({kM z^6UNK;j&yf5QT7E)-_8ojzQE!wNCTya>}mL?n`h4KvNa10E(pZoML1|sI^K3L`K6R zMWLFBs4!zpF{Y?s*X#9iI!Tq3q8Ty=cH2IRhy;pYma~+y=G6$(G{stgc#>)c0RT-c zs3~@92Y`;FgL_k<`HHDSq<+3ydNZ-t0O&Rfz7ZHHq27)4v^7Go5V2O+#~F~HpPx(B z5AT0IotEQqUe}s)m5OG8$dJq%PBmb}M#^R$KJR@TRD(V-4a)1Q^Lv{|sBw<5Pn55% z8Vm+J=7a`swMr?Y$%4K}ZL9(VRjp#RNbv;;Hb;lHr809KS%X5nKkVb}?d02yr9F<; z7Nv6NWn<%e^LyHkX)Vx2q%~qKG_*Yils-g@16B{gb0x_6!M9tNYirZ@gOv z`0jt~5Q71<8tqpRF->V=;x(_0?ADh*ed_W>4i7^cvsdGDdoeD&hemt;w?lUju#c^S z=`yzEzf05w0LZzhG}CuxZgv-eS}%;!`FFRX=U00z1yQcoD|1qj7~Gy4n23qM%^g9Q zQPo6p$rgA{iNU0n$_RnMOgS(FW^$5z6W00EAqM5Th7=9eOk-qXlPW|y%^?t{7*bRb zS(Z}DG+Q){wIV>+@9zSql;)gsnv%_|;Zj;}j-hAJnB|;(3TRJ>&~?Q` z;MRahkaPL^_3QbR|M1iQdWGeezkZR5U;zNZ+>*j8LKT(3lPi1h)h*J$MjMXR@6Y2z zxlD3&F5_&E1LpNZ`+lwee;k2{epuXHb3|SBh3+7o%DUEC8ZE#Xfa7?NA2p6m>q)_C ztz$BM%^(AW*9}1X*8a4yi(tUU^g7Zd8Z)5nz`U}^s8&uj5EW@gvMBALs@8a#UNr4> zHX7lZ?Z(jPjJIx3pKkAP?8*bnGEZ4-UfR z&FbGv3VZ#=TBm$;M<06|m**HI7!WZagy5~WOE`TZ^OzCCK@LO+fkH?xWvOLdmgRU% z2sQvmB6PBYXhu|KGOMLz@4U?<=R)K#yqd{8O`aN#U?M6e!#%=GRWceYD1yciLZkw! z6QwleHP5?!AYIp&m*?f~IM4GAEUXKZY=`|$6*$DpW%=;_;c_`WJwKgJr#SBdlSqk7 zhvWS1-kg-=NP6Kq8f={6*n*f zM8ChN_3b+JUvwMUzPmcx^Xb#j_xYoP!Qg?Y{=UJjS@1nb6;Urp4p%b~w$vLM3Ye0s zHOm_25S-D|hQ7c3_&&tp#$fmx=dEFdH+H}8#Y2qI?eu)JW@bH($V3FeV-uq*%Zj^9 z005%D#=Nd|5VhJh&Yj327ZKRj4O8kH1(J`!UafRSi&wu;tLyW%K^V}WhH#nu+=?)!Mv7vZHG&Ko< zMQV&mRoZ0O-UBfcL~!O45r#RYNMKc@QVK*?Y7r@jb6{s@i&-@jFeD%_G^@+9aAabP zDNIu&4pLWQ3ly0MiEFLPRkY?Qo&xgmm;xPEds^43BFlB1<0L9-YM>k`21bGq2-zMU z?$1|zd6JT)>5-5LSj|8iLoGyBTS1K(ERvb3WmPjMq9CU8jzgqURuLl#iDMwetT5`;2yg0Y zzv9!BoaRe_A@I6d&g<#)VrEjyKmLFJ?Zd;*fBe(W#MAxpr(b`2TCaFM=^y{}BlEsi zSeAS#jXTTCNUXBuw7;!cf8$a^&y@XLMcY8uw^=pNn*|@T{QlXtBq5Nj+#J9Dp=_y-Z_X#RCqjt0EK4cb&17zoh0ZtW z-%+LdoZIQ0q#|xOqayCOGLS3j!a*Oww(d6uC@8O;h{xUowNI@r4F#b^lQv#?%khQ2 z3b|gd-(ySONR10}q&>A?*FVg+OAP!S$ZuPHHg#G2_TZ4i);4a`DgOf#gJFzOwe1a6 zRkaeMNHz0z6|jvRuG-XE*6VVa=N(hsAMPH%JjOI14|mLD&?+$zhCm#UH~?6{hyW@Q zBk$&v5?eD6FDd|LZf~X{gai-($u};`HOE98s7ghZD#gr*)0B44&oArg3?N$c*I%Ed z+TZ=@{kw;EqR&s?{yL}WdR_ngckkSma=+W{cC#9al<63Yl!u4=G=2Dg{_p>{;l#e` z!sh!j))7?&z*6FvVqQxrg#yNi=j+u#_J<=yDuECzguoP>oz`=5%#{U5NY6k-g>=qaotnW9O5 zi2#`dv_I8du)#J(Y+U8N^f-?h0BWZT@aDp8$8b~@*Y3DFVZiV%Ja&bN6Xl0j zTmy{TCKj;2dC+0Owi#^1*ZvHf&+nGO(P+AFx`|;;=l7CjSxl8TUZ#!gj_6xX@07c7 zBeiHRX6l%fkB@#NtxFjOaDF2tP-wR?)VKEx+a?JZn&0qlQ{=dK5YaJpS3Ws$3f0Qh~v@b*31kRh5fvabSOF;q9QDnev6=_jq-#%e9Z=+bDXfDqw8 z_Lwn50@J&@AK;om0#qFDh{Fv;awiyn{f z_Pgo4uAW4tsv(jyJP^s}8T7RtH6Voyd$<<^61&)h#Y`)JPXCW)i-7>A{z z6SI0A4*+l{(T(e~{W8PR`v4L!Ap%O3Wm!O#fND_$Ek%g<{lgD`{$Kw05Oy){j=P7) zm*w5NkAMBkW10?+UtbKS%egp#95EoWsY>+;QO01{L`ts?%;58F{{G!%P0UQ};Ck;5 zS^*j!o?|~UfG6J>^?xc|0*$J2I-Sp_bDEFMSC`04Yi)?qU{b>CzG-WLGEV7tr^~i| z77mE44`|dafOF2S(n&FTXft$uwE+;4G(H#HJQy0OokD;i`Sz;q+;jljuKeFT$=0oG z>cbe>Y+JPYT0~WS(Kco}5pjq3oU`9W+)Li0PscZpk+45&m)SQ0eP7j~bp*Fj-fk?G zSC6gjOslG|Ia!<6y4_CNpp5wQsZ~m?QMsd^Ft(~@o_U}l@Q*+JbU9sB^Pz3{}6qAC9fD(nUN4D!~=SzM6!{Mioe}oDlgi>YR9~4AE&X?1Y%klXB ze7PJBcOv>f{`sFBaaVGOo-HPAAWeaE~iqK>ouQFCo}x`@u$1Hch9G@NFp>O z+wCJEfnh0C1&A1=m3mVc$dA97%ps+iVl`Ain2=Sd6g347AqEU41z`eHP&G8fhIW&8 z+G=1%<`YvJh>(a0o$Q-pDmky~vfIrFh9;l}qJbDNtZOZ+9S%pLvfu4LzW=z3yCN3w zK#&OQaev$&ONIQ~r?145FLId}0HmsWB&vZ_my&qGJ2cqt#;$@sGW4V6Nu-Pf!ymN5_59)ncm|y|FRDtQ1_;6Z=8(FGh`~?=R6wM1 zz!(F9mZGK}I|V8lVu+E=G!Q#67XTRp1Evu9cy~UZi+SPdr(p_Xe@RG07eSP0Wk)sw(bvhxSL8Y zPtOaJ)`B&!0knWtwny5B>-Q&eLAYImF4hgh6Js$xXF-@}> zznsof+^O)x{ZApp#0SKX0uxMXK*UuS#hRv|CaMKM0T}V-@lL?Npi&2e(f_c~48Q6H z+9ha)ou)VtB_F$daLYM&#v?O_K`-w|Zg}jq1V82=lEHs+u-!x(*%ZE=|I+ks&q^~R=dThzvU>POZs+dYQbbIIm;zPr0q)fk%*n7=qDv_l8D z{e|?}B<7qH07UX)=WmqHZri{#2h06d(M6!nJOd}&s%ovnHyyeUy#voAqNbM86jR*7 z?Y9+a?@xW~A8ihp`5puTolVh)J?xv=E_Q^QGdm&xasM4g*nDHWB0KK(YSQfelQYz+ zR%j;WMubGcH6nonbt$~>Pymf%oMO!DdUw2^rX49=&sP<5@~M=nrp-9Xh5Sq^7zhDP zY7xMc6359v+)OR!JRx%oh%hp$5eN)Z5Db>< zHO7QwA%^Q(3J3~lmRtkcj8+B9yuVjjF8O&WYZl!f??c)t#9ZL?`T5(UDx?lj5+E6Z zRwRTFP(ckA1X-4Hcf2Qfi|&GLnVBkpe-jkPi<(i$a>BWWJu^+t(%d1_BK_IOq@+H3hPnDi|rZWw-l9 zDwD4mu$EHu`tgVRUw-@7c}f&Q2njJP%X+?K4ij@!!Ts@gIbW8L_j8CLs=`uNKs+1{ zBA@4Zx2$UB^7pOtfs-1X9mylfvTvGR6|4qQbo6V$-kWr$rbKZCnc0ZOY*X--+|)S) zWOj2ak1>G}VMRhyEme?Xdzrn&@ zal!l!N`qV5w2FS~;>J@2_M0Lap`qWo5KT13cs^g&wW=E73~bFfsd3Pt>qiYhkPu0T z%r`kAqE?B}Ee5=wLI{kEz%d{q#z3Y-gfYgzvDA9GUe_fzwjC%1q)H-n1p$L~t(SAY z-_HdMAWYNYlFzwln)mzNu?n8g@^V_AzgOD5`)wx_d*Q6a$cnECACqMZzY; z5y9)VeE$6P)2B}i`zi2;AMQdb(;k*Ar?Ub~Uq4?}E23fxb?|mrkqk)@E2FIWx;xTx zc_vT__~BuXFkjA^+{YEI=aAkm80)gWSe>!oc{&UPh=Dn_qe6#y|NQ*)`L|Dh`s2@G znx;6Z!1Z!DJzw8{nAhuifA>LZ^`9!Lma`~bmwGvuINjad-JMRw;PpvvRP3&weNAT^ zOKvrI-Lv#F*9nKTnFpP_;9uA5NxP-850B0U8kNpruP*phL`rD_qnt}wi+|ZPO&e?A zPWo$y2i!|*9D`1iZzJdL)-1vin07lhzTWcpZ>VtEzY;R?un$|7g^=#=@Avzio9Fb< zX7ay|w{W|q+|Eb6h?`UyGqTs3Zq#ATy`xQL%~j@mm*lq9_bK%?>;(PY7b#l{#@j{$ z%*HV5NEYJQMYiSks9EECu?5NjzUG>A&e!(uy?){Ly1)HlTgUKL#i&gINSnGg{^*dC zCsc`4cghB^T1)rrZUX7R#EgKxKm?);RscL_v>2$Fs1?-`V*sqG6#xQ9#%RW17&rhZ zGZVKR0uxzaGtD{2m})JKW~UfxEmA~@u1o&y(^vapKkoz6tgx19W-+F{VOZB%D}iBN zGk{*sON^0-t&v?udb!i?5m2X;LJWDe{qAr)6cu`Yy5^F2`Q?|g52G8KI8_BvauNojQPc7D%gV8N=n(Nuk@v=x!H2%_ zuY)c>{3Ltg1Bp~O_9J35ExD}gaz3Bk$Q%JeVBHWb{g-&z1Q@a+*nlryq{{{kg1WaW~yFrcyxFwMoP*mrE@f5dv3C#OL{P^L60e=1Z z^>SHam=WT-SS|}#0>y97&xbqalm+qe+vm&W@(+K1|Ka_^KjJ4OCC?p3FsKMFy(A`7 zDRWF~DJdLE#uS+_fGJZAGY4vEQ66`N1}5&*-{}LjRs{nlgYFI3IHCq3n#;GxFLO-C zKmLgjOU^aqyk=Reh?V7X_;`OlpME~xPxFMT*Ck)C*N~8S7LoJmwA+1X!AifQzi3^( z+q`wiNn3_25I|3mZLu_fNY=x!JM&Y_%Jz!v+8uMhf$DfwlvRkR%JXJ)5J|K3nI=E3+-_n8O<)!<;q!d$1 z%d+%BQe#Ox-@H4RnNvgbq2n;PtjC9=nb{Uz-n)I3V8fWrGU_o9p5A&uRNYG|*16 zZ{Iies>I#0ro9!qNkwv8Ped$P3V~A!UT>-t0GHOgJ7D{4iH*@WAg*m>Lf~L#7T9~< z0%icgpo)SjA`q*(dIqZ-loT^$gcQRxMF%1o5mPKBtCE?OB8%21kTfSVz!3NIdxIjT zfstpvT@qm!b(1c>5 zWhrL)%U7EYkOiNf&X?=?>*HgffQ~4CMATeW@({2g}C&&^N)spim zVDGS+GnuD;>rDjh`~KC`1-D2PL#S(cd3k1}<9>I!oPYlL#~6Y~MqaPiDWt=6`1JM5 z-MbIV^-_wc*2sH641xFi9bg0s5AWZ9eZ2ho>u)Jdxnk#ry{cS@z#%ADGv0%dX87Gc z`!?&`+~0?0*j(evwBh=<-1gz%j<*NY3MJQNxt3C2tLo6@(=kR-X^5K zKT@h*of%cT`P=m-(VwUDEn&koX;p^V8u2xZA&!}c>S`cFa0`MPzq6P8{xZ8VhPqV? z45oe~YHhe?n-%A)8h!f((ArESj4@8r)HOpD;6{%a_FL4WJ+=(5Rwi96Y3d4YXtcM% zSb(m_*jz}4qcryBT5l`nSJ%(x3K(jt?jMA=x5o=c^xs9;bUfA)kP$jp2+>r95K{^O z=(;H+B;t;C3LzpJ6NW%-H!kMkQcPq3F`}9`$VJtQqn}z*H3}4hx2~Y-qAYXzNX{7n zYONf(!yt8Cg`&kkzy9)gzFzSxoJCIMh}DT7TQkyO2^5O(6gnG4AGhny3^Mix2PSPoGcM z^C_kS3=e19UiUUG9cGRps1dvD!^}XtXV$HyhhA$tgQ@cd@HT^N7LFaH@XkUSurHzj znAg0l3nHaBIhi}9N!6M-${mvftCm~b!;q@rkl*!0uThlnRdxHWX5DD9UM$8Qty@1g z_UqWPc^z>8&cVA{D>Ju1GtbT$#17YNgPPtzF<%WU>4;WsuzFumba_fA71(Htwi||5 z)8(6&<6p*1F~pQoX%R$gjL~k5qz+C?@!|Fxwp0g@x)bfc;^3zxQYhMs%p z5h^#}tc`tdAt}23ee54vv7*s~Su+u6zPRW&4r|>X_-(|!&j3k5w!Yk$nHZ5`Emc*R zJ?Ih;oM$E!V+f2WO)sGU9-7#0d3wCt%|e%xuInOo0WCy-9PUfKTrZk4Go@UDn7zDQo}Ny*fC>|EO40j49OnxO4An~` zxD+&FjH;$$wF)T25X~5kYpMJBpe8DKI%T7jCcohZB$%f;1YTDWsoZ;Q>YNoqlCpwo z(Gmj#7Of&AW;lfuRFv2ZJitz?)aG6u7zIknRm8>U9`v^^i;4uJyW^1oYbo#FJ){s$ zm!-rKLnI^v6|JWF`0eZe@qhkbr_*^^&P%=?cKd1Cp^*k+jCrl=l7IgBA3lA02H@A# z>Q=Dwx)|avOksxrgcJ-=6sySjvI2_Zp^hL4Q9*_c65KOK+i1C&yc%(ISY_2J)_`YI zm0Yq^nWi+)yOK+-qAEG(DiSvA#Ex`~Y_3ItPdOF zhIxsIZv))y$;ssaYz8-DVrY_e00gyaTASliqiBKBrYhN3af*nV5;&o0Yoc}Q;93ua zv{CaIY?_n)U*y0sMkl-FoI~W%XZddofkTMysL^(3s@#n|Obv;vHDs%$&Q>H=yo@7V^3{=EG078txbQN!D4Vz)GZy2pSJlrA8FUg*s%jJBP0z{Ds5CdS$ zYptqCfiRdFAxtT9h(2$7*vf7<1!jOKWfg%CcgMRA_jfD^C1U9RWdv@_8VA~7S$2jMOd*vzVOwZnYL7HyDtiVhe%CeRiIAett@+%d+lvdq0nB&X>zI=PFW} zn|bEQo55zuOGEP3)hC02=`2&~X9GQQ(#=BMVBYPk+@pP27N3RPQli$n5!v2&3Ek-C z=2pBe>#{Dss&l1LjIo!MhVS}^%*@V&bd;TlLclG@%~#6W0_~`;I~}kCCyw;P>}&=` z1Sk28=(AyZGlpfa5$E&idcArwrbvx3#_0Bw5CSuys5;`#OlH9+N>x3d&nh-gJJCU# zrVz>0mV8~8YzEAMkPQKh34?)YQ-Ey-_Ey1ZYY#o3cfb4<{PQ)Z;SN=mUz{GT>gLEU zd_ctJmZZ&QD@1=!Dp+OqzF3(i-9CIV44 zgcx=Jp%xXt%PB|B;60rG;dh{L!rZyE2Ix&Zu z?GT!oryVh2Ac`0a(WZ$I&(Ehn{QQ&eCXm<(jB!esR{;3s*I)n3|Mp*IN?$&GVT#8) zE>+fCYmG?s+i#zK_~Gwb8{eh-2$tcu1%DKw=@T4>Ic5L@@z76M(OP}%NgU= zCRV?aMkhE9zeqj3ygWTUIcnxpo`(;;#>#M;l|3NsTym|I`!za%b7y!VlBof<_f{e%lPylMJ z_2udE^0MSrLi2lfk{n}WY_`k_0J9hZA{D8%R&=r@po&nO9v&X9%cLq=l{p}4t>Qv! zGc2{dyuAF~Km5b_dU`%T8K8okms6bg%(F;&e!5()i`nkC-#!5*fbe#2*sc9&us^r| z_`4<~W=x1T+xXaMe*i8_h32{iqo?rwU@4i1Yi%Y3YDPpJVwiI#q!6Mr=3`9rG{=;r z)>32xg5VG^4pfT}l^RG#o1$<$-knaTbzQm9l*F5(b-Z6Lk-zD`O(lAk9l^W{A2DKMS(eVw=zVeWmztl zi_=H^#qIZp!{HD@@Tt}TDPM8i-Q9ioaE}-sAHTi4yr}A7f7tE!>so8cah~q)4kGgH z=?W(I$K#rF$u-6Zh7Ij7Wu`!^AaAmGNB`I-*f(P=xJ+k*leT~_-(WUF2-Crc=sHs+ zvlJr&O09%2O^FaoEh3#4*A&4a1Wsv6fu&aGDztE0s{%%7K=S$X=lAdSX+n-3NPK4| zrid6AlD>bpELn;KW+Vn6RV^hWQgw@W)0|ho6z6%8BB%2O0Rkfj0%TP~VkSmFC-cR) zTb6t{hTzZ}IzUcf&MzY~-S3a4*H53mJUp0`5WX6ZV*Ep#Pt-H*0PjS<(f4 ziwJ#3rpii5AP6|z zKmQic6;yQtATUd&jH@*Tt>&)a;1p%cfpeDb^LaY|AOG{qFs7x?t!u4N7X}|Bl3s0H zupl5_jXXolgJfoHUb^Z~%9u-%q)lT>7&@8L@tCD7ZOOT?2y^P{?w(4Xm-*A@kLURU zh=oG2blSEIt{}x48yH&>c-5pouG7KRP0A=C;yt=;hsobPPXU`hnG z6{!5}IX8z`LB{XBg#|6ry|?ps8?CyEEO(8R@1)S(Zwmk*oZZK9Bq9+aqT}&&IE?G@ z1E^`DlyU-qAAb09It_pS`>((L`fKm~cs#O*_HNd4!o!e;LA3c{Oa$q0JY3Fjc1wu} z7y;0FH+NGY+(4)|yN}h10%7lncg>K)n{bWWv5|O<9p4{*w;Shh@rYIz!jv^7A^_L; z_SK&lX(c?9Iw^eu+V>OyRe*Mp_IckL0xjrr{8}4y)AX^ zUw#R%E^rrFB_?i$ zt3x_G+n(Q$wzd_`#)sU`I&J{J?-+1owX*ktap0QFrpWoE-L zpgW$A= zusLr!`5=3Rmtx#c`~NcQW`HY%wLWNqpb;B^X<9fb_&tM|_1$N`LJtva!`-Uh^+*K)ia7D(A>8iV4Jqf03TS|Ck#UEJa6I0( z-hcZI=BWvFa7F-gBQh2@uNMAy25!+{t)QqIsrhO^POF#In+FMMGiBxs4)2ux+3;;zeG%zbc+BYgqtXjjN4Vljj`Y$ z)8scV*cas6(6!wX>%epyzt~z2;c-}{G7~`BP!bZx-G(KKPP8Gr9w2m)dz36~OzX8- z-uc@bbIE+QW8D^fZ`PW(c-BtK+GFB28a?!`F{`SEw@nC!SIbaseWygMTQ?66vsH<` zEfefUP^BrCl%f%Cy*C6;DUIVe48!?+{`u#h=XsvyOU|o3|2UQ`)cc$>pALf*vQ8w0 z3Fl=QO1{4z&gc2{d8%B6ZN2lEnxbk{TgThJXbZT%TI=j(c(2H-RqLu_T^+@3^N!o( zEWX7P7(ms^42hWlw1=%qC?<4uyXW0d)69%F;s$^t7=a@J6A?)RQiVF(t6vD$xGw{MFoCmz71D~PW)H10w4*fhqmRpB)_%ms;w7*M-f>ju_) z&zbiqr--erOHC#B-sfc=PD3i0Giz-u1PJbSJRI)sP9oCH$8q@UU;lcU{&%hL-RQT6 z`ye{<4VC%7s9CX1+j7!Z`snWINqCzZy2YqS1YrTxoH8N-L_%FHWgwz)JfxIku4%PJ z7q&%pc7`|EJloRn9oGSFjK*OXLI!%M+BN_y0)bX^Kc=(YYHnpGA(~m&U@)#2@V=4U zYS0xqeoN92Nro-YUSfJB1?d`|TY};*MVRxTdc^{!n-Rt9O z&#)OibHL#_r_GPBX;&m1hB6EVz?WqXHvc#bayms6<6#_5huk`XH%V49HHfHCHLFY+ zQ4klFUJ43vYr!0_Fq{v^t=o0yRd;!Fg&`s_*~U=AHEaP_@5}f;^36qhcYs>IA_oLR zAgJ9I@{AyW66_Tt+{0Mbr(6)XJrK9`SRBy_fe=4^`aDg~PfxGUZp4&Q>5W{$`gxg~ z_Q%$0G{s1PEGjXHa1wDd5n*6h*HGr*oJ4zf4>!LJyIyxiez{D&RR9g|aY@wXUfZld zs$xb6!p!qrm!%^n00~k)q9b9>k_J=&)9%!W34-B8zIt>cI2tk_JCeIA;3^#ibYf@n z-sbKDfc*Z)<>jTdR)jNPQ3F#IgDnLJw`+_dxEuC6#JWacpL%z5VGf8LiApYN+Ij~- zi9MJ5csLyIPMne>F3WNlkJB>MR&&l-1{PYD<@GY5A3lEk*Kr(MTlU%H)=DmJd1e|Y z(?2nsdSA0xWEhmF&P!nMVPF!*5VzRy`c}8^3*0K~v3hT2emIQB<5AU8%8~AUK2NQ# z5qqlEyY61#w;Q*2Q0}|ejj(Zd-P%J$>5+m9)&ERHR2uR5p5$AbY=9!7cVJJfp7GfU9A?GBCh_Eiz)U->j=cUfz z=3uR&8>&JQPLj0KbgA=PwPT2$uS5L)!Gmvw!Z$=0x8y=Vw9SiYyXm$w`9^}h`ir?+ z_$@<9l8EfLui=G-W5Pn7fD?wKE@GwJJbt{JhV}2>C*w9Xeg6FA`I*Kc&(r1U=}CK4 zg^v#>BDsGUzy9&HHDyi!YjUEQBC#9gl$NF`Sx42y5;pe&%wal!$gSn~Zlo8O> zOwAocgcw_!g@7cbEHMhz-kP>3+^zQ!frZuj<#H)ykeu3Lua}FvK0mkCE{Ed}t3}D? z8}gD!@obok#7hSX6EW^ffE2IIhUctIZq;8Yps>mO&sNv zN=^tiUoO4ZaTs%!BqTy9$&iJ}-5PpFh!lo-nqGTv%q!c~90^mBgvb?a#tOcGA%Y+< zt$V)Pg~_^@-UA8=ozW3N0Mvbz$;8x#j<{ucuD}x#q3{-OVWzHRFqVTbEOTAafu#c@ z2+G|se$I&8yjzbLN(j|4f(9#Vwb2Qtxp|WG<;$0G9RB$2_s7Sxs`u*C#ZGtW$1fiq zzr6%i8qt^%b2Ls~`y!lLTbKz9v{ytV*-gaOW;v20C=5W+34s~a;BXq5e3~!nzSP#c znTMH=5#!-BrtHV#-Jiw}zx@2uJZoS|z4u(Y5TG?Q1y)2}Gj2jP>KN&Nbk#S*j;Vx= zW!08a63&18{>)U&SR}ctS|b8t5bd_iJ?EU_5r$yiy9U<+LJ;};*Khy&m%q9>39GN0 z4ebk}x8`krJ&cE@{`~wRDP3OAkI&B}ba#JuJRMWczy9{?@o*wx?*IfOd71p>_1t>@ z`IldNH&qW0!R@iNS2bO&U08%TsEWp%z`%P4H^Ar_V%KKOiK8h)B!u3oshX0hafHK} zfoq6+bK>5cYRwEn#%PJ52PrwcQCe+-4!~+(iNR^ zO6H^ndnQA;zNDOq3A;w%Ghl~+6u=Nrh=@^pGu6nmiB6S5l#j##)0>+*0*WL=(wpnk zn?eHs$mMh|500?dQlU5M0O%_-nS;2$+EcihsjEIdKR$doIO^f<_^Ew<`gT5Re|epe z%CEn^sLC44V1z(`fWWc3b885$y#i2R|6oSMNZ7hY94`~OnWL-s6v2%I$K&zi#|Ja5 zzqXf`r=^-%a!+n-W=O`##sihXPWSZ3*Qr27SX8^4ltlBiuvSEJqA){L^@s~{1#nM8 z$yorpd2^@mc36cL24)Dx2INK?T}LCzC<=qL+7qWDIdf(pxKX#bd+R-oqohQ_t*NSY zhnx~Z*WSk=gS)l5G*Sl=$YZ)ZPSY|UkEi?l4{6ACX&;WC3?slSDtaN3kDui73a_u{ z>0(R?Zu03oG+V2wh}YIjW_oLtr>b>c{z0Fmx?C>gcj9xpAXSth)VGx=R4a zDVy6gPxCS#jz2Sp;=905>b_pW*< zV<{;mK?F%zM4I(!x&T1$OBgC3BFicyk}gcK72Edq2)nCiRQZ@ydvB^8ft1)(nGIK~ z87MiQ4&zwzSr_y^WXYL^OoxGooJ52f2o$V=+1gV%WXZf%40kj@6qJ=$mC%cz_u8D3 zIA(yPO09dVZf>z`l0@SnBY1_XXiUrmZblm{E{x1%Jv@|wAjHfa92i%N0dNR|90Dei z-qg>R??G508F+B;M55>&yP3bV^Xdf(;Z_n8Tz4lo|MvJej5LgCJeFx5A0IEAGPtPm zFTcD15JHYC+ja!lJ+^o$qEgV4@JjS0GC;MpIVWaAH`8vawVNuqjW$Ny++6##^xjb| zfoES0HmvL9DCXL=*7nHapC3M_ACIOo&;IK)6|%XSLr0{XxjVXIN(BH~U)-FTBgxC1 z)@Lemf|D?~w_1B|pFe%9wIcE+wOysB z9_dE8)YcsN;o-w&nqSYCRy*HGmZ5j;O)oE#3?eB%K7Ip`hx;)}IUG)I{`;@5h((xH zub9HyPZ`~S@k*1~?`Q4p-38H!`l?g2z=n4>@mr51T>E_3#e%^AF!Ontd+%X2vn=!F zatRRHZ8qCn>EF(zx5zr;n-O-me7Lbtz_;IZ#ng6~Y1bI;sWVr=c(*UuPR^cB8ooMV zc7~e?b z>ZZ7ES2-wDgyin7wnz8EmZB)aBCOU~#F1N%1|$r)0VBHvdoUPG34v*201ySx;uLWB zN{hwdvujt{|7iXAK`4TZ$!eqJ{WDc^%0mfig`hA(1~Kvpmj->qLSVZQ)`oVOYdjHK z?U&2cyCpd=rU>5tXS~JDp707rKn%qIp)uJ0(QSnYt+n18BGspt$H%956e0={s*C?xT z=NXB&h=w<13jy!t@Vy_g_WpgJ)tKRmRm)9873~$l%tP_AF_^ButM(RRR_%rIFyvv#;Op5R$1)80cpS!Y5Lx-O?&_w9c9X`) zyPNx!X|bMX-0Z(lO}o~mL9NyrsKpLYh_RG1jsp`AdR-P*bPK{FBNBkdOtQiAxWRdQ zf)Q>@2H5>_Kr1Zu-St_9aX1`quI<%1f;O|w?bO-rIaJlwv{s#`<@`F;+OvQ=)Y{%z zLf@9G{UNk3h-|&2(01~$sTr;H+W`PXQcBrWFVoq~!W}fA3GH#^i#wjrGg22!m&B5B^bP$ocT_|NQMIvn4Sj7(yeIv9Nk-Z9?dXhOXPgQr*g(T$4V^fZf<$$xHx&TibvHNgEA9mG-9}>F&>_0Ihz!HP#J%_4o2qTBh+9A6 zt2-4k;oCdsR!(?(3|Ga-Tlc74q_i`$wifJ4s=Z-{?lg4Wy#4%LL%OlhU{`W8b54nv zR29_BTKHJu+I*`6bhh518%@)Bn&)+F6pEr087Cq5TKDpZ%(DAb(KYIwLI=Kei^2Zp zVHn177=~O5T`p|K!;r@@C!uAjtpFRzP)a7zf?Ohp}i9x~LS3ZN8Z&s1})x)xDS69D~)ufQX zdWU8HzL?}vQpxZBu)A&q2ixrhw+nJD6Z2G`pU%^~%yUzPW*vZ9(+DW}{uS>V-WDv~ z`t~)^Z?lqHVUiWEfSiyy=hRzoZm14sq2YJ8nAf~FUuL^-pX=G}BBJx$USH4S;5iL> z;31FW_!k<+Uw-{%ntI6w;HH;lYAl50y-m!HXy|K#G5RLI4FU93y0@Q@^$T%xweAE$ zENhS87_Rvt!A?Se<1n<^!A-RzfEvfcoFvV)4u_+Ra7Jx=1EI>%)VM)fm+K1k718|LpkAn|ZS)hk8ncgZWOUWq-F}QU^8-{du zIt)WL(0RGc%f+lQxd;-0d234z78^h$rEAE|Z%N)))Benfz}K>dSN1AK#4tC zxO%8*t#w)ET3eP(!pw|JU7MLH+vXH#`_7RV-#$O~&~n!{^E|)1Hbo?l1Fu=U*Vm%W zd_`|#mA$s8s8O?o({!n=X=_~-n3C$%80??D9CiZ1&T3vC8;;0KTQF68h;c#2?$4M> zq_|`6>fi`eO34|ut1v_Go($^j^AfAZbh)%%zuw)|j~_pRqX8a{r^Q++=BC2Ux~?v) zN@xx?lQ0uDSJM?&j4)_iN7&oZ3UA+tlrnf*m_V3>-z=ScGpvlr&mk8?UZqUEyQ5?Q zqNX~xrMBkar~4C&sCMnXEa#j`P6K2wX#f$TVj#!y!5+%X%kup6>?>qwYb+q#a%WIb z4mf^~WKEap^7?*hXv|QuuMSB2j{i1QVYBqU5}dB@%LiAc**Q_3O&;IFSQn;l)m zDBudM_69rKf7-4|+|{6;2nW>7Ok z5#Ibht+kcEc6$bhR=E;@x3+Yz?tL5&~yl<&G=sMhxEFaU#V8QCWzT9&rdZsy=gI9CN;C6)h)IOKZm z?QJ{q8Vm2jX4k8BN@k-*Efd8CW-d zTexRf*jiz)fvne$0rww!MZ3ZsY}Yg2E(wrmD8q0VQW7w4tuA$Lb#d1rr^9hL9tT9~ zy{dH)9)~gxC1=szFPCYaz!C;cLD$3Fh4^M+zl|iqP1R!)8NIr{soncIiHVFE9jtd{ z>LPSFzeTq4n)NmFx z3|T5zWMWv?-dgL;Od}X|UAC?XD(ZCetlNsCnXe&FE0Y7<)U|W(@Ev(Dl`QFflcjFW zn$x}%_O)!mhL}6JWAA{7rbtL2vbrqTKemlrFR;~$1FsRY+r;Pucw<8pb>0CYqi1#L zP(`35g^7vDw7XMq_rOVrgK)xm)Ls$f{_f-90FFzom)fRM5O7Y6KYTe_r}Jxj=6Rax z=A$`&`uH%810p=X(6hhHwS#Rp0q(sE21{eVaRZBxhyh3`Y44^gL9+%Y=7=5(`MDb~ z(aZBQARSJp4N-+@nnk#_N<^o-!_(ul_UdM>y9jq}t+(#lx{l>wAiw_h`1tL781H%q z05WrHJxOwZ)9Mmn!g8e3yXTU-Pv^^YKEEfFBEn$=qPEOx*1MT2c#6+#BTwyd$5)IN zd?(pK7~u8ZiRo}S4#Rl4T*8O%a-KFDzcl5gZpjW z%mF(i#d9ZIQs#MjeSJE=z7pc;kcV8%ymti-WPNA4!?rlY)fIjhg$1A16kDgczUzO8 zc|05>zj**V_^h)+k6nHgsWoTF6u^@tkz88`7eoekb28m&E_$;^e!p$sdjBhiaJ{uc zBu%Iru{ns!+9TYI&8)ZX06FK7;!gDp=m^}ZgEJ*YVmD5}oDaP%;rYF^I?u0wjrnLW zsr8&G4P`9lco<(_=I7_vTI>CN`QeBAAr&NKF|%e*udOzWmM*8IH`RD}kZ&C`Y)eHk z^YeN7_?JIDJwDdDCP{5EA`)%G-u;P#hEQ0T!ORd(+%S-!i zBjY8(P-4*@wn-ww!pyWsjdA=ph1>tiPYz+{O_u}#Jw%U2L=klQ{QP_v$6N+8-&}64 z30iBu#+!8>+=3lpjJH9mysHQ|QtS54-@;qh8TKZ6dgZd*0A6dX;Z4xSUNYkA`-j8p z>oiT%x5saeMFu`=W%+p1!{qg&+ z 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%0ADo1p8<`Ukh~dB0yi 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

C%f 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%0AJw@Wua0Cd0fRG9o59onr>IsDB>{pG*? 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ξekHn_C+!xsCL*O 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 = [ { diff --git a/frontend-sjgl/src/components/gis/GisView.vue b/frontend-sjgl/src/components/gis/GisView.vue deleted file mode 100644 index 57f2525f..00000000 --- a/frontend-sjgl/src/components/gis/GisView.vue +++ /dev/null @@ -1,195 +0,0 @@ - - - - diff --git a/frontend-sjgl/src/components/gis/TjCascadeChart.vue b/frontend-sjgl/src/components/gis/TjCascadeChart.vue deleted file mode 100644 index 1d2d1c33..00000000 --- a/frontend-sjgl/src/components/gis/TjCascadeChart.vue +++ /dev/null @@ -1,673 +0,0 @@ - - - - - diff --git a/frontend-sjgl/src/components/gis/TjLayerModal.vue b/frontend-sjgl/src/components/gis/TjLayerModal.vue deleted file mode 100644 index 91d2e865..00000000 --- a/frontend-sjgl/src/components/gis/TjLayerModal.vue +++ /dev/null @@ -1,537 +0,0 @@ - - - - - diff --git a/frontend-sjgl/src/components/gis/gisUtils.ts b/frontend-sjgl/src/components/gis/gisUtils.ts deleted file mode 100644 index 2466a5fd..00000000 --- a/frontend-sjgl/src/components/gis/gisUtils.ts +++ /dev/null @@ -1,537 +0,0 @@ -// import { Session } from '@zebras/qgc-share/service/Session' -import domtoimage from 'dom-to-image'; -import { - offset2, - drawDotImg2, - drawDotImg1, - offset1, - drawDotImg3, - offset3, - drawDotImg5, - offset5 -} from '@/utils/GisUrlList'; -declare global { - interface Window { - __lyConfigs?: { - theme?: string; - [key: string]: any; // 根据实际配置结构补充具体字段,或使用索引签名兼容其他属性 - }; - __mapMode?: string; // 建议同时声明代码中用到的其他全局变量 - } -} - -/** - * 根据镜头高度获取地图级别 - * @param {Number} height - */ -const A = 40487.57; -const B = 0.00007096758; -const C = 91610.74; -const D = -40467.74; - -/** - * 图例数据转对象 - * @param data 图例数据 - * @returns 以nameEn为下标的图例数据 - */ -export const legendData2Obj = (data: any[]) => { - const _tempData: any = {}; - const f = (_data: any[]) => { - _data.forEach(item => { - // childrenList有值表示这是一个分组 - if (item?.childrenList && item.childrenList?.length > 0) { - f(item.childrenList); - } else { - _tempData[item.nameEn] = item; - } - }); - }; - f(data); - return _tempData; -}; - -/** - * 添加标签偏移量等属性到item中 - * @param item - 待添加属性的item - * @param index - item的索引 - * @param labelType - 标签类型 - */ -export const appendOffsetPropties = (item: any, index: any, labelType = 2) => { - let drawDotImg = null; - let offset = null; - if (labelType == 2) { - drawDotImg = drawDotImg1; - offset = offset1; - addItemProperty(item, index, drawDotImg, offset); - } else if (labelType == 3) { - drawDotImg = drawDotImg2; - offset = offset2; - addItemProperty(item, index, drawDotImg, offset); - } else if (labelType == 4) { - drawDotImg = drawDotImg3; - offset = offset3; - addItemProperty2(item, index, drawDotImg, offset); - } else if (labelType == 5) { - drawDotImg = drawDotImg5; - offset = offset5; - addItemProperty2(item, index, drawDotImg, offset); - } -}; - -const addItemProperty2 = ( - item: any, - index: any, - drawDotImg: any, - offset: any -) => { - if (!drawDotImg || !offset) return; - item.icon_image = - index % 2 !== 0 - ? drawDotImg[item.anchoPointState]?.left || '' - : drawDotImg[item.anchoPointState]?.right || ''; - item.text_anchor = index % 2 !== 0 ? 'right' : 'left'; - item.text_offset = offset[item.icon_image]?.text_offset ?? [-10, -1.8]; - item.text_offset2 = offset[item.icon_image]?.text_offset2 ?? [-10, -1.8]; - item.icon_offset = [ - offset[item.icon_image]?.icon_x ?? -200, - offset[item.icon_image]?.icon_y ?? -50 - ]; - item.icon_offset2 = offset[item.icon_image]?.icon_offset2 ?? [-200, -50]; - item.billboard_offset = [ - offset[item.icon_image]?.billboard_x ?? -80, - offset[item.icon_image]?.billboard_y ?? -15 - ]; - item.label_offset = offset[item.icon_image]?.labelOffset ?? [100, 41]; -}; - -export const addItemProperty = ( - item: any, - index: any, - drawDotImg: any, - offset: any -) => { - if (!drawDotImg || !offset) return; - item.icon_image = - index % 2 !== 0 - ? drawDotImg[item.anchoPointState]?.left || '' - : drawDotImg[item.anchoPointState]?.right || ''; - item.text_offset = [ - offset[item.icon_image]?.text_x ?? -10, - offset[item.icon_image]?.text_y ?? -1.8 - ]; - item.icon_offset = [ - offset[item.icon_image]?.icon_x ?? -200, - offset[item.icon_image]?.icon_y ?? -50 - ]; - item.billboard_offset = [ - offset[item.icon_image]?.billboard_x ?? -80, - offset[item.icon_image]?.billboard_y ?? -15 - ]; - item.label_offset = offset[item.icon_image]?.labelOffset ?? [100, 41]; -}; - -/** - * 设置popName属性 - * @param item - 待设置popName的item - */ -export const setPopName = (item: any) => { - if (item.sttp === 'ENG') { - item.popName = item.ennm || item.titleName; - } else if (item.sttp === 'ylfb') { - if (item?.ftp?.length > 20) { - item.popName = item.ftp.slice(0, 20) + '...'; - } else { - item.popName = item?.ftp; - } - } else if (item.sttp === 'WE_FISH') { - item.popName = - item.fishList?.[0]?.fishName + `(${item.fishList?.[0]?.ptypeName})`; - item.popName1 = item.total + '尾'; - } else { - item.popName = item.stnm || item.titleName; - } -}; - -/** - * 获取图例配置中选中项的key - * @param data - 图例配置数据 - * @returns 选中项的key数组 - */ -export const getCheckedLayerConfigs = (data: any[]): any[] => { - const rs: any[] = []; - const f = (arr: any[] = []) => { - let count = 0; - arr.forEach((item: any) => { - if (item?.children && item.children.length > 0) { - const childrenCount = f(item.children); - if (childrenCount) { - rs.push(item.key); - } - } else if (item.checked) { - count++; - rs.push(item.key); // 对应图例的layerCode - } - }); - return count; - }; - f(data); - return rs; -}; - -// type mapType = "" | "pointMap" | "gisLayer" - -/** - * 将图层配置数据转换为一维数组 - * @param data - 图层配置数据 - * @returns 一维数组 - */ -export const layerConfig2Flat = (data: any): any[] => { - const rs: any[] = []; - const f = (arr: any[] = []) => { - arr.forEach((item: any) => { - const { type } = item; - if (type) { - if (type == 'GISMap') { - if (item?.children && item.children.length > 0) { - f(item.children); - } else { - rs.push(item); - } - } else if (type == 'pointMap') { - if ( - item.url || - item.title === '国家水文站' || - item.title === '自建水文站' - ) { - rs.push(item); - } else if (item.children.length > 0) { - f(item.children); - } - } - } else if (item.children.length > 0) { - f(item.children); - } - }); - }; - f(data); - return rs; -}; - -/** - * 替换图层配置中的 URL - * @param layerConfigsArr - 图层配置数组 - * @param urlList - URL 配置列表 - * @returns 更新后的图层配置数组 - */ -export const replaceUrl = (layerConfigsArr: any[], urlList: any[]): any[] => { - const bDict: Record = {}; - - // 构建 URL 映射字典 - for (let i = 0; i < urlList.length; i++) { - const key = urlList[i].url; - const title = urlList[i].title; - const keyType = urlList[i].keyType; - - if (!bDict[key]) bDict[key] = []; - if (!bDict[title]) bDict[title] = []; - if (!bDict[keyType]) bDict[keyType] = []; - - bDict[key].push(urlList[i]); - bDict[title].push(urlList[i]); - if (bDict[keyType]) { - bDict[keyType].push(urlList[i]); - } - } - - // 替换图层配置中的 URL - for (let i = 0; i < layerConfigsArr.length; i++) { - const obj = layerConfigsArr[i]; - const key = obj.url; - const title = obj.title; - const keyType = obj.key; - - const bObjList = bDict[keyType] || bDict[title] || bDict[key]; - - if (bObjList && bObjList.length > 0) { - const bObj = bObjList[0]; - obj.url = bObj.url; - obj.urlThd = bObj.url; - obj.params = bObj.params; - obj.orders = bObj.orders; - } else { - obj.url = ''; - } - } - - return layerConfigsArr; -}; - -/** - * 获取基础图层配置 - * @param config - 接口获取的配置数据 - * @returns 基础图层配置 - */ -export const getMapConfig = (config: any) => { - const r = { ...config }; - const baseUrlObj = import.meta.env.VITE_APP_MAP_URL; - if (baseUrlObj) { - r.url = baseUrlObj + r.url; // 'http://localhost:8088' - r.url_3d = baseUrlObj + r.url_3d; - // r.url = baseUrlObj.url + r.url //baseUrlObj.url - // r.url_3d = baseUrlObj.url + r.url_3d - if (r.geojson_url) { - r.geojson_url = baseUrlObj + r.geojson_url; - } - } - return r; -}; - -/** - * 重置地图元素位置 - */ -export const resetMapElPos = () => { - const legend = document.querySelector('#qgc-legendtl') as HTMLElement; // 图例 - // const filter = document.querySelector('#map-filter-container') as HTMLElement // 全局表单 - const controller = document.querySelector('#map-controller') as HTMLElement; // 地图工具栏 - const baselayer = document.querySelector('#map-baselayer') as HTMLElement; // 底图模式切换 - - if (legend) { - legend.style.left = '0'; - legend.style.bottom = '0'; - } - if (controller) { - controller.style.right = '480px'; - controller.style.bottom = '114px'; - } - if (baselayer) { - baselayer.style.right = '480px'; - baselayer.style.bottom = '20px'; - } -}; - -/** - * 根据位置获取布局数据列表 - * @param data - 布局数据 - * @param position - 位置 - * @returns 布局数据列表 - */ -const getListByPosition = (data: any, position: string) => - data?.data?.filter((el: any) => el.position === position && el.code); - -/** - * 设置地图组件位置 - * @param layoutType - 布局类型 - * @param data - 布局数据 - * @param offset - 偏移量 - */ -export const setMapLegendPos = ( - layoutType: string, - data: any, - offset = 456 -) => { - const menuStateString = localStorage.getItem('menuState'); //处理澜沧江左侧菜单状态 - const menuState = - menuStateString !== null ? JSON.parse(menuStateString) : true; - const _theme = localStorage.getItem('ly-theme') || window.__lyConfigs?.theme; - const leftEle = document.querySelector('#page-layout-left') as HTMLElement; - const rightEle = document.querySelector('#page-layout-right') as HTMLElement; - const bottomEle = document.querySelector( - '#page-layout-bottom' - ) as HTMLElement; - const legend = document.querySelector('#qgc-legendtl') as HTMLElement; // 图例 - const filter = document.querySelector('#map-filter-container') as HTMLElement; // 全局表单 - const compassControl = document.querySelector( - '#map-compassControl' - ) as HTMLElement; // 全局表单 - const controller = document.querySelector('#map-controller') as HTMLElement; // 地图工具栏 - const monitor = document.querySelector('#map-monitor') as HTMLElement; // 地图工具栏 - const baselayer = document.querySelector('#map-baselayer') as HTMLElement; // 底图模式切换 - // const vd = document.querySelector('#vd_operate') as HTMLElement // 底部视频 - const left = [ - 'layout1', - 'layout2', - 'layout3', - 'layout4', - 'layout6', - 'layout7', - 'layout8', - 'layout9', - 'layout10', - 'layout11', - 'layout14', - 'layout15', - 'layout16', - 'layout17' - ]; // 左侧布局 - const right = [ - 'layout1', - 'layout2', - 'layout3', - 'layout4', - 'layout5', - 'layout6', - 'layout8', - 'layout10', - 'layout11', - 'layout15', - 'layout16', - 'layout17' - ]; // 右侧布局 - const bottom1 = [ - 'layout1', - 'layout6', - 'layout8', - 'layout9', - 'layout10', - 'layout16' - ]; // 三行底部布局 - const bottom2 = ['layout2', 'layout15']; // 四行底部布局 - const w = `${offset}px`; - const l = `${_theme === 'ly-8' ? (menuState ? 643 : 510) : offset}px`; - let b = `0px`; - const le = ['layout17', 'layout10'].includes(layoutType) ? 0 : 1; - const leftList = getListByPosition(data, 'left'); - const rightList = getListByPosition(data, 'right'); - const bottomList = getListByPosition(data, 'bottom'); - let bottom = '0'; - - if (_theme === 'ly-8') { - if (window.__mapMode === '3D') { - b = `200px`; - } else { - b = `${menuState ? 200 : 50}px`; - } - } - - if (bottomList?.length > 0) { - if (bottom1.includes(layoutType)) { - bottom = 'calc((100% - 16px) / 3 + 8px)'; - } - if (bottom2.includes(layoutType)) { - bottom = 'calc((100% - 24px) / 4 + 8px)'; - } - } else { - // 没有底部布局时,底部高度为 - bottom = '28px'; - } - - const rle = ['layout6'].includes(layoutType) || bottom != '28px' ? 0 : 1; - - const leftHide = leftEle?.classList?.contains('hide'); - const rightHide = rightEle?.classList?.contains('hide'); - const bottomHide = bottomEle?.classList?.contains('hide'); - if (legend) { - legend.style.left = - !leftHide && left.includes(layoutType) && leftList?.length > le ? l : b; - legend.style.bottom = bottomHide - ? '0' - : bottomList?.length > 0 - ? bottom - : '12px'; - } - if (filter) { - if (layoutType === 'layout10') { - filter.style.left = - !leftHide && left.includes(layoutType) && leftList?.length > 1 ? l : b; - } else { - filter.style.left = - !leftHide && - left.includes(layoutType) && - leftList?.length > 0 && - layoutType !== 'layout17' - ? l - : b; - } - } - if (compassControl) { - if (layoutType === 'layout10') { - compassControl.style.left = - !leftHide && left.includes(layoutType) && leftList?.length > 1 ? l : b; - } else { - compassControl.style.left = - !leftHide && - left.includes(layoutType) && - leftList?.length > 0 && - layoutType !== 'layout17' - ? l - : b; - } - } - if (controller) { - controller.style.right = - !rightHide && right.includes(layoutType) && rightList?.length > rle - ? w - : '0'; - controller.style.bottom = bottomHide ? '0' : bottom; - } - if (monitor) { - monitor.style.right = - !rightHide && right.includes(layoutType) && rightList?.length > rle - ? w - : '0'; - // monitor.style.bottom = bottomHide ? '0' : bottom - } - if (baselayer) { - baselayer.style.right = - !rightHide && right.includes(layoutType) && rightList?.length > rle - ? `calc(${w} + 60px)` - : '60px'; - baselayer.style.bottom = bottomHide ? '0' : bottom; - } -}; - -export const altitudeToZoom = (height: number) => { - const lv = - Math.round(D + (A - D) / (1 + Math.pow(Number(height) / C, B))) + 1; - return lv > -1 ? lv : 0; -}; -/** - * 根据地图级别获取镜头高度 - * @param {Number} zoom - */ -export const zoomToAltitude = (zoom: number) => { - return Math.round(C * Math.pow((A - D) / (zoom - D) - 1, 1 / B)); -}; - -export const mapOutPut = (imageUrl: string) => { - const canvas = document.createElement('canvas'); - const downloadElement = document.createElement('a'); - const mapElem = document.getElementById('mapContainer'); - if (mapElem == null) { - return; - } - const context = canvas.getContext('2d')!; - canvas.width = mapElem.offsetWidth; - canvas.height = mapElem.offsetHeight; - const image = new Image(); - image.src = imageUrl; - image.onload = () => { - context.drawImage(image, 0, 0); - const elem: any = document.getElementById('qgc-legendtl'); - const l = elem?.style?.left === '' ? 0 : parseInt(elem?.style?.left); - if (elem) { - domtoimage - .toPng(elem, { - quality: 1.0, - width: elem.offsetWidth + (l + 24), - height: mapElem.offsetHeight - 20 - }) - .then((legendUrl: string) => { - const image = new Image(); - image.src = legendUrl; - image.width = elem.offsetWidth; - image.onload = () => { - context.drawImage(image, 0, 0); - downloadElement.href = canvas.toDataURL('image/png'); - downloadElement.download = '地图截图'; - downloadElement.click(); - }; - }) - .catch(() => {}); - } else { - downloadElement.href = canvas.toDataURL('image/png'); - downloadElement.download = 'download'; - downloadElement.click(); - } - }; -}; diff --git a/frontend-sjgl/src/components/gis/map.cesium.ts b/frontend-sjgl/src/components/gis/map.cesium.ts deleted file mode 100644 index 51f76b20..00000000 --- a/frontend-sjgl/src/components/gis/map.cesium.ts +++ /dev/null @@ -1,2809 +0,0 @@ -import * as Cesium from 'cesium'; -import type { MDOptions } from './map.class'; -import type { MapInterface, layer } from './map.d'; -import { getIconPath } from '@/utils/index'; -import { - generatePopupHtml, - shouldPreferEng2Popup, - getNormalizedPopupSttpMap -} from '@/utils/popupHtmlGenerator'; -import { useModelStore } from '@/store/modules/model'; -import { getNearbyPointDensityDisplayRules } from '@/modules/map/domain/nearby-point-rules'; -import { - LoadOSGB, - removeQxsy, - osgbChangeClick, - osgbLocation, - type OSGBItem -} from './osgbUtils'; - -export class MapCesium implements MapInterface { - private viewer: Cesium.Viewer | null = null; - private _ready = false; - private _pendingOSGBItems: OSGBItem[] = []; - private clickEventHandler: Cesium.ScreenSpaceEventHandler | null = null; - private popupElement: HTMLElement | null = null; - private hoveredEntityId: string | null = null; - private hoverRafId: number | null = null; // requestAnimationFrame 节流 - private removePostRenderListener: (() => void) | null = null; - private removeCameraChangedListener: (() => void) | null = null; - private isBatchPopupMode = false; - private batchPopupContainer: HTMLDivElement | null = null; - private batchPopupItems: Array<{ - entity: Cesium.Entity; - element: HTMLDivElement; - popupWidth: number; - popupHeight: number; - }> = []; - private batchPostRenderRemover: (() => void) | null = null; - private containerId = ''; - private containerElement: HTMLElement | null = null; - private loadingOverlayElement: HTMLDivElement | null = null; - private loadingSpinnerAnimation: Animation | null = null; - private flightFallbackTimer: number | null = null; - private imageryBaseLayer: Cesium.ImageryLayer | null = null; - private baseLayerRegistry = new Map(); - private baseLayerAliasMap = new Map(); - private pointLayerRegistry = new Map(); - private hydropBaseConfig: any = null; - private BASEID = ''; - private currentClipGeoJson: any = null; - private clipRequestController: AbortController | null = null; - private maskPolygonEntities: Cesium.Entity[] = []; - private originalBgColor: Cesium.Color | null = null; - private skyBoxShown = true; - private skyAtmosphereShown = true; - private readonly IGNORED_BASE_LAYER_KEYS = new Set([ - 'powerBaseStation', - 's_hydropBase_wfs' - ]); - private readonly PRIMARY_BASE_LAYER_KEYS = new Set([ - 'customBaseLayer', - 's_province_boundaries', - 'BASEMAP-white', - 'BASEMAP-img' - ]); - - private readonly CHINA_CENTER = { lng: 104.5, lat: 36.5 }; - private readonly CHINA_BOOT_HEIGHT = 20000000; - private readonly CHINA_DEFAULT_HEIGHT = 9000000; - private readonly CHINA_VIEW_ORIENTATION = { - heading: Cesium.Math.toRadians(-6), - pitch: Cesium.Math.toRadians(-90), - roll: 0 - }; - private readonly CESIUM_ZOOM_FORMULA_A = 40487.57; - private readonly CESIUM_ZOOM_FORMULA_B = 0.00007096758; - private readonly CESIUM_ZOOM_FORMULA_C = 91610.74; - private readonly CESIUM_ZOOM_FORMULA_D = -40467.74; - private readonly HOVER_POPUP_MAX_HEIGHT = 9_000_000; // ~zoom 4.5,中国视角以上不触发 hover - private readonly BATCH_POPUP_MODE_ZOOM = 14.9; // zoom >= 14.9 进入批量固定模式(float 容差避免 15 刚好踩边界) - - // ==================== Step 6: 碰撞检测 ==================== - private collisionRefreshFrameId: number | null = null; - private labelVisibilityDebounceTimerId: number | null = null; - private readonly COLLISION_GRID_CELL_SIZE = 96; // 与 2D 一致 - private readonly DENSITY_ISOLATION_THRESHOLD = 56; // 孤立点 pixel 阈值 - private readonly COLLISION_LABEL_PADDING = 4; // 标签碰撞 padding - - // 图标缩放可调参数(只影响 3D Cesium,不参与 2D 计算) - // scale = base + (zoom - 4.5) * rate,钳位到 [min, max] - // zoom≈4.5 是中国全国视角,zoom≈15 是最大放大级别 - private readonly ICON_MIN_SCALE = 0.4; // 最小缩放 - private readonly ICON_MAX_SCALE = 1.2; // 最大缩放(限制放大后图标不超过 1.2x 基础值) - private readonly ICON_BASE_SCALE = 0.7; // zoom≈4.5 基准(中国视角图标 ≈ 原始尺寸) - private readonly ICON_SCALE_RATE = 0.035; // 每级 zoom 增长(放大 10 级才增加 ~0.35) - - // 标签文字可调参数 - // fontSize = clamp(base * scale, min, max),scale = 0.7 + (zoom-4.5)*0.08 - private readonly LABEL_FONT_MIN = 10; // 最小字号(px),改大 → 小缩放时文字更清晰 - private readonly LABEL_FONT_MAX = 20; // 最大字号(px) - private readonly LABEL_FONT_BASE = 16; // 基准乘数,改大 → 所有缩放级别文字都变大 - private readonly LABEL_OFFSET_SINGLE = 14; // 单行偏移系数,改大 → 文字离图标更远 - private readonly LABEL_OFFSET_MULTI = 30; // 多行偏移系数 - - // ==================== Step 1: 初始化 + 飞中国 ==================== - - async init(container: HTMLElement, _rectangle?: any): Promise { - try { - this.containerId = container.id; - this.containerElement = container; - this.showLoadingOverlay(container); - const token = 'bearer b734a443-2c8f-4f4a-8698-44828cc5f709'; - - this.viewer = new Cesium.Viewer(container, { - animation: false, - timeline: false, - baseLayerPicker: false, - fullscreenButton: false, - vrButton: false, - geocoder: false, - homeButton: false, - sceneModePicker: false, - navigationHelpButton: false, - infoBox: false, - selectionIndicator: false, - shouldAnimate: true, - requestRenderMode: false, - targetFrameRate: 30, - terrainProvider: new Cesium.EllipsoidTerrainProvider() // 默认不使用地形 - }); - this.viewer.cesiumWidget.creditContainer.style.display = 'none'; - const layers = this.viewer.imageryLayers; - layers.removeAll(); - const provider = new Cesium.UrlTemplateImageryProvider({ - url: 'https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}', - maximumLevel: 19, - credit: - 'Esri, DigitalGlobe, GeoEye, i-cubed, USDA FSA, USGS, AEX, Getmapping, Aerogrid, IGN, IGP, swisstopo, and the GIS User Community' - }); - const customTerrain = await Cesium.CesiumTerrainProvider.fromUrl( - import.meta.env.VITE_APP_MAP_URL + '/Terrain?token=' + token, // 指向包含 layer.json 的目录 - { - requestVertexNormals: true - } - ); - - // 应用地形到Viewer - this.viewer.terrainProvider = customTerrain; - - this.imageryBaseLayer = layers.addImageryProvider(provider); - this.imageryBaseLayer.show = true; - - this.viewer.scene.globe.depthTestAgainstTerrain = true; - this.viewer.scene.globe.show = true; - this.viewer.scene.fog.enabled = false; - this.viewer.scene.fxaa = false; - this.viewer.useBrowserRecommendedResolution = true; - - await this.flyToChina(); - - this.setupClickHandler(); - this.setupCameraPopupReset(); - - this._ready = true; - console.log('[Cesium] init complete, viewer ready'); - - // 初始化完成后等 5 秒再加载倾斜摄影,确保渲染管线稳定 - setTimeout(() => { - this.flushPendingOSGB(); - }, 5000); - - return this.viewer; - } catch (error) { - this.hideLoadingOverlay(); - console.error('Cesium Init Critical Error:', error); - throw error; - } - } - - private flyToChina(): Promise { - return new Promise(resolve => { - if (!this.viewer) { - this.hideLoadingOverlay(); - resolve(); - return; - } - - // Step 1: 瞬跳至高空俯视中国 - this.viewer.camera.cancelFlight(); - this.viewer.camera.setView({ - destination: Cesium.Cartesian3.fromDegrees( - this.CHINA_CENTER.lng, - this.CHINA_CENTER.lat, - this.CHINA_BOOT_HEIGHT - ), - orientation: this.CHINA_VIEW_ORIENTATION - }); - this.viewer.scene.requestRender(); - - // Step 2: 等一帧让 setView 生效后,飞入到默认视角 - requestAnimationFrame(() => { - const finish = () => { - this.clearFlightFallbackTimer(); - this.hideLoadingOverlay(); - resolve(); - }; - - this.clearFlightFallbackTimer(); - this.flightFallbackTimer = window.setTimeout(() => { - finish(); - }, 2600); - - this.viewer!.camera.flyTo({ - destination: Cesium.Cartesian3.fromDegrees( - this.CHINA_CENTER.lng, - this.CHINA_CENTER.lat, - this.CHINA_DEFAULT_HEIGHT - ), - orientation: this.CHINA_VIEW_ORIENTATION, - duration: 1.8, - complete: finish, - cancel: finish - }); - }); - }); - } - - private clearFlightFallbackTimer() { - if (this.flightFallbackTimer !== null) { - window.clearTimeout(this.flightFallbackTimer); - this.flightFallbackTimer = null; - } - } - - private showLoadingOverlay(container: HTMLElement) { - this.hideLoadingOverlay(); - - const overlay = document.createElement('div'); - overlay.setAttribute('data-map-cesium-loading', 'true'); - overlay.style.position = 'absolute'; - overlay.style.inset = '0'; - overlay.style.display = 'flex'; - overlay.style.flexDirection = 'column'; - overlay.style.alignItems = 'center'; - overlay.style.justifyContent = 'center'; - overlay.style.gap = '12px'; - overlay.style.background = - 'linear-gradient(180deg, rgba(7, 20, 36, 0.72) 0%, rgba(7, 20, 36, 0.46) 100%)'; - overlay.style.zIndex = '30'; - overlay.style.backdropFilter = 'blur(2px)'; - overlay.style.pointerEvents = 'auto'; - - const spinner = document.createElement('div'); - spinner.style.width = '36px'; - spinner.style.height = '36px'; - spinner.style.borderRadius = '50%'; - spinner.style.border = '3px solid rgba(255, 255, 255, 0.25)'; - spinner.style.borderTopColor = '#ffffff'; - this.loadingSpinnerAnimation = spinner.animate( - [{ transform: 'rotate(0deg)' }, { transform: 'rotate(360deg)' }], - { duration: 900, iterations: Infinity, easing: 'linear' } - ); - - const label = document.createElement('div'); - label.textContent = '3D场景加载中...'; - label.style.color = '#ffffff'; - label.style.fontSize = '14px'; - label.style.lineHeight = '20px'; - label.style.letterSpacing = '0.5px'; - label.style.textShadow = '0 1px 2px rgba(0, 0, 0, 0.35)'; - - overlay.appendChild(spinner); - overlay.appendChild(label); - container.appendChild(overlay); - this.loadingOverlayElement = overlay; - } - - private hideLoadingOverlay() { - if (this.loadingSpinnerAnimation) { - this.loadingSpinnerAnimation.cancel(); - this.loadingSpinnerAnimation = null; - } - if (this.loadingOverlayElement?.parentNode) { - this.loadingOverlayElement.parentNode.removeChild( - this.loadingOverlayElement - ); - } - this.loadingOverlayElement = null; - } - - // ==================== Step 7: 点击锚点打开详情弹框 ==================== - - private setupClickHandler() { - if (!this.viewer) return; - if (this.clickEventHandler) { - this.clickEventHandler.destroy(); - } - - const modelStore = useModelStore(); - const canvas = this.viewer.scene.canvas; - this.clickEventHandler = new Cesium.ScreenSpaceEventHandler(canvas); - - // 默认箭头光标,与 2D 一致(不显示拖拽小手) - canvas.style.cursor = 'default'; - - // 鼠标移动:光标样式 + hover popup(rAF 节流,批量模式下只改光标) - let pendingMoveEvent: { endPosition: Cesium.Cartesian2 } | null = null; - - this.clickEventHandler.setInputAction( - (move: { endPosition: Cesium.Cartesian2 }) => { - pendingMoveEvent = move; - - if (this.hoverRafId !== null) return; // 已有待处理的帧,跳过 - this.hoverRafId = requestAnimationFrame(() => { - this.hoverRafId = null; - const evt = pendingMoveEvent; - pendingMoveEvent = null; - if (!evt) return; - - const scene = this.viewer?.scene; - if (!scene) return; - - const cameraHeight = this.getCurrentCameraHeight(); - // 缩放门槛:中国视角以上不触发 hover - if (cameraHeight > this.HOVER_POPUP_MAX_HEIGHT) { - canvas.style.cursor = 'default'; - this.hidePopup(); - return; - } - - const picked = scene.pick(evt.endPosition); - const entity = - Cesium.defined(picked) && picked.id instanceof Cesium.Entity - ? (picked.id as Cesium.Entity) - : null; - - // 检测是否命中可交互的锚点 - if (entity && this.isEntityInteractive(entity)) { - canvas.style.cursor = 'pointer'; - - // 批量模式下单点 hover 不触发 popup - if (this.isBatchPopupMode) return; - - // 同一个实体不重复刷新 - if (this.hoveredEntityId === entity.id) { - const position = entity.position?.getValue( - this.viewer!.clock.currentTime - ); - if (position) { - this.updatePopupPosition(position); - } - return; - } - - this.showPopupForEntity(entity); - return; - } - - canvas.style.cursor = 'default'; - // 批量模式下不隐藏批量 popup - if (!this.isBatchPopupMode) { - this.hidePopup(); - } - }); - }, - Cesium.ScreenSpaceEventType.MOUSE_MOVE - ); - - // 点击:打开详情弹框 - this.clickEventHandler.setInputAction( - (click: { position: Cesium.Cartesian2 }) => { - const scene = this.viewer?.scene; - if (!scene) return; - - const picked = scene.pick(click.position); - if (!Cesium.defined(picked) || !picked.id) return; - - const entity = picked.id as Cesium.Entity; - if (!this.isEntityInteractive(entity)) return; - - const rawData: Record = (entity as any)._rawData || {}; - - if (rawData.sttpMap === 'ylfb') { - modelStore.ylfbModalVisible = true; - modelStore.params = rawData; - } else { - modelStore.modalVisible = true; - modelStore.params = rawData; - modelStore.title = rawData.titleName || rawData.stnm; - } - }, - Cesium.ScreenSpaceEventType.LEFT_CLICK - ); - } - - // ==================== Step 5: hover popup + 批量 popup ==================== - - /** 监听相机移动结束:检测缩放阈值切换批量模式 */ - private setupCameraPopupReset() { - if (!this.viewer) return; - - if (this.removePostRenderListener) { - this.removePostRenderListener(); - this.removePostRenderListener = null; - } - if (this.removeCameraChangedListener) { - this.removeCameraChangedListener(); - this.removeCameraChangedListener = null; - } - - // camera.changed:相机运动中实时刷新碰撞检测(debounce 150ms) - this.removeCameraChangedListener = - this.viewer.camera.changed.addEventListener(() => { - this.requestRefreshPointLabelVisibility(false, 150); - }); - - this.removePostRenderListener = this.viewer.camera.moveEnd.addEventListener( - () => { - const zoom = this.getZoomLevelFromCameraHeight( - this.getCurrentCameraHeight() - ); - - if (zoom >= this.BATCH_POPUP_MODE_ZOOM) { - if (!this.isBatchPopupMode) { - this.enableBatchPopupMode(); - } else { - // 已处于批量模式:重建 popup(与 2D moveend 行为对齐) - // 拖拽/平移后视口内可能出现新的可见锚点,仅 postRender 重定位无法创建新 popup - // 同时修复 zoom 进出循环后 popup 消失的问题 - this.rebuildBatchPopupsIfNeeded(); - } - } else { - if (this.isBatchPopupMode) { - this.disableBatchPopupMode(); - } - // hover popup 重定位而非隐藏,避免缩放结束后闪烁 - if (this.hoveredEntityId) { - this.repositionHoverPopup(); - } - } - - // Step 6: 碰撞检测 — 相机停止移动后重新计算图标/标签可见性 - this.requestRefreshPointLabelVisibility(); - } - ); - } - - /** 根据 hoveredEntityId 重定位 popup(相机移动后调用,不重建内容) */ - private repositionHoverPopup(): void { - if (!this.viewer || !this.popupElement || !this.hoveredEntityId) return; - const entity = this.viewer.entities.getById(this.hoveredEntityId); - if (!entity || !entity.position) { - this.hidePopup(); - return; - } - const position = entity.position.getValue(this.viewer.clock.currentTime); - if (!position) { - this.hidePopup(); - return; - } - this.updatePopupPosition(position); - } - - /** 批量模式下每帧更新 popup 位置,实现流畅跟随拖拽 */ - private setupBatchPopupPostRenderSync() { - if (!this.viewer || this.batchPostRenderRemover) return; - this.batchPostRenderRemover = this.viewer.scene.postRender.addEventListener( - () => { - if (!this.isBatchPopupMode) return; - this.updateBatchPopupPositions(); - } - ); - } - - /** 停止每帧同步 */ - private clearBatchPopupPostRenderSync() { - if (this.batchPostRenderRemover) { - this.batchPostRenderRemover(); - this.batchPostRenderRemover = null; - } - } - - /** 获取当前相机高度(米) */ - private getCurrentCameraHeight(): number { - if (!this.viewer) return Number.POSITIVE_INFINITY; - const height = this.viewer.camera.positionCartographic.height; - if (!height || !isFinite(height) || height <= 0) { - return Number.POSITIVE_INFINITY; - } - return height; - } - - /** 将相机高度映射为近似 2D zoom 级别(与 getCurrentCesiumZoom 同公式) */ - private getZoomLevelFromCameraHeight(height: number): number { - const zoom = - this.CESIUM_ZOOM_FORMULA_D + - (this.CESIUM_ZOOM_FORMULA_A - this.CESIUM_ZOOM_FORMULA_D) / - (1 + - Math.pow( - height / this.CESIUM_ZOOM_FORMULA_C, - this.CESIUM_ZOOM_FORMULA_B - )) + - 1; - return zoom > -1 ? zoom : 0; - } - - /** 判断实体是否属于 ENG 类型(用于 popup 碰撞优先保留,与 isEntityEng 对齐) */ - private isEngEntity(entity: Cesium.Entity): boolean { - const e = entity as any; - // 优先从实体 properties._sttpMap 直接检查(与 Entity 创建时设置的 _sttpMap 一致) - const sttpFromProps = String(e._sttpMap || '').toUpperCase(); - if (sttpFromProps.startsWith('ENG')) return true; - // 其次从 _rawData 检查 - const rawData = e._rawData as Record | undefined; - if (!rawData) return false; - const sttpMap = getNormalizedPopupSttpMap(rawData).toUpperCase(); - return sttpMap.startsWith('ENG'); - } - - /** 判断实体当前是否可交互(图层可见 + 图例可见 + 区域可见) */ - private isEntityInteractive(entity: Cesium.Entity): boolean { - const e = entity as any; - if (e._layerVisible === false) return false; - if (e._legendVisible === false) return false; - if (e._regionVisible === false) return false; - if (entity.show === false) return false; - return true; - } - - /** 根据实体属性生成 popup HTML,复用 generatePopupHtml */ - private getPopupHtml(rawData: Record): string { - return rawData.popupHtml || generatePopupHtml(rawData) || ''; - } - - /** 关闭单个 hover popup */ - private hidePopup(): void { - this.hoveredEntityId = null; - if (!this.popupElement) return; - this.popupElement.style.display = 'none'; - this.popupElement.innerHTML = ''; - } - - /** 判断 3D 位置是否被地形遮挡(基于射线与 terrain 求交) */ - private isPositionBehindTerrain(position: Cesium.Cartesian3): boolean { - if (!this.viewer) return true; - const scene = this.viewer.scene; - - const windowCoord = Cesium.SceneTransforms.worldToWindowCoordinates( - scene, - position - ); - if (!windowCoord) return true; // 在地球背面 - - const ray = scene.camera.getPickRay(windowCoord); - if (!ray) return false; - - const terrainPos = scene.globe.pick(ray, scene); - if (!terrainPos) return false; // 该方向无地形 - - const cameraPos = scene.camera.positionWC; - const terrainDist = Cesium.Cartesian3.distance(cameraPos, terrainPos); - const entityDist = Cesium.Cartesian3.distance(cameraPos, position); - // 地形交点明显更近 → 实体被遮挡 - return terrainDist + 10 < entityDist; - } - - /** 根据实体世界坐标把 popup 定位到屏幕坐标 */ - private updatePopupPosition(position: Cesium.Cartesian3): void { - if (!this.viewer || !this.popupElement) return; - - // 被地形遮挡时隐藏 popup - if (this.isPositionBehindTerrain(position)) { - this.hidePopup(); - return; - } - - const canvasPosition = Cesium.SceneTransforms.worldToWindowCoordinates( - this.viewer.scene, - position - ); - - if (!canvasPosition) { - this.hidePopup(); - return; - } - - this.popupElement.style.left = `${canvasPosition.x}px`; - this.popupElement.style.top = `${canvasPosition.y}px`; - this.popupElement.style.display = 'block'; - } - - /** 读取实体原始数据并渲染 hover popup */ - private showPopupForEntity(entity: Cesium.Entity): void { - if (!this.viewer || !this.popupElement || !entity.position) return; - - const rawData: Record = { - ...((entity as any)._rawData || {}) - }; - if (!rawData.sttpMap) { - rawData.sttpMap = rawData._sttpMap || rawData.popupSttpMap || ''; - } - const popupHtml = this.getPopupHtml(rawData); - const position = entity.position.getValue(this.viewer.clock.currentTime); - - if (!popupHtml || !position) { - this.hidePopup(); - return; - } - - this.popupElement.innerHTML = popupHtml; - this.hoveredEntityId = entity.id; - this.updatePopupPosition(position); - } - - // ==================== 批量 popup ==================== - - /** 启用批量 popup:所有可见锚点固定显示 popup */ - private enableBatchPopupMode() { - console.log('[Cesium] enableBatchPopupMode'); - this.isBatchPopupMode = true; - this.clearBatchPopups(); - this.hidePopup(); // 清除可能残留的 hover popup - // 先同步执行碰撞检测,确保 _iconCollisionVisible 已正确计算, - // 避免重叠锚点的 popup 在 showBatchPopups 中被短暂创建 - this.refreshPointLabelVisibility(); - // 等所有 chunk 处理完再注册 postRender,避免用不完整列表做碰撞 - this.showBatchPopups().then(() => { - if (this.isBatchPopupMode) { - this.setupBatchPopupPostRenderSync(); - } - }); - } - - /** 退出批量 popup */ - private disableBatchPopupMode() { - console.log('[Cesium] disableBatchPopupMode'); - this.isBatchPopupMode = false; - this.clearBatchPopupPostRenderSync(); - this.clearBatchPopups(); - this.hidePopup(); - } - - /** 收集视口内可交互实体并按 X 坐标排序(ENG 优先) */ - private collectBatchPopupCandidates(): Array<{ - entity: Cesium.Entity; - x: number; - y: number; - popupHtml: string; - }> { - if (!this.viewer) return []; - - const canvas = this.viewer.scene.canvas; - const viewW = canvas.clientWidth; - const viewH = canvas.clientHeight; - const padding = 60; - - const candidates: Array<{ - entity: Cesium.Entity; - x: number; - y: number; - popupHtml: string; - }> = []; - - this.pointLayerRegistry.forEach(entities => { - entities.forEach(entity => { - if (!this.isEntityInteractive(entity)) return; - // 图标被碰撞/密度隐藏的锚点不展示 popup(没有可见图标,popup 无意义且干扰碰撞) - if ((entity as any)._iconCollisionVisible === false) return; - const position = entity.position?.getValue( - this.viewer!.clock.currentTime - ); - if (!position) return; - - const cp = Cesium.SceneTransforms.worldToWindowCoordinates( - this.viewer!.scene, - position - ); - if (!cp) return; - - if ( - cp.x < -padding || - cp.y < -padding || - cp.x > viewW + padding || - cp.y > viewH + padding - ) - return; - - // 被地形遮挡的不展示 popup - if (this.isPositionBehindTerrain(position)) return; - - const rawData: Record = { - ...((entity as any)._rawData || {}) - }; - if (!rawData.sttpMap) { - rawData.sttpMap = rawData._sttpMap || rawData.popupSttpMap || ''; - } - - let popupHtml = shouldPreferEng2Popup(rawData) - ? generatePopupHtml(rawData, { forceEng2: true }) || - rawData.popupHtml || - generatePopupHtml(rawData) - : this.getPopupHtml(rawData); - - if (!popupHtml) { - const title = rawData.titleName || rawData.stnm || rawData.ennm || ''; - if (!title) return; - popupHtml = `
${title}
`; - } - - candidates.push({ entity, x: cp.x, y: cp.y, popupHtml }); - }); - }); - - // 按 X 坐标排序,X 接近时(5px 容差,3D 投影浮点误差)ENG 优先 - candidates.sort((a, b) => { - const dx = a.x - b.x; - if (Math.abs(dx) > 5) return dx; - const aEng = this.isEngEntity(a.entity) ? 0 : 1; - const bEng = this.isEngEntity(b.entity) ? 0 : 1; - if (aEng !== bEng) return aEng - bEng; - return dx; - }); - - return candidates; - } - - /** 在指定容器中分帧构建 popup DOM(避免卡顿),完成后 resolve */ - private buildBatchPopupsInContainer( - container: HTMLDivElement, - candidates: Array<{ - entity: Cesium.Entity; - x: number; - y: number; - popupHtml: string; - }> - ): Promise { - return new Promise(resolve => { - let index = 0; - const CHUNK_SIZE = 80; - const placedPopups: Array<{ - left: number; - right: number; - top: number; - bottom: number; - entity: Cesium.Entity; - element: HTMLDivElement; - }> = []; - - const processChunk = () => { - if (!this.isBatchPopupMode) return; - - const end = Math.min(index + CHUNK_SIZE, candidates.length); - for (let i = index; i < end; i++) { - const { entity, x, y, popupHtml } = candidates[i]; - - const popupEl = document.createElement('div'); - popupEl.className = - this.popupElement?.className || 'map-popup-container'; - popupEl.innerHTML = popupHtml; - popupEl.style.position = 'absolute'; - popupEl.style.display = 'block'; - popupEl.style.transform = 'translate(-50%, calc(-100% - 10px))'; - popupEl.style.pointerEvents = 'none'; - - // 先隐藏测量尺寸 - popupEl.style.visibility = 'hidden'; - popupEl.style.left = `${x}px`; - popupEl.style.top = `${y}px`; - container.appendChild(popupEl); - - const rect = popupEl.getBoundingClientRect(); - const pw = rect.width || 120; - const ph = rect.height || 40; - - const popupRect = { - left: x - pw / 2, - right: x + pw / 2, - top: y - 10 - ph, - bottom: y - 10 - }; - - const isCurrentEng = this.isEngEntity(entity); - let collidedIdx = -1; - - for (let k = 0; k < placedPopups.length; k++) { - if (this.checkPopupCollision(popupRect, placedPopups[k])) { - collidedIdx = k; - break; - } - } - - if (collidedIdx === -1) { - // 无碰撞:正常放置 - popupEl.style.visibility = 'visible'; - popupEl.style.left = `${x}px`; - popupEl.style.top = `${y}px`; - this.batchPopupItems.push({ - entity, - element: popupEl, - popupWidth: pw, - popupHeight: ph - }); - placedPopups.push({ ...popupRect, entity, element: popupEl }); - } else { - const collided = placedPopups[collidedIdx]; - const isCollidedEng = this.isEngEntity(collided.entity); - - if (isCurrentEng && !isCollidedEng) { - // ENG 碰撞普通 popup:移除普通,展示 ENG - collided.element.remove(); - this.batchPopupItems = this.batchPopupItems.filter( - item => item.element !== collided.element - ); - popupEl.style.visibility = 'visible'; - popupEl.style.left = `${x}px`; - popupEl.style.top = `${y}px`; - this.batchPopupItems.push({ - entity, - element: popupEl, - popupWidth: pw, - popupHeight: ph - }); - placedPopups[collidedIdx] = { - ...popupRect, - entity, - element: popupEl - }; - } else if (!isCurrentEng && isCollidedEng) { - // 普通碰撞 ENG:隐藏当前普通 popup,保留 ENG - container.removeChild(popupEl); - } else { - // 同类型碰撞:后来的让路 - container.removeChild(popupEl); - } - } - } - - index = end; - if (index < candidates.length && this.isBatchPopupMode) { - requestAnimationFrame(processChunk); - } else { - resolve(); - } - }; - - requestAnimationFrame(processChunk); - }); - } - - /** 创建批量 popup 容器并构建所有可见 popup */ - private showBatchPopups(): Promise { - if (!this.viewer || !this.containerElement) return Promise.resolve(); - - const batchContainer = document.createElement('div'); - batchContainer.className = 'batch-popup-container'; - batchContainer.style.cssText = ` - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - pointer-events: none; - z-index: 1000; - `; - batchContainer.id = 'batch-popup-container'; - this.batchPopupContainer = batchContainer; - this.containerElement.appendChild(batchContainer); - - const candidates = this.collectBatchPopupCandidates(); - return this.buildBatchPopupsInContainer(batchContainer, candidates); - } - - /** 每一帧都在更新,不需要持久化,但清理时一并重置 */ - private popupCollisionFrames = new WeakMap(); - - /** 每帧更新批量 popup 屏幕位置 + 碰撞检测(拖拽/缩放时流畅跟随) */ - private updateBatchPopupPositions() { - if (!this.viewer || !this.batchPopupContainer) return; - if (this.batchPopupItems.length === 0) return; - - const canvas = this.viewer.scene.canvas; - const viewW = canvas.clientWidth; - const viewH = canvas.clientHeight; - const padding = 48; - - // 第一遍:更新位置、收集可见项的屏幕矩形(用缓存宽高,不依赖 DOM 测量) - const visibleRects: { - item: (typeof this.batchPopupItems)[number]; - x: number; - y: number; - left: number; - right: number; - top: number; - bottom: number; - }[] = []; - - for (let i = 0; i < this.batchPopupItems.length; i++) { - const item = this.batchPopupItems[i]; - const { entity, element, popupWidth, popupHeight } = item; - - // 先恢复为 block,碰撞检测再做最终决定 - element.style.display = 'block'; - - if (!this.isEntityInteractive(entity)) { - element.style.display = 'none'; - continue; - } - - // 图标被碰撞隐藏的锚点不展示 popup - if ((entity as any)._iconCollisionVisible === false) { - element.style.display = 'none'; - continue; - } - - const position = entity.position?.getValue( - this.viewer!.clock.currentTime - ); - if (!position) { - element.style.display = 'none'; - continue; - } - - const cp = Cesium.SceneTransforms.worldToWindowCoordinates( - this.viewer!.scene, - position - ); - if (!cp) { - element.style.display = 'none'; - continue; - } - - if ( - cp.x < -padding || - cp.y < -padding || - cp.x > viewW + padding || - cp.y > viewH + padding - ) { - element.style.display = 'none'; - continue; - } - - const x = cp.x; - const y = cp.y; - element.style.left = `${x}px`; - element.style.top = `${y}px`; - - visibleRects.push({ - item, - x, - y, - left: x - popupWidth / 2, - right: x + popupWidth / 2, - top: y - 10 - popupHeight, - bottom: y - 10 - }); - } - - // 第二遍:碰撞检测 — 按 X 排序后右让左,X 接近时(5px 容差)ENG 优先 - visibleRects.sort((a, b) => { - const dx = a.x - b.x; - if (Math.abs(dx) > 5) return dx; - const aEng = this.isEngEntity(a.item.entity) ? 0 : 1; - const bEng = this.isEngEntity(b.item.entity) ? 0 : 1; - if (aEng !== bEng) return aEng - bEng; - return dx; - }); - - const collisionFlags = new Array(visibleRects.length).fill(false); - const instantFlags = new Array(visibleRects.length).fill(false); // ENG 碰撞立即隐藏 - for (let i = 1; i < visibleRects.length; i++) { - const a = visibleRects[i]; - for (let j = 0; j < i; j++) { - if (collisionFlags[j]) continue; - const b = visibleRects[j]; - - if (!this.checkPopupCollision(a, b)) continue; - - const aEng = this.isEngEntity(a.item.entity); - const bEng = this.isEngEntity(b.item.entity); - - if (aEng && !bEng) { - // ENG (a) 碰撞普通 (b):立即隐藏普通,ENG 继续检查是否碰撞其他已放置项 - collisionFlags[j] = true; - instantFlags[j] = true; - } else if (!aEng && bEng) { - // 普通 (a) 碰撞 ENG (b):立即隐藏普通 - collisionFlags[i] = true; - instantFlags[i] = true; - break; - } else { - // 同类型碰撞:后来的让路(经 2 帧滞后防闪烁) - collisionFlags[i] = true; - break; - } - } - } - - // 第三遍:应用显示状态,ENG 碰撞立即隐藏,同类型 2 帧滞后防闪烁 - for (let i = 0; i < visibleRects.length; i++) { - const { element } = visibleRects[i].item; - const hidden = collisionFlags[i]; - - if (hidden && instantFlags[i]) { - // ENG 碰撞:立即隐藏,不经过滞后 - element.style.display = 'none'; - this.popupCollisionFrames.delete(element); - continue; - } - - const prevFrames = this.popupCollisionFrames.get(element) || 0; - if (hidden) { - const count = prevFrames > 0 ? prevFrames + 1 : 1; - this.popupCollisionFrames.set(element, count); - if (count >= 2) { - element.style.display = 'none'; - } - } else { - const count = prevFrames < 0 ? prevFrames - 1 : -1; - this.popupCollisionFrames.set(element, count); - if (count <= -2) { - element.style.display = 'block'; - } - } - } - } - - /** 批量模式下双缓冲重建 popup(图层/图例变化、拖拽/缩放 moveEnd 时调用)。 - * 在新隐藏容器中构建 popup,构建完成后替换旧容器,避免 clear→rebuild 空白帧闪烁。 */ - private _rebuildGeneration = 0; - - private rebuildBatchPopupsIfNeeded() { - if (!this.isBatchPopupMode || !this.containerElement) return; - - console.log( - '[Cesium] rebuildBatchPopups gen=%d', - this._rebuildGeneration + 1 - ); - - // 停止旧容器的 postRender 同步(旧 popup 在新容器就绪前保持显示) - this.clearBatchPopupPostRenderSync(); - - const oldContainer = this.batchPopupContainer; - const generation = ++this._rebuildGeneration; - - // 在隐藏容器中构建新 popup(尚未插入 DOM) - const newContainer = document.createElement('div'); - newContainer.className = 'batch-popup-container'; - newContainer.style.cssText = - 'position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none;z-index:1000;'; - newContainer.id = 'batch-popup-container'; - - this.batchPopupContainer = newContainer; - this.batchPopupItems = []; - this.popupCollisionFrames = new WeakMap(); - - const candidates = this.collectBatchPopupCandidates(); - this.buildBatchPopupsInContainer(newContainer, candidates).then(() => { - // 如果期间触发了新的重建,丢弃本次结果 - if (generation !== this._rebuildGeneration) { - newContainer.remove(); - return; - } - if (!this.isBatchPopupMode) { - newContainer.remove(); - return; - } - // 双缓冲替换:移除旧容器 → 插入新容器 → 注册 postRender - if (oldContainer) oldContainer.remove(); - this.containerElement!.appendChild(newContainer); - this.setupBatchPopupPostRenderSync(); - }); - } - - /** 清除所有批量 popup */ - private clearBatchPopups() { - this.batchPopupItems = []; - this.popupCollisionFrames = new WeakMap(); - if (this.batchPopupContainer) { - this.batchPopupContainer.remove(); - this.batchPopupContainer = null; - return; - } - const existing = document.getElementById('batch-popup-container'); - if (existing) { - existing.remove(); - } - } - - /** 简单碰撞检测(AABB + padding) */ - private checkPopupCollision( - a: { left: number; right: number; top: number; bottom: number }, - b: { left: number; right: number; top: number; bottom: number } - ): boolean { - const padding = 4; - return !( - a.right + padding < b.left || - a.left - padding > b.right || - a.bottom + padding < b.top || - a.top - padding > b.bottom - ); - } - - // ==================== destroy ==================== - - destroy(): void { - // 取消飞行超时和加载动画 - this.clearFlightFallbackTimer(); - this.hideLoadingOverlay(); - this._ready = false; - this._pendingOSGBItems = []; - - // 批量 popup 和 hover popup - this.isBatchPopupMode = false; - this.clearBatchPopupPostRenderSync(); - this.clearBatchPopups(); - this.hidePopup(); - - // hover 节流 requestAnimationFrame - if (this.hoverRafId !== null) { - cancelAnimationFrame(this.hoverRafId); - this.hoverRafId = null; - } - - // 相机事件监听 - if (this.removePostRenderListener) { - this.removePostRenderListener(); - this.removePostRenderListener = null; - } - if (this.removeCameraChangedListener) { - this.removeCameraChangedListener(); - this.removeCameraChangedListener = null; - } - - // 碰撞检测 rAF / 定时器 - if (this.collisionRefreshFrameId !== null) { - cancelAnimationFrame(this.collisionRefreshFrameId); - this.collisionRefreshFrameId = null; - } - if (this.labelVisibilityDebounceTimerId !== null) { - window.clearTimeout(this.labelVisibilityDebounceTimerId); - this.labelVisibilityDebounceTimerId = null; - } - - // 中止进行中的基地裁切请求 - if (this.clipRequestController) { - this.clipRequestController.abort(); - this.clipRequestController = null; - } - - // 清理遮罩多边形 Entity(需在 viewer.destroy 前清除) - if (this.viewer && !this.viewer.isDestroyed()) { - this.maskPolygonEntities.forEach(entity => { - this.viewer!.entities.remove(entity); - }); - } - this.maskPolygonEntities = []; - - // 清理锚点图层和底图注册表 - this.destroyAllPointLayers(); - this.pointLayerRegistry.clear(); - this.baseLayerRegistry.clear(); - this.baseLayerAliasMap.clear(); - this.imageryBaseLayer = null; - - // 清理 Cesium 事件处理器 - if (this.clickEventHandler) { - this.clickEventHandler.destroy(); - this.clickEventHandler = null; - } - this.popupElement = null; - - // 销毁 Cesium Viewer - if (this.viewer) { - this._rebuildGeneration++; // 中止进行中的双缓冲重建 - this.viewer.camera.cancelFlight(); - this.viewer.destroy(); - this.viewer = null; - } - this.containerElement = null; - - // 重置所有状态变量(确保下次 init 时是干净状态) - this.popupCollisionFrames = new WeakMap(); - this.currentClipGeoJson = null; - this.originalBgColor = null; - this.skyBoxShown = true; - this.skyAtmosphereShown = true; - this.hydropBaseConfig = null; - this.BASEID = ''; - this.hoveredEntityId = null; - - console.log('[Cesium] destroyed'); - } - - private requestRender() { - this.viewer?.scene.requestRender(); - } - - /** - * 标签文本格式化:与 2D formatPointLabelText 完全对齐 - * - 去除括号 ()() - * - 每行最多 12 个字符 - * - 13~24 字符 → 拆成两行 - * - 超过 24 字符 → 第二行末尾用 "..." 截断 - */ - private formatPointLabelText(text: string): string { - const normalizedText = String(text || '') - .replace(/[()()]/g, '') - .trim(); - if (!normalizedText) { - return ''; - } - - const maxLineLength = 12; - if (normalizedText.length <= maxLineLength) { - return normalizedText; - } - - const firstLine = normalizedText.slice(0, maxLineLength); - if (normalizedText.length <= maxLineLength * 2) { - return `${firstLine}\n${normalizedText.slice(maxLineLength)}`; - } - - const secondLine = `${normalizedText.slice( - maxLineLength, - maxLineLength + 9 - )}...`; - return `${firstLine}\n${secondLine}`; - } - - // ==================== Step 2: 基础底图 ==================== - - private getRegistryKeys(layerConfig: any): string[] { - const keys = [layerConfig?.key, layerConfig?.id].filter( - (key): key is string => typeof key === 'string' && key.length > 0 - ); - return Array.from(new Set(keys)); - } - - private resolvePrimaryBaseLayerKey(layerKey: string): string | undefined { - if (!layerKey) return undefined; - if (this.baseLayerRegistry.has(layerKey)) return layerKey; - return this.baseLayerAliasMap.get(layerKey); - } - - private unregisterBaseLayer(layerConfig: any) { - if (!this.viewer) return; - const registryKeys = this.getRegistryKeys(layerConfig); - const uniquePrimaryKeys = new Set(); - - registryKeys.forEach(key => { - const primaryKey = this.resolvePrimaryBaseLayerKey(key) || key; - uniquePrimaryKeys.add(primaryKey); - this.baseLayerAliasMap.delete(key); - }); - - uniquePrimaryKeys.forEach(primaryKey => { - const existingLayer = this.baseLayerRegistry.get(primaryKey); - if (existingLayer) { - this.viewer?.imageryLayers.remove(existingLayer, true); - this.baseLayerRegistry.delete(primaryKey); - } - }); - } - - private registerBaseLayer( - layerConfig: any, - imageryLayer: Cesium.ImageryLayer - ) { - const registryKeys = this.getRegistryKeys(layerConfig); - const primaryKey = layerConfig?.key || layerConfig?.id; - if (!primaryKey) return; - - this.baseLayerRegistry.set(primaryKey, imageryLayer); - registryKeys.forEach(key => { - this.baseLayerAliasMap.set(key, primaryKey); - }); - } - - private getLayerRequestUrl(layerConfig: any): string { - if (layerConfig?.key === 'customBaseLayer') { - return layerConfig?.url_3d; - } - return layerConfig?.url || layerConfig?.url_3d || ''; - } - - private createImageryLayer(layerConfig: any, visible: boolean) { - if (layerConfig?.key === 'hydropBase') return null; - if (!this.viewer) return null; - - const url = this.getLayerRequestUrl(layerConfig); - if (!url) return null; - - let imageryLayer: Cesium.ImageryLayer | null = null; - - // WMTS:与 2D addBaseDataLayer 对齐,从 URL 参数中提取 LAYER / TILEMATRIXSET - // 必须提供 tileMatrixLabels,否则 Cesium 默认用纯数字 tileMatrix 值, - // 而服务器期望的是 "TileMatrixSet:zoom" 格式(如 EPSG:3857_hbb_zrbhq_l13:4) - if (layerConfig?.type === 'wmts') { - const urlParts = url.split('?'); - const baseUrl = urlParts[0]; - const urlParams = new URLSearchParams(urlParts[1] || ''); - const wmtsLayer = urlParams.get('LAYER') || urlParams.get('layer') || ''; - const tileMatrixSetID = - urlParams.get('TILEMATRIXSET') || urlParams.get('TileMatrixSet') || ''; - const maxLevel = 19; - const tileMatrixLabels = Array.from( - { length: maxLevel + 1 }, - (_, i) => `${tileMatrixSetID}:${i}` - ); - - imageryLayer = this.viewer.imageryLayers.addImageryProvider( - new Cesium.WebMapTileServiceImageryProvider({ - url: baseUrl, - layer: wmtsLayer, - style: 'raster', - format: 'image/png', - tileMatrixSetID: tileMatrixSetID, - tileMatrixLabels: tileMatrixLabels, - maximumLevel: maxLevel - }) - ); - } else if ( - layerConfig?.type === 'raster-dem' || - /\{x\}|\{y\}|\{z\}/.test(url) - ) { - imageryLayer = this.viewer.imageryLayers.addImageryProvider( - new Cesium.UrlTemplateImageryProvider({ url }) - ); - } else if (url.includes('MapServer')) { - imageryLayer = this.viewer.imageryLayers.add( - Cesium.ImageryLayer.fromProviderAsync( - Cesium.ArcGisMapServerImageryProvider.fromUrl(url, { - enablePickFeatures: false, - maximumLevel: 19 - }) - ) - ); - } else { - const cleanUrl = url.split('?')[0]; - const wmsLayers = layerConfig?.layers || ''; - imageryLayer = this.viewer.imageryLayers.addImageryProvider( - new Cesium.WebMapServiceImageryProvider({ - url: cleanUrl, - layers: wmsLayers, - parameters: { - service: 'WMS', - transparent: 'true', - format: 'image/png' - } - }) - ); - } - - if (!imageryLayer) return null; - - imageryLayer.show = visible; - if (typeof layerConfig?.rasteropacity === 'number') { - imageryLayer.alpha = layerConfig.rasteropacity; - } - return imageryLayer; - } - - addBaseDataLayer(layerConfig: any, isShow = true): void { - if (!this.viewer || !layerConfig?.key) return; - - // 基地裁切配置存储(与 2D 对齐:layer.type === 'vector' && layer.key === 'hydropBase') - if (layerConfig.type === 'vector' && layerConfig.key === 'hydropBase') { - this.hydropBaseConfig = layerConfig; - return; - } - - if ( - this.IGNORED_BASE_LAYER_KEYS.has(layerConfig.key) || - this.IGNORED_BASE_LAYER_KEYS.has(layerConfig.id) - ) { - return; - } - - if (layerConfig.key === 'BASEMAP-img') { - if (this.imageryBaseLayer) { - this.imageryBaseLayer.show = !!isShow; - } - this.requestRender(); - return; - } - - const imageryLayer = this.createImageryLayer(layerConfig, !!isShow); - if (!imageryLayer) return; - - this.unregisterBaseLayer(layerConfig); - this.registerBaseLayer(layerConfig, imageryLayer); - this.requestRender(); - } - - controlBaseLayerTreeShowAndHidden( - layerType: string, - key: string, - checked: boolean - ): void { - const targetKey = key || layerType; - if (targetKey === 'BASEMAP-img') { - if (this.imageryBaseLayer) { - this.imageryBaseLayer.show = checked; - } - return; - } - - const primaryKey = this.resolvePrimaryBaseLayerKey(targetKey); - if (!primaryKey) return; - - const imageryLayer = this.baseLayerRegistry.get(primaryKey); - if (!imageryLayer) return; - - imageryLayer.show = checked; - this.requestRender(); - } - - hasBaseLayer(layerKey: string): boolean { - if (layerKey === 'BASEMAP-img') return !!this.imageryBaseLayer; - return !!this.resolvePrimaryBaseLayerKey(layerKey); - } - - // ==================== 其他公共方法 ==================== - - flyTopanto(position: number[], zoom: number): void { - if (!this.viewer || !position) return; - const [lng, lat] = position; - const height = 20000000 / Math.pow(2, zoom); - this.viewer.camera.cancelFlight(); - this.viewer.camera.flyTo({ - destination: Cesium.Cartesian3.fromDegrees( - lng, - lat, - height > 100 ? height : 1000 - ), - duration: 1.5 - }); - } - - getCurrentZoom(): number | undefined { - return this.getCurrentCesiumZoom(); - } - - private getCurrentCesiumZoom() { - if (!this.viewer) return undefined; - const height = this.viewer.camera.positionCartographic.height; - if (!height || !isFinite(height) || height <= 0) return undefined; - const zoom = - this.CESIUM_ZOOM_FORMULA_D + - (this.CESIUM_ZOOM_FORMULA_A - this.CESIUM_ZOOM_FORMULA_D) / - (1 + - Math.pow( - Number(height) / this.CESIUM_ZOOM_FORMULA_C, - this.CESIUM_ZOOM_FORMULA_B - )) + - 1; - return zoom > -1 ? zoom : 0; - } - - zoomToggle(type: 'out' | 'in'): void { - if (!this.viewer) return; - const factor = 1.5; - if (type === 'in') this.viewer.camera.zoomIn(factor); - else this.viewer.camera.zoomOut(factor); - } - - mapOutPut(fileName = '3D_截图.png'): void { - if (!this.viewer) { - console.warn('Viewer is not initialized.'); - return; - } - try { - const canvas = this.viewer.canvas; - this.viewer.render(); - const dataURL = canvas.toDataURL('image/png'); - if (dataURL.length < 100) { - console.warn( - 'Canvas data is too small, likely black or empty. Check CORS settings.' - ); - } - const link = document.createElement('a'); - link.href = dataURL; - link.download = fileName; - document.body.appendChild(link); - link.click(); - document.body.removeChild(link); - } catch (error) { - console.error('Failed to export map image:', error); - } - } - - initPopupOverlay(popupContainer: HTMLDivElement): void { - this.popupElement = popupContainer; - if (this.popupElement) { - // 清除可能残留的旧样式 - this.popupElement.style.removeProperty('position'); - this.popupElement.style.removeProperty('transform'); - this.popupElement.style.removeProperty('left'); - this.popupElement.style.removeProperty('top'); - this.popupElement.style.display = 'none'; - this.popupElement.style.position = 'absolute'; - this.popupElement.style.transform = 'translate(-50%, calc(-100% - 10px))'; - this.popupElement.style.setProperty( - 'pointer-events', - 'none', - 'important' - ); - } - } - - // ==================== Step 3: 锚点展示 ==================== - - addInitDataLayer( - pointData: any, - layerType: any, - _mdoptions?: MDOptions - ): void { - if (!this.viewer) return; - - let dataArray: any[] = []; - let targetLayerKey = layerType; - - // 与 2D PointLayerManager.addDataLayer 对齐的输入归一化 - if (Array.isArray(pointData)) { - dataArray = pointData; - } else { - dataArray = pointData?.data || []; - targetLayerKey = pointData?.key || layerType; - } - - if (!targetLayerKey) { - console.warn('[Cesium] 缺少图层 Key,无法加载锚点'); - return; - } - - // 先移除旧图层数据 - this.removePointLayer(targetLayerKey); - - const entities: Cesium.Entity[] = []; - - dataArray.forEach((item: any) => { - const { lgtd, lttd, stnm, iconCode, titleName, ennm } = item; - - if (lgtd == null || lttd == null) return; - - const lon = Number(lgtd); - const lat = Number(lttd); - if (isNaN(lon) || isNaN(lat) || !isFinite(lon) || !isFinite(lat)) return; - if (Math.abs(lon) > 180 || Math.abs(lat) > 90) return; - - // 图标:复用现有图标资源路径,与 2D 一致 - const iconUrl = iconCode - ? getIconPath(iconCode) - : getIconPath('default') || ''; - - // 标签文本:格式化(换行截断)+ ylfb 用 ftp,其他用 titleName > stnm > ennm - const rawLabelText = - item.sttpMap === 'ylfb' - ? item.ftp || '' - : titleName || stnm || ennm || ''; - const labelText = this.formatPointLabelText(rawLabelText); - // 行数决定纵向偏移量,与 2D getPointLabelRenderOffsetY 对齐 - const labelLineCount = labelText.includes('\n') ? 2 : labelText ? 1 : 0; - - // Entity ID:与 2D 对齐,使用 _id 优先(_id = sttpMap_stcd),确保同 stcd 不同 sttpMap 的点不互相覆盖 - const rawId = - item._id || item.stcd || `${lon.toFixed(6)},${lat.toFixed(6)}`; - const entityId = `${targetLayerKey}:${rawId}`; - - // 图标缩放:使用 CallbackProperty 动态响应相机缩放变化 - // 调参见顶部 ICON_ 常量 - const dynamicIconScale = new Cesium.CallbackProperty(() => { - const zoom = this.getCurrentCesiumZoom() || 4.5; - return Math.max( - this.ICON_MIN_SCALE, - Math.min( - this.ICON_MAX_SCALE, - this.ICON_BASE_SCALE + (zoom - 4.5) * this.ICON_SCALE_RATE - ) - ); - }, false); - - // 字体大小:与 2D getPointFontSize 对齐 → fontSize = clamp(base * scale, min, max) - // 调参见顶部 LABEL_FONT_ 常量 - const dynamicLabelFont = new Cesium.CallbackProperty(() => { - const zoom = this.getCurrentCesiumZoom() || 4.5; - const scale = Math.max(0.5, Math.min(3.0, 0.7 + (zoom - 4.5) * 0.08)); - const fontSize = Math.round( - Math.max( - this.LABEL_FONT_MIN, - Math.min(this.LABEL_FONT_MAX, this.LABEL_FONT_BASE * scale) - ) - ); - return `${fontSize}px sans-serif`; - }, false); - - // 标签纵向偏移:与 2D getPointLabelRenderOffsetY 对齐 - // 调参见顶部 LABEL_OFFSET_ 常量 - const dynamicLabelOffset = new Cesium.CallbackProperty(() => { - const zoom = this.getCurrentCesiumZoom() || 4.5; - const scale = Math.max(0.5, Math.min(3.0, 0.7 + (zoom - 4.5) * 0.08)); - const offsetY = - labelLineCount > 1 - ? -this.LABEL_OFFSET_MULTI * scale - : -this.LABEL_OFFSET_SINGLE * scale; - return new Cesium.Cartesian2(0, offsetY); - }, false); - - const entity = new Cesium.Entity({ - id: entityId, - position: Cesium.Cartesian3.fromDegrees(lon, lat, 0), - billboard: { - image: iconUrl || undefined, - scale: dynamicIconScale as any, - verticalOrigin: Cesium.VerticalOrigin.CENTER, - horizontalOrigin: Cesium.HorizontalOrigin.CENTER, - scaleByDistance: new Cesium.NearFarScalar(1.0e3, 1.5, 2.0e7, 0.8), - heightReference: Cesium.HeightReference.CLAMP_TO_GROUND - } as any, - label: { - text: labelText || undefined, - font: dynamicLabelFont as any, - fillColor: Cesium.Color.WHITE, - outlineColor: Cesium.Color.BLACK, - outlineWidth: 2, - style: Cesium.LabelStyle.FILL_AND_OUTLINE, - verticalOrigin: Cesium.VerticalOrigin.BOTTOM, - pixelOffset: dynamicLabelOffset as any, - horizontalOrigin: Cesium.HorizontalOrigin.CENTER, - scaleByDistance: new Cesium.NearFarScalar(1.0e3, 1.2, 2.0e7, 0.8), - heightReference: Cesium.HeightReference.CLAMP_TO_GROUND - } as any, - properties: { - ...item, - _layerKey: targetLayerKey, - _iconUrl: iconUrl, - _labelText: labelText, - _legendVisible: true, - _regionVisible: true, - _sttpMap: item.sttpMap - } as any - }); - - this.viewer!.entities.add(entity); - // 存储原始业务数据引用,避免点击时遍历 Cesium Property - (entity as any)._rawData = item; - (entity as any)._labelText = labelText; - // 可见性控制标志(组合计算 entity.show) - (entity as any)._layerVisible = true; - (entity as any)._legendVisible = true; - (entity as any)._regionVisible = true; - // 碰撞检测可见性标志(初始均为可见,碰撞检测会按需更新) - (entity as any)._iconCollisionVisible = true; - (entity as any)._labelCollisionVisible = true; - // 初始应用可见性(确保 entity.show / entity.label.show 被显式设置) - this.applyEntityVisibility(entity); - entities.push(entity); - }); - - this.pointLayerRegistry.set(targetLayerKey, entities); - - // 如果当前有活跃的基地裁切,新图层也需要过滤 - if (this.currentClipGeoJson) { - this.filterPointsByRegionForLayer( - targetLayerKey, - this.extractPolygonCoords(this.currentClipGeoJson) - ); - } - - // 数据加载完成后触发首次碰撞检测(同步执行,避免异步 rAF 导致的首帧闪烁) - this.requestRefreshPointLabelVisibility(true); - } - - mdLayerTreeShowOrHidden(layerType: string, checked?: boolean): void { - const entities = this.pointLayerRegistry.get(layerType); - if (!entities) return; - - const visible = checked !== false; - entities.forEach(entity => { - (entity as any)._layerVisible = visible; - this.applyEntityVisibility(entity); - }); - - // 图层切换后立即重算碰撞(同步执行,避免闪烁) - this.requestRefreshPointLabelVisibility(true); - // 批量模式下同步重建 popup - this.rebuildBatchPopupsIfNeeded(); - } - - removePointLayer(layerKey: string): void { - if (!layerKey) return; - - const entities = this.pointLayerRegistry.get(layerKey); - if (!entities) return; - - entities.forEach(entity => { - if (this.viewer && !this.viewer.isDestroyed()) { - this.viewer.entities.remove(entity); - } - }); - this.pointLayerRegistry.delete(layerKey); - } - - hasLayer(layerKey: string): boolean { - return this.pointLayerRegistry.has(layerKey); - } - - private destroyAllPointLayers(): void { - this.pointLayerRegistry.forEach((entities, layerKey) => { - entities.forEach(entity => { - if (this.viewer && !this.viewer.isDestroyed()) { - this.viewer.entities.remove(entity); - } - }); - }); - this.pointLayerRegistry.clear(); - } - - // ==================== Stubs(后续步骤补齐) ==================== - - baseLayerSwitcher(_key: string): void {} - switchView(_type: '2D' | '3D'): void {} - fitBounds(_bounds: any): void {} - lengthCalculate(): void {} - areCalculate(): void {} - removeQueryLayer(): void {} - addTertiarybasinLayer( - _layer: layer, - _fillcolor: any, - _outlineColor: any, - _datas: any - ): void {} - hideTertiarybasinLayer(_layer: layer): void {} - async jdPanelControlShowAndHidden( - _regionId: string, - isAll: boolean - ): Promise { - if (!this.viewer || !this.hydropBaseConfig) { - console.warn('地图未初始化或 hydropBaseConfig 未配置'); - return; - } - - // 取消正在进行的裁切请求 - if (this.clipRequestController) { - this.clipRequestController.abort(); - this.clipRequestController = null; - } - - this.BASEID = _regionId; - - if (!isAll) { - // 取消裁切:清除遮罩多边形,恢复全部锚点可见,平滑飞回全国视图 - this.currentClipGeoJson = null; - this.clearMaskPolygon(); - this.setAllPointsRegionVisible(true); - this.viewer.camera.flyTo({ - destination: Cesium.Cartesian3.fromDegrees( - this.CHINA_CENTER.lng, - this.CHINA_CENTER.lat, - this.CHINA_DEFAULT_HEIGHT - ), - orientation: this.CHINA_VIEW_ORIENTATION, - duration: 1.0 - }); - return; - } - - // 用户从"全部"进入,锚点本来就全可见,无需 API 前先隐藏(避免全量遍历卡顿) - this.clipRequestController = new AbortController(); - const signal = this.clipRequestController.signal; - - try { - const url = - this.hydropBaseConfig.geojson_url + - `&cql_filter=BASEID='${this.BASEID}'`; - - const geoJsonData = await this.fetchGeoJson(url, signal); - - if (signal.aborted) return; - if (this.BASEID !== _regionId) return; - - this.currentClipGeoJson = geoJsonData; - const regionCoords = this.extractPolygonCoords(geoJsonData); - this.filterPointsByRegion(regionCoords); - this.fitViewToGeoJson(regionCoords); - this.createMaskPolygon(regionCoords); - } catch (error: any) { - if (error.name === 'AbortError') return; - this.currentClipGeoJson = null; - console.error('加载裁切数据失败:', error); - this.clearMaskPolygon(); - this.setAllPointsRegionVisible(true); - } finally { - if (this.clipRequestController?.signal === signal) { - this.clipRequestController = null; - } - } - } - mdLayerShowOrHidden( - _layerType: string, - _key?: string, - _baseid?: string, - _checked?: boolean, - _isAll?: boolean - ): void {} - setLegendPointVisible( - layerKey: string, - anchoPointState: string, - checked: boolean - ): void { - const entities = this.pointLayerRegistry.get(layerKey); - if (!entities) return; - - if (!anchoPointState) { - // 第一步:全部隐藏(配合 restoreLayerLegendVisibility 两步走:先全隐藏再按图例逐项恢复) - entities.forEach(entity => { - (entity as any)._legendVisible = false; - this.applyEntityVisibility(entity); - }); - this.requestRefreshPointLabelVisibility(true); - this.rebuildBatchPopupsIfNeeded(); - return; - } - - // 按 anchoPointState 字段匹配并设置可见性 - entities.forEach(entity => { - const rawData = (entity as any)._rawData; - if (rawData && rawData.anchoPointState === anchoPointState) { - (entity as any)._legendVisible = checked; - this.applyEntityVisibility(entity); - } - }); - - // 图例切换后立即重算碰撞(同步执行,避免闪烁) - this.requestRefreshPointLabelVisibility(true); - this.rebuildBatchPopupsIfNeeded(); - } - - // ==================== 基地裁切辅助方法 ==================== - - /** 获取 GeoJSON 数据 */ - private async fetchGeoJson(url: string, signal?: AbortSignal): Promise { - const response = await fetch(url, { signal }); - if (!response.ok) { - throw new Error(`HTTP error! status: ${response.status}`); - } - return response.json(); - } - - /** 批量设置全部锚点的 _regionVisible 标志 */ - private setAllPointsRegionVisible(visible: boolean): void { - this.pointLayerRegistry.forEach(entities => { - entities.forEach(entity => { - (entity as any)._regionVisible = visible; - this.applyEntityVisibility(entity); - }); - }); - } - - /** 根据 GeoJSON 边界批量更新锚点的区域显隐状态(射线法) */ - private filterPointsByRegion(regionCoords: number[][][]): void { - if (!regionCoords.length) { - console.warn('无法解析区域边界,显示所有锚点'); - this.setAllPointsRegionVisible(true); - return; - } - - this.pointLayerRegistry.forEach((_entities, layerKey) => { - this.filterPointsByRegionForLayer(layerKey, regionCoords); - }); - } - - /** 对单个图层应用基地裁切过滤 */ - private filterPointsByRegionForLayer( - layerKey: string, - regionCoords: number[][][] - ): void { - const entities = this.pointLayerRegistry.get(layerKey); - if (!entities || !regionCoords.length) return; - - entities.forEach(entity => { - const rawData = (entity as any)._rawData; - if (!rawData) { - (entity as any)._regionVisible = false; - this.applyEntityVisibility(entity); - return; - } - - const lon = Number(rawData.lgtd); - const lat = Number(rawData.lttd); - - if (!isFinite(lon) || !isFinite(lat)) { - (entity as any)._regionVisible = false; - this.applyEntityVisibility(entity); - return; - } - - (entity as any)._regionVisible = this.isPointInPolygon( - lon, - lat, - regionCoords - ); - this.applyEntityVisibility(entity); - }); - } - - /** 根据多边形坐标飞行相机到基地边界 */ - private fitViewToGeoJson(regionCoords: number[][][]): void { - if (!this.viewer) return; - - try { - if (!regionCoords.length) return; - - // 计算所有坐标的经纬度范围 - let minLon = Infinity; - let maxLon = -Infinity; - let minLat = Infinity; - let maxLat = -Infinity; - - regionCoords.forEach(ring => { - ring.forEach(([lon, lat]) => { - if (lon < minLon) minLon = lon; - if (lon > maxLon) maxLon = lon; - if (lat < minLat) minLat = lat; - if (lat > maxLat) maxLat = lat; - }); - }); - - if (!isFinite(minLon)) return; - - const rectangle = Cesium.Rectangle.fromDegrees( - minLon, - minLat, - maxLon, - maxLat - ); - - this.viewer.camera.flyTo({ - destination: rectangle, - duration: 1.0, - complete: () => this.requestRender() - }); - } catch (error) { - console.error('调整3D视野失败:', error); - } - } - - /** 应用基地裁切:globe.clippingPolygons 直接裁切地球渲染 */ - private createMaskPolygon(regionCoords: number[][][]): void { - if (!this.viewer) return; - - // 仅清理旧边框(不重置 clipping/背景色/skyBox,避免 GPU 状态反复重建) - this.maskPolygonEntities.forEach(entity => { - if (!this.viewer!.isDestroyed()) { - this.viewer!.entities.remove(entity); - } - }); - this.maskPolygonEntities = []; - - if (!regionCoords.length) return; - - const cartesianRings = regionCoords.map(ring => - Cesium.Cartesian3.fromDegreesArray( - ring.flatMap(([lon, lat]) => [lon, lat]) - ) - ); - - // 首次进入裁切时保存原始状态 - if (!this.originalBgColor) { - this.originalBgColor = this.viewer.scene.backgroundColor.clone(); - this.skyBoxShown = this.viewer.scene.skyBox?.show ?? true; - this.skyAtmosphereShown = this.viewer.scene.skyAtmosphere?.show ?? true; - } - // 边界外设为白色 - if (this.viewer.scene.skyBox) this.viewer.scene.skyBox.show = false; - if (this.viewer.scene.skyAtmosphere) - this.viewer.scene.skyAtmosphere.show = false; - this.viewer.scene.backgroundColor = Cesium.Color.WHITE; - - // 直接设新裁切(不经过空集合,避免 GPU shader 重复编译) - this.viewer.scene.globe.clippingPolygons = - new Cesium.ClippingPolygonCollection({ - polygons: cartesianRings.map( - positions => new Cesium.ClippingPolygon({ positions }) - ), - inverse: true, - enabled: true - }); - - // 绘制基地边界线(双线视觉效果:紫色 + 浅紫色) - const borderStyles = [ - { width: 3, color: '#6D64DF' }, - { width: 1.5, color: '#CCC9F4' } - ]; - borderStyles.forEach(({ width, color }) => { - cartesianRings.forEach(positions => { - this.maskPolygonEntities.push( - this.viewer!.entities.add({ - polyline: { - positions, - width, - material: Cesium.Color.fromCssColorString(color), - clampToGround: true - } - }) - ); - }); - }); - - this.requestRender(); - this.viewer.scene.screenSpaceCameraController.maximumZoomDistance = 6_400_000; - } - - /** 清除遮罩多边形 */ - private clearMaskPolygon(): void { - if (!this.viewer) return; - - // 解除 globe 裁切 - this.viewer.scene.globe.clippingPolygons = - new Cesium.ClippingPolygonCollection(); - - // 恢复背景色、星空、大气层 - if (this.originalBgColor) { - this.viewer.scene.backgroundColor = this.originalBgColor; - this.originalBgColor = null; - } - if (this.viewer.scene.skyBox) { - this.viewer.scene.skyBox.show = this.skyBoxShown; - } - if (this.viewer.scene.skyAtmosphere) { - this.viewer.scene.skyAtmosphere.show = this.skyAtmosphereShown; - } - - this.viewer.scene.screenSpaceCameraController.maximumZoomDistance = - Infinity; - - this.maskPolygonEntities.forEach(entity => { - if (!this.viewer!.isDestroyed()) { - this.viewer!.entities.remove(entity); - } - }); - this.maskPolygonEntities = []; - } - - /** 从 GeoJSON 中提取多边形环坐标 */ - private extractPolygonCoords(geoJson: any): number[][][] { - if (!geoJson?.features?.length) return []; - - const coords: number[][][] = []; - geoJson.features.forEach((feature: any) => { - const geometry = feature.geometry; - if (!geometry) return; - - if (geometry.type === 'Polygon') { - coords.push(...geometry.coordinates); - } else if (geometry.type === 'MultiPolygon') { - geometry.coordinates.forEach((polygon: number[][][]) => { - coords.push(...polygon); - }); - } - }); - - return coords; - } - - /** 射线法判断点是否在任意一个多边形环内 */ - private isPointInPolygon( - lon: number, - lat: number, - polygons: number[][][] - ): boolean { - for (const polygon of polygons) { - if (this.isPointInRing(lon, lat, polygon)) { - return true; - } - } - return false; - } - - /** 射线法判断点是否在单个闭合环内 */ - private isPointInRing(lon: number, lat: number, ring: number[][]): boolean { - let inside = false; - const n = ring.length; - - for (let i = 0, j = n - 1; i < n; j = i++) { - const xi = ring[i][0]; - const yi = ring[i][1]; - const xj = ring[j][0]; - const yj = ring[j][1]; - - const intersect = - yi > lat !== yj > lat && - lon < ((xj - xi) * (lat - yi)) / (yj - yi) + xi; - - if (intersect) inside = !inside; - } - - return inside; - } - - /** - * 组合计算可见性(3D 解耦模型): - * - entity.show = 基础可见(layer && legend && region),保持 entity 始终"在作用域内" - * - entity.billboard.show = 基础可见 && 图标碰撞通过 - * - entity.label.show = 基础可见 && 标签碰撞通过(图标碰撞不影响标签) - */ - private applyEntityVisibility(entity: Cesium.Entity): void { - const e = entity as any; - const baseVisible = e._layerVisible && e._legendVisible && e._regionVisible; - // entity 整体始终基于 layer/legend/region(不受碰撞影响,保证 popup/click 等交互不受碰撞干扰) - entity.show = baseVisible; - // 图标单独受碰撞控制 - if (entity.billboard) { - (entity.billboard as any).show = - baseVisible && e._iconCollisionVisible !== false; - } - // 标签单独受碰撞控制(不与图标碰撞联动) - if (entity.label) { - (entity.label as any).show = - baseVisible && e._labelCollisionVisible !== false; - } - } - - // ==================== Step 6: 碰撞检测 ==================== - - /** - * 触发碰撞检测刷新(带 rAF 节流,与 2D requestRefreshPointLabelVisibility 对齐) - */ - private requestRefreshPointLabelVisibility( - immediate = false, - debounceMs = 0 - ) { - if (this.labelVisibilityDebounceTimerId !== null) { - window.clearTimeout(this.labelVisibilityDebounceTimerId); - this.labelVisibilityDebounceTimerId = null; - } - - if (immediate) { - if (this.collisionRefreshFrameId !== null) { - cancelAnimationFrame(this.collisionRefreshFrameId); - this.collisionRefreshFrameId = null; - } - this.refreshPointLabelVisibility(); - return; - } - - if (debounceMs > 0) { - this.labelVisibilityDebounceTimerId = window.setTimeout(() => { - this.labelVisibilityDebounceTimerId = null; - this.requestRefreshPointLabelVisibility(); - }, debounceMs); - return; - } - - if (this.collisionRefreshFrameId !== null) return; - - this.collisionRefreshFrameId = window.requestAnimationFrame(() => { - this.collisionRefreshFrameId = null; - this.refreshPointLabelVisibility(); - }); - } - - /** - * 主碰撞检测:密度门控 → 图标碰撞 → 标签碰撞 - * 与 2D refreshPointLabelVisibility 核心算法完全对齐 - */ - private refreshPointLabelVisibility(): void { - if (!this.viewer) return; - - const currentZoom = this.getCurrentCesiumZoom(); - if (currentZoom === undefined || currentZoom === null) return; - - console.log( - `[Cesium Collision] zoom=${currentZoom?.toFixed(2)} layers=${ - this.pointLayerRegistry.size - }` - ); - - // ===== 阶段0:收集视口内所有基础可见实体 ===== - type CollisionCandidate = { - entity: Cesium.Entity; - iconLeft: number; - iconRight: number; - iconTop: number; - iconBottom: number; - hasLabel: boolean; - labelLeft: number; - labelRight: number; - labelTop: number; - labelBottom: number; - engPriority: number; - nearbyPriority: number; - densityPriority: number; - pixelX: number; - pixelY: number; - id: string; - }; - - const candidates: CollisionCandidate[] = []; - const canvas = this.viewer.scene.canvas; - const viewPadding = 120; // 视口外的宽容范围 - - // 孤立点密度网格:用于 shouldBypassDensityGate - const densityPixelGrid = new Map< - string, - Array<{ - entity: Cesium.Entity; - layerKey: string; - pixelX: number; - pixelY: number; - }> - >(); - - const dynamicScale = Math.max( - 0.5, - Math.min(3.0, 0.7 + (currentZoom - 4.5) * 0.08) - ); - const fontSize = Math.max(10, Math.min(24, 12 * dynamicScale)); - - // 第一遍:密度门控 + 构建候选 - this.pointLayerRegistry.forEach((entities, layerKey) => { - entities.forEach(entity => { - const e = entity as any; - - // 基础可见性检查(layer/legend/region) - if ( - e._layerVisible === false || - e._legendVisible === false || - e._regionVisible === false - ) { - e._iconCollisionVisible = false; - e._labelCollisionVisible = false; - this.applyEntityVisibility(entity); - return; - } - - const position = entity.position?.getValue( - this.viewer!.clock.currentTime - ); - if (!position) { - e._iconCollisionVisible = false; - e._labelCollisionVisible = false; - this.applyEntityVisibility(entity); - return; - } - - const screenPos = Cesium.SceneTransforms.worldToWindowCoordinates( - this.viewer!.scene, - position - ); - if (!screenPos) { - e._iconCollisionVisible = false; - e._labelCollisionVisible = false; - this.applyEntityVisibility(entity); - return; - } - - const pixelX = screenPos.x; - const pixelY = screenPos.y; - - // 视口裁剪:太远的实体不参与碰撞,但保留其当前碰撞状态(不重置) - if ( - pixelX < -viewPadding || - pixelY < -viewPadding || - pixelX > canvas.clientWidth + viewPadding || - pixelY > canvas.clientHeight + viewPadding - ) { - return; - } - - // 密度 gating(与 2D getFeatureDensityMinZoom / shouldRenderFeatureByDensity 对齐) - const densityMinZoom = this.getEntityDensityMinZoom(entity); - const bypassDensity = - currentZoom < densityMinZoom && - this.shouldBypassDensityGateForIsolatedEntity( - entity, - pixelX, - pixelY, - layerKey, - densityPixelGrid - ); - const densityVisible = currentZoom >= densityMinZoom || bypassDensity; - - if (!densityVisible) { - e._iconCollisionVisible = false; - e._labelCollisionVisible = false; - this.applyEntityVisibility(entity); - return; - } - - // 构建图标碰撞盒(与 2D 一致:Math.max(14, 24 * dynamicScale)) - const iconCollisionSize = Math.max(14, 24 * dynamicScale); - const iconLeft = pixelX - iconCollisionSize / 2; - const iconRight = pixelX + iconCollisionSize / 2; - const iconTop = pixelY - iconCollisionSize / 2; - const iconBottom = pixelY + iconCollisionSize / 2; - - // 构建标签碰撞盒 - const labelText: string = e._labelText || ''; - const hasLabel = !!labelText; - let labelLeft = 0; - let labelRight = 0; - let labelTop = 0; - let labelBottom = 0; - - if (hasLabel) { - const lines = labelText.split('\n'); - const maxLineLength = Math.max( - ...lines.map((l: string) => l.length), - 1 - ); - const labelLineCount = lines.length; - // 标签碰撞偏移与 2D getPointLabelCollisionOffsetY 对齐 - const labelOffsetY = - labelLineCount > 1 ? -36 * dynamicScale : -28 * dynamicScale; - const estimatedWidth = maxLineLength * fontSize * 0.6 + 16; - const estimatedHeight = labelLineCount * (fontSize + 4) + 8; - const centerY = pixelY + labelOffsetY; - labelLeft = pixelX - estimatedWidth / 2; - labelRight = pixelX + estimatedWidth / 2; - labelTop = centerY - estimatedHeight / 2; - labelBottom = centerY + estimatedHeight / 2; - } - - const entityId = String(entity.id || ''); - const rawData: Record = e._rawData || {}; - - candidates.push({ - entity, - iconLeft, - iconRight, - iconTop, - iconBottom, - hasLabel, - labelLeft, - labelRight, - labelTop, - labelBottom, - engPriority: this.getEntityEngRenderPriority(entity), - nearbyPriority: Number(rawData._nearbyPriority || 9999), - densityPriority: this.getEntityDensityPriority(entity), - pixelX, - pixelY, - id: entityId - }); - }); - }); - - if (candidates.length === 0) return; - - // ===== 阶段1:排序(eng优先级 > 近邻点优先级 > 密度优先级 > Y轴 > ID) ===== - candidates.sort((left, right) => { - if (left.engPriority !== right.engPriority) { - return right.engPriority - left.engPriority; - } - if (left.nearbyPriority !== right.nearbyPriority) { - return left.nearbyPriority - right.nearbyPriority; - } - if (left.densityPriority !== right.densityPriority) { - return left.densityPriority - right.densityPriority; - } - if (left.pixelY !== right.pixelY) { - return left.pixelY - right.pixelY; - } - return left.id.localeCompare(right.id); - }); - - // ===== 阶段2:图标碰撞(AABB + 空间网格加速) ===== - const iconPlacedGrid = new Map< - string, - Array<{ - left: number; - right: number; - top: number; - bottom: number; - }> - >(); - - candidates.forEach(candidate => { - const iconRect = { - left: candidate.iconLeft, - right: candidate.iconRight, - top: candidate.iconTop, - bottom: candidate.iconBottom - }; - - const hasCollision = this.findCollidingRectInGrid( - iconRect, - iconPlacedGrid, - this.COLLISION_GRID_CELL_SIZE, - placed => this.checkIconsAabbCollision(placed, iconRect) - ); - - const iconVisible = !hasCollision; - (candidate.entity as any)._iconCollisionVisible = iconVisible; - - if (iconVisible) { - this.addRectToCollisionGrid( - iconRect, - iconPlacedGrid, - this.COLLISION_GRID_CELL_SIZE - ); - } - }); - - // ===== 阶段3:标签碰撞(先避让图标,再避让标签) ===== - const labelCandidates = [...candidates].sort((left, right) => { - if (left.engPriority !== right.engPriority) - return right.engPriority - left.engPriority; - if (left.nearbyPriority !== right.nearbyPriority) - return left.nearbyPriority - right.nearbyPriority; - if (left.pixelY !== right.pixelY) return left.pixelY - right.pixelY; - if (left.pixelX !== right.pixelX) return left.pixelX - right.pixelX; - return left.id.localeCompare(right.id); - }); - - const labelPlacedGrid = new Map< - string, - Array<{ - left: number; - right: number; - top: number; - bottom: number; - }> - >(); - - labelCandidates.forEach(candidate => { - const e = candidate.entity as any; - - if (!candidate.hasLabel) { - e._labelCollisionVisible = false; - return; - } - - // 3D 解耦:图标被碰撞隐藏不影响标签显示 - // 标签仍会避让已放置的图标(见下方 iconPlacedGrid 检查) - - const labelRect = { - left: candidate.labelLeft, - right: candidate.labelRight, - top: candidate.labelTop, - bottom: candidate.labelBottom - }; - - // 先避让已放置的图标(缩小保护区4px,允许边缘擦过) - const hasIconCollision = this.findCollidingRectInGrid( - labelRect, - iconPlacedGrid, - this.COLLISION_GRID_CELL_SIZE, - iconRect => { - const inset = 4; - const narrowed = { - left: iconRect.left + inset, - right: iconRect.right - inset, - top: iconRect.top + inset, - bottom: iconRect.bottom - inset - }; - return !( - narrowed.right <= labelRect.left || - narrowed.left >= labelRect.right || - narrowed.bottom <= labelRect.top || - narrowed.top >= labelRect.bottom - ); - } - ); - - if (hasIconCollision) { - e._labelCollisionVisible = false; - return; - } - - // 再避让已放置的标签 - const hasLabelCollision = this.findCollidingRectInGrid( - labelRect, - labelPlacedGrid, - this.COLLISION_GRID_CELL_SIZE, - placed => this.checkLabelAabbCollision(placed, labelRect) - ); - - const labelVisible = !hasLabelCollision; - e._labelCollisionVisible = labelVisible; - - if (labelVisible) { - this.addRectToCollisionGrid( - labelRect, - labelPlacedGrid, - this.COLLISION_GRID_CELL_SIZE - ); - } - }); - - // ===== 阶段4:统一应用可见性变化 ===== - let iconVisibleCount = 0; - let labelVisibleCount = 0; - candidates.forEach(candidate => { - const e = candidate.entity as any; - if (e._iconCollisionVisible) iconVisibleCount++; - if (e._labelCollisionVisible) labelVisibleCount++; - this.applyEntityVisibility(candidate.entity); - }); - - console.log( - `[Cesium Collision] 候选=${candidates.length} 图标可见=${iconVisibleCount} 标签可见=${labelVisibleCount}` - ); - } - - // ==================== 碰撞检测辅助:密度门控 ==================== - - /** 从实体原始数据中提取 density 字段(密度分档值,非物理距离) */ - private getEntityDensityValue(entity: Cesium.Entity): number | null { - const rawData = (entity as any)._rawData; - if (!rawData) return null; - const rawDistance = rawData.distance; - if ( - rawDistance === undefined || - rawDistance === null || - rawDistance === '' - ) { - return null; - } - const densityValue = Number(rawDistance); - return Number.isFinite(densityValue) ? densityValue : null; - } - - /** 密度优先级(档位越低越优先,与 2D getFeatureDensityPriority 对齐) */ - private getEntityDensityPriority(entity: Cesium.Entity): number { - const densityValue = this.getEntityDensityValue(entity); - const densityDisplayRules = getNearbyPointDensityDisplayRules(); - if (densityValue === null) { - return densityDisplayRules.length; - } - const matchedRuleIndex = densityDisplayRules.findIndex(rule => { - return densityValue >= rule.minDensityValue; - }); - return matchedRuleIndex >= 0 - ? matchedRuleIndex - : densityDisplayRules.length; - } - - /** 根据密度值获取最低显示缩放级别(与 2D getFeatureDensityMinZoom 对齐) */ - private getEntityDensityMinZoom(entity: Cesium.Entity): number { - const densityValue = this.getEntityDensityValue(entity); - if (densityValue === null) return 0; - const densityDisplayRules = getNearbyPointDensityDisplayRules(); - const matchedRule = densityDisplayRules.find(rule => { - return densityValue >= rule.minDensityValue; - }); - if (matchedRule) return matchedRule.minZoom; - return densityDisplayRules.at(-1)?.minZoom ?? 0; - } - - /** - * 孤立点密度豁免:如果当前视口内 56px 范围内没有其他同图层可见点, - * 则跳过密度门控直接显示(与 2D shouldBypassDensityGateForIsolatedFeature 对齐) - */ - private shouldBypassDensityGateForIsolatedEntity( - entity: Cesium.Entity, - pixelX: number, - pixelY: number, - layerKey: string, - densityPixelGrid: Map< - string, - Array<{ - entity: Cesium.Entity; - layerKey: string; - pixelX: number; - pixelY: number; - }> - > - ): boolean { - // 先登记当前实体到密度网格 - const gridKey = `${layerKey}:${Math.floor( - pixelX / this.DENSITY_ISOLATION_THRESHOLD - )}:${Math.floor(pixelY / this.DENSITY_ISOLATION_THRESHOLD)}`; - const bucket = densityPixelGrid.get(gridKey) || []; - bucket.push({ entity, layerKey, pixelX, pixelY }); - densityPixelGrid.set(gridKey, bucket); - - // 检查周围 3x3 网格单元 - const checkedKeys = new Set(); - for (let dx = -1; dx <= 1; dx++) { - for (let dy = -1; dy <= 1; dy++) { - const neighborKey = `${layerKey}:${ - Math.floor(pixelX / this.DENSITY_ISOLATION_THRESHOLD) + dx - }:${Math.floor(pixelY / this.DENSITY_ISOLATION_THRESHOLD) + dy}`; - if (checkedKeys.has(neighborKey)) continue; - checkedKeys.add(neighborKey); - - const neighborBucket = densityPixelGrid.get(neighborKey); - if (!neighborBucket?.length) continue; - - for (const neighbor of neighborBucket) { - if (neighbor.entity === entity) continue; - const dist = Math.hypot( - neighbor.pixelX - pixelX, - neighbor.pixelY - pixelY - ); - if (dist <= this.DENSITY_ISOLATION_THRESHOLD) { - return false; // 有近邻点,不豁免 - } - } - } - } - - return true; // 孤立点,豁免密度门控 - } - - // ==================== 碰撞检测辅助:eng 优先级 ==================== - - /** 判断是否为 eng 点(与 2D isFeatureEng 对齐) */ - private isEntityEng(entity: Cesium.Entity): boolean { - const e = entity as any; - const rawData: Record = e._rawData || {}; - const layerKey = String(e._layerKey || '').toLowerCase(); - const sttpMap = String( - rawData.sttpMap || rawData._sttpMap || '' - ).toUpperCase(); - const sttpCode = String( - rawData.sttpCode || rawData.sttp || '' - ).toUpperCase(); - - return ( - layerKey.includes('eng_point') || - sttpMap === 'ENG' || - sttpMap === 'ENG2' || - sttpCode === 'ENG' - ); - } - - /** 判断是否为 eng 告警点(与 2D isFeatureEngAlarm 对齐) */ - private isEntityEngAlarm(entity: Cesium.Entity): boolean { - const e = entity as any; - const rawData: Record = e._rawData || {}; - const layerKey = String(e._layerKey || '').toLowerCase(); - const legendState = String(rawData.anchoPointState || '') - .trim() - .toLowerCase(); - - return ( - layerKey.includes('eng_alarm_point') || - layerKey.includes('alarm_range') || - legendState.startsWith('alarm_range_') || - legendState.startsWith('large_eng_built_alarm_range_') || - legendState.startsWith('mid_eng_built_alarm_range_') - ); - } - - /** 获取 eng 渲染优先级:告警=300, eng=200, 普通=100(与 2D 完全一致) */ - private getEntityEngRenderPriority(entity: Cesium.Entity): number { - if (this.isEntityEngAlarm(entity)) return 300; - return this.isEntityEng(entity) ? 200 : 100; - } - - // ==================== 碰撞检测辅助:空间网格与 AABB ==================== - - /** 计算矩形覆盖的碰撞网格 cell keys */ - private getCollisionGridKeys( - rect: { - left: number; - right: number; - top: number; - bottom: number; - }, - cellSize: number - ): string[] { - const startX = Math.floor(rect.left / cellSize); - const endX = Math.floor(rect.right / cellSize); - const startY = Math.floor(rect.top / cellSize); - const endY = Math.floor(rect.bottom / cellSize); - const keys: string[] = []; - - for (let x = startX; x <= endX; x += 1) { - for (let y = startY; y <= endY; y += 1) { - keys.push(`${x}:${y}`); - } - } - - return keys; - } - - /** 将矩形注册到碰撞网格 */ - private addRectToCollisionGrid< - T extends { - left: number; - right: number; - top: number; - bottom: number; - } - >(rect: T, grid: Map, cellSize: number) { - this.getCollisionGridKeys(rect, cellSize).forEach(key => { - const bucket = grid.get(key) || []; - bucket.push(rect); - grid.set(key, bucket); - }); - } - - /** 在碰撞网格中查找与给定矩形碰撞的矩形 */ - private findCollidingRectInGrid< - T extends { - left: number; - right: number; - top: number; - bottom: number; - } - >( - rect: { - left: number; - right: number; - top: number; - bottom: number; - }, - grid: Map, - cellSize: number, - isCollision: (candidate: T) => boolean - ): T | undefined { - for (const key of this.getCollisionGridKeys(rect, cellSize)) { - const bucket = grid.get(key); - if (!bucket?.length) continue; - - for (const candidate of bucket) { - if (isCollision(candidate)) { - return candidate; - } - } - } - - return undefined; - } - - /** 图标碰撞检测:AABB 重叠判定(padding=0,与 2D 图标碰撞一致) */ - private checkIconsAabbCollision( - left: { left: number; right: number; top: number; bottom: number }, - right: { left: number; right: number; top: number; bottom: number } - ): boolean { - return !( - left.right < right.left || - left.left > right.right || - left.bottom < right.top || - left.top > right.bottom - ); - } - - /** 标签碰撞检测:AABB 重叠 + padding=4(与 2D checkLabelCollision 对齐) */ - private checkLabelAabbCollision( - left: { left: number; right: number; top: number; bottom: number }, - right: { left: number; right: number; top: number; bottom: number } - ): boolean { - const padding = this.COLLISION_LABEL_PADDING; - return !( - left.right + padding < right.left || - left.left - padding > right.right || - left.bottom + padding < right.top || - left.top - padding > right.bottom - ); - } - - // ==================== 倾斜摄影(OSGB) ==================== - - /** - * 加载倾斜摄影 3D Tileset 模型 - * 如果 viewer 尚未就绪,暂存到队列中,等 5 秒后批量加载 - */ - addQxsyLayer(item: OSGBItem): void { - if (!this.viewer || !this._ready) { - // 未就绪:放入等待队列 - if (!this._pendingOSGBItems.includes(item)) { - this._pendingOSGBItems.push(item); - } - return; - } - LoadOSGB(this.viewer, item); - } - - /** - * 批量加载所有等待中的倾斜摄影 - */ - private flushPendingOSGB(): void { - if (!this.viewer || this.viewer.isDestroyed()) return; - const items = this._pendingOSGBItems.splice(0); - console.log(`[Cesium] 开始加载 ${items.length} 个待加载的倾斜摄影模型`); - items.forEach(item => LoadOSGB(this.viewer!, item)); - } - - /** - * 移除倾斜摄影模型 - */ - removeQxsyLayer(item: OSGBItem): void { - if (!this.viewer) return; - // 从待加载队列中移除,防止已被移除的模型在 flushPendingOSGB 时又被加载 - this._pendingOSGBItems = this._pendingOSGBItems.filter(i => i !== item); - removeQxsy(this.viewer, item); - } - - /** - * 倾斜摄影显隐切换 - */ - qxsyChangeClick(item: OSGBItem, checked: boolean): void { - if (!this.viewer) return; - osgbChangeClick(this.viewer, item, checked); - } - - /** - * 飞行定位到倾斜摄影模型 - */ - qxsyToPosition(item: OSGBItem): void { - if (!this.viewer) return; - osgbLocation(this.viewer, item); - } -} diff --git a/frontend-sjgl/src/components/gis/map.class.ts b/frontend-sjgl/src/components/gis/map.class.ts deleted file mode 100644 index ea1e450d..00000000 --- a/frontend-sjgl/src/components/gis/map.class.ts +++ /dev/null @@ -1,297 +0,0 @@ -import type { layer, MapInterface } from './map.d'; -// import { MapLeaflet } from "./map.leaflet"; -import { MapOl } from './map.ol'; -import { MapCesium } from './map.cesium'; - -interface MapClassInterface extends MapInterface { - layers: Map; - view: any; -} - -//描点参数 -export type MDOptions = { - isAllowOverlap?: boolean; // 是否允许重叠 - labelType?: number; // 标签类型 - labelminZoom?: number; // 标签最小缩放级别 - labelAltitude?: object; // 标签海拔 - isRemove?: boolean; // 是否移除标签 -}; - -export const mapServerBaseUrl = - localStorage.getItem('gisurl') || 'http://210.72.227.199:18084/'; - -export class MapClass implements MapClassInterface { - layers: Map; - view: any; - private static instance: MapClass; - private service: MapInterface; - - constructor() { - this.layers = new Map(); - this.view = null; - // this.service = new MapLeaflet(); - this.service = new MapOl(); - } - static getInstance(): MapClass { - if (!this.instance) { - this.instance = new MapClass(); - } - return this.instance; - } - // 地图初始化 - init(container: HTMLElement, rectangle?: any): Promise { - return this.service.init(container, rectangle).then(map => { - this.view = map; - return map; - }); - } - // 基地面板控制 - jdPanelControlShowAndHidden(baseid: string, isAll: boolean): void { - this.service.jdPanelControlShowAndHidden(baseid, isAll); - } - - mdLayerShowOrHidden( - layerType: string, - key?: string, - baseid: string, - checked?: boolean, - isAll?: boolean - ): void { - this.service.mdLayerShowOrHidden(layerType, key, baseid, checked, isAll); - } - // 添加基础数据图层 - addBaseDataLayer(layer: any, isShow: boolean): void { - return this.service.addBaseDataLayer(layer, isShow); - } - // 基础图层显示影隐藏方法 - controlBaseLayerTreeShowAndHidden( - layerType: string, - key: string, - checked: boolean - ) { - this.service.controlBaseLayerTreeShowAndHidden(layerType, key, checked); - } - // 图层树控制描点数据显示隐藏方法 - mdLayerTreeShowOrHidden(layerType: string, checked?: boolean) { - this.service.mdLayerTreeShowOrHidden(layerType, checked); - } - // 根据图例控制锚点显示隐藏 - setLegendPointVisible( - layerKey: string, - anchoPointState: string, - checked: boolean - ): void { - this.service.setLegendPointVisible(layerKey, anchoPointState, checked); - } - // 初始化加载描点数据 - addInitDataLayer = (pointData: any[], layerType: any, mdoptions?: any) => { - return this.service.addInitDataLayer(pointData, layerType, mdoptions); - }; - //切换底图 - baseLayerSwitcher(key: string, checked: boolean): void { - this.service.baseLayerSwitcher(key, checked); - } - - // 添加梯级流域图 - addTertiarybasinLayer( - layer: layer, - fillcolor: any, - outlineColor: any, - datas: any - ): void { - this.service.addTertiarybasinLayer(layer, fillcolor, outlineColor, datas); - } - // 移除梯级流域图 - hideTertiarybasinLayer(layer: layer): void { - this.service.hideTertiarybasinLayer?.(layer); - } - // 缩放 - zoomToggle(type: 'out' | 'in') { - this.service.zoomToggle(type); - } - /** - * 长度量算 - */ - lengthCalculate(): void { - this.service.lengthCalculate(); - } - /** - * 面积量算 - */ - areCalculate(): void { - this.service.areCalculate(); - } - /** - * 移除量算结果 - */ - removeQueryLayer(): void { - this.service.removeQueryLayer(); - } - // 地图打印 - mapOutPut() { - this.service.mapOutPut(); - } - // 检查图层是否存在 - hasLayer(layerKey: string): boolean { - return this.service.hasLayer(layerKey); - } - // 检查 GIS/底图图层是否存在 - hasBaseLayer(layerKey: string): boolean { - return this.service.hasBaseLayer(layerKey); - } - // 删除描点图层 - removePointLayer(layerKey: string): void { - this.service.removePointLayer?.(layerKey); - } - // 销毁地图 - destroy(): void { - this.service.destroy(); - } - // 初始化弹窗 - initPopupOverlay(popupContainer: HTMLDivElement): void { - this.service.initPopupOverlay(popupContainer); - } - // 切换地图视图 - switchView(type: '2D' | '3D'): Promise { - // this.service.switchView(type); - return new Promise((resolve, reject) => { - const container = document.getElementById('mapContainer'); - if (!container) { - reject(new Error('Map container not found')); - return; - } - try { - // 1. 销毁当前地图服务 - if (this.service) { - try { - this.service.destroy(); - } catch (e) { - console.warn('Error destroying previous service:', e); - } - this.service = null; - } - this.view = null; - - // 2. 根据类型初始化新的地图服务 - if (type === '2D') { - this.service = new MapOl(); - - this.service - .init(container) - .then(map => { - this.view = map; - resolve(map); - }) - .catch(err => reject(err)); - } else if (type === '3D') { - this.service = new MapCesium(); - - this.service - .init(container) - .then(viewer => { - this.view = viewer; - resolve(viewer); - }) - .catch(err => reject(err)); - } - // const container = this.view._container; - // if (type === '3D' && this.view) { - // if (type === '2D') { - // const rectangle = this.view.camera.computeViewRectangle() - // const heading = this.view.camera.heading - // const height = this.view.camera.positionCartographic.height - // const zoom = altitudeToZoom(height) > 11 ? 11 : altitudeToZoom(height) - // const center = this.service?.getCenterPosition() - // const west = this.transformRadian(rectangle.west) - // const north = this.transformRadian(rectangle.north) - // const east = this.transformRadian(rectangle.east) - // const south = this.transformRadian(rectangle.south) - // const bearing = this.transformRadian(heading) - - // this.service = new MapOl(); - // this.init(document.getElementById('mapContainer')); - // // this.service - // .init(document.getElementById('mapContainer')) - // .then(map => { - // this.view = map; - // resolve(map); - // }); - // } else if (type === '3D') { - // const data: { - // _southWest: { lat: number; lng: number } - // _northEast: { lat: number; lng: number } - // } = this.view.getBounds() - // const bearing = this.view.getBearing() - // const heading = this.transformAngle(bearing) - // //获取相机高度 - // const altitude = zoomToAltitude(this.view.getZoom()) - // //获取地图中心点 - // let lng = 0.5 * (data._ne.lng + data._sw.lng) - // let lat = 0.5 * (data._ne.lat + data._sw.lat) - // let center = { lng, lat } - // this.destroy(); - - // this.service = null; - // this.view = null; - // this.service = new MapCesium() - // this.service.init(container, data, center, altitude, heading).then((viewer) => { - // this.view = viewer - // let removeCallback = viewer.scene.globe.tileLoadProgressEvent.addEventListener((e) => { - // if (e == 0) { - // removeCallback() - // removeCallback = null - // if (viewer && !viewer.isDestroyed()) { - // resolve(viewer) - // } - // } - // }) - // //容错机制,放置地图服务挂掉或者响应非常慢 - // setTimeout(() => { - // if (removeCallback) { - // removeCallback() - // removeCallback = null - // if (viewer && !viewer.isDestroyed()) { - // resolve(viewer) - // } - // } - // }, 5000) - // }) - // } - } catch { - reject(); - } - }); - } - - // 飞行到指定的点 - fitBounds(): void { - // this.service.fitBounds(bounds) - } - - // 飞行到指定的点 - flyTopanto(position: number[], zoom: number): void { - this.service.flyTopanto(position, zoom); - } - - getCurrentZoom(): number | undefined { - return this.service.getCurrentZoom(); - } - - // ==================== 倾斜摄影 ==================== - - addQxsyLayer(item: any): void { - this.service.addQxsyLayer?.(item); - } - - removeQxsyLayer(item: any): void { - this.service.removeQxsyLayer?.(item); - } - - qxsyChangeClick(item: any, checked: boolean): void { - this.service.qxsyChangeClick?.(item, checked); - } - - qxsyToPosition(item: any): void { - this.service.qxsyToPosition?.(item); - } -} diff --git a/frontend-sjgl/src/components/gis/map.d.ts b/frontend-sjgl/src/components/gis/map.d.ts deleted file mode 100644 index 9d04a2dd..00000000 --- a/frontend-sjgl/src/components/gis/map.d.ts +++ /dev/null @@ -1,245 +0,0 @@ -import { MDOptions } from './map.class'; -export type layerType = - | 'markers' - | 'tiledMap' - | 'tiledMapQuery' - | 'geoJson' - | 'arcgisFeature' - | 'dynamicMapLayer' - | 'arcgisMap' - | 'label' - | 'vector'; -export type layerOption = { - opacity?: number; - data?: Array; - zIndex?: number; - clickEvent?: Function; - hoverEvent?: Function; - legendImages?: Array | null | undefined; - geoJsonLegend?: Array | null | undefined; - tiledMapType?: undefined | 'superMap'; -}; - -export interface layer { - id: string; - key: string; - _layer?: any; - type?: layerType; - url?: string; - url_3d?: string; - geojson_url: string; - label?: string; - thumbnail?: string; - visible?: boolean; - option?: layerOption; - tempobj?: any; - layers?: any; - rasteropacity?: any; - imgUrl?: any; - minZoom?: any; - maxZoom?: any; - minHeight?: number; - maxHeight?: number; - /** layer 类型 */ - layerType?: string; - matrixIds_index?: string[]; - tileMatrixSetID?: string; - urlType: string; -} - -export interface MapInterface { - /** - * 地图初始化 - * @param container DOM容器 - * @return any 地图视图 - */ - init( - container: HTMLElement, - rectangle?: any, - center?: any, - altitude?: number, - bearing?: number - ): Promise; - - /** - * 初始化加载描点数据 - * @param pointData - * @param layerType - */ - addInitDataLayer( - pointData: any[], - layerType: any, - mdoptions: MDOptions - ): void; - - /** - * 初始化弹窗 - * @param popupContainer - */ - initPopupOverlay(popupContainer: HTMLDivElement): void; - - /** - * 初始化加载基础图层 - * @param layer - */ - addBaseDataLayer(layer: any, isShow: boolean): void; - - /** - * 切换底图 - * @param layer - */ - baseLayerSwitcher(key: string, checked: boolean): void; - - /** - * 切换2D或者3D视图 - * @param type '2D' | '3D' - */ - switchView(type: '2D' | '3D'): any | null; - - /** - * 缩放 - * out 缩小 - * in 放大 - */ - zoomToggle(type: 'out' | 'in'): void; - - /** - * 检查图层是否存在 - * @param layerKey 图层 key - * @returns 是否存在 - */ - hasLayer(layerKey: string): boolean; - /** - * 检查 GIS/底图图层是否存在 - * @param layerKey 图层 key - * @returns 是否存在 - */ - hasBaseLayer(layerKey: string): boolean; - /** - * 地图输出打印 - */ - mapOutPut(): void; - - //飞行到指定的点 - fitBounds(bbox, bearing): void; - - flyTopanto(positon, zoom): void; - - /** - * 获取当前地图缩放级别语义 - * 2D 直接返回原生 zoom,3D 由相机高度换算后返回 - */ - getCurrentZoom(): number | undefined; - - /** - * 加载倾斜摄影数据 - */ - addQxsyLayer(item: any): void; - - /** - * 移除倾斜摄影数据 - */ - removeQxsyLayer(item: any): void; - - /** - * 倾斜摄影显隐切换 - */ - qxsyChangeClick(item: any, checked: boolean): void; - - /** - * 倾斜摄影定位 - */ - qxsyToPosition(item: any): void; - - /** - * 基地面板控制 - * @param baseid - * @param isAll - */ - jdPanelControlShowAndHidden(baseid: string, isAll: boolean): void; - /** - * 图例和基地面板控制描点数据显示隐藏方法 - * @param layerType - * @param key - * @param checked - * @param isAll - */ - mdLayerShowOrHidden( - layerType: string, - key?: string, - baseid: string, - checked?: boolean, - isAll?: boolean - ): void; - - /** - * 基础图层显示影隐藏方法 - * @param layerType - * @param checked - */ - controlBaseLayerTreeShowAndHidden( - layerType: string, - key: string, - checked: boolean - ): void; - - /** - * 图层树控制描点数据显示隐藏方法 - * @param layerType - * @param checked - */ - mdLayerTreeShowOrHidden(layerType: string, checked?: boolean): void; - - /** - * 删除描点图层 - * @param layerKey 图层 key - */ - removePointLayer(layerKey: string): void; - - /** - * 根据 anchoPointState 控制单个图例的锚点显示隐藏 - * @param layerKey 图层 key - * @param anchoPointState 锚点状态(对应图例的 nameEn) - * @param checked 是否显示 - */ - setLegendPointVisible( - layerKey: string, - anchoPointState: string, - checked: boolean - ): void; - - /** - * 长度量算 - */ - lengthCalculate(): void; - /** - * 面积量算 - */ - areCalculate(): void; - - /** - * 移除量算结果 - */ - removeQueryLayer(): void; - /** - * 添加梯级流域图 - * @param layer - * @param fillcolor - */ - addTertiarybasinLayer( - layer: layer, - fillcolor: any, - outlineColor: any, - datas: any - ): void; - - /** - * 移除梯级流域图 - * @param layer - */ - hideTertiarybasinLayer(layer: layer): void; - /** - * 移除地图对象 - */ - destroy(): void; -} diff --git a/frontend-sjgl/src/components/gis/map.leaflet.ts b/frontend-sjgl/src/components/gis/map.leaflet.ts deleted file mode 100644 index e7da68d0..00000000 --- a/frontend-sjgl/src/components/gis/map.leaflet.ts +++ /dev/null @@ -1,440 +0,0 @@ -// import { MapInterface } from './map'; -// import * as L from 'leaflet'; -// import * as esriLeaflet from 'esri-leaflet'; -// import '@/utils/leaflet/leaflet-tilelayer-wmts-src.js'; -// import { mapServerBaseUrl } from './map.class'; -// import '@/utils/leaflet/leaflet.inflatable-markers-group.js'; -// import {MDOptions} from './map.class'; -// import { getIconPath } from "@/utils/index"; -// // @ts-ignore -// import axios from 'axios'; -// // import "@/components/thematicMap/leaflet/leaflet.inflatable-markers-group.js" - -// const tiledMapGroup = L.layerGroup(); -// const chartMapGroup = L.layerGroup(); -// const overlayGroup = L.layerGroup(); -// const CENTER_positionCN: any = [38, 114.17112499999996]; //中心纬经度 中国 -// const basinCenter = { -// DA_HHGLSX: [103.343357, 35.931812], -// FA_CJGLSX: [111.001911, 30.821327] -// }; -// let boundCavansLayer: any = null; -// let ganliulist: any = []; -// export class MapLeaflet implements MapInterface { -// map: any = null; -// htmlMakerLayer: any = []; -// defaultScale = 10; -// minimumZoom = 7; -// setDrawPlug: any = null; -// layermarkers: any = []; -// rainlayerslist: any = []; -// private layerRegistry: Map = new Map(); // ✅ 新增:存储 key -> layer 实例 - -// private currentBaseLayerKey: string | null = null; // ✅ 新增:记录当前激活的底图 Key - -// temperatureMapObj: any = []; -// //地图初始化 -// init(container: HTMLElement, rectangle?: any): Promise { -// try { -// console.log('init初始化container', container); -// var corner1 = L.latLng(55.35715491537772, 140.7821677051657); -// var corner2 = L.latLng(0.975580441812298, 67.56008229483018); -// var bounds = L.latLngBounds(corner2, corner1); -// const map = L.map(container as any, { -// preferCanvas: true, -// zoom: 4.5, -// minZoom: 4.23, -// maxZoom: 22, // 【修改点1】增大最大缩放级别,允许用户继续滚轮放大 -// maxNativeZoom: 12, -// zoomSnap: 0.1, // 【修改点2】让缩放更平滑,不强制对齐整数 -// zoomDelta: 0.5, -// center: CENTER_positionCN, -// attributionControl: false, -// zoomControl: false, -// trackResize: true, -// maxBounds: bounds, -// maxBoundsViscosity: 1.0, -// wheelPxPerZoomLevel: 180, -// }); -// // ✅ 新增:可视化显示 maxBounds 范围 -// // L.rectangle(bounds, {color: "#ff7800", weight: 3, opacity: 0.8, fillOpacity: 0.1}) -// // .addTo(map) -// // .bindPopup("这是 maxBounds 的范围"); -// this.map = map; -// this.map.on('zoomend', (e: any) => { -// console.log('当前缩放级别', e.target.getZoom()); -// }); -// return Promise.resolve(map); -// } catch (e) { -// console.log('测试', e); -// return Promise.reject({}); -// } -// } -// addBaseDataLayer(layer: any): any { -// // The WMTS URL -// console.log(layer); -// switch (layer.type) { -// case 'wmts': -// if (layer.url) { -// console.log('https://211.99.26.225:18085' + layer.url); -// if (layer) { -// var ignLayer = L.tileLayer -// .wmts('https://211.99.26.225:18085/geoserver/gwc/service/wmts', { -// tileMatrixSet: 'EPSG:3857_qgc_qsj_arcgistiles_l13', -// tileSize: 256, //切片大小 -// maxZoom: 13, -// noWrap: true, -// opacity: 0.99, -// minZoom: 4, -// styles:{ -// abc:123 -// }, -// layer: 'qgc_qsj_arcgistiles_l13' -// }) -// .addTo(this.map) -// .bringToBack(); -// const registryKey = layer.key || layer.title; -// if (registryKey) { -// this.layerRegistry.set(registryKey, ignLayer); -// } -// layer._layer = ignLayer; -// layer._layer.layerGroup = overlayGroup; -// } -// } -// return layer; - -// case 'markers': -// this.getRain(layer); -// break; -// default: { -// return; -// } -// } -// } - -// baseLayerSwitcher(key: string) { -// if (!this.map) return; - -// console.log('切换底图 key:', key); - -// // 1. 如果当前已有底图且不是同一个,先移除 -// if (this.currentBaseLayerKey && this.currentBaseLayerKey !== key) { -// const oldLayer = this.layerRegistry.get(this.currentBaseLayerKey); -// if (oldLayer && this.map.hasLayer(oldLayer)) { -// this.map.removeLayer(oldLayer); -// console.log(`已移除旧底图: ${this.currentBaseLayerKey}`); -// } -// } - -// // 2. 检查新底图是否已存在 registry 中 -// let newLayer = this.layerRegistry.get(key); - -// // 3. 如果不存在,则创建并添加到地图和 registry -// if (!newLayer) { -// newLayer = this.createBaseLayerByKey(key); -// if (newLayer) { -// this.layerRegistry.set(key, newLayer); -// newLayer.addTo(this.map); -// // 确保底图在最底层 -// newLayer.bringToBack(); -// } -// } else { -// // 4. 如果已存在,直接添加(如果未添加) -// if (!this.map.hasLayer(newLayer)) { -// newLayer.addTo(this.map); -// newLayer.bringToBack(); -// } -// } - -// // 5. 更新当前激活的 Key -// if (newLayer) { -// this.currentBaseLayerKey = key; -// } -// } - -// /** -// * 根据 Key 创建具体的 Leaflet 图层实例 -// */ -// createBaseLayerByKey(key: string): L.Layer | null { -// console.log(key) -// const tdtToken = 'e90d56e5a09d1767899ad45846b0cefd' //企业版密钥,勿换e650f138c4481cca888cd13094bb9026 -// const mapType = 'w' //c:天地图经纬度底图;w:天地图墨卡托底图 -// const URL_TerTDT = `https://t0.tianditu.gov.cn/ter_${mapType}/wmts?tk=${tdtToken}` //terMap -// switch (key) { -// case 's_province_boundaries': -// // 假设这是之前的 WMTS 矢量图层 -// // 注意:原代码中硬编码了 URL 和 layer 名称,这里需要确保与实际服务对应 -// return L.tileLayer.wmts('https://211.99.26.225:18085/geoserver/gwc/service/wmts', { -// tileMatrixSet: 'EPSG:3857_qgc_qsj_arcgistiles_l13', -// tileSize: 256, -// // maxZoom: 13, -// noWrap: true, -// opacity: 1, -// minZoom: 4, -// zIndex: 1, -// layer: 'qgc_qsj_arcgistiles_l13', // 请确认此 layer 名称是否对应“矢量” -// format: 'image/png' -// }); - -// case 'BASEMAP-white': -// // 地形图示例 (使用 OpenStreetMap 或其他地形服务作为占位,请替换为实际地址) -// return L.tileLayer(`${URL_TerTDT}&SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=ter&STYLE=default&TILEMATRIXSET=${mapType}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}&FORMAT=tiles`, { -// // maxZoom: 17, -// format: "image/png", -// zIndex: 12, -// attribution: 'Map data: © OpenStreetMap contributors, SRTM | Map style: © OpenTopoMap (CC-BY-SA)' -// }); - -// case 'BASEMAP-img': -// // 影像图示例 (使用 Esri World Imagery 作为占位,请替换为实际地址) -// return L.tileLayer('https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}', { -// attribution: 'Tiles © Esri — Source: Esri, i-cubed, USDA, USGS, AEX, GeoEye, Getmapping, Aerogrid, IGN, IGP, UPR-EGP, and the GIS User Community' -// }); - -// default: -// console.warn(`未知的底图 Key: ${key}`); -// return null; -// } -// } - -// controlBaseLayerTreeShowAndHidden(layerType: String, key: String, checked: boolean) { -// // 优先使用 key 查找,如果没有 key 则尝试用 layerType -// // console.log(this.getAllLayers()) -// console.log(key) -// console.log(this.layerRegistry) -// const registryKey:any = key || layerType; -// const layerInstance = this.layerRegistry.get(registryKey); -// if (layerInstance) { -// if (checked) { -// // 显示:如果不在地图上,则添加 -// if (!this.map.hasLayer(layerInstance)) { -// layerInstance.addTo(this.map); -// } -// } else { -// // 隐藏:如果在地图上,则移除 -// if (this.map.hasLayer(layerInstance)) { -// this.map.removeLayer(layerInstance); -// } -// } -// } else { -// console.warn(`未找到标识为 ${registryKey} 的图层实例`); -// } -// } - -// /** -// * 添加初始化数据图层 -// * @param pointLayerObj 图层配置对象 (包含 data, key, checked 等属性) -// * @param layerType 图层类型/Key (如果 pointLayerObj 中有 key,则优先使用 obj.key) -// * @param mdoptions 描点选项配置 -// * @param legendArray 图例映射数据 (用于根据 anchoPointState 匹配图标) -// */ -// addInitDataLayer = (pointLayerObj: any, layerType?: any, mdoptions?: MDOptions, legendArray?: any) => { -// // 1. 参数校验与数据提取 -// if (!this.map || !pointLayerObj) { -// return; -// } - -// let dataArray: any[] = []; -// let targetLayerKey: string = layerType; - -// if (Array.isArray(pointLayerObj)) { -// dataArray = pointLayerObj; -// } else { -// dataArray = pointLayerObj.data || []; -// targetLayerKey = pointLayerObj.key || layerType; -// } - -// if (!targetLayerKey) { -// console.warn('缺少图层 Key,无法加载描点'); -// return; -// } - -// if (dataArray.length === 0) { -// const existingGroup = this.layerRegistry.get(targetLayerKey); -// if (existingGroup && existingGroup instanceof L.LayerGroup) { -// existingGroup.clearLayers(); -// } -// return; -// } - -// console.log(`开始加载图层 [${targetLayerKey}] 的描点,数量: ${dataArray.length}`); - -// // 2. 获取或创建该图层的 LayerGroup -// let layerGroup = this.layerRegistry.get(targetLayerKey); - -// const shouldClear = mdoptions?.isRemove !== false; - -// if (!layerGroup || !(layerGroup instanceof L.LayerGroup)) { -// if (layerGroup && this.map.hasLayer(layerGroup)) { -// this.map.removeLayer(layerGroup); -// } -// layerGroup = L.layerGroup(); -// this.layerRegistry.set(targetLayerKey, layerGroup); -// layerGroup.addTo(this.map); -// } else { -// if (shouldClear) { -// layerGroup.clearLayers(); -// } -// } - -// // 3. 遍历数据生成 Marker -// dataArray.forEach((item: any) => { -// const { lgtd, lttd, stcd, stnm, iconCode, anchoPointState, _id, titleName, ennm } = item; - -// if (lgtd == null || lttd == null) { -// return; -// } - -// // 4. 确定图标样式和文字 -// let iconUrl = ''; -// let iconSize = [15, 15]; - -// // 获取图标 URL -// if (iconCode) { -// iconUrl = getIconPath(iconCode); -// } else if (anchoPointState && legendArray) { -// const legendItem = legendArray[anchoPointState]; -// if (legendItem && legendItem.icon) { -// iconUrl = getIconPath(legendItem.icon); -// if (legendItem.width && legendItem.height) { -// iconSize = [legendItem.width, legendItem.height]; -// } -// } -// } - -// // 如果没有找到图标,使用默认或跳过 -// if (!iconUrl) { -// // 可以选择使用默认图标或者继续 -// iconUrl = getIconPath('default'); // 假设有一个默认图标 -// if(!iconUrl) return; -// } - -// // 5. 创建带文字的 DivIcon -// // 显示的文字优先使用 titleName,其次 ennm,最后 stnm -// const labelText = titleName || ennm || stnm || ''; - -// // 构建 HTML 结构:一个容器包含图片和文字 -// // 注意:这里使用内联样式简单演示,建议在实际项目中提取到 CSS 类中 -// const iconHtml = ` -//
-//
-// ${labelText} -//
-// -//
`; - -// const customIcon = L.divIcon({ -// html: iconHtml, -// className: '', // 重要:设置为空字符串以避免 Leaflet 默认样式干扰 -// iconSize: [iconSize[0], iconSize[1] + 20], // 高度增加以容纳文字 (假设文字高约20px) -// iconAnchor: [iconSize[0] / 2, iconSize[1] + 10], // 锚点设在图片底部中心 -// popupAnchor: [0, -(iconSize[1] + 20)] // 弹窗锚点设在整体顶部 -// }); - -// // 6. 创建 Marker -// const marker = L.marker([lttd, lgtd], { -// icon: customIcon, -// // @ts-ignore -// options: { -// ...item, -// layerKey: targetLayerKey, -// originalEvent: item -// } -// }); - -// // 7. 绑定点击事件 (如果需要) -// marker.on('click', (e: any) => { -// // 触发全局事件,例如: -// // GlobalEvents.get('map_dataLayer_click').set(item); -// console.log('Marker clicked:', item); -// }); - -// // 8. 将 Marker 添加到 LayerGroup -// layerGroup.addLayer(marker); -// }); - -// console.log(`图层 [${targetLayerKey}] 描点加载完成`); -// } -// getRain(data: any) { -// if (data?.geojson) { -// this.removeRainLayer(); -// this.removeLayermarkers(); -// const renderColor = (item: any, colRules: any) => { -// let color = 'rgba(0,0,0,0)'; -// colRules.map((rule: any, index: number) => { -// if ( -// item.properties.hvalue >= rule?.sv && -// item.properties.hvalue < rule?.ev -// ) { -// color = rule.colors; -// } -// if (index === colRules.length - 1) { -// if (item.properties.hvalue >= rule?.ev) { -// color = rule.colors; -// } -// } -// }); -// return color; -// }; - -// data.geojson.features.map((item: any, index: number) => { -// let pushlist = L.geoJSON(item, { -// style: { -// color: renderColor(item, data.colRules), -// weight: 2, -// opacity: 0.8, -// fillOpacity: 0.7 -// // fillColor: "#1D91C0", -// } -// }).addTo(this.map); -// this.layermarkers.push(pushlist); -// }); -// } -// } -// removeLayermarkers = () => { -// // console.log('layermarkers',layermarkers); - -// try { -// if (this.layermarkers.length > 0) { -// if (this.map.hasLayer(this.layermarkers)) { -// this.map.removeLayer(this.layermarkers); -// } else { -// console.log('移除图层失败,应已经移除'); -// } -// } -// // removeAllGeojson(map); -// } catch (e) { -// // message.info('移除图层失败') -// console.log('移除图层失败,是否应移除'); -// } -// }; - -// removeRainLayer(): void { -// console.log('test!删除Layer'); -// const _this = this; -// if (this.rainlayerslist.length > 0) { -// this.rainlayerslist.map((item: any) => { -// _this.map.removeLayer(item); -// }); -// this.rainlayerslist = []; -// } -// } // 缩放 -// zoomToggle(type: 'out' | 'in') { -// if (this.map) { -// if (type === 'out') { -// this.map && this.map.zoomOut(); -// } else { -// this.map && this.map.zoomIn(); -// } -// } -// } -// } diff --git a/frontend-sjgl/src/components/gis/map.ol.ts b/frontend-sjgl/src/components/gis/map.ol.ts deleted file mode 100644 index 61b66db6..00000000 --- a/frontend-sjgl/src/components/gis/map.ol.ts +++ /dev/null @@ -1,2616 +0,0 @@ -import { MapInterface } from './map'; -import OlMap from 'ol/Map'; -import View from 'ol/View'; -import Overlay from 'ol/Overlay'; -import TileLayer from 'ol/layer/Tile'; -import VectorLayer from 'ol/layer/Vector'; -import VectorSource from 'ol/source/Vector'; -import GeoJSON from 'ol/format/GeoJSON'; -import Style from 'ol/style/Style'; -import Fill from 'ol/style/Fill'; -import Stroke from 'ol/style/Stroke'; -import Icon from 'ol/style/Icon'; -import Text from 'ol/style/Text'; -import Circle from 'ol/style/Circle'; -import WMTS from 'ol/source/WMTS'; -import WMTSTileGrid from 'ol/tilegrid/WMTS'; -import { get as getProjection, fromLonLat } from 'ol/proj'; -import { - defaults as defaultInteractions, - Draw, - DoubleClickZoom, - DragPan -} from 'ol/interaction'; -import { getTopLeft, getWidth } from 'ol/extent'; -import MouseWheelZoom from 'ol/interaction/MouseWheelZoom'; -import { servers } from './mapurlManage'; -import { XYZ } from 'ol/source'; -import Feature from 'ol/Feature'; -import LineString from 'ol/geom/LineString'; -import Point from 'ol/geom/Point'; -import { - getLength as getSphericalLength, - getArea as getSphericalArea -} from 'ol/sphere'; -import { unByKey } from 'ol/Observable'; -import { MDOptions } from './map.class'; -import { useModelStore } from '@/store/modules/model'; -import { PointLayerManager } from './ol/point-layer-manager'; -import { PopupManager } from './ol/popup-manager'; -import { RegionMaskManager } from './ol/region-mask-manager'; -import { getNearbyPointDensityDisplayRules } from '@/modules/map/domain/nearby-point-rules'; -import router from '@/router'; - -const modelStore = useModelStore(); -const VITE_APP_MAP_URL = import.meta.env.VITE_APP_MAP_URL; - -// 定义与 leaflet 中相同的常量 -const CENTER_positionCN = [114.17112499999996, 38]; // OpenLayers 使用 [lon, lat] -const MIN_ZOOM = 4.23; -const MAX_ZOOM = 22; -const INITIAL_ZOOM = 4.5; -const BATCH_POPUP_MODE_ZOOM = 15; -const FULL_DISPLAY_NO_COLLISION_ZOOM = Number.POSITIVE_INFINITY; - -// 定义边界 [minX, minY, maxX, maxY] (Web Mercator 坐标) -const BOUNDS_SW = [26.5, -9.99999999999929]; -const BOUNDS_NE = [180.00000000000074, 60.06349386538693]; - -export class MapOl implements MapInterface { - map: OlMap | null = null; - view: View | null = null; - private layerRegistry: Map = new Map(); - private iconLoadState = new Map(); - private pointStyleCache = new Map(); - private baseLayerConfig: any | null = null; - private hydropBaseConfig: any | null = null; - private REGISTRY_KEY = 'customBaseLayer'; - private activeBaseLayerKey = 's_province_boundaries'; - private readonly rasterBaseLayerKeys = ['BASEMAP-white', 'BASEMAP-img']; - private drawInteraction: any = null; - private measureLayer: VectorLayer | null = null; - private measureSource: VectorSource | null = null; - private pointLayerManager: PointLayerManager; - geoJsonData: any = null; - geoJsonData1: any = null; - private BASEID = ''; - private currentClipGeoJson: any | null = null; - private clipRequestController: AbortController | null = null; - private hoveredFeatureId: string | number | null = null; - private popupManager: PopupManager; - private regionMaskManager: RegionMaskManager; - private isBatchPopupMode = false; - private batchPopupRefreshFrameId: number | null = null; - private batchPopupPendingRebuild = false; - private batchPopupPostRenderListenerKey: any = null; - private pointLayerStyleRefreshFrameId: number | null = null; - private labelVisibilityRefreshFrameId: number | null = null; - private labelVisibilityDebounceTimerId: number | null = null; - constructor() { - this.pointLayerManager = new PointLayerManager({ - map: null, - createStyle: feature => this.createPointStyle(feature) - }); - this.popupManager = new PopupManager({ - map: null, - getPointLayers: () => this.pointLayerManager.getLayers() - }); - this.regionMaskManager = new RegionMaskManager({ - map: null, - view: null, - pointLayerManager: this.pointLayerManager, - defaultCenter: CENTER_positionCN as [number, number], - defaultZoom: INITIAL_ZOOM - }); - } - private async loadGeoJsonData(url, signal?: AbortSignal): Promise { - try { - const response = await fetch(url, { signal }); - if (!response.ok) { - throw new Error(`HTTP error! status: ${response.status}`); - } - const data = await response.json(); - return data; - } catch (error: any) { - if (error.name !== 'AbortError') { - console.error('配置加载失败:', error); - } - } - } - //地图初始化 - init(container: HTMLElement): Promise { - try { - const minCoordinate = fromLonLat(BOUNDS_SW); - const maxCoordinate = fromLonLat(BOUNDS_NE); - const extent = [ - minCoordinate[0], - minCoordinate[1], - maxCoordinate[0], - maxCoordinate[1] - ]; - - this.view = new View({ - center: fromLonLat(CENTER_positionCN), // 设置中心点 - zoom: INITIAL_ZOOM, - minZoom: MIN_ZOOM, - maxZoom: MAX_ZOOM, - constrainOnlyCenter: false, // 允许部分视图超出边界,但中心点受限(类似 Leaflet 默认行为) - extent: extent, // 限制视图范围 - smoothExtentConstraint: false // 平滑边界约束 - }); - - const mouseWheelInteraction = new MouseWheelZoom({ - duration: 100, // 缩放动画持续时间 (ms),Leaflet 默认也有动画 - maxDelta: 2, - constrainResolution: false // ✅ 关键:false 允许缩放到非整数级别 (如 4.5, 4.6),实现平滑缩放 - }); - - this.map = new OlMap({ - target: container, - layers: [], - view: this.view, - controls: [], // 对应 Leaflet 的 attributionControl: false, zoomControl: false - interactions: defaultInteractions({ - doubleClickZoom: true, - dragPan: false, - - pinchRotate: false // 通常禁用旋转,除非需要 - }).extend([ - new DragPan({ - kinetic: undefined - }), - mouseWheelInteraction - ]) - }); - this.pointLayerManager.setMap(this.map); - this.popupManager.setMap(this.map); - this.regionMaskManager.setContext(this.map, this.view); - - this.view.on('change:resolution', () => { - this.handleZoomChange(); - }); - this.map.on('click', evt => { - if ( - router.currentRoute.value.path.includes( - 'shengTaiLiuLiangManZuQingKuangJiangJu' - ) - ) { - return; - } - this.popupManager.showPopup(undefined, undefined); - this.popupManager.handleMapClick(evt.pixel, detectedFeature => { - if (detectedFeature.values_.sttpMap == 'ylfb') { - modelStore.ylfbModalVisible = true; - modelStore.params = detectedFeature.values_; - } else { - modelStore.modalVisible = true; - modelStore.params = detectedFeature.values_; - modelStore.title = - detectedFeature.values_.titleName || - detectedFeature.values_.stnm + ' 详情信息'; - } - }); - }); - - this.map.on('pointermove', evt => { - this.popupManager.handlePointerMove(evt.pixel, payload => { - this.hoveredFeatureId = payload.hoveredId; - - const targetElement = this.map?.getTargetElement() as HTMLElement; - if (targetElement) { - targetElement.style.cursor = payload.hoveredId ? 'pointer' : ''; - } - - // 批量 popup 模式下不触发 hover popup - if (!this.isBatchPopupMode) { - this.showPopup(payload.detectedFeature, payload.coordinate); - } - }); - }); - - this.map.on('pointerdrag', () => { - if (this.isBatchPopupMode) { - this.ensureBatchPopupPostRenderSync(); - } - }); - this.map.on('moveend', () => { - this.clearBatchPopupPostRenderSync(); - this.requestRefreshPointLabelVisibility(false, 60); - if (this.isBatchPopupMode) { - this.requestUpdateBatchPopups(false, true); - } - }); - - return Promise.resolve(this.map); - } catch (e) { - console.error('OL Init Error', e); - return Promise.reject(e); - } - } - - /** - * 初始化加载描点数据 - * @param pointData 图层配置对象或数据数组 - * @param layerType 图层类型/Key - * @param mdoptions 描点选项配置 - */ - addInitDataLayer( - pointData: any, - layerType: any, - _mdoptions?: MDOptions - ): void { - this.pointLayerManager.addDataLayer(pointData, layerType); - - if (this.currentClipGeoJson) { - this.regionMaskManager.filterPointsByRegion(this.currentClipGeoJson); - } - - const currentZoom = this.view ? this.view.getZoom() : INITIAL_ZOOM; - this.pointLayerManager.updateNearbyFeatureLayout(currentZoom); - this.requestRefreshPointLabelVisibility(false, 80); - } - /** - * 初始化 Popup Overlay - * @param container 父组件传入的 DOM 容器 - */ - initPopupOverlay(container: HTMLElement) { - this.popupManager.initPopupOverlay(container); - } - /** - * 在指定像素位置检测要素(共享方法) - * @param pixel 像素坐标 - * @returns 检测到的要素和是否命中图标区域 - */ - private detectFeatureAtPixel(pixel: number[]): { - detectedFeature: Feature | undefined; - isHitIcon: boolean; - coordinate?: number[]; - } { - return this.popupManager.detectFeatureAtPixel(pixel); - } - - /** - * 在 pointermove 中调用此方法显示/隐藏 Popup - * @param feature 当前悬停的要素 - * @param coordinate 地理坐标 - */ - showPopup(feature: Feature | undefined, coordinate: number[] | undefined) { - this.popupManager.showPopup(feature, coordinate); - } - - /** - * 监听缩放层级变化,到达指定层级时自动显示可视区域内所有锚点的 popup - */ - private handleZoomChange() { - if (!this.view) return; - - const zoom = this.view.getZoom(); - if (zoom === undefined) return; - - this.pointLayerManager.updateNearbyFeatureLayout(zoom); - this.requestRefreshPointLabelVisibility(); - - if (zoom >= BATCH_POPUP_MODE_ZOOM) { - this.enableBatchPopupMode(); - } else { - this.disableBatchPopupMode(); - } - } - - /** - * 启用批量 popup 模式:自动显示可视区域内所有锚点的 popup - */ - private enableBatchPopupMode() { - this.isBatchPopupMode = true; - this.clearBatchPopupPostRenderSync(); - this.popupManager.clearBatchPopups(); - this.requestUpdateBatchPopups(true, true); - } - - /** - * 禁用批量 popup 模式:恢复鼠标悬停显示 popup - */ - private disableBatchPopupMode() { - this.isBatchPopupMode = false; - this.batchPopupPendingRebuild = false; - this.clearBatchPopupPostRenderSync(); - if (this.batchPopupRefreshFrameId !== null) { - cancelAnimationFrame(this.batchPopupRefreshFrameId); - this.batchPopupRefreshFrameId = null; - } - this.popupManager.clearBatchPopups(); - this.popupManager.showPopup(undefined, undefined); - } - - /** - * 更新批量显示的 popups(拖动地图后调用) - */ - private updateBatchPopups() { - const features = this.pointLayerManager.getFeaturesInViewport(); - // 传入样式检查器,过滤掉 declutter/距离过滤等隐藏的锚点 - this.popupManager.showPopupsForFeatures( - features, - feature => { - const style = this.createPointStyle(feature); - return style !== null; - }, - { - rebuild: this.batchPopupPendingRebuild - } - ); - } - - private ensureBatchPopupPostRenderSync() { - if (!this.map || this.batchPopupPostRenderListenerKey) { - return; - } - - this.batchPopupPostRenderListenerKey = this.map.on('postrender', () => { - if (!this.isBatchPopupMode) { - return; - } - this.popupManager.updateBatchPopupPositions(feature => { - const style = this.createPointStyle(feature); - return style !== null; - }); - }); - } - - private clearBatchPopupPostRenderSync() { - if (this.batchPopupPostRenderListenerKey) { - unByKey(this.batchPopupPostRenderListenerKey); - this.batchPopupPostRenderListenerKey = null; - } - } - /** - * 创建点样式 (模拟 Leaflet 的 DivIcon 效果,支持随缩放动态调整大小) - */ - private createPointStyle(feature: Feature): Style[] | null { - const iconUrl = feature.get('_iconUrl') as string; - const labelText = feature.get('_labelText') as string; - const legendVisible = feature.get('_legendVisible'); - const regionVisible = feature.get('_regionVisible'); - - if (!iconUrl) { - return null; - } - - if (!this.ensureIconReady(iconUrl)) { - return null; - } - - const currentZoom: any = this.view ? this.view.getZoom() : 4.5; - const cachedDensityVisible = feature.get('_densityVisible'); - const densityVisible = - typeof cachedDensityVisible === 'boolean' - ? cachedDensityVisible - : currentZoom >= this.getFeatureDensityMinZoom(feature); - const iconTargetVisible = - legendVisible !== false && - regionVisible !== false && - densityVisible && - this.shouldRenderNearbyFeature(); - - const dynamicScale = this.getDynamicPointScale(currentZoom); - const fontSize = this.getPointFontSize(dynamicScale); - const engPriority = this.getFeatureEngRenderPriority(feature); - const formattedLabelText = this.formatPointLabelText(labelText); - const labelLineCount = formattedLabelText - ? formattedLabelText.split('\n').length - : 1; - const labelOffsetY = this.getPointLabelRenderOffsetY( - dynamicScale, - labelLineCount - ); - const iconCollisionVisible = feature.get('_iconCollisionVisible') !== false; - const labelCollisionVisible = - feature.get('_labelCollisionVisible') === true; - const finalIconVisible = iconTargetVisible && iconCollisionVisible; - const labelTargetVisible = - !this.isBatchPopupMode && - finalIconVisible && - !!formattedLabelText && - labelCollisionVisible; - - if (!finalIconVisible) { - return null; - } - - const styleCacheKey = [ - iconUrl, - dynamicScale.toFixed(2), - fontSize, - engPriority, - labelOffsetY, - labelTargetVisible ? formattedLabelText : '', - labelTargetVisible ? 1 : 0 - ].join('|'); - const cachedStyles = this.pointStyleCache.get(styleCacheKey); - if (cachedStyles) { - return cachedStyles; - } - - const styles: Style[] = [ - new Style({ - zIndex: engPriority, - image: new Icon({ - src: iconUrl, - scale: dynamicScale, - anchor: [0.5, 0.5], - crossOrigin: 'anonymous', - declutterMode: 'none' - }) - }) - ]; - - if (formattedLabelText && labelTargetVisible) { - styles.push( - new Style({ - zIndex: engPriority + 1, - text: new Text({ - text: formattedLabelText, - offsetY: labelOffsetY, - font: `${fontSize}px sans-serif`, - fill: new Fill({ color: '#fff' }), - stroke: new Stroke({ - color: 'rgba(0, 0, 0, 0.9)', - width: 2 - }), - textAlign: 'center', - declutterMode: 'none' - }) - }) - ); - } - - this.pointStyleCache.set(styleCacheKey, styles); - return styles; - } - - private markFeatureVisibilityDirty( - feature: Feature, - key: '_densityVisible' | '_iconCollisionVisible' | '_labelCollisionVisible', - visible: boolean, - dirtyLayerKeys?: Set - ) { - if (feature.get(key) === visible) { - return; - } - - feature.set(key, visible, true); - const layerKey = feature.get('_layerKey'); - if (dirtyLayerKeys && layerKey) { - dirtyLayerKeys.add(String(layerKey)); - } - } - - private flushDirtyPointLayers(dirtyLayerKeys: Set) { - dirtyLayerKeys.forEach(layerKey => { - const layer = this.pointLayerManager.getLayer(layerKey); - layer?.changed(); - }); - } - - private syncFeatureDensityVisible( - feature: Feature, - visible: boolean, - dirtyLayerKeys?: Set - ) { - this.markFeatureVisibilityDirty( - feature, - '_densityVisible', - visible, - dirtyLayerKeys - ); - } - - private getFeaturePixelGridKey( - layerKey: string, - pixelX: number, - pixelY: number, - cellSize: number - ) { - return `${layerKey}:${Math.floor(pixelX / cellSize)}:${Math.floor( - pixelY / cellSize - )}`; - } - - private hasNearbyViewportFeature( - target: { - feature: Feature; - layerKey: string; - pixelX: number; - pixelY: number; - }, - pixelGrid: Map< - string, - Array<{ - feature: Feature; - layerKey: string; - pixelX: number; - pixelY: number; - }> - >, - threshold: number - ): boolean { - const cellX = Math.floor(target.pixelX / threshold); - const cellY = Math.floor(target.pixelY / threshold); - - for (let offsetX = -1; offsetX <= 1; offsetX += 1) { - for (let offsetY = -1; offsetY <= 1; offsetY += 1) { - const bucket = pixelGrid.get( - `${target.layerKey}:${cellX + offsetX}:${cellY + offsetY}` - ); - if (!bucket?.length) { - continue; - } - - for (const candidate of bucket) { - if (candidate.feature === target.feature) { - continue; - } - if ( - Math.hypot( - candidate.pixelX - target.pixelX, - candidate.pixelY - target.pixelY - ) <= threshold - ) { - return true; - } - } - } - } - - return false; - } - - private getCollisionGridKeys( - rect: { left: number; right: number; top: number; bottom: number }, - cellSize: number - ): string[] { - const startX = Math.floor(rect.left / cellSize); - const endX = Math.floor(rect.right / cellSize); - const startY = Math.floor(rect.top / cellSize); - const endY = Math.floor(rect.bottom / cellSize); - const keys: string[] = []; - - for (let x = startX; x <= endX; x += 1) { - for (let y = startY; y <= endY; y += 1) { - keys.push(`${x}:${y}`); - } - } - - return keys; - } - - private addRectToCollisionGrid< - T extends { - left: number; - right: number; - top: number; - bottom: number; - } - >(rect: T, grid: Map, cellSize: number) { - this.getCollisionGridKeys(rect, cellSize).forEach(key => { - const bucket = grid.get(key) || []; - bucket.push(rect); - grid.set(key, bucket); - }); - } - - private findCollidingRectInGrid< - T extends { - left: number; - right: number; - top: number; - bottom: number; - } - >( - rect: { left: number; right: number; top: number; bottom: number }, - grid: Map, - cellSize: number, - isCollision: (candidate: T) => boolean - ): T | undefined { - for (const key of this.getCollisionGridKeys(rect, cellSize)) { - const bucket = grid.get(key); - if (!bucket?.length) { - continue; - } - - for (const candidate of bucket) { - if (isCollision(candidate)) { - return candidate; - } - } - } - - return undefined; - } - - private refreshPointLabelVisibility() { - if (!this.map || !this.view) return; - - const currentZoom = this.view.getZoom(); - if (currentZoom === undefined) return; - - const candidateMap = new Map< - string, - { - feature: Feature; - iconLeft: number; - iconRight: number; - iconTop: number; - iconBottom: number; - hasLabel: boolean; - left: number; - right: number; - top: number; - bottom: number; - priority: number; - engPriority: number; - densityPriority: number; - id: string; - pixelX: number; - pixelY: number; - } - >(); - const candidates: Array<{ - feature: Feature; - iconLeft: number; - iconRight: number; - iconTop: number; - iconBottom: number; - hasLabel: boolean; - left: number; - right: number; - top: number; - bottom: number; - priority: number; - engPriority: number; - densityPriority: number; - id: string; - pixelX: number; - pixelY: number; - }> = []; - - const viewportFeatures = this.pointLayerManager.getFeaturesInViewport(); - const dirtyLayerKeys = new Set(); - const densityIsolationThreshold = 56; - const densityPixelGrid = new Map< - string, - Array<{ - feature: Feature; - layerKey: string; - pixelX: number; - pixelY: number; - }> - >(); - const viewportEntries: Array<{ - feature: Feature; - layerKey: string; - iconUrl: string; - legendVisible: boolean; - regionVisible: boolean; - densityPriority: number; - nearbyVisible: boolean; - labelText: string; - pixelX?: number; - pixelY?: number; - }> = []; - - viewportFeatures.forEach(feature => { - const geometry = feature.getGeometry(); - const pixel = - geometry && geometry.getType() === 'Point' - ? this.map?.getPixelFromCoordinate( - (geometry as Point).getCoordinates() - ) - : null; - const layerKey = String(feature.get('_layerKey') || ''); - const entry = { - feature, - layerKey, - iconUrl: String(feature.get('_iconUrl') || ''), - legendVisible: feature.get('_legendVisible') !== false, - regionVisible: feature.get('_regionVisible') !== false, - densityPriority: this.getFeatureDensityPriority(feature), - nearbyVisible: this.shouldRenderNearbyFeature(), - labelText: this.formatPointLabelText( - feature.get('_labelText') as string - ), - pixelX: pixel?.[0], - pixelY: pixel?.[1] - }; - viewportEntries.push(entry); - - if ( - pixel && - entry.layerKey && - entry.legendVisible && - entry.regionVisible - ) { - const gridKey = this.getFeaturePixelGridKey( - entry.layerKey, - pixel[0], - pixel[1], - densityIsolationThreshold - ); - const bucket = densityPixelGrid.get(gridKey) || []; - bucket.push({ - feature, - layerKey: entry.layerKey, - pixelX: pixel[0], - pixelY: pixel[1] - }); - densityPixelGrid.set(gridKey, bucket); - } - }); - - if (currentZoom >= FULL_DISPLAY_NO_COLLISION_ZOOM) { - viewportEntries.forEach(entry => { - const minZoom = this.getFeatureDensityMinZoom(entry.feature); - const densityVisible = - currentZoom >= minZoom || - (entry.legendVisible && - entry.regionVisible && - !!entry.layerKey && - entry.pixelX !== undefined && - entry.pixelY !== undefined && - !this.hasNearbyViewportFeature( - { - feature: entry.feature, - layerKey: entry.layerKey, - pixelX: entry.pixelX, - pixelY: entry.pixelY - }, - densityPixelGrid, - densityIsolationThreshold - )); - this.syncFeatureDensityVisible( - entry.feature, - densityVisible, - dirtyLayerKeys - ); - const shouldRenderIcon = - !!entry.iconUrl && - this.isIconReady(entry.iconUrl) && - entry.legendVisible && - entry.regionVisible && - densityVisible && - entry.nearbyVisible; - const hasLabel = !!entry.labelText; - - this.syncFeatureIconCollisionVisible( - entry.feature, - shouldRenderIcon, - dirtyLayerKeys - ); - this.syncFeatureLabelCollisionVisible( - entry.feature, - shouldRenderIcon && hasLabel, - dirtyLayerKeys - ); - }); - this.flushDirtyPointLayers(dirtyLayerKeys); - return; - } - - viewportEntries.forEach(entry => { - const minZoom = this.getFeatureDensityMinZoom(entry.feature); - const densityVisible = - currentZoom >= minZoom || - (entry.legendVisible && - entry.regionVisible && - !!entry.layerKey && - entry.pixelX !== undefined && - entry.pixelY !== undefined && - !this.hasNearbyViewportFeature( - { - feature: entry.feature, - layerKey: entry.layerKey, - pixelX: entry.pixelX, - pixelY: entry.pixelY - }, - densityPixelGrid, - densityIsolationThreshold - )); - this.syncFeatureDensityVisible( - entry.feature, - densityVisible, - dirtyLayerKeys - ); - - const shouldRenderIcon = - !!entry.iconUrl && - this.isIconReady(entry.iconUrl) && - entry.legendVisible && - entry.regionVisible && - densityVisible && - entry.nearbyVisible; - - if (!shouldRenderIcon) { - this.syncFeatureIconCollisionVisible( - entry.feature, - false, - dirtyLayerKeys - ); - this.syncFeatureLabelCollisionVisible( - entry.feature, - false, - dirtyLayerKeys - ); - return; - } - - if (entry.pixelX === undefined || entry.pixelY === undefined) { - this.syncFeatureIconCollisionVisible( - entry.feature, - false, - dirtyLayerKeys - ); - this.syncFeatureLabelCollisionVisible( - entry.feature, - false, - dirtyLayerKeys - ); - return; - } - - const dynamicScale = this.getDynamicPointScale(currentZoom); - // 备注:图标碰撞盒适当小于视觉图标尺寸,允许相邻站点轻微贴近显示, - // 避免像“小浪底/三门峡”这类近点被过早裁掉成只剩一个点。 - const iconCollisionSize = Math.max(14, 24 * dynamicScale); - const iconPadding = 0; - const iconLeft = entry.pixelX - iconCollisionSize / 2 - iconPadding; - const iconRight = entry.pixelX + iconCollisionSize / 2 + iconPadding; - const iconTop = entry.pixelY - iconCollisionSize / 2 - iconPadding; - const iconBottom = entry.pixelY + iconCollisionSize / 2 + iconPadding; - const labelText = entry.labelText; - const fontSize = this.getPointFontSize(dynamicScale); - const lines = labelText ? labelText.split('\n') : ['']; - const maxLineLength = Math.max(...lines.map(line => line.length), 1); - const labelLineCount = lines.length; - const labelOffsetY = this.getPointLabelCollisionOffsetY( - dynamicScale, - labelLineCount - ); - const estimatedWidth = maxLineLength * fontSize * 0.6 + 16; - const estimatedHeight = labelLineCount * (fontSize + 4) + 8; - const centerX = entry.pixelX; - const centerY = entry.pixelY + labelOffsetY; - const candidateId = String( - entry.feature.getId?.() || entry.feature.get('stcd') || '' - ); - const dedupeKey = - candidateId || - [ - entry.feature.get('_layerKey') || '', - entry.pixelX.toFixed(2), - entry.pixelY.toFixed(2), - labelText - ].join('|'); - - candidateMap.set(dedupeKey, { - feature: entry.feature, - iconLeft, - iconRight, - iconTop, - iconBottom, - hasLabel: !!labelText, - left: centerX - estimatedWidth / 2, - right: centerX + estimatedWidth / 2, - top: centerY - estimatedHeight / 2, - bottom: centerY + estimatedHeight / 2, - priority: Number(entry.feature.get('_nearbyPriority') || 9999), - engPriority: this.getFeatureEngRenderPriority(entry.feature), - densityPriority: entry.densityPriority, - id: candidateId, - pixelX: entry.pixelX, - pixelY: entry.pixelY - }); - }); - - candidateMap.forEach(candidate => { - candidates.push(candidate); - }); - - candidates.sort((left, right) => { - if (left.engPriority !== right.engPriority) { - return right.engPriority - left.engPriority; - } - if (left.priority !== right.priority) { - return left.priority - right.priority; - } - if (left.densityPriority !== right.densityPriority) { - return left.densityPriority - right.densityPriority; - } - if (left.pixelY !== right.pixelY) { - return left.pixelY - right.pixelY; - } - return left.id.localeCompare(right.id); - }); - - const placedIconRects: Array<{ - featureId: string; - left: number; - right: number; - top: number; - bottom: number; - }> = []; - const placedIconGrid = new Map< - string, - Array<{ - featureId: string; - left: number; - right: number; - top: number; - bottom: number; - }> - >(); - const placedLabelRects: Array<{ - featureId: string; - left: number; - right: number; - top: number; - bottom: number; - }> = []; - const placedLabelGrid = new Map< - string, - Array<{ - featureId: string; - left: number; - right: number; - top: number; - bottom: number; - }> - >(); - const collisionGridCellSize = 96; - - candidates.forEach(candidate => { - const featureId = String( - candidate.feature.getId?.() || candidate.feature.get('stcd') || '' - ); - const iconRect = { - left: candidate.iconLeft, - right: candidate.iconRight, - top: candidate.iconTop, - bottom: candidate.iconBottom - }; - const iconHasCollision = !!this.findCollidingRectInGrid( - iconRect, - placedIconGrid, - collisionGridCellSize, - rect => this.checkLabelCollision(rect, iconRect) - ); - const iconVisible = !iconHasCollision; - this.syncFeatureIconCollisionVisible( - candidate.feature, - iconVisible, - dirtyLayerKeys - ); - - if (iconVisible) { - placedIconRects.push({ - featureId, - left: iconRect.left, - right: iconRect.right, - top: iconRect.top, - bottom: iconRect.bottom - }); - this.addRectToCollisionGrid( - placedIconRects[placedIconRects.length - 1], - placedIconGrid, - collisionGridCellSize - ); - } - }); - - const labelCandidates = [...candidates].sort((left, right) => { - if (left.engPriority !== right.engPriority) { - return right.engPriority - left.engPriority; - } - if (left.priority !== right.priority) { - return left.priority - right.priority; - } - if (left.pixelY !== right.pixelY) { - return left.pixelY - right.pixelY; - } - if (left.pixelX !== right.pixelX) { - return left.pixelX - right.pixelX; - } - return left.id.localeCompare(right.id); - }); - - labelCandidates.forEach(candidate => { - const featureId = String( - candidate.feature.getId?.() || candidate.feature.get('stcd') || '' - ); - const iconVisible = - candidate.feature.get('_iconCollisionVisible') !== false; - if (!candidate.hasLabel) { - this.syncFeatureLabelCollisionVisible( - candidate.feature, - false, - dirtyLayerKeys - ); - return; - } - if (!iconVisible) { - this.syncFeatureLabelCollisionVisible( - candidate.feature, - false, - dirtyLayerKeys - ); - return; - } - - const collidingIconRect = this.findCollidingRectInGrid( - candidate, - placedIconGrid, - collisionGridCellSize, - rect => - rect.featureId !== featureId && - this.checkLabelCollisionWithIcon(rect, candidate) - ); - const hasCollisionWithIcon = !!collidingIconRect; - const collidingLabelRect = this.findCollidingRectInGrid( - candidate, - placedLabelGrid, - collisionGridCellSize, - rect => this.checkLabelCollision(rect, candidate) - ); - const hasCollisionWithLabel = !!collidingLabelRect; - const visible = !hasCollisionWithIcon && !hasCollisionWithLabel; - - this.syncFeatureLabelCollisionVisible( - candidate.feature, - visible, - dirtyLayerKeys - ); - - if (visible) { - placedLabelRects.push({ - featureId, - left: candidate.left, - right: candidate.right, - top: candidate.top, - bottom: candidate.bottom - }); - this.addRectToCollisionGrid( - placedLabelRects[placedLabelRects.length - 1], - placedLabelGrid, - collisionGridCellSize - ); - } - }); - this.flushDirtyPointLayers(dirtyLayerKeys); - } - - private requestRefreshPointLabelVisibility( - immediate = false, - debounceMs = 0 - ) { - if (this.labelVisibilityDebounceTimerId !== null) { - window.clearTimeout(this.labelVisibilityDebounceTimerId); - this.labelVisibilityDebounceTimerId = null; - } - - if (immediate) { - if (this.labelVisibilityRefreshFrameId !== null) { - cancelAnimationFrame(this.labelVisibilityRefreshFrameId); - this.labelVisibilityRefreshFrameId = null; - } - this.refreshPointLabelVisibility(); - return; - } - - if (debounceMs > 0) { - this.labelVisibilityDebounceTimerId = window.setTimeout(() => { - this.labelVisibilityDebounceTimerId = null; - this.requestRefreshPointLabelVisibility(); - }, debounceMs); - return; - } - - if (this.labelVisibilityRefreshFrameId !== null) { - return; - } - - this.labelVisibilityRefreshFrameId = window.requestAnimationFrame(() => { - this.labelVisibilityRefreshFrameId = null; - this.refreshPointLabelVisibility(); - }); - } - - private syncFeatureIconCollisionVisible( - feature: Feature, - visible: boolean, - dirtyLayerKeys?: Set - ) { - this.markFeatureVisibilityDirty( - feature, - '_iconCollisionVisible', - visible, - dirtyLayerKeys - ); - } - - private syncFeatureLabelCollisionVisible( - feature: Feature, - visible: boolean, - dirtyLayerKeys?: Set - ) { - this.markFeatureVisibilityDirty( - feature, - '_labelCollisionVisible', - visible, - dirtyLayerKeys - ); - } - - private isIconReady(iconUrl: string): boolean { - return this.iconLoadState.get(iconUrl) === 'loaded'; - } - - private ensureIconReady(iconUrl: string): boolean { - if (!iconUrl) { - return false; - } - - const status = this.iconLoadState.get(iconUrl); - if (status === 'loaded') { - return true; - } - if (status === 'loading' || status === 'error') { - return false; - } - - this.iconLoadState.set(iconUrl, 'loading'); - const image = new Image(); - image.crossOrigin = 'anonymous'; - image.onload = () => { - this.iconLoadState.set(iconUrl, 'loaded'); - this.requestRefreshPointLayerStyles(); - }; - image.onerror = () => { - this.iconLoadState.set(iconUrl, 'error'); - this.requestRefreshPointLayerStyles(); - }; - image.src = iconUrl; - - if (image.complete && image.naturalWidth > 0) { - this.iconLoadState.set(iconUrl, 'loaded'); - return true; - } - - return false; - } - - private requestRefreshPointLayerStyles() { - if (this.pointLayerStyleRefreshFrameId !== null) { - return; - } - - this.pointLayerStyleRefreshFrameId = window.requestAnimationFrame(() => { - this.pointLayerStyleRefreshFrameId = null; - this.refreshPointLayerStyles(); - }); - } - - private refreshPointLayerStyles() { - this.pointLayerManager.forEachLayer(layer => { - layer.changed(); - }); - this.requestRefreshPointLabelVisibility(); - if (this.isBatchPopupMode) { - this.requestUpdateBatchPopups(); - } - } - - private requestUpdateBatchPopups(immediate = false, rebuild = true) { - if (!this.isBatchPopupMode) { - return; - } - this.batchPopupPendingRebuild = this.batchPopupPendingRebuild || rebuild; - - if (immediate) { - if (this.batchPopupRefreshFrameId !== null) { - cancelAnimationFrame(this.batchPopupRefreshFrameId); - this.batchPopupRefreshFrameId = null; - } - this.updateBatchPopups(); - this.batchPopupPendingRebuild = false; - return; - } - - if (this.batchPopupRefreshFrameId !== null) { - return; - } - - this.batchPopupRefreshFrameId = window.requestAnimationFrame(() => { - this.batchPopupRefreshFrameId = null; - if (!this.isBatchPopupMode) { - return; - } - this.updateBatchPopups(); - this.batchPopupPendingRebuild = false; - }); - } - - private checkLabelCollision( - left: { left: number; right: number; top: number; bottom: number }, - right: { left: number; right: number; top: number; bottom: number } - ) { - const padding = 4; - return !( - left.right + padding < right.left || - left.left - padding > right.right || - left.bottom + padding < right.top || - left.top - padding > right.bottom - ); - } - - private checkLabelCollisionWithIcon( - iconRect: { left: number; right: number; top: number; bottom: number }, - labelRect: { left: number; right: number; top: number; bottom: number } - ) { - // 标签避让图标时仅保留图标中心更小的保护区,并允许边缘接触不算碰撞, - // 避免像“三峡/黄龙滩”这类仅在边界轻微擦到时把文字过度压掉。 - const inset = 4; - const padding = 0; - const narrowedIconRect = { - left: iconRect.left + inset, - right: iconRect.right - inset, - top: iconRect.top + inset, - bottom: iconRect.bottom - inset - }; - - return !( - narrowedIconRect.right + padding <= labelRect.left || - narrowedIconRect.left - padding >= labelRect.right || - narrowedIconRect.bottom + padding <= labelRect.top || - narrowedIconRect.top - padding >= labelRect.bottom - ); - } - - /** - * 点位标注最多显示两行,每行 12 个字符;超出部分在第二行末尾显示省略号。 - */ - private formatPointLabelText(text: string): string { - const normalizedText = String(text || '') - .replace(/[()()]/g, '') - .trim(); - if (!normalizedText) { - return ''; - } - - const maxLineLength = 12; - if (normalizedText.length <= maxLineLength) { - return normalizedText; - } - - const firstLine = normalizedText.slice(0, maxLineLength); - if (normalizedText.length <= maxLineLength * 2) { - return `${firstLine}\n${normalizedText.slice(maxLineLength)}`; - } - - const secondLine = `${normalizedText.slice( - maxLineLength, - maxLineLength + 9 - )}...`; - return `${firstLine}\n${secondLine}`; - } - - /** - * 根据缩放级别计算锚点图标缩放比例,统一复用,减少样式函数中的重复判断。 - */ - private getDynamicPointScale(currentZoom: number): number { - let dynamicScale = 0.7 + (currentZoom - 4.5) * 0.08; - dynamicScale = Math.max(0.5, Math.min(3.0, dynamicScale)); - return dynamicScale; - } - - /** - * 根据图标缩放比例统一计算文字字号,避免样式函数中散落重复计算。 - */ - private getPointFontSize(dynamicScale: number): number { - return Math.max(10, Math.min(24, 12 * dynamicScale)); - } - - /** - * 统一计算标签渲染时的纵向偏移,保持视觉位置与原效果一致。 - */ - private getPointLabelRenderOffsetY( - dynamicScale: number, - labelLineCount: number - ): number { - return labelLineCount > 1 ? -30 * dynamicScale : -22 * dynamicScale; - } - - /** - * 统一计算标签碰撞时的纵向偏移。 - * 这里允许比视觉位置略高一点,避免相邻点图标过早压掉主标签。 - */ - private getPointLabelCollisionOffsetY( - dynamicScale: number, - labelLineCount: number - ): number { - return labelLineCount > 1 ? -36 * dynamicScale : -28 * dynamicScale; - } - - /** - * distance 字段表示点位密度分档,不是物理距离。 - * 这里仅用它决定点位从哪个缩放级别开始参与显示候选。 - */ - private getFeatureDensityValue(feature: Feature): number | null { - const rawDistance = feature.get('distance'); - if ( - rawDistance === undefined || - rawDistance === null || - rawDistance === '' - ) { - return null; - } - const densityValue = Number(rawDistance); - return Number.isFinite(densityValue) ? densityValue : null; - } - - private getFeatureDensityPriority(feature: Feature): number { - const densityValue = this.getFeatureDensityValue(feature); - const densityDisplayRules = getNearbyPointDensityDisplayRules(); - if (densityValue === null) { - return densityDisplayRules.length; - } - - const matchedRuleIndex = densityDisplayRules.findIndex(rule => { - return densityValue >= rule.minDensityValue; - }); - return matchedRuleIndex >= 0 - ? matchedRuleIndex - : densityDisplayRules.length; - } - - private getFeatureDensityMinZoom(feature: Feature): number { - const densityValue = this.getFeatureDensityValue(feature); - if (densityValue === null) { - return 0; - } - - const densityDisplayRules = getNearbyPointDensityDisplayRules(); - const matchedRule = densityDisplayRules.find(rule => { - return densityValue >= rule.minDensityValue; - }); - if (matchedRule) { - return matchedRule.minZoom; - } - - return densityDisplayRules.at(-1)?.minZoom ?? 0; - } - - private isFeatureEng(feature: Feature): boolean { - const layerKey = String(feature.get('_layerKey') || '').toLowerCase(); - const sttpMap = String( - feature.get('_sttpMap') || feature.get('sttpMap') || '' - ).toUpperCase(); - const sttpCode = String( - feature.get('sttpCode') || feature.get('sttp') || '' - ).toUpperCase(); - - return ( - layerKey.includes('eng_point') || - sttpMap === 'ENG' || - sttpMap === 'ENG2' || - sttpCode === 'ENG' - ); - } - - private isFeatureEngAlarm(feature: Feature): boolean { - const layerKey = String( - feature.get('_layerKey') || feature.get('type') || '' - ).toLowerCase(); - const legendState = String(feature.get('anchoPointState') || '') - .trim() - .toLowerCase(); - - return ( - layerKey.includes('eng_alarm_point') || - layerKey.includes('alarm_range') || - legendState.startsWith('alarm_range_') || - legendState.startsWith('large_eng_built_alarm_range_') || - legendState.startsWith('mid_eng_built_alarm_range_') - ); - } - - private getFeatureEngRenderPriority(feature: Feature): number { - if (this.isFeatureEngAlarm(feature)) { - return 300; - } - return this.isFeatureEng(feature) ? 200 : 100; - } - - /** - * 如果点位在当前视图中没有近邻点,则允许跳过静态密度门槛直接参与显示。 - * 这样像“戈兰滩”这类 distance 档位偏密、但当前周围实际很空的点也能出现。 - */ - private shouldBypassDensityGateForIsolatedFeature(feature: Feature): boolean { - if (!this.map) { - return false; - } - - const layerKey = String(feature.get('_layerKey') || ''); - const geometry = feature.getGeometry(); - if (!geometry || geometry.getType() !== 'Point') { - return false; - } - - const featurePixel = this.map.getPixelFromCoordinate( - (geometry as Point).getCoordinates() - ); - if (!featurePixel) { - return false; - } - - const nearbyPixelThreshold = 56; - const viewportFeatures = this.pointLayerManager.getFeaturesInViewport(); - - return !viewportFeatures.some(otherFeature => { - if (otherFeature === feature) { - return false; - } - if (otherFeature.get('_legendVisible') === false) { - return false; - } - if (otherFeature.get('_regionVisible') === false) { - return false; - } - if (String(otherFeature.get('_layerKey') || '') !== layerKey) { - return false; - } - - const otherGeometry = otherFeature.getGeometry(); - if (!otherGeometry || otherGeometry.getType() !== 'Point') { - return false; - } - - const otherPixel = this.map?.getPixelFromCoordinate( - (otherGeometry as Point).getCoordinates() - ); - if (!otherPixel) { - return false; - } - - return ( - Math.hypot( - otherPixel[0] - featurePixel[0], - otherPixel[1] - featurePixel[1] - ) <= nearbyPixelThreshold - ); - }); - } - - private shouldRenderFeatureByDensity( - feature: Feature, - currentZoom: number - ): boolean { - const minZoom = this.getFeatureDensityMinZoom(feature); - const bypassDensityGate = - currentZoom < minZoom && - this.shouldBypassDensityGateForIsolatedFeature(feature); - return currentZoom >= minZoom || bypassDensityGate; - } - - /** - * 近邻点统一参与原位堆叠,具体谁显示在顶层交给碰撞排序和图层优先级控制。 - */ - private shouldRenderNearbyFeature(): boolean { - return true; - } - /** - * 初始化加载基础图层 - * @param layer 图层配置对象 - */ - addBaseDataLayer(layer: any, isShow: boolean, isCache = false): void { - if (!this.map) return; - - // 备注:同 key 的底图重复添加前先移除旧实例,避免注册表覆盖后旧图层仍残留在地图上。 - const existingLayer = layer?.key - ? this.layerRegistry.get(layer.key as string) - : null; - if (existingLayer) { - this.map.removeLayer(existingLayer); - this.layerRegistry.delete(layer.key); - } - - if (layer.type === 'wmts') { - if (!layer.url) return; - const url = !isCache ? layer.url : layer.url_3d; - const urlParams = new URLSearchParams(url.split('?')[1]); - if (layer.key === this.REGISTRY_KEY) { - this.baseLayerConfig = layer; - } - const layerName: string = urlParams.get('LAYER') || ''; - const matrixSetName: any = urlParams.get('TILEMATRIXSET'); - - const projection = getProjection('EPSG:3857'); - if (!projection) { - console.error('无法获取 EPSG:3857 投影'); - return; - } - const projectionExtent = projection.getExtent(); - - const size = getWidth(projectionExtent) / 256; - const maxZoom = 13; - - const resolutions = new Array(maxZoom + 1); - const matrixIds = new Array(maxZoom + 1); - - for (let z = 0; z <= maxZoom; ++z) { - resolutions[z] = size / Math.pow(2, z); - matrixIds[z] = `${matrixSetName}:${z}`; - } - - const wmtsLayer = new TileLayer({ - source: new WMTS({ - url: layer.url.split('?')[0], - layer: layerName, - matrixSet: matrixSetName, - format: 'image/png', - projection: projection, - tileGrid: new WMTSTileGrid({ - origin: getTopLeft(projectionExtent), - resolutions: resolutions, - matrixIds: matrixIds - }), - style: 'default', - wrapX: true, - crossOrigin: 'anonymous' - }) - }); - - if (layer.key === this.REGISTRY_KEY) { - !isCache ? wmtsLayer.setZIndex(-100) : wmtsLayer.setZIndex(-99); - } else { - wmtsLayer.setZIndex(-100); - } - wmtsLayer.type = 'layer'; - wmtsLayer.setVisible(isShow); - this.layerRegistry.set(layer.key, wmtsLayer); - this.map.addLayer(wmtsLayer); - layer._layer = wmtsLayer; - } else if (layer.type == 'raster-dem') { - const tileLayer = new TileLayer({ - source: new XYZ({ - url: layer.url, - wrapX: true, - crossOrigin: 'anonymous' - }) - }); - tileLayer.setZIndex(-100); - tileLayer.setVisible(isShow); - tileLayer.type = 'layer'; - this.layerRegistry.set(layer.key, tileLayer); - this.map.addLayer(tileLayer); - } else if (layer.type === 'vector') { - if (layer.key === 'hydropBase') { - this.hydropBaseConfig = layer; - } - } - } - /** - * 根据 key 设置底图图层显隐 - * @param layerKey 图层 key - * @param visible 是否显示 - */ - private setBaseLayerVisible(layerKey: string, visible: boolean): void { - const layer = this.layerRegistry.get(layerKey); - if (layer) { - layer.setVisible(visible); - } - } - /** - * 同步当前激活底图源的显隐,保证树勾选和下方图源切换使用同一套可见性规则 - * @param checked 是否显示当前激活底图 - */ - private syncActiveBaseLayerVisibility(checked: boolean): void { - this.setBaseLayerVisible(this.REGISTRY_KEY, checked); - - this.rasterBaseLayerKeys.forEach(key => { - const shouldShow = - checked && - this.activeBaseLayerKey !== 's_province_boundaries' && - key === this.activeBaseLayerKey; - this.setBaseLayerVisible(key, shouldShow); - }); - } - /** - * 获取当前应应用基地裁切的底图图层集合 - * @returns 当前可见底图图层列表 - */ - private getCurrentMaskTargetLayers(): TileLayer[] { - const layers: TileLayer[] = []; - const baseLayer = this.layerRegistry.get(this.REGISTRY_KEY); - - if (baseLayer instanceof TileLayer) { - layers.push(baseLayer); - } - - if (this.activeBaseLayerKey !== 's_province_boundaries') { - const activeRasterLayer = this.layerRegistry.get(this.activeBaseLayerKey); - if ( - activeRasterLayer instanceof TileLayer && - activeRasterLayer !== baseLayer - ) { - layers.push(activeRasterLayer); - } - } - - return layers; - } - /** - * 重新把当前基地裁切绑定到最新底图实例,保证切换图源后边界裁切持续生效 - */ - private reapplyCurrentBaseMask(): void { - if (!this.currentClipGeoJson) { - return; - } - - const targetLayers = this.getCurrentMaskTargetLayers(); - if (targetLayers.length === 0) { - return; - } - - this.regionMaskManager.applyMapMaskToLayers( - targetLayers, - this.currentClipGeoJson - ); - } - enableNortheastMask(): void { - const baseLayer = this.layerRegistry.get(this.REGISTRY_KEY); - - if (!this.geoJsonData1) { - console.warn('东北边界数据尚未加载'); - return; - } - - if (baseLayer && baseLayer instanceof TileLayer) { - this.regionMaskManager.applyMapMask(baseLayer, this.geoJsonData1); - } else { - console.warn('未找到全量底图图层或图层类型错误'); - } - } - /** - * 控制特定区域图层的显示(互斥显示) - * @param regionId 区域ID (例如 "hebei", "13", "01" 等,需与图层 Key 或属性对应) - * @param isAll 是否显示所有 (true: 显示所有图层; false: 仅显示匹配 regionId 的图层,隐藏其他) - */ - async jdPanelControlShowAndHidden( - _regionId: string, - isAll: boolean - ): Promise { - if (!this.map || !this.hydropBaseConfig) { - console.warn('地图未初始化或 hydropBaseConfig 未配置'); - return; - } - - if (this.clipRequestController) { - this.clipRequestController.abort(); - this.clipRequestController = null; - } - - this.BASEID = _regionId; - - if (!isAll) { - this.currentClipGeoJson = null; - this.regionMaskManager.clearMapMask(); - this.regionMaskManager.showAllPoints(); - return; - } - - const baseLayers = this.getCurrentMaskTargetLayers(); - if (baseLayers.length === 0) { - console.warn('未找到底图图层,无法应用遮罩'); - return; - } - - this.regionMaskManager.hideAllPoints(); - this.clipRequestController = new AbortController(); - const signal = this.clipRequestController.signal; - - try { - const url = - this.hydropBaseConfig.geojson_url + - `&cql_filter=BASEID='${this.BASEID}'`; - - const geoJsonData = await this.loadGeoJsonData(url, signal); - - if (signal.aborted) { - return; - } - - if (this.BASEID !== _regionId) { - return; - } - - this.currentClipGeoJson = geoJsonData; - this.regionMaskManager.filterPointsByRegion(geoJsonData); - this.regionMaskManager.fitViewToGeoJson(geoJsonData); - this.regionMaskManager.applyMapMaskToLayers(baseLayers, geoJsonData); - } catch (error: any) { - if (error.name === 'AbortError') { - return; - } - this.currentClipGeoJson = null; - console.error('加载裁切数据失败:', error); - this.regionMaskManager.clearMapMask(); - this.regionMaskManager.showAllPoints(); - } finally { - if (this.clipRequestController?.signal === signal) { - this.clipRequestController = null; - } - } - } - /** - * 基础图层显示影隐藏方法 - * @param layerType 图层类型 (备用,优先使用 key) - * @param key 图层唯一标识 Key - * @param checked true 为显示,false 为隐藏 - */ - controlBaseLayerTreeShowAndHidden( - layerType: string, - key: string, - checked: boolean - ): void { - if (!this.map) return; - const registryKey = key || layerType; - - if (!registryKey) { - console.warn( - 'controlBaseLayerTreeShowAndHidden: 缺少有效的 Key 或 LayerType' - ); - return; - } - if (registryKey === this.REGISTRY_KEY) { - this.syncActiveBaseLayerVisibility(checked); - return; - } - const layerInstance = this.layerRegistry.get(registryKey as string); - if (layerInstance) { - layerInstance.setVisible(checked); - // 图层显隐变化时刷新 batch popup - if (this.isBatchPopupMode) { - this.requestUpdateBatchPopups(true); - } - } else { - console.warn( - `未找到标识为 [${registryKey}] 的图层实例,当前注册表 keys:`, - Array.from(this.layerRegistry.keys()) - ); - } - } - mdLayerTreeShowOrHidden(layerType: string, checked?: boolean): void { - this.pointLayerManager.setLayerVisible(layerType, checked); - this.requestRefreshPointLabelVisibility(true); - // 图层显隐变化时刷新 batch popup - if (this.isBatchPopupMode) { - this.requestUpdateBatchPopups(true); - } - } - - hasLayer(layerType: string): boolean { - return this.pointLayerManager.hasLayer(layerType as string); - } - - hasBaseLayer(layerKey: string): boolean { - return this.layerRegistry.has(layerKey); - } - - /** - * 缩放地图 - * @param type 'out' 缩小, 'in' 放大 - */ - zoomToggle(type: 'out' | 'in'): void { - if (!this.map || !this.view) return; - - const currentZoom = this.view.getZoom(); - if (currentZoom === undefined) return; - - // 定义缩放步长,对应 Leaflet 的 zoomDelta - const zoomDelta = 1; - - let targetZoom = currentZoom; - - if (type === 'in') { - targetZoom = currentZoom + zoomDelta; - // 限制最大缩放级别 - if (targetZoom > MAX_ZOOM) { - targetZoom = MAX_ZOOM; - } - } else { - targetZoom = currentZoom - zoomDelta; - // 限制最小缩放级别 - if (targetZoom < MIN_ZOOM) { - targetZoom = MIN_ZOOM; - } - } - - // 使用 animate 实现平滑缩放动画 - this.view.animate({ - zoom: targetZoom, - duration: 250, // 动画持续时间 (ms),与滚轮缩放保持一致 - easing: t => t // 线性缓动,也可以引入 ol/easing 使用更复杂的曲线 - }); - } - - /** - * 切换底图 - * @param key 业务标识 Key (如 's_province_boundaries', 'BASEMAP-white', 'BASEMAP-img') - */ - baseLayerSwitcher(key: string, checked: boolean): void { - if (!this.map || !this.view) return; - this.activeBaseLayerKey = key; - const oldLayer = this.layerRegistry.get(this.REGISTRY_KEY); - if (oldLayer) { - this.map.removeLayer(oldLayer); - this.layerRegistry.delete(this.REGISTRY_KEY); - } - - if (key == 's_province_boundaries') { - this.addBaseDataLayer(this.baseLayerConfig, checked); - this.hideBaseMapLayers(this.rasterBaseLayerKeys); - } else { - this.addBaseDataLayer(this.baseLayerConfig, checked, true); - this.rasterBaseLayerKeys.forEach(layerKey => { - if (layerKey === key) { - this.addBaseDataLayer(servers.BaseLayer[layerKey], checked); - } else { - this.setBaseLayerVisible(layerKey, false); - } - }); - } - - this.reapplyCurrentBaseMask(); - } - /** - * 隐藏指定的底图图层 - * @param layerKeys 要隐藏的图层 key 数组 - */ - hideBaseMapLayers(layerKeys: string[]): void { - layerKeys.forEach(key => { - const layer = this.layerRegistry.get(key); - if (layer) { - layer.setVisible(false); - } - }); - } - - /** - * 显示指定的底图图层 - * @param layerKeys 要显示的图层 key 数组 - */ - showBaseMapLayers(layerKeys: string[]): void { - layerKeys.forEach(key => { - const layer = this.layerRegistry.get(key); - if (layer) { - layer.setVisible(true); - } - }); - } - - /** - * 添加梯级流域图 (Vector Layer) - 使用本地 GeoJSON 数据 - * @param layer 图层配置对象 - * @param fillcolor 填充颜色 - * @param outlineColor 边框颜色 - * @param datas 需要显示的 RVCD 列表 (例如: ['SJLY25', ...]),如果为空则显示所有或根据业务逻辑处理 - */ - addTertiarybasinLayer( - layer: any, - fillcolor: any, - outlineColor: any, - datas: any - ): void { - if (!this.map || !this.view) return; - - // 1. 检查是否已存在该图层,已存在时直接切换为显示并刷新样式 - const existingLayer = this.layerRegistry.get(layer.key); - - // 2. 创建样式函数 - const visibleStyle = new Style({ - fill: new Fill({ color: fillcolor }), - stroke: new Stroke({ color: outlineColor, width: 1 }) - }); - - const hiddenStyle = new Style({ - fill: new Fill({ color: 'rgba(0,0,0,0)' }), - stroke: new Stroke({ color: 'rgba(0,0,0,0)' }) - }); - - if (existingLayer) { - const allowedIds = Array.isArray(datas) ? datas : []; - const existingFeatures = - existingLayer.getSource?.()?.getFeatures?.() ?? []; - - existingFeatures.forEach(feature => { - const rvcd = feature.get('RVCD'); - const isVisible = - allowedIds.length > 0 ? rvcd && allowedIds.includes(rvcd) : true; - - feature.setStyle(isVisible ? visibleStyle : hiddenStyle); - }); - - existingLayer.setVisible(layer.visible !== false); - return; - } - - // 3. 创建矢量源 (VectorSource),并通过 layer.geojson_url 加载数据 - const vectorSource = new VectorSource(); - - if (layer?.geojson_url) { - this.loadGeoJsonData(VITE_APP_MAP_URL + layer.geojson_url).then( - geoJsonData => { - if (!geoJsonData) return; - - const features = new GeoJSON().readFeatures(geoJsonData, { - featureProjection: 'EPSG:3857' // 确保转换到地图使用的投影 - }); - - vectorSource.addFeatures(features); - - // 4. 数据过滤逻辑 - const allowedIds = Array.isArray(datas) ? datas : []; - - features.forEach(feature => { - // 获取属性中的 RVCD - const rvcd = feature.get('RVCD'); - - let isVisible = false; - - // 逻辑:如果 datas 为空,通常意味着显示所有(或者都不显示,视具体需求而定) - // 这里假设:datas 有值时严格过滤;datas 为空时显示所有 - if (allowedIds.length > 0) { - isVisible = rvcd && allowedIds.includes(rvcd); - } else { - isVisible = true; - } - - // 应用样式 - feature.setStyle(isVisible ? visibleStyle : hiddenStyle); - }); - } - ); - } - - // 5. 创建矢量图层 (VectorLayer) - const vectorLayer = new VectorLayer({ - source: vectorSource, - style: null, // 样式已应用在 Feature 上,这里设为 null 或保留默认 - zIndex: 100, - visible: layer.visible !== false - }); - - // 6. 注册并添加到地图 - this.layerRegistry.set(layer.key, vectorLayer); - this.map.addLayer(vectorLayer); - } - /** - * 隐藏梯级流域图 - * @param layer 图层配置对象 (需包含 key 属性) - */ - hideTertiarybasinLayer(layer: any): void { - if (!this.map || !layer || !layer.key) { - console.warn('hideTertiarybasinLayer: 无效的图层或地图未初始化'); - return; - } - // 1. 从注册表中获取图层实例 - const layerInstance = this.layerRegistry.get(layer.key); - - if (layerInstance) { - layerInstance.setVisible(false); - } else { - console.warn(`未找到标识为 [${layer.key}] 的梯级流域图层实例`); - } - } - /** - * 删除描点图层 - * @param layerKey 图层 key - */ - removePointLayer(layerKey: string): void { - this.pointLayerManager.removeLayer(layerKey); - } - /** - * 地图打印/导出 - * 将当前地图视图导出为 PNG 图片,背景强制为白色 - */ - mapOutPut(): void { - if (!this.map) { - console.warn('地图未初始化,无法打印'); - return; - } - const mapElement = this.map.getTargetElement(); - const canvas = mapElement.querySelector('canvas'); - - if (!canvas) { - console.error('未找到地图 Canvas 元素,无法导出'); - return; - } - - try { - const width = canvas.width; - const height = canvas.height; - - const offscreenCanvas = document.createElement('canvas'); - offscreenCanvas.width = width; - offscreenCanvas.height = height; - const ctx = offscreenCanvas.getContext('2d'); - - if (!ctx) { - throw new Error('无法获取 Canvas 上下文'); - } - - ctx.fillStyle = '#FFFFFF'; - ctx.fillRect(0, 0, width, height); - - ctx.drawImage(canvas, 0, 0); - - const dataURL = offscreenCanvas.toDataURL('image/png'); - - const link = document.createElement('a'); - link.download = `map_export_${new Date().getTime()}.png`; - link.href = dataURL; - document.body.appendChild(link); - link.click(); - document.body.removeChild(link); - } catch (e) { - console.error('地图导出失败', e); - alert('地图导出失败,请检查控制台错误信息。'); - } - } - - /** - * 切换双击缩放交互的状态 - */ - private toggleDoubleClickZoom(active: boolean): void { - if (!this.map) return; - this.map.getInteractions().forEach(interaction => { - if (interaction instanceof DoubleClickZoom) { - interaction.setActive(active); - } - }); - } - - /** - * 创建并返回测量 Tooltip Overlay - */ - private createMeasureTooltipOverlay(): Overlay { - const element = document.createElement('div'); - element.className = 'measure-tooltip tooltip-measure'; - Object.assign(element.style, { - background: 'rgba(0, 0, 0, 0.7)', - color: 'white', - padding: '4px 8px', - borderRadius: '4px', - fontSize: '12px', - whiteSpace: 'nowrap' - }); - - return new Overlay({ - element, - offset: [0, -15], - positioning: 'bottom-center' - }); - } - /** - * 通用测量启动方法 - * @param geomType 'LineString' | 'Polygon' - * @param drawStyle 绘制中的样式函数 - * @param finishedStyle 完成后的样式 - * @param onResult 计算结果的回调 (feature, resultText) - */ - private startMeasurement( - geomType: 'LineString' | 'Polygon', - drawStyle: any, - finishedStyle: Style, - onResult: (feature: Feature, text: string) => void - ): void { - if (!this.map || !this.view) return; - - // 1. 初始化图层 - if (!this.measureLayer) { - this.measureSource = new VectorSource(); - this.measureLayer = new VectorLayer({ - source: this.measureSource, - zIndex: 1000 - }); - this.map.addLayer(this.measureLayer); - } - - // 2. 清理旧交互 - if (this.drawInteraction) { - this.map.removeInteraction(this.drawInteraction); - } - - // 禁用双击缩放 - this.toggleDoubleClickZoom(false); - - // 3. 创建绘制交互 - this.drawInteraction = new Draw({ - source: this.measureSource!, - type: geomType, - style: drawStyle - }); - - this.map.addInteraction(this.drawInteraction); - - let changeListenerKey: any; - let currentTooltip: Overlay | null = null; - - // 4. 监听绘制开始 - this.drawInteraction.on('drawstart', (evt: any) => { - const feature = evt.feature; - const geom = feature.getGeometry(); - - // 创建动态 Tooltip - currentTooltip = this.createMeasureTooltipOverlay(); - this.map?.addOverlay(currentTooltip); - - // 监听几何变化更新 Tooltip - changeListenerKey = geom!.on('change', () => { - if (currentTooltip && currentTooltip.getElement() && geom) { - // 根据类型计算临时值 - let tempText = ''; - if (geomType === 'LineString') { - tempText = this.formatLength(geom as LineString); - } else { - tempText = this.formatArea( - geom as import('ol/geom/Polygon').default - ); - } - - currentTooltip.getElement()!.innerHTML = tempText; - - // 对于多边形,Tooltip 跟随鼠标最后一个点;对于线,也是最后一个点 - const lastCoord = (geom as any).getLastCoordinate(); - if (lastCoord) currentTooltip.setPosition(lastCoord); - } - }); - }); - - // 5. 监听绘制结束 - this.drawInteraction.on('drawend', (evt: any) => { - const feature = evt.feature; - const geom = feature.getGeometry(); - - // ✅ 修复:检查几何体是否有效 - // 对于 Polygon,如果坐标点数不足(例如只点了两下),geom 可能是无效的或面积为0 - if (!geom || geom.getCoordinates().length === 0) { - console.warn('无效的几何体,已忽略'); - this.measureSource?.removeFeature(feature); - if (currentTooltip) this.map?.removeOverlay(currentTooltip); - if (changeListenerKey) unByKey(changeListenerKey); - return; - } - - // 清理监听和临时 Tooltip - if (changeListenerKey) unByKey(changeListenerKey); - if (currentTooltip) this.map?.removeOverlay(currentTooltip); - - // ✅ 修复:强制设置样式,确保即使默认样式有问题也能显示 - feature.setStyle(finishedStyle); - - // 计算最终结果并回调 - let resultText = ''; - let isValidResult = true; - - if (geomType === 'LineString') { - resultText = this.formatLength(geom as LineString); - } else { - // 对于多边形,再次检查面积是否过小或无效 - const polyGeom = geom as import('ol/geom/Polygon').default; - const area = getSphericalArea(polyGeom); - if (area < 0.0001) { - // 极小面积视为无效绘制 - isValidResult = false; - console.warn('面积过小,已忽略'); - this.measureSource?.removeFeature(feature); - } else { - resultText = this.formatArea(polyGeom); - } - } - - // 只有结果有效才添加标签 - if (isValidResult) { - onResult(feature, resultText); - } - - // 清理交互 - this.map?.removeInteraction(this.drawInteraction); - this.drawInteraction = null; - - // 恢复双击缩放 - setTimeout(() => { - this.toggleDoubleClickZoom(true); - }, 0); - }); - } - /** - * 长度量算 - */ - lengthCalculate(): void { - this.startMeasurement( - 'LineString', - (feature: any) => { - // 绘制中只显示线,隐藏点 - return feature.getGeometry()?.getType() === 'LineString' - ? new Style({ - stroke: new Stroke({ - color: '#ffcc33', - lineDash: [10, 10], - width: 2 - }) - }) - : []; - }, - new Style({ - stroke: new Stroke({ color: '#9AD8E7', width: 3 }) // 加粗一点 - }), - (feature, text) => { - this.addFixedLabel(feature, text); - } - ); - } - - /** - * 面积量算 - */ - areCalculate(): void { - this.startMeasurement( - 'Polygon', - (feature: any) => { - // 绘制中显示线和填充 - return feature.getGeometry()?.getType() === 'Polygon' - ? new Style({ - stroke: new Stroke({ - color: '#ffcc33', - lineDash: [10, 10], - width: 2 - }), - fill: new Fill({ color: 'rgba(255, 204, 51, 0.3)' }) // 提高透明度以便看清 - }) - : []; - }, - new Style({ - stroke: new Stroke({ color: '#9AD8E7', width: 3 }), // 加粗边框 - fill: new Fill({ color: 'rgba(154, 216, 231, 0.4)' }) // 提高填充可见度 - }), - (feature, text) => { - this.addFixedLabel(feature, text); - } - ); - } - /** - * 移除量算结果 - */ - removeQueryLayer(): void { - // 1. 清除矢量数据 (线条) - if (this.measureSource) { - this.measureSource.clear(); - } - - // 2. 清除所有相关 Overlay (Label) - if (this.map) { - // ✅ 修复:先获取所有 Overlay 的副本,避免在遍历过程中修改原数组导致漏删 - const overlaysToRemove: Overlay[] = []; - - this.map.getOverlays().forEach(overlay => { - const el = overlay.getElement(); - // 通过类名判断是否为我们创建的测量标签 - if ( - el && - (el.classList.contains('measure-tooltip') || - el.classList.contains('measure-label-container')) - ) { - overlaysToRemove.push(overlay); - } - }); - - // 统一移除 - overlaysToRemove.forEach(overlay => { - this.map?.removeOverlay(overlay); - }); - - // 确保恢复双击缩放 - this.toggleDoubleClickZoom(true); - } - - // 3. 清除交互 - if (this.drawInteraction) { - this.map?.removeInteraction(this.drawInteraction); - this.drawInteraction = null; - } - } - - /** - * 添加固定的 Label (带删除按钮) - */ - private addFixedLabel(feature: Feature, lengthText: string): void { - if (!this.map) return; - - const container = document.createElement('div'); - container.className = 'measure-label-container'; - - // 使用 Object.assign 批量设置样式,代码更整洁 - Object.assign(container.style, { - position: 'absolute', - border: '1px solid #000', - padding: '4px 8px', - borderRadius: '4px', - fontSize: '12px', - color: '#000', - cursor: 'default', - whiteSpace: 'nowrap', - display: 'flex', - alignItems: 'center', - zIndex: '1001', - pointerEvents: 'auto' // 确保可以点击 - }); - - const textSpan = document.createElement('span'); - textSpan.innerText = lengthText; - - const closeBtn = document.createElement('span'); - closeBtn.innerHTML = '×'; - Object.assign(closeBtn.style, { - fontWeight: 'bold', - marginLeft: '5px', - cursor: 'pointer', - fontSize: '14px', - lineHeight: '1' - }); - - const geom: any = feature.getGeometry(); - let center: any; - - // ✅ 修复:根据几何类型选择标签位置 - if (geom?.getType() === 'Polygon') { - // 多边形使用内部点,确保标签在面内 - center = (geom as import('ol/geom/Polygon').default) - .getInteriorPoint() - .getCoordinates(); - } else { - // 线使用中点 - center = (geom as LineString).getCoordinateAt(0.5); - } - - const overlay = new Overlay({ - element: container, - positioning: 'top-center', - offset: [0, -10], - position: center - }); - - closeBtn.onclick = e => { - e.stopPropagation(); - this.measureSource?.removeFeature(feature); - this.map?.removeOverlay(overlay); - }; - - container.appendChild(textSpan); - container.appendChild(closeBtn); - this.map.addOverlay(overlay); - } - /** - * 格式化长度输出 (米) - */ - private formatLength(line: LineString): string { - return '长度:' + getSphericalLength(line).toFixed(3) + 'm'; - } - /** - * 格式化面积输出 (km²) - */ - private formatArea(polygon: import('ol/geom/Polygon').default): string { - // 获取球面面积 (平方米) - const areaSqMeters = getSphericalArea(polygon); - // 转换为平方公里 - const areaSqKm = areaSqMeters / 1000000; - return '面积:' + areaSqKm.toFixed(3) + 'km²'; - } - /** - * 图例和基地面板控制描点数据显示隐藏方法 - * @param layerType 图层类型 - * @param key 图层标识符(锚点状态 nameEn) - * @param baseid 基地ID - * @param checked 是否选中(显示/隐藏) - * @param isAll 是否全部操作 - */ - mdLayerShowOrHidden( - layerType: string, - key?: string, - baseid: string, - checked?: boolean, - isAll?: boolean - ): void { - void baseid; - void isAll; - this.pointLayerManager.setLegendVisibleByField( - layerType, - key || '', - !!checked - ); - // 图例变化时刷新 batch popup - if (this.isBatchPopupMode) { - this.requestUpdateBatchPopups(true); - } - } - - /** - * 根据 anchoPointState 控制单个图例的锚点显示隐藏 - * @param layerKey 图层 key - * @param anchoPointState 锚点状态(对应图例的 nameEn) - * @param checked 是否显示 - */ - setLegendPointVisible( - layerKey: string, - anchoPointState: string, - checked: boolean - ): void { - this.pointLayerManager.setLegendVisibleByField( - layerKey, - anchoPointState, - checked - ); - this.requestRefreshPointLabelVisibility(true); - // 图例变化时刷新 batch popup - if (this.isBatchPopupMode) { - this.requestUpdateBatchPopups(true); - } - } - - switchView(_type): void {} - fitBounds(): void {} - /** - * 飞行定位到指定经纬度和缩放级别 - * @param position [经度, 纬度] (EPSG:4326) - * @param zoom 缩放级别 - */ - flyTopanto(position: number[], zoom: number): void { - if (!this.map || !this.view) { - console.warn('地图未初始化,无法执行飞行定位'); - return; - } - - // 1. 将经纬度 [lon, lat] 转换为地图投影坐标 (EPSG:3857) - const targetCenter = fromLonLat(position); - - // 2. 执行动画 - // duration: 动画持续时间,单位毫秒,例如 1000ms (1秒) - this.view.animate( - { - center: targetCenter, - duration: 1000 - }, - { - zoom: zoom, - duration: 1000 - } - ); - } - - getCurrentZoom(): number | undefined { - return this.view?.getZoom(); - } - - /** - * 生成带完整圆边框的上半圆 Canvas - * @param radius 半径(像素) - * @param color 填充颜色 - * @returns HTMLCanvasElement - */ - private createSemiCircleCanvas( - radius: number, - color: string - ): HTMLCanvasElement { - const size = radius * 2 + 2; - const canvas = document.createElement('canvas'); - canvas.width = size; - canvas.height = size; - const ctx = canvas.getContext('2d')!; - ctx.clearRect(0, 0, size, size); - - const centerX = size / 2; - const centerY = size / 2; - - // 1. 绘制下半圆填充(给定颜色)— 圆弧从 π 到 2π - ctx.beginPath(); - ctx.arc(centerX, centerY, radius, 0, Math.PI, false); - ctx.closePath(); - ctx.fillStyle = color; - ctx.fill(); - - // 2. 绘制上半圆填充(白色) - ctx.beginPath(); - ctx.arc(centerX, centerY, radius, Math.PI, 2 * Math.PI, false); - ctx.closePath(); - ctx.fillStyle = '#FFFFFF'; // 白色 - ctx.fill(); - - // 3. 绘制完整圆边框 - ctx.beginPath(); - ctx.arc(centerX, centerY, radius, 0, Math.PI * 2); - ctx.strokeStyle = 'rgba(0, 0, 0, 0.5)'; - ctx.lineWidth = 1.5; - ctx.stroke(); - - return canvas; - } - - /** - * 移除地图对象,释放资源 - */ - destroy(): void { - if (this.pointLayerStyleRefreshFrameId !== null) { - cancelAnimationFrame(this.pointLayerStyleRefreshFrameId); - this.pointLayerStyleRefreshFrameId = null; - } - if (this.labelVisibilityRefreshFrameId !== null) { - cancelAnimationFrame(this.labelVisibilityRefreshFrameId); - this.labelVisibilityRefreshFrameId = null; - } - if (this.labelVisibilityDebounceTimerId !== null) { - window.clearTimeout(this.labelVisibilityDebounceTimerId); - this.labelVisibilityDebounceTimerId = null; - } - this.clearBatchPopupPostRenderSync(); - this.removeQueryLayer(); - this.regionMaskManager.destroy(); - - const clearLayer = (layer: any) => { - if (layer && layer.getSource) { - const source = layer.getSource(); - if (source && source.clear) { - source.clear(); - } - } - if (this.map && this.map.getLayers().getArray().includes(layer)) { - this.map.removeLayer(layer); - } - if (layer.setMap) layer.setMap(null); - }; - - if (this.layerRegistry) { - this.layerRegistry.forEach(clearLayer); - this.layerRegistry.clear(); - } - - this.popupManager.destroy(); - this.pointLayerManager.destroy(); - - if (this.map) { - this.map.getInteractions().clear(); - this.map.getOverlays().clear(); - this.map.setTarget(undefined); - this.map.dispose(); - this.map = null; - } - this.popupManager.setMap(null); - this.pointLayerManager.setMap(null); - this.regionMaskManager.setContext(null, null); - - if (this.view) { - this.view.dispose(); - this.view = null; - } - - this.baseLayerConfig = null; - this.measureSource = null; - this.measureLayer = null; - this.drawInteraction = null; - this.geoJsonData = null; - this.geoJsonData1 = null; - } - - // 倾斜摄影方法仅3D支持,2D为空实现 - addQxsyLayer(_item: any): void {} - removeQxsyLayer(_item: any): void {} - qxsyChangeClick(_item: any, _checked: boolean): void {} - qxsyToPosition(_item: any): void {} -} diff --git a/frontend-sjgl/src/components/gis/mapurlManage.ts b/frontend-sjgl/src/components/gis/mapurlManage.ts deleted file mode 100644 index 88161502..00000000 --- a/frontend-sjgl/src/components/gis/mapurlManage.ts +++ /dev/null @@ -1,759 +0,0 @@ -/** - * @author: yjw - * @date: 2022-11-17 - * @description: 后期建议本文件内容做到系统配置中 - */ - -// import { MemoryCache } from '@zebras/qgc-share/cache/MemoryCache' -// import { Session } from '@zebras/qgc-share/service/Session' - -export interface MapBaseUrlItem { - code: string; - name: string; - url: string; -} - -export interface ServerConfigItem { - id?: string; - key?: string; - urlType: 'gisurl' | 'online'; - url?: string; - url_3d?: string; - layers?: string; - rasteropacity?: number; - _layer?: string; - imgUrl?: string; - visible?: boolean; - visibility?: boolean; //?是否可以删除 - minZoom?: number; - maxZoom?: number; - fillOpacity?: number; - lineWidth?: number; - [name: string]: any; -} - -const tdtToken = 'e90d56e5a09d1767899ad45846b0cefd'; //企业版密钥,勿换e650f138c4481cca888cd13094bb9026 -const mapType = 'w'; //c:天地图经纬度底图;w:天地图墨卡托底图 -const URL_TerTDT = `https://t0.tianditu.gov.cn/ter_${mapType}/wmts?tk=${tdtToken}`; //terMap -// const URL_TerLabelTDT = `http://t0.tianditu.gov.cn/cta_${mapType}/wmts?tk=${tdtToken}` //terLabel -// const URL_VecTDT = `http://t0.tianditu.com/vec_${mapType}/wmts?tk=${tdtToken}` //vecMap -// const URL_VecLableTDT = `http://t0.tianditu.com/cva_${mapType}/wmts?tk=${tdtToken}` //vecLabel -// const URL_ImgTDT = `http://t0.tianditu.com/img_${mapType}/wmts?tk=${tdtToken}` //imgMap -// const URL_ImgLableTDT = `http://t0.tianditu.com/cia_${mapType}/wmts?tk=${tdtToken}` - -// const znyMapUrl = "http://10.219.26.6:8050/" //中南院的测试地图环境 -// const djjtMapUrl = "http://210.72.227.199:18084/" //中南院的测试地图环境 -//TODO:以后改成在系统管理里面配置地图可视化范围 -export const location_map_maxlon = 126.8267; -export const location_map_maxlat = 38.5769; -export const location_map_minlon = 73.7443; -export const location_map_minlat = 16.32; -// todo: 以后从接口获取数据 -export const servers: Record | Record = { - // 省(自治区)界 - province_boundaries: { - id: 'province_boundaries', - key: 'province_boundaries', - urlType: 'gisurl', - // url: this.gisServers.gisurl + '/geoserver/qgc/wms?SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&FORMAT=image%2Fpng&TRANSPARENT=true&STYLES&LAYERS=qgc%3Aprovinceline&exceptions=application%2Fvnd.ogc.se_inimage&SRS=EPSG%3A3857&WIDTH=768&HEIGHT=620&bbox={bbox-epsg-3857}', - url: '/geoserver/qgc/wms?service=WMS&version=1.1.0&request=GetMap&layers=qgc:provinceline&styles=&bbox={bbox-epsg-3857}&width=768&height=620&srs=EPSG:3857&format=image%2Fpng&TRANSPARENT=true', - geojson_url: `/geoserver/qgc/ows?service=WFS&version=1.0.0&request=GetFeature&typeName=qgc:provinceline&outputFormat=application%2Fjson&token= - `, - url_3d: '/geoserver/qgc/wms', - layers: 'qgc:provinceline', - rasteropacity: 1, - minZoom: 0, - maxZoom: 21, - type: 'wms', - layerType: 'line', - lineWidth: 2, - visible: true - }, - //国界 - chinaBoundary: { - id: 'chinaBoundary', - key: 'chinaBoundary', - urlType: 'gisurl', - url: '/geoserver/gwc/service/tms/1.0.0/qgc%3Achina@EPSG%3A900913@pbf/{z}/{x}/{y}.pbf', - geojson_url: `/geoserver/qgc/ows?service=WFS&version=1.0.0&request=GetFeature&typeName=qgc:china&maxFeatures=50&outputFormat=application%2Fjson&token= - `, - url_3d: '/geoserver/qgc/wms', - layers: 'qgc:china', - _layer: 'china', - layerType: 'line', - minZoom: 0, - maxZoom: 16, - minHeight: 0, - maxHeight: 80000000, - rasteropacity: 1, - type: 'vector_Boundary', - paint: { - 'line-color': '#AAA4C5', - 'line-width': 3, - 'line-opacity': 0.9 - } - }, - //九段线 - nineSegmentLine: { - id: 'nineSegmentLine', - key: 'nineSegmentLine', - urlType: 'gisurl', - url: '/geoserver/gwc/service/tms/1.0.0/qgc%3Azh_island1@EPSG%3A900913@pbf/{z}/{x}/{y}.pbf', - url_3d: '/geoserver/qgc/wms', - geojson_url: `/geoserver/qgc/ows?service=WFS&version=1.0.0&request=GetFeature&typeName=qgc:zh_island1&maxFeatures=50&outputFormat=application%2Fjson&token= - `, - layers: 'qgc:zh_island1', - _layer: 'zh_island1', - layerType: 'line', - minZoom: 0, - maxZoom: 16, - minHeight: 0, - maxHeight: 80000000, - rasteropacity: 1, - type: 'vector_Boundary', - paint: { - 'line-color': '#AAA4C5', - 'line-width': 3, - 'line-opacity': 0.9 - } - }, - // 基础图层 - BaseLayer: { - 'BASEMAP-img': { - key: 'BASEMAP-img', - type: 'raster-dem', - urlType: 'online', - url: - 'https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}' + - `&token=`, - url_3d: - 'https://services.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}' + - `&token=`, - _layer: 'img', - visible: false, - maxzoom: 20 - }, - 'BASEMAP-white': { - key: 'BASEMAP-white', - urlType: 'online', - type: 'raster-dem', - url: `${URL_TerTDT}&SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=ter&STYLE=default&TILEMATRIXSET=${mapType}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}&FORMAT=tiles&token= - `, - url_3d: URL_TerTDT + `&token=`, - _layer: 'ter', - visible: false, - maxzoom: 14 - } - }, - // 区|县 - county: { - id: 'county', - key: 'county', - urlType: 'gisurl', - url: '/geoserver/gwc/service/tms/1.0.0/qgc%3Acounty@EPSG%3A900913@pbf/{z}/{x}/{y}.pbf', - geojson_url: `/geoserver/qgc/ows?service=WFS&version=1.0.0&request=GetFeature&typeName=qgc:county&outputFormat=application%2Fjson&token=`, - url_3d: '/geoserver/qgc/wms', - layers: 'qgc:county', - _layer: 'county', - rasteropacity: 0.5, - imgUrl: '/zfile/qgc/icons/map-xzXian.png', - minZoom: 8, - maxZoom: 16, - minHeight: 0, - maxHeight: 800000, - type: 'vector', - layerType: 'symbol', - visible: true - }, - //县注记 - county_lable: { - id: 'county_lable', - key: 'county_lable', - urlType: 'gisurl', - // url: this.gisServers.gisurl + '/geoserver/qgc/wms?SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&FORMAT=image%2Fpng&TRANSPARENT=true&STYLES&LAYERS=qgc%3Aprovinceline&exceptions=application%2Fvnd.ogc.se_inimage&SRS=EPSG%3A3857&WIDTH=768&HEIGHT=620&bbox={bbox-epsg-3857}', - url: '/geoserver/qgc/wms?service=WMS&version=1.1.0&request=GetMap&layers=qgc:countyAno&styles=&bbox={bbox-epsg-3857}&width=768&height=620&srs=EPSG:3857&format=image%2Fpng&TRANSPARENT=true', - geojson_url: `/geoserver/qgc/ows?service=WFS&version=1.0.0&request=GetFeature&typeName=qgc:countyAno&outputFormat=application%2Fjso&token= - `, - url_3d: '/geoserver/qgc/wms', - layers: 'qgc:countyAno', - _layer: 'countyAno', - rasteropacity: 1, - minZoom: 8, - maxZoom: 16, - minHeight: 0, - maxHeight: 800000, - type: 'wms', - layerType: 'symbol', - visible: true - }, - - // 市 - city: { - id: 'city', - key: 'city', - urlType: 'gisurl', - url: '/geoserver/gwc/service/tms/1.0.0/qgc%3Acity@EPSG%3A900913@pbf/{z}/{x}/{y}.pbf', - geojson_url: `/geoserver/qgc/ows?service=WFS&version=1.0.0&request=GetFeature&typeName=qgc:city&outputFormat=application%2Fjson&token=`, - url_3d: '/geoserver/qgc/wms', - layers: 'qgc:city', - _layer: 'city', - rasteropacity: 0.5, - imgUrl: '/zfile/qgc/icons/map-xzShi.png', - minZoom: 5, - maxZoom: 8, - minHeight: 800000, - maxHeight: 1200000, - type: 'vector', - layerType: 'symbol', - visible: false - }, - //市注记 - city_lable: { - id: 'city_lable', - key: 'city_lable', - urlType: 'gisurl', - // url: this.gisServers.gisurl + '/geoserver/qgc/wms?SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&FORMAT=image%2Fpng&TRANSPARENT=true&STYLES&LAYERS=qgc%3Aprovinceline&exceptions=application%2Fvnd.ogc.se_inimage&SRS=EPSG%3A3857&WIDTH=768&HEIGHT=620&bbox={bbox-epsg-3857}', - url: '/geoserver/qgc/wms?service=WMS&version=1.1.0&request=GetMap&layers=qgc:cityAno&styles=&bbox={bbox-epsg-3857}&width=768&height=620&srs=EPSG:3857&format=image%2Fpng&TRANSPARENT=true', - geojson_url: `/geoserver/qgc/ows?service=WFS&version=1.0.0&request=GetFeature&typeName=qgc:cityAno&outputFormat=application%2Fjson&token= - `, - url_3d: '/geoserver/qgc/wms', - layers: 'qgc:cityAno', - _layer: 'cityAno', - rasteropacity: 1, - minZoom: 5, - maxZoom: 8, - minHeight: 800000, - maxHeight: 1200000, - type: 'wms', - layerType: 'symbol', - visible: true - }, - // 省 - provincial_capital: { - id: 'provincial_capital', - key: 'provincial_capital', - urlType: 'gisurl', - url: '/geoserver/gwc/service/tms/1.0.0/qgc%3Aprovincecity@EPSG%3A900913@pbf/{z}/{x}/{y}.pbf', - geojson_url: `/geoserver/qgc/ows?service=WFS&version=1.0.0&request=GetFeature&typeName=qgc:provincecity&outputFormat=application%2Fjson&token= - `, - url_3d: '/geoserver/qgc/wms', - layers: 'qgc:provincecity', - _layer: 'provincecity', - rasteropacity: 0.5, - imgUrl: '/zfile/qgc/icons/map-xzSheng.png', - visible: true, - minZoom: 0, - maxZoom: 5, - minHeight: 1200000, - maxHeight: 99999999999, - type: 'vector', - layerType: 'symbol' - }, - //省注记 - province_lable: { - id: 'province_lable', - key: 'province_lable', - urlType: 'gisurl', - // url: this.gisServers.gisurl + '/geoserver/qgc/wms?SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&FORMAT=image%2Fpng&TRANSPARENT=true&STYLES&LAYERS=qgc%3Aprovinceline&exceptions=application%2Fvnd.ogc.se_inimage&SRS=EPSG%3A3857&WIDTH=768&HEIGHT=620&bbox={bbox-epsg-3857}', - url: '/geoserver/qgc/wms?service=WMS&version=1.1.0&request=GetMap&layers=qgc:provincecityAno&styles=&bbox={bbox-epsg-3857}&width=768&height=620&srs=EPSG:3857&format=image%2Fpng&TRANSPARENT=true', - geojson_url: `/geoserver/qgc/ows?service=WFS&version=1.0.0&request=GetFeature&typeName=qgc:provincecityAno&outputFormat=application%2Fjson&token= - `, - url_3d: '/geoserver/qgc/wms', - layers: 'qgc:provincecityAno', - _layer: 'provinceAno', - rasteropacity: 0.5, - minZoom: 0, - maxZoom: 5, - minHeight: 1200000, - maxHeight: 99999999999, - type: 'wms', - layerType: 'symbol', - visible: true - }, - baseImageLayerUrl: { - id: 'BaseLayer', - key: 'BaseLayer', - urlType: 'online', - url: 'http://t{s}.tianditu.gov.cn/img_w/wmts?tk=88735d6d9bbd5930f1b1c8b8df72e762&SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=img&STYLE=default&TILEMATRIXSET=w&FORMAT=tiles&TileMatrix={z}&TileCol={x}&TileRow={y}' - }, - WhiteBaseLayerUrl: { - id: 'BaseLayer', - key: 'BaseLayer', - urlType: 'online', - url: `https://t0.tianditu.gov.cn/ter_w/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=ter&STYLE=default&TILEMATRIXSET=w&FORMAT=tiles&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}&tk=e6372a5333c4bac9b9ef6097453c3cd6&token= - ` - }, - - /** - * 电站基地 - */ - hydropBase: { - id: 'hydropBase', - key: 'hydropBase', - urlType: 'gisurl', - url: '/geoserver/gwc/service/tms/1.0.0/qgc%3AstationEra1117@EPSG%3A900913@pbf/{z}/{x}/{y}.pbf', - geojson_url: `/geoserver/qgc/ows?service=WFS&version=1.0.0&request=GetFeature&typeName=qgc:stationEra1117&maxFeatures=50&outputFormat=application/json&token= - `, - url_3d: '/geoserver/qgc/wms', - _layer: 'stationEra1117', - layers: 'qgc:stationEra1117', - rasteropacity: 0.5, - visible: true, - minZoom: 0, - maxZoom: 20, - type: 'vector', - layerType: 'fill', - paint: { - 'fill-color': '#f0dcda', - 'fill-opacity': 0.8, - 'fill-outline-color': '#dd7065' - } - }, - /** - * 电站基地配置 - */ - powerBaseStationLayerWFSUrl: { - id: 's_hydropBase_wfs', - key: 's_hydropBase_wfs', - urlType: 'gisurl', - url: `/geoserver/qgc/ows?service=WFS&version=1.0.0&request=GetFeature&typeName=qgc:stationEra1117&maxFeatures=50&outputFormat=application/json&token= - `, - _layer: 'stationEra1117', - url_3d: '/geoserver/qgc/wms', - layers: 'qgc:stationEra1117', - rasteropacity: 0.5, - visible: true, - minZoom: 0, - maxZoom: 20 - }, - - /** - * 电站基地配置 LM项目 - */ - powerBaseStationLayerWFSUrlOfLM: { - id: 's_hydropBase_wfs', - key: 's_hydropBase_wfs', - urlType: 'gisurl', - url: `/geoserver/qgc/ows?service=WFS&version=1.0.0&request=GetFeature&typeName=qgc:stationEraLM&maxFeatures=50&outputFormat=application/json&token= - `, - _layer: 'stationEraLM', - url_3d: '/geoserver/qgc/wms', - layers: 'qgc:stationEraLM', - rasteropacity: 0.5, - visible: true, - minZoom: 0, - maxZoom: 20 - }, - /** - * 河流连通性分析中河流水系配置 - */ - YLJ_LCJ_LayerWFSUrl: { - id: 'river_riverEvaTemp', - key: 'river_riverEvaTemp', - urlType: 'gisurl', - url: `/geoserver/qgc/ows?service=WFS&version=1.0.0&request=GetFeature&typeName=qgc:ylj_lcj&maxFeatures=50&outputFormat=application%2Fjson&token= - `, - _layer: 'ylj_lcj', - url_3d: '/geoserver/qgc/wms', - layers: 'qgc:ylj_lcj', - rasteropacity: 0.5, - visible: true, - minZoom: 0, - maxZoom: 20 - }, - - /** - * 水质水温渐变线配置 - */ - LCJ_WaterQuality_line: { - id: 'LCJ_WaterQuality_line', - key: 'LCJ_WaterQuality_line', - urlType: 'gisurl', - url: `/geoserver/qgc/ows?service=WFS&version=1.0.0&request=GetFeature&typeName=qgc:lcj_waterquality_line&maxFeatures=50&outputFormat=application%2Fjson&token= - `, - _layer: 'lcj_waterquality_line', - url_3d: '/geoserver/qgc/wms', - layers: 'qgc:lcj_waterquality_line', - rasteropacity: 0.5, - visible: true, - minZoom: 0, - maxZoom: 20 - }, - - /** - * 全国乡镇名称 - */ - NationalTownships: { - id: 'NationalTownships', - key: 'NationalTownships', - layerType: 'symbol', - isShowLabel: true, - urlType: 'gisurl', - url: `/geoserver/gwc/service/tms/1.0.0/qgc%3ANationalTownships@EPSG%3A900913@pbf/{z}/{x}/{y}.pbf?token=`, - _layer: 'NationalTownships', - layers: 'qgc:NationalTownships', - visible: true, - minZoom: 10.5, - maxZoom: 18, - isOnlyAno: true, - type: 'vector', - layout_text: { - 'text-field': ['get', 'NAME'], - 'text-font': ['Open Sans Bold'], - 'text-size': 16, - 'text-anchor': 'top', - 'text-padding': 0, - 'text-max-width': 100, - 'text-ignore-placement': false, - 'text-allow-overlap': false, - visibility: 'visible' - }, - paint_text: { - 'text-color': '#404040', - 'text-halo-color': '#fff', - 'text-halo-width': 2 - } - }, - - /** - * 一级流域 - */ - heliu1: { - id: 'heliu1', - key: 'heliu1', - urlType: 'gisurl', - geojson_url: `/geoserver/qgc/ows?service=WFS&version=1.0.0&request=GetFeature&typeName=qgc:river1_line&maxFeatures=50&outputFormat=application/json&token= - `, - url: '/geoserver/gwc/service/tms/1.0.0/qgc%3Ariver1_line@EPSG%3A900913@pbf/{z}/{x}/{y}.pbf', - url_3d: '/geoserver/qgc/wms', - _layer: 'river1_line', - layers: 'qgc:river1_line', - rasteropacity: 0.5, - visible: true, - minZoom: 0, - maxZoom: 18, - minHeight: 0, - maxHeight: 99999999999, - type: 'vector', - layerType: 'line', - paint: { - 'line-color': '#00A1E9', - 'line-width': 4, - 'line-opacity': 0.9 - } - }, - //一级河流注记 - heliu1_lable: { - id: 'heliu1_lable', - key: 'heliu1_lable', - urlType: 'gisurl', - // url: this.gisServers.gisurl + '/geoserver/qgc/wms?SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&FORMAT=image%2Fpng&TRANSPARENT=true&STYLES&LAYERS=qgc%3Aprovinceline&exceptions=application%2Fvnd.ogc.se_inimage&SRS=EPSG%3A3857&WIDTH=768&HEIGHT=620&bbox={bbox-epsg-3857}', - url: '/geoserver/qgc/wms?service=WMS&version=1.1.0&request=GetMap&layers=qgc:river1_lineAno&styles=&bbox={bbox-epsg-3857}&width=768&height=620&srs=EPSG:3857&format=image%2Fpng&TRANSPARENT=true', - geojson_url: `/geoserver/qgc/ows?service=WFS&version=1.0.0&request=GetFeature&typeName=qgc:river1_lineAno&outputFormat=application%2Fjson&token= - `, - url_3d: '/geoserver/qgc/wms', - layers: 'qgc:river1_lineAno', - _layer: 'river1_lineAno', - rasteropacity: 1, - minZoom: 0, - maxZoom: 18, - minHeight: 0, - maxHeight: 99999999999, - type: 'wms', - layerType: 'symbol', - visible: true - }, - - /** - * 二级流域 - */ - heliu2: { - id: 'heliu2', - key: 'heliu2', - urlType: 'gisurl', - geojson_url: `/geoserver/qgc/ows?service=WFS&version=1.0.0&request=GetFeature&typeName=qgc:river2_line&maxFeatures=50&outputFormat=application/json&token= - `, - url: '/geoserver/gwc/service/tms/1.0.0/qgc%3Ariver2_line@EPSG%3A900913@pbf/{z}/{x}/{y}.pbf', - url_3d: '/geoserver/qgc/wms', - _layer: 'river2_line', - layers: 'qgc:river2_line', - lineWidth: 2, - rasteropacity: 0.5, - visible: false, - minZoom: 4, - maxZoom: 18, - minHeight: 0, - maxHeight: 1200000, - type: 'vector', - layerType: 'line', - paint: { - 'line-color': '#00A1E9', - 'line-width': 3, - 'line-opacity': 0.9 - } - }, - //二级河流注记 - heliu2_lable: { - id: 'heliu2_lable', - key: 'heliu2_lable', - urlType: 'gisurl', - // url: this.gisServers.gisurl + '/geoserver/qgc/wms?SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&FORMAT=image%2Fpng&TRANSPARENT=true&STYLES&LAYERS=qgc%3Aprovinceline&exceptions=application%2Fvnd.ogc.se_inimage&SRS=EPSG%3A3857&WIDTH=768&HEIGHT=620&bbox={bbox-epsg-3857}', - url: '/geoserver/qgc/wms?service=WMS&version=1.1.0&request=GetMap&layers=qgc:river2_lineAno&styles=&bbox={bbox-epsg-3857}&width=768&height=620&srs=EPSG:3857&format=image%2Fpng&TRANSPARENT=true', - geojson_url: `/geoserver/qgc/ows?service=WFS&version=1.0.0&request=GetFeature&typeName=qgc:river2_lineAno&outputFormat=application%2Fjson&token= - `, - url_3d: '/geoserver/qgc/wms', - layers: 'qgc:river2_lineAno', - _layer: 'river2_lineAno', - rasteropacity: 1, - minZoom: 4, - maxZoom: 18, - minHeight: 0, - maxHeight: 1200000, - type: 'wms', - layerType: 'symbol', - visible: true - }, - /** - * 三级流域 - */ - heliu3: { - id: 'heliu3', - key: 'heliu3', - urlType: 'gisurl', - geojson_url: `/geoserver/qgc/ows?service=WFS&version=1.0.0&request=GetFeature&typeName=qgc:river3_line&maxFeatures=50&outputFormat=application/json&token= - `, - url: '/geoserver/gwc/service/tms/1.0.0/qgc%3Ariver3_line@EPSG%3A900913@pbf/{z}/{x}/{y}.pbf', - url_3d: '/geoserver/qgc/wms', - _layer: 'river3_line', - layers: 'qgc:river3_line', - lineWidth: 1, - rasteropacity: 0.5, - visible: false, - minZoom: 6, - maxZoom: 18, - minHeight: 0, - maxHeight: 800000, - type: 'vector', - layerType: 'line', - paint: { - 'line-color': '#00A1E9', - 'line-width': 2, - 'line-opacity': 0.9 - } - }, - //三级河流注记 - heliu3_lable: { - id: 'heliu3_lable', - key: 'heliu3_lable', - urlType: 'gisurl', - // url: this.gisServers.gisurl + '/geoserver/qgc/wms?SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&FORMAT=image%2Fpng&TRANSPARENT=true&STYLES&LAYERS=qgc%3Aprovinceline&exceptions=application%2Fvnd.ogc.se_inimage&SRS=EPSG%3A3857&WIDTH=768&HEIGHT=620&bbox={bbox-epsg-3857}', - url: '/geoserver/qgc/wms?service=WMS&version=1.1.0&request=GetMap&layers=qgc:river3_lineAno&styles=&bbox={bbox-epsg-3857}&width=768&height=620&srs=EPSG:3857&format=image%2Fpng&TRANSPARENT=true', - geojson_url: `/geoserver/qgc/ows?service=WFS&version=1.0.0&request=GetFeature&typeName=qgc:river3_lineAno&outputFormat=application%2Fjson&token= - `, - url_3d: '/geoserver/qgc/wms', - layers: 'qgc:river3_lineAno', - _layer: 'river3_lineAno', - rasteropacity: 1, - minZoom: 6, - maxZoom: 18, - minHeight: 0, - maxHeight: 800000, - type: 'wms', - layerType: 'symbol', - visible: true - }, - /** - * 四级流域 - */ - heliu4: { - id: 'heliu4', - key: 'heliu4', - urlType: 'gisurl', - url: '/geoserver/gwc/service/tms/1.0.0/qgc%3Ariver4_line@EPSG%3A900913@pbf/{z}/{x}/{y}.pbf', - url_3d: '/geoserver/qgc/wms', - geojson_url: `/geoserver/qgc/ows?service=WFS&version=1.0.0&request=GetFeature&typeName=qgc:river4_line&maxFeatures=8000&outputFormat=application%2Fjson&token= - `, - _layer: 'river4_line', - layers: 'qgc:river4_line', - visible: false, - minZoom: 8, - maxZoom: 18, - minHeight: 0, - maxHeight: 800000, - rasteropacity: 1, - type: 'vector', - layerType: 'line', - paint: { - 'line-color': '#00A1E9', - 'line-width': 1, - 'line-opacity': 0.9 - } - }, - //四级河流注记 - heliu4_lable: { - id: 'heliu4_lable', - key: 'heliu4_lable', - urlType: 'gisurl', - // url: this.gisServers.gisurl + '/geoserver/qgc/wms?SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&FORMAT=image%2Fpng&TRANSPARENT=true&STYLES&LAYERS=qgc%3Aprovinceline&exceptions=application%2Fvnd.ogc.se_inimage&SRS=EPSG%3A3857&WIDTH=768&HEIGHT=620&bbox={bbox-epsg-3857}', - url: '/geoserver/qgc/wms?service=WMS&version=1.1.0&request=GetMap&layers=qgc:river4_lineAno&styles=&bbox={bbox-epsg-3857}&width=768&height=620&srs=EPSG:3857&format=image%2Fpng&TRANSPARENT=true', - geojson_url: `/geoserver/qgc/ows?service=WFS&version=1.0.0&request=GetFeature&typeName=qgc:river4_lineAno&outputFormat=application%2Fjson&token= - `, - url_3d: '/geoserver/qgc/wms', - layers: 'qgc:river4_lineAno', - _layer: 'river4_lineAno', - rasteropacity: 1, - minZoom: 8, - maxZoom: 18, - minHeight: 0, - maxHeight: 800000, - type: 'wms', - layerType: 'symbol', - - visible: true - }, - /** - * 五级流域 - 水质等级图层 - */ - heliu5: { - id: 'heliu5', - key: 'heliu5', - urlType: 'gisurl', - url: '/geoserver/gwc/service/tms/1.0.0/qgc%3Ariver5_line@EPSG%3A900913@pbf/{z}/{x}/{y}.pbf', - url_3d: '/geoserver/qgc/wms', - geojson_url: `/geoserver/qgc/ows?service=WFS&version=1.0.0&request=GetFeature&typeName=qgc:river5_line&maxFeatures=8000&outputFormat=application%2Fjson&token= - `, - _layer: 'river5_line', - layers: 'qgc:river5_line', - visible: false, - minZoom: 8, - maxZoom: 18, - minHeight: 0, - maxHeight: 800000, - rasteropacity: 1, - type: 'vector', - layerType: 'line', - paint: { - 'line-color': '#00A1E9', - 'line-width': 1, - 'line-opacity': 0.9 - } - }, - //五级河流注记 - heliu5_lable: { - id: 'heliu5_lable', - key: 'heliu5_lable', - urlType: 'gisurl', - // url: this.gisServers.gisurl + '/geoserver/qgc/wms?SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&FORMAT=image%2Fpng&TRANSPARENT=true&STYLES&LAYERS=qgc%3Aprovinceline&exceptions=application%2Fvnd.ogc.se_inimage&SRS=EPSG%3A3857&WIDTH=768&HEIGHT=620&bbox={bbox-epsg-3857}', - url: '/geoserver/qgc/wms?service=WMS&version=1.1.0&request=GetMap&layers=qgc:river5_lineAno&styles=&bbox={bbox-epsg-3857}&width=768&height=620&srs=EPSG:3857&format=image%2Fpng&TRANSPARENT=true', - geojson_url: `/geoserver/qgc/ows?service=WFS&version=1.0.0&request=GetFeature&typeName=qgc:river5_lineAno&outputFormat=application%2Fjson&token= - `, - url_3d: '/geoserver/qgc/wms', - layers: 'qgc:river5_lineAno', - _layer: 'river5_lineAno', - rasteropacity: 1, - minZoom: 8, - maxZoom: 18, - minHeight: 0, - maxHeight: 800000, - type: 'wms', - layerType: 'symbol', - visible: true - }, - //流域梯级图 - Tertiarybasin: { - id: 'Tertiarybasin', - key: 'Tertiarybasin', - urlType: 'gisurl', - url: '/geoserver/gwc/service/tms/1.0.0/qgc%3Anew_LiuYuThrLev@EPSG%3A900913@pbf/{z}/{x}/{y}.pbf', - url_3d: '/geoserver/qgc/wms', - geojson_url: `/geoserver/qgc/ows?service=WFS&version=1.0.0&request=GetFeature&typeName=qgc:new_LiuYuThrLev&outputFormat=application%2Fjson&token= - `, - _layer: 'new_LiuYuThrLev', - layers: 'qgc:new_LiuYuThrLev', - visible: true, - minZoom: 1, - maxZoom: 18, - minHeight: 0, - maxHeight: 800000, - rasteropacity: 0.8, - type: 'vector', - layerType: 'fill' - }, - // //鱼类栖息地 - // fishQxd: { - // id: 'fishQxd', - // key: 'fishQxd', - // urlType: 'gisurl', - // url: '/geoserver/gwc/service/tms/1.0.0/qgc%3Afish_qxd@EPSG%3A900913@pbf/{z}/{x}/{y}.pbf', - // url_3d: '/geoserver/qgc/wms', - // geojson_url: `/geoserver/qgc/ows?service=WFS&version=1.0.0&request=GetFeature&typeName=qgc:fish_qxd&outputFormat=application%2Fjson&token= - // `, - // _layer: 'fish_qxd', - // layers: 'qgc:fish_qxd', - // visible: true, - // minZoom: 0, - // maxZoom: 18, - // minHeight: 0, - // maxHeight: 80000000, - // rasteropacity: 0.9, - // type: 'vector', - // layerType: 'line', - // lineWidth: 2, - // paint: { - // 'line-color': '#A21C83', - // 'line-width': 4, - // 'line-opacity': 1 - // } - // }, - /** - * 水功能分区 - */ - WaterFunctionPartition: { - id: 'WaterFunctionPartition', - key: 'WaterFunctionPartition', - urlType: 'gisurl', - url: '/geoserver/gwc/service/tms/1.0.0/qgc%3AGNQ@EPSG%3A900913@pbf/{z}/{x}/{y}.pbf', - url_3d: '/geoserver/qgc/wms', - geojson_url: `/geoserver/qgc/ows?service=WFS&version=1.0.0&request=GetFeature&typeName=qgc:GNQ&outputFormat=application%2Fjson&token=`, - _layer: 'GNQ', - layers: 'qgc:GNQ', - visible: true, - minZoom: 0, - maxZoom: 18, - minHeight: 0, - maxHeight: 8000000, - rasteropacity: 0.9, - type: 'vector', - layerType: 'line', - lineWidth: 2, - paint: { - 'line-color': '#A21C83', - 'line-width': 3, - 'line-opacity': 0 - } - } -}; - -/** - * 获取Gis图层配置 - * @param key gis服务key - * @returns - */ -// export const getConfig = (key: string) => { -// const mapBaseUrls: Record = MemoryCache.get('mapBaseUrls') || {} -// if (Object.prototype.hasOwnProperty.call(servers, key)) { -// const r = { ...servers[key] } -// const { urlType } = r -// const baseUrlObj = mapBaseUrls[urlType as string] -// if (baseUrlObj) { -// r.url = baseUrlObj.url + r.url -// r.url_3d = baseUrlObj.url + r.url_3d -// if (r.geojson_url) { -// r.geojson_url = baseUrlObj.url + r.geojson_url -// } -// } -// return r -// } -// console.warn(`The gis config which key is ${key} not exist!`) -// return null -// } diff --git a/frontend-sjgl/src/components/gis/ol/point-layer-manager.ts b/frontend-sjgl/src/components/gis/ol/point-layer-manager.ts deleted file mode 100644 index 87e29dd7..00000000 --- a/frontend-sjgl/src/components/gis/ol/point-layer-manager.ts +++ /dev/null @@ -1,391 +0,0 @@ -import Feature from 'ol/Feature'; -import Point from 'ol/geom/Point'; -import OlMap from 'ol/Map'; -import VectorLayer from 'ol/layer/Vector'; -import VectorSource from 'ol/source/Vector'; -import { fromLonLat } from 'ol/proj'; -import { getIconPath } from '@/utils/index'; -type PointLayerStyleFactory = (feature: Feature) => any; - -type PointLayerManagerOptions = { - map: OlMap | null; - createStyle: PointLayerStyleFactory; -}; - -export class PointLayerManager { - private map: OlMap | null; - private createStyle: PointLayerStyleFactory; - private layerRegistry: Map> = new Map(); - private layerFeatureIndexes: Map< - string, - Map> - > = new Map(); - - constructor(options: PointLayerManagerOptions) { - this.map = options.map; - this.createStyle = options.createStyle; - } - - // 备注:同步更新地图实例,供地图初始化后把真实 map 注入点图层管理器。 - setMap(map: OlMap | null) { - this.map = map; - } - - // 备注:获取当前屏幕可视区域内的所有点要素(仅包含图层可见且图例可见的要素)。 - getFeaturesInViewport(): Feature[] { - if (!this.map) return []; - - const extent = this.map.getView().calculateExtent(this.map.getSize()); - if (!extent) return []; - - const [minX, minY, maxX, maxY] = extent; - const result: Feature[] = []; - - this.forEachFeature((feature, layer) => { - // 跳过图层本身不可见的要素 - if (!layer.getVisible()) return; - - const geom = feature.getGeometry(); - if (!geom || geom.getType() !== 'Point') return; - - const coords = (geom as Point).getCoordinates(); - const [x, y] = coords; - - if (x >= minX && x <= maxX && y >= minY && y <= maxY) { - result.push(feature); - } - }); - - return result; - } - - // 备注:统一返回当前点图层注册表,供外层做遍历或清理。 - getRegistry() { - return this.layerRegistry; - } - - // 备注:按图层 key 获取已注册的点图层实例。 - getLayer(layerKey: string) { - return this.layerRegistry.get(layerKey); - } - - // 备注:返回当前所有点图层实例,供命中检测和批量刷新使用。 - getLayers(): VectorLayer[] { - return Array.from(this.layerRegistry.values()); - } - - // 备注:按当前缩放级别统一刷新近邻点展开坐标,保证抽吸后的点击和 popup 与视觉位置一致。 - updateNearbyFeatureLayout(currentZoom?: number): void { - if (!this.map) return; - - if (currentZoom === undefined || !Number.isFinite(currentZoom)) { - return; - } - - this.forEachFeature(feature => { - this.resetFeatureToBaseCoordinate(feature); - }); - } - - // 备注:判断指定图层 key 的点图层是否已存在。 - hasLayer(layerKey: string): boolean { - return this.layerRegistry.has(layerKey); - } - - // 备注:按需获取或创建点图层实例,并自动完成注册与挂载。 - ensureLayer(layerKey: string, layerType?: string) { - if (!this.map || !layerKey) return null; - - let vectorLayer = this.layerRegistry.get(layerKey); - if (vectorLayer) { - return vectorLayer; - } - - const vectorSource = new VectorSource(); - vectorLayer = new VectorLayer({ - source: vectorSource, - zIndex: 100, - declutter: true, - style: feature => this.createStyle(feature as Feature) - }); - (vectorLayer as any).type = layerType || layerKey; - this.layerRegistry.set(layerKey, vectorLayer); - this.map.addLayer(vectorLayer); - return vectorLayer; - } - - // 备注:把后端点位数组转换为 OpenLayers Feature,并写入指定点图层。 - addDataLayer(pointData: any, layerType: string): void { - if (!this.map) return; - - let dataArray: any[] = []; - let targetLayerKey = layerType; - - if (Array.isArray(pointData)) { - dataArray = pointData; - } else { - dataArray = pointData?.data || []; - targetLayerKey = pointData?.key || layerType; - } - - if (!targetLayerKey) { - console.warn('缺少图层 Key,无法加载描点'); - return; - } - - const vectorLayer = this.ensureLayer(targetLayerKey, layerType); - if (!vectorLayer) return; - - const vectorSource = vectorLayer.getSource(); - if (!vectorSource) { - return; - } - - vectorSource.clear(); - this.resetLayerFeatureIndexes(targetLayerKey); - - if (dataArray.length === 0) { - return; - } - - const features: Feature[] = []; - - dataArray.forEach((item: any) => { - const feature = this.createFeature(item, targetLayerKey); - if (feature) { - this.indexFeature(targetLayerKey, feature); - features.push(feature); - } - }); - - if (features.length > 0) { - vectorSource.addFeatures(features); - } - } - - // 备注:统一控制整个点图层显隐,供图层树勾选联动使用。 - setLayerVisible(layerKey: string, visible?: boolean): void { - const vectorLayer = this.layerRegistry.get(layerKey); - if (vectorLayer && vectorLayer.getVisible() !== visible) { - vectorLayer.setVisible(visible); - vectorLayer.changed(); - } - } - - // 备注:按图层 key 删除点图层并清空其 source 数据。 - removeLayer(layerKey: string): void { - if (!this.map || !layerKey) { - console.warn('removePointLayer: 无效的图层 key 或地图未初始化'); - return; - } - - const vectorLayer = this.layerRegistry.get(layerKey); - if (!vectorLayer) { - console.warn(`未找到标识为 [${layerKey}] 的描点图层实例`); - return; - } - - const source = vectorLayer.getSource(); - if (source) { - source.clear(); - } - this.map.removeLayer(vectorLayer); - this.layerRegistry.delete(layerKey); - this.layerFeatureIndexes.delete(layerKey); - } - - // 备注:按图层遍历所有点图层实例,供 hover 刷新和区域裁切复用。 - forEachLayer( - callback: (layer: VectorLayer, layerKey: string) => void - ): void { - this.layerRegistry.forEach((layer, layerKey) => { - callback(layer, layerKey); - }); - } - - // 备注:遍历所有点要素,供区域裁切或批量状态更新使用。 - forEachFeature( - callback: ( - feature: Feature, - layer: VectorLayer, - layerKey: string - ) => void - ): void { - this.forEachLayer((layer, layerKey) => { - const source = layer.getSource(); - if (!source) return; - source.getFeatures().forEach(feature => { - callback(feature as Feature, layer, layerKey); - }); - }); - } - - // 备注:按图例字段值统一控制要素显隐,供图例和容量筛选联动复用。 - setLegendVisibleByField( - layerKey: string, - matchValue: string, - checked: boolean, - fieldKey = 'anchoPointState' - ): void { - const vectorLayer = this.layerRegistry.get(layerKey); - if (!vectorLayer) return; - - const source = vectorLayer.getSource(); - if (!source) return; - - if (!matchValue) { - source.getFeatures().forEach(feature => { - if (feature.get('_legendVisible') !== false) { - feature.set('_legendVisible', false); - feature.changed(); - } - }); - vectorLayer.changed(); - return; - } - - const targetFeatures = this.getIndexedFeatures( - layerKey, - fieldKey, - matchValue - ); - if (targetFeatures.length === 0) return; - - targetFeatures.forEach(feature => { - if (feature.get('_legendVisible') !== checked) { - feature.set('_legendVisible', checked); - feature.changed(); - } - }); - vectorLayer.changed(); - } - - // 备注:统一销毁所有点图层并清空注册表,供地图销毁阶段复用。 - destroy(): void { - this.forEachLayer(layer => { - const source = layer.getSource(); - if (source) { - source.clear(); - } - if (this.map && this.map.getLayers().getArray().includes(layer)) { - this.map.removeLayer(layer); - } - if ((layer as any).setMap) { - (layer as any).setMap(null); - } - }); - this.layerRegistry.clear(); - this.layerFeatureIndexes.clear(); - } - - // 备注:统一把业务点位数据转换为 Feature,并补齐样式依赖字段。 - private createFeature(item: any, targetLayerKey: string): Feature | null { - const { lgtd, lttd, stnm, iconCode, titleName, ennm } = item; - - if (lgtd == null || lttd == null) { - return null; - } - - const lon = Number(lgtd); - const lat = Number(lttd); - if (isNaN(lon) || isNaN(lat) || !isFinite(lon) || !isFinite(lat)) { - return null; - } - if (Math.abs(lon) > 180 || Math.abs(lat) > 90) { - return null; - } - - const coord = fromLonLat([lon, lat]); - if (!isFinite(coord[0]) || !isFinite(coord[1])) { - return null; - } - let iconUrl = iconCode ? getIconPath(iconCode) : ''; - if (!iconUrl) { - iconUrl = getIconPath('default') || ''; - } - - const feature = new Feature({ - geometry: new Point(coord), - ...item, - _layerKey: targetLayerKey - }); - const rawFeatureId = - item.stcd || item._id || `${lon.toFixed(6)},${lat.toFixed(6)}`; - feature.setId(`${targetLayerKey}:${rawFeatureId}`); - feature.set('_iconUrl', iconUrl); - feature.set( - '_labelText', - item.sttpMap === 'ylfb' ? item.ftp || '' : titleName || stnm || ennm || '' - ); - feature.set('_baseCoordinates', coord); - feature.set('_legendVisible', true); - feature.set('_regionVisible', true); - feature.set('_sttpMap', item.sttpMap); - if (item.popupHtml) { - feature.set('popupHtml', item.popupHtml); - } - - return feature; - } - - // 备注:重置单个图层的字段索引,供重新灌入数据或删除图层时复用。 - private resetLayerFeatureIndexes(layerKey: string): void { - this.layerFeatureIndexes.set(layerKey, new Map()); - } - - // 备注:按字段值给要素建立索引,供图例切换时快速命中目标锚点集合。 - private indexFeature(layerKey: string, feature: Feature): void { - const fieldIndexMap = - this.layerFeatureIndexes.get(layerKey) || - new Map>(); - - const legendFieldKey = 'anchoPointState'; - const legendFieldValue = feature.get(legendFieldKey); - if (legendFieldValue != null) { - const valueMap = - fieldIndexMap.get(legendFieldKey) || new Map(); - const normalizedValue = String(legendFieldValue); - const targetFeatures = valueMap.get(normalizedValue) || []; - targetFeatures.push(feature); - valueMap.set(normalizedValue, targetFeatures); - fieldIndexMap.set(legendFieldKey, valueMap); - } - - this.layerFeatureIndexes.set(layerKey, fieldIndexMap); - } - - // 备注:根据图层 key、字段名和值快速返回目标要素集合,避免图例切换时整层遍历。 - private getIndexedFeatures( - layerKey: string, - fieldKey: string, - matchValue: string - ): Feature[] { - const fieldIndexMap = this.layerFeatureIndexes.get(layerKey); - if (!fieldIndexMap) return []; - - const valueMap = fieldIndexMap.get(fieldKey); - if (!valueMap) return []; - return valueMap.get(String(matchValue)) || []; - } - - // 备注:先恢复要素原始坐标,再按缩放阶段决定是否做展开偏移,避免多次缩放后偏移累计。 - private resetFeatureToBaseCoordinate(feature: Feature): void { - const baseCoordinates = feature.get('_baseCoordinates') as - | number[] - | undefined; - const geometry = feature.getGeometry(); - if ( - !baseCoordinates || - baseCoordinates.length < 2 || - !geometry || - geometry.getType() !== 'Point' - ) { - return; - } - - (geometry as Point).setCoordinates([ - baseCoordinates[0], - baseCoordinates[1] - ]); - } -} diff --git a/frontend-sjgl/src/components/gis/ol/popup-manager.ts b/frontend-sjgl/src/components/gis/ol/popup-manager.ts deleted file mode 100644 index 929d8dfb..00000000 --- a/frontend-sjgl/src/components/gis/ol/popup-manager.ts +++ /dev/null @@ -1,530 +0,0 @@ -import Feature from 'ol/Feature'; -import Point from 'ol/geom/Point'; -import OlMap from 'ol/Map'; -import Overlay from 'ol/Overlay'; -import VectorLayer from 'ol/layer/Vector'; -import VectorSource from 'ol/source/Vector'; -import { - generatePopupHtml, - shouldPreferEng2Popup -} from '@/utils/popupHtmlGenerator'; - -type PopupManagerOptions = { - map: OlMap | null; - getPointLayers: () => VectorLayer[]; -}; - -type PopupHitResult = { - detectedFeature: Feature | undefined; - isHitIcon: boolean; - coordinate?: number[]; -}; - -type PointerMoveChangePayload = { - hoveredId: string | number | null; - detectedFeature: Feature | undefined; - coordinate?: number[]; -}; - -export class PopupManager { - private map: OlMap | null; - private popupOverlay: Overlay | null = null; - private popupElement: HTMLElement | null = null; - private batchPopupContainer: HTMLDivElement | null = null; - private batchPopupItems: Array<{ - feature: Feature; - element: HTMLDivElement; - }> = []; - private lastHoveredId: string | number | null = null; - private animationFrameId: number | null = null; - private getPointLayers: () => VectorLayer[]; - private popupMouseEnterHandler: (() => void) | null = null; - private popupMouseMoveHandler: (() => void) | null = null; - private hoverChangeHandler: - | ((payload: PointerMoveChangePayload) => void) - | undefined; - - constructor(options: PopupManagerOptions) { - this.map = options.map; - this.getPointLayers = options.getPointLayers; - } - - // 备注:同步地图实例,供地图初始化和销毁后更新 Popup 管理器上下文。 - setMap(map: OlMap | null) { - this.map = map; - } - - // 备注:初始化 Popup Overlay 并挂载到地图实例。 - initPopupOverlay(container: HTMLElement) { - this.popupElement = container; - this.popupElement.style.display = 'none'; - this.popupElement.style.removeProperty('position'); - this.popupElement.style.removeProperty('transform'); - this.popupElement.style.removeProperty('left'); - this.popupElement.style.removeProperty('top'); - this.popupElement.style.setProperty('pointer-events', 'none', 'important'); - this.popupMouseEnterHandler = () => { - this.forceHidePopup(); - }; - this.popupMouseMoveHandler = () => { - this.forceHidePopup(); - }; - this.popupElement.addEventListener( - 'mouseenter', - this.popupMouseEnterHandler - ); - this.popupElement.addEventListener('mousemove', this.popupMouseMoveHandler); - this.popupOverlay = new Overlay({ - element: this.popupElement, - positioning: 'bottom-center', - offset: [0, -10], - stopEvent: false, - autoPan: false - }); - - if (this.map) { - this.map.addOverlay(this.popupOverlay); - } - } - - // 备注:统一处理地图点击命中检测,命中图标时通过回调把要素抛给外层。 - handleMapClick( - pixel: number[], - onHit?: (feature: Feature, coordinate?: number[]) => void - ) { - const { detectedFeature, isHitIcon, coordinate } = - this.detectFeatureAtPixel(pixel); - if (detectedFeature && isHitIcon) { - onHit?.(detectedFeature, coordinate); - } - } - - // 备注:统一处理鼠标悬停命中检测与节流,只有 hover 目标变化时才通知外层刷新。 - handlePointerMove( - pixel: number[], - onHoverChange?: (payload: PointerMoveChangePayload) => void - ) { - if (!this.map) return; - this.hoverChangeHandler = onHoverChange; - - const zoom = this.map.getView().getZoom(); - if (zoom !== undefined && zoom < 4.7) { - return; - } - - if (this.animationFrameId) { - cancelAnimationFrame(this.animationFrameId); - } - - this.animationFrameId = requestAnimationFrame(() => { - const { detectedFeature, isHitIcon, coordinate } = - this.detectFeatureAtPixel(pixel); - const hoveredId = - detectedFeature && isHitIcon ? (detectedFeature.getId() as any) : null; - const nextFeature = hoveredId ? detectedFeature : undefined; - const nextCoordinate = hoveredId ? coordinate : undefined; - - if (hoveredId !== this.lastHoveredId) { - this.emitHoverChange({ - hoveredId, - detectedFeature: nextFeature, - coordinate: nextCoordinate - }); - } - }); - } - - // 备注:在指定像素位置检测点图层要素,并判断是否命中图标区域。 - detectFeatureAtPixel(pixel: number[]): PopupHitResult { - let detectedFeature: Feature | undefined = undefined; - let isHitIcon = false; - let coordinate: number[] | undefined; - const pointLayers = this.getPointLayers(); - - if (this.isPixelInsidePopup(pixel)) { - return { - detectedFeature: undefined, - isHitIcon: false, - coordinate: undefined - }; - } - - this.map?.forEachFeatureAtPixel( - pixel, - (feature, layer) => { - if (pointLayers.includes(layer as VectorLayer)) { - detectedFeature = feature as Feature; - const geom = feature.getGeometry(); - if (geom && geom.getType() === 'Point') { - coordinate = (geom as Point).getCoordinates(); - const iconPixel = this.map?.getPixelFromCoordinate(coordinate); - if (iconPixel) { - const dx = pixel[0] - iconPixel[0]; - const dy = pixel[1] - iconPixel[1]; - if (this.isPixelInsideIconArea(dx, dy)) { - isHitIcon = true; - } - } - } - - return true; - } - return false; - }, - { hitTolerance: 0 } - ); - - return { detectedFeature, isHitIcon, coordinate }; - } - - // 备注:仅把图标本体区域作为 hover 命中范围,避免上方文字标签被误判为图标命中。 - private isPixelInsideIconArea(dx: number, dy: number): boolean { - if (!this.map) return false; - - const zoom = this.map.getView().getZoom() ?? 4.5; - let dynamicScale = 0.7 + (zoom - 4.5) * 0.08; - dynamicScale = Math.max(0.5, Math.min(3.0, dynamicScale)); - - const halfWidth = 12 * dynamicScale; - const topReach = 8 * dynamicScale; - const bottomReach = 12 * dynamicScale; - - return ( - dx >= -halfWidth && - dx <= halfWidth && - dy >= -topReach && - dy <= bottomReach - ); - } - - // 备注:根据当前悬停要素统一显示或隐藏 Popup 内容。 - showPopup(feature: Feature | undefined, coordinate: number[] | undefined) { - if (!this.popupOverlay || !this.popupElement) return; - - if (feature && coordinate) { - const props = feature.getProperties(); - const popupHtml = this.getPopupHtml(props); - - if (popupHtml) { - this.popupElement.innerHTML = popupHtml; - this.popupOverlay.setPosition(coordinate); - this.popupElement.style.display = 'block'; - return; - } - } - - this.popupOverlay.setPosition(undefined); - this.popupElement.style.display = 'none'; - } - - private getPopupHtml(props: Record) { - return props.popupHtml || generatePopupHtml(props); - } - - // 备注:批量显示多个要素的 Popup,使用绝对定位的 div 而非 Overlay。 - showPopupsForFeatures( - features: Feature[], - styleChecker?: (feature: Feature) => boolean, - options?: { - rebuild?: boolean; - } - ) { - if (!this.map || !this.popupElement) return; - const shouldRebuild = options?.rebuild !== false; - - // 过滤:只显示图例可见的要素 - const visibleFeatures = features.filter( - f => f.get('_legendVisible') !== false - ); - - if (visibleFeatures.length === 0) { - this.clearBatchPopups(); - return; - } - - if (!shouldRebuild && this.batchPopupItems.length > 0) { - this.updateBatchPopupPositions(styleChecker); - return; - } - - this.clearBatchPopups(); - - const mapElement = this.map.getTargetElement(); - const batchContainer = document.createElement('div'); - batchContainer.className = 'batch-popup-container'; - batchContainer.style.cssText = ` - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - pointer-events: none; - z-index: 1000; - `; - batchContainer.id = 'batch-popup-container'; - this.batchPopupContainer = batchContainer; - - // 先添加容器到 DOM,以便后续元素能正确测量尺寸 - mapElement.appendChild(batchContainer); - - // 用于碰撞检测的已放置 popup 列表 - const placedPopups: Array<{ - left: number; - right: number; - top: number; - bottom: number; - }> = []; - visibleFeatures.forEach(feature => { - const geom = feature.getGeometry(); - if (!geom || geom.getType() !== 'Point') return; - - const coords = (geom as Point).getCoordinates(); - const pixel = this.map?.getPixelFromCoordinate(coords); - if (!pixel) return; - - // 检查样式是否隐藏(declutter、距离过滤等) - if (styleChecker && !styleChecker(feature)) { - return; - } - - const props = feature.getProperties(); - const popupHtml = shouldPreferEng2Popup(props) - ? generatePopupHtml(props, { forceEng2: true }) || - props.popupHtml || - generatePopupHtml(props) - : this.getPopupHtml(props); - if (!popupHtml) return; - - // 创建与原始 popupElement 完全相同的样式 - const popupEl = document.createElement('div'); - popupEl.className = this.popupElement.className; - popupEl.innerHTML = popupHtml; - // 不设置自定义 cssText,只设置定位(对应原始 popup 的 positioning: 'bottom-center', offset: [0, -10]) - popupEl.style.position = 'absolute'; - popupEl.style.display = 'block'; - popupEl.style.transform = 'translate(-50%, -100%)'; // bottom-center 对齐 - popupEl.style.pointerEvents = 'none'; - - // 临时设置 visibility: hidden 来测量尺寸 - popupEl.style.visibility = 'hidden'; - popupEl.style.left = `${pixel[0]}px`; - popupEl.style.top = `${pixel[1] - 10}px`; - batchContainer.appendChild(popupEl); - - // 获取 popup 尺寸 - const rect = popupEl.getBoundingClientRect(); - const popupWidth = rect.width; - const popupHeight = rect.height; - - // 计算 popup 的位置(对应原始 positioning: 'bottom-center', offset: [0, -10]) - const popupX = pixel[0]; - const popupY = pixel[1] - 10; // bottom-center 对齐 + 10px 偏移 - const popupRect = { - left: popupX - popupWidth / 2, - right: popupX + popupWidth / 2, - top: popupY - popupHeight, - bottom: popupY - }; - - // 碰撞检测 - let hasCollision = false; - for (const placed of placedPopups) { - if (this.checkCollision(popupRect, placed)) { - hasCollision = true; - break; - } - } - - if (!hasCollision) { - // 无碰撞,显示 popup - popupEl.style.visibility = 'visible'; - popupEl.style.left = `${popupX}px`; - popupEl.style.top = `${popupY}px`; - this.batchPopupItems.push({ - feature, - element: popupEl - }); - - placedPopups.push({ - left: popupRect.left, - right: popupRect.right, - top: popupRect.top, - bottom: popupRect.bottom - }); - } else { - // 有碰撞,移除该 popup - batchContainer.removeChild(popupEl); - } - }); - } - - updateBatchPopupPositions(styleChecker?: (feature: Feature) => boolean) { - if ( - !this.map || - !this.batchPopupContainer || - this.batchPopupItems.length === 0 - ) { - return; - } - - const mapSize = this.map.getSize(); - const viewportWidth = mapSize?.[0] ?? 0; - const viewportHeight = mapSize?.[1] ?? 0; - const viewportPadding = 48; - - this.batchPopupItems.forEach(({ feature, element }) => { - if (feature.get('_legendVisible') === false) { - element.style.display = 'none'; - return; - } - - if (styleChecker && !styleChecker(feature)) { - element.style.display = 'none'; - return; - } - - const geom = feature.getGeometry(); - if (!geom || geom.getType() !== 'Point') { - element.style.display = 'none'; - return; - } - - const coords = (geom as Point).getCoordinates(); - const pixel = this.map?.getPixelFromCoordinate(coords); - if (!pixel) { - element.style.display = 'none'; - return; - } - - const popupX = pixel[0]; - const popupY = pixel[1] - 10; - if ( - popupX < -viewportPadding || - popupY < -viewportPadding || - popupX > viewportWidth + viewportPadding || - popupY > viewportHeight + viewportPadding - ) { - element.style.display = 'none'; - return; - } - - element.style.left = `${popupX}px`; - element.style.top = `${popupY}px`; - element.style.display = 'block'; - }); - } - - // 备注:清除批量显示的 popups。 - clearBatchPopups() { - this.batchPopupItems = []; - if (this.batchPopupContainer) { - this.batchPopupContainer.remove(); - this.batchPopupContainer = null; - return; - } - - const existing = document.getElementById('batch-popup-container'); - if (existing) { - existing.remove(); - } - } - - // 备注:检测两个 popup 矩形是否碰撞。 - private checkCollision( - rect1: { left: number; right: number; top: number; bottom: number }, - rect2: { left: number; right: number; top: number; bottom: number } - ): boolean { - const padding = 4; - return !( - rect1.right + padding < rect2.left || - rect1.left - padding > rect2.right || - rect1.bottom + padding < rect2.top || - rect1.top - padding > rect2.bottom - ); - } - - // 备注:统一重置 hover 和 Popup 状态,供地图销毁和切换时复用。 - reset() { - if (this.animationFrameId) { - cancelAnimationFrame(this.animationFrameId); - this.animationFrameId = null; - } - this.emitHoverChange({ - hoveredId: null, - detectedFeature: undefined, - coordinate: undefined - }); - } - - // 备注:在弹窗层意外接管鼠标时,通过统一 hover 回调链路立即清空当前悬停状态。 - private forceHidePopup() { - this.emitHoverChange({ - hoveredId: null, - detectedFeature: undefined, - coordinate: undefined - }); - } - - // 备注:统一派发 hover 变化,确保地图侧的 cursor、Popup 和图层刷新走同一条处理链路。 - private emitHoverChange(payload: PointerMoveChangePayload) { - this.lastHoveredId = payload.hoveredId; - this.hoverChangeHandler?.(payload); - if (!this.hoverChangeHandler) { - this.showPopup(payload.detectedFeature, payload.coordinate); - } - } - - // 备注:当鼠标进入当前 Popup 可见区域时,禁止再把该区域重新识别为图标 hover。 - private isPixelInsidePopup(pixel: number[]): boolean { - if (!this.map || !this.popupElement) { - return false; - } - - if (this.popupElement.style.display === 'none') { - return false; - } - - const popupRect = this.popupElement.getBoundingClientRect(); - if (popupRect.width <= 0 || popupRect.height <= 0) { - return false; - } - - const mapRect = this.map.getTargetElement().getBoundingClientRect(); - const clientX = mapRect.left + pixel[0]; - const clientY = mapRect.top + pixel[1]; - - return ( - clientX >= popupRect.left && - clientX <= popupRect.right && - clientY >= popupRect.top && - clientY <= popupRect.bottom - ); - } - - // 备注:销毁 Popup 管理器内部状态和 Overlay 引用。 - destroy() { - this.clearBatchPopups(); - this.reset(); - if (this.popupElement && this.popupMouseEnterHandler) { - this.popupElement.removeEventListener( - 'mouseenter', - this.popupMouseEnterHandler - ); - } - if (this.popupElement && this.popupMouseMoveHandler) { - this.popupElement.removeEventListener( - 'mousemove', - this.popupMouseMoveHandler - ); - } - if (this.map && this.popupOverlay) { - this.map.removeOverlay(this.popupOverlay); - } - this.popupMouseEnterHandler = null; - this.popupMouseMoveHandler = null; - this.hoverChangeHandler = undefined; - this.popupOverlay = null; - this.popupElement = null; - this.map = null; - } -} diff --git a/frontend-sjgl/src/components/gis/ol/region-mask-manager.ts b/frontend-sjgl/src/components/gis/ol/region-mask-manager.ts deleted file mode 100644 index 10989037..00000000 --- a/frontend-sjgl/src/components/gis/ol/region-mask-manager.ts +++ /dev/null @@ -1,341 +0,0 @@ -import OlMap from 'ol/Map'; -import View from 'ol/View'; -import TileLayer from 'ol/layer/Tile'; -import GeoJSON from 'ol/format/GeoJSON'; -import VectorSource from 'ol/source/Vector'; -import { fromLonLat } from 'ol/proj'; -import { PointLayerManager } from './point-layer-manager'; - -type RegionMaskManagerOptions = { - map: OlMap | null; - view: View | null; - pointLayerManager: PointLayerManager; - defaultCenter: [number, number]; - defaultZoom: number; -}; - -export class RegionMaskManager { - private map: OlMap | null; - private view: View | null; - private pointLayerManager: PointLayerManager; - private defaultCenter: [number, number]; - private defaultZoom: number; - private maskBindings: Array<{ - layer: TileLayer; - prerender: (event: any) => void; - postrender: (event: any) => void; - }> = []; - - constructor(options: RegionMaskManagerOptions) { - this.map = options.map; - this.view = options.view; - this.pointLayerManager = options.pointLayerManager; - this.defaultCenter = options.defaultCenter; - this.defaultZoom = options.defaultZoom; - } - - // 备注:同步地图和视图上下文,供地图初始化、销毁和重建后复用区域过滤能力。 - setContext(map: OlMap | null, view: View | null) { - this.map = map; - this.view = view; - } - - // 备注:统一隐藏所有点位的区域显示状态,供基地裁切前的预处理复用。 - hideAllPoints(): void { - this.pointLayerManager.forEachFeature(feature => { - feature.set('_regionVisible', false); - feature.changed(); - }); - } - - // 备注:统一恢复所有点位的区域显示状态,供取消裁切或异常兜底时复用。 - showAllPoints(): void { - this.pointLayerManager.forEachFeature(feature => { - feature.set('_regionVisible', true); - feature.changed(); - }); - } - - // 备注:根据 GeoJSON 边界批量更新点位的区域显隐状态。 - filterPointsByRegion(geoJson: any): void { - const regionCoords = this.extractPolygonCoords(geoJson); - if (!regionCoords.length) { - console.warn('无法解析区域边界,显示所有锚点'); - this.showAllPoints(); - return; - } - - this.pointLayerManager.forEachFeature(feature => { - const props = feature.getProperties(); - const lon = Number(props.lgtd); - const lat = Number(props.lttd); - - if (!isFinite(lon) || !isFinite(lat)) { - feature.set('_regionVisible', false); - feature.changed(); - return; - } - - feature.set('_regionVisible', this.isPointInPolygon(lon, lat, regionCoords)); - feature.changed(); - }); - } - - // 备注:根据 GeoJSON 范围拟合地图视野,供基地切换后快速聚焦到目标区域。 - fitViewToGeoJson(geoJson: any): void { - if (!this.map || !this.view) return; - - try { - const features = new GeoJSON().readFeatures(geoJson, { - dataProjection: 'EPSG:4326', - featureProjection: 'EPSG:3857' - }); - - if (!features.length) return; - - const source = new VectorSource({ - features - }); - const extent = source.getExtent(); - - if (extent[0] === Infinity || extent[0] === -Infinity) { - console.warn('无法计算有效的地图包围盒'); - return; - } - - this.view.fit(extent, { - padding: [100, 200, 50, 50], - duration: 1000, - maxZoom: 13 - }); - } catch (error) { - console.error('调整地图视野失败:', error); - } - } - - // 备注:把 GeoJSON 边界绑定到底图 prerender/postrender 事件,实现区域裁切遮罩。 - applyMapMask(rasterLayer: TileLayer, clipGeoJson: any): void { - this.applyMapMaskToLayers(rasterLayer ? [rasterLayer] : [], clipGeoJson); - } - - // 备注:把 GeoJSON 边界同时绑定到多个底图图层,保证多底图叠加场景下裁切边界保持一致。 - applyMapMaskToLayers(rasterLayers: TileLayer[] = [], clipGeoJson: any): void { - if (!clipGeoJson) return; - - const targetLayers = rasterLayers.filter(Boolean); - if (targetLayers.length === 0) return; - - const features = new GeoJSON().readFeatures(clipGeoJson, { - dataProjection: 'EPSG:4326', - featureProjection: 'EPSG:3857' - }); - - if (!features.length) { - console.warn('裁切数据为空,无法应用遮罩'); - return; - } - - this.clearMaskEvents(); - - targetLayers.forEach(rasterLayer => { - const maskPrerender = (event: any) => { - const context = event.context; - const frameState = event.frameState; - - if (!context || !frameState || !this.map) return; - - context.save(); - context.setTransform(1, 0, 0, 1, 0, 0); - context.beginPath(); - - let hasValidPath = false; - - for (const feature of features) { - const geometry = feature.getGeometry(); - if (!geometry) continue; - - if (geometry.getType() === 'Polygon') { - const rings = (geometry as any).getCoordinates() as number[][][]; - for (const ring of rings) { - if (this.drawRingToContext(context, ring, frameState)) { - hasValidPath = true; - } - } - } else if (geometry.getType() === 'MultiPolygon') { - const polygons = (geometry as any).getCoordinates() as number[][][][]; - for (const polygonRings of polygons) { - for (const ring of polygonRings) { - if (this.drawRingToContext(context, ring, frameState)) { - hasValidPath = true; - } - } - } - } - } - - if (!hasValidPath) { - console.warn('未能生成有效的裁切路径'); - return; - } - - context.save(); - context.lineWidth = 6; - context.strokeStyle = '#6D64DF'; - context.stroke(); - context.clip(); - context.strokeStyle = '#CCC9F4'; - context.lineWidth = 5; - context.stroke(); - context.clip(); - }; - - const maskPostrender = (event: any) => { - if (event.context) { - event.context.restore(); - event.context.restore(); - } - }; - - this.maskBindings.push({ - layer: rasterLayer, - prerender: maskPrerender, - postrender: maskPostrender - }); - - rasterLayer.on('prerender', maskPrerender); - rasterLayer.on('postrender', maskPostrender); - rasterLayer.changed(); - }); - } - - // 备注:清除当前底图遮罩并按需恢复默认视野,供切换基地和异常兜底复用。 - clearMapMask(resetView = true): void { - const maskedLayers = this.maskBindings.map(binding => binding.layer); - this.clearMaskEvents(); - - maskedLayers.forEach(layer => layer.changed()); - - if (resetView && this.view) { - this.view.animate({ - center: fromLonLat(this.defaultCenter), - zoom: this.defaultZoom, - duration: 1000 - }); - } - } - - // 备注:统一销毁区域过滤相关引用和事件,供地图销毁阶段复用。 - destroy(): void { - this.clearMapMask(false); - this.map = null; - this.view = null; - } - - // 备注:从 GeoJSON 中提取可用于点在面判断的多边形环坐标。 - private extractPolygonCoords(geoJson: any): number[][][] { - if (!geoJson?.features?.length) { - return []; - } - - const coords: number[][][] = []; - geoJson.features.forEach((feature: any) => { - const geometry = feature.geometry; - if (!geometry) return; - - if (geometry.type === 'Polygon') { - coords.push(...geometry.coordinates); - } else if (geometry.type === 'MultiPolygon') { - geometry.coordinates.forEach((polygon: number[][][]) => { - coords.push(...polygon); - }); - } - }); - - return coords; - } - - // 备注:使用射线法判断点是否落在任意一个区域环内。 - private isPointInPolygon( - lon: number, - lat: number, - polygons: number[][][] - ): boolean { - for (const polygon of polygons) { - if (this.isPointInRing(lon, lat, polygon)) { - return true; - } - } - return false; - } - - // 备注:使用射线法判断点是否落在单个闭合环内。 - private isPointInRing(lon: number, lat: number, ring: number[][]): boolean { - let inside = false; - const ringLength = ring.length; - - for (let i = 0, j = ringLength - 1; i < ringLength; j = i++) { - const xi = ring[i][0]; - const yi = ring[i][1]; - const xj = ring[j][0]; - const yj = ring[j][1]; - - const intersect = - yi > lat !== yj > lat && - lon < ((xj - xi) * (lat - yi)) / (yj - yi) + xi; - - if (intersect) { - inside = !inside; - } - } - - return inside; - } - - // 备注:把单个面环转换为当前帧 Canvas 可裁切的路径。 - private drawRingToContext( - context: CanvasRenderingContext2D, - ring: number[][], - frameState: any - ): boolean { - if (!ring || ring.length < 3) return false; - - const pixelRatio = frameState.pixelRatio || window.devicePixelRatio || 1; - let moved = false; - - for (let i = 0; i < ring.length; i++) { - const coord = ring[i]; - if (!coord || coord.length < 2 || typeof coord[0] !== 'number') { - continue; - } - - const cssPixel = this.map?.getPixelFromCoordinate(coord as [number, number]); - if (!cssPixel) continue; - - const canvasX = cssPixel[0] * pixelRatio; - const canvasY = cssPixel[1] * pixelRatio; - - if (!moved) { - context.moveTo(canvasX, canvasY); - moved = true; - } else { - context.lineTo(canvasX, canvasY); - } - } - - if (moved) { - context.closePath(); - return true; - } - - return false; - } - - // 备注:解除旧底图上的遮罩事件,避免重复绑定或残留旧裁切效果。 - private clearMaskEvents(): void { - this.maskBindings.forEach(binding => { - binding.layer.un('prerender', binding.prerender); - binding.layer.un('postrender', binding.postrender); - }); - this.maskBindings = []; - } -} diff --git a/frontend-sjgl/src/components/gis/osgbUtils.ts b/frontend-sjgl/src/components/gis/osgbUtils.ts deleted file mode 100644 index 5f4abea8..00000000 --- a/frontend-sjgl/src/components/gis/osgbUtils.ts +++ /dev/null @@ -1,747 +0,0 @@ -/** - * 倾斜摄影(OSGB)工具函数 - * 适配自旧项目 osgbTool.ts,核心逻辑保持一致 - * - * 使用字段: url, boundary, location, height, accuracy - */ -import * as turf from '@turf/turf'; -import * as Cesium from 'cesium'; -import { getToken } from '@/utils/auth'; - -// ==================== 类型定义 ==================== - -export interface OSGBLocation { - destination: number[]; // [x, y, z] 或 [lng, lat, height] - orientation: { - heading: number; - pitch: number; - roll: number; - }; - center: number[]; -} - -export interface OSGBItem { - /** 3D Tileset 服务地址 */ - url: string; - /** GeoJSON Polygon 边界(用于裁切) */ - boundary?: any; - /** 定位信息 */ - location?: OSGBLocation | string; - /** 模型高度偏移 */ - height?: number; - /** 屏幕空间误差 (默认 16) */ - accuracy?: number; - /** 内部状态 - 不要手动设置 */ - osgbtitles?: any; - cartesian3?: any; - clippingPlanes?: any; - eventListener?: any; - _loading?: boolean; - _loadId?: number; - /** 用户手动关闭开关标志:为 true 时不自动加载/显示,只做显隐切换 */ - _switchOff?: boolean; -} - -// ==================== 内部状态(每个 OSGB 实例独立) ==================== - -interface OSGBInstanceState { - destination: Cesium.Cartesian3 | null; - orientation: any; - timelookat: any; - time: number; - num: number; - witetime: number; - timeout: any; -} - -const instanceStates = new WeakMap(); - -function getState(obj: OSGBItem): OSGBInstanceState { - let state = instanceStates.get(obj); - if (!state) { - state = { - destination: null, - orientation: null, - timelookat: null, - time: 0, - num: 0, - witetime: 0, - timeout: undefined - }; - instanceStates.set(obj, state); - } - return state; -} - -function clearState(obj: OSGBItem) { - const state = instanceStates.get(obj); - if (state) { - clearTimeout(state.timeout); - clearInterval(state.timelookat); - } - instanceStates.delete(obj); -} - -// ==================== 3D Tileset 场景管理 ==================== - -/** - * 将 tileset 添加到场景 - */ -const addOSGB = (viewer: Cesium.Viewer, tileset: Cesium.Cesium3DTileset) => { - if (!viewer || viewer.isDestroyed()) return; - viewer.scene.primitives.add(tileset); -}; - -/** - * 从场景移除 tileset(PrimitiveCollection.remove 默认 destroy=true,会销毁 tileset) - */ -const removeOSGB = (viewer: Cesium.Viewer, tileset: Cesium.Cesium3DTileset) => { - if (!viewer || viewer.isDestroyed()) return; - viewer.scene.primitives.remove(tileset); -}; - -// ==================== 裁切相关 ==================== - -/** - * 规范化 GeoJSON 输入,提取纯 Geometry - * 兼容 Feature / FeatureCollection / Geometry - */ -const normalizeGeometry = (geo: any): any => { - if (!geo) return null; - // 已经是 Geometry 类型(有 type 且 coordinates) - if (geo.type && geo.coordinates) return geo; - // Feature → 提取 geometry - if (geo.type === 'Feature' && geo.geometry) return geo.geometry; - // FeatureCollection → 取第一个 feature 的 geometry - if (geo.type === 'FeatureCollection' && geo.features?.length) { - return normalizeGeometry(geo.features[0]); - } - return null; -}; - -const get_verts_core = (poly: any): Cesium.Cartesian3[] => { - const verts_carte3: Cesium.Cartesian3[] = []; - if (!poly) return verts_carte3; - - try { - // 规范化输入:兼容 Feature / FeatureCollection / Geometry - const geom = normalizeGeometry(poly); - if (!geom) return verts_carte3; - - let verts = turf.coordAll(geom); - const clockwiseRing = turf.booleanClockwise(turf.lineString(verts)); - if (clockwiseRing) { - verts = verts.reverse(); - } - for (let i = 0; i < verts.length - 1; i++) { - const vert = verts[i]; - verts_carte3.push(Cesium.Cartesian3.fromDegrees(vert[0], vert[1])); - } - } catch (e) { - console.warn('get_verts_core 解析 boundary 失败:', e); - } - return verts_carte3; -}; - -const get_clipping_planes = ( - points: Cesium.Cartesian3[] -): Cesium.ClippingPlane[] => { - const pointsLength = points.length; - const clippingPlanes: Cesium.ClippingPlane[] = []; - - for (let i = 0; i < pointsLength; ++i) { - const nextIndex = (i + 1) % pointsLength; - let midpoint = Cesium.Cartesian3.add( - points[i], - points[nextIndex], - new Cesium.Cartesian3() - ); - midpoint = Cesium.Cartesian3.multiplyByScalar(midpoint, 0.5, midpoint); - - const up = Cesium.Cartesian3.normalize(midpoint, new Cesium.Cartesian3()); - let right = Cesium.Cartesian3.subtract( - points[nextIndex], - midpoint, - new Cesium.Cartesian3() - ); - right = Cesium.Cartesian3.normalize(right, right); - - let normal = Cesium.Cartesian3.cross(right, up, new Cesium.Cartesian3()); - normal = Cesium.Cartesian3.normalize(normal, normal); - - const originCenteredPlane = new Cesium.Plane(normal, 0.0); - const distance = Cesium.Plane.getPointDistance( - originCenteredPlane, - midpoint - ); - - clippingPlanes.push(new Cesium.ClippingPlane(normal, distance)); - } - - return clippingPlanes; -}; - -const clipping_terrain = ( - viewer: Cesium.Viewer, - clippingPlanes: Cesium.ClippingPlane[] -) => { - const globe = viewer.scene.globe; - globe.clippingPlanes = new Cesium.ClippingPlaneCollection({ - planes: clippingPlanes, - edgeWidth: 0, - edgeColor: Cesium.Color.GREEN, - enabled: true - }); - globe.backFaceCulling = true; - globe.showSkirts = true; -}; - -const clipping_3dtiles = ( - clippingPlanes: Cesium.ClippingPlane[], - tileset: Cesium.Cesium3DTileset -) => { - // Cesium 1.141: root.transform 是内部属性,安全访问 - const rootTransform = (tileset as any)?.root?.transform; - if (!rootTransform) return; - const invtrans = Cesium.Matrix4.inverse(rootTransform, new Cesium.Matrix4()); - for (let i = 0; i < clippingPlanes.length; i++) { - clippingPlanes[i] = Cesium.Plane.transform(clippingPlanes[i], invtrans); - } - tileset.clippingPlanes = new Cesium.ClippingPlaneCollection({ - planes: clippingPlanes, - unionClippingRegions: true, - edgeWidth: 0, - edgeColor: Cesium.Color.RED, - enabled: false - }); -}; - -const Clip3DTile = (boundary: any, tileset: Cesium.Cesium3DTileset) => { - try { - const geom = normalizeGeometry(boundary); - if (!geom) return; - const buffered = turf.buffer(geom, 10, { units: 'meters' }); - const verts_core = get_verts_core(buffered).reverse(); - if (!verts_core.length) return; - const planes = get_clipping_planes(verts_core); - clipping_3dtiles(planes, tileset); - } catch (e) { - console.warn('Clip3DTile 裁切失败:', e); - } -}; - -const ClipTerrain = (viewer: Cesium.Viewer, osgbObj: OSGBItem) => { - // Cesium 1.141: 安全访问 clippingPlanes 内部属性 _planes - const existingPlanes = (viewer.scene.globe.clippingPlanes as any)?._planes; - if ( - !osgbObj.clippingPlanes || - (existingPlanes && - !compareClippingPlanes(osgbObj.clippingPlanes, existingPlanes)) - ) { - const verts_core = get_verts_core(osgbObj.boundary); - if (!verts_core.length) return; - const planes = get_clipping_planes(verts_core); - clipping_terrain(viewer, planes); - osgbObj.clippingPlanes = planes; - } -}; - -const removeClip = (viewer: Cesium.Viewer, osgbObj: OSGBItem) => { - if (osgbObj.clippingPlanes) { - removeClippingPlanes(viewer); - osgbObj.clippingPlanes = undefined; - } -}; - -const removeClippingPlanes = (viewer: Cesium.Viewer) => { - if (!Cesium.defined(viewer) || viewer.isDestroyed()) { - return; - } - if (Cesium.defined(viewer.scene.globe.clippingPlanes)) { - viewer.scene.globe.clippingPlanes.removeAll(); - } -}; - -const compareClippingPlanes = (planes1: any, planes2: any): boolean => { - let result = true; - if (planes1.length === planes2?.length) { - for (let index = 0; index < planes1.length; index++) { - if (planes1[index]._distance !== planes2[index]._distance) { - result = false; - break; - } - } - } else { - result = false; - } - return result; -}; - -const getMinDistanceOfOSGB = (viewer: Cesium.Viewer): number => { - let result = Infinity; - const length = viewer.scene.primitives.length; - for (let i = 0; i < length; i++) { - const p = viewer.scene.primitives.get(i); - // Cesium 1.141: _url 和 _distanceToCamera 是内部属性,安全访问 - // eslint-disable-next-line @typescript-eslint/no-explicit-any - if ((p as any)?._url) { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const d = (p as any)?.root?._distanceToCamera; - if (d != null && d < result) result = d; - } - } - return result; -}; - -// ==================== 动态显隐 ==================== - -const dynamicSetVisible = (viewer: Cesium.Viewer, osgbObj: OSGBItem) => { - if (!Cesium.defined(viewer) || viewer.isDestroyed()) return; - if (!Cesium.defined(osgbObj?.cartesian3)) return; - - let cameraPosition: Cesium.Cartesian3 | undefined; - if (viewer.trackedEntity) { - cameraPosition = viewer.trackedEntity.position?.getValue( - viewer.clock.currentTime - ); - } - if (!cameraPosition) { - cameraPosition = viewer.camera.position.clone(); - } - - const distance = Cesium.Cartesian3.distance( - osgbObj.cartesian3, - cameraPosition - ); - - if (distance < 12000) { - // 用户手动关闭了开关 → 不自动加载 - if (osgbObj._switchOff) return; - - // 匹配旧代码逻辑:osgbObj.osgbtitles 同步设置为 nonClassificationTileset 防重入 - // 新代码用 _loading + _loadId 实现同样的效果(因为 fromUrl 是异步的) - if (!osgbObj.osgbtitles && !osgbObj._loading) { - osgbObj._loading = true; - osgbObj._loadId = (osgbObj._loadId || 0) + 1; - const loadId = osgbObj._loadId; - - const url = osgbObj.url.includes('?') - ? osgbObj.url + `&token=${getToken()}` - : osgbObj.url + `?token=${getToken()}`; - Cesium.Cesium3DTileset.fromUrl(url, { - maximumScreenSpaceError: Number(osgbObj?.accuracy) || 16, - show: true, - maximumMemoryUsage: 128 - }) - .then((tileset: Cesium.Cesium3DTileset) => { - // 竞态保护:版本号变了(removeQxsy 被调用或新一轮加载开始)→ 销毁退出 - if ( - osgbObj._loadId !== loadId || - !Cesium.defined(viewer) || - viewer.isDestroyed() - ) { - tileset.destroy(); - return; - } - osgbObj._loading = false; - if (!Cesium.defined(tileset)) return; - tileset.maximumScreenSpaceError = 32; - - // height 向上偏移:模型几何自带高程,height 只是微调(如 44m) - if (osgbObj.height != 0) { - const bs = Cesium.Cartographic.fromCartesian( - tileset.boundingSphere.center - ); - const surface = Cesium.Cartesian3.fromRadians( - bs.longitude, - bs.latitude, - 0.0 - ); - const offset = Cesium.Cartesian3.fromRadians( - bs.longitude, - bs.latitude, - osgbObj.height - ); - const translation = Cesium.Cartesian3.subtract( - offset, - surface, - new Cesium.Cartesian3() - ); - tileset.modelMatrix = Cesium.Matrix4.fromTranslation(translation); - } - - addOSGB(viewer, tileset); - osgbObj.osgbtitles = tileset; - }) - .catch((e: Error) => { - osgbObj._loading = false; - console.log('dynamicSetVisible 加载倾斜摄影报错', e); - }); - } - } else if (distance > 13000) { - // 匹配旧代码逻辑:镜头拉远 → 销毁 tileset 释放内存 - if (osgbObj.osgbtitles) { - removeOSGB(viewer, osgbObj.osgbtitles); - osgbObj.osgbtitles = undefined; - } - // 不重置 _switchOff,开关状态由用户手动控制,不受距离影响 - } -}; - -// ==================== 地形动态裁切 ==================== - -const dynamicClipTerrain = (viewer: Cesium.Viewer, osgbObj: OSGBItem) => { - if (!osgbObj?.osgbtitles) { - removeClip(viewer, osgbObj); - return; - } - - // Cesium 1.141: root 和 _distanceToCamera 是内部属性,安全访问 - const root = (osgbObj.osgbtitles as any)?.root; - if (!Cesium.defined(root)) { - removeClip(viewer, osgbObj); - if (osgbObj.osgbtitles?.clippingPlanes?.enabled) { - osgbObj.osgbtitles.clippingPlanes.enabled = false; - } - return; - } - - if (!osgbObj?.osgbtitles?.show) { - removeClip(viewer, osgbObj); - if (osgbObj.osgbtitles?.clippingPlanes?.enabled) { - osgbObj.osgbtitles.clippingPlanes.enabled = false; - } - return; - } - - const distance = root._distanceToCamera; - const tilesLoaded = osgbObj.osgbtitles.tilesLoaded; - if (osgbObj.boundary && tilesLoaded) { - if (distance != null && getMinDistanceOfOSGB(viewer) === distance) { - ClipTerrain(viewer, osgbObj); - if ( - osgbObj.osgbtitles?.clippingPlanes && - !osgbObj.osgbtitles.clippingPlanes.enabled - ) { - osgbObj.osgbtitles.clippingPlanes.enabled = true; - } - } else { - removeClip(viewer, osgbObj); - if (osgbObj.osgbtitles?.clippingPlanes?.enabled) { - osgbObj.osgbtitles.clippingPlanes.enabled = false; - } - } - } -}; - -// ==================== 公开 API ==================== - -/** - * 加载倾斜摄影 3D Tileset 模型 - * - * Cesium 1.141 中必须使用 Cesium3DTileset.fromUrl() 静态方法, - * new Cesium3DTileset({url}) 不会触发网络请求。 - */ -export const LoadOSGB = (viewer: Cesium.Viewer, osgbObj: OSGBItem) => { - if (!osgbObj.url) return; - - // 已加载则跳过 - if (osgbObj.osgbtitles && !osgbObj.osgbtitles.isDestroyed?.()) return; - - // 正在加载中也跳过(防止重复调用 fromUrl) - if (osgbObj._loading) return; - osgbObj._loading = true; - - // 自增版本号:每次 LoadOSGB 都 +1,.then() 里靠版本号判断是否已失效 - osgbObj._loadId = (osgbObj._loadId || 0) + 1; - const loadId = osgbObj._loadId; - - const url = osgbObj.url.includes('?') - ? osgbObj.url + `&token=${getToken()}` - : osgbObj.url + `?token=${getToken()}`; - - Cesium.Cesium3DTileset.fromUrl(url, { - maximumScreenSpaceError: Number(osgbObj?.accuracy) || 16, - show: true, - maximumMemoryUsage: 128 - }) - .then((tileset: Cesium.Cesium3DTileset) => { - // 竞态保护:版本号变了 → 销毁退出 - if ( - osgbObj._loadId !== loadId || - !Cesium.defined(viewer) || - viewer.isDestroyed() - ) { - tileset.destroy(); - return; - } - if (!Cesium.defined(tileset)) return; - - osgbObj._loading = false; - tileset.maximumScreenSpaceError = 32; - - // height 向上偏移:模型几何自带高程,height 只是微调(如 44m) - if (osgbObj.height != 0) { - const bs = Cesium.Cartographic.fromCartesian( - tileset.boundingSphere.center - ); - const surface = Cesium.Cartesian3.fromRadians( - bs.longitude, - bs.latitude, - 0.0 - ); - const offset = Cesium.Cartesian3.fromRadians( - bs.longitude, - bs.latitude, - osgbObj.height - ); - const translation = Cesium.Cartesian3.subtract( - offset, - surface, - new Cesium.Cartesian3() - ); - tileset.modelMatrix = Cesium.Matrix4.fromTranslation(translation); - } - - // 加入场景(匹配旧代码 readyPromise 中 addOSGB) - addOSGB(viewer, tileset); - osgbObj.osgbtitles = tileset; - - // 始终设置 cartesian3,保证 dynamicSetVisible 能计算距离 - osgbObj.cartesian3 = tileset.boundingSphere.center.clone(); - - // boundary 裁切(匹配旧代码 readyPromise 中处理) - if (osgbObj.boundary) { - if (typeof osgbObj.boundary === 'string') { - osgbObj.boundary = JSON.parse(osgbObj.boundary); - } - Clip3DTile(osgbObj.boundary, tileset); - } - - // 注册 postRender 动态显隐(300ms 节流,匹配旧代码 throttle) - let lastTime = 0; - osgbObj.eventListener = viewer.scene.postRender.addEventListener(() => { - if (!Cesium.defined(viewer) || viewer.isDestroyed()) return; - const now = performance.now(); - if (now - lastTime < 300) return; - lastTime = now; - - if (!getState(osgbObj).timelookat) { - dynamicSetVisible(viewer, osgbObj); - } - dynamicClipTerrain(viewer, osgbObj); - }); - }) - .catch((e: Error) => { - osgbObj._loading = false; - console.log('加载倾斜摄影报错', e); - }); -}; - -/** - * 卸载倾斜摄影模型(完全移除) - * 仅在切换 2D 等场景调用,平时开关节用 osgbChangeClick 做显隐 - * 匹配旧代码 removeqxsy(osgbTool.ts:233-244):不清理 cartesian3 - */ -export const removeQxsy = (viewer: Cesium.Viewer, osgbObj: OSGBItem) => { - // 递增版本号:使所有进行中的 fromUrl().then() 失效 - osgbObj._loadId = (osgbObj._loadId || 0) + 1; - removeClippingPlanes(viewer); - osgbObj.clippingPlanes = undefined; - osgbObj._loading = false; - osgbObj._switchOff = undefined; - - if (typeof osgbObj.eventListener === 'function') { - osgbObj.eventListener(); - osgbObj.eventListener = undefined; - } - - if (osgbObj.osgbtitles) { - removeOSGB(viewer, osgbObj.osgbtitles); - osgbObj.osgbtitles = undefined; - } - // 注意:不清理 cartesian3,匹配旧代码行为 -}; - -/** - * 倾斜摄影显隐切换 - * - 开关状态全局记录,不受距离影响 - * - 12km 以内:执行实际的显隐/加载操作 - * - 12km 以外:仅记录状态,不做 tileset 操作(tileset 不存在或已销毁) - * - 仅切换 2D 时才通过 removeQxsy 真正销毁 - */ -export const osgbChangeClick = ( - viewer: Cesium.Viewer, - osgbObj: OSGBItem, - checked: boolean -) => { - // 先记录开关状态(无论距离远近) - osgbObj._switchOff = !checked; - - // 12km 以外:只记状态不操作 tileset(此时 tileset 可能不存在或已销毁) - if (osgbObj.cartesian3) { - const cameraPosition = viewer.camera.position.clone(); - const distance = Cesium.Cartesian3.distance( - osgbObj.cartesian3, - cameraPosition - ); - if (distance >= 12000) return; - } - - if (checked) { - // 开关 ON:已有未销毁的 tileset → 直接显示;否则加载 - if (osgbObj.osgbtitles && !osgbObj.osgbtitles.isDestroyed?.()) { - osgbObj.osgbtitles.show = true; - } else { - LoadOSGB(viewer, osgbObj); - } - } else { - // 开关 OFF:隐藏 tileset,移除 terrain 裁切 - if (osgbObj.osgbtitles && !osgbObj.osgbtitles.isDestroyed?.()) { - osgbObj.osgbtitles.show = false; - } - removeClip(viewer, osgbObj); - } -}; - -/** - * 解析 location 字段为结构化定位信息 - */ -const parseLocation = (location: any): OSGBLocation | null => { - if (!location) return null; - - // 如果已经是对象,直接用 - if (typeof location === 'object' && location.destination) { - return location as OSGBLocation; - } - - // 如果是字符串,尝试解析 - if (typeof location === 'string') { - try { - const jsonString = location.replace(/\n/g, ''); - const startIndex = jsonString.indexOf('{'); - const endIndex = jsonString.lastIndexOf('}'); - if (startIndex === -1 || endIndex === -1) return null; - const extractedData = jsonString.substring(startIndex, endIndex + 1); - const parsed = eval('(' + extractedData + ')'); - return { - destination: parsed.destination, - orientation: parsed.orientation, - center: parsed.center - }; - } catch { - return null; - } - } - - return null; -}; - -/** - * 飞行定位到倾斜摄影模型 - * 包含 flyTo + 到达后旋转动画 - */ -export const osgbLocation = (viewer: Cesium.Viewer, osgbObj: OSGBItem) => { - const state = getState(osgbObj); - - clearTimeout(state.timeout); - state.num = 0; - state.time = 0; - state.witetime = 0; - - viewer.camera.lookAtTransform(Cesium.Matrix4.IDENTITY); - - let center = Cesium.Cartesian3.fromDegrees( - 100.271729604817, - 35.3107902811941, - 2800 - ); - let heading = Cesium.Math.toRadians(0.0); - const pitch = Cesium.Math.toRadians(-30.0); - const range = 2000.0; - - const locationInfor = parseLocation(osgbObj.location); - - if (!locationInfor) { - console.warn('该模型定位坐标未配置!'); - return; - } - - // 判断是经纬度还是笛卡尔坐标 - const destCoords = locationInfor.destination; - if (destCoords[0] <= 180 && destCoords[0] >= -180) { - state.destination = Cesium.Cartesian3.fromDegrees( - destCoords[0], - destCoords[1], - destCoords[2] - ); - } else { - state.destination = new Cesium.Cartesian3( - destCoords[0], - destCoords[1], - destCoords[2] - ); - } - - state.orientation = locationInfor.orientation; - center = Cesium.Cartesian3.fromDegrees( - locationInfor.center[0], - locationInfor.center[1], - locationInfor.center[2] - ); - - if (!state.destination || !state.orientation) return; - - viewer.camera.cancelFlight(); - viewer.camera.flyTo({ - destination: state.destination, - orientation: state.orientation, - complete: () => { - state.timeout = setTimeout(() => { - rotate(); - }, 2000); - } - }); - - const rotate = () => { - clearInterval(state.timelookat); - state.timelookat = setInterval(() => { - if (!Cesium.defined(viewer) || viewer.isDestroyed()) { - return; - } - state.witetime += 0.7; - if (state.witetime > 180 && state.witetime < 360) { - state.time += 0.7; - heading = Cesium.Math.toRadians(state.time); - viewer.camera.lookAt( - center, - new Cesium.HeadingPitchRange(heading, pitch, range) - ); - } else if (state.witetime > 360) { - viewer.camera.lookAtTransform(Cesium.Matrix4.IDENTITY); - clearInterval(state.timelookat); - state.timelookat = null; - viewer.camera.flyTo({ - destination: state.destination!, - orientation: state.orientation, - duration: 2 - }); - return; - } - }, 10); - }; - - // 点击 body 两次退出旋转 - const body = document.getElementsByTagName('body')[0]; - body.onclick = function () { - if (viewer && !viewer.isDestroyed() && viewer.camera) { - state.num = state.num + 1; - if (state.num > 1) { - viewer.camera.lookAtTransform(Cesium.Matrix4.IDENTITY); - clearInterval(state.timelookat); - clearTimeout(state.timeout); - state.timelookat = null; - } - } - }; -}; diff --git a/frontend-sjgl/src/layout/components/Sidebar/index.vue b/frontend-sjgl/src/layout/components/Sidebar/index.vue index ac637235..5d5bc0cd 100644 --- a/frontend-sjgl/src/layout/components/Sidebar/index.vue +++ b/frontend-sjgl/src/layout/components/Sidebar/index.vue @@ -2,9 +2,7 @@ import { ref, onBeforeMount, onMounted } from 'vue'; import { useRoute, useRouter } from 'vue-router'; -import { useMapStore } from '@/store/modules/map'; import { usePermissionStore } from '@/store/modules/permission'; -const mapStore = useMapStore(); const permissionStore = usePermissionStore(); const menus: any = ref([]); // 主菜单列表 const subMenus: any = ref([]); // 子菜单列表 @@ -14,15 +12,6 @@ const subActiveKey = ref(''); // 子菜单选中项 const route = useRoute(); const router = useRouter(); -const buildPageKeyFromPath = (path?: string) => { - const normalizedPath = path || ''; - const parts = normalizedPath.split('/').filter(Boolean); - if (parts.length >= 2) { - return `${parts[0]}_${parts[1]}`; - } - return normalizedPath || '__route-change__'; -}; - // 主菜单切换 const handleTabChange = (key: string) => { let data = menus.value.find((item: any) => item.id === key); @@ -33,9 +22,6 @@ const handleTabChange = (key: string) => { let subData = subMenus.value.find( (item: any) => item.id === subActiveKey.value ); - mapStore.markPendingPageNavigation( - buildPageKeyFromPath(subData?.path || subData?.opturl) - ); router.push(subData.path || subData.opturl); } else { subActiveKey.value = ''; @@ -45,9 +31,6 @@ const handleTabChange = (key: string) => { const handleSubTabChange = (key: string) => { subActiveKey.value = key; let data = subMenus.value.find((item: any) => item.id === key); - mapStore.markPendingPageNavigation( - buildPageKeyFromPath(data?.path || data?.opturl) - ); router.push(data.path || data.opturl); }; diff --git a/frontend-sjgl/src/main.ts b/frontend-sjgl/src/main.ts index 8968d2b1..4eca3cd3 100644 --- a/frontend-sjgl/src/main.ts +++ b/frontend-sjgl/src/main.ts @@ -13,9 +13,7 @@ import 'ant-design-vue/dist/reset.css'; // Ant Design 全局样式重置 import dayjs from 'dayjs'; // ant 中文语言 import 'dayjs/locale/zh-cn'; import 'virtual:svg-icons-register'; -// 3d地图 -import * as Cesium from 'cesium'; -import 'cesium/Build/Cesium/Widgets/widgets.css'; + // 国际化 import i18n from '@/lang/index'; diff --git a/frontend-sjgl/src/modules/jidiSelectorMod.vue b/frontend-sjgl/src/modules/jidiSelectorMod.vue deleted file mode 100644 index 7ec74a20..00000000 --- a/frontend-sjgl/src/modules/jidiSelectorMod.vue +++ /dev/null @@ -1,110 +0,0 @@ - - - - diff --git a/frontend-sjgl/src/modules/map/application/map-orchestrator.ts b/frontend-sjgl/src/modules/map/application/map-orchestrator.ts deleted file mode 100644 index 4c0ff19e..00000000 --- a/frontend-sjgl/src/modules/map/application/map-orchestrator.ts +++ /dev/null @@ -1,806 +0,0 @@ -import { watch, type WatchStopHandle, ref } from 'vue'; -import { useRoute } from 'vue-router'; -import { unByKey } from 'ol/Observable'; -import dayjs from 'dayjs'; -import { MapClass } from '@/components/gis/map.class'; -import { getMapConfig, layerConfig2Flat } from '@/components/gis/gisUtils'; -import { useMapConfigStore } from '@/modules/map/stores/map-config.store'; -import { useMapDataStore } from '@/modules/map/stores/map-data.store'; -import { useMapViewStore } from '@/modules/map/stores/map-view.store'; -import { useMapStore } from '@/store/modules/map'; -import { useJidiSelectEventStore } from '@/store/modules/jidiSelectEvent'; - -type InitializeOptions = { - container: HTMLElement; - popupContainer?: HTMLDivElement | null; - pageKey: string; -}; - -type LoadPageOptions = { - pageKey: string; - isInitialLoad?: boolean; -}; - -type ApplyLayerSelectionOptions = { - checkedKeys: string[]; - triggerKey?: string; - checked?: boolean; -}; -const SYSTEM_ID = 'qgc'; -const HYDRO_DYNAMIC_LAYER_KEYS = [ - 'dw_point', - 'stinfo_video_point', - 'stinfo_gjllz_point', - 'wt_point', - 'wq_ownWq_point', - 'wq_countryWq_point', - 'fp_point', - 'eq_point', - 'fb_point', - 'vp_point', - 'va_point', - 'sg_point' -]; -const ENG_POINT_LAYER_KEY = 'eng_point'; -const ENG_POINT_MEDIUM_VISIBLE_ZOOM = 7.5; -const CESIUM_ZOOM_SYNC_DEBOUNCE_MS = 80; -const LARGE_ENG_LEGEND_PREFIX = 'large_eng_'; -const MID_ENG_LEGEND_PREFIX = 'mid_eng_'; - -export const useMapOrchestrator = () => { - const route = useRoute(); - const mapClass = MapClass.getInstance(); - const mapStore = useMapStore(); - const mapConfigStore = useMapConfigStore(); - const mapDataStore = useMapDataStore(); - const mapViewStore = useMapViewStore(); - const jidiSelectEventStore = useJidiSelectEventStore(); - let activePageLoadRequestId = 0; - let removeZoomListener: (() => void) | null = null; - let stopBaseSelectionWatch: WatchStopHandle | null = null; - const initializedBaseLayerKeys = new Set(); - const baseSelectionDebounceTimer = ref | null>( - null - ); - const zoomSyncDebounceTimer = ref | null>(null); - let latestHydroMenuGetter: (() => boolean) | null = null; - let currentMapType: '2D' | '3D' = '2D'; - let hydroMenuDefaultCheckedKeys = new Set(); - let hydroDynamicLayerSyncTask: { - visible: boolean; - promise: Promise; - } | null = null; - - // 备注:统一获取当前地图视图对象,避免在多个组件里重复兼容 2D/3D view 访问方式。 - const getCurrentView = () => { - return mapClass.view?.getView ? mapClass.view.getView() : mapClass.view; - }; - - // 备注:统一获取当前地图缩放级别,供页面切换和缩放监听复用。 - const getCurrentZoom = (): number | undefined => { - return mapClass.getCurrentZoom(); - }; - - const clearZoomSyncDebounceTimer = () => { - if (zoomSyncDebounceTimer.value) { - clearTimeout(zoomSyncDebounceTimer.value); - zoomSyncDebounceTimer.value = null; - } - }; - - // 备注:统一把当前页面中的 GIS 基础图层初始化到地图实例,避免在图层树组件里做配置解析和加层编排。 - const ensureBaseLayersInitialized = (configs: any[] = []) => { - const flatLayerConfigs = layerConfig2Flat(configs); - - flatLayerConfigs.forEach((item: any) => { - if (item.type !== 'GISMap' || !item.key) { - return; - } - - if (!item.config && item.paramJson) { - try { - const jsonObj = JSON.parse(item.paramJson); - item.config = getMapConfig(jsonObj); - } catch { - item.config = null; - } - } - - if (!item.config) { - return; - } - - if (item.key === 'customBaseLayer') { - const serializableBaseLayerConfig = { - key: item.config?.key, - id: item.config?.id, - name: item.config?.name, - type: item.config?.type, - url: item.config?.url, - url_3d: item.config?.url_3d, - layers: item.config?.layers, - rasteropacity: item.config?.rasteropacity - }; - sessionStorage.setItem( - 'customBaseLayer', - JSON.stringify(serializableBaseLayerConfig) - ); - } - - if (!initializedBaseLayerKeys.has(item.key)) { - mapClass.addBaseDataLayer(item.config, item.checked === 1); - initializedBaseLayerKeys.add(item.key); - } - - mapClass.controlBaseLayerTreeShowAndHidden( - item.key, - item.config?.id || item.key, - item.checked === 1 - ); - }); - }; - - // 备注:统一加载当前页面所需的图层配置、图例配置以及首批锚点数据。 - const loadPage = async ({ - pageKey, - isInitialLoad = false - }: LoadPageOptions) => { - let backgroundLoadStarted = false; - const pageLoadRequestId = ++activePageLoadRequestId; - - try { - mapDataStore.setLoading(true); - - const hasGlobalLegendConfig = - Array.isArray(mapConfigStore.legendConfigOriginal) && - mapConfigStore.legendConfigOriginal.length > 0; - const shouldLoadGlobalLegend = isInitialLoad && !hasGlobalLegendConfig; - const previousPageKey = mapConfigStore.lastLoadOptions?.pageKey || ''; - const previousCheckedKeys = mapViewStore.getCheckedLayerKeys(); - const moduleId = (route.meta?.moduleId as string) || ''; - const loadOptions = { - systemId: SYSTEM_ID, - moduleId, - pageKey, - description: 'true' - }; - const layerConfigPromise = - mapConfigStore.loadPageLayerConfig(loadOptions); - const legendConfigPromise = mapConfigStore.loadPageLegendConfig( - moduleId, - { - includeGlobal: shouldLoadGlobalLegend - } - ); - - // 同时等待两个 promise - const [{ layerConfig }, { legendOriginal, pageLegend }] = - await Promise.all([layerConfigPromise, legendConfigPromise]); - - if (pageLoadRequestId !== activePageLoadRequestId) { - return; - } - - // 先设置图层数据(更新 checkedLayerKeys),再设置图例数据 - if (layerConfig.length > 0) { - hydroMenuDefaultCheckedKeys = new Set( - mapConfigStore.extractCheckedLayerKeys(layerConfig) - ); - mapStore.setLayerData(layerConfig); - ensureBaseLayersInitialized(layerConfig); - - let checkedKeys = mapViewStore.getCheckedLayerKeys(); - if (previousPageKey === pageKey && previousCheckedKeys.length > 0) { - const getAllLayerKeys = (items: any[]): string[] => { - const keys: string[] = []; - const walk = (nodes: any[]) => { - nodes.forEach(item => { - if (item?.key) { - keys.push(item.key); - } - if (item?.children?.length > 0) { - walk(item.children); - } - }); - }; - walk(items); - return keys; - }; - const currentLayerKeys = new Set(getAllLayerKeys(layerConfig)); - const runtimeCheckedKeys = previousCheckedKeys.filter(key => - currentLayerKeys.has(key) - ); - if (runtimeCheckedKeys.length > 0) { - mapViewStore.setCheckedLayerKeys(runtimeCheckedKeys); - checkedKeys = runtimeCheckedKeys; - } - } - - // 设置图例数据(此时 checkedLayerKeys 已正确设置) - if (legendOriginal.length > 0) { - mapStore.setLegendData(legendOriginal, pageLegend); - } - - const activePageToken = mapStore.activatePageContext( - pageKey, - layerConfig - ); - await mapStore.updateLayerData(checkedKeys, true); - mapStore.setSelectedLegendData(); - const backgroundLoadPromise = isInitialLoad - ? mapStore.loadAllLayerData(layerConfig, checkedKeys, { - pageToken: activePageToken, - skipSessionCheck: true, - pageKey - }) - : mapStore.loadCurrentPageLayerData(layerConfig, checkedKeys, { - pageToken: activePageToken, - skipSessionCheck: true - }); - - void backgroundLoadPromise.catch(error => { - console.error(`页面锚点后台加载失败 [${pageKey}]`, error); - }); - backgroundLoadStarted = true; - } - } finally { - if ( - !backgroundLoadStarted && - pageLoadRequestId === activePageLoadRequestId - ) { - mapDataStore.setLoading(false); - } - } - }; - - // 备注:统一完成地图实例初始化和弹窗挂载,确保后续事件监听可以在图层数据加载前生效。 - const initializeMapShell = async ({ - container, - popupContainer - }: InitializeOptions) => { - await mapClass.init(container); - - if (popupContainer) { - const popupHost = container.parentElement; - if (popupHost && popupContainer.parentElement !== popupHost) { - popupHost.appendChild(popupContainer); - } - popupContainer.style.display = 'none'; - mapClass.initPopupOverlay(popupContainer); - } - }; - - const replayCurrentMapState = async ( - options: Pick & { - getIsHydroMenu: () => boolean; - } - ) => { - initializedBaseLayerKeys.clear(); - - const currentZoom = getCurrentZoom(); - if (currentZoom !== undefined) { - mapViewStore.setCurrentZoomLevel(currentZoom); - } - - if (options.popupContainer) { - const container = document.getElementById('mapContainer'); - const popupHost = container?.parentElement || null; - if (popupHost && options.popupContainer.parentElement !== popupHost) { - popupHost.appendChild(options.popupContainer); - } - options.popupContainer.style.display = 'none'; - mapClass.initPopupOverlay(options.popupContainer); - } - - ensureBaseLayersInitialized(mapStore.layerData || []); - - const checkedKeys = mapViewStore.getCheckedLayerKeys(); - await mapStore.updateLayerData(checkedKeys, true); - mapStore.setSelectedLegendData(); - await syncZoomSensitiveState({ - isHydroMenu: options.getIsHydroMenu(), - refreshEngPoint: true - }); - - const selectedBaseId = mapViewStore.selectedBaseId; - mapClass.jdPanelControlShowAndHidden( - selectedBaseId || 'all', - !!selectedBaseId - ); - - bindZoomListener(options.getIsHydroMenu); - }; - - // 备注:统一完成首屏页面配置加载,供挂载阶段和后续页面重载复用。 - const initialize = async ({ - container, - popupContainer, - pageKey - }: InitializeOptions) => { - await initializeMapShell({ - container, - popupContainer, - pageKey - }); - await loadPage({ pageKey, isInitialLoad: true }); - }; - - // 备注:统一绑定地图缩放监听,让页面组件只负责触发初始化,不再直接处理缩放联动细节。 - const bindZoomListener = (getIsHydroMenu: () => boolean) => { - if (removeZoomListener) { - removeZoomListener(); - removeZoomListener = null; - } - clearZoomSyncDebounceTimer(); - - const currentZoom = getCurrentZoom(); - if (currentZoom !== undefined) { - mapViewStore.setCurrentZoomLevel(currentZoom); - } - - const emitZoomChange = async () => { - const zoom = getCurrentZoom(); - if (zoom === undefined) return; - - await handleZoomLevelChange( - mapViewStore.currentZoomLevel, - zoom, - getIsHydroMenu() - ); - }; - - if (currentMapType === '3D') { - const removeCesiumListener = - mapClass.view?.camera?.changed?.addEventListener(() => { - clearZoomSyncDebounceTimer(); - zoomSyncDebounceTimer.value = setTimeout(() => { - zoomSyncDebounceTimer.value = null; - void emitZoomChange(); - }, CESIUM_ZOOM_SYNC_DEBOUNCE_MS); - }); - - if (typeof removeCesiumListener === 'function') { - removeZoomListener = () => { - clearZoomSyncDebounceTimer(); - removeCesiumListener(); - }; - } - return; - } - - const view = getCurrentView(); - if (!view?.on) return; - - const zoomListenerKey = view.on('change:resolution', () => { - void emitZoomChange(); - }); - removeZoomListener = () => { - unByKey(zoomListenerKey); - }; - }; - - // 备注:统一绑定基地切换事件,让页面组件不再直接 watch 外部基地选择源。 - const bindBaseSelection = () => { - if (stopBaseSelectionWatch) { - stopBaseSelectionWatch(); - stopBaseSelectionWatch = null; - } - - stopBaseSelectionWatch = watch( - () => jidiSelectEventStore.selectedItem?.wbsCode, - newWbsCode => { - if (!newWbsCode) { - changeBaseId(''); - return; - } - - if (baseSelectionDebounceTimer.value) { - clearTimeout(baseSelectionDebounceTimer.value); - } - - baseSelectionDebounceTimer.value = setTimeout(() => { - changeBaseId(newWbsCode); - baseSelectionDebounceTimer.value = null; - }, 100); - }, - { immediate: true } - ); - }; - - // 备注:统一挂载地图页面生命周期,初始化后自动接管缩放监听和基地切换监听。 - const mountView = async ( - options: InitializeOptions & { - getIsHydroMenu: () => boolean; - } - ) => { - currentMapType = '2D'; - latestHydroMenuGetter = options.getIsHydroMenu; - await initializeMapShell(options); - bindBaseSelection(); - bindZoomListener(options.getIsHydroMenu); - await loadPage({ pageKey: options.pageKey, isInitialLoad: true }); - await syncZoomSensitiveState({ - isHydroMenu: options.getIsHydroMenu(), - refreshEngPoint: true - }); - }; - - const switchMapType = async ( - type: '2D' | '3D', - options: Pick & { - getIsHydroMenu?: () => boolean; - } = {} - ) => { - const hydroMenuGetter = - options.getIsHydroMenu || latestHydroMenuGetter || (() => false); - latestHydroMenuGetter = hydroMenuGetter; - currentMapType = type; - - await mapClass.switchView(type); - await replayCurrentMapState({ - popupContainer: options.popupContainer, - getIsHydroMenu: hydroMenuGetter - }); - }; - - // 备注:统一处理菜单切换后的页面配置重载,供页面 watch 直接复用。 - const reloadPage = async (pageKey: string) => { - if (!pageKey) return; - await loadPage({ pageKey, isInitialLoad: false }); - }; - - // 备注:菜单切换前只隐藏旧页面当前可见点图层,底图保持连续显示,避免切换时闪烁。 - const hideCurrentVisibleLayers = () => { - const currentCheckedKeys = mapViewStore.getCheckedLayerKeys(); - - currentCheckedKeys.forEach(layerKey => { - const layerItem = mapStore.findLayerByKey(mapStore.layerData, layerKey); - if (!layerItem?.key) { - return; - } - - if (layerItem.type === 'pointMap') { - if (mapClass.hasLayer(layerItem.key)) { - mapClass.mdLayerTreeShowOrHidden(layerItem.key, false); - } - } - }); - }; - - // 备注:统一处理图层树勾选结果归一化和地图联动,供图层树组件复用。 - const applyLayerSelection = async ({ - checkedKeys, - triggerKey, - checked - }: ApplyLayerSelectionOptions) => { - const normalizedKeys = mapStore.normalizeCheckedLayerKeys( - checkedKeys, - triggerKey, - checked - ); - await mapStore.updateLayerData(normalizedKeys); - return normalizedKeys; - }; - - // 备注:统一确保指定动态图层完成数据预加载,避免缩放切换时重复在页面组件里拼装加载逻辑。 - const ensureDynamicLayersLoaded = async (layerKeys: string[] = []) => { - const layersToLoad = layerKeys - .map(layerKey => mapStore.findLayerByKey(mapStore.layerData, layerKey)) - .filter( - (layer: any) => layer?.url && !mapDataStore.hasPointLayerData(layer.key) - ); - - if (layersToLoad.length === 0) { - return; - } - - await Promise.all(layersToLoad.map(layer => mapStore.loadLayerData(layer))); - }; - - // 备注:统一控制水电开发菜单下的动态图层增删,避免页面组件直接操作加载和勾选细节。 - const syncHydroDynamicLayers = async (visible: boolean) => { - if ( - hydroDynamicLayerSyncTask && - hydroDynamicLayerSyncTask.visible === visible - ) { - return hydroDynamicLayerSyncTask.promise; - } - - const task = (async () => { - const currentCheckedKeys = mapViewStore.getCheckedLayerKeys(); - - if (visible) { - const layersToAdd = HYDRO_DYNAMIC_LAYER_KEYS.filter( - key => !currentCheckedKeys.includes(key) - ); - - if (layersToAdd.length === 0) { - return currentCheckedKeys; - } - - await ensureDynamicLayersLoaded(layersToAdd); - return applyLayerSelection({ - checkedKeys: [...currentCheckedKeys, ...layersToAdd] - }); - } - - const nextCheckedKeys = currentCheckedKeys.filter(key => { - if (!HYDRO_DYNAMIC_LAYER_KEYS.includes(key)) { - return true; - } - return hydroMenuDefaultCheckedKeys.has(key); - }); - - if (nextCheckedKeys.length === currentCheckedKeys.length) { - return currentCheckedKeys; - } - - return applyLayerSelection({ - checkedKeys: nextCheckedKeys - }); - })().finally(() => { - if (hydroDynamicLayerSyncTask?.promise === task) { - hydroDynamicLayerSyncTask = null; - } - }); - - hydroDynamicLayerSyncTask = { - visible, - promise: task - }; - return task; - }; - - // 备注:统一按当前缩放对齐首页菜单的中型站过滤和 12 级动态图层状态。 - const syncZoomSensitiveState = async ({ - isHydroMenu, - refreshEngPoint = false - }: { - isHydroMenu: boolean; - refreshEngPoint?: boolean; - }) => { - const currentZoom = getCurrentZoom(); - if (currentZoom !== undefined) { - mapViewStore.setCurrentZoomLevel(currentZoom); - } - - if ( - isHydroMenu && - refreshEngPoint && - mapViewStore.getCheckedLayerKeys().includes(ENG_POINT_LAYER_KEY) - ) { - mapStore.refreshPointLayerDisplayData(ENG_POINT_LAYER_KEY); - } - - await syncHydroDynamicLayers( - !!isHydroMenu && currentZoom !== undefined && currentZoom >= 12 - ); - }; - - // 备注:统一处理地图缩放联动,收口水电开发菜单下的动态图层阈值切换逻辑。 - const handleZoomLevelChange = async ( - previousZoom: number, - currentZoom: number, - isHydroMenu: boolean - ) => { - mapViewStore.setCurrentZoomLevel(currentZoom); - - const crossedEngPointMediumThreshold = - (previousZoom <= ENG_POINT_MEDIUM_VISIBLE_ZOOM && - currentZoom > ENG_POINT_MEDIUM_VISIBLE_ZOOM) || - (previousZoom > ENG_POINT_MEDIUM_VISIBLE_ZOOM && - currentZoom <= ENG_POINT_MEDIUM_VISIBLE_ZOOM); - - if ( - isHydroMenu && - crossedEngPointMediumThreshold && - mapViewStore.getCheckedLayerKeys().includes(ENG_POINT_LAYER_KEY) - ) { - mapStore.refreshPointLayerDisplayData(ENG_POINT_LAYER_KEY); - } - - if (!isHydroMenu) { - return; - } - - const oldZoomLevel = Math.floor(previousZoom); - const newZoomLevel = Math.floor(currentZoom); - - if (oldZoomLevel < 12 && newZoomLevel >= 12) { - await syncHydroDynamicLayers(true); - return; - } - - if (oldZoomLevel >= 12 && newZoomLevel < 12) { - await syncHydroDynamicLayers(false); - } - }; - - // 备注:统一处理菜单切换后的页面重载和动态图层收口,减少页面组件里的分支编排。 - const handlePageChange = (pageKey: string, isHydroMenu: boolean) => { - if (!pageKey) return Promise.resolve(); - - const previousPageKey = mapConfigStore.lastLoadOptions?.pageKey || ''; - if (previousPageKey && previousPageKey !== pageKey) { - hideCurrentVisibleLayers(); - mapViewStore.setCheckedLayerKeys([]); - mapStore.setSelectedLegendData(); - } - - return reloadPage(pageKey).then(async () => { - await syncZoomSensitiveState({ - isHydroMenu, - refreshEngPoint: true - }); - }); - }; - - // 备注:统一处理单个图层切换命令,供后续其他入口复用。 - const toggleLayer = async (layerKey: string, checked?: boolean) => { - const currentKeys = mapViewStore.getCheckedLayerKeys(); - const currentSet = new Set(currentKeys); - const nextChecked = - checked === undefined ? !currentSet.has(layerKey) : checked; - - if (nextChecked) { - currentSet.add(layerKey); - } else { - currentSet.delete(layerKey); - } - - return applyLayerSelection({ - checkedKeys: Array.from(currentSet), - triggerKey: layerKey, - checked: nextChecked - }); - }; - - // 备注:统一处理单个图例切换命令,供图例组件复用。 - const toggleLegend = (nameEn: string, checked?: number) => { - if (!nameEn) return; - console.log('toggleLegend', nameEn, checked); - console.log(mapViewStore.getLegendChecked(nameEn)); - const nextChecked = - checked === undefined - ? mapViewStore.getLegendChecked(nameEn) === 1 - ? 0 - : 1 - : checked; - console.log(nextChecked); - mapStore.updateLegendChecked(nameEn, nextChecked); - }; - - // 备注:统一处理批量图例切换命令,供容量筛选和分组图例复用。 - const toggleLegendBatch = (nameEns: string[] = [], checked: number) => { - const targetNameEns = nameEns.filter(Boolean); - if (targetNameEns.length === 0) return; - mapStore.updateLegendCheckedBatch(targetNameEns, checked); - }; - - // 备注:统一处理基地切换命令,同时驱动地图基地裁切联动。 - const changeBaseId = (baseId: string) => { - const nextBaseId = !baseId || baseId === 'all' ? '' : baseId; - mapViewStore.setSelectedBaseId(nextBaseId); - mapClass.jdPanelControlShowAndHidden( - baseId || 'all', - baseId !== 'all' && !!baseId - ); - }; - - // 备注:统一处理时间范围变更,并触发相关图层数据重载。 - const changeTimeRange = async (range: [any, any]) => { - mapViewStore.setSearchTimeRange(range); - await mapStore.reloadBySearchTimeRange(); - }; - - // 备注:统一处理装机容量筛选,让筛选器切换时同步更新 eng_point 图例运行态和点位显示。 - const changeEngPointCapacity = (capacityType?: string | null) => { - const legendItems = mapStore.getLegendItemsByLayerCode(ENG_POINT_LAYER_KEY); - if (!legendItems.length) return; - - const allEngLegendNames = legendItems - .map((item: any) => item?.nameEn) - .filter(Boolean); - - if (!allEngLegendNames.length) return; - - const normalizedCapacityType = capacityType || 'all'; - let activePrefixes = [LARGE_ENG_LEGEND_PREFIX, MID_ENG_LEGEND_PREFIX]; - - if (normalizedCapacityType === 'large_eng_built') { - activePrefixes = [LARGE_ENG_LEGEND_PREFIX]; - } else if (normalizedCapacityType === 'mid_eng_built') { - activePrefixes = [MID_ENG_LEGEND_PREFIX]; - } - - const visibleLegendNames = allEngLegendNames.filter((nameEn: string) => - activePrefixes.some(prefix => nameEn.startsWith(prefix)) - ); - const hiddenLegendNames = allEngLegendNames.filter( - (nameEn: string) => !visibleLegendNames.includes(nameEn) - ); - - mapStore.updateLegendCheckedBatch(hiddenLegendNames, 0); - mapStore.updateLegendCheckedBatch(visibleLegendNames, 1); - mapStore.refreshPointLayerDisplayData(ENG_POINT_LAYER_KEY); - }; - - // 备注:统一重置地图筛选表单依赖的时间范围,供筛选组件在切页时复位默认输入。 - const resetFilterState = () => { - mapViewStore.setSearchTimeRange([dayjs().subtract(1, 'M'), dayjs()]); - }; - - // 备注:统一处理搜索定位,按点位编码从缓存数据中查找并飞行到目标位置。 - const focusPoint = ( - pointId: string, - zoom = 15, - fallbackPoints: any[] = [] - ) => { - if (!pointId) return; - const pointMatcher = (item: any) => { - return item.stcd === pointId || item._id === pointId; - }; - const targetPoint = - mapDataStore.pointData.find(pointMatcher) || - fallbackPoints.find(pointMatcher); - if (!targetPoint?.lgtd || !targetPoint?.lttd) return; - - const legendState = String(targetPoint?.anchoPointState || ''); - if (legendState && mapViewStore.getLegendChecked(legendState) !== 1) { - mapStore.updateLegendChecked(legendState, 1); - } - - const layerKey = String(targetPoint?.layerKey || ''); - if (layerKey && mapClass.hasLayer(layerKey)) { - mapClass.mdLayerTreeShowOrHidden(layerKey, true); - } - - mapClass.flyTopanto([targetPoint.lgtd, targetPoint.lttd], zoom); - }; - - // 备注:统一释放地图页面生命周期里注册的监听,避免页面卸载后残留联动。 - const unmountView = () => { - if (removeZoomListener) { - removeZoomListener(); - removeZoomListener = null; - } - clearZoomSyncDebounceTimer(); - - if (stopBaseSelectionWatch) { - stopBaseSelectionWatch(); - } - - if (baseSelectionDebounceTimer.value) { - clearTimeout(baseSelectionDebounceTimer.value); - baseSelectionDebounceTimer.value = null; - } - - latestHydroMenuGetter = null; - currentMapType = '2D'; - initializedBaseLayerKeys.clear(); - hydroMenuDefaultCheckedKeys.clear(); - }; - - return { - initialize, - mountView, - switchMapType, - unmountView, - loadPage, - reloadPage, - applyLayerSelection, - ensureDynamicLayersLoaded, - syncHydroDynamicLayers, - getCurrentZoom, - handleZoomLevelChange, - handlePageChange, - toggleLayer, - toggleLegend, - toggleLegendBatch, - changeBaseId, - changeTimeRange, - changeEngPointCapacity, - resetFilterState, - focusPoint - }; -}; diff --git a/frontend-sjgl/src/modules/map/domain/legend-deriver.ts b/frontend-sjgl/src/modules/map/domain/legend-deriver.ts deleted file mode 100644 index c550f926..00000000 --- a/frontend-sjgl/src/modules/map/domain/legend-deriver.ts +++ /dev/null @@ -1,147 +0,0 @@ -type BuildLegendTreeOptions = { - items?: any[]; - selectedLayerCodes?: Set; - getLegendChecked: (nameEn?: string) => number; - normalizeLegendNameEn: (nameEn?: string) => string; -}; - -// 备注:统一把 checked 值规范为 0/1,避免运行态和原始配置态混用不同类型。 -export const normalizeLegendCheckedValue = ( - checked: any -): number | undefined => { - if (checked === null || checked === undefined || checked === '') { - return undefined; - } - - const numericChecked = Number(checked); - if (Number.isNaN(numericChecked)) { - return undefined; - } - - return numericChecked === 1 ? 1 : 0; -}; - -// 备注:收集图例树的叶子节点,供初始化图例运行态 checked 索引使用。 -export const collectLegendLeaves = (items: any[] = []): any[] => { - const leaves: any[] = []; - items.forEach(item => { - if (item?.childrenList?.length > 0) { - leaves.push(...collectLegendLeaves(item.childrenList)); - } else { - leaves.push(item); - } - }); - return leaves; -}; - -// 备注:根据原始图例配置生成图例运行态 checked 映射,避免后续重复递归取默认值。 -export const buildLegendCheckedState = ( - sourceData: any[] = [], - normalizeLegendNameEn: (nameEn?: string) => string -): Record => { - const nextState: Record = {}; - - collectLegendLeaves(sourceData).forEach(item => { - const normalizedNameEn = normalizeLegendNameEn(item?.nameEn); - if (!normalizedNameEn) return; - - const fallbackChecked = normalizeLegendCheckedValue(item?.checked) ?? 0; - nextState[normalizedNameEn] = fallbackChecked; - }); - - return nextState; -}; - -// 备注:按当前选中图层和图例运行态生成可展示的图例树结构。 -export const buildLegendTree = ({ - items = [], - selectedLayerCodes, - getLegendChecked, - normalizeLegendNameEn -}: BuildLegendTreeOptions): any[] => { - const buildLegendNode = (item: any): any | null => { - if (item?.name === '地图') { - return null; - } - - if (item?.childrenList?.length > 0) { - const children = item.childrenList - .map((child: any) => buildLegendNode(child)) - .filter(Boolean); - - if (selectedLayerCodes && children.length === 0) { - return null; - } - - return { - ...item, - checked: children.some((child: any) => child.checked === 1) ? 1 : 0, - childrenList: children - }; - } - - if (item?.ifShow === 0) { - return null; - } - - if ( - selectedLayerCodes && - (!item?.layerCode || !selectedLayerCodes.has(item.layerCode)) - ) { - return null; - } - - const normalizedNameEn = normalizeLegendNameEn(item?.nameEn); - return { - ...item, - nameEn: normalizedNameEn, - checked: getLegendChecked(normalizedNameEn) - }; - }; - - return items.map(item => buildLegendNode(item)).filter(Boolean); -}; - -// 备注:按名称从图例树中提取指定分组,供环保设施补充规则复用。 -export const pickLegendGroupByName = ( - items: any[] = [], - groupName: string -): any[] => { - return items.filter(item => item?.name === groupName); -}; - -// 备注:统一应用环保设施图例补充规则,避免在多个位置重复拼装同一组图例。 -export const applyEnvFacilityLegendRule = ( - legendItems: any[] = [], - layerKeys: string[] = [], - legendSource: any[] = [], - buildLegendItems: (items: any[]) => any[] -): any[] => { - const triggerKeys = [ - 'fp_point', - 'eq_point', - 'fb_point', - 'vp_point', - 'va_point', - 'sg_point', - 'dw_point' - ]; - const hasTriggerLayer = triggerKeys.some(key => layerKeys.includes(key)); - const withoutEnvFacility = legendItems.filter( - (item: any) => item.name !== '环保设施' - ); - - if (!hasTriggerLayer) { - return withoutEnvFacility; - } - - const envFacilityLegend = buildLegendItems( - pickLegendGroupByName(legendSource, '环保设施') - )[0]; - - if (!envFacilityLegend) { - return withoutEnvFacility; - } - - return [...withoutEnvFacility, envFacilityLegend]; -}; diff --git a/frontend-sjgl/src/modules/map/domain/map-layer-rules.ts b/frontend-sjgl/src/modules/map/domain/map-layer-rules.ts deleted file mode 100644 index bd1ab375..00000000 --- a/frontend-sjgl/src/modules/map/domain/map-layer-rules.ts +++ /dev/null @@ -1,80 +0,0 @@ -type ApplyLayerMutualExclusionRulesOptions = { - rawKeys?: string[]; - previousKeys?: string[]; - triggerKey?: string; - checked?: boolean; - getLayerBranchKeys?: (rootKey: string) => string[]; -}; - -// 备注:统一按当前业务规则收口图层互斥关系,返回归一化后的勾选结果。 -export const applyLayerMutualExclusionRules = ({ - rawKeys = [], - previousKeys = [], - triggerKey, - checked, - getLayerBranchKeys -}: ApplyLayerMutualExclusionRulesOptions): string[] => { - let normalizedKeys = Array.from(new Set(rawKeys.filter(Boolean))); - - const hasAny = (keys: string[]) => - keys.length > 0 && keys.some(key => normalizedKeys.includes(key)); - const hadAny = (keys: string[]) => - keys.length > 0 && keys.some(key => previousKeys.includes(key)); - const removeKeys = (keys: string[]) => { - if (keys.length === 0) return; - normalizedKeys = normalizedKeys.filter(key => !keys.includes(key)); - }; - - // 备注:统一处理两组图层的互斥关系,并优先保留当前触发的一组。 - const resolveConflict = ( - primaryKeys: string[], - secondaryKeys: string[], - preferredGroup: 'primary' | 'secondary' = 'primary' - ) => { - if (!hasAny(primaryKeys) || !hasAny(secondaryKeys)) { - return; - } - - if (triggerKey && checked !== false) { - if (primaryKeys.includes(triggerKey)) { - removeKeys(secondaryKeys); - return; - } - if (secondaryKeys.includes(triggerKey)) { - removeKeys(primaryKeys); - return; - } - } - - const primaryWasChecked = hadAny(primaryKeys); - const secondaryWasChecked = hadAny(secondaryKeys); - - if (primaryWasChecked && !secondaryWasChecked) { - removeKeys(secondaryKeys); - return; - } - if (!primaryWasChecked && secondaryWasChecked) { - removeKeys(primaryKeys); - return; - } - - if (preferredGroup === 'primary') { - removeKeys(secondaryKeys); - } else { - removeKeys(primaryKeys); - } - }; - - resolveConflict(['rare_fish_point'], ['fish_along_point'], 'primary'); - resolveConflict( - ['stinfo', 'stinfo_video_point'], - ['stinfo_ai_video_point'], - 'secondary' - ); - - const facilityKeys = getLayerBranchKeys?.('facilities') || []; - const facilityBuiltKeys = getLayerBranchKeys?.('facilities_built') || []; - resolveConflict(facilityKeys, facilityBuiltKeys, 'primary'); - - return normalizedKeys; -}; diff --git a/frontend-sjgl/src/modules/map/domain/nearby-point-rules.ts b/frontend-sjgl/src/modules/map/domain/nearby-point-rules.ts deleted file mode 100644 index 77d99e51..00000000 --- a/frontend-sjgl/src/modules/map/domain/nearby-point-rules.ts +++ /dev/null @@ -1,418 +0,0 @@ -export type NearbyPointDisplayMode = 'default' | 'replace' | 'expand'; - -export type NearbyPointAutoRule = { - distanceThresholdMeters: number; - replaceAtZoom: number; - expandAtZoom: number; - expandOffsetPx: number; - angleStepDeg: number; - minGroupSize: number; -}; - -export type NearbyPointLayoutRule = { - ringSize: number; - fanAngleForTwoDeg: number; - fanAngleForFourDeg: number; - fanAngleForManyDeg: number; - ringGapPx: number; - ringGapFactor: number; -}; - -export type NearbyPointDensityDisplayRule = { - minDensityValue: number; - minZoom: number; -}; - -export type NearbyPointConfig = { - autoRule: NearbyPointAutoRule; - layoutRule: NearbyPointLayoutRule; - densityDisplayRules: NearbyPointDensityDisplayRule[]; -}; - -export type NearbyPointRuntimeMeta = { - groupId: string; - displayName: string; - groupSize: number; - priority: number; - showZoomMin: number | null; - showZoomMax: number | null; - replaceAtZoom: number; - expandAtZoom: number; - expandOffsetPx: number; - expandAngleDeg: number; - displayMode: NearbyPointDisplayMode; -}; - -// 备注:近邻点统一调参入口。 -// 当前参数偏向“更容易成组、稍早进入替换与展开、展开位移更明显”, -// 方便抽吸效果在常用浏览层级更早被感知。 -export const DEFAULT_NEARBY_POINT_AUTO_RULE: NearbyPointAutoRule = { - distanceThresholdMeters: 9000, - replaceAtZoom: 10.5, - expandAtZoom: 12.2, - expandOffsetPx: 48, - angleStepDeg: 55, - minGroupSize: 2 -}; - -// 备注:展开布局统一调参入口。这里控制单圈数量、扇形角度和外圈扩散节奏。 -export const DEFAULT_NEARBY_POINT_LAYOUT_RULE: NearbyPointLayoutRule = { - ringSize: 5, - fanAngleForTwoDeg: 110, - fanAngleForFourDeg: 150, - fanAngleForManyDeg: 180, - ringGapPx: 22, - ringGapFactor: 0.85 -}; - -// 备注:密度分档显示规则。distance 越大表示越稀疏,越早参与显示候选。 -export const DEFAULT_NEARBY_POINT_DENSITY_DISPLAY_RULES: NearbyPointDensityDisplayRule[] = - [ - { - minDensityValue: 1500000, - minZoom: 0 - }, - { - minDensityValue: 800000, - minZoom: 0 - }, - { - minDensityValue: 400000, - minZoom: 0 - }, - { - minDensityValue: 50000, - minZoom: 2.0 - }, - { - minDensityValue: 0, - minZoom: 4.0 - } - ]; - -export const DEFAULT_NEARBY_POINT_CONFIG: NearbyPointConfig = { - autoRule: DEFAULT_NEARBY_POINT_AUTO_RULE, - layoutRule: DEFAULT_NEARBY_POINT_LAYOUT_RULE, - densityDisplayRules: DEFAULT_NEARBY_POINT_DENSITY_DISPLAY_RULES -}; - -export const getNearbyPointConfig = (): NearbyPointConfig => { - return DEFAULT_NEARBY_POINT_CONFIG; -}; - -export const getNearbyPointAutoRule = (): NearbyPointAutoRule => { - return getNearbyPointConfig().autoRule; -}; - -export const getNearbyPointLayoutRule = (): NearbyPointLayoutRule => { - return getNearbyPointConfig().layoutRule; -}; - -export const getNearbyPointDensityDisplayRules = - (): NearbyPointDensityDisplayRule[] => { - return getNearbyPointConfig().densityDisplayRules; - }; - -type GroupCandidate = { - index: number; - point: Record; - lon: number; - lat: number; - layerKey: string; -}; - -const isAlarmRangeLegendState = (legendState: string): boolean => { - return ( - legendState.startsWith('alarm_range_') || - legendState.startsWith('large_eng_built_alarm_range_') || - legendState.startsWith('mid_eng_built_alarm_range_') - ); -}; - -const getPointRenderPriority = (point: Record): number => { - const layerKey = String(point.layerKey || point.type || '').toLowerCase(); - const legendState = String(point.anchoPointState || '').trim().toLowerCase(); - - if ( - layerKey.includes('eng_alarm_point') || - layerKey.includes('alarm_range') || - isAlarmRangeLegendState(legendState) - ) { - return 300; - } - - if ( - layerKey.includes('eng_point') || - legendState.startsWith('large_eng_') || - legendState.startsWith('mid_eng_') - ) { - return 200; - } - - return 100; -}; - -const normalizeText = (value: unknown): string => { - return String(value ?? '') - .trim() - .replace(/[()()]/g, '') - .toLowerCase(); -}; - -const toFiniteNumber = (value: unknown): number | null => { - if (value === '' || value === null || value === undefined) { - return null; - } - const numericValue = Number(value); - return Number.isFinite(numericValue) ? numericValue : null; -}; - -const haversineDistanceMeters = ( - lon1: number, - lat1: number, - lon2: number, - lat2: number -): number => { - const toRad = (degree: number) => (degree * Math.PI) / 180; - const earthRadius = 6371000; - const dLat = toRad(lat2 - lat1); - const dLon = toRad(lon2 - lon1); - const lat1Rad = toRad(lat1); - const lat2Rad = toRad(lat2); - - const a = - Math.sin(dLat / 2) * Math.sin(dLat / 2) + - Math.cos(lat1Rad) * - Math.cos(lat2Rad) * - Math.sin(dLon / 2) * - Math.sin(dLon / 2); - const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); - return earthRadius * c; -}; - -const clearNearbyPointRuntimeMeta = (point: Record) => { - delete point._nearbyRule; - delete point._nearbyGroupId; - delete point._nearbyDisplayName; - delete point._nearbyGroupSize; - delete point._nearbyPriority; - delete point._nearbyShowZoomMin; - delete point._nearbyShowZoomMax; - delete point._nearbyReplaceAtZoom; - delete point._nearbyExpandAtZoom; - delete point._nearbyExpandOffsetPx; - delete point._nearbyExpandAngleDeg; - delete point._nearbyDisplayMode; - delete point._nearbyIsPrimary; -}; - -const getPointDisplayName = (point: Record): string => { - return ( - point.titleName || point.stnm || point.ennm || point.stcd || point._id || '' - ); -}; - -const getPointStableIdentity = ( - point: Record, - index: number -): string => { - return normalizeText( - point.stcd || - point._id || - point.titleName || - point.stnm || - point.ennm || - `point_${index}` - ); -}; - -const getGroupSortKey = (candidate: GroupCandidate): string => { - return [ - getPointStableIdentity(candidate.point, candidate.index), - normalizeText(candidate.point.layerKey), - String(candidate.index).padStart(6, '0') - ].join('|'); -}; - -const compareGroupCandidates = ( - left: GroupCandidate, - right: GroupCandidate -): number => { - const leftRenderPriority = getPointRenderPriority(left.point); - const rightRenderPriority = getPointRenderPriority(right.point); - if (leftRenderPriority !== rightRenderPriority) { - return rightRenderPriority - leftRenderPriority; - } - - const leftDensityValue = toFiniteNumber(left.point.distance); - const rightDensityValue = toFiniteNumber(right.point.distance); - - if ( - leftDensityValue !== null && - rightDensityValue !== null && - leftDensityValue !== rightDensityValue - ) { - return rightDensityValue - leftDensityValue; - } - - if (leftDensityValue !== null || rightDensityValue !== null) { - return leftDensityValue !== null ? -1 : 1; - } - - return getGroupSortKey(left).localeCompare(getGroupSortKey(right)); -}; - -const buildRuntimeMeta = ( - groupId: string, - groupSize: number, - priority: number, - displayName: string, - rule: NearbyPointAutoRule -): NearbyPointRuntimeMeta => { - return { - groupId, - displayName, - groupSize, - priority, - showZoomMin: null, - showZoomMax: null, - replaceAtZoom: rule.replaceAtZoom, - expandAtZoom: rule.expandAtZoom, - expandOffsetPx: rule.expandOffsetPx, - expandAngleDeg: 0, - displayMode: 'default' - }; -}; - -const buildGroupCandidates = ( - points: Record[] = [] -): GroupCandidate[] => { - const candidates: GroupCandidate[] = []; - - points.forEach((point, index) => { - const lon = toFiniteNumber(point.lgtd); - const lat = toFiniteNumber(point.lttd); - if (lon === null || lat === null) { - clearNearbyPointRuntimeMeta(point); - return; - } - if (Math.abs(lon) > 180 || Math.abs(lat) > 90) { - clearNearbyPointRuntimeMeta(point); - return; - } - - candidates.push({ - index, - point, - lon, - lat, - layerKey: String(point.layerKey || '') - }); - }); - - return candidates; -}; - -const buildNearbyGroups = ( - candidates: GroupCandidate[], - rule: NearbyPointAutoRule -): GroupCandidate[][] => { - const result: GroupCandidate[][] = []; - const sortedCandidates = [...candidates].sort(compareGroupCandidates); - const consumedIndexes = new Set(); - - sortedCandidates.forEach((seedCandidate, seedIndex) => { - if (consumedIndexes.has(seedIndex)) { - return; - } - - const groupItems: GroupCandidate[] = [seedCandidate]; - const groupIndexes = [seedIndex]; - - for ( - let candidateIndex = seedIndex + 1; - candidateIndex < sortedCandidates.length; - candidateIndex += 1 - ) { - if (consumedIndexes.has(candidateIndex)) { - continue; - } - - const currentCandidate = sortedCandidates[candidateIndex]; - const distanceMeters = haversineDistanceMeters( - seedCandidate.lon, - seedCandidate.lat, - currentCandidate.lon, - currentCandidate.lat - ); - - if (distanceMeters <= rule.distanceThresholdMeters) { - groupItems.push(currentCandidate); - groupIndexes.push(candidateIndex); - } - } - - if (groupItems.length >= rule.minGroupSize) { - groupIndexes.forEach(index => consumedIndexes.add(index)); - result.push(groupItems); - } - }); - - return result; -}; - -// 备注:统一按空间距离自动识别近邻点组,不按名称或点类型分规则。 -export const attachNearbyPointRuntimeMeta = ( - points: Record[] = [], - rule: NearbyPointAutoRule = getNearbyPointAutoRule() -): Record[] => { - if (!Array.isArray(points) || points.length === 0) { - return []; - } - - points.forEach(point => clearNearbyPointRuntimeMeta(point)); - - const candidates = buildGroupCandidates(points); - if (candidates.length < rule.minGroupSize) { - return points; - } - const groupedCandidates = buildNearbyGroups(candidates, rule); - - let groupSeed = 0; - groupedCandidates.forEach(groupItems => { - if (groupItems.length < rule.minGroupSize) { - return; - } - - const sortedItems = [...groupItems].sort(compareGroupCandidates); - groupSeed += 1; - const groupId = `nearby-group-${groupSeed}`; - - sortedItems.forEach((candidate, orderIndex) => { - const priority = orderIndex + 1; - const runtimeMeta = buildRuntimeMeta( - groupId, - sortedItems.length, - priority, - getPointDisplayName(candidate.point), - rule - ); - - candidate.point._nearbyRule = runtimeMeta; - candidate.point._nearbyGroupId = runtimeMeta.groupId; - candidate.point._nearbyDisplayName = runtimeMeta.displayName; - candidate.point._nearbyGroupSize = runtimeMeta.groupSize; - candidate.point._nearbyPriority = runtimeMeta.priority; - candidate.point._nearbyShowZoomMin = runtimeMeta.showZoomMin; - candidate.point._nearbyShowZoomMax = runtimeMeta.showZoomMax; - candidate.point._nearbyReplaceAtZoom = runtimeMeta.replaceAtZoom; - candidate.point._nearbyExpandAtZoom = runtimeMeta.expandAtZoom; - candidate.point._nearbyExpandOffsetPx = runtimeMeta.expandOffsetPx; - candidate.point._nearbyExpandAngleDeg = runtimeMeta.expandAngleDeg; - candidate.point._nearbyDisplayMode = runtimeMeta.displayMode; - candidate.point._nearbyIsPrimary = runtimeMeta.priority === 1; - }); - }); - - return points; -}; diff --git a/frontend-sjgl/src/modules/map/stores/map-config.store.ts b/frontend-sjgl/src/modules/map/stores/map-config.store.ts deleted file mode 100644 index 248d5a00..00000000 --- a/frontend-sjgl/src/modules/map/stores/map-config.store.ts +++ /dev/null @@ -1,251 +0,0 @@ -import { defineStore } from 'pinia'; -import { ref } from 'vue'; -import { getMapList, getModuleMapLegendList } from '@/api/map'; - -type MapConfigLoadOptions = { - systemId: string; - moduleId: string; - pageKey?: string; - description?: string; -}; - -type LegendConfigLoadOptions = { - includeGlobal?: boolean; -}; - -const cloneConfigData = (data: T): T => { - return JSON.parse(JSON.stringify(data)); -}; - -export const useMapConfigStore = defineStore('map-config', () => { - const layerConfigTree = ref([]); - const layerConfigByKey = ref>({}); - const legendConfigOriginal = ref([]); - const legendConfigByNameEn = ref>({}); - const legendConfigByLayerCode = ref>({}); - const pageLegendConfig = ref([]); - const configLoading = ref(false); - const legendLoading = ref(false); - const lastLoadOptions = ref(null); - - const normalizeLegendNameEn = (nameEn?: string): string => { - if (!nameEn) return ''; - return nameEn; - }; - - // 备注:重建图层配置索引,后续按 key 读取图层配置时不再全量递归。 - const rebuildLayerConfigIndex = (items: any[] = []) => { - const nextIndex: Record = {}; - - const walk = (nodes: any[] = []) => { - nodes.forEach(item => { - if (item?.key) { - nextIndex[item.key] = item; - } - if (item?.children?.length > 0) { - walk(item.children); - } - }); - }; - - walk(items); - layerConfigByKey.value = nextIndex; - }; - - // 备注:从图层配置中提取默认勾选项,作为页面初始化时的基础勾选状态。 - const extractCheckedLayerKeys = (items: any[] = []): string[] => { - const keys: string[] = []; - - const walk = (nodes: any[] = []) => { - nodes.forEach(item => { - if (Number(item?.checked) === 1 && item?.key) { - keys.push(item.key); - } - if (item?.children?.length > 0) { - walk(item.children); - } - }); - }; - - walk(items); - return keys; - }; - - // 备注:重建图例配置索引,分别支持按 nameEn 和 layerCode 查询图例配置。 - const rebuildLegendConfigIndexes = (items: any[] = []) => { - const nextNameEnMap: Record = {}; - const nextLayerCodeMap: Record = {}; - - const walk = (nodes: any[] = []) => { - nodes.forEach(item => { - if (item?.childrenList?.length > 0) { - walk(item.childrenList); - return; - } - - const normalizedNameEn = normalizeLegendNameEn(item?.nameEn); - if (normalizedNameEn) { - nextNameEnMap[normalizedNameEn] = item; - } - - if (item?.layerCode) { - if (!nextLayerCodeMap[item.layerCode]) { - nextLayerCodeMap[item.layerCode] = []; - } - nextLayerCodeMap[item.layerCode].push(item); - } - }); - }; - - walk(items); - legendConfigByNameEn.value = nextNameEnMap; - legendConfigByLayerCode.value = nextLayerCodeMap; - }; - - // 备注:设置图层树配置,并同步初始化图层索引与默认勾选状态。 - const setLayerConfigTree = (data: any[] = []) => { - const nextData = cloneConfigData(data); - layerConfigTree.value = nextData; - rebuildLayerConfigIndex(nextData); - }; - - // 备注:设置全量原始图例配置,并同步构建图例索引。 - const setLegendConfigOriginal = (data: any[] = []) => { - const nextData = cloneConfigData(data); - legendConfigOriginal.value = nextData; - rebuildLegendConfigIndexes(nextData); - }; - - // 备注:设置页面级图例配置,仅保留后端返回的页面图例结构,不在这里做运行态加工。 - const setPageLegendConfig = (data: any[] = []) => { - pageLegendConfig.value = cloneConfigData(data); - }; - - // 备注:按图层 key 获取图层配置,供后续编排层和运行态 store 复用。 - const getLayerConfigByKey = (layerKey: string) => { - return layerConfigByKey.value[layerKey]; - }; - - // 备注:按图层 layerCode 获取原始图例项列表,供图层勾选后派生图例使用。 - const getLegendConfigByLayerCode = (layerCode: string): any[] => { - return legendConfigByLayerCode.value[layerCode] || []; - }; - - // 备注:按图例 nameEn 获取原始图例项,供运行态读取默认 checked 配置。 - const getLegendConfigByNameEn = (nameEn: string) => { - const normalizedNameEn = normalizeLegendNameEn(nameEn); - return legendConfigByNameEn.value[normalizedNameEn]; - }; - - // 备注:统一清理配置 store,便于菜单切换或地图销毁后重置配置状态。 - const clearConfigState = () => { - layerConfigTree.value = []; - layerConfigByKey.value = {}; - legendConfigOriginal.value = []; - legendConfigByNameEn.value = {}; - legendConfigByLayerCode.value = {}; - pageLegendConfig.value = []; - configLoading.value = false; - legendLoading.value = false; - lastLoadOptions.value = null; - }; - - const loadPageLayerConfig = async (options: MapConfigLoadOptions) => { - configLoading.value = true; - lastLoadOptions.value = { ...options }; - - try { - const layerRes = await getMapList({ - systemId: options.systemId, - moduleId: options.moduleId, - description: options.description ?? 'true' - }); - - const layerConfig = layerRes?.data?.mapLayerVos || []; - setLayerConfigTree(layerConfig); - return { - layerConfig - }; - } finally { - configLoading.value = false; - } - }; - - const loadPageLegendConfig = async ( - pageKey?: string, - options: LegendConfigLoadOptions = {} - ) => { - legendLoading.value = true; - - try { - const includeGlobal = options.includeGlobal !== false; - - let legendOriginal = legendConfigOriginal.value || []; - let pageLegend: any[] = []; - - if (includeGlobal) { - const [legendAllRes, legendPageRes] = await Promise.all([ - getModuleMapLegendList(), - getModuleMapLegendList(pageKey ? { moduleId: pageKey } : undefined) - ]); - - legendOriginal = legendAllRes?.data || []; - pageLegend = legendPageRes?.data || []; - } else { - const legendPageRes = await getModuleMapLegendList( - pageKey ? { moduleId: pageKey } : undefined - ); - pageLegend = legendPageRes?.data || []; - } - - setLegendConfigOriginal(legendOriginal); - setPageLegendConfig(pageLegend); - - return { - legendOriginal, - pageLegend - }; - } finally { - legendLoading.value = false; - } - }; - - // 备注:加载页面地图配置,只负责请求和保存配置数据,不处理锚点或地图渲染逻辑。 - const loadPageMapConfig = async (options: MapConfigLoadOptions) => { - const [{ layerConfig }, { legendOriginal, pageLegend }] = await Promise.all( - [loadPageLayerConfig(options), loadPageLegendConfig(options.pageKey)] - ); - - return { - layerConfig, - legendOriginal, - pageLegend - }; - }; - - return { - layerConfigTree, - layerConfigByKey, - legendConfigOriginal, - legendConfigByNameEn, - legendConfigByLayerCode, - pageLegendConfig, - configLoading, - legendLoading, - lastLoadOptions, - normalizeLegendNameEn, - rebuildLayerConfigIndex, - extractCheckedLayerKeys, - rebuildLegendConfigIndexes, - setLayerConfigTree, - setLegendConfigOriginal, - setPageLegendConfig, - getLayerConfigByKey, - getLegendConfigByLayerCode, - getLegendConfigByNameEn, - clearConfigState, - loadPageLayerConfig, - loadPageLegendConfig, - loadPageMapConfig - }; -}); diff --git a/frontend-sjgl/src/modules/map/stores/map-data.store.ts b/frontend-sjgl/src/modules/map/stores/map-data.store.ts deleted file mode 100644 index 1ec9658b..00000000 --- a/frontend-sjgl/src/modules/map/stores/map-data.store.ts +++ /dev/null @@ -1,192 +0,0 @@ -import { defineStore } from 'pinia'; -import { ref } from 'vue'; - -type PointLayerCacheItem = { - checked: boolean; - data: any[]; - cacheKey?: string; -}; - -type LayerLoadStatus = { - loading: boolean; - loaded: boolean; - error: string | null; -}; - -export const useMapDataStore = defineStore('map-data', () => { - const pointData = ref([]); - const pointDataCache = ref>({}); - const layerLoadState = ref>({}); - const loading = ref(true); - - // 备注:统一设置地图模块整体 loading 状态,供图例和筛选组件复用。 - const setLoading = (value: boolean) => { - loading.value = value; - }; - - // 备注:整体清空锚点合并数据,通常用于菜单切换或重新初始化。 - const clearPointData = () => { - pointData.value = []; - }; - - // 备注:直接覆盖锚点合并数据,供地图加载完成后统一回写。 - const setPointData = (data: any[] = []) => { - pointData.value = data; - }; - - // 备注:读取指定图层缓存,供地图渲染逻辑优先命中缓存数据。 - const getPointLayerCache = (layerKey: string) => { - return pointDataCache.value[layerKey]; - }; - - // 备注:判断单个图层缓存是否与当前请求条件匹配,避免旧筛选结果直接复用。 - const hasValidPointLayerCache = (layerKey: string, cacheKey: string) => { - const cache = getPointLayerCache(layerKey); - if (!cache || !cacheKey) return false; - return cache.cacheKey === cacheKey && cache.data.length > 0; - }; - - // 备注:读取单个图层的缓存数据数组,未命中时返回空数组,简化外层判空逻辑。 - const getPointLayerData = (layerKey: string): any[] => { - return pointDataCache.value[layerKey]?.data || []; - }; - - // 备注:判断单个图层缓存是否已具备可用数据,供加载和显隐逻辑快速分支。 - const hasPointLayerData = (layerKey: string): boolean => { - return getPointLayerData(layerKey).length > 0; - }; - - // 备注:写入单个图层的锚点缓存,并保留当前是否勾选的状态。 - const setPointLayerCache = (layerKey: string, cache: PointLayerCacheItem) => { - if (!layerKey) return; - pointDataCache.value[layerKey] = cache; - }; - - // 备注:只更新缓存中的勾选状态,避免重复覆盖整份锚点数据。 - const setPointLayerCacheChecked = (layerKey: string, checked: boolean) => { - const cache = pointDataCache.value[layerKey]; - if (!cache) return; - setPointLayerCache(layerKey, { - ...cache, - checked - }); - }; - - // 备注:删除指定图层缓存,供时间筛选重载和图层强制刷新使用。 - const removePointLayerCache = (layerKey: string) => { - if (!pointDataCache.value[layerKey]) return; - const nextCache = { ...pointDataCache.value }; - delete nextCache[layerKey]; - pointDataCache.value = nextCache; - }; - - // 备注:清空全部图层缓存,供页面切换或地图销毁时复用。 - const clearPointLayerCache = () => { - pointDataCache.value = {}; - }; - - // 备注:根据当前缓存重建合并锚点数据,避免在多个地方手写拼装逻辑。 - const rebuildPointDataFromCache = (layerKeys: string[] = []) => { - const targetLayerKeys = - layerKeys.length > 0 ? layerKeys : Object.keys(pointDataCache.value); - const allPointData: any[] = []; - - targetLayerKeys.forEach(layerKey => { - const cache = pointDataCache.value[layerKey]; - if (!cache?.data?.length) return; - - cache.data.forEach((point: any) => { - if (point?.layerKey !== layerKey) { - point.layerKey = layerKey; - } - allPointData.push(point); - }); - }); - - pointData.value = allPointData; - return allPointData; - }; - - // 备注:统一初始化单个图层的加载状态,避免外层重复判空。 - const ensureLayerLoadState = (layerKey: string): LayerLoadStatus => { - if (!layerLoadState.value[layerKey]) { - layerLoadState.value[layerKey] = { - loading: false, - loaded: false, - error: null - }; - } - return layerLoadState.value[layerKey]; - }; - - // 备注:标记单个图层进入加载中状态。 - const setLayerLoading = (layerKey: string) => { - const current = ensureLayerLoadState(layerKey); - layerLoadState.value[layerKey] = { - ...current, - loading: true, - error: null - }; - }; - - // 备注:标记单个图层加载成功,供后续判断是否已完成首次加载。 - const setLayerLoaded = (layerKey: string) => { - const current = ensureLayerLoadState(layerKey); - layerLoadState.value[layerKey] = { - ...current, - loading: false, - loaded: true, - error: null - }; - }; - - // 备注:标记单个图层加载失败,并记录错误信息。 - const setLayerLoadError = (layerKey: string, error: unknown) => { - const current = ensureLayerLoadState(layerKey); - layerLoadState.value[layerKey] = { - ...current, - loading: false, - loaded: false, - error: error instanceof Error ? error.message : String(error) - }; - }; - - // 备注:清理指定图层的加载状态,供重载场景复用。 - const clearLayerLoadState = (layerKey: string) => { - if (!layerLoadState.value[layerKey]) return; - delete layerLoadState.value[layerKey]; - }; - - // 备注:整体重置数据缓存 store,供菜单切换或地图销毁时调用。 - const resetDataState = () => { - pointData.value = []; - pointDataCache.value = {}; - layerLoadState.value = {}; - loading.value = true; - }; - - return { - pointData, - pointDataCache, - layerLoadState, - loading, - setLoading, - clearPointData, - setPointData, - getPointLayerCache, - hasValidPointLayerCache, - getPointLayerData, - hasPointLayerData, - setPointLayerCache, - setPointLayerCacheChecked, - removePointLayerCache, - clearPointLayerCache, - rebuildPointDataFromCache, - ensureLayerLoadState, - setLayerLoading, - setLayerLoaded, - setLayerLoadError, - clearLayerLoadState, - resetDataState - }; -}); diff --git a/frontend-sjgl/src/modules/map/stores/map-view.store.ts b/frontend-sjgl/src/modules/map/stores/map-view.store.ts deleted file mode 100644 index c0c80452..00000000 --- a/frontend-sjgl/src/modules/map/stores/map-view.store.ts +++ /dev/null @@ -1,92 +0,0 @@ -import { defineStore } from 'pinia'; -import { ref } from 'vue'; -import dayjs from 'dayjs'; - -export const useMapViewStore = defineStore('map-view', () => { - const checkedLayerKeys = ref([]); - const legendCheckedState = ref>({}); - const searchTimeRange = ref<[any, any]>([dayjs().subtract(1, 'M'), dayjs()]); - const selectedBaseId = ref(''); - const currentZoomLevel = ref(4.5); - - // 备注:统一写入当前选中的图层 key,始终保持去重后的结果。 - const setCheckedLayerKeys = (keys: string[] = []) => { - checkedLayerKeys.value = Array.from(new Set(keys.filter(Boolean))); - }; - - // 备注:获取当前选中的图层 key,供图层树、动态图层和筛选联动复用。 - const getCheckedLayerKeys = (): string[] => { - return checkedLayerKeys.value; - }; - - // 备注:覆盖写入完整图例运行态勾选状态,适合图例初始化和整批替换。 - const setLegendCheckedState = (state: Record = {}) => { - legendCheckedState.value = { ...state }; - }; - - // 备注:写入单个图例运行态勾选状态,供点击图例项时复用。 - const setLegendChecked = (nameEn: string, checked: number) => { - if (!nameEn) return; - legendCheckedState.value = { - ...legendCheckedState.value, - [nameEn]: checked - }; - }; - - // 备注:批量写入多个图例运行态勾选状态,供分组图例和筛选联动复用。 - const setLegendCheckedBatch = ( - stateMap: Record = {} - ) => { - legendCheckedState.value = { - ...legendCheckedState.value, - ...stateMap - }; - }; - - // 备注:获取单个图例当前运行态勾选状态,未命中时默认返回 0。 - const getLegendChecked = (nameEn: string): number => { - return legendCheckedState.value[nameEn] ?? 0; - }; - - // 备注:统一更新当前时间筛选范围,供筛选组件和地图数据重载复用。 - const setSearchTimeRange = (range: [any, any]) => { - searchTimeRange.value = range; - }; - - // 备注:统一更新当前基地 ID,供地图筛选和基地联动复用。 - const setSelectedBaseId = (baseId: string) => { - selectedBaseId.value = baseId || ''; - }; - - // 备注:统一更新当前地图缩放级别,供动态图层联动复用。 - const setCurrentZoomLevel = (zoom: number) => { - currentZoomLevel.value = zoom; - }; - - // 备注:在菜单切换或地图销毁时重置运行态到默认值。 - const resetViewState = () => { - checkedLayerKeys.value = []; - legendCheckedState.value = {}; - searchTimeRange.value = [dayjs().subtract(1, 'M'), dayjs()]; - selectedBaseId.value = ''; - currentZoomLevel.value = 4.5; - }; - - return { - checkedLayerKeys, - legendCheckedState, - searchTimeRange, - selectedBaseId, - currentZoomLevel, - setCheckedLayerKeys, - getCheckedLayerKeys, - setLegendCheckedState, - setLegendChecked, - setLegendCheckedBatch, - getLegendChecked, - setSearchTimeRange, - setSelectedBaseId, - setCurrentZoomLevel, - resetViewState - }; -}); diff --git a/frontend-sjgl/src/store/modules/map.ts b/frontend-sjgl/src/store/modules/map.ts deleted file mode 100644 index 99cbd6c0..00000000 --- a/frontend-sjgl/src/store/modules/map.ts +++ /dev/null @@ -1,1490 +0,0 @@ -import { defineStore, storeToRefs } from 'pinia'; -import { ref } from 'vue'; -import dayjs from 'dayjs'; -import { MapClass } from '@/components/gis/map.class'; -import { getMapConfig } from '@/components/gis/gisUtils'; -import { applyLayerMutualExclusionRules } from '@/modules/map/domain/map-layer-rules'; -import { - applyEnvFacilityLegendRule, - buildLegendCheckedState, - buildLegendTree -} from '@/modules/map/domain/legend-deriver'; -import { attachNearbyPointRuntimeMeta } from '@/modules/map/domain/nearby-point-rules'; -import { useMapConfigStore } from '@/modules/map/stores/map-config.store'; -import { useMapDataStore } from '@/modules/map/stores/map-data.store'; -import { useMapViewStore } from '@/modules/map/stores/map-view.store'; -import request from '@/utils/request'; -const mapClass = MapClass.getInstance(); -const ENG_POINT_LAYER_KEY = 'eng_point'; -const ENG_ALARM_POINT_LAYER_KEY = 'eng_alarm_point'; -const YLFB_POINT_LAYER_KEY = 'ylfb_point'; -const ENG_POINT_MEDIUM_VISIBLE_ZOOM = 7.5; -const ENG_POINT_LARGE_STATES = [ - 'large_eng_built', - 'large_eng_ubuilt', - 'large_eng_nbuilt' -]; -const ENG_POINT_MEDIUM_STATES = [ - 'mid_eng_built', - 'mid_eng_ubuilt', - 'mid_eng_nbuilt' -]; - -const isEngPointRuntimeItem = (item: any): boolean => { - const runtimeLayerKey = String( - item?.layerKey || item?.type || item?._layerKey || '' - ).toLowerCase(); - const sttpMap = String( - item?._sttpMap || item?.sttpMap || item?.popupSttpMap || '' - ).toUpperCase(); - const sttpCode = String(item?.sttpCode || item?.sttp || '').toUpperCase(); - - if (runtimeLayerKey) { - return runtimeLayerKey.includes(ENG_POINT_LAYER_KEY); - } - - return sttpMap === 'ENG' || sttpMap === 'ENG2' || sttpCode === 'ENG'; -}; - -const normalizeCachePayload = (value: any): any => { - if (Array.isArray(value)) { - return value.map(item => normalizeCachePayload(item)); - } - - if (value && typeof value === 'object') { - return Object.keys(value) - .sort() - .reduce>((acc, key) => { - acc[key] = normalizeCachePayload(value[key]); - return acc; - }, {}); - } - - return value; -}; - -const isCanceledRequestError = (error: unknown) => { - const message = error instanceof Error ? error.message : String(error || ''); - return ( - message.includes('canceled') || - message.includes('aborted') || - message.includes('AbortError') - ); -}; - -const buildFiltersFromParamsObject = ( - paramsObject: Record = {} -) => { - const filtersArray: any[] = []; - - Object.keys(paramsObject).forEach(paramKey => { - const value = paramsObject[paramKey]; - - if (Array.isArray(value)) { - value.forEach((filter: any) => { - filtersArray.push({ - ...filter, - dataType: filter?.dataType || 'string' - }); - }); - return; - } - - filtersArray.push({ - field: paramKey, - operator: 'eq', - dataType: 'string', - value - }); - }); - - return filtersArray; -}; - -const normalizeRequestParams = (rawParams: any) => { - if (!rawParams || !Object.keys(rawParams).length) { - return { logic: 'and', filters: [] }; - } - - if (Array.isArray(rawParams.filters)) { - return { - logic: rawParams.logic || 'and', - filters: rawParams.filters.map((filter: any) => ({ - ...filter, - dataType: filter?.dataType || 'string' - })) - }; - } - - return { - logic: 'and', - filters: buildFiltersFromParamsObject(rawParams) - }; -}; - -const parseAnchorParamJson = (anchorParamJson?: string) => { - const result: { filters: any[]; orders: any[] | null } = { - filters: [], - orders: null - }; - - if (!anchorParamJson) return result; - - try { - const parsed = JSON.parse(anchorParamJson); - if (!parsed || typeof parsed !== 'object') return result; - - // 解析 params -> filters(兼容旧格式:如果没有 params 字段,整个对象即为 params) - const paramsObj = parsed.params || parsed; - if ( - paramsObj && - typeof paramsObj === 'object' && - !Array.isArray(paramsObj) - ) { - result.filters = buildFiltersFromParamsObject(paramsObj); - } - - // 解析 orders -> sort 数组 - if (parsed.orders) { - let ordersObj: Record = {}; - if (typeof parsed.orders === 'string') { - ordersObj = JSON.parse(parsed.orders); - } else if (typeof parsed.orders === 'object') { - ordersObj = parsed.orders; - } - if (ordersObj && typeof ordersObj === 'object') { - result.orders = Object.entries(ordersObj).map(([field, dir]) => ({ - field, - dir - })); - } - } - - return result; - } catch (error) { - console.error('解析 anchorParamJson 失败:', error); - return result; - } -}; - -export const useMapStore = defineStore('map', () => { - const mapConfigStore = useMapConfigStore(); - const mapDataStore = useMapDataStore(); - const mapViewStore = useMapViewStore(); - const { - getLayerConfigByKey, - getLegendConfigByLayerCode, - getLegendConfigByNameEn - } = mapConfigStore; - const { hasPointLayerData, getPointLayerData } = mapDataStore; - const { - layerConfigTree: layerData, - legendConfigOriginal: legendDataOriginal, - pageLegendConfig - } = storeToRefs(mapConfigStore); - const { checkedLayerKeys, legendCheckedState, searchTimeRange } = - storeToRefs(mapViewStore); - const { pointData, pointDataCache, layerLoadState, loading } = - storeToRefs(mapDataStore); - - // 图例数据(经过筛选和排序的) - const legendData = ref([]); - // 选中的图例数据 - const legendDataSelected = ref([]); - const inFlightRequestMap = new Map< - string, - { - promise: Promise; - controller: AbortController; - layerKey: string; - sessionId: number; - } - >(); - const activeLayerRequestKeyMap = new Map(); - const backgroundPointLayerCache = new Map< - string, - { - checked: boolean; - data: any[]; - cacheKey?: string; - } - >(); - let loadSessionSeed = 0; - let activePageRenderToken = 0; - let activePageKey = ''; - let activePageLayerKeys = new Set(); - let activeLoadingPageToken: number | null = null; - let pendingPageNavigationKey = ''; - - const normalizeLegendNameEn = mapConfigStore.normalizeLegendNameEn; - - const filterPointLayerDataForDisplay = ( - layerKey: string, - sourceData: any[] = [], - currentZoom: number = mapViewStore.currentZoomLevel - ): any[] => { - if (layerKey !== ENG_POINT_LAYER_KEY || !Array.isArray(sourceData)) { - return sourceData; - } - - const allowMedium = currentZoom > ENG_POINT_MEDIUM_VISIBLE_ZOOM; - return sourceData.filter((item: any) => { - if (!isEngPointRuntimeItem(item)) { - return true; - } - - const state = String(item?.anchoPointState || ''); - if (ENG_POINT_LARGE_STATES.includes(state)) { - return true; - } - if (ENG_POINT_MEDIUM_STATES.includes(state)) { - return allowMedium; - } - return true; - }); - }; - - const refreshPointLayerDisplayData = (layerKey: string) => { - if (!layerKey) return; - - const layerItem = findLayerByKey(layerData.value, layerKey); - syncBackgroundCacheToReactiveStore(layerKey); - const rawData = - Array.isArray(layerItem?.data) && layerItem.data.length > 0 - ? layerItem.data - : getEffectivePointLayerData(layerKey); - const displayData = filterPointLayerDataForDisplay(layerKey, rawData); - const shouldRestoreVisible = - layerItem?.checked === 1 || checkedLayerKeys.value.includes(layerKey); - - mapClass.addInitDataLayer(displayData, layerKey); - if (!shouldRestoreVisible) { - mapClass.mdLayerTreeShowOrHidden(layerKey, false); - return; - } - restoreLayerLegendVisibility(layerKey); - mapClass.mdLayerTreeShowOrHidden(layerKey, true); - }; - - const getLegendItemsByLayerCode = (layerCode: string): any[] => { - return getLegendConfigByLayerCode(layerCode); - }; - - const getLegendChecked = (nameEn?: string): number => { - const normalizedNameEn = normalizeLegendNameEn(nameEn); - if (!normalizedNameEn) return 0; - return mapViewStore.getLegendChecked(normalizedNameEn); - }; - - const restoreLayerLegendVisibility = (layerKey: string): boolean => { - const layerLegendItems = getLegendItemsByLayerCode(layerKey); - if ( - legendDataOriginal.value.length === 0 || - layerLegendItems.length === 0 - ) { - return false; - } - - mapClass.setLegendPointVisible(layerKey, '', false); - layerLegendItems.forEach((legendItem: any) => { - if (getLegendChecked(legendItem.nameEn) === 1) { - applyLegendItemVisibility(legendItem, 1); - } - }); - - return true; - }; - - const buildRuntimeLegendTree = ( - items: any[] = [], - selectedLayerCodes?: Set - ): any[] => { - return buildLegendTree({ - items, - selectedLayerCodes, - getLegendChecked, - normalizeLegendNameEn - }); - }; - - const deriveSelectedLegendData = (layerKeys: string[]): any[] => { - const selectedLayerCodes = new Set( - layerKeys.filter( - key => - key && - key !== '-' && - key !== 'customBaseLayer' && - key !== 'powerBaseStation' - ) - ); - - let derivedLegend = buildRuntimeLegendTree( - legendDataOriginal.value, - selectedLayerCodes - ); - derivedLegend = applyEnvFacilityLegendRule( - derivedLegend, - Array.from(selectedLayerCodes), - legendDataOriginal.value, - items => buildRuntimeLegendTree(items) - ); - return sortByOrderIndex(derivedLegend); - }; - - const rebuildLegendRuntimeData = ( - layerKeys: string[] = checkedLayerKeys.value - ) => { - legendData.value = sortByOrderIndex( - buildRuntimeLegendTree(legendDataOriginal.value) - ); - legendDataSelected.value = deriveSelectedLegendData(layerKeys); - }; - - const getLayerBranchKeys = (rootKey: string): string[] => { - const rootLayer = getLayerConfigByKey(rootKey); - if (!rootLayer) return []; - - const branchKeys: string[] = []; - const walk = (node: any) => { - if (node?.key) { - branchKeys.push(node.key); - } - if (node?.children?.length > 0) { - node.children.forEach((child: any) => walk(child)); - } - }; - - walk(rootLayer); - return branchKeys; - }; - - const normalizeCheckedLayerKeys = ( - rawKeys: string[] = [], - triggerKey?: string, - isChecked?: boolean - ): string[] => { - return applyLayerMutualExclusionRules({ - rawKeys, - previousKeys: checkedLayerKeys.value, - triggerKey, - checked: isChecked, - getLayerBranchKeys - }); - }; - - const getRuntimeCheckedLayerKeys = (): string[] => { - return mapViewStore.getCheckedLayerKeys(); - }; - - const shouldSyncMergedPointData = (layerKey: string, pageToken?: number) => { - if (!layerKey) return false; - return ( - shouldApplyToActivePage(layerKey, pageToken) || - getRuntimeCheckedLayerKeys().includes(layerKey) - ); - }; - - const getEffectivePointLayerCache = (layerKey: string) => { - const reactiveCache = mapDataStore.getPointLayerCache(layerKey); - if (reactiveCache) { - return reactiveCache; - } - return backgroundPointLayerCache.get(layerKey); - }; - - const getEffectivePointLayerData = (layerKey: string): any[] => { - const reactiveCache = mapDataStore.getPointLayerCache(layerKey); - if (reactiveCache?.data) { - return reactiveCache.data; - } - return getEffectivePointLayerCache(layerKey)?.data || []; - }; - - const hasEffectivePointLayerCache = (layerKey: string, cacheKey: string) => { - const cache = getEffectivePointLayerCache(layerKey); - if (!cache || !cacheKey) return false; - return cache.cacheKey === cacheKey && Array.isArray(cache.data); - }; - - const setBackgroundPointLayerCache = ( - layerKey: string, - cache: { - checked: boolean; - data: any[]; - cacheKey?: string; - } - ) => { - if (!layerKey) return; - backgroundPointLayerCache.set(layerKey, cache); - }; - - const syncBackgroundCacheToReactiveStore = (layerKey: string) => { - const cache = backgroundPointLayerCache.get(layerKey); - if (!cache) return; - mapDataStore.setPointLayerCache(layerKey, cache); - backgroundPointLayerCache.delete(layerKey); - }; - - const syncPointDataForFilter = (layerKeys: string[] = []) => { - mapDataStore.rebuildPointDataFromCache(layerKeys); - }; - - const normalizePointLayerItems = (list: any[] = []) => { - return list - .map((item: any) => { - const iconType = item.anchoPointState; - const legendConfig = getLegendConfigByNameEn(iconType); - return { - ...item, - iconCode: item.iconCode || legendConfig?.icon || '', - code: item.code || legendConfig?.code || '', - tm: - item.sttpMap === 'WQ_ALARM' - ? item?.warnDataList?.[0]?.tm - : item?.tm, - _id: - item._id || `${item.sttpMap || iconType || 'point'}_${item.stcd}`, - layerKey: item.layerKey || YLFB_POINT_LAYER_KEY - }; - }) - .filter( - (item: any) => - (item.iconCode || item.code == 'colorLayer') && - !(item?.baseId == 'all' && item?.anchoPointState?.endsWith('_nbuilt')) - ); - }; - - const ensureGISLayerConfig = (layerItem: any) => { - if (!layerItem) return null; - - if (!layerItem.config && layerItem.paramJson) { - try { - const jsonObj = JSON.parse(layerItem.paramJson); - layerItem.config = getMapConfig(jsonObj); - } catch { - layerItem.config = null; - } - } - - if (!layerItem.config) { - return null; - } - - if (layerItem.config.key !== layerItem.key) { - layerItem.config = { - ...layerItem.config, - key: layerItem.key - }; - } - - return layerItem.config; - }; - - /** - * 设置图层数据 - */ - const setLayerData = (data: any[]) => { - mapConfigStore.setLayerConfigTree(data); - const nextCheckedLayerKeys = mapConfigStore.extractCheckedLayerKeys(data); - mapViewStore.setCheckedLayerKeys(nextCheckedLayerKeys); - rebuildLegendRuntimeData(nextCheckedLayerKeys); - }; - - /** - * 按照 orderIndex 排序图例数据(递归) - */ - const sortByOrderIndex = (items: any[]): any[] => { - return items - .map(item => { - if (item.childrenList && item.childrenList.length > 0) { - return { - ...item, - childrenList: sortByOrderIndex(item.childrenList) - }; - } - return item; - }) - .sort((a, b) => (a.orderIndex || 0) - (b.orderIndex || 0)); - }; - - /** - * 启动新的图层加载会话,供需要严格按最新查询条件收口的场景复用。 - */ - const startLoadSession = () => { - loadSessionSeed += 1; - return loadSessionSeed; - }; - - /** - * 判断当前请求是否仍属于最新加载会话,避免旧请求结果回写到最新页面。 - */ - const isCurrentLoadSession = (sessionId: number) => { - return loadSessionSeed === sessionId; - }; - - const activatePageContext = (pageKey: string, items: any[] = []) => { - activePageKey = pageKey; - pendingPageNavigationKey = ''; - activePageRenderToken += 1; - activePageLayerKeys = new Set(getAllLayerKeys(items)); - return activePageRenderToken; - }; - - const markPendingPageNavigation = (targetPageKey: string) => { - pendingPageNavigationKey = targetPageKey || '__route-change__'; - }; - - const hasPendingPageNavigationAwayFrom = (pageKey: string) => { - return !!pendingPageNavigationKey && pendingPageNavigationKey !== pageKey; - }; - - const shouldApplyToActivePage = (layerKey: string, pageToken?: number) => { - if (!layerKey) return false; - if (activePageKey && hasPendingPageNavigationAwayFrom(activePageKey)) { - return false; - } - if (pageToken === undefined) return true; - return ( - activePageRenderToken === pageToken && activePageLayerKeys.has(layerKey) - ); - }; - - const isActivePageToken = (pageToken?: number) => { - if (pageToken === undefined) return true; - return activePageRenderToken === pageToken; - }; - - const beginPageLoading = (pageToken?: number) => { - if (typeof pageToken === 'number') { - activeLoadingPageToken = pageToken; - } - mapDataStore.setLoading(true); - }; - - const finishPageLoading = (pageToken?: number) => { - if (typeof pageToken !== 'number') { - mapDataStore.setLoading(false); - return; - } - - if ( - activeLoadingPageToken === pageToken && - activePageRenderToken === pageToken - ) { - activeLoadingPageToken = null; - mapDataStore.setLoading(false); - } - }; - - /** - * 设置图例数据(过滤掉 name == '地图' 的项,ifShow == 0 时不显示) - * @param data - 全部图例数据 - * @param selectedData - 当前页面选中的图例数据(用于标记选中状态) - */ - const setLegendData = (data: any[], selectedData: any[] = []) => { - mapConfigStore.setLegendConfigOriginal(data); - mapConfigStore.setPageLegendConfig(selectedData); - mapViewStore.setLegendCheckedState( - buildLegendCheckedState(legendDataOriginal.value, normalizeLegendNameEn) - ); - rebuildLegendRuntimeData(checkedLayerKeys.value); - }; - - /** - * 设置选中的图例数据(在图层加载完成后调用) - */ - const setSelectedLegendData = () => { - rebuildLegendRuntimeData(checkedLayerKeys.value); - }; - - /** - * 设置描点数据 - */ - const setPointData = (data: any[]) => { - mapDataStore.setPointData(data); - }; - - const replacePointLayerData = ( - layerKey: string, - data: any[] = [], - visible = true - ) => { - if (!layerKey) return; - - const layerItem = findLayerByKey(layerData.value, layerKey); - const normalizedData = normalizePointLayerItems( - data.map((item: any) => ({ - ...item, - layerKey - })) - ); - - mapDataStore.setPointLayerCache(layerKey, { - checked: visible, - data: normalizedData, - cacheKey: `custom:${layerKey}:${normalizedData.length}` - }); - mapDataStore.rebuildPointDataFromCache(); - - if (layerItem) { - layerItem.data = normalizedData; - layerItem.checked = visible ? 1 : 0; - } - - if (!visible || normalizedData.length === 0) { - if (mapClass.hasLayer(layerKey)) { - mapClass.mdLayerTreeShowOrHidden(layerKey, false); - } - return; - } - - refreshPointLayerDisplayData(layerKey); - }; - - const applyLoadedPointLayerToMap = ( - layer: any, - layerKey: string, - list: any[] = [], - pageToken?: number - ) => { - if (!Array.isArray(list)) { - return; - } - - layer.data = list; - const isLayerChecked = layer.checked === 1; - - if (list.length === 0 || !shouldApplyToActivePage(layerKey, pageToken)) { - return; - } - - const displayData = filterPointLayerDataForDisplay(layerKey, list); - mapClass.addInitDataLayer(displayData, layerKey); - if (isLayerChecked) { - restoreLayerLegendVisibility(layerKey); - } - mapClass.mdLayerTreeShowOrHidden(layerKey, isLayerChecked); - }; - - /** - * 图例数据转对象 - */ - const legendData2Obj = (data: any[]): Record => { - const _tempData: Record = {}; - const f = (_data: any[]) => { - _data.forEach(item => { - if (item?.childrenList && item.childrenList?.length > 0) { - f(item.childrenList); - } else { - const normalizedNameEn = normalizeLegendNameEn(item.nameEn); - if (normalizedNameEn) { - _tempData[normalizedNameEn] = item; - } - } - }); - }; - f(data); - return _tempData; - }; - - /** - * 处理单个 pointMap 图层的显示/隐藏 - * 数据已在初始化时通过 loadLayerData 加载并存入 layer.data - */ - const handlePointMapLayer = async (layer: any, isChecked: boolean) => { - const { key } = layer; - - // 如果没有勾选,隐藏图层 - if (!isChecked) { - if (mapClass.hasLayer(key)) { - mapClass.mdLayerTreeShowOrHidden(key, false); - } - if (mapDataStore.getPointLayerCache(key)) { - mapDataStore.setPointLayerCacheChecked(key, false); - } - if (layer) { - layer.checked = 0; - } - return; - } - - // 使用初始化时已加载的数据(存入 layer.data) - const cachedData = - Array.isArray(layer?.data) && layer.data.length > 0 - ? layer.data - : getPointLayerData(key); - if (cachedData && cachedData.length > 0) { - layer.checked = 1; - const displayData = filterPointLayerDataForDisplay(key, cachedData); - mapClass.addInitDataLayer(displayData, key); - restoreLayerLegendVisibility(key); - if (mapDataStore.getPointLayerCache(key)) { - mapDataStore.setPointLayerCacheChecked(key, true); - } - } else { - console.warn(`图层 ${key} 没有缓存数据`); - } - }; - - /** - * 更新图层数据(联动图例和描点) - * @param checkKeys - 选中的图层 key 列表 - * @param isInit - 是否是初始化阶段(初始化时遍历所有图层) - */ - const updateLayerData = async (checkKeys: string[], isInit = false) => { - if (!isInit) { - checkKeys = normalizeCheckedLayerKeys(checkKeys); - } - - mapViewStore.setCheckedLayerKeys(checkKeys); - - // 收集变化的图层 key(新增选中 / 取消选中) - const newlyChecked: string[] = []; - const newlyUnchecked: string[] = []; - - // 更新图层的 checked 状态,并记录变化 - const updateCheckedStatus = (items: any[]) => { - items.forEach(item => { - if (item.key) { - const wasChecked = item.checked === 1; - const isChecked = checkKeys.includes(item.key); - item.checked = isChecked ? 1 : 0; - if (wasChecked !== isChecked) { - if (isChecked) { - newlyChecked.push(item.key); - } else { - newlyUnchecked.push(item.key); - } - } - } - - if (item.children && item.children.length > 0) { - updateCheckedStatus(item.children); - } - }); - }; - updateCheckedStatus(layerData.value); - - rebuildLegendRuntimeData(checkKeys); - - // 控制锚点显示隐藏:初始化时处理全部,否则只处理变化的图层 - const keysToProcess = isInit - ? getAllLayerKeys(layerData.value) - : [...newlyChecked, ...newlyUnchecked]; - - for (const key of keysToProcess) { - const layerItem = findLayerByKey(layerData.value, key); - if (layerItem && layerItem.type === 'pointMap' && layerItem.url) { - const shouldBeVisible = checkKeys.includes(key); - await handlePointMapLayer(layerItem, shouldBeVisible); - if (shouldBeVisible) { - restoreLayerLegendVisibility(key); - mapClass.mdLayerTreeShowOrHidden(key, true); - } - } else if (layerItem && layerItem.type === 'GISMap') { - // 处理 GISMap 类型的图层:勾选时若地图实例中不存在,则先重新加载再控制显隐。 - if (key && key !== '-' && key !== 'powerBaseStation') { - const shouldBeVisible = checkKeys.includes(key); - const layerConfig = ensureGISLayerConfig(layerItem); - if ( - shouldBeVisible && - layerConfig && - !mapClass.hasBaseLayer(layerItem.key) - ) { - mapClass.addBaseDataLayer(layerConfig, true); - } - mapClass.controlBaseLayerTreeShowAndHidden( - key, - layerItem.key, - shouldBeVisible - ); - } - } - } - }; - - /** - * 加载所有包含URL的图层数据 - * @param items 图层数据 - * @param checkedKeys 选中的图层 keys(用于优先加载) - */ - const loadAllLayerData = async ( - items: any[], - checkedKeys: string[] = [], - options: { - pageToken?: number; - skipSessionCheck?: boolean; - pageKey?: string; - } = {} - ) => { - beginPageLoading(options.pageToken); - const currentSessionId = options.skipSessionCheck - ? undefined - : startLoadSession(); - const checkedTasks: Array<() => Promise> = []; - const uncheckedTasks: Array<() => Promise> = []; - const processedKeys = new Set(); - const debugStart = Date.now(); - - const processItems = (itemList: any[]) => { - itemList.forEach(item => { - if ( - (item.type === 'pointMap' || item.url) && - item.key && - item.url && - !processedKeys.has(item.key) - ) { - processedKeys.add(item.key); - const task = () => - loadLayerData(item, { - sessionId: currentSessionId, - pageToken: options.pageToken, - skipSessionCheck: options.skipSessionCheck, - pageKey: options.pageKey - }); - if (checkedKeys.includes(item.key)) { - checkedTasks.push(task); - } else { - uncheckedTasks.push(task); - } - } - - if (item.children && item.children.length > 0) { - processItems(item.children); - } - }); - }; - - processItems(items); - - try { - // 首页初始化:所有图层接口一次性并发下发,避免分批串行等待。 - const loadResults = await Promise.allSettled( - [...checkedTasks, ...uncheckedTasks].map(task => task()) - ); - const failedResults = loadResults.filter( - result => result.status === 'rejected' - ); - - if (failedResults.length > 0) { - console.warn( - '部分图层数据加载失败,但不会阻断其他图层:', - failedResults - ); - } - - if ( - (typeof currentSessionId === 'number' && - !isCurrentLoadSession(currentSessionId)) || - !isActivePageToken(options.pageToken) - ) { - return; - } - - if ( - options.pageKey && - hasPendingPageNavigationAwayFrom(options.pageKey) - ) { - return; - } - - // 确保所有图层的数据都已经缓存到 pointDataCache 和 layer.data - const allLayerKeys = getAllLayerKeys(items); - for (const key of allLayerKeys) { - const layer = findLayerByKey(items, key); - if (layer && getEffectivePointLayerData(key).length > 0) { - syncBackgroundCacheToReactiveStore(key); - layer.data = getEffectivePointLayerData(key); - } - } - - const allPointData = mapDataStore.rebuildPointDataFromCache(allLayerKeys); - attachNearbyPointRuntimeMeta(allPointData); - const runtimeCheckedKeys = getRuntimeCheckedLayerKeys(); - const treeCheckedKeys = mapConfigStore.extractCheckedLayerKeys( - layerData.value.length > 0 ? layerData.value : items - ); - const finalCheckedKeys = - runtimeCheckedKeys.length > 0 ? runtimeCheckedKeys : treeCheckedKeys; - - // 备注:近邻点元数据需要基于全量点位统一识别,识别完成后同步刷新各图层 Feature。 - for (const key of allLayerKeys) { - const layer = findLayerByKey(items, key); - if (!layer || !hasPointLayerData(key)) { - continue; - } - - const layerPoints = getPointLayerData(key); - const displayData = filterPointLayerDataForDisplay(key, layerPoints); - const cacheChecked = mapDataStore.getPointLayerCache(key)?.checked; - const shouldRestoreVisible = - typeof cacheChecked === 'boolean' - ? cacheChecked - : layer.checked === 1 || finalCheckedKeys.includes(key); - layer.data = layerPoints; - mapClass.addInitDataLayer(displayData, key); - if (shouldRestoreVisible) { - restoreLayerLegendVisibility(key); - } - mapClass.mdLayerTreeShowOrHidden(key, shouldRestoreVisible); - } - - // 设置选中的图例数据(确保图例在所有锚点加载完成后才显示) - setSelectedLegendData(); - - // 备注:初始化 loading 期间用户可能已经手动改过图层勾选,这里必须以最新运行态收尾, - // 不能再回放 load 启动瞬间的默认 checked 快照。 - await updateLayerData(finalCheckedKeys, true); - } finally { - const shouldFinishLoading = - (typeof currentSessionId !== 'number' || - isCurrentLoadSession(currentSessionId)) && - (options.pageToken === undefined || - activePageRenderToken === options.pageToken); - if (shouldFinishLoading) { - finishPageLoading(options.pageToken); - } - } - }; - - const loadCurrentPageLayerData = async ( - items: any[], - checkedKeys: string[] = [], - options: { - pageToken?: number; - skipSessionCheck?: boolean; - } = {} - ) => { - const checkedLayerSet = new Set(checkedKeys); - const tasks: Array<() => Promise> = []; - const processedKeys = new Set(); - - const processItems = (itemList: any[]) => { - itemList.forEach(item => { - if ( - item.type === 'pointMap' && - item.key && - item.url && - checkedLayerSet.has(item.key) && - !processedKeys.has(item.key) - ) { - processedKeys.add(item.key); - tasks.push(() => - loadLayerData(item, { - sessionId: options.skipSessionCheck ? undefined : loadSessionSeed, - pageToken: options.pageToken, - skipSessionCheck: options.skipSessionCheck ?? true - }) - ); - } - - if (item.children && item.children.length > 0) { - processItems(item.children); - } - }); - }; - - processItems(items); - - if (tasks.length === 0) { - finishPageLoading(options.pageToken); - return; - } - - beginPageLoading(options.pageToken); - - try { - // 菜单切换:仅当前页的勾选图层一次性并发下发,旧请求在后台继续运行。 - await Promise.allSettled(tasks.map(task => task())); - } finally { - if (isActivePageToken(options.pageToken)) { - finishPageLoading(options.pageToken); - } - } - }; - - /** - * 根据 key 查找图层 - */ - const findLayerByKey = (items: any[], key: string): any | null => { - void items; - if (!key) return null; - return getLayerConfigByKey(key) || null; - }; - - /** - * 获取所有图层 keys - */ - const getAllLayerKeys = (data: any[]): string[] => { - const keys: string[] = []; - const f = (arr: any[] = []) => { - arr.forEach((item: any) => { - if (item.key) { - keys.push(item.key); - } - if (item.children && item.children.length > 0) { - f(item.children); - } - }); - }; - f(data); - return keys; - }; - - const getRuntimeLegendNames = ( - layerKey: string, - nameEn: string - ): string[] => { - const normalizedNameEn = normalizeLegendNameEn(nameEn); - if (!normalizedNameEn) { - return []; - } - - if (normalizedNameEn.includes('alarm_range_')) { - const candidates: string[] = []; - if (layerKey === ENG_ALARM_POINT_LAYER_KEY) { - candidates.push(`mid_eng_built_${normalizedNameEn}`); - candidates.push(`large_eng_built_${normalizedNameEn}`); - } else { - candidates.push(`large_eng_built_${normalizedNameEn}`); - candidates.push(`mid_eng_built_${normalizedNameEn}`); - } - return candidates; - } - - return [normalizedNameEn]; - }; - - const syncLegendCheckedInTree = ( - items: any[], - nameEn: string, - checked: number - ) => { - items.forEach((item: any) => { - if (item.nameEn === nameEn) { - item.checked = checked; - } - if (item.childrenList && item.childrenList.length > 0) { - syncLegendCheckedInTree(item.childrenList, nameEn, checked); - } - }); - }; - - const applyLegendItemVisibility = (legendItem: any, checked: number) => { - if (!legendItem?.nameEn || !legendItem?.layerCode) { - return; - } - - const layerKey = legendItem.layerCode; - const layerItem = getLayerConfigByKey(layerKey); - const shouldBeVisible = checked === 1; - const runtimeLegendNames = getRuntimeLegendNames( - layerKey, - legendItem.nameEn - ); - - if (layerItem?.type === 'GISMap') { - mapClass.controlBaseLayerTreeShowAndHidden( - layerKey, - layerItem.config?.id || layerKey, - shouldBeVisible - ); - return; - } - - runtimeLegendNames.forEach(runtimeLegendName => { - mapClass.setLegendPointVisible( - layerKey, - runtimeLegendName, - shouldBeVisible - ); - }); - }; - - /** - * 更新图例选中状态 - */ - const updateLegendChecked = (nameEn: string, checked: number) => { - const normalizedNameEn = normalizeLegendNameEn(nameEn); - const legendItem = getLegendConfigByNameEn(normalizedNameEn); - if (!legendItem) { - return; - } - - mapViewStore.setLegendChecked(normalizedNameEn, checked); - syncLegendCheckedInTree(legendData.value, normalizedNameEn, checked); - syncLegendCheckedInTree( - legendDataSelected.value, - normalizedNameEn, - checked - ); - rebuildLegendRuntimeData(checkedLayerKeys.value); - applyLegendItemVisibility(legendItem, checked); - }; - - const updateLegendCheckedBatch = (nameEns: string[], checked: number) => { - const nextState = { ...legendCheckedState.value }; - const changedLegendItems: any[] = []; - - nameEns.forEach(nameEn => { - const normalizedNameEn = normalizeLegendNameEn(nameEn); - const legendItem = getLegendConfigByNameEn(normalizedNameEn); - if (!legendItem) return; - - nextState[normalizedNameEn] = checked; - changedLegendItems.push(legendItem); - }); - - mapViewStore.setLegendCheckedState(nextState); - rebuildLegendRuntimeData(checkedLayerKeys.value); - changedLegendItems.forEach(legendItem => - applyLegendItemVisibility(legendItem, checked) - ); - }; - - /** - * 生成请求标识符,用于避免重复请求 - */ - const getRequestIdentifier = (url: string, params: any): string => { - const paramString = JSON.stringify(normalizeCachePayload(params)); - return `${url}?${encodeURIComponent(paramString)}`; - }; - - /** - * 加载单个图层数据 - */ - const loadLayerData = async ( - layer: any, - options: { - sessionId?: number; - pageToken?: number; - skipSessionCheck?: boolean; - pageKey?: string; - } = {} - ) => { - const { - sessionId = loadSessionSeed, - pageToken, - skipSessionCheck = false, - pageKey - } = options; - const { key, url, params = {}, paramJson, anchorParamJson } = layer; - - // 没有URL,跳过 - if (!url) { - return []; - } - const requestUrl = url; - let requestParams: any = params; - let requestOrders: any = null; - - const layerKey = layer?.key || ''; - - const ylfbKeys = ['ylfb_point']; - const timeRangeLayerKeys = ['ef_point']; - - const yearTime = dayjs().subtract(1, 'years'); - - requestParams = normalizeRequestParams(requestParams); - - const anchorParamResult = parseAnchorParamJson(anchorParamJson); - if (anchorParamResult.filters.length) { - requestParams.filters.push(...anchorParamResult.filters); - } - if (anchorParamResult.orders) { - requestOrders = anchorParamResult.orders; - } - - if (timeRangeLayerKeys.includes(layerKey)) { - requestParams.filters.push({ - field: 'tm', - operator: 'gte', - dataType: 'date', - value: dayjs(searchTimeRange.value[0]).format('YYYY-MM-DD HH:mm:ss') - }); - requestParams.filters.push({ - field: 'tm', - operator: 'lte', - dataType: 'date', - value: dayjs(searchTimeRange.value[1]).format('YYYY-MM-DD 23:59:59') - }); - } - if (ylfbKeys.includes(layerKey)) { - if (yearTime) { - requestParams.filters.push({ - field: 'startTime', - operator: 'eq', - dataType: 'date', - value: dayjs(yearTime).startOf('year').format('YYYY-MM-DD 00:00:00') - }); - requestParams.filters.push({ - field: 'endTime', - operator: 'eq', - dataType: 'date', - value: dayjs(yearTime).endOf('year').format('YYYY-MM-DD 23:59:59') - }); - } - } - - if (!requestOrders && layer?.orders) { - try { - const ordersObj = JSON.parse(layer.orders); - const ordersArray = Object.entries(ordersObj).map(([field, dir]) => ({ - field, - dir - })); - requestOrders = ordersArray; - } catch (e) { - console.error('解析 orders 失败:', e); - } - } - - if (!Object.keys(requestParams).length && paramJson) { - try { - const jsonObj = JSON.parse(paramJson); - if (jsonObj.params) { - requestParams = jsonObj.params; - } - } catch (e) { - console.error('解析 paramJson 失败:', e); - } - } - const requestData: any = { - filter: requestParams - }; - if (requestOrders) { - requestData.sort = requestOrders; - } - - const requestIdentifier = getRequestIdentifier(requestUrl, { - layerKey: key, - requestData - }); - - if (hasEffectivePointLayerCache(key, requestIdentifier)) { - syncBackgroundCacheToReactiveStore(key); - const cachedList = getEffectivePointLayerData(key); - layer.data = cachedList; - if (shouldSyncMergedPointData(key, pageToken)) { - syncPointDataForFilter(getRuntimeCheckedLayerKeys()); - } - applyLoadedPointLayerToMap(layer, key, cachedList, pageToken); - return cachedList; - } - - activeLayerRequestKeyMap.set(key, requestIdentifier); - const existingRequest = inFlightRequestMap.get(requestIdentifier); - if (existingRequest) { - mapDataStore.setLayerLoading(key); - return existingRequest.promise.then(list => { - if (Array.isArray(list) && list.length > 0) { - if (shouldSyncMergedPointData(key, pageToken)) { - syncPointDataForFilter(getRuntimeCheckedLayerKeys()); - } - applyLoadedPointLayerToMap(layer, key, list, pageToken); - } - return list; - }); - } - - mapDataStore.setLayerLoading(key); - - const controller = new AbortController(); - - const requestPromise = (async () => { - try { - const response = await request({ - url: requestUrl, - method: 'post', - data: requestData, - signal: controller.signal - }); - const resData = response?.data || response?.data?.data || []; - - if ( - controller.signal.aborted || - (!skipSessionCheck && !isCurrentLoadSession(sessionId)) - ) { - return []; - } - - let list: any[] = []; - if (resData) { - if (Array.isArray(resData)) { - list = resData; - } else if (Array.isArray(resData.data)) { - list = resData.data; - } else if (resData.data && Array.isArray(resData.data.data)) { - list = resData.data.data; - } else if ( - resData.data && - resData.data.data && - Array.isArray(resData.data.data.data) - ) { - list = resData.data.data.data; - } - } - - list = normalizePointLayerItems( - list.map((item: any) => ({ - ...item, - layerKey: item.layerKey || key - })) - ); - - if (activeLayerRequestKeyMap.get(key) !== requestIdentifier) { - return []; - } - - const isLayerChecked = layer.checked === 1; - const cachePayload = { - checked: isLayerChecked, - data: list, - cacheKey: requestIdentifier - }; - const shouldDeferToBackgroundCache = - !!pageKey && hasPendingPageNavigationAwayFrom(pageKey); - - if (shouldDeferToBackgroundCache) { - setBackgroundPointLayerCache(key, cachePayload); - layer.data = list; - return list; - } - - mapDataStore.setPointLayerCache(key, cachePayload); - if (shouldSyncMergedPointData(key, pageToken)) { - syncPointDataForFilter(getRuntimeCheckedLayerKeys()); - } - applyLoadedPointLayerToMap(layer, key, list, pageToken); - - mapDataStore.setLayerLoaded(key); - return list; - } catch (error) { - if ( - controller.signal.aborted || - isCanceledRequestError(error) || - (!skipSessionCheck && !isCurrentLoadSession(sessionId)) || - activeLayerRequestKeyMap.get(key) !== requestIdentifier - ) { - return []; - } - - console.error(`加载描点数据失败 [${key}]:`, error); - mapDataStore.setLayerLoadError(key, error); - throw error; - } finally { - const activeRequest = inFlightRequestMap.get(requestIdentifier); - if (activeRequest?.controller === controller) { - inFlightRequestMap.delete(requestIdentifier); - } - if (activeLayerRequestKeyMap.get(key) === requestIdentifier) { - activeLayerRequestKeyMap.delete(key); - } - } - })(); - - inFlightRequestMap.set(requestIdentifier, { - promise: requestPromise, - controller, - layerKey: key, - sessionId - }); - - return requestPromise; - }; - - /** - * 获取选中的图层 key - */ - const getCheckedKeys = (): string[] => { - return mapViewStore.getCheckedLayerKeys(); - }; - - /** - * 根据当前搜索时间范围重新加载描点数据 - */ - const reloadBySearchTimeRange = async () => { - mapDataStore.setLoading(true); - const currentSessionId = startLoadSession(); - - // 只处理和 searchTimeRange 相关的图层 - const timeRangeLayerKeys = ['ef_point']; - - try { - for (const key of timeRangeLayerKeys) { - // 如果描点图层存在于地图中,先删除旧图层 - mapClass.removePointLayer(key); - - // 清空缓存 - if (mapDataStore.getPointLayerCache(key)) { - mapDataStore.removePointLayerCache(key); - mapDataStore.clearLayerLoadState(key); - } - } - - // 重新加载需要时间搜索的图层数据 - if (layerData.value.length > 0) { - const currentCheckedKeys = getCheckedKeys(); - - for (const key of timeRangeLayerKeys) { - const layerItem = findLayerByKey(layerData.value, key); - if (layerItem && currentCheckedKeys.includes(key)) { - await loadLayerData(layerItem, { sessionId: currentSessionId }); - } - } - - if (!isCurrentLoadSession(currentSessionId)) { - return; - } - - const allPointData = mapDataStore.rebuildPointDataFromCache(); - // 更新地图锚点显示 - await updateLayerData(currentCheckedKeys, false); - } - } finally { - mapDataStore.setLoading(false); - } - }; - - /** - * 更新搜索时间范围并重新加载描点数据 - */ - const updateSearchTimeRange = async (newRange: [any, any]) => { - mapViewStore.setSearchTimeRange(newRange); - await reloadBySearchTimeRange(); - }; - - return { - layerData, - setLayerData, - loadAllLayerData, - loadCurrentPageLayerData, - loadLayerData, - setSelectedLegendData, - legendData, - setLegendData, - legendDataSelected, - pointData, - setPointData, - checkedLayerKeys, - updateLayerData, - updateLegendChecked, - updateLegendCheckedBatch, - replacePointLayerData, - getCheckedKeys, - legendData2Obj, - loading, - pointDataCache, - layerLoadState, - findLayerByKey, - getLegendItemsByLayerCode, - getLayerBranchKeys, - normalizeCheckedLayerKeys, - refreshPointLayerDisplayData, - activatePageContext, - markPendingPageNavigation, - searchTimeRange, - reloadBySearchTimeRange, - updateSearchTimeRange - }; -}); diff --git a/frontend-sjgl/src/store/modules/shuJuTianBao.ts b/frontend-sjgl/src/store/modules/shuJuTianBao.ts index d8f967eb..416ec6a0 100644 --- a/frontend-sjgl/src/store/modules/shuJuTianBao.ts +++ b/frontend-sjgl/src/store/modules/shuJuTianBao.ts @@ -31,6 +31,7 @@ export const useShuJuTianBaoStore = defineStore('shuJuTianBao', () => { const list = [...res.data]; // 直接赋值给 ref,触发响应式更新 baseOption.value = list; + // debugger } } catch (error) { console.error('获取水电基地列表失败:', error); diff --git a/frontend-sjgl/src/utils/GisUrlList.ts b/frontend-sjgl/src/utils/GisUrlList.ts deleted file mode 100644 index 84aec487..00000000 --- a/frontend-sjgl/src/utils/GisUrlList.ts +++ /dev/null @@ -1,5158 +0,0 @@ -import dayjs from 'dayjs'; -// const page =location.href.split('page='); -// const zaiJianParams = page?.[1]==="zaiJianDianZhanHuanBaoGongZuo"?{bldsttCcode:1}:{} -// const zaiJianParams2 = page?.[1]==="zaiJianDianZhanHuanBaoGongZuo"?{BLDSTT_CCODE:1}:{} -// import getUrl from '@zebras/qgc-share/utils/isQGCrul' -export const urlList = [ - { - url: '/wmp-eng-server/eng/point/GetKendoListCust', - title: '常规水电✅️', - params: { - anchoPointState: [{ field: 'anchoPointState', operator: 'isnotnull' }] - }, - orders: - '{"baseId":"asc","rvcdStepSort":"asc","siteStepSort":"asc","ennm":"asc"}' - }, - { - url: '/wmp-env-server/sw/getFacilityPointList/GetKendoListCust', - title: '低温水减缓设施✅️', - params: { lgtd: [{ field: 'lgtd', operator: 'isnotnull' }] } - }, - { - url: '/wmp-eng-server/eng/eq/interval/GetKendoListCust', - title: '生态流量达标率✅️', - params: { lgtd: [{ field: 'lgtd', operator: 'isnotnull' }] }, - orders: - '{"baseId":"asc","rvcdStepSort":"asc","siteStepSort":"asc","ennm":"asc"}' - }, - // { - // url: '/wmp-env-server/env/wq/anchorPoint/reach/GetKendoListCust', - // title: '实际水质', - // params: { lgtd: [{ field: 'lgtd', operator: 'isnotnull' }] } - // }, - // { - // url: '/wmp-env-server/env/wq/anchorPoint/reach/GetKendoListCust', - // title: '目标水质', - // params: { lgtd: [{ field: 'lgtd', operator: 'isnotnull' }] } - // }, - // { - // url: '/wmp-env-server/env/wq/anchorPoint/GetKendoListCust', - // title: '自建站✅️', - // params: { - // dtinType: '0', - // ...(window.__lyConfigs?.baseId === "07" ? { sttpCode: "WQ" } : {}), - // lgtd: [{ field: 'lgtd', operator: 'isnotnull' }], - // }, - // orders: '{"siteStepSort":"asc"}' - // }, - { - url: '/wmp-env-server/env/wq/anchorPoint/GetKendoListCust', - title: '国家站✅️', - params: { dtinType: '1', lgtd: [{ field: 'lgtd', operator: 'isnotnull' }] } - }, - { - url: '/wmp-env-server/env/wq/anchorPoint/GetKendoListCust', - title: '人工站✅️', - params: { dtinType: '2', lgtd: [{ field: 'lgtd', operator: 'isnotnull' }] } - }, - { - url: '/wmp-env-server/env/wq/anchorPoint/GetKendoListCust', - title: '栖息地水质站❓不知道', - params: { - fhstcd: [{ field: 'fhstcd', operator: 'isnotnull' }], - fhFlag: '1', - lgtd: [{ field: 'lgtd', operator: 'isnotnull' }] - } - }, - // { url: getUrl('/wmp-env-server/env/fp/point/GetKendoListCust'), title: '过鱼设施', params: { lgtd: [{ field: 'lgtd', operator: 'isnotnull' }] } }, - { - url: '/wmp-eng-server/eng/eq/eqds/GetKendoListCust', - title: '生态流量泄放设施✅️', - params: { lgtd: [{ field: 'lgtd', operator: 'isnotnull' }] } - }, - { - url: '/wmp-env-server/fb/point/GetKendoListCust', - title: '鱼类增殖站✅️', - params: { sttp: 'FB', lgtd: [{ field: 'lgtd', operator: 'isnotnull' }] } - }, - { - url: '/wmp-env-server/env/fhvap/GetKendoListCust', - title: '珍稀植物园✅️', - params: { sttpCode: 'VP', lgtd: [{ field: 'lgtd', operator: 'isnotnull' }] } - }, - { - url: '/wmp-env-server/env/fhvap/GetKendoListCust', - title: '动物救助站✅️', - params: { sttpCode: 'VA', lgtd: [{ field: 'lgtd', operator: 'isnotnull' }] } - }, - { - url: '/wmp-env-server/fb/point/GetKendoListCust', - title: '人工产卵场✅️', - params: { sttp: 'SG', lgtd: [{ field: 'lgtd', operator: 'isnotnull' }] } - }, - { - url: '/wmp-env-server/sw/getEngTempPointList/GetKendoListCust', - title: '水温监测断面✅️', - keyType: 'wt_point', - params: { lgtd: [{ field: 'lgtd', operator: 'isnotnull' }] } - }, - { - url: '/wmp-env-server/sw/getEngTempPointList/GetKendoListCust', - title: '自建水温站❓', - params: { lgtd: [{ field: 'lgtd', operator: 'isnotnull' }], flag: '0' } - }, - { - url: '/wmp-env-server/sw/getEngTempPointList/GetKendoListCust', - title: '人工水温站❓', - params: { lgtd: [{ field: 'lgtd', operator: 'isnotnull' }], flag: '2' } - }, - { - url: '/wmp-env-server/sw/getEngTempPointList/GetKendoListCust', - title: '栖息地水温站❓', - params: { - lgtd: [{ field: 'lgtd', operator: 'isnotnull' }], - fhstcd: [{ field: 'fhstcd', operator: 'isnotnull' }], - fhFlag: '1' - } - }, - { - url: '/wmp-env-server/env/fhvap/GetKendoListCust', - title: '栖息地✅️', - params: { sttpCode: 'FH', lgtd: [{ field: 'lgtd', operator: 'isnotnull' }] } - }, - - { - url: '/wmp-env-server/env/fhvap/fhPoint/GetKendoListCust', - title: '水质监测站✅️', - params: { sttpCode: 'WQ', lgtd: [{ field: 'lgtd', operator: 'isnotnull' }] } - }, - { - url: '/wmp-env-server/env/fhvap/fhPoint/GetKendoListCust', - title: '水温监测站✅️', - params: { - sttpCode: 'WTRV', - lgtd: [{ field: 'lgtd', operator: 'isnotnull' }] - } - }, - { - url: '/wmp-env-server/env/fhvap/fhPoint/GetKendoListCust', - title: '流量监测站✅️', - params: { sttpCode: 'ZQ', lgtd: [{ field: 'lgtd', operator: 'isnotnull' }] } - }, - { - url: '/wmp-env-server/env/fhvap/fhPoint/GetKendoListCust', - title: '视频监控✅️', - params: { sttpCode: 'VD', lgtd: [{ field: 'lgtd', operator: 'isnotnull' }] } - }, - { - url: '/wmp-env-server/env/vd/aiPoint/GetKendoListCust', - title: 'AI视频监控站 缺失!', - params: { sttpCode: 'AIVD' } - }, - // { url: '/wmp-env-server/env/fh/vdpoint/GetKendoListCust', title: '水电站监控视频', keyType: "video_fbfm_point", params: { sttp: 'VD_FBFM', hbrvcd: window.__lyConfigs.wbsCode, lgtd: [{ field: 'lgtd', operator: 'isnotnull' }] } }, - // { url: '/wmp-env-server/env/fh/vdpoint/GetKendoListCust', title: '生态流量监测断面视频', keyType: "video_eqs_point", params: { sttp: 'VD_EQS', hbrvcd: window.__lyConfigs.wbsCode, lgtd: [{ field: 'lgtd', operator: 'isnotnull' }] } }, - // { url: '/wmp-env-server/env/fh/vdpoint/GetKendoListCust', title: '水质站运行视频', keyType: "video_wq_point", params: { sttp: 'VD_WQ', hbrvcd: window.__lyConfigs.wbsCode, lgtd: [{ field: 'lgtd', operator: 'isnotnull' }] } }, - // { url: '/wmp-env-server/env/fh/vdpoint/GetKendoListCust', title: '过鱼设施视频', keyType: "video_fp_point", params: { sttp: 'VD_FP', hbrvcd: window.__lyConfigs.wbsCode, lgtd: [{ field: 'lgtd', operator: 'isnotnull' }] } }, - // { url: '/wmp-env-server/env/fh/vdpoint/GetKendoListCust', title: '鱼类增殖站视频', keyType: "video_fb_point", params: { sttp: 'VD_FB', hbrvcd: window.__lyConfigs.wbsCode, lgtd: [{ field: 'lgtd', operator: 'isnotnull' }] } }, - // { url: '/wmp-env-server/env/fh/vdpoint/GetKendoListCust', title: '栖息地视频', keyType: "video_fh_point", params: { sttp: 'VD_FH', hbrvcd: window.__lyConfigs.wbsCode, lgtd: [{ field: 'lgtd', operator: 'isnotnull' }] } }, - // { url: '/wmp-env-server/env/fh/vdpoint/GetKendoListCust', title: '低温水减缓设施视频', keyType: "video_dw_point", params: { sttp: 'VD_DW', hbrvcd: window.__lyConfigs.wbsCode, lgtd: [{ field: 'lgtd', operator: 'isnotnull' }] } }, - // { url: '/wmp-env-server/env/fh/vdpoint/GetKendoListCust', title: '动物救助站视频', keyType: "video_va_point", params: { sttp: 'VD_VA', hbrvcd: window.__lyConfigs.wbsCode, lgtd: [{ field: 'lgtd', operator: 'isnotnull' }] } }, - // { url: '/wmp-env-server/env/fh/vdpoint/GetKendoListCust', title: '珍稀植物园视频', keyType: "video_vp_point", params: { sttp: 'VD_VP', hbrvcd: window.__lyConfigs.wbsCode, lgtd: [{ field: 'lgtd', operator: 'isnotnull' }] } }, - - // { - // url: getUrl('/wmp-env-server/env/we/point/GetKendoListCust'), - // title: '水生生态调查断面 ❌️数量不对 真实是338', - // params: { lgtd: [{ field: 'lgtd', operator: 'isnotnull' }] }, - // orders: '{"siteStepSort":"asc"}' - // }, - // { - // url: getUrl('/wmp-env-server/env/we/fishPoint/GetKendoListCust'), - // title: '鱼类分布 ✅️', - // params: { lgtd: [{ field: 'lgtd', operator: 'isnotnull' }] } - // }, - { - url: '/wmp-eng-server/eng/alarmPoint/GetKendoListCust', - title: '水电站告警情况❌️ 数据不对 真实数据是663', - params: { lgtd: [{ field: 'lgtd', operator: 'isnotnull' }] } - }, - // { - // url: '/wmp-env-server/fb/point/discharge/GetKendoListCust', - // title: '水电站', - // params: { lgtd: [{ field: 'lgtd', operator: 'isnotnull' }] } - // }, - { - url: '/wmp-env-server/env/fh/zqpoint/GetKendoListCust', - title: '国家水文站✅️', - params: { dtinType: 1, lgtd: [{ field: 'lgtd', operator: 'isnotnull' }] } - }, - { - url: '/wmp-env-server/env/fh/zqpoint/GetKendoListCust', - title: '自建水文站✅️', - params: { dtinType: 0, lgtd: [{ field: 'lgtd', operator: 'isnotnull' }] } - }, - { - url: '/wmp-env-server/env/wq/anchorPoint/GetKendoListCust', - title: '增殖站水质站', - params: { - dtinType: 0, - sttpCode: 'WQFB', - lgtd: [{ field: 'lgtd', operator: 'isnotnull' }] - } - }, - { - url: '/wmp-env-server/env/fh/vdpoint/GetKendoListCust', - title: '视频监控站✅️', - params: { lgtd: [{ field: 'lgtd', operator: 'isnotnull' }] } - }, - // { - // url: '/wmp-env-server/env/wb/point/GetKendoListCust', - // title: '气象站', - // params: { lgtd: [{ field: 'lgtd', operator: 'isnotnull' }] } - // }, - // { - // url: '/wmp-env-server/sw/getEngTempPointList/getLastData', - // title: '水温站点', - // params: { - // logic: 'and', - // filters: [] - // } - // }, - { - url: '/wmp-env-server/env/wq/anchorPoint/GetKendoListCust', - title: '水质站点', - params: { - logic: 'and', - filters: [ - { - field: 'lgtd', - operator: 'isnotnull', - dataType: 'string' - }, - { - field: 'orderIndex', - operator: 'isnotnull', - dataType: 'string' - } - ] - }, - orders: '{"orderIndex":"asc"}' - }, - // { - // url: '/wmp-env-server/env/warn/stcd/point/GetKendoListCust', - // title: '水质告警', - // params: { - // lgtd: [{ field: 'lgtd', operator: 'isnotnull' }], - // sttpCode: [{ field: 'sttpCode', operator: 'eq', value: 'WQ' }] - // } - // }, - // { - // url: '/wmp-env-server/env/warn/stcd/point/GetKendoListCust', - // title: '水温告警', - // params: { - // lgtd: [{ field: 'lgtd', operator: 'isnotnull' }], - // sttpCode: [{ field: 'sttpCode', operator: 'eq', value: 'WTRV' }] - // } - // }, - // { - // url: '/wmp-env-server/env/warn/stcd/point/GetKendoListCust', - // title: '水位告警', - // params: { - // lgtd: [{ field: 'lgtd', operator: 'isnotnull' }], - // sttpCode: [{ field: 'sttpCode', operator: 'eq', value: 'ENG' }] - // } - // }, - // { - // url: '/wmp-env-server/env/warn/stcd/operatePoint/GetKendoListCust', - // title: '环保设施告警', - // params: { - // lgtd: [{ field: 'lgtd', operator: 'isnotnull' }], - // yr: dayjs().format('YYYY') - // } - // }, - { - url: '/wmp-env-server/env/fp/point/built/GetKendoListCust', - title: '在建过鱼设施-地图锚点 ✅️', - params: { - lgtd: [{ field: 'lgtd', operator: 'isnotnull' }], - bldsttCcode: [{ field: 'bldsttCcode', operator: 'eq', value: '1' }] - } - }, - { - url: '/wmp-env-server/env/fb/point/built/GetKendoListCust', - title: '在建鱼类增殖站 缺失!', - params: { - lgtd: [{ field: 'lgtd', operator: 'isnotnull' }], - sttpCode: [{ field: 'sttpCode', operator: 'eq', value: 'FB' }], - bldsttCcode: [{ field: 'bldsttCcode', operator: 'eq', value: '1' }] - } - }, - { - url: '/wmp-env-server/env/fb/point/built/GetKendoListCust', - title: '在建人工产卵场 缺失!', - params: { - lgtd: [{ field: 'lgtd', operator: 'isnotnull' }], - sttpCode: [{ field: 'sttpCode', operator: 'eq', value: 'SG' }], - bldsttCcode: [{ field: 'bldsttCcode', operator: 'eq', value: '1' }] - } - }, - { - url: '/wmp-env-server/env/fhvap/built/GetKendoListCust', - title: '在建珍稀植物园✅️', - params: { - lgtd: [{ field: 'lgtd', operator: 'isnotnull' }], - sttpCode: [{ field: 'sttpCode', operator: 'eq', value: 'VP' }], - bldsttCcode: [{ field: 'bldsttCcode', operator: 'eq', value: '1' }] - } - }, - { - url: '/wmp-env-server/env/fhvap/built/GetKendoListCust', - title: '在建动物救助站✅️', - params: { - lgtd: [{ field: 'lgtd', operator: 'isnotnull' }], - sttpCode: [{ field: 'sttpCode', operator: 'eq', value: 'VA' }], - bldsttCcode: [{ field: 'bldsttCcode', operator: 'eq', value: '1' }] - } - }, - // { - // url: '/wmp-env-server/eng/eq/eqds/built/GetKendoListCust', - // title: '在建生态流量泄放设施', - // params: { - // lgtd: [{ field: 'lgtd', operator: 'isnotnull' }], - // BLDSTT_CCODE: [{ field: 'BLDSTT_CCODE', operator: 'eq', value: '1' }] - // } - // }, - // { - // url: '/wmp-env-server/env/we/fishList/point/GetKendoList', - // title: '鱼类沿程', - // params: { - // lgtd: [{ field: 'lgtd', operator: 'isnotnull' }] - // } - // }, - { - url: '/wmp-env-server/env/wva/point/GetKendoListCust', - title: '野生动物监测✅️', - params: { - lgtd: [{ field: 'lgtd', operator: 'isnotnull' }], - sttpCode: [{ field: 'sttpCode', operator: 'eq', value: 'WVA' }] - } - }, - // { - // url: '/wmp-env-server/env/we/fishList/point/GetNativeRareFish', - // title: '土著珍稀鱼类', - // params: { - // rare: '1', - // specOrigin: '1', - // lgtd: [{ field: 'lgtd', operator: 'isnotnull' }] - // } - // }, - // { url: '/wmp-env-server/te/tet/point/GetTerrestrialAnimal', title: '陆生动物分布', params: { baseId: window?.__lyConfigs?.baseId, lgtd: [{ field: 'lgtd', operator: 'isnotnull' }] } }, - { - url: '/wmp-env-server/sdFprdR/point/getFprdPointList', - title: '鱼类调查装置 对', - params: { lgtd: [{ field: 'lgtd', operator: 'isnotnull' }] } - } -]; - -export const lmGisUrl = [ - { - url: '/wmp-swqx-server/swqx/mm/pptnr/point/GetKendoListCust', - title: '气象站', - params: { lgtd: [{ field: 'lgtd', operator: 'isnotnull' }] } - }, - { - url: '/wmp-swqx-server/st/point/GetKendoList', - title: '水文站', - params: { - lgtd: [{ field: 'lgtd', operator: 'isnotnull' }], - sttpCode: [{ field: 'sttpCode', operator: 'eq', value: 'ST' }] - } - }, - { - url: '/wmp-swqx-server/st/point/GetKendoList', - title: '水电站', - params: { - lgtd: [{ field: 'lgtd', operator: 'isnotnull' }], - sttpCode: [{ field: 'sttpCode', operator: 'eq', value: 'ENG' }] - } - } -]; -export const fbGisUrl = [ - { - url: '/wmp-env-server/env/fh/zqpoint/GetKendoListCust', - title: '流量站', - params: { lgtd: [{ field: 'lgtd', operator: 'isnotnull' }] } - }, - { - url: '/wmp-env-server/env/fh/fdPoint/GetKendoListCust', - title: '捕鱼装置', - params: { logic: 'and', filters: [] } - }, - { - url: '/wmp-env-server/sw/getEngTempPointList/GetKendoListCust', - title: '水温监测断面', - params: { lgtd: [{ field: 'lgtd', operator: 'isnotnull' }] } - }, - // { - // url: '/wmp-env-server/env/wq/anchorPoint/GetKendoListCust', - // title: '自建站', - // params: { - // dtinType: '0', - // ...(window.__lyConfigs?.baseId === "07" ? { sttpCode: "WQ" } : {}), - // lgtd: [{ field: 'lgtd', operator: 'isnotnull' }] - // }, - // orders: '{"siteStepSort":"asc"}' - // }, - { - url: '/wmp-env-server/env/wq/anchorPoint/GetKendoListCust', - title: '国家站', - params: { dtinType: '1', lgtd: [{ field: 'lgtd', operator: 'isnotnull' }] } - }, - { - url: '/wmp-env-server/env/wq/anchorPoint/GetKendoListCust', - title: '人工站', - params: { dtinType: '2', lgtd: [{ field: 'lgtd', operator: 'isnotnull' }] } - }, - { - url: '/wmp-env-server/env/fhvap/GetKendoListCust', - title: '栖息地', - params: { sttpCode: 'FH', lgtd: [{ field: 'lgtd', operator: 'isnotnull' }] } - }, - { - url: '/wmp-env-server/env/fh/vdpoint/GetKendoListCust', - title: '视频监控站', - params: { lgtd: [{ field: 'lgtd', operator: 'isnotnull' }] } - }, - // { url: getUrl('/wmp-env-server/env/fp/point/GetKendoListCust'), title: '过鱼设施', params: { lgtd: [{ field: 'lgtd', operator: 'isnotnull' }] } }, - { - url: '/wmp-env-server/sw/getFacilityPointList/GetKendoListCust', - title: '低温水减缓设施', - params: { lgtd: [{ field: 'lgtd', operator: 'isnotnull' }] } - }, - { - url: '/wmp-env-server/fb/point/GetKendoListCust', - title: '鱼类增殖站', - params: { sttp: 'FB', lgtd: [{ field: 'lgtd', operator: 'isnotnull' }] } - }, - { - url: '/wmp-env-server/env/fhvap/GetKendoListCust', - title: '珍稀植物园', - params: { sttpCode: 'VP', lgtd: [{ field: 'lgtd', operator: 'isnotnull' }] } - }, - { - url: '/wmp-env-server/fb/point/discharge/GetKendoListCust', - title: '水电站', - params: { lgtd: [{ field: 'lgtd', operator: 'isnotnull' }] } - } - // { - // url: getUrl('/wmp-env-server/env/we/point/GetKendoListCust'), - // title: '水生生态调查断面', - // params: { lgtd: [{ field: 'lgtd', operator: 'isnotnull' }] }, - // orders: '{"siteStepSort":"asc"}' - // }, -]; - -export const soltData = [ - { - fieldName: 'MZGJDDZSL', - name: '闽浙赣基地', - nameEn: '', - color: '', - unit: '座', - theme: '', - decpos: '1', - mn: '', - mx: '', - norm: '', - enabled: '', - remark: '', - orderIndex: '', - createUser: '', - createTime: null, - updateUser: '', - updateTime: null, - filterContent: '', - tenantId: '', - isDeleted: '', - deleteUser: '', - deleteTime: null, - systemId: '' - }, - { - fieldName: 'GHDZSL', - name: '规划', - nameEn: '', - color: '#96B0B5', - unit: '座', - theme: '', - decpos: '1', - mn: '', - mx: '', - norm: '', - enabled: '', - remark: '', - orderIndex: '', - createUser: '', - createTime: null, - updateUser: '', - updateTime: null, - filterContent: '', - tenantId: '', - isDeleted: '', - deleteUser: '', - deleteTime: null, - systemId: '' - }, - { - fieldName: 'SJNFDL', - name: '年发电量', - nameEn: '', - color: '', - unit: '亿kw·h', - theme: '', - decpos: '1', - mn: '', - mx: '', - norm: '', - enabled: '', - remark: '', - orderIndex: '', - createUser: '', - createTime: null, - updateUser: '', - updateTime: null, - filterContent: '', - tenantId: '', - isDeleted: '', - deleteUser: '', - deleteTime: null, - systemId: '' - }, - { - fieldName: 'SSWZCBSSJ', - name: '未正常报送数据', - nameEn: '', - color: '', - unit: '个', - theme: '', - decpos: '', - mn: '', - mx: '', - norm: '', - enabled: '', - remark: '', - orderIndex: '', - createUser: '', - createTime: null, - updateUser: '', - updateTime: null, - filterContent: '', - tenantId: '', - isDeleted: '', - deleteUser: '', - deleteTime: null, - systemId: '' - }, - { - fieldName: 'ARS', - name: '砷', - nameEn: 'ARS', - color: '', - unit: 'mg/L', - theme: '', - decpos: '1', - mn: '0.00006', - mx: '', - norm: '', - enabled: '', - remark: '', - orderIndex: '', - createUser: '', - createTime: null, - updateUser: '', - updateTime: null, - filterContent: '', - tenantId: '', - isDeleted: '', - deleteUser: '', - deleteTime: null, - systemId: '' - }, - { - fieldName: 'SYMJ', - name: '水域面积', - nameEn: '', - color: '', - unit: 'km2', - theme: '', - decpos: '1', - mn: '', - mx: '', - norm: '', - enabled: '', - remark: '', - orderIndex: '', - createUser: '', - createTime: null, - updateUser: '', - updateTime: null, - filterContent: '', - tenantId: '', - isDeleted: '', - deleteUser: '', - deleteTime: null, - systemId: '' - }, - { - fieldName: 'SSWZCYX', - name: '未正常运行', - nameEn: '', - color: '', - unit: '个', - theme: '', - decpos: '', - mn: '', - mx: '', - norm: '', - enabled: '', - remark: '', - orderIndex: '', - createUser: '', - createTime: null, - updateUser: '', - updateTime: null, - filterContent: '', - tenantId: '', - isDeleted: '', - deleteUser: '', - deleteTime: null, - systemId: '' - }, - { - fieldName: 'WTMP', - name: '水温', - nameEn: '', - color: '#01B5B9', - unit: '℃', - theme: '', - decpos: '6', - mn: '0', - mx: '25', - norm: '18', - enabled: '', - remark: '', - orderIndex: '', - createUser: '', - createTime: null, - updateUser: '', - updateTime: null, - filterContent: '', - tenantId: '', - isDeleted: '', - deleteUser: '', - deleteTime: null, - systemId: '' - }, - { - fieldName: 'DBJDDZSL', - name: '东北基地', - nameEn: '', - color: '', - unit: '座', - theme: '', - decpos: '1', - mn: '', - mx: '', - norm: '', - enabled: '', - remark: '', - orderIndex: '', - createUser: '', - createTime: null, - updateUser: '', - updateTime: null, - filterContent: '', - tenantId: '', - isDeleted: '', - deleteUser: '', - deleteTime: null, - systemId: '' - }, - { - fieldName: 'SSDDSJYQ', - name: '达到设计要求', - nameEn: '', - color: '', - unit: '个', - theme: '', - decpos: '', - mn: '', - mx: '', - norm: '', - enabled: '', - remark: '', - orderIndex: '', - createUser: '', - createTime: null, - updateUser: '', - updateTime: null, - filterContent: '', - tenantId: '', - isDeleted: '', - deleteUser: '', - deleteTime: null, - systemId: '' - }, - { - fieldName: 'YJDZZJRL', - name: '已建', - nameEn: '', - color: '#78C300', - unit: '万kW', - theme: '', - decpos: '1', - mn: '', - mx: '', - norm: '', - enabled: '', - remark: '', - orderIndex: '', - createUser: '', - createTime: null, - updateUser: '', - updateTime: null, - filterContent: '', - tenantId: '', - isDeleted: '', - deleteUser: '', - deleteTime: null, - systemId: '' - }, - { - fieldName: 'OIL', - name: '石油类', - nameEn: 'OIL', - color: '', - unit: 'mg/L', - theme: '', - decpos: '1', - mn: '0.01', - mx: '', - norm: '', - enabled: '', - remark: '', - orderIndex: '', - createUser: '', - createTime: null, - updateUser: '', - updateTime: null, - filterContent: '', - tenantId: '', - isDeleted: '', - deleteUser: '', - deleteTime: null, - systemId: '' - }, - { - fieldName: 'FCG', - name: '粪大肠菌群', - nameEn: 'FCG', - color: '', - unit: '个/L', - theme: '', - decpos: '1', - mn: '', - mx: '', - norm: '', - enabled: '', - remark: '', - orderIndex: '', - createUser: '', - createTime: null, - updateUser: '', - updateTime: null, - filterContent: '', - tenantId: '', - isDeleted: '', - deleteUser: '', - deleteTime: null, - systemId: '' - }, - { - fieldName: 'Ⅰ', - name: 'I', - nameEn: '', - color: '#13ADE6', - unit: '', - theme: '', - decpos: '1', - mn: '', - mx: '', - norm: '', - enabled: '', - remark: '', - orderIndex: '', - createUser: '', - createTime: null, - updateUser: '', - updateTime: null, - filterContent: '', - tenantId: '', - isDeleted: '', - deleteUser: '', - deleteTime: null, - systemId: '' - }, - { - fieldName: 'DOX', - name: '溶解氧', - nameEn: 'DO', - color: '#9A60B4', - unit: 'mg/L', - theme: '', - decpos: '1', - mn: '1', - mx: '15', - norm: '', - enabled: '', - remark: '', - orderIndex: '', - createUser: '', - createTime: null, - updateUser: '', - updateTime: null, - filterContent: '', - tenantId: '', - isDeleted: '', - deleteUser: '', - deleteTime: null, - systemId: '' - }, - { - fieldName: 'HHSYJDDZSL', - name: '黄河上游基地', - nameEn: '', - color: '', - unit: '座', - theme: '', - decpos: '1', - mn: '', - mx: '', - norm: '', - enabled: '', - remark: '', - orderIndex: '', - createUser: '', - createTime: null, - updateUser: '', - updateTime: null, - filterContent: '', - tenantId: '', - isDeleted: '', - deleteUser: '', - deleteTime: null, - systemId: '' - }, - { - fieldName: 'DDHJDDZSL', - name: 'ddh基地', - nameEn: '', - color: '', - unit: '座', - theme: '', - decpos: '1', - mn: '', - mx: '', - norm: '', - enabled: '', - remark: '', - orderIndex: '', - createUser: '', - createTime: null, - updateUser: '', - updateTime: null, - filterContent: '', - tenantId: '', - isDeleted: '', - deleteUser: '', - deleteTime: null, - systemId: '' - }, - { - fieldName: 'SSZCYX', - name: '正常运行', - nameEn: '', - color: '', - unit: '个', - theme: '', - decpos: '', - mn: '', - mx: '', - norm: '', - enabled: '', - remark: '', - orderIndex: '', - createUser: '', - createTime: null, - updateUser: '', - updateTime: null, - filterContent: '', - tenantId: '', - isDeleted: '', - deleteUser: '', - deleteTime: null, - systemId: '' - }, - { - fieldName: 'ZN', - name: '锌', - nameEn: 'ZN', - color: '', - unit: 'mg/L', - theme: '', - decpos: '1', - mn: '0.05', - mx: '', - norm: '', - enabled: '', - remark: '', - orderIndex: '', - createUser: '', - createTime: null, - updateUser: '', - updateTime: null, - filterContent: '', - tenantId: '', - isDeleted: '', - deleteUser: '', - deleteTime: null, - systemId: '' - }, - { - fieldName: 'NPJJDDZSL', - name: '南盘江&红水河基地', - nameEn: '', - color: '', - unit: '座', - theme: '', - decpos: '1', - mn: '', - mx: '', - norm: '', - enabled: '', - remark: '', - orderIndex: '', - createUser: '', - createTime: null, - updateUser: '', - updateTime: null, - filterContent: '', - tenantId: '', - isDeleted: '', - deleteUser: '', - deleteTime: null, - systemId: '' - }, - { - fieldName: 'STLLNONE', - name: '无数据', - nameEn: '', - color: '', - unit: '座', - theme: '', - decpos: '', - mn: '', - mx: '', - norm: '', - enabled: '', - remark: '', - orderIndex: '', - createUser: '', - createTime: null, - updateUser: '', - updateTime: null, - filterContent: '', - tenantId: '', - isDeleted: '', - deleteUser: '', - deleteTime: null, - systemId: '' - }, - { - fieldName: 'LAS', - name: '阴离子表面活性剂', - nameEn: 'LAS', - color: '', - unit: 'mg/L', - theme: '', - decpos: '1', - mn: '0.05', - mx: '', - norm: '', - enabled: '', - remark: '', - orderIndex: '', - createUser: '', - createTime: null, - updateUser: '', - updateTime: null, - filterContent: '', - tenantId: '', - isDeleted: '', - deleteUser: '', - deleteTime: null, - systemId: '' - }, - { - fieldName: 'Ⅳ', - name: 'IV', - nameEn: '', - color: '#FF8800', - unit: '', - theme: '', - decpos: '1', - mn: '', - mx: '', - norm: '', - enabled: '', - remark: '', - orderIndex: '', - createUser: '', - createTime: null, - updateUser: '', - updateTime: null, - filterContent: '', - tenantId: '', - isDeleted: '', - deleteUser: '', - deleteTime: null, - systemId: '' - }, - { - fieldName: 'BXSW', - name: '坝下水位', - nameEn: '', - color: '', - unit: 'm', - theme: '', - decpos: '', - mn: '', - mx: '', - norm: '', - enabled: '', - remark: '', - orderIndex: '', - createUser: '', - createTime: null, - updateUser: '', - updateTime: null, - filterContent: '', - tenantId: '', - isDeleted: '', - deleteUser: '', - deleteTime: null, - systemId: '' - }, - { - fieldName: 'SSBDB', - name: '不达标', - nameEn: '', - color: '', - unit: '个', - theme: '', - decpos: '', - mn: '', - mx: '', - norm: '', - enabled: '', - remark: '', - orderIndex: '', - createUser: '', - createTime: null, - updateUser: '', - updateTime: null, - filterContent: '', - tenantId: '', - isDeleted: '', - deleteUser: '', - deleteTime: null, - systemId: '' - }, - { - fieldName: 'CJSYJDDZSL', - name: '长江上游基地', - nameEn: '', - color: '', - unit: '座', - theme: '', - decpos: '1', - mn: '', - mx: '', - norm: '', - enabled: '', - remark: '', - orderIndex: '', - createUser: '', - createTime: null, - updateUser: '', - updateTime: null, - filterContent: '', - tenantId: '', - isDeleted: '', - deleteUser: '', - deleteTime: null, - systemId: '' - }, - { - fieldName: '劣Ⅴ', - name: '劣V', - nameEn: '', - color: '#D9001B', - unit: '', - theme: '', - decpos: '1', - mn: '', - mx: '', - norm: '', - enabled: '', - remark: '', - orderIndex: '', - createUser: '', - createTime: null, - updateUser: '', - updateTime: null, - filterContent: '', - tenantId: '', - isDeleted: '', - deleteUser: '', - deleteTime: null, - systemId: '' - }, - { - fieldName: 'CKLL', - name: '出库流量', - nameEn: '', - color: '', - unit: 'm3/s', - theme: '', - decpos: '1', - mn: '', - mx: '', - norm: '', - enabled: '', - remark: '', - orderIndex: '', - createUser: '', - createTime: null, - updateUser: '', - updateTime: null, - filterContent: '', - tenantId: '', - isDeleted: '', - deleteUser: '', - deleteTime: null, - systemId: '' - }, - { - fieldName: 'TP', - name: '总磷', - nameEn: 'TP', - color: '', - unit: 'mg/L', - theme: '', - decpos: '1', - mn: '0.01', - mx: '', - norm: '', - enabled: '', - remark: '', - orderIndex: '', - createUser: '', - createTime: null, - updateUser: '', - updateTime: null, - filterContent: '', - tenantId: '', - isDeleted: '', - deleteUser: '', - deleteTime: null, - systemId: '' - }, - { - fieldName: 'STLLXZ', - name: '生态流量限值', - nameEn: '', - color: '', - unit: 'm3/s', - theme: '', - decpos: '', - mn: '', - mx: '', - norm: '', - enabled: '', - remark: '', - orderIndex: '', - createUser: '', - createTime: null, - updateUser: '', - updateTime: null, - filterContent: '', - tenantId: '', - isDeleted: '', - deleteUser: '', - deleteTime: null, - systemId: '' - }, - { - fieldName: 'FE', - name: '铁', - nameEn: 'FE', - color: '', - unit: 'mg/L', - theme: '', - decpos: '1', - mn: '0.03', - mx: '', - norm: '', - enabled: '', - remark: '', - orderIndex: '', - createUser: '', - createTime: null, - updateUser: '', - updateTime: null, - filterContent: '', - tenantId: '', - isDeleted: '', - deleteUser: '', - deleteTime: null, - systemId: '' - }, - { - fieldName: 'SSYXQT', - name: '其它', - nameEn: '', - color: '', - unit: '个', - theme: '', - decpos: '', - mn: '', - mx: '', - norm: '', - enabled: '', - remark: '', - orderIndex: '', - createUser: '', - createTime: null, - updateUser: '', - updateTime: null, - filterContent: '', - tenantId: '', - isDeleted: '', - deleteUser: '', - deleteTime: null, - systemId: '' - }, - { - fieldName: 'SJZJRL', - name: '装机容量', - nameEn: '', - color: '', - unit: 'MW', - theme: '', - decpos: '1', - mn: '', - mx: '', - norm: '', - enabled: '', - remark: '', - orderIndex: '', - createUser: '', - createTime: null, - updateUser: '', - updateTime: null, - filterContent: '', - tenantId: '', - isDeleted: '', - deleteUser: '', - deleteTime: null, - systemId: '' - }, - { - fieldName: 'TN', - name: '总氮', - nameEn: 'TN', - color: '', - unit: 'mg/L', - theme: '', - decpos: '1', - mn: '0.05', - mx: '', - norm: '', - enabled: '', - remark: '', - orderIndex: '', - createUser: '', - createTime: null, - updateUser: '', - updateTime: null, - filterContent: '', - tenantId: '', - isDeleted: '', - deleteUser: '', - deleteTime: null, - systemId: '' - }, - { - fieldName: 'TU', - name: '浊度', - nameEn: 'TU', - color: '#91CC75', - unit: 'NTU', - theme: '', - decpos: '1', - mn: '0.1', - mx: '5000', - norm: '', - enabled: '', - remark: '', - orderIndex: '', - createUser: '', - createTime: null, - updateUser: '', - updateTime: null, - filterContent: '', - tenantId: '', - isDeleted: '', - deleteUser: '', - deleteTime: null, - systemId: '' - }, - { - fieldName: 'SSSJWJR', - name: '数据未接入', - nameEn: '', - color: '', - unit: '个', - theme: '', - decpos: '', - mn: '', - mx: '', - norm: '', - enabled: '', - remark: '', - orderIndex: '', - createUser: '', - createTime: null, - updateUser: '', - updateTime: null, - filterContent: '', - tenantId: '', - isDeleted: '', - deleteUser: '', - deleteTime: null, - systemId: '' - }, - { - fieldName: 'NJJDDZSL', - name: '怒江基地', - nameEn: '', - color: '', - unit: '座', - theme: '', - decpos: '1', - mn: '', - mx: '', - norm: '', - enabled: '', - remark: '', - orderIndex: '', - createUser: '', - createTime: null, - updateUser: '', - updateTime: null, - filterContent: '', - tenantId: '', - isDeleted: '', - deleteUser: '', - deleteTime: null, - systemId: '' - }, - { - fieldName: 'PB', - name: '铅', - nameEn: 'PB', - color: '', - unit: 'mg/L', - theme: '', - decpos: '1', - mn: '0.01', - mx: '', - norm: '', - enabled: '', - remark: '', - orderIndex: '', - createUser: '', - createTime: null, - updateUser: '', - updateTime: null, - filterContent: '', - tenantId: '', - isDeleted: '', - deleteUser: '', - deleteTime: null, - systemId: '' - }, - { - fieldName: 'BOD5', - name: '五日生化需氧量', - nameEn: 'BOD?', - color: '', - unit: 'mg/L', - theme: '', - decpos: '1', - mn: '2', - mx: '', - norm: '', - enabled: '', - remark: '', - orderIndex: '', - createUser: '', - createTime: null, - updateUser: '', - updateTime: null, - filterContent: '', - tenantId: '', - isDeleted: '', - deleteUser: '', - deleteTime: null, - systemId: '' - }, - { - fieldName: 'S2', - name: '硫化物', - nameEn: 'S2', - color: '', - unit: 'mg/L', - theme: '', - decpos: '1', - mn: '0.004', - mx: '', - norm: '', - enabled: '', - remark: '', - orderIndex: '', - createUser: '', - createTime: null, - updateUser: '', - updateTime: null, - filterContent: '', - tenantId: '', - isDeleted: '', - deleteUser: '', - deleteTime: null, - systemId: '' - }, - { - fieldName: 'pH', - name: 'pH', - nameEn: 'pH', - color: '#73C1DF', - unit: '', - theme: '', - decpos: '1', - mn: '6', - mx: '10', - norm: '', - enabled: '', - remark: '', - orderIndex: '', - createUser: '', - createTime: null, - updateUser: '', - updateTime: null, - filterContent: '', - tenantId: '', - isDeleted: '', - deleteUser: '', - deleteTime: null, - systemId: '' - }, - { - fieldName: 'QEC_STLL_90AND95', - name: '90%-95%', - nameEn: '', - color: '', - unit: '座', - theme: '', - decpos: '', - mn: '90', - mx: '95', - norm: '', - enabled: '', - remark: '', - orderIndex: '', - createUser: '', - createTime: null, - updateUser: '', - updateTime: null, - filterContent: '', - tenantId: '', - isDeleted: '', - deleteUser: '', - deleteTime: null, - systemId: '' - }, - { - fieldName: 'SE', - name: '硒', - nameEn: 'SE', - color: '', - unit: 'mg/L', - theme: '', - decpos: '1', - mn: '0.00025', - mx: '', - norm: '', - enabled: '', - remark: '', - orderIndex: '', - createUser: '', - createTime: null, - updateUser: '', - updateTime: null, - filterContent: '', - tenantId: '', - isDeleted: '', - deleteUser: '', - deleteTime: null, - systemId: '' - }, - { - fieldName: 'CL', - name: '氯化物', - nameEn: 'CL', - color: '', - unit: 'mg/L', - theme: '', - decpos: '1', - mn: '0.02', - mx: '', - norm: '', - enabled: '', - remark: '', - orderIndex: '', - createUser: '', - createTime: null, - updateUser: '', - updateTime: null, - filterContent: '', - tenantId: '', - isDeleted: '', - deleteUser: '', - deleteTime: null, - systemId: '' - }, - { - fieldName: 'SO4', - name: '硫酸盐', - nameEn: 'SO?', - color: '', - unit: 'mg/L', - theme: '', - decpos: '1', - mn: '0.4', - mx: '', - norm: '', - enabled: '', - remark: '', - orderIndex: '', - createUser: '', - createTime: null, - updateUser: '', - updateTime: null, - filterContent: '', - tenantId: '', - isDeleted: '', - deleteUser: '', - deleteTime: null, - systemId: '' - }, - { - fieldName: 'SSWSJ', - name: '无数据', - nameEn: '', - color: '', - unit: '个', - theme: '', - decpos: '', - mn: '', - mx: '', - norm: '', - enabled: '', - remark: '', - orderIndex: '', - createUser: '', - createTime: null, - updateUser: '', - updateTime: null, - filterContent: '', - tenantId: '', - isDeleted: '', - deleteUser: '', - deleteTime: null, - systemId: '' - }, - { - fieldName: 'WJJDDZSL', - name: '乌江基地', - nameEn: '', - color: '', - unit: '座', - theme: '', - decpos: '1', - mn: '', - mx: '', - norm: '', - enabled: '', - remark: '', - orderIndex: '', - createUser: '', - createTime: null, - updateUser: '', - updateTime: null, - filterContent: '', - tenantId: '', - isDeleted: '', - deleteUser: '', - deleteTime: null, - systemId: '' - }, - { - fieldName: 'HHZYJDDZSL', - name: '黄河中游基地', - nameEn: '', - color: '', - unit: '座', - theme: '', - decpos: '1', - mn: '', - mx: '', - norm: '', - enabled: '', - remark: '', - orderIndex: '', - createUser: '', - createTime: null, - updateUser: '', - updateTime: null, - filterContent: '', - tenantId: '', - isDeleted: '', - deleteUser: '', - deleteTime: null, - systemId: '' - }, - { - fieldName: 'Ⅴ', - name: 'V', - nameEn: '', - color: '#E55555', - unit: '', - theme: '', - decpos: '1', - mn: '', - mx: '', - norm: '', - enabled: '', - remark: '', - orderIndex: '', - createUser: '', - createTime: null, - updateUser: '', - updateTime: null, - filterContent: '', - tenantId: '', - isDeleted: '', - deleteUser: '', - deleteTime: null, - systemId: '' - }, - { - fieldName: 'QEC_STLL_XY80', - name: '<80%', - nameEn: '', - color: '', - unit: '座', - theme: '', - decpos: '', - mn: '', - mx: '80', - norm: '', - enabled: '', - remark: '', - orderIndex: '', - createUser: '', - createTime: null, - updateUser: '', - updateTime: null, - filterContent: '', - tenantId: '', - isDeleted: '', - deleteUser: '', - deleteTime: null, - systemId: '' - }, - { - fieldName: 'SSAYQYX', - name: '按要求运行', - nameEn: '', - color: '', - unit: '个', - theme: '', - decpos: '', - mn: '', - mx: '', - norm: '', - enabled: '', - remark: '', - orderIndex: '', - createUser: '', - createTime: null, - updateUser: '', - updateTime: null, - filterContent: '', - tenantId: '', - isDeleted: '', - deleteUser: '', - deleteTime: null, - systemId: '' - }, - { - fieldName: 'STLL', - name: '生态流量', - nameEn: '', - color: '', - unit: 'm3/s', - theme: '', - decpos: '1', - mn: '', - mx: '', - norm: '', - enabled: '', - remark: '', - orderIndex: '', - createUser: '', - createTime: null, - updateUser: '', - updateTime: null, - filterContent: '', - tenantId: '', - isDeleted: '', - deleteUser: '', - deleteTime: null, - systemId: '' - }, - { - fieldName: 'CN', - name: '氰化物', - nameEn: 'CN', - color: '', - unit: 'mg/L', - theme: '', - decpos: '1', - mn: '0.002', - mx: '', - norm: '', - enabled: '', - remark: '', - orderIndex: '', - createUser: '', - createTime: null, - updateUser: '', - updateTime: null, - filterContent: '', - tenantId: '', - isDeleted: '', - deleteUser: '', - deleteTime: null, - systemId: '' - }, - { - fieldName: 'COND', - name: '电导率', - nameEn: 'COND', - color: '#C7C402', - unit: 'uS/cm', - theme: '', - decpos: '1', - mn: '300', - mx: '500', - norm: '', - enabled: '', - remark: '', - orderIndex: '', - createUser: '', - createTime: null, - updateUser: '', - updateTime: null, - filterContent: '', - tenantId: '', - isDeleted: '', - deleteUser: '', - deleteTime: null, - systemId: '' - }, - { - fieldName: 'SSXYH', - name: '需优化', - nameEn: '', - color: '', - unit: '个', - theme: '', - decpos: '', - mn: '', - mx: '', - norm: '', - enabled: '', - remark: '', - orderIndex: '', - createUser: '', - createTime: null, - updateUser: '', - updateTime: null, - filterContent: '', - tenantId: '', - isDeleted: '', - deleteUser: '', - deleteTime: null, - systemId: '' - }, - { - fieldName: 'THRD', - name: '总硬度', - nameEn: 'THRD', - color: '', - unit: 'mmol/L', - theme: '', - decpos: '1', - mn: '', - mx: '', - norm: '', - enabled: '', - remark: '', - orderIndex: '', - createUser: '', - createTime: null, - updateUser: '', - updateTime: null, - filterContent: '', - tenantId: '', - isDeleted: '', - deleteUser: '', - deleteTime: null, - systemId: '' - }, - { - fieldName: 'SSWYX', - name: '未运行', - nameEn: '', - color: '', - unit: '个', - theme: '', - decpos: '', - mn: '', - mx: '', - norm: '', - enabled: '', - remark: '', - orderIndex: '', - createUser: '', - createTime: null, - updateUser: '', - updateTime: null, - filterContent: '', - tenantId: '', - isDeleted: '', - deleteUser: '', - deleteTime: null, - systemId: '' - }, - { - fieldName: 'BSSW', - name: '坝上水位', - nameEn: '', - color: '', - unit: 'm', - theme: '', - decpos: '', - mn: '', - mx: '', - norm: '', - enabled: '', - remark: '', - orderIndex: '', - createUser: '', - createTime: null, - updateUser: '', - updateTime: null, - filterContent: '', - tenantId: '', - isDeleted: '', - deleteUser: '', - deleteTime: null, - systemId: '' - }, - { - fieldName: 'CU', - name: '铜', - nameEn: 'CU', - color: '', - unit: 'mg/L', - theme: '', - decpos: '1', - mn: '0.001', - mx: '', - norm: '', - enabled: '', - remark: '', - orderIndex: '', - createUser: '', - createTime: null, - updateUser: '', - updateTime: null, - filterContent: '', - tenantId: '', - isDeleted: '', - deleteUser: '', - deleteTime: null, - systemId: '' - }, - { - fieldName: 'Ⅱ', - name: 'II', - nameEn: '', - color: '#4FC64D', - unit: '', - theme: '', - decpos: '1', - mn: '', - mx: '', - norm: '', - enabled: '', - remark: '', - orderIndex: '', - createUser: '', - createTime: null, - updateUser: '', - updateTime: null, - filterContent: '', - tenantId: '', - isDeleted: '', - deleteUser: '', - deleteTime: null, - systemId: '' - }, - { - fieldName: 'SSWAYQYX', - name: '未按要求运行', - nameEn: '', - color: '', - unit: '个', - theme: '', - decpos: '', - mn: '', - mx: '', - norm: '', - enabled: '', - remark: '', - orderIndex: '', - createUser: '', - createTime: null, - updateUser: '', - updateTime: null, - filterContent: '', - tenantId: '', - isDeleted: '', - deleteUser: '', - deleteTime: null, - systemId: '' - }, - { - fieldName: 'F', - name: '氟化物', - nameEn: 'F', - color: '', - unit: 'mg/L', - theme: '', - decpos: '1', - mn: '0.02', - mx: '', - norm: '', - enabled: '', - remark: '', - orderIndex: '', - createUser: '', - createTime: null, - updateUser: '', - updateTime: null, - filterContent: '', - tenantId: '', - isDeleted: '', - deleteUser: '', - deleteTime: null, - systemId: '' - }, - { - fieldName: 'YLJJDDZSL', - name: 'ylj基地', - nameEn: '', - color: '', - unit: '座', - theme: '', - decpos: '1', - mn: '', - mx: '', - norm: '', - enabled: '', - remark: '', - orderIndex: '', - createUser: '', - createTime: null, - updateUser: '', - updateTime: null, - filterContent: '', - tenantId: '', - isDeleted: '', - deleteUser: '', - deleteTime: null, - systemId: '' - }, - { - fieldName: 'CD', - name: '镉', - nameEn: 'CD', - color: '', - unit: 'mg/L', - theme: '', - decpos: '1', - mn: '0.001', - mx: '', - norm: '', - enabled: '', - remark: '', - orderIndex: '', - createUser: '', - createTime: null, - updateUser: '', - updateTime: null, - filterContent: '', - tenantId: '', - isDeleted: '', - deleteUser: '', - deleteTime: null, - systemId: '' - }, - { - fieldName: 'CODCR', - name: '化学需氧量', - nameEn: 'CODcr', - color: '#02B2FF', - unit: 'mg/L', - theme: '', - decpos: '1', - mn: '0', - mx: '50', - norm: '', - enabled: '', - remark: '', - orderIndex: '', - createUser: '', - createTime: null, - updateUser: '', - updateTime: null, - filterContent: '', - tenantId: '', - isDeleted: '', - deleteUser: '', - deleteTime: null, - systemId: '' - }, - { - fieldName: 'YJDZSL', - name: '已建', - nameEn: '', - color: '#78C300', - unit: '座', - theme: '', - decpos: '1', - mn: '', - mx: '', - norm: '', - enabled: '', - remark: '', - orderIndex: '', - createUser: '', - createTime: null, - updateUser: '', - updateTime: null, - filterContent: '', - tenantId: '', - isDeleted: '', - deleteUser: '', - deleteTime: null, - systemId: '' - }, - { - fieldName: 'HG', - name: '汞', - nameEn: 'HG', - color: '', - unit: 'mg/L', - theme: '', - decpos: '1', - mn: '0.00005', - mx: '', - norm: '', - enabled: '', - remark: '', - orderIndex: '', - createUser: '', - createTime: null, - updateUser: '', - updateTime: null, - filterContent: '', - tenantId: '', - isDeleted: '', - deleteUser: '', - deleteTime: null, - systemId: '' - }, - { - fieldName: 'QTJDDZSL', - name: '其他基地', - nameEn: '', - color: '', - unit: '座', - theme: '', - decpos: '1', - mn: '', - mx: '', - norm: '', - enabled: '', - remark: '', - orderIndex: '', - createUser: '', - createTime: null, - updateUser: '', - updateTime: null, - filterContent: '', - tenantId: '', - isDeleted: '', - deleteUser: '', - deleteTime: null, - systemId: '' - }, - { - fieldName: 'NH3N', - name: '氨氮', - nameEn: '', - color: '', - unit: 'mg/L', - theme: '', - decpos: '1', - mn: '0.01', - mx: '', - norm: '', - enabled: '', - remark: '', - orderIndex: '', - createUser: '', - createTime: null, - updateUser: '', - updateTime: null, - filterContent: '', - tenantId: '', - isDeleted: '', - deleteUser: '', - deleteTime: null, - systemId: '' - }, - { - fieldName: 'NO3', - name: '硝氮/硝酸盐氮', - nameEn: 'NO3', - color: '', - unit: 'mg/L', - theme: '', - decpos: '1', - mn: '0.02', - mx: '', - norm: '', - enabled: '', - remark: '', - orderIndex: '', - createUser: '', - createTime: null, - updateUser: '', - updateTime: null, - filterContent: '', - tenantId: '', - isDeleted: '', - deleteUser: '', - deleteTime: null, - systemId: '' - }, - { - fieldName: 'CODMN', - name: '高锰酸盐指数', - nameEn: 'CODMN', - color: '', - unit: 'mg/L', - theme: '', - decpos: '1', - mn: '0.5', - mx: '', - norm: '', - enabled: '', - remark: '', - orderIndex: '', - createUser: '', - createTime: null, - updateUser: '', - updateTime: null, - filterContent: '', - tenantId: '', - isDeleted: '', - deleteUser: '', - deleteTime: null, - systemId: '' - }, - { - fieldName: 'ZJDZZJRL', - name: '在建', - nameEn: '', - color: '#669ECF', - unit: '万kW', - theme: '', - decpos: '1', - mn: '', - mx: '', - norm: '', - enabled: '', - remark: '', - orderIndex: '', - createUser: '', - createTime: null, - updateUser: '', - updateTime: null, - filterContent: '', - tenantId: '', - isDeleted: '', - deleteUser: '', - deleteTime: null, - systemId: '' - }, - { - fieldName: 'MN', - name: '锰', - nameEn: 'MN', - color: '', - unit: 'mg/L', - theme: '', - decpos: '1', - mn: '0.01', - mx: '', - norm: '', - enabled: '', - remark: '', - orderIndex: '', - createUser: '', - createTime: null, - updateUser: '', - updateTime: null, - filterContent: '', - tenantId: '', - isDeleted: '', - deleteUser: '', - deleteTime: null, - systemId: '' - }, - { - fieldName: 'JSJJDDZSL', - name: '金沙江基地', - nameEn: '', - color: '', - unit: '座', - theme: '', - decpos: '1', - mn: '', - mx: '', - norm: '', - enabled: '', - remark: '', - orderIndex: '', - createUser: '', - createTime: null, - updateUser: '', - updateTime: null, - filterContent: '', - tenantId: '', - isDeleted: '', - deleteUser: '', - deleteTime: null, - systemId: '' - }, - { - fieldName: 'STLLWYQ', - name: '无要求', - nameEn: '', - color: '', - unit: '座', - theme: '', - decpos: '', - mn: '', - mx: '', - norm: '', - enabled: '', - remark: '', - orderIndex: '', - createUser: '', - createTime: null, - updateUser: '', - updateTime: null, - filterContent: '', - tenantId: '', - isDeleted: '', - deleteUser: '', - deleteTime: null, - systemId: '' - }, - { - fieldName: 'QEC_STLL_DY95', - name: '≥95%', - nameEn: '', - color: '', - unit: '座', - theme: '', - decpos: '', - mn: '95', - mx: '', - norm: '', - enabled: '', - remark: '', - orderIndex: '', - createUser: '', - createTime: null, - updateUser: '', - updateTime: null, - filterContent: '', - tenantId: '', - isDeleted: '', - deleteUser: '', - deleteTime: null, - systemId: '' - }, - { - fieldName: 'XXJDDZSL', - name: '湘西基地', - nameEn: '', - color: '', - unit: '座', - theme: '', - decpos: '1', - mn: '', - mx: '', - norm: '', - enabled: '', - remark: '', - orderIndex: '', - createUser: '', - createTime: null, - updateUser: '', - updateTime: null, - filterContent: '', - tenantId: '', - isDeleted: '', - deleteUser: '', - deleteTime: null, - systemId: '' - }, - { - fieldName: 'SSYXDB', - name: '达标', - nameEn: '', - color: '', - unit: '个', - theme: '', - decpos: '', - mn: '', - mx: '', - norm: '', - enabled: '', - remark: '', - orderIndex: '', - createUser: '', - createTime: null, - updateUser: '', - updateTime: null, - filterContent: '', - tenantId: '', - isDeleted: '', - deleteUser: '', - deleteTime: null, - systemId: '' - }, - { - fieldName: 'CLARITY', - name: '透明度', - nameEn: 'CLARITY', - color: '', - unit: 'mm', - theme: '', - decpos: '1', - mn: '', - mx: '', - norm: '', - enabled: '', - remark: '', - orderIndex: '', - createUser: '', - createTime: null, - updateUser: '', - updateTime: null, - filterContent: '', - tenantId: '', - isDeleted: '', - deleteUser: '', - deleteTime: null, - systemId: '' - }, - { - fieldName: 'GC', - name: '高程', - nameEn: '', - color: '', - unit: 'm', - theme: '', - decpos: '1', - mn: '', - mx: '', - norm: '', - enabled: '', - remark: '', - orderIndex: '', - createUser: '', - createTime: null, - updateUser: '', - updateTime: null, - filterContent: '', - tenantId: '', - isDeleted: '', - deleteUser: '', - deleteTime: null, - systemId: '' - }, - { - fieldName: 'CR6', - name: '铬(六价)', - nameEn: 'CR6', - color: '', - unit: 'mg/L', - theme: '', - decpos: '1', - mn: '0.004', - mx: '', - norm: '', - enabled: '', - remark: '', - orderIndex: '', - createUser: '', - createTime: null, - updateUser: '', - updateTime: null, - filterContent: '', - tenantId: '', - isDeleted: '', - deleteUser: '', - deleteTime: null, - systemId: '' - }, - { - fieldName: 'GHDZZJRL', - name: '规划', - nameEn: '', - color: '#96B0B5', - unit: '万kW', - theme: '', - decpos: '1', - mn: '', - mx: '', - norm: '', - enabled: '', - remark: '', - orderIndex: '', - createUser: '', - createTime: null, - updateUser: '', - updateTime: null, - filterContent: '', - tenantId: '', - isDeleted: '', - deleteUser: '', - deleteTime: null, - systemId: '' - }, - { - fieldName: 'RKLL', - name: '入库流量', - nameEn: '', - color: '', - unit: 'm3/s', - theme: '', - decpos: '1', - mn: '', - mx: '', - norm: '', - enabled: '', - remark: '', - orderIndex: '', - createUser: '', - createTime: null, - updateUser: '', - updateTime: null, - filterContent: '', - tenantId: '', - isDeleted: '', - deleteUser: '', - deleteTime: null, - systemId: '' - }, - { - fieldName: 'ZJDZSL', - name: '在建', - nameEn: '', - color: '#669ECF', - unit: '座', - theme: '', - decpos: '1', - mn: '', - mx: '', - norm: '', - enabled: '', - remark: '', - orderIndex: '', - createUser: '', - createTime: null, - updateUser: '', - updateTime: null, - filterContent: '', - tenantId: '', - isDeleted: '', - deleteUser: '', - deleteTime: null, - systemId: '' - }, - { - fieldName: 'QEC_STLL_80AND90', - name: '80%-90%', - nameEn: '', - color: '', - unit: '座', - theme: '', - decpos: '', - mn: '80', - mx: '90', - norm: '', - enabled: '', - remark: '', - orderIndex: '', - createUser: '', - createTime: null, - updateUser: '', - updateTime: null, - filterContent: '', - tenantId: '', - isDeleted: '', - deleteUser: '', - deleteTime: null, - systemId: '' - }, - { - fieldName: 'CYANO', - name: '蓝绿藻', - nameEn: 'CYANO', - color: '', - unit: '个/L', - theme: '', - decpos: '1', - mn: '', - mx: '', - norm: '', - enabled: '', - remark: '', - orderIndex: '', - createUser: '', - createTime: null, - updateUser: '', - updateTime: null, - filterContent: '', - tenantId: '', - isDeleted: '', - deleteUser: '', - deleteTime: null, - systemId: '' - }, - { - fieldName: 'CHLA', - name: '叶绿素a', - nameEn: 'CHLA', - color: '', - unit: 'mg/L', - theme: '', - decpos: '1', - mn: '', - mx: '', - norm: '', - enabled: '', - remark: '', - orderIndex: '', - createUser: '', - createTime: null, - updateUser: '', - updateTime: null, - filterContent: '', - tenantId: '', - isDeleted: '', - deleteUser: '', - deleteTime: null, - systemId: '' - }, - { - fieldName: 'SSYXZ', - name: '运行中', - nameEn: '', - color: '', - unit: '个', - theme: '', - decpos: '', - mn: '', - mx: '', - norm: '', - enabled: '', - remark: '', - orderIndex: '', - createUser: '', - createTime: null, - updateUser: '', - updateTime: null, - filterContent: '', - tenantId: '', - isDeleted: '', - deleteUser: '', - deleteTime: null, - systemId: '' - }, - { - fieldName: 'VLPH', - name: '挥发酚', - nameEn: 'VLPH', - color: '', - unit: 'mg/L', - theme: '', - decpos: '1', - mn: '0.002', - mx: '', - norm: '', - enabled: '', - remark: '', - orderIndex: '', - createUser: '', - createTime: null, - updateUser: '', - updateTime: null, - filterContent: '', - tenantId: '', - isDeleted: '', - deleteUser: '', - deleteTime: null, - systemId: '' - }, - { - fieldName: 'AL', - name: '铝', - nameEn: 'AL', - color: '', - unit: 'mg/L', - theme: '', - decpos: '1', - mn: '0.00231', - mx: '', - norm: '', - enabled: '', - remark: '', - orderIndex: '', - createUser: '', - createTime: null, - updateUser: '', - updateTime: null, - filterContent: '', - tenantId: '', - isDeleted: '', - deleteUser: '', - deleteTime: null, - systemId: '' - }, - { - fieldName: 'Ⅲ', - name: 'III', - nameEn: '', - color: '#FFCC00', - unit: '', - theme: '', - decpos: '1', - mn: '', - mx: '', - norm: '', - enabled: '', - remark: '', - orderIndex: '', - createUser: '', - createTime: null, - updateUser: '', - updateTime: null, - filterContent: '', - tenantId: '', - isDeleted: '', - deleteUser: '', - deleteTime: null, - systemId: '' - }, - { - fieldName: 'LCJGLJDDZSL', - name: '澜沧江干流基地', - nameEn: '', - color: '', - unit: '座', - theme: '', - decpos: '1', - mn: '', - mx: '', - norm: '', - enabled: '', - remark: '', - orderIndex: '', - createUser: '', - createTime: null, - updateUser: '', - updateTime: null, - filterContent: '', - tenantId: '', - isDeleted: '', - deleteUser: '', - deleteTime: null, - systemId: '' - }, - { - fieldName: 'DO', - name: '溶解氧', - nameEn: 'DO', - color: '', - unit: 'mg/L', - theme: '', - decpos: '2', - mn: '1', - mx: '15', - norm: '', - enabled: '', - remark: '', - orderIndex: '', - createUser: '', - createTime: null, - updateUser: '', - updateTime: null, - filterContent: '', - tenantId: '', - isDeleted: '', - deleteUser: '', - deleteTime: null, - systemId: '' - } -]; - -// export const dbList = [ -// { -// "name": "PH", -// "key": "ph", -// "pkey": "", -// "fixed": 0, -// "sort": 0, -// "group": "", -// "groupSort": "", -// "description": "", -// "children": [] -// }, -// { -// "name": "溶解氧", -// "key": "dox", -// "pkey": "", -// "fixed": 0, -// "sort": 1, -// "group": "", -// "groupSort": "", -// "description": "mg/L", -// "children": [] -// }, -// { -// "name": "高锰酸盐指数", -// "key": "codmn", -// "pkey": "", -// "fixed": 0, -// "sort": 2, -// "group": "", -// "groupSort": "", -// "description": "", -// "children": [] -// }, -// { -// "name": "化学需氧量", -// "key": "codcr", -// "pkey": "", -// "fixed": 0, -// "sort": 3, -// "group": "", -// "groupSort": "", -// "description": "", -// "children": [] -// }, -// { -// "name": "五日生化需氧量BODS", -// "key": "bod5", -// "pkey": "", -// "fixed": 0, -// "sort": 4, -// "group": "", -// "groupSort": "", -// "description": "", -// "children": [] -// }, -// { -// "name": "氨氮", -// "key": "nh3n", -// "pkey": "", -// "fixed": 0, -// "sort": 5, -// "group": "", -// "groupSort": "", -// "description": "", -// "children": [] -// }, -// { -// "name": "总磷", -// "key": "tp", -// "pkey": "", -// "fixed": 0, -// "sort": 6, -// "group": "", -// "groupSort": "", -// "description": "", -// "children": [] -// }, -// { -// "name": "总氮", -// "key": "tn", -// "pkey": "", -// "fixed": 0, -// "sort": 7, -// "group": "", -// "groupSort": "", -// "description": "", -// "children": [] -// }, -// { -// "name": "铜", -// "key": "cu", -// "pkey": "", -// "fixed": 0, -// "sort": 8, -// "group": "", -// "groupSort": "", -// "description": "", -// "children": [] -// }, -// { -// "name": "锌", -// "key": "zn", -// "pkey": "", -// "fixed": 0, -// "sort": 9, -// "group": "", -// "groupSort": "", -// "description": "", -// "children": [] -// }, -// { -// "name": "氟化物", -// "key": "f", -// "pkey": "", -// "fixed": 0, -// "sort": 10, -// "group": "", -// "groupSort": "", -// "description": "", -// "children": [] -// }, -// { -// "name": "硒", -// "key": "se", -// "pkey": "", -// "fixed": 0, -// "sort": 11, -// "group": "", -// "groupSort": "", -// "description": "", -// "children": [] -// }, -// { -// "name": "砷", -// "key": "ars", -// "pkey": "", -// "fixed": 0, -// "sort": 12, -// "group": "", -// "groupSort": "", -// "description": "", -// "children": [] -// }, -// { -// "name": "汞", -// "key": "hg", -// "pkey": "", -// "fixed": 0, -// "sort": 13, -// "group": "", -// "groupSort": "", -// "description": "", -// "children": [] -// }, -// { -// "name": "镉", -// "key": "cd", -// "pkey": "", -// "fixed": 0, -// "sort": 14, -// "group": "", -// "groupSort": "", -// "description": "", -// "children": [] -// }, -// { -// "name": "铬(六价)", -// "key": "cr6", -// "pkey": "", -// "fixed": 0, -// "sort": 15, -// "group": "", -// "groupSort": "", -// "description": "", -// "children": [] -// }, -// { -// "name": "铅", -// "key": "pb", -// "pkey": "", -// "fixed": 0, -// "sort": 16, -// "group": "", -// "groupSort": "", -// "description": "", -// "children": [] -// }, -// { -// "name": "氰化物", -// "key": "cn", -// "pkey": "", -// "fixed": 0, -// "sort": 17, -// "group": "", -// "groupSort": "", -// "description": "", -// "children": [] -// }, -// { -// "name": "挥发酚", -// "key": "vlph", -// "pkey": "", -// "fixed": 0, -// "sort": 18, -// "group": "", -// "groupSort": "", -// "description": "", -// "children": [] -// }, -// { -// "name": "石油类", -// "key": "oil", -// "pkey": "", -// "fixed": 0, -// "sort": 19, -// "group": "", -// "groupSort": "", -// "description": "", -// "children": [] -// }, -// { -// "name": "阴离子表面活性剂", -// "key": "las", -// "pkey": "", -// "fixed": 0, -// "sort": 20, -// "group": "", -// "groupSort": "", -// "description": "", -// "children": [] -// }, -// { -// "name": "硫化物", -// "key": "s2", -// "pkey": "", -// "fixed": 0, -// "sort": 21, -// "group": "", -// "groupSort": "", -// "description": "", -// "children": [] -// }, -// { -// "name": "粪大肠菌群", -// "key": "fcg", -// "pkey": "", -// "fixed": 0, -// "sort": 22, -// "group": "", -// "groupSort": "", -// "description": "", -// "children": [] -// }, -// { -// "name": "氯化物", -// "key": "cl", -// "pkey": "", -// "fixed": 0, -// "sort": 23, -// "group": "", -// "groupSort": "", -// "description": "", -// "children": [] -// }, -// { -// "name": "硫酸盐", -// "key": "so4", -// "pkey": "", -// "fixed": 0, -// "sort": 24, -// "group": "", -// "groupSort": "", -// "description": "", -// "children": [] -// }, -// { -// "name": "硝酸盐氮", -// "key": "no3", -// "pkey": "", -// "fixed": 0, -// "sort": 25, -// "group": "", -// "groupSort": "", -// "description": "", -// "children": [] -// }, -// { -// "name": "总硬度", -// "key": "thrd", -// "pkey": "", -// "fixed": 0, -// "sort": 26, -// "group": "", -// "groupSort": "", -// "description": "", -// "children": [] -// }, -// { -// "name": "电导率", -// "key": "cond", -// "pkey": "", -// "fixed": 0, -// "sort": 27, -// "group": "", -// "groupSort": "", -// "description": "", -// "children": [] -// }, -// { -// "name": "铁", -// "key": "fe", -// "pkey": "", -// "fixed": 0, -// "sort": 28, -// "group": "", -// "groupSort": "", -// "description": "", -// "children": [] -// }, -// { -// "name": "锰", -// "key": "mn", -// "pkey": "", -// "fixed": 0, -// "sort": 29, -// "group": "", -// "groupSort": "", -// "description": "", -// "children": [] -// }, -// { -// "name": "铝", -// "key": "al", -// "pkey": "", -// "fixed": 0, -// "sort": 30, -// "group": "", -// "groupSort": "", -// "description": "", -// "children": [] -// }, -// { -// "name": "叶绿素a", -// "key": "chla", -// "pkey": "", -// "fixed": 0, -// "sort": 31, -// "group": "", -// "groupSort": "", -// "description": "", -// "children": [] -// }, -// { -// "name": "透明度", -// "key": "clarity", -// "pkey": "", -// "fixed": 0, -// "sort": 32, -// "group": "", -// "groupSort": "", -// "description": "", -// "children": [] -// }, -// { -// "name": "浊度", -// "key": "tu", -// "pkey": "", -// "fixed": 0, -// "sort": 33, -// "group": "", -// "groupSort": "", -// "description": "", -// "children": [] -// } -// ] - -export const stcdNameList = [ - { key: '猴', value: '猴子岩' }, - { key: '枕一', value: '枕头坝一级' }, - { key: '枕二', value: '枕头坝二级' }, - { key: '铜', value: '铜街子' }, - { key: '深', value: '深溪沟' }, - { key: '沙一', value: '沙坪一级' }, - { key: '沙二', value: '沙坪二级' }, - { key: '双', value: '双江口' }, - { key: '瀑', value: '瀑布沟' }, - { key: '龚', value: '龚嘴' }, - { key: '大', value: '大岗山' }, - { key: '金', value: '金川' }, - { key: '杨', value: '杨房沟' }, - { key: '桐', value: '桐子林' }, - { key: '孟', value: '孟底沟' }, - { key: '锦一', value: '锦屏一级' }, - { key: '锦二', value: '锦屏二级' }, - { key: '官', value: '官地' }, - { key: '两', value: '两河口' }, - { key: '卡', value: '卡拉' }, - { key: '二', value: '二滩' }, - { key: '里', value: '里底' }, - { key: '托', value: '托巴' }, - { key: '苗', value: '苗尾' }, - { key: '功', value: '功果桥' }, - { key: '湾', value: '小湾' }, - { key: '乌', value: '乌弄龙' }, - { key: '漫', value: '漫湾' }, - { key: '糯', value: '糯扎渡' }, - { key: '景', value: '景洪' }, - { key: '黄', value: '黄登' }, - { key: '华', value: '大华桥' }, - { key: '积', value: '积石峡' }, - { key: '苏', value: '苏只' }, - { key: '李', value: '李家峡' }, - { key: '拉', value: '拉西瓦' }, - { key: '龙', value: '龙羊峡' }, - { key: '班', value: '班多' }, - { key: '公', value: '公伯峡' } -]; - -export const offset1: any = { - sdzYijianL: { - text_x: -10, - text_y: -2.9, - icon_x: -200, - icon_y: -69, - billboard_x: -80, - billboard_y: -15, - labelOffset: [100, 41] - }, - sdzYijianR: { - text_x: 10, - text_y: -2.9, - icon_x: 200, - icon_y: -69, - billboard_x: 80, - billboard_y: -15, - labelOffset: [306, 41] - }, - sdzZaijianL: { - text_x: -10, - text_y: -2.9, - icon_x: -200, - icon_y: -69, - billboard_x: -80, - billboard_y: -15, - labelOffset: [100, 41] - }, - sdzZaijianR: { - text_x: 10, - text_y: -2.9, - icon_x: 200, - icon_y: -69, - billboard_x: 80, - billboard_y: -15, - labelOffset: [306, 41] - }, - wushujvL: { - text_x: -10, - text_y: -2.9, - icon_x: -200, - icon_y: -69, - billboard_x: -80, - billboard_y: -15, - labelOffset: [100, 41] - }, - wushujvR: { - text_x: 10, - text_y: -2.9, - icon_x: 200, - icon_y: -69, - billboard_x: 80, - billboard_y: -15, - labelOffset: [306, 41] - }, - sdzDabiaolv1L: { - text_x: -10, - text_y: -2.9, - icon_x: -200, - icon_y: -69, - billboard_x: -80, - billboard_y: -15, - labelOffset: [100, 41] - }, - sdzDabiaolv1R: { - text_x: 10, - text_y: -2.9, - icon_x: 200, - icon_y: -69, - billboard_x: 80, - billboard_y: -15, - labelOffset: [306, 41] - }, - sdzDabiaolv2L: { - text_x: -10, - text_y: -2.9, - icon_x: -200, - icon_y: -69, - billboard_x: -80, - billboard_y: -15, - labelOffset: [100, 41] - }, - sdzDabiaolv2R: { - text_x: 10, - text_y: -2.9, - icon_x: 200, - icon_y: -69, - billboard_x: 80, - billboard_y: -15, - labelOffset: [306, 41] - }, - sdzDabiaolv3L: { - text_x: -10, - text_y: -2.9, - icon_x: -200, - icon_y: -69, - billboard_x: -80, - billboard_y: -15, - labelOffset: [100, 41] - }, - sdzDabiaolv3R: { - text_x: 10, - text_y: -2.9, - icon_x: 200, - icon_y: -69, - billboard_x: 80, - billboard_y: -15, - labelOffset: [306, 41] - }, - sdzDabiaolv4L: { - text_x: -10, - text_y: -2.9, - icon_x: -200, - icon_y: -69, - billboard_x: -80, - billboard_y: -15, - labelOffset: [100, 41] - }, - sdzDabiaolv4R: { - text_x: 10, - text_y: -2.9, - icon_x: 200, - icon_y: -69, - billboard_x: 80, - billboard_y: -15, - labelOffset: [306, 41] - }, - sdzDabiaolv5L: { - text_x: -10, - text_y: -2.9, - icon_x: -200, - icon_y: -69, - billboard_x: -80, - billboard_y: -15, - labelOffset: [100, 41] - }, - sdzDabiaolv5R: { - text_x: 10, - text_y: -2.9, - icon_x: 200, - icon_y: -69, - billboard_x: 80, - billboard_y: -15, - labelOffset: [306, 41] - }, - szzBudabiaoL: { - text_x: -12, - text_y: -2.9, - icon_x: -255, - icon_y: -68, - billboard_x: -100, - billboard_y: -13, - labelOffset: [154, 46] - }, - szzBudabiaoR: { - text_x: 12, - text_y: -2.9, - icon_x: 255, - icon_y: -68, - billboard_x: 100, - billboard_y: -13, - labelOffset: [362, 46] - }, - szzDabiaoL: { - text_x: -12, - text_y: -2.9, - icon_x: -255, - icon_y: -68, - billboard_x: -100, - billboard_y: -13, - labelOffset: [154, 46] - }, - szzDabiaoR: { - text_x: 12, - text_y: -2.9, - icon_x: 255, - icon_y: -68, - billboard_x: 100, - billboard_y: -13, - labelOffset: [362, 46] - }, - szzWudabiaoshujvL: { - text_x: -12, - text_y: -2.9, - icon_x: -255, - icon_y: -68, - billboard_x: -100, - billboard_y: -13, - labelOffset: [154, 46] - }, - szzWudabiaoshujvR: { - text_x: 12, - text_y: -2.9, - icon_x: 255, - icon_y: -68, - billboard_x: 100, - billboard_y: -13, - labelOffset: [362, 46] - }, - shuishengshengtai: { - text_x: -0.1, - text_y: -3.5, - icon_x: -1, - icon_y: -100, - billboard_x: -1, - billboard_y: -25, - labelOffset: [150, 45] - }, - cezhanL: { - text_x: -12.2, - text_y: -2.9, - icon_x: -260, - icon_y: -68, - billboard_x: -100, - billboard_y: -13, - labelOffset: [154, 48] - }, - cezhanR: { - text_x: 12.2, - text_y: -2.9, - icon_x: 260, - icon_y: -68, - billboard_x: 100, - billboard_y: -13, - labelOffset: [362, 48] - }, - sdzGaojing0L: { - text_x: -11.7, - text_y: -2.8, - icon_x: -255, - icon_y: -68, - billboard_x: -100, - billboard_y: -15, - labelOffset: [154, 46] - }, - sdzGaojing0R: { - text_x: 11.7, - text_y: -2.8, - icon_x: 255, - icon_y: -68, - billboard_x: 100, - billboard_y: -15, - labelOffset: [362, 46] - }, - sdzGaojing1L: { - text_x: -11.7, - text_y: -2.8, - icon_x: -255, - icon_y: -68, - billboard_x: -100, - billboard_y: -15, - labelOffset: [154, 46] - }, - sdzGaojing1R: { - text_x: 11.7, - text_y: -2.8, - icon_x: 255, - icon_y: -68, - billboard_x: 100, - billboard_y: -15, - labelOffset: [362, 46] - }, - sdzGaojing2L: { - text_x: -11.7, - text_y: -2.8, - icon_x: -255, - icon_y: -68, - billboard_x: -100, - billboard_y: -15, - labelOffset: [154, 46] - }, - sdzGaojing2R: { - text_x: 11.7, - text_y: -2.8, - icon_x: 255, - icon_y: -68, - billboard_x: 100, - billboard_y: -15, - labelOffset: [362, 46] - }, - sdzGaojing3L: { - text_x: -11.7, - text_y: -2.8, - icon_x: -255, - icon_y: -68, - billboard_x: -100, - billboard_y: -15, - labelOffset: [154, 46] - }, - sdzGaojing3R: { - text_x: 11.7, - text_y: -2.8, - icon_x: 255, - icon_y: -68, - billboard_x: 100, - billboard_y: -15, - labelOffset: [362, 46] - }, - wushujvlgL: { - text_x: -11.7, - text_y: -2.8, - icon_x: -255, - icon_y: -68, - billboard_x: -100, - billboard_y: -15, - labelOffset: [154, 46] - }, - wushujvlgR: { - text_x: 11.7, - text_y: -2.8, - icon_x: 255, - icon_y: -68, - billboard_x: 100, - billboard_y: -15, - labelOffset: [362, 46] - }, - gyssL: { - text_x: -12.65, - text_y: -2.9, - icon_x: -275, - icon_y: -68, - billboard_x: -110, - billboard_y: -13, - labelOffset: [165, 41] - }, - gyssR: { - text_x: 12.65, - text_y: -2.9, - icon_x: 275, - icon_y: -68, - billboard_x: 110, - billboard_y: -13, - labelOffset: [385, 41] - } - // qixidiL: { text_x: 12.2, text_y: 2.9, icon_x: 260, icon_y: 68, billboard_x: 100, billboard_y: 13, label_x: 140, label_y: 44 }, - // qixidiR: { text_x: 12.2, text_y: 2.9, icon_x: 260, icon_y: 68, billboard_x: 100, billboard_y: 13, label_x: 140, label_y: 44 }, -}; -export const drawDotImg1: any = { - large_eng_built: { left: 'sdzYijianL', right: 'sdzYijianR' }, - large_eng_ubuilt: { left: 'sdzZaijianL', right: 'sdzZaijianR' }, - large_eng_nbuilt: { left: 'wushujvL', right: 'wushujvR' }, - mid_eng_built: { left: 'sdzYijianL', right: 'sdzYijianR' }, - mid_eng_ubuilt: { left: 'sdzZaijianL', right: 'sdzZaijianR' }, - mid_eng_nbuilt: { left: 'wushujvL', right: 'wushujvR' }, - eef_1_1: { left: 'sdzDabiaolv1L', right: 'sdzDabiaolv1R' }, - eef_1_2: { left: 'sdzDabiaolv2L', right: 'sdzDabiaolv2R' }, - eef_1_3: { left: 'sdzDabiaolv3L', right: 'sdzDabiaolv3R' }, - eef_1_4: { left: 'sdzDabiaolv4L', right: 'sdzDabiaolv4R' }, - eef_1_none: { left: 'sdzDabiaolv5L', right: 'sdzDabiaolv5R' }, - eef_2_1: { left: 'sdzDabiaolv1L', right: 'sdzDabiaolv1R' }, - eef_2_2: { left: 'sdzDabiaolv2L', right: 'sdzDabiaolv2R' }, - eef_2_3: { left: 'sdzDabiaolv3L', right: 'sdzDabiaolv3R' }, - eef_2_4: { left: 'sdzDabiaolv4L', right: 'sdzDabiaolv4R' }, - eef_2_none: { left: 'sdzDabiaolv5L', right: 'sdzDabiaolv5R' }, - WT_1: { left: 'gyssL', right: 'gyssR' }, - WT_2: { left: 'gyssL', right: 'gyssR' }, - stinfo_wtzj_legend: { left: 'gyssL', right: 'gyssR' }, - wq_station_3: { left: 'szzDabiaoL', right: 'szzDabiaoR' }, - wq_station_4: { left: 'szzBudabiaoL', right: 'szzBudabiaoR' }, - wq_station_1: { left: 'szzDabiaoL', right: 'szzDabiaoR' }, - wq_station_2: { left: 'szzBudabiaoL', right: 'szzBudabiaoR' }, - wq_station_5: { left: 'szzDabiaoL', right: 'szzDabiaoR' }, - wq_station_6: { left: 'szzBudabiaoL', right: 'szzBudabiaoR' }, - wq_station_7: { left: 'szzWudabiaoshujvL', right: 'szzWudabiaoshujvR' }, - wq_station_8: { left: 'szzWudabiaoshujvL', right: 'szzWudabiaoshujvR' }, - wq_station_9: { left: 'szzWudabiaoshujvL', right: 'szzWudabiaoshujvR' }, - alarm_range_3: { left: 'sdzGaojing3L', right: 'sdzGaojing3R' }, - alarm_range_2: { left: 'sdzGaojing2L', right: 'sdzGaojing2R' }, - alarm_range_1: { left: 'sdzGaojing1L', right: 'sdzGaojing1R' }, - alarm_range_0: { left: 'sdzGaojing0L', right: 'sdzGaojing0R' }, - WE: { left: 'shuishengshengtai', right: 'shuishengshengtai' }, - qxz: { left: 'cezhanL', right: 'cezhanR' }, - spjk: { left: 'cezhanL', right: 'cezhanR' }, - fbfm_spjk: { left: 'cezhanL', right: 'cezhanR' }, - eqs_spjk: { left: 'cezhanL', right: 'cezhanR' }, - wq_spjk: { left: 'cezhanL', right: 'cezhanR' }, - fp_spjk: { left: 'cezhanL', right: 'cezhanR' }, - fb_spjk: { left: 'cezhanL', right: 'cezhanR' }, - fh_spjk: { left: 'cezhanL', right: 'cezhanR' }, - va_spjk: { left: 'cezhanL', right: 'cezhanR' }, - vp_spjk: { left: 'cezhanL', right: 'cezhanR' }, - dw_spjk: { left: 'cezhanL', right: 'cezhanR' }, - gjllz: { left: 'cezhanL', right: 'cezhanR' }, - zjllz: { left: 'cezhanL', right: 'cezhanR' }, - wt_alarm_1: { left: 'sdzGaojing0L', right: 'sdzGaojing0R' }, - wt_alarm_2: { left: 'sdzGaojing3L', right: 'sdzGaojing3R' }, - wt_alarm_0: { left: 'wushujvlgL', right: 'wushujvlgR' }, - wq_alarm_1: { left: 'sdzGaojing0L', right: 'sdzGaojing0R' }, - wq_alarm_2: { left: 'sdzGaojing3L', right: 'sdzGaojing3R' }, - wq_alarm_0: { left: 'wushujvlgL', right: 'wushujvlgR' }, - rz_alarm_1: { left: 'sdzGaojing0L', right: 'sdzGaojing0R' }, - rz_alarm_2: { left: 'sdzGaojing3L', right: 'sdzGaojing3R' }, - rz_alarm_0: { left: 'wushujvlgL', right: 'wushujvlgR' }, - operat_alarm_1: { left: 'sdzGaojing0L', right: 'sdzGaojing0R' }, - operat_alarm_2: { left: 'sdzGaojing3L', right: 'sdzGaojing3R' }, - operat_alarm_0: { left: 'wushujvlgL', right: 'wushujvlgR' }, - dxsdz_ywc: { left: 'sdzDabiaolv2L', right: 'sdzDabiaolv2R' }, - dxsdz_wwc: { left: 'sdzGaojing3L', right: 'sdzGaojing3R' }, - dxsdz_wtb: { left: 'sdzDabiaolv3L', right: 'sdzDabiaolv3R' }, - zxsdz_ywc: { left: 'sdzDabiaolv2L', right: 'sdzDabiaolv2R' }, - zxsdz_wwc: { left: 'sdzGaojing3L', right: 'sdzGaojing3R' }, - zxsdz_wtb: { left: 'sdzDabiaolv3L', right: 'sdzDabiaolv3R' }, - gy_1: { left: 'gyssL', right: 'gyssR' }, - gy_2: { left: 'gyssL', right: 'gyssR' }, - gy_3: { left: 'gyssL', right: 'gyssR' }, - gy_4: { left: 'gyssL', right: 'gyssR' }, - gy_5: { left: 'gyssL', right: 'gyssR' }, - dws_1: { left: 'gyssL', right: 'gyssR' }, - dws_2: { left: 'gyssL', right: 'gyssR' }, - dws_3: { left: 'gyssL', right: 'gyssR' }, - dws_4: { left: 'gyssL', right: 'gyssR' }, - EQ_7: { left: 'gyssL', right: 'gyssR' }, - EQ_6: { left: 'gyssL', right: 'gyssR' }, - EQ_2: { left: 'gyssL', right: 'gyssR' }, - EQ_3: { left: 'gyssL', right: 'gyssR' }, - EQ_4: { left: 'gyssL', right: 'gyssR' }, - EQ_5: { left: 'gyssL', right: 'gyssR' }, - EQ_1: { left: 'gyssL', right: 'gyssR' }, - FB: { left: 'gyssL', right: 'gyssR' }, - VP: { left: 'gyssL', right: 'gyssR' }, - VA: { left: 'gyssL', right: 'gyssR' }, - SG: { left: 'gyssL', right: 'gyssR' }, - FH: { left: 'gyssL', right: 'gyssR' }, - ylfb: { left: 'gyssL', right: 'gyssR' }, - gy_1_incomplete: { left: 'wushujvlgL', right: 'wushujvlgR' }, - gy_2_incomplete: { left: 'wushujvlgL', right: 'wushujvlgR' }, - gy_3_incomplete: { left: 'wushujvlgL', right: 'wushujvlgR' }, - gy_4_incomplete: { left: 'wushujvlgL', right: 'wushujvlgR' }, - gy_5_incomplete: { left: 'wushujvlgL', right: 'wushujvlgR' }, - dws_1_incomplete: { left: 'wushujvlgL', right: 'wushujvlgR' }, - dws_2_incomplete: { left: 'wushujvlgL', right: 'wushujvlgR' }, - dws_3_incomplete: { left: 'wushujvlgL', right: 'wushujvlgR' }, - dws_4_incomplete: { left: 'wushujvlgL', right: 'wushujvlgR' }, - EQ_6_incomplete: { left: 'wushujvlgL', right: 'wushujvlgR' }, - EQ_2_incomplete: { left: 'wushujvlgL', right: 'wushujvlgR' }, - EQ_3_incomplete: { left: 'wushujvlgL', right: 'wushujvlgR' }, - EQ_4_incomplete: { left: 'wushujvlgL', right: 'wushujvlgR' }, - EQ_5_incomplete: { left: 'wushujvlgL', right: 'wushujvlgR' }, - EQ_1_incomplete: { left: 'wushujvlgL', right: 'wushujvlgR' }, - FB_incomplete: { left: 'wushujvlgL', right: 'wushujvlgR' }, - VP_incomplete: { left: 'wushujvlgL', right: 'wushujvlgR' }, - VA_incomplete: { left: 'wushujvlgL', right: 'wushujvlgR' }, - SG_incomplete: { left: 'wushujvlgL', right: 'wushujvlgR' }, - large_eng_built_alarm_range_0: { - left: 'sdzGaojing0L', - right: 'sdzGaojing0R' - }, - mid_eng_built_alarm_range_0: { left: 'sdzGaojing0L', right: 'sdzGaojing0R' }, - large_eng_built_alarm_range_1: { - left: 'sdzGaojing1L', - right: 'sdzGaojing1R' - }, - mid_eng_built_alarm_range_1: { left: 'sdzGaojing1L', right: 'sdzGaojing1R' }, - large_eng_built_alarm_range_2: { - left: 'sdzGaojing2L', - right: 'sdzGaojing2R' - }, - mid_eng_built_alarm_range_2: { left: 'sdzGaojing2L', right: 'sdzGaojing2L' }, - large_eng_built_alarm_range_3: { - left: 'sdzGaojing3L', - right: 'sdzGaojing3R' - }, - mid_eng_built_alarm_range_3: { left: 'sdzGaojing3L', right: 'sdzGaojing3L' }, - fhwt_legend: { left: 'gyssL', right: 'gyssR' }, - fhwq_legend: { left: 'gyssL', right: 'gyssR' } -}; - -export const offset2: any = { - dxsdzYijianL: { - text_x: -4, - text_y: -0.2, - icon_x: -130, - icon_y: -5, - billboard_x: -50, - billboard_y: 0.01, - labelOffset: [138, 30] - }, - dxsdzZaijianL: { - text_x: -4, - text_y: -0.2, - icon_x: -130, - icon_y: -5, - billboard_x: -50, - billboard_y: 0.01, - labelOffset: [138, 30] - }, - dxsdzGuihuaL: { - text_x: -4, - text_y: -0.2, - icon_x: -130, - icon_y: -5, - billboard_x: -50, - billboard_y: 0.01, - labelOffset: [138, 30] - }, - zxsdzYijianL: { - text_x: -4, - text_y: -0.2, - icon_x: -130, - icon_y: -5, - billboard_x: -50, - billboard_y: 0.01, - labelOffset: [138, 30] - }, - zxsdzZaijianL: { - text_x: -4, - text_y: -0.2, - icon_x: -130, - icon_y: -5, - billboard_x: -50, - billboard_y: 0.01, - labelOffset: [138, 30] - }, - zxsdzGuihuaL: { - text_x: -4, - text_y: -0.2, - icon_x: -130, - icon_y: -5, - billboard_x: -50, - billboard_y: 0.01, - labelOffset: [138, 30] - }, - - dxsdzYijianR: { - text_x: 6.5, - text_y: -0.2, - icon_x: 130, - icon_y: -5, - billboard_x: 50, - billboard_y: 0.01, - labelOffset: [138, 30] - }, - dxsdzZaijianR: { - text_x: 6.5, - text_y: -0.2, - icon_x: 130, - icon_y: -5, - billboard_x: 50, - billboard_y: 0.01, - labelOffset: [138, 30] - }, - dxsdzGuihuaR: { - text_x: 6.5, - text_y: -0.2, - icon_x: 130, - icon_y: -5, - billboard_x: 50, - billboard_y: 0.01, - labelOffset: [138, 30] - }, - zxsdzYijianR: { - text_x: 6.5, - text_y: -0.2, - icon_x: 130, - icon_y: -5, - billboard_x: 50, - billboard_y: 0.01, - labelOffset: [138, 30] - }, - zxsdzZaijianR: { - text_x: 6.5, - text_y: -0.2, - icon_x: 130, - icon_y: -5, - billboard_x: 50, - billboard_y: 0.01, - labelOffset: [138, 30] - }, - zxsdzGuihuaR: { - text_x: 6.5, - text_y: -0.2, - icon_x: 130, - icon_y: -5, - billboard_x: 50, - billboard_y: 0.01, - labelOffset: [138, 30] - }, - - 'dxsdzDabiaolv-1': { - text_x: 0, - text_y: -2.9, - icon_x: 0, - icon_y: -69, - billboard_x: 0, - billboard_y: -20, - labelOffset: [138, 30] - }, - 'dxsdzDabiaolv-2': { - text_x: 0, - text_y: -2.9, - icon_x: 0, - icon_y: -69, - billboard_x: 0, - billboard_y: -20, - labelOffset: [138, 30] - }, - 'dxsdzDabiaolv-3': { - text_x: 0, - text_y: -2.9, - icon_x: 0, - icon_y: -69, - billboard_x: 0, - billboard_y: -20, - labelOffset: [138, 30] - }, - 'dxsdzDabiaolv-4': { - text_x: 0, - text_y: -2.9, - icon_x: 0, - icon_y: -69, - billboard_x: 0, - billboard_y: -20, - labelOffset: [138, 30] - }, - 'dxsdzDabiaolv-5': { - text_x: 0, - text_y: -2.9, - icon_x: 0, - icon_y: -69, - billboard_x: 0, - billboard_y: -20, - labelOffset: [138, 30] - }, - 'zxsdzDabiaolv-1': { - text_x: 0, - text_y: -2.9, - icon_x: 0, - icon_y: -69, - billboard_x: 0, - billboard_y: -20, - labelOffset: [138, 30] - }, - 'zxsdzDabiaolv-2': { - text_x: 0, - text_y: -2.9, - icon_x: 0, - icon_y: -69, - billboard_x: 0, - billboard_y: -20, - labelOffset: [138, 30] - }, - 'zxsdzDabiaolv-3': { - text_x: 0, - text_y: -2.9, - icon_x: 0, - icon_y: -69, - billboard_x: 0, - billboard_y: -20, - labelOffset: [138, 30] - }, - 'zxsdzDabiaolv-4': { - text_x: 0, - text_y: -2.9, - icon_x: 0, - icon_y: -69, - billboard_x: 0, - billboard_y: -20, - labelOffset: [138, 30] - }, - 'zxsdzDabiaolv-5': { - text_x: 0, - text_y: -2.9, - icon_x: 0, - icon_y: -69, - billboard_x: 0, - billboard_y: -20, - labelOffset: [138, 30] - }, - gyss: { - text_x: 0, - text_y: -2.9, - icon_x: 0, - icon_y: -69, - billboard_x: 0, - billboard_y: -20, - labelOffset: [176, 43] - }, - szzDabiao: { - text_x: 0, - text_y: -2.9, - icon_x: 0, - icon_y: -69, - billboard_x: 0, - billboard_y: -20, - labelOffset: [158, 49] - }, - szzBudabiao: { - text_x: 0, - text_y: -2.9, - icon_x: 0, - icon_y: -69, - billboard_x: 0, - billboard_y: -20, - labelOffset: [158, 49] - }, - szzWudabiaoshujv: { - text_x: 0, - text_y: -2.9, - icon_x: 0, - icon_y: -69, - billboard_x: 0, - billboard_y: -20, - labelOffset: [158, 49] - }, - sdzGaojing0: { - text_x: 0, - text_y: -2.9, - icon_x: 0, - icon_y: -69, - billboard_x: 0, - billboard_y: -20, - labelOffset: [158, 49] - }, - sdzGaojing1: { - text_x: 0, - text_y: -2.9, - icon_x: 0, - icon_y: -69, - billboard_x: 0, - billboard_y: -20, - labelOffset: [158, 49] - }, - sdzGaojing2: { - text_x: 0, - text_y: -2.9, - icon_x: 0, - icon_y: -69, - billboard_x: 0, - billboard_y: -20, - labelOffset: [158, 49] - }, - sdzGaojing3: { - text_x: 0, - text_y: -2.9, - icon_x: 0, - icon_y: -69, - billboard_x: 0, - billboard_y: -20, - labelOffset: [158, 49] - }, - qixidi: { - text_x: 0, - text_y: -2.9, - icon_x: 0, - icon_y: -69, - billboard_x: 0, - billboard_y: -20, - labelOffset: [158, 49] - }, - cezhan: { - text_x: 0, - text_y: -2.9, - icon_x: 0, - icon_y: -69, - billboard_x: 0, - billboard_y: -20, - labelOffset: [158, 49] - }, - wushujvlg: { - text_x: 0, - text_y: -2.9, - icon_x: 0, - icon_y: -69, - billboard_x: 0, - billboard_y: -20, - labelOffset: [158, 49] - }, - ylfbL: { - text_x: -8, - text_y: -0.3, - icon_x: -180, - icon_y: -5, - billboard_x: -75, - billboard_y: 15, - labelOffset: [158, 49] - }, - ylfbR: { - text_x: 8.3, - text_y: -0.3, - icon_x: 170, - icon_y: -5, - billboard_x: 70, - billboard_y: 15, - labelOffset: [158, 49] - }, - yeshengdongwu: { - text_x: 7.5, - text_y: -0.3, - icon_x: 170, - icon_y: -5, - billboard_x: 0, - billboard_y: -20, - labelOffset: [116, 46] - }, - 'bg-mapDongwuL': { - text_offset: [-6.8, -0.3], - icon_x: -180, - icon_y: -5, - billboard_x: -75, - billboard_y: 15, - labelOffset: [111, 46] - }, - 'bg-mapDongwuR': { - text_offset: [6.8, -0.3], - icon_x: 170, - icon_y: -5, - billboard_x: 70, - billboard_y: 15, - labelOffset: [161, 46] - } -}; - -export const drawDotImg2: any = { - large_eng_built: { left: 'dxsdzYijianL', right: 'dxsdzYijianR' }, - large_eng_ubuilt: { left: 'dxsdzZaijianL', right: 'dxsdzZaijianR' }, - large_eng_nbuilt: { left: 'dxsdzGuihuaL', right: 'dxsdzGuihuaR' }, - mid_eng_built: { left: 'zxsdzYijianL', right: 'zxsdzYijianR' }, - mid_eng_ubuilt: { left: 'zxsdzZaijianL', right: 'zxsdzZaijianR' }, - mid_eng_nbuilt: { left: 'zxsdzGuihuaL', right: 'zxsdzGuihuaR' }, - eef_1_1: { left: 'dxsdzDabiaolv-1', right: 'dxsdzDabiaolv-1' }, - eef_1_2: { left: 'dxsdzDabiaolv-2', right: 'dxsdzDabiaolv-2' }, - eef_1_3: { left: 'dxsdzDabiaolv-3', right: 'dxsdzDabiaolv-3' }, - eef_1_4: { left: 'dxsdzDabiaolv-4', right: 'dxsdzDabiaolv-4' }, - eef_1_none: { left: 'dxsdzDabiaolv-5', right: 'dxsdzDabiaolv-5' }, - eef_2_1: { left: 'zxsdzDabiaolv-1', right: 'zxsdzDabiaolv-1' }, - eef_2_2: { left: 'zxsdzDabiaolv-2', right: 'zxsdzDabiaolv-2' }, - eef_2_3: { left: 'zxsdzDabiaolv-3', right: 'zxsdzDabiaolv-3' }, - eef_2_4: { left: 'zxsdzDabiaolv-4', right: 'zxsdzDabiaolv-4' }, - eef_2_none: { left: 'zxsdzDabiaolv-5', right: 'zxsdzDabiaolv-5' }, - WT_1: { left: 'gyss', right: 'gyss' }, - WT_2: { left: 'gyss', right: 'gyss' }, - wqfb_legend: { left: 'szzDabiao', right: 'szzDabiao' }, - wq_station_3: { left: 'szzDabiao', right: 'szzDabiao' }, - wq_station_4: { left: 'szzBudabiao', right: 'szzBudabiao' }, - wq_station_1: { left: 'szzDabiao', right: 'szzDabiao' }, - wq_station_2: { left: 'szzBudabiao', right: 'szzBudabiao' }, - wq_station_5: { left: 'szzDabiao', right: 'szzDabiao' }, - wq_station_6: { left: 'szzBudabiao', right: 'szzBudabiao' }, - wq_station_7: { left: 'szzWudabiaoshujv', right: 'szzWudabiaoshujv' }, - wq_station_8: { left: 'szzWudabiaoshujv', right: 'szzWudabiaoshujv' }, - wq_station_9: { left: 'szzWudabiaoshujv', right: 'szzWudabiaoshujv' }, - alarm_range_3: { left: 'sdzGaojing3', right: 'sdzGaojing3' }, - alarm_range_2: { left: 'sdzGaojing2', right: 'sdzGaojing2' }, - alarm_range_1: { left: 'sdzGaojing1', right: 'sdzGaojing1' }, - alarm_range_0: { left: 'sdzGaojing0', right: 'sdzGaojing0' }, - WE: { left: 'qixidi', right: 'qixidi' }, - qxz: { left: 'cezhan', right: 'cezhan' }, - spjk: { left: 'cezhan', right: 'cezhan' }, - fbfm_spjk: { left: 'cezhan', right: 'cezhan' }, - eqs_spjk: { left: 'cezhan', right: 'cezhan' }, - wq_spjk: { left: 'cezhan', right: 'cezhan' }, - fp_spjk: { left: 'cezhan', right: 'cezhan' }, - fb_spjk: { left: 'cezhan', right: 'cezhan' }, - fh_spjk: { left: 'cezhan', right: 'cezhan' }, - va_spjk: { left: 'cezhan', right: 'cezhan' }, - vp_spjk: { left: 'cezhan', right: 'cezhan' }, - dw_spjk: { left: 'cezhan', right: 'cezhan' }, - gjllz: { left: 'cezhan', right: 'cezhan' }, - zjllz: { left: 'cezhan', right: 'cezhan' }, - wt_alarm_1: { left: 'sdzGaojing0', right: 'sdzGaojing0' }, - wt_alarm_2: { left: 'sdzGaojing3', right: 'sdzGaojing3' }, - wt_alarm_0: { left: 'wushujvlg', right: 'wushujvlg' }, - wq_alarm_1: { left: 'sdzGaojing0', right: 'sdzGaojing0' }, - wq_alarm_2: { left: 'sdzGaojing3', right: 'sdzGaojing3' }, - wq_alarm_0: { left: 'wushujvlg', right: 'wushujvlg' }, - rz_alarm_1: { left: 'sdzGaojing0', right: 'sdzGaojing0' }, - rz_alarm_2: { left: 'sdzGaojing3', right: 'sdzGaojing3' }, - rz_alarm_0: { left: 'wushujvlg', right: 'wushujvlg' }, - operat_alarm_1: { left: 'sdzGaojing0', right: 'sdzGaojing0' }, - operat_alarm_2: { left: 'sdzGaojing3', right: 'sdzGaojing3' }, - operat_alarm_0: { left: 'wushujvlg', right: 'wushujvlg' }, - dxsdz_ywc: { left: 'dxsdzDabiaolv-2', right: 'dxsdzDabiaolv-2' }, - dxsdz_wwc: { left: 'sdzGaojing3', right: 'sdzGaojing3' }, - dxsdz_wtb: { left: 'dxsdzDabiaolv-3', right: 'dxsdzDabiaolv-3' }, - zxsdz_ywc: { left: 'zxsdzDabiaolv-2', right: 'zxsdzDabiaolv-2' }, - zxsdz_wwc: { left: 'sdzGaojing3', right: 'sdzGaojing3' }, - zxsdz_wtb: { left: 'zxsdzDabiaolv-3', right: 'zxsdzDabiaolv-3' }, - gy_1: { left: 'gyss', right: 'gyss' }, - gy_2: { left: 'gyss', right: 'gyss' }, - gy_3: { left: 'gyss', right: 'gyss' }, - gy_4: { left: 'gyss', right: 'gyss' }, - gy_5: { left: 'gyss', right: 'gyss' }, - dws_1: { left: 'gyss', right: 'gyss' }, - dws_2: { left: 'gyss', right: 'gyss' }, - dws_3: { left: 'gyss', right: 'gyss' }, - dws_4: { left: 'gyss', right: 'gyss' }, - EQ_7: { left: 'gyss', right: 'gyss' }, - EQ_6: { left: 'gyss', right: 'gyss' }, - EQ_2: { left: 'gyss', right: 'gyss' }, - EQ_3: { left: 'gyss', right: 'gyss' }, - EQ_4: { left: 'gyss', right: 'gyss' }, - EQ_5: { left: 'gyss', right: 'gyss' }, - EQ_1: { left: 'gyss', right: 'gyss' }, - FB: { left: 'gyss', right: 'gyss' }, - VP: { left: 'gyss', right: 'gyss' }, - VA: { left: 'gyss', right: 'gyss' }, - SG: { left: 'gyss', right: 'gyss' }, - FH: { left: 'gyss', right: 'gyss' }, - ylfb: { left: 'gyss', right: 'gyss' }, - fish_along: { left: 'ylfbR', right: 'ylfbR' }, - gy_1_incomplete: { left: 'wushujvlg', right: 'wushujvlg' }, - gy_2_incomplete: { left: 'wushujvlg', right: 'wushujvlg' }, - gy_3_incomplete: { left: 'wushujvlg', right: 'wushujvlg' }, - gy_4_incomplete: { left: 'wushujvlg', right: 'wushujvlg' }, - gy_5_incomplete: { left: 'wushujvlg', right: 'wushujvlg' }, - dws_1_incomplete: { left: 'wushujvlg', right: 'wushujvlg' }, - dws_2_incomplete: { left: 'wushujvlg', right: 'wushujvlg' }, - dws_3_incomplete: { left: 'wushujvlg', right: 'wushujvlg' }, - dws_4_incomplete: { left: 'wushujvlg', right: 'wushujvlg' }, - EQ_6_incomplete: { left: 'wushujvlg', right: 'wushujvlg' }, - EQ_2_incomplete: { left: 'wushujvlg', right: 'wushujvlg' }, - EQ_3_incomplete: { left: 'wushujvlg', right: 'wushujvlg' }, - EQ_4_incomplete: { left: 'wushujvlg', right: 'wushujvlg' }, - EQ_5_incomplete: { left: 'wushujvlg', right: 'wushujvlg' }, - EQ_1_incomplete: { left: 'wushujvlg', right: 'wushujvlg' }, - FB_incomplete: { left: 'wushujvlg', right: 'wushujvlg' }, - VP_incomplete: { left: 'wushujvlg', right: 'wushujvlg' }, - VA_incomplete: { left: 'wushujvlg', right: 'wushujvlg' }, - SG_incomplete: { left: 'wushujvlg', right: 'wushujvlg' }, - large_eng_built_alarm_range_0: { left: 'sdzGaojing0', right: 'sdzGaojing0' }, - mid_eng_built_alarm_range_0: { left: 'sdzGaojing0', right: 'sdzGaojing0' }, - large_eng_built_alarm_range_1: { left: 'sdzGaojing1', right: 'sdzGaojing1' }, - mid_eng_built_alarm_range_1: { left: 'sdzGaojing1', right: 'sdzGaojing1' }, - large_eng_built_alarm_range_2: { left: 'sdzGaojing2', right: 'sdzGaojing2' }, - mid_eng_built_alarm_range_2: { left: 'sdzGaojing2', right: 'sdzGaojing2' }, - large_eng_built_alarm_range_3: { left: 'sdzGaojing3', right: 'sdzGaojing3' }, - mid_eng_built_alarm_range_3: { left: 'sdzGaojing3', right: 'sdzGaojing3' }, - wild_animal_legend: { left: 'yeshengdongwu', right: 'yeshengdongwu' }, - fd_legend: { left: 'gyss', right: 'gyss' }, - stinfo_wtzj_legend: { left: 'gyss', right: 'gyss' }, - fhwt_legend: { left: 'gyss', right: 'gyss' }, - fhwq_legend: { left: 'gyss', right: 'gyss' }, - terrestrial_animals: { left: 'bg-mapDongwuL', right: 'bg-mapDongwuR' } -}; -export const offset3: any = { - dxsdzYijianL: { - text_offset: [-0.7, 0.3], - text_offset2: [-1.0, 0.3], - icon_x: -130, - icon_y: -5, - billboard_x: -57, - billboard_y: 15, - labelOffset: [140, 30] - }, - dxsdzZaijianL: { - text_offset: [-0.7, 0.3], - text_offset2: [-1.0, 0.3], - icon_x: -130, - icon_y: -5, - billboard_x: -57, - billboard_y: 15, - labelOffset: [140, 30] - }, - dxsdzGuihuaL: { - text_offset: [-0.7, 0.3], - text_offset2: [-1.0, 0.3], - icon_x: -130, - icon_y: -5, - billboard_x: -57, - billboard_y: 15, - labelOffset: [140, 30] - }, - zxsdzYijianL: { - text_offset: [-0.7, 0.3], - text_offset2: [-1.0, 0.3], - icon_x: -130, - icon_y: -5, - billboard_x: -57, - billboard_y: 15, - labelOffset: [140, 30] - }, - zxsdzZaijianL: { - text_offset: [-0.7, 0.3], - text_offset2: [-1.0, 0.3], - icon_x: -130, - icon_y: -5, - billboard_x: -57, - billboard_y: 15, - labelOffset: [140, 30] - }, - zxsdzGuihuaL: { - text_offset: [-0.7, 0.3], - text_offset2: [-1.0, 0.3], - icon_x: -130, - icon_y: -5, - billboard_x: -57, - billboard_y: 15, - labelOffset: [140, 30] - }, - - dxsdzYijianR: { - text_offset: [0.7, -0.5], - text_offset2: [1.0, -0.5], - icon_x: 130, - icon_y: -5, - billboard_x: 57, - billboard_y: 8, - labelOffset: [70, 30] - }, - dxsdzZaijianR: { - text_offset: [0.7, -0.5], - text_offset2: [1.0, -0.5], - icon_x: 130, - icon_y: -5, - billboard_x: 57, - billboard_y: 8, - labelOffset: [70, 30] - }, - dxsdzGuihuaR: { - text_offset: [0.7, -0.5], - text_offset2: [1.0, -0.5], - icon_x: 130, - icon_y: -5, - billboard_x: 57, - billboard_y: 8, - labelOffset: [70, 30] - }, - zxsdzYijianR: { - text_offset: [0.7, -0.5], - text_offset2: [1.0, -0.5], - icon_x: 130, - icon_y: -5, - billboard_x: 57, - billboard_y: 8, - labelOffset: [70, 30] - }, - zxsdzZaijianR: { - text_offset: [0.7, -0.5], - text_offset2: [1.0, -0.5], - icon_x: 130, - icon_y: -5, - billboard_x: 57, - billboard_y: 8, - labelOffset: [70, 30] - }, - zxsdzGuihuaR: { - text_offset: [0.7, -0.5], - text_offset2: [1.0, -0.5], - icon_x: 130, - icon_y: -5, - billboard_x: 57, - billboard_y: 8, - labelOffset: [70, 30] - }, - - 'dxsdzDabiaolv-1': { - text_offset: [0, -2.9], - icon_x: 0, - icon_y: -69, - billboard_x: 0, - billboard_y: -20, - labelOffset: [138, 30] - }, - 'dxsdzDabiaolv-2': { - text_offset: [0, -2.9], - icon_x: 0, - icon_y: -69, - billboard_x: 0, - billboard_y: -20, - labelOffset: [138, 30] - }, - 'dxsdzDabiaolv-3': { - text_offset: [0, -2.9], - icon_x: 0, - icon_y: -69, - billboard_x: 0, - billboard_y: -20, - labelOffset: [138, 30] - }, - 'dxsdzDabiaolv-4': { - text_offset: [0, -2.9], - icon_x: 0, - icon_y: -69, - billboard_x: 0, - billboard_y: -20, - labelOffset: [138, 30] - }, - 'dxsdzDabiaolv-5': { - text_offset: [0, -2.9], - icon_x: 0, - icon_y: -69, - billboard_x: 0, - billboard_y: -20, - labelOffset: [138, 30] - }, - 'zxsdzDabiaolv-1': { - text_offset: [0, -2.9], - icon_x: 0, - icon_y: -69, - billboard_x: 0, - billboard_y: -20, - labelOffset: [138, 30] - }, - 'zxsdzDabiaolv-2': { - text_offset: [0, -2.9], - icon_x: 0, - icon_y: -69, - billboard_x: 0, - billboard_y: -20, - labelOffset: [138, 30] - }, - 'zxsdzDabiaolv-3': { - text_offset: [0, -2.9], - icon_x: 0, - icon_y: -69, - billboard_x: 0, - billboard_y: -20, - labelOffset: [138, 30] - }, - 'zxsdzDabiaolv-4': { - text_offset: [0, -2.9], - icon_x: 0, - icon_y: -69, - billboard_x: 0, - billboard_y: -20, - labelOffset: [138, 30] - }, - 'zxsdzDabiaolv-5': { - text_offset: [0, -2.9], - icon_x: 0, - icon_y: -69, - billboard_x: 0, - billboard_y: -20, - labelOffset: [138, 30] - }, - gyss: { - text_offset: [0, -2.9], - icon_x: 0, - icon_y: -69, - billboard_x: 0, - billboard_y: -20, - labelOffset: [176, 43] - }, - szzDabiao: { - text_offset: [0, -2.9], - icon_x: 0, - icon_y: -69, - billboard_x: 0, - billboard_y: -20, - labelOffset: [158, 49] - }, - szzBudabiao: { - text_offset: [0, -2.9], - icon_x: 0, - icon_y: -69, - billboard_x: 0, - billboard_y: -20, - labelOffset: [158, 49] - }, - szzWudabiaoshujv: { - text_offset: [0, -2.9], - icon_x: 0, - icon_y: -69, - billboard_x: 0, - billboard_y: -20, - labelOffset: [158, 49] - }, - sdzGaojing0: { - text_offset: [0, -2.9], - icon_x: 0, - icon_y: -69, - billboard_x: 0, - billboard_y: -20, - labelOffset: [158, 49] - }, - sdzGaojing1: { - text_offset: [0, -2.9], - icon_x: 0, - icon_y: -69, - billboard_x: 0, - billboard_y: -20, - labelOffset: [158, 49] - }, - sdzGaojing2: { - text_offset: [0, -2.9], - icon_x: 0, - icon_y: -69, - billboard_x: 0, - billboard_y: -20, - labelOffset: [158, 49] - }, - sdzGaojing3: { - text_offset: [0, -2.9], - icon_x: 0, - icon_y: -69, - billboard_x: 0, - billboard_y: -20, - labelOffset: [158, 49] - }, - qixidi: { - text_offset: [0, -2.9], - icon_x: 0, - icon_y: -69, - billboard_x: 0, - billboard_y: -20, - labelOffset: [158, 49] - }, - cezhan: { - text_offset: [0, -2.9], - icon_x: 0, - icon_y: -69, - billboard_x: 0, - billboard_y: -20, - labelOffset: [158, 49] - }, - wushujvlg: { - text_offset: [0, -2.9], - icon_x: 0, - icon_y: -69, - billboard_x: 0, - billboard_y: -20, - labelOffset: [158, 49] - }, - ylfbL: { - text_offset: [-8, -0.3], - icon_x: -180, - icon_y: -5, - billboard_x: -75, - billboard_y: 15, - labelOffset: [158, 49] - }, - ylfbR: { - text_offset: [8.3, -0.3], - icon_x: 170, - icon_y: -5, - billboard_x: 70, - billboard_y: 15, - labelOffset: [158, 49] - }, - yeshengdongwu: { - text_offset: [7.5, -0.3], - icon_x: 170, - icon_y: -5, - billboard_x: 0, - billboard_y: -20, - labelOffset: [116, 46] - }, - 'bg-mapDongwuL': { - text_offset: [-6.8, -0.3], - icon_x: -180, - icon_y: -5, - billboard_x: -75, - billboard_y: 15, - labelOffset: [111, 46] - }, - 'bg-mapDongwuR': { - text_offset: [6.8, -0.3], - icon_x: 170, - icon_y: -5, - billboard_x: 70, - billboard_y: 15, - labelOffset: [161, 46] - } -}; -export const drawDotImg3: any = { - large_eng_built: { left: 'dxsdzYijianL', right: 'dxsdzYijianR' }, - large_eng_ubuilt: { left: 'dxsdzZaijianL', right: 'dxsdzZaijianR' }, - large_eng_nbuilt: { left: 'dxsdzGuihuaL', right: 'dxsdzGuihuaR' }, - mid_eng_built: { left: 'zxsdzYijianL', right: 'zxsdzYijianR' }, - mid_eng_ubuilt: { left: 'zxsdzZaijianL', right: 'zxsdzZaijianR' }, - mid_eng_nbuilt: { left: 'zxsdzGuihuaL', right: 'zxsdzGuihuaR' }, - eef_1_1: { left: 'dxsdzDabiaolv-1', right: 'dxsdzDabiaolv-1' }, - eef_1_2: { left: 'dxsdzDabiaolv-2', right: 'dxsdzDabiaolv-2' }, - eef_1_3: { left: 'dxsdzDabiaolv-3', right: 'dxsdzDabiaolv-3' }, - eef_1_4: { left: 'dxsdzDabiaolv-4', right: 'dxsdzDabiaolv-4' }, - eef_1_none: { left: 'dxsdzDabiaolv-5', right: 'dxsdzDabiaolv-5' }, - eef_2_1: { left: 'zxsdzDabiaolv-1', right: 'zxsdzDabiaolv-1' }, - eef_2_2: { left: 'zxsdzDabiaolv-2', right: 'zxsdzDabiaolv-2' }, - eef_2_3: { left: 'zxsdzDabiaolv-3', right: 'zxsdzDabiaolv-3' }, - eef_2_4: { left: 'zxsdzDabiaolv-4', right: 'zxsdzDabiaolv-4' }, - eef_2_none: { left: 'zxsdzDabiaolv-5', right: 'zxsdzDabiaolv-5' }, - WT_1: { left: 'gyss', right: 'gyss' }, - WT_2: { left: 'gyss', right: 'gyss' }, - wqfb_legend: { left: 'szzDabiao', right: 'szzDabiao' }, - wq_station_3: { left: 'szzDabiao', right: 'szzDabiao' }, - wq_station_4: { left: 'szzBudabiao', right: 'szzBudabiao' }, - wq_station_1: { left: 'szzDabiao', right: 'szzDabiao' }, - wq_station_2: { left: 'szzBudabiao', right: 'szzBudabiao' }, - wq_station_5: { left: 'szzDabiao', right: 'szzDabiao' }, - wq_station_6: { left: 'szzBudabiao', right: 'szzBudabiao' }, - wq_station_7: { left: 'szzWudabiaoshujv', right: 'szzWudabiaoshujv' }, - wq_station_8: { left: 'szzWudabiaoshujv', right: 'szzWudabiaoshujv' }, - wq_station_9: { left: 'szzWudabiaoshujv', right: 'szzWudabiaoshujv' }, - alarm_range_3: { left: 'sdzGaojing3', right: 'sdzGaojing3' }, - alarm_range_2: { left: 'sdzGaojing2', right: 'sdzGaojing2' }, - alarm_range_1: { left: 'sdzGaojing1', right: 'sdzGaojing1' }, - alarm_range_0: { left: 'sdzGaojing0', right: 'sdzGaojing0' }, - WE: { left: 'qixidi', right: 'qixidi' }, - rare_fish: { left: 'qixidi', right: 'qixidi' }, - qxz: { left: 'cezhan', right: 'cezhan' }, - spjk: { left: 'cezhan', right: 'cezhan' }, - fbfm_spjk: { left: 'blueL', right: 'blueR' }, - eqs_spjk: { left: 'blueL', right: 'blueR' }, - wq_spjk: { left: 'blueL', right: 'blueR' }, - fp_spjk: { left: 'blueL', right: 'blueR' }, - fb_spjk: { left: 'blueL', right: 'blueR' }, - fh_spjk: { left: 'blueL', right: 'blueR' }, - va_spjk: { left: 'blueL', right: 'blueR' }, - vp_spjk: { left: 'blueL', right: 'blueR' }, - dw_spjk: { left: 'blueL', right: 'blueR' }, - gjllz: { left: 'cezhan', right: 'cezhan' }, - zjllz: { left: 'cezhan', right: 'cezhan' }, - wt_alarm_1: { left: 'sdzGaojing0', right: 'sdzGaojing0' }, - wt_alarm_2: { left: 'sdzGaojing3', right: 'sdzGaojing3' }, - wt_alarm_0: { left: 'wushujvlg', right: 'wushujvlg' }, - wq_alarm_1: { left: 'sdzGaojing0', right: 'sdzGaojing0' }, - wq_alarm_2: { left: 'sdzGaojing3', right: 'sdzGaojing3' }, - wq_alarm_0: { left: 'wushujvlg', right: 'wushujvlg' }, - rz_alarm_1: { left: 'sdzGaojing0', right: 'sdzGaojing0' }, - rz_alarm_2: { left: 'sdzGaojing3', right: 'sdzGaojing3' }, - rz_alarm_0: { left: 'wushujvlg', right: 'wushujvlg' }, - operat_alarm_1: { left: 'sdzGaojing0', right: 'sdzGaojing0' }, - operat_alarm_2: { left: 'sdzGaojing3', right: 'sdzGaojing3' }, - operat_alarm_0: { left: 'wushujvlg', right: 'wushujvlg' }, - dxsdz_ywc: { left: 'dxsdzDabiaolv-2', right: 'dxsdzDabiaolv-2' }, - dxsdz_wwc: { left: 'sdzGaojing3', right: 'sdzGaojing3' }, - dxsdz_wtb: { left: 'dxsdzDabiaolv-3', right: 'dxsdzDabiaolv-3' }, - zxsdz_ywc: { left: 'zxsdzDabiaolv-2', right: 'zxsdzDabiaolv-2' }, - zxsdz_wwc: { left: 'sdzGaojing3', right: 'sdzGaojing3' }, - zxsdz_wtb: { left: 'zxsdzDabiaolv-3', right: 'zxsdzDabiaolv-3' }, - gy_1: { left: 'gyss', right: 'gyss' }, - gy_2: { left: 'gyss', right: 'gyss' }, - gy_3: { left: 'gyss', right: 'gyss' }, - gy_4: { left: 'gyss', right: 'gyss' }, - gy_5: { left: 'gyss', right: 'gyss' }, - dws_1: { left: 'gyss', right: 'gyss' }, - dws_2: { left: 'gyss', right: 'gyss' }, - dws_3: { left: 'gyss', right: 'gyss' }, - dws_4: { left: 'gyss', right: 'gyss' }, - EQ_7: { left: 'gyss', right: 'gyss' }, - EQ_6: { left: 'gyss', right: 'gyss' }, - EQ_2: { left: 'gyss', right: 'gyss' }, - EQ_3: { left: 'gyss', right: 'gyss' }, - EQ_4: { left: 'gyss', right: 'gyss' }, - EQ_5: { left: 'gyss', right: 'gyss' }, - EQ_1: { left: 'gyss', right: 'gyss' }, - FB: { left: 'gyss', right: 'gyss' }, - VP: { left: 'gyss', right: 'gyss' }, - VA: { left: 'gyss', right: 'gyss' }, - SG: { left: 'gyss', right: 'gyss' }, - FH: { left: 'gyss', right: 'gyss' }, - ylfb: { left: 'gyss', right: 'gyss' }, - fish_along: { left: 'ylfbR', right: 'ylfbR' }, - gy_1_incomplete: { left: 'wushujvlg', right: 'wushujvlg' }, - gy_2_incomplete: { left: 'wushujvlg', right: 'wushujvlg' }, - gy_3_incomplete: { left: 'wushujvlg', right: 'wushujvlg' }, - gy_4_incomplete: { left: 'wushujvlg', right: 'wushujvlg' }, - gy_5_incomplete: { left: 'wushujvlg', right: 'wushujvlg' }, - dws_1_incomplete: { left: 'wushujvlg', right: 'wushujvlg' }, - dws_2_incomplete: { left: 'wushujvlg', right: 'wushujvlg' }, - dws_3_incomplete: { left: 'wushujvlg', right: 'wushujvlg' }, - dws_4_incomplete: { left: 'wushujvlg', right: 'wushujvlg' }, - EQ_6_incomplete: { left: 'wushujvlg', right: 'wushujvlg' }, - EQ_2_incomplete: { left: 'wushujvlg', right: 'wushujvlg' }, - EQ_3_incomplete: { left: 'wushujvlg', right: 'wushujvlg' }, - EQ_4_incomplete: { left: 'wushujvlg', right: 'wushujvlg' }, - EQ_5_incomplete: { left: 'wushujvlg', right: 'wushujvlg' }, - EQ_1_incomplete: { left: 'wushujvlg', right: 'wushujvlg' }, - FB_incomplete: { left: 'wushujvlg', right: 'wushujvlg' }, - VP_incomplete: { left: 'wushujvlg', right: 'wushujvlg' }, - VA_incomplete: { left: 'wushujvlg', right: 'wushujvlg' }, - SG_incomplete: { left: 'wushujvlg', right: 'wushujvlg' }, - large_eng_built_alarm_range_0: { left: 'sdzGaojing0', right: 'sdzGaojing0' }, - mid_eng_built_alarm_range_0: { left: 'sdzGaojing0', right: 'sdzGaojing0' }, - large_eng_built_alarm_range_1: { left: 'sdzGaojing1', right: 'sdzGaojing1' }, - mid_eng_built_alarm_range_1: { left: 'sdzGaojing1', right: 'sdzGaojing1' }, - large_eng_built_alarm_range_2: { left: 'sdzGaojing2', right: 'sdzGaojing2' }, - mid_eng_built_alarm_range_2: { left: 'sdzGaojing2', right: 'sdzGaojing2' }, - large_eng_built_alarm_range_3: { left: 'sdzGaojing3', right: 'sdzGaojing3' }, - mid_eng_built_alarm_range_3: { left: 'sdzGaojing3', right: 'sdzGaojing3' }, - wild_animal_legend: { left: 'yeshengdongwu', right: 'yeshengdongwu' }, - fd_legend: { left: 'gyss', right: 'gyss' }, - stinfo_wtzj_legend: { left: 'gyss', right: 'gyss' }, - fhwt_legend: { left: 'gyss', right: 'gyss' }, - fhwq_legend: { left: 'gyss', right: 'gyss' }, - terrestrial_animals: { left: 'bg-mapDongwuL', right: 'bg-mapDongwuR' } -}; - -export const offset5: any = { - dxsdzYijianL: { - text_offset: [-0.7, 0.3], - text_offset2: [-1.0, 0.3], - icon_x: -130, - icon_y: -5, - billboard_x: -57, - billboard_y: 15, - labelOffset: [140, 30] - }, - dxsdzZaijianL: { - text_offset: [-0.7, 0.3], - text_offset2: [-1.0, 0.3], - icon_x: -130, - icon_y: -5, - billboard_x: -57, - billboard_y: 15, - labelOffset: [140, 30] - }, - dxsdzGuihuaL: { - text_offset: [-0.7, 0.3], - text_offset2: [-1.0, 0.3], - icon_x: -130, - icon_y: -5, - billboard_x: -57, - billboard_y: 15, - labelOffset: [140, 30] - }, - zxsdzYijianL: { - text_offset: [-0.7, 0.3], - text_offset2: [-1.0, 0.3], - icon_x: -130, - icon_y: -5, - billboard_x: -57, - billboard_y: 15, - labelOffset: [140, 30] - }, - zxsdzZaijianL: { - text_offset: [-0.7, 0.3], - text_offset2: [-1.0, 0.3], - icon_x: -130, - icon_y: -5, - billboard_x: -57, - billboard_y: 15, - labelOffset: [140, 30] - }, - zxsdzGuihuaL: { - text_offset: [-0.7, 0.3], - text_offset2: [-1.0, 0.3], - icon_x: -130, - icon_y: -5, - billboard_x: -57, - billboard_y: 15, - labelOffset: [140, 30] - }, - - dxsdzYijianR: { - text_offset: [0.7, -0.5], - text_offset2: [1.0, -0.5], - icon_x: 130, - icon_y: -5, - billboard_x: 57, - billboard_y: 8, - labelOffset: [70, 30] - }, - dxsdzZaijianR: { - text_offset: [0.7, -0.5], - text_offset2: [1.0, -0.5], - icon_x: 130, - icon_y: -5, - billboard_x: 57, - billboard_y: 8, - labelOffset: [70, 30] - }, - dxsdzGuihuaR: { - text_offset: [0.7, -0.5], - text_offset2: [1.0, -0.5], - icon_x: 130, - icon_y: -5, - billboard_x: 57, - billboard_y: 8, - labelOffset: [70, 30] - }, - zxsdzYijianR: { - text_offset: [0.7, -0.5], - text_offset2: [1.0, -0.5], - icon_x: 130, - icon_y: -5, - billboard_x: 57, - billboard_y: 8, - labelOffset: [70, 30] - }, - zxsdzZaijianR: { - text_offset: [0.7, -0.5], - text_offset2: [1.0, -0.5], - icon_x: 130, - icon_y: -5, - billboard_x: 57, - billboard_y: 8, - labelOffset: [70, 30] - }, - zxsdzGuihuaR: { - text_offset: [0.7, -0.5], - text_offset2: [1.0, -0.5], - icon_x: 130, - icon_y: -5, - billboard_x: 57, - billboard_y: 8, - labelOffset: [70, 30] - }, - - 'dxsdzDabiaolv-1': { - text_offset: [0, -2.9], - icon_x: 0, - icon_y: -69, - billboard_x: 0, - billboard_y: -20, - labelOffset: [138, 30] - }, - 'dxsdzDabiaolv-2': { - text_offset: [0, -2.9], - icon_x: 0, - icon_y: -69, - billboard_x: 0, - billboard_y: -20, - labelOffset: [138, 30] - }, - 'dxsdzDabiaolv-3': { - text_offset: [0, -2.9], - icon_x: 0, - icon_y: -69, - billboard_x: 0, - billboard_y: -20, - labelOffset: [138, 30] - }, - 'dxsdzDabiaolv-4': { - text_offset: [0, -2.9], - icon_x: 0, - icon_y: -69, - billboard_x: 0, - billboard_y: -20, - labelOffset: [138, 30] - }, - 'dxsdzDabiaolv-5': { - text_offset: [0, -2.9], - icon_x: 0, - icon_y: -69, - billboard_x: 0, - billboard_y: -20, - labelOffset: [138, 30] - }, - 'zxsdzDabiaolv-1': { - text_offset: [0, -2.9], - icon_x: 0, - icon_y: -69, - billboard_x: 0, - billboard_y: -20, - labelOffset: [138, 30] - }, - 'zxsdzDabiaolv-2': { - text_offset: [0, -2.9], - icon_x: 0, - icon_y: -69, - billboard_x: 0, - billboard_y: -20, - labelOffset: [138, 30] - }, - 'zxsdzDabiaolv-3': { - text_offset: [0, -2.9], - icon_x: 0, - icon_y: -69, - billboard_x: 0, - billboard_y: -20, - labelOffset: [138, 30] - }, - 'zxsdzDabiaolv-4': { - text_offset: [0, -2.9], - icon_x: 0, - icon_y: -69, - billboard_x: 0, - billboard_y: -20, - labelOffset: [138, 30] - }, - 'zxsdzDabiaolv-5': { - text_offset: [0, -2.9], - icon_x: 0, - icon_y: -69, - billboard_x: 0, - billboard_y: -20, - labelOffset: [138, 30] - }, - gyss: { - text_offset: [0, -2.9], - icon_x: 0, - icon_y: -69, - billboard_x: 0, - billboard_y: -20, - labelOffset: [176, 43] - }, - szzDabiao: { - text_offset: [0, -2.9], - icon_x: 0, - icon_y: -69, - billboard_x: 0, - billboard_y: -20, - labelOffset: [158, 49] - }, - szzBudabiao: { - text_offset: [0, -2.9], - icon_x: 0, - icon_y: -69, - billboard_x: 0, - billboard_y: -20, - labelOffset: [158, 49] - }, - szzWudabiaoshujv: { - text_offset: [0, -2.9], - icon_x: 0, - icon_y: -69, - billboard_x: 0, - billboard_y: -20, - labelOffset: [158, 49] - }, - sdzGaojing0: { - text_offset: [0, -2.9], - icon_x: 0, - icon_y: -69, - billboard_x: 0, - billboard_y: -20, - labelOffset: [158, 49] - }, - sdzGaojing1: { - text_offset: [0, -2.9], - icon_x: 0, - icon_y: -69, - billboard_x: 0, - billboard_y: -20, - labelOffset: [158, 49] - }, - sdzGaojing2: { - text_offset: [0, -2.9], - icon_x: 0, - icon_y: -69, - billboard_x: 0, - billboard_y: -20, - labelOffset: [158, 49] - }, - sdzGaojing3: { - text_offset: [0, -2.9], - icon_x: 0, - icon_y: -69, - billboard_x: 0, - billboard_y: -20, - labelOffset: [158, 49] - }, - qixidi: { - text_offset: [0, -2.9], - icon_x: 0, - icon_y: -69, - billboard_x: 0, - billboard_y: -20, - labelOffset: [158, 49] - }, - cezhan: { - text_offset: [0, -2.9], - icon_x: 0, - icon_y: -69, - billboard_x: 0, - billboard_y: -20, - labelOffset: [158, 49] - }, - wushujvlg: { - text_offset: [0, -2.9], - icon_x: 0, - icon_y: -69, - billboard_x: 0, - billboard_y: -20, - labelOffset: [158, 49] - }, - ylfbL: { - text_offset: [-8, -0.3], - icon_x: -180, - icon_y: -5, - billboard_x: -75, - billboard_y: 15, - labelOffset: [158, 49] - }, - ylfbR: { - text_offset: [8.3, -0.3], - icon_x: 170, - icon_y: -5, - billboard_x: 70, - billboard_y: 15, - labelOffset: [158, 49] - }, - yeshengdongwu: { - text_offset: [7.5, -0.3], - icon_x: 170, - icon_y: -5, - billboard_x: 0, - billboard_y: -20, - labelOffset: [116, 46] - }, - 'bg-mapDongwuL': { - text_offset: [-6.8, -0.3], - icon_x: -180, - icon_y: -5, - billboard_x: -75, - billboard_y: 15, - labelOffset: [111, 46] - }, - 'bg-mapDongwuR': { - text_offset: [6.8, -0.3], - icon_x: 170, - icon_y: -5, - billboard_x: 70, - billboard_y: 15, - labelOffset: [161, 46] - }, - dabiaoL: { - text_offset: [-2.6, -0.9], - text_offset2: [-3.2, -0.9], - icon_offset2: [-60, -20], - icon_x: -44, - icon_y: -20, - billboard_x: -6, - billboard_y: -16, - labelOffset: [60, 16] - }, - dabiaoR: { - text_offset: [2.6, -0.9], - text_offset2: [3.2, -0.9], - icon_offset2: [60, -20], - icon_x: 44, - icon_y: -20, - billboard_x: 6, - billboard_y: -16, - labelOffset: [60, 16] - }, - budabiaoL: { - text_offset: [-2.6, -0.9], - text_offset2: [-3.2, -0.9], - icon_offset2: [-60, -20], - icon_x: -44, - icon_y: -20, - billboard_x: -6, - billboard_y: -16, - labelOffset: [60, 16] - }, - budabiaoR: { - text_offset: [2.6, -0.9], - text_offset2: [3.2, -0.9], - icon_offset2: [60, -20], - icon_x: 44, - icon_y: -20, - billboard_x: 6, - billboard_y: -16, - labelOffset: [60, 16] - }, - wushujvL: { - text_offset: [-2.6, -0.9], - text_offset2: [-3.2, -0.9], - icon_offset2: [-60, -20], - icon_x: -44, - icon_y: -20, - billboard_x: -6, - billboard_y: -16, - labelOffset: [60, 16] - }, - wushujvR: { - text_offset: [2.6, -0.9], - text_offset2: [3.2, -0.9], - icon_offset2: [60, -20], - icon_x: 44, - icon_y: -20, - billboard_x: 6, - billboard_y: -16, - labelOffset: [60, 16] - }, - greenL: { - text_offset: [-2.6, -0.9], - text_offset2: [-3.2, -0.9], - icon_offset2: [-60, -20], - icon_x: -44, - icon_y: -20, - billboard_x: -6, - billboard_y: -18, - labelOffset: [60, 16] - }, - greenR: { - text_offset: [2.6, -0.9], - text_offset2: [3.2, -0.9], - icon_offset2: [60, -20], - icon_x: 44, - icon_y: -20, - billboard_x: 6, - billboard_y: -18, - labelOffset: [60, 16] - }, - blueL: { - text_offset: [-2.6, -0.9], - text_offset2: [-3.2, -0.9], - icon_offset2: [-60, -20], - icon_x: -44, - icon_y: -20, - billboard_x: -6, - billboard_y: -16, - labelOffset: [60, 16] - }, - blueR: { - text_offset: [2.6, -0.9], - text_offset2: [3.2, -0.9], - icon_offset2: [60, -20], - icon_x: 44, - icon_y: -20, - billboard_x: 6, - billboard_y: -16, - labelOffset: [60, 16] - } -}; - -export const drawDotImg5: any = { - large_eng_built: { left: 'dxsdzYijianL', right: 'dxsdzYijianR' }, - large_eng_ubuilt: { left: 'dxsdzZaijianL', right: 'dxsdzZaijianR' }, - large_eng_nbuilt: { left: 'dxsdzGuihuaL', right: 'dxsdzGuihuaR' }, - mid_eng_built: { left: 'zxsdzYijianL', right: 'zxsdzYijianR' }, - mid_eng_ubuilt: { left: 'zxsdzZaijianL', right: 'zxsdzZaijianR' }, - mid_eng_nbuilt: { left: 'zxsdzGuihuaL', right: 'zxsdzGuihuaR' }, - eef_1_1: { left: 'dxsdzDabiaolv-1', right: 'dxsdzDabiaolv-1' }, - eef_1_2: { left: 'dxsdzDabiaolv-2', right: 'dxsdzDabiaolv-2' }, - eef_1_3: { left: 'dxsdzDabiaolv-3', right: 'dxsdzDabiaolv-3' }, - eef_1_4: { left: 'dxsdzDabiaolv-4', right: 'dxsdzDabiaolv-4' }, - eef_1_none: { left: 'dxsdzDabiaolv-5', right: 'dxsdzDabiaolv-5' }, - eef_2_1: { left: 'zxsdzDabiaolv-1', right: 'zxsdzDabiaolv-1' }, - eef_2_2: { left: 'zxsdzDabiaolv-2', right: 'zxsdzDabiaolv-2' }, - eef_2_3: { left: 'zxsdzDabiaolv-3', right: 'zxsdzDabiaolv-3' }, - eef_2_4: { left: 'zxsdzDabiaolv-4', right: 'zxsdzDabiaolv-4' }, - eef_2_none: { left: 'zxsdzDabiaolv-5', right: 'zxsdzDabiaolv-5' }, - WT_1: { left: 'greenL', right: 'greenR' }, - WT_2: { left: 'greenL', right: 'greenR' }, - wqfb_legend: { left: 'dabiaoL', right: 'dabiaoR' }, - wq_station_3: { left: 'dabiaoL', right: 'dabiaoR' }, - wq_station_4: { left: 'budabiaoL', right: 'budabiaoR' }, - wq_station_1: { left: 'dabiaoL', right: 'dabiaoR' }, - wq_station_2: { left: 'budabiaoL', right: 'budabiaoR' }, - wq_station_5: { left: 'dabiaoL', right: 'dabiaoR' }, - wq_station_6: { left: 'budabiaoL', right: 'budabiaoR' }, - wq_station_7: { left: 'wushujvL', right: 'wushujvR' }, - wq_station_8: { left: 'wushujvL', right: 'wushujvR' }, - wq_station_9: { left: 'wushujvL', right: 'wushujvR' }, - alarm_range_3: { left: 'sdzGaojing3', right: 'sdzGaojing3' }, - alarm_range_2: { left: 'sdzGaojing2', right: 'sdzGaojing2' }, - alarm_range_1: { left: 'sdzGaojing1', right: 'sdzGaojing1' }, - alarm_range_0: { left: 'sdzGaojing0', right: 'sdzGaojing0' }, - WE: { left: 'greenL', right: 'greenR' }, - rare_fish: { left: 'greenL', right: 'greenR' }, - qxz: { left: 'blueL', right: 'blueR' }, - spjk: { left: 'blueL', right: 'blueR' }, - gjllz: { left: 'blueL', right: 'blueR' }, - zjllz: { left: 'blueL', right: 'blueR' }, - fbfm_spjk: { left: 'blueL', right: 'blueR' }, - eqs_spjk: { left: 'blueL', right: 'blueR' }, - wq_spjk: { left: 'blueL', right: 'blueR' }, - fp_spjk: { left: 'blueL', right: 'blueR' }, - fb_spjk: { left: 'blueL', right: 'blueR' }, - fh_spjk: { left: 'blueL', right: 'blueR' }, - va_spjk: { left: 'blueL', right: 'blueR' }, - vp_spjk: { left: 'blueL', right: 'blueR' }, - dw_spjk: { left: 'blueL', right: 'blueR' }, - wt_alarm_1: { left: 'sdzGaojing0', right: 'sdzGaojing0' }, - wt_alarm_2: { left: 'sdzGaojing3', right: 'sdzGaojing3' }, - wt_alarm_0: { left: 'wushujvlg', right: 'wushujvlg' }, - wq_alarm_1: { left: 'sdzGaojing0', right: 'sdzGaojing0' }, - wq_alarm_2: { left: 'sdzGaojing3', right: 'sdzGaojing3' }, - wq_alarm_0: { left: 'wushujvlg', right: 'wushujvlg' }, - rz_alarm_1: { left: 'sdzGaojing0', right: 'sdzGaojing0' }, - rz_alarm_2: { left: 'sdzGaojing3', right: 'sdzGaojing3' }, - rz_alarm_0: { left: 'wushujvlg', right: 'wushujvlg' }, - operat_alarm_1: { left: 'sdzGaojing0', right: 'sdzGaojing0' }, - operat_alarm_2: { left: 'sdzGaojing3', right: 'sdzGaojing3' }, - operat_alarm_0: { left: 'wushujvlg', right: 'wushujvlg' }, - dxsdz_ywc: { left: 'dxsdzDabiaolv-2', right: 'dxsdzDabiaolv-2' }, - dxsdz_wwc: { left: 'sdzGaojing3', right: 'sdzGaojing3' }, - dxsdz_wtb: { left: 'dxsdzDabiaolv-3', right: 'dxsdzDabiaolv-3' }, - zxsdz_ywc: { left: 'zxsdzDabiaolv-2', right: 'zxsdzDabiaolv-2' }, - zxsdz_wwc: { left: 'sdzGaojing3', right: 'sdzGaojing3' }, - zxsdz_wtb: { left: 'zxsdzDabiaolv-3', right: 'zxsdzDabiaolv-3' }, - gy_1: { left: 'greenL', right: 'greenR' }, - gy_2: { left: 'greenL', right: 'greenR' }, - gy_3: { left: 'greenL', right: 'greenR' }, - gy_4: { left: 'greenL', right: 'greenR' }, - gy_5: { left: 'greenL', right: 'greenR' }, - dws_1: { left: 'greenL', right: 'greenR' }, - dws_2: { left: 'greenL', right: 'greenR' }, - dws_3: { left: 'greenL', right: 'greenR' }, - dws_4: { left: 'greenL', right: 'greenR' }, - EQ_7: { left: 'greenL', right: 'greenR' }, - EQ_6: { left: 'greenL', right: 'greenR' }, - EQ_2: { left: 'greenL', right: 'greenR' }, - EQ_3: { left: 'greenL', right: 'greenR' }, - EQ_4: { left: 'greenL', right: 'greenR' }, - EQ_5: { left: 'greenL', right: 'greenR' }, - EQ_1: { left: 'greenL', right: 'greenR' }, - FB: { left: 'greenL', right: 'greenR' }, - VP: { left: 'greenL', right: 'greenR' }, - VA: { left: 'greenL', right: 'greenR' }, - SG: { left: 'greenL', right: 'greenR' }, - FH: { left: 'greenL', right: 'greenR' }, - ylfb: { left: 'greenL', right: 'greenR' }, - fish_along: { left: 'greenL', right: 'greenR' }, - gy_1_incomplete: { left: 'wushujvlg', right: 'wushujvlg' }, - gy_2_incomplete: { left: 'wushujvlg', right: 'wushujvlg' }, - gy_3_incomplete: { left: 'wushujvlg', right: 'wushujvlg' }, - gy_4_incomplete: { left: 'wushujvlg', right: 'wushujvlg' }, - gy_5_incomplete: { left: 'wushujvlg', right: 'wushujvlg' }, - dws_1_incomplete: { left: 'wushujvlg', right: 'wushujvlg' }, - dws_2_incomplete: { left: 'wushujvlg', right: 'wushujvlg' }, - dws_3_incomplete: { left: 'wushujvlg', right: 'wushujvlg' }, - dws_4_incomplete: { left: 'wushujvlg', right: 'wushujvlg' }, - EQ_6_incomplete: { left: 'wushujvlg', right: 'wushujvlg' }, - EQ_2_incomplete: { left: 'wushujvlg', right: 'wushujvlg' }, - EQ_3_incomplete: { left: 'wushujvlg', right: 'wushujvlg' }, - EQ_4_incomplete: { left: 'wushujvlg', right: 'wushujvlg' }, - EQ_5_incomplete: { left: 'wushujvlg', right: 'wushujvlg' }, - EQ_1_incomplete: { left: 'wushujvlg', right: 'wushujvlg' }, - FB_incomplete: { left: 'wushujvlg', right: 'wushujvlg' }, - VP_incomplete: { left: 'wushujvlg', right: 'wushujvlg' }, - VA_incomplete: { left: 'wushujvlg', right: 'wushujvlg' }, - SG_incomplete: { left: 'wushujvlg', right: 'wushujvlg' }, - large_eng_built_alarm_range_0: { left: 'sdzGaojing0', right: 'sdzGaojing0' }, - mid_eng_built_alarm_range_0: { left: 'sdzGaojing0', right: 'sdzGaojing0' }, - large_eng_built_alarm_range_1: { left: 'sdzGaojing1', right: 'sdzGaojing1' }, - mid_eng_built_alarm_range_1: { left: 'sdzGaojing1', right: 'sdzGaojing1' }, - large_eng_built_alarm_range_2: { left: 'sdzGaojing2', right: 'sdzGaojing2' }, - mid_eng_built_alarm_range_2: { left: 'sdzGaojing2', right: 'sdzGaojing2' }, - large_eng_built_alarm_range_3: { left: 'sdzGaojing3', right: 'sdzGaojing3' }, - mid_eng_built_alarm_range_3: { left: 'sdzGaojing3', right: 'sdzGaojing3' }, - wild_animal_legend: { left: 'greenL', right: 'greenR' }, - fd_legend: { left: 'greenL', right: 'greenR' }, - stinfo_wtzj_legend: { left: 'greenL', right: 'greenR' }, - fhwt_legend: { left: 'greenL', right: 'greenR' }, - fhwq_legend: { left: 'greenL', right: 'greenR' }, - terrestrial_animals: { left: 'greenL', right: 'greenR' } -}; - -export const level_Altitude: any = { - '0': 91189921, - '1': 45454474, - '2': 22657211, - '3': 11293700, - '4': 5629451, - '5': 2806053, - '6': 1398704, - '7': 697197, - '8': 347524, - '9': 173227, - '10': 86347, - '11': 43040, - '12': 21454, - '13': 10694, - '14': 5330, - '15': 2657, - '16': 1324, - '17': 660, - '18': 329, - '19': 164, - '20': 82, - '21': 41, - '22': 20, - '23': 10, - '24': 5 -}; -export const anchoToIconCode: any = { - large_eng_built: 'map-dxsdzYijian', - large_eng_ubuilt: 'map-dxsdzZaijian', - large_eng_nbuilt: 'map-dxsdzGuihua', - mid_eng_built: 'map-zxsdzYijian', - mid_eng_ubuilt: 'map-zxsdzZaijian', - mid_eng_nbuilt: 'map-zxsdzGuihua' -}; diff --git a/frontend-sjgl/src/views/conventionalHydropower/tempMit/EditDwModal.vue b/frontend-sjgl/src/views/conventionalHydropower/tempMit/EditDwModal.vue index 1671f1d2..2989ca10 100644 --- a/frontend-sjgl/src/views/conventionalHydropower/tempMit/EditDwModal.vue +++ b/frontend-sjgl/src/views/conventionalHydropower/tempMit/EditDwModal.vue @@ -174,7 +174,7 @@ /> - + -
- - - - - - - - - - -
- -
-
- - 监控列表 -
-
- - - - - - - - - - - - - - -
-
- - -
- -
- -
- - 实时视频 - 录像 - -
- - - - - -
- - -
- -
- - - - - -
-
-
- - -
-
-
- -
-
-
- - -
-
- 回放列表 -
- -
- -
- - -
- - -
- -
- - -
-
-
- -
-
- -
- - -
-
{{ item.name }}
-
- {{ dayjs(item.time).format('YYYY-MM-DD HH') }} -
-
-
-
-
-
-
-
-
-
-
- - - - - diff --git a/frontend-sjgl/vite.config.ts b/frontend-sjgl/vite.config.ts index 7747e529..79186866 100644 --- a/frontend-sjgl/vite.config.ts +++ b/frontend-sjgl/vite.config.ts @@ -2,7 +2,6 @@ import { UserConfig, ConfigEnv, loadEnv } from 'vite'; import vue from '@vitejs/plugin-vue'; import { createSvgIconsPlugin } from 'vite-plugin-svg-icons'; import path from 'path'; -import cesium from 'vite-plugin-cesium'; export default ({ mode }: ConfigEnv): UserConfig => { // 获取 .env 环境配置文件 @@ -11,7 +10,6 @@ export default ({ mode }: ConfigEnv): UserConfig => { return { plugins: [ vue(), - cesium(), createSvgIconsPlugin({ // 指定需要缓存的图标文件夹 iconDirs: [path.resolve(process.cwd(), 'src/assets/icons')], @@ -122,7 +120,6 @@ export default ({ mode }: ConfigEnv): UserConfig => { if (id.includes('element-plus')) return 'element-plus'; if (id.includes('ant-design-vue')) return 'ant-design-vue'; if (id.includes('lodash')) return 'lodash'; - if (id.includes('cesium')) return 'cesium'; // 其他 node_modules 归为 vendor return 'vendor'; } diff --git a/frontend/src/api/DataQueryMenuModule/index.ts b/frontend/src/api/DataQueryMenuModule/index.ts index 57c0c5b1..1a5fabd0 100644 --- a/frontend/src/api/DataQueryMenuModule/index.ts +++ b/frontend/src/api/DataQueryMenuModule/index.ts @@ -326,3 +326,156 @@ export function deleteFlowStationInfo(data) { data }); } +// 水温监测 - 分页列表 +export function getWtPageList(data) { + return request({ + url: '/base/wt/page', + method: 'post', + data + }); +} +// 水质监测 - 分页列表 +export function getWqPageList(data) { + return request({ + url: '/base/wq/page', + method: 'post', + data + }); +} +// 生态流量 - 分页列表 +export function getEqPageList(data) { + return request({ + url: '/base/eq/page', + method: 'post', + data + }); +} +// 低温水减缓设施 - 分页列表 +export function getDwPageList(data) { + return request({ + url: '/base/dw/page', + method: 'post', + data + }); +} +// 栖息地 - 分页列表 +export function getFhPageList(data) { + return request({ + url: '/base/fhbt/page', + method: 'post', + data + }); +} +// 珍稀植物园 - 分页列表 +export function getVpPageList(data) { + return request({ + url: '/base/vp/page', + method: 'post', + data + }); +} +// 动物救助站 - 分页列表 +export function getVaPageList(data) { + return request({ + url: '/base/va/page', + method: 'post', + data + }); +} +// 过鱼设施 - 分页列表 +export function getFpPageList(data) { + return request({ + url: '/env/fpss/page', + method: 'post', + data + }); +} +// 水生生态 - 分页列表 +export function getWePageList(data) { + return request({ + url: '/base/we/page', + method: 'post', + data + }); +} +// 鱼类调查 - 分页列表 +export function getAiPageList(data) { + return request({ + url: '/base/aimonitor/page', + method: 'post', + data + }); +} +// 智能告警 - 分页列表 +export function getWarnPageList(data) { + return request({ + url: '/base/warnRule/page', + method: 'post', + data + }); +} +// AI边缘计算盒子 - 分页列表 +export function getAiboxPageList(data) { + return request({ + url: '/base/aibox/page', + method: 'post', + data + }); +} +// 人工产卵场 - 分页列表 +export function getSgPageList(data) { + return request({ + url: '/base/artsg/page', + method: 'post', + data + }); +} +// 其他水生生态保护 - 分页列表 +export function getOtwePageList(data) { + return request({ + url: '/base/otwe/page', + method: 'post', + data + }); +} +// 陆生生态 - 分页列表 +export function getTePageList(data) { + return request({ + url: '/base/te/page', + method: 'post', + data + }); +} + +// 其他陆生生态保护 - 分页列表 +export function getOttePageList(data) { + return request({ + url: '/base/otte/page', + method: 'post', + data + }); +} +// 视频监控 - 分页列表 +export function getVdPageList(data) { + return request({ + url: '/base/vdinfo/page', + method: 'post', + data + }); +} +// 鱼类增殖站 - 分页列表 +export function getFbPageList(data) { + return request({ + url: '/base/fbrd/page', + method: 'post', + data + }); +} +// 声呐及水下摄像头 - 分页列表 +export function getSonarPageList(data) { + return request({ + url: '/base/sonar/page', + method: 'post', + data + }); +} \ No newline at end of file diff --git a/frontend/src/components/BasicTable/index.vue b/frontend/src/components/BasicTable/index.vue index 59384bc2..9148e7cf 100644 --- a/frontend/src/components/BasicTable/index.vue +++ b/frontend/src/components/BasicTable/index.vue @@ -668,7 +668,19 @@ const enhancedColumns = computed(() => { title: String(text) }, { - default: () => String(text) + default: () => h( + 'span', + { + style: { + display: 'inline-block', + maxWidth: '100%', + overflow: 'hidden', + textOverflow: 'ellipsis', + whiteSpace: 'nowrap' + } + }, + String(text) + ) } ) ); diff --git a/frontend/src/modules/shuidianhuangjingjieruMod/DataTable.vue b/frontend/src/modules/shuidianhuangjingjieruMod/DataTable.vue index f0513a14..96871189 100644 --- a/frontend/src/modules/shuidianhuangjingjieruMod/DataTable.vue +++ b/frontend/src/modules/shuidianhuangjingjieruMod/DataTable.vue @@ -36,7 +36,6 @@ defineOptions({ const emit = defineEmits<{ (e: 'row-click', record: any): void; }>(); - const JidiSelectEventStore = useJidiSelectEventStore(); const baseid = ref(''); const dataLoading = ref(false); @@ -169,7 +168,6 @@ const getData = async () => { }; }); }); - const result = { total: 0, buildinstall: 0, ubuildinstall: 0, nbuildinstall: 0 }; list.forEach((e: any) => { result.total += Number(e.total) * 100; @@ -180,16 +178,15 @@ const getData = async () => { const { total, nbuildinstall, ubuildinstall, buildinstall } = newList[e.key]; newList[e.key] = { ...e, - total: Number(total) + Number(e.total), - nbuildinstall: Number(nbuildinstall) + Number(e.nbuildinstall), - ubuildinstall: Number(ubuildinstall) + Number(e.ubuildinstall), - buildinstall: Number(buildinstall) + Number(e.buildinstall) + total: (Number(total) + Number(e.total)).toFixed(2), + nbuildinstall: (Number(nbuildinstall) + Number(e.nbuildinstall)).toFixed(2), + ubuildinstall: (Number(ubuildinstall) + Number(e.ubuildinstall)).toFixed(2), + buildinstall: (Number(buildinstall) + Number(e.buildinstall)).toFixed(2) }; } else { newList[e.key] = e; } }); - const { total, buildinstall, ubuildinstall, nbuildinstall } = result; const arr: any[] = keyList.map((key) => newList[key]); tableData.value = [ @@ -202,6 +199,7 @@ const getData = async () => { nbuildinstall: (nbuildinstall / 100)?.toFixed(2) } ]; + } else { tableData.value = []; } diff --git a/frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/Approval/index.vue b/frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/Approval/index.vue index 81d45c7c..392ce217 100644 --- a/frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/Approval/index.vue +++ b/frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/Approval/index.vue @@ -342,7 +342,7 @@ const openUrl = (url:string)=>{ } onMounted(() => { nextTick(() => { - tableScrollY.value = calcTableScrollY(); + tableScrollY.value = calcTableScrollY(tableRef.value); }); }); diff --git a/frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/BasicData/index.vue b/frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/BasicData/index.vue index c46c1e56..c5dd014a 100644 --- a/frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/BasicData/index.vue +++ b/frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/BasicData/index.vue @@ -27,25 +27,6 @@ }" :list-url="getPowerTableList" > - @@ -281,7 +262,7 @@ const exportBtn = () => { const customFilterBtn = () => { customColumnVisible.value = true; // 打开弹窗前刷新列配置数据 - fetchColumnConfig(); + // fetchColumnConfig(); }; // 确认自定义列选择 @@ -501,24 +482,12 @@ const fetchColumnConfig = () => { }); // 添加操作列 - cols.push({ - key: 'action', - title: '操作', - dataIndex: 'action', - fixed: 'right', - width: isEdit.value ? 180 : 100 - }); + columns.value = cols; }).catch(() => { // API 失败时,至少显示操作列 - columns.value = [{ - key: 'action', - title: '操作', - dataIndex: 'action', - fixed: 'right', - width: isEdit.value ? 180 : 100 - }]; + }).finally(() => { columnLoaded.value = true; // 等待表格渲染完成后再请求数据 @@ -531,7 +500,7 @@ onMounted(() => { init(); fetchColumnConfig(); nextTick(() => { - tableScrollY.value = calcTableScrollY(); + tableScrollY.value = calcTableScrollY(tableRef.value); }); }); diff --git a/frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/aiBox/AiBoxSearch.vue b/frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/aiBox/AiBoxSearch.vue new file mode 100644 index 00000000..c3757777 --- /dev/null +++ b/frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/aiBox/AiBoxSearch.vue @@ -0,0 +1,77 @@ + + + diff --git a/frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/aiBox/index.vue b/frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/aiBox/index.vue new file mode 100644 index 00000000..895d7435 --- /dev/null +++ b/frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/aiBox/index.vue @@ -0,0 +1,214 @@ + + + + + diff --git a/frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/aquaEco/OtweSearch.vue b/frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/aquaEco/OtweSearch.vue new file mode 100644 index 00000000..2e155d52 --- /dev/null +++ b/frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/aquaEco/OtweSearch.vue @@ -0,0 +1,118 @@ + + + diff --git a/frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/aquaEco/index.vue b/frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/aquaEco/index.vue new file mode 100644 index 00000000..f94b060f --- /dev/null +++ b/frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/aquaEco/index.vue @@ -0,0 +1,203 @@ + + + + + diff --git a/frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/fishSurvey/FishSearch.vue b/frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/fishSurvey/FishSearch.vue new file mode 100644 index 00000000..b14f2ecd --- /dev/null +++ b/frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/fishSurvey/FishSearch.vue @@ -0,0 +1,117 @@ + + + diff --git a/frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/fishSurvey/index.vue b/frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/fishSurvey/index.vue new file mode 100644 index 00000000..efc6499d --- /dev/null +++ b/frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/fishSurvey/index.vue @@ -0,0 +1,222 @@ + + + + + diff --git a/frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/guoYuSheShi/FpSearch.vue b/frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/guoYuSheShi/FpSearch.vue new file mode 100644 index 00000000..e1c2aa3a --- /dev/null +++ b/frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/guoYuSheShi/FpSearch.vue @@ -0,0 +1,40 @@ + + + diff --git a/frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/guoYuSheShi/index.vue b/frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/guoYuSheShi/index.vue new file mode 100644 index 00000000..36acf66c --- /dev/null +++ b/frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/guoYuSheShi/index.vue @@ -0,0 +1,219 @@ + + + + + diff --git a/frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/luShengShengTaiDiaoCha/TeSearch.vue b/frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/luShengShengTaiDiaoCha/TeSearch.vue new file mode 100644 index 00000000..224e1502 --- /dev/null +++ b/frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/luShengShengTaiDiaoCha/TeSearch.vue @@ -0,0 +1,117 @@ + + + diff --git a/frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/luShengShengTaiDiaoCha/index.vue b/frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/luShengShengTaiDiaoCha/index.vue new file mode 100644 index 00000000..d4bf1a5e --- /dev/null +++ b/frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/luShengShengTaiDiaoCha/index.vue @@ -0,0 +1,186 @@ + + + + + diff --git a/frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/photoBase/PhotoSearch.vue b/frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/photoBase/PhotoSearch.vue new file mode 100644 index 00000000..e047e3a3 --- /dev/null +++ b/frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/photoBase/PhotoSearch.vue @@ -0,0 +1,121 @@ + diff --git a/frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/photoBase/index.vue b/frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/photoBase/index.vue new file mode 100644 index 00000000..1a551ea1 --- /dev/null +++ b/frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/photoBase/index.vue @@ -0,0 +1,275 @@ + diff --git a/frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/qiXiDi/FhSearch.vue b/frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/qiXiDi/FhSearch.vue new file mode 100644 index 00000000..8b55b732 --- /dev/null +++ b/frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/qiXiDi/FhSearch.vue @@ -0,0 +1,80 @@ + + + diff --git a/frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/qiXiDi/index.vue b/frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/qiXiDi/index.vue new file mode 100644 index 00000000..fd6c9907 --- /dev/null +++ b/frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/qiXiDi/index.vue @@ -0,0 +1,74 @@ + + + + + diff --git a/frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/rescueStation/VaSearch.vue b/frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/rescueStation/VaSearch.vue new file mode 100644 index 00000000..91f8de1e --- /dev/null +++ b/frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/rescueStation/VaSearch.vue @@ -0,0 +1,118 @@ + + + diff --git a/frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/rescueStation/index.vue b/frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/rescueStation/index.vue new file mode 100644 index 00000000..969ceb4c --- /dev/null +++ b/frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/rescueStation/index.vue @@ -0,0 +1,185 @@ + + + diff --git a/frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/shengTaiLiuLiang/EqSearch.vue b/frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/shengTaiLiuLiang/EqSearch.vue new file mode 100644 index 00000000..c01e64cf --- /dev/null +++ b/frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/shengTaiLiuLiang/EqSearch.vue @@ -0,0 +1,42 @@ + + + diff --git a/frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/shengTaiLiuLiang/index.vue b/frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/shengTaiLiuLiang/index.vue new file mode 100644 index 00000000..9267de91 --- /dev/null +++ b/frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/shengTaiLiuLiang/index.vue @@ -0,0 +1,201 @@ + + + + + diff --git a/frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/shiPinJianKong/VdSearch.vue b/frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/shiPinJianKong/VdSearch.vue new file mode 100644 index 00000000..3c544bc1 --- /dev/null +++ b/frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/shiPinJianKong/VdSearch.vue @@ -0,0 +1,40 @@ + + + diff --git a/frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/shiPinJianKong/index.vue b/frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/shiPinJianKong/index.vue new file mode 100644 index 00000000..69ce1feb --- /dev/null +++ b/frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/shiPinJianKong/index.vue @@ -0,0 +1,165 @@ + + + + + diff --git a/frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/shuiShengShengTaiDiaoCha/WeSearch.vue b/frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/shuiShengShengTaiDiaoCha/WeSearch.vue new file mode 100644 index 00000000..79435617 --- /dev/null +++ b/frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/shuiShengShengTaiDiaoCha/WeSearch.vue @@ -0,0 +1,116 @@ + + + diff --git a/frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/shuiShengShengTaiDiaoCha/index.vue b/frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/shuiShengShengTaiDiaoCha/index.vue new file mode 100644 index 00000000..cb5f9cf5 --- /dev/null +++ b/frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/shuiShengShengTaiDiaoCha/index.vue @@ -0,0 +1,206 @@ + + + + + diff --git a/frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/shuiWenJianCe/WtSearch.vue b/frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/shuiWenJianCe/WtSearch.vue new file mode 100644 index 00000000..cc102d89 --- /dev/null +++ b/frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/shuiWenJianCe/WtSearch.vue @@ -0,0 +1,116 @@ + + + diff --git a/frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/shuiWenJianCe/index.vue b/frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/shuiWenJianCe/index.vue new file mode 100644 index 00000000..b5777224 --- /dev/null +++ b/frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/shuiWenJianCe/index.vue @@ -0,0 +1,188 @@ + + + + + diff --git a/frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/shuiZhiJianCe/WqSearch.vue b/frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/shuiZhiJianCe/WqSearch.vue new file mode 100644 index 00000000..f0365a63 --- /dev/null +++ b/frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/shuiZhiJianCe/WqSearch.vue @@ -0,0 +1,118 @@ + + + diff --git a/frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/shuiZhiJianCe/index.vue b/frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/shuiZhiJianCe/index.vue new file mode 100644 index 00000000..f50161ef --- /dev/null +++ b/frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/shuiZhiJianCe/index.vue @@ -0,0 +1,189 @@ + + + + + diff --git a/frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/sonarCam/SonarSearch.vue b/frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/sonarCam/SonarSearch.vue new file mode 100644 index 00000000..6186223f --- /dev/null +++ b/frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/sonarCam/SonarSearch.vue @@ -0,0 +1,117 @@ + + + diff --git a/frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/sonarCam/index.vue b/frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/sonarCam/index.vue new file mode 100644 index 00000000..f483320a --- /dev/null +++ b/frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/sonarCam/index.vue @@ -0,0 +1,202 @@ + + + + + diff --git a/frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/spawnGround/EditSpawnModal.vue b/frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/spawnGround/EditSpawnModal.vue new file mode 100644 index 00000000..f59a0880 --- /dev/null +++ b/frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/spawnGround/EditSpawnModal.vue @@ -0,0 +1,506 @@ + + + diff --git a/frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/spawnGround/SpawnSearch.vue b/frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/spawnGround/SpawnSearch.vue new file mode 100644 index 00000000..71ef218f --- /dev/null +++ b/frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/spawnGround/SpawnSearch.vue @@ -0,0 +1,121 @@ + + + diff --git a/frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/spawnGround/index.vue b/frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/spawnGround/index.vue new file mode 100644 index 00000000..8ee14689 --- /dev/null +++ b/frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/spawnGround/index.vue @@ -0,0 +1,295 @@ + + + + + diff --git a/frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/tempMit/DwSearch.vue b/frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/tempMit/DwSearch.vue new file mode 100644 index 00000000..b43cf164 --- /dev/null +++ b/frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/tempMit/DwSearch.vue @@ -0,0 +1,116 @@ + + + diff --git a/frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/tempMit/index.vue b/frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/tempMit/index.vue new file mode 100644 index 00000000..e8f425e6 --- /dev/null +++ b/frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/tempMit/index.vue @@ -0,0 +1,200 @@ + + + + + diff --git a/frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/terrEco/OtteSearch.vue b/frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/terrEco/OtteSearch.vue new file mode 100644 index 00000000..b856ee48 --- /dev/null +++ b/frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/terrEco/OtteSearch.vue @@ -0,0 +1,118 @@ + + + diff --git a/frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/terrEco/index.vue b/frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/terrEco/index.vue new file mode 100644 index 00000000..47f5c9a6 --- /dev/null +++ b/frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/terrEco/index.vue @@ -0,0 +1,202 @@ + + + + + diff --git a/frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/yunXingGaoJing/EditWarnModal.vue b/frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/yunXingGaoJing/EditWarnModal.vue new file mode 100644 index 00000000..24219bfb --- /dev/null +++ b/frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/yunXingGaoJing/EditWarnModal.vue @@ -0,0 +1,394 @@ + + + diff --git a/frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/yunXingGaoJing/WarnSearch.vue b/frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/yunXingGaoJing/WarnSearch.vue new file mode 100644 index 00000000..dc5db725 --- /dev/null +++ b/frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/yunXingGaoJing/WarnSearch.vue @@ -0,0 +1,82 @@ + + + diff --git a/frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/yunXingGaoJing/index.vue b/frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/yunXingGaoJing/index.vue new file mode 100644 index 00000000..8554be30 --- /dev/null +++ b/frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/yunXingGaoJing/index.vue @@ -0,0 +1,255 @@ + + + + + diff --git a/frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/zengZhiFangLiu/FbSearch.vue b/frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/zengZhiFangLiu/FbSearch.vue new file mode 100644 index 00000000..73a4b6dd --- /dev/null +++ b/frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/zengZhiFangLiu/FbSearch.vue @@ -0,0 +1,92 @@ + + + diff --git a/frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/zengZhiFangLiu/index.vue b/frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/zengZhiFangLiu/index.vue new file mode 100644 index 00000000..4d3bcd6e --- /dev/null +++ b/frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/zengZhiFangLiu/index.vue @@ -0,0 +1,259 @@ + + + + + diff --git a/frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/zhenXIZhiWuYuan/VpSearch.vue b/frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/zhenXIZhiWuYuan/VpSearch.vue new file mode 100644 index 00000000..0240ddc9 --- /dev/null +++ b/frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/zhenXIZhiWuYuan/VpSearch.vue @@ -0,0 +1,39 @@ + + + diff --git a/frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/zhenXIZhiWuYuan/index.vue b/frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/zhenXIZhiWuYuan/index.vue new file mode 100644 index 00000000..76be352a --- /dev/null +++ b/frontend/src/views/DataQueryMenuModule/components/conventionalHydropower/zhenXIZhiWuYuan/index.vue @@ -0,0 +1,197 @@ + + + + + diff --git a/frontend/src/views/DataQueryMenuModule/components/monitorData/FlowStation/EditFlowStationModal.vue b/frontend/src/views/DataQueryMenuModule/components/monitorData/FlowStation/EditFlowStationModal.vue deleted file mode 100644 index 75e38474..00000000 --- a/frontend/src/views/DataQueryMenuModule/components/monitorData/FlowStation/EditFlowStationModal.vue +++ /dev/null @@ -1,327 +0,0 @@ - - - - - diff --git a/frontend/src/views/DataQueryMenuModule/components/monitorData/FlowStation/index.vue b/frontend/src/views/DataQueryMenuModule/components/monitorData/FlowStation/index.vue index feaf9520..f8f953c2 100644 --- a/frontend/src/views/DataQueryMenuModule/components/monitorData/FlowStation/index.vue +++ b/frontend/src/views/DataQueryMenuModule/components/monitorData/FlowStation/index.vue @@ -19,48 +19,15 @@ sort: sort }" > - - - - + diff --git a/frontend/src/views/DataQueryMenuModule/components/monitorData/SurfaceTemp/EditSurfaceTempModal.vue b/frontend/src/views/DataQueryMenuModule/components/monitorData/SurfaceTemp/EditSurfaceTempModal.vue deleted file mode 100644 index d69a1345..00000000 --- a/frontend/src/views/DataQueryMenuModule/components/monitorData/SurfaceTemp/EditSurfaceTempModal.vue +++ /dev/null @@ -1,252 +0,0 @@ - - - - - diff --git a/frontend/src/views/DataQueryMenuModule/components/monitorData/SurfaceTemp/index.vue b/frontend/src/views/DataQueryMenuModule/components/monitorData/SurfaceTemp/index.vue index 7e73361c..8bd728b2 100644 --- a/frontend/src/views/DataQueryMenuModule/components/monitorData/SurfaceTemp/index.vue +++ b/frontend/src/views/DataQueryMenuModule/components/monitorData/SurfaceTemp/index.vue @@ -19,54 +19,18 @@ sort: sort }" > - - - - - diff --git a/frontend/src/views/DataQueryMenuModule/components/monitorData/VerticalTemp/EditVerticalTempModal.vue b/frontend/src/views/DataQueryMenuModule/components/monitorData/VerticalTemp/EditVerticalTempModal.vue deleted file mode 100644 index f27450ae..00000000 --- a/frontend/src/views/DataQueryMenuModule/components/monitorData/VerticalTemp/EditVerticalTempModal.vue +++ /dev/null @@ -1,288 +0,0 @@ - - - - - diff --git a/frontend/src/views/DataQueryMenuModule/components/monitorData/VerticalTemp/index.vue b/frontend/src/views/DataQueryMenuModule/components/monitorData/VerticalTemp/index.vue index 06b4c5f3..c772cde8 100644 --- a/frontend/src/views/DataQueryMenuModule/components/monitorData/VerticalTemp/index.vue +++ b/frontend/src/views/DataQueryMenuModule/components/monitorData/VerticalTemp/index.vue @@ -59,43 +59,9 @@ :min-selection-count="1" @selection-change="handleCxswSelectionChange" > - - - - - @@ -111,8 +77,6 @@ import { import dayjs from 'dayjs'; import * as echarts from 'echarts'; import VerticalTempSearch from './VerticalTempSearch.vue'; -import EditVerticalTempModal from './EditVerticalTempModal.vue'; -import DeleteConfirmModal from '@/views/DataQueryMenuModule/components/conventionalHydropower/BasicData/DeleteConfirmModal.vue'; import BasicTable from '@/components/BasicTable/index.vue'; import { getVerticalList, deleteVerticalInfo } from '@/api/DataQueryMenuModule'; import { calcTableScrollY } from '@/utils/index'; @@ -221,20 +185,7 @@ const tableColumns = computed(() => { : '-'; } })); - - const actionCols = - currentSearchParams.value.timeScale === 'tm' - ? [ - { - title: '操作', - dataIndex: 'action', - fixed: 'right', - width: 120 - } - ] - : []; - - return [...fixedCols, ...dataCols, ...actionCols]; + return [...fixedCols, ...dataCols ]; }); const tableScrollX = computed(() => { @@ -243,13 +194,7 @@ const tableScrollX = computed(() => { return total > 600 ? total : undefined; }); -// 默认选中行 -const defaultSelectedRowKeys = computed(() => { - if (tableData.value && tableData.value.length > 0) { - return [tableData.value[0].dt]; - } - return []; -}); + // 图表颜色 const COLORS = [ @@ -434,33 +379,7 @@ const exportBtn = () => { }); }; -const handleEdit = (record: any) => { - editRecord.value = { ...record }; - editVisible.value = true; -}; -const handleDeleteFn = async (record: any, reason: string) => { - return deleteVerticalInfo({ - dataList: [ - { - id: record.stcd ?? record.id, - tm: record.tm ?? record.dt - } - ], - dataType: 'TIME', - source: reason - }); -}; - -const handleDelete = (record: any) => { - deleteModalRef.value?.open(record, () => { - initTable(currentSearchParams.value); - }); -}; - -const handleEditSuccess = () => { - initTable(currentSearchParams.value); -}; const initTable = (values: any) => { const filters = [ @@ -627,7 +546,7 @@ let resizeObserver: ResizeObserver | null = null; onMounted(() => { nextTick(() => { - tableScrollY.value = calcTableScrollY(); + tableScrollY.value = calcTableScrollY(tableRef.value); // 初始化图表 if (chartRef.value && !chartInstance) { diff --git a/frontend/src/views/DataQueryMenuModule/components/monitorData/WaterData/EditWaterDataModal.vue b/frontend/src/views/DataQueryMenuModule/components/monitorData/WaterData/EditWaterDataModal.vue deleted file mode 100644 index bd30f661..00000000 --- a/frontend/src/views/DataQueryMenuModule/components/monitorData/WaterData/EditWaterDataModal.vue +++ /dev/null @@ -1,405 +0,0 @@ - - - - - diff --git a/frontend/src/views/DataQueryMenuModule/components/monitorData/WaterData/index.vue b/frontend/src/views/DataQueryMenuModule/components/monitorData/WaterData/index.vue index eb0f6552..4b4e5e1c 100644 --- a/frontend/src/views/DataQueryMenuModule/components/monitorData/WaterData/index.vue +++ b/frontend/src/views/DataQueryMenuModule/components/monitorData/WaterData/index.vue @@ -20,50 +20,14 @@ sort: sort }" > - + - - - - - -