diff --git a/src/gui/water_quality_gui_v2.py b/src/gui/water_quality_gui_v2.py index 2b43f28..d0b68b4 100644 --- a/src/gui/water_quality_gui_v2.py +++ b/src/gui/water_quality_gui_v2.py @@ -209,12 +209,18 @@ def _find_and_set_gdal_env(): # ── 应用环境变量 ── if proj_lib: os.environ["PROJ_LIB"] = proj_lib - print(f"[ENV] PROJ_LIB → {proj_lib}") + # PROJ_DATA: Fiona / Rasterio / GDAL ≥3.5 / PROJ ≥8 优先读取此变量 + # 不设置的话 Fiona 会使用自带的旧版 proj.db (VERSION.MINOR=2), + # 导致投影解析错误 → 矢量图层错位 → 水体被错误擦除 → 有效像元为 0 + os.environ["PROJ_DATA"] = proj_lib + print(f"[ENV] PROJ_LIB → {proj_lib}") + print(f"[ENV] PROJ_DATA → {proj_lib}") else: - print("[ENV] ⚠ 未找到兼容的 proj.db (需要 PROJ v6+),PROJ_LIB 保持系统默认") + print("[ENV] ⚠ 未找到兼容的 proj.db (需要 PROJ v6+),PROJ_LIB/PROJ_DATA 保持系统默认") print(f"[ENV] (已搜索 {len(prefixes)} 个前缀: {[os.path.basename(p) for p in prefixes[:5]]}...)") print("[ENV] 如果 step11 地图渲染报 PROJ 版本错误,") print("[ENV] 请手动设置: set PROJ_LIB=\\Library\\share\\proj") + print("[ENV] set PROJ_DATA=<同上>") if gdal_data: os.environ["GDAL_DATA"] = gdal_data @@ -223,6 +229,17 @@ def _find_and_set_gdal_env(): print("[ENV] ⚠ 未找到 GDAL data 目录,GDAL_DATA 保持系统默认") print(f"[ENV] (已搜索 {len(prefixes)} 个前缀)") + # ── 屏蔽 Fiona 内部旧版 PROJ 路径 ── + # Fiona wheels 捆绑了古老的 proj.db (VERSION.MINOR=2), + # 即使设置了 PROJ_DATA 仍然可能被某些旧版 Fiona 忽略。 + # 以下环境变量作为最后防线强制覆盖。 + if proj_lib: + # GDAL ≥3.5 同时检查 PROJ_DATA 和 PROJ_LIB + os.environ["PROJ_NETWORK"] = "OFF" # 禁用 PROJ 网络下载(避免意外行为) + # 记录此信息供诊断 + if "PROJ_DATA" in os.environ: + print("[ENV] 已屏蔽 Fiona 内部旧版 PROJ 数据库,全进程统一使用上述 proj.db") + _find_and_set_gdal_env() import ctypes