Leaflet imageOverlay没有setBounds函数

时间:2017-02-15 07:03:13

标签: leaflet

我正在从ArcGIS网络服务器上读取imageOverlay网址,该网页服务器使用小册子getBound()坐标作为网址的一部分(我们有针对当前窗口过滤的大型地图'范围') 。抱歉不包括实际路径(我使用敏感客户端数据)。例如:

http://myarcgiswebserver.com/MapServer/export/dpi=96&format=png32&bbox=27.119750976562504%2C-31.194007509998823%2C32.39044189453126%2C-29.692824739380754&size=1719%2C434

[bbox] =当前imageBounds

当拖动我的地图时,imageOverlay网址会正确更新,但我的传单窗口不再与第一次添加imageOverlay时设置的imageBound值对齐,导致输出偏斜(这是我的假设):

image of skewed results when i drag my map

唯一的解决方法是删除现有的imageOverlay并添加一个新的(当地图消失时会破坏用户体验,然后每次拖动或缩放窗口时重新出现)。

我是否正确接近此问题,或者是否会引入更新当前imageBounds的函数来解决此问题?也许不是一个新功能,而是使用附加参数扩展setUrl ......?

非常感谢任何反馈......

2 个答案:

答案 0 :(得分:1)

如果您使用ImageOverlay但动态更改其url,并使用反映新边界框的新图像,那么确实这就是您描述的行为的原因:您显示的图像是已使用新bbox生成,但位于初始bbox,因为图片叠加层仍保留在地图上的相同地理位置。

相反,我觉得你应该使用TileLayer.WMS

它会自动为您管理边界框更新。但是,您可能需要找到适合您的服务提供商所需URL语法的正确选项。

示例:http://playground-leaflet.rhcloud.com/yel/1/edit?html,output

答案 1 :(得分:1)

正如@ghybs指出的那样,使用WMS可以更好地服务于您的用例 ArcGIS服务器的界面。

无论如何,你说

  

唯一的解决方法是删除现有的imageOverlay并添加一个新的(当地图消失时会破坏用户体验,然后每次拖动或缩放窗口时重新出现)。

嗯,这个故障是由于你可能做的事情:

  • 删除旧叠加层
  • 添加新叠加层
  • 等待从网络收到图像
  • 等待一帧,以便显示新的叠加层

而你应该做的事情如下:

  • 添加新叠加层
  • 等待从网络收到图像
  • 删除旧叠加层
  • 等待一帧,以便显示新的叠加层

问题只是异步等待和那里可能存在的竞争条件,但应该很容易破解,例如:

var activeOverlay = null;
var overlayInRequest = null;

map.on('moveend zoomend', {

    // If we are already requesting a new overlay, ignore it.
    // This might need some additional debouncing logic to prevent
    // lots of concurrent requests
    if (overlayInRequest) {
        overlayInRequest.off('load', showOverlay);
    }

    overlayInRequest = L.imageOverlay( computeUrl( map.getBounds() ), myOverlayOptions );
    overlayInRequest.on('load', showOverlay);
});

function showOverlay(ev) {
    activeOverlay.remove();
    activeOverlay = overlayInRequest;
    activeOverlay.addTo(map);
    overlayInRequest = undefined;
}