コード例 #1
0
 def process(self) -> str:
     """
     todo 负责人 赵宇飞 在这里提取影像数据的空间信息, 以文件形式存储在self.file_content.work_root_dir下
         注意返回的串中有空间信息的文件名
     注意: 如果出现内存泄漏现象, 则使用新建进程提取元数据, 放置到文件中, 在本进程中解析元数据!!!
     :return:
     """
     result_process = self.process_raster()
     if CResult.result_success(result_process):
         file_path = self.file_content.work_root_dir
         dict_temp_file_name = {
             self.Name_Native_Center: '{0}_native_center.wkt'.format(self.object_name),
             self.Name_Native_BBox: '{0}_native_bbox.wkt'.format(self.object_name),
             self.Name_Native_Geom: '{0}_native_geom.wkt'.format(self.object_name),
             self.Name_Wgs84_Center: '{0}_wgs84_center.wkt'.format(self.object_name),
             self.Name_Wgs84_BBox: '{0}_wgs84_bbox.wkt'.format(self.object_name),
             self.Name_Wgs84_Geom: '{0}_wgs84_geom.wkt'.format(self.object_name)
         }
         dict_temp_prj_name = {
             self.Name_Prj_Wkt: CResult.result_info(result_process, self.Name_Prj_Wkt, None),
             self.Name_Prj_Proj4: CResult.result_info(result_process, self.Name_Prj_Proj4, None),
             self.Name_Prj_Project: CResult.result_info(result_process, self.Name_Prj_Project, None),
             self.Name_Prj_Coordinate: CResult.result_info(result_process, self.Name_Prj_Coordinate, None),
             self.Name_Prj_Source: CResult.result_info(result_process, self.Name_Prj_Source, None),
             self.Name_Prj_Zone: CResult.result_info(result_process, self.Name_Prj_Zone, None),
             self.Name_Prj_Degree: CResult.result_info(result_process, self.Name_Prj_Degree, None)
         }
         result = CResult.merge_result(self.Success, '处理完毕!')
         for file_type, file_name in dict_temp_file_name.items():
             result = CResult.merge_result_info(result, file_type, CFile.join_file(file_path, file_name))
         for prj_type, prj_name in dict_temp_prj_name.items():
             result = CResult.merge_result_info(result, prj_type, prj_name)
     else:
         result = CResult.merge_result(self.Failure, CResult.result_message(result_process))
     return result
コード例 #2
0
 def process(self) -> str:
     """
     todo 负责人 赵宇飞 在这里提取矢量数据的快视图, 将元数据文件存储在self.file_content.view_root_dir下
         注意返回的串中有快视图和拇指图的文件名
     注意: 如果出现内存泄漏现象, 则使用新建进程提取元数据, 放置到文件中, 在本进程中解析元数据!!!
     :return:
     """
     result = CResult.merge_result(self.Success, '处理完毕!')
     result = CResult.merge_result_info(result, self.Name_Browse, '/aa/bb_browse.png')
     result = CResult.merge_result_info(result, self.Name_Thumb, '/aa/bb_thumb.png')
     return result
コード例 #3
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
コード例 #4
0
 def access(self, obj_id, obj_name, obj_type, quality) -> str:
     """
     解析数管中识别出的对象, 与第三方模块的访问能力, 在本方法中进行处理
     返回的json格式字符串中, 是默认的CResult格式, 但是在其中还增加了Access属性, 通过它反馈当前对象是否满足第三方模块的应用要求
     注意: 一定要反馈Access属性
     :return:
     """
     result = self.__test_module_obj(obj_id, obj_name)
     if not CResult.result_success(result):
         return CResult.merge_result_info(result, self.Name_Access,
                                          self.DataAccess_Forbid)
     else:
         return CResult.merge_result_info(result, self.Name_Access,
                                          self.DataAccess_Pass)
コード例 #5
0
    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
コード例 #6
0
    def process(self) -> str:
        """
        在这里提取矢量数据的元数据, 将元数据文件存储在self.file_content.work_root_dir下, 固定名称为self.FileName_MetaData, 注意返回的串中有元数据的格式
        :return:
        """
        result = super().process()

        metadata_main_name_with_path = CFile.join_file(
            self.file_info.file_path, self.file_info.file_main_name)
        metadata_filename = '{0}.xml'.format(metadata_main_name_with_path[:-2])
        format_metadata = self.MetaDataFormat_XML

        result = CResult.merge_result_info(result, self.Name_FileName,
                                           metadata_filename)
        return CResult.merge_result_info(result, self.Name_Format,
                                         format_metadata)
