不使用Rasterio仅通过GDAL提取TIF经纬度及对应像元值方法
问题根因
- 经纬度结果偏差:原实现未读取TIF文件内置的仿射变换参数、空间参考信息,手动硬编码Basemap投影参数、自定义从0值起始的坐标网格,额外做了两次无意义的正反投影转换,坐标计算逻辑和栅格实际地理定位规则完全不匹配,结果必然存在偏移。
- 导出文件体积过大:原实现未过滤栅格定义的NoData无效像元,将所有像元(含大量填充用无效值)全部写入纯文本CSV格式。高分辨率栅格像元量可达千万级,纯文本存储会产生数倍到数十倍的体积膨胀,最终生成的GB级文件无法被常规表格工具打开。
纯GDAL实现方案(无Rasterio/Basemap依赖)
方案直接调用GDAL自带的空间参考、坐标转换接口读取TIF内置的定位信息,不需要手动配置投影参数,同时支持过滤无效值压缩导出体积,代码如下:
from osgeo import gdal, osr import numpy as np import pandas as pd # 开启GDAL异常提示 gdal.UseExceptions() # 替换为TIF文件实际存储路径 tif_path = r"你的TIF文件路径" ds = gdal.Open(tif_path) # 读取高程波段与无效值定义 elevation_band = ds.GetRasterBand(1) nodata_value = elevation_band.GetNoDataValue() elevation_array = elevation_band.ReadAsArray() # 读取核心仿射变换参数,无需手动硬编码坐标范围 geo_transform = ds.GetGeoTransform() origin_x, x_pixel_res, x_rotate, origin_y, y_rotate, y_pixel_res = geo_transform raster_width = ds.RasterXSize raster_height = ds.RasterYSize # 建立栅格原坐标系到WGS84经纬度(EPSG:4326)的转换关系 source_crs = osr.SpatialReference() source_crs.ImportFromWkt(ds.GetProjection()) target_crs = osr.SpatialReference() target_crs.ImportFromEPSG(4326) # 适配GDAL3.0+版本经纬度顺序(经度在前、纬度在后) target_crs.SetAxisMappingStrategy(osr.OAMS_TRADITIONAL_GIS_ORDER) coord_trans = osr.CoordinateTransformation(source_crs, target_crs) # 生成所有像元对应的原坐标系坐标 x_col = np.arange(raster_width) y_row = np.arange(raster_height) x_grid = origin_x + x_col * x_pixel_res + x_rotate * y_row[:, np.newaxis] y_grid = origin_y + y_row[:, np.newaxis] * y_pixel_res + y_rotate * x_col # 批量转换为WGS84经纬度 point_list = np.column_stack((x_grid.ravel(), y_grid.ravel())) lon_array, lat_array, _ = coord_trans.TransformPoints(point_list).T lon_grid = lon_array.reshape(elevation_array.shape) lat_grid = lat_array.reshape(elevation_array.shape) # 构建数据表,过滤无效像元(该步骤可将导出体积缩小90%以上) result_df = pd.DataFrame({ "纬度": lat_grid.ravel(), "经度": lon_grid.ravel(), "高程值": elevation_array.ravel() }) if nodata_value is not None: result_df = result_df[result_df["高程值"] != nodata_value] # 导出CSV,关闭pandas自动生成的索引 result_df.to_csv(r"elevation_output.csv", index=False, encoding="utf-8-sig") # 释放数据集占用 ds = None
注意事项
- 坐标准确性:代码直接读取TIF文件内置的地理定位元数据,转换出的经纬度与QGIS、ArcGIS等专业GIS软件读取的像元坐标完全一致,不存在手动配置投影导致的偏差。
- 体积优化:若使用高分辨率DEM数据,过滤NoData无效值后,导出的CSV体积通常会降到原全量导出的1/10甚至更低,可正常用表格工具打开。如果确实需要保留所有像元(含无效值),不要使用CSV格式,改用parquet、npz等二进制存储格式,相同内容体积仅为CSV的1/10左右。
- 兼容性:代码仅依赖GDAL库,不需要安装Rasterio、Basemap等额外第三方空间库,符合受限运行环境的要求。
内容的提问来源于stack exchange,提问作者Weiss
相关产品推荐
相关产品推荐

