D3 从 geojson 中绘制单个元素
D3 draw single element from geojson
我对 JS 和 D3js 都很陌生。我正在尝试在地图上创建一个通过我的数据转换(大小增加然后减小)的圆圈。但是,从这个例子开始,4 个元素被添加到 svg 中。并且它们每个的大小同时变化。但是,我想创建一个圆而不是使用计数字段的转换。 Link 到我当前的区块:
https://bl.ocks.org/shannondussoye/e8feaa2cf22f7e6a7d12582b923d999f
谢谢
如果你这样做 console.log(data.features.length)
,你将得到结果 4
。这意味着 data.features
有 4 个数组,当然,您的输入选择将有 4 个圆圈。
由于这些数组似乎具有相同的地理位置(它们都指向市政厅并具有相同的坐标,即"151.2062183,-33.8732664"
),所以只使用其中一个。比如第一个数组:
var circle = svg.append("circle")
.datum(data.features[0]);
这将只为第一个元素附加一个圆圈。
这是您更新后的 bl.ocks:https://bl.ocks.org/anonymous/7e930937a6d8c0a24c6ca3a033a7cf84/f176a662d4ccd4d33b56101a17e93e6a7e0ef724
您的代码:
var circle = svg.selectAll("circle")
.data(data.features)
.enter()
.append("circle");
将为数组中的每个项目添加一个圆圈 data.features
(假设没有圆圈已经存在)。由于数组中有四个项目,因此您将有四个圆圈。如果只想追加一个圆,将输入数据数组更改为一个特征数组:
.data([data.features[0]]).enter().append()...
然后,当您想要转换到新功能时,您可以在初始追加之后更新该数据:
.data([data.features[i]])
.attr("attr to be updated",...)
以下示例在非地理环境中应用此方法:
1.附加一个功能,
2. 使用数组中下一项的属性更新特征,
3. 重复:
var svg = d3.select("body")
.append("svg")
.attr("width",400)
.attr("height",400);
var data = [{x:100,y:100,r:10},{x:200,y:100,r:30},{x:200,y:200,r:10},{y:200,x:100,r:25}];
var circle = svg.selectAll("circle")
.data([data[0]])
.enter()
.append("circle")
.attr("cx",function(d) { return d.x; })
.attr("cy",function(d) { return d.y; })
.attr("r",function(d) { return d.r; });
var i = 0;
transition();
function transition() {
circle.data([data[++i%4]]) // get the next item in the data array, assign that datum to the feature
.transition()
.attr("cx",function(d) { return d.x; }) // update the properties of the feature
.attr("cy",function(d) { return d.y; })
.attr("r", function(d) { return d.r; })
.each("end",transition) // loop
.duration(2000)
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script>
这是您的 map 使用该方法的方法(代码更改很少 - 尽管很遗憾我更改了 json 文件名)
我对 JS 和 D3js 都很陌生。我正在尝试在地图上创建一个通过我的数据转换(大小增加然后减小)的圆圈。但是,从这个例子开始,4 个元素被添加到 svg 中。并且它们每个的大小同时变化。但是,我想创建一个圆而不是使用计数字段的转换。 Link 到我当前的区块: https://bl.ocks.org/shannondussoye/e8feaa2cf22f7e6a7d12582b923d999f
谢谢
如果你这样做 console.log(data.features.length)
,你将得到结果 4
。这意味着 data.features
有 4 个数组,当然,您的输入选择将有 4 个圆圈。
由于这些数组似乎具有相同的地理位置(它们都指向市政厅并具有相同的坐标,即"151.2062183,-33.8732664"
),所以只使用其中一个。比如第一个数组:
var circle = svg.append("circle")
.datum(data.features[0]);
这将只为第一个元素附加一个圆圈。
这是您更新后的 bl.ocks:https://bl.ocks.org/anonymous/7e930937a6d8c0a24c6ca3a033a7cf84/f176a662d4ccd4d33b56101a17e93e6a7e0ef724
您的代码:
var circle = svg.selectAll("circle")
.data(data.features)
.enter()
.append("circle");
将为数组中的每个项目添加一个圆圈 data.features
(假设没有圆圈已经存在)。由于数组中有四个项目,因此您将有四个圆圈。如果只想追加一个圆,将输入数据数组更改为一个特征数组:
.data([data.features[0]]).enter().append()...
然后,当您想要转换到新功能时,您可以在初始追加之后更新该数据:
.data([data.features[i]])
.attr("attr to be updated",...)
以下示例在非地理环境中应用此方法: 1.附加一个功能, 2. 使用数组中下一项的属性更新特征, 3. 重复:
var svg = d3.select("body")
.append("svg")
.attr("width",400)
.attr("height",400);
var data = [{x:100,y:100,r:10},{x:200,y:100,r:30},{x:200,y:200,r:10},{y:200,x:100,r:25}];
var circle = svg.selectAll("circle")
.data([data[0]])
.enter()
.append("circle")
.attr("cx",function(d) { return d.x; })
.attr("cy",function(d) { return d.y; })
.attr("r",function(d) { return d.r; });
var i = 0;
transition();
function transition() {
circle.data([data[++i%4]]) // get the next item in the data array, assign that datum to the feature
.transition()
.attr("cx",function(d) { return d.x; }) // update the properties of the feature
.attr("cy",function(d) { return d.y; })
.attr("r", function(d) { return d.r; })
.each("end",transition) // loop
.duration(2000)
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script>
这是您的 map 使用该方法的方法(代码更改很少 - 尽管很遗憾我更改了 json 文件名)