3

我有一堆用州和县的人口普查 FIPS 代码编码的数据(即纽约是 FIPS 36,金斯县是 FIPS 36047)。我正在使用来自TopoJSON 文件的 d3.geo.albersUSA 投影映射该数据,该投影使用 FIPS 代码作为州和县特征的 ID。这非常适合合唱团,我只需要加入 ID。

但是,我想使用 path.centroid(feature) 和 LineString 路径类型从一个特征的质心到另一个特征绘制线。这是我的数据的简化示例:

Start_State_FIPS, End_State_FIPS, Count_of_things
2,36,3
1,36,13
5,36,5
4,36,8
6,36,13
8,36,3

我正在使用相同的数据在地图上绘制圆圈,使用 count_of_things 字段设置半径。这工作没问题。为了设置线条,我使用 FIPS 代码和特征质心创建了一个 map var,然后使用 FIPS 代码键从我的数据中提取起点。

我的代码是画线,但绝对不在质心点之间。我认为我不需要对点的投影做任何事情,因为它们来自已经为地图投影调整的特征,但也许我错了。这是我的代码:

var arclines = svg.append('g')

data_nested = d3.map(my_data)

var state_points = new Map();

var statesarc = topojson.feature(us, us.objects.states).features

statesarc.forEach(function(d) {
  state_points.set(d.id, path.centroid(d))
})

arcdata = []

data_nested.values().forEach(function(d) {
  arcline = {source: state_points.get(parseInt(d.Start_State_FIPS)), endpoint: state_points.get(parseInt(d.End_State_FIPS))}
  arcdata.push(arcline)
})

arclines.selectAll("path")
    .data(mydata)
  .enter.append("path")
    .attr('d', function(d) { return path({type: "LineString", coordinates: [d.source, d.endpoint]}) })
4

0 回答 0