2014-02-26 69 views
10

如果我使用下面的代碼從指定緯度/經度得到LayerPoint如何從緯度檢索LayerPoint(X,Y),並使用單張API經度座標

var latLng = new L.latLng(-37.81303878836989, 144.97421264648438); 
var point = map.latLngToLayerPoint(latLng); 

輸出如下:

o.Point 
    x: 86042 
    y: 77065 

然後,當我嘗試使用以下URL訪問層瓦片:

http://a.tile.osm.org/10/86042/77065.png

我收到了404,因爲它是一個無效的X,Y

現在,如果我使用下面的代碼:

map.on("click", function (e) { 
    console.log(e); 
}); 

我可以在控制檯旁邊的緯度和經度檢索LayerPoint

latlng: o.LatLng 
    lat: -37.81303878836989 
    lng: 144.97421264648438 
layerPoint: o.Point 
    x: 950 
    y: 303 

然後訪問以下網址返回此層瓦片:

http://a.tile.osm.org/10/950/303.png

enter image description here

的問題是,它甚至不似乎是爲經緯度正確的瓷磚我的原始代碼也不會將經緯度轉換爲LayerPoint,但實際上首先會返回有效的X,Y。

我很困惑,爲什麼我得到這些結果。任何幫助將不勝感激。也許我做錯了什麼。

我不確定是否有另一種基於緯度和經度列表檢索瓦片圖層的方法?

之所以我之所以這樣做,是因爲我希望能夠爲離線應用程序使用緩存切片數據,並且我擁有的唯一數據是通過爲客戶端生成的geoJSON有效內容的幾何/座標應用。

UPDATE:

結束了此功能會(感謝@scai)。

根據this link

var getSlippyTileLayerPoints = function (lat_deg, lng_deg, zoom) { 
    var x = (Math.floor((lng_deg + 180)/360 * Math.pow(2, zoom))); 
    var y = (Math.floor((1 - Math.log(Math.tan(lat_deg * Math.PI/180) + 1/Math.cos(lat_deg * Math.PI/180))/Math.PI)/2 * Math.pow(2, zoom))); 

    var layerPoint = { 
     x: x, 
     y: y 
    }; 

    return layerPoint; 
}; 

OUTPUT:

Object {x: 924, y: 628} 

http://a.tile.osm.org/10/924/628.png

enter image description here

更新2:

進一步後研究,結果發現我之後的功能如下:

var layerPoint = map.project(latlng).divideBy(256).floor(); 
console.log(layerPoint.x, layerPoint.y); 

回答

8

進一步研究後,事實證明我是什麼之後是以下功能:

var layerPoint = map.project(latlng).divideBy(256).floor(); 
console.log(layerPoint.x, layerPoint.y); 
1

OSM的磁貼網址基於不同的方案。您應該閱讀OSM wiki中的slippy map tile names。它包含用於各種編程/腳本語言的lon/lat到tile數字的實現,反之亦然。

相關問題