C# - 将 xyz tile 转换为 lat/long,反之亦然,结果不同

C# - Converting xyz tile to lat/long and vice-verse giving different results

我尝试将 lat/long 转换为 XYZ 磁贴,然后再次使用 XYZ 值尝试取回 lat/long。 lat/long的值不一样(原来的和转换后的)。我参考了https://wiki.openstreetmap.org/wiki/Slippy_map_tilenames#C.23得到了换算公式

以下代码供您参考:

正在从 lat/long 转换为 XYZ:

var x = (int)Math.Floor((longitude + 180.0) / 360.0 * Math.Pow(2, zoom));
var y = (int)Math.Floor((1 - Math.Log(Math.Tan((Math.PI / 180) * latitude) + 1 / Math.Cos((Math.PI / 180) * latitude)) / Math.PI) / 2 * Math.Pow(2, zoom));

从 XYZ 转换为 lat/long:

var longitude = x / Math.Pow(2, z) * 360 - 180;
var n = Math.PI - 2 * Math.PI * y / Math.Pow(2, z);
var latitude = 180 / Math.PI * Math.Atan(0.5 * (Math.Exp(n) - Math.Exp(-n)));

当我通过纬度 = -477.42187500000006、经度 = 37.3002752813443、缩放 = 15 时,我得到 x = 19779 和 y = -2147483648。

但是当我通过 x = 19779、y = -2147483648、z = 15 时,我得到纬度 = 90.0 和经度 = 37.298583984375,这是错误的。

我不确定为什么第二次转换会给出错误的结果。非常感谢任何帮助。

根据定义,纬度属于 -90(南极)到 90(北极)范围。

所以你从无效的 -477.421875 开始,结果可以是任意的。

经度正确。它与原始版本略有不同,这是预期的,因为您将 x 截断为最接近的整数。如果您想要相同的值,请不要四舍五入为整数。