javascript - 看不见的向量?组合 d3.tile()、d3.zoom() 和 TopoJSON 向量

标签 javascript d3.js openstreetmap geo topojson

我使用栅格(d3.tile 和 map 库)和矢量(SVG 形状中的 TopoJSON)制作了有效的 D3 map 。但当我将它们组合起来时,我遇到了一个错误。

我遵循了 Mike Bostock 的光栅和矢量示例,尤其是他的 "Raster & Vector III" ,它会更改变换和描边宽度以更新矢量的显示方式。

我的 map 几乎完美运行。然而,加载后,仅显示光栅图 block ;向量是不可见的:

enter image description here

但是一旦我触发 d3.zoom 事件(通过平移或缩放),矢量就会显示:

enter image description here

我不明白这一点,因为我明确告诉浏览器,独立于缩放事件来绘制向量。这是相关片段:

  // read in the topojson
  d3.json("ausElectorates.json", function(error, mapData) {
    if (error) throw error;

    var electorates = topojson.feature(mapData, mapData.objects.tracts);

    // apply a zoom transform equivalent to projection{scale,translate,center}
    map.call(zoom)
      .call(zoom.transform, d3.zoomIdentity
        .translate(mapWidth / 2, mapHeight / 2)
        .scale(1 << 12)
        .translate(-centre[0], -centre[1]));

    // draw the electorate vectors
    vector.selectAll("path")
      .data(electorates.features)
      .enter().append("path")
        .attr("class", "electorate")
        .attr("d", path);
  });

出于某种原因,d3.json() 函数的最后一行 - .attr("d", path") - 没有可视化向量。

Click here查看 map 。 Click here访问完整代码及其使用的 TopoJSON。

我很想得到关于这个问题的建议,这让我很困惑!

(PS 对于省略 map 图 block 、D3.js 库等的版权归属表示歉意 - 我只是试图最小化此示例的代码。)

最佳答案

它正在绘制矢量 - 但是,您不能仅仅依靠使用 d3 geoProjection 缩放和平移矢量,因为当您缩放时,您会将平移和缩放应用于路径本身 - 而不是投影:

  vector.selectAll("path")
    .attr("transform", "translate(" + [change.x, change.y] + ")scale(" + change.k + ")")
    .style("stroke-width", 1 / change.k);

由于您没有设置比例和平移,因此在加载矢量时它们无法正确绘制。它们画得非常小 - 因为您的投影比例为 1/tau,翻译为 [0,0]。检查页面加载时的 svg 表明它们在那里,而且很小。

解决方案是在 map.call("zoom") 之前绘制矢量 - 这样您可以在手动缩放之前在路径上应用基本变换(中心、变换和缩放) :

// read in the topojson
d3.json("ausElectorates.json", function(error, mapData) {
if (error) throw error;

var electorates = topojson.feature(mapData, mapData.objects.tracts);

// draw the electorate vectors
vector.selectAll("path")
  .data(electorates.features)
  .enter().append("path")
    .attr("class", "electorate")
    .attr("d", path);

// apply a zoom transform equivalent to projection{scale,translate,center}
map.call(zoom)
  .call(zoom.transform, d3.zoomIdentity
    .translate(mapWidth / 2, mapHeight / 2)
    .scale(1 << 12)
    .translate(-centre[0], -centre[1]));
   });

关于javascript - 看不见的向量?组合 d3.tile()、d3.zoom() 和 TopoJSON 向量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47737488/

相关文章:

javascript - 我对这个数组做错了什么?

javascript - HTML5 详细信息-> 摘要

javascript - 将 JavaScript 日期格式设置为 yyyy-mm-dd

javascript - 轴的过渡

d3.js - 如何在 [0, 1] 以外的域中使用 d3-scale-chromatic 函数?

javascript - 如何在多次点击提交后只提交一次表单?

javascript - 根据更新数据调整矩形大小 (d3,js)

android - OSMDroid 中 map 的字体大小

sql - PostgreSQL 9.6 中窗口函数的不稳定查询行为

OpenStreetMap API - 查找和可视化碎石路