使用Python的simplekml库制作含点与连线的KML文件问题排查
问题分析与解决方案
你的代码存在两个关键问题,导致合并后无法同时显示点和连线,咱们逐个解决:
1. CSV迭代器被耗尽,导致其中一种元素无法生成
csv.reader 返回的是一次性迭代器,当你用列表推导式遍历它生成连线坐标后,迭代器的指针就走到了末尾,后续再遍历它生成点时,就读取不到任何行数据了(反之亦然)。解决方法是先把所有行数据读取到一个列表里,这样可以重复使用:
import csv import simplekml import numpy as np file = "your_data.csv" # 替换成你的CSV文件路径 # 先把所有行读取到列表中,避免迭代器耗尽 with open(file, 'r') as f: inputfile = csv.reader(f) rows = list(inputfile) # 存储所有行数据,支持多次遍历 kml = simplekml.Kml() # 生成连线 ls = kml.newlinestring(name='A LineString') ls.coords = np.array([[float(row[2]), float(row[1])] for row in rows]) ls.extrude = 1 ls.altitudemode = simplekml.AltitudeMode.relativetoground # 生成方形点 # 创建一个共享样式,避免重复设置,提升效率 square_style = simplekml.Style() square_style.iconstyle.icon.href = 'http://maps.google.com/mapfiles/kml/shapes/placemark_square.png' for row in rows: pnt = kml.newpoint(name=row[0], coords=[(row[2], row[1])]) pnt.style = square_style # 给每个点应用方形样式 kml.save("Points_and_Line.kml")
2. 点样式设置无效
你原代码里的 pnt.style.iconstyle.icon.href = ... 没有指向任何实际创建的点对象——循环生成点时没有把 newpoint() 的返回值赋值给 pnt,所以这行代码根本不会生效。上面的方案中,我们创建了一个共享的方形样式,然后给每个生成的点应用这个样式,确保所有点都显示为方形。
额外提示
- 确认你的CSV列顺序正确:
row[0]是点名称,row[1]是纬度,row[2]是经度(KML的坐标顺序是经度, 纬度,你的代码已经注意到这一点,是正确的)。 - 如果不需要numpy依赖,也可以直接用列表生成连线坐标:
ls.coords = [(float(row[2]), float(row[1])) for row in rows]。
内容的提问来源于stack exchange,提问作者ColleenB
相关产品推荐
相关产品推荐

