1

我收到了一些关于如何将我的地图转换为给定经度和纬度值的问题的帮助,这里是:如何使用 SVG translate 将 d3.js 投影居中到给定的纬度和经度值?我写了一个以给定比例平移到给定位置的方法:

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 是否可以center([106.7500, 6.1333])在固定的 Jarkata 上正确地测试scale(1000),但它没有;它仍然把你扔进大海。

4

1 回答 1

1

令人尴尬的是,我在使用经度和纬度坐标时发现了一个愚蠢的错误。

虽然我在从谷歌检索坐标后将坐标传递给projection([106.7500, 6.1333])逆,但我没有注意到谷歌也给出的方向(或基本方向)的重要性。

6.1333° S, 106.7500° E表示雅加达位于赤道以南6.1333 度。

所以,我的问题出现了,因为我没有projection()为南方坐标传递一个负值——这意味着,我的投影总是会在赤道上方6.1333 度,而它应该在下方。

于 2013-05-31T13:44:43.277 回答