X-Git-Url: https://git.openstreetmap.org./rails.git/blobdiff_plain/af1397436f0a1fd1c8170e3935a13c3ec51ea948..46bc4650d2123a2233e62f0e101983552178d12a:/app/controllers/geocoder_controller.rb?ds=sidebyside diff --git a/app/controllers/geocoder_controller.rb b/app/controllers/geocoder_controller.rb index 0a0062246..b9cf8d096 100644 --- a/app/controllers/geocoder_controller.rb +++ b/app/controllers/geocoder_controller.rb @@ -6,6 +6,7 @@ class GeocoderController < ApplicationController before_action :authorize_web before_action :set_locale before_action :require_oauth, :only => [:search] + authorize_resource :class => false def search @params = normalize_params @@ -19,7 +20,6 @@ class GeocoderController < ApplicationController if @params[:query] =~ /^\d{5}(-\d{4})?$/ @sources.push "osm_nominatim" elsif @params[:query] =~ /^(GIR 0AA|[A-PR-UWYZ]([0-9]{1,2}|([A-HK-Y][0-9]|[A-HK-Y][0-9]([0-9]|[ABEHMNPRV-Y]))|[0-9][A-HJKS-UW])\s*[0-9][ABD-HJLNP-UW-Z]{2})$/i - @sources.push "uk_postcode" @sources.push "osm_nominatim" elsif @params[:query] =~ /^[A-Z]\d[A-Z]\s*\d[A-Z]\d$/i @sources.push "ca_postcode" @@ -40,45 +40,45 @@ class GeocoderController < ApplicationController def search_latlon lat = params[:lat].to_f lon = params[:lon].to_f - if lat < -90 || lat > 90 - @error = "Latitude #{lat} out of range" - render :action => "error" - elsif lon < -180 || lon > 180 - @error = "Longitude #{lon} out of range" - render :action => "error" - else - @results = [{ :lat => lat, :lon => lon, - :zoom => params[:zoom], - :name => "#{lat}, #{lon}" }] - render :action => "results" - end - end + if params[:latlon_digits] + # We've got two nondescript numbers for a query, which can mean both "lat, lon" or "lon, lat". + @results = [] - def search_uk_postcode - # get query parameters - query = params[:query] + if lat >= -90 && lat <= 90 && lon >= -180 && lon <= 180 + @results.push(:lat => lat, :lon => lon, + :zoom => params[:zoom], + :name => "#{lat}, #{lon}") + end - # create result array - @results = [] + if lon >= -90 && lon <= 90 && lat >= -180 && lat <= 180 + @results.push(:lat => lon, :lon => lat, + :zoom => params[:zoom], + :name => "#{lon}, #{lat}") + end - # ask npemap.org.uk to do a combined npemap + freethepostcode search - response = fetch_text("http://www.npemap.org.uk/cgi/geocoder.fcgi?format=text&postcode=#{escape_query(query)}") + if @results.empty? + @error = "Latitude or longitude are out of range" + render :action => "error" + else + render :action => "results" + end + else + # Coordinates in a query have come with markers for latitude and longitude. + if lat < -90 || lat > 90 + @error = "Latitude #{lat} out of range" + render :action => "error" + elsif lon < -180 || lon > 180 + @error = "Longitude #{lon} out of range" + render :action => "error" + else + @results = [{ :lat => lat, :lon => lon, + :zoom => params[:zoom], + :name => "#{lat}, #{lon}" }] - # parse the response - unless response =~ /Error/ - dataline = response.split(/\n/)[1] - data = dataline.split(/,/) # easting,northing,postcode,lat,long - postcode = data[2].delete("'") - zoom = POSTCODE_ZOOM - postcode.count("#") - @results.push(:lat => data[3], :lon => data[4], :zoom => zoom, - :name => postcode) + render :action => "results" + end end - - render :action => "results" - rescue StandardError => ex - @error = "Error contacting www.npemap.org.uk: #{ex}" - render :action => "error" end def search_ca_postcode @@ -87,7 +87,7 @@ class GeocoderController < ApplicationController @results = [] # ask geocoder.ca (note - they have a per-day limit) - response = fetch_xml("http://geocoder.ca/?geoit=XML&postal=#{escape_query(query)}") + response = fetch_xml("https://geocoder.ca/?geoit=XML&postal=#{escape_query(query)}") # parse the response if response.get_elements("geodata/error").empty? @@ -112,9 +112,7 @@ class GeocoderController < ApplicationController maxlat = params[:maxlat] # get view box - if minlon && minlat && maxlon && maxlat - viewbox = "&viewbox=#{minlon},#{maxlat},#{maxlon},#{minlat}" - end + viewbox = "&viewbox=#{minlon},#{maxlat},#{maxlon},#{minlat}" if minlon && minlat && maxlon && maxlat # get objects to excude exclude = "&exclude_place_ids=#{params[:exclude]}" if params[:exclude] @@ -153,9 +151,7 @@ class GeocoderController < ApplicationController rank = (place.attributes["place_rank"].to_i + 1) / 2 prefix_name = t "geocoder.search_osm_nominatim.admin_levels.level#{rank}", :default => prefix_name place.elements["extratags"].elements.each("tag") do |extratag| - if extratag.attributes["key"] == "place" - prefix_name = t "geocoder.search_osm_nominatim.prefix.place.#{extratag.attributes['value']}", :default => prefix_name - end + prefix_name = t "geocoder.search_osm_nominatim.prefix.place.#{extratag.attributes['value']}", :default => prefix_name if extratag.attributes["key"] == "place" end end prefix = t "geocoder.search_osm_nominatim.prefix_format", :name => prefix_name @@ -311,10 +307,12 @@ class GeocoderController < ApplicationController elsif latlon = query.match(/^\s*([+-]?\d+(\.\d*)?)\s*[\s,]\s*([+-]?\d+(\.\d*)?)\s*$/) params.merge!(:lat => latlon[1].to_f, :lon => latlon[3].to_f).delete(:query) + + params[:latlon_digits] = true unless params[:whereami] end end - params.permit(:query, :lat, :lon, :zoom, :minlat, :minlon, :maxlat, :maxlon) + params.permit(:query, :lat, :lon, :latlon_digits, :zoom, :minlat, :minlon, :maxlat, :maxlon) end def nsew_to_decdeg(captures)