From b77406ff38a88e2ab38b4882620f44069b7125f0 Mon Sep 17 00:00:00 2001 From: Tom Hughes Date: Wed, 29 Nov 2017 23:07:19 +0000 Subject: [PATCH] Use decoded strings when parsing XML responses from geocoders Fixes #1690 --- app/controllers/geocoder_controller.rb | 36 +++++++++++--------- test/controllers/geocoder_controller_test.rb | 7 +++- test/http/nominatim.yml | 19 +++++++++++ 3 files changed, 44 insertions(+), 18 deletions(-) diff --git a/app/controllers/geocoder_controller.rb b/app/controllers/geocoder_controller.rb index 6110baead..5d7ba9189 100644 --- a/app/controllers/geocoder_controller.rb +++ b/app/controllers/geocoder_controller.rb @@ -91,8 +91,8 @@ class GeocoderController < ApplicationController # parse the response if response.get_elements("geodata/error").empty? - @results.push(:lat => response.get_text("geodata/latt").to_s, - :lon => response.get_text("geodata/longt").to_s, + @results.push(:lat => response.text("geodata/latt"), + :lon => response.text("geodata/longt"), :zoom => POSTCODE_ZOOM, :name => query.upcase) end @@ -138,12 +138,12 @@ class GeocoderController < ApplicationController # parse the response results.elements.each("place") do |place| - lat = place.attributes["lat"].to_s - lon = place.attributes["lon"].to_s - klass = place.attributes["class"].to_s - type = place.attributes["type"].to_s - name = place.attributes["display_name"].to_s - min_lat, max_lat, min_lon, max_lon = place.attributes["boundingbox"].to_s.split(",") + lat = place.attributes["lat"] + lon = place.attributes["lon"] + klass = place.attributes["class"] + type = place.attributes["type"] + name = place.attributes["display_name"] + min_lat, max_lat, min_lon, max_lon = place.attributes["boundingbox"].split(",") prefix_name = if type.empty? "" else @@ -190,10 +190,11 @@ class GeocoderController < ApplicationController # parse the response response.elements.each("geonames/geoname") do |geoname| - lat = geoname.get_text("lat").to_s - lon = geoname.get_text("lng").to_s - name = geoname.get_text("name").to_s - country = geoname.get_text("countryName").to_s + lat = geoname.text("lat") + lon = geoname.text("lng") + name = geoname.text("name") + country = geoname.text("countryName") + @results.push(:lat => lat, :lon => lon, :zoom => GEONAMES_ZOOM, :name => name, @@ -220,11 +221,11 @@ class GeocoderController < ApplicationController # parse the response response.elements.each("reversegeocode/result") do |result| - lat = result.attributes["lat"].to_s - lon = result.attributes["lon"].to_s + lat = result.attributes["lat"] + lon = result.attributes["lon"] object_type = result.attributes["osm_type"] object_id = result.attributes["osm_id"] - description = result.get_text.to_s + description = result.text @results.push(:lat => lat, :lon => lon, :zoom => zoom, @@ -254,8 +255,9 @@ class GeocoderController < ApplicationController # parse the response response.elements.each("geonames/countrySubdivision") do |geoname| - name = geoname.get_text("adminName1").to_s - country = geoname.get_text("countryName").to_s + name = geoname.text("adminName1") + country = geoname.text("countryName") + @results.push(:lat => lat, :lon => lon, :zoom => GEONAMES_ZOOM, :name => name, diff --git a/test/controllers/geocoder_controller_test.rb b/test/controllers/geocoder_controller_test.rb index ee8991d48..0d062cf42 100644 --- a/test/controllers/geocoder_controller_test.rb +++ b/test/controllers/geocoder_controller_test.rb @@ -1,4 +1,3 @@ - require "test_helper" require "geocoder_controller" @@ -425,6 +424,12 @@ class GeocoderControllerTest < ActionController::TestCase results_check :name => "Dinant Link Road, Broxbourne, Hertfordshire, East of England, England, EN11 8HX, United Kingdom", :lat => 51.7634883, :lon => -0.0088373, :type => "way", :id => 3489841, :zoom => 17 + + get :search_osm_nominatim_reverse, :xhr => true, + :params => { :lat => 13.7709, :lon => 100.50507, :zoom => 19 } + results_check :name => "MM Steak&Grill, ถนนศรีอยุธยา, บางขุนพรหม, กรุงเทพมหานคร, เขตดุสิต, กรุงเทพมหานคร, 10300, ประเทศไทย", + :lat => 13.7708691, :lon => 100.505073233221, + :type => "way", :id => 542901374, :zoom => 19 end end diff --git a/test/http/nominatim.yml b/test/http/nominatim.yml index accaebf33..35070fa73 100644 --- a/test/http/nominatim.yml +++ b/test/http/nominatim.yml @@ -51,3 +51,22 @@ gb + +/reverse?accept-language=&lat=13.7709&lon=100.50507&zoom=19: + code: 200 + body: | + + + MM Steak&Grill, ถนนศรีอยุธยา, บางขุนพรหม, กรุงเทพมหานคร, เขตดุสิต, กรุงเทพมหานคร, 10300, ประเทศไทย + + MM Steak&Grill + ถนนศรีอยุธยา + บางขุนพรหม + กรุงเทพมหานคร + เขตดุสิต + กรุงเทพมหานคร + 10300 + ประเทศไทย + th + + -- 2.43.2