我可以在osmdroid中实现离线导航吗?

时间:2018-03-22 12:46:15

标签: openstreetmap osmdroid graphhopper osmbonuspack

我正在开发一个使用离线地图的应用。 现在我需要在应用程序中实现离线导航。 我可以实现离线导航吗?

UPD: 我试过grapphopper,但它不能脱机工作。

    GeoPoint startPoint = new GeoPoint(41.4670689,69.5824818);
    RoadManager roadManager = new GraphHopperRoadManager("API KEY", true);
    ArrayList<GeoPoint> waypoints = new ArrayList<>();
    waypoints.add(startPoint);
    waypoints.add(new GeoPoint(41.3868364,69.4419728));
    Road road = roadManager.getRoad(waypoints);
    Polyline roadOverlay = RoadManager.buildRoadOverlay(road);
    map.getOverlays().add(roadOverlay);
    map.getController().setCenter(startPoint);

1 个答案:

答案 0 :(得分:0)

您正在使用osmbonuspack(GraphHopperRoadManager)支持graphopper,它显然只支持在线功能(它只调用官方的Graphopper api)。

您需要将Graphopper库直接集成到您的android项目中。而且这并不像你想象的那么简单。

你需要:

1)获取您所在地区的openstreetmap数据(采用pbf格式)。

您可以在互联网上找到全球切片的部分。如果您想使用某些特定区域,有些工具可以帮助您切割出您需要的区域。

2)准备graphopper的数据

克隆Graphopper项目并导入您的OSM数据

git clone git://github.com/graphhopper/graphhopper.git graphhopper
cd graphhopper
git checkout 0.10.0
./graphhopper.sh import your-area.pbf

这将使用预处理的graphopper数据创建一个目录(可能在您的pbf旁边,名为{your-area}-gh)。您必须在您的应用中包含此目录。您可以将其添加到assets目录或在运行时下载。

注意:graphopper项目可能还有其他设置步骤,不幸的是我不记得了(2年前我​​做了这个集成)。浏览graphopper文档可能有点挑战,但他们有一些社区支持,并且有在线资源。它可以做到。

3)将graphopper库包含在项目中

他们有android demo app。因此,请检查库的集成和使用方式。

在撰写本文时,依赖关系以这种方式指定:

    implementation(group: 'com.graphhopper', name: 'graphhopper-core', version: '0.10-SNAPSHOT') {
       exclude group: 'com.google.protobuf', module: 'protobuf-java'
       exclude group: 'org.openstreetmap.osmosis', module: 'osmosis-osm-binary'
       exclude group: 'org.apache.xmlgraphics', module: 'xmlgraphics-commons'
    }
   implementation 'org.slf4j:slf4j-api:1.7.25'
   implementation 'org.slf4j:slf4j-android:1.7.25'

但是将'0.10.0-SHAPSHOT'更改为'0.10'。此外,您应该在项目的根gradle文件中添加`jcenter()``存储库。

注意:版本很重要。应用程序中的库应该与您克隆的核心项目具有完全相同的版本以生成数据。版本之间的数据格式可能不兼容。这就是我在第二步中加入git checkout 0.10.0的原因。

4)使用库

再次查看示例:https://github.com/graphhopper/graphhopper/blob/master/android/app/src/main/java/com/graphhopper/android/MainActivity.java

如上所述,您的应用程序需要带有数据的xyx-gh目录。

Graphpoper初始化,你应该在后台进行 GraphHopper hopper = new GraphHopper().forMobile(); hopper.load("yourpathtodirectory-gh");

用法,再次优选在背景上: GHRequest ghRequest = new GHRequest(from, to); GHResponse response = hopper.route(ghRequest);

有关更多信息和更多疑难解答,请查看官方文档:https://github.com/graphhopper/graphhopper/blob/0.10/docs/index.md