- # create result array
- @results = Array.new
-
- # create parameter hash for "more results" link
- @more_params = params.reverse_merge({ :exclude => [] })
-
- # extract the results from the response
- results = response.elements["searchresults"]
-
- # 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(",")
- prefix = t "geocoder.search_osm_nominatim.prefix.#{klass}.#{type}", :default => type.gsub("_", " ").capitalize
-
- @results.push({:lat => lat, :lon => lon,
- :min_lat => min_lat, :max_lat => max_lat,
- :min_lon => min_lon, :max_lon => max_lon,
- :prefix => prefix, :name => name})
- @more_params[:exclude].push(place.attributes["place_id"].to_s)
- end
-
- render :action => "results"
- rescue Exception => ex
- @error = "Error contacting nominatim.openstreetmap.org: #{ex.to_s}"
- render :action => "error"
- end
-
- def search_geonames
- # get query parameters
- query = params[:query]
-
- # create result array
- @results = Array.new
-
- # ask geonames.org
- response = fetch_xml("http://ws.geonames.org/search?q=#{escape_query(query)}&maxRows=20")
-
- # 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
- @results.push({:lat => lat, :lon => lon,
- :zoom => APP_CONFIG['geonames_zoom'],
- :name => name,
- :suffix => ", #{country}"})
- end
-
- render :action => "results"
- rescue Exception => ex
- @error = "Error contacting ws.geonames.org: #{ex.to_s}"
- render :action => "error"
- end
-
- def description
- @sources = Array.new
-
- @sources.push({ :name => "osm_nominatim" })
- @sources.push({ :name => "osm_namefinder", :types => "cities", :max => 2 })
- @sources.push({ :name => "osm_namefinder", :types => "towns", :max => 4 })
- @sources.push({ :name => "osm_namefinder", :types => "places", :max => 10 })
- @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"