使用 << 运算符将经度和纬度映射到 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。
所以我正在寻找一个下载地图图块的程序。从 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。