d3.js - 使用来自 openstreetmap geojson 的 d3js 绘制 map

标签 d3.js geojson



我正在尝试使用 geojson 中的 d3.v3.js 绘制 svg。我从 openstreetmap(我的测试数据: http://pastebin.com/4GQne42i )中获取 geojson 并尝试将其呈现为 svg。

我的JS代码:

var path, vis, xy, jdata;

    xy = d3.geo.mercator().translate([0, 0]).scale(200);

    path = d3.geo.path().projection(xy);

    vis = d3.select("body").append("svg").attr("width", 960).attr("height", 600);

    //22.json is the name of the file which contains the geojson data
    d3.json("22.json", function(error, json) { 
      jdata = json;
      if(error!=null)
    console.log(error);
      return vis.append("svg:g")
          .selectAll("path")
          .data(json.coordinates)
          .enter().append("path")
          .attr("d", path);
    });

不知何故,我的 svg 结果是这样的:
<svg width="960" height="600">
 <g>
  <path></path>
 </g>
</svg>

我知道投影不好,但我认为 svg 应该有节点。

我的代码有什么问题?你会发布一个正确的解决方案吗?

最佳答案

第一个问题是您的 data join :

vis.append("g")
  .selectAll("path")
    .data(json.coordinates)
  .enter().append("path")
    .attr("d", path);

这意味着您希望 json.coordinates 中的每个元素都有一个路径元素。大批。由于您的测试数据是一个多边形,这意味着外环的一个路径元素,然后可能是任何内部孔的多个其他路径元素,如果您的数据有它们。我希望您只需要整个多边形的单个路径元素。

第二个问题是您没有将有效的 GeoJSON 传递给 d3.geo.path实例。因为你的数据联接中的数据是 json.coordinates ,您只是将坐标数组直接传递给 path , 当您需要传递 GeoJSON 几何对象或要素时。 (请参阅 GeoJSON specification。)

幸运的是,通过消除数据连接和渲染完整多边形,这两个问题都可以轻松解决。要仅添加一个路径元素,只需调用 selection.append :
vis.append("path")
    .datum(json)
    .attr("d", path);

您的投影可能也需要调整(平移和缩放)。您可能会找到 project to bounding box example在这里很有用。

关于d3.js - 使用来自 openstreetmap geojson 的 d3js 绘制 map ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16514333/

相关文章:

javascript - D3 map 无法区分点击和选择文本

javascript - D3.js 动画更新

javascript - 本地图缩放时,圆圈在移动设备上消失

javascript - 将 GeoJSON 对象转换为 Javascript 数组

javascript - Mapbox 使用 loadURL 处理多个 GEOJSON 文件

javascript - 无效的 geoJson 对象 - Leaflet 和 Ajax

javascript - 如何更新D3js动态图表 slider 上的句柄位置?

javascript - D3 svg 路径重叠

reactjs - 在 Leaflet 中拖动后获取更新的坐标

python - 将 GeoJSON 叠加层加载到 Folium 会引发 ValueError : Cannot render objects with any missing geometries