Maklumat

Tulisan-tulisan terkini dapat juga didapatkan di halaman Kompasiana di alamat https://kompasiana.com/didikaha

Khusus untuk konten-konten sastra seperti puisi, cerpen dan esai silahkan kunjungi http://blog.edelweis-art.com. Terima kasih (Penulis)

Kamis, Mei 25, 2017

API Data Wilayah Administratif di Indonesia

Sebagai pengembang aplikasi, adakalanya kita memerlukan data nama seluruh wilayah administratif yang ada di Indonesia, yang biasanya untuk mempermudah input data alamat.

Jika kita googling, maka sebenarnya telah banyak tersedia source untuk itu, terutama yang disediakan oleh lembaga formal/pemerintah seperti BPS, Kemendagri dan Kemendikbud. Namun demikian, kebanyakan source yang disediakan berupa 'data mentah' dalam bentuk pdf ataupun langsung ditampilkan di websitenya yang perlu pengolahan lagi untuk dapat kita pergunakan yang kadang cukup ribed. Meski ada juga yang menyediakannya dalam bentuk API, salah satunya Kemendikbud tersebut. Nah, melalui postingan ini, saya ingin berbagi tentang API Data Wilayah Administratif di Indonesia yang disediakan oleh Kemendikbud.


Awalnya saya mendapatkan informasi tentang data Kemedikbud tersebut dari portal Satu Data Indonesia (tentu, setelah sebelumnya bertanya-tanya ke mbah Google juga, hehehe).

API yang disediakan, bagi saya, cukup sederhana dan mudah digunakan, yaitu cukup dengan mengakses url http://jendela.data.kemdikbud.go.id/api/index.php/CWilayah/wilayahGET?mst_kode_wilayah=xxxxxx, di mana xxxxxx adalah kode wilayah master untuk mendapatkan data wilayahnya. Misalnya dengan xxxxxx sebagai kode wilayah suatu propinsi, maka kita akan mendapatkan daftar kabupaten/kota yang ada di propinsi tersebut. Demikian seterusnya, sampai dengan daftar desa/kelurahan yang ada di suatu kecamatan. Adapun kode wilayah pokoknya adalah 000000 yang akan menampilkan daftar propinsi yang ada di Indonesia.

Dengan pola seperti itu, sangat memungkinkan untuk kita menggunakannya di website ataupun aplikasi kita secara online, tanpa kita perlu mengunduh/memiliki databasenya sendiri. keuntungan lainnya, data yang kita tampilkan akan selalu mutakhir mengikuti perkembangan update data yang ada di situs Kemendikbud.

Berikut adalah contoh bagaimana menampilkan data wilayah tersebut di website kita dengan bantuan cURL dan jQuery.

Pertama, kita siapkan dua file: form.php dan update.php. File yang pertama kita gunakan untuk menampilkan form yang memuat data wilayah, sedangkan file yang kedua kita gunakan untuk mengolah data wilayah yang dibutuhkan.

Alurnya adalah, mula-mula data propinsi kita tampilkan saat halaman form.php dimuat, sementara data kabupaten/kota, kecamatan dan desa/kelurahan kita biarkan kosong. Selanjutnya, saat kita memilih atau mengganti data propinsi, maka data kabupaten/kota akan ditampilkan. Begitu seterusnya. Untuk menampilkan datanya, menggunakan method post() pada jQuery, form.php mengirimkan request ke  update.php yang selanjutnya akan diteruskan ke situs Kemendikbud. Data yang diterima oleh update.php akan diteruskan kembali ke form.php untuk ditampilkan.

Sebelum kita melanjutkan, kita perlu mengetahui juga model data yang akan kita terima dari situs Kemendikbud. Karena beda model data, beda pula penanganannya.



Ya, data yang akan kita diterima dari situs Kemendikbud adalah berupa JSON dengan hirarki seperti pada gambar di atas. Seperti terlihat, masing-masing data terdiri dari: kode_wilayah, nama dan mst_kode_wilayah.

Baiklah, sekarang kita lanjutkan dengan membuat script untuk halaman form.php dan update.php.

Silahkan copy terlebih dahulu script di bawah ini untuk kita gunakan/paste pada file form.php.

<!doctype html>
<html>
<head>
 <title>Data Wilayah Indonesia</title>
 <script type="text/javascript" src="http://code.jquery.com/jquery-latest.min.js"></script>
 <script type="text/javascript">
  $(document).ready(function(){
   updateData('pokok', '000000');

   $(".data-wilayah select").change(function(){
    var id_wilayah = $(this).attr('id');
    var kode_wilayah = $(this).val();

    if(id_wilayah!='kelurahan') {
     updateData(id_wilayah, kode_wilayah);
    }    
   })
  });

  function updateData(id_wilayah, kode_wilayah) {
   if(id_wilayah=='pokok') {
    $("#propinsi").empty().prepend('<option value="">-- Pilih Nama Propinsi --</option>');
   }

   if(id_wilayah=='pokok' || id_wilayah=='propinsi') {
    $("#kota").empty().prepend('<option value="">-- Pilih Nama Kabupaten/Kota --</option>');
   }

   if(id_wilayah=='pokok' || id_wilayah=='propinsi' || id_wilayah=='kota') {
    $("#kecamatan").empty().prepend('<option value="">-- Pilih Nama Kecamatan --</option>');
   }

   if(id_wilayah=='pokok' || id_wilayah=='propinsi' || id_wilayah=='kota' || id_wilayah=='kecamatan') {
    $("#kelurahan").empty().prepend('<option value="">-- Pilih Nama Desa/Kelurahan --</option>');
   }

   if(kode_wilayah!="") {
    $.post('update.php',{
     update: kode_wilayah
    }, function(data) {
     var data = jQuery.parseJSON(data);

     if(data.status==1) {
      var obj = '#propinsi';
      var content = '';

      if(id_wilayah=='propinsi') {
       obj = '#kota';
      } else if(id_wilayah=='kota') {
       obj = '#kecamatan';
      } else if(id_wilayah=='kecamatan') {
       obj = '#kelurahan';
      }

      $.each(data.content.data, function(i,d) {
       content += '<option value="'+d.kode_wilayah+'">'+d.nama+'</option>';
      });

      $(obj).append(content);
     }
    });
   }
  }
 </script>
