地图歪斜或叠在一起的根本原因是crs不一致:数据若为wgs84(epsg:4326)而matplotlib按平面直角坐标渲染,会导致经纬度拉伸变形;须先用gdf.to_crs()统一投影(如epsg:3857用于底图、epsg:32650或albers用于分析),再绘图并确保底图crs匹配。

Geopandas 本身不绘图,它依赖 matplotlib 或 contextily 等库完成可视化;直接调用 gdf.plot() 看似简单,但坐标系错乱、底图缺失、中文标签截断是高频失败点。
为什么 gdf.plot() 画出来的地图歪了或叠在一起?
根本原因是 CRS(坐标参考系统)不一致:你的数据可能用的是 WGS84(EPSG:4326),而 matplotlib 默认按平面直角坐标渲染,导致经纬度被拉伸变形。尤其在中国区域,用未投影的 EPSG:4326 直接画省界,黑龙江会显得又扁又宽。
- 检查 CRS:
gdf.crs,若为EPSG:4326,别急着画,先投影 - 常用投影推荐:
gdf.to_crs("EPSG:32650")(UTM 50N,适用于中国中东部)或gdf.to_crs("+proj=aea +lat_1=25 +lat_2=47 +lat_0=36 +lon_0=105")(Albers 等面积投影,适合全国范围) - 投影后务必再检查
gdf.crs是否已变更,否则.plot()仍用原始坐标
如何叠加高德/天地图底图而不报错?
Geopandas 原生不支持在线瓦片,必须靠 contextily 补齐。常见错误是忘记设置 crs 或没转成 Web Mercator(EPSG:3857)。
- 底图前提:数据必须先转成
EPSG:3857——gdf_web = gdf.to_crs("EPSG:3857") - 画图时用
ax = gdf_web.plot(figsize=(10,8), alpha=0.6),再加底图:contextily.add_basemap(ax, source=contextily.providers.Gaode.Normal) - 注意:高德、天地图等国内源需科学上网;若失败,可临时换
contextily.providers.OpenStreetMap.Mapnik验证流程 - 中文路径或标题显示方块?在
plt.rcParams['font.sans-serif'] = ['SimHei', 'Arial Unicode MS']后加plt.rcParams['axes.unicode_minus'] = False
读取 Shapefile 后发现属性表里中文是乱码怎么办?
Shapefile 的 .dbf 文件默认用系统编码(Windows 是 GBK),而 Python 3 默认用 UTF-8 解码,不指定编码就会把“北京市”变成“鍖椾含甯”。
- 显式指定编码:
gpd.read_file("beijing.shp", encoding="GBK") - 不确定编码时,用
chardet探测:chardet.detect(open("beijing.dbf", "rb").read(10000)) - QGIS 导出 Shapefile 时勾选 “UTF-8” 编码可一劳永逸,但旧数据得手动适配
- GeoJSON 无此问题(强制 UTF-8),建议新项目优先用
.geojson
真正卡住人的往往不是语法,而是 CRS 转换顺序、底图坐标系对齐、以及那个藏在 .dbf 里的隐性编码——三者任意一个没对齐,地图就只是几条错位的线。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











