我正在尝试使用我自己的磁贴生成Leaflet的自定义非地理地图。
目前,我使用 imagemagick 创建了大小为256x256像素的10x10虚拟拼贴,每个拼块都是随机纯色。 它们放在public / map-tiles / 1 / map_x_y.png中,其中x取0到9之间的值(相应的y)。
由于这是一张非地理地图,我注意将crs更改为L.CRS.Simple(见http://leafletjs.com/examples/crs-simple/crs-simple.html):
var map = L.map('map', {
minZoom: 1,
maxZoom: 1,
center: [0, 0],
crs: L.CRS.Simple
}).setView([0, 0], 1);
L.tileLayer('/map-tiles/{z}/map_{x}_{y}.png', {
bounds: [[0, 0], [2560, 2560]],
tms: true
}).addTo(map);
然而,这会产生稍微偏移的瓷砖,从而导致错位:
此外,将获取具有负y坐标的图块,这会产生404d请求,如控制台中所示。
这种行为的原因是什么?
编辑1:正如IvanSanchez指出的那样,错位是由缺少的leaflet.css样式表引起的。
我仍然遇到负坐标问题。正如所建议的,我添加了边界(参见上面的更新代码)。观察:
编辑2:经过多次测试后,看起来负片是y轴处理(http://leafletjs.com/examples/wms/wms.html)的乘积。原点是左上角,y向下。我期望获取原点下面的图块,而不是上面的图块。
为了保持我的惯例x和y都增加(我向右增加x,向下增加y,具有正坐标分量的瓦片从0到9),我尝试的是:
tms: true
。没有成功,仍然会提取负y的瓷砖。{y}
更改为{-y}
。 Error: No value provided for variable {-y}
中的结果。我的脚本使用的是Leaflet 1.3.1。答案 0 :(得分:2)
在包含L.CRS.Simple
的地图中,默认情况下所有TileLayer
都有无限边界。
如果您希望TileLayer
仅在给定区域内请求切片,请阅读Leaflet API documentation,特别是名为TileLayer
的{{1}}选项(继承自bounds
}选项)。我来引用一下:
GridLayer
输入bounds
默认LatLngBounds
如果设置,则只会在集合undefined
内加载图块。
你还提到:
奇怪的是,它试图获取负坐标[...]
的图块
这并不奇怪,它的行为与设计完全相同。负坐标没有任何固有的错误(也不奇怪),负的切片坐标是有效的documented in some tile standards
因此,如果您有10x10的256px大小,范围从[0,0]到[10,10],您可能需要类似
的内容LatLngBounds
如果你的数据中心是[0,0]点并且你的图块从[-5,-5]到[5,5],你可能想要像
这样的东西L.tileLayer('/map-tiles/map_{x}_{y}.png', {
bounds: [[0, 0], [2560, 2560]]
}).addTo(map);
答案 1 :(得分:0)
问题归结为两个方面:
bounds: [[0,0],[-1230,1230]]
的问题(注意减号)。 1230对应于缩放的瓦片数量,是一个瓦片像素大小的0倍。