Exemplo n.º 1
0
 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
Exemplo n.º 2
0
    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