Skip to content
UrbankernelPublic

About

沿真实路网的城市等时圈 / 可达性分析工具:百度批量算路 + 腾讯距离矩阵双引擎,含地名解析、多 key 轮换、断点续跑与配额预估。

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Repository files navigation

Isochrone · 真实等时圈生成工具

基于百度批量算路 / 腾讯距离矩阵 API ,绘制沿真实路网、可含实时路况的等时圈。

项目简介

输入一个或多个出发点和一个研究范围,工具自动完成:

  1. 在范围内生成渔网终点(格心点);
  2. 批量调用算路 API(百度批量算路 / 腾讯距离矩阵),获取每个终点到出发点的真实通行时间与距离;
  3. 反距离权重(IDW)插值为连续时间表面;
  4. 提取等时带(如 5/10/15/30 分钟),输出栅格、矢量与自包含交互式 HTML 地图。

与"以出发点画直线距离圆"的本质区别:所有时间沿真实路网计算,驾车模式可选实时路况策略。

alt text

功能特性

  • 范围界定:缓冲区(buffer)/ 行政区划(admin,DataV.GeoAtlas 边界)/ 矩形框(bbox)/ 矢量文件(file,shp·GeoJSON·KML·GeoPackage)四种来源。
  • 多出发点:一次运行计算多个出发点的等时圈并分组出图;支持 merge_isochrones: true 将各出发点时间栅格逐像元取最小值合并,输出一张合并等时圈 + 一张时间栅格。
  • 地名解析随引擎:地名型出发点按引擎走不同平台——百度 Geocoding(BD-09→WGS84)、腾讯 geocoder/place(GCJ-02→WGS84);纯 POI 名称自动地点检索兜底,命中详情打印在日志供核对。
  • 多 key 容错轮换:百度 AK 与腾讯 key 均支持多 key 列表,配额耗尽或 key 级错误自动切换,各 key 用量留痕脱敏。
  • 断点续跑:配额耗尽/中断自动保现场,--resume 续跑零浪费。
  • 等时带可选开放带:keep_over_threshold 决定超过最大阈值的区域是显示 ">30" 开放带还是留空。
  • 可调图层透明度:等时圈 / 时间栅格 / 渔网格心三图层透明度可配(默认不透明)。
  • 全产物可视化:范围、出发点、渔网(按分钟着色)、不可达点、时间表面、等时带全部落入一张交互地图(leafmap + 天地图底图),图例随图层勾选联动。
  • 纯开源栈:geopandas / shapely / rasterio / scipy。

安装

环境

推荐 conda(geopandas/rasterio 依赖最稳):

conda env create -f environment.yml
conda activate baidu-isochrone

或 pip(Python ≥ 3.10,先建虚拟环境):

pip install -r requirements.txt
pip install -e .          # 注册 isochrone 命令

申请密钥

密钥 用途 申请入口
百度 AK 批量算路 / 地理编码(engine=baidu) 百度地图开放平台控制台 → 应用管理 → 创建应用(服务端类型),确认"批量算路"服务已开通
腾讯 key 距离矩阵 / 地名解析(engine=tencent) 腾讯位置服务控制台 → 应用管理 → 创建应用/Key,确认"WebService API"已启用
天地图 tk 底图(可选,缺省退 CartoDB) 天地图开放平台 → 创建应用
CartoDB key CartoDB 底图(可选,无 key 瓦片带 "API key required" 水印) CARTO Basemaps → 邮箱免费申请,免费 5M 次/月
cp configs/keys.txt.example configs/keys.txt   # 填入 baidu_ak、tencent_key、tianditu_tk 与 carto

密钥统一存 configs/keys.txt。配置文件用 keys_file 字段指定其位置(相对路径相对配置文件所在目录解析,缺省为同目录的 keys.txt,即 configs/keys.txt)。

快速开始

第 1 步:复制配置并改小样

cp configs/example.yaml configs/config.yaml        # 复制为默认配置文件
cp configs/keys.txt.example configs/keys.txt       # 复制并填入平台密钥

强烈建议第一轮用 2km 缓冲小样验证链路(约几十次请求),确认无误后再放大范围:

origins:
  - [120.20979, 30.252714]      # 出发点 [经度, 纬度],或 {address: "地名"}
study_area:
  type: buffer
  radius_km: 2                  # 小样先行;确认后改大或换 admin/file/bbox

第 2 步:干跑估算(不耗配额)

