On this page
article
地图工作台(Leaflet × Qt × Dock)
地图工作台(Leaflet × Qt × Dock)
1. 模块定位
地图页由 tab_map.py 提供。当前版本的地图模块不只是浏览器壳,而是整个系统的空间操作中枢,承担三类职责:
- 空间结果展示
- 空间数据加载与回显
- 空间工具与采样流程的入口
2. 核心类
2.1 Map(QMainWindow)
主类 Map 继承 QMainWindow,原因是需要原生支持多个 Dock:
WhiteboxToolsDockDataLoaderDockSegSamplingDock
这意味着地图模块采用的是“中心地图视图 + 右侧工具栈”的组织模式。
2.2 TileRequestInterceptor
TileRequestInterceptor 用于拦截地图底图请求,并附加用户代理:
USDA-GeoProdStudio/<version> (QtWebEngine map client)
它的主要作用是保证公共瓦片服务能识别请求来源,减少匿名客户端被拒绝的风险。
3. 技术架构
3.1 Web 地图内核
地图渲染采用:
- Qt WebEngine
- 本地 HTML
- JavaScript 地图库
QWebChannel
对应链路可写成:
$$ \text{Qt Widget} \leftrightarrow \text{QWebEngineView} \leftrightarrow \text{HTML/JS Map} \leftrightarrow \text{QWebChannel} \leftrightarrow \text{Python Bridge} $$
3.2 双向通信
JSBridge 负责前端和 Python 之间的双向消息交换,典型用途包括:
- 地图点击、对象选取等事件回传。
- Python 侧控制图层加载、样式和地图状态。
- 分割采样模块与地图联动。
4. Dock 模块说明
4.1 WhiteboxToolsDock
用于调用 WhiteboxTools 地学工具。适合:
- 地形分析
- 水文分析
- 距离与成本分析
- 滤波、分割、形态学与地表处理
4.2 DataLoaderDock
用于将外部文件快速加载到地图。适合:
- GeoTIFF
- Shapefile / GeoJSON
- CSV 坐标数据
- 中间结果回显
4.3 SegSamplingDock
用于图像分割、样本区划、采样与标注,是地图页和样本生产之间的关键桥梁。
5. 工作流
常见地图页工作流如下:
- 打开地图页。
- 使用 DataLoader 加载底图数据或结果图层。
- 需要空间处理时打开 WhiteboxToolsDock。
- 需要样本划分时打开 SegSamplingDock。
- 将结果重新加载回地图进行核查。
6. 关键实现细节
6.1 本地 HTML 加载
_load_html() 会读取本地地图 HTML,并自动补充 qwebchannel.js 引用,以保证桥接通信可用。
6.2 WebEngine 配置
_configure_webengine() 负责:
- 允许本地内容访问远程 URL
- 开启 LocalStorage
- 开启 JavaScript
- 设置持久缓存和 Cookie
6.3 Dock 初始化策略
三个 Dock 默认初始化后隐藏,只在用户需要时显示。这种策略兼顾了:
- 主界面简洁
- 模块解耦
- 延迟暴露复杂功能
7. 参数与可扩展点
7.1 Map(html_file=...)
主要参数:
html_file:地图前端 HTML 路径,默认使用map/map_widget.html。
适合扩展的方向:
- 多前端地图模板切换
- 专题地图页面切换
- 结果自动回图脚本
8. 开发者建议
如果要继续扩展地图页,建议遵循以下原则:
- 地图状态放在前端,业务逻辑放在 Python。
- 需要长期存在的工具用 Dock;一次性小功能优先用弹窗或右键菜单。
- 任何分析模块若要“回图”,尽量通过统一的数据加载路径进入地图,而不是各模块各自写渲染逻辑。