Pernah nggak sih kamu butuh data peta buat project, tapi bingung mau ambil dari mana? Beberapa bulan lalu saya dapat task bikin aplikasi yang harus menampilkan semua titik SPBU di satu kota. Insting pertama saya: scraping Google Maps. Dua jam kemudian saya sadar itu jalan buntu - halamannya di-render JavaScript, request-nya dicegat, dan yang paling penting, itu melanggar Terms of Service. Lalu seorang teman GIS bilang: "Coba Overpass API." Sejak itu workflow ambil data spasial saya berubah total.
Overpass API adalah pintu masuk ke OpenStreetMap (OSM), database peta kolaboratif terbesar di dunia dengan lisensi terbuka. Di artikel ini saya kasih kamu panduan praktis: dari query pertama yang sederhana sampai integrasi ke aplikasi Python dan web. Semua contoh bisa langsung kamu copy-paste dan coba di browser.
Kenapa OpenStreetMap, Bukan Google Maps?
Bukan soal siapa lebih bagus - Google Maps jelas lebih lengkap buat navigasi sehari-hari. Tapi buat developer, OSM menang di satu hal: akses data mentah. Google Maps API memungkinkan kamu menampilkan peta dan geocode, tapi kamu tidak bisa bilang "ambil semua data restoran di area ini". Data OSM bisa diunduh bebas, tanpa API key, dan bisa disimpan di database sendiri.
Beberapa hal yang bisa kamu dapat dari OSM:
- Semua POI (point of interest): kafe, SPBU, sekolah, rumah sakit, tempat ibadah
- Jaringan jalan lengkap dengan klasifikasi: jalan tol, jalan lokal, jalur pejalan kaki
- Batas administratif: kelurahan, kecamatan, kabupaten, provinsi
- Data bangunan, sungai, sawah, dan fitur geospasial lainnya
Lisensinya ODbL, artinya kamu bebas pakai selama atribusi ke OpenStreetMap dan kontributornya. Untuk aplikasi internal atau prototipe, ini game changer.
Apa itu Overpass API?
Overpass API adalah read-only API yang dibuat khusus untuk query data OSM. Bedanya dengan API biasa: kamu nggak manggil endpoint per objek, tapi nulis query yang mirip bahasa pemrograman, dan server-nya yang bekerja keras mencari semua objek yang cocok.
Ada dua format query: Overpass QL (sintaks ringkas, paling populer) dan Overpass XML (lebih verbose). Kita fokus ke QL karena lebih gampang dibaca dan ditulis.
Endpoint publik yang paling umum dipakai:
https://overpass-api.de/api/interpreter
https://overpass.kumi.systems/api/interpreter
Kamu bisa kirim query lewat GET (parameter data) atau POST. Untuk query yang panjang, selalu pakai POST.
Struktur Data OSM: Node, Way, dan Relation
Sebelum nulis query, kamu harus paham tiga tipe objek dasar di OSM. Ini konsep paling penting di artikel ini:
- Node: titik dengan koordinat lat/lon. Dipakai untuk POI, dan juga jadi titik pembentuk way.
- Way: rangkaian node yang membentuk garis (jalan, sungai) atau polygon (bangunan, area).
- Relation: kumpulan node/way yang punya hubungan logis, misalnya rute bus atau batas administrasi.
Setiap objek punya tags: pasangan key-value yang menjelaskan objek itu. Contoh: amenity=cafe berarti tempat ngopi, highway=primary berarti jalan utama, building=yes berarti bangunan. Tag inilah yang jadi bahan utama query kita.
Query Pertama: Cari Semua Kafe di Jakarta
Mari langsung praktik. Query Overpass QL paling sederhana untuk mencari semua node bertag amenity=cafe di dalam bounding box Jakarta:
[out:json];
node["amenity"="cafe"](-6.35,106.75,-6.10,107.00);
out;
Biar nggak bingung, ini pembacaannya baris per baris:
[out:json]- minta output format JSON (bisa juga[out:xml])node["amenity"="cafe"]- cari semua node yang punya tag amenity = cafe(-6.35,106.75,-6.10,107.00)- batasi ke bounding box: lat selatan, lon barat, lat utara, lon timurout;- kirim hasilnya ke output
Kalau kamu pengen coba langsung tanpa setup apa pun, buka Overpass Turbo, tempel query di atas, klik Run. Hasilnya langsung muncul di peta. Ini cara tercepat buat eksperimen.
Memahami Output JSON
Hasil query tadi berupa array elements. Satu elemen kafe contohnya begini:
{
"type": "node",
"id": 123456789,
"lat": -6.2146,
"lon": 106.8451,
"tags": {
"amenity": "cafe",
"name": "Kopi Nusantara",
"cuisine": "coffee_shop",
"opening_hours": "Mo-Su 08:00-22:00"
}
}
Perhatikan: lat dan lon ada di level atas, sementara informasi detail ada di tags. Buat aplikasi, kamu tinggal mapping field ini ke database atau langsung render di Leaflet atau MapLibre.
Filter Tag yang Lebih Spesifik
Query di atas mengembalikan SEMUA kafe, termasuk yang nggak punya nama. Biar lebih berguna, tambahkan filter. Operator yang sering dipakai:
["name"]- objek yang punya tag name, apapun nilainya["name"~"Kopi"]- regex, nama mengandung kata "Kopi"["amenity"!="cafe"]- negasi, bukan cafe["opening_hours"]- punya jam buka
Contoh: cari kafe yang punya nama, punya jam buka, dan buka 24 jam:
[out:json];
node["amenity"="cafe"]["name"]["opening_hours"~"24/7"](-6.35,106.75,-6.10,107.00);
out;
Area vs Bounding Box
Bounding box praktis tapi kaku: batasnya kotak, padahal Jakarta Utara dan Jakarta Selatan beda luas. Solusinya pakai area. Overpass bisa memakai batas administrasi OSM sebagai area query:
[out:json];
area["name"="Jakarta"]["admin_level"="6"]->.jakarta;
node["amenity"="cafe"](area.jakarta);
out;
Baris pertama query area: cari relation bertag name=Jakarta dengan admin_level=6 (level administrasi kota di Indonesia), lalu simpan ke variabel .jakarta. Baris kedua memakai area itu sebagai batas. Hasilnya: semua kafe di dalam wilayah administratif Jakarta, bukan kotak sembarangan.
Untuk kabupaten/kota, admin_level=6 adalah level yang benar di Indonesia. Provinsi pakai admin_level=4, kecamatan admin_level=7, kelurahan admin_level=8.
Studi Kasus: Ambil Semua SPBU di Surabaya
Sekarang kita gabungkan semua konsep. Saya mau ambil semua SPBU di Surabaya plus alamatnya. SPBU di OSM biasanya ditag amenity=fuel. Query-nya:
[out:json];
area["name"="Surabaya"]["admin_level"="6"]->.sby;
(
node["amenity"="fuel"](area.sby);
way["amenity"="fuel"](area.sby);
);
out center tags;
Kenapa ada way juga? Karena sebagian kontributor menggambar SPBU sebagai area (way tertutup), bukan titik. Dengan menggabungkan keduanya di blok ( ... ), kita tidak melewatkan data. out center membuat way ditampilkan sebagai satu titik di tengahnya - berguna kalau kamu cuma butuh koordinat untuk marker.
Query ini adalah pola yang bisa dipakai ulang untuk tipe POI apa pun: ganti amenity=fuel dengan amenity=school, shop=supermarket, atau amenity=hospital.
Ambil Data Jalan: Way dan Geometri Garis
Salah satu keunggulan OSM yang nggak bisa ditiru Google Maps API gratis: data jaringan jalan. Query untuk ambil semua jalan utama di satu area:
[out:json];
area["name"="Bandung"]["admin_level"="6"]->.bdg;
way["highway"]["highway"!="service"]["highway"!="residential"](area.bdg);
out geom tags;
Penjelasan: way["highway"] mengambil semua way yang punya tag highway (jalan). Filter ["highway"!="service"] dan ["highway"!="residential"] membuang jalan kecil yang cuma bikin noise. out geom penting di sini: untuk way, out biasa cuma ngasih daftar node id, sedangkan out geom menyertakan koordinat setiap titik sehingga kamu bisa menggambar garisnya langsung.
Hasilnya adalah array way dengan properti geometry berisi daftar titik. Di Leaflet kamu tinggal loop dan bikin L.polyline. Buat analisis jaringan (rute terpendek, isochrone), export ke PostGIS dan pakai pgRouting - topik seru buat artikel berikutnya.
Integrasi ke Python dengan overpy
Data mentah JSON baru berguna kalau bisa diolah. Di Python, cara termudah adalah library overpy:
pip install overpy
import overpy
api = overpy.Overpass()
query = """
area["name"="Surabaya"]["admin_level"="6"]->.sby;
(
node["amenity"="fuel"](area.sby);
way["amenity"="fuel"](area.sby);
);
out center tags;
"""
result = api.query(query)
for node in result.nodes:
name = node.tags.get("name", "Tanpa nama")
print(f"{name} -> {node.lat}, {node.lon}")
for way in result.ways:
name = way.tags.get("name", "Tanpa nama")
lat = way.center_lat
lon = way.center_lon
print(f"{name} -> {lat}, {lon}")
Outputnya baris per baris: nama SPBU dan koordinatnya. Dari sini kamu bisa masukkan ke MySQL atau PostGIS, export ke CSV, atau langsung render. overpy otomatis meng-handle request POST, parsing JSON, dan representasi objek - kamu nggak perlu mikir detail HTTP.
Integrasi ke Aplikasi Web: Jangan Panggil Overpass dari Browser
Godaan terbesar: panggil Overpass API langsung dari JavaScript. Jangan. Ada tiga alasan:
- Rate limit: endpoint publik membatasi request per IP. Aplikasi kamu bisa kena block kalau dipakai banyak user.
- CORS: endpoint Overpass publik umumnya tidak mengizinkan request dari origin sembarang.
- Keamanan: query Overpass bisa berat. User iseng bisa bikin query raksasa yang membebani server publik.
Pola yang benar: backend yang memanggil Overpass, lalu hasilnya disimpan atau di-cache. Contoh sederhana dengan PHP, misalnya di CodeIgniter 4:
$query = '[out:json];node["amenity"="fuel"](area.sby);out;';
$ch = curl_init('https://overpass-api.de/api/interpreter');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, 'data=' . urlencode($query));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 60);
$response = curl_exec($ch);
curl_close($ch);
$data = json_decode($response, true);
// simpan ke database, lalu render dari database
Best practice-nya: jalankan script ini via cron, misalnya seminggu sekali, simpan hasilnya ke database, dan aplikasi membaca dari database. Dengan begitu aplikasi kamu nggak bergantung pada ketersediaan Overpass API saat user membuka halaman.
Etika dan Rate Limit
Overpass API publik dijalankan oleh relawan. Kalau kamu abai, kamu bisa bikin server down dan merugikan komunitas. Aturan mainnya:
- Jangan kirim query lebih dari satu request per 5-10 detik per IP
- Batasi query dengan
[timeout:25]- kalau query butuh lebih lama, perbaiki query-nya, jangan terus menaikkan timeout - Pakai
out 1000;atau batas lain supaya respons tidak membengkak - Kalau butuh data besar (satu provinsi penuh), unduh Geofabrik extract dan proses offline, bukan lewat Overpass
- Cache hasil query. Data OSM berubah, tapi nggak berubah tiap detik
Ada juga endpoint khusus untuk aplikasi produksi, misalnya Kumi Systems. Untuk aplikasi komersial skala besar, pertimbangkan hosting Overpass sendiri atau pakai layanan berbayar.
Overpass Turbo: Teman Prototyping
Satu tool yang wajib kamu bookmark: Overpass Turbo (overpass-turbo.eu). Ini IDE untuk query Overpass: tulis query, langsung lihat hasilnya di peta, export sebagai GeoJSON. Workflow saya biasanya:
- Prototipe query di Overpass Turbo sampai hasilnya pas
- Export GeoJSON buat cek visual
- Pindahkan query final ke script Python atau PHP
Ada juga fitur wizard: kamu bisa ketik kalimat biasa kayak "cafe in Jakarta" dan Turbo mengubahnya jadi query Overpass. Bagus buat belajar sintaks sambil jalan.
Overpass API vs Google Places API: Kapan Pakai yang Mana
Wajar kalau muncul pertanyaan ini, apalagi kalau kamu sudah terbiasa dengan ekosistem Google. Keduanya bisa kasih data POI, tapi punya karakter yang beda banget:
- Biaya: Overpass API gratis tanpa API key. Google Places API berbayar setelah kuota gratis habis, dan tagihan bisa membengkak kalau aplikasi ramai.
- Cakupan data: Google unggul di kota besar dengan data review, rating, dan foto. OSM lebih konsisten di area yang kontributornya aktif, termasuk kota kecil di Indonesia yang sering diabaikan Google.
- Kedalaman atribut: Google ngasih rating, review count, opening hours, dan foto. OSM ngasih tag yang lebih teknis: jenis bahan bakar, kapasitas parkir, wheelchair access.
- Lisensi data: Data Google nggak bisa disimpan dan diolah bebas. Data OSM (ODbL) bisa kamu simpan di database sendiri dan dipakai offline.
- Kemudahan integrasi: Google SDK jelas dan didokumentasikan rapi. Overpass butuh effort lebih, tapi jauh lebih fleksibel.
Kesimpulan saya: buat prototipe, aplikasi internal, dan project yang butuh data spasial mentah dalam jumlah besar, Overpass menang telak. Buat aplikasi consumer-facing yang butuh rating dan review, Google Places tetap relevan - atau kombinasi keduanya: peta dari OSM, data ulasan dari Google.
Kesimpulan
Overpass API membuka akses ke jutaan data geospasial yang sebelumnya cuma bisa dilihat lewat aplikasi peta. Dengan modal query QL sederhana, kamu bisa ambil POI, jaringan jalan, atau batas administrasi untuk aplikasi sendiri - gratis, tanpa API key, dan legal selama atribusi.
Langkah selanjutnya yang bisa kamu coba: taruh hasil query ke PostGIS dan kombinasikan dengan spatial query yang pernah kita bahas, atau tampilkan hasilnya di Leaflet.js. Kombinasi OSM + Overpass + PostGIS + Leaflet adalah stack GIS open source yang sangat mumpuni untuk project Indonesia.
Kalau kamu sudah pernah coba Overpass API, cerita dong di kolom komentar: data apa yang pertama kali kamu ambil? Atau kalau masih bingung di bagian query, tanya saja - saya bantu.