Mapping of Toronto Neighbourhoods with TopoJSON and D3.js
- View on Bl.ocks.org
- TopoJSON, GeoJSON and Shp files of Toronto neighbourhoods can be found in my repo jasonicarter
Mapping of Toronto Neighbourhoods with TopoJSON and D3.js
<!DOCTYPE html> | |
<body> | |
<script src="http://d3js.org/d3.v3.min.js"></script> | |
<script src="http://d3js.org/topojson.v1.min.js"></script> | |
<style type="text/css"> | |
.wrapper { | |
margin-left: auto; | |
margin-right: auto; | |
width: 800px; | |
} | |
.map_mesh { | |
fill: none; | |
stroke: #fff; | |
stroke-width: .5px; | |
stroke-linejoin: round; | |
} | |
.map_outline { | |
fill: #ddd; | |
stroke: #000; | |
stroke-width: 1.5px; | |
} | |
.map_neighbourhood { | |
fill: #1f77b4; | |
} | |
.map_neighbourhood:hover { | |
fill: #636363; | |
cursor: pointer; | |
} | |
</style> | |
<!-- center svg in div --> | |
<div class="wrapper"></div> | |
<script> | |
// With help from - http://bl.ocks.org/michellechandra/0b2ce4923dc9b5809922 | |
var mapWidth = 550, | |
mapHeight = 550; | |
var c10 = d3.scale.category10(); | |
var projection = d3.geo.albers(); | |
var path = d3.geo.path() | |
.projection(projection); | |
var svg = d3.select(".wrapper").append("svg") | |
.attr("width", mapWidth) | |
.attr("height", mapHeight); | |
var mapLabel = svg.append("text") | |
.attr("y", 20) | |
.attr("x", 0) | |
.attr("class", "map_neighbourhood_name") | |
// load TopoJSON file | |
d3.json("toronto_topo.json", function(error, toronto) { | |
if (error) throw error; | |
var neighbourhoods = topojson.feature(toronto, toronto.objects.toronto); | |
// set default projection values | |
projection | |
.scale(1) | |
.translate([0, 0]); | |
// creates bounding box and helps with projection and scaling | |
var b = path.bounds(neighbourhoods), | |
s = .95 / Math.max((b[1][0] - b[0][0]) / mapWidth, (b[1][1] - b[0][1]) / mapHeight), | |
t = [(mapWidth - s * (b[1][0] + b[0][0])) / 2, (mapHeight - s * (b[1][1] + b[0][1])) / 2]; | |
// set project with bounding box data | |
projection | |
.scale(s) | |
.translate(t); | |
// get individual neighbourhoods | |
svg.selectAll("path") | |
.data(neighbourhoods.features) | |
.enter().append("path") | |
.attr("class", "map_neighbourhood") | |
.attr("d", path) | |
.on("mouseover", mouseover) | |
.on("mouseout", mouseout) | |
.on("click", clicked) | |
// add the mesh/path between neighbourhoods | |
svg.append("path") | |
.datum(topojson.mesh(toronto, toronto.objects.toronto, function(a, b) { return a !== b; })) | |
.attr("class", "map_mesh") | |
.attr("d", path); | |
}); | |
function mouseover(d) { | |
mapLabel.text(d.properties.name.slice(0,-5)) // remove suffix id from name | |
} | |
function mouseout(d) { | |
mapLabel.text("") // remove out name | |
} | |
function clicked(d) { | |
console.log(d.properties.id, d.properties.name) // verify everything looks good | |
// Add code here | |
} | |
</script> | |
</body> | |
</html> |