【发布时间】:2013-05-26 00:25:42
【问题描述】:
我收到了一些关于如何将我的地图转换为给定经度和纬度值的问题的帮助,这里:How can I use SVG translate to center a d3.js projection to given latitude and longitude values? 我写了一个方法,可以在给定比例下平移到给定位置:
zoomTo: function(point, scale) {
var lat = -SFMap.projection(point)[0] * scale;
var lon = -SFMap.projection(point)[1] * scale;
var x = (SFMap.config.width / 2) + lat;
var y = (SFMap.config.height / 2) + lon;
SFMap.g
.transition()
.duration(500)
.attr("transform", "translate("+ x +","+ y +") scale("+ scale +")");
}
我可以很好地“缩放”欧洲,但是当我搬到印度尼西亚的雅加达时,中心点明显位于海洋上方。
伦敦 - SFMap.zoomTo([0.1062, 51.5171], 1300)
雅加达 - SFMap.zoomTo([106.7500, 6.1333], 1300);
而且,如果我尝试澳大利亚,就会强调这个问题 - 我什至看不到它。
我应该注意我正在使用 d3 来渲染墨卡托投影并从 Google 搜索中检索经度和纬度值。
请有人建议为什么会发生这种情况?我知道幕后有很多数学问题,但我希望 d3 能解决这个问题。
编辑:
阅读 Pablo 的评论后,我决定从等式中删除我的 zoomTo() 方法,并简单地测试 d3 是否可以在 Jarkata 上以固定的 scale(1000) 正确地 center([106.7500, 6.1333]),但它没有;它仍然会把你扔进大海。
【问题讨论】:
-
您是否将组返回到转换之间的投影比例?应用投影时,您使用投影的比例作为起点,而不是图形的当前比例。错误是否一致?如果从 A、B 再到 C,与从 B、A 再到 C 的错误相同?
-
@PabloNavarro,你有一个有趣的观点。我没有将比例调整传递回
SFMap.projection(),因为我认为如果我在我的变换方法zoomTo()中计算对平移的影响比例,我不需要——如上所示。当我下班回家时,我将探索将scale传递给投影,然后再使用它的值。我会做出相应的回应。 :) 非常感谢。
标签: svg maps d3.js geo map-projections