]> git.openstreetmap.org Git - rails.git/blobdiff - app/controllers/geocoder_controller.rb
Include useful URLs in note responses
[rails.git] / app / controllers / geocoder_controller.rb
index aaa8d17ef114524cff62490b5db150279dee5d6c..ced95dce630eaac99a99d0b366846a5706fed850 100644 (file)
@@ -26,12 +26,7 @@ class GeocoderController < ApplicationController
       @sources.push "osm_nominatim"
     else
       @sources.push "osm_nominatim"
-      @sources.push "geonames"
-    end
-
-    render :update do |page|
-      page.replace_html :sidebar_content, :partial => "search"
-      page.call "openSidebar"
+      @sources.push "geonames" if defined?(GEONAMES_USERNAME)
     end
   end
 
@@ -57,7 +52,7 @@ class GeocoderController < ApplicationController
       render :action => "error"
     else
       @results.push({:lat => lat, :lon => lon,
-                     :zoom => APP_CONFIG['postcode_zoom'],
+                     :zoom => POSTCODE_ZOOM,
                      :name => "#{lat}, #{lon}"})
 
       render :action => "results"
@@ -78,7 +73,7 @@ class GeocoderController < ApplicationController
     unless response.match(/couldn't find this zip/)
       data = response.split(/\s*,\s+/) # lat,long,town,state,zip
       @results.push({:lat => data[0], :lon => data[1],
-                     :zoom => APP_CONFIG['postcode_zoom'],
+                     :zoom => POSTCODE_ZOOM,
                      :prefix => "#{data[2]}, #{data[3]},",
                      :name => data[4]})
     end
@@ -104,7 +99,7 @@ class GeocoderController < ApplicationController
       dataline = response.split(/\n/)[1]
       data = dataline.split(/,/) # easting,northing,postcode,lat,long
       postcode = data[2].gsub(/'/, "")
-      zoom = APP_CONFIG['postcode_zoom'] - postcode.count("#")
+      zoom = POSTCODE_ZOOM - postcode.count("#")
       @results.push({:lat => data[3], :lon => data[4], :zoom => zoom,
                      :name => postcode})
     end
@@ -127,7 +122,7 @@ class GeocoderController < ApplicationController
     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,
-                     :zoom => APP_CONFIG['postcode_zoom'],
+                     :zoom => POSTCODE_ZOOM,
                      :name => query.upcase})
     end
 
@@ -137,84 +132,6 @@ class GeocoderController < ApplicationController
     render :action => "error"
   end
 
-  def search_osm_namefinder
-    # get query parameters
-    query = params[:query]
-
-    # create result array
-    @results = Array.new
-
-    # ask OSM namefinder
-    response = fetch_xml("http://gazetteer.openstreetmap.org/namefinder/search.xml?find=#{escape_query(query)}")
-
-    # parse the response
-    response.elements.each("searchresults/named") do |named|
-      lat = named.attributes["lat"].to_s
-      lon = named.attributes["lon"].to_s
-      zoom = named.attributes["zoom"].to_s
-      place = named.elements["place/named"] || named.elements["nearestplaces/named"]
-      type = named.attributes["info"].to_s.capitalize
-      name = named.attributes["name"].to_s
-      description = named.elements["description"].to_s
-
-      if name.empty?
-        prefix = ""
-        name = type
-      else
-        prefix =  t "geocoder.search_osm_namefinder.prefix", :type => type
-      end
-
-      if place
-        distance = format_distance(place.attributes["approxdistance"].to_i)
-        direction = format_direction(place.attributes["direction"].to_i)
-        placename = format_name(place.attributes["name"].to_s)
-        suffix = t "geocoder.search_osm_namefinder.suffix_place", :distance => distance, :direction => direction, :placename => placename
-
-        if place.attributes["rank"].to_i <= 30
-          parent = nil
-          parentrank = 0
-          parentscore = 0
-
-          place.elements.each("nearestplaces/named") do |nearest|
-            nearestrank = nearest.attributes["rank"].to_i
-            nearestscore = nearestrank / nearest.attributes["distance"].to_f
-
-            if nearestrank > 30 and
-               ( nearestscore > parentscore or
-                 ( nearestscore == parentscore and nearestrank > parentrank ) )
-              parent = nearest
-              parentrank = nearestrank
-              parentscore = nearestscore
-            end
-          end
-
-          if parent
-            parentname = format_name(parent.attributes["name"].to_s)
-
-            if  place.attributes["info"].to_s == "suburb"
-              suffix = t "geocoder.search_osm_namefinder.suffix_suburb", :suffix => suffix, :parentname => parentname
-            else
-              parentdistance = format_distance(parent.attributes["approxdistance"].to_i)
-              parentdirection = format_direction(parent.attributes["direction"].to_i)
-              suffix = t "geocoder.search_osm_namefinder.suffix_parent", :suffix => suffix, :parentdistance => parentdistance, :parentdirection => parentdirection, :parentname => parentname
-            end
-          end
-        end
-      else
-        suffix = ""
-      end
-
-      @results.push({:lat => lat, :lon => lon, :zoom => zoom,
-                     :prefix => prefix, :name => name, :suffix => suffix,
-                     :description => description})
-    end
-
-    render :action => "results"
-  rescue Exception => ex
-    @error = "Error contacting gazetteer.openstreetmap.org: #{ex.to_s}"
-    render :action => "error"
-  end
-
   def search_osm_nominatim
     # get query parameters
     query = params[:query]
