- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 d3 tile
和 d3 zoom
创建一个瓦片 map 。我已将 zoom.extent
和 zoom.translateExtent
设置为 [[0,0], [width,height]]
。但是当我缩放时, map 会跳到左上角。
这是示例代码
const tile = d3.tile()
.extent([[0, 0], [width, height]])
.tileSize(512);
const zoom = d3.zoom()
.translateExtent([[0, 0], [width, height]]) // issue in this line
.extent([[0, 0], [width, height]])
.scaleExtent([1 << 10, 1 << 15])
.on("zoom", () => zoomed(d3.event.transform));
// applied zoom like this
svg
.call(zoom)
.call(zoom.transform, d3.zoomIdentity
.translate(width / 2, height / 2)
.scale(-initialScale)
.translate(...projection(initialCenter))
.scale(-1));
function zoomed(transform) {
projection
.scale(transform.k / (2 * Math.PI))
.translate([transform.x, transform.y]);
}
最佳答案
这里的主要挑战是了解您要限制的内容。投影的原始比例为 1/(2π):世界被一个像素一个像素地投影到一个空间(每个像素 2π 或每个像素 360 度)。这可以更轻松地与 d3-zoom 集成,但肯定不直观。
D3 zoom 用于修改投影,其比例值为 1<<n
。 .这表示应用缩放后世界的宽度。如果基础投影对世界使用 1 像素的宽度,则缩放会将其拉伸(stretch)到 1<<n
。像素。 1<<10 例如 1024。
现在,棘手的部分是缩放比例为 1 时应用缩放平移范围。因此,我们需要将平移范围应用于世界,就好像它显示在 1x1 像素框内一样,即使给定较低的比例范围值为 1024 (1<<10),我们实际上从未将世界显示为占据一个像素。
因此,我们的平移范围应该在由两个 Angular 包围的框内:[-1,-1] 和 [1,1]。这有助于解释 Cornel 的评论。但是我们可以通过编程来做到这一点吗?是的。
这就是让我对这个库感到疯狂的原因:缩放范围不是在地理坐标或屏幕坐标等简单的东西中注册的,而是相对于 1x1 像素世界的缩放单位,引入了一个新的坐标系跟踪哪些可以在幕后跟踪。这当然不直观,部分驱使我放弃这个模块(解释我评论中的链接,d3-slippy 仍然是非常实验性的,但应该展示可以做什么 - 顺便说一句,链接中的约束方法只有在你把所有东西都转换成它)。
因此,让我们以编程方式获取屏幕的缩放平移范围,如图所示。
首先,在我们调用缩放并应用初始变换后,投影会更新以反射(reflect)新的缩放级别和平移,因此我们可以使用 projection.invert() 来获取左上角和底部的地理坐标屏幕右侧。
其次,我们可以(重新)为我们的单像素世界创建一个投影,并通过它插入左上角和右下角的地理坐标,以获得它们在单像素世界中的投影坐标。
第三,我们获取 1 像素世界内的左上角和右下角投影坐标,并将它们传递给 zoom.translateExtent:
// Call zoom, same as before:
svg
.call(zoom)
.call(zoom.transform, d3.zoomIdentity
.translate(width / 2, height / 2)
.scale(-initialScale)
.translate(...projection(initialCenter))
.scale(-1));
// Now we can work on setting the zoom translate extent:
// Zooomed projected limits of screen in lat long:
var top = projection.invert([0,0])[1];
var left = projection.invert([0,0])[0];
var bottom = projection.invert([width,height])[1];
var right = projection.invert([width,height])[0];
// original projection:
var baseProjection = d3.geoMercator()
.translate([0,0])
.scale(1/Math.PI/2);
// Projected limits of screen in projected unzoomed coordinates:
var topLeft = baseProjection([left,top])
var bottomRight = baseProjection([right,bottom])
// Set the zoom translate extent:
zoom.translateExtent([topLeft,bottomRight])
关于javascript - D3 Zoom 的 translateExtent 未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57626362/
我在学习如何缩放方面经历了一段痛苦的时光。为了学习,我一直在尝试制作树状图缩放。我正在使用这个 jsfiddle 示例( http://jsfiddle.net/6kEpp/1/ )并尝试将其应用于没
使用 orbitcontrols.js(带有 THREE.js),我想在代码中实现与旋转鼠标滚轮相同的效果。例如,我想调用 camera.zoomIn() 之类的东西,让它向目标移动一段设定的距离。有
我已经创建了 map ,如 this link 所示并且运行良好。 但问题是,它只能以一种方式放大(只会变大)。我怎样才能让它以任何一种方式工作? 可能就像我们在 google map 上(加号 -
我正在寻找与 autocad ... 或 solidworks 类似的体验 基本上是内容大小(保持宽高比)Xsize * Ysize 并放大特定区域 并且我已经将 ruby/rails 作为我选择
在bootstrap的重置部分有一个 .clearfix { *zoom: 1; } 请问这里*zoom 和 zoom 有什么区别? 我很感激任何回答。 最佳答案 这是一个 css hack,这意味着
我在单独的子图中有 3 轴加速度计时间序列数据(t,x,y,z)的图,我想一起缩放。也就是说,当我在一个图上使用“缩放到矩形”工具时,当我释放鼠标时,所有 3 个图都会一起缩放。 以前,我只是使用不同
有没有一种简单的方法可以在页面刚加载时默认自动查看 Mapbox map 的所有标记...?这是我的 map :http://www.geometry.be/urbanmaestro/v7/非常感谢您
我已经使用 UIWebView 在 html 文件中设置了以下视口(viewport)标签。 现在,当用户选择时,我得到如图所示的效果。我想禁用此效果但仍然可以放大。 尝试将 UIWebView 的
我现在使用 Core-plot 进行 iPhone 图表开发。但它有一些我无法达到的要求。 我现在使用CorePlot 0.4,示例代码AAPLot来开发 请看下面的图片,然后你就会知道我的问题是什么
最新版本的 Google 地球附带了一项名为“缩放时自动倾斜”的功能。如果启用,Google Earth 会在您拉近表面时自动将相机倾斜到地平线。可以从 GUI 中禁用此功能(首选项 -> 导航选项卡
我找到了使用 rel="smallImage:image1.jpg" 等链接更改缩放图像的方法,但我是在运行时创建图像并将其添加到页面,所以页面首次加载时链接不会存在(这似乎需要存在)。当我在运行时生
我正在使用 ImageView 支持缩放。现在我正在扩展 ImageView 以便我可以在 canvas 上绘图。目前我有 setImageResource 设置一个 drawable 和在 onDr
在缩放行为上手动设置比例后,如何触发缩放事件? var zoom = d3.behavior.zoom() .scaleExtent([0.5, 4]) .on('zoom', onz
我有这个简单的测试代码: ul{ float:left; margin:0; list-style:none; paddi
我正在尝试实现一个具有以下外观的移动网站: 一个固定的标题 可滚动、可缩放的内容 首次加载页面时内容缩小 我一直在试验 IScroll 4,结果似乎不错,但有一个问题我找不到解决办法。我页面的内容是用
嗨,我是 iOS 初学者,在我的项目中,我以编程方式添加了一个 Collection View ,并且已成功添加。 我的要求是,当我单击 UICollectionViewCell 时,它将像下面的第二
遵循此处的建议:How to disable double click zoom for d3.behavior.zoom? 我在页面加载时禁用了双击缩放行为: https://bl.ocks.org
当用户使用鼠标滚轮滚入和滚出时,您可以调整缩放速度吗? 我的理解是 zoom.on (https://github.com/mbostock/d3/wiki/Zoom-Behavior#wiki-on
关于 css 样式和在浏览器中放大和缩小,我遇到了既有趣又奇怪的问题。 我创建了一个 Material ui 卡片,点击它时背景颜色会随着动画而改变。 动画效果很好,但如果您放大或缩小页面,浏览器会在
我将 JQTouch 用于 iPhone 应用程序。 JQtouch 默认情况下禁用捏合和缩放页面的可能性。对于一页(包含大图像),我需要启用捏合和缩放功能。这很容易: var viewport =
我是一名优秀的程序员,十分优秀!