依据关键字(keywords)、POI类型(types)等信息批量获取目标点位经纬度坐标。
1.原理
借助接口,用户不必关心获取数据方法的细节,而只需要提供几个重要的参数即可获得想要的数据。
高德地图Web服务API指南:https://lbs.amap.com/api/webservice/gettingstarted
2.GET方法
API接口采用GET方法(当然还有其他访问方法),GET方法的结构如下:
3.举例
下面代码表示以“故宫”为关键词,获取返回数据中坐标位置。
import requests
import re
path = "https://restapi.amap.com/v3/place/text?s=rsv3&children=&key=8325164e247e15eea68b59e89200988b&page=1&offset=10&city=110000&language=zh_cn&callback=jsonp_265615_&platform=JS&logversion=2.0&sdkversion=1.3&appname=https%3A%2F%2Flbs.amap.com%2Fconsole%2Fshow%2Fpicker&csid=4A86155F-6120-4112-B48E-0DE19C219DAC&keywords=故宫"
headers = {
"User-Agent": r"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36 Edge/18.17763"
}
res = requests.get(path, headers=headers)
p = re.findall('"location":"(.*?)","tel"', res.text)
print(p[0])
注:1.path中的URL高德地图API提供,key为用户申请,其他参数可参照表格,也可根据页面提供的生成器生成。
2.返回的数据,我们可以通过浏览器输入path查看,从数据中可以看到,坐标数据是紧跟“loaction :”字段后面的,所以利用re库的findall函数,匹配出需要的坐标数据,返回的内容可能存在多个匹配结果,所以是以list的形式返回。p[0]表示第一个匹配的坐标。
下图为通过用户自定参数而生成的访问路径(path)
https://lbs.amap.com/api/webservice/guide/api/search
参数名 | 含义 | 规则说明 | 是否必须 | 缺省值 |
key | 请求服务权限标识 | 必填 | 无 | |
keywords | 查询关键字 | 规则: 多个关键字用“|”分割 若不指定city,并且搜索的为泛词(例如“美食”)的情况下,返回的内容为城市列表以及此城市内有多少结果符合要求。 | 必填 | 无 |
types | 查询POI类型 | 若指定了某个大类,则所属的中类、小类都会被显示。 | 必填 | 无 |
city | 查询城市 | 可选值:城市中文、中文全拼、citycode、adcode 如:北京/beijing/010/110000
| 可选 | 无 |
citycitylimit | 仅返回指定城市数据 | 可选值:true/false | 可选 | false |
children | 是否按照层级展示子POI数据 | 可选值:children=1 当为0的时候,子POI都会显示。 当为1的时候,子POI会归类到父POI之中。
仅在extensions=all的时候生效
| 可选 | 0 |
offset | 每页记录数据 | 强烈建议不超过25,若超过25可能造成访问报错 | 可选 | 20 |
page | 当前页数 | 最大翻页数100 | 可选 | 1 |
extensions | 返回结果控制 | 此项默认返回基本地址信息;取值为all返回地址信息、附近POI、道路以及道路交叉口信息。 | 可选 | base |
sig | 数字签名 | 可选 | 无 | |
output | 返回数据格式类型 | 可选值:JSON,XML | 可选 |
|
callback | 回调函数 | callback值是用户定义的函数名称,此参数只在output=JSON时有效 | 可选 | 无 |
4.批量获取
熟悉API接口,即可根据需求批量获取POI数据。
import re
import requests
#按名字获取POI
def main():
count = 1
path1 = "http://restapi.amap.com/v3/place/text?
key=8325164e247e15eea68b59e89200988b&keywords="
path2= "&city="
headers = {
"User-Agent": r"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36 Edge/18.17763"
}
with open(r'C:\Users\admin\Desktop\data.txt',encoding='utf-8')as f:
with open(r'C:\Users\admin\Desktop\city_poi.txt','w',encoding='utf-8')as f_w:
for i in f:
i = i.split(',')
path_i = path1 + i[1]+i[2]+'政府'+path2+i[3]
res = requests.get(path_i, headers=headers)
p = re.findall('"location":"(.*?)","tel"', res.text)
if p :
f_w.write(p[0] + '\n')
else:
f_w.write('no data......'+'\n')
count += 1
if __name__ == '__main__':
main()