Experimental support for reverse geocoding using the new geocoder.

This commit is contained in:
Tom Hughes 2009-10-30 11:12:55 +00:00
parent fd70409adb
commit 639a994c9b
7 changed files with 40 additions and 3 deletions

View 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]

View 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 %>

View 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] %>

View 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);

View 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

View 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

View 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);
}