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
