Update for WME to OS, incorporating various suggestions made above...
- Code: Select all
// ==UserScript==
// @name WME to OS link
// @namespace http://greasemonkey.chizzum.com
// @description Adds link to WME to open up OS Open Data/Musical Chairs sites at same map location
// @include https://world.waze.com/editor/*
// @version 0.3
// ==/UserScript==
// Modified from the original (c) Chris Veness 2005-2012
// www.movable-type.co.uk/scripts/gridref.js
// www.movable-type.co.uk/scripts/latlon-gridref.html
function toOSGrid(lat, lon)
{
lat = (lat * Math.PI) / 180;
lon = (lon * Math.PI) / 180;
// Airy 1830 major & minor semi-axes
var a = 6377563.396;
var b = 6356256.910;
// NatGrid scale factor on central meridian
var F0 = 0.9996012717;
// NatGrid true origin is 49N,2W
var lat0 = 0.85521;
var lon0 = -0.0349;
// northing & easting of true origin, metres
var N0 = -100000;
var E0 = 400000;
// eccentricity squared
var e2 = 1 - (b*b)/(a*a);
var n = (a-b)/(a+b);
var n2 = n*n;
var n3 = n*n*n;
var cosLat = Math.cos(lat);
var sinLat = Math.sin(lat);
// transverse radius of curvature
var nu = a*F0/Math.sqrt(1-e2*sinLat*sinLat);
// meridional radius of curvature
var rho = a*F0*(1-e2)/Math.pow(1-e2*sinLat*sinLat, 1.5);
var eta2 = nu/rho-1;
var Ma = (1 + n + (5/4)*n2 + (5/4)*n3) * (lat-lat0);
var Mb = (3*n + 3*n*n + (21/8)*n3) * Math.sin(lat-lat0) * Math.cos(lat+lat0);
var Mc = ((15/8)*n2 + (15/8)*n3) * Math.sin(2*(lat-lat0)) * Math.cos(2*(lat+lat0));
var Md = (35/24)*n3 * Math.sin(3*(lat-lat0)) * Math.cos(3*(lat+lat0));
// meridional arc
var M = b * F0 * (Ma - Mb + Mc - Md);
var cos3lat = cosLat*cosLat*cosLat;
var cos5lat = cos3lat*cosLat*cosLat;
var tan2lat = Math.tan(lat)*Math.tan(lat);
var tan4lat = tan2lat*tan2lat;
var I = M + N0;
var II = (nu/2)*sinLat*cosLat;
var III = (nu/24)*sinLat*cos3lat*(5-tan2lat+9*eta2);
var IIIA = (nu/720)*sinLat*cos5lat*(61-58*tan2lat+tan4lat);
var IV = nu*cosLat;
var V = (nu/6)*cos3lat*(nu/rho-tan2lat);
var VI = (nu/120) * cos5lat * (5 - 18*tan2lat + tan4lat + 14*eta2 - 58*tan2lat*eta2);
var dLon = lon-lon0;
var dLon2 = dLon*dLon;
var dLon3 = dLon2*dLon;
var dLon4 = dLon3*dLon;
var dLon5 = dLon4*dLon;
var dLon6 = dLon5*dLon;
var N = Math.round(I + II*dLon2 + III*dLon4 + IIIA*dLon6);
var E = Math.round(E0 + IV*dLon + V*dLon3 + VI*dLon5);
return '?e='+E+'&n='+N;
}
function processPermalink()
{
// extract current lat/lon & zoom level from the permalink URL
var plsrc = document.getElementById("permalink-container").innerHTML;
var zoompos = plsrc.indexOf("?zoom=");
var latpos = plsrc.indexOf("&lat=");
var lonpos = plsrc.indexOf("&lon=");
var layerpos = plsrc.indexOf("&layers=");
// does the URL contain all three parameters?
if((zoompos != -1)&&(latpos != -1)&&(lonpos != -1)&&(layerpos != -1))
{
// yes, so extract them...
var zoom = parseInt(plsrc.substr(zoompos+6,latpos-(zoompos+6)));
var lat = plsrc.substr(latpos+9,lonpos-(latpos+9));
var lon = plsrc.substr(lonpos+9,layerpos-(lonpos+9));
// compare the freshly extracted parameters against the persistent copies, and update the
// links to OSMC & OSOD only if there's a change required - the newly-inserted <a> element
// can't be clicked on until the insertion process is complete, and if we were to re-insert
// it every 250ms then it'd spend a lot of its time giving the appearance of being clickable
// but without actually doing anything...
if((zoom != sessionStorage.zoom)||(lat != sessionStorage.lat)||(lon != sessionStorage.lon))
{
// update the persistent vars with the new position
sessionStorage.zoom = zoom;
sessionStorage.lat = lat;
sessionStorage.lon = lon;
// translate the zoom level between WME and Musical Chairs - this gives a pretty close match
var mczoom = zoom + 12;
if(mczoom > 18) mczoom = 18;
// generate the Musical Chairs URL
var osmc_url = 'http://ris.dev.openstreetmap.org/oslmusicalchairs/map?zoom='+mczoom+'&lat='+lat+'&lon='+lon+'&layers=B0TT&view_mode=pseudorandom';
// translate the zoom level between WME and OpenData - the match here isn't quite so good...
var odzoom = zoom + 5;
if(odzoom < 6) odzoom = 6;
if(odzoom > 10) odzoom = 10;
// generate the OpenData URL - requires the support of os_opendata_fullheight.user.js
var osod_url = 'http://www.ordnancesurvey.co.uk/oswebsite/opendata/viewer/'+toOSGrid(lat,lon)+'&z='+odzoom;
// translate the zoom level between WME and live map. The only correlation is (WME)=[Live] (0 or 1)=[7], (2 or 3)=[8], (4 or more)=[9]
var livemap_zoom = Math.floor(zoom/2)+7;
if (livemap_zoom > 9 ) livemap_zoom = 9;
var livemap_url = 'https://world.waze.com/livemap/?zoom='+livemap_zoom+'&lat='+lat+'&lon='+lon+'&layers=BTTTT';
// Modify existing livemap link to reference current position in WME
document.getElementById("livemap").href = livemap_url;
document.getElementById("livemap").target = '_blank';
// "borrow" the Bing attribution div to insert the new clicky-links, remembering to maintain the attribution after we're done messing with it!
var pl_colour = document.defaultView.getComputedStyle(document.getElementById("map-footer"),"").getPropertyValue("color");
document.getElementById("bing-attribution").innerHTML = ' <a href="'+osod_url+'" target=_osopendata style="color:' + pl_colour +'">OS OpenData</a> | <a href="'+osmc_url+'" target=_osmusicalchairs style="color:' + pl_colour +'">OS Musical Chairs</a> | Imagery by Bing';
// uncomment these lines if you want the OpenData and/or MusicalChairs tabs to auto-follow the WME location...
// window.open(osod_url,'_osopendata');
// window.open(osmc_url,'_osmusicalchairs');
}
}
}
// initialise persistent vars
sessionStorage.zoom = 0;
sessionStorage.lat = '';
sessionStorage.lon = '';
// check for new map co-ords every 250ms
setInterval(processPermalink,250);
Changes:
* Top navbar link back to the livemap uses WME location (Dave2084)
* OSMC/OSOD links copy style from permalink (Dave2084)
* OpenData and MusicalChairs links reuse any existing tabs/windows (Timbones)
Not enabled by default, uncomment the last two lines in the processPermalink() function:
* OpenData and MusicalChairs tabs/windows automatically track WME position (xteejx)
I didn't enable this last change by default since I'm not entirely sure I like it - if the extents of the OSOD map viewport exactly matched that of the WME viewport for all zoom levels, it might work well, but there are often times when the mismatch between the two viewports means that I only need to drag the WME map a little to expose a road which is still visible on the OSOD map (don't really use OSMC so I'm not sure if that is any better in this respect), and I wouldn't then want OSOD to reload. Comments are welcomed from anyone who does try it out!