dersblog

Yol Tarifi, Harita Bilgisi: osrm-backend

Verili herhangi bir enlem / boylam kordinatına en yakın sokak, yol isimlerini, yerlerini bulabilen, hatta bir noktadan diğerine nasıl gidileceğini veren bir veri tabanı ve program OSRM. Aslında bu arkadaşlar OpenStreetMap adli projenin veri tabanını daha iyi erişilebilir hale getirmişler.

https://github.com/Project-OSRM

Proje C++ bazlı, hızlı işliyor. İçinde OSM projesinin dosyalarını alıp onları daha ufaltan, ve bir servis ve API üzerinden dış erişime hazır hale getiren kodlar var. Bu servisin nasıl işlediğini göstermek için kendileri bir bedava servis işletiyorlar,

http://router.project-osrm.org

Mesela alttaki kordinata en yakin cadde hangisidir

http://router.project-osrm.org/nearest/v1/foot/29.036428,40.987659

ile bulunabiliyor, çıktı JSON formatında. İki nokta arasında nasıl gidilir, hangi caddeler kullanılır,

http://router.project-osrm.org/route/v1/foot/29.036428,40.987659;29.039228,40.992186

URL içinde v1 ardından gidiş şekli verilmeli, araba için car, bisiklet için bicycle; üstteki yürüyerek.

Servisten gelen verileri işlemenin basit yollarından biri tarifte kordinat yol parçalarını birleştirip bir harita üzerinde grafiklemek. Bir örnek üzerinde görelim; Halep'ten Latakiye'ye arabayla gitmenin en kısa yolu nedir?

import polyline, folium, requests, json

url = 'http://router.project-osrm.org/route/v1/car/' + \
      '37.11567869,36.1914480688;35.79320374,35.5497624150' + \
      '?alternatives=false&steps=false'
response = requests.get(url, verify=False)
resp = json.loads(response.text)
decoded = polyline.decode(resp["routes"][0]['geometry'])
map = folium.Map(location=(36,37),zoom_start=5,control_scale=True)
folium.PolyLine(locations=decoded, color="blue").add_to(map)
map.save('tarif1.html')

Çıktıyı şurada görebiliriz.

İstenen her türden veri üstteki bedava servisten alınabilir, ama başkasının servisini fazla yormamak (!) için (ve yerel bazlı erişim daha hızlı olur tabii) kendi servisimizi oluşturabiliriz.

Kod Github'dan indirilir, ve apt-get install alttakiler uzerinde isletilir,

cmake libtbb-dev lua5.2 libboost-all-dev liblua52 libluabind-dev liblua5.2-dev libluabind-dev libstxxl-dev libxml2 libxml2-dev libosmpbf-dev libbz2-dev libprotobuf-dev

Simdi proje dizinine girilip

mkdir -p build
cd build
cmake .. -DCMAKE_BUILD_TYPE=Release
cmake --build .
sudo cmake --build . --target install

isletilir. Ayrica ayni dizinde hangi ulasim sekli var ise, onun lua dosyasina Unix sembolik baglanti kurulmali, mesela araba yontemi icin

ln -s profiles/car.lua .

Kurulum bitti, simdi veri lazim, mesela Turkiye icin

http://download.geofabrik.de/europe/turkey.html turkey-latest.osm.bz2

Tum veri icin http://download.geofabrik.de

Bu dosya acilir, simdi dosya uzerinde

osrm-extract turkey-latest.osm

ve

osrm-contract turkey-latest.osrm

Dikkat bu komutlari lua linki neredeyse oradan isletmek lazim. O zaman osrm dosya referansina dizin ismi eklemek gerekebilir.

Bu son komut uzun surecek, 30-40 dakika gibi.. Bittikten sonra artik veri hazir, veri dizininde

osrm-routed map.osrm

isletilir. Bu komut 5000 port'unu dinleyen bir servis baslatir. Artik ustteki turunden tum komutlarda http://router.project-osrm.org yerine http://localhost:5000 kullanilabilir.

Kaynaklar

https://www.digitalocean.com/community/tutorials/how-to-set-up-an-osrm-server-on-ubuntu-14-04

https://github.com/Project-OSRM/osrm-backend/wiki/Running-OSRM

https://github.com/Project-OSRM/osrm-backend/blob/master/docs/http.md


Yukarı