Beispiel #1
0
    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()
Beispiel #2
0
    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
Beispiel #4
0
 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
Beispiel #5
0
    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
Beispiel #8
0
 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()
Beispiel #9
0
        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())
Beispiel #10
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))
        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
Beispiel #11
0
    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
Beispiel #12
0
    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,
                )
            )
Beispiel #13
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
Beispiel #14
0
    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
Beispiel #15
0
    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
Beispiel #16
0
    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
Beispiel #17
0
    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
Beispiel #18
0
 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
Beispiel #19
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
Beispiel #20
0
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()
Beispiel #21
0
    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
Beispiel #22
0
 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
Beispiel #23
0
    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)