2016-07-28 73 views
2

形势切换图块网址在mapbox-GL-JS

推荐的方式我们呈现光栅层到地图。该图层的源代码具有初始图块网址。现在我们要更改源的tile-url并触发新tile的重新加载。例如。我们针对不同的时间点拼贴,并且我们希望逐步完成不同的时间步骤。

什么可以[email protected]

map.addSource('tile-source', {...}); 
map.addLayer('tile-layer', {source: 'tile-source', ...}); 

// react to a button click or what ever to trigger tile url change 
... 
const source = map.getSource('tile-source'); 
source.tiles = ['new-tile-url']; 
source._pyramid.reload(); 

做这工作得很好。但是,当然,使用私人方法是不好的做法。看到下面的原因:

什么可以与当前版本来完成从GitHub(最新提交b155118,2016年7月28日)

// init map, add layer, add source, like above 
const source = map.getSource('tile-source'); 
source.tiles = ['new-tile-url']; 

map.styles.sources['tile-source'].reload(); 

它做这种方式,因为前者TilePyramid已被重构为SourceCache。在这里,我们在SourceCache上调用reload()而不是RasterTileSource。似乎我们不再需要使用任何私有方法,尽管这仍然看起来像未公开的API,这可能在未来的版本中打破。

而且似乎有打电话reload()时,与内存泄漏问题:调用reload()https://github.com/mapbox/mapbox-gl-js/issues/2266

此外缓存被清除。目前看起来没有问题。

// This yields a `RasterTileSource` instance 
map.getSource('tile-source'); 

// This yields a `SourceCache` instance 
map.styles.sources['tile-source']; 

// What's really confusing too, at least namingwise 
map.getStyle(); // <-- Yields the maps (visual) style 

SourceCacheRasterTileSource实例作为私人_source场。

问题

什么是推荐的方式做这样的事情?这是一个功能正在工作吗?有没有解释为什么这不是一个功能(还)或永远不会?

回答

3

这听起来像你试图改变一个raster源的URL。在GL JS中这样做的正确方法是删除源代码,然后添加具有相同ID和新URL的新源。

map.addSource('tile-source', {...}); 
map.addLayer('tile-layer', {source: 'tile-source', ...}); 

// react to a button click or what ever to trigger tile url change 
... 
map.removeSource('tile-source'); 
map.addSource('tile-source', {tiles: ['new-tile-url'], ...}); 
+0

谢谢,我们会尽力而为。 – Scarysize

+0

这样做的时候,我经常会看到'source already exists'错误。我希望有一个像source.setTiles(['https:// ...'])这样的setter,它可以更好地为GeoJSON图层提供'source.setData'。 –

+0

如果您认为已经移除了源,但您没有看到“源已存在”错误,因为某些图层使用了它。确保没有使用你的源的图层,它将被map.removeSource移除 – Andrew