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

如何用Python 3.11.3打开KMZ文件并在交互式地图展示?

解决Python 3.11.3打开KMZ并在交互式地图展示的问题

以下是针对你代码问题的修复方案及优化建议:

1. 修复语法错误:缩进问题

你的代码中with zipfile.ZipFile(...)块内的代码未缩进,这是Python语法错误,必须修正:

with zipfile.ZipFile('path to file.kmz', 'r') as kmz_file:
    kml_file = kmz_file.read('doc.kml')  # 此处需缩进4个空格

2. 修正Windows文件路径问题

Windows系统下文件路径需注意转义:

  • 使用原始字符串:r'C:\Users\YourName\Documents\your_file.kmz'
  • 或使用正斜杠替代反斜杠:'C:/Users/YourName/Documents/your_file.kmz'
  • 禁止直接使用未转义的反斜杠(如'C:\Users\...'会被解析为转义字符)

3. 解决Folium版本兼容问题

Python 3.11.3需搭配兼容的folium版本,先升级到最新版:

pip install --upgrade folium

部分folium版本对BytesIO加载KML支持不佳,可先将提取的KML写入临时文件再加载,以下是修正后的完整代码:

import folium
import zipfile
import io
import tempfile
import os

# 替换为你的KMZ实际路径
kmz_path = r'C:\path\to\your\file.kmz'

# 提取KMZ中的KML内容
with zipfile.ZipFile(kmz_path, 'r') as kmz_file:
    # 大部分KMZ主KML文件名为doc.kml,若不是可通过kmz_file.namelist()查看所有文件
    kml_content = kmz_file.read('doc.kml')

# 创建临时文件保存KML
with tempfile.NamedTemporaryFile(mode='wb', suffix='.kml', delete=False) as temp_kml:
    temp_kml.write(kml_content)
    temp_kml_path = temp_kml.name

# 初始化地图并加载KML
m = folium.Map(location=[0, 0], zoom_start=2)
folium.Kml(temp_kml_path).add_to(m)

# 保存地图
m.save('map.html')

# 清理临时文件
os.unlink(temp_kml_path)

额外排查技巧

  • 如果KMZ内主KML文件名不是doc.kml,可通过以下代码查看所有文件:
    with zipfile.ZipFile(kmz_path, 'r') as kmz_file:
        print(kmz_file.namelist())  # 打印KMZ内所有文件名称
    
  • 若复杂KML无法直接加载,可使用pykml解析后手动添加元素:
    pip install pykml
    
    示例代码:
    from pykml import parser
    
    with tempfile.NamedTemporaryFile(mode='wb', suffix='.kml', delete=False) as temp_kml:
        temp_kml.write(kml_content)
        temp_kml_path = temp_kml.name
    
    with open(temp_kml_path, 'rb') as f:
        doc = parser.parse(f).getroot()
    
    m = folium.Map(location=[0, 0], zoom_start=2)
    # 遍历KML中的地标添加到地图
    for placemark in doc.Document.Placemark:
        coords = str(placemark.Point.coordinates).split(',')
        folium.Marker(location=[float(coords[1]), float(coords[0])], popup=placemark.name.text).add_to(m)
    
    m.save('map.html')
    os.unlink(temp_kml_path)
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 16:45:09