WholeProcessPlatform/frontend/src/docs/地图加载逻辑.md

261 lines
7.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 地图图层、图例和锚点加载逻辑
## 一、整体流程
```
GisView.vue (onMounted)
├─> 1. 获取图层配置 (mapStore.setLayerData)
├─> 2. 收集初始选中的图层 keys (collectCheckedKeys)
├─> 3. 加载所有锚点数据 (mapStore.loadAllLayerData)
│ │
│ ├─> 并行加载选中的图层数据 (优先)
│ ├─> 后台加载未选中的图层数据
│ └─> 数据缓存到 pointDataCache
└─> 4. 更新图例和图层显隐 (mapStore.updateLayerData)
├─> 更新图层 checked 状态
├─> 获取并排序图例数据 (getlegendData)
├─> 处理环保设施图例 (fp_point/eq_point 联动)
└─> 控制锚点显示/隐藏 (setLegendPointVisible)
```
## 二、核心组件和 Store
### 2.1 组件
- **GisView.vue**: 主视图,负责初始化加载流程
- **LayerController.vue**: 图层树控制器,处理图层勾选交互
- **mapLegend/index.vue**: 图例显示组件
### 2.2 Store (map.ts)
- `layerData`: 图层树配置数据
- `legendData`: 过滤排序后的图例数据
- `legendDataOriginal`: 原始图例数据
- `legendDataSelected`: 选中的图例数据
- `legendDataMap`: 图例数据映射 (nameEn -> 图例项)
- `pointDataCache`: 锚点数据缓存
- `checkedLayerKeys`: 选中的图层 key 列表
## 三、初始化加载流程 (GisView.vue)
### 3.1 获取图层配置
```typescript
const layerRes = await mapStore.getLayerConfig();
mapStore.setLayerData(limitedLayers); // 设置图层数据
```
### 3.2 收集初始选中的 keys
```typescript
const checkedKeys = collectCheckedKeys(limitedLayers);
```
### 3.3 加载锚点数据
```typescript
await mapStore.loadAllLayerData(limitedLayers, checkedKeys);
```
### 3.4 更新图例和图层显隐
```typescript
await mapStore.updateLayerData(checkedKeys, true); // isInit = true
```
## 四、锚点数据加载 (loadAllLayerData)
### 4.1 处理逻辑
1. 递归遍历所有图层配置
2. 区分**选中的图层**和**未选中的图层**
3. 选中的图层**优先加载**,阻塞等待
4. 未选中的图层**后台加载**,不阻塞 UI
### 4.2 数据缓存
- 所有加载的数据都会缓存到 `pointDataCache`
- 已缓存的数据不会重复加载
- 即使图层未选中,也会加载数据并缓存,只是隐藏不显示
### 4.3 加载完成后
1. 调用 `setSelectedLegendData()` 设置选中图例
2. 未选中图层继续后台加载,完成后打印日志
## 五、图层勾选流程 (LayerController.vue)
### 5.1 用户勾选图层
```
onCheck(v, e)
├─> 处理互斥逻辑
│ ├─> 珍稀鱼类 vs 沿程鱼类
│ ├─> 视频监控 vs AI视频监控
│ └─> 环保设施 vs 环保设施在建
├─> checkedKeys.value = checkKeys
└─> broadcast(checkKeys)
└─> mapStore.updateLayerData(v)
```
### 5.2 互斥图层处理
- `rare_fish_point``fish_along_point` 互斥
- `stinfo_video_point``stinfo_ai_video_point` 互斥
- `facilities``facilities_built` 互斥
## 六、图例数据更新 (updateLayerData)
### 6.1 处理流程
```typescript
updateLayerData(checkKeys, isInit = false)
├─> 处理互斥图层 (stinfo_video_point vs stinfo_ai_video_point)
├─> 更新图层 checked 状态 (递归遍历 layerData)
记录 newlyChecked newlyUnchecked
├─> 获取有效 keys (过滤掉 '-', 'customBaseLayer', 'powerBaseStation')
├─> 获取图例数据 (getlegendData)
过滤掉 name === '地图' 的项
递归匹配 layerCode
去重 (根据 parent name)
├─> 处理环保设施图例联动
勾选 fp_point eq_point 自动添加环保设施图例
取消勾选 自动移除环保设施图例
├─> orderIndex 排序
├─> 更新 legendDataSelected
└─> 控制锚点显示/隐藏
isInit = true: 处理所有图层
isInit = false: 只处理变化的图层
```
### 6.2 环保设施图例联动
```typescript
const triggerKeys = ['fp_point', 'eq_point'];
const hasTriggerLayer = triggerKeys.some(key => checkKeys.includes(key));
if (hasTriggerLayer) {
// 添加环保设施图例
} else {
// 移除环保设施图例
}
```
## 七、图例点击处理 (mapLegend)
### 7.1 单个图例项点击
```typescript
legendItemClick(item)
├─> 切换 item.checked (0 1)
├─> 更新 legendDataMap
└─> 控制锚点显示/隐藏
pointMap 图层 setLegendPointVisible
GISMap 图层 controlBaseLayerTreeShowAndHidden
```
### 7.2 groupTitle 点击 (全选/取消全选)
```typescript
toggleGroup(group)
├─> 获取组内所有叶子节点 (getAllLeafItems)
├─> 判断是否有任何选中 决定目标是全选还是取消全选
└─> 遍历所有叶子节点,切换 checked 状态
跳过 parentName === '环保设施' 的项
跳过 canBeChecked === 0 的项
```
### 7.3 groupTitle 变灰判断
```typescript
isGroupAllUnchecked(group)
└─> 所有叶子节点 checked === 0 返回 true (变灰)
```
## 八、锚点显示/隐藏控制
### 8.1 pointMap 图层
```typescript
setLegendPointVisible(layerKey, nameEn, visible)
├─> 隐藏所有锚点 (setLegendPointVisible(key, '', false))
└─> 显示选中的锚点 (遍历 legendDatachecked === 1 的项)
```
### 8.2 GISMap 图层
```typescript
controlBaseLayerTreeShowAndHidden(layerKey, configId, visible)
```
## 九、关键数据结构
### 9.1 图层配置 (mapLayerVos)
```typescript
{
key: 'eng_point',
title: '水电站',
type: 'pointMap', // 或 'GISMap'
checked: 1, // 0: 未选中, 1: 选中
url: '/api/xxx',
params: {},
children: [] // 子图层
}
```
### 9.2 图例数据
```typescript
{
name: '已建',
nameEn: 'large_eng_built',
layerCode: 'eng_point',
icon: 'xxx.png',
checked: 1, // 0: 未选中, 1: 选中
canBeChecked: 1, // 0: 不可勾选, 1: 可勾选
childrenList: [] // 子图例
}
```
### 9.3 锚点数据
```typescript
{
stcd: 'xxx', // 站点编码
stnm: '三峡电站', // 站点名称
sttpMap: 'ENG', // 类型编码
anchoPointState: 'large_eng_built', // 状态
iconCode: 'xxx.png', // 图标编码
lng: 111.11, // 经度
lat: 33.33, // 纬度
}
```
## 十、加载时序图
```
时间轴
├─1─┤ setLayerData() - 设置图层配置
├─2─┤ loadAllLayerData() 开始
│ │
│ ├─3─┤ 选中图层数据请求 (阻塞)
│ │ │
│ │ └─4─┤ 数据返回,添加到地图,缓存
│ │
│ ├─5─┤ setSelectedLegendData() - 设置图例
│ │
│ └─6─┤ 未选中图层数据请求 (后台,不阻塞)
│ │
│ └─7─┤ 数据返回,添加到地图,缓存
└─8─┤ updateLayerData() - 更新图层显隐,控制锚点显示
```