Docker 기반 OpenRouteService를 활용한 도보 소요 시간 계산

cmkkws·2025년 7월 7일

1. 시작하기 앞서...

ORS(OpenRouteService)는 위치 데이터를 기반으로 한 경로 탐색 및 지리공간 분석 서비스이다.

경로 안내, 거리/시간 계산, 범위 계산, 주소 & 좌표 변환 등 다양한 서비르를 제공한다.

해당 서비스를 사용하기 위해서는 크게 두 가지 방법으로 이용이 가능하다.

  • 공식 ORS 서버를 이용해 가용하기.
  • 자체적으로 로컬 서버를 구성해 사용하기.

공식 ORS 서버를 사용해 서비스를 제공받을 경우, Access Limits(daily / per minutes)가 있어 대용량의 데이터에 대한 호출을 시도할 때 제한되는 단점이 있다.

따라서 Docker을 사용해 로컬 서버를 구성해 직접 지도 file의 graph를 build를 통해 서비스를 이용하고자 한다.

2. ORS github 접속하기.

ORS github 에 접속해 서버 구축을 위한 파일들을 다운로드 한다.

git clone https://github.com/GIScience/openrouteservice.git

github에 있는 내용을 기반으로 ubuntu에 접속해 다음의 명령어를 따라해주면 된다.

mkdir -p ors-docker/config ors-docker/elevation_cache ors-docker/graphs ors-docker/files ors-docker/logs

이렇게 openrouteservice/ors-docker 경로에 5개의 폴더가 생성되어있음을 알 수 있다.

ORS에는 기본적으로 "example-heidelberg.test.pbf"가 있어 한국지도로 할 경우 직접 맵을 다운로드 후, openrouteservice/ors-docker/files에 넣어 두어야 한다.

south-korea-latest.osm.pbf

wget https://download.geofabrik.de/asia/south-korea-latest.osm.pbf

3. 서버 실행

서버를 실행하기 전 몇 가지의 파일의 수정이 필요한데, 총 3가지 파일에 대한 수정이 이루어졌다.

  • docker-compose.yml
  • ors-config.yml
  • ors-config.env
ors:
  engine:
    profile_default:
      enabled: false
      build:
        source_file: /home/ors/files/south-korea-latest.osm.pbf
      graph_path: /home/ors/graphs
    profiles:
      driving-car:
        enabled: false
      foot-walking:
        enabled: true

다음은 ors-config.yml 파일의 일부이고, 수정사항은 다음과 같다.

  • source_file의 경로가 example-heidelberg.test.pbf 을 다운받은 지도인 south-korea-latest.osm.pbf로 바꾸어준다.
  • ors를 처음 다운받았을 때 기본적으로 driving-car가 빌드되도록 되어있으므로, 다른 이동 경로에 대한 정보를 받고 싶을 때 변경한다.

다음은 ors-config.env 파일의 일부이다.

ors.engine.profile_default.build.source_file=/home/ors/files/south-korea-latest.osm.pbf
ors.engine.profile_default.graph_path=/home/ors/graphs
ors.engine.profiles.driving-car.enabled=false
ors.engine.profiles.foot-walking.enabled=true

다음과 같은 코드로 서버를 빌드한다.

docker compose up --build -d

로그 자신이 사용하고자 하는 경로(예:foot-walking)이나 다음과 같은 문장들이 있으면 성공적으로 시작한 것이라고 보면 된다.

start creating graph from /home/ors/files/south-korea-latest.osm.pbf
Started Application in 4.051 seconds (process running for 5.362)

연결 상태 확인하기

curl http://localhost:8080/ors/v2/health
{"status":"ready"}

좌표 두개의 예시를 들어 도보 소요시간을 계산해보자.

