6 minute read

Pada bulan Juni lalu, saya pernah menuliskan bagaimana cara mendapatkan data berupa nama kecamatan, kota / kabupaten, dan provinsi dari data berupa titik longlat menggunakan R. Hal itu dimungkinkan menggunakan data geografi shapefile yang didapatkan dari situs GADM. Sekarang saya akan coba mengutilisasi data shapefile tersebut lebih lanjut.

Saya akan mencari batas-batas wilayah longlat dari semua kota yang ada di Indonesia.

Bagaimana caranya? Cekidot!

Persiapan

Pertama-tama kita memerlukan data shapefiles dari situs GADM. Kemudian pada R, silakan install library(sf). Betul, kita memerlukan library(sf) untuk mengambil data dari shapefile tersebut.

Pengambilan Data

Sekarang kita akan ambil data batas wilayah dari shapefile yang ada. Saya akan baca file bernama gadm41_IDN_2.shp dari GADM. Jika kalian hendak mendapatkan data batas untuk level kecamatan, maka kita memerlukan data shapefile level ketiga.

# step 1
# kita baca shapefile menggunakan library sf
library(sf)
city_boundary   = st_read("gadm41_IDN_2.shp")

Dari object bernama city_boundary kita sebenarnya sudah mendapatkan sejenis data frame yang berisi semua data wilayah perkota. Namun strukturnya masih cukup rumit untuk sebagian besar orang. Maka saya akan buat satu function untuk melakukan ekstraksi lebih lanjut dan menjadikannya dalam struktur data frame yang rapi. Sebagai input function-nya adalah nama kota yang sudah didapatkan dari object city_boundary.

# step 2
# merapikan bentuk data menjadi data frame
# dimulai dari mempersiapkan data input
city_boundary = 
  city_boundary |> 
  mutate(pencarian = paste(NAME_1,NAME_2,sep = "-"))

# menuliskan semua nama kota
nama_semua_kota = city_boundary$pencarian

# membuat function per kota
extrak_kota = function(kota_input){
  # ambil longlatnya
  selected_city = city_boundary %>% filter(pencarian == kota_input)
  bbox = sf::st_bbox(selected_city)
  min_lat = bbox[2]
  max_lat = bbox[4]
  min_lon = bbox[1]
  max_lon = bbox[3]
  
  output  = data.frame(kota = kota_input,
                       min_lat,max_lat,min_lon,max_lon)
  
  return(output)
}

Setelah ini saya akan lakukan komputasi parallel untuk semua kota tersebut.

# memanggil library(parallel)
library(parallel)
# menentukan berapa banyak cores yang terlibat
ncore = detectCores()

# run parallel function-nya
temp       = mclapply(nama_semua_kota,extrak_kota,mc.cores = ncore)
batas_kota = 
  data.table::rbindlist(temp) %>% as.data.frame() |> 
  separate(kota,into = c("provinsi","kota"),sep = "\\-")

Segitu aja caranya. Prosesnya cukup mudah dan cepat. Berikut adalah sampel dari data yang saya dapatkan:

              provinsi              kota   min_lat    max_lat  min_lon  max_lon
1      Bangka Belitung     Bangka Tengah -2.721151 -2.1445124 105.7493 106.8494
2         Jakarta Raya     Jakarta Timur -6.370783 -6.1514230 106.8383 106.9719
3          Jawa Tengah          Grobogan -7.283214 -6.9126353 110.5415 111.2468
4           Jawa Timur             Tuban -7.165087 -6.7537127 111.5701 112.2220
5  Nusa Tenggara Timur       Sumba Barat -9.797201 -9.3734970 119.1436 119.5430
6                Papua           Waropen -3.282288 -2.1763300 136.0091 137.3843
7                 Riau   Indragiri Hilir -1.122273  0.5373848 102.5550 103.8146
8     Sulawesi Selatan        Luwu Timur -3.013185 -2.0510042 120.4716 121.7904
9     Sulawesi Selatan        Luwu Utara -2.918168 -1.8952355 119.6283 120.6560
10    Sulawesi Selatan Sidenreng Rappang -4.133101 -3.4830859 119.6641 120.3317

Perlu saya garis bawahi bahwa untuk mempermudah penulisan batas wilayah, digunakan rounding box berbentuk persegi.

Dengan menggunakan prinsip yang sama dengan simulasi Monte Carlo ini, kita bisa menggambarkan area sebenarnya dari suatu kabupaten kota. Misalkan saya hendak menggambarkan Kota Kediri.

          used (Mb) gc trigger (Mb) max used (Mb)
Ncells  850947 45.5    1402950   75  1402950 75.0
Vcells 1509214 11.6    8388608   64  2425871 18.6

Semoga membantu.


if you find this article helpful support this blog by clicking the ads.