如何使用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
相关产品推荐
相关产品推荐

