使用 d3.behavior.drag() 平移地图
Using d3.behavior.drag() to pan a map
我在地图上应用 D3 的 behavior.drag() 时遇到了一些问题。在此示例中,拖动地图会导致非常快速的平移,并且单击的点不会停留在鼠标上 - http://bl.ocks.org/jczaplew/6453048
我的拖动行为代码如下所示 -
var drag = d3.behavior.drag()
.origin(function() { return {x: rotate[0], y: -rotate[1]}; })
.on("drag", function() {
rotate[0] = d3.event.x;
rotate[1] = -d3.event.y;
// Refresh the map
projection.rotate(rotate);
path = d3.geo.path().projection(projection);
d3.selectAll("path").attr("d", path);
});
我需要什么:
- 平移而不翻译整个 SVG。平移地图的功能(此问题中表达的问题 - 使用 d3 缩放和平移以太平洋为中心的墨卡托地图.js并在此示例中演示 - http://bl.ocks.org/d3noob/4966228)是不可取的。 当用户单击并拖动地图
- 时,单击的点会粘在光标上(即单击并拖动西班牙会围绕西班牙旋转地图)
怀疑这个问题与drag.origin()有关,但也许我根本不应该使用d3.behavior.drag()?非常感谢任何和所有帮助!
我想我找到了一个潜在的(尽管有点不令人满意)的答案。使用此示例中的逻辑(http://mbostock.github.io/d3/talk/20111018/azimuthal.html),我创建了这个 - http://bl.ocks.org/jczaplew/6457917
关键位是跟踪拖动开始的位置(即用户单击时)。所需旋转的经度和经度的逻辑为
开始投影旋转 + (开始屏幕位置 - 目标屏幕位置)/4
拖动行为现在看起来像这样
var drag = d3.behavior.drag()
.on("dragstart", function() {
var proj = projection.rotate();
m0 = [d3.event.sourceEvent.pageX, d3.event.sourceEvent.pageY];
o0 = [-proj[0],-proj[1]];
})
.on("drag", function() {
if (m0) {
var m1 = [d3.event.sourceEvent.pageX, d3.event.sourceEvent.pageY],
o1 = [o0[0] + (m0[0] - m1[0]) / 4, o0[1] + (m1[1] - m0[1]) / 4];
projection.rotate([-o1[0], -o1[1]]);
}
// Update the map
path = d3.geo.path().projection(projection);
d3.selectAll("path").attr("d", path);
});
这仍然感觉很黑客,而且似乎不能很好地扩展。例如,更改投影和投影比例似乎需要将所需旋转坐标的归一化从 4 调整为其他值,以实现相同的平滑度和行为。
有人有其他想法吗?我很想看到其他更优雅的方式来完成此功能。
相关文章:
- 使用D3.js和GeoJson在地图上的某些坐标上设置一个小图像
- 使用D3.js和GeoJson在地图上显示States上的一些文本
- 使用Node js和D3实时绘制地图上的国家名称
- 如何在D3.js中绘制地图投影上的点,并使用范围滑块过滤数据
- D3-多年渲染'美国地图上的州数据价值
- 如何使用d3更新/覆盖地图和图例内容
- D3缩放和平移不适用于整个地图,只适用于投影
- 使用d3.js重复世界地图投影
- 连接数据并使用D3在地图中弹出
- D3中的地图和路线
- 用d3和topojson绘制一张地图
- D3.js zoomTo指向2D地图(投影)
- 使用d3.js在地图上创建工具提示
- D3地图没有显示,尽管它在我的网络服务器上
- 使用D3.js在地图上绘制点的最佳方式
- 使用D3.js在地图上绘制节点和边的网络
- 放大世界地图上的D3弹出窗口大小
- D3,绘图到地图,可能的数据格式
- d3.js如何为国家地图中的每个州创建一个单独的元素
- 我如何传递事件变量/在地图上放置一个标记-当绑定完成事件在数据地图&D3