From 9c8a7b7aca4f3347ffa57309dd33e3d3f75ecbb8 Mon Sep 17 00:00:00 2001 From: Anton Khorev Date: Mon, 31 Mar 2025 04:25:40 +0300 Subject: [PATCH] Move nominatim url methods to concerns --- app/controllers/concerns/nominatim_methods.rb | 33 +++++++++++++++++ app/controllers/geocoder_controller.rb | 37 +++---------------- 2 files changed, 38 insertions(+), 32 deletions(-) create mode 100644 app/controllers/concerns/nominatim_methods.rb diff --git a/app/controllers/concerns/nominatim_methods.rb b/app/controllers/concerns/nominatim_methods.rb new file mode 100644 index 000000000..c1e7e44f5 --- /dev/null +++ b/app/controllers/concerns/nominatim_methods.rb @@ -0,0 +1,33 @@ +module NominatimMethods + extend ActiveSupport::Concern + + private + + def nominatim_query_url(format: nil) + # get query parameters + query = params[:query] + minlon = params[:minlon] + minlat = params[:minlat] + maxlon = params[:maxlon] + maxlat = params[:maxlat] + + # get view box + viewbox = "&viewbox=#{minlon},#{maxlat},#{maxlon},#{minlat}" if minlon && minlat && maxlon && maxlat + + # get objects to excude + exclude = "&exclude_place_ids=#{params[:exclude]}" if params[:exclude] + + # build url + "#{Settings.nominatim_url}search?format=#{format}&extratags=1&q=#{CGI.escape(query)}#{viewbox}#{exclude}&accept-language=#{http_accept_language.user_preferred_languages.join(',')}" + end + + def nominatim_reverse_query_url(format: nil) + # get query parameters + lat = params[:lat] + lon = params[:lon] + zoom = params[:zoom] + + # build url + "#{Settings.nominatim_url}reverse?format=#{format}&lat=#{lat}&lon=#{lon}&zoom=#{zoom}&accept-language=#{http_accept_language.user_preferred_languages.join(',')}" + end +end diff --git a/app/controllers/geocoder_controller.rb b/app/controllers/geocoder_controller.rb index 3f96b0a4e..f352d8dba 100644 --- a/app/controllers/geocoder_controller.rb +++ b/app/controllers/geocoder_controller.rb @@ -1,6 +1,7 @@ class GeocoderController < ApplicationController require "uri" require "rexml/document" + include NominatimMethods before_action :authorize_web before_action :set_locale @@ -16,10 +17,10 @@ class GeocoderController < ApplicationController if params[:lat] && params[:lon] @sources.push(:name => "latlon", :url => root_path, :fetch_url => url_for(params.permit(:lat, :lon, :latlon_digits, :zoom).merge(:action => "search_latlon"))) - @sources.push(:name => "osm_nominatim_reverse", :url => nominatim_reverse_url(:format => "html"), + @sources.push(:name => "osm_nominatim_reverse", :url => nominatim_reverse_query_url(:format => "html"), :fetch_url => url_for(params.permit(:lat, :lon, :zoom).merge(:action => "search_osm_nominatim_reverse"))) elsif params[:query] - @sources.push(:name => "osm_nominatim", :url => nominatim_url(:format => "html"), + @sources.push(:name => "osm_nominatim", :url => nominatim_query_url(:format => "html"), :fetch_url => url_for(params.permit(:query, :minlat, :minlon, :maxlat, :maxlon).merge(:action => "search_osm_nominatim"))) end @@ -76,7 +77,7 @@ class GeocoderController < ApplicationController def search_osm_nominatim # ask nominatim - response = fetch_xml(nominatim_url(:format => "xml")) + response = fetch_xml(nominatim_query_url(:format => "xml")) # extract the results from the response results = response.elements["searchresults"] @@ -140,7 +141,7 @@ class GeocoderController < ApplicationController @results = [] # ask nominatim - response = fetch_xml(nominatim_reverse_url(:format => "xml")) + response = fetch_xml(nominatim_reverse_query_url(:format => "xml")) # parse the response response.elements.each("reversegeocode/result") do |result| @@ -165,34 +166,6 @@ class GeocoderController < ApplicationController private - def nominatim_url(format: nil) - # get query parameters - query = params[:query] - minlon = params[:minlon] - minlat = params[:minlat] - maxlon = params[:maxlon] - maxlat = params[:maxlat] - - # get view box - viewbox = "&viewbox=#{minlon},#{maxlat},#{maxlon},#{minlat}" if minlon && minlat && maxlon && maxlat - - # get objects to excude - exclude = "&exclude_place_ids=#{params[:exclude]}" if params[:exclude] - - # build url - "#{Settings.nominatim_url}search?format=#{format}&extratags=1&q=#{CGI.escape(query)}#{viewbox}#{exclude}&accept-language=#{http_accept_language.user_preferred_languages.join(',')}" - end - - def nominatim_reverse_url(format: nil) - # get query parameters - lat = params[:lat] - lon = params[:lon] - zoom = params[:zoom] - - # build url - "#{Settings.nominatim_url}reverse?format=#{format}&lat=#{lat}&lon=#{lon}&zoom=#{zoom}&accept-language=#{http_accept_language.user_preferred_languages.join(',')}" - end - def fetch_text(url) response = OSM.http_client.get(URI.parse(url)) -- 2.39.5