コード例 #7
0
 def access(self, obj_id, obj_name, obj_type, quality) -> str:
     """
     解析数管中识别出的对象, 与第三方模块的访问能力, 在本方法中进行处理
     返回的json格式字符串中, 是默认的CResult格式, 但是在其中还增加了Access属性, 通过它反馈当前对象是否满足第三方模块的应用要求
     注意: 一定要反馈Access属性
     :return:
     """
     result = super().access(obj_id, obj_name, obj_type, quality)
     return CResult.merge_result_info(result, self.Name_Access,
                                      self.DataAccess_Wait)
コード例 #8
0
    def process(self) -> str:
        """
        在这里提取矢量数据的元数据, 将元数据文件存储在self.file_content.work_root_dir下, 固定名称为self.FileName_MetaData, 注意返回的串中有元数据的格式
        :return:
        """
        result = super().process()
        ds_metadata = CFactory().give_me_db(
            self.file_info.db_server_id).one_row(
                '''
            select dsometadatatext, dsometadatajson, dsometadataxml
            from dm2_storage_object
            where dsoid = :object_id
            ''', {'object_id': self.object_id})
        metadata_filename = CFile.join_file(
            self.file_content.work_root_dir,
            '{0}.metadata'.format(self.object_name))
        text_metadata = ds_metadata.value_by_name(0, 'dsometadatatext', None)
        json_metadata = ds_metadata.value_by_name(0, 'dsometadatajson', None)
        xml_metadata = ds_metadata.value_by_name(0, 'dsometadataxml', None)

        format_metadata = self.MetaDataFormat_Text
        if json_metadata is not None:
            format_metadata = self.MetaDataFormat_Json
            CJson.str_2_file(json_metadata, metadata_filename)
        elif xml_metadata is not None:
            format_metadata = self.MetaDataFormat_XML
            CXml.str_2_file(xml_metadata, metadata_filename)
        elif text_metadata is not None:
            format_metadata = self.MetaDataFormat_XML
            CFile.str_2_file(text_metadata, metadata_filename)
        else:
            return result

        result = CResult.merge_result_info(result, self.Name_FileName,
                                           metadata_filename)
        return CResult.merge_result_info(result, self.Name_Format,
                                         format_metadata)
コード例 #9
0
 def access(self) -> str:
     """
     解析数管中识别出的对象, 与第三方模块的访问能力, 在本方法中进行处理
     返回的json格式字符串中, 是默认的CResult格式, 但是在其中还增加了Access属性, 通过它反馈当前对象是否满足第三方模块的应用要求
     注意: 一定要反馈Access属性
     :return:
     """
     result = CResult.merge_result(
         self.Success, '模块[{0}.{1}]对对象[{2}]的访问能力已经分析完毕!'.format(
             CUtils.dict_value_by_name(self.information(), self.Name_ID,
                                       ''),
             CUtils.dict_value_by_name(self.information(), self.Name_Title,
                                       ''), self._obj_name))
     return CResult.merge_result_info(result, self.Name_Access,
                                      self.DataAccess_Forbid)
コード例 #10
0
 def process(self) -> str:
     """
     完成 负责人 赵宇飞 在这里提取影像数据的元数据, 将元数据文件存储在self.file_content.work_root_dir下, 固定名称为self.FileName_MetaData, 注意返回的串中有元数据的格式
     注意: 如果出现内存泄漏现象, 则使用新建进程提取元数据, 放置到文件中, 在本进程中解析元数据!!!
     :return:
     """
     out_metadata_file_fullname = CFile.join_file(self.file_content.work_root_dir, self.FileName_MetaData)
     raster_mdreader = CRasterMDReader(self.file_info.file_name_with_full_path)
     # result = raster_mdreader.get_metadata_2_file(out_metadata_file_fullname)
     result = CProcessUtils.processing_method(raster_mdreader.get_metadata_2_file, out_metadata_file_fullname)
     # 进程调用模式
     # p_one = Process(target=raster_mdreader.get_metadata_2_file, args=(out_metadata_file_fullname,))
     # p_one.start()
     # p_one.join()
     return CResult.merge_result_info(result, self.Name_Format, self.MetaDataFormat_Json)
