BanditHijo.dev

Menggunakan Nominatim Self-Hosted pada Geocoder Gem

Created at: Feb 8th, 2026
Author by: BanditHijo
Table of Contents

Pendahuluan

Pada catatan sebelumnya “OpenStreetMap Nominatim (Geocoding Machine) dengan Docker” saya telah membahas cara menjalankan instance Nominatim menggunakan Docker. Pada artikel ini, saya akan mencatat langkah-langkah untuk mengonfigurasi Geocoder gem di aplikasi Ruby on Rails agar menggunakan instance Nominatim self-hosted sebagai geocoding service lookup.

Konfigurasi Geocoder Gem

Jika sebelumnya sudah memiliki config file untuk Geocoder di config/initializers/geocoder.rb, buka file tersebut.

Dan tambahkan atau modifikasi konfigurasi seperti ini,

config/initializers/geocoder.rb
1Geocoder.configure(
2 # Geocoding options
3 # timeout: 3, # geocoding service timeout (secs)
4 # lookup: :nominatim, # name of geocoding service (symbol)
5 # ip_lookup: :ipinfo_io, # name of IP address geocoding service (symbol)
6 # language: :en, # ISO-639 language code
7 # use_https: false, # use HTTPS for lookup requests? (if supported)
8 # http_proxy: nil, # HTTP proxy server (user:pass@host:port)
9 # https_proxy: nil, # HTTPS proxy server (user:pass@host:port)
10 # api_key: nil, # API key for geocoding service
11 # cache: nil, # cache object (must respond to #[], #[]=, and #del)
12
13 # Exceptions that should not be rescued by default
14 # (if you want to implement custom error handling);
15 # supports SocketError and Timeout::Error
16 # always_raise: [],
17
18 # Calculation options
19 # units: :km, # :km for kilometers or :mi for miles
20 # distances: :linear # :spherical or :linear
21
22 # Cache configuration
23 # cache_options: {
24 # expiration: 2.days,
25 # prefix: 'geocoder:'
26 # }
27
28 use_https: false,
29 lookup: :nominatim,
30 nominatim: {
31 host: localhost:8080
32 },
33)

Saya menggunakan localhost:8080 karena pada catatan sebelumnya saya menjalankan Nominatim di Docker dengan port mapping 8080:8080 dan karena di localhost sehingga tidak menggunakan https.

Bisa juga disesuaikan dengan host dan port tempat Nominatim dijalankan. Misal, saya sudah punya service yang saya jalankan di https://nominatim.bandithijo.dev, maka konfigurasi nominatim akan seperti ini,

config/initializers/geocoder.rb
1Geocoder.configure(
2 # ...
3 # ...
4
5 use_https: true,
6 lookup: :nominatim,
7 nominatim: {
8 host: 'nominatim.bandithijo.dev',
9 },
10)

Dengan begini saya sudah berhasil mengonfigurasi Geocoder gem untuk menggunakan Nominatim self-hosted sebagai geocoding service lookup. Selanjutnya, saya bisa menggunakan Geocoder gem untuk melakukan geocoding dan reverse geocoding pada aplikasi Ruby on Rails saya dengan menggunakan instance Nominatim yang saya jalankan sendiri.

Pengujian

Untuk menguji apakah konfigurasi sudah benar, bisa dilakukan di Rails console.

$ rails console

Setup logger agar menampilkan request dan response dari Geocoder gem untuk mempermudah proses debugging,

1irb(main):001> Geocoder.configure(logger: Logger.new(STDOUT))

Outputnya,

1=>
2{:timeout=>3,
3 :lookup=>:nominatim,
4 :ip_lookup=>:ipinfo_io,
5 :language=>:en,
6 :http_headers=>{},
7 :use_https=>true,
8 :http_proxy=>nil,
9 :https_proxy=>nil,
10 :api_key=>nil,
11 :basic_auth=>{},
12 :logger=>
13 #<Logger:0x000000012837e6b8
14 @default_formatter=#<Logger::Formatter:0x0000000124a709e8 @datetime_format=nil>,
15 @formatter=nil,
16 @level=0,
17 @level_override={},
18 @logdev=
19 #<Logger::LogDevice:0x0000000128273980
20 @binmode=false,
21 @dev=#<IO:<STDOUT>>,
22 @filename=nil,
23 @mon_data=#<Monitor:0x0000000124a70970>,
24 @mon_data_owner_object_id=71700,
25 @reraise_write_errors=[],
26 @shift_age=nil,
27 @shift_period_suffix=nil,
28 @shift_size=nil,
29 @skip_header=false>,
30 @progname=nil>,
31 :kernel_logger_level=>2,
32 :always_raise=>[],
33 :units=>:km,
34 :distances=>:linear,
35 :cache=>nil,
36 :cache_prefix=>nil,
37 :cache_options=>{:prefix=>"geocoder:", :expiration=>nil},
38 :nominatim=>{:host=>"osm.bintangdigitalasia.com/nominatim"}}

