通过 Web 服务访问 Google 的交通数据

87

有没有一种方式可以通过 Web 服务访问 Google 提供的交通数据?

似乎有一个 GTrafficOverlay 可以将交通信息放置在嵌入式 Google 地图上的路线之上,但是没有直接的 Web 服务可以使用,例如提供起点和终点并查找它们之间的交通情况?

是否有其他来源可以获取此数据?


https://developers.google.com/maps/documentation/javascript/examples/layer-traffic 似乎是最近新增的内容。 - Blazemonger
10个回答

52

更新(2022年5月):来自@AbdullahTahan:

现在谷歌有这个功能,但需要付费,每次请求的费用为0.01美元,请查看https://developers.google.com/maps/documentation/distance-matrix/distance-matrix#distance-matrix-advanced

更新(2016年3月):自2011年撰写此答案以来,发生了很多事情,但核心观点似乎仍然成立:您不会在免费的API服务中找到原始交通数据(至少不是针对美国和可能不是大多数其他地方)。但是,如果您不介意支付一些费用和/或者只需要像“考虑交通状况的特定路线的旅行时间”之类的东西,那么您有选择。例如,@Anto's answer指向Google's Maps For Work作为一个付费API服务,可以让您考虑交通状况获取旅行时间。

原始答案:从Google Maps Javascript API v3中获取原始交通数据没有办法(或者至少没有合理易用的方法)。即使您能够做到这一点,这样做很可能会违反Google Maps的服务条款中的某些条款。您必须从另一个服务中获取此信息。我怀疑目前没有免费的提供此信息的服务,但如果有人证明我是错误的,我会很高兴。

正如@crdzoba所指出的那样,Bing Maps API公开了一些交通数据。也许这能满足您的需求。从文档中并不清楚它公开了多少交通数据,因为它只提供“事件”的数据。由于建筑施工而导致的缓慢交通会在其中,但是对我而言,仅仅由于车流量大而导致的缓慢交通是否包含在内并不明显。

15
显然,使用Google Directions API的专业版Maps for work可以获取信息。 根据API文档
注意:Maps for Work用户必须在请求中包括客户端和签名参数,而不是密钥。
[...]
duration_in_traffic表示该段路程的总持续时间,考虑到当前交通情况。 只有满足以下所有条件才会返回交通持续时间:
  • 路线请求包括设置为接近当前时间的值的departure_time参数。
  • 请求包括有效的Google Maps API for Work客户端和签名参数
  • 可用于请求路线的交通状况。
  • 路线请求不包括途经点。

