D3.js 使用D3和角度6绘制美国地图区域

D3.js 使用D3和角度6绘制美国地图区域,d3.js,charts,angular6,geojson,topojson,D3.js,Charts,Angular6,Geojson,Topojson,我需要在D3中按地区绘制美国地图。应该是类似的。 我从地图上获取参考,地图显示数据状态。我可以用D3和6来创建这个状态图。但是 如何为区域数据获取geojson或topojson 我也没有发现任何使用D3的图表 哪一个对geoJson或topojson有用。(根据我的理解和 这将是一个很好的选择。) 我没有办法得出结论 编辑:我能够使用前面提到的方法创建区域图表我也想创建州大纲,但对此一无所知。下面是我使用的方法 const svg = d3 .select('#statesvg')

我需要在D3中按地区绘制美国地图。应该是类似的。

我从地图上获取参考,地图显示数据状态。我可以用D3和6来创建这个状态图。但是

  • 如何为区域数据获取geojson或topojson

  • 我也没有发现任何使用D3的图表

  • 哪一个对geoJson或topojson有用。(根据我的理解和 这将是一个很好的选择。)

  • 我没有办法得出结论


编辑:我能够使用前面提到的方法创建区域图表我也想创建州大纲,但对此一无所知。下面是我使用的方法

const svg = d3
  .select('#statesvg')
  .attr('viewBox', '0 0 960 600')
  .attr('width', this.width)
  .attr('height', this.height);
this.getUSData().subscribe(us => {
  svg
    .selectAll(undefined)
    .data(this.uRegionPaths)
    .enter()
    .append('path')
    .attr('d', datum => {
      const feature = topojson.merge(
        us,
        us.objects.states.geometries.filter(state => {
          return datum.contains.indexOf(this.lookup[state.id]) > -1;
        })
      );

      return path(feature);
    })
    .attr('fill', d => {
      return this.sampleRegionData[d.name].color;
    })
    .attr('stroke', 'white')
    .attr('stroke-width', 3);
});
它看起来有点像这个。到目前为止,没有几个州失踪。(这不是问题,)


Topojson在传递到d3.geoPath时转换为geojson-您可以使用其中一种。然而,由于topojson API公开了一个方法,topojson有一个关键的优势:我们可以在示例中使用topojson
us.json
文件来绘制地图

要将状态集合绘制为一个特性,我们只需要将它们合并为一个特性。为此,我们使用:

topojson.merge(us, us.objects.states.geometries.filter( /* some test */ )
我们测试每个州,看它是否属于当前地区。此行将返回包含合并的topojson功能的geojson功能。然后我们可以将其传递到
d3.geoPath

使用示例中链接到的<代码> U.JSON/COD>文件,我们需要考虑数据中的状态如何(以及是否)。< /P>

us.json
文件没有附带对其元数据的描述,但我可以说每个状态的id都是一个数字代码。因此,除非我们想以数字形式指定区域,否则我们需要在数字和缩写(或其他可识别的形式)之间进行转换。我将使用一个简单的对象从FIPS编号中获取缩写:

var lookup = {
    "53" : "WA",
    "41" : "OR",
    "6" : "CA",
    // ...
}
现在我们可以指定区域,比如:

var regions = [
  {"name": "northwest", "contains":[ "WA","OR","CA" ] }
  // ...
];
现在我们可以绘制我们的区域:

var lookup = {
    "53" : "WA",
    "41" : "OR",
    "6" : "CA",
    // ...
}

var regions = [
  {"name": "northwest", "contains":[ "WA","OR","CA" ] }
  // ...
];

d3.json("us.json").then(function(us) {
  svg.selectAll(null)
    .data(regions)
    .enter()
    .append("path")
    .attr("d", function(region) {
      var feature = topojson.merge(us, us.objects.states.geometries.filter(function(state) { 
         return region.contains.indexOf(lookup[state.id]) > -1; 
       }))
       return path(feature);
    })
});

如果你也想要状态轮廓-只需在区域之外绘制状态。使用上述方法,要绘制其他区域,只需将它们添加到区域数组中(同时向查找对象添加必要的状态代码)。

我可以使用您提到的方法创建区域图表。我也想创建州轮廓,但对此没有任何想法,我在问题中也添加了我的方法。我如何在区域内显示文本,我能够显示文本,但所有区域文本仅位于一个位置。对于第一个注释,您可以绘制区域(仅填充)、州或州网格(笔划一),然后再次绘制区域,仅使用笔划。这应该安排好一切。可以使用路径质心定位文本(请参见d3 geo docs),但应该在某个地方找到答案,试试这个