DEV Community

Deny Herianto
Deny Herianto

Posted on

GeoJSON & TopoJSON Maps of Indonesia (38 Provinces)

Indonesia officially has 38 provinces, and if you’ve ever tried to build a map-based app or dashboards, election maps, logistics tools, disaster tracking, or data visualizations. You’ve probably felt the pains:

  • Incomplete province data
  • Outdated boundaries
  • Inconsistent naming

Why You Should Care

Maps aren’t just pretty pictures. They’re the backbone of your data.

If your province list is off, you’re in trouble. Choropleth maps end up wrong. Analytics don’t match real regions. Tooltips show the wrong names.

Indonesia’s added new provinces, Papua Selatan, Papua Tengah, Papua Pegunungan, Papua Barat Daya. So older datasets are now out of date. A lot of public sources still only show 34 provinces.


What’s Included

Complete Coverage

  • 38 provinces, including:
    • Papua Selatan
    • Papua Tengah
    • Papua Pegunungan
    • Papua Barat Daya

Two Formats

  • GeoJSON

    • Easy to use
    • Compatible with Leaflet, Mapbox GL, Google Maps overlays
  • TopoJSON

    • ~80–90% smaller file size
    • Faster loading
    • Ideal for D3.js and large-scale visualizations

Clean & Consistent

  • Normalized province names
  • Stable IDs for data joins
  • No duplicated geometries
  • Simplified paths (web-friendly)

GeoJSON vs TopoJSON (Quick Recap)

Feature GeoJSON TopoJSON
Readability ✅ High ⚠️ Medium
File Size ❌ Large ✅ Very Small
Browser Performance ⚠️ Can lag ✅ Fast
Best For Simple maps Data viz, dashboards

If you’re building interactive dashboards, TopoJSON is your friend.

If you want plug-and-play simplicity, GeoJSON works great.


Common Use Cases

This dataset is ideal for:

  • 📊 Government & civic dashboards
  • 🌋 Disaster & flood tracking
  • 🗳️ Election & demographic maps
  • 🚚 Logistics & coverage planning
  • 📍 Location-based SaaS products
  • 📱 Mobile-first data visualizations

Example: Using GeoJSON with Leaflet

import L from "leaflet";
import indonesiaProvinces from "./indonesia-38-provinces.geojson";

L.geoJSON(indonesiaProvinces, {
  style: {
    color: "#1e40af",
    weight: 1,
    fillOpacity: 0.6,
  },
  onEachFeature: (feature, layer) => {
    layer.bindPopup(feature.properties.province);
  },
}).addTo(map);
Enter fullscreen mode Exit fullscreen mode

Example: Using TopoJSON with D3

import * as d3 from "d3";
import { feature } from "topojson-client";

// Import TopoJSON file (Vite / Webpack / Next.js supported)
import topoData from "./indonesia-38-provinces.topo.json";

const width = 800;
const height = 600;

const svg = d3
  .select("#map")
  .append("svg")
  .attr("width", width)
  .attr("height", height);

const projection = d3
  .geoMercator()
  .fitSize([width, height], feature(topoData, topoData.objects.indonesia_provinces));

const path = d3.geoPath().projection(projection);

// Convert TopoJSON → GeoJSON
const provinces = feature(
  topoData,
  topoData.objects.indonesia_provinces
);

svg
  .selectAll("path")
  .data(provinces.features)
  .enter()
  .append("path")
  .attr("d", path)
  .attr("fill", "#60a5fa")
  .attr("stroke", "#1e3a8a")
  .append("title")
  .text(d => d.properties.province);
Enter fullscreen mode Exit fullscreen mode

Download

You can download the datasets directly from the repository:

GeoJSON (38 Provinces)
indonesia-38-provinces.geojson

TopoJSON (38 Provinces)
indonesia-38-provinces.topo.json

Top comments (0)