14
您可能想要查看HERE地图服务。他们提供了您可以使用的直接交通数据,这正是您所需要的:https://developer.here.com/api-explorer/rest/traffic/traffic-flow-bounding-box 例如,通过查询感兴趣的区域,您可能会得到如下结果:
{
  "RWS": [
    {
      "RW": [
        {
          "FIS": [
            {
              "FI": [
                {
                  "TMC": {
                    "PC": 32483,
                    "DE": "SOHO",
                    "QD": "+",
                    "LE": 0.71682
                  },
                  "CF": [
                    {
                      "TY": "TR",
                      "SP": 9.1,
                      "SU": 9.1,
                      "FF": 17,
                      "JF": 3.2911,
                      "CN": 0.9
                    }
                  ]
                }
              ]
            }
          ],
....

这个示例展示了当前平均速度SU为9.1,自由流速度FF为17。拥堵因素JF为3.3,仍然被认为是自由流畅通,但变得缓慢。

可以在API调用中定义使用的单位(英里/公里)。

为避免处理TMC位置,请在请求中添加responseattributes=sh以获取道路段的地理坐标。

缩写可以在此处找到:解释HERE Maps实时交通标签

  • "RWS" - 道路(RW)项目列表
  • "RW" = 这是整个道路上的流量的组合项。每个道路都将存在一个带有流量信息的道路项
  • "FIS" = 流量项(FI)元素列表
  • "FI" = 单个流量项
  • "TMC" = 有序TMC位置集合
  • "PC" = 点TMC位置代码
  • "DE" = 道路的文本描述
  • "QD" = 排队方向。'+'或'-'。请注意,这与完全限定ID中的行驶方向相反,例如对于位置107+03021,QD将是' - '
  • "LE" = 道路段长度。单位在文件标题中定义
  • "CF" = 当前流量。此元素包含给定流量项的速度和拥堵因素信息。
  • "CN" = 置信度,指示如何确定速度。-1.0道路关闭。1.0=100%0.7-100%历史值通常在0.7到1.0之间
  • "FF" = 此路段的自由流速度。
  • "JF" = 0.0至10.0之间的数字,表示预期的行驶质量。当道路关闭时,拥堵因素将为10.随着数字接近10.0,行驶质量变得更差。-1.0表示无法计算拥堵因素
  • "SP" = 根据UNITS计算的速度,以速度限制为上限
  • "SU" = 根据UNITS计算的速度,没有速度限制
  • "TY" = 给定位置引用容器的类型信息。这可以是自由定义的字符串

此外,数据来源为:https://developer.here.com/rest-apis/documentation/traffic/topics/additional-parameters.html


1
虽然这个链接可能回答了问题,但最好在此处包含答案的基本部分并提供参考链接。如果链接页面更改,仅链接的答案可能会失效。- 来自审查 - CinCout
3
谢谢您的建议。我已经更新了我的帖子。 - Costa Huang
我该如何确定在QD字段中描述的完全限定ID? - diegopso

12

但这意味着如果您想在地图上显示交通信息,您必须使用必应地图。 - noRema

7
与其试图获取原始流量数据,您可以尝试不同的方法。Google Directions API允许您查询具有特定路线的api,并返回JSON字符串或XML元素作为结果。该结果包括元素 - 'duration_in_traffic',这表示考虑到当前交通状况的旅程特定部分的总持续时间。(有关由Directions API返回的JSON字符串的'leg'和其他元素的信息,请参阅下面的链接)。 https://developers.google.com/maps/documentation/directions/#JSON我自己还没有尝试过,但这是我在文档中发现的东西。

1
由于谷歌没有考虑交通状况,因此它无法正常工作。我的意思是,它返回相同的数字,无论是高峰时间还是平静的夜晚 :( - 4lberto
1
如果您拥有Google地图的付费帐户,它确实可以工作,但订阅费用非常昂贵,数据使用也受到限制。 - Betelguese

5
在印度,我们使用的是http://www.itrafficnews.com。但是这些数据都是由用户发布的,我认为谷歌不会提供这些数据。

4
也许您应该看一下Mapquests Traffic API:http://www.mapquestapi.com/traffic/ 不幸的是,我认为该网络服务仅适用于美国某些城市。但是它可能解决了您的问题。

3

可以获取流量数据。

以下是我在Python中的实现。该API有一些配额限制,不是完全免费的,但对于小型项目来说足够好。

import requests
import time
import json


while True:

    url = "https://maps.googleapis.com/maps/api/distancematrix/json"

    querystring = {"units":"metric","departure_time":str(int(time.time())),"traffic_model":"best_guess","origins":"ITPL,Bangalore","destinations":"Tin Factory,Bangalore","key":"GetYourKeyHere"}

    headers = {
        'cache-control': "no-cache",
        'postman-token': "something"
        }

    response = requests.request("GET", url, headers=headers, params=querystring)
    d = json.loads(response.text)
    print("On", time.strftime("%I:%M:%S"),"time duration is",d['rows'][0]['elements'][0]['duration']['text'], " & traffic time is ",d['rows'][0]['elements'][0]['duration_in_traffic']['text'])
    time.sleep(1800)
    print(response.text)

响应内容为:

{
    "destination_addresses": [
        "Tin Factory, Swamy Vivekananda Rd, Krishna Reddy Industrial Estate, Dooravani Nagar, Bengaluru, Karnataka 560016, India"
    ],
    "origin_addresses": [
        "Whitefield Main Rd, Pattandur Agrahara, Whitefield, Bengaluru, Karnataka 560066, India"
    ],
    "rows": [
        {
            "elements": [
                {
                    "distance": {
                        "text": "10.5 km",
                        "value": 10505
                    },
                    "duration": {
                        "text": "35 mins",
                        "value": 2120
                    },
                    "duration_in_traffic": {
                        "text": "45 mins",
                        "value": 2713
                    },
                    "status": "OK"
                }
            ]
        }
    ],
    "status": "OK"
}

在获取交通信息时,"departure_time":str(int(time.time())) 是必需的查询字符串参数。

您可以在 duration_in_traffic 中查看交通信息。

请参阅此文档以获取更多信息。

https://developers.google.com/maps/documentation/distance-matrix/intro#traffic-model

如果我需要尝试它,我只需要在“GetYourKeyHere”上替换我的密钥,或者还有其他东西吗?因为我遇到了一个错误,所以我想确保我走对了路。 - Fatima

3
我认为谷歌不会提供这个 API。交通数据不仅包含事故数据。
今天许多在线地图显示城市交通情况,但他们没有为开发者提供 API。我们甚至不知道他们从哪里获取交通数据。也许政府有这些数据。
因此,我认为你可以从另一个方向考虑。例如,有许多社交网络网站。每个人都可以在网站上发布交通信息。我们可以收集这些信息来获取交通状况。或者我们可以创建这种类型的网站。
但上面提到的那种交通数据(如前所述)并不准确。即使是人提供的信息也可能是错误的。
幸运的是,我发现我的城市现在提供了一个名为“实时公交信息”的移动应用程序。它可以告诉市民公交车现在在哪里,以及何时到达公交车站。我嗅探了这个应用程序中的REST API。
来自REST API的数据提供了重要的数据,例如纬度和经度,以及公交车速度。而且这是实时数据!因此,我认为我们可以通过一些编程从这些数据中计算出交通状态。
以下是一些示例数据:https://github.com/sp-chenyang/bus/blob/master/sample_data/bjgj_aibang_com_8899_bjgj_php_city_linename_stationno_datatype_type.json 即使公交数据不足以计算准确的实时交通状况。事故、交通信号灯和其他因素都会影响交通状况。但我认为这只是个开始。
最后,我认为你可以尝试找到你所在城市是否提供这些数据。
PS:我一直认为未来人们的生活会更好,但现在还不是。

0

有一个名为Open Traffic的项目,目前尚未完全实现功能,但似乎是未来的正确答案。

OpenTraffic是一个全球数据平台,将车辆和智能手机的匿名位置信息处理成实时和历史交通统计数据。我们正在采用完全开源的软件开发,并得到日益增长的合作伙伴的参与。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接