开发者社区

实时公交怎么用:附近站、到站和线路上的车

POST https://v1.apizero.cn/api/bus-realtime。type=nearby 用经纬度找官方站,再 type=query 查到站。车辆带实时经纬度。额度以商城页为准。

青渚480

商城里的 实时公交到站 是一条接口。地址只有这一条:

POST https://v1.apizero.cn/api/bus-realtime

七个功能靠 type 换。完整字段在该页「接口文档」,以及 原始文档。先打开 实时公交到站 看一眼,再接到自己的后端。

密钥在 API Key 建。头写成 Authorization: Bearer 你的密钥。也认 X-API-Key。匿名可以不带头,走更低的每日次数。成功时 code 为 0,正文在 data。

先选 type

  • nearby:手里是经纬度,先找附近的官方站。也认 near。这一跳没有实时车辆。
  • query:到站,默认就是它。一个站台上各线路最近的车,每线大约最多 3 辆。
  • cities:覆盖城市的官方短名。
  • stations:按关键词搜官方站名。
  • line:一条线单向的全程站点、首末班、票价。这一跳没有实时车。
  • line-live:这一条线当前方向上的全部实时车辆。
  • line-search:按路号搜线路。line 留空则列出该城可查线路。

只知道坐标,用 nearby,再拿返回的站名去 query。只知道站名,用 stations 对上官方名再 query。只知道路号,用 line-search,再 line 或 line-live。

附近站

type=nearby。lat、lng 必填,用 WGS-84 十进制。高德、百度上抄来的点多半是国测局或百度坐标,先换成 WGS-84 再传。

city 可以不传,接口按坐标识别城市。radius 可选,只要这个米数以内的站,范围 50–3000;不传就不按米数再筛。limit 可选,1–20,默认 15。

curl -sS -X POST "https://v1.apizero.cn/api/bus-realtime" \
  -H "Authorization: Bearer $APIZERO_API_KEY" \
  -H "Content-Type: application/json" \
  -d "{\"type\":\"nearby\",\"lat\":22.819861,\"lng\":108.316861,\"radius\":800,\"limit\":8}"

回包按距离从近到远。南宁 22.819861,108.316861 这个点上,最近的「朝阳广场」是地铁站,kind 为 subway,queryable 为 false,不能拿去查到站。旁边「朝阳广场(朝阳北宁路口)」是公交站,queryable 为 true,distance_m 为 10。lines 里是经过的线路名。

读这些字段:

  • city:没传城市时,是坐标识别出的官方短名
  • radius:传了就是请求的米数,没传是 null
  • stations[].name:查到站用这个名字,配上 city
  • stations[].queryable:true 才能再调 type=query
  • stations[].distance_m:距离,米。没有距离时为 null
  • stations[].lines:线路名,最多 40 条。这里没有车牌,也没有到站时间
  • stations[].lat / lng:这一跳通常是 null

结果缓存 10 分钟。它和城市列表、搜站、静态线路共用每秒 15 次辅助额度,不跟到站查询抢同一秒。

到站

type=query,也可以不传 type。city 和 station 必填。站名用 nearby 或 stations 返回的 name。地图上的「五一广场(地铁站)」要先搜官方站名。

direction 在到站里是第几个站台,从 1 起,可以大于 2。回包看 platform_count 和 platforms。这一侧没有想要的线路,就换 2、3、4。

curl -sS -X POST "https://v1.apizero.cn/api/bus-realtime" \
  -H "Authorization: Bearer $APIZERO_API_KEY" \
  -H "Content-Type: application/json" \
  -d "{\"type\":\"query\",\"city\":\"长沙\",\"station\":\"五一广场\",\"direction\":1}"

每条线看 lines[]:line 线路名,terminal 终点方向,price 票价,first_time / last_time 首末班。buses 是这一侧最近的车,大约最多 3 辆。当前没有在途车辆时 buses 为 [],bus_count 为 0,线路本身还在。