isochrone estimate
# 默认读取 configs/config.yaml;显式指定用 -c 其他配置.yaml
# 输出:终点数 / 请求次数 / 预计耗时 / 占日配额比例,超配额时给出调参建议

第 3 步:正式运行

isochrone run

进度条按"点对"显示。中断(Ctrl+C、断网、配额耗尽)都不怕——已完成的点对已落盘。

第 4 步:断点续跑

isochrone run --resume runs/<文件夹名>

第 5 步:看成果

打开 run 目录下的 map.html。想换底图或调样式后重出图(零 API 消耗):

isochrone render runs/20260914_101530_driving_baidu                       # 天地图矢量(默认)
isochrone render runs/20260914_101530_driving_baidu --basemap tianditu-img # 天地图影像
isochrone render runs/20260914_101530_driving_baidu --basemap cartodb      # CartoDB 浅色

配置了 tianditu_tk 时,地图图层控制中始终同时提供天地图矢量 / 天地图影像 / CartoDB 三种底图与对应注记层,--basemap 只决定默认显示哪一个。

命令行

命令 说明
isochrone run [-c configs/config.yaml] [--dry-run] [--resume RUN_DIR] 执行完整流水线;-c 缺省读 configs/config.yaml,--dry-run 只估算不请求,--resume 断点续跑
isochrone estimate [-c configs/config.yaml] 仅估算请求次数与配额占用(-c 缺省读 configs/config.yaml)
isochrone geocode "上海站" 地名 → WGS84 坐标(走百度 Geocoding)
isochrone render RUN_DIR [--basemap tianditu|tianditu-img|cartodb] 从 run 目录零 API 重建交互地图

配置说明

所有参数集中于一份 YAML(逐项注释见 configs/example.yaml,复制为 configs/config.yaml 使用)。

顶层配置

键 说明
origins 出发点列表,元素为 [lon, lat] 或 {address: "地名"};支持多个
origin_coord_type 坐标型出发点的输入坐标系:wgs84 / gcj02 / bd09ll
study_area 研究范围,见下
engine 算路引擎:baidu(默认)/ tencent(腾讯距离矩阵)
keys_file 密钥文件路径(key=value 格式,含百度 AK / 腾讯 key / 天地图 tk);相对路径相对配置文件目录解析,缺省同目录 keys.txt(configs/keys.txt)
baidu_aks 百度 AK 列表(可选,不写回退 keys.txt);单值可用 baidu_ak
tencent_keys 腾讯 key 列表(可选,不写回退 keys.txt);单值可用 tencent_key
trans_type 出行方式;百度:driving / walking / riding,腾讯:driving / walking / bicycling / ebicycling(riding 为 bicycling 兼容别名)
tactics 驾车策略:10 不走高速 / 11 常规 / 12 短距含路况 / 13 短距无路况
qps 每秒请求数(个人开发者建议 3–5,付费可提至 50)
concurrency 同时在途的批量请求数
max_retries 单批失败重试次数(指数退避)
merge_isochrones true 时各出发点时间栅格逐像元取最小值合并,只输出一张合并等时圈 + 一张时间栅格
keep_over_threshold true(默认)保留 ">最大阈值" 开放带;false 时超过最大阈值的区域为空
thresholds 等时带阈值(分钟,升序),如 [5, 10, 15, 30]

study_area(四种来源,type 二选其一)

type 必填 可选 说明
buffer radius_km center: [lon, lat] 圆形缓冲,center 缺省取首个出发点
admin adcode name 按 6 位行政区划代码拉取 DataV.GeoAtlas 边界(自动 GCJ-02→WGS84)
file path layer 本地矢量文件;layer 用于 GPKG 等多图层文件
bbox bounds — 矩形框 [xmin, ymin, xmax, ymax](WGS84)

子配置段

段 键 说明
grid cell_size 渔网间距(米)
offset 渔网范围外扩(米)
adaptive_beyond_km 距出发点超过该公里数后放疏(可选)
adaptive_multiplier 放疏倍数
interpolate cell_size / power / k / expand 栅格分辨率(米)/ IDW 幂 / 最近邻点数 / 插值范围外扩(米)
outputs dir / formats / raster / html 输出目录 / 矢量格式(gpkg·geojson·shp)/ 是否出 GeoTIFF / 是否出 HTML
viz basemap tianditu(需 tianditu_tk)或 osm(退 CartoDB)
isochrone_opacity / raster_opacity / fishnet_opacity 三图层透明度,1.0=不透明(默认)

