Python采用高德api实现地图功能

374 阅读12分钟

前言

最近打算做一些地图可视化的工作,然后发现可以借助高德api来在地图上进行批量标记、画多边形。

介绍

高德地图为个人开发者开放了一定免费次数的api,包括地理/逆地理编码、路径规划、行政区域查询、交通事件、IP定位、坐标转换等服务。(详情可见高德开放平台高德开放平台 | 高德地图API (amap.com))

准备工作

  1. 申请高德地图api服务
    搜索“高德地图开放平台”或者“高德地图api”,进入官网,登录账号。

  2. 进入控制台(右上方),点击应用管理-我的应用,然后添加key

  3. 添加key,服务平台选择Web服务,其他的自己随意填写咯

  1. 记下key,后面的每次调用都需要这个key

开冲

1.地理/逆地理编码     

地理编码/逆地理编码 API 是通过 HTTP/HTTPS 协议访问远程服务的接口,提供结构化地址与经纬度之间的相互转化的能力。

适用场景

  • 地理编码:将详细的结构化地址转换为高德经纬度坐标。且支持对地标性名胜景区、建筑物名称解析为高德经纬度坐标。
  • 逆地理编码:将经纬度转换为详细结构化的地址,且返回附近周边的POI、AOI信息。

I. 地理编码

  • 地理api服务地址
URLrestapi.amap.com/v3/geocode/…
请求方式GET

parameters代表可选参数,参数间使用符号“&”连接,参数见下表。


  • 请求参数
参数名含义是否必须缺省值
key高德key,用户在官网申请Web服务API类型的key必须
address结构化的地址信息必须
city指定查询的城市,可选输入内容包括:指定城市的中文(如北京)、指定城市的中文全拼(beijing)、citycode(010)、adcode(110000)可选无,会进行全国范围内的搜索
sig数字签名可选
output返回数据格式类型,json或xml可选json
callback回调函数,只在 output 参数设置为 JSON 时有效可选
  • 返回参数
参数名 含义 规则说明
status 返回结果状态值 返回值为0或1,0表示请求失败,1表示请求成功
count 返回结果数目 返回结果个数
info 返回状态说明 返回当 status 为 0 时,info 会返回具体错误原因,否则返回“OK”(info详情见官网)
geocodes 地理编码信息列表 返回结果对象列表
country 国家 默认返回中国
province 例如:北京市。此处需要注意的是,中国的四大直辖市也算作省级单位
city 例如:北京市
citycode 城市编码 例如:010
district 行政区 例如:朝阳区
street 街道 例如:阜通东大街
number 门牌 例如:6号
adcode 区域代码 例如:110101
location 坐标点 经度,纬度
level 匹配级别
  • 示例
  • 查询北京市朝阳区阜通东大街6号的地址信息
    import requests
    url = 'https://restapi.amap.com/v3/geocode/geo?address=北京市朝阳区阜通东大街6号&key=<your key>'
    response = requests.get(url)
    json_response = response.json()

  • 使用特定浏览器查询
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36',
}
url = 'https://restapi.amap.com/v3/geocode/geo?address=北京市朝阳区阜通东大街6号&key=<your key>'
response = requests.get(url, headers=headers)
json_response = response.json()

  • 模糊查找

全国有很多同名街道,当地址不规范的时候,往往会返回很多个结果,此时添加限定条件将提高搜索的准确性。                                                                                                                         

  1. 添加城市
    headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36',
    }
    url = 'https://restapi.amap.com/v3/geocode/geo?address=北京路&key=<your key>'
    response = requests.get(url, headers=headers)
    json_response = response.json()

如果仅仅搜索北京路,会返回多个地方的信息,例如白银市的北京路、金昌市的北京路。   
若要查找广州市的北京路,则需加上city=广州的限定条件。以下几种写法均可: ```python headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36', } url = 'https://restapi.amap.com/v3/geocode/geo?address=北京路&key=' response = requests.get(url, headers=headers) json_response = response.json() ```

II.逆地理编码                                                                                  

  • 逆地理api服务地址
URLrestapi.amap.com/v3/geocode/…
请求方式GET

parameters代表可选参数,参数间使用符号“&”连接,参数见下表。

  • 请求参数
