以加載河北省地市矢量數據(簡單面),標註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文檔上並沒有找到直接標註要素的方法,所以這裏我通過獲取每個面要素包絡線的中心點進行要素標註,標註的位置隨面要素的形狀不同可能會存在壓蓋邊界的情況。