GeoTIFF文件生成异常:如何调整Python代码生成可用的GeoTIFF?
问题解决:GRIB转GeoTIFF后正常显示的代码调整
你的代码核心问题是缺少统计信息、未处理无效值、投影设置不合理,导致QGIS无法生成颜色映射,Leaflet等工具无法正常识别。以下是修正后的代码:
import gdal import osr import sys file = sys.argv[1] input_path = f"/home/jason/{file}.grib2" output_path = f"/home/jason/{file}.tiff" print("处理文件:", file) # 打开GRIB数据集,增加异常判断 ds = gdal.Open(input_path) if not ds: print("无法打开GRIB文件") sys.exit(1) wind = ds.GetRasterBand(1).ReadAsArray() # 创建GeoTIFF输出,添加压缩参数减小体积 driver = gdal.GetDriverByName('GTiff') outRaster = driver.Create( output_path, ds.RasterXSize, ds.RasterYSize, 1, gdal.GDT_Float32, options=['COMPRESS=LZW'] ) outRaster.SetGeoTransform(ds.GetGeoTransform()) # 优先读取原GRIB的投影信息,避免硬编码导致的配准错误 proj = ds.GetProjection() if proj: outRaster.SetProjection(proj) else: # 原文件无投影时再手动设置EPSG4326 outRasterSRS = osr.SpatialReference() outRasterSRS.ImportFromEPSG(4326) outRaster.SetProjection(outRasterSRS.ExportToWkt()) outband = outRaster.GetRasterBand(1) outband.WriteArray(wind) # 设置NoData值,处理无效数据 nodata_val = ds.GetRasterBand(1).GetNoDataValue() if nodata_val is not None: outband.SetNoDataValue(nodata_val) else: outband.SetNoDataValue(-9999) # 计算统计信息,让QGIS自动生成颜色映射 outband.ComputeStatistics(0) outband.SetMetadata({'name': 'wind'}) # 释放资源,确保文件写入完整 outband.FlushCache() outRaster = None ds = None print("转换完成,输出文件:", output_path)
关键修改说明:
- 保留原投影:不再强制设置EPSG4326,优先读取GRIB自带的投影信息,避免地理配准错误,保证Leaflet等工具能正确识别图层位置。
- 添加NoData值:处理数据中的无效值,避免渲染异常,提升跨工具兼容性。
- 计算统计信息:通过
ComputeStatistics(0)自动计算数据的极值、均值等,QGIS会基于这些值自动生成伪彩色映射,解决无颜色显示的问题。 - 文件压缩:使用LZW压缩减少GeoTIFF体积,不影响数据精度。
- 资源释放:显式关闭数据集,避免文件损坏。
额外优化建议:
- 如果QGIS仍未自动显示颜色,可手动打开图层属性的样式面板,选择“单波段伪彩色”渲染方式,基于统计信息调整颜色方案。
- 若需在Leaflet中使用,需将GeoTIFF转换为Web墨卡托投影(EPSG:3857),可添加以下代码:
# 转换为Web墨卡托投影 gdal.Warp( f"/home/jason/{file}_3857.tiff", output_path, dstSRS='EPSG:3857', format='GTiff', options=['COMPRESS=LZW'] )
内容的提问来源于stack exchange,提问作者jms1980
相关产品推荐
相关产品推荐

