209 lines
9.8 KiB
Python
209 lines
9.8 KiB
Python
"""
|
||
@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:
|
||
"""根据影像信息输出属性字典"""
|
||
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({"imageinfo_NearincidenceAngle": "0"})
|
||
self.para_dict.update({"imageinfo_FarIncidenceAngle": "30"})
|
||
self.para_dict.update({"imageinfo_Azimuth": "1"}) # todo 结果xml新增字节
|
||
|
||
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": "1"}) # 设置图像位深度
|
||
|
||
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, par_dict, path):
|
||
"""
|
||
par_dict:字典
|
||
path:xml模板输出路径
|
||
"""
|
||
self.par_dict = par_dict
|
||
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",
|
||
"NearincidenceAngle", "FarIncidenceAngle", "Azimuth"]: # todo 新增xml字节
|
||
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")
|
||
tree.write(self.path, encoding="utf-8", xml_declaration=True)
|
||
|