我有一个简单的虚构地图,我想用传单来控制它。它是一个平面的2D平面,其"纬度/经度"/坐标系从[0,0]
到[999,999]
。
我自定义了地图,如下所示:
window.map = L.map('leaflet-map', {
crs: L.CRS.Simple,
center: [500, 500],
zoom: 13,
maxBounds: [
[0, 0],
[999, 999],
],
layers: [new MyLayer()],
});
为了绘制这张地图,我创建了一个新图层 MyLayer,它扩展了 gridLayer:
export var MyLayer = GridLayer.extend({
createTile: function(coords, done) {
var error;
var xmlhttprequest = new XMLHttpRequest();
xmlhttprequest.addEventListener('readystatechange', function() {
done(error, dothething());
});
xmlhttprequest.open('GET', /* url */);
xmlhttprequest.send();
},
});
我遇到的问题是 URL 接受[0,0]
坐标系[999,999]
作为参数,但我找不到如何实际获取这些参数。我知道可能有一些十进制元素,但我可以酌情floor
。
当以[500, 500, 13]
为中心时,coords
对象包含{ x: 15516, y: -21558, z: 13 }
。当传递给L.CRS.Simple.pointToLatLng(coords, coords.z)
我得到{ lat: 2.631591796875, lng: 1.89404296875 }
.
我已经下载了源代码,试图从Map._move(center, zoom, data)
了解这种转换是如何发生的,但似乎所做的只是调用this.options.crs.latLngToPoint()
,这正是我在L.CRS.Simple.pointToLatLng
中逆转的。坦率地说,我不知所措。
首先,我鼓励您再次阅读有关L.CRS.Simple
的传单教程。让我从那里引用一个相关的位:
在共同交易标准中。简单来说,一个水平地图单元映射到一个水平像素,与垂直像素同上。[...]我们可以将 minZoom 设置为小于零的值:
因此,默认情况下,您没有理由在L.CRS.Simple
地图上降低到缩放级别 13,真的。对于 [0,0]-[999,999] 地图,请使用缩放级别零进行概览,或使用map.fitBounds([[0,0],[999,999]])
。
createTile()
方法接收的值是切片坐标,而不是 CRS 坐标。一个 0 级图块分为 4 个 1 级图块、16 个 2 级图块、64 个 3 级图块,依此类推,13 级最多 2^13 个图块。通过使用显示磁贴坐标的L.GridLayer
,可以更轻松地可视化这一点,例如:
var grid = L.gridLayer({
attribution: 'Grid Layer',
// tileSize: L.point(100, 100),
});
grid.createTile = function (coords) {
var tile = L.DomUtil.create('div', 'tile-coords');
tile.innerHTML = [coords.x, coords.y, coords.z].join(', ');
return tile;
};
map.addLayer(grid);
第二:你想使用内部_tileCoordsToBounds
方法,在L.GridLayer
定义。给它一组图块坐标,你会得到一个L.LatLngBounds
,其中包含这种图块所覆盖的区域。
以下示例(在此处实时尝试(应该会让您步入正轨。请记住阅读L.LatLngBounds
文档。
var grid = L.gridLayer({
attribution: 'Grid Layer',
// tileSize: L.point(100, 100),
});
grid.createTile = function (coords) {
var tile = L.DomUtil.create('div', 'tile-coords');
var tileBounds = this._tileCoordsToBounds(coords);
tile.innerHTML = [coords.x, coords.y, coords.z].join(', ') +
"<br>" + tileBounds.toBBoxString();
return tile;
};
map.addLayer(grid);