Javascript 带传单的最大纬度地图平移

Javascript 带传单的最大纬度地图平移,javascript,leaflet,Javascript,Leaflet,我对传单不熟悉,我希望限制水平而非垂直(经度而非纬度)平移世界地图,因为当我单击地图时,该地图将显示图片,当我限制水平和垂直平移时,我看不清楚图像。地图本身不是图片,它是真实世界的地图。但当我点击某个位置时,地图上会出现一张小图片 我试着玩maxBounds和setMaxbounds。法线最大边界(用于查看世界地图)为: 当我试着把纬度调整到 [150,-180.0],[150180.0]] ,垂直平移仍然受到限制。有人能帮忙吗?多谢各位 这听起来像是传单问题追踪者a中的一个(相当模糊的)问题

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

我试着玩maxBounds和setMaxbounds。法线最大边界(用于查看世界地图)为:

当我试着把纬度调整到

[150,-180.0],[150180.0]]

,垂直平移仍然受到限制。有人能帮忙吗?多谢各位

这听起来像是传单问题追踪者a中的一个(相当模糊的)问题 回来时:看到了吗

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

如果将映射的
maxBounds
设置为大于85的值(的值)并运行调试器,则调用堆栈将通过映射的
\u panInsideMapBounds()
,然后
panInsideBounds()
,然后
\u limitCenter()
,然后
\u getBoundsOffset
,然后
项目(),然后通过地图CRS的
latLngToPoint
,然后不定时地
L.Projection.spheremic
project()
L.Projection.Spherical.project()
将边界的限制投影到像素坐标中,在投影的限制内

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

(当用户将lat lng与lng lat混淆,并试图使用纬度[-90,90]范围之外的值,并且投影代码开始返回
无穷大
值时,这一点尤为重要)

如何避开这个问题?好的,我们总是可以指定地图的CRS,我们可以创建一个带有黑客投影的CRS,强制执行不同的限制。请注意,这会改变
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

var map = new L.Map('mapcontainer', {
    crs: hackedEPSG3857,
    maxBounds: [[-Infinity, -10], [Infinity, 10]]
});
在这种情况下,边界的限制仍将限制为
hackedSphericalMercator.MAX_LATITUDE
,但您应该有足够的回旋空间来容纳应用程序


作为旁注:解决这个问题的一个根本不同的方法是使用不同的地图投影。我们已经习惯了球形柱形投影,但这不是使地球变平的唯一方法

特别是,一个(或几乎任何其他的横向圆柱投影)的工作原理基本相同,但是垂直缠绕而不是水平缠绕,是投影的经度,而不是纬度,当接近[-180,180]范围时,这些经度逐渐接近无穷远。让我借用一下维基百科文章中的一幅图片:

这意味着一系列不同的挑战(即找到一些适合您的应用程序的光栅图块,包括使用哪个prime meridian,并使Proj4Floaple播放得更好),但这绝对是可行的。

这听起来类似于传单问题跟踪器a中的一个(相当模糊)问题 回来时:看到了吗

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

如果将映射的
maxBounds
设置为大于85的值(的值)并运行调试器,则调用堆栈将通过映射的
\u panInsideMapBounds()
,然后
panInsideBounds()
,然后
\u limitCenter()
,然后
\u getBoundsOffset
,然后
项目(),然后通过地图CRS的
latLngToPoint
,然后不定时地
L.Projection.spheremic
project()
L.Projection.Spherical.project()
将边界的限制投影到像素坐标中,在投影的限制内

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

(当用户将lat lng与lng lat混淆,并试图使用纬度[-90,90]范围之外的值,并且投影代码开始返回
无穷大
值时,这一点尤为重要)

如何避开这个问题?好的,我们总是可以指定地图的CRS,我们可以创建一个带有黑客投影的CRS,强制执行不同的限制。请注意,这会改变
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

var map = new L.Map('mapcontainer', {
    crs: hackedEPSG3857,
    maxBounds: [[-Infinity, -10], [Infinity, 10]]
});
在这种情况下,边界的限制仍将限制为
hackedSphericalMercator.MAX_LATITUDE
,但您应该有足够的回旋空间来容纳应用程序


作为旁注:解决这个问题的一个根本不同的方法是使用不同的地图投影。我们已经习惯了球形柱形投影,但这不是使地球变平的唯一方法

特别是,一个(或几乎任何其他的横向圆柱投影)的工作原理基本相同,但是垂直缠绕而不是水平缠绕,是投影的经度,而不是纬度,当接近[-180,180]范围时,这些经度逐渐接近无穷远。让我借用一下维基百科文章中的一幅图片:

这意味着一系列不同的挑战(即找到一些适合您的应用程序的光栅图块,包括使用哪个prime meridian,以及如何使Proj4Falobe发挥作用),但这是明确的