Membangun rute ..., orang secara teratur menggunakannya, terutama untuk rute mobil, di navigator.
Ada juga banyak solusi untuk membangun rute, termasuk GraphHopper , yang tahu bagaimana membuat rute untuk mobil, dan untuk pejalan kaki, dan bahkan untuk hiking, yang mungkin cocok dalam 99% kasus.
Selanjutnya, kita akan berbicara tentang apa yang harus dilakukan dalam situasi lain, lebih tepatnya tentang pengalaman saya menggunakan GraphHopper ketika solusi yang ada tidak sesuai. Perlu mempertimbangkan pembatasan tambahan: untuk membangun rute berjalan kaki bagi penyandang disabilitas. Tidak akan ada fitur signifikan dari implementasi tugas khusus ini. Umum.
Ini akan menjelaskan cara membuat layanan web Anda sendiri berdasarkan pustaka GraphHopper, yang, berdasarkan koordinat awal dan akhir jalur, akan mengembalikan larik koordinat rute.
Contoh aplikasi, dengan semua stub yang perlu Anda jalankan, dapat ditemukan di repositori saya di GitHub .
GraphHopper adalah mesin perutean yang ditulis di Java. Dirilis di bawah lisensi Apache, dan dapat disematkan di produk sumber tertutup.
Artikel semacam ini di Habré ditemukan, misalnya, Berjalan keliling kota dengan bijak , tetapi sayangnya tidak memberikan detail implementasi, dan ... yah, itu saja.
Juga dalam publikasi News from the world of OpenStreetMap No. 512 (05/05/2020 - 05/11/2020) , terdapat berita mengenai konten berikut:
Pengembang GraphHopper sedang menunggu komentar kami, karena mereka memperkenalkan fitur baru yang memungkinkan orang yang tidak memiliki pemrograman atau pengetahuan Java untuk mengubah model pembangunan rute.
Mungkin, fungsi baru ini akan mencakup 0,99% dari kemungkinan situasi lainnya, mungkin akan cocok untuk tugas Anda juga, pengetahuan tentang Java tidak diperlukan, dan tidak ada masalah sama sekali yang akan muncul. Saya akan bercerita tentang pengalaman saya dalam membuat aturan untuk rute bangunan, ketika fungsi ini tidak ada, dan tersisa 2 tahun sebelum pembuatannya.
Pengetahuan tentang Java diperlukan.
, , :
GraphHopper OSM, , OSM. , , OSM. . , .
GraphHopper 0.10.0, .
.
Maven:
<dependency>
<groupId>com.graphhopper</groupId>
<artifactId>graphhopper-reader-osm</artifactId>
<version>0.10.0</version>
</dependency>
GraphHopper, , github. , How to create new routing profile aka a new FlagEncoder? , , FlagEncoder
. FlagEncoder
, com.graphhopper.routing.util
, FootFlagEncoder
, .. , AbstractFlagEncoder
, .
GraphHopper ( ) GraphHopper Documentation RoutingExample.java.
FlagEncoder
, FlagEncoder
AbstractFlagEncoder
, FootFlagEncoder
, FootFlagEncoder
, . AbstractFlagEncoder
FootFlagEncoder
, , FootFlagEncoder
.
acceptWay
, - ReaderWay
/ . FlagEncoder
. FlagEncoder
, . acceptWay
, – 0.
restricted
, id
way
OSM.
public class MyFlagEncoder {
…
private List<Long> restricted;
@Override
public long acceptWay(ReaderWay way) {
if (restricted.contains(way.getId()))
return 0;
…
}
…
}
, , , 0.
FlagEncoder
, , .
GraphHopper closableInstance = new GraphHopperOSM().setOSMFile(osmFilePath).forServer();
closableInstance.setStoreOnFlush(true);
closableInstance.setGraphHopperLocation(graphFolder);
closableInstance.setEncodingManager(new EncodingManager(encoder));
closableInstance.setCHEnabled(false);
GraphHopper hopper = closableInstance.importOrLoad();
osmFilePath - pbf- , pbf geofabrik, , OSM;
encoder –
FlagEncoder
, , ;
graphFolder – .
importOrLoad
, FlagEncoder
, .
GraphHopper: Low level API.
importOrLoad
.
GraphHopper closableInstance = new GraphHopperOSM().
setOSMFile(pbfFile).
forServer().
setStoreOnFlush(true).
setGraphHopperLocation(graphFolder).
setEncodingManager(new EncodingManager(encoder)).
setCHEnabled(false);
GraphHopper hopper = closableInstance.importOrLoad();
LocationIndex
:
GraphHopperStorage graph = hopper.getGraphHopperStorage();
LocationIndex index = new LocationIndexTree(graph, new RAMDirectory());
index.prepareIndex();
: GraphHopperStorage
, FlagEncoder
, LocationIndex
.
, List<Double[]>
:
QueryResult fromQR = index.findClosest(fromLon, fromLat, EdgeFilter.ALL_EDGES);
QueryResult toQR = index.findClosest(toLon, toLat, EdgeFilter.ALL_EDGES);
QueryGraph queryGraph = new QueryGraph(graph);
//
queryGraph.lookup(fromQR, toQR);
Dijkstra dij = new Dijkstra(queryGraph, new FastestWeighting(encoder), TraversalMode.NODE_BASED);
Path path = dij.calcPath(fromQR.getClosestNode(), toQR.getClosestNode());
PointList pl = path.calcPoints();
return pl.toGeoJson();
.. ( acceptWay
) ( ) :
if (restricted.contains(way.getId()))
return 0;
- , OSM, :
if (way.hasTag("foot", intendedValues)) {
return acceptBit;
}
Jika Anda memiliki kesempatan, untuk tugas Anda, gunakan opsi kedua, berdasarkan pemeriksaan tag - lebih baik memilihnya. Tidak ada salahnya untuk mencampurkan logika tambahan yang tidak cocok dengan pendekatan ini.
Semoga berhasil!