D3.js - 如何添加具有默认滚轮鼠标缩放行为的缩放按钮

2024-03-28

因此,我使用默认的 d3.behavior.zoom() 获得了带有鼠标缩放的世界地图,并进行了限制以防止地图被完全拖出页面。开始工作时很痛苦,但现在可以了。

我现在的问题是,这个项目还需要界面中无用的缩放 + 和 - 按钮,并且我找不到具有两种缩放类型的示例。它要么只是鼠标缩放,要么是仅通过按钮进行蹩脚缩放。

我尝试简单地调用 Zoom.scale(newScale);但它不更新任何东西。我似乎走在正确的轨道上,因为在控制台中您可以看到比例已更新,但它没有更新,当我用鼠标缩放时,它突然跳到使用按钮定义的比例。但似乎我还需要更新翻译,我不确定如何接近地图的中心并计算缩放到那里所需的翻译。

我还需要知道如何在调用 Zoom.scale(newScale); 后更新投影如果这是这样做的方法的话。

我制作了一个带有缩放按钮的简化演示,显然现在不起作用。http://bl.ocks.org/jfmmm/f5c62bc056e557b80447 http://bl.ocks.org/jfmmm/f5c62bc056e557b80447

Thanks!

编辑: 现在如此接近,它缩放到地图的中心,因为我使用与计算屏幕中间相同的计算,但使用了新的比例。问题是我希望它放大屏幕中间的对象,而不总是地图中间的国家/地区。

function zoomBtn(action) {
    var currentZoom = zoom.scale();

    if( action == 'in' ){
        if(currentZoom < options.maxZoomLevel){
            var newScale = Math.floor(currentZoom) + 1;

            var b = path.bounds(mapFeatures);
            var t = [(width - newScale * (b[1][0] + b[0][0])) / 2, (height - newScale * (b[1][1] + b[0][1])) / 2];

            zoom.scale(newScale)
                .translate(t)
                .event(svg);
        }
    }else{
        if(currentZoom > options.minZoomLevel){
            var newScale = Math.floor(currentZoom) - 1;

            var b = path.bounds(mapFeatures);
            var t = [(width - newScale * (b[1][0] + b[0][0])) / 2, (height - newScale * (b[1][1] + b[0][1])) / 2];

            zoom.scale(newScale)
                .translate(t)
                .event(svg);
        }
    }
}

我将在一分钟内更新我的示例。


放大到屏幕中心而不是左上角或 0 纬度/0 经度的数学计算是相当棘手的。我正在复制它威尔·林森的例子 http://bl.ocks.org/linssen/7352810并将其移植到迈克博斯托克的地图平移和缩放 I http://bl.ocks.org/mbostock/8fadc5ac9c2a9e7c5ba2。重要的是,该示例使用 SVG 变换来重新渲染地图,而不是不断重新计算投影。您可能希望按钮通过以下几种方式工作:

  • 变焦按钮 I http://bl.ocks.org/mgold/c2cc7242c8f800c736c4- 按下按钮会转换到新视图。按住按钮不会重新启动转换。

  • 变焦按钮 II http://bl.ocks.org/mgold/bbc451a7b9f902954e7c- 按住按钮会导致新视图立即更新,每 40 毫秒更新一次。这会导致令人不快的跳跃,尤其是在重复单击按钮时。

  • 变焦按钮 III http://bl.ocks.org/mgold/f61420a6f02adb618a70- 持续 100 毫秒的链式转换,直到不再按住按钮或满足scaleExtent。控制逻辑可防止任何不需要的即时平移。这是要使用的。

同样,获得正确的细节是很棘手的,这就是我提供完整示例的原因。但令人欣慰的是,核心逻辑确实有意义。您将向量归零,拉伸它,然后将其取消归零:

x = (x - center[0]) * factor + center[0];
y = (y - center[1]) * factor + center[1];
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

