microproduct/leafAreaIndex/LeafIndexXmlInfo.py

252 lines
12 KiB
Python
Raw Normal View History

2023-08-28 10:17:29 +00:00
"""
@Project microproduct
@File BackScatteringXmlInfo.PY
@Function 主函数
@Author LMM
@Date 2021/10/19 14:39
@Version 1.0.0
"""
2024-10-30 03:16:40 +00:00
import glob
import os
2023-08-28 10:17:29 +00:00
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, out_path1, out_path2):
"""
image_path:影像路径
image_pair:输入的压缩包中的极化对 hh,hv,vh,vv=1111
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
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"}) # 设置图像位深度
# noinspection PyBroadException
# try: # 设置图像位深度
# imagebit="0bit"
# # im=Image.open(self.image_path)
# im = Image.open(r"E:\0test\testworkspace\DEM\ASTGTM2_N24E110_dem.tif")
# if "1" in im.getbands():
# imagebit="1bit"
# elif "L" in im.getbands() or "P" in im.getbands():
# imagebit = "8bit"
# elif "R" in im.getbands() and "G" in im.getbands() and "B" in im.getbands():
# imagebit = "24bit"
# elif "R" in im.getbands() and "G" in im.getbands() and "B" in im.getbands() and "A" in im.getbands():
# imagebit = "32bit"
# elif "C" in im.getbands() and "M" in im.getbands() and "Y" in im.getbands() and "K" in im.getbands():
# imagebit = "32bit"
# elif "Y" in im.getbands() and "C" in im.getbands() and "b" in im.getbands() and "C" in im.getbands():
# imagebit = "32bit"
# elif "I" in im.getbands() or "F" in im.getbands():
# imagebit = "32bit"
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"})
self.para_dict.update({"imageinfo_QualifyValue_Product": "NULL"})
return self.para_dict
class CreateStadardXmlFile:
"""读取字典中的属性值生成一个标准的xml文件"""
def __init__(self, xml_path, para_xml_path, par_dict, set_threshold, path):
"""
xml_path:模板路径
para_xml_path:算法配置文件的路径
par_dict:字典
path:xml模板输出路径
"""
self.par_dict = par_dict
self.path = path
self.para_xml_path= para_xml_path
self.set_threshold = set_threshold
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")
QualifyValue.find(key.split("_")[2]).text = str(value)
pass
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=="Polarization":
para_value = para.find("ParaValue").text
Parameter.find("Polarization").text = str(para_value)
elif para.find("ParaName").text=="A":
para_value = para.find("ParaValue").text
Parameter.find("ExperienceParaA").text = str(para_value)
elif para.find("ParaName").text=="B":
para_value = para.find("ParaValue").text
Parameter.find("ExperienceParaB").text = str(para_value)
elif para.find("ParaName").text=="C":
para_value = para.find("ParaValue").text
Parameter.find("ExperienceParaC").text = str(para_value)
elif para.find("ParaName").text=="D":
para_value = para.find("ParaValue").text
Parameter.find("ExperienceParaD").text = str(para_value)
Parameter.find("NdviThresholdMin").text = str(self.set_threshold[0])
Parameter.find("NdviThresholdMax").text = str(self.set_threshold[1])
Parameter.find("CoverThresholdMin").text = str(self.set_threshold[2])
Parameter.find("CoverThresholdMax").text = str(self.set_threshold[3])
tree.write(self.path, encoding="utf-8", xml_declaration=True)
2024-10-30 03:16:40 +00:00
if __name__ == '__main__':
tif_dir = r'E:\SoilMoisture_cal\GF3BWENCANGtif'
out_dir = r'E:\SoilMoisture_cal\GF3_result'
tifs = list(glob.glob(os.path.join(tif_dir, "*.tif")))
for tif in tifs:
name = os.path.splitext(os.path.basename(tif))[0]
outPath = os.path.join(out_dir, name + '_lee.tif')
exe_path = r".\baseTool\x64\Release\SIMOrthoProgram.exe"
exe_cmd = r"set PROJ_LIB=.\baseTool\x64\Release; & {0} {1} {2} {3} {4} {5}".format(exe_path, 12, tif,
outPath, 7, 0.25)
print(exe_cmd)
print(os.system(exe_cmd))
print("==========================================================================")