From: Tom Hughes <tom@compton.nu>
Date: Fri, 30 Oct 2009 11:12:55 +0000 (+0000)
Subject: Experimental support for reverse geocoding using the new geocoder.
X-Git-Tag: live~7868
X-Git-Url: https://git.openstreetmap.org/rails.git/commitdiff_plain/639a994c9b851b94d4c65aa96af732eefc8453fb

Experimental support for reverse geocoding using the new geocoder.
---

diff --git a/app/controllers/geocoder_controller.rb b/app/controllers/geocoder_controller.rb
index 9f90980bf..f92e370c0 100644
--- a/app/controllers/geocoder_controller.rb
+++ b/app/controllers/geocoder_controller.rb
@@ -287,6 +287,7 @@ class GeocoderController < ApplicationController
     @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 => "osm_twain" }) if APP_CONFIG['twain_enabled']
     @sources.push({ :name => "geonames" })
 
     render :update do |page|
@@ -331,6 +332,31 @@ class GeocoderController < ApplicationController
     render :action => "error"
   end
 
+  def description_osm_twain
+    # get query parameters
+    lat = params[:lat]
+    lon = params[:lon]
+    zoom = params[:zoom]
+
+    # create result array
+    @results = Array.new
+
+    # ask OSM namefinder
+    response = fetch_xml("http://katie.openstreetmap.org/~twain/reverse.php?lat=#{lat}&lon=#{lon}&zoom=#{zoom}")
+
+    # parse the response
+    response.elements.each("reversegeocode") do |result|
+      description = result.get_text("result").to_s
+
+      @results.push({:prefix => "#{description}"})
+    end
+
+    render :action => "results"
+  rescue Exception => ex
+    @error = "Error contacting katie.openstreetmap.org: #{ex.to_s}"
+    render :action => "error"
+  end
+
   def description_geonames
     # get query parameters
     lat = params[:lat]
diff --git a/app/views/geocoder/_description.html.erb b/app/views/geocoder/_description.html.erb
index 7d93179d1..b6a6d82fb 100644
--- a/app/views/geocoder/_description.html.erb
+++ b/app/views/geocoder/_description.html.erb
@@ -8,6 +8,6 @@
     <%= image_tag "searching.gif", :class => "search_searching" %>
   </div>
   <script type="text/javascript">
-    <%= remote_function :update => "description_#{source[:name]}_#{source[:types]}", :url => { :action => "description_#{source[:name]}", :lat => params[:lat], :lon => params[:lon], :types => source[:types], :max => source[:max] } %>
+    <%= remote_function :update => "description_#{source[:name]}_#{source[:types]}", :url => { :action => "description_#{source[:name]}", :lat => params[:lat], :lon => params[:lon], :zoom => params[:zoom], :types => source[:types], :max => source[:max] } %>
   </script>
 <% end %>
diff --git a/app/views/site/_search.html.erb b/app/views/site/_search.html.erb
index 6e291bfd0..dab031c7b 100644
--- a/app/views/site/_search.html.erb
+++ b/app/views/site/_search.html.erb
@@ -6,10 +6,11 @@
 
   function describeLocation() {
     var position = getPosition();
+    var zoom = getZoom();
 
     <%= remote_function(:loading => "startSearch()",
                         :url => { :controller => :geocoder, :action => :description },
-                        :with => "'lat=' + position.lat + '&lon=' + position.lon") %>
+                        :with => "'lat=' + position.lat + '&lon=' + position.lon + '&zoom=' + zoom") %>
   }
 
   <% if params[:query] %>
diff --git a/app/views/site/index.html.erb b/app/views/site/index.html.erb
index 12cc1d275..150bdce4d 100644
--- a/app/views/site/index.html.erb
+++ b/app/views/site/index.html.erb
@@ -191,6 +191,10 @@ end
     return getMapCenter();
   }
 
+  function getZoom() {
+    return getMapZoom();
+  }
+
   function setPosition(lat, lon, zoom, min_lon, min_lat, max_lon, max_lat) {
     var centre = new OpenLayers.LonLat(lon, lat);
 
diff --git a/config/locales/en.yml b/config/locales/en.yml
index ec47a6a30..d33e96ac5 100644
--- a/config/locales/en.yml
+++ b/config/locales/en.yml
@@ -384,6 +384,7 @@ en:
     description:
       title:
         osm_namefinder: '{{types}} from <a href="http://gazetteer.openstreetmap.org/namefinder/">OpenStreetMap Namefinder</a>'
+        osm_twain: 'Location from <a href="http://katie.openstreetmap.org/~twain/">OpenStreetMap Twain</a>'
         geonames: 'Location from <a href="http://www.geonames.org/">GeoNames</a>'
       types:
         cities: Cities
diff --git a/config/routes.rb b/config/routes.rb
index a466c0a71..17f393894 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -184,6 +184,7 @@ ActionController::Routing::Routes.draw do |map|
   map.connect '/geocoder/search_geonames', :controller => 'geocoder', :action => 'search_geonames'
   map.connect '/geocoder/description', :controller => 'geocoder', :action => 'description'
   map.connect '/geocoder/description_osm_namefinder', :controller => 'geocoder', :action => 'description_osm_namefinder'
+  map.connect '/geocoder/description_osm_twain', :controller => 'geocoder', :action => 'description_osm_twain'
   map.connect '/geocoder/description_geonames', :controller => 'geocoder', :action => 'description_geonames'
 
   # export
diff --git a/public/javascripts/map.js b/public/javascripts/map.js
index e548a89a4..2349c3230 100644
--- a/public/javascripts/map.js
+++ b/public/javascripts/map.js
@@ -193,7 +193,7 @@ function removeBoxFromMap(box){
    vectors.removeFeature(box);
 }
 
-function getMapCenter(center, zoom) {
+function getMapCenter() {
    return map.getCenter().clone().transform(map.getProjectionObject(), epsg4326);
 }
 
@@ -212,6 +212,10 @@ function getMapExtent() {
    return map.getExtent().clone().transform(map.getProjectionObject(), epsg4326);
 }
 
+function getMapZoom() {
+   return map.getZoom();
+}
+
 function getEventPosition(event) {
    return map.getLonLatFromViewPortPx(event.xy).clone().transform(map.getProjectionObject(), epsg4326);
 }