Javascript 使用坐标为d3.js的json文件创建多行

Javascript 使用坐标为d3.js的json文件创建多行,javascript,svg,d3.js,line,Javascript,Svg,D3.js,Line,我正在尝试绘制多条线,这些线将使用位于此处的json文件中的坐标创建地图 我能够创建svg,但无法显示行。下面是到目前为止我用来创建svg并尝试画线的代码。这是我第一次使用d3和JSON文件,因此任何解释都非常感谢 <!DOCTYPE html> <html lang="en"> <head> <meta charset = "UTF-8"> <script s

我正在尝试绘制多条线,这些线将使用位于此处的json文件中的坐标创建地图

我能够创建svg,但无法显示行。下面是到目前为止我用来创建svg并尝试画线的代码。这是我第一次使用d3和JSON文件,因此任何解释都非常感谢

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset = "UTF-8">
        <script src="https://d3js.org/d3.v3.min.js"></script>
        <title></title>
    </head>
    <body>
        <script type = "text/javascript">
            var streets;    // declare global variable
            var w = 960;     // width of svg
            var h = 800;      // height of svg
            var svg = d3.select( "body" )
                    .append( "svg" )
                    .attr( "width", w )
                    .attr( "height", h )
                    .style('background-color', 'black');

            d3.json("/data/streets.json", function(json){
                streets = json; //copy data from json to streets
                console.log(json); // output json to console

                var link = svg.selectAll(".link")
                                .data([streets])
                                .enter().append("line")
                                .attr("class", "link")
                                .style('stroke','green')
                                .style("stroke-width", 5);
                                
                                link.attr("x1", function(d) { console.log(d); return d.x1; })
                                    .attr("y1", function(d) { return d.y1; })
                                    .attr("x2", function(d) { return d.x2; })
                                    .attr("y2", function(d) { return d.y2; });
    
            });
            }
        </script>
    </body>
</html>

var街道;//声明全局变量
var w=960;//svg的宽度
var h=800;//svg的高度
var svg=d3.选择(“主体”)
.append(“svg”)
.attr(“宽度”,w)
.attr(“高度”,h)
.style(“背景色”、“黑色”);
d3.json(“/data/streets.json”),函数(json){
streets=json;//将数据从json复制到streets
log(json);//将json输出到控制台
var link=svg.selectAll(“.link”)
.数据([街道])
.enter().append(“行”)
.attr(“类”、“链接”)
.style('stroke','green')
.样式(“笔划宽度”,5);
link.attr(“x1”,函数(d){console.log(d);返回d.x1;})
.attr(“y1”,函数(d){返回d.y1;})
.attr(“x2”,函数(d){返回d.x2;})
.attr(“y2”,函数(d){返回d.y2;});
});
}

D3在进入/更新/退出周期中使用数据绑定。数据数组中的一项旨在对应于DOM中的一个元素(为了简单起见,这里忽略父/子关系)

您的数据数组如下所示
[streets]
-这是一个包含一个项目的数组(另一个数组,
streets
)。因为enter循环旨在为数据数组中没有相应元素的每个项目(在您的情况下,是与选择器
.link
匹配的元素)在DOM中创建一个元素。这只能在DOM中创建一个元素-数据数组中只有一项:
streets

不要在数组中嵌套
streets
,只需直接将其传递给.data():对于其中的每个项目,您都希望画一条线。现在我们将让数据数组中的一个项与DOM中的一个元素相对应-如预期的那样

每个元素(数组本身)的数据将是数据数组中的一项,例如:

[
    {
        "x": 16.7380009,
        "y": 18.6959991
    },
    {
        "x": 17.6599998,
        "y": 18.7119999
    }
]
这是您使用
.attr(“…”,函数(d){…})

它没有x1、x2、y1或y2属性,因此不能使用:

function(d) { return d.x1; }
但是,您可以使用:

function(d) { return d[0].x; }
下面是一个稍加修改的示例中的数据子集(升级到d3v5-v3和4/5/6之间存在重大差异;但是,此特定代码段将与v3一样工作

var;//声明全局变量
var w=160;//svg的宽度
var h=160;//svg的高度
var svg=d3.选择(“主体”)
.append(“svg”)
.attr(“宽度”,w)
.attr(“高度”,h)
.style('背景色','黑色')
街道=[
[
{
“x”:126.7380009,//修改
“y”:128.6959991//修改
},
{
“x”:17.6599998,
“y”:18.7119999
}
],
[
{
“x”:14.4619999,
“y”:18.6550007
},
{
“x”:16.7380009,
“y”:18.6959991
}
],
[
{
“x”:12.7938805,
“y”:18.6161308
},
{
“x”:14.4619999,
“y”:18.6550007
}
]
]
var link=svg.selectAll(“.link”)
.数据(街道)
.enter().append(“行”)
.attr(“类”、“链接”)
.style('stroke','green')
.样式(“笔划宽度”,5)
.attr(“x1”,函数(d){返回d[0].x;})
.attr(“y1”,函数(d){返回d[0].y;})
.attr(“x2”,函数(d){返回d[1].x;})
.attr(“y2”,函数(d){返回d[1].y;});
svg{
边框:1px纯黑;
}

啊,这是有道理的。我没有意识到它是在那样的单独数组中,这导致我需要引用它的索引。它现在确实映射到我的svg上了!我感谢您的帮助。