我想通过输入经度和纬度从服务器获取地图图块。 由于地图图块像网格一样排列,我需要将经度和纬度转换为x和y位置。
我正确地实现了这个算法,但遗憾的是这些不是tileservers的正确坐标。 正如您在此处所见http://tools.geofabrik.de/map/#12/52.5106/13.3989&type=Geofabrik_Standard&grid=1 柏林的正确瓦片坐标(2200,1343)在zoomlevel 12上,而算法给了我(2645,1894)。
算法中的错误或我对此转换的误解有何误解?
答案 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