为啥我的经度纬度转换的准确性似乎在赤道以下降低?
Posted
技术标签:
【中文标题】为啥我的经度纬度转换的准确性似乎在赤道以下降低?【英文标题】:Why does the accuracy of my longitude latitude translate appear to diminish below the equator?为什么我的经度纬度转换的准确性似乎在赤道以下降低? 【发布时间】: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
传递给投影,然后再使用它的值。我会做出相应的回应。 :) 非常感谢。
【参考方案1】:
令人尴尬的是,我在使用经度和纬度坐标时发现了一个愚蠢的错误。
虽然我在从 Google 检索坐标后将坐标传递给逆向的 projection([106.7500, 6.1333])
,但我没有注意到 Google 也给出的方向(或基本方向)的重要性。
6.1333° S, 106.7500° E
表示雅加达位于赤道以南 6.1333 度。
所以,我的问题出现了,因为我没有通过 projection()
为南方坐标传递一个负值 - 这意味着,我的投影总是会在赤道上方 6.1333 度,而它应该是一直在下面。
【讨论】:
以上是关于为啥我的经度纬度转换的准确性似乎在赤道以下降低?的主要内容,如果未能解决你的问题,请参考以下文章
地理位置、准确性和仿射变换:是啥导致我从纬度/经度位置不准确地转换为图像上的点