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)

  1. 使用 TileServer GL 或 Mapbox GL JS 来加载本地样式和瓦片(.mbtiles)
  2. GraphHopper 提供路线规划接口(GeoJSON 或 GPX)
  3. 地图展示靠前端地图框架(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 显示地图和路径。代码包括两个部分:

  1. Java后端:用 GraphHopper 实现路径规划
  2. 前端:用 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. 完整流程

  1. 后端:运行 Java 代码并获取 GeoJSON 格式的路径数据。
  2. 前端:使用 Leaflet.js 将该数据可视化,显示路径。

步骤:

  • 启动 GraphHopper 后端,确保它运行正常并能返回路线数据。
  • 创建前端 HTML 文件,利用 Leaflet.js 将路径显示在地图上。

4. 小结

这个示例展示了如何结合 GraphHopper 进行离线路径规划,并使用 Leaflet.js 显示路径。你可以根据需求进一步扩展,例如支持动态加载瓦片图、修改起点终点、优化地图样式等。

如果你有其他特定需求或问题,随时告诉我!