Valhalla API 연동 성공...
2025. 9. 15. 09:58

Valhalla는 OSM(Open Street Map) 데이터를 활용하는 오픈소스 라우팅 엔진.

Valhalla API를 연동할 때는 일반적으로 Docker를 이용해서 서버를 띄우는 방식을 사용함

📜발할라 공식 문서 https://github.com/valhalla/valhalla

 

GitHub - valhalla/valhalla: Open Source Routing Engine for OpenStreetMap

Open Source Routing Engine for OpenStreetMap. Contribute to valhalla/valhalla development by creating an account on GitHub.

github.com

 

25.09.12 기준,
깃허브를 보면, 최근 버전은 Valhalla 3.5.1 이라고 되어 있지만
최근 버전이 아닌, 에러 수정된 버전인 릴리즈 3.6.0을 사용해야 함 (브랜치에 위치)

0. 현재 설치 상태

현재 python을 설치하고, 

OSM 라이브러리인 libosmiun을 사용하기 위하여 (c++ 라이브러리 및 rust 라이브러리)

PyOsmium라는 python wrapper를 사용하기 위해 `pip install osmium` 명령어로 설치해 둔 상태.

1. cmd 환경 준비

# 우분투 환경에서 작업
wsl

# 작업 디렉토리로 이동
cd /mnt/c/Users/Gonae/Desktop/py-osmatic

2. OSM 데이터 준비

# custom_files 디렉토리 생성
mkdir custom_files

# 한국 전체 OSM 데이터 다운로드 (약 245MB)
wget -O custom_files/south-korea-latest.osm.pbf https://download.geofabrik.de/asia/south-korea-latest.osm.pbf
  • OSM 데이터가 있어야 Valhalla API가 실행 됨!

3. Valhalla 소스코드

# Valhalla 소스코드 클론
git clone https://github.com/valhalla/valhalla.git
cd valhalla

# release-3.6.0 브랜치로 전환
git checkout release-3.6.0
  • release-3.6.0 브랜치를 사용하여 도커 이미지를 다운 받아야 함
    docker-compose.yaml 파일을 사용하지 않고,
    따로 도커 이미지를 빌드하고, 빌드 된 도커 이미지를 run 명령어로 직접 컨테이너에 올려야 함
    허브에서 풀 하면, cost 같은 조건 계산할 때 데이터가 안 맞기 때문에~..

4. Docker 이미지 빌드

# Docker 이미지 빌드 (기본 Dockerfile 사용)
docker build -f docker/Dockerfile -t valhalla:release-3.6.0 .

# script 도커 이미지 빌드 (베이스 이미지를 기반으로)
docker build -f docker/Dockerfile-scripted -t docker-scripted.test --build-arg VALHALLA_BUILDER_IMAGE=valhalla:release-3.6.0 .

 

  • 기본 Dockerfile을 사용해서 베이스 이미지를 빌드하고
  • 도커 script 이미지를 추가로 빌드하는 방식 >> 5번에서 script 이미지로 컨테이너 실행.
    • docker build -f docker/Dockerfile -t valhalla:release-3.6.0 .  로 베이스 이미지 빌드한 이후에
      docker build -f docker/Dockerfile-scripted -t docker-scripted.test --builld-arg VALHALLA_BUILDER_IMAGE=valhalla:release-3.6.0 .  로 script 이미지 빌드하는 단계가 추가돼야함
  • 컨테이너 실행 단계에서 script 이미지로 실행할거지만, 도커 베이스 이미지를 베이스로 할 것이기 때문에 둘다 필요.

5. Valhalla 컨테이너 실행

# Valhalla 컨테이너 실행
docker run -dt --name valhalla-3.6.0 -p 8002:8002 \
  -v /mnt/c/Users/jkkan/Desktop/py-osmatic/custom_files:/custom_files \
  docker-scripted.test
  • 앞에서도 말했지만, docker-compose up 하지 말고, 이미지 build 따로, docker run 따로 실행할 것.
  • 4번 단계에서 script 이미지로 빌드했기 때문에, 해당 script image로 컨테이너 실행(docker run)할 것

6. Valhalla 서버 연동 및 타일 확인

  • 이미지 2개와 컨테이너 하나~~~

  • 타일도 생성되고, 설정파일(valhalla.json)도 생성된 것 확인할 수 있음

7. 그밖의 에러 코드

1. 도커 이미지 빌드시, cd valhalla가 아닌 cd docker로 진행하여 에러 발생

ERROR: failed to build: failed to solve: failed to compute cache key: failed to calculate checksum of ref d4af3oll38bd6thtchair3v86::c3zt9sewh3z6v00v4l9vhrhep: "/COPYING": not found
  • 발생 원인
    : Docker 빌드 컨텐스트는 현재 디렉토리가 기준이 되고, Dockerfile의 COPY 명령어는 빌드 컨텍스트 기준으로 파일을 찾음
      build에 필요한 COPYING 폴더는 valhalla/docker/가 아닌, 상위 디렉토리인 valhalla/에 위치하고 있기 때문에
      COPYING 폴더를 못 찾는다는 에러 발생
  • 해결책
    : valhalla 루트 디렉토리에서 빌드해야함

2. Valhalla 기본 도커 이미지 빌드시, exit code 2 오류 발생

(fatal error: ankerl/unordered_dense.h: No such file or directory)

  • 발생 원인
    : 라이브러리 누락으로 인한 컴파일 실패
  • 해결책
    : git submodule update --init --recursive으로 Submodule 초기화

 

LIST