gotrackit 0.2.0__tar.gz → 0.2.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- gotrackit-0.2.2/PKG-INFO +219 -0
- gotrackit-0.2.2/README.md +197 -0
- {gotrackit-0.2.0 → gotrackit-0.2.2}/pyproject.toml +1 -1
- {gotrackit-0.2.0 → gotrackit-0.2.2}/src/gotrackit/GlobalVal.py +16 -2
- {gotrackit-0.2.0 → gotrackit-0.2.2}/src/gotrackit/MapMatch.py +119 -49
- {gotrackit-0.2.0 → gotrackit-0.2.2}/src/gotrackit/gps/GpsArray.py +1 -2
- gotrackit-0.2.2/src/gotrackit/gps/GpsXfer.py +76 -0
- {gotrackit-0.2.0 → gotrackit-0.2.2}/src/gotrackit/gps/LocGps.py +33 -19
- {gotrackit-0.2.0 → gotrackit-0.2.2}/src/gotrackit/map/Link.py +10 -20
- {gotrackit-0.2.0 → gotrackit-0.2.2}/src/gotrackit/map/Net.py +243 -17
- gotrackit-0.2.2/src/gotrackit/model/Markov.py +1057 -0
- {gotrackit-0.2.0 → gotrackit-0.2.2}/src/gotrackit/netreverse/NetGen.py +2 -1
- {gotrackit-0.2.0 → gotrackit-0.2.2}/src/gotrackit/netreverse/RoadNet/optimize_net.py +1 -1
- {gotrackit-0.2.0 → gotrackit-0.2.2}/src/gotrackit/netxfer/SumoConvert.py +4 -4
- {gotrackit-0.2.0 → gotrackit-0.2.2}/src/gotrackit/solver/Viterbi.py +0 -1
- gotrackit-0.2.2/src/gotrackit/visualization.py +225 -0
- gotrackit-0.2.2/src/gotrackit.egg-info/PKG-INFO +219 -0
- {gotrackit-0.2.0 → gotrackit-0.2.2}/src/gotrackit.egg-info/SOURCES.txt +1 -0
- gotrackit-0.2.0/PKG-INFO +0 -166
- gotrackit-0.2.0/README.md +0 -144
- gotrackit-0.2.0/src/gotrackit/model/Markov.py +0 -947
- gotrackit-0.2.0/src/gotrackit/visualization.py +0 -127
- gotrackit-0.2.0/src/gotrackit.egg-info/PKG-INFO +0 -166
- {gotrackit-0.2.0 → gotrackit-0.2.2}/LICENSE +0 -0
- {gotrackit-0.2.0 → gotrackit-0.2.2}/setup.cfg +0 -0
- {gotrackit-0.2.0 → gotrackit-0.2.2}/src/__init__.py +0 -0
- {gotrackit-0.2.0 → gotrackit-0.2.2}/src/gotrackit/WrapsFunc.py +0 -0
- {gotrackit-0.2.0 → gotrackit-0.2.2}/src/gotrackit/__init__.py +0 -0
- {gotrackit-0.2.0 → gotrackit-0.2.2}/src/gotrackit/generation/GpsGen.py +0 -0
- {gotrackit-0.2.0 → gotrackit-0.2.2}/src/gotrackit/generation/__init__.py +0 -0
- {gotrackit-0.2.0 → gotrackit-0.2.2}/src/gotrackit/gps/GpsTrip.py +0 -0
- {gotrackit-0.2.0 → gotrackit-0.2.2}/src/gotrackit/gps/__init__.py +0 -0
- {gotrackit-0.2.0 → gotrackit-0.2.2}/src/gotrackit/map/Node.py +0 -0
- {gotrackit-0.2.0 → gotrackit-0.2.2}/src/gotrackit/map/__init__.py +0 -0
- {gotrackit-0.2.0 → gotrackit-0.2.2}/src/gotrackit/model/__init__.py +0 -0
- {gotrackit-0.2.0 → gotrackit-0.2.2}/src/gotrackit/netreverse/GlobalVal.py +0 -0
- {gotrackit-0.2.0 → gotrackit-0.2.2}/src/gotrackit/netreverse/Parse/__init__.py +0 -0
- {gotrackit-0.2.0 → gotrackit-0.2.2}/src/gotrackit/netreverse/Parse/gd_car_path.py +0 -0
- {gotrackit-0.2.0 → gotrackit-0.2.2}/src/gotrackit/netreverse/PublicTools/GeoProcess.py +0 -0
- {gotrackit-0.2.0 → gotrackit-0.2.2}/src/gotrackit/netreverse/PublicTools/GraphAna.py +0 -0
- {gotrackit-0.2.0 → gotrackit-0.2.2}/src/gotrackit/netreverse/PublicTools/IndexAna.py +0 -0
- {gotrackit-0.2.0 → gotrackit-0.2.2}/src/gotrackit/netreverse/PublicTools/MapProcess.py +0 -0
- {gotrackit-0.2.0 → gotrackit-0.2.2}/src/gotrackit/netreverse/PublicTools/__init__.py +0 -0
- {gotrackit-0.2.0 → gotrackit-0.2.2}/src/gotrackit/netreverse/PublicTools/od.py +0 -0
- {gotrackit-0.2.0 → gotrackit-0.2.2}/src/gotrackit/netreverse/Request/__init__.py +0 -0
- {gotrackit-0.2.0 → gotrackit-0.2.2}/src/gotrackit/netreverse/Request/api/WebApi.py +0 -0
- {gotrackit-0.2.0 → gotrackit-0.2.2}/src/gotrackit/netreverse/Request/api/__init__.py +0 -0
- {gotrackit-0.2.0 → gotrackit-0.2.2}/src/gotrackit/netreverse/Request/request_path.py +0 -0
- {gotrackit-0.2.0 → gotrackit-0.2.2}/src/gotrackit/netreverse/Request/usage/__init__.py +0 -0
- {gotrackit-0.2.0 → gotrackit-0.2.2}/src/gotrackit/netreverse/Request/usage/bd_ts.py +0 -0
- {gotrackit-0.2.0 → gotrackit-0.2.2}/src/gotrackit/netreverse/Request/usage/gd_car_path.py +0 -0
- {gotrackit-0.2.0 → gotrackit-0.2.2}/src/gotrackit/netreverse/RoadNet/DupProcess/DupLinks.py +0 -0
- {gotrackit-0.2.0 → gotrackit-0.2.2}/src/gotrackit/netreverse/RoadNet/DupProcess/__init__.py +0 -0
- {gotrackit-0.2.0 → gotrackit-0.2.2}/src/gotrackit/netreverse/RoadNet/Merge/__init__.py +0 -0
- {gotrackit-0.2.0 → gotrackit-0.2.2}/src/gotrackit/netreverse/RoadNet/Merge/get_merged_link_seq.py +0 -0
- {gotrackit-0.2.0 → gotrackit-0.2.2}/src/gotrackit/netreverse/RoadNet/Merge/limit/__init__.py +0 -0
- {gotrackit-0.2.0 → gotrackit-0.2.2}/src/gotrackit/netreverse/RoadNet/Merge/limit/attr_limit.py +0 -0
- {gotrackit-0.2.0 → gotrackit-0.2.2}/src/gotrackit/netreverse/RoadNet/Merge/limit/direction_limit.py +0 -0
- {gotrackit-0.2.0 → gotrackit-0.2.2}/src/gotrackit/netreverse/RoadNet/Merge/limit/same_head_tail_limit.py +0 -0
- {gotrackit-0.2.0 → gotrackit-0.2.2}/src/gotrackit/netreverse/RoadNet/Merge/limit/two_degrees_group.py +0 -0
- {gotrackit-0.2.0 → gotrackit-0.2.2}/src/gotrackit/netreverse/RoadNet/Merge/merge_links.py +0 -0
- {gotrackit-0.2.0 → gotrackit-0.2.2}/src/gotrackit/netreverse/RoadNet/Merge/merge_short.py +0 -0
- {gotrackit-0.2.0 → gotrackit-0.2.2}/src/gotrackit/netreverse/RoadNet/MultiCoreMerge/__init__.py +0 -0
- {gotrackit-0.2.0 → gotrackit-0.2.2}/src/gotrackit/netreverse/RoadNet/MultiCoreMerge/limit/__init__.py +0 -0
- {gotrackit-0.2.0 → gotrackit-0.2.2}/src/gotrackit/netreverse/RoadNet/MultiCoreMerge/limit/attr_limit.py +0 -0
- {gotrackit-0.2.0 → gotrackit-0.2.2}/src/gotrackit/netreverse/RoadNet/MultiCoreMerge/limit/direction_limit.py +0 -0
- {gotrackit-0.2.0 → gotrackit-0.2.2}/src/gotrackit/netreverse/RoadNet/MultiCoreMerge/limit/same_head_tail_limit.py +0 -0
- {gotrackit-0.2.0 → gotrackit-0.2.2}/src/gotrackit/netreverse/RoadNet/MultiCoreMerge/limit/two_degrees_group.py +0 -0
- {gotrackit-0.2.0 → gotrackit-0.2.2}/src/gotrackit/netreverse/RoadNet/MultiCoreMerge/merge_links_multi.py +0 -0
- {gotrackit-0.2.0 → gotrackit-0.2.2}/src/gotrackit/netreverse/RoadNet/SaveStreets/__init__.py +0 -0
- {gotrackit-0.2.0 → gotrackit-0.2.2}/src/gotrackit/netreverse/RoadNet/SaveStreets/streets.py +0 -0
- {gotrackit-0.2.0 → gotrackit-0.2.2}/src/gotrackit/netreverse/RoadNet/Split/SplitPath.py +0 -0
- {gotrackit-0.2.0 → gotrackit-0.2.2}/src/gotrackit/netreverse/RoadNet/Split/__init__.py +0 -0
- {gotrackit-0.2.0 → gotrackit-0.2.2}/src/gotrackit/netreverse/RoadNet/Tools/__init__.py +0 -0
- {gotrackit-0.2.0 → gotrackit-0.2.2}/src/gotrackit/netreverse/RoadNet/Tools/process.py +0 -0
- {gotrackit-0.2.0 → gotrackit-0.2.2}/src/gotrackit/netreverse/RoadNet/__init__.py +0 -0
- {gotrackit-0.2.0 → gotrackit-0.2.2}/src/gotrackit/netreverse/RoadNet/conn.py +0 -0
- {gotrackit-0.2.0 → gotrackit-0.2.2}/src/gotrackit/netreverse/RoadNet/increment.py +0 -0
- {gotrackit-0.2.0 → gotrackit-0.2.2}/src/gotrackit/netreverse/RoadNet/net_reverse.py +0 -0
- {gotrackit-0.2.0 → gotrackit-0.2.2}/src/gotrackit/netreverse/RoadNet/save_file.py +0 -0
- {gotrackit-0.2.0 → gotrackit-0.2.2}/src/gotrackit/netreverse/__init__.py +0 -0
- {gotrackit-0.2.0 → gotrackit-0.2.2}/src/gotrackit/netreverse/book_mark.py +0 -0
- {gotrackit-0.2.0 → gotrackit-0.2.2}/src/gotrackit/netreverse/format_od.py +0 -0
- {gotrackit-0.2.0 → gotrackit-0.2.2}/src/gotrackit/netxfer/__init__.py +0 -0
- {gotrackit-0.2.0 → gotrackit-0.2.2}/src/gotrackit/solver/__init__.py +0 -0
- {gotrackit-0.2.0 → gotrackit-0.2.2}/src/gotrackit/tools/__init__.py +0 -0
- {gotrackit-0.2.0 → gotrackit-0.2.2}/src/gotrackit/tools/coord_trans.py +0 -0
- {gotrackit-0.2.0 → gotrackit-0.2.2}/src/gotrackit/tools/geo_process.py +0 -0
- {gotrackit-0.2.0 → gotrackit-0.2.2}/src/gotrackit/tools/group.py +0 -0
- {gotrackit-0.2.0 → gotrackit-0.2.2}/src/gotrackit/tools/save_file.py +0 -0
- {gotrackit-0.2.0 → gotrackit-0.2.2}/src/gotrackit.egg-info/dependency_links.txt +0 -0
- {gotrackit-0.2.0 → gotrackit-0.2.2}/src/gotrackit.egg-info/requires.txt +0 -0
- {gotrackit-0.2.0 → gotrackit-0.2.2}/src/gotrackit.egg-info/top_level.txt +0 -0
gotrackit-0.2.2/PKG-INFO
ADDED
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
Metadata-Version: 2.1
|
|
2
|
+
Name: gotrackit
|
|
3
|
+
Version: 0.2.2
|
|
4
|
+
Summary: A Python Package for Map Matching Algorithm Based on Hidden Markov Model
|
|
5
|
+
Author-email: Kai Tang <794568794@qq.com>
|
|
6
|
+
License: LICENCE
|
|
7
|
+
Project-URL: Homepage, https://github.com/zdsjjtTLG/TrackIt
|
|
8
|
+
Keywords: HMM,MapMatching,Net,Link,Node,Hidden Markov Model,Algorithm
|
|
9
|
+
Classifier: Programming Language :: Python :: 3
|
|
10
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
11
|
+
Classifier: Operating System :: OS Independent
|
|
12
|
+
Requires-Python: >=3.8
|
|
13
|
+
Description-Content-Type: text/markdown
|
|
14
|
+
License-File: LICENSE
|
|
15
|
+
Requires-Dist: geopandas>=0.14.1
|
|
16
|
+
Requires-Dist: shapely
|
|
17
|
+
Requires-Dist: networkx
|
|
18
|
+
Requires-Dist: pandas
|
|
19
|
+
Requires-Dist: numpy
|
|
20
|
+
Requires-Dist: keplergl
|
|
21
|
+
Requires-Dist: geopy
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
<div align="center">
|
|
26
|
+
<img src="docs/_static/images/gotrackit.png" />
|
|
27
|
+
</div>
|
|
28
|
+
|
|
29
|
+
<br>
|
|
30
|
+
|
|
31
|
+
<div align=center>
|
|
32
|
+
|
|
33
|
+
[](https://gotrackit.readthedocs.io/en/latest/?badge=latest)
|
|
34
|
+

|
|
35
|
+

|
|
36
|
+

|
|
37
|
+

|
|
38
|
+
|
|
39
|
+
~ 一个包搞定:路网获取、路网优化、宏微观地图匹配、匹配可视化、问题路段快速定位 ~
|
|
40
|
+
|
|
41
|
+
唐铠, 794568794@qq.com, tangkai@zhechengdata.com
|
|
42
|
+
</div>
|
|
43
|
+
<br>
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
**版本状态:04.27即将更新更新: v0.2.2**
|
|
48
|
+
|
|
49
|
+
更新命令:pip install --upgrade -i https://pypi.org/simple/ gotrackit
|
|
50
|
+
|
|
51
|
+
- 向量化改造, 且引入FMM(Fast Map Matching)路径预存储机制, 大规模路网匹配效率大幅度提升
|
|
52
|
+
|
|
53
|
+
- 完善报错机制, 遇到GPS脏数据不再报错停止, 而是跳过, 并且在所有的agents计算完毕后输出有问题的agent编号
|
|
54
|
+
|
|
55
|
+
- BUG修复
|
|
56
|
+
|
|
57
|
+
<br>
|
|
58
|
+
|
|
59
|
+
<div align=center>
|
|
60
|
+
~ v0.2.2效率将大幅度提升 ~
|
|
61
|
+
</div>
|
|
62
|
+
|
|
63
|
+
<br>
|
|
64
|
+
|
|
65
|
+
与上一版本对比:
|
|
66
|
+
|
|
67
|
+
| 样例数据 | 有效的GPS点数 | top_k(k邻近候选参数) | gps_buffer(临域半径) | 候选路段条数 | 状态转移次数 | v0.2.1版解算时间 | v0.2.2版解算时间 |
|
|
68
|
+
|----------------|----------|----------------|------------------|---------|------------|-------------|-----------|
|
|
69
|
+
| 1辆车,深圳稀疏轨迹点样例1 | 190 | 60 | 500m | 10615 | 629788次 | 28秒 | **3.3秒** |
|
|
70
|
+
| 1辆车,深圳稀疏轨迹点样例2 | 400 | 20 | 120m | 5137 | 82006次 | 7.8秒 | **1.7秒** |
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
v0.2.2多核效率对比:
|
|
74
|
+
|
|
75
|
+
基于上表深圳稀疏轨迹点样例2,我们将他复制150份,进行多核测试,可以看到到6核时, 效率已经不再提升,最快96s解算完150条轨迹,平均每条轨迹0.64s,相较于1.7s再次提升了60%,在车辆数较多时,多核的效率提升很明显。
|
|
76
|
+
|
|
77
|
+
| 样例数据 | 有效的GPS点数 | top_k | gps_buffer | 候选路段条数 | 状态转移次数 | v0.2.2解算时间 |
|
|
78
|
+
|-------------------------------------------|----------|----------------|------------------|-----|--------|------------|
|
|
79
|
+
| 150辆车的GPS轨迹(单核串行,子图搜索,有构建子图的额外开销,提前预计算路径) | 6w | 20 | 120m | 75W | 1200W次 | 300.0秒 |
|
|
80
|
+
| 150辆车的GPS轨迹(3核并行,子图搜索,有构建子图的额外开销,提前预计算路径) | 6w | 20 | 120m | 75W | 1200W次 | 139.6秒 |
|
|
81
|
+
| 150辆车的GPS轨迹(3核并行,全图搜索,无构建子图的额外开销,提前预计算路径) | 6w | 20 | 120m | 75W | 1200W次 | 120.3秒 |
|
|
82
|
+
| 150辆车的GPS轨迹(4核并行,全图搜索,无构建子图的额外开销,提前预计算路径) | 6w | 20 | 120m | 75W | 1200W次 | 104.9秒 |
|
|
83
|
+
| 150辆车的GPS轨迹(5核并行,全图搜索,无构建子图的额外开销,提前预计算路径) | 6w | 20 | 120m | 75W | 1200W次 | 96.4秒 |
|
|
84
|
+
| 150辆车的GPS轨迹(6核并行,全图搜索,无构建子图的额外开销,提前预计算路径) | 6w | 20 | 120m | 75W | 1200W次 | 97.5秒 |
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
<br>
|
|
88
|
+
|
|
89
|
+
<div align=center>
|
|
90
|
+
~ 稀疏轨迹匹配与路径补全 ~
|
|
91
|
+
</div>
|
|
92
|
+
|
|
93
|
+
<br>
|
|
94
|
+
|
|
95
|
+
深圳稀疏轨迹点样例1:
|
|
96
|
+
<div align="center">
|
|
97
|
+
<img src="docs/_static/images/极稀疏轨迹匹配.gif" />
|
|
98
|
+
</div>
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
<div align="center">
|
|
102
|
+
<img src="docs/_static/images/匹配动画样例3.gif" />
|
|
103
|
+
</div>
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
<br>
|
|
107
|
+
|
|
108
|
+
<div align=center>
|
|
109
|
+
~ 常规匹配 ~
|
|
110
|
+
</div>
|
|
111
|
+
|
|
112
|
+
<br>
|
|
113
|
+
|
|
114
|
+
<div align="center">
|
|
115
|
+
<img src="docs/_static/images/匹配动画样例1.gif" />
|
|
116
|
+
</div>
|
|
117
|
+
|
|
118
|
+
<div align="center">
|
|
119
|
+
<img src="docs/_static/images/匹配动画样例2.gif" />
|
|
120
|
+
</div>
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
<div align="center">
|
|
124
|
+
<img src="docs/_static/images/匹配动画样例4.gif" />
|
|
125
|
+
</div>
|
|
126
|
+
|
|
127
|
+
<div align="center">
|
|
128
|
+
<img src="docs/_static/images/geojson_res.jpg" />
|
|
129
|
+
</div>
|
|
130
|
+
|
|
131
|
+
<br>
|
|
132
|
+
|
|
133
|
+
<div align=center>
|
|
134
|
+
~ 用户交流群, 遇到BUG无法解决请进群交流,别忘了给项目一颗star哦, 您的支持是我迭代的动力 ~
|
|
135
|
+
</div>
|
|
136
|
+
|
|
137
|
+
<br>
|
|
138
|
+
|
|
139
|
+
<div align="center">
|
|
140
|
+
<img src="docs/_static/images/wxq.jpg" />
|
|
141
|
+
</div>
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
## 1. 简介
|
|
145
|
+
本地图匹配包基于隐马尔可夫模型(HMM)实现了连续GPS点位的概率建模,利用这个包可以轻松对GPS数据进行地图匹配,本开源包的特点如下:
|
|
146
|
+
|
|
147
|
+
**数据无忧**
|
|
148
|
+
- 提供路网生产模块以及路网优化接口,您不需要准备任何路网和GPS数据即可玩转地图匹配;
|
|
149
|
+
- 提供GPS样例数据生产模块,解决没有GPS数据的难题;
|
|
150
|
+
- 提供GPS数据清洗接口,包括滑动窗口降噪、数据降频。
|
|
151
|
+
|
|
152
|
+
**文档齐全**
|
|
153
|
+
|
|
154
|
+
- 中文文档,有详细的操作指引;
|
|
155
|
+
- 算法原理讲解部分不涉及复杂的公式推导,使用动画形式剖析算法原理,简洁明了。
|
|
156
|
+
|
|
157
|
+
**匹配结果自动优化**
|
|
158
|
+
- 对基于HMM匹配的初步路径进行了优化,对于不连通的位置会自动补路,对于实际路网不连通的位置会输出警告,方便用户检查路网。
|
|
159
|
+
|
|
160
|
+
|
|
161
|
+
|
|
162
|
+
### 1.1. 如何安装gotrackit
|
|
163
|
+
|
|
164
|
+
#### __所需前置依赖__
|
|
165
|
+
|
|
166
|
+
- geopy(2.4.1)
|
|
167
|
+
- gdal(3.4.3)
|
|
168
|
+
- shapely(2.0.3)
|
|
169
|
+
- fiona(1.9.5)
|
|
170
|
+
- pyproj(3.6.1)
|
|
171
|
+
- geopandas(0.14.3)
|
|
172
|
+
- networkx(3.2.1)
|
|
173
|
+
- pandas(2.0.3)
|
|
174
|
+
- numpy(1.26.2)
|
|
175
|
+
- keplergl(0.3.2)
|
|
176
|
+
|
|
177
|
+
括号中为作者使用版本(基于python3.11), 仅供参考
|
|
178
|
+
|
|
179
|
+
#### __使用pip安装__
|
|
180
|
+
|
|
181
|
+
安装:
|
|
182
|
+
|
|
183
|
+
``` shell
|
|
184
|
+
pip install -i https://pypi.org/simple/ gotrackit
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
更新:
|
|
188
|
+
``` shell
|
|
189
|
+
pip install --upgrade -i https://pypi.org/simple/ gotrackit
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
### 1.2 用户手册与视频教程
|
|
193
|
+
|
|
194
|
+
[用户手册](https://gotrackit.readthedocs.io/en/latest/)
|
|
195
|
+
|
|
196
|
+
[基于隐马尔可夫模型(HMM)的地图匹配算法动画版!学不会你来打我!](https://www.bilibili.com/video/BV1gQ4y1w7dC)
|
|
197
|
+
|
|
198
|
+
[一个python包搞定路网获取+地图匹配!](https://www.bilibili.com/video/BV1nC411z7Vg)
|
|
199
|
+
|
|
200
|
+
[gotrackit地图匹配包参数详解与问题排查](https://www.bilibili.com/video/BV1qK421Y7hV)
|
|
201
|
+
|
|
202
|
+
[QGIS路网拓扑显示、底图加载、样式复用、map保存](https://www.bilibili.com/video/BV1Sq421F7QX)
|
|
203
|
+
|
|
204
|
+
|
|
205
|
+
## 2. 地图匹配问题
|
|
206
|
+
|
|
207
|
+

|
|
208
|
+
|
|
209
|
+

|
|
210
|
+
|
|
211
|
+
__如何依据GPS数据推算车辆的实际路径?__
|
|
212
|
+
|
|
213
|
+

|
|
214
|
+
|
|
215
|
+

|
|
216
|
+
|
|
217
|
+

|
|
218
|
+
|
|
219
|
+

|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
<div align="center">
|
|
4
|
+
<img src="docs/_static/images/gotrackit.png" />
|
|
5
|
+
</div>
|
|
6
|
+
|
|
7
|
+
<br>
|
|
8
|
+
|
|
9
|
+
<div align=center>
|
|
10
|
+
|
|
11
|
+
[](https://gotrackit.readthedocs.io/en/latest/?badge=latest)
|
|
12
|
+

|
|
13
|
+

|
|
14
|
+

|
|
15
|
+

|
|
16
|
+
|
|
17
|
+
~ 一个包搞定:路网获取、路网优化、宏微观地图匹配、匹配可视化、问题路段快速定位 ~
|
|
18
|
+
|
|
19
|
+
唐铠, 794568794@qq.com, tangkai@zhechengdata.com
|
|
20
|
+
</div>
|
|
21
|
+
<br>
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
**版本状态:04.27即将更新更新: v0.2.2**
|
|
26
|
+
|
|
27
|
+
更新命令:pip install --upgrade -i https://pypi.org/simple/ gotrackit
|
|
28
|
+
|
|
29
|
+
- 向量化改造, 且引入FMM(Fast Map Matching)路径预存储机制, 大规模路网匹配效率大幅度提升
|
|
30
|
+
|
|
31
|
+
- 完善报错机制, 遇到GPS脏数据不再报错停止, 而是跳过, 并且在所有的agents计算完毕后输出有问题的agent编号
|
|
32
|
+
|
|
33
|
+
- BUG修复
|
|
34
|
+
|
|
35
|
+
<br>
|
|
36
|
+
|
|
37
|
+
<div align=center>
|
|
38
|
+
~ v0.2.2效率将大幅度提升 ~
|
|
39
|
+
</div>
|
|
40
|
+
|
|
41
|
+
<br>
|
|
42
|
+
|
|
43
|
+
与上一版本对比:
|
|
44
|
+
|
|
45
|
+
| 样例数据 | 有效的GPS点数 | top_k(k邻近候选参数) | gps_buffer(临域半径) | 候选路段条数 | 状态转移次数 | v0.2.1版解算时间 | v0.2.2版解算时间 |
|
|
46
|
+
|----------------|----------|----------------|------------------|---------|------------|-------------|-----------|
|
|
47
|
+
| 1辆车,深圳稀疏轨迹点样例1 | 190 | 60 | 500m | 10615 | 629788次 | 28秒 | **3.3秒** |
|
|
48
|
+
| 1辆车,深圳稀疏轨迹点样例2 | 400 | 20 | 120m | 5137 | 82006次 | 7.8秒 | **1.7秒** |
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
v0.2.2多核效率对比:
|
|
52
|
+
|
|
53
|
+
基于上表深圳稀疏轨迹点样例2,我们将他复制150份,进行多核测试,可以看到到6核时, 效率已经不再提升,最快96s解算完150条轨迹,平均每条轨迹0.64s,相较于1.7s再次提升了60%,在车辆数较多时,多核的效率提升很明显。
|
|
54
|
+
|
|
55
|
+
| 样例数据 | 有效的GPS点数 | top_k | gps_buffer | 候选路段条数 | 状态转移次数 | v0.2.2解算时间 |
|
|
56
|
+
|-------------------------------------------|----------|----------------|------------------|-----|--------|------------|
|
|
57
|
+
| 150辆车的GPS轨迹(单核串行,子图搜索,有构建子图的额外开销,提前预计算路径) | 6w | 20 | 120m | 75W | 1200W次 | 300.0秒 |
|
|
58
|
+
| 150辆车的GPS轨迹(3核并行,子图搜索,有构建子图的额外开销,提前预计算路径) | 6w | 20 | 120m | 75W | 1200W次 | 139.6秒 |
|
|
59
|
+
| 150辆车的GPS轨迹(3核并行,全图搜索,无构建子图的额外开销,提前预计算路径) | 6w | 20 | 120m | 75W | 1200W次 | 120.3秒 |
|
|
60
|
+
| 150辆车的GPS轨迹(4核并行,全图搜索,无构建子图的额外开销,提前预计算路径) | 6w | 20 | 120m | 75W | 1200W次 | 104.9秒 |
|
|
61
|
+
| 150辆车的GPS轨迹(5核并行,全图搜索,无构建子图的额外开销,提前预计算路径) | 6w | 20 | 120m | 75W | 1200W次 | 96.4秒 |
|
|
62
|
+
| 150辆车的GPS轨迹(6核并行,全图搜索,无构建子图的额外开销,提前预计算路径) | 6w | 20 | 120m | 75W | 1200W次 | 97.5秒 |
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
<br>
|
|
66
|
+
|
|
67
|
+
<div align=center>
|
|
68
|
+
~ 稀疏轨迹匹配与路径补全 ~
|
|
69
|
+
</div>
|
|
70
|
+
|
|
71
|
+
<br>
|
|
72
|
+
|
|
73
|
+
深圳稀疏轨迹点样例1:
|
|
74
|
+
<div align="center">
|
|
75
|
+
<img src="docs/_static/images/极稀疏轨迹匹配.gif" />
|
|
76
|
+
</div>
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
<div align="center">
|
|
80
|
+
<img src="docs/_static/images/匹配动画样例3.gif" />
|
|
81
|
+
</div>
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
<br>
|
|
85
|
+
|
|
86
|
+
<div align=center>
|
|
87
|
+
~ 常规匹配 ~
|
|
88
|
+
</div>
|
|
89
|
+
|
|
90
|
+
<br>
|
|
91
|
+
|
|
92
|
+
<div align="center">
|
|
93
|
+
<img src="docs/_static/images/匹配动画样例1.gif" />
|
|
94
|
+
</div>
|
|
95
|
+
|
|
96
|
+
<div align="center">
|
|
97
|
+
<img src="docs/_static/images/匹配动画样例2.gif" />
|
|
98
|
+
</div>
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
<div align="center">
|
|
102
|
+
<img src="docs/_static/images/匹配动画样例4.gif" />
|
|
103
|
+
</div>
|
|
104
|
+
|
|
105
|
+
<div align="center">
|
|
106
|
+
<img src="docs/_static/images/geojson_res.jpg" />
|
|
107
|
+
</div>
|
|
108
|
+
|
|
109
|
+
<br>
|
|
110
|
+
|
|
111
|
+
<div align=center>
|
|
112
|
+
~ 用户交流群, 遇到BUG无法解决请进群交流,别忘了给项目一颗star哦, 您的支持是我迭代的动力 ~
|
|
113
|
+
</div>
|
|
114
|
+
|
|
115
|
+
<br>
|
|
116
|
+
|
|
117
|
+
<div align="center">
|
|
118
|
+
<img src="docs/_static/images/wxq.jpg" />
|
|
119
|
+
</div>
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
## 1. 简介
|
|
123
|
+
本地图匹配包基于隐马尔可夫模型(HMM)实现了连续GPS点位的概率建模,利用这个包可以轻松对GPS数据进行地图匹配,本开源包的特点如下:
|
|
124
|
+
|
|
125
|
+
**数据无忧**
|
|
126
|
+
- 提供路网生产模块以及路网优化接口,您不需要准备任何路网和GPS数据即可玩转地图匹配;
|
|
127
|
+
- 提供GPS样例数据生产模块,解决没有GPS数据的难题;
|
|
128
|
+
- 提供GPS数据清洗接口,包括滑动窗口降噪、数据降频。
|
|
129
|
+
|
|
130
|
+
**文档齐全**
|
|
131
|
+
|
|
132
|
+
- 中文文档,有详细的操作指引;
|
|
133
|
+
- 算法原理讲解部分不涉及复杂的公式推导,使用动画形式剖析算法原理,简洁明了。
|
|
134
|
+
|
|
135
|
+
**匹配结果自动优化**
|
|
136
|
+
- 对基于HMM匹配的初步路径进行了优化,对于不连通的位置会自动补路,对于实际路网不连通的位置会输出警告,方便用户检查路网。
|
|
137
|
+
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
### 1.1. 如何安装gotrackit
|
|
141
|
+
|
|
142
|
+
#### __所需前置依赖__
|
|
143
|
+
|
|
144
|
+
- geopy(2.4.1)
|
|
145
|
+
- gdal(3.4.3)
|
|
146
|
+
- shapely(2.0.3)
|
|
147
|
+
- fiona(1.9.5)
|
|
148
|
+
- pyproj(3.6.1)
|
|
149
|
+
- geopandas(0.14.3)
|
|
150
|
+
- networkx(3.2.1)
|
|
151
|
+
- pandas(2.0.3)
|
|
152
|
+
- numpy(1.26.2)
|
|
153
|
+
- keplergl(0.3.2)
|
|
154
|
+
|
|
155
|
+
括号中为作者使用版本(基于python3.11), 仅供参考
|
|
156
|
+
|
|
157
|
+
#### __使用pip安装__
|
|
158
|
+
|
|
159
|
+
安装:
|
|
160
|
+
|
|
161
|
+
``` shell
|
|
162
|
+
pip install -i https://pypi.org/simple/ gotrackit
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
更新:
|
|
166
|
+
``` shell
|
|
167
|
+
pip install --upgrade -i https://pypi.org/simple/ gotrackit
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
### 1.2 用户手册与视频教程
|
|
171
|
+
|
|
172
|
+
[用户手册](https://gotrackit.readthedocs.io/en/latest/)
|
|
173
|
+
|
|
174
|
+
[基于隐马尔可夫模型(HMM)的地图匹配算法动画版!学不会你来打我!](https://www.bilibili.com/video/BV1gQ4y1w7dC)
|
|
175
|
+
|
|
176
|
+
[一个python包搞定路网获取+地图匹配!](https://www.bilibili.com/video/BV1nC411z7Vg)
|
|
177
|
+
|
|
178
|
+
[gotrackit地图匹配包参数详解与问题排查](https://www.bilibili.com/video/BV1qK421Y7hV)
|
|
179
|
+
|
|
180
|
+
[QGIS路网拓扑显示、底图加载、样式复用、map保存](https://www.bilibili.com/video/BV1Sq421F7QX)
|
|
181
|
+
|
|
182
|
+
|
|
183
|
+
## 2. 地图匹配问题
|
|
184
|
+
|
|
185
|
+

|
|
186
|
+
|
|
187
|
+

|
|
188
|
+
|
|
189
|
+
__如何依据GPS数据推算车辆的实际路径?__
|
|
190
|
+
|
|
191
|
+

|
|
192
|
+
|
|
193
|
+

|
|
194
|
+
|
|
195
|
+

|
|
196
|
+
|
|
197
|
+

|
|
@@ -18,9 +18,13 @@ class NetField(object):
|
|
|
18
18
|
self.LENGTH_FIELD = 'length'
|
|
19
19
|
self.GEOMETRY_FIELD = 'geometry'
|
|
20
20
|
self.NODE_ID_FIELD = 'node_id'
|
|
21
|
-
self.
|
|
21
|
+
self.S_NODE = 'o_node'
|
|
22
|
+
self.T_NODE = 'd_node'
|
|
23
|
+
self.NODE_PATH_FIELD = 'path'
|
|
22
24
|
self.COST_FIELD = 'cost'
|
|
23
25
|
self.LINK_VEC_FIELD = 'dir_vec'
|
|
26
|
+
self.SEG_COUNT = 'seg_count'
|
|
27
|
+
self.SEG_ACCU_LENGTH = 'seg_accu_length'
|
|
24
28
|
|
|
25
29
|
class GpsField(object):
|
|
26
30
|
"""gps数据字段"""
|
|
@@ -55,6 +59,15 @@ class GpsField(object):
|
|
|
55
59
|
self.DIFF_VEC = 'diff_vec'
|
|
56
60
|
|
|
57
61
|
|
|
62
|
+
class RouteField(object):
|
|
63
|
+
""""""
|
|
64
|
+
def __init__(self):
|
|
65
|
+
self.PATH_ID_FIELD = 'path_id'
|
|
66
|
+
self.TIME_COST_FIELD = 'time_cost'
|
|
67
|
+
self.SEQ_FIELD = 'seq'
|
|
68
|
+
self.O_TIME_FIELD = 'o_time'
|
|
69
|
+
|
|
70
|
+
|
|
58
71
|
class MarkovField(object):
|
|
59
72
|
"""HMM模型字段"""
|
|
60
73
|
def __init__(self):
|
|
@@ -69,7 +82,7 @@ class MarkovField(object):
|
|
|
69
82
|
self.STRAIGHT_LENGTH = 'straight_l'
|
|
70
83
|
self.DIS_GAP = 'dis_gap'
|
|
71
84
|
self.PRJ_L = 'prj_dis'
|
|
72
|
-
self.PRJ_GEO = '
|
|
85
|
+
self.PRJ_GEO = 'prj_p'
|
|
73
86
|
self.DIS_TO_NEXT = 'dis_to_next'
|
|
74
87
|
self.HEADING_GAP = 'heading_gap'
|
|
75
88
|
|
|
@@ -382,6 +395,7 @@ class KeplerConfig(object):
|
|
|
382
395
|
|
|
383
396
|
self.BASE_LINK_NAME = 'base_link'
|
|
384
397
|
self.BASE_NODE_NAME = 'base_node'
|
|
398
|
+
self.ERROR_XFER = 'error_xfer'
|
|
385
399
|
self.MIX_NAME = 'mix'
|
|
386
400
|
self.GPS_NAME = 'gps'
|
|
387
401
|
self.MATCH_LINK_NAME = 'match_link'
|