gdal/transformer/exporter.py

67 lines
2.4 KiB
Python

from xml.dom import minidom
import numpy as np
import transformer
import pandas as pd
import xml.etree.ElementTree as ET
def prettify(elem):
"""Return a pretty-printed XML string for the Element.
"""
rough_string = ET.tostring(
elem, encoding="utf-8", method="xml", xml_declaration=True
)
reparsed = minidom.parseString(rough_string)
return reparsed.toprettyxml(indent="\t")
def main():
df = pd.read_excel("成果表-0120.xlsx")
needed_df = df.iloc[:120, :3]
# print(needed_df)
trans = transformer.Projector(
transformer.EPSG_CGCS_2000_108E, transformer.EPSG_WGS_84
)
y_array = needed_df["北坐标(m)"].to_numpy()
x_array = needed_df["东坐标(m)"].to_numpy()
yx_array = np.array([y_array, x_array]).transpose()
wgs_84_point = np.array([trans.transform(y, x) for y, x in yx_array])
name_lat_lon_df = pd.DataFrame(
{"桩号": needed_df["点号"], "纬度": wgs_84_point[:, 0], "经度": wgs_84_point[:, 1]}
)
xml_f = ET.parse("sgt.kml")
ET.register_namespace("", "http://www.opengis.net/kml/2.2")
root = xml_f.getroot()
ns = {
"NS": r"http://www.opengis.net/kml/2.2",
}
folders_has_placemark = root.findall(r"NS:Document//NS:Folder[NS:Placemark]", ns)
point_folder = None
for fld in folders_has_placemark:
if fld.find(r"NS:name", ns).text == "":
point_folder = fld
break
# remove all placemark
# for child in point_folder:
# if child.tag == "{" + ns["NS"] + "}Placemark":
# point_folder.remove(child)
point_folder.clear()
for _, row in name_lat_lon_df.iterrows():
name = row["桩号"]
lon = row["经度"]
lat = row["纬度"]
ele_placemark = ET.SubElement(point_folder, "Placemark")
ele_name = ET.SubElement(ele_placemark, "name")
ele_name.text = name
ele_point = ET.SubElement(ele_placemark, "Point")
coordinates = ET.SubElement(ele_point, "coordinates")
coordinates.text = "{lon},{lat},0".format(lon=lon, lat=lat)
# xml_f.write("out.kml",encoding='utf-8',method='xml',pretty_print=True)
# print(xml_f.toString())
with open("out.kml", "w") as f:
f.write(prettify(root))
# with open('84.txt','w') as f:
# for point in wgs_84_point:
# f.write('{point[1]},{point[0]},0 \n'.format(point=point))