On this page
article
[地图工具]数据加载器(Raster/Vector/CSV 一键入图)
📂 数据加载器(Raster/Vector/CSV 一键入图)
面板:数据加载器 核心实现:
_dataloader.py(PySide6 Dock + 逻辑),通过 Qt WebChannel 与地图端交互,完成矢量/栅格/CSV 点的加载、预览与样式应用。面板同时提供图层列表与右键菜单(缩放/设为当前/移除)以及栅格渲染设置卡片(灰度/伪彩、色带、透明度、快速应用)。
1. 面板与数据
1.1 顶部输入区
- 数据类型(下拉):
GeoJSON / Shapefile / CSV / Raster / Vector - 文件路径:文本框 + 📁 浏览按钮(按类型过滤常见扩展名)
- 操作按钮:📂 加载数据、🧹 清除图层
- 提示输出:下方“📋 加载状态”日志区域(可 🧽 清空输出)。
1.2 已加载图层(可滚动)
- 标题卡片:✅ 已加载图层
- 每个图层行:名称 + 👁️/🙈 显隐、📋 属性表(矢量可用)、❌ 移除。
- 左键选中为当前图层(栅格会自动切换渲染控件到该图层)。右键弹出缩放/设为当前/移除菜单。
1.3 栅格渲染设置(卡片)
- 🔽/🔼 展开/收起
- 渲染类型:
单波段灰度 / 单波段伪彩色 - 色带:
热力图 / 冷热 / 地形 / 绿-棕 - 透明度:0–100
- 🎨 应用样式:立即把设置应用到当前栅格图层。
2. 支持与规则
| 类型 | 扩展名 | 处理规则 |
|---|---|---|
| GeoJSON | .geojson/.json |
直接读取字符串并注入地图。 |
| Shapefile/KML/GML | .shp/.kml/.gml |
以 GeoPandas 读取;若无坐标系则设为 EPSG:4326;若坐标系非 4326 则自动重投影后转为 GeoJSON 注入。 |
| CSV 点 | .csv |
必须包含 lon/lat;空值行剔除;长度>100000 时采样至 50000 条以防卡顿;转为 GeoJSON 注入。 |
| Raster | .tif/.tiff/.img |
以 QUrl 绝对路径传递至地图端,构建 GeoRasterLayer;自动弹出栅格渲染卡片并关联该图层。 |
说明:矢量属性表按钮仅对矢量图层启用;栅格图层该按钮置灰并提示“不支持属性表”。
3. 最小操作流程
- 选择类型与文件 → 点击 📂 加载数据
- 在左侧地图查看加载结果;如为栅格,展开“栅格渲染设置”卡片调整显示;如为矢量,可点 📋 属性表 浏览字段。
- 在“✅ 已加载图层”列表进行显隐/缩放/删除;必要时右键菜单 📍 缩放至图层 / 🔍 设为当前图层 / ❌ 移除图层。
4. 图层控制与右键菜单
-
显隐(👁️/🙈):不移除对象,仅从地图层组增删图层。
-
属性表(📋):读取当前图层 GeoJSON,抽取字段与行,弹出表格对话框呈现。
-
移除(❌):从地图与面板列表彻底移除该图层(并从
layerRegistry注销)。 -
右键菜单(任意图层)
- 📍 缩放至图层:若有
getBounds()则fitBounds,若为点图层则居中到该点;失败会提示原因。 - 🔍 设为当前图层:切换面板内部“当前图层”状态;若为栅格,联动栅格渲染控件。
- ❌ 移除图层:等价于删除按钮。
以上均通过
runJavaScript向地图端执行封装脚本完成。
- 📍 缩放至图层:若有
5. 栅格渲染(单波段灰度/伪彩)
当前图层为栅格时,渲染卡片自动关联该 layerId:
- 设置渲染类型 / 色带 / 透明度,点击 🎨 应用样式。
- 通过
applyRasterStyle({ layerId, renderType, opacity, colorRamp })注入地图端,立即生效。 - 面板会在状态输出中记录“已应用 ×× 样式到 layerId”。
小贴士:若你在“地图工具/图层管理”中也有 RGB 与样式相关能力,建议保持一个入口主控,另一个仅做微调,避免重复覆盖导致的显示闪烁。
6. 机制与桥接(开发者向)
-
双向通讯:
- 面板 → 地图:
runJavaScript('loadGeoLayer(...)')、loadRasterLayer(url, {layerId,label})、applyRasterStyle(...)、removeLayerById(id)等; - 地图 → 面板:必要时通过
bridge.from_js反馈加载结果与错误。
- 面板 → 地图:
-
状态持有:
self.loaded_layers存放每个图层在面板内的行容器;self.layer_visibility记录显隐状态;self.current_raster_layer / self.current_layer_id标识当前(栅格)图层,使渲染卡片指向正确目标。
-
健壮性:
- CSV 超大时自动采样;
- Shapefile/KML/GML 必要时补设或重投影到 EPSG:4326;
- 删除图层时同步清理地图端
layerRegistry与面板 UI 映射。
7. 日志与排错
常见日志提示(来自“📋 加载状态”):
📁 已选择文件: <path>🧩 加载中: <type>...✅ 已添加图层 <layer_id> 到地图 / 正在加载栅格数据: <name>⚠️ 路径无效,请选择文件 / ⚠️ 不支持的文件类型❌ 数据为空 / ❌ 加载CSV失败: ... / ❌ 加载栅格失败: ...🧹 已清除所有图层(含清空layerRegistry)
常见问题
- CSV 没有 lon/lat → 必填列名必须是
lon/lat(小写)。可在导入前重命名字段。 - 矢量无坐标系/显示偏移 → 面板会补设或重投影到 EPSG:4326;若仍偏移,检查原数据是否有本地投影(需先在外部转换)。
- 加载大 CSV 卡顿 → 已内置采样(>100k → 50k)。如仍卡,可先在外部筛选或分块。
- 属性表按钮置灰 → 该图层为栅格,属性表仅对矢量启用。
- “缩放至图层”无效 → 该图层不提供
getBounds()或范围无效;点图层会退化为setView(latlng, 16)。
8. 使用建议(实践)
- 文件先验检查:加载前先确认路径与权限,避免中文奇异字符;尤其是网络盘路径。
- 一次一点:大工程中建议分批加载,必要时先加载底图/矢量边界,再按需加载大栅格。
- 样式后置:先把栅格加载完成,再调整渲染设置,可减少重复
redraw()。 - 命名规范:图层名称建议包含关键字段(如时相/分辨率/处理级别),便于后续定位与管理。
9. 控件与函数速查
| 模块 | 名称 | 作用 |
|---|---|---|
| 面板 → 地图 | loadGeoLayer(geojson_str, layerId) |
加载矢量到 Leaflet,并登记到 layerRegistry。 |
loadRasterLayer(url, {layerId,label}) |
加载 GeoTIFF(单波段灰度/伪彩起步),回调成功/失败。 | |
applyRasterStyle({layerId,renderType,opacity,colorRamp}) |
对单波段栅格应用样式。 | |
removeLayerById(layerId) |
从地图与注册表移除图层。 | |
| 面板内部 | update_raster_controls(layer_id) |
将渲染控件指向指定栅格图层并重置 UI。 |
handle_layer_click(layer_id) |
切换当前图层;栅格则联动渲染卡片。 | |
_show_layer_context_menu(layer_id, pos) |
右键菜单:缩放/设为当前/移除。 | |
clear_layers() |
清空地图图层与面板列表。 |