📂 数据加载器(Raster/Vector/CSV 一键入图)

面板:数据加载器 核心实现:_dataloader.py(PySide6 Dock + 逻辑),通过 Qt WebChannel 与地图端交互,完成矢量/栅格/CSV 点的加载、预览与样式应用。面板同时提供图层列表与右键菜单(缩放/设为当前/移除)以及栅格渲染设置卡片(灰度/伪彩、色带、透明度、快速应用)。


1. 面板与数据

USDA-GeoProdStudio

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. 最小操作流程

  1. 选择类型与文件 → 点击 📂 加载数据
  2. 在左侧地图查看加载结果;如为栅格,展开“栅格渲染设置”卡片调整显示;如为矢量,可点 📋 属性表 浏览字段。
  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

常见问题

  1. CSV 没有 lon/lat → 必填列名必须是 lon/lat(小写)。可在导入前重命名字段。
  2. 矢量无坐标系/显示偏移 → 面板会补设或重投影到 EPSG:4326;若仍偏移,检查原数据是否有本地投影(需先在外部转换)。
  3. 加载大 CSV 卡顿 → 已内置采样(>100k → 50k)。如仍卡,可先在外部筛选或分块。
  4. 属性表按钮置灰 → 该图层为栅格,属性表仅对矢量启用。
  5. “缩放至图层”无效 → 该图层不提供 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() 清空地图图层与面板列表。