高德Web服务API提供了交通态势的http接口,使用时分为以下3个过程:
第一步,申请”Web服务API接口”**(Key);
第二步,拼接HTTP请求URL,第一步申请的Key需作为必填参数一同发送;
第三步,接收HTTP请求返回的数据(JSON或XML格式),解析数据。
详情参见https://lbs.amap.com/api/webservice/guide/api/trafficstatus
下面的代码使用Python3.7将爬取的济南市交通路况数据存储到MongoDB(本着学习MongoDB的目的)中,当然也可直接存储为csv文件。
import requests
import json
from pymongo import MongoClient
import time
client = MongoClient('localhost',27017)
db = client.Trafic
collection = db.table14_1
point_list = list()
with open("坐标对.txt", 'r', encoding='UTF-8') as txt_file: #坐标对文件可通过arcgis生成渔网的方式加工得到
for each_line in txt_file:
if each_line != "" and each_line != "\n":
# print(each_line)
fields = each_line.split("\n")
polygon = fields[0]
point_list.append(polygon)
txt_file.close()
def getjson(rectangle):
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36'
}
pa = {
'key': '76d19a3a95853482f61a529d3f9859a2',
'level': 6, #道路等级为6,即返回的道路路况等级最小到无名道路这一级别
'rectangle':rectangle, #矩形区域
'extensions': 'all',
'output': 'JSON'
}
r = requests.get('https://restapi.amap.com/v3/traffic/status/rectangle?', params=pa, headers=headers)
decodejson = json.loads(r.text)
return decodejson
for each_point in point_list:
decodejson = getjson(each_point)
time.sleep(0.8)
print(decodejson)
if decodejson['trafficinfo']['roads']:
for each in decodejson['trafficinfo']['roads']:
try:
name = each['name'] #道路名称
except:
name = None
try:
status = each['status'] #路况状态,0代表未知,1代表畅通,2代表缓行,3代表拥堵
except:
status = None
try:
direction = each['direction'] #路段
except:
direction = None
try:
speed = each['speed'] #车速
except:
speed = None
try:
polyline = each['polyline'].split(';') #道路坐标集
for i in range(0, len(polyline)):
roadloc = name + ',' + status + ',' + direction + ',' + speed + ',' + polyline[i]
dt = time.localtime() #获得爬取路况数据时间
ft = "%Y-%m-%d %H:%M:%S"
nt = time.strftime(ft, dt)
data = {'roadloc': roadloc, 'time': nt, }
collection.insert_one(data)
except:
polyline = None
打开MongoDB可视化工具studio 3t查看刚刚爬取的数据(MongoDB和studio 3t均可从免费下载安装,studio 3t有14天的免费使用时间,到期后若想继续使用,选择non-commercial即可,自己动手安装吧)。
然后,将此数据导出为csv格式,用记事本打开,将其保存为ASCII编码方式。通过excel的数据分列方式,得到如下结果:
利用ArcGIS的添加数据-添加xy数据,将其在ArcGIS中空间可视化,得到的结果如下:
放大看一下:
可以看出,在周一上班高峰期,济南市内很多路段为缓行状态。
附件:
坐标对文件截图: