mplleaflet.show报错排查及Python地图绘图包推荐
Python地图网格绘制报错排查与替代方案
错误原因
你遇到的TypeError: type object argument after ** must be a mapping, not CRS是版本兼容性问题导致的:
- 旧版
mplleaflet的show()方法要求crs参数为字典格式(如{'init': 'epsg:4326'}); - 但新版GeoPandas中,
grid.crs返回的是CRS对象而非字典,当mplleaflet尝试用**crs解包时,就触发了类型错误。
修复方案
修改mplleaflet.show()的调用代码,三选一即可:
- 省略
crs参数(你的网格已转换为WGS84,mplleaflet默认使用该坐标系):
mplleaflet.show(fig=ax.figure, path='grid_map.html')
- 显式传入EPSG字符串:
mplleaflet.show(fig=ax.figure, crs='EPSG:4326', path='grid_map.html')
- 将CRS对象转换为字典格式传入:
mplleaflet.show(fig=ax.figure, crs=grid.crs.to_dict(), path='grid_map.html')
推荐替代绘图包
如果mplleaflet的兼容性问题频繁出现,推荐以下更主流的地图绘图工具:
Folium
基于Leaflet.js,专注交互式地图,语法简洁,完美支持GeoDataFrame:
import folium # 初始化地图,设置中心坐标和缩放级别 m = folium.Map(location=[(MINY_MUC + MAXY_MUC)/2, (MINX_MUC + MAXX_MUC)/2], zoom_start=12) # 添加网格图层(仅显示边框) folium.GeoJson(grid, style_function=lambda x: {'color': 'black', 'fillOpacity': 0}).add_to(m) # 保存为HTML文件 m.save('grid_map_folium.html')
Plotly Express
适合制作高交互性可视化图表,自带多种地图样式,支持动态缩放、hover提示:
import plotly.express as px fig = px.choropleth_mapbox( grid, geojson=grid.geometry, locations=grid.index, mapbox_style="carto-positron", center={"lat": (MINY_MUC + MAXY_MUC)/2, "lon": (MINX_MUC + MAXX_MUC)/2}, zoom=12, color_discrete_sequence=['transparent'] ) # 设置网格边框样式 fig.update_traces(marker_line_color='black', marker_line_width=0.5) # 隐藏地图边框,优化显示 fig.update_layout(margin={"r":0,"t":0,"l":0,"b":0}) fig.show()
GeoPandas + Matplotlib
如果仅需静态地图,直接用GeoPandas内置绘图功能即可,无需额外依赖:
import matplotlib.pyplot as plt # 绘制网格,仅显示黑色边框 ax = grid.plot(edgecolor='black', facecolor='none', figsize=(10, 10)) # 隐藏坐标轴 ax.set_axis_off() # 保存为高清图片 plt.savefig('grid_static.png', dpi=300, bbox_inches='tight')
内容的提问来源于stack exchange,提问作者Maciej
相关产品推荐
相关产品推荐

