You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为Numpy数组添加投影与地理变换后保存为TIFF文件

问题描述

我从LiDAR表面导入了一个.tif文件到Python中:

Existing_Surface = 'Path_To_Tiff/Existing_Surface.tif'

使用GDAL检查了投影信息:

Original_Surface = gdal.Open(Existing_Surface)
projection_Original = Original_Surface.GetProjection()
geotransform_Original = Original_Surface.GetGeoTransform()

导入的影像具有正确的投影和地理变换。

随后我利用shp文件裁剪该影像,并将新影像转换为Numpy数组(示例数组如下):

Existing_example_array = [[ 0, 0, 1, 0, 0, 0, 0], 
                          [ 0, 1, 1, 1, 0, 0, 0], 
                          [ 0, 1, 1, 1, 1, 0, 0], 
                          [ 1, 1, 1, 1, 1, 0, 0], 
                          [ 0, 1, 1, 1, 1, 0, 0], 
                          [ 0, 1, 1, 0, 0, 0, 0]]

对数组内的数据进行处理后,尝试导出该Numpy数组:

data_folder = Path("Path_to_Tiff/Surface.tif")
tifffile.imsave( data_folder, Existing_example_array)

tifffile成功导出了数组,但投影和地理变换信息丢失。请问有没有方法为数组恢复投影和地理变换并重新导出为TIFF文件?

解决方案

tifffile仅负责处理像素数据,不支持地理空间元数据的读写,需要用GDAL或rasterio这类地理空间库来导出带投影和地理变换的TIFF。

方法一:使用GDAL导出

通过GDAL创建新的TIFF数据集,写入处理后的数组,再设置投影和地理变换:

from osgeo import gdal
from pathlib import Path

# 替换为你处理后的数组、投影、地理变换(若为裁剪影像,需用裁剪后的geotransform)
processed_array = Existing_example_array
proj = projection_Original
gt = geotransform_Original

output_path = Path("Path_to_Tiff/Surface_with_proj.tif")
rows, cols = processed_array.shape
# 根据原影像数据类型调整,比如float32用gdal.GDT_Float32
data_type = gdal.GDT_Byte

# 创建TIFF驱动
driver = gdal.GetDriverByName('GTiff')
# 创建数据集:路径、宽度、高度、波段数、数据类型
dataset = driver.Create(str(output_path), cols, rows, 1, data_type)

# 设置地理变换和投影
dataset.SetGeoTransform(gt)
dataset.SetProjection(proj)

# 写入数组数据
dataset.GetRasterBand(1).WriteArray(processed_array)

# 释放资源
dataset.FlushCache()
dataset = None

方法二:使用rasterio导出

rasterio的地理空间数据API更简洁直观:

import rasterio
from rasterio.transform import from_gdal
from pathlib import Path

processed_array = Existing_example_array
proj = projection_Original
gt = geotransform_Original

output_path = Path("Path_to_Tiff/Surface_with_proj.tif")

# 构建输出元数据
meta = {
    'driver': 'GTiff',
    'height': processed_array.shape[0],
    'width': processed_array.shape[1],
    'count': 1,
    'dtype': processed_array.dtype,
    'crs': proj,
    'transform': from_gdal(*gt),
}

# 写入数据
with rasterio.open(output_path, 'w', **meta) as dst:
    dst.write(processed_array, 1)

注意事项

  • 如果是裁剪后的影像,不能直接使用原文件的geotransform,需要在裁剪过程中记录新的地理变换参数(比如用GDAL Warp或rasterio裁剪时获取输出的transform)。
  • 确保导出数据类型与原影像一致,避免精度丢失或数据异常。

内容的提问来源于stack exchange,提问作者Patstro

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 11:27:47