以加载河北省地市矢量数据(简单面),标注NAME字段为例,其矢量数及其属性下图所示:
全部代码及注释如下:
import matplotlib
import matplotlib.pyplot as plt
import shapefile as shpfile
from mpl_toolkits.basemap import Basemap
# 定义底图
fig = plt.figure(figsize=(20., 16.4), dpi=100)
# 在底图上添加一块区域用于绘制地图
axes1 = fig.add_axes([0.023, 0.04, 0.95, 0.92])
#创建Basemap对象
mainmap = Basemap(width=1163000,
height=950000,
resolution='l',
projection='aea',
lat_1=36,
lat_2=43,
lon_0=116.2,
lat_0=40,
ax=axes1)
#矢量数据路径
filepath=r"D:\heibei.shp"
#矢量数据编码,需要正确指定
fileencodding='UTF-8'
#在地图中绘制矢量数据,仅支持有地理坐标系,且不含M/Z值的矢量数据,color:绘制要素的颜色
mainmap.readshapefile(filepath[:-4],"Shp",default_encoding=fileencodding,color="#3641e5")
#需要正确指定矢量数据的编码格式(可在ArcGIS、QGIS等软件中查看)
sfile = shpfile.Reader(filepath,encoding=fileencodding)
#读取矢量文件中的所有要素
shapes = sfile.shapes()
#读取属性表
records=sfile.records()
#print(records)
#遍历所有要素并读取相应的属性信息进行标注
for i in range(0,len(shapes)):
shp1=shapes[i]
record=records[i]
#获取要素包络线的中心坐标,即对应属性的标注位置(相对于地图坐标系)
labelx,labely=mainmap((shp1.bbox[0]+shp1.bbox[2])/2,(shp1.bbox[1]+shp1.bbox[3])/2)
#绘制要素属性(NEMW为要标注的字段名称)
#fontsize:标注字体大小
#ha:水平对齐方式
#va:垂直对平方式
#fontproperties:标注字体
#fontweight:标注是否粗体
#color:标注颜色
plt.text(labelx, labely, record["NAME"],fontsize=16,ha='left',fontproperties='SimHei',fontweight='bold',va='bottom',color='#e5363f')
#显示地图
plt.show()
读取及标注结果如下图所示:
注:该方法存在一定的瑕疵,因为我在basemap api文档上并没有找到直接标注要素的方法,所以这里我通过获取每个面要素包络线的中心点进行要素标注,标注的位置随面要素的形状不同可能会存在压盖边界的情况。