前言
最近打算做一些地图可视化的工作,然后发现可以借助高德api来在地图上进行批量标记、画多边形。
介绍
高德地图为个人开发者开放了一定免费次数的api,包括地理/逆地理编码、路径规划、行政区域查询、交通事件、IP定位、坐标转换等服务。(详情可见高德开放平台高德开放平台 | 高德地图API (amap.com))
准备工作
1. 申请高德地图api服务
搜索“高德地图开放平台”或者“高德地图api”,进入官网,登录账号。
2. 进入控制台(右上方),点击应用管理-我的应用,然后添加key
3. 添加key,服务平台选择Web服务,其他的自己随意填写咯
4. 记下key,后面的每次调用都需要这个key
开冲
1.地理/逆地理编码
地理编码/逆地理编码 API 是通过 HTTP/HTTPS 协议访问远程服务的接口,提供结构化地址与经纬度之间的相互转化的能力。
适用场景
- 地理编码:将详细的结构化地址转换为高德经纬度坐标。且支持对地标性名胜景区、建筑物名称解析为高德经纬度坐标。
- 逆地理编码:将经纬度转换为详细结构化的地址,且返回附近周边的POI、AOI信息。
I. 地理编码
- 地理api服务地址
URL | https://restapi.amap.com/v3/geocode/geo?parameters |
请求方式 | 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()
- 模糊查找
全国有很多同名街道,当地址不规范的时候,往往会返回很多个结果,此时添加限定条件将提高搜索的准确性。
- 添加城市
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=广州的限定条件。以下几种写法均可:
# 拼音
url = 'https://restapi.amap.com/v3/geocode/geo?address=北京路&city=guangzhou&key=<your key>'
# 中文字符
url = 'https://restapi.amap.com/v3/geocode/geo?address=北京路&city=广州&key=<your key>'
url = 'https://restapi.amap.com/v3/geocode/geo?address=北京路&city=广州市&key=<your key>'
# 区号
url = 'https://restapi.amap.com/v3/geocode/geo?address=北京路&city=020&key=<your key>'
# adcode
url = 'https://restapi.amap.com/v3/geocode/geo?address=北京路&city=440100&key=<your key>'
II.逆地理编码
-
逆地理api服务地址
URL | https://restapi.amap.com/v3/geocode/regeo?parameters |
请求方式 | GET |
parameters代表可选参数,参数间使用符号“&”连接,参数见下表。
- 请求参数
参数名 | 含义 | 是否必须 | 缺省值 |
key | 高德key,用户在官网申请Web服务API类型的key | 必须 | 无 |
location | 经纬度坐标,经度在前,纬度在后,经纬度间以“,”分割,经纬度小数点后不要超过 6 位。 | 必须 | 无 |
poitype | POI类型,逆地理编码在进行坐标解析之后不仅可以返回地址描述,也可以返回经纬度附近符合限定要求的 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 | 请求方式 |
https://restapi.amap.com/v3/config/district?parameters | 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,均继承父类(区县)的 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 | 请求方式 |
https://restapi.amap.com/v3/staticmap?parameters | GET |
parameters 代表的参数包括必填参数和可选参数。所有参数均使用和号字符(&)进行分隔。下面的列表枚举了这些参数及其使用规则。
- 请求参数
参数名称 | 含义 | 规则说明 | 是否必填 | 默认值 |
key | 用户唯一标识 | 用户在高德地图官网申请 | 必填 | 无 |
location | 地图中心点 | 中心点坐标。 规则:经度和纬度用","分隔 经纬度小数点后不得超过6位。 | 部分条件必填 | 无 |
zoom | 地图级别 | 地图缩放级别:[1,17] | 必填 | 无 |
size | 地图大小 | 图片宽度*图片高度。最大值为1024*1024 | 可选 | 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啦。