Membuat Peta Zomato Foodie Index dengan ArcGIS
Sebagai penggemar makan, aplikasi Zomato menjadi salah satu andalan saya ketika berburu restaurant baru, terutama di Jakarta. Selain daftar restaurantnya yang terbilang lengkap dan update, rating restaurant yang ditampilkan cenderung sesuai dengan penilaian saya pribadi. Sebagai catatan; saya bukan mempromosikan aplikasi Zomato, tetapi saya merasa cukup terbantu dengan kehadirannya.
Ternyata, saya baru tahu bahwa Zomato membuka API-nya untuk developers. Dan salah satu API yang bisa kita akses adalah untuk mengetahui Zomato Foodie Index. Menurut keterangan di websitenya, Zomato Foodie Index dapat digunakan untuk mengetahui apakah suatu area populer untuk “kulineran” atau tidak.
Setelah saya cek lebih lanjut, ada dua index yang mereka buat; Popularity dan Nightlife Index. Tidak ada penjelasan detail mengenai arti dari kedua index ini maupun cara pembuatannya. Saya asumsikan Popularity Index bisa menunjukkan apakah suatu area memiliki banyak restaurant yang rating usernya tinggi atau tidak. Jika suatu area Popularity Indexnya tinggi, bisa kita asumsikan area itu populer sebagai tempat makan. Nightlife Index mungkin mirip dengan Popularity Index, bedanya hanya kategori restaurant yang dipertimbangkan adalah restaurant atau establishment nightlife semisal bar, lounge, atau restaurant yang buka hingga tengah malam.
Berikut ini adalah contoh hasil akhir pemetaan Zomato Foodie Index yang saya lakukan:
Kalian juga bisa membuat sendiri peta ini untuk kota-kota lain yang pengguna Zomatonya cukup banyak; misalnya Bandung. Caranya akan saya jelaskan di bawah ini. Yang kita butuhkan hanya ArcGIS Pro dengan Data Interopability Extension dan ArcGIS Online subscription.
Mendapatkan API Key dari Zomato
API Key Zomato bisa kita request dari website ini: https://developers.zomato.com/ . API yang tersedia di website ini dapat digunakan gratis dengan batasan 1000 calls per hari. Artinya kita hanya dapat melakukan request maksimum 1000 kali per hari. Kalau kita membutuhkan lebih dari itu atau pengguna aplikasi yang kita buat sudah sangat banyak, kita dianjurkan untuk menghubungi pihak Zomato.
Untuk tutorial ini kita tidak membutuhkan lebih dari 1000 calls per hari, sehingga kita bisa menggunakan versi free APInya.
Membuat Hexagon Tiles
Ketika membaca dokumentasi API Zomato, saya menemukan bahwa untuk mengetahui Foodie Index di suatu area, kita bisa memasukkan nama tempat (misal: Cikini, Cilandak, dsb) atau longitude dan latitude suatu lokasi sebagai parameter query.
Saya segera menyadari bahwa akan cukup sulit untuk mendaftar semua nama ‘tempat’ di Jakarta. Saya juga tidak mengetahui bagaimana Zomato menentukan batas suatu area dalam membuat Foodie Index-nya. Maka pendekatan yang saya lakukan adalah dengan membuat tiles dengan bentuk hexagon dengan ukuran yang cukup rapat agar area Foodie Index-nya tidak ada yang terlewat, tetapi cukup luas agar jumlahnya tidak lebih dari 1000 tiles untuk seluruh Jakarta. Nantinya, kita bisa mengambil koordinat centroid dari masing-masing hexagon ini sebagai query parameter di Zomato API.
Untuk membuat tiles, kita bisa menggunakan geoprocessing tool di ArcGIS Pro bernama Generate Tessellation. Kita bebas menentukan apakah tiles yang dibuat mau berbentuk hexagon seperti yang saya buat atau kotak. Selain itu, jangan lupa memasukkan parameter extent pada tool tersebut. Kitabisa menggunakan shapefile atau feature class batas administrasi DKI Jakarta atau kota lain sebagai extent-nya. Untuk luas masing-masing hexagon, saya memasukkan angka 1 Kilometer Persegi (Square Kilometers).
Setelah memasukkan semua parameter yang dibutuhkan, tool tersebut akan membuat feature class tessellation yang kita butuhkan.
Menambahkan Koordinat Centroid
Jika kita membuka attribute table di layer tessellation yang kita buat, kita bisa melihat bahwa masing-masing hexagon sudah memiliki grid id, tetapi belum ada koordinat lon lat centroidnya. Untuk mendapatkan koordinat tersebut, kita bisa menggunakan geoprocessing tool Add Geometry Attributes.
Masukkan centroid coordinates atau central point coordinates pada parameter Geometry Properties dan gunakan WGS 1984 pada parameter Coordinate System untuk memastikan kita mendapatkan nilai koordinat dalam satuan decimal degree.
Setelah menjalankan tool tersebut, di attribute table pada layer tessellation kita, sudah ada tambahan dua kolom baru; yaitu centroid x dan y. Nilai inilah yang akan kita gunakan untuk query Foodie Index di API Zomato.
To Script or Not to Script
Sampai di bagian ini, yang perlu kita lakukan adalah looping setiap row pada layer tessellation kita dan mengirimkan HTTP Request dengan parameter lon lat yang sudah kita miliki ke API Zomato. Kalau kita mau, kita bisa membuat script misalnya dengan Python atau Node.js untuk melakukan hal ini. Apalagi sekarang sudah ada embedded Jupyter Notebook di ArcGIS Pro, pekerjaan scripting kita di GIS bisa lebih seamless lagi.
Tetapi kali ini saya tidak mau membuat script dan memilih untuk menggunakan extension di ArcGIS Pro bernama Data Interopability Extension. Jika kita sudah memiliki licensenya dan menginstall komponen Data Interopability ini di ArcGIS Pro, kita bisa mengakses Workbench-nya di toolbar Analysis.
Workspace 1: Feature Class to JSON
Setiap kali kita menjalankan Data Interopability Workbench, kita akan mulai dari satu workspace kosong. Di workspace pertama ini, kita akan melakukan feature manipulation, yaitu dari feature class tessellation yang kita miliki, kita akan melakukan HTTP request ke Zomato API dan menyimpan hasil Foodie Index yang kita dapatkan ke dalam suatu file JSON.
Pertama, kita harus menambahkan Reader ke dalam workspace. Klik menu Readers → Add Reader. Pilih format File Geodatabase (karena saya menyimpan layer tessellation saya di File Geodatabase) dan pilih lokasi File GDB yang dimaksud. Nantinya kita akan diminta memilih feature class apa yang akan digunakan. Tidak perlu pilih semua jika kita punya lebih dari satu feature class di File GDB yang sama. Cukup centang feature class tessellation yang diperlukan saja. Setelah itu, reader tersebut akan muncul di workspace kita.
Setelah itu, kita perlu menambahkan transformer. Klik menu Transformers → Add Transformer. Di sini, kita bisa mencari transformer bernama HTTPCaller. Setelah memilih transformer tersebut, ia akan muncul juga di workspace kita. Kemudian, kita bisa mengatur parameter dari transformer tersebut dengan menekan ikon roda berwarna merah.
Di window parameter, kita dapat mengisi kolom-kolom yang ada sesuai kebutuhan. Pertama kita harus mengisi parameter Request URL dengan url Zomato API yang sesuai, yaitu: https://developers.zomato.com/api/v2.1/geocode dan HTTP Method GET. Sesuai dokumentasi yang disediakan Zomato, kita bisa memasukkan query parameter lon dan lat yang nilainya bisa kita ambil dari attribute centroid x dan centroid y feature class tessellation kita. Selanjutnya, kita perlu mengisi header parameter dengan user-key yaitu API key yang kita sudah dapatkan sebelumnya.
Sesuai dengan dokumentasi Zomato API, response body yang akan kita dapatkan dari HTTP request tersebut akan berformat JSON. Oleh karenanya, agar kita bisa dengan mudah segera menyimpan semua result request kita dan mengevaluasi isinya, semua response body yang kita terima akan disimpan dalam sebuah JSON file. Saya tidak akan melakukan formatting apapun terhadap JSON file ini maupun mentransformasikannya ke dalam format lain sebelum saya memahami isinya.
Berikutnya, kita akan menambahkan sebuah Writer. Klik menu Writers → Add Writer. Pilih format JSON dan beri nama untuk file JSON yang akan dibuat. Setelah writer tersebut muncul di workspace, kita harus menghubungkannya dengan transformer HTTPCaller kita telebih dahulu. Baru setelah itu kita edit parameternya.
Di tab User Attributes, ubah Attribute Definitionnya menjadi Manual. Buang attributes yang tidak diperlukan dengan klik kanan → remove row. Saat ini, yang perlu ada hanya atribut GRID ID dan response body. Pada atribut response body, ubah nilai kolom Type-nya menjadi json. Setelah menutup window parameter, kita harus menghubungkan output HTTPCaller dengan atribut yang sesuai pada writer kita.
Jika semua langkah sudah sesuai, tampilan workspace kita akan terlihat seperti ini pada akhirnya:
Selanjutnya kita tinggal menjalankan workspace kita dengan menekan ikon Run.
Setelah proses run workspace selesai dan semua features telah terisi, kita bisa membuka file JSON hasil transformasi barusan dan mengecek struktur isinya.
Kita bisa melihat salah satu key Popularity yang berisi index Popularity dan Nightlife suatu lokasi. Nilai inilah yang akan kita petakan ke dalam feature tessellation yang sudah kita buat dalam langkah sebelumnya dengan mengacu pada GRID ID yang ada.
Workspace 2: Join JSON to Feature
Untuk melakukan tahap ini, kita bisa membuat Workspace baru di Workbench kita. Pertama, kita bisa menambahkan Reader format JSON untuk dapat membaca file hasil transformasi kita sebelumnya.
Jika kita membuka parameter setting writer tersebut, kita bisa melihat attributes apa saja yang tersedia. Karena isinya sangat banyak, kita bisa mengekspos beberapa atribut saja yang kita perlukan, misal: GRID ID, title, popularity, nightlife index, dan top Cuisines. Pastikan di layar hanya tercentang atribut-atribut tersebut saja.
File JSON yang sudah dibaca dengan Reader barusan harus kita proses tersebih dahulu dengan transformer bernama AttributeCreator. Hal ini dibutuhkan karena value key Top Cuisines dari JSON yang kita miliki berbentuk array. Di contoh ini, saya akan memasukkan nilai-nilai di dalam array tersebut ke dalam kolom yang berbeda. Kita bisa mengatur hal tersebut di dalam parameter transformer AttributeCreator tadi.
Berikutnya, kita masukkan satu Reader lagi untuk feature tessellation yang kita buat sebelumnya. Karena sebelumnya saya menyimpan tessellation saya di dalam File GDB, saya memasukkan Reader untuk File GDB. Selanjutnya saya hanya memilih feature tessellation saya saja untuk diproses Reader tersebut.
Setelah itu, kita bisa memasukkan transformer bernama FeatureJoiner. Transformer ini berfungsi untuk join table antara feature tessellation kita dan file JSON kita barusan dengan mengacu pada GRID ID.
Ketika kita memasukkan transformer tersebut, kita harus menghubungkan feature tessellation kita sebagai Left dan output AttributeCreator sebagai Right. Kemudian kita harus membuka parameter transformer, dan mengubah Join Mode menjadi Left dan Join On dengan attribut GRID ID.
Terakhir, masukkan Writer berjenis File GDB atau Shapefile (boleh pilih salah satu) untuk menyimpan hasil join tersebut sebagai data spasial yang baru. Untuk kasus ini saya memilih untuk menyimpan di dalam Shapefile saja. Saat create writer, jangan lupa mengubah parameter Shapefile Definition menjadi Manual.
Berikutnya, kita tinggal mengisi User Attributes di parameter setting Writer kita dengan atribut-atribut yang kita perlukan. Jangan lupa mengatur type masing-masing atribut sesuai jenis datanya. Untuk popularity dan nightlife index kita bisa memilih float sebagai type-nya. Sementara sisanya bisa berupa char atau string. Setelah itu kita bisa mencocokkan atribut-atribut tersebut dengan output Joined dari transformer FeatureJoiner sebelumnya.
Jika semua langkah sudah sesuai, workspace kita akan terlihat seperti gambar di bawah ini.
Sisanya, kita tinggal klik ikon Run lagi untuk menjalankan workspace ini.
Menampilkan Peta dan Simbolisasi
Jika transformasi berhasil di lakukan, kita bisa membuka feature hasilnya di ArcGIS Pro. Feature ini akan berbentuk hexagon tessellation yang pertama kita buat dengan table berisi kolom-kolom nilai index yang kita dapatkan dari Zomato Foodie Index. Selanjutnya, kita tinggal mengubah simbologinya sesuai dengan nilai index yang ingin kita tampilkan. Dan jika kita ingin menampilkan peta ini secara online, kita tinggal publish ke ArcGIS Online.
Selesai!
Bagaimana jika ingin mengupdate peta ini dengan data terbaru?
Seperti kita ketahui, Foodie Index ini tentunya akan berubah seiring bertambahnya waktu. Jika mau melakukan hal tersebut secara otomatis, kita bisa membuat scheduler task untuk melakukan transformasi di atas sekaligus mempublishnya ke ArcGIS Online. Tutorial ini tidak akan membahas hal tersebut, tetapi jika kita mau hal tersebut bisa kita lakukan.
Silakan mencoba dengan data-data kota lainnya.[]