printmaps/print.html

137 lines
4.0 KiB
HTML
Raw Normal View History

2013-07-28 10:29:24 +00:00
<html>
<head>
<link rel="stylesheet" href="http://cdn.leafletjs.com/leaflet-0.6.4/leaflet.css" />
<!--[if lte IE 8]>
<link rel="stylesheet" href="http://cdn.leafletjs.com/leaflet-0.6.4/leaflet.ie.css" />
<![endif]-->
<style type="text/css">
body{
padding: 0;
margin: 0;
}
2013-07-29 01:13:03 +00:00
#navigation {
2013-07-28 23:34:21 +00:00
position: absolute;
top: 0;
left: 0;
z-index: 999;
background-color: white;
font-family: Arial, Helvetica, sans-serif;
padding: 1em;
border: 1px solid black;
2013-07-28 23:34:21 +00:00
}
2013-07-28 10:29:24 +00:00
#map {
height: 2550px; /* 8.5 inch at 300 dpi */
width: 3300px; /* 11 inch at 300 dpi */
}
</style>
<style type="text/css" media="print">
@page {
size: 11in 8.5in;
margin: 0mm;
}
2013-07-29 01:13:03 +00:00
#navigation {
2013-07-28 23:34:21 +00:00
display: none;
}
2013-07-28 10:29:24 +00:00
htmlff,boffdy {
height: 8.5in;
width: 11in;
}
#map {
2013-07-28 10:29:24 +00:00
margin: 0.25in;
height: 8in;
width: 10.5in;
}
</style>
<!-- <script src="http://cdn.leafletjs.com/leaflet-0.6.4/leaflet.js"></script> -->
<script src="leaflet.js"></script>
2013-07-28 10:29:24 +00:00
</head>
<body>
2013-07-29 01:13:03 +00:00
<div id="navigation">
<p>Wait for the (huge!) map to load, then click Print.<br/>
If it comes out poorly, close this window and try again.</p>
<input type="button" value="Print" id="printbutton" onclick="printMap()" />
</div>
2013-07-29 01:13:03 +00:00
<div id="title"></div>
2013-07-28 10:29:24 +00:00
<div id="map"></div>
<script type="text/javascript">
// Get url params
var prmstr = window.location.search.substr(1);
var prmarr = prmstr.split ("&");
var params = {};
for ( var i = 0; i < prmarr.length; i++) {
var tmparr = prmarr[i].split("=");
params[tmparr[0]] = tmparr[1];
}
2013-07-29 01:13:03 +00:00
var query = decodeURIComponent(params["q"]);
var map = L.map('map', {zoomControl: false}); //.setView([51.505, -0.09], 13);
L.tileLayer('http://{s}.tile.cloudmade.com/4be2d4a8b7ae4a5e8ebc0558bb5d7db4/997/256/{z}/{x}/{y}.png', {
attribution: query+' map from PrintMaps.com, data &copy; <a href="http://openstreetmap.org">OpenStreetMap</a> contributors, <a href="http://creativecommons.org/licenses/by-sa/2.0/">CC-BY-SA</a>, Imagery &copy; <a href="http://cloudmade.com">CloudMade</a>',
maxZoom: 18
}).addTo(map);
2013-07-28 10:29:24 +00:00
// decode query param
if(params["q"] && params["b0"] && params["b1"] && params["b2"] && params["b3"]){
2013-07-29 01:13:03 +00:00
updateMap(query,[[decodeURIComponent(params["b0"]), decodeURIComponent(params["b1"])],
2013-07-28 10:29:24 +00:00
[decodeURIComponent(params["b2"]), decodeURIComponent(params["b3"])]]);
}
else {
alert("No boundaries given!");
}
function updateMap(query,bounds){
2013-07-29 01:13:03 +00:00
// Generate title
document.title = query + " map";
2013-07-28 10:29:24 +00:00
// Fit map to the GPS boundaries
map.fitBounds(bounds);
};
var mapHalved = false;
2013-07-28 23:34:21 +00:00
function printMap(){
// Only halve the map if it hasn't already been halved
if(!mapHalved){
halveMap();
// Grab the map HTML, kill the dynamic map, and reinject a static map.
mapHTML = map._container.innerHTML;
map._container.innerHTML = null;
document.getElementById("map").innerHTML = mapHTML;
}
// It takes awhile to halve, so print after 2sec.
setTimeout(function(){
print();
},2000);
2013-07-28 10:29:24 +00:00
}
2013-07-28 23:34:21 +00:00
function halveMap(){
2013-07-29 01:13:03 +00:00
resizeScale = 0.281; // magic number that seems to work best in Chrome
// Halve size of map container (hopefully no redraw!)
map._container.style.width = window.getComputedStyle(map._container, null).width.split("px")[0]*resizeScale+"px";
map._container.style.height = window.getComputedStyle(map._container, null).height.split("px")[0]*resizeScale+"px";
2013-07-28 23:34:21 +00:00
// Halve size of each leaflet tile AND decrease its offsets by half
var leaflets = document.getElementsByClassName("leaflet-tile");
for(var i=0; i < leaflets.length; i++){
element = leaflets[i];
element.style.width = element.style.width.split("px")[0]*resizeScale+"px";
element.style.height = element.style.height.split("px")[0]*resizeScale+"px";
2013-07-28 23:34:21 +00:00
element.style.left = element.style.left.split("px")[0]*resizeScale+"px";
element.style.top = element.style.top.split("px")[0]*resizeScale+"px";
}
2013-07-28 23:34:21 +00:00
mapHalved = true;
2013-07-28 10:29:24 +00:00
}
</script>
</body>
</html>