コード例 #11
0
    def _do_access(self) -> str:
        try:
            quality_info_xml = self._quality_info  # 获取质检xml
            quality_summary = self._dataset.value_by_name(0, 'dso_quality_summary', '')
            quality_summary_json = CJson()
            quality_summary_json.load_obj(quality_summary)
            access_wait_flag = self.DB_False  # 定义等待标志,为True则存在检查项目为等待
            access_forbid_flag = self.DB_False  # 定义禁止标志,为True则存在检查项目为禁止
            message = ''

            # 文件与影像质检部分
            file_qa = quality_summary_json.xpath_one('total', '')
            image_qa = quality_summary_json.xpath_one('metadata.data', '')
            if CUtils.equal_ignore_case(file_qa, self.QA_Result_Error) \
                    or CUtils.equal_ignore_case(image_qa, self.QA_Result_Error):
                message = message + '[数据与其相关文件的质检存在error!请进行修正!]'
                access_forbid_flag = self.DB_True
            elif CUtils.equal_ignore_case(file_qa, self.QA_Result_Warn) \
                    or CUtils.equal_ignore_case(image_qa, self.QA_Result_Warn):
                message = message + '[数据与其相关文件的质检存在warn!请进行检查!]'
                access_wait_flag = self.DB_True
            elif CUtils.equal_ignore_case(quality_summary, ''):
                message = message + '[数据质检未进行,可能数据存在问题!请进行检查!]'
                access_forbid_flag = self.DB_True
            else:
                pass

            for qa_name, qa_id in self.access_check_dict().items():  # 循环写好的检查列表
                # qa_id = CUtils.dict_value_by_name(access_check_dict, 'qa_id', '')  # 获取id
                qa_node = quality_info_xml.xpath_one("//item[@id='{0}']".format(qa_id))  # 查询xml中的节点
                if qa_node is not None:
                    node_result = CXml.get_attr(qa_node, self.Name_Result, '', False)  # 获取质检结果
                    if CUtils.equal_ignore_case(node_result, self.QA_Result_Pass):
                        pass
                    elif CUtils.equal_ignore_case(node_result, self.QA_Result_Warn):  # 警告则等待
                        message = message + '[业务元数据的质检中,项目{0}不符合要求,建议修正!]'.format(qa_name)
                        access_wait_flag = self.DB_True
                    else:  # 错误以及其他情况,比如'',或者为其他字段
                        message = message + '[业务元数据的质检中,项目{0}不符合要求,必须修改后方可入库!]'.format(qa_name)
                        access_forbid_flag = self.DB_True
                else:
                    message = message + '[业务元数据的质检中,没有项目{0},请进行修正!]'.format(qa_name)
                    access_forbid_flag = self.DB_True

            # 数据库部分
            access_wait_flag, access_forbid_flag, message = \
                self.db_access_check(access_wait_flag, access_forbid_flag, message)

            # 开始进行检查的结果判断
            access_flag = self.DataAccess_Pass
            if access_forbid_flag:
                access_flag = self.DataAccess_Forbid
            elif access_wait_flag:
                access_flag = self.DataAccess_Wait
            if CUtils.equal_ignore_case(message, ''):
                message = '模块可以进行访问!'

            result = CResult.merge_result(
                self.Success,
                '模块[{0}.{1}]对对象[{2}]的访问能力已经分析完毕!分析结果为:{3}'.format(
                    CUtils.dict_value_by_name(self.information(), self.Name_ID, ''),
                    CUtils.dict_value_by_name(self.information(), self.Name_Title, ''),
                    self._obj_name,
                    message
                )
            )
            return CResult.merge_result_info(result, self.Name_Access, access_flag)
        except Exception as error:
            result = CResult.merge_result(
                self.Failure,
                '模块[{0}.{1}]对对象[{2}]的访问能力的分析存在异常!详细情况: {3}!'.format(
                    CUtils.dict_value_by_name(self.information(), self.Name_ID, ''),
                    CUtils.dict_value_by_name(self.information(), self.Name_Title, ''),
                    self._obj_name,
                    error.__str__()
                )
            )
            return CResult.merge_result_info(result, self.Name_Access, self.DataAccess_Forbid)
