GraphHopper 支持使用本地瓦片数据进行路径规划,从而避免在每次请求时都在线加载 OpenStreetMap(OSM) 数据。这通常用于离线路径规划、嵌入式设备、或者提高性能的场景。
下面是一个完整的说明,介绍如何让 GraphHopper 使用本地瓦片数据:
🔧 一、准备工作
1. 下载 GraphHopper
你可以从 GitHub 获取最新版本:
git clone https://github.com/graphhopper/graphhopper.git
cd graphhopper
2. 构建项目
./graphhopper.sh build
🗺️ 二、准备本地 OSM 地图文件(PBF)
前往以下网站下载所需区域的 .osm.pbf
文件(矢量地图):
🚀 三、导入 PBF 数据并生成本地图形
将 .osm.pbf
放入本地目录,例如 data/beijing.osm.pbf
运行:
./graphhopper.sh import data/beijing.osm.pbf
GraphHopper 会:
- 读取 PBF 文件
- 生成
graph-cache
目录(包含所有必要的图结构) - 可用于离线规划
🌐 四、启动本地 Web 服务(可选)
如果你希望部署一个服务(本地或内网),使用内置 Jetty:
./graphhopper.sh web data/beijing.osm.pbf
默认监听端口为 8989
,访问:
http://localhost:8989/
📦 五、使用本地瓦片数据进行路径规划(离线)
GraphHopper 本质并不依赖“瓦片图像”(如 raster tile PNG),而是使用 OSM 数据构建的 图结构,存在 graph-cache
中。它不会动态下载地图数据。
在使用 Java API 进行路径规划时,确保指向本地图:
GraphHopper hopper = new GraphHopper()
.setGraphHopperLocation("graph-cache")
.setEncodingManager(EncodingManager.create("car"))
.setOSMFile("data/beijing.osm.pbf")
.importOrLoad();
GHRequest req = new GHRequest(纬度1, 经度1, 纬度2, 经度2)
.setProfile("car");
GHResponse resp = hopper.route(req);
🎨 六、可视化地图(瓦片)
如果你希望配合 可视化本地地图瓦片(raster tile):
- 使用 TileServer GL 或 Mapbox GL JS 来加载本地样式和瓦片(.mbtiles)
- GraphHopper 提供路线规划接口(GeoJSON 或 GPX)
- 地图展示靠前端地图框架(Leaflet、MapLibre)
🔁 七、更新地图数据
当地图数据更新时:
# 删除旧缓存
rm -rf graph-cache
# 重新导入
./graphhopper.sh import data/your-new.osm.pbf
✅ 总结
步骤 | 描述 |
---|---|
1 | 下载 GraphHopper |
2 | 下载 OSM PBF 数据 |
3 | 使用 import 生成本地图结构 |
4 | 使用 Java API 或本地 Web 服务进行路径规划 |
5 | (可选)结合前端加载本地地图瓦片,实现完整离线地图体验 |
接下来我会给你一个简单的 Java 示例代码,演示如何用 GraphHopper 进行路径规划,并通过 Leaflet或 MapLibre 显示地图和路径。代码包括两个部分:
- Java后端:用 GraphHopper 实现路径规划
- 前端:用 Leaflet/MapLibre 显示地图和路径
1. Java 后端:路径规划
假设你已经将 OSM 文件(如 beijing.osm.pbf
)和 GraphHopper 图形文件(如 graph-cache
)准备好。
Maven 配置
首先,在 pom.xml
中添加 GraphHopper 和其他必要的依赖:
<dependencies>
<dependency>
<groupId>com.graphhopper</groupId>
<artifactId>graphhopper-core</artifactId>
<version>5.0</version>
</dependency>
<dependency>
<groupId>com.graphhopper</groupId>
<artifactId>graphhopper-web</artifactId>
<version>5.0</version>
</dependency>
</dependencies>
Java 路径规划代码
import com.graphhopper.config.Profile;
import com.graphhopper.routing.GHRequest;
import com.graphhopper.routing.GHResponse;
import com.graphhopper.routing.GraphHopper;
import com.graphhopper.storage.GraphHopperStorage;
public class GraphHopperRoutePlanner {
public static void main(String[] args) {
// 初始化 GraphHopper 实例
GraphHopper hopper = new GraphHopper()
.setGraphHopperLocation("graph-cache")
.setEncodingManager("car")
.setOSMFile("data/beijing.osm.pbf")
.importOrLoad();
// 创建请求,设置起点和终点(例如:北京的两个位置)
GHRequest req = new GHRequest(39.9042, 116.4074, 39.9075, 116.3958) // 经纬度
.setProfile("car");
// 获取路径规划结果
GHResponse resp = hopper.route(req);
if (resp.hasErrors()) {
System.out.println("错误:" + resp.getErrors());
} else {
// 打印路径
System.out.println("路径长度: " + resp.getBest().getDistance() / 1000 + "km");
System.out.println("路径时间: " + resp.getBest().getTime() / 1000 + "秒");
// 获取 GeoJSON 格式的路径数据
String geoJson = resp.getBest().getInstructionsJson();
System.out.println("GeoJSON 路径数据: " + geoJson);
}
}
}
2. 前端:Leaflet 显示地图
1. 使用 Leaflet 显示本地图瓦片
首先,下载并安装 Leaflet.js 和 GeoJSON 插件。
在 HTML 文件中,你可以这样配置和显示地图:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>GraphHopper 路径规划</title>
<link rel="stylesheet" href="https://unpkg.com/leaflet/dist/leaflet.css" />
<script src="https://unpkg.com/leaflet/dist/leaflet.js"></script>
<script src="https://unpkg.com/leaflet-geojson@1.0.0/dist/leaflet-geojson.js"></script>
</head>
<body>
<div id="map" style="height: 600px;"></div>
<script>
// 初始化地图
var map = L.map('map').setView([39.9042, 116.4074], 13); // 设置地图的初始视图
// 添加瓦片图层(Mapbox 或本地瓦片)
L.tileLayer('http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
attribution: '© OpenStreetMap contributors'
}).addTo(map);
// 模拟从后端接收 GeoJSON 数据(从 Java 返回)
var geoJsonData = {
"type": "FeatureCollection",
"features": [
{
"type": "Feature",
"geometry": {
"type": "LineString",
"coordinates": [
[116.4074, 39.9042], // 起点
[116.3958, 39.9075] // 终点
]
}
}
]
};
// 添加路径到地图
L.geoJSON(geoJsonData).addTo(map);
</script>
</body>
</html>
3. 完整流程
- 后端:运行 Java 代码并获取 GeoJSON 格式的路径数据。
- 前端:使用 Leaflet.js 将该数据可视化,显示路径。
步骤:
- 启动 GraphHopper 后端,确保它运行正常并能返回路线数据。
- 创建前端 HTML 文件,利用 Leaflet.js 将路径显示在地图上。
4. 小结
这个示例展示了如何结合 GraphHopper 进行离线路径规划,并使用 Leaflet.js 显示路径。你可以根据需求进一步扩展,例如支持动态加载瓦片图、修改起点终点、优化地图样式等。
如果你有其他特定需求或问题,随时告诉我!
发表回复