使用pykml解析KML时无法提取Polygon要素坐标的问题咨询
使用pykml同时提取KML内Point与Polygon坐标的调整方法
原代码的核心局限
- 遍历路径采用硬编码的绝对路径
Document/Placemark/Point,仅能匹配直接挂载在根节点Document下的Placemark内的点要素,既不会识别Polygon这类其他几何类型,也会漏读嵌套在Folder目录下的Placemark(这是Google Earth导出KML的常见存储结构)。 - Polygon的坐标存储层级和Point完全不同:Point的coordinates节点直接挂在Point节点下,而Polygon的坐标需要嵌套遍历到
outerBoundaryIs/LinearRing/coordinates层级,存在挖空区域的多边形还会有单独的内边界坐标节点,原代码的路径逻辑完全覆盖不到这部分结构。
调整后可直接运行的代码
from pykml import parser # 定义KML标准命名空间,减少重复书写长串URI的出错概率 KML_NS = "http://www.opengis.net/kml/2.2" with open('test.kml', 'r') as kml_file: root = parser.parse(kml_file).getroot() # 用.//语法遍历所有层级的Placemark节点,兼容嵌套Folder的结构 for placemark in root.findall(f".//{{{KML_NS}}}Placemark"): # 提取独立点要素坐标 point_node = placemark.find(f"{{{KML_NS}}}Point") if point_node is not None: print(f"兴趣点坐标:{point_node.coordinates.text.strip()}") # 提取多边形要素坐标 polygon_node = placemark.find(f"{{{KML_NS}}}Polygon") if polygon_node is not None: # 读取多边形外边界坐标 outer_ring = polygon_node.find(f"{{{KML_NS}}}outerBoundaryIs/{{{KML_NS}}}LinearRing") if outer_ring is not None: print(f"多边形外边界坐标:{outer_ring.coordinates.text.strip()}") # 读取所有内边界(多边形挖空的区域) for inner_ring in polygon_node.findall(f"{{{KML_NS}}}innerBoundaryIs/{{{KML_NS}}}LinearRing"): print(f"多边形内边界坐标:{inner_ring.coordinates.text.strip()}")
实用提示
- 提取到的坐标字符串默认格式为
经度,纬度,高度 经度,纬度,高度...,如果需要转为结构化的数值列表,可直接对字符串按空格拆分,再按逗号拆分各坐标段后转为浮点型。 - 如果后续需要兼容线要素(LineString),只需要在Placemark的节点判断逻辑中新增对应查找分支即可,其坐标存储逻辑和Point一致,coordinates节点直接挂在LineString节点下。
- 代码中使用的
.//XPath语法可匹配任意嵌套深度的目标节点,解决了原代码漏读分类存放要素的问题。
内容的提问来源于stack exchange,提问作者J.Doe
相关产品推荐
相关产品推荐

