123 lines
4.0 KiB
Python
123 lines
4.0 KiB
Python
import argparse
|
||
import os
|
||
from osgeo import gdal, osr
|
||
import numpy as np
|
||
os.environ['GDAL_CACHEMAX'] = '2048'
|
||
def resample_to_match(image_A_path, image_B_path, output_path, resample_method=gdal.GRA_Bilinear):
|
||
"""
|
||
将图像A重采样至与图像B相同的坐标网格和分辨率
|
||
:param image_A_path: 待重采样的图像A路径
|
||
:param image_B_path: 参考图像B路径
|
||
:param output_path: 输出文件路径
|
||
:param resample_method: 重采样方法(默认双线性插值)
|
||
"""
|
||
gdal.AllRegister()
|
||
# 1. 打开参考图像B,获取其空间参数
|
||
ds_B = gdal.Open(image_B_path, gdal.GA_ReadOnly)
|
||
if ds_B is None:
|
||
raise RuntimeError("无法打开参考图像B")
|
||
|
||
# 提取B的投影、仿射变换、尺寸和波段数
|
||
proj_B = ds_B.GetProjection()
|
||
geotrans_B = ds_B.GetGeoTransform()
|
||
width_B = ds_B.RasterXSize
|
||
height_B = ds_B.RasterYSize
|
||
bands_B = ds_B.RasterCount
|
||
data_type_B = ds_B.GetRasterBand(1).DataType
|
||
|
||
|
||
ds_A = gdal.Open(image_A_path, gdal.GA_ReadOnly)
|
||
if ds_A is None:
|
||
raise RuntimeError("无法打开输入图像A")
|
||
|
||
bands_A=ds_A.RasterCount
|
||
# 2. 创建输出文件,完全复制B的空间参数
|
||
driver = gdal.GetDriverByName('ENVI')
|
||
ds_out = driver.Create(
|
||
output_path,
|
||
width_B, height_B,
|
||
bands_A,
|
||
data_type_B
|
||
)
|
||
ds_out.SetGeoTransform(geotrans_B)
|
||
ds_out.SetProjection(proj_B)
|
||
|
||
# 3. 执行重采样
|
||
|
||
# 配置WarpOptions参数(关键修改点)
|
||
warp_opts = gdal.WarpOptions(
|
||
srcSRS=ds_A.GetProjection(), # 输入投影
|
||
dstSRS=proj_B, # 目标投影
|
||
resampleAlg=resample_method, # 重采样方法(如gdal.GRA_Bilinear)
|
||
warpMemoryLimit=2 * 1024**3, # 单块内存限制为2GB(单位:字节)
|
||
# 分块处理相关参数
|
||
multithread=True, # 启用多线程加速
|
||
)
|
||
|
||
# 执行Warp操作(自动分块处理)
|
||
gdal.Warp(
|
||
ds_out, # 输出数据集
|
||
ds_A, # 输入数据集
|
||
options=warp_opts
|
||
)
|
||
|
||
|
||
# 4. 释放资源
|
||
ds_A = ds_B = ds_out = None
|
||
print(f"重采样完成,结果已保存至: {output_path}")
|
||
|
||
|
||
# 4. 释放资源
|
||
ds_A = ds_B = ds_out = None
|
||
print(f"重采样完成,结果已保存至: {output_path}")
|
||
|
||
def getParams():
|
||
parser = argparse.ArgumentParser()
|
||
parser.add_argument('-i','--infile',default=r'F:\Data\SAR\IDL\SAR_EC_20240801\total_precipitation2024080110.bin', help='输入文件')
|
||
parser.add_argument('-o', '--outfile',default=r'F:\Data\SAR\IDL\SAR_EC_20240801\total_precipitation2024080110_resample.bin', help='输出Bin文件路径')
|
||
parser.add_argument('-r', '--reffile',default=r'F:\Data\SAR\IDL\SAR_EC_20240801\4254-DB-GEO.tif', help='参考影像')
|
||
group = parser.add_mutually_exclusive_group()
|
||
group.add_argument(
|
||
'--nearest',
|
||
action='store_const',
|
||
const='nearest',
|
||
dest='method',
|
||
help='启用最邻近插值(默认)'
|
||
)
|
||
group.add_argument(
|
||
'--bilinear',
|
||
action='store_const',
|
||
const='bilinear',
|
||
dest='method',
|
||
help='启用双线性插值'
|
||
)
|
||
parser.set_defaults(method='nearest')
|
||
args = parser.parse_args()
|
||
return args
|
||
|
||
if __name__ == '__main__':
|
||
parser = getParams()
|
||
intiffPath=parser.infile
|
||
outbinPath=parser.outfile
|
||
refbinPath=parser.reffile
|
||
methodstr=parser.method
|
||
print('infile=',intiffPath)
|
||
print('outfile=',outbinPath)
|
||
print('reffile=',refbinPath)
|
||
print('method=',methodstr)
|
||
|
||
resamplemethodgdal=None
|
||
if methodstr == 'nearest':
|
||
resamplemethodgdal=gdal.GRA_NearestNeighbour
|
||
elif methodstr == 'bilinear':
|
||
resamplemethodgdal=gdal.GRA_Bilinear
|
||
else:
|
||
resamplemethodgdal = gdal.GRA_NearestNeighbour
|
||
|
||
resample_to_match(
|
||
image_A_path=intiffPath,
|
||
image_B_path=refbinPath,
|
||
output_path=outbinPath,
|
||
resample_method=resamplemethodgdal # 可选:gdal.GRA_NearestNeighbour(最邻近)
|
||
)
|
||
print("resample to match successfully") |