Membuat Peta dengan R dan Leaflet: Contoh Data Twitter

Beberapa waktu lalu ketika sedang mencari cara untuk membuat peta dengan R, Google menunjukkan satu package yang sangat menarik - leaflet. Package yang dikembangkan oleh RStudio ini merupakan interface untuk membuat peta dengan memanfaatkan Leaflet, salah satu JavaScript library untuk pemetaan yang sangat populer dan tentu saja open-source.

Berbeda dengan package lain (seperti RgoogleMaps, ggmap dan maps) yang menghasilkan peta statis, leaflet memudahkan kita untuk membuat peta interaktif yang lebih hidup hanya dengan beberapa baris kode R, tanpa perlu mempunyai pengetahuan tentang JavaScript. Tertarik untuk mencoba? Inilah hasil “eksperimen” pertama saya dengan R dan leaflet.

Persiapan

Sebenarnya dengan R saja cukup, namun saya merekomendasikan RStudio. Instal package leaflet dari CRAN:

install.packages("leaflet")

Atau dari GitHub, untuk versi development

devtools::install_github("rstudio/leaflet")

Lalu load ke dalam R session

library(leaflet)

Menandai suatu titik koordinat

OK! saatnya kita “bermain” dengan leaflet. Sebelum menggunakan data Twitter, mari kita mulai dengan menandai suatu titik koordinat pada peta dengan icon marker, misalnya untuk lokasi “Bundaran Hotel Indonesia” yang menurut Google Maps berada pada koordinat (-6.1949571, 106.8230631).

point <- "Bundaran Hotel Indonesia"
latitude <- -6.1949571
longitude <- 106.8230631

map <- leaflet() %>%
  addTiles() %>%
  addMarkers(lng=longitude, lat=latitude, popup=point)
map

Penjelasannya kurang lebih:

  1. leaflet() : menginisiasi leaflet workspace, seakan sebuah kanvas di mana peta akan digambar di atasnya.
  2. addTiles() : menambahkan peta dasar base-map (secara default menggunakan OpenStreetMap).
  3. addMarkers() : menandai titik koordinat (lng untuk longitude dan lat untuk latitude) dengan icon marker. Opsi popup berguna untuk nenampilkan teks jika icon di-klik.

Kode di atas menggunakan pipe operator (%>%) dari package magrittr, yang ekuivalen dengan:

map <- leaflet()
map <- addTiles(map)
map <- addMarkers(map, lng=longitude, lat=latitude, popup=point)
map

Memetakan data Twitter

Kenapa data Twitter? Beberapa kali saya men-download data Twitter melalui search API baik menggunakan package twitteR maupun tools lain. Salah satu hal menarik mengenai tweet-tweet tersebut adalah adanya geo-coordinate, titik latitude dan longitute, yang menandai lokasi di mana mereka di-posting. Memang, informasi ini tidak tersedia untuk semua tweets, tapi cukup kaya untuk dieksplorasi seperti yang akan kita lakukan sekarang.

Dimulai dengan men-download tweets berdasarkan kata kunci tertentu menggunakan twitteR :

library(twitteR)
setup_twitter_oauth(consumer_key = "XXX", 
                    consumer_secret = "XXX", 
                    access_token = "XXX", 
                    access_secret = "XXX")

tweetsList <- searchTwitteR("makan siang",
                            geocode = paste(latitude, longitude, "20km", sep = ","),
                            n = 1000)

Dengan fungsi di atas, kita berhasil mendapatkan 600-an tweets dengan kata kunci “makan siang” yang berada dalam radius 10km seputar Bundaran Hotel Indonesia, Jakarta.

Konversi tweetList menjadi data frame:

tweets <- twListToDF(tweetsList)

Sebaiknya titik koordinat merupakan kolom numerik dan tidak ada data yang latitude/longitude-nya kosong (NA atau NULL).

tweets$latitude <- as.numeric(tweets$latitude)
tweets$longitude <- as.numeric(tweets$longitude)
tweets <- tweets[!is.na(tweets$latitude) & !is.na(tweets$longitude),]

Sekarang kita siap untuk mapping titik-titik koordinat data Twitter tersebut dengan leaflet:

tweetsmap <- leaflet(data = tweets) %>% 
  addTiles() %>%
  addMarkers(lng = ~longitude, lat = ~latitude, popup = ~screenName)
tweetsmap

(Hanya 100 twit pertama yg ditampilkan agar loading tidak terlalu lama)

Nice! Seluruh titik koordinat sudah kita tampilkan dalam peta hanya dengan empat baris kode R. Mudah, bukan?

Tentu saja kita bisa membuat tampilan peta tersebut menjadi lebih baik. Misalnya, ada dua hal sederhana yang saya lakukan dalam “eksperimen” ini. Pertama, menjadikan teks pada popup sebagai link untuk membuka tweets pada laman Twitter dengan cara mengubahnya menjadi konten HTML dengan format:

"<a href="https://twitter.com/SCREENNAME/status/STATUSID" target="_blank">SCREENNAME</a>"

Berikut ini perintah untuk membuat konten HTML tersebut:

link2tweet <- paste("https://twitter.com",
                    tweets$screenName,
                    "status",
                    tweets$id,
                    sep = "/")

popupLink <- paste0("<a href=\"",
                    link2tweet,
                    "\" target=\"_blank\">",
                    tweets$screenName,
                    "</a>")

Kedua, membuat marker cluster sehingga titik-titik pada peta tidak terlalu padat. Marker cluster mengelompokkan beberapa titik yang berdekatan dalam cluster dan menampilkan kembali seluruh titik apabila peta diperbesar (zoom-in). Untuk membuat marker cluster pada peta baru kita buat tadi bisa dilakukan dengan terlebih dahulu menghapus markers menggunakan fungsi clearMarkers(), lalu buat kembali dengan fungsi addMarkers() yang ditambahkan dengan opsi markerClusterOptions().

tweetsmap <- clearMarkers(tweetsmap) %>%
  addMarkers(popup = popupLink, clusterOptions = markerClusterOptions())
tweetsmap

Note: Jika latitude dan longitude tidak dinyatakan secara eksplisit, addMarker() akan mencari kolom lat/latitude dan lon/lng/long/longitude (case-sensitive) pada data-frame.

Ini adalah hasil akhir yang kita peroleh. Klik pada titik cluster untuk memperbesar peta!

Kurang canggih? Masih ada fitur-fitur leaflet yang lain untuk kita eksplorasi seperti mengganti map tiles, modifikasi markers dan pop ups, menambahkan polygons dan lines, dan banyak lagi.