Dapat dilihat, bahwa konfigurasi nominatim untuk host sudah sesuai dengan yang diinginkan.

Lalu lakukan geocoding pada alamat tertentu,

1irb(main):002> Geocoder.search("Jakarta")

Outputnya,

1D, [2026-02-09T00:02:12.686252 #30316] DEBUG -- : Geocoder: HTTP request being made for http://localhost:8080/search?accept-language=en&addressdetails=1&format=json&q=Jakarta
2=>
3[#<Geocoder::Result::Nominatim:0x0000000127219df0
4 @cache_hit=nil,
5 @data=
6 {"place_id"=>3204450,
7 "licence"=>"Data © OpenStreetMap contributors, ODbL 1.0. http://osm.org/copyright",
8 "osm_type"=>"relation",
9 "osm_id"=>6362934,
10 "lat"=>"-6.1754049",
11 "lon"=>"106.8271680",
12 "class"=>"boundary",
13 "type"=>"administrative",
14 "place_rank"=>8,
15 "importance"=>0.2933433333333333,
16 "addresstype"=>"city",
17 "name"=>"Special Capital Region of Jakarta",
18 "display_name"=>"Special Capital Region of Jakarta, Java, Indonesia",
19 "address"=>
20 {"city"=>"Special Capital Region of Jakarta",
21 "ISO3166-2-lvl4"=>"ID-JK",
22 "region"=>"Java",
23 "ISO3166-2-lvl3"=>"ID-JW",
24 "country"=>"Indonesia",
25 "country_code"=>"id"},
26 "boundingbox"=>["-6.3744575", "-4.9993635", "106.3146732", "106.9739750"]}>]
1irb(main):003> Geocoder.search([-1.2379, 116.8529])

Outputnya,

1D, [2026-02-09T00:04:49.941967 #30316] DEBUG -- : Geocoder: HTTP request being made for http://locahost:8080/reverse?accept-language=en&addressdetails=1&format=json&lat=-1.2379&lon=116.8529
2=>
3[#<Geocoder::Result::Nominatim:0x0000000125da17b0
4 @cache_hit=nil,
5 @data=
6 {"place_id"=>119266,
7 "licence"=>"Data © OpenStreetMap contributors, ODbL 1.0. http://osm.org/copyright",
8 "osm_type"=>"way",
9 "osm_id"=>109864339,
10 "lat"=>"-1.2378944",
11 "lon"=>"116.8529396",
12 "class"=>"highway",
13 "type"=>"residential",
14 "place_rank"=>26,
15 "importance"=>0.0533433333333333,
16 "addresstype"=>"road",
17 "name"=>"Jalan Bubutan",
18 "display_name"=>"Jalan Bubutan, Gunung Samarinda, Balikpapan Utara, Balikpapan, East Kalimantan, 76125, Indonesia",
19 "address"=>
20 {"road"=>"Jalan Bubutan",
21 "village"=>"Gunung Samarinda",
22 "city_district"=>"Balikpapan Utara",
23 "city"=>"Balikpapan",
24 "state"=>"East Kalimantan",
25 "ISO3166-2-lvl4"=>"ID-KI",
26 "postcode"=>"76125",
27 "country"=>"Indonesia",
28 "country_code"=>"id"},
29 "boundingbox"=>["-1.2383814", "-1.2355025", "116.8482510", "116.8530576"]}>]
30irb(main):003>

Kesimpulan

Dengan mengikuti langkah-langkah di atas, saya berhasil mengonfigurasi Geocoder gem untuk menggunakan Nominatim self-hosted sebagai geocoding service lookup. Saya juga berhasil melakukan geocoding dan reverse geocoding menggunakan instance Nominatim yang saya jalankan sendiri. Dengan menggunakan Nominatim self-hosted, saya memiliki kontrol penuh atas data geocoding dan dapat menghindari batasan penggunaan yang mungkin diterapkan oleh layanan geocoding pihak ketiga.

Referensi

  1. https://github.com/alexreisner/geocoder
    Diakses tanggal: 2026-02-08
Tags: #openstreetmap #nominatim #geocoder #geocoding #rails
* * *
Rizqi Nur Assyaufi (bandithijo)
My journey kicks off from reading textbooks as a former Medical Student to digging bugs as a Software Engineer – a delightful rollercoaster of career twists. Embracing failure with the grace of a Cat avoiding water, I've seamlessly transitioned from Stethoscope to Keyboard. Armed with ability for learning and adapting faster than a Heart Beat, I'm on a mission to turn Code into a Product.