SIMOrthoProgram-Orth_LT1AB-.../Ortho/OrthoXmlInfo.py

311 lines
16 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

"""
@Project microproduct
@File BackScatteringXmlInfo.PY
@Function :主函数
@Author LMM
@Date 2021/10/19 14:39
@Version 1.0.0
"""
import os
from xml.etree.ElementTree import ElementTree, Element
import xml.dom.minidom
from lxml import etree
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
from PIL import Image
class CreateDict:
"""根据影像/DEM的属性信息添加到字典中"""
def __init__(self):
self.ImageHandler = ImageHandler()
pass
def calu_nature(self, image_path, image_pair, out_path1, out_path2):
"""
将productinfo节点需要填写的信息存入字典中
image_path:影像路径
image_pair:输入的压缩包中的极化对 例hh,hv,vh,vv=【1111】
out_path1地理转平面的输出路径
out_path2平面转地理的输出路径
"""
para_dict = {}
imageinfo_width = self.ImageHandler.get_img_width(image_path)
para_dict.update({"imageinfo_width":imageinfo_width})
imageinfo_height = self.ImageHandler.get_img_height(image_path)
para_dict.update({"imageinfo_height":imageinfo_height})
para_dict.update({"imageinfo_EarthModel": "WGS84"})
para_dict.update({"imageinfo_ProjectModel": "UTM"})
proj = self.ImageHandler.get_projection(image_path) # 输出的影像若是投影坐标系则先转成地理坐标系
keyword = proj.split("[", 2)[0] # 若是地理坐标系则pass
if keyword == "GEOGCS":
pass
elif keyword == "PROJCS":
pp.trans_projcs2geogcs(out_path2, image_path)
image_path = out_path2
elif len(keyword) == 0 or keyword.strip() == "" or keyword.isspace() is True:
raise Exception('image projection is missing!')
pp.trans_geogcs2projcs(out_path1, image_path) # 坐标投影, 地理转平面投影坐标
imageinfo_widthspace = self.ImageHandler.get_geotransform(out_path1)[1] # 投影后的分辨率
imageinfo_heightspace = -self.ImageHandler.get_geotransform(out_path1)[5] # 投影后的分辨率
para_dict.update({"imageinfo_widthspace":imageinfo_widthspace})
para_dict.update({"imageinfo_heightspace":imageinfo_heightspace})
para_dict.update({"NominalResolution":imageinfo_widthspace})
WidthInMeters = imageinfo_width*imageinfo_widthspace # 投影后的分辨率×宽度
para_dict.update({"WidthInMeters":WidthInMeters})
image_array = self.ImageHandler.get_band_array(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)
para_dict.update({"MaxValue":MaxValue})
para_dict.update({"MinValue":MinValue})
get_scope = self.ImageHandler.get_scope(image_path)
point_upleft, point_upright, point_downleft, point_downright=get_scope[0], get_scope[1], get_scope[2], get_scope[3]
para_dict.update({"imageinfo_corner_topLeft_latitude": point_upleft[1]})
para_dict.update({"imageinfo_corner_topLeft_longitude": point_upleft[0]})
para_dict.update({"imageinfo_corner_topRight_latitude": point_upright[1]})
para_dict.update({"imageinfo_corner_topRight_longitude": point_upright[0]})
para_dict.update({"imageinfo_corner_bottomLeft_latitude": point_downleft[1]})
para_dict.update({"imageinfo_corner_bottomLeft_longitude": point_downleft[0]})
para_dict.update({"imageinfo_corner_bottomRight_latitude": point_downright[1]})
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
para_dict.update({"imageinfo_center_latitude": imageinfo_center_latitude})
para_dict.update({"imageinfo_center_longitude": imageinfo_center_longitude})
# self.para_dict.update({"productType": "GTC"}) # 设置产品类型
para_dict.update({"productFormat": "TIF"})
productGentime = datetime.datetime.now()
para_dict.update({"productGentime": productGentime})
para_dict.update({"unit": "none"}) # 设置单位
para_dict.update({"NoDataValue": "nan"})
para_dict.update({"productLevel": "4"}) # 设置图像位深度
image_array = self.ImageHandler.get_band_array(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"
para_dict.update({"imagebit": datatype})
except Exception:
para_dict.update({"imagebit": "None"})
HH, HV, VH ,VV= image_pair[0], image_pair[1], image_pair[2], image_pair[3]
if HH == 0:
HH = "delete"
else:
HH = "NULL"
para_dict.update({"imageinfo_QualifyValue_HH": HH})
if HV==0:
HV = "delete"
else:
HV = "NULL"
para_dict.update({"imageinfo_QualifyValue_HV": HV})
if VH==0:
VH = "delete"
else:
VH = "NULL"
para_dict.update({"imageinfo_QualifyValue_VH": VH})
if VV==0:
VV = "delete"
else:
VV = "NULL"
para_dict.update({"imageinfo_QualifyValue_VV": VV})
return para_dict
def calu_dem_nature(self, dem_path, out_dem_path1, out_dem_path2, sampling_f, para_A_arr):
"""
正射需要单独加上dem影像的信息
dem_pathmergedDEM.tif路径
out_dem_path1将mergedDEM.tif由地理坐标转化为平面坐标的保存路径
out_dem_path2将mergedDEM.tif由平面坐标转化为地理坐标的保存路径
sampling_f 采样率
para_A_arr四次多项式模型的参数数组
"""
para_dict2 = {}
proj = self.ImageHandler.get_projection(dem_path) # 输出的影像若是投影坐标系则先转成地理坐标系
keyword = proj.split("[", 2)[0] # 若是地理坐标系则pass
if keyword == "GEOGCS":
pass
elif keyword == "PROJCS":
pp.trans_projcs2geogcs(out_dem_path2, dem_path)
dem_path = out_dem_path2
elif len(keyword) == 0 or keyword.strip() == "" or keyword.isspace() is True:
raise Exception('image projection is missing!')
pp.trans_geogcs2projcs(out_dem_path1, dem_path) # 坐标投影, 地理转平面投影坐标
DEM_widthspace = self.ImageHandler.get_geotransform(out_dem_path1)[1] # 投影后的分辨率
DEM_heightspace = -self.ImageHandler.get_geotransform(out_dem_path1)[5] # 投影后的分辨率
para_dict2.update({"DEM_widthspace":DEM_widthspace})
para_dict2.update({"DEM_heightspace":DEM_heightspace})
# tree = ElementTree() # 获取DEMProductdem产品来源、DEMDatedem对应的日期
# tree.parse(dem_meta) # 影像头文件
# root = tree.getroot()
# productinfo = root.find("metadata")
# DEMProduct = list(productinfo)[0].tag
# para_dict2.update({"DEM_DEMProduct":DEMProduct})
#
# DEMDate = root.find("metadata").find(DEMProduct).text
# para_dict2.update({"DEM_DEMDate": DEMDate})
get_scope = self.ImageHandler.get_scope(dem_path) # 获取mergedDEM.tif数据的四个角的经纬度信息
point_upleft, point_upright, point_downleft, point_downright=get_scope[0], get_scope[1], get_scope[2], get_scope[3]
para_dict2.update({"DEM_corner_topLeft_latitude": point_upleft[1]})
para_dict2.update({"DEM_corner_topLeft_longitude": point_upleft[0]})
para_dict2.update({"DEM_corner_topRight_latitude": point_upright[1]})
para_dict2.update({"DEM_corner_topRight_longitude": point_upright[0]})
para_dict2.update({"DEM_corner_bottomLeft_latitude": point_downleft[1]})
para_dict2.update({"DEM_corner_bottomLeft_longitude": point_downleft[0]})
para_dict2.update({"DEM_corner_bottomRight_latitude": point_downright[1]})
para_dict2.update({"DEM_corner_bottomRight_longitude": point_downright[0]})
#para_dict2.update({"orthoModel_samplingrate": sampling_f})
para_dict2.update({"satalliteOrbitModel_parameter_X_a0": para_A_arr[0, 0]}) # 获取四次多项式模型6个参数的数值
para_dict2.update({"satalliteOrbitModel_parameter_X_a1": para_A_arr[1, 0]})
para_dict2.update({"satalliteOrbitModel_parameter_X_a2": para_A_arr[2, 0]})
para_dict2.update({"satalliteOrbitModel_parameter_X_a3": para_A_arr[3, 0]})
para_dict2.update({"satalliteOrbitModel_parameter_X_a4": para_A_arr[4, 0]})
para_dict2.update({"satalliteOrbitModel_parameter_Y_b0": para_A_arr[0, 1]})
para_dict2.update({"satalliteOrbitModel_parameter_Y_b1": para_A_arr[1, 1]})
para_dict2.update({"satalliteOrbitModel_parameter_Y_b2": para_A_arr[2, 1]})
para_dict2.update({"satalliteOrbitModel_parameter_Y_b3": para_A_arr[3, 1]})
para_dict2.update({"satalliteOrbitModel_parameter_Y_b4": para_A_arr[4, 1]})
para_dict2.update({"satalliteOrbitModel_parameter_Z_c0": para_A_arr[0, 2]})
para_dict2.update({"satalliteOrbitModel_parameter_Z_c1": para_A_arr[1, 2]})
para_dict2.update({"satalliteOrbitModel_parameter_Z_c2": para_A_arr[2, 2]})
para_dict2.update({"satalliteOrbitModel_parameter_Z_c3": para_A_arr[3, 2]})
para_dict2.update({"satalliteOrbitModel_parameter_Z_c4": para_A_arr[4, 2]})
para_dict2.update({"satalliteOrbitModel_parameter_Vx_d0": para_A_arr[0, 3]})
para_dict2.update({"satalliteOrbitModel_parameter_Vx_d1": para_A_arr[1, 3]})
para_dict2.update({"satalliteOrbitModel_parameter_Vx_d2": para_A_arr[2, 3]})
para_dict2.update({"satalliteOrbitModel_parameter_Vx_d3": para_A_arr[3, 3]})
para_dict2.update({"satalliteOrbitModel_parameter_Vx_d4": para_A_arr[4, 3]})
para_dict2.update({"satalliteOrbitModel_parameter_Vy_e0": para_A_arr[0, 4]})
para_dict2.update({"satalliteOrbitModel_parameter_Vy_e1": para_A_arr[1, 4]})
para_dict2.update({"satalliteOrbitModel_parameter_Vy_e2": para_A_arr[2, 4]})
para_dict2.update({"satalliteOrbitModel_parameter_Vy_e3": para_A_arr[3, 4]})
para_dict2.update({"satalliteOrbitModel_parameter_Vy_e4": para_A_arr[4, 4]})
para_dict2.update({"satalliteOrbitModel_parameter_Vz_f0": para_A_arr[0, 5]})
para_dict2.update({"satalliteOrbitModel_parameter_Vz_f1": para_A_arr[1, 5]})
para_dict2.update({"satalliteOrbitModel_parameter_Vz_f2": para_A_arr[2, 5]})
para_dict2.update({"satalliteOrbitModel_parameter_Vz_f3": para_A_arr[3, 5]})
para_dict2.update({"satalliteOrbitModel_parameter_Vz_f4": para_A_arr[4, 5]})
return para_dict2
class CreateStadardXmlFile:
"""读取字典中的属性值生成一个标准的xml文件"""
def __init__(self, xml_path, para_xml_path, par_dict, par_dict2, path):
"""
xml_path:模板路径
para_xml_path:算法配置文件的路径
par_dict:字典
path:xml模板输出路径
"""
self.par_dict = par_dict
self.par_dict2 = par_dict2
self.path = path
shutil.copy(xml_path, path)
pass
def create_standard_xml(self):
"""将字典中的信息写入到copy的xml文件中"""
tree = ElementTree()
tree.parse(self.path) # 影像头文件
root = 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
orthoModel = root.find("processinfo").find("orthoModel") # 写入四次多项式模型
for key, value in self.par_dict2.items():
if key.split("_")[0] == "satalliteOrbitModel":
satalliteOrbitModel = orthoModel.find("satalliteOrbitModel")
satalliteOrbitModel.find(key.split("_")[1]).find(key.split("_")[2]).find(key.split("_")[3]).text = str(value)
elif key.split("_")[0] == "DEM": # 写入dem四个角坐标
DEM= orthoModel.find("DEM")
if key.split("_")[1] == "corner":
corner = DEM.find("corner")
corner.find(key.split("_")[2]).find(key.split("_")[3]).text = str(value)
elif key.split("_")[1] == "widthspace" or key.split("_")[1] == "heightspace":
DEM.find(key.split("_")[1]).text = str(value)
elif key.split("_")[1] == "samplingrate":
orthoModel.find(key.split("_")[1]).text = str(value)
tree.write(self.path, encoding="utf-8", xml_declaration=True)
#
# if __name__ == '__main__':
#
# xml_path = "./model_meta.xml"
# tem_folder= r"E:\microproduct\测试"
# image_path = r"E:\microproduct\测试\GF3_MYN_QPSI_011437_E98_HH_AtmosphericDelay.tif" # 输入影像
# out_path = os.path.join(tem_folder, "trans_geo_projcs.tif")
# image_pair=[1, 1, 1, 0]
# par_dict = CreateDict(image_path, image_pair, out_path).calu_nature() # 计算属性字典
#
# out_xml_path = os.path.join(tem_folder, "creat_standard.meta.xml") # 输出xml路径
# CreateStadardXmlFile(xml_path, par_dict, out_xml_path).create_standard_xml()