d3 - 将标记添加到路径中

时间:2015-03-19 15:34:50

标签: javascript google-maps-api-3 d3.js

我正在尝试在Google地图叠加层上进行可视化,其中我按节点表示点,按边缘表示节点之间的链接。这些节点和边缘是使用JavaScript的d3库生成的。路径是基于json文件生成的。我现在想要做的是在每条路径的末尾添加一个箭头标记,以指示路径的方向。为此,我使用了this example,并首先指示d3在defs元素中添加包含其路径的标记,并且在生成路径期间,通过使用“marker-end”指示d3包含标记“使用url属性通过id引用标记元素的值的属性。下面是每个路径中定义和引用标记的代码片段。

d3.json("./json/routes.json", function(route_data) {

  var defs = layerPaths.append("defs")

  /* here I generate the marker shape and assign it the "arrow" id */
  defs.append("marker")
    .attr({
      "id": "arrow",
      "viewBox": "0 -5 10 10",
      "refX": 5,
      "refY": 0,
      "markerWidth": 4,
      "markerHeight": 4,
      "orient": "auto"
    })
    .append("path")
    .attr("d", "M 0 -5 L 10 0 L 0 5")
    .attr("class", "arrowHead");

  /* here I start generating the paths */ 
  var path = layerPaths.selectAll("path")
    .data(route_data)
    .each(setPathProperties)
    .enter()
    .append("path")
    .each(setPathProperties); // path properties are set by the setPathProperties function

  function setPathProperties(d) {

    /* I removed the complex functions that calculate path position as these are irrelevant for the question*/

    /* select the current path element and add attributes*/
    d3.select(this)
      .attr("class", "path")
      .attr("d", svgPen)
      .attr("stroke", "blue")
      .attr("stroke-width", 10)

    /* add the marker to the path by refering with a url statment to the marker element with the arrow id */
    .attr("marker-end", "url(#arrow)");
  }

})

加载地图后,节点和路径会加载,但不显示箭头。然而,包括其引用的marker-end属性位于每个路径元素中,并且标记元素(包括其定义路径)在HTML中。我认为“marker-end”属性的值,即“url(#arrow)”不起作用,虽然我不知道为什么。

有人知道这里出了什么问题,为什么标记没有出现在地图上,以及如何解决这个问题?

2 个答案:

答案 0 :(得分:0)

好的,所以我设法自己找出问题的答案。我只是将defs元素附加在错误的位置,它应该直接附加到svg,而我将它附加到svg中的一个组中。

答案 1 :(得分:0)

简单地说,您可以先在svg元素中创建def,然后像这样创建标记

  svg.append("svg:defs").append("svg:marker")
  .attr("id", "triangle")
  .attr("refX", 13)
  .attr("refY", 5)
  .attr("markerWidth", 30)
  .attr("markerHeight", 30)
  .attr("markerUnits","userSpaceOnUse")
  .attr("orient", "auto")
  .append("path")
  .attr("d", "M 0 0 12 6 0 12 3 6")
  .style("fill", "#555");

并通过这样的marker-end和marker-start属性将此标记添加到您的路径中

 var link = svg.append('g')
  .attr('class', 'links')
  .selectAll('path')
  .data(graph.links)
  .enter().append('path')
  .attr("marker-end", "url(#triangle)")