Simplify handling of geocoder URLs

This avoids having to build them in multiple places and also
ensures we link to what was actually searched rather than some
random string from the locale file.
This commit is contained in:
Tom Hughes 2024-06-25 17:57:38 +01:00
parent ddc252016a
commit 271384e683
4 changed files with 15 additions and 17 deletions

View file

@ -13,10 +13,10 @@ class GeocoderController < ApplicationController
@sources = []
if @params[:lat] && @params[:lon]
@sources.push({ :name => "latlon", :parameters => "" })
@sources.push({ :name => "osm_nominatim_reverse", :parameters => "reverse?format=html&#{nominatim_reverse_url_parameters}" })
@sources.push(:name => "latlon", :url => root_path)
@sources.push(:name => "osm_nominatim_reverse", :url => nominatim_reverse_url(:format => "html"))
elsif @params[:query]
@sources.push({ :name => "osm_nominatim", :parameters => "search?format=html&#{nominatim_url_parameters}" })
@sources.push(:name => "osm_nominatim", :url => nominatim_url(:format => "html"))
end
if @sources.empty?
@ -72,7 +72,7 @@ class GeocoderController < ApplicationController
def search_osm_nominatim
# ask nominatim
response = fetch_xml("#{Settings.nominatim_url}search?format=xml&" + nominatim_url_parameters)
response = fetch_xml(nominatim_url(:format => "xml"))
# extract the results from the response
results = response.elements["searchresults"]
@ -131,7 +131,7 @@ class GeocoderController < ApplicationController
@results = []
# ask nominatim
response = fetch_xml("#{Settings.nominatim_url}reverse?" + nominatim_reverse_url_parameters)
response = fetch_xml(nominatim_reverse_url(:format => "xml"))
# parse the response
response.elements.each("reversegeocode/result") do |result|
@ -156,7 +156,7 @@ class GeocoderController < ApplicationController
private
def nominatim_url_parameters
def nominatim_url(format: nil)
# get query parameters
query = params[:query]
minlon = params[:minlon]
@ -170,16 +170,18 @@ class GeocoderController < ApplicationController
# get objects to excude
exclude = "&exclude_place_ids=#{params[:exclude]}" if params[:exclude]
"extratags=1&q=#{escape_query(query)}#{viewbox}#{exclude}&accept-language=#{http_accept_language.user_preferred_languages.join(',')}"
# build url
"#{Settings.nominatim_url}search?format=#{format}&extratags=1&q=#{escape_query(query)}#{viewbox}#{exclude}&accept-language=#{http_accept_language.user_preferred_languages.join(',')}"
end
def nominatim_reverse_url_parameters
def nominatim_reverse_url(format: nil)
# get query parameters
lat = params[:lat]
lon = params[:lon]
zoom = params[:zoom]
"lat=#{lat}&lon=#{lon}&zoom=#{zoom}&accept-language=#{http_accept_language.user_preferred_languages.join(',')}"
# 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)

View file

@ -4,8 +4,7 @@
<% @sources.each do |source| %>
<h4>
<%= t(".title.results_from_html", :results_link => link_to(t(".title.#{source[:name]}"),
t(".title.#{source[:name]}_url").to_s + source[:parameters].to_s)) %>
<%= t(".title.results_from_html", :results_link => link_to(t(".title.#{source[:name]}"), source[:url].to_s)) %>
</h4>
<div class="search_results_entry mx-n3" data-href="<%= url_for @params.merge(:action => "search_#{source[:name]}") %>">
<div class="text-center loader">

View file

@ -671,11 +671,8 @@ en:
title:
results_from_html: 'Results from %{results_link}'
latlon: Internal
latlon_url: https://openstreetmap.org/
osm_nominatim: OpenStreetMap Nominatim
osm_nominatim_url: https://nominatim.openstreetmap.org/
osm_nominatim_reverse: OpenStreetMap Nominatim
osm_nominatim_reverse_url: https://nominatim.openstreetmap.org/
search_osm_nominatim:
prefix_format: "%{name}"
prefix:

View file

@ -16,7 +16,7 @@
<place place_id='109724' osm_type='node' osm_id='17044599' place_rank='30' boundingbox="51.7418469,51.7518469,-0.0156773,-0.0056773" lat='51.7468469' lon='-0.0106773' display_name='Broxbourne, Stafford Drive, Broxbourne, Hertfordshire, East of England, England, United Kingdom' class='railway' type='station' importance='0.111' icon='http://nominatim.openstreetmap.org/images/mapicons/transport_train_station2.p.20.png'><extratags></extratags></place>
</searchresults>
/reverse?accept-language=&lat=51.7632&lon=-0.0076&zoom=15:
/reverse?accept-language=&format=xml&lat=51.7632&lon=-0.0076&zoom=15:
code: 200
body: |
<?xml version="1.0" encoding="UTF-8"?>
@ -33,7 +33,7 @@
</addressparts>
</reversegeocode>
/reverse?accept-language=&lat=51.7632&lon=-0.0076&zoom=17:
/reverse?accept-language=&format=xml&lat=51.7632&lon=-0.0076&zoom=17:
code: 200
body: |
<?xml version="1.0" encoding="UTF-8"?>
@ -52,7 +52,7 @@
</addressparts>
</reversegeocode>
/reverse?accept-language=&lat=13.7709&lon=100.50507&zoom=19:
/reverse?accept-language=&format=xml&lat=13.7709&lon=100.50507&zoom=19:
code: 200
body: |
<?xml version="1.0" encoding="UTF-8" ?>