コード例 #12
0
    def process_vector(self) -> str:
        try:
            # file_name_with_full_path = r'D:\test\vector_test\石嘴山市-3xq.json'
            # file_main_name = CFile.file_main_name(file_name_with_full_path)
            # file_path = CFile.file_path(file_name_with_full_path)
            xml_obj = self.metadata.metadata_xml()
            # <editor-fold desc="1.空间坐标信息">
            wkt_info = 'POLYGON((${min_x} ${max_y},${max_x} ${max_y},' \
                       '${max_x} ${min_y},${min_x} ${min_y},${min_x} ${max_y}))'
            # 四至坐标
            native_max_x = CUtils.to_decimal(
                xml_obj.get_element_text_by_xpath_one('/TileMetadata/MaxLon'))
            native_max_y = CUtils.to_decimal(
                xml_obj.get_element_text_by_xpath_one('/TileMetadata/MaxLat'))
            native_min_x = CUtils.to_decimal(
                xml_obj.get_element_text_by_xpath_one('/TileMetadata/MinLon'))
            native_min_y = CUtils.to_decimal(
                xml_obj.get_element_text_by_xpath_one('/TileMetadata/MinLat'))
            if (native_max_x is None) or (native_max_y is None) \
                    or (native_min_x is None) or (native_min_y is None):
                native_center_wkt = None
                native_bbox_wkt = None
                geom_native_wkt = None
            else:
                dict_native = {
                    'max_x': CUtils.any_2_str(native_max_x),
                    'max_y': CUtils.any_2_str(native_max_y),
                    'min_x': CUtils.any_2_str(native_min_x),
                    'min_y': CUtils.any_2_str(native_min_y)
                }

                # 中心坐标
                center_x = (native_max_x - native_min_x) / 2 + native_min_x
                center_y = (native_max_y - native_min_y) / 2 + native_min_y
                native_center_wkt = 'POINT({0} {1})'.format(center_x, center_y)

                # 外边框、外包框
                native_bbox_wkt = CUtils.replace_placeholder(
                    wkt_info[:], dict_native)
                geom_native_wkt = native_bbox_wkt

            file_path = self.file_content.work_root_dir
            file_main_name = self.object_name
            native_center_filepath = CFile.join_file(
                file_path, file_main_name + '_native_center.wkt')
            CFile.str_2_file(native_center_wkt, native_center_filepath)
            native_bbox_filepath = CFile.join_file(
                file_path, file_main_name + '_native_bbox.wkt')
            CFile.str_2_file(native_bbox_wkt, native_bbox_filepath)
            native_geom_filepath = CFile.join_file(
                file_path, file_main_name + '_native_geom.wkt')
            CFile.str_2_file(geom_native_wkt, native_geom_filepath)

            projection = xml_obj.get_element_text_by_xpath_one(
                '/TileMetadata/SpatialReference/PRJ')
            if (projection is not None) and (not CUtils.equal_ignore_case(
                    projection, '')):
                source_projection = osr.SpatialReference(wkt=projection)
                source = source_projection.GetAttrValue('GEOGCS', 0)  # 坐标系名称

                prosrs = osr.SpatialReference()
                if prosrs.ImportFromWkt(projection) == gdal.CE_None:
                    proj_wkt = prosrs.ExportToWkt()
                    native_wkt = proj_wkt
                else:
                    native_wkt = projection
                native_proj4 = prosrs.ExportToProj4()
                spatial = None

                rb = (0, 0)
                lu = (0, 0)
                geosrs = prosrs.CloneGeogCS()
                ct = osr.CreateCoordinateTransformation(prosrs, geosrs)
                if ct is not None:
                    rb = ct.TransformPoint(native_max_x, native_max_y)
                    lu = ct.TransformPoint(native_min_x, native_min_y)
                    wgs84_min_x = lu[0]
                    wgs84_max_y = lu[1]
                    wgs84_max_x = rb[0]
                    wgs84_min_y = rb[1]

                    dict_wgs84 = {
                        'max_x': CUtils.any_2_str(wgs84_max_x),
                        'max_y': CUtils.any_2_str(wgs84_max_y),
                        'min_x': CUtils.any_2_str(wgs84_min_x),
                        'min_y': CUtils.any_2_str(wgs84_min_y)
                    }

                    # 中心坐标
                    center_x = (wgs84_max_x - wgs84_min_x) / 2 + wgs84_min_x
                    center_y = (wgs84_max_y - wgs84_min_y) / 2 + wgs84_min_y
                    wgs84_center_wkt = 'POINT({0} {1})'.format(
                        center_x, center_y)

                    # 外边框、外包框
                    wgs84_bbox_wkt = CUtils.replace_placeholder(
                        wkt_info[:], dict_wgs84)
                    wgs84_geom_wkt = wgs84_bbox_wkt

                    wgs84_center_filepath = CFile.join_file(
                        file_path, file_main_name + '_wgs84_center.wkt')
                    CFile.str_2_file(wgs84_center_wkt, wgs84_center_filepath)
                    wgs84_bbox_filepath = CFile.join_file(
                        file_path, file_main_name + '_wgs84_bbox.wkt')
                    CFile.str_2_file(wgs84_bbox_wkt, wgs84_bbox_filepath)
                    wgs84_geom_filepath = CFile.join_file(
                        file_path, file_main_name + '_wgs84_geom.wkt')
                    CFile.str_2_file(wgs84_geom_wkt, wgs84_geom_filepath)
                    # </editor-fold>

                # <editor-fold desc="2.投影信息">
                native_source = CResource.Prj_Source_Data

                # 坐标系
                native_coordinate = None
                # 3度带/6度带
                native_degree = None
                # 投影方式
                native_project = None
                # 带号
                native_zone = None

                # 创建SpatialReference对象,导入wkt信息
                spatial_ref = osr.SpatialReference(wkt=native_wkt)
                if spatial_ref.IsProjected():
                    native_project = spatial_ref.GetAttrValue('PROJECTION')
                    native_coordinate = spatial_ref.GetAttrValue('GEOGCS')
                    # native_degree = spatial_ref.GetAttrValue('GEOGCS|UNIT', 1)
                    native_degree, native_zone = self.get_prj_degree_zone(
                        spatial_ref)
                elif spatial_ref.IsGeocentric():
                    native_project = None
                    native_coordinate = spatial_ref.GetAttrValue('GEOGCS')
                    native_degree = None
                    native_zone = None
                # </editor-fold>

                result = CResult.merge_result(self.Success, '处理完毕!')
                result = CResult.merge_result_info(result, self.Name_Prj_Wkt,
                                                   native_wkt)
                result = CResult.merge_result_info(result, self.Name_Prj_Proj4,
                                                   native_proj4)
                result = CResult.merge_result_info(result,
                                                   self.Name_Prj_Project,
                                                   native_project)
                result = CResult.merge_result_info(result,
                                                   self.Name_Prj_Coordinate,
                                                   native_coordinate)
                result = CResult.merge_result_info(result,
                                                   self.Name_Prj_Source,
                                                   native_source)
                result = CResult.merge_result_info(result, self.Name_Prj_Zone,
                                                   native_zone)
                result = CResult.merge_result_info(result,
                                                   self.Name_Prj_Degree,
                                                   native_degree)
                return result
                # return CResult.merge_result(self.Success, '处理完毕!')
            else:
                return CResult.merge_result(self.Success, '处理完毕!')
        except Exception as error:
            CLogger().warning('矢量数据的空间信息处理出现异常, 错误信息为: {0}'.format(
                error.__str__()))
            return CResult.merge_result(
                self.Failure,
                '矢量数据的空间信息处理出现异常,错误信息为:{0}!'.format(error.__str__()))
