|
<!DOCTYPE html> |
|
|
|
<head> |
|
<meta charset="utf-8"> |
|
<script src="https://d3js.org/d3.v3.min.js" charset="utf-8"></script> |
|
<script src="https://d3js.org/topojson.v1.min.js"></script> |
|
<script src="http://labratrevenge.com/d3-tip/javascripts/d3.tip.v0.6.3.js"></script> |
|
<style> |
|
/* CSS goes here. */ |
|
|
|
.subunit { |
|
fill: #B4E2F2; |
|
/*fill: #000000;*/ |
|
} |
|
|
|
.subunit:hover { |
|
fill: #70E15E; |
|
} |
|
|
|
.place-label { |
|
font-size: 4pt; |
|
/*color: #FFFFFF;*/ |
|
} |
|
|
|
.place-marker { |
|
fill: brown; |
|
/*stroke: black;*/ |
|
/*stroke-width: 1.5px;*/ |
|
} |
|
|
|
.place-tip { |
|
line-height: 1; |
|
font-size: 8pt; |
|
/*font-weight: bold;*/ |
|
padding: 12px; |
|
background: rgba(0, 0, 0, 0.8); |
|
color: #fff; |
|
border-radius: 2px; |
|
} |
|
/* Creates a small triangle extender for the tooltip */ |
|
|
|
.place-tip:after { |
|
box-sizing: border-box; |
|
display: inline; |
|
font-size: 10px; |
|
width: 100%; |
|
line-height: 1; |
|
color: rgba(0, 0, 0, 0.8); |
|
content: "\25BC"; |
|
position: absolute; |
|
text-align: center; |
|
} |
|
/* Style northward tooltips differently */ |
|
|
|
.place-tip.n:after { |
|
margin: -1px 0 0 0; |
|
top: 100%; |
|
left: 0; |
|
} |
|
</style> |
|
</head> |
|
|
|
<body> |
|
<script> |
|
/* JavaScript goes here. */ |
|
var width = 960, |
|
height = 720; |
|
|
|
var svg = d3.select("body").append("svg") |
|
.attr("width", width) |
|
.attr("height", height); |
|
|
|
d3.json("kh.json", function(error, kh) { |
|
if (error) return console.error(error); |
|
|
|
// // 測試 |
|
// console.log("topojson.feature(kh, kh.objects.town).features"); |
|
// console.log(topojson.feature(kh, kh.objects.town).features); |
|
|
|
var projection = d3.geo.mercator() |
|
.center([121, 24]) |
|
.scale(30000) |
|
.translate([500, -250]); |
|
|
|
var path = d3.geo.path() |
|
.projection(projection); |
|
|
|
var circle_radius = 2; |
|
|
|
// // 畫出高雄的輪廓 |
|
// var subunits = topojson.feature(kh, kh.objects.municipality); |
|
|
|
// svg.append("path") |
|
// .datum(subunits) |
|
// .attr("d", path); |
|
|
|
// 加上 Hover 時要顯示的資訊 |
|
var tip = d3.tip() |
|
.attr('class', 'place-tip') |
|
.offset([-10, 0]) |
|
.html(function(d) { |
|
return "<span>" + d.properties.name + "</span>"; |
|
}) |
|
|
|
svg.call(tip); |
|
|
|
// 畫出高雄各區的輪廓 |
|
svg.selectAll(".subunit") |
|
.data(topojson.feature(kh, kh.objects.town).features) |
|
.enter().append("path") |
|
.attr("class", function(d) { |
|
return "subunit " + d.id; |
|
}) |
|
.attr("d", path) |
|
.on('mouseover', tip.show) |
|
.on('mouseout', tip.hide); |
|
|
|
// 加上各區的 Mark |
|
svg.selectAll(".place-marker") |
|
.data(topojson.feature(kh, kh.objects.town).features) |
|
.enter().append("circle") |
|
.attr("class", function(d) { |
|
return "place-marker " + d.properties.name; |
|
}) |
|
.attr("transform", function(d) { // 其實原本位移應該是用 cx, cy,這裡算偷懶? |
|
var centroid = path.centroid(d), |
|
x = centroid[0], |
|
y = centroid[1]; |
|
return "translate(" + x + "," + y + ")"; |
|
}) |
|
.attr("r", circle_radius); |
|
|
|
// 加上各區的文字 |
|
svg.selectAll(".place-label") |
|
.data(topojson.feature(kh, kh.objects.town).features) |
|
.enter().append("text") |
|
.attr("class", "place-label") |
|
.attr("transform", function(d) { |
|
var centroid = path.centroid(d), |
|
x = centroid[0], |
|
y = centroid[1]; |
|
return "translate(" + (x + circle_radius * 2) + "," + y + ")"; |
|
}) |
|
.attr("dy", ".35em") |
|
.text(function(d) { |
|
return d.properties.name; |
|
}); |
|
|
|
}); |
|
</script> |
|
</body> |