""" @Project :microproduct @File :AtmosphericDelayXmlInfo.PY @Function :主函数 @Author :LMM @Date :2021/10/19 14:39 @Version :1.0.0 """ from xml.etree.ElementTree import ElementTree import shutil from tool.algorithm.image.ImageHandle import ImageHandler from tool.algorithm.algtools.PreProcess import PreProcess as pp from osgeo import gdal import numpy as np import datetime class CreateDict: """根据影像信息输出属性字典""" def __init__(self, image_path, image_pair, out_path1, out_path2): self.ImageHandler = ImageHandler() self.para_dict = {} self.image_path = image_path self.out_path = out_path1 self.out_path2 = out_path2 self.image_pair = image_pair pass def calu_nature(self, start): """存入字典""" imageinfo_width = self.ImageHandler.get_img_width(self.image_path) self.para_dict.update({"imageinfo_width": imageinfo_width}) imageinfo_height = self.ImageHandler.get_img_height(self.image_path) self.para_dict.update({"imageinfo_height": imageinfo_height}) # imageinfo_EarthModel=self.ImageHandler.get_projection(self.image_path).split("SPHEROID[", 2)[1].split(",", 2)[0] # self.para_dict.update({"imageinfo_EarthModel":imageinfo_EarthModel.replace('"','')}) self.para_dict.update({"imageinfo_EarthModel": "WGS84"}) # imageinfo_ProjectModel = self.ImageHandler.get_projection(self.image_path).split("DATUM[", 2)[1].split(",", 2)[0] # self.para_dict.update({"imageinfo_ProjectModel":imageinfo_ProjectModel.replace('"','')}) self.para_dict.update({"imageinfo_ProjectModel": "UTM"}) proj = self.ImageHandler.get_projection(self.image_path) # 输出的影像若是投影坐标系则先转成地理坐标系 keyword = proj.split("[", 2)[0] # 若是地理坐标系则pass if keyword == "GEOGCS": pass elif keyword == "PROJCS": pp.trans_projcs2geogcs(self.out_path2, self.image_path) self.image_path = self.out_path2 elif len(keyword) == 0 or keyword.strip() == "" or keyword.isspace() is True: raise Exception('image projection is missing!') pp.trans_geogcs2projcs(self.out_path, self.image_path) # 坐标投影, 地理转平面投影坐标 imageinfo_widthspace = self.ImageHandler.get_geotransform(self.out_path)[1] # 投影后的分辨率 imageinfo_heightspace = -self.ImageHandler.get_geotransform(self.out_path)[5] # 投影后的分辨率 self.para_dict.update({"imageinfo_widthspace": imageinfo_widthspace}) self.para_dict.update({"imageinfo_heightspace": imageinfo_heightspace}) self.para_dict.update({"NominalResolution": imageinfo_widthspace}) WidthInMeters = imageinfo_width * imageinfo_widthspace # 投影后的分辨率×宽度 self.para_dict.update({"WidthInMeters": WidthInMeters}) # image_array = self.ImageHandler.get_band_array(self.image_path) # a2 = np.where(np.isnan(image_array), 999999, image_array) # MinValue = np.min(a2) # a3 = np.where(np.isnan(image_array), -999999, image_array) # MaxValue = np.max(a3) # # self.para_dict.update({"MaxValue":MaxValue}) # self.para_dict.update({"MinValue":MinValue}) get_scope = self.ImageHandler.get_scope(self.image_path) point_upleft, point_upright, point_downleft, point_downright = get_scope[0], get_scope[1], get_scope[2], \ get_scope[3] self.para_dict.update({"imageinfo_corner_topLeft_latitude": point_upleft[1]}) self.para_dict.update({"imageinfo_corner_topLeft_longitude": point_upleft[0]}) self.para_dict.update({"imageinfo_corner_topRight_latitude": point_upright[1]}) self.para_dict.update({"imageinfo_corner_topRight_longitude": point_upright[0]}) self.para_dict.update({"imageinfo_corner_bottomLeft_latitude": point_downleft[1]}) self.para_dict.update({"imageinfo_corner_bottomLeft_longitude": point_downleft[0]}) self.para_dict.update({"imageinfo_corner_bottomRight_latitude": point_downright[1]}) self.para_dict.update({"imageinfo_corner_bottomRight_longitude": point_downright[0]}) longitude_max = np.array([point_upleft[0], point_upright[0], point_downleft[0], point_downright[0]]).max() longitude_min = np.array([point_upleft[0], point_upright[0], point_downleft[0], point_downright[0]]).min() latitude_max = np.array([point_upleft[1], point_upright[1], point_downleft[1], point_downright[1]]).max() latitude_min = np.array([point_upleft[1], point_upright[1], point_downleft[1], point_downright[1]]).min() imageinfo_center_latitude = (latitude_max + latitude_min) / 2 imageinfo_center_longitude = (longitude_max + longitude_min) / 2 self.para_dict.update({"imageinfo_center_latitude": imageinfo_center_latitude}) self.para_dict.update({"imageinfo_center_longitude": imageinfo_center_longitude}) # self.para_dict.update({"productType": "GTC"}) # 设置产品类型 self.para_dict.update({"productFormat": "TIF"}) productGentime = datetime.datetime.now() self.para_dict.update({"productGentime": productGentime}) msg = productGentime - start self.para_dict.update({"productConsumeTime": msg}) self.para_dict.update({"unit": "none"}) # 设置单位 self.para_dict.update({"NoDataValue": "nan"}) self.para_dict.update({"productLevel": "5"}) # 设置图像位深度 image_array = self.ImageHandler.get_band_array(self.image_path) try: gdal_dtypes = { 'int8': gdal.GDT_Byte, 'unit16': gdal.GDT_UInt16, 'int16': gdal.GDT_Int16, 'unit32': gdal.GDT_UInt32, 'int32': gdal.GDT_Int32, 'float32': gdal.GDT_Float32, 'float64': gdal.GDT_Float64, } bit_dtypes = { 'int8': 8, 'unit16': 16, 'int16': 16, 'unit32': 32, 'int32': 32, 'float32': 32, 'float64': 64, } if not gdal_dtypes.get(image_array.dtype.name, None) is None: bit_num = str(bit_dtypes[image_array.dtype.name]) datatype = bit_num + "bit" else: datatype = str(32) + "bit" # datatype = str(gdal.GDT_Float32)+"bit" self.para_dict.update({"imagebit": datatype}) except Exception: self.para_dict.update({"imagebit": "None"}) HH, HV, VH, VV = self.image_pair[0], self.image_pair[1], self.image_pair[2], self.image_pair[3] if HH == 0: HH = "delete" else: HH = "NULL" self.para_dict.update({"imageinfo_QualifyValue_HH": HH}) if HV == 0: HV = "delete" else: HV = "NULL" self.para_dict.update({"imageinfo_QualifyValue_HV": HV}) if VH == 0: VH = "delete" else: VH = "NULL" self.para_dict.update({"imageinfo_QualifyValue_VH": VH}) if VV == 0: VV = "delete" else: VV = "NULL" self.para_dict.update({"imageinfo_QualifyValue_VV": VV}) return self.para_dict class CreateStadardXmlFile: """读取字典中的属性值,生成一个标准的xml文件""" def __init__(self, xml_path, para_xml_path, par_dict, path): """ par_dict:字典 path:xml模板输出路径 """ self.par_dict = par_dict self.path = path self.para_xml_path = para_xml_path shutil.copy(xml_path, path) pass def create_standard_xml(self): """将字典中的信息写入到copy的xml文件中""" tree = ElementTree() tree.parse(self.path) # 影像头文件 root = tree.getroot() para_tree = ElementTree() para_tree.parse(self.para_xml_path) # 影像头文件 para_root = para_tree.getroot() productinfo = root.find("productinfo") for key, value in self.par_dict.items(): if key.split("_")[0] != "imageinfo": productinfo.find(key).text = str(value) elif key.split("_")[0] == "imageinfo": imageinfo = productinfo.find("imageinfo") if key.split("_")[1] in ["EarthModel", "ProjectModel", "width", "height", "widthspace", "heightspace"]: imageinfo.find(key.split("_")[1]).text = str(value) elif key.split("_")[1] == "center": center = imageinfo.find("center") center.find(key.split("_")[2]).text = str(value) elif key.split("_")[1] == "corner": corner = imageinfo.find("corner") corner.find(key.split("_")[2]).find(key.split("_")[3]).text = str(value) elif key.split("_")[1] == "QualifyValue": QualifyValue = imageinfo.find("QualifyValue") if value == "delete": element_QualifyValue = list(QualifyValue) for i in element_QualifyValue: if i.tag == key.split("_")[2]: QualifyValue.remove(i) else: QualifyValue.find(key.split("_")[2]).text = str(value) pass processinfo = root.find("processinfo") Parameter = root.find("processinfo").find("Parameter") para_list = para_root.find("AlgCompt").find("Inputs").findall("Parameter") for para in para_list: if para.find("ParaName").text == "NumConnections": para_value = para.find("ParaValue").text Parameter.find("NumConnections").text = str(para_value) elif para.find("ParaName").text == "EsdCoherenceThreshold": para_value = para.find("ParaValue").text Parameter.find("EsdCoherenceThreshold").text = str(para_value) tree.write(self.path, encoding="utf-8", xml_declaration=True)