传单:是不是可以自定义缩放级别?

Posted

技术标签:

【中文标题】传单:是不是可以自定义缩放级别?【英文标题】:Leaflet: Are custom zoom levels possible?传单:是否可以自定义缩放级别? 【发布时间】:2015-03-25 07:49:29 【问题描述】:

是否可以在使用 Stamen Toner-lite tiles 的 Leaflet 地图上设置中间(2.5、3.5、4.5 等)缩放级别?这是我目前计算缩放级别的代码:

leafletmap.on('zoomstart', function (d)
    targetZoom = leafletmap.getZoom(); //Grabs whatever current zoom level is
    targetZoom = targetZoom +.5; //Adds .5
    leafletmap.setZoom(targetZoom); //Sets new value to zoom level
    console.log(targetZoom); //Consoles out new value
);

我尝试只在代码中添加 .5,但我得到了一个 too much recursion 错误,所以我猜这并不是那么简单。非常感谢任何帮助或指导!

【问题讨论】:

【参考方案1】:

在 1.0.0 版本中,Leaflet 引入了部分缩放:

https://leafletjs.com/examples/zoom-levels/#fractional-zoom

在此之前,地图的缩放级别只能是整数 (0、1、2 等);但现在你可以使用像 1.5 这样的小数 或 1.25。

...

如果将 zoomSnap 的值设置为 0.5,则 地图将为 0、0.5、1、1.5、2 等等。

如果您将值设置为 0.1,则地图的有效缩放级别将为 0, 0.1、0.2、0.3、0.4 等等。

以下示例使用 0.25 的 zoomSnap 值:

var map = L.map('map', 
  zoomSnap: 0.25 
);

如您所见,Leaflet 只会加载缩放级别为 0 或 1,并将根据需要对其进行缩放。

Leaflet 会将缩放级别捕捉到最接近的有效级别。为了 例如,如果您有 zoomSnap: 0.25 并且您尝试这样做 map.setZoom(0.8),缩放将迅速回到 0.75。同样的事情发生 使用 map.fitBounds(bounds),或者在 触摸屏。

【讨论】:

【参考方案2】:

直截了当:这是不可能的。您需要渲染自己的平铺图像,在您自己的服务器上运行它们并为 Leaflet 创建您自己的坐标参考系统 (CRS) 扩展。如果你看看常规的瓦片集是如何制作的,你就会明白为什么。

花蕊瓷砖申请网址:

http://s.tile.stamen.com/toner/z/x/y.png

请求切片时,z 将替换为地图的当前缩放级别。 xy 是图块的坐标。 s 将替换为子域。因此,如果您在坐标 1,1 处的缩放级别为 6,它将尝试加载:

http://a.tile.stamen.com/toner/6/1/1.png

现在,如果您可以(但不能)缩放到 6.5 级,它将尝试加载:

http://a.tile.stamen.com/toner/6.5/1/1.png

那些简单的图块在 stamen 服务器上不存在,因此返回 404 表示未找到文件。您可以使用这些链接自己尝试:

http://a.tile.stamen.com/toner/6/1/1.png

http://a.tile.stamen.com/toner/6.5/1/1.png

http://a.tile.stamen.com/toner/7/1/1.png

所以这永远不会奏效。如前所述,您可以运行自己的图块服务器,渲染您自己的图块图像并设置您自己的L.CRS。你可能也想看看这个问题:Adding an extra zoom levels in Leaflet Maps

【讨论】:

感谢@iH8 的直截了当的回答。我看到了上一个问题并做了一些研究,但我不确定过去两年情况是否发生了变化。非常感谢!

以上是关于传单:是不是可以自定义缩放级别?的主要内容,如果未能解决你的问题,请参考以下文章

R中自定义标记的传单图例

宣传单自定义控制位置:中心

谷歌地图上的自定义缩放级别

传单:如何将文本标签添加到自定义标记图标?

带有反应传单的自定义标记图标

在缩放级别计算每像素米的传单