在使用Basemap过程中发现它不能添加指南针,自带的添加经纬度只能画经纬度线和添加text,却不能像arcmap那样显示刻度。
由于Basemap基于matplotlib,可以手动实现这两个功能。
代码如下:
from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
import matplotlib.patches as mpatches
def set_lonlat(_m, lon_list, lat_list, lon_labels, lat_labels, lonlat_size):
"""
为Basemap实例画带tick标的经纬度注释
自带画水平线和竖直线标注方式不带刻度标
当然函数仍调用了自带标注函数只是在此基础上加了tick标
:param _m: Basemap实例
:param lon_list: 经度 详见Basemap.drawmeridians函数介绍
:param lat_list: 纬度 同上
:param lon_labels: 标注位置 [左, 右, 上, 下] bool值 默认只标注左上待完善 可使用twinx和twiny实现
:param lat_labels: 同上
:param lonlat_size: 字体大小
:return:
"""
lon_dict = _m.drawmeridians(lon_list, labels=lon_labels, color='none', fontsize=lonlat_size)
lat_dict = _m.drawparallels(lat_list, labels=lat_labels, color='none', fontsize=lonlat_size)
lon_list = []
lat_list = []
for lon_key in lon_dict.keys():
try:
lon_list.append(lon_dict[lon_key][1][0].get_position()[0])
except:
continue
for lat_key in lat_dict.keys():
try:
lat_list.append(lat_dict[lat_key][1][0].get_position()[1])
except:
continue
ax = plt.gca()
ax.xaxis.tick_top()
ax.set_yticks(lat_list)
ax.set_xticks(lon_list)
ax.tick_params(labelcolor='none')
def add_north(ax, labelsize=15, loc_x=0.95, loc_y=0.9, width=0.03, height=0.1, pad=0.12):
"""
画一个比例尺带'N'文字注释
主要参数如下
:param ax: 要画的坐标区域 Axes实例 plt.gca()获取即可
:param labelsize: 显示'N'文字的大小
:param loc_x: 以文字下部为中心的占整个ax横向比例
:param loc_y: 以文字下部为中心的占整个ax纵向比例
:param width: 指南针占ax比例宽度
:param height: 指南针占ax比例高度
:param pad: 文字符号占ax比例间隙
:return: None
"""
minx, maxx = ax.get_xlim()
miny, maxy = ax.get_ylim()
ylen = maxy - miny
xlen = maxx - minx
left = [minx + xlen*(loc_x - width*.5), miny + ylen*(loc_y - pad)]
right = [minx + xlen*(loc_x + width*.5), miny + ylen*(loc_y - pad)]
top = [minx + xlen*loc_x, miny + ylen*(loc_y - pad + height)]
center = [minx + xlen*loc_x, left[1] + (top[1] - left[1])*.4]
triangle = mpatches.Polygon([left, top, right, center], color='k')
ax.text(s='N',
x=minx + maxx*loc_x,
y=miny + maxy*loc_y,
fontsize=labelsize,
horizontalalignment='center',
verticalalignment='bottom')
ax.add_patch(triangle)
m = Basemap(projection='merc', llcrnrlon=111, llcrnrlat=30, urcrnrlon=131, urcrnrlat=40)
m.readshapefile(r'F:\地理数据\沿海省市', 'states',
drawbounds=True, default_encoding='GBK', color='gray',
zorder=2) # 沿海城市
m.readshapefile(r'F:\地理数据\中国地图shp格式\map\bou2_4p', 'states',
drawbounds=True, default_encoding='GBK', color='silver', zorder=1)
set_lonlat(m, range(0, 180, 4), range(0, 90, 4), [0, 0, 1, 0], [1, 0, 0, 0], 12)
ax = plt.gca()
add_north(ax)
plt.show()
函数部分功能尚未完善,比如不能自定义位置,只能通过改比例数值实现,经纬度只能在左,上正常显示,实际上已算是提供思路,可根据需求自己改善。
另外还有一个功能没研究出来,就是比例尺问题,实际上用python画的地图,无论视频教程还是学术论文,目前都不加比例尺和指南针,但就当练习matplotlib了。如有添加比例尺的方法欢迎一起讨论。