使用 << 运算符将经度和纬度映射到 MapTile 坐标的方法

Method for mapping Longitude and Latitude to MapTile Coordinates using << operator

所以我正在寻找一个下载地图图块的程序。从 here 我得到了一个 c# 方法,用于从经度和纬度点获取图块网格坐标,如下所示:

public PointF WorldToTilePos(double lon, double lat, int zoom)
{
    PointF p = new PointF();
    p.X = (float)((lon + 180.0) / 360.0 * (1 << zoom));
    p.Y = (float)((1.0 - Math.Log(Math.Tan(lat * Math.PI / 180.0) + 
        1.0 / Math.Cos(lat * Math.PI / 180.0)) / Math.PI) / 2.0 * (1 << zoom));

    return p;
}

在同一个网站上,它指出解决这个问题的数学是:

其中 z = 缩放。

现在我的问题是 << 运算符的作用是什么以及 (1 << zoom) 是什么意思。因为据我所知,c# 方法不正确并且 (1 << zoom) 应该替换为 x 中的 Math.Pow(2,zoom); 和 y 中的 Math.Pow(2,zoom-1)

它向左移动一个缩放次数。这实际上与将 2 提高到变焦倍数相同。

y除以2得到z-1

它是一个左移运算符。它将数字 1 中的位向左移动 zoom 个位置。

在此1 << zoom的上下文中,它基本上是创建 2 的幂。

如果缩放等于 3,则其执行 2^3:

0000 0001 = 1
After executing 1 << zoom (3)
0000 1000 = 8

正如您所指出的,您可以将其替换为 Math.Pow,但是,位运算要快得多。 Math.Pow 必须在一般情况下处理问题,处理分数幂和其他问题。位操作是自然的 CPU 操作,在单个 CPU 周期内执行。

<< 是位移运算符。

考虑二进制数 00001110(十进制 14)。当它向左位移 1 位时,它变成 00011100(十进制 28)。后者向右移动 1 位时,再次变为 00001110(十进制 14)。

通常,将整数位移 1 会导致乘以 2(向左移动时)或整数除以 2(向右移动时)。

位移2(即位移1,两次)导致乘以2*2或整数除以2*2。

在一般情况下,将数字移位 N 会导致乘法或除法 2^N。