将经度纬度转换为平铺坐标

时间:2016-05-26 15:13:26

标签: javascript dictionary coordinates openstreetmap tile

我想通过输入经度和纬度从服务器获取地图图块。 由于地图图块像网格一样排列,我需要将经度和纬度转换为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 柏林的正确瓦片坐标(2200,1343)在zoomlevel 12上,而算法给了我(2645,1894)。

算法中的错误或我对此转换的误解有何误解?

2 个答案:

答案 0 :(得分:4)

Tilesname WebCalc似乎使用slippy map tilenames wiki page上显示的相同代码,并输出与Geofabrik工具相同的切片名称。因此,算法必须正确,错误似乎在您未实现的实施中。

哦,我很确定你只是混合了lat和lon。如果我以错误的顺序将坐标输入到Tilesname WebCalc中,那么它也会返回您问题中给出的“错误”图块名称。所以你的代码很好,你只是把它称为错误的方式。

答案 1 :(得分:0)

以下代码采用 lng、lat 和缩放并返回 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