Menghitung Jarak Antara Dua Lokasi di R Menggunakan OSRM
Tulisan ini masih nyambung dengan tulisan saya kemarin pagi, yakni tentang data geografis. Kali ini saya masih membawakan tema geomarketing dengan alternatif pengerjaan yang berbeda tentunya. Apa itu?
Saya akan menjelaskan penggunaan OSRM (OpenStreetMap-Based Routing Service) untuk mencari jarak dan waktu berkendara dari satu lokasi ke lokasi yang lain.
Biasanya sehari-hari saat hendak bepergian dari satu lokasi ke lokasi yang lain, kita mengecek jarak dan waktu berkendara menggunakan layanan dari Google Maps. Layanan tersebut juga bisa digunakan di R atau Python dengan cara memanggil API dari Google. Namun seperti biasa, layanan ini berbayar. Jika kita menggunakan OSRM, kita bisa melakukan hal yang serupa dengan gratis. Basis peta yang dijadikan acuan adalah Open Street Map.
Memangnya apa faedahnya kita mencari jarak dan waktu berkendara?
Masih ingat postingan saya terkait analisa geomarketing warteg, padang, dan mie ayam?
Untuk menghitung aksesbilitas pada postingan tersebut, saya menggunakan jarak euclidean langsung dari titik longlatnya. Dengan menggunakan OSRM, saya bisa mendapatkan jarak real dari Open Street Maps dari titik tertentu ke titik tertentu.
Bagaimana caranya? Cekidot!
Library
Instalasi
Kita mulai dari install library yang dibutuhkan:
install.packages("osrm")
Berhubung saya menggunakan Linux, saat saya mengeksekusi perintah di atas menggunakan R, saya akan mendapatkan pesan error bahwa ada beberapa filesystem Linux yang missing. Oleh karena itu, saya perlu run perintah berikut di Linux terminal.
apt-get -y update && apt-get install -y libudunits2-dev libgdal-dev libgeos-dev libproj-dev
Bagi pengguna Windows, saya belum tahu apakah ada masalah serupa atau tidak.
Memanggil Libraries
Setelah terinstall sempurna, mari kita panggil libraries yang diperlukan:
library(osrm)
library(dplyr)
library(sf)
Pada skrip di atas, saya memanggil library(sf)
dengan tujuan untuk
membuat visualisasi dari rute yang terbentuk kelak. Namun, jika tidak
diperlukan maka kalian tidak perlu memanggil library itu.
Function yang Digunakan
Sekarang saya akan membahas tentang dua functions utama yang sering saya pakai. Namun, saya akan berikan dulu data dummy yang saya gunakan. Datanya adalah data longlat yang kemarin kita dapatkan dari geocoding.
address | latitude | longitude |
---|---|---|
Wisma 46 Jakarta | -6.203538 | 106.8199 |
Hotel Tentrem Jogjakarta | -7.795102 | 110.3696 |
Kampus Ganesha ITB Bandung | -6.894440 | 107.6094 |
Nutrifood Pulogadung Jakarta | -6.179720 | 106.8803 |
Menghitung Jarak Antar Dua Lokasi
Misalkan saya hendak mengukur jarak antara Wisma 46 Jakarta dengan Nutrifood Pulogadung Jakarta, maka berikut adalah caranya:
titik_awal = df |> filter(address == "Wisma 46 Jakarta") |> select(-address)
titik_akhr = df |> filter(address == "Nutrifood Pulogadung Jakarta") |> select(-address)
osrmRoute(src = c(titik_awal$longitude, titik_awal$latitude),
dst = c(titik_akhr$longitude, titik_akhr$latitude),
overview = FALSE)
duration distance
11.79 11.02
Secara default, profile yang digunakan adalah car
. Artinya jarak
dan waktu dari Wisma 46 ke Nutrifood dihitung jika kita menggunakan
mobil.
Kita dapatkan waktu tempuh sebesar 11.79 menit dan jarak sebesar 11.02 km.
Bagaimana jika kita ingin mengubah profilnya? Profil yang disediakan
oleh osrm
adalah:
car
,bike
, danfoot
.
Kita cukup menggantinya pada skrip di atas.
Sekarang saya akan membuat visualisasi rute yang terbentuk antara dua lokasi tersebut jika profilnya foot.
rute =
osrmRoute(src = c(titik_awal$longitude, titik_awal$latitude),
dst = c(titik_akhr$longitude, titik_akhr$latitude),
overview = "full",
osrm.profile = "foot")
plot(st_geometry(rute))
rute
Simple feature collection with 1 feature and 4 fields
Geometry type: LINESTRING
Dimension: XY
Bounding box: xmin: 106.8199 ymin: -6.20443 xmax: 106.8805 ymax: -6.17973
Geodetic CRS: WGS 84
src dst duration distance geometry
src_dst src dst 133.9967 10.0471 LINESTRING (106.82 -6.2042,...
Kita dapatkan durasinya menjadi ~133 menit dengan durasi ~10 km.
Membuat Matriks Jarak
Function lain yang sangat bermanfaat adalah membuat matriks jarak. Jadi jika ingin melihat jarak antar lokasi dari empat titik dari data, kita bisa memanfaatkan function berikut ini:
input = df |> select(longitude,latitude)
osrmTable(src = input,measure = c('duration', 'distance'),osrm.profile = "bike")
$durations
1 2 3 4
1 0.0 2113.2 609.0 41.6
2 2106.4 0.0 1687.2 2094.0
3 609.1 1686.8 0.0 596.7
4 42.0 2097.9 593.7 0.0
$distances
1 2 3 4
1 0 544334 155202 9921
2 542095 0 429798 538524
3 155196 429626 0 151625
4 9984 539678 150546 0
$sources
lon lat
1 106.8200 -6.204204
2 110.3690 -7.795230
3 107.6096 -6.894429
4 106.8805 -6.179725
$destinations
lon lat
1 106.8200 -6.204204
2 110.3690 -7.795230
3 107.6096 -6.894429
4 106.8805 -6.179725
Keterangan: durasi dalam menit dan jarak dalam meter.
Dari hasil di atas kita bisa mendapatkan matriks jarak dan durasi tempuh antar lokasi pada data.
if you find this article helpful, support this blog by clicking the ads.