← Blog
Artikel

GeoJSON Batas Wilayah Indonesia 38 Provinsi sampai Desa via API (+ Tutorial Leaflet)

91.241 batas wilayah Indonesia dalam format GeoJSON: 38 provinsi, 514 kabupaten/kota, 7.285 kecamatan, dan 83.404 desa. Lengkap dengan tutorial peta Leaflet dan cek titik dengan turf.js.

Mencari file GeoJSON batas wilayah Indonesia biasanya berakhir di repo GitHub dengan file shapefile ratusan MB, data masih 34 provinsi, atau kode wilayah yang tidak cocok dengan data alamat di aplikasi Anda.

API Wilayah Boundary dari API Indonesia menyediakan 91.241 batas wilayah dalam format GeoJSON: 38 provinsi, 514 kabupaten/kota, 7.285 kecamatan, dan 83.404 desa/kelurahan. Setiap wilayah bisa diambil satu per satu lewat kodenya, jadi Anda hanya mengunduh area yang benar-benar dibutuhkan.

Ringkasan data

Level Jumlah Contoh kode Ukuran file (median)
Provinsi 38 31 ±67 KB
Kabupaten/kota 514 31.71 ±5 KB
Kecamatan 7.285 31.71.06 ±1 KB
Desa/kelurahan 83.404 31.71.06.1001 ±3 KB
  • Format: GeoJSON FeatureCollection sesuai RFC 7946, koordinat WGS84 dengan urutan [longitude, latitude], jadi langsung terbaca oleh Leaflet, Mapbox, QGIS, dan turf.js.
  • Sumber: open-admin-data/indonesia-administrative-divisions (melalui edopandoyo/wilayah-indonesia-api), versi 2026.06.
  • Lisensi: CC BY 4.0. Wajib mencantumkan atribusi. Teks atribusinya dikirim di header X-Data-Attribution setiap respons.
  • Kode wilayah: format bertitik (31.71.06), sama dengan kode Kemendagri, sehingga mudah dicocokkan dengan API Wilayah.

Endpoint

Endpoint Fungsi
GET /api/v1/wilayah-boundary?level=province Daftar boundary per level (province, regency, district, village), maksimal 100 per halaman
GET /api/v1/wilayah-boundary/{kode}/metadata Nama, level, titik tengah, sumber, lisensi, dan URL GeoJSON
GET /api/v1/wilayah-boundary/{kode} File GeoJSON (application/geo+json)

Daftar kabupaten/kota

curl "https://use.apiindonesia.id/api/v1/wilayah-boundary?level=regency&per_page=2" \
  -H "x-api-key: YOUR_API_KEY"
{
  "success": true,
  "data": [
    {
      "code": "11.01",
      "name": "Kabupaten Aceh Selatan",
      "level": "regency",
      "centroid_lat": 3.1618538408941346,
      "centroid_lng": 97.43651771865193,
      "source_version": "2026.06",
      "license": "CC BY 4.0",
      "geometry_type": "MultiPolygon"
    }
  ],
  "meta": { "page": 1, "per_page": 2, "total": 514, "total_pages": 257 }
}

Ambil GeoJSON satu wilayah

curl "https://use.apiindonesia.id/api/v1/wilayah-boundary/31.71" \
  -H "x-api-key: YOUR_API_KEY" -o jakarta-pusat.geojson
{
  "type": "FeatureCollection",
  "features": [
    {
      "type": "Feature",
      "properties": { "code": "31.71", "name": "Kota Administrasi Jakarta Pusat", "level": "regency" },
      "geometry": { "type": "Polygon", "coordinates": [[[106.8, -6.17], "..."]] }
    }
  ]
}

Header respons ikut membawa sumber data:

Content-Type: application/geo+json; charset=utf-8
X-Data-Source: open-admin-data/indonesia-administrative-divisions
X-Data-Version: 2026.06
X-Data-License: CC BY 4.0
X-Data-Attribution: Data boundary dari open-admin-data/indonesia-administrative-divisions oleh jakkrapongt, dilisensikan CC BY 4.0

Tutorial: tampilkan batas wilayah di peta Leaflet

Jangan panggil API langsung dari browser, karena API key akan terlihat pengunjung. Buat endpoint kecil di backend sebagai perantara, sekaligus tempat cache.

1. Backend (Node.js)

// server.js (Node.js 18+, Express)
import express from 'express';

const app = express();
const cache = new Map(); // batas wilayah jarang berubah, cache saja

