You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Python将KML文件转换为结构化行列格式的DataFrame

KML批量转结构化DataFrame实现方案

前置依赖安装

先安装解析和数据处理需要的第三方库:

pip install fastkml pandas shapely pygeoif

实现逻辑说明

你提供的KML片段仅包含样式定义,实际业务数据存储在层级结构中:通常按州划分Folder节点,每个学校作为独立的Placemark节点存在。解析逻辑会递归遍历KML的节点树,自动匹配每个点位所属的州,提取要求的四个字段。

完整代码

单文件解析函数

from fastkml import kml
from shapely.geometry import shape
import pandas as pd
import os

def kml_to_df(file_path: str) -> pd.DataFrame:
    with open(file_path, 'r', encoding='utf-8') as f:
        kml_text = f.read()
    k = kml.KML()
    k.from_string(kml_text)
    rows = []

    def traverse(node, current_state=None):
        # 识别Folder节点,更新当前所属州
        if isinstance(node, kml.Folder):
            state_name = node.name.strip() if node.name else current_state
            for sub_node in node.features():
                traverse(sub_node, state_name)
        # 识别Document根节点,继续向下遍历
        elif isinstance(node, kml.Document):
            for sub_node in node.features():
                traverse(sub_node, current_state)
        # 识别Placemark点位节点,提取目标字段
        elif isinstance(node, kml.Placemark):
            # 几何信息转WKT文本格式存储,兼容普通DataFrame
            geom_wkt = shape(node.geometry).wkt if node.geometry else None
            rows.append({
                "State": current_state,
                "Name": node.name.strip() if node.name else None,
                "Description": node.description.strip() if node.description else None,
                "Geometry": geom_wkt
            })

    for root in k.features():
        traverse(root)
    return pd.DataFrame(rows, columns=["State", "Name", "Description", "Geometry"])

批量转换函数

将所有待处理KML放在同一目录下,调用该函数可自动解析所有文件、合并为统一结构的DataFrame,支持直接导出为CSV文件:

def batch_kml_convert(kml_dir: str, export_csv_path: str = None) -> pd.DataFrame:
    df_list = []
    for filename in os.listdir(kml_dir):
        if filename.lower().endswith(".kml"):
            full_path = os.path.join(kml_dir, filename)
            print(f"Processing file: {filename}")
            try:
                single_df = kml_to_df(full_path)
                # 可选:新增来源文件名字段,方便数据溯源
                single_df["source_file"] = filename
                df_list.append(single_df)
            except Exception as e:
                print(f"Parse {filename} failed: {str(e)}")
    merged_df = pd.concat(df_list, ignore_index=True)
    if export_csv_path:
        merged_df.to_csv(export_csv_path, index=False, encoding="utf-8-sig")
    return merged_df

# 调用示例
# if __name__ == "__main__":
#     all_data = batch_kml_convert(kml_dir="./kml_files", export_csv_path="./merged_result.csv")

适配说明

  • 如果你的KML文件中州信息不在Folder名称中,而是存储在点位的扩展数据ExtendedData字段里,只需修改Placemark节点的取值逻辑,从node.extended_data.elements中提取对应键值即可
  • 若遇到UTF-8编码读取报错,可将文件读取的encoding参数替换为latin-1重试
  • Geometry字段存储的是WKT格式空间数据,后续如果需要做空间分析,可直接用GeoPandas将该列转为几何列使用

内容的提问来源于stack exchange,提问作者Roydon Noronha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.02 23:31:05