如何通过Python调用Google Traffic Layer API获取最新交通快照
问题复现
需要通过Python代码调用Google Traffic Layer API获取实时交通更新快照,两次尝试调用均返回普通静态地图,该API原生仅支持JS端调用。
两次尝试代码如下:
# 第一次尝试:直接调用瓦片接口 url = 'https://mt0.google.com/vt?x='+str(start_x+x)+'&y='+str(start_y+y)+'&z='+str(self._zoom)
# 第二次尝试:调用静态地图API url = 'http://maps.googleapis.com/maps/api/staticmap?center=12.955232,77.579923&size=600x600&zoom=17&sensor=false&layer=t&key=[my_secret_key]'
解决方案
1. 修正静态地图API调用参数
你之前的调用存在3个问题:
- 参数错误:叠加交通层的正确参数是
layers=traffic,不是layer=t - 协议错误:谷歌地图API已经停止支持HTTP请求,必须改用HTTPS
- 废弃参数:
sensor参数早已下线,可以直接删除
修正后的代码示例:
url = 'https://maps.googleapis.com/maps/api/staticmap?center=12.955232,77.579923&size=600x600&zoom=17&layers=traffic&key=[my_secret_key]'
2. 修正瓦片接口调用参数
原生瓦片接口默认只返回基础底图,需要添加图层参数指定叠加交通层,叠加道路底图+交通的参数为&lyrs=m,traffic,叠加卫星混合底图+交通的参数为&lyrs=y,traffic,同时需要请求头添加正常的User-Agent避免被谷歌拦截,修正后的代码示例:
import requests headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36' } url = f'https://mt0.google.com/vt?x={start_x+x}&y={start_y+y}&z={self._zoom}&lyrs=m,traffic' resp = requests.get(url, headers=headers) # 保存瓦片内容 with open(f'traffic_tile_{x}_{y}.png', 'wb') as f: f.write(resp.content)
3. 无头浏览器模拟方案(兼容性最高)
如果以上两种参数调整后仍然拿不到实时交通数据,可以用无头浏览器模拟JS端加载逻辑,直接截图获取快照,不会存在参数适配问题,可使用Selenium或Playwright实现:
from selenium import webdriver from selenium.webdriver.chrome.options import Options import time chrome_options = Options() chrome_options.add_argument("--headless=new") chrome_options.add_argument("--window-size=600,600") driver = webdriver.Chrome(options=chrome_options) # 本地写一个极简的加载谷歌JS API交通层的HTML文件即可 driver.get("file:///your_local_traffic_map.html") time.sleep(3) # 等待交通图层加载完成 driver.save_screenshot("traffic_snapshot.png") driver.quit()
内容的提问来源于stack exchange,提问作者Dip Chakraborty
相关产品推荐
相关产品推荐