</head>
<body>
 <h3>Data Wilayah Indonesia</h3>
 <form id="territory">
  <p class="data-wilayah"><label for="propinsi">Propinsi</label> <select id="propinsi">
   <option value="">-- Pilih Nama Propinsi --</option>
  </select></p>
  <p class="data-wilayah"><label for="kota">Kabupaten/Kota</label> <select id="kota">
   <option value="">-- Pilih Nama Kabupaten/Kota --</option>
  </select></p>
  <p class="data-wilayah"><label for="kecamatan">Kecamatan</label> <select id="kecamatan">
   <option value="">-- Pilih Nama Kecamatan --</option>
  </select></p>
  <p class="data-wilayah"><label for="kelurahan">Desa/Kelurahan</label> <select id="kelurahan">
   <option value="">-- Pilih Nama Desa/Kelurahan --</option>
  </select></p>
 </form>
</body> 
</html>

Selanjutnya, silahkan copy script di bawah untuk file update.php.

<?php

$return = array();
$return['status'] = 0;
$return['content'] = "";

function clearJSON($json_data) {
 if (0 === strpos(bin2hex($json_data), 'efbbbf')) {
       return substr($json_data, 3);
    } else {
     return $json_data;
    }
}

if(isset($_POST['update']) && trim($_POST['update'])!='') {
 $mst_kode_wilayah = trim($_POST['update']);
 $url = "http://jendela.data.kemdikbud.go.id/api/index.php/CWilayah/wilayahGET?mst_kode_wilayah=$mst_kode_wilayah";

 $ch = curl_init();

 curl_setopt($ch, CURLOPT_URL,$url);
 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

 if(curl_exec($ch) === false) {
  $output = '{"data":[]}';
 } else {
  $output = curl_exec($ch);
 }

 curl_close($ch);

 $json_data = clearJSON($output);
 $output = json_decode($json_data, true);

 if(count($output['data']) > 0) {
  $return['status'] = 1;
  $return['content'] = $output;
 }
}

echo json_encode($return);

?>

Pada form.php, kita gunakan function updateData() untuk menampilkan data wilayah. function ini dijalankan saat halaman dibuka untuk menampilkan data propinsi, dan akan dijalankan setiap kali ada perubahan data propinsi, kabupaten/kota maupun kecamatan untuk menampilkan data wilayah di bawahnya.

Sedangkan pada update.php, ketika ada request yang diterima dari form.php, menggunakan cURL, data yang di-request kemudian diambil dari website Kemendikbud. Jika data tersedia, data akan diteruskan kembali ke form.php dalam bentuk JSON. Begitupun jika datanya tidak tersedia, atau ada kendala saat mengambil data, tetap akan diinformasikan ke form.php.

Pada update.php, kita membuat function clearJSON() untuk memfilter/menangani karakter BOM yang (seringkali) 'menyusup' di awal teks data yang kita dapatkan. Dan kebetulan, pada data wilayah yang didapat dari website Kemendikbud, karakter tersebut muncul :).

Btw, jika Anda mengalami kendala dalam meng-copy script di atas, Anda bisa mengunduhnya di sini.

Mengunduh Data


Nah, bagaimana jika kita ingin mengambil datanya secara keseluruhan untuk kita masukkan ke database kita sendiri? Karena memang, untuk beberapa hal, ada kalanya menampilkan data dari database sendiri adalah lebih baik ataupun merupakan satu-satunya pilihan. Misalnya karena aplikasi yang kita kembangkan sifatnya offline.

Ya, meninjau pada API yang disediakan, maka kita memang harus mengambilnya satu demi satu, mulai dari data pokok (propinsi) sampai dengan data desa/kelurahan. Ribed, dong? Tergantung :). Jika kita hanya menggunakan metode 'apa adanya' sebagaimana yang disediakan, iya. Tapi jika sebagai pengembang kita mau sedikit jeli, sebenarnya kita bisa membuat/menggunakan metode atau fungsi rekursif untuk menanganinya.


Video di atas adalah capture proses download data full yang langsung saya inject ke database dan juga saya buat sebagai file csv. Insya Allah nanti saya update tulisan ini berkaitan dengan proses download data. Namun jika saat ini Anda memerlukannya, silahkan klik di sini untuk mengunduhnya.

Salam!

Tidak ada komentar:

Posting Komentar