【python地图添加指北针和比例尺】

1、前言

  • 地理信息绘制中添加指北针和比例尺,使得图像更专业。

2、代码

2.1、指北针

def add_north(ax, labelsize=18, loc_x=0.95, loc_y=0.99, width=0.06, height=0.09, pad=0.14):
    """
    画一个比例尺带'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 + xlen*loc_x,
            y=miny + ylen*(loc_y - pad + height),
            fontsize=labelsize,
            horizontalalignment='center',
            verticalalignment='bottom')
    ax.add_patch(triangle)

2.2、比例尺

  • add_scalebar
#-----------函数:添加比例尺--------------
def add_scalebar(ax,lon0,lat0,length,size=0.45):
    '''
    ax: 坐标轴
    lon0: 经度
    lat0: 纬度
    length: 长度
    size: 控制粗细和距离的
    '''
    # style 3
    ax.hlines(y = lat0,  xmin = lon0, xmax = lon0+length/111, colors="black", ls="-", lw=1, label='%d km' % (length))
    ax.vlines(x = lon0, ymin = lat0-size, ymax = lat0+size, colors="black", ls="-", lw=1)
    ax.vlines(x = lon0+length/2/111, ymin = lat0-size, ymax = lat0+size, colors="black", ls="-", lw=1)
    ax.vlines(x = lon0+length/111, ymin = lat0-size, ymax = lat0+size, colors="black", ls="-", lw=1)
    ax.text(lon0+length/111,lat0+size+0.05,'%d' % (length),horizontalalignment = 'center')
    ax.text(lon0+length/2/111,lat0+size+0.05,'%d' % (length/2),horizontalalignment = 'center')
    ax.text(lon0,lat0+size+0.05,'0',horizontalalignment = 'center')
    ax.text(lon0+length/111/2*3,lat0+size+0.05,'km',horizontalalignment = 'center')
    
    # style 1
    # ax.hlines(y=lat0,  xmin = lon0, xmax = lon0+length/111, colors="black", ls="-", lw=2, label='%d km' % (length))
    # ax.vlines(x = lon0, ymin = lat0-size, ymax = lat0+size, colors="black", ls="-", lw=2)
    # ax.vlines(x = lon0+length/111, ymin = lat0-size, ymax = lat0+size, colors="black", ls="-", lw=2)
    # # ax.text(lon0+length/2/111,lat0+size,'500 km',horizontalalignment = 'center')
    # ax.text(lon0+length/2/111,lat0+size,'%d' % (length/2),horizontalalignment = 'center')
    # ax.text(lon0,lat0+size,'0',horizontalalignment = 'center')
    # ax.text(lon0+length/111/2*3,lat0+size,'km',horizontalalignment = 'center')

    # style 2
    # ax.hlines(y=lat0,  xmin = lon0, xmax = lon0+length/111, colors="black", ls="-", lw=1, label='%d km' % (length))
    # ax.vlines(x = lon0, ymin = lat0-size, ymax = lat0+size, colors="black", ls="-", lw=1)
    # ax.vlines(x = lon0+length/111, ymin = lat0-size, ymax = lat0+size, colors="black", ls="-", lw=1)
    # ax.text(lon0+length/111,lat0+size,'%d km' % (length),horizontalalignment = 'center')
    # ax.text(lon0,lat0+size,'0',horizontalalignment = 'center')
  • draw_the_scale
def draw_the_scale(ax, y,x,text,length = 1.5,lw = 5):
    #画比例尺函数
    # y代表比例尺所在纬度
    # x代表比例尺开始的经度
    # text代表比例尺最后刻度值
    # length代表比例尺的长度,单位为多少个经度
    # lw代表比例尺的宽度
    step = length/5#计算步长,画五格
    #画黑白线五条
    ax.hlines(y=y,xmin=x,xmax=x + step,colors="black", ls="-", lw=lw)
    ax.hlines(y=y,xmin=x + step,xmax=x + step*2,colors="white", ls="-", lw=lw)
    ax.hlines(y=y,xmin=x + step*2,xmax=x + step*3,colors="black", ls="-", lw=lw)
    ax.hlines(y=y,xmin=x + step*3,xmax=x + step*4,colors="white", ls="-", lw=lw)
    ax.hlines(y=y,xmin=x + step*4,xmax=x + step*5,colors="black", ls="-", lw=lw)
    #画长刻度两个
    ax.vlines(x = x, ymin = y - (lw/100) *3, ymax = y + lw/100, colors="black", ls="-", lw=1)
    ax.vlines(x = x + length, ymin = y - (lw/100) *3, ymax = y + lw/100, colors="black", ls="-", lw=1)
    #画段刻度四个
    ax.vlines(x = x + step, ymin = y - (lw/100) *2, ymax = y + lw/100, colors="black", ls="-", lw=1)
    ax.vlines(x = x + step*2, ymin = y - (lw/100) *2, ymax = y + lw/100, colors="black", ls="-", lw=1)
    ax.vlines(x = x + step*3, ymin = y - (lw/100) *2, ymax = y + lw/100, colors="black", ls="-", lw=1)
    ax.vlines(x = x + step*4, ymin = y - (lw/100) *2, ymax = y + lw/100, colors="black", ls="-", lw=1)
    #写字,0,500,km
    ax.text(x,y + (lw/100) *7,'0',horizontalalignment = 'center')
    ax.text(x + length,y + (lw/100) *7,text,horizontalalignment = 'center')
    ax.text(x + length/2,y + (lw/100)*2,'km',horizontalalignment = 'center')
  • draw_the_scale改
import matplotlib.patches as mpatches
def draw_the_scale(ax, y=0,x=0,length=500,lw=5):
    #画比例尺函数
    # y代表比例尺所在纬度
    # x代表比例尺开始的经度
    # text代表比例尺最后刻度值
    # length代表比例尺的长度,单位为多少个经度
    # lw代表比例尺的宽度
    step_ = length/111    #计算步长,画五格
    step = step_ * 100/111 /5

    #画黑白线五条
    ax.hlines(y=y,xmin=x,xmax=x + step,colors="black", ls="-", lw=lw)
    ax.hlines(y=y,xmin=x + step,xmax=x + step*2,colors="white", ls="-", lw=lw)
    ax.hlines(y=y,xmin=x + step*2,xmax=x + step*3,colors="black", ls="-", lw=lw)
    ax.hlines(y=y,xmin=x + step*3,xmax=x + step*4,colors="white", ls="-", lw=lw)
    ax.hlines(y=y,xmin=x + step*4,xmax=x + step*5,colors="black", ls="-", lw=lw)
    #画长刻度两个
    ax.vlines(x = x, ymin = y - (lw/100) *3, ymax = y + lw/100, colors="black", ls="-", lw=1)
    ax.vlines(x = x + step*5, ymin = y - (lw/100) *3, ymax = y + lw/100, colors="black", ls="-", lw=1)
    #画段刻度四个
    ax.vlines(x = x + step, ymin = y - (lw/100) *2, ymax = y + lw/100, colors="black", ls="-", lw=1)
    ax.vlines(x = x + step*2, ymin = y - (lw/100) *2, ymax = y + lw/100, colors="black", ls="-", lw=1)
    ax.vlines(x = x + step*3, ymin = y - (lw/100) *2, ymax = y + lw/100, colors="black", ls="-", lw=1)
    ax.vlines(x = x + step*4, ymin = y - (lw/100) *2, ymax = y + lw/100, colors="black", ls="-", lw=1)
    # #写字,0,500,km
    ax.text(x,y + 0.25,'0',horizontalalignment = 'center')
    ax.text(x + step_ -0.25,y + 0.25,str(length),horizontalalignment = 'center')
    ax.text(x + step_ + 0.25,y-0.25,'km',horizontalalignment = 'center')
  • draw_the_scale改2
def draw_the_scale(ax, y,x,length=500,num=5, lw=5):
    #画比例尺函数
    # y代表比例尺所在纬度
    # x代表比例尺开始的经度
    # text代表比例尺最后刻度值
    # length代表比例尺的长度,单位为多少个经度
    # num代表要划分的线段数
    # lw代表比例尺的宽度
    step_ = length/111           # 计算经度跨度
    step = step_ * 100/111 /num  # 100km为一格

    #画黑白线五条
    for i in range(num):
        if i%2 == 0:
            ax.hlines(y=y, xmin=x+i*step, xmax=x + (i+1)*step,colors="black", ls="-", lw=lw)
        else:
            ax.hlines(y=y,xmin=x + i*step,xmax=x + (i+1)*step,colors="white", ls="-", lw=lw)
        
        if i > 0:
            ax.vlines(x = x + (i+1)*step, ymin = y - (lw/100) *2, ymax = y + lw/100, colors="black", ls="-", lw=1)

    #画长刻度两个
    ax.vlines(x = x, ymin = y - (lw/100) *3, ymax = y + lw/100, colors="black", ls="-", lw=1)
    ax.vlines(x = x + step*num, ymin = y - (lw/100) *3, ymax = y + lw/100, colors="black", ls="-", lw=1)

    # #写字,0,500,km
    ax.text(x,y + 0.25,'0',horizontalalignment = 'center')
    ax.text(x + step_ -0.25,y + 0.25,str(length),horizontalalignment = 'center')
    ax.text(x + step_ + 0.25,y-0.25,'km',horizontalalignment = 'center')

3、结果

在这里插入图片描述
在这里插入图片描述

  • 11
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: ArcGIS是一种常用的地理信息系统软件,它允许用户进行二次开发来满足不同的需求。在进行ArcGIS二次开发时,可以通过插入指北针比例尺和图例来增强地图的可视化效果。 插入指北针是为了让用户了解地图的方向。对于插入指北针的操作,可以通过以下步骤来实现: 1. 打开ArcGIS软件并加载需要插入指北针地图。 2. 在布局视图中,点击“插入”选项卡,在“图形”组中选择“指北针”。 3. 在地图上选择一个合适的位置,然后用鼠标绘制指北针的形状。 4. 在“格式”选项卡中对指北针进行进一步的设置,例如调整指北针的大小、颜色和风格。 5. 完成设置后,保存并关闭指北针面板。 比例尺可以帮助用户了解地图上不同距离与实际距离之间的关系。插入比例尺的操作步骤如下: 1. 在布局视图中,点击“插入”选项卡,在“图形”组中选择“比例尺”。 2. 在地图上选择一个适合的位置绘制比例尺的形状。 3. 在“格式”选项卡中,可以调整比例尺的大小、单位和显示样式等。 4. 完成设置后,保存并关闭比例尺面板。 图例是用来解释地图上所显示的符号和颜色所代表的内容。插入图例的操作步骤如下: 1. 在布局视图中,点击“插入”选项卡,在“图形”组中选择“图例”。 2. 在地图上选择一个适合的位置绘制图例的形状。 3. 在弹出的图例编辑器中,选择需要在图例中显示的图层和符号。 4. 可以对图例进行更进一步的设置,例如调整图例的大小、样式和布局。 5. 完成设置后,保存并关闭图例面板。 通过以上步骤,我们可以在ArcGIS的地图上插入指北针比例尺和图例,以增强地图的可视化效果,并帮助用户更好地理解地图中的信息。 ### 回答2: 在ArcGIS二次开发中,要插入指北针比例尺和图例,可以参考以下步骤: 1. 首先,创建一个地图文档(map document)对象,通过该对象可以加载地图数据、添加图层等操作。 2. 在地图文档中添加指北针(north arrow)元素。可以使用ArcMap中提供的指北针符号,也可以自定义指北针符号。可以设置指北针的位置、大小、样式等属性。 3. 添加比例尺(scale bar)元素。比例尺会根据地图的显示比例自动调整长度,可以设置比例尺的位置、样式、单位等属性。 4. 添加图例(legend)元素。图例可以显示地图中的图层及其符号样式,用于解释地图中各个图层的内容。可以设置图例的位置、大小、标题等属性。 5. 最后,将以上三个元素添加地图文档中。可以通过指定的坐标位置,将指北针比例尺和图例元素插入到地图中的合适位置。 需要注意的是,以上步骤涉及到ArcGIS开发的一些特定的API和对象。可以使用ArcObjects或ArcGIS API for Python等工具进行开发。具体的代码实现可以参考ArcGIS开发文档和示例。 ### 回答3: 在ArcGIS二次开发中,如果需要插入指北针比例尺或图例,可以通过以下步骤进行实现。 首先,准备好指北针比例尺和图例需要的相关资源文件,包括图片、文字等。 其次,在ArcGIS二次开发的环境中,可以使用ArcObjects、ArcPy或ArcGIS API等进行开发。具体选择哪一种方法取决于开发者的个人偏好和具体需求。 对于插入指北针,可以使用指北针组件或工具。根据指北针的样式和位置,可以设置相关属性,如指北针的大小、旋转角度等。同时,可以将指北针地图或布局关联起来,确保指北针的显示与地图的方向一致。 对于插入比例尺,可以使用比例尺组件或工具。根据比例尺的样式和位置,可以设置相关属性,如比例尺的单位、长度等。同时,可以将比例尺地图或布局关联起来,确保比例尺的显示与地图的比例一致。 对于插入图例,可以使用图例组件或工具。根据图例的样式和位置,可以设置相关属性,如图例的布局方式、图例项的内容等。同时,可以将图例与地图或布局关联起来,确保图例的显示与地图的内容一致。 最后,根据开发需要,将插入指北针比例尺和图例的代码嵌入到ArcGIS二次开发的程序中,并进行编译和运行。可以通过调用相关函数或方法来实现插入指北针比例尺和图例的操作。 总之,通过ArcGIS二次开发,可以轻松实现插入指北针比例尺和图例的功能,并根据具体需求进行灵活的定制和调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值