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

