TileLayer abstract class
The abstract base class for map layers consisting of a grid of map tiles.
abstract class TileLayer extends Layer { /// the default tile dimensions static final Dimension DEFAULT_TILE_SIZE = new Dimension(256,256); final TileCache _cache = new TileCache(); Renderer _renderer; /** * initializes the layer renderer from [renderer] * * [renderer] is either a [Renderer] or one of the constants * [IMG_GRID_RENDERER] or [CANVAS_RENDERER] */ _initRenderer(renderer) { initPredefined(code) { switch(code) { case IMG_GRID_RENDERER: _renderer = new ImgGridRenderer(this); break; case CANVAS_RENDERER: _renderer = new CanvasRenderer(this); break; default: throw new ArgumentError("unsupported renderer code, got $code"); } }; initCustom(renderer) { if (renderer == null) { _renderer = new CanvasRenderer(this); } else { _renderer = renderer; } }; if (renderer is int) initPredefined(renderer); else if (renderer is Renderer) initCustom(renderer); else if(renderer == null) _renderer = new CanvasRenderer(this); else throw new ArgumentError( "renderer: expected int or Renderer, got $renderer"); } /** * Creates the tile renderer. * * ### Possible values for [renderer] * * * [IMG_GRID_RENDERER] or [CANVAS_RENDERER] * * an instance of a [Renderer] * * the default value if missing or null is [CANVAS_RENDERER] */ TileLayer({renderer:CANVAS_RENDERER}) { _initRenderer(renderer); _container = new Element.tag("div"); _container ..classes.add("dartkart-layer") ..style.overflow = "hidden"; } /// the tile size used by this tile layer Dimension get tileSize => DEFAULT_TILE_SIZE; @override void attach(MapViewport m) { super.attach(m); var viewportSize = map.viewportSize; var tl = map.topLeftInPage; _container.style ..width="100%" ..height="100%" ..position = "absolute" ..left = "0px" ..top = "0px"; } /// returns a tile URL for the tile at tile coordinates [x], [y] /// in the tile plane at zoom level [zoom] String bindTileToUrl(int x, int y, int zoom); @override void render() { if (!visible) return; _renderer.render(); } }
Extends
Object_PropertyObservable > Layer > TileLayer
Subclasses
Static Properties
Constructors
new TileLayer({renderer: CANVAS_RENDERER}) #
Creates the tile renderer.
Possible values for renderer
- [IMG_GRID_RENDERER] or CANVAS_RENDERER
- an instance of a Renderer
- the default value if missing or null is CANVAS_RENDERER
TileLayer({renderer:CANVAS_RENDERER}) { _initRenderer(renderer); _container = new Element.tag("div"); _container ..classes.add("dartkart-layer") ..style.overflow = "hidden"; }
Properties
String get domId #
the unique layer id
String get domId => _container.attributes["id"];
void set domId(String value) #
Sets the DOM id on the layer container
.
If value is null or empty, sets a default id.
void set domId(String value) { if (value != null) value = value.trim(); if (value == null || value.isEmpty) { value = _defaultDOMId(); } _container.attributes["id"] = value; }
final MapViewport map #
the map this layer is attached to, or null
MapViewport get map => _map;
String get name #
the layer name
String get name { if (_name == null) return _defaultName; return _name; }
void set name(String value) #
sets the layer name. If value is null or consists of white space only, a default name is chosen.
void set name(String value) { if (value != null) value = value.trim(); var old = _name; if (value == null || value.isEmpty) { _name = null; } else { _name = value; } notify("name", old, name); }
final Stream<PropertyChangeEvent> onPropertyChanged #
the stream of property change events
Example
// an observable with a mixed in PropertyObservable
var observable = ...;
// listen for property change events for the property
// 'my_property'
observable.onPropertyChanged
.where((evt) => evt.name == "my_property")
.listen((evt) => print("new value: ${evt.newValue}"));
Stream<PropertyChangeEvent> get onPropertyChanged { //TODO: fix this - if at least one listener is present, // change events are emitted, regardless of whether the // individual listeners are paused or not. Consequence: // lots of change events are possibly queued up in // paused listener streams. => need a custom implementation // of a multiplexing stream which disards events if // they are streamed to a disabled listener // if (_stream == null) { _stream = _controller.stream.asBroadcastStream(); } return _stream; }
void set opacity(num value) #
set the opacity of this layer.
value is a num
in the range
(0.0 - 1.0). The lower the value, the more transparent the layer.
void set opacity(num value) { value = math.max(0, value); value = math.min(value, 1); var oldvalue = _opacity; this._opacity = value.toDouble(); if (oldvalue != this._opacity) { notify("opacity", oldvalue, this._opacity); if (_map != null) { _map.render(); } } }
final Dimension tileSize #
the tile size used by this tile layer
Dimension get tileSize => DEFAULT_TILE_SIZE;
void set visible(bool value) #
sets whether this layer is visible or not
void set visible(bool value) { var old = _visible; if (value != old) { if (_container != null) { _container.style.visibility = value ? "visible" : "hidden"; } _visible = value; notify("visible", old, value); } }
Methods
void attach(MapViewport m) #
Attaches the layer to a map viewport m.
Throws StateError
if this layer is already attached.
@override void attach(MapViewport m) { super.attach(m); var viewportSize = map.viewportSize; var tl = map.topLeftInPage; _container.style ..width="100%" ..height="100%" ..position = "absolute" ..left = "0px" ..top = "0px"; }
abstract String bindTileToUrl(int x, int y, int zoom) #
returns a tile URL for the tile at tile coordinates x, y in the tile plane at zoom level zoom
void detach() #
Detaches this layer from the map viewport it is currently attached to.
void detach(){ _map = null; }
void notify(String property, oldValue, newValue) #
Notifies observers about an update of the property with name property in this object. oldValue was replaced by newValue.
Observers are only notified, provided newValue is different from oldValue and if there is at least one listener.
void notify(String property, oldValue, newValue) { if (oldValue == newValue) return; //TODO: fix me - see notes in onPropertyChanged if (!_controller.hasListener || _controller.isPaused) return; _controller.sink.add( new PropertyChangeEvent(this, property,oldValue,newValue) ); }