diff --git a/odm_preprocess.py b/odm_preprocess.py index 835b428..cc07a99 100644 --- a/odm_preprocess.py +++ b/odm_preprocess.py @@ -185,6 +185,13 @@ class ImagePreprocessor: self.visualizer.visualize_filter_step( self.gps_points, previous_points, "3-Time Group Overlap") + def calculate_center_coordinates(self): + """计算剩余点的中心经纬度坐标""" + mean_lat = self.gps_points['lat'].mean() + mean_lon = self.gps_points['lon'].mean() + self.logger.info(f"区域中心坐标:纬度 {mean_lat:.6f}, 经度 {mean_lon:.6f}") + return mean_lat, mean_lon + def filter_alternate_images(self): """按时间顺序隔一个删一个图像来降低密度""" previous_points = self.gps_points.copy() @@ -258,13 +265,13 @@ class ImagePreprocessor: merger = MergeObj(self.config.output_dir) merger.merge_grid_obj(grid_points, translations) - def convert_obj(self, grid_points: Dict[tuple, pd.DataFrame]): + def convert_obj(self, grid_points: Dict[tuple, pd.DataFrame], center_lat: float, center_lon: float): """转换OBJ模型""" self.logger.info("开始转换OBJ模型") - converter = ConvertOBJ(self.config.output_dir) + converter = ConvertOBJ(self.config.output_dir, center_lat, center_lon) converter.convert_grid_obj(grid_points) - def post_process(self, successful_grid_points: Dict[tuple, pd.DataFrame], grid_points: Dict[tuple, pd.DataFrame], translations: Dict[tuple, tuple]): + def post_process(self, successful_grid_points: Dict[tuple, pd.DataFrame], grid_points: Dict[tuple, pd.DataFrame], translations: Dict[tuple, tuple], center_lat: float, center_lon: float): """后处理:合并或复制处理结果""" if len(successful_grid_points) < len(grid_points): self.logger.warning( @@ -277,12 +284,12 @@ class ImagePreprocessor: elif self.config.mode == "三维模式": # self.merge_ply(successful_grid_points) # self.merge_obj(successful_grid_points, translations) - self.convert_obj(successful_grid_points) + self.convert_obj(successful_grid_points, center_lat, center_lon) else: self.merge_tif(successful_grid_points, self.config.produce_dem) # self.merge_ply(successful_grid_points) # self.merge_obj(successful_grid_points, translations) - self.convert_obj(successful_grid_points) + self.convert_obj(successful_grid_points, center_lat, center_lon) def process(self): """执行完整的预处理流程""" @@ -291,6 +298,7 @@ class ImagePreprocessor: self.cluster() self.filter_isolated_points() self.filter_time_group_overlap() + center_lat, center_lon = self.calculate_center_coordinates() # self.filter_alternate_images() grid_points, translations = self.divide_grids() self.copy_images(grid_points) @@ -300,7 +308,7 @@ class ImagePreprocessor: grid_points, self.config.produce_dem) self.post_process(successful_grid_points, - grid_points, translations) + grid_points, translations, center_lat, center_lon) except Exception as e: self.logger.error(f"处理过程中发生错误: {str(e)}", exc_info=True) diff --git a/post_pro/conv_obj.py b/post_pro/conv_obj.py index 3480448..5f495fa 100644 --- a/post_pro/conv_obj.py +++ b/post_pro/conv_obj.py @@ -5,8 +5,10 @@ import shutil import logging class ConvertOBJ: - def __init__(self, output_dir: str): + def __init__(self, output_dir: str, center_lat: float, center_lon: float): self.output_dir = output_dir + self.center_lat = center_lat + self.center_lon = center_lon self.logger = logging.getLogger('UAV_Preprocess.ConvertOBJ') def convert_grid_obj(self, grid_points): @@ -18,6 +20,9 @@ class ConvertOBJ: except Exception as e: self.logger.error(f"网格 {grid_id} 转换失败: {str(e)}") + # 在所有网格处理完成后创建总的metadata.xml + self._create_merged_metadata() + def _convert_single_grid(self, grid_id): """转换单个网格的OBJ文件""" # 1. 构建相关路径 @@ -51,28 +56,30 @@ class ConvertOBJ: ref_lla = json.load(f) # 4. 创建OSGB目录结构 - osgb_dir = os.path.join(self.output_dir, "osgb", grid_name) - data_dir = os.path.join(osgb_dir, "Data") - tile_dir = os.path.join(data_dir, "Tile") + osgb_base_dir = os.path.join(self.output_dir, "osgb") + data_dir = os.path.join(osgb_base_dir, "Data") + tile_dir = os.path.join(data_dir, f"Tile_{grid_id[0]}_{grid_id[1]}") os.makedirs(tile_dir, exist_ok=True) - # 5. 创建metadata.xml + # 5. 复制OSGB文件 + target_osgb = os.path.join(tile_dir, f"Tile_{grid_id[0]}_{grid_id[1]}.osgb") + shutil.copy2(output_osgb, target_osgb) + + self.logger.info(f"网格 {grid_id} 转换完成") + + def _create_merged_metadata(self): + """创建合并后的metadata.xml文件""" metadata_content = f""" EPSG:4326 - {ref_lla['longitude']},{ref_lla['latitude']},0.000000 + {self.center_lon},{self.center_lat},0.000000 Visible """ - metadata_file = os.path.join(osgb_dir, "metadata.xml") + metadata_file = os.path.join(self.output_dir, "osgb", "metadata.xml") with open(metadata_file, 'w', encoding='utf-8') as f: f.write(metadata_content) - - # 6. 复制OSGB文件 - shutil.copy2(output_osgb, os.path.join(tile_dir, "Tile.osgb")) - - self.logger.info(f"网格 {grid_id} 转换完成")