OSRM์ด๋
osrm-backend
์คํ ์์ค ๋ผ์ฐํ
๋จธ์ ์ ์ฝ์๋ก OpenStreetMap(OSM) ๋ฐ์ดํฐ๋ฅผ ํ์ฉํด์ ๊ฒฝ๋ก๋ฅผ ์ฐพ์์ฃผ๋ ๋ผ์ฐํ
์์ง์ด๋ค.
๋ผ์ฐํ ์์ง์ ๋ ์ง์ ๊ฐ์ ์ต์ ๊ฒฝ๋ก๋ฅผ ๊ณ์ฐํ๋ ์ํํธ์จ์ด๋ก ์ง๋ ๋ฐ์ดํฐ๋ฅผ ๊ทธ๋ํ ์๋ฃ๊ตฌ์กฐ๋ก ๋ณํํ๊ณ ์ต๋จ ๊ฒฝ๋ก ์๊ณ ๋ฆฌ์ฆ์ ์ ์ฉํด ๊ฒฝ๋ก๋ฅผ ์ฐพ๋๋ค.
์ฐ์ํํ์ ๋ค, ๋ค์ด๋ฒ ๋ฑ ๋น ํ ํฌ ๊ธฐ์ ์์๋ ํด๋น ์์ง์ ํ์ฉํ ๋งํผ ๋์ค์ ์ผ๋ก ์ฌ์ฉ๋๊ณ ์์ผ๋ฉฐ, ์คํ ์์ค์ธ๋งํผ ๋ฌด๋ฃ์ด๊ณ ์ปค์คํฐ๋ง์ด์ง์ด ์์ ๋กญ๋ค๋ ์ฅ์ ์ด ์๋ค. ๋ํ, C++์ด๊ธฐ์ ๊ต์ฅํ ๋น ๋ฅธ ์๋๋ก ๊ฒฝ๋ก ๊ณ์ฐ์ ์ํํ ์ ์๋ค.
Valhalla๋ GraphHopper ๊ฐ์ ๋์ฒด์ ๊ฐ ์กด์ฌํ์ง๋ง OSRM์ด ํ๊ตญ ๋ด์์ ์ฌ์ฉ ์ฌ๋ก๊ฐ ๋ง๊ณ , ๋ฌธ์ํ๋ ์ ๋์ด์๋ค.
Contraction Hierarchies
OSRM์ด ๋น ๋ฅธ ์ด์ ๋ C++์ธ ๊ฒ๋ ์์ง๋ง, ๊ฐ์ฅ ํฐ ํต์ฌ์ Contraction Hierarchies(CH) ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ด๋ค. ์ผ๋ฐ์ ์ผ๋ก ๋ค์ต์คํธ๋ผ๋ ๋ชจ๋ ๋ ธ๋์ ๋ํด์ ํ์ํ์ง๋ง, ํด๋น ์๊ณ ๋ฆฌ์ฆ์ ๋๋ก๋ง์ ๊ณ์ธต์ ์ผ๋ก ๊ตฌ์กฐํํ์ฌ ์ค์ํ ๊ฐ์ ๋๋ก๋ฅผ ์ฐ์ ํ์ํ๋ค.
์๋ฅผ ๋ค์ด ์์ธ -> ๋ถ์ฐ๊น์ง์ ๊ฒฝ๋ก๋ฅผ ์ฐพ์ ๋ ๋ชจ๋ ๊ธธ์ ๋ํด์ ํ์ํ๋๊ฒ ์๋๋ผ ๊ณ ์๋๋ก -> ๊ตญ๋ -> ์ง๋ฐฉ๋๋ก ์์ผ๋ก ๊ณ์ธต์ ํ์์ ์ํํ๋ค. ์ด๋ฅผ ํตํด ํ์ ๊ณต๊ฐ์ ๋ํญ ์ค์ฌ ๋ฐ๋ฆฌ์ด ๋จ์ ์๋ต์ด ๊ฐ๋ฅํ๋ค.
์ด๋ฌํ ์๊ณ ๋ฆฌ์ฆ์ ํ์ฉํ๋ ค๋ฉด OSM ๋ฐ์ดํฐ๋ฅผ ๊ทธ๋๋ก ํ์ฉํ ์ ์๊ณ , ๋ฐ๋์ ๋ฐ์ดํฐ ์ ์ฒ๋ฆฌ ๊ณผ์ ์ ๊ฑฐ์ณ์ผ ํ๋ค.
๋ฐ์ดํฐ ์ ์ฒ๋ฆฌ
์ ์ฒ๋ฆฌ ๊ณผ์ ์ ๋ค์ 3๊ฐ์ง๋ก ์ด๋ฃจ์ด์ง๋ค.
- osrm-extract: OSM PBF ํ์ผ์์ ๋๋ก ๋คํธ์ํฌ๋ง ์ถ์ถ
- osrm-contract: Contraction Hierarchies ๊ทธ๋ํ๋ก ๋ณํ
- osrm-routed: ์ ์ฒ๋ฆฌ๋ ๋ฐ์ดํฐ๋ก ์๋ฒ ์คํ
์ด ๊ณผ์ ์ด ํ์ํ ์ด์ ๋ OSM ๋ฐ์ดํฐ ์๋ณธ์ด ์์ญ GB์ ํด๋นํ๊ธฐ์ ๋งค๋ฒ ์์ฒญ ์๋ง๋ค ์ ์ฒ๋ฆฌ ์์ ์ ์ํํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค. ์ ์ฒ๋ฆฌ ๊ณผ์ ์ ํตํด ์ต์ ํ๋ ๊ทธ๋ํ๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ๋ฏธ๋ฆฌ ์ฌ๋ ค๋๋ฉด ๋์ผํ ์ฟผ๋ฆฌ๋ฅผ ์ ๋ฐ๋ฆฌ์ด ์์ ์ฒ๋ฆฌํ ์ ์๊ฒ ๋๋ ๊ฒ์ด๋ค.
OSRM Service API
OSRM์์๋ ์ต์ ๊ฒฝ๋ก ๊ณ์ฐ ๋ฟ๋ง ์๋๋ผ ์ฌ๋ฌ RESTful API๋ฅผ ์ ๊ณตํ๊ณ ์๋ค. ์์ฒญ ์ profile์ ์ง์ ํ์ฌ ๋ณด๋ผ ์ ์๋๋ฐ, ๊ฐ๊ฐ์ foot, car, bike๋ก ๊ตฌ์ฑ๋์ด ์๋ค. ์ด๋ฆ์์ ๋ณด์ด๋ฏ์ด ๋๋ณด์ ์ฐจ๋ ๊ทธ๋ฆฌ๊ณ ์์ ๊ฑฐ๋ก ๊ฐ ์ ์๋ ๋๋ก์ ๋ง๊ฒ ์๋ตํด์ค๋ค.
๋ฐ์ธ๊ถ์์๋ ์ฃผ๋ก ๋ ๊ฐ์ API๋ฅผ ํ์ฉํ๊ณ ์๋ค.
1. Route API
๋ ์ง์ ๊ฐ์ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ๊ณ์ฐํ๋ ํต์ฌ API์ด๋ค.
GET /route/v1/{profile}/{coordinates}
ex. GET /route/v1/foot/127.0276,37.4979;127.0476,37.5139
์์ ๊ฐ์ด OSRM๋ฅผ ๋์ด ์๋ฒ์ ์์ฒญํ๋ฉด, ์ต์ ๊ฒฝ๋ก๋ฅผ ๊ณ์ฐํด์ค๋ค. ์ต์ ๊ฒฝ๋ก ๊ณ์ฐ์ ์์ ์๊ธฐํ Contraction Hierarchies ์๊ณ ๋ฆฌ์ฆ์ ํ์ฉํ๋ค.
ํด๋น API๋ ๋ค์๊ณผ ๊ฐ์ด ๋์ํ๋ค.
- ์ ๋ ฅ๋ฐ์ ์ขํ๋ฅผ ๊ฐ์ฅ ๊ฐ๊น์ด ๋๋ก๋ก ์ด๋
- ์ถ๋ฐ์ง, ๋์ฐฉ์ง ๋ ธ๋๋ฅผ ์ ์ฒ๋ฆฌ๋ CH ๊ทธ๋ํ์์ ์ฐพ๋๋ค.
- ์ถ๋ฐ์ง์์ ๋์ฐฉ์ง๋ก, ๋์ฐฉ์ง์์ ์ถ๋ฐ์ง๋ก ๋์์ ํ์์ ์์ํ๋ค.
- ๊ณ์ธต ๊ตฌ์กฐ๋ฅผ ๋ฐ๋ผ ์์ ๊ณ์ธต(๊ณ ์๋๋ก ๋ฑ)์ผ๋ก ๋น ๋ฅด๊ฒ ์ด๋ํ๋ค.
- ๋ ํ์์ด ๋ง๋๋ ์ง์ ์์ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ํ์ ํ๋ค.
์ฌ๊ธฐ์ ๊ณ์ธต ๊ตฌ์กฐ๋ผ๋ ๋ง์ด ์ ์ดํด๊ฐ ๋์ง์์ ๋ ์ฐพ์๋ณด์๋ค.
์ด์ ์ ๋ฐ์ดํฐ ์ ์ฒ๋ฆฌ ๊ณผ์ ์์ ๊ฐ ๋๋ก ๋
ธ๋๋ ๋ ๋ฒจ์ ๊ฐ์ง๋ค. ์ด๋ '์ถ์ฝ' ๊ณผ์ ์์ ๋ถ์ฌ๋๋ ๊ฒ์ธ๋ฐ, ๋ณดํต ๊ณจ๋ชฉ๊ธธ -> ์ง๋ฐฉ๋๋ก -> ๊ตญ๋ -> ๊ณ ์๋๋ก ์์ผ๋ก ๋์ ๋ ๋ฒจ์ ๊ฐ๊ฒ๋๋ค.
์ถ์ฝ์ด๋, ๊ฐ ๋ ธ๋์ Edge Difference๋ฅผ ๊ณ์ฐํ์ฌ ๊ฐ์ฅ ์์ ๋ ธ๋๋ถํฐ ํด๋น ๋ ธ๋๋ฅผ ์ง๋๋ ์ต๋จ ๊ฑฐ๋ฆฌ๊ฐ ์๋ ๊ฒฝ์ฐ shortcut์ ์ถ๊ฐํ๋ ๊ณผ์ ์ด๋ค. Edge Difference๋ ํน์ ๋ ธ๋๋ฅผ ์ถ์ฝํ์ ๋ ์๊ธฐ๋ shortcut ๊ฐ์ - ์ ๊ฑฐ๋ edge ๊ฐ์์ด๋ฉฐ ์ด ๊ฐ์ด ์์์๋ก ๊ทธ๋ํ๊ฐ ๋จ์ํด์ง๋ค. ์ฆ, ๋จผ์ ์ถ์ฝ๋๋ค.
2km 2km
A -------- B -------- C
\ /
\------ 5km -------/
์ด์ฒ๋ผ A -> C๋ก ๊ฐ๋ ๋ฐฉ๋ฒ์ด B๋ฅผ ๊ฑฐ์ณ๊ฐ๋ ๋ฐฉ๋ฒ๊ณผ ์ง์ ๊ฐ๋ ๋ฐฉ๋ฒ์ด ์๋ค๊ณ ํ ๋ B๋ฅผ ๊ฑฐ์ณ๊ฐ๋ ๋ฐฉ๋ฒ์ด 4km๋ก ๋ ์งง๋ค. ๋ฐ๋ผ์ B๋ฅผ ์ถ์ฝํ ๋ B๋ฅผ ๊ฑฐ์น๋ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ๋ณด์กดํ๊ธฐ ์ํด A->C shortcut์ ์ถ๊ฐํ๋ค.
2km 2km
A -------- B -------- C
\ /
\------ 5km -------/
\----- 4km ------/
์์ ๊ทธ๋ฆผ์ฒ๋ผ ๋ง๋ค์ด ๋๋ ๊ฒ์ด๋ค. ์ด๋ฐ์์ผ๋ก ๋ชจ๋ ๋ ธ๋๋ค์ ์ถ์ฝํ์ฌ ์ค์ํ ๊ฒฝ๋ก๋ค์ shortcut์ผ๋ก ์ ์ฅํด๋๊ณ ๋์ค์ ๊ฒฝ๋ก ๊ณ์ฐ์ ์ด์ฉํ๋ค.
ํ๋ก์ ํธ์์๋ ํด๋น Service API๋ฅผ ํ์ฉํ๊ณ ์๋๋ฐ, ์ฌ์ฉ์์ ์์น๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ฌ๋ ์ฝ์ค์ ๊ฐ์ฅ ๊ฐ๊น์ด ์ ์ ์ฐพ์ ์ต์ ๊ฒฝ๋ก๋ก ๊ธธ์ฐพ๊ธฐ๋ฅผ ์ ๊ณตํด์ฃผ๊ณ ์๋ค.


