UAV/post_pro/merge_tif.py
2024-12-23 11:31:20 +08:00

100 lines
3.8 KiB
Python

from osgeo import gdal
import logging
import os
import sys
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
class MergeTif:
def __init__(self, input_tif1, input_tif2, output_tif):
self.input_tif1 = input_tif1
self.input_tif2 = input_tif2
self.output_tif = output_tif
self.logger = logging.getLogger('UAV_Preprocess.MergeTif')
def merge(self):
"""合并两张TIF影像"""
try:
self.logger.info("开始合并TIF影像")
self.logger.info(f"输入影像1: {self.input_tif1}")
self.logger.info(f"输入影像2: {self.input_tif2}")
self.logger.info(f"输出影像: {self.output_tif}")
# 检查输入文件是否存在
if not os.path.exists(self.input_tif1) or not os.path.exists(self.input_tif2):
error_msg = "输入影像文件不存在"
self.logger.error(error_msg)
raise FileNotFoundError(error_msg)
# 打开影像,检查投影是否一致
datasets = [gdal.Open(tif)
for tif in [self.input_tif1, self.input_tif2]]
if None in datasets:
error_msg = "无法打开输入影像文件"
self.logger.error(error_msg)
raise ValueError(error_msg)
projections = [dataset.GetProjection() for dataset in datasets]
self.logger.debug(f"影像1投影: {projections[0]}")
self.logger.debug(f"影像2投影: {projections[1]}")
# 检查投影是否一致
if len(set(projections)) != 1:
error_msg = "影像的投影不一致,请先进行重投影!"
self.logger.error(error_msg)
raise ValueError(error_msg)
# 创建 GDAL Warp 选项
warp_options = gdal.WarpOptions(
format="GTiff",
resampleAlg="average", # 设置重采样方法为平均值
srcNodata=0, # 输入影像中的无效值
dstNodata=0, # 输出影像中的无效值
multithread=True # 启用多线程优化
)
self.logger.info("开始执行影像拼接...")
# 使用 GDAL 的 Warp 方法进行拼接
result = gdal.Warp(
self.output_tif,
[self.input_tif1, self.input_tif2], # 输入多张影像
options=warp_options
)
if result is None:
error_msg = "影像拼接失败"
self.logger.error(error_msg)
raise RuntimeError(error_msg)
# 获取输出影像的基本信息
output_dataset = gdal.Open(self.output_tif)
if output_dataset:
width = output_dataset.RasterXSize
height = output_dataset.RasterYSize
bands = output_dataset.RasterCount
self.logger.info(f"拼接完成,输出影像大小: {width}x{height},波段数: {bands}")
self.logger.info(f"影像拼接成功,输出文件保存至: {self.output_tif}")
except Exception as e:
self.logger.error(f"影像拼接过程中发生错误: {str(e)}", exc_info=True)
raise
if __name__ == "__main__":
from utils.logger import setup_logger
# 定义影像路径
input_tif1 = r"G:\20240930091614\output\grid_1\project\odm_orthophoto\odm_orthophoto.tif"
input_tif2 = r"G:\20240930091614\output\grid_2\project\odm_orthophoto\odm_orthophoto.tif"
output_tif = r"G:\20240930091614\output\merged_orthophoto.tif"
# 设置日志
output_dir = r"E:\studio2\ODM_pro\test"
setup_logger(output_dir)
# 执行拼接
merge_tif = MergeTif(input_tif1, input_tif2, output_tif)
merge_tif.merge()