From 2e03861300bca1a44d50a9e9c684ffc0e2d6ad65 Mon Sep 17 00:00:00 2001 From: Nick Whitelegg Date: Mon, 7 Jan 2008 20:25:12 +0000 Subject: [PATCH] Began code for feature lookup: implemented code to respond to mouse click and latlon to non spherical Mercator (for the postgis database) --- app/views/site/index.rhtml | 9 +++++++ config/database.yml | 4 +-- config/environment.rb | 2 +- public/javascripts/map.js | 50 ++++++++++++++++++++++++++++++++++++++ 4 files changed, 62 insertions(+), 3 deletions(-) diff --git a/app/views/site/index.rhtml b/app/views/site/index.rhtml index 604ecdb32..878720efc 100644 --- a/app/views/site/index.rhtml +++ b/app/views/site/index.rhtml @@ -115,11 +115,20 @@ by the OpenStreetMap project and it's contributors. map.events.register("moveend", map, updateLocation); map.events.register("changelayer", map, updateLocation); + map.events.register("click", map, mapClick); updateLocation(); handleResize(); } + // Map click results in feature lookup + function mapClick(e) { + var pos = lonLatToNonSphericalMercator + (mercatorToLonLat + (map.getLonLatFromViewPortPx + ( map.events.getMousePosition(e)))); + } + function getPosition() { return mercatorToLonLat(map.getCenter()); } diff --git a/config/database.yml b/config/database.yml index 436e3d306..fccd05934 100644 --- a/config/database.yml +++ b/config/database.yml @@ -13,8 +13,8 @@ development: adapter: mysql database: openstreetmap - username: TheUsername - password: ThePassword + username: openstreetmap + password: openstreetmap host: localhost # Warning: The database defined as 'test' will be erased and diff --git a/config/environment.rb b/config/environment.rb index ed7bb6774..493e1664e 100644 --- a/config/environment.rb +++ b/config/environment.rb @@ -5,7 +5,7 @@ ENV['RAILS_ENV'] ||= 'production' # Specifies gem version of Rails to use when vendor/rails is not present -RAILS_GEM_VERSION = '2.0.1' unless defined? RAILS_GEM_VERSION +#RAILS_GEM_VERSION = '2.0.1' unless defined? RAILS_GEM_VERSION # Set the server URL SERVER_URL = ENV['OSM_SERVER_URL'] || 'www.openstreetmap.org' diff --git a/public/javascripts/map.js b/public/javascripts/map.js index abbc7f8ea..0c13b016e 100644 --- a/public/javascripts/map.js +++ b/public/javascripts/map.js @@ -146,6 +146,56 @@ function lonLatToMercator(ll) { return new OpenLayers.LonLat(lon, lat); } +// for interacting with the PostGIS database which uses non spherical +// Mercator. Taken from Freemap which in turn was taken from a standard +// algorithm off the net. + +function lonLatToNonSphericalMercator(ll) { + var custLat = ll.lat * (Math.PI/180); + var a = 6378137; + var b = 6356752.3142; + var f = (a-b)/a; + var e = Math.sqrt(2*f-Math.pow(f,2)); + custLat=a*Math.log(Math.tan(Math.PI/4+custLat/2)* + Math.pow(( (1-e*Math.sin(custLat)) / (1+e*Math.sin(custLat))),e/2)); + custLon = ll.lon * (Math.PI/180) * 6378137; + return new OpenLayers.LonLat (custLon,custLat); +} + +function nonSphericalMercatorToLonLat(merc) { + var lon_deg, lat_deg; + var a = 6378137.0; + var b = 6356752.3142; + var k0 = 1.0; + var t = 1.0 - b/a; + var es = 2*t - t*t; + var e = Math.sqrt(es); + lon_deg = merc.lon; + lat_deg = merc.lat; + lon_deg /= a; + lat_deg /= a; + lon_deg /= k0; + lat_deg = phi2(Math.exp(-lat_deg/k0), e); + lon_deg *= (180/M_PI); + lat_deg *= (180/M_PI); + return new OpenLayers.LonLat(lon_deg,lat_deg); +} + +function phi2 (ts,e) { + var eccnth = 0.5*e; + var Phi = (PI/2) - 2.0*Math.atan(ts); + var dphi; + var i=15; + do { + var con = e*Math.sin(Phi); + dphi = (PI/2) - 2.0*Math.atan(ts*Math.pow((1.0-con)/(1.0+con),eccnth)) + - Phi; + Phi += dphi; + } + while(Math.abs(dphi) > 0.0000000001 && --i); + return Phi; +} + function scaleToZoom(scale) { return Math.log(360.0/(scale * 512.0)) / Math.log(2.0); } -- 2.39.5