Name: moveHandler
Description: Display mouse position above map - shows lat/long & grid reference
Parameters:
Usage: To see where the mouse is while it moves over the map
var map = null;
var myWin = null;
var lat = null;
var ling = null;
var zoom = null;
var latc = null;
var bc = null;
var xgrid = null;
var ygrid = null;
// Add Firefox patch - if the browser is Firefox get the version number
var ffv = 0;
var ffn = "Firefox/"
var ffp = navigator.userAgent.indexOf(ffn);
if (ffp != -1) ffv = parseFloat(navigator.userAgent.substring(ffp + ffn.length));
// If we're using Firefox 1.5 or above override the Virtual Earth drawing functions to use SVG
if (ffv >= 1.5) {
Msn.Drawing.Graphic.CreateGraphic=function(f,b) { return new Msn.Drawing.SVGGraphic(f,b) }
}
var params = new Object();
params.latitude = 52;
params.longitude = -4;
params.zoomlevel = 2;
map = new VEMap('myMap');
map.LoadMap(new VELatLong(params.latitude,params.longitude),params.zoomlevel,'r',false);
if (document.all) {
//msg = 'Internet Explorer';
} else {
if (document.getElementById) {
//msg = 'Firefox';
} else {
//msg = 'Netscape';
document.captureEvents(Event,MOUSEMOVE)
}
}
document.onmousemove=moveHandler
Having loaded the map (above) then the onmousemove handler (below, with associated functions) will place the mouse position on the map in Latitude/Longitude as well as GB Ordanance Survey grid reference.
See http://www.svrsig.org/cgi-bin/gemap.cgi?lat=52&long=-4&zoom=3 for an example.
Code:
function moveHandler(evt) {
if (document.all) {
mx=window.event.clientX + document.body.scrollLeft
my=window.event.clientY + document.body.scrollTop
} else {
if (document.getElementById) {
mx=evt.clientX + document.body.scrollLeft
my=evt.clientY + document.body.scrollTop
} else {
mx=evt.pageX + window.pageXOffset
my=evt.pageY + window.pageYOffset
}
}
if ((mx>50) && (mx<50+900) && (my>110) && (my<110+400)) {
elat=map.PixelToLatLong(mx-50,my-110).Latitude
elong=map.PixelToLatLong(mx-50,my-110).Longitude
ezoom=map.GetZoomLevel()
document.getElementById("info").innerHTML =
'Mouse: Latitude = ' +
latmin(elat) +
', Longitude = ' +
lingmin(elong) +
', Zoom=' +
ezoom +
', Grid ref: ' +
gridref(elong,elat);
} else {
elat=map.GetCenter().Latitude
elong=map.GetCenter().Longitude
ezoom=map.GetZoomLevel()
document.getElementById("info").innerHTML =
'Centre: Latitude = ' +
latmin(elat) +
', Longitude = ' +
lingmin(elong) +
', Zoom=' +
ezoom +
', Grid ref: ' +
gridref(elong,elat);
}
}
function xgrd(xling,ylat) {
var fe = 4000.00;
var k0 = 0.009996013;
var ep2 = 0.00671534;
var e2 = 0.00667054;
var nu = null;
with (Math) {nu = 6377563.396/sqrt(1-e2*sin(ylat*3.14159/180)*sin(ylat*3.14159/180))};
var t = null;
with (Math) {t = tan(3.14159*ylat/180)*tan(3.14159*ylat/180)};
var c = null;
with (Math) {c = ep2*cos(ylat*3.14159/180)*cos(ylat*3.14159/180)};
var a = null;
with (Math) {a = 3.14159/180*(xling+2)*cos(ylat*3.14159/180)};
var m0 = 5429228.6;
var m = null;
with (Math) {m = 6377563.396*(3.14159/180*ylat*(1-e2/4-3*e2*e2/64-5*e2*e2*e2/256)-sin(2*3.14159/180*ylat)*(3*e2/8+3*e2*e2/32+45*e2*e2*e2/1024)+sin(4*3.14159/180*ylat)*(15*e2*e2/256+45*e2*e2*e2/1024)-sin(6*3.14159/180*ylat)*(35*e2*e2*e2/3072))};
return fe+k0*nu*(a+(1-t+c)*a*a*a/6+(5-18*t+t*t+72*c-58*ep2)*a*a*a*a*a/120);
}
function ygrd(xling,ylat) {
var fn = -1000.00;
var k0 = 0.009996013;
var ep2 = 0.00671534;
var e2 = 0.00667054;
var nu = null;
with (Math) {nu = 6377563.396/sqrt(1-e2*sin(ylat*3.14159/180)*sin(ylat*3.14159/180))};
var t = null;
with (Math) {t = tan(3.14159*ylat/180)*tan(3.14159*ylat/180)};
var c = null;
with (Math) {c = ep2*cos(ylat*3.14159/180)*cos(ylat*3.14159/180)};
var a = null;
with (Math) {a = 3.14159/180*(xling+2)*cos(ylat*3.14159/180)};
var m0 = 5429228.6;
var m = null;
with (Math) {m = 6377563.396*(3.14159/180*ylat*(1-e2/4-3*e2*e2/64-5*e2*e2*e2/256)-sin(2*3.14159/180*ylat)*(3*e2/8+3*e2*e2/32+45*e2*e2*e2/1024)+sin(4*3.14159/180*ylat)*(15*e2*e2/256+45*e2*e2*e2/1024)-sin(6*3.14159/180*ylat)*(35*e2*e2*e2/3072))};
var bc = null;
with (Math) {bc = fn+k0*(m-m0+nu*tan(3.14159/180*ylat)*(a*a/2+(5-t+9*c+4*c*c)*a*a*a*a/24+(61-58*t+t*t+600*c-330*ep2)*a*a*a*a*a*a/720))};
return bc;
}
function gridref(xxl,yyl) {
ygrid=ygrd(xxl,yyl);
xgrid=xgrd(xxl,yyl);
return gref(xgrid,ygrid);
}
function gref(xg,yg) {
if (xg<0 || xg>7000 || yg<0 || yg>11000) {
return "?? ??? ???"
}
char1="HJKLMNOPQRST";
char2="ABCDEFGHJKLMNOPQRSTUVWXYZ";
return char1.charAt(10+(xg/5000)-5*(yg/5000-(yg%5000)/5000)) +
char2.charAt((xg%5000)/1000+5*(4-(yg%5000)/1000+((yg%5000)%1000)/1000)) +
padnum(xg%1000) +
padnum(yg%1000) + ".";
}
function padnum(xin) {
if (xin>99) {
return " "+parseInt(xin);
}
if (xin>9) {
return " 0"+parseInt(xin);
}
return " 00"+parseInt(xin);
}
function latmin(cin) {
var ain = 0;
var bin = 0;
if (cin>0) {
ain = parseInt(60*cin) % 60;
bin = parseInt(36000*cin) % 600;
return " "+parseInt(cin)+"°"+parseInt(ain)+"'"+parseInt(bin/10)+'.'+parseInt((bin) % 10)+'"N';
}
cin = -cin;
ain = parseInt(60*cin) % 60;
bin = parseInt(36000*cin) % 600;
return " "+parseInt(cin)+"°"+parseInt(ain)+"'"+parseInt(bin/10)+'.'+parseInt((bin) % 10)+'"S';
}
function lingmin(din) {
var ain = 0;
var bin = 0;
if (din>0) {
ain = parseInt(60*din) % 60;
bin = parseInt(36000*din) % 600;
return " "+parseInt(din)+"°"+parseInt(ain)+"'"+parseInt(bin/10)+'.'+parseInt((bin) % 10)+'"E';
}
din = -din;
ain = parseInt(60*din) % 60;
bin = parseInt(36000*din) % 600;
return " "+parseInt(din)+"°"+parseInt(ain)+"'"+parseInt(bin/10)+'.'+parseInt((bin) % 10)+'"W';
}
function qlat(gx,gy)
{
var xfac=(gx-3184)/(5049-3184);
var yfac=(gy-1416)/(4196-1416);
var flat=51.166+yfac*2.5;
var fling=-3.166+xfac*2.667;
var lling=0;
do {
lling=fling+(gx-xgrd(fling,flat))/(5049-3184)*2.667
flat=flat+(gy-ygrd(fling,flat))/(4196-1416)*2.5
fling=lling
} while ((gx-xgrd(fling,flat))>0.2 || (gy-ygrd(fling,flat))>0.2 || (gx-xgrd(fling,flat))<-0.2 || (gy-ygrd(fling,flat))<-0.2)
return flat;
}
function qling(gx,gy)
{
var xfac=(gx-3184)/(5049-3184);
var yfac=(gy-1416)/(4196-1416);
var flat=51.166+yfac*2.5;
var fling=-3.166+xfac*2.667;
var lling=0;
do {
lling=fling+(gx-xgrd(fling,flat))/(5049-3184)*2.667;
flat=flat+(gy-ygrd(fling,flat))/(4196-1416)*2.5;
fling=lling;
} while ((gx-xgrd(fling,flat))>0.2 || (gy-ygrd(fling,flat))>0.2 || (gx-xgrd(fling,flat))<-0.2 || (gy-ygrd(fling,flat))<-0.2)
return fling;
}