Files
optovia/graphhopper

GraphHopper Routing Engine

Сервис маршрутизации и изохрон на базе OpenStreetMap.

Быстрый старт

1. Скачать OSM данные

# Россия (~2.5 GB)
cd data
wget https://download.geofabrik.de/russia-latest.osm.pbf

# Или СНГ (все страны)
# wget https://download.geofabrik.de/russia-latest.osm.pbf
# wget https://download.geofabrik.de/asia/kazakhstan-latest.osm.pbf
# wget https://download.geofabrik.de/europe/belarus-latest.osm.pbf
# ... и объединить через osmium-tool

2. Запустить

docker compose up -d

Первый запуск занимает 10-30 минут (построение графа).

3. Проверить

curl http://localhost:8989/health

API Endpoints

Routing (маршрут)

curl "http://localhost:8989/route?point=55.75,37.62&point=59.93,30.31&profile=car"

Isochrone (изохрона)

# Изохрона 4 часа от Москвы
curl "http://localhost:8989/isochrone?point=55.75,37.62&time_limit=14400&profile=car"

# 3 изохроны: 2, 4, 6 часов
curl "http://localhost:8989/isochrone?point=55.75,37.62&time_limit=21600&buckets=3&profile=car"

# Обратная изохрона (откуда можно доехать)
curl "http://localhost:8989/isochrone?point=55.75,37.62&time_limit=14400&profile=car&reverse_flow=true"

Параметры изохрон

Параметр Описание Пример
point Центр изохроны (lat,lon) 55.75,37.62
time_limit Время в секундах 14400 (4 часа)
distance_limit Расстояние в метрах 500000 (500 км)
profile Профиль маршрутизации car, truck
buckets Количество изохрон 3
reverse_flow Обратное направление true

Требования к памяти

Регион OSM размер RAM для импорта RAM для работы
Россия ~2.5 GB 8-12 GB 4-6 GB
Европа ~25 GB 32-48 GB 16-24 GB
Весь мир ~70 GB 64-96 GB 32-48 GB

Структура папок

graphhopper/
├── docker-compose.yml
├── config.yml
├── README.md
└── data/
    ├── russia-latest.osm.pbf  # OSM данные (скачать)
    └── graph-cache/           # Построенный граф (создается автоматически)

Обновление данных

# Скачать свежие данные
cd data
wget -N https://download.geofabrik.de/russia-latest.osm.pbf

# Удалить старый граф и перезапустить
rm -rf graph-cache
docker compose restart graphhopper

Интеграция с фронтендом

// composables/useIsochrone.ts
export const useIsochrone = () => {
  const getIsochrone = async (
    lat: number,
    lng: number,
    timeMinutes: number,
    profile: 'car' | 'truck' = 'car'
  ) => {
    const response = await fetch(
      `${GRAPHHOPPER_URL}/isochrone?point=${lat},${lng}&time_limit=${timeMinutes * 60}&profile=${profile}`
    )
    return response.json() // GeoJSON polygon
  }

  return { getIsochrone }
}