コード例 #13
0
    def access(self) -> str:
        try:
            # quality_info_xml = self._quality_info  # 获取质检xml
            quality_summary = self._dataset.value_by_name(
                0, 'dso_quality_summary', '')
            quality_summary_json = CJson()
            quality_summary_json.load_obj(quality_summary)
            access_wait_flag = self.DB_False  # 定义等待标志,为True则存在检查项目为等待
            access_forbid_flag = self.DB_False  # 定义禁止标志,为True则存在检查项目为禁止
            message = ''

            # 文件与影像质检部分
            file_qa = quality_summary_json.xpath_one('total', '')
            image_qa = quality_summary_json.xpath_one('metadata.data', '')
            business_qa = quality_summary_json.xpath_one(
                'metadata.business', '')
            if CUtils.equal_ignore_case(file_qa, self.QA_Result_Error) \
                    or CUtils.equal_ignore_case(image_qa, self.QA_Result_Error) \
                    or CUtils.equal_ignore_case(business_qa, self.QA_Result_Error):
                message = message + '[数据与其相关文件的质检存在error!请进行修正!]'
                access_forbid_flag = self.DB_True
            elif CUtils.equal_ignore_case(file_qa, self.QA_Result_Warn) \
                    or CUtils.equal_ignore_case(image_qa, self.QA_Result_Warn) \
                    or CUtils.equal_ignore_case(business_qa, self.QA_Result_Warn):
                message = message + '[数据与其相关文件的质检存在warn!请进行检查!]'
                access_wait_flag = self.DB_True
            else:
                pass

            # 数据库部分
            access_wait_flag, access_forbid_flag, message = \
                self.db_access_check(access_wait_flag, access_forbid_flag, message)

            # 开始进行检查的结果判断
            access_flag = self.DataAccess_Pass
            if access_forbid_flag:
                access_flag = self.DataAccess_Forbid
            elif access_wait_flag:
                access_flag = self.DataAccess_Wait
            if CUtils.equal_ignore_case(message, ''):
                message = '模块可以进行访问!'

            result = CResult.merge_result(
                self.Success,
                '模块[{0}.{1}]对对象[{2}]的访问能力已经分析完毕!分析结果为:{3}'.format(
                    CUtils.dict_value_by_name(self.information(), self.Name_ID,
                                              ''),
                    CUtils.dict_value_by_name(self.information(),
                                              self.Name_Title, ''),
                    self._obj_name, message))
            return CResult.merge_result_info(result, self.Name_Access,
                                             access_flag)
        except Exception as error:
            result = CResult.merge_result(
                self.Failure,
                '模块[{0}.{1}]对对象[{2}]的访问能力的分析存在异常!详细情况: {3}!'.format(
                    CUtils.dict_value_by_name(self.information(), self.Name_ID,
                                              ''),
                    CUtils.dict_value_by_name(self.information(),
                                              self.Name_Title, ''),
                    self._obj_name, error.__str__()))
            return CResult.merge_result_info(result, self.Name_Access,
                                             self.DataAccess_Forbid)