参数名含义是否必须缺省值
key高德key,用户在官网申请Web服务API类型的key必须
location经纬度坐标,经度在前,纬度在后,经纬度间以“,”分割,经纬度小数点后不要超过 6 位。必须
poitypePOI类型,逆地理编码在进行坐标解析之后不仅可以返回地址描述,也可以返回经纬度附近符合限定要求的 POI 内容(在 extensions 字段值为 all 时才会返回 POI 内容)。设置 POI 类型参数相当于为上述操作限定要求。可选
radius搜索半径,radius 取值范围:0~3000,默认值:1000。单位:米可选1000
extensions返回结果控制,取值为base时返回基本地址信息,取值为all时返回基本地址信息、附近POI内容、道路信息以及道路交叉口信息可选base
roadlevel道路等级,该参数需要extensions为all时生效。可选值:0或1,当roadlevel为0显示所有道路,当roadlevel为1时过滤非主干路,仅输出主干路信息可选
sig数字签名,详情参考官网可选
output返回数据类型格式,可选输入json或xml。设置 JSON 返回结果数据将会以 JSON 结构构成;如果设置 XML 返回结果数据将以 XML 结构构成可选json
callback回调函数,callback 值是用户定义的函数名称,此参数只在 output 参数设置为 JSON 时有效可选
homeorcorp是否优化poi的返回顺序,以下内容需要 extensions 参数为 all 时才生效。homeorcorp 参数的设置可以影响召回 POI 内容的排序策略,目前提供三个可选参数:0:不对召回的排序策略进行干扰。1:综合大数据分析将居家相关的 POI 内容优先返回,即优化返回结果中 pois 字段的poi 顺序。2:综合大数据分析将公司相关的 POI 内容优先返回,即优化返回结果中 pois 字段的poi 顺序可选0
  • 返回参数

示例

  • 查询特定坐标的地址信息
import requests
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36',
}
url = 'https://restapi.amap.com/v3/geocode/regeo?location=116.310003,39.991957&key=<your key>'
response = requests.get(url, headers=headers)
json_response = response.json()
print(json_response)

  • 查询特定坐标方圆三公里内的地址信息
import requests
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36',
}
url = 'https://restapi.amap.com/v3/geocode/regeo?location=116.310003,39.991957&radius=3000&key=<your key>'
response = requests.get(url, headers=headers)
json_response = response.json()
print(json_response)

  • 返回详细的道路信息、附近POI等
url = 'https://restapi.amap.com/v3/geocode/regeo?location=116.310003,39.991957&extensions=all&key=<your key>'

  • 仅返回主干路
url = 'https://restapi.amap.com/v3/geocode/regeo?location=116.310003,39.991957&roadlevel=1&key=<your key>'

2. 行政区域查询

行政区域查询是一类简单的 HTTP 接口,根据用户输入的搜索条件可以帮助用户快速的查找特定的行政区域信息。

例如:中国>山东省>济南市>历下区>舜华路街道(国>省>市>区>街道)。

  • 行政区域查询 API 服务地址
URL请求方式
restapi.amap.com/v3/config/d…GET

parameters 代表的参数包括必填参数和可选参数。所有参数均使用和号字符(&)进行分隔。下面的列表枚举了这些参数及其使用规则。

  • 常用的请求参数
参数名含义规则说明是否必须缺省值
key请求服务权限标识用户的key必填
keywords查询关键字规则:只支持单个关键词语搜索关键词支持:行政区名称、citycode、adcode例如,在 subdistrict=2,搜索省份(例如山东),能够显示市(例如济南),区(例如历下区)可选
subdistrict子级行政区规则:设置显示下级行政区级数(行政区级别包括:国家、省/直辖市、市、区/县、乡镇/街道多级数据)可选值:0、1、2、3等数字,并以此类推0:不返回下级行政区;1:返回下一级行政区;2:返回下两级行政区;3:返回下三级行政区;部分城市和省直辖县因为没有区县的概念,故在市级下方直接显示街道。例如:广东-东莞可选1
page需要第几页数据最外层的 districts 最多会返回20个数据,若超过限制,请用 page 请求下一页数据。例如:page=2;page=3。默认:page=1可选1
extensions返回结果控制此项控制行政区信息中返回行政区边界坐标点; 可选值:base、all;base:不返回行政区边界坐标点;all:只返回当前查询 district 的边界值,不返回子节点的边界值;目前不能返回乡镇/街道级别的边界值可选base
filter根据区划过滤按照指定行政区划进行过滤,填入后则只返回该省/直辖市信息需填入 adcode,为了保证数据的正确,强烈建议填入此参数可选
output返回数据格式类型可选值:JSON,XML可选JSON

  • 返回结果参数说明