每辆车:

  • bus_id:车牌
  • arrival_time:预计到站,北京时间,精确到分钟
  • travel_minutes:大约还要几分钟
  • stops_remaining:剩余站数
  • status:即将到站、已过站、n站、暂无实时
  • lat / lng:这一辆车此刻的位置。没有定位时为 null。这是车,不是站台

站台坐标在外层 data.lat / data.lng。车辆坐标标到高德或百度之前,请先按该图的坐标系转换。

实时结果缓存 15 秒。

城市和官方站名

type=cities 不用传城市。用返回的 name,例如长沙、崇阳县。「湖南省长沙」这种带省名的写法不要传。长沙、长沙市,以及县、区、自治州全称,查询时都能认。

type=stations 要 city 和 station(关键词)。同名可能同时有公交站和地铁站。queryable 为 true 的才拿去到站。这里的 lat、lng 是站,不是车。

线路

type=line-search:city 必填,line 可空。空着列出该城可查线路,最多 80 条。写了路号,例如 1,会同时出现 1路、11路,有关键词时最多 30 条。选中 lines[].line 再往下查。kind 为 subway,或 queryable 为 false 的,不能查全程。

type=line:单向全程站点、首末班、票价。401 和 401路 都可以。这里的 direction 是方向:1 默认,2 对向。stops[].lat / lng 是站点位置。地铁线路通常没有全程站点,改用站名再查到站。

type=line-live:这一条线当前方向的全部车辆。direction 同样是 1 或 2。可选再传 station,多一份尚未过该站的 arrivals。没有在途车辆时 buses 和 arrivals 都是 []。车辆的 lat、lng 和到站查询一样,没有定位就是 null。

静态线路缓存 1 小时。城市列表缓存 12 小时。站点搜索缓存 10 分钟。

接到自己的网站

浏览器只打你的后端。服务器再带 Key 去 v1.apizero.cn。

const res = await fetch("https://v1.apizero.cn/api/bus-realtime", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${process.env.APIZERO_API_KEY}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    type: "nearby",
    lat: 22.819861,
    lng: 108.316861,
    radius: 800,
    limit: 8,
  }),
});
const json = await res.json();
if (json.code !== 0) throw new Error(json.msg || "bus failed");
const stop = json.data.stations.find((s) => s.queryable);

拿到 stop.name 和 json.data.city 之后,再请求一次 type=query。页面上的「还有几站」读 buses[].stops_remaining,地图上的车读 buses[].lat 和 buses[].lng。

公交线沿途能换乘哪些地铁,用 沿线地铁。那条接口给换乘站和乘车段,没有列车位置,也没有到站倒计时。

额度

这条按次计,免费。具体每日次数和 QPS 看商城页「访问限制」,以当时页上的为准。写这篇时:未带 Key 每天 5 次、QPS 5;登录免费每天 20 次、QPS 20;另有一次性试用 5 次。黄金每天 50,000 次、QPS 20;钻石每天 100,000 次、QPS 30;企业每天 1,000,000 次、QPS 60。

附近站、城市列表、搜站、静态线路、搜线路共用每秒 15 次辅助额度,不跟到站查询抢同一秒。每日次数仍按这一条接口一起计。

常见卡住

  • 地图站名直接拿去到站:先 stations 或 nearby,用 queryable 为 true 的 name
  • 同名站台缺线:到站的 direction 换成 2、3、4,看 platforms
  • direction 在 line 和 line-live 里是去程和返程,到站里才是站台序号
  • 附近站把高德坐标原样传入:先换成 WGS-84
  • 附近站回包里等车牌:这一跳只有站和线路名,到站再调 query
  • 地铁站 queryable 为 false:换旁边 queryable 为 true 的公交站
  • 这一刻没有在途车辆:buses 是空数组,线路还在
  • lat 要看它在哪一层:到站外层是站台,buses[] 里是车;附近站列表里的站点坐标经常是 null
  • 次数用完:看该接口今日已用,请求里带上自己的 Key

字段对过、额度还在,再接到网站。换城市只改 city,或改 lat / lng。地址不用换。

回答 · 0

暂无公开回答

写回答

可拖入或粘贴图片/视频,也支持 Markdown

相关文章