320 lines
11 KiB
Python
320 lines
11 KiB
Python
|
"""
|
|||
|
@Project :microproduct
|
|||
|
@File :OnePlantHeight.PY
|
|||
|
@Function :主函数
|
|||
|
|
|||
|
@Author :LMM
|
|||
|
@Date :2021/10/19 14:39
|
|||
|
@Version :1.0.0
|
|||
|
"""
|
|||
|
from xml.dom import minidom
|
|||
|
from xml.etree.ElementTree import ElementTree, Element
|
|||
|
import xml.dom.minidom
|
|||
|
from lxml import etree
|
|||
|
import codecs
|
|||
|
import xml.etree.cElementTree as ET
|
|||
|
|
|||
|
|
|||
|
class CreateMetafile:
|
|||
|
"""
|
|||
|
生成元文件案例
|
|||
|
"""
|
|||
|
def __init__(self, input_image_path, input_para_file, an_li_path, path):
|
|||
|
"""
|
|||
|
input_image_path: 影像头文件
|
|||
|
input_para_file: 配置文件
|
|||
|
an_li_path:案例路径
|
|||
|
path:保存路径
|
|||
|
"""
|
|||
|
self.input_image_path = input_image_path
|
|||
|
self.input_para_file = input_para_file
|
|||
|
self.an_li_path= an_li_path
|
|||
|
self.path = path
|
|||
|
pass
|
|||
|
|
|||
|
def create_xml(self):
|
|||
|
"""
|
|||
|
读取元文件(只保留从头文件到sensor节点的部分)
|
|||
|
输出sensor的节点位置
|
|||
|
"""
|
|||
|
tree = ElementTree()
|
|||
|
tree.parse(self.input_image_path) # 影像头文件
|
|||
|
root = tree.getroot()
|
|||
|
# 1、只保留从头文件到sensor节点的部分
|
|||
|
element_trees = list(root)
|
|||
|
count = 0
|
|||
|
count_01=1
|
|||
|
for element in element_trees:
|
|||
|
count = count+1
|
|||
|
if element.tag == "sensor":
|
|||
|
element.tail = "\n\n\t"
|
|||
|
count_01 = count-1
|
|||
|
for i in range(0, len(element_trees)):
|
|||
|
if i > count_01:
|
|||
|
root.remove(element_trees[i])
|
|||
|
# 2、只保留"satellite", "orbitType", "attiType", "Direction", "ReceiveTime", "sensor"的部分
|
|||
|
element_trees2 = list(root)
|
|||
|
for i in element_trees2:
|
|||
|
if i.tag not in ["satellite", "orbitType", "attiType", "Direction", "ReceiveTime", "sensor"]:
|
|||
|
root.remove(i)
|
|||
|
# 3、获取"sensor"节点的位置,并输出
|
|||
|
count2 = 0
|
|||
|
count2_01=1
|
|||
|
element_trees3 = list(root)
|
|||
|
for element in element_trees3:
|
|||
|
count2 = count2+1
|
|||
|
if element.tag == "sensor":
|
|||
|
element.tail = "\n\n\t"
|
|||
|
count2_01 = count2-1
|
|||
|
tree.write(self.path, encoding="utf-8", xml_declaration=True)
|
|||
|
return count2_01
|
|||
|
|
|||
|
@staticmethod
|
|||
|
def create_node(tag, property_map, content):
|
|||
|
"""
|
|||
|
fun: 新造一个节点
|
|||
|
para: tag:节点标签
|
|||
|
para: property_map:属性及属性值map
|
|||
|
para: content: 节点闭合标签里的文本内容
|
|||
|
para: return 新节点
|
|||
|
"""
|
|||
|
element = Element(tag, property_map)
|
|||
|
element.text = content
|
|||
|
element.tail = "\n\t"
|
|||
|
return element
|
|||
|
|
|||
|
def add_standard_xml(self, num):
|
|||
|
"""
|
|||
|
模板直接写入到元文件中
|
|||
|
"""
|
|||
|
tree = ElementTree()
|
|||
|
tree.parse(self.path) # 影像头文件
|
|||
|
root = tree.getroot()
|
|||
|
|
|||
|
tree2 = ElementTree()
|
|||
|
tree2.parse(self.an_li_path) # 影像头文件
|
|||
|
root2 = tree2.getroot()
|
|||
|
|
|||
|
productinfo = root2.find("productinfo")
|
|||
|
root.insert(num + 1, productinfo)
|
|||
|
processinfo = root2.find("processinfo")
|
|||
|
root.insert(num + 2, processinfo)
|
|||
|
tree.write(self.path, encoding="utf-8", xml_declaration=True)
|
|||
|
|
|||
|
def add_img_xml(self, num,SrcImageName):
|
|||
|
"""添加影像信息"""
|
|||
|
tree = ElementTree()
|
|||
|
tree.parse(self.path)
|
|||
|
root = tree.getroot()
|
|||
|
|
|||
|
a = self.create_node("SrcImageName", {"desc": "原始影像名称"}, SrcImageName)
|
|||
|
root.insert(num+1, a)
|
|||
|
# root.append(a)
|
|||
|
b = self.create_node("AlgCompt", {"desc": "算法信息"}, "\n\t\t")
|
|||
|
b.tail = "\n\n\t"
|
|||
|
# root.append(b)
|
|||
|
root.insert(num+2, b)
|
|||
|
tree.write(self.path, encoding="utf-8", xml_declaration=True)
|
|||
|
|
|||
|
def add_info_xml(self):
|
|||
|
"""
|
|||
|
向元文件中添加配置文件的部分节("AlgorithmName", "ChsName", "AlgorithmDesc", "Version",
|
|||
|
"AlgorithmClass", "AlgorithmLevel", "AlgoirthmID", "Author")
|
|||
|
"""
|
|||
|
tree = ElementTree()
|
|||
|
tree.parse(self.input_para_file) # 配置文件
|
|||
|
root = tree.getroot()
|
|||
|
|
|||
|
tree2 = ElementTree()
|
|||
|
tree2.parse(self.path)
|
|||
|
root2 = tree2.getroot()
|
|||
|
AlgCompt = root2.find("AlgCompt")
|
|||
|
|
|||
|
a = root.find("AlgCompt")
|
|||
|
|
|||
|
element_trees = list(a)
|
|||
|
for element in element_trees:
|
|||
|
if element.tag in ["AlgorithmName", "ChsName", "AlgorithmDesc", "Version",
|
|||
|
"AlgorithmClass", "AlgorithmLevel", "AlgoirthmID", "Author"]:
|
|||
|
element.tail = "\n\t\t"
|
|||
|
AlgCompt.append(element)
|
|||
|
if element.tag == "Author":
|
|||
|
element.tail = "\n\t"
|
|||
|
|
|||
|
tree2.write(self.path, encoding="utf-8", xml_declaration=True)
|
|||
|
|
|||
|
def add_class_info(self, type_id_name, type_id_parent=None):
|
|||
|
"""
|
|||
|
向元文件中:
|
|||
|
1.删除productinfo-productType信息;
|
|||
|
2.加入地物类别信息;
|
|||
|
输出:
|
|||
|
<Class1>
|
|||
|
<parent_id>1</parent_id>
|
|||
|
<id>101</id>
|
|||
|
<covernm>耕地</covernm>
|
|||
|
</Class1>
|
|||
|
<Class2>
|
|||
|
<parent_id>5</parent_id>
|
|||
|
<id>502</id>
|
|||
|
<covernm>草地</covernm>
|
|||
|
</Class2>
|
|||
|
"""
|
|||
|
tree = ElementTree()
|
|||
|
tree.parse(self.path) # 配置文件
|
|||
|
root = tree.getroot()
|
|||
|
productinfo = root.find("productinfo")
|
|||
|
# element_trees = list(productinfo)
|
|||
|
# for element in element_trees:
|
|||
|
# if element.tag == "productType":
|
|||
|
# productinfo.remove(element) # 移除 "productType"
|
|||
|
productinfo.find("productConsumeTime").tail = "\n\t\t" # 定位到productConsumeTime,设置好位置
|
|||
|
b = self.create_node("LandCoverClass", {}, "\n\t\t\t")
|
|||
|
b.tail = "\n\t\t"
|
|||
|
productinfo_count=0
|
|||
|
for i in list(productinfo):
|
|||
|
productinfo_count=productinfo_count+1
|
|||
|
if i.tag=="productConsumeTime":
|
|||
|
break
|
|||
|
productinfo.insert(productinfo_count, b)
|
|||
|
|
|||
|
# productinfo.insert(num, b) # 插入LandCoverClass
|
|||
|
class_num = 1
|
|||
|
for key, value in type_id_name.items():
|
|||
|
|
|||
|
LandCoverClass = productinfo.find("LandCoverClass")
|
|||
|
name="Class"+str(class_num)
|
|||
|
# name = "Class"
|
|||
|
c = self.create_node(name, {}, "\n\t\t\t\t")
|
|||
|
if class_num!=(len(type_id_name.keys())):
|
|||
|
c.tail = "\n\t\t\t"
|
|||
|
else:
|
|||
|
c.tail = "\n\t\t"
|
|||
|
LandCoverClass.append(c) # 插入LandCoverClass
|
|||
|
|
|||
|
# LandCoverClass.find("Class")[num].tail = "\n\t\t\t"
|
|||
|
aaa=LandCoverClass.find(name)
|
|||
|
|
|||
|
if type_id_parent is not None:
|
|||
|
parent_id = self.create_node("parent_id", {}, type_id_parent[key])
|
|||
|
parent_id.tail="\n\t\t\t\t"
|
|||
|
LandCoverClass.find(name).append(parent_id)
|
|||
|
id = self.create_node("id", {}, str(key))
|
|||
|
id.tail = "\n\t\t\t\t"
|
|||
|
LandCoverClass.find(name).append(id)
|
|||
|
covernm = self.create_node("covernm", {}, value)
|
|||
|
covernm.tail = "\n\t\t\t"
|
|||
|
LandCoverClass.find(name).append(covernm)
|
|||
|
class_num=class_num+1
|
|||
|
tree.write(self.path, encoding="utf-8", xml_declaration=True)
|
|||
|
|
|||
|
def rewrite_name(self):
|
|||
|
"""
|
|||
|
修改class的名字:
|
|||
|
class1->class
|
|||
|
class2->class
|
|||
|
"""
|
|||
|
tree = ElementTree()
|
|||
|
tree.parse(self.path) # 配置文件
|
|||
|
root = tree.getroot()
|
|||
|
productinfo = root.find("productinfo")
|
|||
|
LandCoverClass=productinfo.find("LandCoverClass")
|
|||
|
element_trees = list(LandCoverClass)
|
|||
|
for element in element_trees:
|
|||
|
element.tag="Class"
|
|||
|
tree.write(self.path, encoding="utf-8", xml_declaration=True)
|
|||
|
|
|||
|
def OrthoInsertNode(self):
|
|||
|
"""正射算法专用,插入节点<l1aInfo>"""
|
|||
|
tree = ElementTree()
|
|||
|
tree.parse(self.path) # 影像头文件
|
|||
|
root = tree.getroot()
|
|||
|
|
|||
|
# 插入节点<l1aInfo>
|
|||
|
count2 = 0
|
|||
|
count2_01=1
|
|||
|
element_trees3 = list(root)
|
|||
|
for element in element_trees3:
|
|||
|
count2 = count2+1
|
|||
|
if element.tag == "sensor":
|
|||
|
element.tail = "\n\n\t"
|
|||
|
count2_01 = count2-1
|
|||
|
b = self.create_node("l1aInfo", {}, "\n\t\t")
|
|||
|
b.tail = "\n\n\t"
|
|||
|
root.insert(count2_01+1, b)
|
|||
|
|
|||
|
# 查询节点位置<l1aInfo>
|
|||
|
node_l1aInfo=root.find("l1aInfo")
|
|||
|
|
|||
|
img_tree = ElementTree()
|
|||
|
img_tree.parse(self.input_image_path) # 影像头文件
|
|||
|
img_root = img_tree.getroot()
|
|||
|
|
|||
|
node_imageinfo = img_root.find("imageinfo")
|
|||
|
node_processinfo=img_root.find("processinfo")
|
|||
|
|
|||
|
ele_node_imageinfo = list(node_imageinfo)
|
|||
|
ele_node_processinfo= list(node_processinfo)
|
|||
|
|
|||
|
for i in ele_node_imageinfo:
|
|||
|
if i.tag == "QualifyValue":
|
|||
|
i.tail = "\n\t\t"
|
|||
|
node_l1aInfo.append(i)
|
|||
|
|
|||
|
for j in ele_node_processinfo:
|
|||
|
if j.tag == "CalibrationConst":
|
|||
|
j.tail = "\n\t" #后一个节点的位置
|
|||
|
node_l1aInfo.append(j)
|
|||
|
tree.write(self.path, encoding="utf-8", xml_declaration=True)
|
|||
|
|
|||
|
def process(self,SrcImageName):
|
|||
|
"""
|
|||
|
不涉及到地表覆盖调用此函数
|
|||
|
"""
|
|||
|
if self.input_image_path is None:
|
|||
|
import xml.etree.cElementTree as ET
|
|||
|
product = ET.Element("product") # 根节点tag= "product"
|
|||
|
product.text = "\n\t"
|
|||
|
tree = ET.ElementTree(product)
|
|||
|
tree.write(self.path)
|
|||
|
count = 0
|
|||
|
count_2 = -1
|
|||
|
else:
|
|||
|
count = self.create_xml()
|
|||
|
count_2 = count
|
|||
|
self.add_standard_xml(count)
|
|||
|
self.add_img_xml(count_2, SrcImageName)
|
|||
|
self.add_info_xml()
|
|||
|
|
|||
|
def process2(self, type_id_name, type_id_parent,SrcImageName):
|
|||
|
"""
|
|||
|
涉及到地表覆盖的调用此函数
|
|||
|
type_id_name={"101":"耕地","502":"草地"}
|
|||
|
type_id_parent={"101":"1","502":"5"}
|
|||
|
"""
|
|||
|
count = self.create_xml()
|
|||
|
self.add_standard_xml(count)
|
|||
|
self.add_img_xml(count,SrcImageName)
|
|||
|
self.add_info_xml()
|
|||
|
self.add_class_info(type_id_name, type_id_parent)
|
|||
|
self.rewrite_name()
|
|||
|
|
|||
|
def process3(self,SrcImageName):
|
|||
|
"""
|
|||
|
正射调用此函数
|
|||
|
"""
|
|||
|
if self.input_image_path is None:
|
|||
|
import xml.etree.cElementTree as ET
|
|||
|
product = ET.Element("product") # 根节点tag= "product"
|
|||
|
product.text = "\n\t"
|
|||
|
tree = ET.ElementTree(product)
|
|||
|
tree.write(self.path)
|
|||
|
count = 0
|
|||
|
else:
|
|||
|
count = self.create_xml()
|
|||
|
self.add_standard_xml(count)
|
|||
|
self.add_img_xml(count, SrcImageName)
|
|||
|
self.add_info_xml()
|
|||
|
self.OrthoInsertNode()
|
|||
|
|