1.什么是Graphhopper
GraphHopper是有Java语言编写,可基于内存的高效导航引擎,默认使用OSM和GTFS数据,也可导入其他的数据源。支持CH(Contraction Hierarchies)、A*、Dijkstra等导航算法。
2.Graphhopper的特点
- 算法:
- Dijkstra算法运行得较慢,但确实能保证找到一条最短路径
- 最佳优先搜索(BFS)运行得较快,但是它找到的路径不一定是最好的
- A算法把启发式方法(heuristic approaches)如BFS,和常规方法如Dijsktra算法结合在一起的算法。A是路径搜索中最受欢迎的选择,因为它相当灵活,并且能用于多种多样的情形之中。A潜在地搜索图中一个很大的区域。和Dijkstra一样,A能用于搜索最短路径。和BFS一样,A*能用启发式函数(注:原文为heuristic)引导它自己。在简单的情况中,它和BFS一样快
- 开源:代码开源,可本地部署服务,利用OSM实现离线路径导航,便于构建自己的服务。后期如果考虑对算法进行改进的话,扩展空间比较大;
- 效率:相比较于调用远程服务,调用本地路径规划服务会更快。路径寻找比谷歌地图还要快,与OSRM速度相当(350km路径,平均时间0.8s(0.4s-1.2s));
- 成熟度:已存在一些开源版本的成功运用,且有官方网站、论坛等;
功能:导航系统的核心功能是根据地理数据,利用算法进行路径规划导航。Graphhopper实现了路径导航功能,并且支持中文。
3.搭建本地Graphhopper
前提
安装JDK,且版本>=1.8
- 安装maven
提前下载osm的离线地图数据,我下载的是摩尔达维亚的数据,因为小。下载地址:https://download.geofabrik.de/europe/moldova-latest.osm.pbf
项目地址
- 点击clone,下载源码
- 解压,项目目录如图
下载地址
https://github.com/graphhopper/graphhopper/releases
选择对应版本jar包即可
启动项目
- 新建graphhopper-example文件夹
- 将下载好的jar包,osm离线数据文件,以及源代码中的config-example.yml全部放到graphhopper-example文件夹下
CMD打开控制台,输入:
java -Ddw.graphhopper.datareader.file=moldova-latest.osm.pbf -jar graphhopper-web-6.0.jar server config-example.yml
如图,graphhopper启动成功
- 浏览器输入:http://localhost:8989/,如下图,地图数据已渲染成功
- 在左侧输入起点以及终点之后,就可以在地图上将最短路径展示出来了
- 浏览器输入:http://localhost:8989/route?point=47.915115,27.344971&point=48.03157,28.242187&type=json&locale=zh-CN&vehicle=car&weighting=fastest&points_encoded=false
route路由返回结果如下:包含了当前路径中涉及到的所有经纬度,总路程(单位m)和总耗时。以及每一段路径的总路程,总耗时等信息
{
"hints":{
"visited_nodes.sum":80,
"visited_nodes.average":80
},
"info":{
"copyrights":[
"GraphHopper",
"OpenStreetMap contributors"
],
"took":4
},
"paths":[
{
"distance":86342.661,
"weight":5167.44077,
"time":5167435,
"transfers":0,
"points_encoded":false,
"bbox":[
27.342371,
47.916198,
28.230925,
48.13333
],
"points":{
"type":"LineString",
"coordinates":[
[
27.342371,
47.916198
],
[
27.343725,
47.917631
],
[
27.345368,
47.919247
],
[
27.345611,
47.919519
],
[
27.345853,
47.91981
],
[
27.34621,
47.920298
],
[
27.347056,
47.921654
],
[
27.347402,
47.922077
],
[
27.347582,
47.922246
],
[
27.348068,
47.922613
],
[
27.35299,
47.925535
],
[
27.353992,
47.926156
],
[
27.354899,
47.926778
],
[
27.355298,
47.927108
],
[
27.355905,
47.927695
],
[
27.357022,
47.92883
],
[
27.361427,
47.933177
],
[
27.362308,
47.934156
],
[
27.362598,
47.934432
],
[
27.36418,
47.935818
],
[
27.366243,
47.937507
],
[
27.370841,
47.941206
],
[
27.371247,
47.94149
],
[
27.371945,
47.941901
],
[
27.372821,
47.942332
],
[
27.373234,
47.942505
],
[
27.373524,
47.942606
],
[
27.373878,
47.9427
],
[
27.374163,
47.942757
],
[
27.37469,
47.942813
],
[
27.375094,
47.942803
],
[
27.375543,
47.942759
],
[
27.3761,
47.942657
],
[
27.379429,
47.941848
],
[
27.380625,
47.94154
],
[
27.381335,
47.941314
],
[
27.381633,
47.941183
],
[
27.386686,
47.938227
],
[
27.38733,
47.937827
],
[
27.387522,
47.937695
],
[
27.389719,
47.935862
],
[
27.390133,
47.935547
],
[
27.39043,
47.93537
],
[
27.390699,
47.935252
],
[
27.391001,
47.93515
],
[
27.391398,
47.935061
],
[
27.391704,
47.935036
],
[
27.392066,
47.935044
],
[
27.392322,
47.935065
],
[
27.392737,
47.935127
],
[
27.392981,
47.935188
],
[
27.398872,
47.937047
],
[
27.399188,
47.937166
],
[
27.410609,
47.942347
],
[
27.416837,
47.945201
],
[
27.421101,
47.947198
],
[
27.422488,
47.94775
],
[
27.422946,
47.947883
],
[
27.423272,
47.94794
],
[
27.423588,
47.947965
],
[
27.423919,
47.947967
],
[
27.424455,
47.947942
],
[
27.429978,
47.94755
],
[
27.430717,
47.947449
],
[
27.430968,
47.947389
],
[
27.431554,
47.947209
],
[
27.432351,
47.946903
],
[
27.434953,
47.945757
],
[
27.435305,
47.945627
],
[
27.435793,
47.945489
],
[
27.436461,
47.94538
],
[
27.437143,
47.945341
],
[
27.437869,
47.945364
],
[
27.43836,
47.945412
],
[
27.438687,
47.945467
],
[
27.43922,
47.945629
],
[
27.442669,
47.946806
],
[
27.445019,
47.94758
],
[
27.450009,
47.949145
],
[
27.451202,
47.949486
],
[
27.451381,
47.949528
],
[
27.451894,
47.949611
],
[
27.452529,
47.949661
],
[
27.454234,
47.94977
],
[
27.455266,
47.949808
],
[
27.456378,
47.949743
],
[
27.458375,
47.949594
],
[
27.45906,
47.949518
],
[
27.473245,
47.946048
],
[
27.473906,
47.945922
],
[
27.475479,
47.945694
],
[
27.47577,
47.945666
],
[
27.47669,
47.945636
],
[
27.477346,
47.945644
],
[
27.478297,
47.945684
],
[
27.479183,
47.945754
],
[
27.479935,
47.945831
],
[
27.481211,
47.94602
],
[
27.481801,
47.946139
],
[
27.482213,
47.946265
],
[
27.482432,
47.94636
],
[
27.48255,
47.946432
],
[
27.48265,
47.946507
],
[
27.482764,
47.946631
],
[
27.482876,
47.946797
],
[
27.48515,
47.950441
],
[
27.485485,
47.950921
],
[
27.485809,
47.951203
],
[
27.486236,
47.951517
],
[
27.486442,
47.951635
],
[
27.486646,
47.951708
],
[
27.487148,
47.951794
],
[
27.503152,
47.953684
],
[
27.503892,
47.953755
],
[
27.504431,
47.953745
],
[
27.504708,
47.953714
],
[
27.511054,
47.952855
],
[
27.512953,
47.952562
],
[
27.514196,
47.952308
],
[
27.51425,
47.952261
],
[
27.514402,
47.952201
],
[
27.514489,
47.952192
],
[
27.514658,
47.952212
],
[
27.514717,
47.952242
],
[
27.515308,
47.952089
],
[
27.525479,
47.950184
],
[
27.526053,
47.95009
],
[
27.526494,
47.950045
],
[
27.526811,
47.950038
],
[
27.533371,
47.95024
],
[
27.536304,
47.9505
],
[
27.538444,
47.950724
],
[
27.539019,
47.950802
],
[
27.539517,
47.950894
],
[
27.540245,
47.951105
],
[
27.540676,
47.951272
],
[
27.541021,
47.951447
],
[
27.541366,
47.951655
],
[
27.541861,
47.951997
],
[
27.543066,
47.953021
],
[
27.543719,
47.953613
],
[
27.544293,
47.954164
],
[
27.544382,
47.954279
],
[
27.545001,
47.955481
],
[
27.545229,
47.955886
],
[
27.545349,
47.956036
],
[
27.545497,
47.956159
],
[
27.545676,
47.956255
],
[
27.545986,
47.956369
],
[
27.546197,
47.95641
],
[
27.547864,
47.956637
],
[
27.548554,
47.95678
],
[
27.548928,
47.956841
],
[
27.549197,
47.956855
],
[
27.549439,
47.956834
],
[
27.549814,
47.956754
],
[
27.550803,
47.956456
],
[
27.551225,
47.956363
],
[
27.551925,
47.956269
],
[
27.55266,
47.956106
],
[
27.553301,
47.955983
],
[
27.553559,
47.955893
],
[
27.554206,
47.955731
],
[
27.55731,
47.953845
],
[
27.559898,
47.952316
],
[
27.562066,
47.951011
],
[
27.566375,
47.948551
],
[
27.566506,
47.948303
],
[
27.566512,
47.948254
],
[
27.566576,
47.948186
],
[
27.566686,
47.948155
],
[
27.56678,
47.948163
],
[
27.566858,
47.948199
],
[
27.568494,
47.948199
],
[
27.571139,
47.948256
],
[
27.58099,
47.948527
],
[
27.585286,
47.948649
],
[
27.585949,
47.948707
],
[
27.586381,
47.948776
],
[
27.58695,
47.948901
],
[
27.587308,
47.949004
],
[
27.587955,
47.949225
],
[
27.595278,
47.951889
],
[
27.609702,
47.9571
],
[
27.610858,
47.957454
],
[
27.612446,
47.95805
],
[
27.612987,
47.95829
],
[
27.62765,
47.963583
],
[
27.628776,
47.963969
],
[
27.629761,
47.964248
],
[
27.630841,
47.964506
],
[
27.631637,
47.964654
],
[
27.632224,
47.964746
],
[
27.633446,
47.964896
],
[
27.635072,
47.965063
],
[
27.649549,
47.966501
],
[
27.66233,
47.967741
],
[
27.670162,
47.968538
],
[
27.673867,
47.968899
],
[
27.676067,
47.969144
],
[
27.676989,
47.969307
],
[
27.67826,
47.969604
],
[
27.679149,
47.969855
],
[
27.679767,
47.970058
],
[
27.68043,
47.970306
],
[
27.704242,
47.979689
],
[
27.706252,
47.98046
],
[
27.724619,
47.987692
],
[
27.732244,
47.990661
],
[
27.732935,
47.991001
],
[
27.733553,
47.991376
],
[
27.734387,
47.991952
],
[
27.734749,
47.992258
],
[
27.735098,
47.992575
],
[
27.742019,
47.999348
],
[
27.742643,
47.999939
],
[
27.743008,
48.000235
],
[
27.743352,
48.000447
],
[
27.743856,
48.000693
],
[
27.744336,
48.000902
],
[
27.75399,
48.005044
],
[
27.776982,
48.014838
],
[
27.782176,
48.017031
],
[
27.782596,
48.017237
],
[
27.783308,
48.017664
],
[
27.783718,
48.017966
],
[
27.784031,
48.01823
],
[
27.784335,
48.018526
],
[
27.784643,
48.018875
],
[
27.78491,
48.019234
],
[
27.785283,
48.019825
],
[
27.789344,
48.026582
],
[
27.789638,
48.026993
],
[
27.790085,
48.02747
],
[
27.790402,
48.027759
],
[
27.790912,
48.02815
],
[
27.791682,
48.028626
],
[
27.796657,
48.031325
],
[
27.797483,
48.031794
],
[
27.797603,
48.031817
],
[
27.797919,
48.031965
],
[
27.802189,
48.034829
],
[
27.802497,
48.035063
],
[
27.802573,
48.035222
],
[
27.802789,
48.035377
],
[
27.802945,
48.035459
],
[
27.803052,
48.035559
],
[
27.803184,
48.035628
],
[
27.803341,
48.035676
],
[
27.803572,
48.035724
],
[
27.804016,
48.035764
],
[
27.809126,
48.032455
],
[
27.81074,
48.031336
],
[
27.812214,
48.030367
],
[
27.812427,
48.030309
],
[
27.812588,
48.030308
],
[
27.8128,
48.03034
],
[
27.817592,
48.032314
],
[
27.819301,
48.033092
],
[
27.821216,
48.033913
],
[
27.821457,
48.033995
],
[
27.822825,
48.034552
],
[
27.824128,
48.035126
],
[
27.828482,
48.036918
],
[
27.828572,
48.03692
],
[
27.828656,
48.036944
],
[
27.828748,
48.037008
],
[
27.828764,
48.037039
],
[
27.829292,
48.037262
],
[
27.829586,
48.037468
],
[
27.830147,
48.037637
],
[
27.83062,
48.037823
],
[
27.834852,
48.039602
],
[
27.835286,
48.039728
],
[
27.835535,
48.039769
],
[
27.835798,
48.039774
],
[
27.836126,
48.039761
],
[
27.836221,
48.039749
],
[
27.836396,
48.03978
],
[
27.836468,
48.039818
],
[
27.836552,
48.039926
],
[
27.836559,
48.039969
],
[
27.836669,
48.040075
],
[
27.836791,
48.040262
],
[
27.83692,
48.040397
],
[
27.837186,
48.040565
],
[
27.843774,
48.04332
],
[
27.846932,
48.044624
],
[
27.854047,
48.047616
],
[
27.854586,
48.04786
],
[
27.855095,
48.048124
],
[
27.855581,
48.04841
],
[
27.861914,
48.052673
],
[
27.872115,
48.059593
],
[
27.872847,
48.06007
],
[
27.873082,
48.060201
],
[
27.873516,
48.060401
],
[
27.874066,
48.060589
],
[
27.87456,
48.06073
],
[
27.875044,
48.060831
],
[
27.875354,
48.060876
],
[
27.875816,
48.060907
],
[
27.876142,
48.060914
],
[
27.876696,
48.060892
],
[
27.877024,
48.060864
],
[
27.877594,
48.060777
],
[
27.878164,
48.060663
],
[
27.884002,
48.059242
],
[
27.888411,
48.058148
],
[
27.889306,
48.057946
],
[
27.889769,
48.0579
],
[
27.890118,
48.057892
],
[
27.890505,
48.05793
],
[
27.890851,
48.058006
],
[
27.891272,
48.058153
],
[
27.893052,
48.058975
],
[
27.894505,
48.059691
],
[
27.898481,
48.061587
],
[
27.902342,
48.063388
],
[
27.902748,
48.063617
],
[
27.903118,
48.063898
],
[
27.906104,
48.066715
],
[
27.908339,
48.068861
],
[
27.938902,
48.097744
],
[
27.941212,
48.099878
],
[
27.942045,
48.100553
],
[
27.942424,
48.100832
],
[
27.943285,
48.101435
],
[
27.943792,
48.101759
],
[
27.944341,
48.102097
],
[
27.945318,
48.102649
],
[
27.946407,
48.103194
],
[
27.949112,
48.104449
],
[
27.952346,
48.105912
],
[
27.95615,
48.1076
],
[
27.959196,
48.108929
],
[
27.964947,
48.111484
],
[
27.97194,
48.114625
],
[
27.990534,
48.123019
],
[
27.992002,
48.123695
],
[
27.996379,
48.12565
],
[
28.001737,
48.128084
],
[
28.004521,
48.129327
],
[
28.013333,
48.13333
],
[
28.014114,
48.132672
],
[
28.016207,
48.131021
],
[
28.016736,
48.130579
],
[
28.017161,
48.130149
],
[
28.017599,
48.12965
],
[
28.018549,
48.128221
],
[
28.019789,
48.126172
],
[
28.021254,
48.123657
],
[
28.022117,
48.122274
],
[
28.022391,
48.121648
],
[
28.02353,
48.11879
],
[
28.024899,
48.115465
],
[
28.024984,
48.115187
],
[
28.025045,
48.114836
],
[
28.025026,
48.11453
],
[
28.024922,
48.114157
],
[
28.023087,
48.110401
],
[
28.023053,
48.110298
],
[
28.023047,
48.110148
],
[
28.023336,
48.108137
],
[
28.02335,
48.107924
],
[
28.023327,
48.106219
],
[
28.023354,
48.105916
],
[
28.023407,
48.105642
],
[
28.023756,
48.104675
],
[
28.023797,
48.104511
],
[
28.024158,
48.10153
],
[
28.024279,
48.101201
],
[
28.028472,
48.095847
],
[
28.033462,
48.089426
],
[
28.034426,
48.08814
],
[
28.038388,
48.082976
],
[
28.041011,
48.079621
],
[
28.04473,
48.075795
],
[
28.044853,
48.075646
],
[
28.045018,
48.07551
],
[
28.04917,
48.073287
],
[
28.051353,
48.072098
],
[
28.052004,
48.071693
],
[
28.052586,
48.071263
],
[
28.053118,
48.070828
],
[
28.053618,
48.070461
],
[
28.055709,
48.06878
],
[
28.055973,
48.068587
],
[
28.056179,
48.068469
],
[
28.056476,
48.068344
],
[
28.061457,
48.066521
],
[
28.063121,
48.065844
],
[
28.065376,
48.064868
],
[
28.066287,
48.064446
],
[
28.066541,
48.064287
],
[
28.066909,
48.064016
],
[
28.067252,
48.063722
],
[
28.067809,
48.063192
],
[
28.068702,
48.062239
],
[
28.069644,
48.061044
],
[
28.070041,
48.060635
],
[
28.070243,
48.060487
],
[
28.070863,
48.060139
],
[
28.07473,
48.057869
],
[
28.085551,
48.051426
],
[
28.096578,
48.044735
],
[
28.097084,
48.044756
],
[
28.098567,
48.044735
],
[
28.10517,
48.044603
],
[
28.108537,
48.04455
],
[
28.109575,
48.04457
],
[
28.10994,
48.044599
],
[
28.113335,
48.044602
],
[
28.113579,
48.044623
],
[
28.113938,
48.044703
],
[
28.121451,
48.047704
],
[
28.127478,
48.050171
],
[
28.130917,
48.051298
],
[
28.13144,
48.051503
],
[
28.132513,
48.051976
],
[
28.137722,
48.054496
],
[
28.138757,
48.055084
],
[
28.139353,
48.055526
],
[
28.143254,
48.058831
],
[
28.143403,
48.058931
],
[
28.143519,
48.058976
],
[
28.143572,
48.058981
],
[
28.14364,
48.058974
],
[
28.143711,
48.058946
],
[
28.148627,
48.056098
],
[
28.148827,
48.05603
],
[
28.149148,
48.055981
],
[
28.153241,
48.056106
],
[
28.155086,
48.056195
],
[
28.159209,
48.056343
],
[
28.163399,
48.056526
],
[
28.166443,
48.056622
],
[
28.167231,
48.056674
],
[
28.167543,
48.056716
],
[
28.170217,
48.057272
],
[
28.179447,
48.059126
],
[
28.179938,
48.059204
],
[
28.180367,
48.05924
],
[
28.181556,
48.059022
],
[
28.216341,
48.053949
],
[
28.225387,
48.055741
],
[
28.225743,
48.055598
],
[
28.225522,
48.055385
],
[
28.225232,
48.055062
],
[
28.225135,
48.054813
],
[
28.225108,
48.054681
],
[
28.225186,
48.053069
],
[
28.225304,
48.052646
],
[
28.225409,
48.052415
],
[
28.225742,
48.051897
],
[
28.227323,
48.049616
],
[
28.228131,
48.048411
],
[
28.228974,
48.047051
],
[
28.22941,
48.046233
],
[
28.229739,
48.045485
],
[
28.23081,
48.042569
],
[
28.230913,
48.042145
],
[
28.230925,
48.041955
],
[
28.230807,
48.041314
],
[
28.230058,
48.038736
]
]
},
"instructions":[
{
"ref":"R7",
"distance":15647.34,
"heading":31.87,
"sign":0,
"interval":[
0,
118
],
"text":"继续行驶到 Drochia-Costești",
"time":866626,
"street_name":"Drochia-Costești"
},
{
"exit_number":2,
"distance":3322.279,
"sign":6,
"exited":true,
"turn_angle":-3.07,
"interval":[
118,
161
],
"text":"在环岛内,使用2出口出环岛,进入Strada Independenței",
"time":238464,
"street_name":"Strada Independenței"
},
{
"exit_number":1,
"distance":1288.6,
"sign":6,
"exited":true,
"interval":[
161,
167
],
"text":"在环岛内,使用1出口出环岛,进入Strada Independenței",
"time":92779,
"street_name":"Strada Independenței"
},
{
"exit_number":2,
"distance":1090.682,
"sign":6,
"exited":true,
"turn_angle":-4.38,
"interval":[
167,
175
],
"text":"在环岛内,使用2出口出环岛,进入Strada Independenței",
"time":78529,
"street_name":"Strada Independenței"
},
{
"ref":"R7",
"distance":19769.105,
"sign":0,
"interval":[
175,
243
],
"text":"继续行驶到 Drochia-Costești",
"time":1034915,
"street_name":"Drochia-Costești"
},
{
"ref":"R7",
"distance":128.545,
"sign":1,
"interval":[
243,
250
],
"text":"偏右转 到 Strada Evgheni Gudanov",
"time":10284,
"street_name":"Strada Evgheni Gudanov"
},
{
"distance":2277.404,
"sign":2,
"interval":[
250,
263
],
"text":"右转 到 Strada Mitropolit Varlaam",
"time":136642,
"street_name":"Strada Mitropolit Varlaam"
},
{
"exit_number":2,
"distance":661.541,
"sign":6,
"exited":true,
"turn_angle":-3.15,
"interval":[
263,
276
],
"text":"在环岛内,使用2出口出环岛,进入R14-Drochia",
"time":52258,
"street_name":"R14-Drochia"
},
{
"exit_number":2,
"distance":17547.506,
"sign":6,
"exited":true,
"turn_angle":-4.17,
"interval":[
276,
343
],
"text":"在环岛内,使用2出口出环岛,进入R14-Drochia",
"time":879379,
"street_name":"R14-Drochia"
},
{
"ref":"G33",
"distance":12232.362,
"sign":2,
"interval":[
343,
405
],
"text":"右转 到 Zgurița-Mărculești",
"time":733940,
"street_name":"Zgurița-Mărculești"
},
{
"ref":"L99",
"distance":10406.531,
"sign":-7,
"interval":[
405,
446
],
"text":"保持左行 到 G35-Regina Maria-Bulboci",
"time":915826,
"street_name":"G35-Regina Maria-Bulboci"
},
{
"ref":"G36",
"distance":1970.766,
"sign":2,
"interval":[
446,
464
],
"text":"右转 到 Strada Calea Sorocii",
"time":127793,
"street_name":"Strada Calea Sorocii"
},
{
"distance":0,
"sign":4,
"last_heading":190.9954810068599,
"interval":[
464,
464
],
"text":"终点到达",
"time":0,
"street_name":""
}
],
"legs":[
],
"details":{
},
"ascend":0,
"descend":0,
"snapped_waypoints":{
"type":"LineString",
"coordinates":[
[
27.342371,
47.916198
],
[
28.230058,
48.038736
]
]
}
}
]
}
API相关文档地址
https://github.com/graphhopper/graphhopper/blob/5.x/docs/index.md
如下,该页面可看到相关API文档以及响应的Maven依赖
4.Graphhopper代码解析
从哪里决定加载什么OSM数据
Class:com.graphhopper.GraphHopper
- Method:init
- Lines:416~445
加载所有权重的网状数据
- Class:com.graphhopper.routing.subnetwork.PrepareRoutingSubnetworks
- Method:doWork
- Lines:84~169