You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Jupyter中含全部33个伦敦行政区的Folium地图无法渲染

解决Jupyter中Folium加载完整伦敦行政区GeoJSON不显示的问题

我之前也碰到过一模一样的情况——Jupyter的内置预览环境对较大的GeoJSON数据集的渲染确实有隐性限制,而导出为HTML后浏览器能正常加载,核心原因是Jupyter用iframe嵌入地图时,资源加载的超时阈值或内存限制比独立浏览器更严格,当GeoJSON包含33个行政区(数据量明显增大)时,就触发了这个限制。

下面结合你的场景,给出几种针对性的解决方案:

1. 用Figure包裹地图,调整渲染参数

Folium默认的Jupyter渲染有时会因为容器尺寸或加载策略的问题失败,用folium.Figure明确设置宽高来包裹地图,能提升兼容性:

import folium
import json

# 假设你已解析得到geo_london对象
with open('london_boroughs.geojson', 'r') as f:
    geo_london = json.load(f)

# 创建Figure容器,设置适配Jupyter的尺寸
fig = folium.Figure(width=1000, height=800)
m = folium.Map(location=[51.5074, -0.1278], zoom_start=10)
folium.GeoJson(geo_london).add_to(m)

# 将地图绑定到Figure后再显示
m.add_to(fig)
fig  # Jupyter中直接返回对象即可渲染,也可以用display(fig)

2. 简化GeoJSON的几何复杂度

如果33个行政区的GeoJSON图形太精细,数据量过大,Jupyter的iframe加载会吃力。可以用geopandasshapely简化几何形状,减少数据体积:

import folium
import json
import geopandas as gpd

# 将GeoJSON转为GeoDataFrame
gdf = gpd.GeoDataFrame.from_features(geo_london['features'])
# 简化几何(tolerance值越大,简化程度越高,可按需调整)
gdf['geometry'] = gdf['geometry'].simplify(tolerance=0.001)
# 转回GeoJSON对象
simplified_geo = json.loads(gdf.to_json())

# 用简化后的GeoJSON生成地图
m = folium.Map(location=[51.5074, -0.1278], zoom_start=10)
folium.GeoJson(simplified_geo).add_to(m)
m

3. 绕过Jupyter内置渲染,直接调用浏览器打开HTML

既然导出HTML后能正常显示,你可以在代码里自动保存并打开,完全避开Jupyter的渲染限制:

import folium
import json
import webbrowser
import tempfile
import os

with open('london_boroughs.geojson', 'r') as f:
    geo_london = json.load(f)

m = folium.Map(location=[51.5074, -0.1278], zoom_start=10)
folium.GeoJson(geo_london).add_to(m)

# 临时保存HTML文件
temp_dir = tempfile.gettempdir()
html_path = os.path.join(temp_dir, 'london_map.html')
m.save(html_path)

# 用默认浏览器打开地图
webbrowser.open(f'file://{html_path}')

补充说明

你提到23个及以下行政区能正常显示,就是因为数据量刚好卡在Jupyter的渲染阈值内。上面的方案分别从渲染容器优化数据体积压缩绕过内置渲染三个角度解决问题,你可以根据自己的需求选择。

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

火山引擎 最新活动