def process(self) -> str: """ todo 负责人 赵宇飞 在这里提取影像数据的空间信息, 以文件形式存储在self.file_content.work_root_dir下 注意返回的串中有空间信息的文件名 注意: 如果出现内存泄漏现象, 则使用新建进程提取元数据, 放置到文件中, 在本进程中解析元数据!!! :return: """ result_process = self.process_raster() if CResult.result_success(result_process): file_path = self.file_content.work_root_dir dict_temp_file_name = { self.Name_Native_Center: '{0}_native_center.wkt'.format(self.object_name), self.Name_Native_BBox: '{0}_native_bbox.wkt'.format(self.object_name), self.Name_Native_Geom: '{0}_native_geom.wkt'.format(self.object_name), self.Name_Wgs84_Center: '{0}_wgs84_center.wkt'.format(self.object_name), self.Name_Wgs84_BBox: '{0}_wgs84_bbox.wkt'.format(self.object_name), self.Name_Wgs84_Geom: '{0}_wgs84_geom.wkt'.format(self.object_name) } dict_temp_prj_name = { self.Name_Prj_Wkt: CResult.result_info(result_process, self.Name_Prj_Wkt, None), self.Name_Prj_Proj4: CResult.result_info(result_process, self.Name_Prj_Proj4, None), self.Name_Prj_Project: CResult.result_info(result_process, self.Name_Prj_Project, None), self.Name_Prj_Coordinate: CResult.result_info(result_process, self.Name_Prj_Coordinate, None), self.Name_Prj_Source: CResult.result_info(result_process, self.Name_Prj_Source, None), self.Name_Prj_Zone: CResult.result_info(result_process, self.Name_Prj_Zone, None), self.Name_Prj_Degree: CResult.result_info(result_process, self.Name_Prj_Degree, None) } result = CResult.merge_result(self.Success, '处理完毕!') for file_type, file_name in dict_temp_file_name.items(): result = CResult.merge_result_info(result, file_type, CFile.join_file(file_path, file_name)) for prj_type, prj_name in dict_temp_prj_name.items(): result = CResult.merge_result_info(result, prj_type, prj_name) else: result = CResult.merge_result(self.Failure, CResult.result_message(result_process)) return result
def process(self) -> str: """ todo 负责人 赵宇飞 在这里提取矢量数据的快视图, 将元数据文件存储在self.file_content.view_root_dir下 注意返回的串中有快视图和拇指图的文件名 注意: 如果出现内存泄漏现象, 则使用新建进程提取元数据, 放置到文件中, 在本进程中解析元数据!!! :return: """ result = CResult.merge_result(self.Success, '处理完毕!') result = CResult.merge_result_info(result, self.Name_Browse, '/aa/bb_browse.png') result = CResult.merge_result_info(result, self.Name_Thumb, '/aa/bb_thumb.png') return result
def process(self) -> str: """ 完成 负责人 张源博、赵宇飞 在这里提取影像数据的快视图, 将元数据文件存储在self.file_content.view_root_dir下 注意返回的串中有快视图和拇指图的文件名 注意: 如果出现内存泄漏现象, 则使用新建进程提取元数据, 放置到文件中, 在本进程中解析元数据!!! :return: """ # 获取对象类型 type = 'default' group = 'default' catalog = 'default' # 构建数据对象object对应的识别插件,获取get_information里面的信息 class_classified_obj = CObject.get_plugins_instance_by_object_id(self.file_info.db_server_id, self.object_id) if class_classified_obj is not None: plugins_info = class_classified_obj.get_information() type = CUtils.dict_value_by_name(plugins_info, class_classified_obj.Plugins_Info_Type, 'default') group = CUtils.dict_value_by_name(plugins_info, class_classified_obj.Plugins_Info_Group, 'default') catalog = CUtils.dict_value_by_name(plugins_info, class_classified_obj.Plugins_Info_Catalog, 'default') create_time = CTime.today() create_format_time = CTime.format_str(create_time, '%Y%m%d') year = CTime.format_str(create_time, '%Y') month = CTime.format_str(create_time, '%m') day = CTime.format_str(create_time, '%d') sep = CFile.sep() # 操作系统的不同处理分隔符不同 sep_list = [catalog, group, type, year, month, day] relative_path_part = sep.join(sep_list) # 相对路径格式 view_relative_path_browse = r'{2}{0}{2}{1}_browse.png'.format(relative_path_part, self.object_id, sep) view_relative_path_thumb = r'{2}{0}{2}{1}_thumb.jpg'.format(relative_path_part, self.object_id, sep) view_relative_path_geotiff = r'{2}{0}{2}{1}_browse.tiff'.format(relative_path_part, self.object_id, sep) browse_full_path = CFile.join_file(self.file_content.view_root_dir, view_relative_path_browse) thumb_full_path = CFile.join_file(self.file_content.view_root_dir, view_relative_path_thumb) geotiff_full_path = CFile.join_file(self.file_content.view_root_dir, view_relative_path_geotiff) # 进程调用模式 json_out_view = CJson() json_out_view.set_value_of_name('image_path', self.file_info.file_name_with_full_path) json_out_view.set_value_of_name('browse_full_path', browse_full_path) json_out_view.set_value_of_name('thumb_full_path', thumb_full_path) json_out_view.set_value_of_name('geotiff_full_path', geotiff_full_path) result_view = CProcessUtils.processing_method(self.create_view_json, json_out_view) # result_view = self.create_view(self.file_info.file_name_with_full_path, browse_full_path, thumb_full_path, # geotiff_full_path) # result_view = self.create_view_json(json_out_view) if CResult.result_success(result_view): result = CResult.merge_result(self.Success, '处理完毕!') result = CResult.merge_result_info(result, self.Name_Browse, view_relative_path_browse) result = CResult.merge_result_info(result, self.Name_Thumb, view_relative_path_thumb) result = CResult.merge_result_info(result, self.Name_Browse_GeoTiff, view_relative_path_geotiff) else: result = result_view return result
def access(self, obj_id, obj_name, obj_type, quality) -> str: """ 解析数管中识别出的对象, 与第三方模块的访问能力, 在本方法中进行处理 返回的json格式字符串中, 是默认的CResult格式, 但是在其中还增加了Access属性, 通过它反馈当前对象是否满足第三方模块的应用要求 注意: 一定要反馈Access属性 :return: """ result = self.__test_module_obj(obj_id, obj_name) if not CResult.result_success(result): return CResult.merge_result_info(result, self.Name_Access, self.DataAccess_Forbid) else: return CResult.merge_result_info(result, self.Name_Access, self.DataAccess_Pass)
def process(self) -> str: """ """ browse_full_path = CFile.join_file(self.view_path, '{0}_browse.png'.format(self.object_id)) thumb_full_path = CFile.join_file(self.view_path, '{0}_thumb.jpg'.format(self.object_id)) geotiff_full_path = CFile.join_file(self.view_path, '{0}_browse.tiff'.format(self.object_id)) # 进程调用模式 json_out_view = CJson() json_out_view.set_value_of_name('image_path', self.transform_file) json_out_view.set_value_of_name('browse_full_path', browse_full_path) json_out_view.set_value_of_name('thumb_full_path', thumb_full_path) json_out_view.set_value_of_name('geotiff_full_path', geotiff_full_path) result_view = CProcessUtils.processing_method(self.create_view_json, json_out_view) # result_view = self.create_view(self.file_info.file_name_with_full_path, browse_full_path, thumb_full_path, # geotiff_full_path) # result_view = self.create_view_json(json_out_view) if CResult.result_success(result_view): # 清理不必要的文件 delect_file_list = list() delect_file_list.append('{0}.aux.xml'.format(browse_full_path)) delect_file_list.append('{0}.aux.xml'.format(thumb_full_path)) delect_file_list.append(geotiff_full_path) for delect_file in delect_file_list: if CFile.file_or_path_exist(delect_file): CFile.remove_file(delect_file) result = CResult.merge_result(self.Success, '处理完毕!') result = CResult.merge_result_info(result, self.Name_Browse, CFile.file_name(browse_full_path)) result = CResult.merge_result_info(result, self.Name_Thumb, CFile.file_name(thumb_full_path)) result = CResult.merge_result_info(result, self.Name_Browse_GeoTiff, CFile.file_name(geotiff_full_path)) else: # 清理不必要的文件 delect_file_list = list() delect_file_list.append(browse_full_path) delect_file_list.append(thumb_full_path) delect_file_list.append('{0}.aux.xml'.format(browse_full_path)) delect_file_list.append('{0}.aux.xml'.format(thumb_full_path)) delect_file_list.append(geotiff_full_path) for delect_file in delect_file_list: if CFile.file_or_path_exist(delect_file): CFile.remove_file(delect_file) result = result_view return result
def process(self) -> str: """ 在这里提取矢量数据的元数据, 将元数据文件存储在self.file_content.work_root_dir下, 固定名称为self.FileName_MetaData, 注意返回的串中有元数据的格式 :return: """ result = super().process() metadata_main_name_with_path = CFile.join_file( self.file_info.file_path, self.file_info.file_main_name) metadata_filename = '{0}.xml'.format(metadata_main_name_with_path[:-2]) format_metadata = self.MetaDataFormat_XML result = CResult.merge_result_info(result, self.Name_FileName, metadata_filename) return CResult.merge_result_info(result, self.Name_Format, format_metadata)
def access(self, obj_id, obj_name, obj_type, quality) -> str: """ 解析数管中识别出的对象, 与第三方模块的访问能力, 在本方法中进行处理 返回的json格式字符串中, 是默认的CResult格式, 但是在其中还增加了Access属性, 通过它反馈当前对象是否满足第三方模块的应用要求 注意: 一定要反馈Access属性 :return: """ result = super().access(obj_id, obj_name, obj_type, quality) return CResult.merge_result_info(result, self.Name_Access, self.DataAccess_Wait)
def process(self) -> str: """ 在这里提取矢量数据的元数据, 将元数据文件存储在self.file_content.work_root_dir下, 固定名称为self.FileName_MetaData, 注意返回的串中有元数据的格式 :return: """ result = super().process() ds_metadata = CFactory().give_me_db( self.file_info.db_server_id).one_row( ''' select dsometadatatext, dsometadatajson, dsometadataxml from dm2_storage_object where dsoid = :object_id ''', {'object_id': self.object_id}) metadata_filename = CFile.join_file( self.file_content.work_root_dir, '{0}.metadata'.format(self.object_name)) text_metadata = ds_metadata.value_by_name(0, 'dsometadatatext', None) json_metadata = ds_metadata.value_by_name(0, 'dsometadatajson', None) xml_metadata = ds_metadata.value_by_name(0, 'dsometadataxml', None) format_metadata = self.MetaDataFormat_Text if json_metadata is not None: format_metadata = self.MetaDataFormat_Json CJson.str_2_file(json_metadata, metadata_filename) elif xml_metadata is not None: format_metadata = self.MetaDataFormat_XML CXml.str_2_file(xml_metadata, metadata_filename) elif text_metadata is not None: format_metadata = self.MetaDataFormat_XML CFile.str_2_file(text_metadata, metadata_filename) else: return result result = CResult.merge_result_info(result, self.Name_FileName, metadata_filename) return CResult.merge_result_info(result, self.Name_Format, format_metadata)
def access(self) -> str: """ 解析数管中识别出的对象, 与第三方模块的访问能力, 在本方法中进行处理 返回的json格式字符串中, 是默认的CResult格式, 但是在其中还增加了Access属性, 通过它反馈当前对象是否满足第三方模块的应用要求 注意: 一定要反馈Access属性 :return: """ result = CResult.merge_result( self.Success, '模块[{0}.{1}]对对象[{2}]的访问能力已经分析完毕!'.format( CUtils.dict_value_by_name(self.information(), self.Name_ID, ''), CUtils.dict_value_by_name(self.information(), self.Name_Title, ''), self._obj_name)) return CResult.merge_result_info(result, self.Name_Access, self.DataAccess_Forbid)
def process(self) -> str: """ 完成 负责人 赵宇飞 在这里提取影像数据的元数据, 将元数据文件存储在self.file_content.work_root_dir下, 固定名称为self.FileName_MetaData, 注意返回的串中有元数据的格式 注意: 如果出现内存泄漏现象, 则使用新建进程提取元数据, 放置到文件中, 在本进程中解析元数据!!! :return: """ out_metadata_file_fullname = CFile.join_file(self.file_content.work_root_dir, self.FileName_MetaData) raster_mdreader = CRasterMDReader(self.file_info.file_name_with_full_path) # result = raster_mdreader.get_metadata_2_file(out_metadata_file_fullname) result = CProcessUtils.processing_method(raster_mdreader.get_metadata_2_file, out_metadata_file_fullname) # 进程调用模式 # p_one = Process(target=raster_mdreader.get_metadata_2_file, args=(out_metadata_file_fullname,)) # p_one.start() # p_one.join() return CResult.merge_result_info(result, self.Name_Format, self.MetaDataFormat_Json)
def _do_access(self) -> str: try: quality_info_xml = self._quality_info # 获取质检xml quality_summary = self._dataset.value_by_name(0, 'dso_quality_summary', '') quality_summary_json = CJson() quality_summary_json.load_obj(quality_summary) access_wait_flag = self.DB_False # 定义等待标志,为True则存在检查项目为等待 access_forbid_flag = self.DB_False # 定义禁止标志,为True则存在检查项目为禁止 message = '' # 文件与影像质检部分 file_qa = quality_summary_json.xpath_one('total', '') image_qa = quality_summary_json.xpath_one('metadata.data', '') if CUtils.equal_ignore_case(file_qa, self.QA_Result_Error) \ or CUtils.equal_ignore_case(image_qa, self.QA_Result_Error): message = message + '[数据与其相关文件的质检存在error!请进行修正!]' access_forbid_flag = self.DB_True elif CUtils.equal_ignore_case(file_qa, self.QA_Result_Warn) \ or CUtils.equal_ignore_case(image_qa, self.QA_Result_Warn): message = message + '[数据与其相关文件的质检存在warn!请进行检查!]' access_wait_flag = self.DB_True elif CUtils.equal_ignore_case(quality_summary, ''): message = message + '[数据质检未进行,可能数据存在问题!请进行检查!]' access_forbid_flag = self.DB_True else: pass for qa_name, qa_id in self.access_check_dict().items(): # 循环写好的检查列表 # qa_id = CUtils.dict_value_by_name(access_check_dict, 'qa_id', '') # 获取id qa_node = quality_info_xml.xpath_one("//item[@id='{0}']".format(qa_id)) # 查询xml中的节点 if qa_node is not None: node_result = CXml.get_attr(qa_node, self.Name_Result, '', False) # 获取质检结果 if CUtils.equal_ignore_case(node_result, self.QA_Result_Pass): pass elif CUtils.equal_ignore_case(node_result, self.QA_Result_Warn): # 警告则等待 message = message + '[业务元数据的质检中,项目{0}不符合要求,建议修正!]'.format(qa_name) access_wait_flag = self.DB_True else: # 错误以及其他情况,比如'',或者为其他字段 message = message + '[业务元数据的质检中,项目{0}不符合要求,必须修改后方可入库!]'.format(qa_name) access_forbid_flag = self.DB_True else: message = message + '[业务元数据的质检中,没有项目{0},请进行修正!]'.format(qa_name) access_forbid_flag = self.DB_True # 数据库部分 access_wait_flag, access_forbid_flag, message = \ self.db_access_check(access_wait_flag, access_forbid_flag, message) # 开始进行检查的结果判断 access_flag = self.DataAccess_Pass if access_forbid_flag: access_flag = self.DataAccess_Forbid elif access_wait_flag: access_flag = self.DataAccess_Wait if CUtils.equal_ignore_case(message, ''): message = '模块可以进行访问!' result = CResult.merge_result( self.Success, '模块[{0}.{1}]对对象[{2}]的访问能力已经分析完毕!分析结果为:{3}'.format( CUtils.dict_value_by_name(self.information(), self.Name_ID, ''), CUtils.dict_value_by_name(self.information(), self.Name_Title, ''), self._obj_name, message ) ) return CResult.merge_result_info(result, self.Name_Access, access_flag) except Exception as error: result = CResult.merge_result( self.Failure, '模块[{0}.{1}]对对象[{2}]的访问能力的分析存在异常!详细情况: {3}!'.format( CUtils.dict_value_by_name(self.information(), self.Name_ID, ''), CUtils.dict_value_by_name(self.information(), self.Name_Title, ''), self._obj_name, error.__str__() ) ) return CResult.merge_result_info(result, self.Name_Access, self.DataAccess_Forbid)
def process_vector(self) -> str: try: # file_name_with_full_path = r'D:\test\vector_test\石嘴山市-3xq.json' # file_main_name = CFile.file_main_name(file_name_with_full_path) # file_path = CFile.file_path(file_name_with_full_path) xml_obj = self.metadata.metadata_xml() # <editor-fold desc="1.空间坐标信息"> wkt_info = 'POLYGON((${min_x} ${max_y},${max_x} ${max_y},' \ '${max_x} ${min_y},${min_x} ${min_y},${min_x} ${max_y}))' # 四至坐标 native_max_x = CUtils.to_decimal( xml_obj.get_element_text_by_xpath_one('/TileMetadata/MaxLon')) native_max_y = CUtils.to_decimal( xml_obj.get_element_text_by_xpath_one('/TileMetadata/MaxLat')) native_min_x = CUtils.to_decimal( xml_obj.get_element_text_by_xpath_one('/TileMetadata/MinLon')) native_min_y = CUtils.to_decimal( xml_obj.get_element_text_by_xpath_one('/TileMetadata/MinLat')) if (native_max_x is None) or (native_max_y is None) \ or (native_min_x is None) or (native_min_y is None): native_center_wkt = None native_bbox_wkt = None geom_native_wkt = None else: dict_native = { 'max_x': CUtils.any_2_str(native_max_x), 'max_y': CUtils.any_2_str(native_max_y), 'min_x': CUtils.any_2_str(native_min_x), 'min_y': CUtils.any_2_str(native_min_y) } # 中心坐标 center_x = (native_max_x - native_min_x) / 2 + native_min_x center_y = (native_max_y - native_min_y) / 2 + native_min_y native_center_wkt = 'POINT({0} {1})'.format(center_x, center_y) # 外边框、外包框 native_bbox_wkt = CUtils.replace_placeholder( wkt_info[:], dict_native) geom_native_wkt = native_bbox_wkt file_path = self.file_content.work_root_dir file_main_name = self.object_name native_center_filepath = CFile.join_file( file_path, file_main_name + '_native_center.wkt') CFile.str_2_file(native_center_wkt, native_center_filepath) native_bbox_filepath = CFile.join_file( file_path, file_main_name + '_native_bbox.wkt') CFile.str_2_file(native_bbox_wkt, native_bbox_filepath) native_geom_filepath = CFile.join_file( file_path, file_main_name + '_native_geom.wkt') CFile.str_2_file(geom_native_wkt, native_geom_filepath) projection = xml_obj.get_element_text_by_xpath_one( '/TileMetadata/SpatialReference/PRJ') if (projection is not None) and (not CUtils.equal_ignore_case( projection, '')): source_projection = osr.SpatialReference(wkt=projection) source = source_projection.GetAttrValue('GEOGCS', 0) # 坐标系名称 prosrs = osr.SpatialReference() if prosrs.ImportFromWkt(projection) == gdal.CE_None: proj_wkt = prosrs.ExportToWkt() native_wkt = proj_wkt else: native_wkt = projection native_proj4 = prosrs.ExportToProj4() spatial = None rb = (0, 0) lu = (0, 0) geosrs = prosrs.CloneGeogCS() ct = osr.CreateCoordinateTransformation(prosrs, geosrs) if ct is not None: rb = ct.TransformPoint(native_max_x, native_max_y) lu = ct.TransformPoint(native_min_x, native_min_y) wgs84_min_x = lu[0] wgs84_max_y = lu[1] wgs84_max_x = rb[0] wgs84_min_y = rb[1] dict_wgs84 = { 'max_x': CUtils.any_2_str(wgs84_max_x), 'max_y': CUtils.any_2_str(wgs84_max_y), 'min_x': CUtils.any_2_str(wgs84_min_x), 'min_y': CUtils.any_2_str(wgs84_min_y) } # 中心坐标 center_x = (wgs84_max_x - wgs84_min_x) / 2 + wgs84_min_x center_y = (wgs84_max_y - wgs84_min_y) / 2 + wgs84_min_y wgs84_center_wkt = 'POINT({0} {1})'.format( center_x, center_y) # 外边框、外包框 wgs84_bbox_wkt = CUtils.replace_placeholder( wkt_info[:], dict_wgs84) wgs84_geom_wkt = wgs84_bbox_wkt wgs84_center_filepath = CFile.join_file( file_path, file_main_name + '_wgs84_center.wkt') CFile.str_2_file(wgs84_center_wkt, wgs84_center_filepath) wgs84_bbox_filepath = CFile.join_file( file_path, file_main_name + '_wgs84_bbox.wkt') CFile.str_2_file(wgs84_bbox_wkt, wgs84_bbox_filepath) wgs84_geom_filepath = CFile.join_file( file_path, file_main_name + '_wgs84_geom.wkt') CFile.str_2_file(wgs84_geom_wkt, wgs84_geom_filepath) # </editor-fold> # <editor-fold desc="2.投影信息"> native_source = CResource.Prj_Source_Data # 坐标系 native_coordinate = None # 3度带/6度带 native_degree = None # 投影方式 native_project = None # 带号 native_zone = None # 创建SpatialReference对象,导入wkt信息 spatial_ref = osr.SpatialReference(wkt=native_wkt) if spatial_ref.IsProjected(): native_project = spatial_ref.GetAttrValue('PROJECTION') native_coordinate = spatial_ref.GetAttrValue('GEOGCS') # native_degree = spatial_ref.GetAttrValue('GEOGCS|UNIT', 1) native_degree, native_zone = self.get_prj_degree_zone( spatial_ref) elif spatial_ref.IsGeocentric(): native_project = None native_coordinate = spatial_ref.GetAttrValue('GEOGCS') native_degree = None native_zone = None # </editor-fold> result = CResult.merge_result(self.Success, '处理完毕!') result = CResult.merge_result_info(result, self.Name_Prj_Wkt, native_wkt) result = CResult.merge_result_info(result, self.Name_Prj_Proj4, native_proj4) result = CResult.merge_result_info(result, self.Name_Prj_Project, native_project) result = CResult.merge_result_info(result, self.Name_Prj_Coordinate, native_coordinate) result = CResult.merge_result_info(result, self.Name_Prj_Source, native_source) result = CResult.merge_result_info(result, self.Name_Prj_Zone, native_zone) result = CResult.merge_result_info(result, self.Name_Prj_Degree, native_degree) return result # return CResult.merge_result(self.Success, '处理完毕!') else: return CResult.merge_result(self.Success, '处理完毕!') except Exception as error: CLogger().warning('矢量数据的空间信息处理出现异常, 错误信息为: {0}'.format( error.__str__())) return CResult.merge_result( self.Failure, '矢量数据的空间信息处理出现异常,错误信息为:{0}!'.format(error.__str__()))
def access(self) -> str: try: # quality_info_xml = self._quality_info # 获取质检xml quality_summary = self._dataset.value_by_name( 0, 'dso_quality_summary', '') quality_summary_json = CJson() quality_summary_json.load_obj(quality_summary) access_wait_flag = self.DB_False # 定义等待标志,为True则存在检查项目为等待 access_forbid_flag = self.DB_False # 定义禁止标志,为True则存在检查项目为禁止 message = '' # 文件与影像质检部分 file_qa = quality_summary_json.xpath_one('total', '') image_qa = quality_summary_json.xpath_one('metadata.data', '') business_qa = quality_summary_json.xpath_one( 'metadata.business', '') if CUtils.equal_ignore_case(file_qa, self.QA_Result_Error) \ or CUtils.equal_ignore_case(image_qa, self.QA_Result_Error) \ or CUtils.equal_ignore_case(business_qa, self.QA_Result_Error): message = message + '[数据与其相关文件的质检存在error!请进行修正!]' access_forbid_flag = self.DB_True elif CUtils.equal_ignore_case(file_qa, self.QA_Result_Warn) \ or CUtils.equal_ignore_case(image_qa, self.QA_Result_Warn) \ or CUtils.equal_ignore_case(business_qa, self.QA_Result_Warn): message = message + '[数据与其相关文件的质检存在warn!请进行检查!]' access_wait_flag = self.DB_True else: pass # 数据库部分 access_wait_flag, access_forbid_flag, message = \ self.db_access_check(access_wait_flag, access_forbid_flag, message) # 开始进行检查的结果判断 access_flag = self.DataAccess_Pass if access_forbid_flag: access_flag = self.DataAccess_Forbid elif access_wait_flag: access_flag = self.DataAccess_Wait if CUtils.equal_ignore_case(message, ''): message = '模块可以进行访问!' result = CResult.merge_result( self.Success, '模块[{0}.{1}]对对象[{2}]的访问能力已经分析完毕!分析结果为:{3}'.format( CUtils.dict_value_by_name(self.information(), self.Name_ID, ''), CUtils.dict_value_by_name(self.information(), self.Name_Title, ''), self._obj_name, message)) return CResult.merge_result_info(result, self.Name_Access, access_flag) except Exception as error: result = CResult.merge_result( self.Failure, '模块[{0}.{1}]对对象[{2}]的访问能力的分析存在异常!详细情况: {3}!'.format( CUtils.dict_value_by_name(self.information(), self.Name_ID, ''), CUtils.dict_value_by_name(self.information(), self.Name_Title, ''), self._obj_name, error.__str__())) return CResult.merge_result_info(result, self.Name_Access, self.DataAccess_Forbid)
def process(self) -> str: """ 在这里提取文档数据的元数据, 将元数据文件存储在self.file_content.work_root_dir下, 固定名称为self.FileName_MetaData, 注意返回的串中有元数据的格式 注意: 如果出现内存泄漏现象, 则使用新建进程提取元数据, 放置到文件中, 在本进程中解析元数据!!! :return: """ default_result = super().process() out_metadata_file_fullname = CFile.join_file( self.file_content.work_root_dir, self.FileName_MetaData) in_file_fullname = self.file_info.file_name_with_full_path if not settings.application.xpath_one( self.Path_Setting_Dependence_Tika_Enable, True): return default_result tika_dependence_mode = settings.application.xpath_one( self.Path_Setting_Dependence_Tika_Mode, self.Name_Server) if CUtils.equal_ignore_case(tika_dependence_mode, self.Name_Server): tika_server_url = settings.application.xpath_one( self.Path_Setting_Dependence_Tika_Server_Url, None) tika_server_connect_timeout = settings.application.xpath_one( self.Path_Setting_Dependence_Tika_Server_Timeout, 30) if CUtils.equal_ignore_case(tika_server_url, ''): return default_result try: parsed = TikaServer.from_file( in_file_fullname, tika_server_url, requestOptions={'timeout': tika_server_connect_timeout}) meta_data_dict = parsed["metadata"] json_obj = CJson() json_obj.load_obj(meta_data_dict) json_obj.to_file(out_metadata_file_fullname) return CResult.merge_result_info( CResult.merge_result( self.Success, '文档[{0}]的元数据提取成功'.format(in_file_fullname)), self.Name_Format, self.MetaDataFormat_Json) except Exception as error: return CResult.merge_result( self.Failure, '文档[{0}]的元数据提取过程出现错误, 详细信息为: [{1}]'.format( in_file_fullname, error.__str__())) else: tika_application = settings.application.xpath_one( self.Path_Setting_Dependence_Tika_Client_App, None) if CUtils.equal_ignore_case(tika_application, ''): return default_result if not CFile.file_or_path_exist(tika_application): return CResult.merge_result( self.Failure, '文档[{0}]的元数据无法提取, 详细原因为: [依赖中间件{1}文件不存在, 请修正后重试!]'.format( in_file_fullname, tika_application)) try: tika_client = TikaApplication(file_jar=tika_application) meta_data_dict = tika_client.extract_only_metadata( in_file_fullname) json_obj = CJson() json_obj.load_obj(meta_data_dict) json_obj.to_file(out_metadata_file_fullname) return CResult.merge_result_info( CResult.merge_result( self.Success, '文档[{0}]的元数据提取成功'.format(in_file_fullname)), self.Name_Format, self.MetaDataFormat_Json) except Exception as error: return CResult.merge_result( self.Failure, '文档[{0}]的元数据提取过程出现错误, 详细信息为: [{1}]'.format( in_file_fullname, error.__str__())) # result = raster_mdreader.get_metadata_2_file(out_metadata_file_fullname) # result = CProcessUtils.processing_method(raster_mdreader.get_metadata_2_file, out_metadata_file_fullname) # 进程调用模式 # p_one = Process(target=raster_mdreader.get_metadata_2_file, args=(out_metadata_file_fullname,)) # p_one.start() # p_one.join() return CResult.merge_result_info(result, self.Name_Format, self.MetaDataFormat_Json)
def process_raster(self) -> str: try: # file_name_with_full_path = r'D:\test\raster_test\石嘴山市.json' # file_main_name = CFile.file_main_name(file_name_with_full_path) # file_path = CFile.file_path(file_name_with_full_path) json_obj = self.metadata.metadata_json() # json_obj.load_file(file_name_with_full_path) # <editor-fold desc="1.空间坐标信息"> wkt_info = 'POLYGON((${min_x} ${max_y},${max_x} ${max_y},' \ '${max_x} ${min_y},${min_x} ${min_y},${min_x} ${max_y}))' # 四至坐标 native_max_x = CUtils.to_decimal(json_obj.xpath_one('boundingbox.right', None)) native_max_y = CUtils.to_decimal(json_obj.xpath_one('boundingbox.top', None)) native_min_x = CUtils.to_decimal(json_obj.xpath_one('boundingbox.left', None)) native_min_y = CUtils.to_decimal(json_obj.xpath_one('boundingbox.bottom', None)) if (native_max_x is None) or (native_max_y is None) or (native_min_x is None) or (native_min_y is None): native_center_wkt = None native_bbox_wkt = None native_geom_wkt = None else: dict_native = {'max_x': CUtils.any_2_str(native_max_x), 'max_y': CUtils.any_2_str(native_max_y), 'min_x': CUtils.any_2_str(native_min_x), 'min_y': CUtils.any_2_str(native_min_y)} # 中心点坐标 center_x = (native_max_x - native_min_x) / 2 + native_min_x center_y = (native_max_y - native_min_y) / 2 + native_min_y native_center_wkt = 'POINT({0} {1})'.format(center_x, center_y) # 外边框、外包框 native_bbox_wkt = CUtils.replace_placeholder(wkt_info[:], dict_native) native_geom_wkt = native_bbox_wkt file_path = self.file_content.work_root_dir file_main_name = self.object_name native_center_filepath = CFile.join_file(file_path, file_main_name + '_native_center.wkt') CFile.str_2_file(native_center_wkt, native_center_filepath) native_bbox_filepath = CFile.join_file(file_path, file_main_name + '_native_bbox.wkt') CFile.str_2_file(native_bbox_wkt, native_bbox_filepath) native_geom_filepath = CFile.join_file(file_path, file_main_name + '_native_geom.wkt') CFile.str_2_file(native_geom_wkt, native_geom_filepath) # wgs84转换后的四至坐标 wgs84_max_x = CUtils.to_decimal(json_obj.xpath_one('wgs84.boundingbox.right', None)) wgs84_max_y = CUtils.to_decimal(json_obj.xpath_one('wgs84.boundingbox.top', None)) wgs84_min_x = CUtils.to_decimal(json_obj.xpath_one('wgs84.boundingbox.left', None)) wgs84_min_y = CUtils.to_decimal(json_obj.xpath_one('wgs84.boundingbox.bottom', None)) if (wgs84_max_x is None) or (wgs84_max_y is None) or (wgs84_min_x is None) or (wgs84_min_y is None): wgs84_center_wkt = None wgs84_bbox_wkt = None else: dict_wgs84 = {'max_x': CUtils.any_2_str(wgs84_max_x), 'max_y': CUtils.any_2_str(wgs84_max_y), 'min_x': CUtils.any_2_str(wgs84_min_x), 'min_y': CUtils.any_2_str(wgs84_min_y)} # 中心点坐标(wgs84) center_x = (wgs84_max_x - wgs84_min_x) / 2 + wgs84_min_x center_y = (wgs84_max_y - wgs84_min_y) / 2 + wgs84_min_y wgs84_center_wkt = 'POINT({0} {1})'.format(center_x, center_y) # 外边框、外包框(wgs84) wgs84_bbox_wkt = CUtils.replace_placeholder(wkt_info[:], dict_wgs84) # wgs84_geom_wkt = wgs84_bbox_wkt wgs84_geom_filepath = CFile.join_file(file_path, file_main_name + '_wgs84_geom.wkt') # CFile.str_2_file(wgs84_geom_wkt, wgs84_geom_filepath) object_file_path = self.file_info.file_name_with_full_path process_bus(object_file_path, wgs84_geom_filepath, None) wgs84_center_filepath = CFile.join_file(file_path, file_main_name + '_wgs84_center.wkt') CFile.str_2_file(wgs84_center_wkt, wgs84_center_filepath) wgs84_bbox_filepath = CFile.join_file(file_path, file_main_name + '_wgs84_bbox.wkt') CFile.str_2_file(wgs84_bbox_wkt, wgs84_bbox_filepath) # </editor-fold> # <editor-fold desc="2.投影信息"> native_wkt = json_obj.xpath_one('coordinate.wkt', None) native_proj4 = json_obj.xpath_one('coordinate.proj4', None) native_source = CResource.Prj_Source_Data # 坐标系 native_coordinate = None # 3度带/6度带 native_degree = None # 投影方式 native_project = None # 带号 native_zone = None # 创建SpatialReference对象,导入wkt信息 spatial_ref = osr.SpatialReference(wkt=native_wkt) if spatial_ref.IsProjected(): native_coordinate = spatial_ref.GetAttrValue('GEOGCS') native_project = spatial_ref.GetAttrValue('PROJECTION') # native_degree = spatial_ref.GetAttrValue('GEOGCS|UNIT', 1) # pixel_size = json_obj.xpath_one('pixelsize.width', None) # native_zone = self.get_prj_zone(spatial_ref, pixel_size) native_degree, native_zone = self.get_prj_degree_zone(spatial_ref) elif spatial_ref.IsGeocentric(): native_project = None native_coordinate = spatial_ref.GetAttrValue('GEOGCS') native_degree = None native_zone = None # </editor-fold> result = CResult.merge_result(self.Success, '处理完毕!') result = CResult.merge_result_info(result, self.Name_Prj_Wkt, native_wkt) result = CResult.merge_result_info(result, self.Name_Prj_Proj4, native_proj4) result = CResult.merge_result_info(result, self.Name_Prj_Project, native_project) result = CResult.merge_result_info(result, self.Name_Prj_Coordinate, native_coordinate) result = CResult.merge_result_info(result, self.Name_Prj_Source, native_source) result = CResult.merge_result_info(result, self.Name_Prj_Zone, native_zone) result = CResult.merge_result_info(result, self.Name_Prj_Degree, native_degree) return result # return CResult.merge_result(self.Success, '处理完毕!') except Exception as error: CLogger().warning('影像数据的空间信息处理出现异常, 错误信息为: {0}'.format(error.__str__())) return CResult.merge_result(self.Failure, '影像数据的空间信息处理出现异常,错误信息为:{0}!'.format(error.__str__()))