我正在开发一个使用离线地图的应用程序。 现在我需要在应用程序中实现离线导航。 是否可以实现脱机导航?
上级: 我尝试了抓斗,但它无法离线工作。
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);
您正在使用osmbonuspack(GraphHopperRoadManager)对graphopper的支持,该支持显然仅支持在线功能(它只是调用官方的Graphopper api)。
您需要将Graphopper库直接集成到Android项目中。这并不像你想象的那么简单。
您需要:
1) 获取您所在地区的开放街道地图数据(PBF 格式)。
您可以在互联网上找到地球的切片部分。如果您想使用某些特定区域,有一些工具可以帮助您剪切出所需的区域。
2) 为图形处理器准备数据
克隆 Graphopper 项目并导入 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 项目可能有额外的设置步骤,不幸的是我不记得了(我在 2 年前进行了此集成)。浏览 graphopper 文档可能有点挑战性,但他们有一些社区支持,并且在线有资源。这是可以做到的。
3) 将图形库包含在您的项目中
他们有一个安卓演示应用程序。因此,请检查库是如何集成和使用的。
在撰写本文时,依赖项按以下方式指定:
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 目录。
图形器初始化,你应该在后台进行
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