コード例 #14
0
    def process(self) -> str:
        """
        在这里提取文档数据的元数据, 将元数据文件存储在self.file_content.work_root_dir下, 固定名称为self.FileName_MetaData, 注意返回的串中有元数据的格式
        注意: 如果出现内存泄漏现象, 则使用新建进程提取元数据, 放置到文件中, 在本进程中解析元数据!!!
        :return:
        """
        default_result = super().process()
        out_metadata_file_fullname = CFile.join_file(
            self.file_content.work_root_dir, self.FileName_MetaData)
        in_file_fullname = self.file_info.file_name_with_full_path

        if not settings.application.xpath_one(
                self.Path_Setting_Dependence_Tika_Enable, True):
            return default_result

        tika_dependence_mode = settings.application.xpath_one(
            self.Path_Setting_Dependence_Tika_Mode, self.Name_Server)
        if CUtils.equal_ignore_case(tika_dependence_mode, self.Name_Server):
            tika_server_url = settings.application.xpath_one(
                self.Path_Setting_Dependence_Tika_Server_Url, None)
            tika_server_connect_timeout = settings.application.xpath_one(
                self.Path_Setting_Dependence_Tika_Server_Timeout, 30)
            if CUtils.equal_ignore_case(tika_server_url, ''):
                return default_result

            try:
                parsed = TikaServer.from_file(
                    in_file_fullname,
                    tika_server_url,
                    requestOptions={'timeout': tika_server_connect_timeout})
                meta_data_dict = parsed["metadata"]
                json_obj = CJson()
                json_obj.load_obj(meta_data_dict)
                json_obj.to_file(out_metadata_file_fullname)
                return CResult.merge_result_info(
                    CResult.merge_result(
                        self.Success,
                        '文档[{0}]的元数据提取成功'.format(in_file_fullname)),
                    self.Name_Format, self.MetaDataFormat_Json)
            except Exception as error:
                return CResult.merge_result(
                    self.Failure, '文档[{0}]的元数据提取过程出现错误, 详细信息为: [{1}]'.format(
                        in_file_fullname, error.__str__()))
        else:
            tika_application = settings.application.xpath_one(
                self.Path_Setting_Dependence_Tika_Client_App, None)
            if CUtils.equal_ignore_case(tika_application, ''):
                return default_result

            if not CFile.file_or_path_exist(tika_application):
                return CResult.merge_result(
                    self.Failure,
                    '文档[{0}]的元数据无法提取, 详细原因为: [依赖中间件{1}文件不存在, 请修正后重试!]'.format(
                        in_file_fullname, tika_application))

            try:
                tika_client = TikaApplication(file_jar=tika_application)
                meta_data_dict = tika_client.extract_only_metadata(
                    in_file_fullname)
                json_obj = CJson()
                json_obj.load_obj(meta_data_dict)
                json_obj.to_file(out_metadata_file_fullname)
                return CResult.merge_result_info(
                    CResult.merge_result(
                        self.Success,
                        '文档[{0}]的元数据提取成功'.format(in_file_fullname)),
                    self.Name_Format, self.MetaDataFormat_Json)
            except Exception as error:
                return CResult.merge_result(
                    self.Failure, '文档[{0}]的元数据提取过程出现错误, 详细信息为: [{1}]'.format(
                        in_file_fullname, error.__str__()))

        # result = raster_mdreader.get_metadata_2_file(out_metadata_file_fullname)
        # result = CProcessUtils.processing_method(raster_mdreader.get_metadata_2_file, out_metadata_file_fullname)
        # 进程调用模式
        # p_one = Process(target=raster_mdreader.get_metadata_2_file, args=(out_metadata_file_fullname,))
        # p_one.start()
        # p_one.join()
        return CResult.merge_result_info(result, self.Name_Format,
                                         self.MetaDataFormat_Json)
