fix: 动态查找 PROJ/GDAL 路径 + Warp 1 像素浮点舍入容错

**water_quality_gui_v2.py:**
- 废弃硬编码 conda_env 路径
- 新增 _find_and_set_gdal_env(): 基于 sys.prefix 自动推断
  Library/share/proj 和 Library/share/gdal,验证 proj.db 存在后
  强设 PROJ_LIB 和 GDAL_DATA 环境变量
- 兼容 Windows (Library/share/...) 和 Linux/Mac (share/...) 路径

**preview_generator.py _warp_mask_to_image():**
- 尺寸验证从严格相等改为 ±2 像素容差
- 新增 _snap_array_to_shape(): warp 输出与 target_shape
  相差 ≤2px 时自动 slice(截断)或 pad(填充),不再回退到盲读模式
- 解决坐标系转换浮点舍入导致的 1048x522 vs 1047x521 问题
This commit is contained in:
duxin
2026-07-07 10:01:31 +08:00
parent 78818bbc50
commit 1f6c81158b
2 changed files with 117 additions and 11 deletions

View File

@ -17,15 +17,57 @@ WaterQualityGUI 只负责窗口框架标题栏、菜单栏、状态栏、QTab
"""
import os
# 强行切断系统环境变量的干扰,绑定到当前的 Conda 虚拟环境
# 必须在 import gdal / import rasterio 等任何第三方库之前执行
conda_env = r"D:\111\changyongruanjian\anconda\envs\WQ_GUI"
os.environ["PROJ_LIB"] = os.path.join(conda_env, "Library", "share", "proj")
os.environ["GDAL_DATA"] = os.path.join(conda_env, "Library", "share", "gdal")
import sys
# ═══════════════════════════════════════════════════════════════
# 动态推断当前 Conda 环境下的 GDAL/PROJ 数据路径
# 必须在 import gdal / import rasterio 等任何第三方库之前执行
# ═══════════════════════════════════════════════════════════════
def _find_and_set_gdal_env():
"""根据 sys.prefix 自动推断并强设 PROJ_LIB 和 GDAL_DATA 环境变量"""
# sys.prefix 在 Conda 环境下通常为:
# D:\...\anconda\envs\WQ_GUI
# PROJ 和 GDAL 的数据文件位于:
# {sys.prefix}\Library\share\proj (含 proj.db)
# {sys.prefix}\Library\share\gdal
prefix = sys.prefix
candidates_proj = [
os.path.join(prefix, "Library", "share", "proj"), # Windows Conda
os.path.join(prefix, "share", "proj"), # Linux/Mac Conda
]
candidates_gdal = [
os.path.join(prefix, "Library", "share", "gdal"),
os.path.join(prefix, "share", "gdal"),
]
proj_lib = None
for path in candidates_proj:
proj_db = os.path.join(path, "proj.db")
if os.path.isfile(proj_db):
proj_lib = path
break
gdal_data = None
for path in candidates_gdal:
if os.path.isdir(path):
gdal_data = path
break
if proj_lib:
os.environ["PROJ_LIB"] = proj_lib
print(f"[ENV] PROJ_LIB → {proj_lib}")
else:
print("[ENV] ⚠ 未找到 proj.dbPROJ_LIB 保持系统默认,可能影响坐标转换")
if gdal_data:
os.environ["GDAL_DATA"] = gdal_data
print(f"[ENV] GDAL_DATA → {gdal_data}")
else:
print("[ENV] ⚠ 未找到 GDAL data 目录GDAL_DATA 保持系统默认")
_find_and_set_gdal_env()
import ctypes
import traceback
import multiprocessing