Python basemap读取矢量数据并标注要素

以加载河北省地市矢量数据(简单面),标注NAME字段为例,其矢量数及其属性下图所示:
Python basemap读取矢量数据并标注要素_第1张图片
全部代码及注释如下:

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()

读取及标注结果如下图所示:
Python basemap读取矢量数据并标注要素_第2张图片
注:该方法存在一定的瑕疵,因为我在basemap api文档上并没有找到直接标注要素的方法,所以这里我通过获取每个面要素包络线的中心点进行要素标注,标注的位置随面要素的形状不同可能会存在压盖边界的情况。

你可能感兴趣的:(Python)