【问题标题】:Can I implement offline navigation in osmdroid?我可以在 osmdroid 中实现离线导航吗?
【发布时间】:2018-03-22 12:46:15
【问题描述】:

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

更新: 我试过 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);

【问题讨论】:

标签: openstreetmap osmdroid graphhopper osmbonuspack


【解决方案1】:

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

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

您需要:

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

您可以在互联网上找到世界各地的切片。如果您想在某个特定区域工作,有一些工具可以帮助您切出您需要的区域。

2) 为 graphopper 准备数据

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

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

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

注意: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

【讨论】:

  • 感谢您的回答。我想问,是否有可能动态地完成这一切?上网时下载我们需要的地图并为离线准备路线。
  • @TikTak 因为您以这种方式提出问题,所以答案是,是的,有可能。但显然会涉及很多工作。您必须围绕它构建整个服务。我想这样的任务超出了你的范围。 AFAIK 目前没有任何人为 graphopper 提供此类服务。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-31
  • 2013-03-29
  • 2018-06-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多