【发布时间】:2015-08-30 04:36:38
【问题描述】:
问题:
我正在尝试创建美国的交互式地图,其中显示州、县和国界。县根据数据进行着色,将鼠标悬停在一个州上应该突出显示该州的所有县,并且该州应该是可点击的。我想通过在州形状内、美国形状内使用县形状的 SVG 来实现这一点。
我可以基于 CENSUS 县形状文件生成县地图,并且可以通过使用 TopoJSON 命令行准备文件并在 D3 中使用以下代码,根据外部 CSV 中的数据对州进行着色:
<!DOCTYPE html>
<meta charset="utf-8">
<style>
path {
fill: none;
stroke-linejoin: round;
stroke-linecap: round;
}
</style>
<body>
<script src="http://d3js.org/d3.v3.min.js"></script>
<script src="http://d3js.org/topojson.v1.min.js"></script>
<script>
var width = 960,
height = 600;
var path = d3.geo.path()
.projection(d3.geo.albersUsa());
var svg = d3.select("body").append("svg")
.attr("width", width)
.attr("height", height);
d3.json("counties_pa.json", function(error, us) {
if (error) return console.error(error);
var color = d3.scale.threshold()
.domain([1, 10, 50, 100, 500, 1000, 2000, 5000])
.range(["#fff7ec", "#fee8c8", "#fdd49e", "#fdbb84", "#fc8d59", "#ef6548", "#d7301f", "#b30000", "#7f0000"]);
svg.append('g').attr('class','counties').selectAll("path").data(topojson.feature(us, us.objects.cb_2014_us_county_20m).features).enter().append('path').attr('d',path).attr('style',function(d){return 'fill:'+color(d.properties.population / d.properties.area * 2.58999e6);});
});
</script>
这在视觉上大多是可以接受的(除了它没有离散的州/国界) - 但在功能上是不够的。为了在州悬停时将 CSS 应用到县,县需要在州形状内,或者以某种方式分组。
我尝试过的:
- 在命令行中使用 topojson-merge 将县合并为州形状,然后分别渲染州形状 - 这有助于拥有离散的州边界 - 但我还没有找到将县嵌套到相应的县的方法状态形状。
我现在在做什么:
以某种方式将州 TopoJSON 文件和县 TopoJSON 文件组合起来,并将县嵌套在州中,然后使用 D3 进行渲染。
不知何故,使用 d3 获取非嵌套的州和县数据,并将其嵌套在客户端级别的客户端上。
最后我想了解最有效和最快的渲染过程来实现我想要的功能。
提前感谢您的帮助。
【问题讨论】:
-
我可能在这里遗漏了一些东西,但您能否简单地获取县数据,并为初始视图将某个州(及其边界)的所有县(及其边界)涂成相同的颜色?
-
您可以使用 topojson 文件中的属性将县映射到它们所属的州。 IE。在每个县都有一个
state属性,标识了他们所属的州,这将允许您在悬停一个州时选择所有匹配的县。除了突出显示州悬停的县之外,我不太清楚您要实现的目标。如果是这样,那么我的建议应该是可行的。你从哪里采购你的县 shapefile,它是否在你可以重复使用的现有财产中拥有每个县所属的州?
标签: javascript svg d3.js geojson topojson