app.get('/batas/:kode', async (req, res) => {
  const kode = req.params.kode;
  if (!/^\d{2}(\.\d{2}){0,2}(\.\d{4})?$/.test(kode)) return res.status(400).end();
  if (!cache.has(kode)) {
    const r = await fetch(`https://use.apiindonesia.id/api/v1/wilayah-boundary/${kode}`, {
      headers: { 'x-api-key': process.env.API_INDONESIA_KEY },
    });
    if (!r.ok) return res.status(r.status).end();
    cache.set(kode, await r.text());
  }
  res.type('application/geo+json').send(cache.get(kode));
});

app.use(express.static('public'));
app.listen(3000);

2. Frontend (Leaflet)

<link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css" />
<div id="map" style="height: 480px"></div>
<script src="https://unpkg.com/leaflet@1.9.4/dist/leaflet.js"></script>
<script>
  const map = L.map('map');
  L.tileLayer('https://tile.openstreetmap.org/{z}/{x}/{y}.png', {
    attribution: '&copy; OpenStreetMap | Batas: open-admin-data, CC BY 4.0',
  }).addTo(map);

  fetch('/batas/31.71')
    .then((r) => r.json())
    .then((geo) => {
      const layer = L.geoJSON(geo, {
        style: { color: '#ff4b12', weight: 2, fillOpacity: 0.1 },
        onEachFeature: (f, l) => l.bindPopup(f.properties.name),
      }).addTo(map);
      map.fitBounds(layer.getBounds());
    });
</script>

Hasilnya: peta yang langsung zoom ke Jakarta Pusat dengan garis batas wilayahnya. Ganti 31.71 dengan kode provinsi, kecamatan, atau desa mana pun.

3. Cek titik ada di wilayah mana

Dengan turf.js, Anda bisa memeriksa apakah koordinat pelanggan berada di dalam area layanan:

import booleanPointInPolygon from '@turf/boolean-point-in-polygon';

const geo = await (await fetch('/batas/31.71')).json();
const inside = booleanPointInPolygon([106.8272, -6.1754], geo.features[0]); // [lng, lat]
console.log(inside); // true: Monas ada di Jakarta Pusat

Ide penggunaan

  • Logistik dan kurir: gambar area layanan per kecamatan, cek apakah alamat masuk zona.
  • Properti: tampilkan batas kelurahan di halaman listing.
  • Dashboard pemerintah dan riset: peta tematik (choropleth) per kabupaten atau kecamatan, digabung dengan data lain seperti UMP atau harga pangan.
  • Pemilu dan survei: peta sebaran per desa.

Biaya

Setiap request sukses memakai 2 kredit (Rp2), termasuk pengambilan file GeoJSON. Bonus 3.000 kredit saat daftar cukup untuk sekitar 1.500 request. Karena batas wilayah jarang berubah, cache hasilnya di server Anda: satu wilayah cukup diambil sekali. Detail di halaman produk Wilayah Boundary dan dokumentasinya.

FAQ

Apakah GeoJSON ini sudah 38 provinsi? Ya. Tersedia 38 provinsi, 514 kabupaten/kota, 7.285 kecamatan, dan 83.404 desa/kelurahan, termasuk empat provinsi baru di Papua.

Urutan koordinatnya apa? [longitude, latitude] sesuai standar GeoJSON (RFC 7946), sehingga bisa langsung dipakai di Leaflet, Mapbox GL, QGIS, dan turf.js tanpa dibalik.

Apakah boleh dipakai untuk aplikasi komersial? Boleh, data berlisensi CC BY 4.0. Syaratnya mencantumkan atribusi ke open-admin-data/indonesia-administrative-divisions, misalnya di keterangan peta.

Bisakah mengunduh semua batas desa sekaligus? Endpoint ini dirancang per wilayah. Untuk daftar kode, gunakan GET /api/v1/wilayah-boundary?level=village dengan paginasi, lalu ambil file yang Anda perlukan dan simpan di server sendiri.

Apakah kodenya sama dengan kode wilayah Kemendagri? Ya, dalam format bertitik. Kode 31.71.06 di boundary sama dengan kecamatan 317106 di API Wilayah.

Lihat juga: halaman GeoJSON batas wilayah per provinsi untuk jumlah batas per level di setiap provinsi.

Mulai Sekarang

Mulai Integrasi
Hari Ini

Daftar gratis dan dapatkan bonus 3.000 kredit (Rp3.000) setelah email diverifikasi, ambil API key, lalu langsung call endpoint pertama Anda. Tanpa kartu kredit, tanpa proses approval yang ribet.

Visualisasi gelombang titik