行政区域查询的响应结果的格式由请求参数output指定。

名称 含义 规则说明
status 返回结果状态值 值为0或1,0表示失败;1表示成功
info 返回结果说明 返回状态说明,status 为0时,info 返回错误原因,否则返回“OK”。
infocode 状态码 返回状态说明,10000代表正确,详情参阅 info 状态表
suggestion 建议结果列表
keywords 建议关键字列表
cities 建议城市列表
districts 行政区列表
district 行政区信息
citycode 城市编码 街道没有独有的 adcode,均继承父类(区县)的 adcode
name 行政区名称
polyline 行政区边界坐标点 当一个行政区范围,由完全分隔两块或者多块的地块组成,每块地的polyline坐标串以 | 分隔 。如北京的朝阳区
center 区域中心点 乡镇级别返回的center是边界线上的形点,其他行政级别返回的center不一定是中心点,若政府机构位于面内,则返回政府坐标,政府不在面内,则返回繁华点坐标。
level 行政区划级别 country:国家
province:省份(直辖市会在province显示)
city:市(直辖市会在province显示)
district:区县
street:街道
districts 下级行政区列表,包含 district 元素

  • 示例
  • 查询湖南省所有地级市的名称以及市中心的经纬度
    import requests


    header = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36',
    }
    url = f'https://restapi.amap.com/v3/config/district?keywords=湖南省&subdistrict=1&key=<your key>'
    response = requests.get(url, headers=header)
    json = response.json()
    count = len(json['districts'][0]['districts']) # 城市个数
    for i in np.arange(count):
        print('城市名称:', json['districts'][0]['districts'][i]['name'], '\t经度:', json['districts'][0]['districts'][i]['center'].split(sep=',')[0], '\t纬度:', json['districts'][0]['districts'][i]['center'].split(sep=',')[1])

3. 静态地图

静态地图服务通过返回一张地图图片响应 HTTP 请求,使用户能够将高德地图以图片形式嵌入自己的网页中。用户可以指定请求的地图位置、图片大小、以及在地图上添加覆盖物,如标签、标注、折线、多边形。

  • 请求参数及用法
URL请求方式
restapi.amap.com/v3/staticma…GET

parameters 代表的参数包括必填参数和可选参数。所有参数均使用和号字符(&)进行分隔。下面的列表枚举了这些参数及其使用规则。

  • 请求参数
参数名称含义规则说明是否必填默认值
key用户唯一标识用户在高德地图官网申请必填
location地图中心点中心点坐标。规则:经度和纬度用","分隔 经纬度小数点后不得超过6位。部分条件必填
zoom地图级别地图缩放级别:[1,17]必填
size地图大小图片宽度图片高度。最大值为10241024可选400*400
scale普通/高清1:返回普通图;2:调用高清图,图片高度和宽度都增加一倍,zoom 也增加一倍(当zoom 为最大值时,zoom 不再改变)。可选1
markers标注使用规则见 markers 详细说明,标注最大数10个可选
labels标签使用规则见 labels 详细说明,标签最大数10个可选
paths折线使用规则见 paths 详细说明,折线和多边形最大数4个可选
traffic交通路况标识底图是否展现实时路况。 可选值: 0,不展现;1,展现。可选0
sig数字签名数字签名认证用户必填可选

注:如果有标注/标签/折线等覆盖物,则中心点(location)和地图级别(zoom)可选填。当请求中无 location 值时,地图区域以包含请求中所有的标注/标签/折线的几何中心为中心点;如请求中无 zoom,地图区域以包含请求中所有的标注/标签/折线为准,系统计算出 zoom 值。

  • 示例
  • 添加一个默认标签
https://restapi.amap.com/v3/staticmap?markers=mid,0xFF0000,1:116.37359,39.92437&key=<your key>

一些小问题

  • 如何知道headers的值

不输入headers的话自动使用默认浏览器进行,而如果我想要指定浏览器就需要输入相应的headers。本人用的是火狐浏览器,就以这个作为例子,其他浏览器也是这种操作。

①先随便打开一个网页

②然后打开开发者模式(按F12) 等事务加载完成后,随便点击一个

③接着右边往下拉,找到User-Agent这一项,这个就是headers啦。

微信图片_20250624153946.png