使用 D3 和 angular 6 明智地绘制美国地图区域

Draw USA map region wise using D3 and angular 6

我需要在 D3 中明智地绘制美国地图区域。应该是类似这个的东西。

我参考了 this USA 地图,它显示了数据状态。而且我能够使用 D3 和 angular 6 创建这个状态明智的图表。但是

编辑: 我可以使用 andrew 提到的方法创建区域图表。 我也想创建状态轮廓,但对此一无所知。以下是我使用的方法。

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 公开了一个 merge 方法,因此 topojson 有一个关键优势:我们可以在您的示例中使用 topojson us.json 文件来绘制您的地图。

要将一组状态绘制为一个特征,我们只需要将它们合并为一个特征即可。为此,我们使用:

topojson.merge(us, us.objects.states.geometries.filter( /* some test */ )

我们在这里测试每个州,看看它是否属于手头的地区。此行将 return 包含合并的 topojson 功能的 geojson 功能。然后我们可以将其传递给 d3.geoPath.

要使用您示例中链接到的 us.json 文件,我们需要考虑如何(以及是否)在数据中识别状态。

us.json 文件没有随附对其元数据的描述,但我可以说每个州的 ID 都是数字 FIPS 代码。因此,除非我们想用数字指定区域,否则我们需要在数字和缩写(或其他一些可识别的形式)之间进行转换。我将只使用一个简单的对象从 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);
    })
});

如果您也想要州轮廓 - 除了区域之外,只需绘制州。 Here's the west coast使用上面的方法,要绘制额外的区域,只需将它们添加到区域数组中(同时还要将必要的状态代码添加到查找对象中)。