Experimental support for reverse geocoding using the new geocoder.
authorTom Hughes <tom@compton.nu>
Fri, 30 Oct 2009 11:12:55 +0000 (11:12 +0000)
committerTom Hughes <tom@compton.nu>
Fri, 30 Oct 2009 11:12:55 +0000 (11:12 +0000)
app/controllers/geocoder_controller.rb
app/views/geocoder/_description.html.erb
app/views/site/_search.html.erb
app/views/site/index.html.erb
config/locales/en.yml
config/routes.rb
public/javascripts/map.js

index 9f90980bfcf1b32b78e1ebd6896bba023859f775..f92e370c0c862a5d1918b2f04b26a770e2b9d5ea 100644 (file)
@@ -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]
index 7d93179d1605c2a68c1d94f8229654191d8728d9..b6a6d82fbcbebb4a698d5ed88cb68de3e4bc76cc 100644 (file)
@@ -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 %>
index 6e291bfd048d0c60e8cdb3c5baf4ce083b90b859..dab031c7b0fc3ea2935d0be132af39b1af09a4c6 100644 (file)
@@ -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] %>
index 12cc1d275e4d7c0817f7bb4a5dd369bd0c93f72f..150bdce4d59804d9a699f754b316f1f36ffa8dd9 100644 (file)
@@ -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);
 
index ec47a6a302416033a93feef324a6d7f2d3239825..d33e96ac55d4ee4c621c8a8f7d024e5275064268 100644 (file)
@@ -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
index a466c0a7197ba62cb5242f8fd759c9071a85fcaf..17f393894b3aeda0ef5dac99e8a3c3f45d347ab6 100644 (file)
@@ -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
index e548a89a421a02e6f7ff8a34a02c0c0f4b1ff79b..2349c3230d5770e5aa0f7a486415fb02b92b6a3f 100644 (file)
@@ -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);
 }