关于使用Rasterio将阿尔巴尼亚栅格1重投影至栅格2坐标系的咨询
基于目标栅格空间信息用Rasterio重投影源栅格的解决方案
嘿,我来帮你搞定这个Rasterio重投影的问题!核心思路就是复用目标栅格(国家边界栅格)的CRS、分辨率和空间范围,把源栅格(裁剪后的产品)对齐过去。下面是具体的步骤和代码,我会尽量讲清楚细节:
第一步:读取两份栅格的元数据
首先我们要把两个栅格都读进来,提取目标栅格的关键空间信息——也就是你要对齐的基准:
import rasterio from rasterio.warp import reproject, Resampling # 读取源栅格(你的裁剪产品) with rasterio.open("your_source_raster.tif") as src_dataset: src_data = src_dataset.read() # 读取栅格数据 src_crs = src_dataset.crs # 源栅格的投影 src_transform = src_dataset.transform # 源栅格的仿射变换 # 读取目标栅格(国家边界栅格) with rasterio.open("target_boundary_raster.tif") as target_dataset: target_crs = target_dataset.crs target_transform = target_dataset.transform # 目标栅格的仿射变换(决定了范围和分辨率) target_width = target_dataset.width target_height = target_dataset.height # 复制目标栅格的profile,用来生成输出文件 output_profile = target_dataset.profile.copy()
第二步:执行重投影并写入输出
接下来我们直接用目标栅格的空间参数来重投影源数据,这样输出的栅格就会和目标栅格完全对齐:
# 调整输出profile的波段数(确保和源栅格一致) output_profile.update(count=src_dataset.count) # 创建输出文件并写入重投影后的数据 with rasterio.open("reprojected_result.tif", "w", **output_profile) as output_dataset: # 逐波段处理(如果是单波段栅格,循环只执行一次) for band_idx in range(1, src_dataset.count + 1): reproject( source=rasterio.band(src_dataset, band_idx), destination=rasterio.band(output_dataset, band_idx), src_transform=src_transform, src_crs=src_crs, dst_transform=target_transform, dst_crs=target_crs, # 选择合适的重采样方法:分类数据用nearest,连续数据用bilinear/cubic resampling=Resampling.bilinear )
常见问题排查(如果你之前尝试出错)
如果之前的操作失败,大概率是这几个原因:
- 元数据读取错误:比如误把源栅格的CRS当成了目标的,或者没正确获取
transform参数——可以打印target_crs和src_crs确认两者确实不同。 - 重采样方法选错:如果你的栅格是分类数据(比如土地利用),一定要用
Resampling.nearest,不然会出现模糊的分类值;连续数据(比如高程)用bilinear或cubic更合适。 - 空间范围不匹配:如果源栅格和目标栅格的空间范围完全不重叠,重投影后可能全是NoData——可以先打印两者的
bounds(src_dataset.bounds和target_dataset.bounds)确认重叠。 - 权限或路径问题:输出路径要确保有写入权限,文件名后缀建议用
.tif。
另外,如果你的需求只是匹配投影(CRS),不需要完全对齐分辨率和范围,可以用calculate_default_transform自动计算变换参数,替换上面的target_transform、target_width、target_height:
from rasterio.warp import calculate_default_transform transform, width, height = calculate_default_transform( src_crs, target_crs, src_dataset.width, src_dataset.height, *src_dataset.bounds ) output_profile.update(transform=transform, width=width, height=height)
内容的提问来源于stack exchange,提问作者Roger Almengor
相关产品推荐
相关产品推荐

