X-Git-Url: https://git.openstreetmap.org/rails.git/blobdiff_plain/9cf698322ce70e2fdb718be6624b0ac4e8eaf285..08f0621d6f9342ab473cd1fdc262a5b6e9a368c3:/app/controllers/geocoder_controller.rb diff --git a/app/controllers/geocoder_controller.rb b/app/controllers/geocoder_controller.rb index b9bde31ab..d92da72b1 100644 --- a/app/controllers/geocoder_controller.rb +++ b/app/controllers/geocoder_controller.rb @@ -19,7 +19,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 +39,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 @@ -112,9 +111,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 +150,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 @@ -310,11 +305,11 @@ class GeocoderController < ApplicationController params.merge!(dms_to_decdeg(latlon)).delete(:query) 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.merge!(:lat => latlon[1].to_f, :lon => latlon[3].to_f, :latlon_digits => true).delete(:query) 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)