8 minute read

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:

  1. car,
  2. bike, dan
  3. foot.

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.