为了防止在最高缩放级别出现多个重复的世界地图,我使用
noWrap=true
选项。它运行良好,但仅在地图的左侧(灰色区域),右侧仍然显示额外的图块。
这是为什么?
UPDATE1:看起来这是特定 Mapbox 图块或其加载方式的问题? 这里没有包裹和
https://{s}.tiles.mapbox.com/v3/ebrelsford.ho06j5h0/{z}/{x}/{y}.png
工作完美:NoWrap 工作 JSBIN 链接
但是一旦我更改为使用样式加载图块的另一种方式
我可以向右滚动并仍然获得图块
我打开了一个 github 问题,我怀疑这是库的一个错误 https://github.com/Leaflet/Leaflet/issues/5938
noWrap
选项的“不完整”使用:(强调我的)
:图层是否包裹在反子午线上。如果noWrap
,则 GridLayer 将仅在低缩放级别显示一次。当地图 CRS 不环绕时无效。 可与true
结合使用,以防止请求超出 CRS 限制的图块。bounds
noWrap
,正如它的名字所说,告诉Leaflet不要复制“主”世界。因此,Leaflet 必须假设“主”世界是“无限”,并且它尝试在任何地方加载图块,从而扩展四叉树方案:在图块 0/0/0 旁边(在缩放 0 处),它尝试加载图块 0/ 1/0、0/-1/0 等如果你想告诉 Leaflet 不要扩展四叉树方案,你应该指定“主”世界之外没有可用的图块。
bounds
选项与 noWrap
选项结合使用:
L.tileLayer(urlTemplate, {
noWrap: true,
bounds: [
[-90, -180],
[90, 180]
]
}).addTo(map);
更新了 JS Bin:http://jsbin.com/nokasukozo/1/edit?html,js,console,output
归功于ghybs的回答,但是您可以在地图图层而不是TileLayer中设置maxBounds。此外,TileLayer 上不再需要 noWrap。只需将
maxBounds=[-90, -180],[90, 180]]
应用到您的地图图层即可正常工作。
如果使用 GridLayer:
var tiles = new L.GridLayer({
noWrap: true,
bounds: [
[-90, -180],
[90, 180]
]
});
tiles.createTile = function (coords) {
var canvas = L.DomUtil.create('canvas', 'leaflet-tile');
var image = new Image();
...
return canvas;
}
tiles.addTo(map)