var width = document.getElementById('map')
.clientWidth;
var height = document.getElementById('map')
.clientHeight;
var map = L.map('map', {
center: [51.4659249585, -3.16769715331],
zoom: 14
});
L.tileLayer('https://cartodb-basemaps-{s}.global.ssl.fastly.net/light_all/{z}/{x}/{y}.png', {
maxZoom: 18,
attribution: '© OpenStreetMap contributors, © CARTO'
})
.addTo(map);
var draw = function() {
d3.select('#overlay')
.remove();
var bounds = map.getBounds();
var topLeft = map.latLngToLayerPoint(bounds.getNorthWest());
var bottomRight = map.latLngToLayerPoint(bounds.getSouthEast());
var existing = d3.set();
var drawLimit = bounds.pad(0.4);
var filteredPoints = points.filter(function(d) {
var latlng = new L.LatLng(d.lat, d.lon);
if (!drawLimit.contains(latlng)) {
return false;
}
var point = map.latLngToLayerPoint(latlng);
key = point.toString();
if (existing.has(key)) {
return false;
}
existing.add(key);
d.x = point.x;
d.y = point.y;
return true;
});
var svg = d3.select(map.getPanes()
.overlayPane)
.append("svg")
.attr('id', 'overlay')
.attr("class", "leaflet-zoom-hide")
.style("width", map.getSize()
.x + 'px')
.style("height", map.getSize()
.y + 'px')
.style("margin-left", topLeft.x + "px")
.style("margin-top", topLeft.y + "px");
var g = svg.append("g")
.attr("transform", "translate(" + (-topLeft.x) + "," + (-topLeft.y) + ")");
var svgPoints = g.attr("class", "points")
.selectAll("g")
.data(filteredPoints)
.enter()
.append("g")
.attr("class", "point");
svgPoints.append("circle")
.attr("class", function(d) {
return "point-cell c" + d.count;
})
.attr("transform", function(d) {
return "translate(" + d.x + "," + d.y + ")";
})
.attr("r", function(d) {
return d.count;
});
}
d3.csv('postcode_data.csv', function(d) {
return {
postcode: d.postcode,
lat: +d.lat,
lon: +d.lon,
count: +d.count
};
}, function(error, rows) {
points = rows;
draw();
map.on('viewreset moveend', draw);
});