高德地图交通态势爬取

时间:2024-05-18 16:15:55

高德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中空间可视化,得到的结果如下:
高德地图交通态势爬取
放大看一下:
高德地图交通态势爬取
可以看出,在周一上班高峰期,济南市内很多路段为缓行状态。

附件:
坐标对文件截图:
高德地图交通态势爬取