谷歌地图缩放算法

时间:2015-08-05 20:40:38

标签: c# algorithm google-maps formula computational-geometry

在我的网络应用程序中,我有一些我想要修改的坐标界限来模拟谷歌地图上的“放大”。似乎使用谷歌地图来回缩放只是将边界框的每一边加倍或减半。所以我在服务器上执行此操作的功能如下所示:

private static decimal[] ZoomIn(decimal latMax, decimal lngMin, decimal latMin, decimal lngMax)
{
    decimal lngAdjustment = (lngMax - lngMin) * .25m;
    decimal latAdjustment = (latMax - latMin) * .25m;
    return new[]
    {
        // North
        latMax - latAdjustment,
        // West
        lngMin + lngAdjustment,
        // South
        latMin + latAdjustment,
        // East
        lngMax - lngAdjustment
    };
}

这种方法的问题是我正在做的 latAdjustment 。与使用谷歌地图控件的实际缩放相比,当放大到城市级别时,这最终会相当准确。但是,视图缩小的距离越不准确。我认为这是由于谷歌地图使用的地球墨卡托投影。是否有人知道使用更好的公式或方法来模拟“缩放”?

更新 我的问题更多地与不知道正确的公式而不是谷歌地图。让我举例说明使用一些样本数字。

以芝加哥为中心,以41.8563226156679为中心,-87.7339862646484

围绕该点的边界框:

  • West:-87.984955197753800
  • 东:-87.483017331542900
  • 南:41.546931599561100
  • North:42.164224124684300

通过观察谷歌地图的行为,这个在一个级别放大的边界框将是:   - 西:-87.859470731201100   - 东:-87.608501798095600   - 南:41.701813184067600   - 北:42.010459667660800

(中心保持不变,鼠标移动没有变化等等。我只使用了手动变焦按钮,而不是鼠标)

使用上面的公式,经度值将会正确显示。例如:

west = west +(west-east)* .25 -87.984955197753800 +((-87.483017331542900 - -87.984955197753800)* .25)= -87.859470731201075

然而,在处理纬度时,相同的公式将不起作用。它接近正确的值,但只是足以使地图显着移动。对于较大的边界框和/或当纬度远离赤道时,这种效果更差。我认为这是由于地球的墨卡托投影。 Trig课程很久以前对我而言,此时我无法为这种情况找到适合缩放范围的公式。

1 个答案:

答案 0 :(得分:0)

根据您的测试方法使用鼠标这一事实判断,我认为您的测试方法是问题所在。由于地图根据鼠标的中心而不是屏幕的中心进行不同的放大,因此边界变化,但不是它们之间的差异。这似乎与你提供的细节一致。

直观地说,你的公式没有任何问题 - 只是你如何测试它。