Menggunakan Nominatim Self-Hosted pada Geocoder Gem
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,
1Geocoder.configure(2 # Geocoding options3 # 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 code7 # 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 service11 # cache: nil, # cache object (must respond to #[], #[]=, and #del)1213 # Exceptions that should not be rescued by default14 # (if you want to implement custom error handling);15 # supports SocketError and Timeout::Error16 # always_raise: [],1718 # Calculation options19 # units: :km, # :km for kilometers or :mi for miles20 # distances: :linear # :spherical or :linear2122 # Cache configuration23 # cache_options: {24 # expiration: 2.days,25 # prefix: 'geocoder:'26 # }2728 use_https: false,29 lookup: :nominatim,30 nominatim: {31 host: localhost:808032 },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,
1Geocoder.configure(2 # ...3 # ...45 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:0x000000012837e6b814 @default_formatter=#<Logger::Formatter:0x0000000124a709e8 @datetime_format=nil>,15 @formatter=nil,16 @level=0,17 @level_override={},18 @logdev=19 #<Logger::LogDevice:0x000000012827398020 @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,
Forward Search
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=Jakarta2=>3[#<Geocoder::Result::Nominatim:0x0000000127219df04 @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"]}>]Reverse Search
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.85292=>3[#<Geocoder::Result::Nominatim:0x0000000125da17b04 @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
- https://github.com/alexreisner/geocoder
Diakses tanggal: 2026-02-08