5.6 KiB
CLASS HIERARCHY
goog.math.Coordinate // Simple 2D point
goog.math.Coordinate3 | +- TileCoord
goog.math.Box | +- TileBounds // A range of tiles in two dimensions, integer coordinates, z not stored | +- Extent // The extent of a single object in two dimensions, projection not stored | +- Bounds // A range of objects in two dimensions
Projection
goog.events.EventTarget | +- MVCObject | | | +- Camera | | | +- Control | | | | | +- ? | | | +- Layer | | | | | +- TileLayer | | | | | | | +- TMSTileLayer | | | | | | | +- WMTSTileLayer | | | | | | | +- XYZTileLayer / OSMTileLayer | | | | | +- VectorLayer | | | | | +- ImageLayer | | | +- LayerRenderer | | | +- LayerView | | | +- Map | | | +- MapRenderer | | | | | +- HTMLMapRenderer | | | | | +- WebGLMapRenderer | | | +- MVCArray | | | | | +- ControlArray | | | | | +- LayerViewArray | | +- TileQueue | +- Tile
Layer renderer hierarchy
goog.events.EventTarget | +- MVCObject | +- LayerRenderer | +- SingleTileLayerRenderer | | | +- HTMLSingleTileLayerRenderer | | | +- WebGLSingleTileLayerRenderer | +- TileLayerRenderer | | | +- HTMLTileLayerRenderer | | | +- WebGLTileLayerRenderer | +- VectorLayerRenderer | | | +- HTMLVectorLayerRenderer | | | | | +- SVGHTMLVectorLayerRenderer | | | | | +- Canvas2DHTMLVectorLayerRenderer | | | | | +- VMLHTMLVectorLayerRenderer | | | +- WebGLVectorLayerRenderer
OBJECT PROPERTIES AND METHODS
Notation: property type // property with type, trailing ? indicates unsure // getters and setters are assumed to exist f(args) -> type // function taking args returning type f(args) -> type = something // f is a trivial wrapper around something fires 'x' // fires events of type 'x'
Principles: All non-trivial objects inherit from MVCObject All non-trivial collections are either MVCArrays or a child class thereof Resolutions are Array., infinitely scalable resoueces (e.g. vectore layers) have resolutions == null
MVCObject as Google Maps MVCObject freeze() unfreeze()
TileCoord getHash() -> number
Tile tileCoord TileCoord url string state UNLOADED | LOADING | LOADED fires 'loaded' // when loaded fires 'aborted' // when loading is aborted
Camera center goog.math.Coordinate resolution number rotation number
Layer projections Array. extent Extent ? getResolutions() -> Array.|null fires 'change' // when data changes
LayerArray getResolutions() -> Array.|null getMaxResolution() = this.getResolutions()[0] | null
LayerView layer Layer visible boolean opacity number brightness number color number hue number saturation number
Map projection Projection renderer Renderer layers LayerArray addLayer(layer) = layers.push(layer) getExtent() -> Extent getMaxResolution() = layers.getMaxResolution()
TileGrid resolutions Array. extent Extent corner TOP_LEFT | BOTTOM_LEFT origin(s) Coord|Array. tileSize goog.math.Size getTileBounds(z, extent) -> TileBounds getTileCoordCenter(tileCoord) -> goog.math.Coordinate getTileCoord(coordinate) -> TileCoord getTileCoordExtent(tileCoord) -> Extent getZForResolution(resolution) -> number yieldTileCoordChildren(tileCoord, function(z, TileBounds)) yieldTileCoordParents(tileCoord, function(z, TileBounds))
TileLayer tileGrid TileGrid tileUrl function(tileCoord) -> string getTileCoordUrl(tileCoord) -> string = this.tileUrl(tileCoord)
TileQueue camera Camera // or maybe MVCArray. ? getTileCoordPriority(tileCoord) -> number // private enqueueTile(Tile)
VectorLayer yieldFeatures(resolution, extent, projection, function(Feature))
Renderer target HTMLDivElement map Map camera Camera getCapabilities() -> Array. // maybe ?
Question: store tile layer extent in TileLayer or in TileGrid? (not clear) Question: who determines "best" resolution? (static function?)
Todo: if tile layer extent stored in TileLayer rather than TileGrid then extent will occasionally need to be passed to TileGrid functions for cropping
DESIGN ASSERTIONS
-
A map has a renderer (the map renderer).
-
A map has a camera.
-
Multiple maps can share the same camera.
-
A map has a layer list.
-
A layer view stores view-related states for a layer.
-
View-related states include visibility, opacity, saturation, hue, etc.
-
A layer view has a layer.
-
Multiple layer views can share the same layer.
-
In other words a layer can be viewed in different manners.
-
The map renderer responds to events.
-
The map renderer receives events from the camera.
-
The map renderer creates layer renderers.
-
A layer can have multiple projections (the supported projections).
-
A layer advertizes the projections it supports.
-
A layer returns no data if asked data for an unsupported projection.
-
A control may listen to map events.
-
A control may listen to camera events.
-
A map navigation control acts on the camera.
-
Types can be described in MVC terms.
-
Models don't know what rendering means.
-
Maps are models.
-
Layers are models.
-
Layer views are models (sorry!).
-
Cameras are models.
-
Layer lists are collections.
-
Renderers are views.
-
Controls are views or controllers or both.
-
An attribution control is a view.
-
A map navigation control is a controller.
-
A zoom slider control is both a view and a controller.