]> git.openstreetmap.org Git - rails.git/blobdiff - app/controllers/geocoder_controller.rb
Merge pull request #1732 from tomhughes/npemap
[rails.git] / app / controllers / geocoder_controller.rb
index 6110baead8b0086042a5b3fbf926b80e0396ab90..384f2c24c36a86272c47c6f713426edb971316a4 100644 (file)
@@ -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
       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"
         @sources.push "osm_nominatim"
       elsif @params[:query] =~ /^[A-Z]\d[A-Z]\s*\d[A-Z]\d$/i
         @sources.push "ca_postcode"
@@ -55,44 +54,18 @@ class GeocoderController < ApplicationController
     end
   end
 
     end
   end
 
-  def search_uk_postcode
-    # get query parameters
-    query = params[:query]
-
-    # create result array
-    @results = []
-
-    # 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)}")
-
-    # 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)
-    end
-
-    render :action => "results"
-  rescue StandardError => ex
-    @error = "Error contacting www.npemap.org.uk: #{ex}"
-    render :action => "error"
-  end
-
   def search_ca_postcode
     # get query parameters
     query = params[:query]
     @results = []
 
     # ask geocoder.ca (note - they have a per-day limit)
   def search_ca_postcode
     # get query parameters
     query = params[:query]
     @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?
 
     # 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
                     :zoom => POSTCODE_ZOOM,
                     :name => query.upcase)
     end
@@ -112,15 +85,13 @@ class GeocoderController < ApplicationController
     maxlat = params[:maxlat]
 
     # get view box
     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]
 
     # ask nominatim
 
     # get objects to excude
     exclude = "&exclude_place_ids=#{params[:exclude]}" if params[:exclude]
 
     # ask nominatim
-    response = fetch_xml("http:#{NOMINATIM_URL}search?format=xml&extratags=1&q=#{escape_query(query)}#{viewbox}#{exclude}&accept-language=#{http_accept_language.user_preferred_languages.join(',')}")
+    response = fetch_xml("#{NOMINATIM_URL}search?format=xml&extratags=1&q=#{escape_query(query)}#{viewbox}#{exclude}&accept-language=#{http_accept_language.user_preferred_languages.join(',')}")
 
     # extract the results from the response
     results =  response.elements["searchresults"]
 
     # extract the results from the response
     results =  response.elements["searchresults"]
@@ -138,12 +109,12 @@ class GeocoderController < ApplicationController
 
     # parse the response
     results.elements.each("place") do |place|
 
     # 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
       prefix_name = if type.empty?
                       ""
                     else
@@ -153,9 +124,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|
         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
         end
       end
       prefix = t "geocoder.search_osm_nominatim.prefix_format", :name => prefix_name
@@ -190,10 +159,11 @@ class GeocoderController < ApplicationController
 
     # parse the response
     response.elements.each("geonames/geoname") do |geoname|
 
     # 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,
       @results.push(:lat => lat, :lon => lon,
                     :zoom => GEONAMES_ZOOM,
                     :name => name,
@@ -216,15 +186,15 @@ class GeocoderController < ApplicationController
     @results = []
 
     # ask nominatim
     @results = []
 
     # ask nominatim
-    response = fetch_xml("http:#{NOMINATIM_URL}reverse?lat=#{lat}&lon=#{lon}&zoom=#{zoom}&accept-language=#{http_accept_language.user_preferred_languages.join(',')}")
+    response = fetch_xml("#{NOMINATIM_URL}reverse?lat=#{lat}&lon=#{lon}&zoom=#{zoom}&accept-language=#{http_accept_language.user_preferred_languages.join(',')}")
 
     # parse the response
     response.elements.each("reversegeocode/result") do |result|
 
     # 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"]
       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,
 
       @results.push(:lat => lat, :lon => lon,
                     :zoom => zoom,
@@ -254,8 +224,9 @@ class GeocoderController < ApplicationController
 
     # parse the response
     response.elements.each("geonames/countrySubdivision") do |geoname|
 
     # 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,
       @results.push(:lat => lat, :lon => lon,
                     :zoom => GEONAMES_ZOOM,
                     :name => name,