Skip to content

Instantly share code, notes, and snippets.

@GitNoise
Last active August 30, 2016 15:19
Show Gist options
  • Save GitNoise/7bf8c0f9dd273c42687d33715676de9d to your computer and use it in GitHub Desktop.
Save GitNoise/7bf8c0f9dd273c42687d33715676de9d to your computer and use it in GitHub Desktop.
Map 8 - map w. zoom
license: gpl-3.0
Display the source blob
Display the rendered blob
Raw
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
<!DOCTYPE html>
<meta charset="utf-8">
<head>
<style>
svg {
}
table {
width: 100%;
}
td {
vertical-align: top;
}
path {
stroke: #fff;
stroke-width: .5px;
}
path:hover {
//stroke: black;
//stroke-width: 2px
}
#main .zoom {
fill: steelblue !important;
}
.caption {
font-size: 30px;
font-family: Verdana, Geneva, sans-serif;
}
line {
stroke: black;
stroke-opacity: 0.4
}
.base {
fill: #ccc;
}
.overlay {
fill: #fa9fb5;
}
#andel {
font-weight: bold;
font-size: 1.2em;
}
.home {
stroke: steelblue;
stroke-width: 2px;
}
.description {
font-family: Arial, Helvetica, sans-serif;
}
.active {
stroke: green;
stroke-width: 1px;
}
</style>
<script src="//d3js.org/d3.v3.min.js"></script>
<script src="//d3js.org/topojson.v1.min.js"></script>
</head>
<body>
<div class='description'>
<p>
Normaliserat data för hur många som flyttar från sin hemkommun till stad vald i drop down. <br/>
Färgintensitet (röd) motsvarar hur stor andel av befolkningen i en kommun som flyttat.
</p>
<p>
Visualiseringen visar endast de kommuner där andelen som flyttat är större än <span id='andel'>XXX</span>.
</p>
</div>
<table>
<tr>
<td colspan="2">
Stad:
<select id="city">
<option value="0">Stockholm</option>
<option value="1">Göteborg</option>
<option value="2">Malmö</option>
</select>
</td>
</tr>
<tr>
<td colspan=2>
Kommun: <input id="search" type="search" style="width: 300px">
<input type="button" value="hitta" onclick="setKommun(this)" data-target="search">
</td>
</tr>
<tr>
<td>
<svg id='main' />
</td>
<td>
<pre id='detail'></pre>
</td>
</tr>
</table>
<script>
// helpers
d3.selection.prototype.moveToFront = function() {
return this.each(function(){
this.parentNode.appendChild(this);
});
};
function setKommun(d) {
d3.select(".home").classed("home", false);
var input = d3.select('#' + d.dataset.target);
var home = d3.select('#' + (input[0][0].value));
home.classed("home", true);
d3.select(home.parentNode).moveToFront();
}
var distance = function distance (firstObject, secondObject) {
return Math.sqrt(
( firstObject[0] - secondObject[0] ) *
( firstObject[0] - secondObject[0] ) + ( firstObject[1] - secondObject[1] ) *
( firstObject[1] - secondObject[1] ) );
}
// main code
var width = 400,
height = 900,
min_bound = 0.05,
cities = [["Stockholm","Stockholm"],
["Goteborg","Göteborg"],["Malmo","Malmö"]],
city = cities[0],
active = d3.select(null);;
d3.select("#andel").html(min_bound*100 + '%');
var projection = d3.geo.mercator()
.scale(1200)
.translate([width / 2, (height / 2) - 150])
.center([0, 55])
.rotate([-17, -7.4]);
var path = d3.geo.path()
.projection(projection);
var svg = d3.select("#main")
.attr("width", width)
.attr("height", height);
var features = '';
function update() {
d3.select("#main").html('');
// setup scale
var max = d3.max(features,
function(d) {
if(d.properties.KnNamn == city[0]) return 0;
return +d.properties[city[0] + "_ANDELFR_NF"];
});
// scales
var sizeScale = d3.scale.linear()
.domain([0, max])
.range([1, 20])
.clamp(true);
var colorScale = d3.scale.linear()
.domain([0, max])
.range(['#ccc', 'red']);
var groups = svg.append('g').classed('container',true).selectAll("g")
.data(features)
.enter()
.append('g')
.on("mouseover", function(d) {
d3.select(this).moveToFront();
d3.select("#detail").html(JSON.stringify(d3.select(this).datum().properties, null, 2));
});
groups
.classed("base", function(d) { return +d.properties[city[0] + "_ANDELFR_NF"] < min_bound; })
.classed("overlay", function(d) { return +d.properties[city[0] + "_ANDELFR_NF"] >= min_bound; })
.append("path")
.attr("d", path)
.style("fill", function(d) {
if(+d.properties[city[0] + "_ANDELFR_NF"] < min_bound) return colorScale.range()[0];
return colorScale(+d.properties[city[0] + "_ANDELFR_NF"]);
})
.attr("id", function(d) { return d.properties.KnNamn; })
.on("click", clicked)
}
d3.json("alla_lan(1).json", function(error, topology) {
if (error) throw error;
console.log(topology);
features = topojson.feature(topology, topology.objects.svenskarna_kommun).features;
update();
});
d3.select("#city").on("change", function() {
city = cities[d3.select(this).node().value];
update();
})
function clicked(d) {
if (active.node() === this) return reset();
active.classed("active", false);
active = d3.select(this).classed("active", true);
var bounds = path.bounds(d),
dx = bounds[1][0] - bounds[0][0],
dy = bounds[1][1] - bounds[0][1],
x = (bounds[0][0] + bounds[1][0]) / 2,
y = (bounds[0][1] + bounds[1][1]) / 2,
scale = .4 / Math.max(dx / width, dy / height),
translate = [width / 2 - scale * x, height / 2 - scale * y];
var g = svg.select('.container');
g.transition()
.duration(750)
.style("stroke-width", 1.5 / scale + "px")
.attr("transform", "translate(" + translate + ")scale(" + scale + ")");
}
function reset() {
active.classed("active", false);
active = d3.select(null);
var g = svg.select('.container');
g.transition()
.duration(750)
.style("stroke-width", "1.5px")
.attr("transform", "");
}
</script>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment