|
// See https://gist.github.com/stuartbannerman/8173488/ for instructions |
|
var RangeFinder = (function(map) |
|
{ |
|
// The default range |
|
var range = 800; |
|
// Range to image mappings |
|
var RANGES = { |
|
500 : 'http://i.imgur.com/yaJb2OM.png', |
|
800 : 'http://i.imgur.com/QJyYkH9.png', |
|
1000 : 'http://i.imgur.com/WhXVOeq.png' |
|
}; |
|
|
|
var imageURL = function() |
|
{ |
|
return RANGES[range]; |
|
}; |
|
|
|
var imageSize = function(scale) |
|
{ |
|
// (180px x 100m) + 8px padding |
|
return ((range / 100 * 180) + 8) * (scale || 1); |
|
}; |
|
|
|
var setRange = function(num) |
|
{ |
|
if(!RANGES[num]) |
|
{ |
|
throw "Invalid range: " + num + " use RangeFinder.ranges to see valid ranges"; |
|
} |
|
|
|
range = Number(num); |
|
|
|
IMAGE.iconUrl(imageURL()); |
|
// Update all the markers |
|
self.refresh(); |
|
|
|
return range; |
|
}; |
|
|
|
// Returns the scale of the current zoom level of the map |
|
var scale = function() |
|
{ |
|
var diff = map.getMaxZoom() - map.getZoom(); |
|
|
|
return 1 / (!diff ? 1 : (diff == 1 ? 2 : diff * diff)); |
|
}; |
|
|
|
var size = imageSize(scale()); |
|
|
|
var IMAGE = L.icon({ |
|
'iconUrl': imageURL(), |
|
'iconSize': [size, size], |
|
'iconAnchor': [size / 2, size / 2] |
|
}); |
|
|
|
// Add some accessors to the image to allow changing of options |
|
['iconSize', 'iconUrl', 'iconAnchor'].forEach(function(property, index) |
|
{ |
|
this[property] = function(value) |
|
{ |
|
return this.options[property] = (value === undefined ? this.options[property] : value); |
|
}; |
|
}, IMAGE); |
|
|
|
// Custom accessor for setting the image scale |
|
IMAGE.scale = function(scale) |
|
{ |
|
var size = imageSize(scale); |
|
|
|
IMAGE.iconSize([size, size]); |
|
IMAGE.iconAnchor([size / 2, size / 2]); |
|
}; |
|
|
|
var tracking = function(action, id, latlng) |
|
{ |
|
ga('send', 'event', 'Marker', action, JSON.stringify({ 'id' : id, 'utc' : +new Date(), 'lat' : latlng.lat, 'lng' : latlng.lng })); |
|
}; |
|
|
|
var markers = []; |
|
|
|
map.on('click', function(e) |
|
{ |
|
// Add a map marker where the user clicked |
|
var marker = L.marker(e.latlng, { 'icon' : IMAGE, 'draggable' : true }).addTo(map); |
|
|
|
var id = (Math.random() * 10000000) | 0; |
|
|
|
tracking('Add', id, e.latlng); |
|
|
|
// Remove the marker if the user clicks it |
|
marker.on('click', function(e) |
|
{ |
|
map.removeLayer(e.target); |
|
markers.splice(markers.indexOf(this), 1); |
|
|
|
tracking('Remove', id, {}); |
|
}); |
|
|
|
marker.on('dragend', function(e) |
|
{ |
|
tracking('Update', id, e.target._latlng); |
|
}); |
|
|
|
markers.push(marker); |
|
}); |
|
|
|
map.on('load zoomend', function(e) |
|
{ |
|
self.refresh(); |
|
}); |
|
|
|
var self; |
|
|
|
return self = { |
|
'refresh' : function() |
|
{ |
|
IMAGE.scale(scale()); |
|
// Update all the markers |
|
for(var i = 0, len = markers.length; i < len; i++) |
|
{ |
|
markers[i].setIcon(IMAGE); |
|
} |
|
}, |
|
'ranges' : Object.keys(RANGES), |
|
'range' : function(num) |
|
{ |
|
return num ? setRange(num) : range; |
|
}, |
|
|
|
} |
|
|
|
})(dzMap.map); |
|
|
|
// Google Analytics |
|
(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-46869405-1', 'github.com'); |
|
ga('send', 'pageview'); |
|
|