236 lines
7.1 KiB
HTML
236 lines
7.1 KiB
HTML
<!DOCTYPE html>
|
|
<html>
|
|
<head>
|
|
<meta charset="UTF-8">
|
|
<title>Printable High-Resolution Maps!</title>
|
|
<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">
|
|
#navigation {
|
|
position: absolute;
|
|
top: 0;
|
|
right: 0;
|
|
z-index: 9999;
|
|
background-color: white;
|
|
font-family: Arial, Helvetica, sans-serif;
|
|
padding: 1em;
|
|
width: 15em;
|
|
height: 612px;
|
|
overflow-y: auto;
|
|
opacity: 0.8;
|
|
}
|
|
#printbutton {
|
|
font-size: 1.5em;
|
|
font-weight: bold;
|
|
}
|
|
#map {
|
|
padding: 1em;
|
|
border: 1px solid black;
|
|
height: 612px; /* 8.5 inch at 72 dpi */
|
|
width: 792px; /* 11 inch at 72 dpi */
|
|
}
|
|
#results {
|
|
margin: 0 0 0 1em;
|
|
padding: 0;
|
|
}
|
|
#results li span {
|
|
cursor: pointer;
|
|
color: blue;
|
|
text-decoration: underline;
|
|
}
|
|
.active_result {
|
|
background-color: #eee;
|
|
}
|
|
</style>
|
|
|
|
<script src="http://cdn.leafletjs.com/leaflet-0.6.4/leaflet.js"></script>
|
|
|
|
</head>
|
|
<body>
|
|
<div id="navigation">
|
|
<form method="get" action="#" id="search_form">
|
|
<input type="text" id="q" name="q" value="" /><input type="submit" value="Search" />
|
|
</form>
|
|
<input type="button" id="printbutton" value="Print" onclick="printMap()" />
|
|
<h2>Printable High-Resolution Maps!</h2>
|
|
<ol>
|
|
<li>Search/center/zoom this map until it covers the desired area.</li>
|
|
<li>Click the Print button above.</li>
|
|
<li>A new window will open with a high-resolution map!</li>
|
|
</ol>
|
|
<ul id="results"></ul>
|
|
</div>
|
|
|
|
<div id="map"></div>
|
|
|
|
<script type="text/javascript">
|
|
|
|
var query = "";
|
|
var map = L.map('map').setView([51.505, -0.09], 2);
|
|
L.tileLayer('http://{s}.tile.cloudmade.com/4be2d4a8b7ae4a5e8ebc0558bb5d7db4/997/256/{z}/{x}/{y}.png', {
|
|
attribution: 'Map data © <a href="http://openstreetmap.org">OpenStreetMap</a> contributors, <a href="http://creativecommons.org/licenses/by-sa/2.0/">CC-BY-SA</a>; Imagery © <a href="http://cloudmade.com">CloudMade</a>',
|
|
maxZoom: 16
|
|
}).addTo(map);
|
|
|
|
// 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];
|
|
}
|
|
|
|
// decode query param
|
|
if(params["q"] && params["q"].length > 0){
|
|
handleQuery(decodeURIComponent(params["q"]).replace(/\+/g, ' '));
|
|
}
|
|
else {
|
|
if (navigator.geolocation)
|
|
{
|
|
navigator.geolocation.getCurrentPosition(function(pos){
|
|
// Move the map over
|
|
map.setView([pos.coords.latitude,pos.coords.longitude],12);
|
|
|
|
// AJAX request for checking where we are
|
|
reverseLookup(pos.coords.latitude,pos.coords.longitude,18,function(xmlhttp) {
|
|
// Decode response as JSON
|
|
response = JSON.parse(xmlhttp.responseText);
|
|
|
|
if(response.address){
|
|
console.log(response.address);
|
|
var loc = "";
|
|
// Set search textbox to where we think we are
|
|
if(response.address.suburb){
|
|
loc += response.address.suburb+", ";
|
|
}
|
|
if(response.address.city){
|
|
loc += response.address.city+", ";
|
|
}
|
|
if(response.address.state){
|
|
loc += response.address.state+", ";
|
|
}
|
|
if(response.address.country){
|
|
loc += response.address.country+", ";
|
|
}
|
|
document.getElementById("q").value = loc;
|
|
}
|
|
else{
|
|
console.log("No reverse-lookup json");
|
|
}
|
|
});
|
|
},function(error){
|
|
console.log(error);
|
|
updateMap("Tempe, Arizona",[[33.6569,-111.6801],[33.3133,-112.3276]])
|
|
window.query = "Tempe, Arizona";
|
|
});
|
|
}
|
|
else {
|
|
updateMap("Tempe, Arizona",[[33.6569,-111.6801],[33.3133,-112.3276]])
|
|
window.query = "Tempe, Arizona";
|
|
}
|
|
}
|
|
|
|
function handleQuery(query){
|
|
window.query = query;
|
|
// AJAX request for geolocation of query
|
|
forwardLookup(query,function(xmlhttp) {
|
|
// Decode response as JSON
|
|
response = JSON.parse(xmlhttp.responseText);
|
|
|
|
if(response.length > 0){
|
|
// Display all results in sidebar
|
|
response.forEach(function(result,index){
|
|
appendToResults(index,result.display_name);
|
|
});
|
|
|
|
// Fit map to bounds of first result
|
|
showItem(0);
|
|
}
|
|
else {
|
|
appendToResults("No Results");
|
|
}
|
|
});
|
|
|
|
}
|
|
|
|
function forwardLookup(query,callback){
|
|
xmlhttp=new XMLHttpRequest();
|
|
xmlhttp.open("GET","http://nominatim.openstreetmap.org/search/"+encodeURIComponent(query)+"?format=json",true);
|
|
xmlhttp.send();
|
|
xmlhttp.onreadystatechange = function(){
|
|
if (xmlhttp.readyState==4 && xmlhttp.status==200) {
|
|
callback(xmlhttp);
|
|
}
|
|
};
|
|
}
|
|
|
|
function reverseLookup(lat,lon,zoom,callback){
|
|
xmlhttp=new XMLHttpRequest();
|
|
request = "http://nominatim.openstreetmap.org/reverse?format=json&lat="+encodeURIComponent(lat)+"&lon="+encodeURIComponent(lon)+"&zoom="+encodeURIComponent(zoom);
|
|
xmlhttp.open("GET",request,true);
|
|
xmlhttp.send();
|
|
xmlhttp.onreadystatechange = function(){
|
|
if (xmlhttp.readyState==4 && xmlhttp.status==200) {
|
|
callback(xmlhttp);
|
|
}
|
|
};
|
|
}
|
|
|
|
function appendToResults(index,name){
|
|
var item = document.createElement("li");
|
|
item.innerHTML = "<span onclick=\"showItem('"+index+"');\">"+name+'</span>';
|
|
item.id = "result_"+index;
|
|
document.getElementById("results").appendChild(item);
|
|
}
|
|
|
|
function showItem(index){
|
|
// Change this item to be the active one
|
|
var results = document.getElementsByClassName("active_result")
|
|
for(var i=0; i < results.length; i++){
|
|
console.log(i);
|
|
results[i].className = "";
|
|
}
|
|
document.getElementById("result_"+index).className = "active_result";
|
|
|
|
// Update the map
|
|
updateMap(query,[[response[index].boundingbox[0], response[index].boundingbox[2]],
|
|
[response[index].boundingbox[1], response[index].boundingbox[3]]]);
|
|
}
|
|
|
|
function updateMap(query,bounds){
|
|
// Set search textbox to query
|
|
document.getElementById("q").value = query;
|
|
|
|
// Fit map to the GPS boundaries
|
|
map.fitBounds(bounds);
|
|
}
|
|
|
|
function printMap(){
|
|
var bounds = map.getBounds();
|
|
newwindow=window.open("print.html?q="+query
|
|
+"&b0="+bounds._northEast.lat
|
|
+"&b1="+bounds._northEast.lng
|
|
+"&b2="+bounds._southWest.lat
|
|
+"&b3="+bounds._southWest.lng
|
|
,'name');
|
|
if (window.focus) {newwindow.focus()}
|
|
return false;
|
|
}
|
|
|
|
</script>
|
|
|
|
<script>
|
|
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
|
|
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
|
|
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
|
|
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
|
|
|
|
ga('create', 'UA-42790423-1', 'zyphlar.github.io');
|
|
ga('send', 'pageview');
|
|
|
|
</script>
|
|
</body>
|
|
</html> |