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
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