- Code: Select all
// ==UserScript==
// @name OS OpenData FullHeight
// @namespace http://greasemonkey.chizzum.com
// @description Increases height of map window on OS OpenData site
// @include http://www.ordnancesurvey.co.uk/oswebsite/opendata/viewer/*
// ==/UserScript==
function resizemap(event)
{
// resizes map viewport whenever browser window changes size
var elmModify = document.getElementById("map");
elmModify.style.height = (window.innerHeight-10)+'px';
elmModify.style.width = (window.innerWidth-10)+'px';
}
function recentreMap(eastings, northings, zoom)
{
// call the OS provided functions required to point the map at a
// given grid ref and zoom level
mymapCenter = new unsafeWindow.OpenSpace.MapPoint(eastings, northings);
// not sure why, but passing zoom directly into setCenter prevents the
// mouse scrollwheel from zooming in/out of the recentred map... as a
// workaround for now, test the value of zoom and use hardcoded calls
//unsafeWindow.osMap.setCenter(mymapCenter, zoom);
if(zoom==0)unsafeWindow.osMap.setCenter(mymapCenter, 0);
if(zoom==1)unsafeWindow.osMap.setCenter(mymapCenter, 1);
if(zoom==2)unsafeWindow.osMap.setCenter(mymapCenter, 2);
if(zoom==3)unsafeWindow.osMap.setCenter(mymapCenter, 3);
if(zoom==4)unsafeWindow.osMap.setCenter(mymapCenter, 4);
if(zoom==5)unsafeWindow.osMap.setCenter(mymapCenter, 5);
if(zoom==6)unsafeWindow.osMap.setCenter(mymapCenter, 6);
if(zoom==7)unsafeWindow.osMap.setCenter(mymapCenter, 7);
if(zoom==8)unsafeWindow.osMap.setCenter(mymapCenter, 8);
if(zoom==9)unsafeWindow.osMap.setCenter(mymapCenter, 9);
if(zoom==10)unsafeWindow.osMap.setCenter(mymapCenter, 10);
}
// remove the OS logos from the top...
var elmDeleted = document.getElementById("logos");
elmDeleted.parentNode.removeChild(elmDeleted);
// ...and the huge "about help keep in touch" bit from the bottom
var elmDeleted = document.getElementById("sitefooter");
elmDeleted.parentNode.removeChild(elmDeleted);
// reduce the width of the whitespace around the map viewport
var elmModify = document.getElementById("wrapper");
elmModify.style.padding = '4px';
// move the "boundary layers" menu selector into the map viewport
var elmModify = document.getElementById("mapmast");
elmModify.style.height = '0px';
elmModify.style.top = '64px';
elmModify.style.right = '64px';
elmModify.style.zIndex = '2';
// adjust the "boundary layers" border and background colour so it shows up nicely
var elmModify = document.getElementById("mapoptions");
var childModify = elmModify.getElementsByTagName("LI");
childModify[0].style.borderStyle = 'solid';
childModify[0].style.backgroundColor = '#FFFFFF';
childModify[0].style.borderWidth = '1px';
// extract the starting coords/zoom from the url...
var userloc = document.location.href;
alert(userloc);
upos = userloc.indexOf("?e=");
if(upos != -1)
{
eastings = userloc.substr(upos+3,6);
upos = userloc.indexOf("&n=");
if(upos != -1)
{
northings = userloc.substr(upos+3,6);
upos = userloc.indexOf("&z=");
if(upos != -1)
{
zoom = userloc.substr(upos+3,2);
//...then recentre the map 1s after the page has loaded - we need to wait a
// bit to allow the OS scripts to generate the map in the first place and
// centre it at the default location before going in and messing with it
// change the 1000 at the end of the following line if you need to alter the delay length,
// the delay is defined in milliseconds hence 1000 here = 1s as mentioned above
setTimeout(function(){recentreMap(eastings,northings,zoom)},1000);
}
}
}
// re-render the map now we're done removing/adjusting all the original elements...
resizemap();
// and finally add in a hook to the onResize event, to call resizemap() each time the
// browser window changes size
window.addEventListener('resize', resizemap, true);
This update should allow the map to start off centred at any given coordinates and zoom level, passed in via URL parameters. Unfortunately I haven't yet got my head round how to guarantee the recentering code waits for the default map position to be set up first, so for now I'm just bodging it with a 1s delay after the page finishes loading, and if your PC/network connection is slower than mine you may need to change this (see comments in the code above)... Also, it only works in Firefox at the moment, so still some work to be done.
With that said, for those people who are able to get this version of the script working OK, here's how you actually use it...
To pass in the map centrepoint and zoom level you want to start off at, add the eastings, northings and zoom level to the end of the OpenData URL as follows:
Take the base URL
http://www.ordnancesurvey.co.uk/oswebsite/opendata/viewer/Then add the eastings
?e=EEEEEEnorthings
&n=NNNNNNand finally the zoom level
&z=Z or
&z=ZZreplacing the EEEEEE, NNNNNN and Z/ZZ with the appropriate values. Note that the eastings and northings are both 6 digits, and the zoom level is 1 or 2 digits (the zoom levels run from 0 to 10). Minimal error checking is performed on these parameters in this version of the script, so be careful!
As an example, here's a fully modified URL which, with the aid of the above script, point the OpenData map at the part of the world I used to call home as a kid...
http://www.ordnancesurvey.co.uk/oswebsite/opendata/viewer/?e=427500&n=566000&z=9