【发布时间】:2018-02-03 17:31:26
【问题描述】:
我正在寻找一种在 D3 v4 中从一个地方缩放到另一个地方的方法(v4 很重要)。我正在寻找的基本上就是这样:https://www.jasondavies.com/maps/zoom/我的问题是 Jason Davies 混淆了他的代码,所以我无法阅读它,而且我找不到包含该项目或任何类似内容的 bl.ock .我将提供一个链接到我在这里得到的东西:http://plnkr.co/edit/0mjyR3ovTfkDXB8FTG0j?p=preview
相关的大概在.tween()里面:
.tween("rotate", function () {
var p = d3.geoCentroid(points[i]),
r = d3.geoInterpolate(projection.rotate(), [-p[0], -p[1]]);
return function (t) {
projection.rotate(r(t));
convertedLongLats = [projection(points[0].coordinates), projection(points[1].coordinates)]
c.clearRect(0, 0, width, height);
c.fillStyle = colorGlobe, c.beginPath(), path(sphere), c.fill();
c.fillStyle = colorLand, c.beginPath(), path(land), c.fill();
for (var j = 0; j < points.length; j++) {
var textCoords = projection(points[j].coordinates);
c.fillStyle = textColors, c.textAlign = "center", c.font = "18px FontAwesome", c.fillText(points[j].icon, textCoords[0], textCoords[1]);
textCoords[0] += 15;
c.textAlign = "left", c.font = " 12px Roboto", c.fillText(points[j].location, textCoords[0], textCoords[1]);
}
c.strokeStyle = textColors, c.lineWidth = 4, c.setLineDash([10, 10]), c.beginPath(), c.moveTo(convertedLongLats[0][0], convertedLongLats[0][1]), c.lineTo(convertedLongLats[1][0], convertedLongLats[1][1]), c.stroke();
};
})
基本上,我想要我现在拥有的东西,但我想要它放大,几乎就像我在上面提供的动画世界缩放示例中一样。我并不是真的在寻找代码,我宁愿有人用一个例子或其他东西指出我正确的方向(值得注意的是,我对 d3 还很陌生,而且这个项目很大程度上基于 mbostock 的 World Tour,所以它使用画布)。提前谢谢大家!
【问题讨论】:
-
你想放大一个正交投影,试试this question & answer,它实现了你例子中的效果,或者这个block(点击放大)。
-
@AndrewReid 该示例使用边界框,我的代码的问题是我需要放大点,所以解决方案可能是找到一种方法在点周围制作人工边界框,但那是仅凭我有限的 d3 知识。
-
边界框仅用于获取比例,如果您使用点,您可以手动将其设置为某个固定数字,但旋转的质心只是一个点。如果您只使用点,所有位置的比例应该相同,您是否希望从初始状态(全球?)和/或过渡期间(点之间缩小)有任何比例变化?
-
@AndrewReid 我似乎已经解决了边界框和缩放的问题,我现在唯一的问题是我想在
tween()中间缩小到整个地球然后再缩小在tween()的末尾再次指出这一点。我用我更新的代码创建了一个新的 plunk:plnkr.co/edit/y4vn3L8QV0fwyCBBmgIM?p=preview 当前的问题是,当它达到我希望它切换的级别时,它会跳到 2000 的规模,但我觉得我要去这完全是错误的。
标签: javascript d3.js zooming