将经度纬度转换为瓦片坐标

Converting longitude latitude to tile coordinates

我想通过输入经度和纬度从服务器获取地图图块。 由于地图图块像网格一样排列,我需要将经度和纬度转换为 x 和 y 位置。

算法解释在这里:http://wiki.openstreetmap.org/wiki/Slippy_map_tilenames#ECMAScript_.28JavaScript.2FActionScript.2C_etc..29

我正确地实现了这个算法,但不幸的是这些不是 tileservers 的正确坐标。 正如你在这里看到的 http://tools.geofabrik.de/map/#12/52.5106/13.3989&type=Geofabrik_Standard&grid=1 柏林的正确图块坐标在缩放级别 12 上是 (2200, 1343),而算法给出了 (2645, 1894)。

算法哪里出错了,或者我对这个转换的工作原理有什么误解?

Tilesname WebCalc seems to use the same code as presented on the slippy map tilenames wiki page 并输出与 Geofabrik 工具相同的图块名称。所以算法一定是正确的,错误似乎在你的实现中,你没有告诉我们。

哦,我很确定你混淆了纬度和经度。如果我在 Tilesname WebCalc 中以错误的顺序输入坐标,那么它也会 returns 您问题中给出的 "wrong" 瓷砖名称。所以你的代码没问题,只是你调用错了。

以下代码采用经度、纬度和缩放以及 return X 和 Y 值,Z 是缩放。你需要把它放在 url 中,瞧,你得到了瓷砖

const  EARTH_RADIUS = 6378137;
const  MAX_LATITUDE = 85.0511287798;

    function project (lat, lng)
    {
        var d = Math.PI / 180,
                max = MAX_LATITUDE,
                lat = Math.max(Math.min(max, lat), -max),
                sin = Math.sin(lat * d);
    
        return {x: EARTH_RADIUS * lng * d,
                y: EARTH_RADIUS * Math.log((1 + sin) / (1 - sin)) / 2
            };
    }
    
    
    function zoomScale (zoom)
    {
      return 256 * Math.pow(2, zoom);
    }
    
    
    function transform (point, scale) {
      scale = scale || 1;
      point.x = scale * (2.495320233665337e-8    * point.x + 0.5);
      point.y = scale * (-2.495320233665337e-8 * point.y + 0.5);
      return point;
    }
    
    var point1 = project (lat1, lng1);
    var scaledZoom = zoomScale (zoom);
    point1 = transform (point1, scaledZoom);

point1 就是你需要的 X & Y