def merge_result(cls, result, message=None, base=None) -> str: new_result = CJson() if base is not None: new_result.load_json_text(base) new_result.set_value_of_name(cls.Name_Result, result) if message is not None: new_result.set_value_of_name(cls.Name_Message, message) return new_result.to_json()
def register_dm_metadata_plugins(self): sql_register_dm_metadata_plugins_clear = ''' truncate table dm2_storage_object_def cascade ''' sql_unregister_dm_metadata_plugins = ''' delete from dm2_storage_object_def where dsodid = :dsodid ''' sql_register_dm_metadata_plugins = ''' insert into dm2_storage_object_def( dsodid, dsodtitle, dsodtype, dsodtypetitle, dsodtypecode, dsodgroup, dsodgrouptitle, dsodcatalog, dsodcatalogtitle, dsod_otheroption) values (:dsodid, :dsodtitle, :dsodtype, :dsodtypetitle, :dsodtypecode, :dsodgroup, :dsodgrouptitle, :dsodcatalog, :dsodcatalogtitle, :dsod_otheroption) ''' CFactory().give_me_db().execute(sql_register_dm_metadata_plugins_clear) plugins_root_dir = CSys.get_plugins_root_dir() plugins_type_list = CFile.file_or_subpath_of_path(plugins_root_dir) for plugins_type in plugins_type_list: if CFile.is_dir(CFile.join_file( plugins_root_dir, plugins_type)) and ( not (str(plugins_type)).startswith('_')): plugins_root_package_name = '{0}.{1}'.format( CSys.get_plugins_package_root_name(), plugins_type) path = CFile.join_file(CSys.get_plugins_root_dir(), plugins_type) plugins_file_list = CFile.file_or_subpath_of_path( path, '{0}_*.{1}'.format(self.Name_Plugins, self.FileExt_Py)) for file_name_without_path in plugins_file_list: file_main_name = CFile.file_main_name( file_name_without_path) class_classified_obj = CObject.create_plugins_instance( plugins_root_package_name, file_main_name, None) plugins_info = class_classified_obj.get_information() json_obj = CJson() json_obj.set_value_of_name( self.Name_Is_Spatial, CUtils.dict_value_by_name( plugins_info, CPlugins.Plugins_Info_Is_Spatial, False)) json_obj.set_value_of_name( self.Name_Is_DataSet, CUtils.dict_value_by_name( plugins_info, CPlugins.Plugins_Info_Is_Dataset, False)) plugins_info['dsod_otheroption'] = json_obj.to_json() print('{0}/{1}:{2}'.format(plugins_type, file_main_name, plugins_info)) CFactory().give_me_db().execute( sql_unregister_dm_metadata_plugins, plugins_info) CFactory().give_me_db().execute( sql_register_dm_metadata_plugins, plugins_info)
def get_extent_by_vectorlayer(self, layer, feature_count) -> CJson: """ 构建图层四至范围的json对象 @param layer: @param feature_count: @return: """ json_extent = CJson() if feature_count == 0: json_extent.set_value_of_name("minx", 0) json_extent.set_value_of_name("maxx", 0) json_extent.set_value_of_name("miny", 0) json_extent.set_value_of_name("maxy", 0) else: extent = layer.GetExtent() # print('extent:', extent) if extent is not None: # print('ul:', extent[0], extent[3]) # print('lr:', extent[1], extent[2]) json_extent.set_value_of_name("minx", extent[0]) json_extent.set_value_of_name("maxx", extent[1]) json_extent.set_value_of_name("miny", extent[2]) json_extent.set_value_of_name("maxy", extent[3]) extent = None return json_extent
def get_other_metadata_by_raster(self, other_metadata: dict) -> CJson: """ 获取栅格文件的subdatasets、geolocation、rpc元数据信息 :param other_metadata: :return: """ other_data = CJson() other_data.set_value_of_name('valid', True) other_metadata_list = [] for i in other_metadata: if other_metadata[i] is not None: sub_metadata_item = other_metadata[i] other_metadata_list.append(sub_metadata_item) other_data.set_value_of_name('metadata', other_metadata_list) return other_data
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 get_geometry_by_vectorlayer(self, layer) -> CJson: """ 构建图层图形类型的json对象 @param layer: @return: """ json_geometry = CJson() geomtype = layer.GetGeomType() # 数字 json_geometry.set_value_of_name("type", geomtype) feature_count = layer.GetFeatureCount() if feature_count > 0: for i in range(feature_count): feature = layer.GetFeature(i) if feature is not None: geom = feature.geometry() if geom is not None: geom_name = geom.GetGeometryName() json_geometry.set_value_of_name("name", geom_name) return json_geometry return json_geometry
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 summary(self) -> str: json_obj = CJson() json_obj.set_value_of_name( self.Name_Total, self.__quality_result_of_level(self.__XPath_Total)) metadata_qa_s = { self.Name_Data: self.__quality_result_of_level(self.__XPath_MetaData_Data), self.Name_Business: self.__quality_result_of_level(self.__XPath_MetaData_Bus) } json_obj.set_value_of_name(self.Name_MetaData, metadata_qa_s) json_obj.set_value_of_name( self.Name_Data, { self.Name_Items: self.__quality_result_of_level(self.__XPath_Data_Items) }) return json_obj.to_json()
assert json.xpath_one('aa', -1) == -1 assert json.xpath_one('student[0].name', '') == '小明' assert json.xpath_one('student[1].name', '') == '小王' def test_get_attr_by_class_method(self): value = CJson.json_attr_value(self.test_text, 'b', 1) assert value == 2 def test_get_chn_attr_by_class_method(self): value = CJson.json_attr_value(self.test_text, '中文属性', 1) assert value == 5 def test_load_obj(self): data = {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5} json_obj = CJson() json_obj.load_obj(data) assert json_obj.xpath_one('a', -1) == 1 if __name__ == '__main__': file_name = '/Users/wangxiya/Downloads/gdb.json' json = CJson() json.load_file(file_name) data_source = json.xpath_one('datasource', None) layers = json.xpath_one('layers', None) target_json = CJson() target_json.set_value_of_name('datasource', data_source) target_json.set_value_of_name('layer_count', 1) target_json.set_value_of_name('layers', [layers[0]]) print(target_json.to_json())
def get_metadata_2_file(self, file_name_with_path: str): # print('你的任务: 将文件{0}的元数据信息, 提取出来, 存储到文件{1}中'.format(self.__file_name_with_path__, file_name_with_path)) raster_ds = None json_raster = None # result_success = abs(self.Success) # 成功的标记,元数据json中的为1,而系统常量为-1,暂采用绝对值 result_success = self.Success # 成功的标记-1 gdal.AllRegister() gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "YES") # 定义栅格数据的json对像 json_raster = CJson() try: # 打开影像数据集 raster_ds = gdal.Open(self.__file_name_with_path__, gdal.GA_ReadOnly) if raster_ds is None: message = '文件[{0}]打开失败!'.format(self.__file_name_with_path__) json_raster.set_value_of_name('result', self.Failure) json_raster.set_value_of_name('message', message) # 判断路径是否存在,不存在则创建 if CFile.check_and_create_directory(file_name_with_path): json_raster.to_file(file_name_with_path) return CResult.merge_result(CResult.Failure, '文件[{0}]打开失败!'.format(self.__file_name_with_path__)) # 基本信息 driver = raster_ds.GetDriver() if driver is None: message = '文件[{0}]读取驱动失败!'.format(self.__file_name_with_path__) json_raster.set_value_of_name('result', self.Failure) json_raster.set_value_of_name('message', message) # 判断路径是否存在,不存在则创建 if CFile.check_and_create_directory(file_name_with_path): json_raster.to_file(file_name_with_path) return CResult.merge_result(CResult.Failure, '文件[{0}]读取驱动失败!'.format(self.__file_name_with_path__)) # 定义driver子节点,并添加到矢量json对象中 json_driver = CJson() json_driver.set_value_of_name('longname', driver.LongName) json_driver.set_value_of_name('shortname', driver.ShortName) json_raster.set_value_of_name('driver', json_driver.json_obj) file_list = raster_ds.GetFileList() if file_list is None: message = '文件[{0}]读取文件列表失败!'.format(self.__file_name_with_path__) json_raster.set_value_of_name('result', self.Failure) json_raster.set_value_of_name('message', message) # 判断路径是否存在,不存在则创建 if CFile.check_and_create_directory(file_name_with_path): json_raster.to_file(file_name_with_path) return CResult.merge_result(CResult.Failure, '文件[{0}]读取文件列表失败!'.format(self.__file_name_with_path__)) # 定义files子对象 json_files = [file_list[0]] for i in range(len(file_list)): if i > 0 and file_list[i] is not None: json_files.append(file_list[i]) json_raster.set_value_of_name('files', json_files) image_size_x = raster_ds.RasterXSize image_size_y = raster_ds.RasterYSize if image_size_x is None and image_size_y is None: message = '文件[{0}]读取文件大小失败!'.format(self.__file_name_with_path__) json_raster.set_value_of_name('result', self.Failure) json_raster.set_value_of_name('message', message) # 判断路径是否存在,不存在则创建 if CFile.check_and_create_directory(file_name_with_path): json_raster.to_file(file_name_with_path) return CResult.merge_result(CResult.Failure, '文件[{0}]读取文件大小失败!'.format(self.__file_name_with_path__)) # 定义size子节点 json_size = CJson() json_size.set_value_of_name('width', image_size_x) json_size.set_value_of_name('height', image_size_y) json_raster.set_value_of_name('size', json_size.json_obj) # 投影信息 projection = raster_ds.GetProjection() # 定义coordinate子对象 json_coordinate = CJson() if not CUtils.equal_ignore_case(projection, ''): spatial = osr.SpatialReference() if spatial.ImportFromWkt(projection) == gdal.CE_None: proj_wkt = spatial.ExportToWkt() json_coordinate.set_value_of_name('wkt', proj_wkt) proj4 = spatial.ExportToProj4() json_coordinate.set_value_of_name('proj4', proj4) spatial.MorphToESRI() esri = spatial.ExportToWkt() json_coordinate.set_value_of_name('esri', esri) else: json_coordinate.set_value_of_name('wkt', projection) json_coordinate.set_value_of_name('proj4', None) json_coordinate.set_value_of_name('esri', None) spatial = None else: json_coordinate.set_value_of_name('wkt', None) json_coordinate.set_value_of_name('proj4', None) json_coordinate.set_value_of_name('esri', None) json_raster.set_value_of_name('coordinate', json_coordinate.json_obj) # 仿射变换信息 geo_transform = raster_ds.GetGeoTransform() if geo_transform is not None: # 定义origin、pixelsize、boundingbox子节点 if geo_transform[2] == 0 and geo_transform[4] == 0: (json_origin, json_pixel, json_bounding) = self.get_geotramsform_by_raster(geo_transform, image_size_x, image_size_y) json_raster.set_value_of_name('origin', json_origin.json_obj) json_raster.set_value_of_name('pixelsize', json_pixel.json_obj) json_raster.set_value_of_name('boundingbox', json_bounding.json_obj) else: (json_geo, json_bounding) = self.get_geotramsform_by_raster(geo_transform, image_size_x, image_size_y) json_raster.set_value_of_name('geotransform', json_geo.json_obj) json_raster.set_value_of_name('boundingbox', json_bounding.json_obj) else: json_bounding = CJson() json_bounding.set_value_of_name('result', 0) json_raster.set_value_of_name('boundingbox', json_bounding.json_obj) # wgs84坐标系转换 json_wgs84 = self.transform_to_WGS84(geo_transform, image_size_x, image_size_y, projection) json_raster.set_value_of_name('wgs84', json_wgs84.json_obj) # GCPs信息 # 注意:这个节点没测试过,可能有bug gcp_count = raster_ds.GetGCPCount() if gcp_count > 0: gcp_projection = raster_ds.GetGCPProjection() if gcp_projection is None: message = '文件[{0}]读取GCP信息失败!'.format(self.__file_name_with_path__) json_raster.set_value_of_name('result', self.Failure) json_raster.set_value_of_name('message', message) # 判断路径是否存在,不存在则创建 if CFile.check_and_create_directory(file_name_with_path): json_raster.to_file(file_name_with_path) return CResult.merge_result(CResult.Failure, '文件[{0}]读取GCP信息失败!'.format(self.__file_name_with_path__)) # 定义gcp_projection、gcp子对象 json_gcp_projection, gcp_list = self.get_gcp_by_raster(gcp_count, gcp_projection, raster_ds) json_raster.set_value_of_name('gcp_projection', json_gcp_projection.json_obj) json_raster.set_value_of_name('gcp', gcp_list) # metadata信息,定义metadata子节点 metadata = raster_ds.GetMetadata() metadata_list = [] if len(metadata) > 0: for i in metadata: if metadata[i] is not None: metadata_item = metadata[i] metadata_list.append(metadata_item) json_raster.set_value_of_name('metadata', metadata_list) # 定义image_structure_metadata子节点 image_metadata = raster_ds.GetMetadata('IMAGE_STRUCTURE') image_metadata_list = [] if len(image_metadata) > 0: for i in image_metadata: if image_metadata[i] is not None: image_metadata_item = image_metadata[i] image_metadata_list.append(image_metadata_item) json_raster.set_value_of_name('image_structure_metadata', image_metadata_list) # 定义subdatasets子节点 sub_metadata = raster_ds.GetMetadata('SUBDATASETS') if len(sub_metadata) > 0: sub_data = self.get_other_metadata_by_raster(sub_metadata) json_raster.set_value_of_name('subdatasets', sub_data.json_obj) # 定义geolocation子节点 geo_metadata = raster_ds.GetMetadata('GEOLOCATION') if len(geo_metadata) > 0: geo_data = self.get_other_metadata_by_raster(geo_metadata) json_raster.set_value_of_name('geolocation', geo_data.json_obj) # 定义rpc子节点 rpc_metadata = raster_ds.GetMetadata('RPC') if len(rpc_metadata) > 0: rpc_data = self.get_other_metadata_by_raster(rpc_metadata) json_raster.set_value_of_name('rpc', rpc_data.json_obj) # 角坐标信息,定义corner_coordinates子节点 json_corner = self.get_corner_by_raster(image_size_x, image_size_y) json_raster.set_value_of_name('corner_coordinates', json_corner.json_obj) # 波段信息 band_count = raster_ds.RasterCount if band_count == 0: message = '文件[{0}]文件不存在波段信息!'.format(self.__file_name_with_path__) json_raster.set_value_of_name('result', self.Failure) json_raster.set_value_of_name('message', message) # 判断路径是否存在,不存在则创建 if CFile.check_and_create_directory(file_name_with_path): json_raster.to_file(file_name_with_path) return CResult.merge_result(CResult.Failure, '文件[{0}]不存在波段信息!'.format(self.__file_name_with_path__)) # 定义bands子节点 band_list = self.get_bands_by_raster(band_count, raster_ds) json_raster.set_value_of_name('bands', band_list) # 定义pyramid子节点 band = raster_ds.GetRasterBand(1) overviews = band.GetOverviewCount() if overviews > 0: pyramid = -1 else: pyramid = 0 band = None json_raster.set_value_of_name('pyramid', pyramid) # 原始gdal_info # json_info = gdal.Info(raster_ds, format='json') # json_raster.set_value_of_name('info', json_info) # 定义result子节点 json_raster.set_value_of_name('result', result_success) # 判断路径是否存在,不存在则创建 if CFile.check_and_create_directory(file_name_with_path): json_raster.to_file(file_name_with_path) CLogger().info('文件[{0}]元数据信息读取成功!'.format(self.__file_name_with_path__)) return CResult.merge_result(CResult.Success, '文件[{0}]元数据信息读取成功!'.format(self.__file_name_with_path__)) except Exception as error: CLogger().info('get_metadata_2_file解析错误:{0}'.format(error)) message = 'get_metadata_2_file解析错误:文件:{0},错误信息为{1}'.format(self.__file_name_with_path__, error) json_raster.set_value_of_name('result', self.Failure) json_raster.set_value_of_name('message', message) # 判断路径是否存在,不存在则创建 if CFile.check_and_create_directory(file_name_with_path): json_raster.to_file(file_name_with_path) return CResult.merge_result(CResult.Failure, '文件[{0}]读取异常!{1}'.format(self.__file_name_with_path__, error.__str__())) finally: del raster_ds
def transform_to_wgs84(self, layer, feature_count) -> CJson: """ wgs84坐标系转换结果(wgs84节点) :param layer: :param feature_count: :return: """ json_wgs84 = CJson() spatial_ref = osr.SpatialReference() spatial_ref.SetWellKnownGeogCS('WGS84') wgs84_wkt = spatial_ref.ExportToWkt() wgs84_proj4 = spatial_ref.ExportToProj4() spatial_ref.MorphToESRI() wgs84_esri = spatial_ref.ExportToWkt() json_wgs84_coordinate = CJson() json_wgs84_coordinate.set_value_of_name('wkt', wgs84_wkt) json_wgs84_coordinate.set_value_of_name('proj4', wgs84_proj4) json_wgs84_coordinate.set_value_of_name('esri', wgs84_esri) json_wgs84.set_value_of_name('coordinate', json_wgs84_coordinate.json_obj) if feature_count == 0: json_bounding = CJson() json_bounding.set_value_of_name('minx', 0) json_bounding.set_value_of_name('maxy', 0) json_bounding.set_value_of_name('maxx', 0) json_bounding.set_value_of_name('miny', 0) json_wgs84.set_value_of_name('extent', json_bounding.json_obj) json_wgs84.set_value_of_name('msg', 'feature数量为0,不进行坐标系转换') json_wgs84.set_value_of_name('result', self.Success) else: spatialRef = layer.GetSpatialRef() if spatialRef is None: json_wgs84.set_value_of_name( 'msg', 'extent四至范围从原坐标系转wgs_84坐标系转换失败!失败原因:文件读取空间参考失败!') json_wgs84.set_value_of_name('result', self.Failure) else: proj_wkt = spatialRef.ExportToWkt() extent = layer.GetExtent() rb = (0, 0) lu = (0, 0) if not CUtils.equal_ignore_case(proj_wkt, ''): source_projection = osr.SpatialReference(wkt=proj_wkt) source = source_projection.GetAttrValue('GEOGCS', 0) prosrs = osr.SpatialReference() prosrs.ImportFromWkt(proj_wkt) geosrs = prosrs.CloneGeogCS() ct = osr.CreateCoordinateTransformation(prosrs, geosrs) if ct is not None: rb = ct.TransformPoint(extent[1], extent[2]) lu = ct.TransformPoint(extent[0], extent[3]) json_bounding = CJson() json_bounding.set_value_of_name('minx', lu[0]) json_bounding.set_value_of_name('maxy', lu[1]) json_bounding.set_value_of_name('maxx', rb[0]) json_bounding.set_value_of_name('miny', rb[1]) json_wgs84.set_value_of_name('extent', json_bounding.json_obj) json_wgs84.set_value_of_name( 'msg', 'extent四至范围从{0}坐标系转wgs_84坐标系转换成功!'.format(source)) json_wgs84.set_value_of_name('result', self.Success) else: json_wgs84.set_value_of_name( 'msg', 'extent四至范围从{0}坐标系转wgs_84坐标系转换失败!' '失败原因:构建坐标转换关系失败!可能是地方坐标系,无法转换。'.format(source)) json_wgs84.set_value_of_name('result', self.Failure) else: json_wgs84.set_value_of_name( 'msg', 'extent四至范围从原坐标系转wgs_84坐标系转换失败!失败原因:文件不存在wkt信息!') json_wgs84.set_value_of_name('result', self.Failure) return json_wgs84
def parser_metadata_custom(self, parser: CMetaDataParser) -> str: """ 自定义的元数据解析, 在所有质检和其他处理之后触发 :param parser: :return: """ meta_data_json = parser.metadata.metadata_json() if meta_data_json is None: return CResult.merge_result( self.Success, '数据[{0}]的质检和空间等元数据解析完毕, 但子图层解析有误, 无法获取JSON格式的元数据! '.format( self.file_info.file_name_with_full_path, ) ) json_data_source = meta_data_json.xpath_one('datasource', None) layer_list = meta_data_json.xpath_one(self.Name_Layers, None) if layer_list is None: return CResult.merge_result( self.Success, '数据[{0}]的质检和空间等元数据解析完毕, 但子图层解析有误, 元数据中无法找到layers节点! '.format( self.file_info.file_name_with_full_path, ) ) mdb_ib_id = CFactory().give_me_db(self.file_info.db_server_id).one_value( ''' select dso_ib_id from dm2_storage_object where dsoid = :object_id ''', { 'object_id': parser.object_id } ) error_message_list = [] table = CTable() table.load_info(self.file_info.db_server_id, self.TableName_DM_Object) for layer in layer_list: layer_name = CUtils.dict_value_by_name(layer, self.Name_Name, '') if CUtils.equal_ignore_case(layer_name, ''): continue layer_alias_name = CUtils.dict_value_by_name(layer, self.Name_Description, layer_name) layer_metadata_json = CJson() layer_metadata_json.set_value_of_name('datasource', json_data_source) layer_metadata_json.set_value_of_name('layer_count', 1) layer_metadata_json.set_value_of_name('layers', [layer]) layer_metadata_text = layer_metadata_json.to_json() try: sql_find_layer_existed = ''' select dsoid as layer_id_existed from dm2_storage_object where upper(dsoobjectname) = upper(:layer_name) and dsoparentobjid = :object_id ''' layer_id_existed = CFactory().give_me_db(self.file_info.db_server_id).one_value( sql_find_layer_existed, { 'layer_name': layer_name, 'object_id': parser.object_id } ) if layer_id_existed is None: layer_id_existed = CUtils.one_id() table.column_list.reset() table.column_list.column_by_name('dsoid').set_value(layer_id_existed) table.column_list.column_by_name('dsoobjectname').set_value(layer_name) table.column_list.column_by_name('dsoobjecttype').set_value( CUtils.dict_value_by_name( self.get_information(), self.Plugins_Info_Child_Layer_Plugins_Name, '' ) ) table.column_list.column_by_name('dsodatatype').set_value( CUtils.dict_value_by_name( self.get_information(), self.Plugins_Info_Child_Layer_Data_Type, '' ) ) table.column_list.column_by_name('dsoalphacode').set_value(CUtils.alpha_text(layer_name)) table.column_list.column_by_name('dsoaliasname').set_value(layer_alias_name) table.column_list.column_by_name('dsoparentobjid').set_value(parser.object_id) table.column_list.column_by_name('dso_ib_id').set_value(mdb_ib_id) table.column_list.column_by_name('dsometadatatext').set_value(layer_metadata_text) table.column_list.column_by_name('dsometadatajson').set_value(layer_metadata_text) table.column_list.column_by_name('dsometadataparsestatus').set_value(self.ProcStatus_InQueue) table.column_list.column_by_name('dsotagsparsestatus').set_value(self.ProcStatus_InQueue) table.column_list.column_by_name('dsodetailparsestatus').set_value(self.ProcStatus_InQueue) result = table.save_data() if not CResult.result_success(result): error_message_list.append( '图层[{0}]的创建过程出现错误, 详细信息为: {1}'.format( layer_name, CResult.result_message(result) ) ) except Exception as error: error_message_list.append('图层[{0}]的创建过程出现错误, 详细信息为: {1}'.format(layer_name, error.__str__())) if len(error_message_list) > 0: return CResult.merge_result( self.Failure, '数据[{0}]的质检和空间等元数据解析完毕, 但子图层解析有误, 详细情况如下: \n{1}'.format( self.file_info.file_name_with_full_path, CUtils.list_2_str(error_message_list, '', '\n', '', True) ) ) else: return CResult.merge_result( self.Success, '数据[{0}]的自定义元数据解析完毕! '.format( self.file_info.file_name_with_full_path, ) )
def get_metadata_2_file(self, file_name_with_path: str): # print('你的任务: 将文件{0}的元数据信息, 提取出来, 存储到文件{1}中'.format(self.__file_name_with_path__, file_name_with_path)) vector_ds = None json_vector = None # os.environ['PROJ_LIB'] = r'C:\APP\Python\Python38\Lib\site-packages\osgeo\data\proj' 环境变量中设置 # result_success = abs(self.Success) # 成功的标记,元数据json中的为1,而系统常量为-1,暂采用绝对值 result_success = self.Success # 成功的标记-1 gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "YES") gdal.SetConfigOption("SHAPE_ENCODING", "GBK") # gdal.SetConfigOption("SHAPE_ENCODING", "UTF-8") # 定义矢量的json对象 json_vector = CJson() mdb_flag = False vector_ds = ogr.Open(self.__file_name_with_path__) if vector_ds is None: vector_ds = ogr.Open(self.__file_name_with_path__.encode('gbk'), 0) mdb_flag = True if vector_ds is None: message = '文件[{0}]打开失败!'.format(self.__file_name_with_path__) json_vector.set_value_of_name('result', self.Failure) json_vector.set_value_of_name('message', message) # 判断路径是否存在,不存在则创建 if CFile.check_and_create_directory(file_name_with_path): json_vector.to_file(file_name_with_path) return CResult.merge_result( CResult.Failure, '文件[{0}]打开失败!'.format(self.__file_name_with_path__)) try: layer_count = vector_ds.GetLayerCount() if layer_count == 0: message = '文件[{0}]没有图层!'.format(self.__file_name_with_path__) json_vector.set_value_of_name('result', self.Failure) json_vector.set_value_of_name('message', message) # 判断路径是否存在,不存在则创建 if CFile.check_and_create_directory(file_name_with_path): json_vector.to_file(file_name_with_path) return CResult.merge_result( CResult.Failure, '文件[{0}]没有图层!'.format(self.__file_name_with_path__)) shp_lyr = vector_ds.GetLayer(0) if shp_lyr is None: message = '文件[{0}]读取图层失败!'.format(self.__file_name_with_path__) json_vector.set_value_of_name('result', self.Failure) json_vector.set_value_of_name('message', message) # 判断路径是否存在,不存在则创建 if CFile.check_and_create_directory(file_name_with_path): json_vector.to_file(file_name_with_path) return CResult.merge_result( CResult.Failure, '文件[{0}]读取图层失败!'.format(self.__file_name_with_path__)) driver = vector_ds.GetDriver() if driver is None: message = '文件[{0}]读取驱动失败!'.format(self.__file_name_with_path__) json_vector.set_value_of_name('result', self.Failure) json_vector.set_value_of_name('message', message) # 判断路径是否存在,不存在则创建 if CFile.check_and_create_directory(file_name_with_path): json_vector.to_file(file_name_with_path) return CResult.merge_result( CResult.Failure, '文件[{0}]读取驱动失败!'.format(self.__file_name_with_path__)) # 定义datasource子节点,并添加到矢量json对象中 json_datasource = CJson() json_datasource.set_value_of_name('name', self.__file_name_with_path__) json_datasource.set_value_of_name('description', driver.name) json_vector.set_value_of_name('datasource', json_datasource.json_obj) # print(driver.name) layer_count_real, layer_list = self.get_vector_layercount_and_layers( vector_ds) # print('共{0}个有效图层'.format(layer_count_real)) # print(layer_list) json_vector.set_value_of_name('layer_count', layer_count_real) # shp图层只有1个,gdb有多个 json_vector.set_value_of_name('result', result_success) # 定义layers子节点,并添加到矢量json对象中 json_layers = CJson() if layer_count_real == 0: json_vector.set_value_of_name('layers', []) else: list_json_layers = [] for layer_temp in layer_list: print('图层对象: {0}'.format(layer_temp)) if mdb_flag: layer_name = CUtils.conversion_chinese_code( layer_temp.GetName()) else: layer_name = layer_temp.GetName() json_layer = CJson() list_json_layers.append(json_layer.json_obj) # name节点 json_layer.set_value_of_name("name", layer_name) json_layer.set_value_of_name("description", layer_name) # print(layer_name) # projwkt 节点 json_proj_wkt = self.get_projwkt_by_layer(layer_temp) json_layer.set_value_of_name("coordinate", json_proj_wkt.json_obj) # features节点 json_features = CJson() feature_count = layer_temp.GetFeatureCount() json_features.set_value_of_name("count", feature_count) json_layer.set_value_of_name("features", json_features.json_obj) # geometry节点 json_geometry = self.get_geometry_by_vectorlayer( layer_temp) json_layer.set_value_of_name("geometry", json_geometry.json_obj) # extent节点 json_extent = self.get_extent_by_vectorlayer( layer_temp, feature_count) json_layer.set_value_of_name("extent", json_extent.json_obj) # attributes节点 json_attributes = self.get_attributes_by_vectorlayer( layer_temp, mdb_flag) json_layer.set_value_of_name("attributes", json_attributes.json_obj) # wgs84节点 json_wgs84 = self.transform_to_wgs84( layer_temp, feature_count) json_layer.set_value_of_name('wgs84', json_wgs84.json_obj) json_vector.set_value_of_name('layers', list_json_layers) # json_shp_str = json_vector.to_json() # print(json_shp_str) # 判断路径是否存在,不存在则创建 if CFile.check_and_create_directory(file_name_with_path): json_vector.to_file(file_name_with_path) CLogger().info('文件[{0}]元数据信息读取成功!'.format( self.__file_name_with_path__)) return CResult.merge_result( CResult.Success, '文件[{0}]元数据信息读取成功!'.format(self.__file_name_with_path__)) except Exception as error: CLogger().info('get_metadata_2_file解析错误:{0}'.format(error)) message = 'get_metadata_2_file解析错误:文件:{0},错误信息为{1}'.format( self.__file_name_with_path__, error) json_vector.set_value_of_name('result', self.Failure) json_vector.set_value_of_name('message', message) # 判断路径是否存在,不存在则创建 if CFile.check_and_create_directory(file_name_with_path): json_vector.to_file(file_name_with_path) return CResult.merge_result( CResult.Failure, '文件[{0}]读取异常!{1}'.format(self.__file_name_with_path__, error.__str__())) finally: vector_ds.Destroy() vector_ds = None
def process_mission(self, dataset): dso_id = dataset.value_by_name(0, 'dsoid', '') dso_data_type = dataset.value_by_name(0, 'dsodatatype', '') dso_object_type = dataset.value_by_name(0, 'dsoobjecttype', '') dso_object_name = dataset.value_by_name(0, 'dsoobjectname', '') dso_object_da_content = CUtils.any_2_str(dataset.value_by_name(0, 'dso_da_result', '')) dso_object_quality = dataset.value_by_name(0, 'dso_quality', '') ds_retry_times = dataset.value_by_name(0, 'retry_times', 0) if ds_retry_times >= self.abnormal_job_retry_times(): ds_last_process_memo = CUtils.any_2_str(dataset.value_by_name(0, 'last_process_memo', None)) process_result = CResult.merge_result( self.Failure, '{0}, \n系统已经重试{1}次, 仍然未能解决, 请人工检查修正后重试!'.format( ds_last_process_memo, ds_retry_times ) ) self.update_status(dso_id, None, process_result, self.ProcStatus_Error) return process_result dso_quality = CXml() dso_quality.load_xml(dso_object_quality) dso_da_json = CJson() dso_da_json.load_json_text(dso_object_da_content) CLogger().debug( '开始处理对象: {0}.{1}.{2}.{3}对各个子系统的支撑能力'.format(dso_id, dso_data_type, dso_object_type, dso_object_name)) try: modules_root_dir = CSys.get_metadata_data_access_modules_root_dir() modules_file_list = CFile.file_or_subpath_of_path( modules_root_dir, '{0}_*.{1}'.format(self.Name_Module, self.FileExt_Py) ) for file_name_without_path in modules_file_list: file_main_name = CFile.file_main_name(file_name_without_path) # 判断模块的可访问是否已经被人工审批, 如果人工审批, 则这里不再计算和覆盖 module_access = dso_da_json.xpath_one( '{0}.{1}'.format(file_main_name, self.Name_Audit), self.Name_System ) if CUtils.equal_ignore_case(module_access, self.Name_User): continue try: module_obj = CObject.create_module_instance( CSys.get_metadata_data_access_modules_root_name(), file_main_name, self.get_mission_db_id() ) module_title = CUtils.dict_value_by_name(module_obj.information(), self.Name_Title, '') result = CUtils.any_2_str(module_obj.access(dso_id, dso_object_name, dso_data_type, dso_quality) ) if CResult.result_success(result): module_access = CResult.result_info(result, self.Name_Access, self.DataAccess_Forbid) else: CLogger().debug('模块[{0}]解析出现错误, 系统将忽略本模块, 继续处理下一个!'.format(file_main_name)) module_access = self.DataAccess_Unknown module_access_message = CResult.result_message(result) module_obj = {self.Name_Audit: self.Name_System, self.Name_Result: module_access, self.Name_Title: module_title, self.Name_Message: module_access_message} dso_da_json.set_value_of_name(file_main_name, module_obj) except Exception as error: CLogger().debug('模块[{0}]解析出现异常, 原因为[{1}], 请检查!'.format(file_main_name, error.__str__())) module_access = self.DataAccess_Unknown module_access_message = '模块[{0}]解析出现异常, 原因为[{1}], 请检查!'.format(file_main_name, error.__str__()) module_obj = {self.Name_Audit: self.Name_System, self.Name_Result: module_access, self.Name_Title: file_main_name, self.Name_Message: module_access_message} dso_da_json.set_value_of_name(file_main_name, module_obj) process_result = CResult.merge_result( self.Success, '对象[{0}.{1}]访问权限解析成功!'.format(dso_id, dso_object_name) ) self.update_status( dso_id, dso_da_json.to_json(), process_result ) return process_result except Exception as error: process_result = CResult.merge_result( self.Failure, '对象[{0}.{1}]访问权限解析出错, 原因为[{2}]!'.format(dso_id, dso_object_name, error.__str__()) ) self.update_status(dso_id, None, process_result) return process_result
def get_geotramsform_by_raster(self, geo_transform: tuple, image_size_x: int, image_size_y: int): """ 将仿射变换信息写入json对象(origin、pixelsize、boundingbox节点) :param geo_transform: :param image_size_x: :param image_size_y: :return: """ if geo_transform[2] == 0 and geo_transform[4] == 0: json_origin = CJson() json_origin.set_value_of_name('geotransform0', geo_transform[0]) json_origin.set_value_of_name('geotransform3', geo_transform[3]) json_pixel = CJson() json_pixel.set_value_of_name('width', geo_transform[1]) json_pixel.set_value_of_name('height', geo_transform[5]) point_left_top_x = geo_transform[0] point_left_top_y = geo_transform[3] point_right_bottom_x = geo_transform[0] + image_size_x * geo_transform[1] + image_size_y * geo_transform[2] point_right_bottom_y = geo_transform[3] + image_size_x * geo_transform[4] + image_size_y * geo_transform[5] json_bounding = CJson() json_bounding.set_value_of_name('result', -1) json_bounding.set_value_of_name('left', point_left_top_x) json_bounding.set_value_of_name('top', point_left_top_y) json_bounding.set_value_of_name('right', point_right_bottom_x) json_bounding.set_value_of_name('bottom', point_right_bottom_y) return json_origin, json_pixel, json_bounding else: json_geo_transform = CJson() json_geo_transform.set_value_of_name('geotransform0', geo_transform[0]) json_geo_transform.set_value_of_name('geotransform1', geo_transform[1]) json_geo_transform.set_value_of_name('geotransform2', geo_transform[2]) json_geo_transform.set_value_of_name('geotransform3', geo_transform[3]) json_geo_transform.set_value_of_name('geotransform4', geo_transform[4]) json_geo_transform.set_value_of_name('geotransform5', geo_transform[5]) point_left_top_x = geo_transform[0] point_left_top_y = geo_transform[3] point_right_bottom_x = geo_transform[0] + image_size_x * geo_transform[1] + image_size_y * geo_transform[2] point_right_bottom_y = geo_transform[3] + image_size_x * geo_transform[4] + image_size_y * geo_transform[5] json_bounding = CJson() json_bounding.set_value_of_name('result', -1) json_bounding.set_value_of_name('left', point_left_top_x) json_bounding.set_value_of_name('top', point_left_top_y) json_bounding.set_value_of_name('right', point_right_bottom_x) json_bounding.set_value_of_name('bottom', point_right_bottom_y) return json_geo_transform, json_bounding
def get_bands_by_raster(self, band_count: int, raster_ds) -> list: """ 获取波段信息(bands节点) :param band_count: :param raster_ds: :return: """ band_list = [] for i_band in range(band_count): band = raster_ds.GetRasterBand(i_band + 1) json_band = CJson() (x_block_size, y_block_size) = band.GetBlockSize() block = CJson() block.set_value_of_name('width', x_block_size) block.set_value_of_name('height', y_block_size) json_band.set_value_of_name('block', block.json_obj) band_type = gdal.GetDataTypeName(band.DataType) json_band.set_value_of_name('type', band_type) color_interp = gdal.GetColorInterpretationName(band.GetRasterColorInterpretation()) json_band.set_value_of_name('color_interp', color_interp) description = band.GetDescription() if description is not None and len(description) > 0: json_band.set_value_of_name('description', description) b_min = band.GetMinimum() b_max = band.GetMaximum() if b_max is not None or b_min is not None: (b_min, b_max) = band.ComputeRasterMinMax(True) json_band.set_value_of_name('min', b_min) json_band.set_value_of_name('max', b_max) no_data = band.GetNoDataValue() if no_data is not None: if math.isnan(no_data): json_band.set_value_of_name('has_no_data_value', False) else: json_band.set_value_of_name('has_no_data_value', True) json_band.set_value_of_name('no_data_value', no_data) overviews = band.GetOverviewCount() if overviews > 0: band_overviews = [] for i_overview in range(overviews): overview = band.GetOverview(i_overview) if overview is not None: json_overview = CJson() json_overview_size = CJson() json_overview_size.set_value_of_name('width', overview.XSize) json_overview_size.set_value_of_name('height', overview.YSize) json_overview.set_value_of_name('size', json_overview_size.json_obj) resampling = overview.GetMetadataItem('RESAMPLING') if resampling is not None and resampling == 'AVERAGE_BIT2': json_overview.set_value_of_name('resampling', '*') band_overviews.append(json_overview.json_obj) json_band.set_value_of_name('overviews', band_overviews) if band.HasArbitraryOverviews(): json_band.set_value_of_name('has_arbitrary_overview', True) json_mask = CJson() json_mask.set_value_of_name('valid', True) mask_flags = band.GetMaskFlags() if mask_flags: mask_band = band.GetMaskBand() if mask_band is not None and mask_band.GetOverviewCount() > 0: mask_overviews = [] for i_overview in range(mask_band.GetOverviewCount()): mask_overview = mask_band.GetOverview(i_overview) if mask_overview is not None: json_mask_overview_size = CJson() json_mask_overview_size.set_value_of_name('width', mask_overview.XSize) json_mask_overview_size.set_value_of_name('height', mask_overview.YSize) mask_overviews.append(json_mask_overview_size.json_obj) json_mask.set_value_of_name('overviews', mask_overviews) json_band.set_value_of_name('mask', json_mask.json_obj) unit = band.GetUnitType() if len(unit) > 0: band_unit = CJson() band_unit.set_value_of_name('type', unit) json_band.set_value_of_name('unit', band_unit.json_obj) category = band.GetRasterCategoryNames() if category is not None: categories = [] for i in category: if category[i] is not None: value = category[i] categories.append(value) json_band.set_value_of_name('categories', categories) scale = band.GetScale() offset = band.GetOffset() if scale != 1.0 or offset != 0: json_band.set_value_of_name('scale', scale) json_band.set_value_of_name('offset', offset) band_metadata = band.GetMetadata() if band_metadata is not None: metadata = [] for i in band_metadata: value = band_metadata[i] metadata.append(value) json_band.set_value_of_name('metadata', metadata) band_image_metadata = band.GetMetadata('IMAGE_STRUCTURE') if band_image_metadata is not None: image_metadata = [] for i in band_image_metadata: value = band_image_metadata[i] image_metadata.append(value) json_band.set_value_of_name('image_structure_metadata', image_metadata) color_table = band.GetRasterColorTable() if color_interp == 'Palette' and color_table is not None: json_color_table = CJson() palette_interpretation = gdal.GetPaletteInterpretationName(color_table.GetPaletteInterpretation()) entry_count = color_table.GetCount() json_color_table.set_value_of_name('palette_interpretation_name', palette_interpretation) json_color_table.set_value_of_name('entry_count', entry_count) color_entry = [] for i in range(entry_count): entry = color_table.GetColorEntry(i) # entry_RGB = color_table.GetColorEntryAsRGB(i, entry) 有必要吗?这句可以删掉? json_color_entry = CJson() json_color_entry.set_value_of_name('color1', entry[0]) json_color_entry.set_value_of_name('color2', entry[1]) json_color_entry.set_value_of_name('color3', entry[2]) json_color_entry.set_value_of_name('color4', entry[3]) color_entry.append(json_color_entry.json_obj) json_color_table.set_value_of_name('entrys', color_entry) json_band.set_value_of_name('color_table', json_color_table.json_obj) band_list.append(json_band.json_obj) band = None return band_list
def get_gcp_by_raster(self, gcp_count: int, gcp_projection, raster_ds): """ 获取栅格文件的GCPs信息(gcp_projection、gcps节点) :param gcp_count: :param gcp_projection: :param raster_ds: :return: """ # gcp_projection子对象 spatial = osr.SpatialReference() if spatial.ImportFromWkt(gcp_projection) == gdal.CE_None: gcp_proj_wkt = spatial.ExportToWkt() gcp_projection = gcp_proj_wkt else: gcp_projection = gcp_projection spatial = None json_gcp_projection = CJson() json_gcp_projection.set_value_of_name('gcp_projection', gcp_projection) # gcp子对象 gcp_list = [] for i_gcp in range(gcp_count): gcp = raster_ds.GetGCPs() + i_gcp gcp_item = CJson() gcp_item.set_value_of_name('id', gcp.pszID) gcp_item.set_value_of_name('info', gcp.pszINFO) gcp_item.set_value_of_name('pixel', gcp.dfGCPPixel) gcp_item.set_value_of_name('line', gcp.dfGCPLine) gcp_item.set_value_of_name('x', gcp.dfGCPX) gcp_item.set_value_of_name('y', gcp.dfGCPY) gcp_item.set_value_of_name('z', gcp.dfGCPZ) gcp_list.append(gcp_item.json_obj) return json_gcp_projection, gcp_list
def get_corner_by_raster(self, image_size_x: int, image_size_y: int) -> CJson: """ 处理栅格文件的角坐标信息(corner_coordinate节点) :param image_size_x: :param image_size_y: :return: """ json_corner = CJson() json_point_ul = CJson() json_point_ul.set_value_of_name('x', 0) json_point_ul.set_value_of_name('y', 0) json_corner.set_value_of_name('upper_left', json_point_ul.json_obj) json_point_ll = CJson() json_point_ll.set_value_of_name('x', 0) json_point_ll.set_value_of_name('y', image_size_y) json_corner.set_value_of_name('lower_left', json_point_ll.json_obj) json_point_ur = CJson() json_point_ur.set_value_of_name('x', image_size_x) json_point_ur.set_value_of_name('y', 0) json_corner.set_value_of_name('upper_right', json_point_ur.json_obj) json_point_lr = CJson() json_point_lr.set_value_of_name('x', image_size_x) json_point_lr.set_value_of_name('y', image_size_y) json_corner.set_value_of_name('lower_right', json_point_lr.json_obj) json_point_center = CJson() json_point_center.set_value_of_name('x', image_size_x / 2) json_point_center.set_value_of_name('y', image_size_y / 2) json_corner.set_value_of_name('center', json_point_center.json_obj) return json_corner
def get_attributes_by_vectorlayer(self, layer, mdb_flag=False) -> CJson: """ 构建图层字段属性的josn对象 @param layer: @param mdb_flag: @return: """ json_attributes = CJson() layer_defn = layer.GetLayerDefn() columns_list = [] field_count = layer_defn.GetFieldCount() if field_count > 0: for i in range(field_count): field_defn = layer_defn.GetFieldDefn(i) if mdb_flag: name = CUtils.conversion_chinese_code(field_defn.GetName()) else: name = field_defn.GetName() type_code = field_defn.GetType() width = field_defn.GetWidth() precision = field_defn.GetPrecision() type_name = field_defn.GetFieldTypeName(type_code) # 构建单个字段的json对象 json_column = CJson() json_column.set_value_of_name("name", name) json_column.set_value_of_name("description", name) json_column.set_value_of_name("type", type_code) json_column.set_value_of_name("width", width) json_column.set_value_of_name("precision", precision) json_column.set_value_of_name("type_name", type_name) columns_list.append(json_column.json_obj) # 添加到集合中 json_attributes.set_value_of_name("columns", columns_list) layer_defn = None return json_attributes
class CMetaData(CResource): def __init__(self): self.__quality__ = CQuality() self.__metadata_extract_result__ = self.Not_Support self.__metadata_extract_memo__ = '' self.__metadata_text__ = None self.__metadata_xml__ = CXml() self.__metadata_json__ = CJson() self.__metadata_type__ = self.MetaDataFormat_Text self.__metadata_bus_extract_result__ = self.Not_Support self.__metadata_bus_extract_memo__ = '' self.__metadata_bus_text__ = None self.__metadata_bus_xml__ = CXml() self.__metadata_bus_json__ = CJson() self.__metadata_bus_type__ = self.MetaDataFormat_Text self.__thumb_img_file_name__ = '' self.__browse_img_file_name__ = '' self.__metadata_view_extract_result__ = self.Not_Support self.__metadata_view_extract_memo__ = '' self.__time_information__ = CJson() self.__metadata_time_extract_result__ = self.Not_Support self.__metadata_time_extract_memo__ = '' self.__metadata_spatial_extract_result__ = self.Not_Support self.__metadata_spatial_extract_memo__ = '' self.__metadata_spatial__ = CMDSpatial() def metadata_time(self): if self.__metadata_time_extract_result__ == self.DB_True: return self.__metadata_time_extract_result__, self.__metadata_time_extract_memo__, self.__time_information__.to_json( ) else: return self.__metadata_time_extract_result__, self.__metadata_time_extract_memo__, '' def metadata_view(self): if self.__metadata_view_extract_result__ == self.DB_True: return self.__metadata_view_extract_result__, self.__metadata_view_extract_memo__, self.__thumb_img_file_name__, self.__browse_img_file_name__ else: return self.__metadata_view_extract_result__, self.__metadata_view_extract_memo__, '', '' def metadata_spatial(self): if self.__metadata_spatial_extract_result__ == self.DB_True: return self.__metadata_spatial_extract_result__, self.__metadata_spatial_extract_memo__, self.__metadata_spatial__ else: return self.__metadata_spatial_extract_result__, self.__metadata_spatial_extract_memo__, self.__metadata_spatial__ @property def quality(self): return self.__quality__ @property def thumb_img_file_name(self): return self.__thumb_img_file_name__ @thumb_img_file_name.setter def thumb_img_file_name(self, value): self.__thumb_img_file_name__ = value @property def browse_img_file_name(self): return self.__browse_img_file_name__ @browse_img_file_name.setter def browse_img_file_name(self, value): self.__browse_img_file_name__ = value @property def time_information(self) -> CJson: return self.__time_information__ @property def metadata_extract_result(self): return self.__metadata_extract_result__ @property def metadata_bus_extract_result(self): return self.__metadata_bus_extract_result__ @property def metadata_view_extract_result(self): return self.__metadata_view_extract_result__ @property def metadata_time_extract_result(self): return self.__metadata_time_extract_result__ @property def metadata_spatial_extract_result(self): return self.__metadata_spatial_extract_result__ def metadata(self): if self.__metadata_extract_result__ != self.DB_True: return self.__metadata_extract_result__, self.__metadata_extract_memo__, self.__metadata_type__, None elif self.__metadata_type__ == self.MetaDataFormat_Json: return self.__metadata_extract_result__, self.__metadata_extract_memo__, self.__metadata_type__, self.__metadata_json__.to_json( ) elif self.__metadata_type__ == self.MetaDataFormat_XML: return self.__metadata_extract_result__, self.__metadata_extract_memo__, self.__metadata_type__, self.__metadata_xml__.to_xml( ) else: return self.__metadata_extract_result__, self.__metadata_extract_memo__, self.__metadata_type__, self.__metadata_text__ @property def metadata_type(self): return self.__metadata_type__ @property def metadata_bus_type(self): return self.__metadata_bus_type__ def metadata_xml(self) -> CXml: return self.__metadata_xml__ def metadata_json(self) -> CJson: return self.__metadata_json__ def metadata_bus_xml(self) -> CXml: return self.__metadata_bus_xml__ def metadata_bus_json(self) -> CJson: return self.__metadata_bus_json__ def metadata_spatial_obj(self) -> CMDSpatial: return self.__metadata_spatial__ def set_metadata_spatial(self, result: int, memo: str, spatial_metadata_type=None, spatial_metadata=None): self.__metadata_spatial_extract_result__ = result self.__metadata_spatial_extract_memo__ = memo if spatial_metadata_type is None: return if spatial_metadata_type == CResource.Spatial_MetaData_Type_Native_Center: self.__metadata_spatial__.native_center = spatial_metadata elif spatial_metadata_type == CResource.Spatial_MetaData_Type_Native_BBox: self.__metadata_spatial__.native_box = spatial_metadata elif spatial_metadata_type == CResource.Spatial_MetaData_Type_Native_Geom: self.__metadata_spatial__.native_geom = spatial_metadata elif spatial_metadata_type == CResource.Spatial_MetaData_Type_Wgs84_Center: self.__metadata_spatial__.wgs84_center = spatial_metadata elif spatial_metadata_type == CResource.Spatial_MetaData_Type_Wgs84_BBox: self.__metadata_spatial__.wgs84_bbox = spatial_metadata elif spatial_metadata_type == CResource.Spatial_MetaData_Type_Wgs84_Geom: self.__metadata_spatial__.wgs84_geom = spatial_metadata elif spatial_metadata_type == CResource.Spatial_MetaData_Type_Prj_Wkt: self.__metadata_spatial__.prj_wkt = spatial_metadata elif spatial_metadata_type == CResource.Spatial_MetaData_Type_Prj_Proj4: self.__metadata_spatial__.prj_proj4 = spatial_metadata elif spatial_metadata_type == CResource.Spatial_MetaData_Type_Prj_Project: self.__metadata_spatial__.prj_project = spatial_metadata elif spatial_metadata_type == CResource.Spatial_MetaData_Type_Prj_Coordinate: self.__metadata_spatial__.prj_coordinate = spatial_metadata elif spatial_metadata_type == CResource.Spatial_MetaData_Type_Prj_Degree: self.__metadata_spatial__.prj_degree = spatial_metadata elif spatial_metadata_type == CResource.Spatial_MetaData_Type_Prj_Zone: self.__metadata_spatial__.prj_zone = spatial_metadata elif spatial_metadata_type == CResource.Spatial_MetaData_Type_Prj_Source: self.__metadata_spatial__.prj_source = spatial_metadata else: pass def set_metadata_view(self, result: int, memo: str, view_metadata_type=None, view_metadata=None): self.__metadata_view_extract_result__ = result self.__metadata_view_extract_memo__ = memo if view_metadata_type is None: self.__browse_img_file_name__ = None self.__thumb_img_file_name__ = None return if view_metadata_type == CResource.View_MetaData_Type_Browse: self.__browse_img_file_name__ = view_metadata elif view_metadata_type == CResource.View_MetaData_Type_Thumb: self.__thumb_img_file_name__ = view_metadata else: pass def set_metadata_time(self, result: int, memo: str, time_attr_name=None, time_attr_value=None): self.__metadata_time_extract_result__ = result self.__metadata_time_extract_memo__ = memo if time_attr_name is not None: self.__time_information__.set_value_of_name( CUtils.any_2_str(time_attr_name), time_attr_value) def set_metadata(self, metadata_extract_result: int, metadata_extract_memo: str, metadata_type: int, metadata_text): self.__metadata_extract_result__ = metadata_extract_result self.__metadata_extract_memo__ = metadata_extract_memo self.__metadata_type__ = metadata_type if self.__metadata_type__ == self.MetaDataFormat_Json: self.__metadata_text__ = '' self.__metadata_xml__ = CXml() self.__metadata_json__.load_json_text(metadata_text) elif self.__metadata_type__ == self.MetaDataFormat_XML: self.__metadata_text__ = '' self.__metadata_xml__.load_xml(metadata_text) self.__metadata_json__ = CJson() else: self.__metadata_text__ = metadata_text self.__metadata_xml__ = CXml() self.__metadata_json__ = CJson() def set_metadata_file(self, metadata_extract_result: int, metadata_extract_memo: str, metadata_type: int, file_name): self.__metadata_extract_result__ = metadata_extract_result self.__metadata_extract_memo__ = metadata_extract_memo self.__metadata_type__ = metadata_type if self.__metadata_type__ == self.MetaDataFormat_Json: self.__metadata_text__ = '' self.__metadata_xml__ = CXml() self.__metadata_json__.load_file(file_name) elif self.__metadata_type__ == self.MetaDataFormat_XML: self.__metadata_text__ = '' self.__metadata_xml__.load_file(file_name) self.__metadata_json__ = CJson() else: self.__metadata_text__ = CFile.file_2_str(file_name) self.__metadata_xml__ = CXml() self.__metadata_json__ = CJson() def metadata_bus(self): if self.__metadata_bus_extract_result__ != self.DB_True: return self.__metadata_bus_extract_result__, self.__metadata_bus_extract_memo__, self.__metadata_bus_type__, None elif self.__metadata_bus_type__ == self.MetaDataFormat_Json: return self.__metadata_bus_extract_result__, self.__metadata_bus_extract_memo__, self.__metadata_bus_type__, self.__metadata_bus_json__.to_json( ) elif self.__metadata_bus_type__ == self.MetaDataFormat_XML: return self.__metadata_bus_extract_result__, self.__metadata_bus_extract_memo__, self.__metadata_bus_type__, self.__metadata_bus_xml__.to_xml( ) else: return self.__metadata_bus_extract_result__, self.__metadata_bus_extract_memo__, self.__metadata_bus_type__, self.__metadata_bus_text__ def set_metadata_bus(self, metadata_bus_extract_result: int, metadata_bus_extract_memo: str, metadata_bus_type: int, metadata_bus_text): self.__metadata_bus_extract_result__ = metadata_bus_extract_result self.__metadata_bus_extract_memo__ = metadata_bus_extract_memo self.__metadata_bus_type__ = metadata_bus_type if self.__metadata_bus_type__ == self.MetaDataFormat_Json: self.__metadata_bus_text__ = '' self.__metadata_bus_xml__ = CXml() self.__metadata_bus_json__.load_json_text(metadata_bus_text) elif self.__metadata_bus_type__ == self.MetaDataFormat_XML: self.__metadata_bus_text__ = '' self.__metadata_bus_xml__.load_xml(metadata_bus_text) self.__metadata_bus_json__ = CJson() else: self.__metadata_bus_text__ = metadata_bus_text self.__metadata_bus_xml__ = CXml() self.__metadata_bus_json__ = CJson() def set_metadata_bus_file(self, metadata_bus_extract_result: int, metadata_bus_extract_memo: str, metadata_type: int, file_name): self.__metadata_bus_extract_result__ = metadata_bus_extract_result self.__metadata_bus_extract_memo__ = metadata_bus_extract_memo self.__metadata_bus_type__ = metadata_type if self.__metadata_bus_type__ == self.MetaDataFormat_Json: self.__metadata_bus_text__ = '' self.__metadata_bus_xml__ = CXml() self.__metadata_bus_json__.load_file(file_name) elif self.__metadata_bus_type__ == self.MetaDataFormat_XML: self.__metadata_bus_text__ = '' self.__metadata_bus_xml__.load_file(file_name) self.__metadata_bus_json__ = CJson() else: self.__metadata_bus_text__ = CFile.file_2_str(file_name) self.__metadata_bus_xml__ = CXml() self.__metadata_bus_json__ = CJson()
def transform_to_WGS84(self, geo_transform: tuple, image_size_x: int, image_size_y: int, projection: str) -> CJson: """ wgs84坐标系转换结果(wgs84节点) :param geo_transform: :param image_size_x: :param image_size_y: :param projection: :return: """ json_wgs84 = CJson() spatial_ref = osr.SpatialReference() spatial_ref.SetWellKnownGeogCS('WGS84') wgs84_wkt = spatial_ref.ExportToWkt() wgs84_proj4 = spatial_ref.ExportToProj4() spatial_ref.MorphToESRI() wgs84_esri = spatial_ref.ExportToWkt() json_wgs84_coordinate = CJson() json_wgs84_coordinate.set_value_of_name('wkt', wgs84_wkt) json_wgs84_coordinate.set_value_of_name('proj4', wgs84_proj4) json_wgs84_coordinate.set_value_of_name('esri', wgs84_esri) json_wgs84.set_value_of_name('coordinate', json_wgs84_coordinate.json_obj) if geo_transform is not None: point_left_top_x = geo_transform[0] point_left_top_y = geo_transform[3] point_right_bottom_x = geo_transform[0] + image_size_x * geo_transform[1] + image_size_y * geo_transform[2] point_right_bottom_y = geo_transform[3] + image_size_x * geo_transform[4] + image_size_y * geo_transform[5] rb = (0, 0) lu = (0, 0) if not CUtils.equal_ignore_case(projection, ''): source_projection = osr.SpatialReference(wkt=projection) source = source_projection.GetAttrValue('GEOGCS', 0) prosrs = osr.SpatialReference() prosrs.ImportFromWkt(projection) geosrs = prosrs.CloneGeogCS() if "GetPROJVersionMajor" in dir(osr) and osr.GetPROJVersionMajor() >= 6: # gdal>=3.0 prosrs.SetAxisMappingStrategy(osr.OAMS_TRADITIONAL_GIS_ORDER) geosrs.SetAxisMappingStrategy(osr.OAMS_TRADITIONAL_GIS_ORDER) ct = osr.CreateCoordinateTransformation(prosrs, geosrs) if ct is not None: rb = ct.TransformPoint(point_right_bottom_x, point_right_bottom_y) lu = ct.TransformPoint(point_left_top_x, point_left_top_y) json_bounding = CJson() json_bounding.set_value_of_name('left', lu[0]) json_bounding.set_value_of_name('top', lu[1]) json_bounding.set_value_of_name('right', rb[0]) json_bounding.set_value_of_name('bottom', rb[1]) json_wgs84.set_value_of_name('boundingbox', json_bounding.json_obj) json_wgs84.set_value_of_name('msg', 'boundingbox四至范围从{0}坐标系转wgs_84坐标系转换成功!'.format(source)) json_wgs84.set_value_of_name('result', self.Success) else: json_wgs84.set_value_of_name('msg', 'boundingbox四至范围从{0}坐标系转wgs_84坐标系转换失败!失败原因:构建坐标转换关系失败!可能是地方坐标系,无法转换。'.format( source)) json_wgs84.set_value_of_name('result', self.Failure) else: json_wgs84.set_value_of_name('msg', 'boundingbox四至范围从原坐标系转wgs_84坐标系转换失败!失败原因:文件不存在coordinate信息!') json_wgs84.set_value_of_name('result', self.Failure) else: json_wgs84.set_value_of_name('msg', 'boundingbox四至范围从原坐标系转wgs_84坐标系转换失败!失败原因:文件不存在仿射变换信息!') json_wgs84.set_value_of_name('result', self.Failure) return json_wgs84
def get_projwkt_by_layer(self, layer) -> CJson: """ 根据图层对象获取空间参考的wkt对象节点 @param layer: @return: """ json_proj_wkt = CJson() spatialRef = layer.GetSpatialRef() if spatialRef is None: json_proj_wkt.set_value_of_name('valid', False) json_proj_wkt.set_value_of_name('wkt', None) json_proj_wkt.set_value_of_name('proj4', None) json_proj_wkt.set_value_of_name('esri', None) else: proj_wkt = spatialRef.ExportToWkt() proj4 = spatialRef.ExportToProj4() spatialRef.MorphToESRI() proj_esri = spatialRef.ExportToWkt() json_proj_wkt.set_value_of_name('valid', True) json_proj_wkt.set_value_of_name('wkt', proj_wkt) json_proj_wkt.set_value_of_name('proj4', proj4) json_proj_wkt.set_value_of_name('esri', proj_esri) spatialRef = None return json_proj_wkt
def test_json(self): json_shp = CJson() json_datasource = CJson() json_datasource.set_value_of_name('name', r'镶嵌影像\\石嘴山市-3xq.shp') json_datasource.set_value_of_name('description', 'ESRI Shapefile') json_datasource_str = json_datasource.to_json() print(json_datasource_str) json_shp.set_value_of_name('datasource', json_datasource.json_obj) json_shp.set_value_of_name('layer_count', '1') list_layers = list() list_layers.append(json_datasource.json_obj) json_shp.set_value_of_name('layers', list_layers) json_shp.set_value_of_name('valid', True) json_shp_str = json_shp.to_json() json_shp.to_file(r'c:\app\aa.txt') print(json_shp_str)