From 30a451a19ba35f0b82873d8c39cbb3898ca2a16f Mon Sep 17 00:00:00 2001 From: weixin_46229132 Date: Mon, 17 Feb 2025 19:40:45 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=AF=B9=E9=BD=90=E6=96=B9?= =?UTF-8?q?=E5=BC=8F=EF=BC=8C=E4=BD=BF=E7=94=A825d=E7=BA=B9=E7=90=86?= =?UTF-8?q?=E6=A8=A1=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- post_pro/conv_obj.py | 63 ++++++++++++++++---------------------------- utils/odm_monitor.py | 1 + 2 files changed, 24 insertions(+), 40 deletions(-) diff --git a/post_pro/conv_obj.py b/post_pro/conv_obj.py index a026e2d..6e67655 100644 --- a/post_pro/conv_obj.py +++ b/post_pro/conv_obj.py @@ -11,10 +11,8 @@ class ConvertOBJ: def __init__(self, output_dir: str): self.output_dir = output_dir # 用于存储所有grid的UTM范围 - self.min_east = float('inf') - self.min_north = float('inf') - self.max_east = float('-inf') - self.max_north = float('-inf') + self.ref_east = float('inf') + self.ref_north = float('inf') # 初始化UTM到WGS84的转换器 self.transformer = Transformer.from_crs( "EPSG:32649", "EPSG:4326", always_xy=True) @@ -25,39 +23,31 @@ class ConvertOBJ: os.makedirs(os.path.join(self.output_dir, "osgb", "Data"), exist_ok=True) - # 第一次遍历:获取所有grid的UTM范围 - for grid_id, points in grid_points.items(): - base_dir = os.path.join( - self.output_dir, - f"grid_{grid_id[0]}_{grid_id[1]}", - "project" - ) - log_file = os.path.join( - base_dir, "odm_orthophoto", "odm_orthophoto_log.txt") - east_offset, north_offset = self.read_utm_offset(log_file) + # 以第一个grid的UTM坐标作为参照系 + first_grid_id = list(grid_points.keys())[0] + first_grid_dir = os.path.join( + self.output_dir, + f"grid_{first_grid_id[0]}_{first_grid_id[1]}", + "project" + ) + log_file = os.path.join( + first_grid_dir, "odm_orthophoto", "odm_orthophoto_log.txt") + self.ref_east, self.ref_north = self.read_utm_offset(log_file) - # 更新UTM范围 - self.min_east = min(self.min_east, east_offset) - self.min_north = min(self.min_north, north_offset) - self.max_east = max(self.max_east, east_offset) - self.max_north = max(self.max_north, north_offset) - - tile_infos = [] for grid_id in grid_points.keys(): try: - tile_info = self._convert_single_grid(grid_id, grid_points) - tile_infos.append(tile_info) + self._convert_single_grid(grid_id, grid_points) except Exception as e: self.logger.error(f"网格 {grid_id} 转换失败: {str(e)}") - self._create_merged_metadata(tile_infos) + self._create_merged_metadata() def _convert_single_grid(self, grid_id, grid_points): """转换单个网格的OBJ文件""" # 1. 构建相关路径 grid_name = f"grid_{grid_id[0]}_{grid_id[1]}" project_dir = os.path.join(self.output_dir, grid_name, "project") - texturing_dir = os.path.join(project_dir, "odm_texturing") + texturing_dir = os.path.join(project_dir, "odm_texturing_25d") texturing_dst_dir = os.path.join(project_dir, "odm_texturing_dst") opensfm_dir = os.path.join(project_dir, "opensfm") log_file = os.path.join( @@ -84,11 +74,6 @@ class ConvertOBJ: except subprocess.CalledProcessError as e: raise RuntimeError(f"OSGB转换失败: {str(e)}") - # 4. 读取地理信息,计算中心点坐标 - ref_lla_file = os.path.join(opensfm_dir, "reference_lla.json") - with open(ref_lla_file, 'r') as f: - ref_lla = json.load(f) - # 5. 创建OSGB目录结构,复制文件 osgb_base_dir = os.path.join(self.output_dir, "osgb") data_dir = os.path.join(osgb_base_dir, "Data") @@ -98,15 +83,11 @@ class ConvertOBJ: tile_dir, f"Tile_{grid_id[0]}_{grid_id[1]}.osgb") shutil.copy2(output_osgb, target_osgb) - return ref_lla - - def _create_merged_metadata(self, tile_infos): + def _create_merged_metadata(self): """创建合并后的metadata.xml文件""" - center_lon = sum(ref_lla['longitude'] - for ref_lla in tile_infos) / len(tile_infos) - center_lat = sum(ref_lla['latitude'] - for ref_lla in tile_infos) / len(tile_infos) - + # 转换为WGS84经纬度 + center_lon, center_lat = self.transformer.transform( + self.ref_east, self.ref_north) metadata_content = f""" EPSG:4326 @@ -152,6 +133,8 @@ class ConvertOBJ: shutil.copy2(os.path.join(texturing_dir, "odm_textured_model_geo.mtl"), os.path.join(texturing_dst_dir, "odm_textured_model_geo.mtl")) east_offset, north_offset = utm_offset + self.logger.info( + f"UTM坐标偏移:{east_offset - self.ref_east}, {north_offset - self.ref_north}") try: with open(obj_file, 'r') as f_in, open(obj_dst_file, 'w') as f_out: @@ -160,8 +143,8 @@ class ConvertOBJ: # 处理顶点坐标行 parts = line.strip().split() # 使用相对于整体最小UTM坐标的偏移 - x = float(parts[1]) + (east_offset - self.min_east) - y = float(parts[2]) + (north_offset - self.min_north) + x = float(parts[1]) + (east_offset - self.ref_east) + y = float(parts[2]) + (north_offset - self.ref_north) z = float(parts[3]) f_out.write(f'v {x:.6f} {z:.6f} {-y:.6f}\n') else: diff --git a/utils/odm_monitor.py b/utils/odm_monitor.py index f6f6643..f754b1a 100644 --- a/utils/odm_monitor.py +++ b/utils/odm_monitor.py @@ -182,6 +182,7 @@ class ODMProcessMonitor: result = subprocess.run( docker_command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + # TODO 关闭process,内存堆积 stdout, stderr = result.stdout.decode( 'utf-8'), result.stderr.decode('utf-8')