Pass the viewbox to nominatim when possible.
authorTom Hughes <tom@compton.nu>
Tue, 10 Nov 2009 14:37:46 +0000 (14:37 +0000)
committerTom Hughes <tom@compton.nu>
Tue, 10 Nov 2009 14:37:46 +0000 (14:37 +0000)
app/controllers/geocoder_controller.rb
app/views/geocoder/_search.html.erb
app/views/site/_search.html.erb

index 9706001..fdde828 100644 (file)
@@ -218,12 +218,21 @@ class GeocoderController < ApplicationController
   def search_osm_nominatim
     # get query parameters
     query = params[:query]
+    minlon = params[:minlon]
+    minlat = params[:minlat]
+    maxlon = params[:maxlon]
+    maxlat = params[:maxlat]
+
+    # get view box
+    if minlon && minlat && maxlon && maxlat
+      viewbox = "&viewbox=#{minlon},#{maxlat},#{maxlon},#{minlat}"
+    end
 
     # create result array
     @results = Array.new
 
-    # ask OSM namefinder
-    response = fetch_xml("http://nominatim.openstreetmap.org/search?format=xml&q=#{escape_query(query)}")
+    # ask nominatim
+    response = fetch_xml("http://nominatim.openstreetmap.org/search?format=xml&q=#{escape_query(query)}#{viewbox}")
 
     # parse the response
     response.elements.each("searchresults/place") do |place|
index 0d0ed24..b28feda 100644 (file)
@@ -4,6 +4,6 @@
     <%= image_tag "searching.gif", :class => "search_searching" %>
   </div>
   <script type="text/javascript">
-    <%= remote_function :update => "search_#{source}", :url => { :action => "search_#{source}", :query => @query } %>
+    <%= remote_function :update => "search_#{source}", :url => { :action => "search_#{source}", :query => @query, :minlat => params[:minlat], :minlon => params[:minlon], :maxlat => params[:maxlat], :maxlon => params[:maxlon] } %>
   </script>
 <% end %>
index dab031c..3750a7d 100644 (file)
                         :with => "'lat=' + position.lat + '&lon=' + position.lon + '&zoom=' + zoom") %>
   }
 
+  function setSearchViewbox() {
+    <% if params[:action] == 'index' %>
+    var extent = getMapExtent();
+
+    $("minlon").value = extent.left;
+    $("minlat").value = extent.bottom;
+    $("maxlon").value = extent.right;
+    $("maxlat").value = extent.top;
+    <% end %>
+  }
+
   <% if params[:query] %>
   <%= remote_function(:loading => "startSearch()",
                       :url => { :controller => :geocoder, :action => :search, :query => h(params[:query]) }) %>
     <span class="whereami"><a href="javascript:describeLocation()" title="<%= t 'site.search.where_am_i_title' %>"><%= t 'site.search.where_am_i' %></a></span>
     <div class="search_form">
     <div id="search_field">
-    <% form_remote_tag(:loading => "startSearch()",
+    <% form_remote_tag(:before => "setSearchViewbox()",
+                       :loading => "startSearch()",
                        :complete => "endSearch()",
                        :url => { :controller => :geocoder, :action => :search },
                        :html => { :method => "get", :action => url_for(:action => "index") }) do %>
       <%= text_field_tag :query, h(params[:query]) %>
+      <% if params[:action] == 'index' %>
+        <%= hidden_field_tag :minlon %>
+        <%= hidden_field_tag :minlat %>
+        <%= hidden_field_tag :maxlon %>
+        <%= hidden_field_tag :maxlat %>
+      <% end %>
       <%= submit_tag t('site.search.submit_text') %>
     <% end %>
     </div>