
本文介绍使用 geopandas 和 matplotlib 为 shapefile 中每个多边形自动添加编号标签的方法,通过计算几何中心(centroid)定位文本位置,支持自定义字段(如索引、id 或名称),并提供完整可运行代码与关键注意事项。
本文介绍使用 geopandas 和 matplotlib 为 shapefile 中每个多边形自动添加编号标签的方法,通过计算几何中心(centroid)定位文本位置,支持自定义字段(如索引、id 或名称),并提供完整可运行代码与关键注意事项。
在地理数据可视化中,除了常规的面状渲染,常需在每个面要素内部标注其唯一标识(如行索引、FID 或业务字段 ID),便于空间核查或制图说明。GeoPandas 提供了高效的空间处理能力,结合 Matplotlib 可轻松实现“面内编号标注”。核心思路是:为每个多边形计算几何中心点(centroid),再以该点坐标为锚点,用 ax.text() 添加文本标签。
以下为推荐实现方案(已修正原问题中语法错误与逻辑冗余):
import geopandas as gpd
import matplotlib.pyplot as plt
# 读取 Shapefile
gdf = gpd.read_file("path/to/your/shapefile.shp")
# ✅ 关键步骤:计算每个面的几何中心(非 representative_point,更稳定)
gdf["centroid"] = gdf.geometry.centroid
# 创建绘图对象
fig, ax = plt.subplots(figsize=(8, 6))
# 绘制多边形边界(无填充,仅边框)
gdf.plot(ax=ax, facecolor='none', edgecolor='steelblue', linewidth=1.2)
# 遍历每一行,在 centroid 处标注序号(此处使用 DataFrame 行索引作为编号)
for idx, row in gdf.iterrows():
# 获取中心点坐标
x, y = row["centroid"].x, row["centroid"].y
# 标注索引(也可替换为 row['ID']、row['name'] 等字段)
ax.text(x, y, str(idx),
fontsize=9,
ha='center', # 水平居中对齐(避免偏移)
va='center', # 垂直居中对齐
fontweight='bold',
color='darkred')
plt.title("Polygon ID Labels (by Row Index)", fontsize=12)
plt.axis('equal') # 保持地理比例一致
plt.tight_layout()
plt.show()
⚠️ 重要注意事项:
-
centroidvsrepresentative_point():centroid是数学中心,可能落在面外(如环状多边形);若需确保点必在面内,请改用representative_point()(但需注意其返回的是近似内点,非精确中心)。 -
字段选择灵活:将
str(idx)替换为str(row['YOUR_ID_FIELD'])即可标注任意属性字段(如"FID"、"OBJECTID"或"district_code")。 -
防重叠优化:对于密集小多边形,建议添加
bbox=dict(boxstyle="round,pad=0.2", facecolor="yellow", alpha=0.7)参数为文本加背景框提升可读性。 -
坐标系一致性:若 Shapefile 使用投影坐标系(如 UTM),
ax.text()坐标单位即为米;若为经纬度(WGS84),注意plt.axis('equal')在球面坐标下效果受限,建议转为等距投影后再绘图。
此方法无需导出 CSV 或依赖 Basemap,全程在 GeoPandas + Matplotlib 生态内完成,简洁、可控且符合现代 Python 地理空间分析工作流。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











