Javascript 使用坐标为d3.js的json文件创建多行
我正在尝试绘制多条线,这些线将使用位于此处的json文件中的坐标创建地图 我能够创建svg,但无法显示行。下面是到目前为止我用来创建svg并尝试画线的代码。这是我第一次使用d3和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
<!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上了!我感谢您的帮助。