Previously, the map renderer would listen for layers being added and
removed from the layers collection, and would create and remove layer
renderers in response to these events.
With this change, layer renderers are only created or removed when
renderFrame is called, which leads to somewhat simpler code.
We still need to listen to changes to the layers collection, but now
these only trigger a new render.
This new approach also has an advantage when layers change order.
Swapping the order of two layers involves removing one and re-inserting
it elsewhere. With the old approach, this would cause the deletion and
re-creation of the layer renderer. With this new approach, the layer
renderer is preserved.
getTile and the tileUrlFunc are functions of the source, so they do need to be passed the tile grid. The tile source knows its tile grid, and can get the projection's tile grid if it doesn't have a tile grid.
This massively reduces the number of temporary ol.TileCoord objects.
Previously an ol.TileCoord object was generated for every potentially
visible tile at the current zoom level and lower, every frame. This
commit eliminates all of those. Now new ol.TileCoord objects are only
allocated when a new tile is created.
With this commit we register a change listener at a time when we are guaranteed that the listener will be called. In this was we don't need to remove listeners when the tile is dropped from the tile queue. And to avoid busy-polling between IDLE and LOADING we rely on the map to call requestRenderFrame when new tiles change to LOADING from IDLE.
This change adds a lot of flexibility to working with tile
layers: Sources where the server projection or tile grid do not
matter can now be constructed without specifying a projection or
tile grid.
The tileUrlFunction/imageUrlFunction now also creates updated
URLs when the params of the layer change, so things like
mergeNewParams in ol2 will be possible.
A nice side effect of this whole change is that there is no more
duplicated code between tiled and single image WMS layers.
While I was at it, I also fixed a WMS 1.1.1 axis order issue
and incorrect STYLES params (STYLES=& instead of STYLES&).