D3.js - 如何添加具有默认滚轮鼠标缩放行为的缩放按钮 的相关文章

  • Javascript 函数查找数字的倍数

    创建一个名为的函数multiplesOf 它将接受两个参数 第一个参数是数字数组 第二个参数是数字 该函数应返回一个新数组 该数组由参数数组中的每个数字组成 该数字是参数数字的倍数 So multiplesOf 5 6 7 8 9 10 3
  • 在 contenteditable div 中选择范围

    我有一个contenteditablediv 和其中的一些段落 这是我的代码 div style border solid 1px black width 300px height 300px div Hello world div div
  • 为什么我的淘汰单选按钮在另一个具有点击绑定的元素内时会失败?

    我有一个单选按钮列表 我想要点击 li 他们还检查单选按钮 这一切都有效 直到我放了一个name单选元素上的属性 然后我的代码停止工作 我的代码如下所示 ul li li ul li
  • Chrome 中的性能问题

    我目前正在从事一个相对较大的项目 使用 AngularJs 构建 应用程序的一部分是一个表单 您可以向其中添加任意数量的页面 不幸的是 添加了很多不必要的垃圾 即表示表单模型的对象可能会变得非常大 在某些时候 Chrome 基本上无法处理它
  • 如何格式化 Highcharts 的 (x,y) 对数据的日期时间

    我的序列化方法会产生如下所示的日期时间字符串 2014 07 09T12 30 41Z 为什么下面的代码不起作用 function container highcharts xAxis type datetime series data x
  • 使用 dc.js 按条形值对条形图中的条形进行排序(排序)

    如何通过维度的计算值而不是维度本身的名称对 dc js 示例中的 x 轴 维度 进行排序 例如 请考虑序数条形图的 dc js 示例 https github com dc js dc js blob master web examples
  • 在打字稿中导入 json

    我是 typescript 的新手 在我的项目中 我们使用 typescript2 在我的要求之一中 我需要导入 json 文件 所以我创建了 d ts 文件如下 test d ts declare module json const va
  • 隐藏 Div 的父级

    我只是想隐藏父divcomments section div class content content green div div div 我试过这个 document getElementById comments section pa
  • Draggable JS Bootstrap 模式 - 性能问题

    对于工作中的项目 我们在 JavaScript 中使用 Bootstrap Modal 窗口 我们想让一些窗口可移动 但我们遇到了 JQuery 的性能问题 myModal draggable handle modal header Exa
  • 防止 iOS 键盘在 cordova 3.5 中滚动页面

    我正在使用 Cordova 3 5 和 jQuery mobile 构建 iOS 应用程序 我在大部分应用程序中禁用了滚动功能 但是 当我选择输入字段时 iOS 键盘会打开并向上滚动页面 我不想要这个功能 由于输入足够高 键盘不会覆盖它 我
  • 设置 cookie 时中断 JavaScript 执行

    当设置 cookie 时 是否可以始终中断浏览器开发人员工具中的 javascript 执行 无需显式设置 JS 断点 document cookie 在 html head 块的开头添加此代码片段效果很好
  • 如何制作没有 ng-repeat 的模板并使用 Angular-drag-and-drop-lists 将数据传递到 $scope?

    我想用角度拖放列表 https github com marceljuenemann angular drag and drop lists使用我自己的网格模板到所见即所得编辑器 如何构建我自己的 HTML 模板而不需要ng repeat因
  • 在 HTML5 画布中,如何用我选择的背景遮盖图像?

    我试图用画布来实现这一点 globalCompositeOperation 但没有运气 所以我在这里问 这里有类似的问题 但我没有在其中找到我的案例 我的画布区域中有图层 从下到上的绘制顺序 画布底座填充纯白色 fff 用fillRect
  • 检查 jQuery 1.7 中是否存在基于文本的选择选项

    所以我有以下 HTML 片段
  • 将 UMD Javascript 模块导入浏览器

    你好 我正在对 RxJS 进行一些研究 我可以通过在浏览器中引用它来使用该库 如下所示 它使用全局对象命名空间变量 Rx 导入 我可以制作可观察的东西并做所有有趣的事情 当我将 src 更改为指向最新的 UMD 文件时 一切都会崩溃 如下所
  • Three.js 各种大小的粒子

    我是 Three js 的新手 正在尝试找出添加 1000 个粒子的最佳方法 每个粒子都有不同的大小和颜色 每个粒子的纹理是通过绘制画布创建的 通过使用粒子系统 所有粒子都具有相同的颜色和大小 为每个粒子创建一个粒子系统是非常低效的 有没有
  • 如何隐藏/禁用 Highcharts.js 中的图例框?

    我想问是否可以使用 HighCharts js 库隐藏图表中的所有图例框 var chart object chart renderTo render to type graph type colors graph colors title
  • 如何用另一个响应替换窗口的 URL 哈希?

    我正在尝试使用替换方法更改哈希 URL document location hash 但它不起作用 function var anchor document location hash this returns me a string va
  • Javascript Replace() 和 $1 问题

    我正在尝试创建一个脚本来搜索文本中的模式并在它找到的字符串周围包裹一个标签 shop attributes td each function this html function i html return html replace E 0
  • 如何使用asm.js进行测试和开发?

    最近我读到asm js规范 看起来很酷 但是是否有任何环境 工具来开发和测试这个工具 这还只是处于规范阶段吗 您可以尝试使用 emscripten 和 ASM JS 1 并从侧分支在 firefox 构建中运行它 有关 asm js 的链接

随机推荐