目录结构

仓库

Baidu_Isochrone/
├── configs/               # 配置与密钥模板(example.yaml→config.yaml、keys.txt.example→keys.txt)
├── src/baidu_isochrone/    # 核心包
│   ├── study_area/         # 范围界定(admin/buffer/bbox/file 及手绘 draw)
│   ├── api/                # 批量算路客户端(百度/腾讯)、地理编码(百度/腾讯)、配额管理、多 key 池(keys.py)
│   ├── grid.py             # 渔网生成(支持自适应密度)
│   ├── coords.py           # 坐标系转换(WGS84/GCJ-02/BD-09)
│   ├── cache.py            # 结果缓存与断点续跑
│   ├── interpolate.py      # IDW 插值 + 等时带提取(含多出发点栅格合并)
│   ├── viz.py              # leafmap 全产物交互可视化
│   ├── export.py           # GeoTIFF / GeoJSON / GPKG / shp 导出
│   ├── metadata.py         # 运行元数据留痕
│   ├── config.py           # 配置加载与校验
│   └── cli.py       # 命令行入口(run / estimate / geocode / render)
└── tests/                  # 117 项测试

单次运行(runs 目录)

runs/20260914_101530_driving_baidu/
├── config.yaml            # 配置快照(可复现;baidu_aks 已脱敏)
├── results.csv            # 点对结果(origin_id, oid, duration_min, distance_km)
├── outputs/
│   ├── study_area.*       # 研究范围
│   ├── origins.*          # 出发点
│   ├── fishnet_points.*   # 渔网格心(多出发点含 time_o0/time_o1 分钟数列)
│   ├── isochrone.*        # 等时带面(核心成果,lo/hi/label 属性;多出发点为 isochrone_o0.* 等)
│   ├── unreachable.*      # 不可达点(灰色,排查路网孤岛用)
│   ├── idw_raster.tif     # 时间表面栅格(多出发点非合并为 idw_raster_o0.tif 等)
│   └── _viz_idw.png       # 时间栅格可视化叠加图(地图"时间栅格"图层;多出发点非合并为 _viz_idw_o0.png 等)
├── map.html               # 自包含交互地图(浏览器直接打开)
└── metadata.json          # 请求时刻、策略、统计、各 AK 用量(实时路况结果的可复现性靠它)

故障自查

现象 原因与处理
日志出现 401 并发超限 QPS 设高了:调低配置 qps(个人开发者建议 3–5),工具会自动退避重试
日志出现 302 天配额超限 配置了多 AK 时会自动轮换;日志出现 所有 N 个百度 AK 均不可用 才是全部耗尽——运行自动暂停并保现场,补充新 AK 或次日 --resume 续跑
腾讯引擎日志出现 status=1023 配额/并发超限 腾讯配额或并发耗尽:配置了多 key 会自动轮换,全部耗尽才停跑;若为并发超限,调低 qps 或确认批量为一对多 1×5
腾讯引擎地名解析报 status=348 参数错误 腾讯 geocoder 要求地址至少含城市名;纯 POI 名称会自动转地点搜索兜底,兜底无果时改用含城市名的完整地址,或加 region 限定城市
地图上灰点(不可达)成堆 该区域路网孤岛(岛屿、封闭园区)或终点落在无路网处;少量灰点正常,成堆需检查范围
地名型出发点解析到城市中心/错误位置 POI 名称(如"上海新国际博览中心")会退化到城市级坐标,工具已内置地点检索兜底;若仍报"地点检索无结果",请改用完整地址或 [lon, lat] 坐标,并确认 AK 已开通"地点检索"服务
两次运行结果对不上 除 tactics=13 外结果含实时路况,核对 metadata.json 的请求时刻
KeyError / 模块导入错误 依赖未装全:pip install -r requirements.txt,或确认 conda 环境已激活
isochrone 不是内部或外部命令 未安装包本体:在激活的环境中执行 pip install .
map.html 瓦片 403 / 无底图 配置 tianditu_tk 用天地图(默认),或用 render --basemap cartodb 换 CartoDB 底图重出图
notebook 改了代码不生效 模块已被旧 kernel 缓存:重启 kernel 或用 %load_ext autoreload + %autoreload 2

License

MIT

致谢与参考

About

沿真实路网的城市等时圈 / 可达性分析工具:百度批量算路 + 腾讯距离矩阵双引擎,含地名解析、多 key 轮换、断点续跑与配额预估。

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages