[英]Matching leaflet zoom level with d3 geo scale
我想做什么?
我已经使SVG元素与传单层的大小相同; 并将其作为叠加层。
我现在怎么做?
我有一些与小叶的值(Map.zoom,Map.width,Map.height,Map.center)对齐的全局变量。
Map.center = [43, -72];
Map.zoom = 3;
Map.projection = d3.geo.mercator()
.center([Map.center[1], Map.center[0]])
// I think this is the problem. I don't really understand this.
.scale(256 * Math.pow(2, Map.zoom))
.translate([Map.width / 2, Map.height / 2])
Map.lt = new L.Map...(center is Map.center, zoom is Map.zoom)
任何时候传单更改我更新全局值并重新计算Map.projection。
我有一个功能:
function transform(d) {
d = Map.projection(d.value.geometry.coordinates[0], d.value.geometry.coordinates[1]);
return "translate(" + d[0] + "," + d[1] + ")";
}
然后在我需要定位的对象和元素上调用:
object.attr("transform", transform);
我的问题是图层不同步。
当我将地图放在[43,-72]上并且我看到返回的x,y值(来自Map.projection)时,它正好位于我的SVG层的中间,所以我猜我的比例有问题。 我不确定如何使这些值正确排列。
我不想使用d3.geo.tile或d3.geo.path(),因为我需要更灵活地控制元素的定位和动画。
我只是想知道如何利用d3功能排列传单与SVG层的位置。 我不希望依靠传单来定位我的物品,因为我将来可能不会使用传单; 我只需要能够缩放/翻译我的d3.geo.mercator投影,使其与传单对齐。 我怎样才能做到这一点?
谢谢!
Map.projection = d3.geo.mercator()
.center([Map.center[1], Map.center[0]])
.scale((1 << 8 + Map.zoom) / 2 / Math.PI)
.translate([Map.width / 2, Map.height / 2])
不确定它是如何工作的,但看了一些其他的例子并弄清楚了。
这就是我最终得到的结果(不要对JS的奇怪性感到惊讶 - 它是ES6):
const convertZoomLevelToMercator = (zoomLevel) =>
Math.pow(2, 8 + zoomLevel) / 2 / Math.PI;
const convertZoomLevelFromMercator = (zoomLevelInMercator) =>
Math.log(zoomLevelInMercator * 2 * Math.PI) / Math.LN2 - 8;
测试:
console.log(convertZoomLevelToMercator(1));
console.log(convertZoomLevelToMercator(5));
console.log(convertZoomLevelToMercator(10));
console.log(convertZoomLevelToMercator(15));
console.log(convertZoomLevelToMercator(20));
console.log('----');
console.log(convertZoomLevelFromMercator(convertZoomLevelToMercator(1)));
console.log(convertZoomLevelFromMercator(convertZoomLevelToMercator(5)));
console.log(convertZoomLevelFromMercator(convertZoomLevelToMercator(10)));
console.log(convertZoomLevelFromMercator(convertZoomLevelToMercator(15)));
console.log(convertZoomLevelFromMercator(convertZoomLevelToMercator(20)));
输出:
81.48733086305042
1303.797293808806
41721.51340188181
1335088.428860218
42722829.72352698
----
1
5
10
15
20
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.