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))