Began code for feature lookup: implemented code to respond to mouse click and latlon to non spherical Mercator (for the postgis database)

This commit is contained in:
Nick Whitelegg 2008-01-07 20:25:12 +00:00
parent f29300bf1a
commit 2e03861300
4 changed files with 62 additions and 3 deletions

View file

@ -115,11 +115,20 @@ by the OpenStreetMap project and it's contributors.
map.events.register("moveend", map, updateLocation); map.events.register("moveend", map, updateLocation);
map.events.register("changelayer", map, updateLocation); map.events.register("changelayer", map, updateLocation);
map.events.register("click", map, mapClick);
updateLocation(); updateLocation();
handleResize(); handleResize();
} }
// Map click results in feature lookup
function mapClick(e) {
var pos = lonLatToNonSphericalMercator
(mercatorToLonLat
(map.getLonLatFromViewPortPx
( map.events.getMousePosition(e))));
}
function getPosition() { function getPosition() {
return mercatorToLonLat(map.getCenter()); return mercatorToLonLat(map.getCenter());
} }

View file

@ -13,8 +13,8 @@
development: development:
adapter: mysql adapter: mysql
database: openstreetmap database: openstreetmap
username: TheUsername username: openstreetmap
password: ThePassword password: openstreetmap
host: localhost host: localhost
# Warning: The database defined as 'test' will be erased and # Warning: The database defined as 'test' will be erased and

View file

@ -5,7 +5,7 @@
ENV['RAILS_ENV'] ||= 'production' ENV['RAILS_ENV'] ||= 'production'
# Specifies gem version of Rails to use when vendor/rails is not present # 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 # Set the server URL
SERVER_URL = ENV['OSM_SERVER_URL'] || 'www.openstreetmap.org' SERVER_URL = ENV['OSM_SERVER_URL'] || 'www.openstreetmap.org'

View file

@ -146,6 +146,56 @@ function lonLatToMercator(ll) {
return new OpenLayers.LonLat(lon, lat); 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) { function scaleToZoom(scale) {
return Math.log(360.0/(scale * 512.0)) / Math.log(2.0); return Math.log(360.0/(scale * 512.0)) / Math.log(2.0);
} }