OpenStreetMap Nominatim (Geocoding Machine) dengan Docker
Table of Contents

Pendahuluan
OpenStreetMap Nominatim adalah sebuah layanan geocoding yang memungkinkan pengguna untuk mencari lokasi berdasarkan nama tempat atau alamat (forward search) atau geographic coordinate (reverse search). Dalam artikel ini, saya akan mendokumentasikan cara menjalankan OpenStreetMap Nominatim menggunakan Docker agar proses setup Nominatim menjadi lebih mudah dan cepat, tanpa perlu repot mengatur lingkungan dan dependensi secara manual.
Apa itu OpenStreetMap Nominatim?
OpenStreetMap Nominatim adalah sebuah layanan geocoding yang memungkinkan pengguna untuk mencari lokasi berdasarkan nama tempat atau alamat (forward search) atau koordinat geografis (reverse search). Nominatim menggunakan data dari OpenStreetMap untuk menyediakan informasi lokasi yang akurat. Tanpa OpenStreetMap, Nominatim tidak memiliki data apapun untuk digunakan dalam proses geocoding.
Forward Geocodig adalah proses mengubah nama tempat atau alamat menjadi koordinat geografis (latitude dan longitude). Misalnya, jika mencari “Balikpapan”, Nominatim akan memberikan koordinat geografis dari Balikpapan.
Reverse Geocoding adalah proses mengubah koordinat geografis (latitude & longitude) menjadi nama tempat atau alamat. Misalnya, jika memiliki koordinat geografis dari Balikpapan (-1.2398711,116.8593379), Nominatim akan memberikan nama tempat atau alamat yang sesuai.
Nominatim API
Nominatim menyediakan API yang dapat digunakan untuk melakukan forward, reverse geocoding dan beberapa hal lainnya.
Berikut adalah contoh penggunaan Nominatim API:
/search
Digunakan untuk melakukan forward geocoding. Untuk mencari lokasi berdasarkan nama tempat atau alamat./reverse
Digunakan untuk melakukan reverse geocoding. Untuk mencari nama tempat atau alamat berdasarkan koordinat geografis (latitude & longitude)./lookup
Digunakan untuk mencari informasi lokasi berdasarkan OSM ID./details
Digunakan untuk mencari informasi lokasi berdasarkan OSM ID, dengan informasi yang lebih detail dibandingkan dengan/lookup./status
Digunakan untuk memeriksa status dari Nominatim service.- dll.
OpenStreetMap Nominatim dengan Docker
Untuk menjalankan OpenStreetMap Nominatim dengan Docker, bisa menggunakan image yang sudah tersedia di Docker Hub. Agar prosesnya lebih mudah, saya prefer untuk membuat docker compose saja. Berikut adalah langkah-langkahnya:
1. Buat Docker Compose untuk Nominatim Service
Buat file docker-compose.yml dengan isi sebagai berikut:
!filename: docker-compose.yml
services:
nominatim:
image: mediagis/nominatim:5.2
container_name: osm-nominatim
restart: unless-stopped
environment:
PBF_PATH: /nominatim/data/kalimantan-latest.osm.pbf
volumes:
- ./geofabrik/kalimantan-latest.osm.pbf:/nominatim/data/kalimantan-latest.osm.pbf
- nominatim-data:/var/lib/postgresql
expose:
- "8080"
ports:
- "8080:8080"
volumes:
nominatim-data:
Saya menggunakan docker image mediagis/nominatim:5.2 yang sudah tersedia di Docker Hub.
Pada PBF_PATH diisi dengan file .osm.pbf. PBF adalah format file yang digunakan untuk menyimpan data OpenStreetMap. File ini berisi informasi tentang jalan, bangunan, dan fitur geografis lainnya yang ada di wilayah tertentu. Dalam contoh ini, saya menggunakan file kalimantan-latest.osm.pbf yang berisi data OpenStreetMap untuk wilayah Kalimantan. Untuk mendapatkan file .osm.pbf untuk wilayah lain, bisa mengunduhnya dari situs Geofabrik.
Kisaran size file .osm.pbf untuk wilayah Indonesia dan beberapa wilayah lainnya adalah sebagai berikut:
| Region | Size |
|---|---|
| Indonesia (with East Timor) | 1.6 GB |
| Java | 845 MB |
| Kalimantan | 138 MB |
| Maluku | 25.1 MB |
| Nusa Tenggara | 162 MB |
| Papua | 31.0 MB |
| Sulawesi | 149 MB |
| Sumatra | 255 MB |
Saya menggunakan 2 values untuk volumes,
.geofabrik/kalimantan-latest.osm.pbf:/nominatim/data/kalimantan-latest.osm.pbf
Volume ini digunakan untuk menghubungkan file.osm.pbfyang ada di host dengan file.osm.pbfyang ada di dalam container. Dengan begitu, saya dapat menggunakannya diPBF_PATHuntuk proses import data. Proses persiapan file.osm.pbfini akan saya jelaskan di bagian selanjutnya.nominatim-data:/var/lib/postgresql
Volume ini digunakan untuk menyimpan data yang dihasilkan oleh Nominatim. Data ini akan disimpan di dalam container, sehingga jika container dihapus, data ini tidak akan hilang.nominatim-dataini adalah nama volume yang dibuat dibagianvolumesdi bawahnominatim-data:. Volume ini akan dihubungkan dengan direktori/var/lib/postgresqldi dalam container, yang merupakan direktori tempat Nominatim menyimpan data yang dihasilkan.
Secara default nonimatin mengekspose port 8080 di dalam container, sehingga saya juga expose port 8080 di bagian expose. Agar bisa diakses dari luar container, saya juga memetakan port 8080 di host ke port 8080 di dalam container dengan menggunakan ports.
2. Persiapkan data OSM berupa file .osm.pbf
Sebelum menjalankan Docker Compose, pastikan sudah memiliki file .osm.pbf yang akan digunakan untuk proses import data. File .osm.pbf ini bisa didapatkan dari situs Geofabrik.
Setelah mengunduh file .osm.pbf, letakkan file tersebut di dalam direktori geofabrik/ yang berada di root project. Buat direktori geofabrik/ jika belum ada.
$ mkdir geofabrik
$ cd geofabrik
$ wget -c https://download.geofabrik.de/asia/indonesia/kalimantan-latest.osm.pbf
Tunggu proses download selesai, setelah itu pastikan file .osm.pbf sudah berada di dalam direktori geofabrik/.
Berikut adalah struktur direktori yang diharapkan setelah menambahkan file .osm.pbf:
geofabrik/
└── kalimantan-latest.osm.pbf
docker-compose.yml
Sip, sekarang file .osm.pbf sudah siap untuk digunakan dalam proses import data oleh Nominatim.
3. Jalankan Docker Compose
Setelah membuat file docker-compose.yml, jalankan perintah berikut untuk menjalankan Nominatim service:
$ docker-compose up -d
PERHATIAN
Untuk pertama kali menjalankan docker compose, Nominatim service akan melakukan proses import data dari file
.osm.pbfke dalam Nominatim, proses ini membutuhkan waktu yang cukup lama, tergantung pada ukuran file.osm.pbfyang digunakan. Untuk filekalimantan-latest.osm.pbfyang berukuran 138 MB, proses import data bisa memakan waktu sekitar 30 menit hingga 1 jam.
Untuk melihat log dari container, bisa menggunakan perintah berikut:
$ docker compose logs nominatim -f
Tunggu proses import data selesai. Biasanya akan muncul log seperti berikut ketika proses import data sudah selesai:
--> Nominatim is ready to accept requests
Setelah proses import data selesai, Nominatim service sudah siap untuk digunakan. Nominatim API bisa diakses melalui http://localhost:8080/.
4. Coba Nominatim API
Setelah Nominatim service sudah siap, coba akses Nominatim API untuk melakukan forward geocoding dan reverse geocoding.
/status
Pertama-tama coba cek statusnya dulu.
$ curl http://localhost:8080/status
Outputnya,
OK
Atau kalau mau outputnya dalam JSON,
$ curl http://localhost:8080/status?format=json
Outputnya,
{
"status": 0,
"message": "OK",
"data_updated": "2026-01-21T12:30:08+00:00",
"software_version": "5.2.0",
"database_version": "5.2.0-0"
}
/search (Forward Geocoding)
Coba lakukan forward geocoding untuk mencari lokasi berdasarkan nama tempat atau alamat. Misalnya, mencari lokasi “jakarta”.
$ curl "http://localhost:8080/search?q=jakarta&format=json"
Outputnya,
[
{
"place_id": 144282,
"licence": "Data © OpenStreetMap contributors, ODbL 1.0. http://osm.org/copyright",
"osm_type": "way",
"osm_id": 795600162,
"lat": "-0.5354329",
"lon": "117.0914415",
"category": "highway",
"type": "residential",
"place_rank": 26,
"importance": 0.0533433333333333,
"addresstype": "road",
"name": "Jakarta",
"display_name": "Jakarta, Loa Bakung, Sungai Kunjang, Samarinda, Kalimantan Timur, 75391, Indonesia",
"boundingbox": [
"-0.5355636",
"-0.5353021",
"117.0914346",
"117.0914483"
]
}
]
Wah! Ternyata ada daerah beranama “Jakarta” di Kalimantan Timur.
/revers (Reverse Geocoding)
Coba lakukan reverse geocoding untuk mencari nama tempat atau alamat berdasarkan koordinat geografis (latitude & longitude). Misalnya, mencari lokasi berdasarkan koordinat -0.5354329,117.0914415 (koordinat Balikpapan).
$ curl "http://localhost:8080/reverse?lat=-1.2398711&lon=116.8593379&format=json"
Outputnya,
{
"place_id": 144282,
"licence": "Data © OpenStreetMap contributors, ODbL 1.0. http://osm.org/copyright",
"osm_type": "way",
"osm_id": 795600162,
"lat": "-0.5354329",
"lon": "117.0914415",
"class": "highway",
"type": "residential",
"place_rank": 26,
"importance": 0.0533433333333333,
"addresstype": "road",
"name": "Jakarta",
"display_name": "Jakarta, Loa Bakung, Sungai Kunjang, Samarinda, Kalimantan Timur, 75391, Indonesia",
"address": {
"road": "Jakarta",
"village": "Loa Bakung",
"city_district": "Sungai Kunjang",
"city": "Samarinda",
"state": "Kalimantan Timur",
"ISO3166-2-lvl4": "ID-KI",
"postcode": "75391",
"country": "Indonesia",
"country_code": "id"
},
"boundingbox": [
"-0.5355636",
"-0.5353021",
"117.0914346",
"117.0914483"
]
}
/lookup
Coba lakukan lookup untuk mencari informasi lokasi berdasarkan OSM ID. Misalnya, mencari informasi lokasi berdasarkan OSM ID 795600162. Ini adalah OSM ID dari hasil pencarian sebelumnya untuk lokasi “jakarta” di Kalimantan Timur.
$ curl "http://localhost:8080/lookup?osm_ids=W795600162&format=json"
Outputnya,
[
{
"place_id": 144282,
"licence": "Data © OpenStreetMap contributors, ODbL 1.0. http://osm.org/copyright",
"osm_type": "way",
"osm_id": 795600162,
"lat": "-0.5354329",
"lon": "117.0914415",
"class": "highway",
"type": "residential",
"place_rank": 26,
"importance": 0.0533433333333333,
"addresstype": "road",
"name": "Jakarta",
"display_name": "Jakarta, Loa Bakung, Sungai Kunjang, Samarinda, Kalimantan Timur, 75391, Indonesia",
"address": {
"road": "Jakarta",
"village": "Loa Bakung",
"city_district": "Sungai Kunjang",
"city": "Samarinda",
"state": "Kalimantan Timur",
"ISO3166-2-lvl4": "ID-KI",
"postcode": "75391",
"country": "Indonesia",
"country_code": "id"
},
"boundingbox": [
"-0.5355636",
"-0.5353021",
"117.0914346",
"117.0914483"
]
}
]
/details
Coba lakukan details untuk mencari informasi lokasi berdasarkan OSM ID, dengan informasi yang lebih detail dibandingkan dengan /lookup. Misalnya, mencari informasi lokasi berdasarkan OSM ID 795600162.
$ curl "http://localhost:8080/details?osmtype=W&osmid=795600162&format=json"
Outputnya,
{
"place_id": 144282,
"parent_place_id": 142133,
"osm_type": "W",
"osm_id": 795600162,
"category": "highway",
"type": "residential",
"admin_level": 15,
"localname": "Jakarta",
"names": {
"name": "Jakarta"
},
"addresstags": {},
"calculated_postcode": "75391",
"country_code": "id",
"indexed_date": "2026-02-08T13:11:46.748639+00:00",
"importance": 0.0533433333333333,
"calculated_importance": 0.0533433333333333,
"extratags": {},
"rank_address": 26,
"rank_search": 26,
"isarea": false,
"centroid": {
"type": "Point",
"coordinates": [
117.0914415,
-0.5354329
]
},
"geometry": {
"type": "Point",
"coordinates": [
117.0914415,
-0.5354329
]
}
}
5. Stop Docker Compose
Jika sudah selesai menggunakan Nominatim service, bisa stop Docker Compose dengan perintah berikut:
$ docker-compose down
Kesimpulan
Dalam artikel ini, saya telah mendokumentasikan cara menjalankan OpenStreetMap Nominatim menggunakan Docker, mulai dari membuat Docker Compose, mempersiapkan file .osm.pbf, menjalankan Docker Compose, mencoba Nominatim API, hingga menghentikan Docker Compose. Dengan menggunakan Docker, proses setup Nominatim menjadi lebih mudah dan cepat, tanpa perlu repot mengatur lingkungan dan dependensi secara manual.
Pada artikel selanjutnya, saya akan mendokumentasikan cara menggunakan Nominatim self-hosted pada Geocoder gem untuk melakukan geocoding dan reverse geocoding di aplikasi Ruby on Rails, “Menggunakan Nominatim Self-Hosted pada Geocoder Gem”
Referensi
-
https://nominatim.openstreetmap.org/ui/about.html
Diakses tanggal: 2026-02-07 -
https://nominatim.org/release-docs/develop/api/Overview/
Diakses tanggal: 2026-02-07