コード例 #15
0
    def process_raster(self) -> str:
        try:
            # file_name_with_full_path = r'D:\test\raster_test\石嘴山市.json'
            # file_main_name = CFile.file_main_name(file_name_with_full_path)
            # file_path = CFile.file_path(file_name_with_full_path)
            json_obj = self.metadata.metadata_json()
            # json_obj.load_file(file_name_with_full_path)

            # <editor-fold desc="1.空间坐标信息">
            wkt_info = 'POLYGON((${min_x} ${max_y},${max_x} ${max_y},' \
                       '${max_x} ${min_y},${min_x} ${min_y},${min_x} ${max_y}))'

            # 四至坐标
            native_max_x = CUtils.to_decimal(json_obj.xpath_one('boundingbox.right', None))
            native_max_y = CUtils.to_decimal(json_obj.xpath_one('boundingbox.top', None))
            native_min_x = CUtils.to_decimal(json_obj.xpath_one('boundingbox.left', None))
            native_min_y = CUtils.to_decimal(json_obj.xpath_one('boundingbox.bottom', None))
            if (native_max_x is None) or (native_max_y is None) or (native_min_x is None) or (native_min_y is None):
                native_center_wkt = None
                native_bbox_wkt = None
                native_geom_wkt = None
            else:
                dict_native = {'max_x': CUtils.any_2_str(native_max_x),
                               'max_y': CUtils.any_2_str(native_max_y),
                               'min_x': CUtils.any_2_str(native_min_x),
                               'min_y': CUtils.any_2_str(native_min_y)}

                # 中心点坐标
                center_x = (native_max_x - native_min_x) / 2 + native_min_x
                center_y = (native_max_y - native_min_y) / 2 + native_min_y
                native_center_wkt = 'POINT({0} {1})'.format(center_x, center_y)

                # 外边框、外包框
                native_bbox_wkt = CUtils.replace_placeholder(wkt_info[:], dict_native)
                native_geom_wkt = native_bbox_wkt

            file_path = self.file_content.work_root_dir
            file_main_name = self.object_name
            native_center_filepath = CFile.join_file(file_path, file_main_name + '_native_center.wkt')
            CFile.str_2_file(native_center_wkt, native_center_filepath)
            native_bbox_filepath = CFile.join_file(file_path, file_main_name + '_native_bbox.wkt')
            CFile.str_2_file(native_bbox_wkt, native_bbox_filepath)
            native_geom_filepath = CFile.join_file(file_path, file_main_name + '_native_geom.wkt')
            CFile.str_2_file(native_geom_wkt, native_geom_filepath)

            # wgs84转换后的四至坐标
            wgs84_max_x = CUtils.to_decimal(json_obj.xpath_one('wgs84.boundingbox.right', None))
            wgs84_max_y = CUtils.to_decimal(json_obj.xpath_one('wgs84.boundingbox.top', None))
            wgs84_min_x = CUtils.to_decimal(json_obj.xpath_one('wgs84.boundingbox.left', None))
            wgs84_min_y = CUtils.to_decimal(json_obj.xpath_one('wgs84.boundingbox.bottom', None))
            if (wgs84_max_x is None) or (wgs84_max_y is None) or (wgs84_min_x is None) or (wgs84_min_y is None):
                wgs84_center_wkt = None
                wgs84_bbox_wkt = None
            else:
                dict_wgs84 = {'max_x': CUtils.any_2_str(wgs84_max_x),
                              'max_y': CUtils.any_2_str(wgs84_max_y),
                              'min_x': CUtils.any_2_str(wgs84_min_x),
                              'min_y': CUtils.any_2_str(wgs84_min_y)}

                # 中心点坐标(wgs84)
                center_x = (wgs84_max_x - wgs84_min_x) / 2 + wgs84_min_x
                center_y = (wgs84_max_y - wgs84_min_y) / 2 + wgs84_min_y
                wgs84_center_wkt = 'POINT({0} {1})'.format(center_x, center_y)

                # 外边框、外包框(wgs84)
                wgs84_bbox_wkt = CUtils.replace_placeholder(wkt_info[:], dict_wgs84)
                # wgs84_geom_wkt = wgs84_bbox_wkt
                wgs84_geom_filepath = CFile.join_file(file_path, file_main_name + '_wgs84_geom.wkt')
                # CFile.str_2_file(wgs84_geom_wkt, wgs84_geom_filepath)
                object_file_path = self.file_info.file_name_with_full_path
                process_bus(object_file_path, wgs84_geom_filepath, None)

            wgs84_center_filepath = CFile.join_file(file_path, file_main_name + '_wgs84_center.wkt')
            CFile.str_2_file(wgs84_center_wkt, wgs84_center_filepath)
            wgs84_bbox_filepath = CFile.join_file(file_path, file_main_name + '_wgs84_bbox.wkt')
            CFile.str_2_file(wgs84_bbox_wkt, wgs84_bbox_filepath)
            # </editor-fold>

            # <editor-fold desc="2.投影信息">
            native_wkt = json_obj.xpath_one('coordinate.wkt', None)
            native_proj4 = json_obj.xpath_one('coordinate.proj4', None)
            native_source = CResource.Prj_Source_Data

            # 坐标系
            native_coordinate = None
            # 3度带/6度带
            native_degree = None
            # 投影方式
            native_project = None
            # 带号
            native_zone = None

            # 创建SpatialReference对象,导入wkt信息
            spatial_ref = osr.SpatialReference(wkt=native_wkt)
            if spatial_ref.IsProjected():
                native_coordinate = spatial_ref.GetAttrValue('GEOGCS')
                native_project = spatial_ref.GetAttrValue('PROJECTION')
                # native_degree = spatial_ref.GetAttrValue('GEOGCS|UNIT', 1)
                # pixel_size = json_obj.xpath_one('pixelsize.width', None)
                # native_zone = self.get_prj_zone(spatial_ref, pixel_size)
                native_degree, native_zone = self.get_prj_degree_zone(spatial_ref)
            elif spatial_ref.IsGeocentric():
                native_project = None
                native_coordinate = spatial_ref.GetAttrValue('GEOGCS')
                native_degree = None
                native_zone = None
            # </editor-fold>

            result = CResult.merge_result(self.Success, '处理完毕!')
            result = CResult.merge_result_info(result, self.Name_Prj_Wkt, native_wkt)
            result = CResult.merge_result_info(result, self.Name_Prj_Proj4, native_proj4)
            result = CResult.merge_result_info(result, self.Name_Prj_Project, native_project)
            result = CResult.merge_result_info(result, self.Name_Prj_Coordinate, native_coordinate)
            result = CResult.merge_result_info(result, self.Name_Prj_Source, native_source)
            result = CResult.merge_result_info(result, self.Name_Prj_Zone, native_zone)
            result = CResult.merge_result_info(result, self.Name_Prj_Degree, native_degree)
            return result
            # return CResult.merge_result(self.Success, '处理完毕!')
        except Exception as error:
            CLogger().warning('影像数据的空间信息处理出现异常, 错误信息为: {0}'.format(error.__str__()))
            return CResult.merge_result(self.Failure, '影像数据的空间信息处理出现异常,错误信息为:{0}!'.format(error.__str__()))