
点击上方蓝字,欢迎关注“每天学点呗”

加拿大蒙特利尔BIXI是一个覆盖广泛的公共自行车共享系统。BIXI蒙特利尔提供了官方和第三方的公开数据集,主要包括行程记录、实时站点状态、站点空间数据三类。
在GIS数据分享 | 加拿大蒙特利尔BIXI共享单车数据此文中介绍了历史行程记录数据的获取与处理。
本文主要介绍如何应用Python来获取实时数据
官方网站:https://bixi.com/en/open-data

点击后,是这样的信息

这个JSON文件按语言("en" 英语 / "fr" 法语)组织了数据源,我们看"en" 英语部分,主要是提供了5类数据的获取地址
| 序号 | 数据源名称 | 作用说明 |
| system_information | 系统基本信息,如名称、网址、邮箱、时区等 | |
| station_status | 最重要的实时数据,包括每个站点当前可用自行车数、空车位数等 | |
| vehicle_types | 车辆类型信息,如人力车、电助力车、货运自行车等 | |
| system_alerts | 系统公告,如某区域临时关闭、恶劣天气影响等 | |
| station_information | 站点的静态信息,如站点ID、名称、地理位置(经纬度) |
2、 把“GIS应用”翻译为“求职地图”
上图中我们对GIS能解决的交通问题域进行了梳理。但许多同学们仍然困惑:既然GIS的交通应用这么广泛,可以解决这么多交通问题,为什么感觉能去的对应的企业和岗位不多呢?
借助AI的回答,我们试着一起把这些“GIS应用”翻译成具体的“企业”和“岗位”。

一、获取数据
import jsonimport requestsimport pandas as pdfrom datetime import datetime
# 1. 获取数据获取的入口地址
gbfs_url = "https://gbfs.velobixi.com/gbfs/2-2/gbfs.json?_gl=1*1ymwu1o*_gcl_au*MTQ3MzYxNjU3Mi4xNzc0NDI3MTI4*_ga*MTE0MDMzNDUzMy4xNzc0NDI3MTI5*_ga_5DRPF9PX4V*czE3NzU3MDg0MjIkbzEwJGcwJHQxNzc1NzA4NDI4JGo1NCRsMCRoMA.."
def fetch_bixi_data():print("🚴 开始获取蒙特利尔BIXI实时数据...\n")# 2. 获取目录文件,找到真实数据源的地址try: response = requests.get(gbfs_url) response.raise_for_status() gbfs_data = response.json()# 我们使用英文(en)的数据源feeds = gbfs_data['data']['en']['feeds']# 从目录中提取所需数据的URLstation_info_url = Nonestation_status_url = None for feed in feeds:if feed['name'] == 'station_information': station_info_url = feed['url'] if feed['name'] == 'station_status': station_status_url = feed['url']if not station_info_url or not station_status_url: print("❌ 错误: 无法在目录中找到必要的API地址。") return except Exception as e: print(f"❌ 获取目录文件失败: {e}")return
# 获取站点基本信息 (名称, 经纬度, 容量等)try: info_resp = requests.get(station_info_url) info_resp.raise_for_status()# 提取数据stations_info = info_resp.json()['data']['stations'] stations_dict = {s['station_id']: s for s in stations_info} print(f"✅ 成功获取站点基本信息: 共 {len(stations_dict)} 个站点")# 转换为 DataFrame 并保存为 CSVtimestamp = datetime.now().strftime("%Y%m%d_%H%M%S") csv_filename = f"station_information_{timestamp}.csv"df_stations = pd.DataFrame(stations_info) df_stations.to_csv(csv_filename, index=False, encoding='utf-8-sig') print(f"💾 站点信息已保存到 CSV: {csv_filename}") except Exception as e: print(f"❌ 获取站点基本信息失败: {e}")return
# 获取站点实时状态try: status_resp = requests.get(station_status_url) status_resp.raise_for_status()# 提取数据stations_status = status_resp.json()['data']['stations'] print(f"✅ 成功获取站点实时状态: 共 {len(stations_status)} 个站点有状态更新")# 转换为 DataFrame 并保存为 CSVtimestamp = datetime.now().strftime("%Y%m%d_%H%M%S") csv_filename = f"station_status_{timestamp}.csv"df_status = pd.DataFrame(stations_status) df_status.to_csv(csv_filename, index=False, encoding='utf-8-sig') print(f"💾 站点状态已保存到 CSV: {csv_filename}") except Exception as b: print(f"❌ 获取站点实时状态失败: {e}")return
if __name__ == "__main__": fetch_bixi_data()

2、 把“GIS应用”翻译为“求职地图”
上图中我们对GIS能解决的交通问题域进行了梳理。但许多同学们仍然困惑:既然GIS的交通应用这么广泛,可以解决这么多交通问题,为什么感觉能去的对应的企业和岗位不多呢?
借助AI的回答,我们试着一起把这些“GIS应用”翻译成具体的“企业”和“岗位”。

2、 把“GIS应用”翻译为“求职地图”
上图中我们对GIS能解决的交通问题域进行了梳理。但许多同学们仍然困惑:既然GIS的交通应用这么广泛,可以解决这么多交通问题,为什么感觉能去的对应的企业和岗位不多呢?
借助AI的回答,我们试着一起把这些“GIS应用”翻译成具体的“企业”和“岗位”。

二、站点基本信息数据的处理与查看
在ArcGIS Pro中将station_information.CSV文件转为要素类,并查看

共 979 个站点:

属性表每个字段解释如下:
1 | 基础标识与地理信息 |
|
站点名称与标识 |
| |
运营与配置信息 |
|
按容量染色 - 展示站点规模分布,选择 分级色彩

容量分布直方图:右键点图层 → 创建图表 → 直方图


2、 把“GIS应用”翻译为“求职地图”
上图中我们对GIS能解决的交通问题域进行了梳理。但许多同学们仍然困惑:既然GIS的交通应用这么广泛,可以解决这么多交通问题,为什么感觉能去的对应的企业和岗位不多呢?
借助AI的回答,我们试着一起把这些“GIS应用”翻译成具体的“企业”和“岗位”。

2、 把“GIS应用”翻译为“求职地图”
上图中我们对GIS能解决的交通问题域进行了梳理。但许多同学们仍然困惑:既然GIS的交通应用这么广泛,可以解决这么多交通问题,为什么感觉能去的对应的企业和岗位不多呢?
借助AI的回答,我们试着一起把这些“GIS应用”翻译成具体的“企业”和“岗位”。

三、站点实时数据的处理与查看
在ArcGIS Pro中加载station_information.CSV文件查看

属性表每个字段解释如下:
1 | 基础标识信息 |
|
车辆可用信息 |
| |
车位可用信息 |
| |
服务状态信息 |
| |
车辆类型明细 |
|
这个csv文件不带坐标数据,需要与站点坐标文件进行关联

然后基于关联后的csv文件,转要素点

观察“可用车辆数”:选择 分级色彩
字段选择 num_bikes_available

同时查看“容量”、”可用车辆数”

直方图:宏观了解所有站点的车辆配置情况,比如大多数站点的车辆数集中在哪个区间。

增加一个字段,填充率:
右键点击 fill_rate 字段 → 计算字段
输入表达式:num_bikes_available / capacity

散点图:了解容量(capacity) 与 填充率(fill_rate) 之间的关系
从下图中可以看出:共享单车站点的使用率(填充率)与站点规模(容量)没有直接关系。可能与位置和用户需求、车辆运营调度策略有关,可以做进一步分析论证。


工程文件(*.aprx)

源码获取:关注公众号
后台发送
BIXI源码