curl -X POST "http://localhost:8080/ors/v2/directions/foot-walking" \
  -H "Content-Type: application/json" \
  -d '{
    "coordinates": [[127.02758, 37.49794], [127.02806, 37.49942]]
  }'
{"bbox":[127.027377,37.497499,127.028097,37.499343],"routes":[{"summary":{"distance":331.9,"duration":239.0},"segments":[{"distance":331.9,"duration":239.0,"steps":[{"distance":11.8,"duration":8.5,"type":11,"instruction":"Head east on 서초대로, 90","name":"서초대로, 90","way_points":[0,1]},{"distance":50.2,"duration":36.2,"type":1,"instruction":"Turn right onto 강남대로, 41","name":"강남대로, 41","way_points":[1,2]},{"distance":14.7,"duration":10.6,"type":2,"instruction":"Turn sharp left","name":"-","way_points":[2,3]},{"distance":4.0,"duration":2.9,"type":2,"instruction":"Turn sharp left","name":"-","way_points":[3,4]},{"distance":120.4,"duration":86.7,"type":1,"instruction":"Turn right","name":"-","way_points":[4,7]},{"distance":29.0,"duration":20.9,"type":6,"instruction":"Continue straight","name":"-","way_points":[7,11]},{"distance":17.1,"duration":12.3,"type":0,"instruction":"Turn left","name":"-","way_points":[11,12]},{"distance":53.1,"duration":38.2,"type":1,"instruction":"Turn right","name":"-","way_points":[12,14]},{"distance":11.8,"duration":8.5,"type":0,"instruction":"Turn left onto 테헤란로1길","name":"테헤란로1길","way_points":[14,15]},{"distance":19.8,"duration":14.2,"type":1,"instruction":"Turn right onto 강남대로94길","name":"강남대로94길","way_points":[15,16]},{"distance":0.0,"duration":0.0,"type":10,"instruction":"Arrive at 강남대로94길, on the left","name":"-","way_points":[16,16]}]}],"bbox":[127.027377,37.497499,127.028097,37.499343],"geometry":"yxzcFoaifWEYrAe@YG@Fg@PcA^}Aj@SFO@ICAC]JQ}@Mq@SHKi@","way_points":[0,16]}],"metadata":{"attribution":"openrouteservice.org, OpenStreetMap contributors, tmc - BASt","service":"routing","timestamp":1751915542225,"query":{"coordinates":[[127.02758,37.49794],[127.02806,37.49942]],"profile":"foot-walking","profileName":"foot-walking","format":"json"},"engine":{"version":"9.4.0","build_date":"2025-06-30T05:57:19Z","graph_date":"2025-07-01T04:18:38Z","osm_date":"2025-06-21T20:20:36Z"}}}

여기에 다양한 정보가 담겨있고, 도보 소요시간(summary) 부분의 distance와 duration을 통해 루트에 대한 길이와 시간을 알 수 있다.

4. 현재 진행 상황

2016 ~ 2020년 까지의 송도 아파트 거래 건수 +
2020 ~ 2025.07.07. 기간동안의 인천광역시 서구지역의 아파트 주택 거래 건수
= 50,670건의 입력데이터를 이용해 분석을 진행하였다.

도보 소요시간과 관련된 변수는 다음과 같은 상황에 사용할 예정이다.

  • 지하철 연장건설에 영향을 받은 주택 필터링(역세권 변수 선정)
  • 주택과 근처 시설(문화, 교육, 의료) 접근도 관련 도보 소요시간 변수 추출

먼저 정확한 지하철 연장건설사업에 대한 영향을 받은 주택을 필터링해야하기 때문에 역과 주택 사이의 도보 소요시간을 계산하는 작업이 필요했다.

예를 들어 아라역에 대한 주택의 영향력을 확인하고 싶을 때, 입력데이터가 서구이므로
근처의 역과 아라역을 비교했을 때 도보 시간이 더 짧도록 하여 필터링을 진행하였다.

(근처의 역은 3개의 신설역 주변 원을 이루는 역들을 대상으로 하였다.)


호출 횟수는 대략 계산하였을 때 50,670 * 10개의 역으로 50만 개가 넘어가므로 실제로 원본 파일을 그대로 도보 소요시간을 호출 했을 때 매우 오래 걸렸다.

따라서 원본 파일의 송도지역은 송도달빛축제역만, 그 이외의 지역에는 9개 역에 대한 좌표의 호출만 하도록 이루어지게 하였고, 파일을 여러 개로 나누어 진행한 후, 다시 합치는 작업을 진행하였다.

(처음에 그대로 진행할 때, 1.3만 번째에서 계속 느려져서 메모리 문제라고 생각해서 파일을 나누었으나,
이후 원본 파일 특성 자체가 처음 부분이 송도 지역으로 호출의 횟수가 작고, 이후 1건마다 9개의 역에 대한 호출으로 인해 느려진다는 것을 깨달았다.)

다음은 openrouteservice 경로의 폴더이고 다음과 같은 파이썬 파일을 만들어 진행하였다.

  • split.py: 원본 파일을 나누어준다. (ex: apt_chunk_1.xlsx)
  • ors_walk.py: ors의 호출을 통해 각각의 나누어진 파일에 대한 도보 소요시간 호출을 진행한다.(ex: apt_chunk_1_with_walk)
  • ors_walk_time: 나눈 파일들을 다시 통합한다.

최종으로 만든 파일은

  • pros_df_apartment_pricing_with_walk_time.xlsx 파일에 저장했다.

최종 결과물은 다음과 같다.

송도지역에 대한 거래내역은 송도달빛축제역_도보시간(초)에,
그 이외의 지역은 9개의 역에 대한 도보시간(초)의 칼럼으로 입력되어있다.

추후 9개 역중에 도보시간이 가장 가까운 분석대상 3개의 역에 해당하는 열을 필터링 후 분석을 이어서 할 예정이다.

0개의 댓글