2. Match API
GPS ๊ถค์ ๋ฐ์ดํฐ๋ฅผ ์ค์ ๋๋ก์ ๋งค์นญ์ํค๋ API์ด๋ค. ๊ฐ ์ขํ์ ์ ๋ฐ๋๋ฅผ ์ ๋ ฅ๋ฐ์ ๊ฐ์ฅ ๊ฐ๋ฅ์ฑ์ด ๋์ ๊ฒฝ๋ก๋ฅผ ์ฐพ์ ๋ฐํํด์ค๋ค.
GET /match/v1/{profile}/{coordinates}?timestamps={timestamps}
ex. GET /match/v1/foot/127.027,37.497;127.028,37.498;127.029,37.499 ?timestamps=1701234567;1701234577;1701234587 &overview=full&geometries=geojson
ํด๋น API์ ํต์ฌ ๋ก์ง์ '์๋ ๋ง๋ฅด์ฝํ ๋ชจ๋ธ(Hidden Markov Model/HMM)'์ ๊ธฐ๋ฐ์ผ๋ก ํ Viterbi ์๊ณ ๋ฆฌ์ฆ์ ์ด์ฉํด ๊ตฌํ๋๋ค. ํด๋น ์๊ณ ๋ฆฌ์ฆ์ ๋์์ ๋ค์๊ณผ ๊ฐ์ด ์ด๋ค์ง๋ค.
- ๊ฐ GPS ์ขํ๋ง๋ค ๋ฐ๊ฒฝ ๋ด์ ๊ฐ๋ฅํ ๋๋ก ์ง์ ๋ค(ํ๋ณด)์ ์ฐพ๋๋ค.
- ๊ฐ ํ๋ณด์ ๋ํด ๋ฐฉ์ถ ํ๋ฅ ๊ณผ ์ ์ด ํ๋ฅ ์ ๊ณ์ฐํ๋ค.
- Viterbi ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ๊ฐ์ฅ ํ๋ฅ ์ด ๋์ ๊ฒฝ๋ก๋ฅผ ์ ํํ๋ค.
๊ตฌ์ฒด์ ์ผ๋ก '์๋ ๋ง๋ฅด์ฝํ ๋ชจ๋ธ'์ ๋ํด ์ค๋ช ํ๋ฉด ์๋์ ๊ฐ๋ค.
์ค์ ๋๋ก: Road1 -------- Road2 -------- Road3
| | |
GPS1 GPS2 GPS3
(๊ด์ธก๊ฐ) (๊ด์ธก๊ฐ) (๊ด์ธก๊ฐ)
GPS1์ Road1 ๊ทผ์ฒ์์ ์ธก์ GPS2๋ Road2์์ ๋ฉ๋ฆฌ ํ GPS3์ Road3 ๊ทผ์ฒ์์ ์ธก์
๋ฌธ์ : GPS2๊ฐ ์ค์ ๋ก๋ ์ด๋ ๋๋ก์ ์์์๊น?
์ฆ, ๊ด์ธก๊ฐ์ ๋ณด๊ณ ๊ฐ์ฅ ๊ฐ๋ฅ์ฑ ๋์ ์จ๊ฒจ์ง ์ํ(์ค์ ์์๋ ๋๋ก ์์น)๋ฅผ ์ฐพ๋ ๊ฒ์ด๋ค. ์ด๋ ํ๋ฅ ๋ก ๊ธฐ๋ฐํ์ฌ ์ฐพ๋๋ค.
- ๋ฐฉ์ถ ํ๋ฅ (Emission Probability)
ํน์ ๋๋ก ์์ ํน์ ์ขํ๊ฐ ๋ฐ๊ฒฌ๋ ํ๋ฅ ์ด๋ค.
๊ฐ๋จํ๊ฒ ์ค๋ช ํ๋ฉด ์ํ์ ๊ณ์ฐ์ ํตํด ํ๋ฅ ์ ๊ตฌํ๊ณ , ์ด ๊ฐ์ด ํด์๋ก ๊ฐ๋ฅ์ฑ์ด ๋๋ค๊ณ ํ๋จํ๋ค. ์ํฅ์ ์ฃผ๋ ๋ณ์๋ก๋ GPS ์ขํ์ ์ ํ๋์ ๋๋ก์ ์ขํ ์ฌ์ด์ ๊ฑฐ๋ฆฌ๊ฐ ์๋ค.
- ์ ์ด ํ๋ฅ (Transition Probability)
์ด๋ ์ด์ ๋๋ก ์ง์ ์์ ํ์ฌ ๋๋ก ์ง์ ์ผ๋ก ์ด๋ํ์ ํ๋ฅ ์ ๊ตฌํ๋ ๊ฒ์ด๋ค.
์ค์ ๋๋ก๋ฅผ ๋ฐ๋ผ ์ด๋ํ ๊ฑฐ๋ฆฌ์ ์ฃผ์ด์ง ์ขํ ๊ฐ ์ง์ ๊ฑฐ๋ฆฌ๋ฅผ ๋น๊ตํ๋ค. ๋ ๊ฐ์ ์ฐจ์ด๊ฐ ์์์๋ก ๋์ ํ๋ฅ ์ ๊ฐ์ง๋ค.
ํ๋ก์ ํธ์์๋ ํด๋น API๋ฅผ ์ด์ฉํด ๋๋ก์ ์ ํํ๊ฒ ๋งคํ๋์ง ์์ ๋ฌ๋ ์ฝ์ค ์ขํ๋ค์ ์์ ํ๊ธฐ ์ํด์ ์ฌ์ฉํ๊ณ ์๋ค.


'๊ฐ๋ฐ > ๋ฐ์ธ๊ถ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| OSRM Match API๋ก ๋ฌ๋ ์ฝ์ค ๋ฐ์ดํฐ ์ขํ ๋ณด์ ํ๊ธฐ (0) | 2025.12.14 |
|---|---|
| API ๋ฌธ์ ๊ฐ์ ๊ณผ ๋ฌธ์ํ ํด Stoplight๋ก ๋ณ๊ฒฝํ๊ธฐ (0) | 2025.12.07 |
| ํ๋ก์ ํธ์์ Batch Job ๋ก๊ทธ์ MDC๋ฅผ ์ ์ฉํ๋ค. (0) | 2025.10.26 |
| ๋๋ฉ์ธ ๊ฐ์ฒด ์์ฑ ๋ก์ง ๊ด๋ จ ๊ณ ๋ฏผ (0) | 2025.10.06 |
| ์๋ฒ์์ ์ง์์ ์ธ OutOfMemory๊ฐ ๋ฐ์ํ๋ ๋ฌธ์ ํด๊ฒฐ (3) | 2025.09.29 |