我这里有一个基本的Map,有虚拟数据。基本上是一个气泡Map。
问题是我有多个点(例如:20)与完全相同的GPS坐标。下面的图像是我的csv与虚拟数据,颜色蓝色突出重叠的点在这个基本的例子。这是因为许多公司有相同的城市GPS坐标。
下面是我正在编写的代码:
https://jsfiddle.net/MathiasLauber/bckg8es4/45/经过多次研究,我发现d3.js增加了这个力模拟功能,避免了点碰撞。
// Avoiding bubbles overlapping
var simulationforce = d3.forceSimulation(data)
.force('x', d3.forceX().x(d => xScale(d.longitude)))
.force('y', d3.forceY().y(d => yScale(d.latitude)))
.force('collide', d3.forceCollide().radius(function(d) {
return d.radius + 10
}))
simulationforce
.nodes(cities)
.on("tick", function(d){
node
.attr("cx", function(d) { return projection.latLngToLayerPoint([d.latitude, d.longitude]).x; })
.attr("cy", function(d) {return projection.latLngToLayerPoint([d.latitude, d.longitude]).y; })
});
问题是我不能使力布局工作,我的点仍然在对方的顶部。(行:188-200在小提琴)。
如果您有任何提示、建议,或者注意到我的代码中有基本错误,请告诉我=D
一堆代码接近我想要实现的
https://d3-graph-gallery.com/graph/circularpacking_group.html
https://jsbin.com/taqewaw/edit?html,output
1条答案
按热度按时间pxyaymoc1#
存在3个问题:
1.为了将圆定位在其原始位置附近,需要在传递给
simulation.nodes()
调用的数据中指定x
和y
初始位置。1.在执行强制模拟时,需要在on tick回调中提供要模拟的选择(请参见
on('tick')
回调函数中的node
)。1.模拟需要使用之前通过模拟计算得出的
d.x
和d.y
值相关代码片段如下
第一个
完整的工作演示请访问:https://jsfiddle.net/b2Lhfuw5/