
本文介绍如何使用 GeoPandas 和 Matplotlib 为 Shapefile 中的每个多边形自动标注其索引编号或指定字段值,核心是计算几何中心(centroid)并调用 ax.text() 进行精准标注。
本文介绍如何使用 geopandas 和 matplotlib 为 shapefile 中的每个多边形自动标注其索引编号或指定字段值,核心是计算几何中心(centroid)并调用 `ax.text()` 进行精准标注。
在地理空间可视化中,除了常规的面状渲染,有时还需在每个面要素内部直接标注其唯一标识(如行索引、ID 字段或名称),便于快速定位与核查。GeoPandas 提供了便捷的几何操作能力,其中 .centroid 属性可高效生成每个面要素的质心坐标,为文本标注提供精确锚点。
以下是一个完整、健壮的实现流程:
import geopandas as gpd
import matplotlib.pyplot as plt
# 1. 读取 Shapefile(确保路径正确)
gdf = gpd.read_file("path/to/your/shapefile.shp")
# 2. 计算每个面的质心(推荐使用 centroid 而非 representative_point,更稳定且居中性更好)
gdf["centroid"] = gdf.geometry.centroid
# 3. 创建底图并绘制多边形(无填充,仅边界)
fig, ax = plt.subplots(figsize=(8, 6))
gdf.plot(ax=ax, facecolor="none", edgecolor="steelblue", linewidth=0.8, alpha=0.9)
# 4. 遍历每一行,在质心位置添加文本标注
# 示例:标注行索引(从 0 开始)→ 可替换为 gdf['id'] 或 gdf['name'] 等任意字符串列
for idx, row in gdf.iterrows():
x, y = row["centroid"].x, row["centroid"].y
ax.text(x, y, str(idx),
fontsize=9,
ha='center', va='center', # 水平/垂直居中对齐,避免偏移
bbox=dict(boxstyle="round,pad=0.2", facecolor="white", alpha=0.7, edgecolor="none"))
plt.title("Polygon Index Labels (Centroid-Based)", fontsize=12)
plt.axis('equal') # 保持地理坐标的长宽比一致
plt.tight_layout()
plt.show()✅ 关键说明与注意事项:
图片提示词生成器?不止如此。 马甲系统 —— 把脑海中的画面,翻译成AI能理解的专业表达。 用得越多,它越懂你:首次需要多问几句确认方向,用久了几乎一说就懂。 用得越多,它越快:缓存机制让后续对话越来越省。 RAG进化:成功案例持续入库,越跑越聪明。 输入「新手指南」查看完整功能介绍
-
质心 vs 代表点:
geometry.centroid总是返回数学质心(即使面不规则或含孔洞),而representative_point()保证返回面内一点但未必居中;对标注而言,centroid更利于视觉平衡。 -
坐标系兼容性:若 Shapefile 使用投影坐标系(如 UTM),质心坐标单位为米,
ax.text()仍可正常工作;但若为经纬度(WGS84),建议使用plt.axis('equal')或ax.set_aspect('equal')防止拉伸失真。 -
字段标注替代方案:将
str(idx)替换为str(row['YOUR_FIELD_NAME'])即可标注任意属性列(需确保该列为字符串或可转为字符串)。 -
避免重叠与遮挡:对于密集小面,可增加
bbox参数提升可读性(如上例中的半透明白底),或使用adjustText库实现智能避让(需额外安装)。
通过该方法,您无需导出 CSV 或借助 Basemap 等旧式工具,即可在原生 GeoPandas + Matplotlib 流程中完成专业级面要素编号可视化。
立即学习“Python免费学习笔记(深入)”;

















