Python basemap讀取矢量數據並標註要素

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章