如何使用 d3 和 geojson 路径数据缩放地图以适合我的 svg 大小

2023-12-14

我正在尝试创建一个 d3 SVG 来绘制纽约州地图并对其进行缩放,以使其适合我的 SVG 大小,我遇到的问题是,当我使用.fitSize([height, width], mapObject)它只返回一个NaN控制台中出现错误。

the 纽约州的 topoJSON 文件我在用

我可以在不缩放的情况下显示地图,但当然,它没有优化并且需要缩放

我已经尝试过这里所说的post但我还没有找到正确的解决方案

var map = d3.json('./ny.json')

Promise.all([map]).then(data => {
  var height = 800;
  var width  = 800;
  var mapData = data[0]

  // original geoJSON to that works without scaling 
  // var geoData = topojson.feature(mapData, mapData.objects["cb_2015_new_york_county_20m"]).features
  //

  var geoData = topojson.feature(mapData, {
    type:"GeometryCollection",
    geometries: mapData.objects["cb_2015_new_york_county_20m"].geometries,
  })

  var projection = d3.geoMercator()
                     .fitSize([width, height], geoData)

  var path = d3.geoPath()
               .projection(projection)

  d3.select('svg')
    .attr('height', height)
    .attr('width', width)
    .selectAll('.county')
      .data(geoData)
      .enter()
      .append('path')
        .classed('.county', true)
        .attr('d', path)

})

我很确定这是我的格式错误,但我不确定什么数据.fitSize() or .fitExtent()正在尝试比较。

现在,代码站点的方式我没有收到输出到控制台的错误,但我也没有数据附加到 SVG


问题是 fitSize 采用 geojsonobject而 selectAll.data() 需要一个array,您正在使用这两个之一geoData。这留下了两个解决方案:

解决方案一:

如果我们使用

var geoData = topojson.feature(mapData, mapData.objects["cb_2015_new_york_county_20m"]).features

var projection = d3.geoMercator()
                 .fitSize([width, height], geoData)

我们收到 NaN 错误是因为投影设置不正确,因为我们没有传递 geojson 对象,而只是传递 geojson 对象数组。我们可以通过创建一个特征集合来解决这个问题geoData并将其传递给 fitSize:

var geoData = topojson.feature(mapData, mapData.objects["cb_2015_new_york_county_20m"]).features

var projection = d3.geoMercator()
     .fitSize([width, height], {type:"FeatureCollection", features: geoData})

现在我们将 geojson 特征集合传递给 fitSize,我们都进行投影,并且因为geoData仍然是一个数组,我们可以将其不变地传递给 selectAll.data() 。

这是一个块。

解决方案2:

如果我们使用:

var geoData = topojson.feature(mapData, {
  type:"GeometryCollection",
  geometries: mapData.objects["cb_2015_new_york_county_20m"].geometries,
})

我们得到一个 geojson 对象,projection.fitSize 可以工作,但是selectAll().data(geoData)不添加任何功能,因为它不是数组 - 输入选择为空。我们可以代入selectAll().data(geoData.features)为了解决这个问题并为每个功能输入一个路径(或者我们可以使用.data([geoData])为所有路径输入一项要素)。

这是一个块。

两个块都以正确的比例绘制 - 地图超出了块边界,因为我没有改变您的 800x800 尺寸

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 d3 和 geojson 路径数据缩放地图以适合我的 svg 大小 的相关文章

随机推荐