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加载会吃力。可以用geopandas和shapely简化几何形状,减少数据体积:
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




