使用传单进行最大纬度地图平移

时间:2018-05-31 16:20:38

标签: javascript leaflet

我是传单的新手,我希望限制水平而不是垂直(经度但不是纬度)平移世界地图,因为当我点击它们时这个地图将显示图片,当我限制时我无法看到图像水平和垂直平移。地图本身不是图片,而是真实的世界地图。但是当我点击某个位置时,地图上会出现一张小图片。

我尝试使用maxBounds和setMaxbounds。正常的maxBounds(查看世界地图)是:

maxBounds: [[-85, -180.0],[85, 180.0]],

当我尝试将纬度设为

  

[[ - 150,-180.0],[150,180.0]]

,垂直平移仍受限制。有人可以帮忙吗?谢谢。

1 个答案:

答案 0 :(得分:1)

这听起来与传单问题跟踪器中的(相当模糊)问题类似  回来时:见https://github.com/Leaflet/Leaflet/issues/3081

但是,该问题是处理无限的水平边界,而不是已经有一些预设限制的CRS中的垂直边界

如果您将地图的maxBounds设置为大于85的值(MAX_LATITUDE of L.Projection.Spherical的值)并运行调试程序,则调用堆栈将遍历地图的_panInsideMapBounds(),然后{{{ 1}},然后是panInsideBounds(),然后是_limitCenter(),然后是_getBoundsOffset,然后是地图CRS的project(),然后是非常latLngToPoint的{​​{1}} 。 L.Projection.Spherical将边界的限制投影到像素坐标 clamps the projected point,以便在投影的限制范围内。

这背后有很多原因,其中一个原因是阻止用户将标记放在瓷砖覆盖的区域之外:

screenshot clamping markers

(当用户将lat-lng与lng-lat混淆并尝试使用[-90,90]范围之外的值作为纬度时,这一点尤其重要,并且投影代码开始在任何地方返回project()值)

如何解决这个问题?好吧,我们总是可以指定地图的CRS,我们可以创建一个带有黑客投影的CRS,它会强制执行不同的限制。请注意,这会改变L.Projection.Spherical.project()内部工作方式(如Leaflet tutorial about extending layers中所述),因此内容(特别是插件)可能会中断。

类似于:

Infinity

当然,您可以设置自己的pixelOrigin

var hackedSphericalMercator = L.Util.extend(L.Projection.SphericalMercator, {
  MAX_LATITUDE: 89.999
});

var hackedEPSG3857 = L.Util.extend(L.CRS.EPSG3857, {
  projection: hackedSphericalMercator
});

var map = new L.Map('mapcontainer', {
    crs: hackedEPSG3857,
});

在这种情况下,边界的限制仍然会被限制在maxBounds,但你应该有足够的空间来应用。

作为旁注:对这个问题采用完全不同的方法是使用不同的地图投影。我们已经习惯了球形圆柱投影,但这不是压扁地球的唯一方法。

特别是,Transverse Mercator projection(或几乎任何其他横向圆柱投影)都以相同的方式工作,但是垂直包裹而不是水平包裹,它是投射的经度< / em>,而不是纬度,即接近[-180,180]范围时渐近接近无穷大的纬度。让我借一下维基百科文章中的图片:

transverse spherical projection diagram

这意味着一系列不同的挑战(即找到适合您应用的一些光栅图块,包括使用哪种本初子午线,并使proj4leaflet发挥得很好),但它绝对可行。