返回 BIM 与 IFC 博客
在访问者浏览器中运行、没有自己服务器的数字孪生,只能使用网页被允许读取的数据。这种许可与许可证或密钥无关:它是一个响应头,即 CORS[cors],由发布方的服务器决定发不发送。没有它,数据虽然公开,网页却依然够不着。
于是我们做了测试。20 个城市的 28 个公开端点,涵盖共享单车、实时公交、城市开放数据门户、气象和一个 3D 城市模型,每个都完全按浏览器的方式请求一次,并记录结果。
要点
- 28 个端点中,有 25 个可以直接从网页读取。
- 共享单车最开放:测试的 10 个 GBFS 数据源中,有 9 个响应时带有 CORS 头。
- 被拦截的三个:巴黎的 Vélib'、赫尔辛基 HSL 的 GTFS-Realtime 数据源,以及维也纳 Wiener Linien 的实时监控接口。
- 被拦截并不意味着无路可走:HSL 还通过 MQTT 发布同样的公交位置,浏览器可以读取。
各城市的结果:绿色表示网页能读取该数据源,红色表示只有服务器能读取。
测试方法
2026 年 10 月 15 日,我们向每个端点发送了一次 GET 请求,带上与本站页面发出时相同的 Origin 头。“可读取”表示响应带有 Access-Control-Allow-Origin 头,允许该页面读取。包含状态码和内容类型的完整列表可下载 CSV 文件[csv]。
共享单车:开放标准行之有效
测试的十个共享单车系统中,有九个以带 CORS 头的方式发布 GBFS[gbfs]:巴塞罗那、柏林、奥斯陆、纽约、芝加哥、旧金山、多伦多、蒙特利尔和墨西哥城。巴黎的 Vélib' 发布的是同一标准,但没有这个头。决定差别的,是一种默认设置宽松的通用格式:一个城市能用,下一个城市也就能用。
公共交通:喜忧参半
伦敦的 TfL API、波士顿的 MBTA、纽约地铁的 GTFS-Realtime 以及东京的两个 ODPT 数据源,响应时都带有 CORS 头。HSL 的 GTFS-Realtime 和维也纳的实时监控接口则没有。HSL 给出了绕开的办法:同样的车辆位置也通过基于 WebSocket 的 MQTT 发布,而它不受 CORS 限制。赫尔辛基孪生用的正是这种方式,详见基于 MQTT 的公交总站孪生。
城市门户:大多开放
基于常见平台搭建的门户(巴黎和墨尔本的 Opendatasoft、纽约的 Socrata、巴塞罗那和苏黎世的 CKAN)响应时都带有 CORS 头;西班牙国家数据目录、马德里的交通传感器、芬兰气象服务、新加坡的实时 API 和赫尔辛基的 3D 城市模型也是如此。
全部 28 个端点
| 城市 | 数据源 | 类别 | 网页能否读取 |
|---|
| 巴塞罗那 | Bicing(GBFS 3.0) | 共享单车 | 可读取 |
| 巴塞罗那 | Open Data BCN 资源(Endolla) | 城市数据 | 可读取 |
| 巴塞罗那 | Open Data BCN CKAN API | 城市数据 | 可读取 |
| 马德里 | Informo 交通传感器(XML) | 城市数据 | 可读取 |
| 西班牙 | datos.gob.es API | 城市数据 | 可读取 |
| 巴黎 | Vélib' Métropole(GBFS) | 共享单车 | 被拦截 |
| 巴黎 | opendata.paris.fr(Opendatasoft) | 城市数据 | 可读取 |
| 伦敦 | TfL Unified API(BikePoint) | 公共交通 | 可读取 |
| 奥斯陆 | Oslo Bysykkel(GBFS) | 共享单车 | 可读取 |
| 赫尔辛基 | HSL GTFS-Realtime | 公共交通 | 被拦截 |
| 赫尔辛基 | FMI 开放数据(WFS) | 城市数据 | 可读取 |
| 赫尔辛基 | 赫尔辛基 3D(3D Tiles) | 城市数据 | 可读取 |
| 维也纳 | Wiener Linien 实时监控接口 | 公共交通 | 被拦截 |
| 柏林 | nextbike Berlin(GBFS) | 共享单车 | 可读取 |
| 苏黎世 | Open Data Zürich(CKAN) | 城市数据 | 可读取 |
| 东京 | ODPT 公共 API(都营列车) | 公共交通 | 可读取 |
| 东京 | ODPT 都营公交(GTFS-Realtime) | 公共交通 | 可读取 |
| 新加坡 | data.gov.sg 实时 API | 城市数据 | 可读取 |
| 纽约 | Citi Bike(GBFS) | 共享单车 | 可读取 |
| 纽约 | NYC Open Data(Socrata) | 城市数据 | 可读取 |
| 纽约 | MTA 地铁(GTFS-Realtime) | 公共交通 | 可读取 |
| 波士顿 | MBTA V3 API | 公共交通 | 可读取 |
| 芝加哥 | Divvy(GBFS) | 共享单车 | 可读取 |
| 旧金山 | Bay Wheels(GBFS) | 共享单车 | 可读取 |
| 多伦多 | Bike Share Toronto(GBFS) | 共享单车 | 可读取 |
| 蒙特利尔 | BIXI(GBFS) | 共享单车 | 可读取 |
| 墨西哥城 | Ecobici(GBFS) | 共享单车 | 可读取 |
| 墨尔本 | 墨尔本市(Opendatasoft) | 城市数据 | 可读取 |
测试日期:2026 年 10 月 15 日。CSV 文件还列出了每个响应的状态码、CORS 头和内容类型。
数据源被拦截时怎么办
- 寻找其他渠道。发布方常常以不止一种方式提供同样的数据;本文的例子就是 HSL 的 MQTT 数据流。
- 联系发布方。加上这个头,在他们那边只需改一行配置,开放数据团队收到请求后往往会照做。
- 在中间放一台服务器,但要清楚这意味着什么:它代表你的访问者获取每一个请求,能看到所有请求,而且成了你必须维护运行的东西。
- 绝不要为了绕开限制而把 API 密钥放进公开网页:页面发送的任何内容,访问者都能读到。
本博客的实时案例如何读取各自的数据源、每个数据源来自哪里,见什么是城市数字孪生和巴塞罗那开放数据孪生。
参考文献
- 测试结果(CSV) — IFC Viewer Online. 每个端点的状态码、Access-Control-Allow-Origin 头和内容类型,测试日期为 2026 年 10 月 15 日。
- 跨源资源共享(CORS) — MDN Web Docs. 浏览器如何决定页面能否读取来自其他网站的响应。
- 通用共享单车数据规范(GBFS) — MobilityData. 大多数共享单车系统发布数据所用的开放标准。
网页能读取哪些城市开放数据?实测 20 个城市的 28 个数据源