Refer #
- 轨迹数据集
- 城市拓扑、路网/POI/城市边界
- 城市拓扑
- OSM API (OpenStreetMap)
- 本质上
osmnx
和overpass API
都是使用OSM的api获取 osmnx
可以用于获取最新时间的路网数据- Overpass API Overpass 官网 | Overpass by Private.coffee
- 本质上
- OSM历史数据服务
- GeoFabrik 下载指定历史时间的城市路网数据(shp格式,由osm格式转换,路网数据丢失uv信息,当然包含很多富余数据);同时提供osm.pbf格式的osm压缩数据,没有丢失信息,但是格式转换相当麻烦。
- Fabrik上下载的shp转OSM数据介绍及下载 - 百里屠苏top - 博客园
- 城市边界
osmnx
直接获取- GADM,提供全球行政区边界数据的网站,同时也可以下载路网数据。它支持按国家或地区单独索引和下载。不支持历史数据下载。
- level0为国家信息,level1为省份边界信息,level2为城市边界信息,level3为县级信息
- 不能单shp文件读取
- GeoFabrik可以获取部分
- shapefile
- 路网清洗
数据集 #
我们能拿到的数据集分为两种:
- 最原始的数据,轨迹数据以GPS点原始信息保留(lng,lat,timestamp,driver_id,user_id or order_id)
- 论文二次处理的数据集,轨迹数据的GPS点原始信息多半在经过降采样/地图匹配转换后丢失,不一定保留。
- 恢复GPS点粒度的POI信息困难,只能得到路段粒度的POI信息
城市拓扑、路网/POI/城市边界 #
目前不管是 osmnx
还是 overpassApi
,简单的获取城市的boundary体验还不错,但是在框定较大范围的bbox或者boundary后获取数据的体验都不是很好,常给你报 ConnectTimeout
错误。
作为openstreetmap的替代平台,GeoFabrik有几个优点:
- 支持下载历史数据,最大限度的保留城市拓扑和poi信息
- 支持下载部分城市的边界范围数据 缺点就是一般只能下载国家级别的路网数据,需要你再框一次才能得到城市路网。
关于其他可见 参考 。
shapefile #
包含这几种后缀的数据
- .shp:几何数据
- .shx:几何索引
- .dbf:属性数据
- .prj:坐标系信息
- .cpg:字符编码
shp方面包含如下:
- Point
- gis_osm_places_free_1:包含城市、小镇、村庄等行政或聚居点的位置信息。
- 因数据而异,可能没有包含所有的place信息。
- gis_osm_pois_free_1:兴趣点(Points of Interest,POI)数据,如餐厅、商店、景点等。
- gis_osm_traffic_free_1:交通相关设施,如交通信号灯、停车标志、人行横道等。
- gis_osm_places_free_1:包含城市、小镇、村庄等行政或聚居点的位置信息。
- Line
- gis_osm_roads_free_1:道路网络数据,包括高速公路、主干道、街道、小路、自行车道、人行道等。
- PolyGon
- gis_osm_places_a_free_1:地点的多边形数据,如城市、小镇、村庄等的边界。
- gis_osm_pois_a_free_1:兴趣点的多边形数据。
需要注意的是,road_shapefile中包含大量的冗余数据(没有必要添加的路段类型fclass),拿porto市举例:


对比libcity处理的porto市路网数据,可以发现现有路网中存在许多冗余数据(比如porto市的最南边),所以需要进行路网数据的清洗。
因为每个国家的情况不同,国内外的路段保留类型不建议使用相同的策略,对于国外的路网数据,保留如下字段:
reserved_fclass = {"motorway": 0, "trunk": 1, "primary": 2, "secondary": 3, "tertiary": 4, "unclassified": 5, "residential": 6, "motorway_link": 7, "trunk_link": 8, "primary_link": 9, "secondary_link": 10, "tertiary_link": 11, "living_street": 12, "road": 13}
过滤后得到的路网稍显合理,但是仍需要进一步处理。

路网清洗 #
恢复uv信息 #
建图不光需要路网的线层信息,同样需要点层信息,这里的点指的是路段OD、uv。 osm数据有uv字段,但是从GeoFabrik上下载的shapefile丢失这部分数据,所以只能通过取路段的OD来作为uv。
原始road shapefile(统一WGS-84,EPSG:4326坐标系操作)
- 提取路段OD为uv
- 映射
set(uv)
建立点层 - 建立基础的点层和线层
修复路网 #
路网在恢复uv信息后需要清理环路、自边、自相交、联通性问题,同时进行拓扑优化和路网重塑,规整线层和点层。
- 构建点层信息
- 自己构建:使用在恢复uv信息中得到的node构建点层
- GoTrakIt:使用第三方包从线层构建点层
- 清理线层的环路、自边、自相交
- 处理标准路网的连通性问题
- 重映射点层
- 最后对路网做拓扑优化和路网重塑
最后得到构建路网的必须数据: road
和 node
,即 rel
和 geo
。
轨迹清洗 #
- 行程切分
- 停留点删除
- 轨迹点上下采样
- 滑动窗口平均/卡尔曼滤波平滑
地图匹配 #
- FMM:fmm-py3: FMM for python3
- ST-MapMatching:wenke727/ST-MapMatching: 基于时间和空间特性的全局地图匹配算法,基础路网可根据 bbox 下载并处理得到
- GoTrackIt:zdsjjtTLG/TrackIt: Map Matching Python Package Based on Hidden Markov Model(HMM)
POI k近邻 #
- 可以获取 Point和Polygon类型的POI数据(点、多边形面)
- 处理时为了方便起见,可以统一将坐标系投影到平面坐标系,作k近邻计算。
- 见仁见智:路段 k近邻POI/GPS k近邻POI
- k近邻可以在collate_fn中实现