使用Basemap添加指南针,显示经纬度刻度

在使用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()

使用Basemap添加指南针,显示经纬度刻度_第1张图片

函数部分功能尚未完善,比如不能自定义位置,只能通过改比例数值实现,经纬度只能在左,上正常显示,实际上已算是提供思路,可根据需求自己改善。

另外还有一个功能没研究出来,就是比例尺问题,实际上用python画的地图,无论视频教程还是学术论文,目前都不加比例尺和指南针,但就当练习matplotlib了。如有添加比例尺的方法欢迎一起讨论。

你可能感兴趣的:(basemap,basemap,matplotlib,python,地图制作,数据可视化)