This is a d3 map using topojson files derived from shapefiles from the datameet/maps repo.
Many thanks to authors of these awesome code samples.
This is a d3 map using topojson files derived from shapefiles from the datameet/maps repo.
Many thanks to authors of these awesome code samples.
<!DOCTYPE html> | |
<html> | |
<head> | |
<meta http-equiv="content-type" content="text/html; charset=UTF-8"> | |
<script src="http://d3js.org/d3.v3.min.js"></script> | |
<script src="http://d3js.org/topojson.v1.js"></script> | |
<script src="http://d3js.org/queue.v1.min.js"></script> | |
<script src='http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js'></script> | |
<style type="text/css"> | |
body { | |
font-family: Arial, sans-serif; | |
} | |
.pc { | |
fill: #bdbdbd; | |
stroke: #fff; | |
stroke-width: 0.5px; | |
} | |
.state { | |
fill: none; | |
stroke: #636363; | |
stroke-width: 1px; | |
stroke-linejoin: round; | |
} | |
#container { | |
margin:2%; | |
padding:20px; | |
border:2px solid #d0d0d0; | |
border-radius: 5px; | |
} | |
div.tooltip { | |
position: absolute; | |
text-align: center; | |
padding: 0.5em; | |
font-size: 10px; | |
color: #222; | |
background: #FFF; | |
border-radius: 2px; | |
pointer-events: none; | |
box-shadow: 0px 0px 2px 0px #a6a6a6; | |
text-shadow:#f5f5f5 0 1px 0; | |
} | |
.legend .legend-title { | |
text-align: left; | |
margin-bottom: 5px; | |
font-weight: bold; | |
font-size: 90%; | |
} | |
.legend .legend-scale ul { | |
margin: 0; | |
margin-bottom: 5px; | |
padding: 0; | |
float: left; | |
list-style: none; | |
} | |
.legend .legend-scale ul li { | |
font-size: 80%; | |
list-style: none; | |
margin-left: 0; | |
line-height: 18px; | |
margin-bottom: 2px; | |
} | |
.legend ul.legend-labels li span { | |
display: block; | |
float: left; | |
height: 20px; | |
width: 20px; | |
margin-right: 5px; | |
margin-left: 0; | |
} | |
.legend .legend-source { | |
font-size: 70%; | |
color: #999; | |
clear: both; | |
} | |
</style> | |
</head> | |
<body onload="sizeChange()"> | |
<div id="container"> | |
<h1>Parliamentary Constituencies, 2014</h1> | |
<div class='legend'> | |
<div class='legend-title'>Reservation Status</div> | |
<div class='legend-scale'> | |
</div> | |
<div class='legend-source'>Source: <a href="http://projects.datameet.org/maps/">Data{Meet}</a></div> | |
</div> | |
</div> | |
<script type="text/javascript"> | |
d3.select(window).on("resize", sizeChange); | |
//Set d3 scale | |
var color_domain = ['GEN','SC','ST']; | |
var legend_labels = ['GEN','SC','ST']; | |
var color = d3.scale.threshold() | |
.domain(color_domain) | |
.range(["", "#b2df8a", "#1f78b4","#a6cee3"]); | |
//Set tooltip | |
var div = d3.select("body").append("div") | |
.attr("class", "tooltip") | |
.style("opacity", 0); | |
//Set d3 projection, path and svg | |
var projection = d3.geo.mercator() | |
.center([78, 27]) | |
.scale(1200); | |
var path = d3.geo.path() | |
.projection(projection); | |
var svg = d3.select("#container") | |
.append("svg") | |
.attr("width", "100%") | |
.attr("height","100%") | |
.append("g"); | |
//Wait for data files to download before drawing | |
queue() | |
.defer(d3.json, "india_pc_2014_simplified.topojson") | |
.defer(d3.json, "india_state_2014_simplified.topojson") | |
.defer(d3.csv, "results.csv") //sample data | |
.await(ready); | |
function ready(error, pc, state, data) { | |
//Set up for visualizing sample data | |
var pairResultWithId = {}; | |
var pairNameWithId = {}; | |
data.forEach(function(d) { | |
pairResultWithId[d.ST_CODE + d.PC_CODE] = d.Res; | |
pairNameWithId[d.ST_CODE + d.PC_CODE] = d.PC_NAME; | |
}); | |
//Drawing pc boundaries | |
var pc_geojson = topojson.feature(pc, pc.objects.india_pc_2014); | |
svg.selectAll(".pc") | |
.data(pc_geojson.features) | |
.enter().append("path") | |
.attr("class", "pc") | |
.attr("d", path) | |
.style ( "fill" , function (d) { | |
var result = pairResultWithId[d.properties.ST_CODE + d.properties.PC_CODE]; | |
if (result!='') {return color(result);} | |
}) | |
.style("opacity", 0.8) | |
.on("mouseover", function(d) { | |
d3.select(this).transition().duration(300).style("opacity", 1); | |
div.transition().duration(300) | |
.style("opacity", 1) | |
div.text(pairNameWithId[d.properties.ST_CODE + d.properties.PC_CODE] + " : " + pairResultWithId[d.properties.ST_CODE + d.properties.PC_CODE]) | |
.style("left", (d3.event.pageX) + "px") | |
.style("top", (d3.event.pageY -30) + "px"); | |
}) | |
.on("mouseout", function() { | |
d3.select(this) | |
.transition().duration(300) | |
.style("opacity", 0.8); | |
div.transition().duration(300) | |
.style("opacity", 0); | |
}) | |
; | |
//Drawing state boundaries | |
var state_geojson = topojson.feature(state, state.objects.india_state_2014); | |
svg.selectAll(".state") | |
.data(state_geojson.features) | |
.enter().append("path") | |
.attr("class", "state") | |
.attr("d", path); | |
} | |
//Set up for drawing html legend elements | |
var legend = d3.select('.legend-scale') | |
.append('ul') | |
.attr('class', 'legend-labels'); | |
var keys = legend.selectAll('li') | |
.data(color_domain); | |
keys.enter().append('li') | |
.text(function(d, i){ return legend_labels[i];}) | |
.append('span') | |
.style('background', function(d) { return color(d); }) | |
; | |
//Function called when window is resized | |
function sizeChange() { | |
d3.select("g").attr("transform", "scale(" + $("#container").width()/1000 + ")"); | |
$("svg").height($("#container").width()*0.75); | |
} | |
</script> | |
</body> | |
</html> |
Hi @mukhtyar, would you also mind improving the world map in https://github.com/markmarkoh/datamaps/ with "legal" India boundaries? I think the world topojson file is https://github.com/markmarkoh/datamaps/blob/master/src/js/data/world.topo.json. Any help will be appreciated.