(对于Mapbox和JS来说还很陌生,所以我有点头疼) 我正在一个页面上,用户需要调整地图容器的大小。它需要能够获得精确调整后的地图的边界和中心点(通过map.getBounds和map.getCenter)。
当我使用JS调整容器div的大小时,未调整中心和边界。 小提琴:http://jsfiddle.net/xcow63sm/3/
平移/缩放会导致更新的中心和边界。调整浏览器窗口大小(如果将宽度或高度设置为100%)也可以。我希望更改容器的尺寸会调整中心和边界。
但是,如果您使用表单字段来调整容器div的高度/宽度,则中心和界限不会。我已经尝试过(越来越绝望):
function resize (){
var inputwidth = document.getElementsByName("mapwidth")[0].value;
var inputheight = document.getElementsByName("mapheight")[0].value;
var mapDiv = document.getElementById('map');
var mapcenter = map.getCenter();
mapDiv.style.width = inputwidth;
mapDiv.style.height = inputheight;
map.updateSize();
map.update();
map.resize();
map.invalidateSize();
document.getElementById("mapcenter").value = mapcenter;
编辑:这似乎适用,但我无法理解:Resizing a leaflet map on container resize
答案 0 :(得分:1)
如果我了解您,则会遇到两个问题:您不喜欢地图尺寸更改后的位置,并且会出现空白。
如果地图的宽度和高度突然加倍,则至少有三个有效选项可用于更新地图:
我认为您的问题是Mapbox选择了选项1,但是您需要其他两个选项之一。正如我认为您已经发现的那样,解决方案只是简单地进行自己的数学运算并按照自己的意愿设置界限。
您的第二个问题是,调整大小时,调用map.resize()
不能正确更新地图的内部大小,并且留下空白。原因是您使用的是动画CSS属性。因此,当您这样做时:
mapDiv.style.width = inputwidth;
mapDiv.style.height = inputheight;
map.resize();
这不起作用,因为地图的大小实际上尚未转换为新的大小。您可以像这样解决它:
mapDiv.style.width = inputwidth;
mapDiv.style.height = inputheight;
window.setTimeout(()=>map.resize(), 500);
您可能会听一个更好的事件,以随着地图区域的扩大而不断更新。
此处更新了小提琴:http://jsfiddle.net/xcow63sm/11/
此外,您应该查阅文档here。我不确定您从哪里map.updateSize()
来的,但这不是Mapbox-GL-JS:)