@@ -234,7 +151,7 @@ class GeocoderController < ApplicationController
     end
 
     # ask nominatim
-    response = fetch_xml("http://nominatim.openstreetmap.org/search?format=xml&q=#{escape_query(query)}#{viewbox}#{exclude}&accept-language=#{request.user_preferred_languages.join(',')}")
+    response = fetch_xml("#{NOMINATIM_URL}search?format=xml&q=#{escape_query(query)}#{viewbox}#{exclude}&accept-language=#{request.user_preferred_languages.join(',')}")
 
     # create result array
     @results = Array.new
@@ -253,7 +170,8 @@ class GeocoderController < ApplicationController
       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(",")
-      prefix = t "geocoder.search_osm_nominatim.prefix.#{klass}.#{type}", :default => type.gsub("_", " ").capitalize
+      prefix_name = t "geocoder.search_osm_nominatim.prefix.#{klass}.#{type}", :default => type.gsub("_", " ").capitalize
+      prefix = t "geocoder.search_osm_nominatim.prefix_format", :name => prefix_name
 
       @results.push({:lat => lat, :lon => lon,
                      :min_lat => min_lat, :max_lat => max_lat,
@@ -263,9 +181,9 @@ class GeocoderController < ApplicationController
     end
 
     render :action => "results"
-  rescue Exception => ex
-    @error = "Error contacting nominatim.openstreetmap.org: #{ex.to_s}"
-    render :action => "error"
+#  rescue Exception => ex
+#    @error = "Error contacting nominatim.openstreetmap.org: #{ex.to_s}"
+#    render :action => "error"
   end
 
   def search_geonames
@@ -276,7 +194,7 @@ class GeocoderController < ApplicationController
     @results = Array.new
 
     # ask geonames.org
-    response = fetch_xml("http://ws.geonames.org/search?q=#{escape_query(query)}&maxRows=20")
+    response = fetch_xml("http://api.geonames.org/search?q=#{escape_query(query)}&maxRows=20&username=#{GEONAMES_USERNAME}")
 
     # parse the response
     response.elements.each("geonames/geoname") do |geoname|
@@ -285,7 +203,7 @@ class GeocoderController < ApplicationController
       name = geoname.get_text("name").to_s
       country = geoname.get_text("countryName").to_s
       @results.push({:lat => lat, :lon => lon,
-                     :zoom => APP_CONFIG['geonames_zoom'],
+                     :zoom => GEONAMES_ZOOM,
                      :name => name,
                      :suffix => ", #{country}"})
     end
@@ -301,47 +219,6 @@ class GeocoderController < ApplicationController
 
     @sources.push({ :name => "osm_nominatim" })
     @sources.push({ :name => "geonames" })
-
-    render :update do |page|
-      page.replace_html :sidebar_content, :partial => "description"
-      page.call "openSidebar"
-    end
-  end
-
-  def description_osm_namefinder
-    # get query parameters
-    lat = params[:lat]
-    lon = params[:lon]
-    types = params[:types]
-    max = params[:max]
-
-    # create result array
-    @results = Array.new
-
-    # ask OSM namefinder
-    response = fetch_xml("http://gazetteer.openstreetmap.org/namefinder/search.xml?find=#{types}+near+#{lat},#{lon}&max=#{max}")
-
-    # parse the response
-    response.elements.each("searchresults/named") do |named|
-      lat = named.attributes["lat"].to_s
-      lon = named.attributes["lon"].to_s
-      zoom = named.attributes["zoom"].to_s
-      place = named.elements["place/named"] || named.elements["nearestplaces/named"]
-      type = named.attributes["info"].to_s
-      name = named.attributes["name"].to_s
-      description = named.elements["description"].to_s
-      distance = format_distance(place.attributes["approxdistance"].to_i)
-      direction = format_direction((place.attributes["direction"].to_i - 180) % 360)
-      prefix = t "geocoder.description_osm_namefinder.prefix", :distance => distance, :direction => direction, :type => type
-      @results.push({:lat => lat, :lon => lon, :zoom => zoom,
-                     :prefix => prefix.capitalize, :name => name,
-                     :description => description})
-    end
-
-    render :action => "results"
-  rescue Exception => ex
-    @error = "Error contacting gazetteer.openstreetmap.org: #{ex.to_s}"
-    render :action => "error"
   end
 
   def description_osm_nominatim
@@ -353,8 +230,8 @@ class GeocoderController < ApplicationController
     # create result array
     @results = Array.new
 
-    # ask OSM namefinder
-    response = fetch_xml("http://nominatim.openstreetmap.org/reverse?lat=#{lat}&lon=#{lon}&zoom=#{zoom}&accept-language=#{request.user_preferred_languages.join(',')}")
+    # ask nominatim
+    response = fetch_xml("#{NOMINATIM_URL}reverse?lat=#{lat}&lon=#{lon}&zoom=#{zoom}&accept-language=#{request.user_preferred_languages.join(',')}")
 
     # parse the response
     response.elements.each("reversegeocode/result") do |result|