From 2474429f8c2ba523d9023454711b9616b49f2158 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Thu, 5 Jul 2012 11:28:46 +0200 Subject: [PATCH 001/562] Add initial architecture draft --- doc/ol3.txt | 207 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 207 insertions(+) create mode 100644 doc/ol3.txt diff --git a/doc/ol3.txt b/doc/ol3.txt new file mode 100644 index 0000000000..89a7a7f9d4 --- /dev/null +++ b/doc/ol3.txt @@ -0,0 +1,207 @@ +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 From 1bd975bc23595a25f45d795a1d9da3b6c1f80401 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Lemoine?= Date: Thu, 5 Jul 2012 11:51:05 +0200 Subject: [PATCH 002/562] add design assertions to the doc/ol3.txt doc --- doc/ol3.txt | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/doc/ol3.txt b/doc/ol3.txt index 89a7a7f9d4..d903271750 100644 --- a/doc/ol3.txt +++ b/doc/ol3.txt @@ -205,3 +205,42 @@ 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. From c07d0c668d9806b5086eef5b0d8b180c8d11aae2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Lemoine?= Date: Thu, 5 Jul 2012 12:01:16 +0200 Subject: [PATCH 003/562] change ol3 doc from txt to markdown --- doc/{ol3.txt => ol3.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename doc/{ol3.txt => ol3.md} (100%) diff --git a/doc/ol3.txt b/doc/ol3.md similarity index 100% rename from doc/ol3.txt rename to doc/ol3.md From 3efa392d1f4688434e4122e806220aa19b4bb643 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Lemoine?= Date: Thu, 5 Jul 2012 12:01:27 +0200 Subject: [PATCH 004/562] ol3.md updates --- doc/ol3.md | 34 ++++++++++++++++++++-------------- 1 file changed, 20 insertions(+), 14 deletions(-) diff --git a/doc/ol3.md b/doc/ol3.md index d903271750..2e81ffd114 100644 --- a/doc/ol3.md +++ b/doc/ol3.md @@ -1,6 +1,7 @@ CLASS HIERARCHY =============== +``` goog.math.Coordinate // Simple 2D point @@ -8,7 +9,6 @@ goog.math.Coordinate3 | +- TileCoord - goog.math.Box | +- TileBounds // A range of tiles in two dimensions, integer coordinates, z not stored @@ -66,11 +66,13 @@ goog.events.EventTarget | +- TileQueue | +- Tile +``` Layer renderer hierarchy ------------------------ +``` goog.events.EventTarget | +- MVCObject @@ -100,25 +102,26 @@ goog.events.EventTarget | | +- 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' +- `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 +- All non-trivial objects inherit from `MVCObject`. +- All non-trivial collections are either `MVCArrays` or a child class thereof. +- Resolutions are `Array.`, infinitely scalable resources (e.g. vectore layers) have resolutions == null. +``` MVCObject as Google Maps MVCObject freeze() @@ -198,13 +201,16 @@ Renderer map Map camera Camera getCapabilities() -> Array. // maybe ? +``` + +Questions: + +- Store tile layer extent in TileLayer or in TileGrid? (not clear) +- Who determines "best" resolution? (static function?) -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 +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 ================= From 6f1f9922cce6fa986af215b49e9a1bda9f4d4167 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Lemoine?= Date: Thu, 5 Jul 2012 12:08:06 +0200 Subject: [PATCH 005/562] more structure in doc/ol3.md --- doc/ol3.md | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/doc/ol3.md b/doc/ol3.md index 2e81ffd114..2f38f28275 100644 --- a/doc/ol3.md +++ b/doc/ol3.md @@ -215,29 +215,41 @@ will occasionally need to be passed to TileGrid functions for cropping. DESIGN ASSERTIONS ================= +Map + - 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. +Layer + +- 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. + +LayerView + - 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. +Renderer + - 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. +Control - A control may listen to map events. - A control may listen to camera events. - A map navigation control acts on the camera. +MVC + - Types can be described in MVC terms. - Models don't know what rendering means. - Maps are models. From ed01a5db13a8314e23ab1c4312ec7c62d0b584f9 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Thu, 5 Jul 2012 14:24:06 +0200 Subject: [PATCH 006/562] Ignore build targets --- .gitignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 66d8c7908f..5a441f074c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ +/api.js /build/OpenLayers.js /tools/closure-compiler.jar /tools/*.pyc @@ -6,4 +7,4 @@ /examples/example-list.js /examples/example-list.xml /bin/plovr.jar -/jsdoc/ \ No newline at end of file +/jsdoc/ From 67105b025607d6f758db429075ad27937a8f2316 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Thu, 5 Jul 2012 14:07:09 +0200 Subject: [PATCH 007/562] Don't discard Plovr version --- .gitignore | 2 +- bin/build.xml | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/.gitignore b/.gitignore index 5a441f074c..fa2d94b7a5 100644 --- a/.gitignore +++ b/.gitignore @@ -6,5 +6,5 @@ /doc/apidocs/ /examples/example-list.js /examples/example-list.xml -/bin/plovr.jar +/bin/plovr*.jar /jsdoc/ diff --git a/bin/build.xml b/bin/build.xml index 5c51c4a784..c70e948a9a 100644 --- a/bin/build.xml +++ b/bin/build.xml @@ -6,7 +6,8 @@ - + + @@ -25,7 +26,7 @@ - From 79aa190e303684dbf1f5628aa8f656b3aca19faf Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Thu, 5 Jul 2012 13:28:08 +0200 Subject: [PATCH 008/562] Add Makefile with lint target to use gjslint --- .gitignore | 1 + Makefile | 72 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 73 insertions(+) create mode 100644 Makefile diff --git a/.gitignore b/.gitignore index fa2d94b7a5..c1d4dd47df 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,4 @@ /examples/example-list.xml /bin/plovr*.jar /jsdoc/ +/plovr*.jar diff --git a/Makefile b/Makefile new file mode 100644 index 0000000000..e791429b1e --- /dev/null +++ b/Makefile @@ -0,0 +1,72 @@ +PLOVR_JAR=bin/plovr-4b3caf2b7d84.jar +GSLINT_EXCLUDES= \ + src/api/bounds.js \ + src/api/feature.js \ + src/api/geom/collection.js \ + src/api/geom/geometry.js \ + src/api/geom/linestring.js \ + src/api/geom/multilinestring.js \ + src/api/geom/multipoint.js \ + src/api/geom/point.js \ + src/api/layer/osm.js \ + src/api/layer/wms.js \ + src/api/layer/xyz.js \ + src/api/loc.js \ + src/api/map.js \ + src/api/popup.js \ + src/api/projection.js \ + src/ol/base.js \ + src/ol/Bounds.js \ + src/ol/control/Attribution.js \ + src/ol/control/Control.js \ + src/ol/control/Navigation.js \ + src/ol/control/Zoom.js \ + src/ol/coord/AccessorInterface.js \ + src/ol/event/Drag.js \ + src/ol/event/Events.js \ + src/ol/event/ISequence.js \ + src/ol/event/Scroll.js \ + src/ol/Feature.js \ + src/ol/geom/Collection.js \ + src/ol/geom/Geometry.js \ + src/ol/geom/IGeometry.js \ + src/ol/geom/LineString.js \ + src/ol/geom/MultiLineString.js \ + src/ol/geom/MultiPoint.js \ + src/ol/geom/Point.js \ + src/ol/handler/Drag.js \ + src/ol/layer/Layer.js \ + src/ol/layer/OSM.js \ + src/ol/layer/TileLayer.js \ + src/ol/layer/WMS.js \ + src/ol/layer/XYZ.js \ + src/ol/Loc.js \ + src/ol/Map.js \ + src/ol/Popup.js \ + src/ol/Projection.js \ + src/ol/renderer/Composite.js \ + src/ol/renderer/LayerRenderer.js \ + src/ol/renderer/MapRenderer.js \ + src/ol/renderer/TileLayerRenderer.js \ + src/ol/renderer/WebGL.js \ + src/ol/Tile.js \ + src/ol/TileCache.js \ + src/ol/TileSet.js \ + src/ol/UnreferencedBounds.js \ + src/ol.export.js \ + src/ol.js + +.PHONY: build +build: $(PLOVR_JAR) + java -jar $(PLOVR_JAR) build main.json >api.js + +.PHONY: serve +serve: $(PLOVR_JAR) + java -jar $(PLOVR_JAR) serve main.json + +.PHONY: lint +lint: $(CLOSURE_LINTER) + gjslint --strict $(filter-out $(GSLINT_EXCLUDES),$(shell find src -name \*.js)) + +$(PLOVR_JAR): + curl http://plovr.googlecode.com/files/$(PLOVR_JAR) > $@ From 61038cde5f853bf937cf5c4bb089273435e13a03 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Thu, 5 Jul 2012 13:35:17 +0200 Subject: [PATCH 009/562] Move ol.js and ol.export.js into exports/ol.js --- api.json | 2 +- src/ol.export.js => exports/ol.js | 32 +++++++++++++++++++++++++++++- main.json | 3 +-- src/ol.js | 33 ------------------------------- 4 files changed, 33 insertions(+), 37 deletions(-) rename src/ol.export.js => exports/ol.js (88%) delete mode 100644 src/ol.js diff --git a/api.json b/api.json index 7bd07e492e..a9795133a4 100644 --- a/api.json +++ b/api.json @@ -8,7 +8,7 @@ "(function(){%output%})();" ], - "inputs": "src/ol.export.js", + "inputs": "exports/ol.js", "paths": [ "src" ], diff --git a/src/ol.export.js b/exports/ol.js similarity index 88% rename from src/ol.export.js rename to exports/ol.js index 48f5786f8f..73315a2b6c 100644 --- a/src/ol.export.js +++ b/exports/ol.js @@ -1,4 +1,34 @@ -goog.require("ol"); +goog.require('ol.base'); +goog.require('ol.bounds'); +goog.require('ol.control.Attribution'); +goog.require('ol.control.Navigation'); +goog.require('ol.control.Zoom'); +goog.require('ol.event.Events'); +goog.require('ol.event.Scroll'); +goog.require('ol.handler.Drag'); +goog.require("ol.map"); +goog.require("ol.loc"); +goog.require("ol.feature"); +goog.require("ol.projection"); +goog.require("ol.layer.xyz"); +goog.require("ol.layer.osm"); +goog.require("ol.layer.wms"); +goog.require("ol.popup"); +goog.require("ol.Tile"); +goog.require("ol.TileSet"); +goog.require("ol.TileCache"); +goog.require("ol.geom.geometry"); +goog.require("ol.geom.point"); +goog.require("ol.geom.multipoint"); +goog.require("ol.geom.linestring"); +goog.require("ol.geom.multilinestring"); +goog.require("ol.geom.collection"); +goog.require('ol.layer.XYZ'); +goog.require('ol.layer.OSM'); +goog.require('ol.layer.WMS'); +goog.require('ol.renderer.Composite'); +goog.require('ol.renderer.TileLayerRenderer'); +goog.require('ol.renderer.WebGL'); // ol.map goog.exportSymbol('ol.map', ol.map ); diff --git a/main.json b/main.json index 5e5a6efe1f..b996fd6bbf 100644 --- a/main.json +++ b/main.json @@ -2,8 +2,7 @@ "id": "ol", "inputs": [ - "src/ol.js", - "src/ol.export.js" + "exports/ol.js" ], "paths": [ "src" diff --git a/src/ol.js b/src/ol.js deleted file mode 100644 index f85b363567..0000000000 --- a/src/ol.js +++ /dev/null @@ -1,33 +0,0 @@ -goog.provide("ol"); - -goog.require('ol.base'); -goog.require('ol.bounds'); -goog.require('ol.control.Attribution'); -goog.require('ol.control.Navigation'); -goog.require('ol.control.Zoom'); -goog.require('ol.event.Drag'); -goog.require('ol.event.Events'); -goog.require('ol.event.Scroll'); -goog.require("ol.map"); -goog.require("ol.loc"); -goog.require("ol.feature"); -goog.require("ol.projection"); -goog.require("ol.layer.xyz"); -goog.require("ol.layer.osm"); -goog.require("ol.layer.wms"); -goog.require("ol.popup"); -goog.require("ol.Tile"); -goog.require("ol.TileSet"); -goog.require("ol.TileCache"); -goog.require("ol.geom.geometry"); -goog.require("ol.geom.point"); -goog.require("ol.geom.multipoint"); -goog.require("ol.geom.linestring"); -goog.require("ol.geom.multilinestring"); -goog.require("ol.geom.collection"); -goog.require('ol.layer.XYZ'); -goog.require('ol.layer.OSM'); -goog.require('ol.layer.WMS'); -goog.require('ol.renderer.Composite'); -goog.require('ol.renderer.TileLayerRenderer'); -goog.require('ol.renderer.WebGL'); From 46b4d96fb0a1bbdaf6d66471a466707f9ed20f96 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Thu, 5 Jul 2012 14:00:00 +0200 Subject: [PATCH 010/562] Add all.js for testing --- main.json | 2 +- src/all.js | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 src/all.js diff --git a/main.json b/main.json index b996fd6bbf..5b182158e5 100644 --- a/main.json +++ b/main.json @@ -2,7 +2,7 @@ "id": "ol", "inputs": [ - "exports/ol.js" + "src/all.js" ], "paths": [ "src" diff --git a/src/all.js b/src/all.js new file mode 100644 index 0000000000..77e18e03e6 --- /dev/null +++ b/src/all.js @@ -0,0 +1 @@ +goog.provide('ol'); From 97b062fb73fe8444ea83464018af3f34f7809409 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Thu, 5 Jul 2012 14:29:16 +0200 Subject: [PATCH 011/562] Add ol.MVCObject --- src/all.js | 2 + src/ol/mvcobject.js | 267 +++++++++++++++++++++++ src/ol/mvcobject_test.js | 450 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 719 insertions(+) create mode 100644 src/ol/mvcobject.js create mode 100644 src/ol/mvcobject_test.js diff --git a/src/all.js b/src/all.js index 77e18e03e6..cb8130d6f3 100644 --- a/src/all.js +++ b/src/all.js @@ -1 +1,3 @@ goog.provide('ol'); + +goog.require('ol.MVCObject'); diff --git a/src/ol/mvcobject.js b/src/ol/mvcobject.js new file mode 100644 index 0000000000..a62738b516 --- /dev/null +++ b/src/ol/mvcobject.js @@ -0,0 +1,267 @@ + +/** + * @fileoverview An implementation of Google Maps' MVCObject. + * @see https://developers.google.com/maps/articles/mvcfun + * @see https://developers.google.com/maps/documentation/javascript/reference + */ + +goog.provide('ol.MVCObject'); + +goog.require('goog.array'); +goog.require('goog.events'); +goog.require('goog.events.EventTarget'); +goog.require('goog.object'); + + +/** + * @typedef {{target: ol.MVCObject, key: string}} + */ +ol.MVCObjectAccessor; + + + +/** + * @constructor + * @extends {goog.events.EventTarget} + */ +ol.MVCObject = function() { + goog.base(this); +}; +goog.inherits(ol.MVCObject, goog.events.EventTarget); + + +/** + * @param {string} str String. + * @return {string} Capitalized string. + */ +ol.MVCObject.capitalize = function(str) { + return str.substr(0, 1).toUpperCase() + str.substr(1); +}; + + +/** + * @param {ol.MVCObject|Object} arg Argument. + * @return {ol.MVCObject} MVCObject. + */ +ol.MVCObject.create = function(arg) { + if (arg instanceof ol.MVCObject) { + return arg; + } else { + var mvcObject = new ol.MVCObject(); + mvcObject.setOptions(arg); + return mvcObject; + } +}; + + +/** + * @private + * @type {Object.} + */ +ol.MVCObject.getterNameCache_ = {}; + + +/** + * @param {string} str String. + * @private + * @return {string} Capitalized string. + */ +ol.MVCObject.getGetterName_ = function(str) { + return ol.MVCObject.getterNameCache_[str] || + (ol.MVCObject.getterNameCache_[str] = + 'get' + ol.MVCObject.capitalize(str)); +}; + + +/** + * @private + * @type {Object.} + */ +ol.MVCObject.setterNameCache_ = {}; + + +/** + * @param {string} str String. + * @private + * @return {string} Capitalized string. + */ +ol.MVCObject.getSetterName_ = function(str) { + return ol.MVCObject.setterNameCache_[str] || + (ol.MVCObject.setterNameCache_[str] = + 'set' + ol.MVCObject.capitalize(str)); +}; + + +/** + * @param {ol.MVCObject} obj Object. + * @return {Object.} Accessors. + */ +ol.MVCObject.getAccessors = function(obj) { + return obj['gm_accessors_'] || (obj['gm_accessors_'] = {}); +}; + + +/** + * @param {ol.MVCObject} obj Object. + * @return {Object.} Listeners. + */ +ol.MVCObject.getListeners = function(obj) { + return obj['gm_bindings_'] || (obj['gm_bindings_'] = {}); +}; + + +/** + * @param {string} key Key. + * @param {ol.MVCObject} target Target. + * @param {string=} opt_targetKey Target key. + * @param {boolean=} opt_noNotify No notify. + */ +ol.MVCObject.prototype.bindTo = + function(key, target, opt_targetKey, opt_noNotify) { + var targetKey = goog.isDef(opt_targetKey) ? opt_targetKey : key; + this.unbind(key); + var eventType = targetKey.toLowerCase() + '_changed'; + var listeners = ol.MVCObject.getListeners(this); + listeners[key] = goog.events.listen(target, eventType, function() { + this.notifyInternal_(key); + }, undefined, this); + var accessors = ol.MVCObject.getAccessors(this); + accessors[key] = {target: target, key: targetKey}; + var noNotify = goog.isDef(opt_noNotify) ? opt_noNotify : false; + if (!noNotify) { + this.notifyInternal_(key); + } +}; + + +/** + * @param {string} key Key. + */ +ol.MVCObject.prototype.changed = function(key) { +}; + + +/** + * @param {string} key Key. + * @return {*} Value. + */ +ol.MVCObject.prototype.get = function(key) { + var accessors = ol.MVCObject.getAccessors(this); + if (goog.object.containsKey(accessors, key)) { + var accessor = accessors[key]; + var target = accessor.target; + var targetKey = accessor.key; + var getterName = ol.MVCObject.getGetterName_(targetKey); + if (target[getterName]) { + return target[getterName](); + } else { + return target.get(targetKey); + } + } else { + return this[key]; + } +}; + + +/** + * @param {string} key Key. + */ +ol.MVCObject.prototype.notify = function(key) { + var accessors = ol.MVCObject.getAccessors(this); + if (goog.object.containsKey(accessors, key)) { + var accessor = accessors[key]; + var target = accessor.target; + var targetKey = accessor.key; + target.notify(targetKey); + } else { + this.notifyInternal_(key); + } +}; + + +/** + * @param {string} key Key. + * @private + */ +ol.MVCObject.prototype.notifyInternal_ = function(key) { + var changedMethodName = key + '_changed'; + if (this[changedMethodName]) { + this[changedMethodName](); + } else { + this.changed(key); + } + var eventType = key.toLowerCase() + '_changed'; + this.dispatchEvent(eventType); +}; + + +/** + * @param {string} key Key. + * @param {*} value Value. + */ +ol.MVCObject.prototype.set = function(key, value) { + var accessors = ol.MVCObject.getAccessors(this); + if (goog.object.containsKey(accessors, key)) { + var accessor = accessors[key]; + var target = accessor.target; + var targetKey = accessor.key; + var setterName = ol.MVCObject.getSetterName_(targetKey); + if (target[setterName]) { + target[setterName](value); + } else { + target.set(targetKey, value); + } + } else { + this[key] = value; + this.notifyInternal_(key); + } +}; + + +/** + * @param {Object.} options Options. + */ +ol.MVCObject.prototype.setOptions = function(options) { + goog.object.forEach(options, function(value, key) { + var setterName = ol.MVCObject.getSetterName_(key); + if (this[setterName]) { + this[setterName](value); + } else { + this.set(key, value); + } + }, this); +}; + + +/** + * @param {Object.} values Values. + */ +ol.MVCObject.prototype.setValues = ol.MVCObject.prototype.setOptions; + + +/** + * @param {string} key Key. + */ +ol.MVCObject.prototype.unbind = function(key) { + var listeners = ol.MVCObject.getListeners(this); + var listener = listeners[key]; + if (listener) { + delete listeners[key]; + goog.events.unlistenByKey(listener); + var value = this.get(key); + var accessors = ol.MVCObject.getAccessors(this); + delete accessors[key]; + this[key] = value; + } +}; + + +/** + */ +ol.MVCObject.prototype.unbindAll = function() { + var listeners = ol.MVCObject.getListeners(this); + var keys = goog.object.getKeys(listeners); + goog.array.forEach(keys, function(key) { + this.unbind(key); + }, this); +}; diff --git a/src/ol/mvcobject_test.js b/src/ol/mvcobject_test.js new file mode 100644 index 0000000000..594987e3d0 --- /dev/null +++ b/src/ol/mvcobject_test.js @@ -0,0 +1,450 @@ +goog.require('goog.testing.jsunit'); +goog.require('ol.MVCObject'); + + +function testModel() { + var m = new ol.MVCObject(); + assertNotNullNorUndefined(m); +} + + +function testGetUndefined() { + var m = new ol.MVCObject(); + assertUndefined(m.get('k')); +} + + +function testGetSetGet() { + var m = new ol.MVCObject(); + assertUndefined(m.get('k')); + m.set('k', 1); + assertEquals(1, m.get('k')); +} + + +function testSetValues() { + var m = new ol.MVCObject(); + m.setValues({ + k1: 1, + k2: 2 + }); + assertEquals(1, m.get('k1')); + assertEquals(2, m.get('k2')); +} + +function testNotifyCallback() { + var m = new ol.MVCObject(); + var callbackCalled; + m.changed = function() { + callbackCalled = true; + }; + m.notify('k'); + assertTrue(callbackCalled); +} + + +function testNotifyKeyCallback() { + var m = new ol.MVCObject(); + var callbackCalled = false; + m.k_changed = function() { + callbackCalled = true; + }; + m.notify('k'); + assertTrue(callbackCalled); +} + + +function testNotifyKeyEvent() { + var m = new ol.MVCObject(); + var eventDispatched = false; + goog.events.listen(m, 'k_changed', function() { + eventDispatched = true; + }); + m.notify('k'); + assertTrue(eventDispatched); +} + + +function testSetNotifyCallback() { + var m = new ol.MVCObject(); + var callbackCalled; + m.changed = function() { + callbackCalled = true; + }; + m.set('k', 1); + assertTrue(callbackCalled); +} + + +function testSetNotifyKeyCallback() { + var m = new ol.MVCObject(); + var callbackCalled = false; + m.k_changed = function(v) { + callbackCalled = true; + }; + m.set('k', 1); + assertTrue(callbackCalled); +} + + +function testBindSetNotifyKeyCallback() { + var m = new ol.MVCObject(); + var n = new ol.MVCObject(); + var callbackCalled = false; + n.k_changed = function(v) { + callbackCalled = true; + }; + n.bindTo('k', m); + m.set('k', 1); + assertTrue(callbackCalled); +} + + +function testSetNotifyKeyEvent() { + var m = new ol.MVCObject(); + var eventDispatched = false; + goog.events.listen(m, 'k_changed', function() { + eventDispatched = true; + }); + m.set('k', 1); + assertTrue(eventDispatched); +} + + +function testSetBind() { + var m = new ol.MVCObject(); + var n = new ol.MVCObject(); + m.set('k', 1); + assertEquals(1, m.get('k')); + assertUndefined(n.get('k')); + n.bindTo('k', m); + assertEquals(1, m.get('k')); + assertEquals(1, n.get('k')); +} + + +function testBindSet() { + var m = new ol.MVCObject(); + var n = new ol.MVCObject(); + n.bindTo('k', m); + m.set('k', 1); + assertEquals(1, m.get('k')); + assertEquals(1, n.get('k')); +} + + +function testBindSetBackwards() { + var m = new ol.MVCObject(); + var n = new ol.MVCObject(); + n.bindTo('k', m); + n.set('k', 1); + assertEquals(1, m.get('k')); + assertEquals(1, n.get('k')); +} + + +function testSetBindBackwards() { + var m = new ol.MVCObject(); + var n = new ol.MVCObject(); + n.set('k', 1); + n.bindTo('k', m); + assertUndefined(m.get('k')); + assertUndefined(n.get('k')); +} + + +function testBindSetUnbind() { + var m = new ol.MVCObject(); + var n = new ol.MVCObject(); + n.bindTo('k', m); + n.set('k', 1); + assertEquals(1, m.get('k')); + assertEquals(1, n.get('k')); + n.unbind('k'); + assertEquals(1, m.get('k')); + assertEquals(1, n.get('k')); + n.set('k', 2); + assertEquals(1, m.get('k')); + assertEquals(2, n.get('k')); +} + + +function testUnbindAll() { + var m = new ol.MVCObject(); + var n = new ol.MVCObject(); + n.bindTo('k', m); + n.set('k', 1); + assertEquals(m.get('k'), 1); + assertEquals(n.get('k'), 1); + n.unbindAll(); + assertEquals(m.get('k'), 1); + assertEquals(n.get('k'), 1); + n.set('k', 2); + assertEquals(m.get('k'), 1); + assertEquals(n.get('k'), 2); +} + + +function testBindNotify() { + var m = new ol.MVCObject(); + var n = new ol.MVCObject(); + m.bindTo('k', n); + mCallbackCalled = false; + m.k_changed = function() { + mCallbackCalled = true; + }; + nCallbackCalled = false; + n.k_changed = function() { + nCallbackCalled = true; + }; + n.set('k', 1); + assertTrue(mCallbackCalled); + assertTrue(nCallbackCalled); +} + + +function testBindBackwardsNotify() { + var m = new ol.MVCObject(); + var n = new ol.MVCObject(); + n.bindTo('k', m); + mCallbackCalled = false; + m.k_changed = function() { + mCallbackCalled = true; + }; + nCallbackCalled = false; + n.k_changed = function() { + nCallbackCalled = true; + }; + n.set('k', 1); + assertTrue(mCallbackCalled); + assertTrue(nCallbackCalled); +} + + +function testBindRename() { + var m = new ol.MVCObject(); + var n = new ol.MVCObject(); + n.bindTo('kn', m, 'km'); + m.set('km', 1); + assertEquals(m.get('km'), 1); + assertEquals(n.get('kn'), 1); +} + + +function testBindRenameCallbacks() { + var m = new ol.MVCObject(); + var n = new ol.MVCObject(); + var kmCallbackCalled = false; + m.km_changed = function() { + kmCallbackCalled = true; + }; + var knCallbackCalled = false; + n.kn_changed = function() { + knCallbackCalled = true; + }; + n.bindTo('kn', m, 'km'); + m.set('km', 1); + assertEquals(m.get('km'), 1); + assertEquals(n.get('kn'), 1); + assertTrue(kmCallbackCalled); + assertTrue(knCallbackCalled); +} + + +function testTransitiveBindForwards() { + var m = new ol.MVCObject(); + var n = new ol.MVCObject(); + var o = new ol.MVCObject(); + n.bindTo('kn', m, 'km'); + o.bindTo('ko', n, 'kn'); + m.set('km', 1); + assertEquals(1, m.get('km')); + assertEquals(1, n.get('kn')); + assertEquals(1, o.get('ko')); +} + + +function testTransitiveBindBackwards() { + var m = new ol.MVCObject(); + var n = new ol.MVCObject(); + var o = new ol.MVCObject(); + n.bindTo('kn', m, 'km'); + o.bindTo('ko', n, 'kn'); + o.set('ko', 1); + assertEquals(1, m.get('km')); + assertEquals(1, n.get('kn')); + assertEquals(1, o.get('ko')); +} + + +function testInheritance() { + var C = function() {}; + C.prototype = new ol.MVCObject(); + var callbackCalled; + C.prototype.k_changed = function() { + callbackCalled = true; + }; + var c = new C(); + c.set('k', 1); + assertEquals(1, c.get('k')); + assertTrue(callbackCalled); +} + + +function testMrideyAccessors() { + // http://blog.mridey.com/2010/03/maps-javascript-api-v3-more-about.html + var a = new ol.MVCObject(); + a.set('level', 2); + assertEquals(2, a.get('level')); + var b = new ol.MVCObject(); + b.setValues({ + level: 2, + index: 3, + description: 'Hello world.' + }); + assertEquals(3, b.get('index')); +} + + +function testMrideyBinding() { + // http://blog.mridey.com/2010/03/maps-javascript-api-v3-more-about.html + var a = new ol.MVCObject(); + a.set('level', 2); + var b = new ol.MVCObject(); + b.bindTo('index', a, 'level'); + assertEquals(2, b.get('index')); + a.set('level', 3); + assertEquals(3, b.get('index')); + b.set('index', 4); + assertEquals(4, a.get('level')); + var c = new ol.MVCObject(); + c.bindTo('zoom', a, 'level'); + assertEquals(4, c.get('zoom')); + b.unbind('index'); + assertEquals(4, b.get('index')); + c.set('zoom', 5); + assertEquals(5, a.get('level')); + assertEquals(4, b.get('index')); +} + + +function testCircularBind() { + var a = new ol.MVCObject(); + var b = new ol.MVCObject(); + a.bindTo('k', b); + assertThrows(function() { + b.bindTo('k', a); + }); +} + + +function testPriority() { + var a = new ol.MVCObject(); + var b = new ol.MVCObject(); + a.set('k', 1); + b.set('k', 2); + a.bindTo('k', b); + assertEquals(2, a.get('k')); + assertEquals(2, b.get('k')); +} + + +function testPriorityUndefined() { + var a = new ol.MVCObject(); + var b = new ol.MVCObject(); + a.set('k', 1); + a.bindTo('k', b); + assertUndefined(a.get('k')); + assertUndefined(b.get('k')); +} + + +function testSetter() { + var a = new ol.MVCObject(); + var x; + var setterCalled; + a.setX = function(value) { + this.x = value; + setterCalled = true; + }; + a.set('x', 1); + assertEquals(1, a.get('x')); + assertUndefined(setterCalled); +} + + +function testSetterBind() { + var a = new ol.MVCObject(); + var x; + var setterCalled; + a.setX = function(value) { + this.x = value; + setterCalled = true; + }; + var b = new ol.MVCObject(); + b.bindTo('x', a); + b.set('x', 1); + assertEquals(1, a.get('x')); + assertEquals(1, b.get('x')); + assertTrue(setterCalled); +} + + +function testGetter() { + var a = new ol.MVCObject(); + var getterCalled; + a.getX = function() { + getterCalled = true; + return 1; + }; + assertUndefined(a.get('x')); + assertUndefined(getterCalled); +} + + +function testGetterBind() { + var a = new ol.MVCObject(); + var getterCalled; + a.getX = function() { + getterCalled = true; + return 1; + }; + var b = new ol.MVCObject(); + b.bindTo('x', a); + assertEquals(1, b.get('x')); + assertTrue(getterCalled); +} + + +function testBindSelf() { + var a = new ol.MVCObject(); + assertThrows(function() { + a.bindTo('k', a); + }); +} + + +function testChangedKey() { + var a = new ol.MVCObject(); + var changedKey; + a.changed = function(key) { + changedKey = key; + }; + a.set('k', 1); + assertEquals('k', changedKey); +} + + +function testCreateFromObject() { + var obj = {k: 1}; + var mvcObject = ol.MVCObject.create(obj); + assertTrue(mvcObject instanceof ol.MVCObject); + assertEquals(1, mvcObject.get('k')); +} + + +function testCreateFromMVCObject() { + var mvcObject1 = new ol.MVCObject(); + var mvcObject2 = ol.MVCObject.create(mvcObject1); + assertTrue(mvcObject2 === mvcObject1); +} From b4e2e45166fbf232e01353b2a789bfacae9a25cf Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Thu, 5 Jul 2012 14:29:29 +0200 Subject: [PATCH 012/562] Add ol.MVCArray --- src/all.js | 1 + src/ol/mvcarray.js | 218 ++++++++++++++++++++++++++++++++++++++++ src/ol/mvcarray_test.js | 162 +++++++++++++++++++++++++++++ 3 files changed, 381 insertions(+) create mode 100644 src/ol/mvcarray.js create mode 100644 src/ol/mvcarray_test.js diff --git a/src/all.js b/src/all.js index cb8130d6f3..9c54b54632 100644 --- a/src/all.js +++ b/src/all.js @@ -1,3 +1,4 @@ goog.provide('ol'); goog.require('ol.MVCObject'); +goog.require('ol.MVCArray'); diff --git a/src/ol/mvcarray.js b/src/ol/mvcarray.js new file mode 100644 index 0000000000..98e3abc252 --- /dev/null +++ b/src/ol/mvcarray.js @@ -0,0 +1,218 @@ + +/** + * @fileoverview An implementation of Google Maps' MVCArray. + * @see https://developers.google.com/maps/documentation/javascript/reference + */ + +goog.provide('ol.MVCArray'); +goog.provide('ol.MVCArrayEvent'); +goog.provide('ol.MVCArrayEventType'); + +goog.require('goog.array'); +goog.require('goog.asserts'); +goog.require('goog.events.Event'); +goog.require('ol.MVCObject'); + + +/** + * @enum {string} + */ +ol.MVCArrayEventType = { + INSERT_AT: 'insert_at', + REMOVE_AT: 'remove_at', + SET_AT: 'set_at' +}; + + + +/** + * @constructor + * @extends {goog.events.Event} + * @param {ol.MVCArrayEventType} type Type. + * @param {number} index Index. + * @param {*=} opt_prev Value. + * @param {Object=} opt_target Target. + */ +ol.MVCArrayEvent = function(type, index, opt_prev, opt_target) { + + goog.base(this, type, opt_target); + + /** + * @type {number} + */ + this.index = index; + + /** + * @type {*} + */ + this.prev = opt_prev; + +}; +goog.inherits(ol.MVCArrayEvent, goog.events.Event); + + + +/** + * @constructor + * @extends {ol.MVCObject} + * @param {Array=} opt_array Array. + */ +ol.MVCArray = function(opt_array) { + + goog.base(this); + + /** + * @private + * @type {Array} + */ + this.array_ = goog.isDefAndNotNull(opt_array) ? opt_array : []; + + this.updateLength_(); + +}; +goog.inherits(ol.MVCArray, ol.MVCObject); + + +/** + * @const + * @type {string} + */ +ol.MVCArray.LENGTH = 'length'; + + +/** + * @param {ol.MVCArray|Array} arg Argument. + * @return {ol.MVCArray} MVCArray. + */ +ol.MVCArray.create = function(arg) { + if (arg instanceof ol.MVCArray) { + return arg; + } else { + return new ol.MVCArray(arg); + } +}; + + +/** + */ +ol.MVCArray.prototype.clear = function() { + while (this[ol.MVCArray.LENGTH]) { + this.pop(); + } +}; + + +/** + * @param {function(*, number)} callback Callback. + */ +ol.MVCArray.prototype.forEach = function(callback) { + goog.array.forEach(this.array_, callback); +}; + + +/** + * @return {Array} Array. + */ +ol.MVCArray.prototype.getArray = function() { + return this.array_; +}; + + +/** + * @param {number} index Index. + * @return {*} Element. + */ +ol.MVCArray.prototype.getAt = function(index) { + return this.array_[index]; +}; + + +/** + * @return {number} Length. + */ +ol.MVCArray.prototype.getLength = function() { + return /** @type {number} */ (this.get(ol.MVCArray.LENGTH)); +}; + + +/** + * @param {number} index Index. + * @param {*} elem Element. + */ +ol.MVCArray.prototype.insertAt = function(index, elem) { + goog.array.insertAt(this.array_, elem, index); + this.updateLength_(); + this.dispatchEvent(new ol.MVCArrayEvent( + ol.MVCArrayEventType.INSERT_AT, index, undefined, this)); + if (this[ol.MVCArrayEventType.INSERT_AT]) { + this[ol.MVCArrayEventType.INSERT_AT](index); + } +}; + + +/** + * @return {*} Element. + */ +ol.MVCArray.prototype.pop = function() { + return this.removeAt(this.getLength() - 1); +}; + + +/** + * @param {*} elem Element. + * @return {number} Length. + */ +ol.MVCArray.prototype.push = function(elem) { + var n = this.array_.length; + this.insertAt(n, elem); + return n; +}; + + +/** + * @param {number} index Index. + * @return {*} Value. + */ +ol.MVCArray.prototype.removeAt = function(index) { + var prev = this.array_[index]; + goog.array.removeAt(this.array_, index); + this.updateLength_(); + this.dispatchEvent(new ol.MVCArrayEvent(ol.MVCArrayEventType.REMOVE_AT, + index, prev, this)); + if (this[ol.MVCArrayEventType.REMOVE_AT]) { + this[ol.MVCArrayEventType.REMOVE_AT](index); + } + return prev; +}; + + +/** + * @param {number} index Index. + * @param {*} elem Element. + */ +ol.MVCArray.prototype.setAt = function(index, elem) { + var n = this[ol.MVCArray.LENGTH]; + if (index < n) { + var prev = this.array_[index]; + this.array_[index] = elem; + this.dispatchEvent(new ol.MVCArrayEvent(ol.MVCArrayEventType.SET_AT, + index, prev, this)); + if (this[ol.MVCArrayEventType.SET_AT]) { + this[ol.MVCArrayEventType.SET_AT](index, prev); + } + } else { + var j; + for (j = n; j < index; ++j) { + this.insertAt(j, undefined); + } + this.insertAt(index, elem); + } +}; + + +/** + * @private + */ +ol.MVCArray.prototype.updateLength_ = function() { + this.set('length', this.array_.length); +}; diff --git a/src/ol/mvcarray_test.js b/src/ol/mvcarray_test.js new file mode 100644 index 0000000000..bb41c2b7ba --- /dev/null +++ b/src/ol/mvcarray_test.js @@ -0,0 +1,162 @@ +goog.require('goog.array'); +goog.require('goog.testing.jsunit'); +goog.require('ol.MVCArray'); +goog.require('ol.MVCArrayEventType'); + + +function testEmpty() { + var a = new ol.MVCArray(); + assertEquals(0, a.getLength()); + assertTrue(goog.array.equals(a.getArray(), [])); + assertUndefined(a.getAt(0)); +} + + +function testConstruct() { + var array = [0, 1, 2]; + var a = new ol.MVCArray(array); + assertEquals(0, a.getAt(0)); + assertEquals(1, a.getAt(1)); + assertEquals(2, a.getAt(2)); +} + + +function testPush() { + var a = new ol.MVCArray(); + a.push(1); + assertEquals(1, a.getLength()); + assertTrue(goog.array.equals(a.getArray(), [1])); + assertEquals(1, a.getAt(0)); +} + + +function testPushPop() { + var a = new ol.MVCArray(); + a.push(1); + a.pop(); + assertEquals(0, a.getLength()); + assertTrue(goog.array.equals(a.getArray(), [])); + assertUndefined(a.getAt(0)); +} + + +function testInsertAt() { + var a = new ol.MVCArray([0, 2]); + a.insertAt(1, 1); + assertEquals(0, a.getAt(0)); + assertEquals(1, a.getAt(1)); + assertEquals(2, a.getAt(2)); +} + + +function testSetAt() { + var a = new ol.MVCArray(); + a.setAt(1, 1); + assertEquals(2, a.getLength()); + assertUndefined(a.getAt(0)); + assertEquals(1, a.getAt(1)); +} + + +function testRemoveAt() { + var a = new ol.MVCArray([0, 1, 2]); + a.removeAt(1); + assertEquals(0, a.getAt(0)); + assertEquals(2, a.getAt(1)); +} + + +function testForEachEmpty() { + var a = new ol.MVCArray(); + var forEachCalled = false; + a.forEach(function() { + forEachCalled = true; + }); + assertFalse(forEachCalled); +} + + +function testForEachPopulated() { + var a = new ol.MVCArray(); + a.push(1); + a.push(2); + var forEachCount = 0; + a.forEach(function() { + ++forEachCount; + }); + assertEquals(2, forEachCount); +} + + +function testSetAtEvent() { + var a = new ol.MVCArray(['a', 'b']); + var index, prev; + goog.events.listen(a, ol.MVCArrayEventType.SET_AT, function(e) { + index = e.index; + prev = e.prev; + }); + a.setAt(1, 1); + assertEquals(1, index); + assertEquals('b', prev); +} + + +function testRemoveAtEvent() { + var a = new ol.MVCArray(['a']); + var index, prev; + goog.events.listen(a, ol.MVCArrayEventType.REMOVE_AT, function(e) { + index = e.index; + prev = e.prev; + }); + a.pop(); + assertEquals(0, index); + assertEquals('a', prev); +} + + +function testInsertAtEvent() { + var a = new ol.MVCArray([0, 2]); + var index; + goog.events.listen(a, ol.MVCArrayEventType.INSERT_AT, function(e) { + index = e.index; + }); + a.insertAt(1, 1); + assertEquals(1, index); +} + + +function testSetAtBeyondEnd() { + var a = new ol.MVCArray(); + var inserts = []; + a.insert_at = function(index) { + inserts.push(index); + }; + a.setAt(2, 0); + assertEquals(3, a.getLength()); + assertUndefined(a.getAt(0)); + assertUndefined(a.getAt(1)); + assertEquals(0, a.getAt(2)); + assertEquals(3, inserts.length); + assertEquals(0, inserts[0]); + assertEquals(1, inserts[1]); + assertEquals(2, inserts[2]); +} + + +function testCreateFromArray() { + var a = [0, 1, 2]; + var mvcArray = ol.MVCArray.create(a); + assertTrue(mvcArray instanceof ol.MVCArray); + assertEquals(3, mvcArray.getLength()); + assertEquals(0, mvcArray.getAt(0)); + assertEquals(1, mvcArray.getAt(1)); + assertEquals(2, mvcArray.getAt(2)); +} + + +function testCreateFromMVCArray() { + var mvcArray1 = new ol.MVCArray(); + var mvcArray2 = ol.MVCArray.create(mvcArray1); + assertTrue(mvcArray1 === mvcArray2); + +} From 9f0738aa99e57d7da56887aff425e70b86ddcc96 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Thu, 5 Jul 2012 14:31:03 +0200 Subject: [PATCH 013/562] Add ol.TileCoord --- doc/ol3.md | 3 --- src/all.js | 1 + src/ol/tilecoord.js | 32 ++++++++++++++++++++++++++++++++ src/ol/tilecoord_test.js | 17 +++++++++++++++++ 4 files changed, 50 insertions(+), 3 deletions(-) create mode 100644 src/ol/tilecoord.js create mode 100644 src/ol/tilecoord_test.js diff --git a/doc/ol3.md b/doc/ol3.md index 2f38f28275..de3c368326 100644 --- a/doc/ol3.md +++ b/doc/ol3.md @@ -3,9 +3,6 @@ CLASS HIERARCHY ``` goog.math.Coordinate // Simple 2D point - - -goog.math.Coordinate3 | +- TileCoord diff --git a/src/all.js b/src/all.js index 9c54b54632..47a9231ed7 100644 --- a/src/all.js +++ b/src/all.js @@ -2,3 +2,4 @@ goog.provide('ol'); goog.require('ol.MVCObject'); goog.require('ol.MVCArray'); +goog.require('ol.TileCoord'); diff --git a/src/ol/tilecoord.js b/src/ol/tilecoord.js new file mode 100644 index 0000000000..9651586460 --- /dev/null +++ b/src/ol/tilecoord.js @@ -0,0 +1,32 @@ +goog.provide('ol.TileCoord'); + +goog.require('goog.math.Coordinate'); + + + +/** + * @constructor + * @extends {goog.math.Coordinate} + * @param {number} z Z. + * @param {number} x X. + * @param {number} y Y. + */ +ol.TileCoord = function(z, x, y) { + + goog.base(this, x, y); + + /** + * @type {number} + */ + this.z = z; + +}; +goog.inherits(ol.TileCoord, goog.math.Coordinate); + + +/** + * @return {number} Hash. + */ +ol.TileCoord.prototype.hash = function() { + return (this.x << this.z) + this.y; +}; diff --git a/src/ol/tilecoord_test.js b/src/ol/tilecoord_test.js new file mode 100644 index 0000000000..d017085fa5 --- /dev/null +++ b/src/ol/tilecoord_test.js @@ -0,0 +1,17 @@ +goog.require('goog.testing.jsunit'); +goog.require('ol.TileCoord'); + + +function testConstructorOrderZXY() { + var tc1 = new ol.TileCoord(1, 2, 3); + assertEquals(1, tc1.z); + assertEquals(2, tc1.x); + assertEquals(3, tc1.y); +} + + +function testHashX() { + var tc1 = new ol.TileCoord(3, 2, 1); + var tc2 = new ol.TileCoord(3, 1, 1); + assertTrue(tc1.hash() != tc2.hash()); +} From a3322aa9e116d4a05a9359a847526af477ab8297 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Thu, 5 Jul 2012 14:38:45 +0200 Subject: [PATCH 014/562] Add ol.TileBounds --- src/all.js | 3 ++- src/ol/tilebounds.js | 43 +++++++++++++++++++++++++++++++++++++++ src/ol/tilebounds_test.js | 36 ++++++++++++++++++++++++++++++++ 3 files changed, 81 insertions(+), 1 deletion(-) create mode 100644 src/ol/tilebounds.js create mode 100644 src/ol/tilebounds_test.js diff --git a/src/all.js b/src/all.js index 47a9231ed7..62e738a54e 100644 --- a/src/all.js +++ b/src/all.js @@ -1,5 +1,6 @@ goog.provide('ol'); -goog.require('ol.MVCObject'); goog.require('ol.MVCArray'); +goog.require('ol.MVCObject'); +goog.require('ol.TileBounds'); goog.require('ol.TileCoord'); diff --git a/src/ol/tilebounds.js b/src/ol/tilebounds.js new file mode 100644 index 0000000000..efe576df84 --- /dev/null +++ b/src/ol/tilebounds.js @@ -0,0 +1,43 @@ +goog.provide('ol.TileBounds'); + +goog.require('goog.asserts'); +goog.require('goog.math.Box'); +goog.require('ol.TileCoord'); + + + +/** + * @constructor + * @extends {goog.math.Box} + * @param {number} top Top. + * @param {number} right Right. + * @param {number} bottom Bottom. + * @param {number} left Left. + */ +ol.TileBounds = function(top, right, bottom, left) { + + goog.base(this, top, right, bottom, left); + +}; +goog.inherits(ol.TileBounds, goog.math.Box); + + +/** + * @param {...ol.TileCoord} var_args Tile coordinates. + * @return {!ol.TileBounds} Bounding tile box. + */ +ol.TileBounds.boundingTileBounds = function(var_args) { + var tileCoord0 = arguments[0]; + var tileBounds = new ol.TileBounds(tileCoord0.y, tileCoord0.x, + tileCoord0.y, tileCoord0.x); + var i; + for (i = 1; i < arguments.length; ++i) { + var tileCoord = arguments[i]; + goog.asserts.assert(tileCoord.z == tileCoord0.z); + tileBounds.top = Math.min(tileBounds.top, tileCoord.y); + tileBounds.right = Math.max(tileBounds.right, tileCoord.x); + tileBounds.bottom = Math.max(tileBounds.bottom, tileCoord.y); + tileBounds.left = Math.min(tileBounds.left, tileCoord.x); + } + return tileBounds; +}; diff --git a/src/ol/tilebounds_test.js b/src/ol/tilebounds_test.js new file mode 100644 index 0000000000..842eb1ab34 --- /dev/null +++ b/src/ol/tilebounds_test.js @@ -0,0 +1,36 @@ +goog.require('goog.testing.jsunit'); +goog.require('ol.TileBounds'); + + +function testContainsPositive() { + var tb = new ol.TileBounds(0, 2, 2, 0); + var tc = new ol.TileCoord(3, 1, 1); + assertTrue(tb.contains(tc)); +} + + +function testContainsNegative() { + var tb = new ol.TileBounds(0, 2, 2, 0); + var tc = new ol.TileCoord(3, 1, 3); + assertFalse(tb.contains(tc)); +} + + +function testBoundingTileBounds() { + var tb = new ol.TileBounds.boundingTileBounds( + new ol.TileCoord(3, 1, 3), + new ol.TileCoord(3, 2, 0)); + assertEquals(tb.top, 0); + assertEquals(tb.right, 2); + assertEquals(tb.bottom, 3); + assertEquals(tb.left, 1); +} + + +function testBoundingTileBoundsMixedZ() { + assertThrows(function() { + var tb = new ol.TileBounds.boundingTileBounds( + new ol.TileCoord(3, 1, 3), + new ol.TileCoord(4, 2, 0)); + }); +} From 6ced2b58153640f7c66c375b699c9e8cfcebf0ce Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Thu, 5 Jul 2012 14:43:04 +0200 Subject: [PATCH 015/562] Update ol.Bounds, remove referenced/unreferenced bounds distinction --- Makefile | 2 - src/all.js | 1 + src/ol/Bounds.js | 105 ---------------------------- src/ol/UnreferencedBounds.js | 130 ----------------------------------- src/ol/bounds.js | 20 ++++++ 5 files changed, 21 insertions(+), 237 deletions(-) delete mode 100644 src/ol/Bounds.js delete mode 100644 src/ol/UnreferencedBounds.js create mode 100644 src/ol/bounds.js diff --git a/Makefile b/Makefile index e791429b1e..0880a60ece 100644 --- a/Makefile +++ b/Makefile @@ -16,7 +16,6 @@ GSLINT_EXCLUDES= \ src/api/popup.js \ src/api/projection.js \ src/ol/base.js \ - src/ol/Bounds.js \ src/ol/control/Attribution.js \ src/ol/control/Control.js \ src/ol/control/Navigation.js \ @@ -52,7 +51,6 @@ GSLINT_EXCLUDES= \ src/ol/Tile.js \ src/ol/TileCache.js \ src/ol/TileSet.js \ - src/ol/UnreferencedBounds.js \ src/ol.export.js \ src/ol.js diff --git a/src/all.js b/src/all.js index 62e738a54e..87ba3bbb9e 100644 --- a/src/all.js +++ b/src/all.js @@ -1,5 +1,6 @@ goog.provide('ol'); +goog.require('ol.Bounds'); goog.require('ol.MVCArray'); goog.require('ol.MVCObject'); goog.require('ol.TileBounds'); diff --git a/src/ol/Bounds.js b/src/ol/Bounds.js deleted file mode 100644 index d0676d7c65..0000000000 --- a/src/ol/Bounds.js +++ /dev/null @@ -1,105 +0,0 @@ -goog.provide('ol.Bounds'); - -goog.require('ol.UnreferencedBounds'); -goog.require('ol.Loc'); -goog.require('ol.Projection'); - -goog.require('goog.string.format'); - -/** - * @export - * @constructor - * @param {number} minX Minimum X. - * @param {number} minY Minimum Y. - * @param {number} maxX Maximum X. - * @param {number} maxY Maximum Y. - * @param {ol.Projection=} opt_projection Projection. - * @extends {ol.UnreferencedBounds} - */ -ol.Bounds = function(minX, minY, maxX, maxY, opt_projection) { - - goog.base(this, minX, minY, maxX, maxY); - - /** - * @protected - * @type {ol.Projection} - */ - this.projection_ = goog.isDef(opt_projection) ? opt_projection : null; - -}; -goog.inherits(ol.Bounds, ol.UnreferencedBounds); - -/** - * @return {ol.Projection} Projection. - */ -ol.Bounds.prototype.getProjection = function() { - return this.projection_; -}; - -/** - * @param {ol.Projection} projection Projection. - */ -ol.Bounds.prototype.setProjection = function(projection) { - this.projection_ = projection; -}; - -/** - * Determine if this bounds intersects the target bounds (bounds that only - * touch are considered intersecting). - * - * @param {ol.Bounds} bounds Target bounds. - * @return {boolean} The provided bounds intersects this bounds. - */ -ol.Bounds.prototype.intersects = function(bounds) { - var otherProj = bounds.getProjection(); - if (!goog.isNull(otherProj) && !goog.isNull(this.projection_)) { - bounds = bounds.doTransform(this.projection_); - } - return goog.base(this, "intersects", bounds.toUnreferencedBounds()); -}; - -/** - * Transform this node into another coordinate reference system. Returns a new - * bounds instead of modifying this bounds. - * - * @param {ol.Projection} proj Target projection. - * @return {ol.Bounds} A new bounds in the target projection. - */ -ol.Bounds.prototype.doTransform = function(proj) { - if (goog.isNull(this.projection_)) { - throw new Error("Bounds must have a projection before transforming."); - } - var tl = new ol.Loc( - this.minX_, this.maxY_, undefined, this.projection_).doTransform(proj); - var tr = new ol.Loc( - this.maxX_, this.maxY_, undefined, this.projection_).doTransform(proj); - var bl = new ol.Loc( - this.minX_, this.minY_, undefined, this.projection_).doTransform(proj); - var br = new ol.Loc( - this.maxX_, this.minY_, undefined, this.projection_).doTransform(proj); - - var x = [tl.getX(), tr.getX(), bl.getX(), br.getX()].sort(); - var y = [tl.getY(), tr.getY(), bl.getY(), br.getY()].sort(); - - return new ol.Bounds(x[0], y[0], x[3], y[3], proj); -}; - -/** - * Return a bbox string for this bounds. - * - * @return {string} The "minx,miny,maxx,maxy" representation of this bounds. - */ -ol.Bounds.prototype.toBBOX = function() { - return goog.string.format( - '%f,%f,%f,%f', this.minX_, this.minY_, this.maxX_, this.maxY_); -}; - -/** - * Cast this bounds into an unreferenced bounds. - * - * @returns {ol.UnreferencedBounds} - */ -ol.Bounds.prototype.toUnreferencedBounds = function() { - return new ol.UnreferencedBounds( - this.getMinX(), this.getMinY(), this.getMaxX(), this.getMaxY()); -}; diff --git a/src/ol/UnreferencedBounds.js b/src/ol/UnreferencedBounds.js deleted file mode 100644 index f07a775254..0000000000 --- a/src/ol/UnreferencedBounds.js +++ /dev/null @@ -1,130 +0,0 @@ -goog.provide('ol.UnreferencedBounds'); - -/** - * @constructor - * @param {number} minX Minimum X. - * @param {number} minY Minimum Y. - * @param {number} maxX Maximum X. - * @param {number} maxY Maximum Y. - */ -ol.UnreferencedBounds = function(minX, minY, maxX, maxY) { - - /** - * @protected - * @type {number} - */ - this.minX_ = minX; - - /** - * @protected - * @type {number} - */ - this.minY_ = minY; - - /** - * @protected - * @type {number} - */ - this.maxX_ = maxX; - - /** - * @protected - * @type {number} - */ - this.maxY_ = maxY; - -}; - - -/** - * @return {number} Minimun X. - */ -ol.UnreferencedBounds.prototype.getMinX = function() { - return this.minX_; -}; - -/** - * @param {number} minX Minimum X. - */ -ol.UnreferencedBounds.prototype.setMinX = function(minX) { - this.minX_ = minX; -}; - -/** - * @return {number} Minimun Y. - */ -ol.UnreferencedBounds.prototype.getMinY = function() { - return this.minY_; -}; - -/** - * @param {number} minY Minimum Y. - */ -ol.UnreferencedBounds.prototype.setMinY = function(minY) { - this.minY_ = minY; -}; - -/** - * @return {number} Maximun X. - */ -ol.UnreferencedBounds.prototype.getMaxX = function() { - return this.maxX_; -}; - -/** - * @param {number} maxX Maximum X. - */ -ol.UnreferencedBounds.prototype.setMaxX = function(maxX) { - this.maxX_ = maxX; -}; - -/** - * @return {number} Maximun Y. - */ -ol.UnreferencedBounds.prototype.getMaxY = function() { - return this.maxY_; -}; - -/** - * @param {number} maxY Maximum Y. - */ -ol.UnreferencedBounds.prototype.setMaxY = function(maxY) { - this.maxY_ = maxY; -}; - -/** - * @return {number} Bounds width. - */ -ol.UnreferencedBounds.prototype.getWidth = function() { - return this.maxX_ - this.minX_; -}; - -/** - * @return {number} Bounds height. - */ -ol.UnreferencedBounds.prototype.getHeight = function() { - return this.maxY_ - this.minY_; -}; - -/** - * Determine if this bounds intersects the target bounds (bounds that only - * touch are considered intersecting). - * - * @param {ol.UnreferencedBounds} bounds Target bounds. - * @return {boolean} The provided bounds intersects this bounds. - */ -ol.UnreferencedBounds.prototype.intersects = function(bounds) { - return !( - // this is left - (this.minX_ > bounds.getMaxX()) || - - // this is right - (this.maxX_ < bounds.getMinX()) || - - // this is above - (this.minY_ > bounds.getMaxY()) || - - // this is below - (this.maxY_ < bounds.getMinY()) - ); -}; diff --git a/src/ol/bounds.js b/src/ol/bounds.js new file mode 100644 index 0000000000..2c820ce32e --- /dev/null +++ b/src/ol/bounds.js @@ -0,0 +1,20 @@ +goog.provide('ol.Bounds'); + +goog.require('goog.math.Box'); + + + +/** + * @constructor + * @extends {goog.math.Box} + * @param {number} top Top. + * @param {number} right Right. + * @param {number} bottom Bottom. + * @param {number} left Left. + */ +ol.Bounds = function(top, right, bottom, left) { + + goog.base(this, top, right, bottom, left); + +}; +goog.inherits(ol.Bounds, goog.math.Box); From c04e3d339f6fdddffc9118ab7463bfec6d8b3ad1 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Thu, 5 Jul 2012 15:03:26 +0200 Subject: [PATCH 016/562] Add ol.TileUrl --- src/all.js | 1 + src/ol/tileurl.js | 35 +++++++++++++++++++++++++++++++++++ src/ol/tileurl_test.js | 20 ++++++++++++++++++++ 3 files changed, 56 insertions(+) create mode 100644 src/ol/tileurl.js create mode 100644 src/ol/tileurl_test.js diff --git a/src/all.js b/src/all.js index 87ba3bbb9e..64cbbb9ce6 100644 --- a/src/all.js +++ b/src/all.js @@ -5,3 +5,4 @@ goog.require('ol.MVCArray'); goog.require('ol.MVCObject'); goog.require('ol.TileBounds'); goog.require('ol.TileCoord'); +goog.require('ol.TileUrl'); diff --git a/src/ol/tileurl.js b/src/ol/tileurl.js new file mode 100644 index 0000000000..116e20ee64 --- /dev/null +++ b/src/ol/tileurl.js @@ -0,0 +1,35 @@ +goog.provide('ol.TileUrl'); + +goog.require('goog.math'); +goog.require('ol.TileCoord'); + + +/** + * @typedef {function(ol.TileCoord): string} + */ +ol.TileUrlFunction; + + +/** + * @param {string} template Template. + * @return {ol.TileUrlFunction} Tile URL function. + */ +ol.TileUrl.createFromTemplate = function(template) { + return function(tileCoord) { + return template.replace(/\{z\}/, tileCoord.z) + .replace(/\{x\}/, tileCoord.x) + .replace(/\{y\}/, tileCoord.y); + }; +}; + + +/** + * @param {Array.} tileUrlFunctions Tile URL Functions. + * @return {ol.TileUrlFunction} Tile URL function. + */ +ol.TileUrl.createFromTileUrlFunctions = function(tileUrlFunctions) { + return function(tileCoord) { + var index = goog.math.modulo(tileCoord.hash(), tileUrlFunctions.length); + return tileUrlFunctions[index](tileCoord); + }; +}; diff --git a/src/ol/tileurl_test.js b/src/ol/tileurl_test.js new file mode 100644 index 0000000000..014f044db0 --- /dev/null +++ b/src/ol/tileurl_test.js @@ -0,0 +1,20 @@ +goog.require('goog.testing.jsunit'); +goog.require('ol.TileCoord'); +goog.require('ol.TileUrl'); + + +function testCreateFromTemplate() { + var tileUrl = ol.TileUrl.createFromTemplate('{z}/{x}/{y}'); + assertEquals('3/2/1', tileUrl(new ol.TileCoord(3, 2, 1))); +} + + +function testCreateFromTileUrlFunctions() { + var tileUrl = ol.TileUrl.createFromTileUrlFunctions([ + ol.TileUrl.createFromTemplate('a'), + ol.TileUrl.createFromTemplate('b') + ]); + var tileUrl1 = tileUrl(new ol.TileCoord(1, 0, 0)); + var tileUrl2 = tileUrl(new ol.TileCoord(1, 0, 1)); + assertTrue(tileUrl1 != tileUrl2); +} From dc2993b61d375ce063b224f236064b29ae98e4d1 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Thu, 5 Jul 2012 15:15:34 +0200 Subject: [PATCH 017/562] Add ol.Camera --- doc/ol3.md | 2 +- src/all.js | 1 + src/ol/camera.js | 77 ++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 79 insertions(+), 1 deletion(-) create mode 100644 src/ol/camera.js diff --git a/doc/ol3.md b/doc/ol3.md index de3c368326..3f98767051 100644 --- a/doc/ol3.md +++ b/doc/ol3.md @@ -135,7 +135,7 @@ Tile fires 'aborted' // when loading is aborted Camera - center goog.math.Coordinate + position goog.math.Coordinate resolution number rotation number diff --git a/src/all.js b/src/all.js index 64cbbb9ce6..8cd23bd5b1 100644 --- a/src/all.js +++ b/src/all.js @@ -1,6 +1,7 @@ goog.provide('ol'); goog.require('ol.Bounds'); +goog.require('ol.Camera'); goog.require('ol.MVCArray'); goog.require('ol.MVCObject'); goog.require('ol.TileBounds'); diff --git a/src/ol/camera.js b/src/ol/camera.js new file mode 100644 index 0000000000..8c524f42f7 --- /dev/null +++ b/src/ol/camera.js @@ -0,0 +1,77 @@ +goog.provide('ol.Camera'); + +goog.require('goog.math.Coordinate'); +goog.require('ol.MVCObject'); + + +/** + * @enum {string} + * @private + */ +ol.CameraProperty_ = { + POSITION: 'center', + RESOLUTION: 'resolution', + ROTATION: 'rotation' +}; + + + +/** + * @constructor + * @extends {ol.MVCObject} + */ +ol.Camera = function() { + + goog.base(this); + +}; +goog.inherits(ol.Camera, ol.MVCObject); + + +/** + * @return {goog.math.Coordinate} Position. + */ +ol.Camera.prototype.getPosition = function() { + return /** @type {goog.math.Coordinate} */ ( + this.get(ol.CameraProperty_.POSITION)); +}; + + +/** + * @return {number} Resolution. + */ +ol.Camera.prototype.getResolution = function() { + return /** @type {number} */ (this.get(ol.CameraProperty_.RESOLUTION)); +}; + + +/** + * @return {number} Rotation. + */ +ol.Camera.prototype.getRotation = function() { + return /** @type {number} */ (this.get(ol.CameraProperty_.ROTATION)); +}; + + +/** + * @param {goog.math.Coordinate} position Position. + */ +ol.Camera.prototype.setPosition = function(position) { + this.set(ol.CameraProperty_.POSITION, position.clone()); +}; + + +/** + * @param {number} resolution Resolution. + */ +ol.Camera.prototype.setResolution = function(resolution) { + this.set(ol.CameraProperty_.RESOLUTION, resolution); +}; + + +/** + * @param {number} rotation Rotation. + */ +ol.Camera.prototype.setRotation = function(rotation) { + this.set(ol.CameraProperty_.ROTATION, rotation); +}; From 25d67e670f6e5932ca83d7b97814c6f09431ba80 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Thu, 5 Jul 2012 15:44:48 +0200 Subject: [PATCH 018/562] Layers should always have an extent --- doc/ol3.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/ol3.md b/doc/ol3.md index 3f98767051..f785467635 100644 --- a/doc/ol3.md +++ b/doc/ol3.md @@ -141,7 +141,7 @@ Camera Layer projections Array. - extent Extent ? + extent Extent getResolutions() -> Array.|null fires 'change' // when data changes From 8014f68719093bc5dd4892d6f74f645e9aae44b8 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Thu, 5 Jul 2012 15:55:10 +0200 Subject: [PATCH 019/562] Use goog.math.Bounds for extents --- doc/ol3.md | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/doc/ol3.md b/doc/ol3.md index f785467635..c2d1370456 100644 --- a/doc/ol3.md +++ b/doc/ol3.md @@ -8,11 +8,9 @@ goog.math.Coordinate // Simple 2D point goog.math.Box | ++- Extent // The extent of a single object in two dimensions, projection not stored +| +- 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 @@ -168,14 +166,14 @@ Map TileGrid resolutions Array. - extent Extent + extent ol.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 + getTileCoordExtent(tileCoord) -> ol.Extent getZForResolution(resolution) -> number yieldTileCoordChildren(tileCoord, function(z, TileBounds)) yieldTileCoordParents(tileCoord, function(z, TileBounds)) From afb37035dc3d77945e29493914057e8d841c4fe1 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Thu, 5 Jul 2012 16:02:47 +0200 Subject: [PATCH 020/562] Add ol.Extent --- src/all.js | 1 + src/ol/extent.js | 28 ++++++++++++++++++++++++++++ 2 files changed, 29 insertions(+) create mode 100644 src/ol/extent.js diff --git a/src/all.js b/src/all.js index 8cd23bd5b1..cd16a8ce30 100644 --- a/src/all.js +++ b/src/all.js @@ -2,6 +2,7 @@ goog.provide('ol'); goog.require('ol.Bounds'); goog.require('ol.Camera'); +goog.require('ol.Extent'); goog.require('ol.MVCArray'); goog.require('ol.MVCObject'); goog.require('ol.TileBounds'); diff --git a/src/ol/extent.js b/src/ol/extent.js new file mode 100644 index 0000000000..58e2f764f3 --- /dev/null +++ b/src/ol/extent.js @@ -0,0 +1,28 @@ +goog.provide('ol.Extent'); + +goog.require('goog.math.Box'); + + + +/** + * @constructor + * @extends {goog.math.Box} + * @param {number} top Top. + * @param {number} right Right. + * @param {number} bottom Bottom. + * @param {number} left Left. + */ +ol.Extent = function(top, right, bottom, left) { + + goog.base(this, top, right, bottom, left); + +}; +goog.inherits(ol.Extent, goog.math.Box); + + +/** + * @return {ol.Extent} Extent. + */ +ol.Extent.prototype.clone = function() { + return new ol.Extent(this.top, this.right, this.bottom, this.left); +}; From 9900084f465dcfbfcc466959c2452a139d33ae23 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Thu, 5 Jul 2012 16:03:54 +0200 Subject: [PATCH 021/562] Add initial ol.TileGrid skeleton --- Makefile | 1 - src/all.js | 1 + src/ol/TileSet.js | 66 ------------ src/ol/tilegrid.js | 245 +++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 246 insertions(+), 67 deletions(-) delete mode 100644 src/ol/TileSet.js create mode 100644 src/ol/tilegrid.js diff --git a/Makefile b/Makefile index 0880a60ece..53cf49841f 100644 --- a/Makefile +++ b/Makefile @@ -50,7 +50,6 @@ GSLINT_EXCLUDES= \ src/ol/renderer/WebGL.js \ src/ol/Tile.js \ src/ol/TileCache.js \ - src/ol/TileSet.js \ src/ol.export.js \ src/ol.js diff --git a/src/all.js b/src/all.js index cd16a8ce30..a9896cb5a1 100644 --- a/src/all.js +++ b/src/all.js @@ -7,4 +7,5 @@ goog.require('ol.MVCArray'); goog.require('ol.MVCObject'); goog.require('ol.TileBounds'); goog.require('ol.TileCoord'); +goog.require('ol.TileGrid'); goog.require('ol.TileUrl'); diff --git a/src/ol/TileSet.js b/src/ol/TileSet.js deleted file mode 100644 index 56c8f3885b..0000000000 --- a/src/ol/TileSet.js +++ /dev/null @@ -1,66 +0,0 @@ -goog.provide('ol.TileSet'); - -/** - * The TileSet class. A TileSet instance represents a collection of - * tiles. Tiles of a TileSet have the same resolution, width and - * height. - * @constructor - * @param {Array.>} tiles - * @param {number} tileWidth - * @param {number} tileHeight - * @param {number} resolution - */ -ol.TileSet = function(tiles, tileWidth, tileHeight, resolution) { - - /** - * @private - * @type {Array.>} - */ - this.tiles_ = tiles; - - /** - * @private - * @type {number} - */ - this.tileWidth_ = tileWidth; - - /** - * @private - * @type {number} - */ - this.tileHeight_ = tileHeight; - - /** - * @private - * @type {number} - */ - this.resolution_ = resolution; -}; - -/** - * @return {Array.>} - */ -ol.TileSet.prototype.getTiles = function() { - return this.tiles_; -}; - -/** - * @return {number} - */ -ol.TileSet.prototype.getResolution = function() { - return this.resolution_; -}; - -/** - * @return {number} - */ -ol.TileSet.prototype.getTileHeight = function() { - return this.tileHeight_; -}; - -/** - * @return {number} - */ -ol.TileSet.prototype.getTileWidth = function() { - return this.tileWidth_; -}; diff --git a/src/ol/tilegrid.js b/src/ol/tilegrid.js new file mode 100644 index 0000000000..0cd02d49cf --- /dev/null +++ b/src/ol/tilegrid.js @@ -0,0 +1,245 @@ +goog.provide('ol.TileGrid'); + +goog.require('goog.asserts'); +goog.require('goog.math.Size'); +goog.require('goog.positioning.Corner'); +goog.require('ol.Extent'); +goog.require('ol.TileBounds'); +goog.require('ol.TileCoord'); + + + +/** + * @constructor + * @param {Array.} resolutions Resolutions. + * @param {ol.Extent} extent Extent. + * @param {goog.positioning.Corner} corner Corner. + * @param {goog.math.Coordinate|Array.} origin Origin. + * @param {goog.math.Size=} opt_tileSize Tile size. + */ +ol.TileGrid = function(resolutions, extent, corner, origin, opt_tileSize) { + + /** + * @private + * @type {Array.} + */ + this.resolutions_ = resolutions; + + /** + * @private + * @type {ol.Extent} + */ + this.extent_ = extent; + + /** + * @private + * @type {goog.positioning.Corner} + */ + this.corner_ = corner; + + /** + * @private + * @type {goog.math.Coordinate} + */ + this.origin_ = null; + + /** + * @private + * @type {Array.} + */ + this.origins_ = null; + + if (origin instanceof goog.math.Coordinate) { + this.origin_ = origin; + } else if (goog.isArray(origin)) { + goog.asserts.assert(origin.length == this.resolutions_.length); + this.origins_ = origin; + } else { + goog.asserts.assert(false); + } + + /** + * @private + * @type {goog.math.Size} + */ + this.tileSize_ = goog.isDef(opt_tileSize) ? + opt_tileSize : new goog.math.Size(256, 256); + +}; + + +/** + * @return {goog.positioning.Corner} Corner. + */ +ol.TileGrid.prototype.getCorner = function() { + return this.corner_; +}; + + +/** + * @return {ol.Extent} Extent. + */ +ol.TileGrid.prototype.getExtent = function() { + return this.extent_; +}; + + +/** + * @return {number} Maximum resolution. + */ +ol.TileGrid.prototype.getMaxResolution = function() { + return this.getResolutions()[0]; +}; + + +/** + * @param {number} z Z. + * @return {goog.math.Coordinate} Origin. + */ +ol.TileGrid.prototype.getOrigin = function(z) { + if (!goog.isNull(this.origin_)) { + return this.origin_; + } else { + goog.asserts.assert(!goog.isNull(this.origins_)); + goog.asserts.assert(0 <= z && z < this.origins_.length); + return this.origins_[z]; + } +}; + + +/** + * @param {number} z Z. + * @return {number} Resolution. + */ +ol.TileGrid.prototype.getResolution = function(z) { + goog.asserts.assert(0 <= z && z < this.resolutions_.length); + return this.resolutions_[z]; +}; + + +/** + * @return {Array.} Resolutions. + */ +ol.TileGrid.prototype.getResolutions = function() { + return this.resolutions_; +}; + + +/** + * @param {number} z Z. + * @param {ol.Extent} extent Extent. + * @return {ol.TileBounds} Tile bounds. + */ +ol.TileGrid.prototype.getTileBounds = function(z, extent) { + var topRight = new goog.math.Coordinate(extent.right, extent.top); + var bottomLeft = new goog.math.Coordinate(extent.left, extent.bottom); + return ol.TileBounds.boundingTileBounds( + this.getTileCoord(z, topRight), + this.getTileCoord(z, bottomLeft)); +}; + + +/** + * @param {ol.TileCoord} tileCoord Tile coordinate. + * @return {goog.math.Coordinate} Tile center. + */ +ol.TileGrid.prototype.getTileCenter = function(tileCoord) { + var corner = this.corner_; + var origin = this.getOrigin(tileCoord.z); + var resolution = this.getResolution(tileCoord.z); + var tileSize = this.tileSize_; + var x = origin.x + (tileCoord.x + 0.5) * tileSize.width * resolution; + var y; + if (corner == goog.positioning.Corner.TOP_LEFT) { + y = origin.y - (tileCoord.y + 0.5) * tileSize.height * resolution; + } else { + goog.asserts.assert(corner == goog.positioning.Corner.TOP_RIGHT); + y = origin.y + (tileCoord.y + 0.5) * tileSize.height * resolution; + } + return new goog.math.Coordinate(x, y); +}; + + +/** + * @param {number} z Z. + * @param {goog.math.Coordinate} coordinate Coordinate. + * @return {ol.TileCoord} Tile coordinate. + */ +ol.TileGrid.prototype.getTileCoord = function(z, coordinate) { + if (!this.extent_.contains(coordinate)) { + return null; + } + var corner = this.corner_; + var origin = this.getOrigin(z); + var resolution = this.getResolution(z); + var tileSize = this.getTileSize(); + var x = + Math.floor((coordinate.x - origin.x) / (tileSize.width * resolution)); + var y; + if (corner == goog.positioning.Corner.TOP_LEFT) { + y = Math.floor((origin.y - coordinate.y) / (tileSize.height * resolution)); + } else { + goog.asserts.assert(corner == goog.positioning.Corner.BOTTOM_LEFT); + y = Math.floor((coordinate.y - origin.y) / (tileSize.height * resolution)); + } + return new ol.TileCoord(z, x, y); +}; + + +/** + * @param {ol.TileCoord} tileCoord Tile coordinate. + * @return {ol.Extent} Extent. + */ +ol.TileGrid.prototype.getTileCoordExtent = function(tileCoord) { + var corner = this.corner_; + var origin = this.getOrigin(tileCoord.z); + var resolution = this.getResolution(tileCoord.z); + var tileSize = this.tileSize_; + var left = origin.x + tileCoord.x * tileSize.width * resolution; + var right = left + tileSize.width * resolution; + var top, bottom; + if (corner == goog.positioning.Corner.TOP_LEFT) { + top = origin.y - tileCoord.y * tileSize.height * resolution; + bottom = top - tileSize.height * resolution; + } else { + goog.asserts.assert(corner == goog.positioning.Corner.BOTTOM_LEFT); + bottom = origin.y + tileCoord.y * tileSize.height * resolution; + top = bottom + tileSize.height * resolution; + } + return new ol.Extent(top, right, bottom, left); +}; + + +/** + * @return {goog.math.Size} Tile size. + */ +ol.TileGrid.prototype.getTileSize = function() { + return this.tileSize_; +}; + + +/** + * @param {ol.TileCoord} tileCoord Tile coordinate. + * @return {number} Tile resolution. + */ +ol.TileGrid.prototype.getTileResolution = function(tileCoord) { + goog.asserts.assert( + 0 <= tileCoord.z && tileCoord.z < this.resolutions_.length); + return this.resolutions_[tileCoord.z]; +}; + + +/** + * @param {ol.TileCoord} tileCoord Tile coordinate. + * @param {function(ol.TileBounds): boolean} callback Callback. + */ +ol.TileGrid.prototype.yieldTileCoordParents = function(tileCoord, callback) { + var extent = this.getTileCoordExtent(tileCoord); + var z = tileCoord.z - 1; + while (z >= 0) { + if (callback(this.getTileBounds(z, extent))) { + return; + } + --z; + } +}; From bd61a0be15daed8e5082c3a7f5a97726d0deed2d Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Thu, 5 Jul 2012 16:16:27 +0200 Subject: [PATCH 022/562] Add ol.LayerView --- src/all.js | 1 + src/ol/layerview.js | 61 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 62 insertions(+) create mode 100644 src/ol/layerview.js diff --git a/src/all.js b/src/all.js index a9896cb5a1..17dcebca05 100644 --- a/src/all.js +++ b/src/all.js @@ -3,6 +3,7 @@ goog.provide('ol'); goog.require('ol.Bounds'); goog.require('ol.Camera'); goog.require('ol.Extent'); +goog.require('ol.LayerView'); goog.require('ol.MVCArray'); goog.require('ol.MVCObject'); goog.require('ol.TileBounds'); diff --git a/src/ol/layerview.js b/src/ol/layerview.js new file mode 100644 index 0000000000..452e15c410 --- /dev/null +++ b/src/ol/layerview.js @@ -0,0 +1,61 @@ +goog.provide('ol.LayerView'); + +goog.require('ol.MVCObject'); + + +/** + * @enum {string} + * @private + */ +ol.LayerViewProperty_ = { + OPACITY: 'opacity', + VISIBLE: 'visible' +}; + + + +/** + * @constructor + * @extends {ol.MVCObject} + */ +ol.LayerView = function() { + + goog.base(this); + + this.setVisible(true); + this.setOpacity(1); + +}; +goog.inherits(ol.LayerView, ol.MVCObject); + + +/** + * @return {number} Opacity. + */ +ol.LayerView.prototype.getOpacity = function() { + return /** @type {number} */ (this.get(ol.LayerViewProperty_.OPACITY)); +}; + + +/** + * @return {boolean} Visible. + */ +ol.LayerView.prototype.getVisible = function() { + return /** @type {boolean} */ (this.get(ol.LayerViewProperty_.VISIBLE)); +}; + + +/** + * @param {number} opacity Opacity. + */ +ol.LayerView.prototype.setOpacity = function(opacity) { + this.set(ol.LayerViewProperty_.OPACITY, opacity); +}; + + +/** + * @param {boolean} visible Visible. + */ +ol.LayerView.prototype.setVisible = function(visible) { + this.set(ol.LayerViewProperty_.VISIBLE, visible); +}; From 48cc0bed933ae45547ee823a15bbabb58a0049dd Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Thu, 5 Jul 2012 18:15:48 +0200 Subject: [PATCH 023/562] Add externs for Proj4js --- externs/proj4js.js | 73 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 externs/proj4js.js diff --git a/externs/proj4js.js b/externs/proj4js.js new file mode 100644 index 0000000000..a6fa18768a --- /dev/null +++ b/externs/proj4js.js @@ -0,0 +1,73 @@ +/** + * @externs + * @see http://trac.osgeo.org/proj4js/ + */ + + +/** + * @type {Object} + */ +var Proj4js = {}; + + +/** + * @type {Object.} + */ +Proj4js.defs; + + +/** + * @type {function(string)} + */ +Proj4js.reportError; + + + +/** + * @constructor + * @param {number} x X. + * @param {number} y Y. + */ +Proj4js.Point = function(x, y) {}; + + +/** + * @type {number} + */ +Proj4js.Point.prototype.x; + + +/** + * @type {number} + */ +Proj4js.Point.prototype.y; + + + +/** + * @constructor + * @param {string} srsCode SRS code. + * @param {Function=} callback Callback. + */ +Proj4js.Proj = function(srsCode, callback) {}; + + +/** + * @type {string} + */ +Proj4js.Proj.prototype.title; + + +/** + * @type {string} + */ +Proj4js.Proj.prototype.units; + + +/** + * @param {Proj4js.Proj} source Source projection. + * @param {Proj4js.Proj} dest Destination projection. + * @param {Proj4js.Point|{x:number, y:number}} point Point. + * @return {Proj4js.Point} Point. + */ +Proj4js.transform = function(source, dest, point) {}; From 13c8b8b0de2453b61b47b2f9e3d63fb8269c5fcd Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Thu, 5 Jul 2012 19:03:39 +0200 Subject: [PATCH 024/562] Include externs in lint --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 53cf49841f..ff829060b0 100644 --- a/Makefile +++ b/Makefile @@ -63,7 +63,7 @@ serve: $(PLOVR_JAR) .PHONY: lint lint: $(CLOSURE_LINTER) - gjslint --strict $(filter-out $(GSLINT_EXCLUDES),$(shell find src -name \*.js)) + gjslint --strict $(filter-out $(GSLINT_EXCLUDES),$(shell find externs src -name \*.js)) $(PLOVR_JAR): curl http://plovr.googlecode.com/files/$(PLOVR_JAR) > $@ From 94d85d4821c0d743d04e0c7553ded5b1b4fb08fe Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Thu, 5 Jul 2012 19:03:54 +0200 Subject: [PATCH 025/562] Fix lint warnings --- externs/geojson.js | 1 + 1 file changed, 1 insertion(+) diff --git a/externs/geojson.js b/externs/geojson.js index 68a6bc0178..687eb4cecb 100644 --- a/externs/geojson.js +++ b/externs/geojson.js @@ -1,3 +1,4 @@ + /** * @fileoverview Externs for GeoJSON. * @see http://geojson.org/geojson-spec.html From c56fce2be897a8c665ec367cf4f00cf78e7c310f Mon Sep 17 00:00:00 2001 From: Tim Schaub Date: Thu, 5 Jul 2012 21:45:16 -0600 Subject: [PATCH 026/562] Attempting to clarify. --- doc/ol3.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/doc/ol3.md b/doc/ol3.md index c2d1370456..a6b43e0ad4 100644 --- a/doc/ol3.md +++ b/doc/ol3.md @@ -201,6 +201,15 @@ Renderer Questions: - Store tile layer extent in TileLayer or in TileGrid? (not clear) + +Two concepts: tile coordinate system range and and available data extent. +TileGrid extent is range (or validity extent) of the tile coordinate system. +TileLayer extent is the available data extent. A particular TileGrid may range +from 0,0 to 10,10. My cache may conform to that grid but I may only have tiles +ranging from 2,2 to 8,8. When you need to wrap multiple worlds, you pay +attention to the TileGrid extent. When you need to decide whether or not to +bother requesting a tile, you pay attention to the TileLayer extent. + - Who determines "best" resolution? (static function?) From 89ec9bf07a84051e3a877653b72690edf43d48a7 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Fri, 6 Jul 2012 12:16:02 +0200 Subject: [PATCH 027/562] Update ol.Projection --- Makefile | 1 - src/all.js | 1 + src/ol/Projection.js | 257 -------------------------- src/ol/projection.js | 368 ++++++++++++++++++++++++++++++++++++++ src/ol/projection_test.js | 87 +++++++++ 5 files changed, 456 insertions(+), 258 deletions(-) delete mode 100644 src/ol/Projection.js create mode 100644 src/ol/projection.js create mode 100644 src/ol/projection_test.js diff --git a/Makefile b/Makefile index ff829060b0..683661c3ba 100644 --- a/Makefile +++ b/Makefile @@ -42,7 +42,6 @@ GSLINT_EXCLUDES= \ src/ol/Loc.js \ src/ol/Map.js \ src/ol/Popup.js \ - src/ol/Projection.js \ src/ol/renderer/Composite.js \ src/ol/renderer/LayerRenderer.js \ src/ol/renderer/MapRenderer.js \ diff --git a/src/all.js b/src/all.js index 17dcebca05..015da3bdb1 100644 --- a/src/all.js +++ b/src/all.js @@ -6,6 +6,7 @@ goog.require('ol.Extent'); goog.require('ol.LayerView'); goog.require('ol.MVCArray'); goog.require('ol.MVCObject'); +goog.require('ol.Projection'); goog.require('ol.TileBounds'); goog.require('ol.TileCoord'); goog.require('ol.TileGrid'); diff --git a/src/ol/Projection.js b/src/ol/Projection.js deleted file mode 100644 index 78e38d7d09..0000000000 --- a/src/ol/Projection.js +++ /dev/null @@ -1,257 +0,0 @@ -goog.provide('ol.Projection'); -goog.require('ol.UnreferencedBounds'); - -/** - * @export - * @constructor - * @param {string} code Projection identifier. - */ -ol.Projection = function(code) { - - /** - * @private - * @type {string} - */ - this.code_ = code; - - /** - * @private - * @type {string|undefined} - */ - this.units_ = undefined; - - /** - * @private - * @type {Object} - */ - this.proj_ = null; - - /** - * @private - * @type {ol.UnreferencedBounds} - */ - this.extent_ = null; - -}; - - -/** - * @return {string} Code. - */ -ol.Projection.prototype.getCode = function() { - return this.code_; -}; - -/** - * @param {string} code Code. - */ -ol.Projection.prototype.setCode = function(code) { - this.code_ = code; -}; - -/** - * @return {string|undefined} Units abbreviation. - */ -ol.Projection.prototype.getUnits = function() { - return this.units_; -}; - -/** - * @param {string} units Units abbreviation. - */ -ol.Projection.prototype.setUnits = function(units) { - this.units_ = units; -}; - -/** - * Get the validity extent of the coordinate reference system. - * - * @return {ol.UnreferencedBounds} The valididty extent. - */ -ol.Projection.prototype.getExtent = function() { - if (goog.isNull(this.extent_)) { - var defs = ol.Projection.defaults[this.code_]; - if (goog.isDef(defs)) { - var ext = defs.maxExtent; - if (goog.isDef(ext)) { - this.setExtent(new ol.UnreferencedBounds(ext[0],ext[1],ext[2],ext[3])); - } - } - } - return this.extent_; -}; - -/** - * @param {!ol.UnreferencedBounds} extent Validity extent. - */ -ol.Projection.prototype.setExtent = function(extent) { - this.extent_ = extent; -}; - -/** - * Transforms is an object, with from properties, each of which may - * have a to property. This allows you to define projections without - * requiring support for proj4js to be included. - * - * This object has keys which correspond to a 'source' projection object. The - * keys should be strings, corresponding to the projection.getCode() value. - * Each source projection object should have a set of destination projection - * keys included in the object. - * - * Each value in the destination object should be a transformation function, - * where the function is expected to be passed an object with a .x and a .y - * property. The function should return the object, with the .x and .y - * transformed according to the transformation function. - * - * Note - Properties on this object should not be set directly. To add a - * transform method to this object, use the method. For an - * example of usage, see the OpenLayers.Layer.SphericalMercator file. - * - * @type {Object} - */ -ol.Projection.transforms = {}; - -/** - * Defaults for the SRS codes known to OpenLayers (currently EPSG:4326, CRS:84, - * urn:ogc:def:crs:EPSG:6.6:4326, EPSG:900913, EPSG:3857, EPSG:102113 and - * EPSG:102100). Keys are the SRS code, values are units, maxExtent (the - * validity extent for the SRS) and yx (true if this SRS is known to have a - * reverse axis order). - * - * @type {Object} - */ -ol.Projection.defaults = { - "EPSG:4326": { - units: "degrees", - maxExtent: [-180, -90, 180, 90], - yx: true - }, - "CRS:84": { - units: "degrees", - maxExtent: [-180, -90, 180, 90] - }, - "EPSG:900913": { - units: "m", - maxExtent: [-20037508.34, -20037508.34, 20037508.34, 20037508.34] - } -}; - -/** - * Set a custom transform method between two projections. Use this method in - * cases where the proj4js lib is not available or where custom projections - * need to be handled. - * - * @param {string} from The code for the source projection. - * @param {string} to The code for the destination projection. - * @param {function(Object)} method A function that takes an object with x and - * y properties as an argument and transforms that point from the source to - * the destination projection in place. The original point should be - * modified. - */ -ol.Projection.addTransform = function(from, to, method) { - if (method === ol.Projection.nullTransform) { - var defaults = ol.Projection.defaults[from]; - if (defaults && !ol.Projection.defaults[to]) { - ol.Projection.defaults[to] = defaults; - } - } - if(!ol.Projection.transforms[from]) { - ol.Projection.transforms[from] = {}; - } - ol.Projection.transforms[from][to] = method; -}; - -/** - * Transform a point coordinate from one projection to another. - * - * @param {Object} point Object with x and y properties. - * @param {ol.Projection} source Source projection. - * @param {ol.Projection} dest Destination projection. - */ -ol.Projection.transform = function(point, source, dest) { - goog.asserts.assertObject(point); - goog.asserts.assertObject(source); - goog.asserts.assertObject(dest); - if (source.proj_ && dest.proj_) { - // TODO: implement Proj4js handling - // point = Proj4js.transform(source.proj_, dest.proj_, point); - } else { - var sourceCode = source.getCode(); - var destCode = dest.getCode(); - var transforms = ol.Projection.transforms; - if (transforms[sourceCode] && transforms[sourceCode][destCode]) { - transforms[sourceCode][destCode](point); - } - } -}; - -/** - * A null transformation - useful for defining projection aliases when - * proj4js is not available: - * - * ol.Projection.addTransform("EPSG:3857", "EPSG:900913", - * ol.Projection.nullTransform); - * ol.Projection.addTransform("EPSG:900913", "EPSG:3857", - * ol.Projection.nullTransform); - * - * @type {function(Object)} - */ -ol.Projection.nullTransform = function(point) { - return point; -}; - -/** - * Note: Transforms for web mercator <-> geographic - * OpenLayers recognizes EPSG:3857, EPSG:900913, EPSG:102113 and EPSG:102100. - * OpenLayers originally started referring to EPSG:900913 as web mercator. - * The EPSG has declared EPSG:3857 to be web mercator. - * ArcGIS 10 recognizes the EPSG:3857, EPSG:102113, and EPSG:102100 as - * equivalent. See http://blogs.esri.com/Dev/blogs/arcgisserver/archive/2009/11/20/ArcGIS-Online-moving-to-Google-_2F00_-Bing-tiling-scheme_3A00_-What-does-this-mean-for-you_3F00_.aspx#12084. - * For geographic, OpenLayers recognizes EPSG:4326, CRS:84 and - * urn:ogc:def:crs:EPSG:6.6:4326. OpenLayers also knows about the reverse axis - * order for EPSG:4326. - */ -(function() { - - var pole = 20037508.34; - - function inverseMercator(xy) { - xy.x = 180 * xy.x / pole; - xy.y = 180 / Math.PI * (2 * Math.atan(Math.exp((xy.y / pole) * Math.PI)) - Math.PI / 2); - return xy; - } - - function forwardMercator(xy) { - xy.x = xy.x * pole / 180; - xy.y = Math.log(Math.tan((90 + xy.y) * Math.PI / 360)) / Math.PI * pole; - return xy; - } - - function map(base, codes) { - var add = ol.Projection.addTransform; - var same = ol.Projection.nullTransform; - var i, len, code, other, j; - for (i=0, len=codes.length; i=0; --i) { - map(mercator[i], geographic); - } - for (i=geographic.length-1; i>=0; --i) { - map(geographic[i], mercator); - } - -})(); diff --git a/src/ol/projection.js b/src/ol/projection.js new file mode 100644 index 0000000000..177d584f22 --- /dev/null +++ b/src/ol/projection.js @@ -0,0 +1,368 @@ +goog.provide('ol.Projection'); + +goog.require('goog.array'); +goog.require('goog.asserts'); +goog.require('goog.math.Coordinate'); +goog.require('goog.object'); +goog.require('ol.Extent'); + + +/** + * @typedef {function(goog.math.Coordinate): goog.math.Coordinate} + */ +ol.TransformFunction; + + +/** + * @enum {string} + */ +ol.ProjectionUnits = { + DEGREES: 'degrees', + METERS: 'm' +}; + + + +/** + * @constructor + * @param {string} code Code. + * @param {ol.ProjectionUnits} units Units. + * @param {ol.Extent} extent Extent. + */ +ol.Projection = function(code, units, extent) { + + /** + * @private + * @type {string} + */ + this.code_ = code; + + /** + * @private + * @type {ol.ProjectionUnits} + */ + this.units_ = units; + + /** + * @private + * @type {ol.Extent} + */ + this.extent_ = extent; + +}; + + +/** + * @return {string} Code. + */ +ol.Projection.prototype.getCode = function() { + return this.code_; +}; + + +/** + * @return {ol.Extent} Extent. + */ +ol.Projection.prototype.getExtent = function() { + return this.extent_; +}; + + +/** + * @return {ol.ProjectionUnits} Units. + */ +ol.Projection.prototype.getUnits = function() { + return this.units_; +}; + + +/** + * @private + * @type {Object.} + */ +ol.Projection.projections_ = {}; + + +/** + * @private + * @type {Object.>} + */ +ol.Projection.transforms_ = {}; + + +/** + * @param {Array.} projections Projections. + */ +ol.Projection.addEquivalentProjections = function(projections) { + ol.Projection.addProjections(projections); + goog.array.forEach(projections, function(source) { + goog.array.forEach(projections, function(destination) { + ol.Projection.addTransform( + source, destination, ol.Projection.identityTransform); + }); + }); +}; + + +/** + * @param {Array.} projections1 Projections. + * @param {Array.} projections2 Projections. + * @param {ol.TransformFunction} forwardTransform Forward transform. + * @param {ol.TransformFunction} inverseTransform Inverse transform. + */ +ol.Projection.addEquivalentTransforms = + function(projections1, projections2, forwardTransform, inverseTransform) { + goog.array.forEach(projections1, function(projection1) { + goog.array.forEach(projections2, function(projection2) { + ol.Projection.addTransform(projection1, projection2, forwardTransform); + ol.Projection.addTransform(projection2, projection1, inverseTransform); + }); + }); +}; + + +/** + * @param {ol.Projection} projection Projection. + */ +ol.Projection.addProjection = function(projection) { + var projections = ol.Projection.projections_; + var code = projection.getCode(); + goog.asserts.assert(!goog.object.containsKey(projections, code)); + projections[code] = projection; +}; + + +/** + * @param {Array.} projections Projections. + */ +ol.Projection.addProjections = function(projections) { + goog.array.forEach(projections, function(projection) { + ol.Projection.addProjection(projection); + }); +}; + + +/** + * @param {ol.Projection} source Source. + * @param {ol.Projection} destination Destination. + * @param {ol.TransformFunction} transform Transform. + */ +ol.Projection.addTransform = function(source, destination, transform) { + var projections = ol.Projection.projections_; + var sourceCode = source.getCode(); + goog.asserts.assert(goog.object.containsKey(projections, sourceCode)); + var destinationCode = destination.getCode(); + goog.asserts.assert(goog.object.containsKey(projections, destinationCode)); + var transforms = ol.Projection.transforms_; + if (!goog.object.containsKey(transforms, sourceCode)) { + transforms[sourceCode] = {}; + } + goog.asserts.assert( + !goog.object.containsKey(transforms[sourceCode], destinationCode)); + transforms[sourceCode][destinationCode] = transform; +}; + + +/** + * @param {string} code Code. + * @return {ol.Projection} Projection. + */ +ol.Projection.createFromCode = function(code) { + var projections = ol.Projection.projections_; + goog.asserts.assert(goog.object.containsKey(projections, code)); + return projections[code]; +}; + + +/** + * @param {ol.Projection} projection1 Projection 1. + * @param {ol.Projection} projection2 Projection 2. + * @return {boolean} Equivalent. + */ +ol.Projection.equivalent = function(projection1, projection2) { + if (projection1.getUnits() != projection2.getUnits()) { + return false; + } else { + var transform = ol.Projection.getTransform(projection1, projection2); + return transform === ol.Projection.identityTransform; + } +}; + + +/** + * @param {ol.Projection} source Source. + * @param {ol.Projection} destination Destination. + * @return {ol.TransformFunction} Transform. + */ +ol.Projection.getTransform = function(source, destination) { + var transforms = ol.Projection.transforms_; + var sourceCode = source.getCode(); + var destinationCode = destination.getCode(); + goog.asserts.assert(goog.object.containsKey(transforms, sourceCode)); + goog.asserts.assert( + goog.object.containsKey(transforms[sourceCode], destinationCode)); + return transforms[sourceCode][destinationCode]; +}; + + +/** + * @param {string} sourceCode Source code. + * @param {string} destinationCode Destination code. + * @return {ol.TransformFunction} Transform. + */ +ol.Projection.getTransformFromCodes = function(sourceCode, destinationCode) { + var source = ol.Projection.createFromCode(sourceCode); + var destination = ol.Projection.createFromCode(destinationCode); + return ol.Projection.getTransform(source, destination); +}; + + +/** + * @param {goog.math.Coordinate} point Point. + * @return {goog.math.Coordinate} Point. + */ +ol.Projection.identityTransform = function(point) { + return point.clone(); +}; + + +/** + * @param {goog.math.Coordinate} point Point. + * @param {ol.Projection} source Source. + * @param {ol.Projection} destination Destination. + * @return {goog.math.Coordinate} Point. + */ +ol.Projection.transform = function(point, source, destination) { + var transform = ol.Projection.getTransform(source, destination); + return transform(point); +}; + + +/** + * @param {goog.math.Coordinate} point Point. + * @param {string} sourceCode Source code. + * @param {string} destinationCode Destination code. + * @return {goog.math.Coordinate} Point. + */ +ol.Projection.transformWithCodes = + function(point, sourceCode, destinationCode) { + var transform = ol.Projection.getTransformFromCodes( + sourceCode, destinationCode); + return transform(point); +}; + + +/** + * @const + * @type {number} + */ +ol.Projection.EPSG_3857_RADIUS = 6378137; + + +/** + * @param {goog.math.Coordinate} point Point. + * @return {goog.math.Coordinate} Point. + */ +ol.Projection.forwardSphericalMercator = function(point) { + var x = ol.Projection.EPSG_3857_RADIUS * Math.PI * point.x / 180; + var y = ol.Projection.EPSG_3857_RADIUS * + Math.log(Math.tan(Math.PI * (point.y + 90) / 360)); + return new goog.math.Coordinate(x, y); +}; + + +/** + * @param {goog.math.Coordinate} point Point. + * @return {goog.math.Coordinate} Point. + */ +ol.Projection.inverseSphericalMercator = function(point) { + var x = 180 * point.x / (ol.Projection.EPSG_3857_RADIUS * Math.PI); + var y = 360 * Math.atan( + Math.exp(point.y / ol.Projection.EPSG_3857_RADIUS)) / Math.PI - 90; + return new goog.math.Coordinate(x, y); +}; + + +/** + * @const + * @type {number} + */ +ol.Projection.EPSG_3857_HALF_SIZE = Math.PI * ol.Projection.EPSG_3857_RADIUS; + + +/** + * @const + * @type {ol.Extent} + */ +ol.Projection.EPSG_3857_EXTENT = new ol.Extent( + ol.Projection.EPSG_3857_HALF_SIZE, + ol.Projection.EPSG_3857_HALF_SIZE, + -ol.Projection.EPSG_3857_HALF_SIZE, + -ol.Projection.EPSG_3857_HALF_SIZE); + + +/** + * @type {Array.} + */ +ol.Projection.EPSG_3857_LIKE_CODES = [ + 'EPSG:3857', + 'EPSG:102113', + 'EPSG:102100', + 'EPSG:900913' +]; + + +/** + * @const + * @type {Array.} + */ +ol.Projection.EPSG_3857_LIKE_PROJECTIONS = goog.array.map( + ol.Projection.EPSG_3857_LIKE_CODES, + function(code) { + return new ol.Projection( + code, + ol.ProjectionUnits.METERS, + ol.Projection.EPSG_3857_EXTENT); + }); + + +/** + * @const + * @type {ol.Extent} + */ +ol.Projection.EPSG_4326_EXTENT = new ol.Extent(180, 90, -180, -90); + + +/** + * @type {Array.} + */ +ol.Projection.EPSG_4326_LIKE_CODES = [ + 'EPSG:4326', + 'CRS:84', + 'urn:ogc:def:crs:EPSG:6.6:4326' +]; + + +/** + * @const + * @type {Array.} + */ +ol.Projection.EPSG_4326_LIKE_PROJECTIONS = goog.array.map( + ol.Projection.EPSG_4326_LIKE_CODES, + function(code) { + return new ol.Projection( + code, + ol.ProjectionUnits.DEGREES, + ol.Projection.EPSG_4326_EXTENT); + }); + + +ol.Projection.addEquivalentProjections( + ol.Projection.EPSG_3857_LIKE_PROJECTIONS); +ol.Projection.addEquivalentProjections( + ol.Projection.EPSG_4326_LIKE_PROJECTIONS); +ol.Projection.addEquivalentTransforms( + ol.Projection.EPSG_4326_LIKE_PROJECTIONS, + ol.Projection.EPSG_3857_LIKE_PROJECTIONS, + ol.Projection.forwardSphericalMercator, + ol.Projection.inverseSphericalMercator); diff --git a/src/ol/projection_test.js b/src/ol/projection_test.js new file mode 100644 index 0000000000..a47a037882 --- /dev/null +++ b/src/ol/projection_test.js @@ -0,0 +1,87 @@ +goog.require('goog.array'); +goog.require('goog.math.Coordinate'); +goog.require('goog.testing.jsunit'); +goog.require('ol.Projection'); + + +function _testAllEquivalent(codes) { + var projections = goog.array.map(codes, ol.Projection.createFromCode); + goog.array.forEach(projections, function(source) { + goog.array.forEach(projections, function(destination) { + assertTrue(ol.Projection.equivalent(source, destination)); + }); + }); +} + + +function testEpsg3857Equivalence() { + _testAllEquivalent([ + 'EPSG:3857', + 'EPSG:102100', + 'EPSG:102113', + 'EPSG:900913' + ]); +} + + +function testEpsg4326Equivalence() { + _testAllEquivalent([ + 'CRS:84', + 'urn:ogc:def:crs:EPSG:6.6:4326', + 'EPSG:4326' + ]); +} + + +function testIdentityTransform() { + var epsg4326 = ol.Projection.createFromCode('EPSG:4326'); + var uniqueObject = {}; + var sourcePoint = new goog.math.Coordinate(uniqueObject, uniqueObject); + var destinationPoint = ol.Projection.transform( + sourcePoint, epsg4326, epsg4326); + assertFalse(sourcePoint === destinationPoint); + assertTrue(destinationPoint.x === sourcePoint.x); + assertTrue(destinationPoint.y === sourcePoint.y); +} + + +function testForwardSphericalMercatorOrigin() { + var point = ol.Projection.transformWithCodes( + new goog.math.Coordinate(0, 0), 'EPSG:4326', 'EPSG:3857'); + assertNotNullNorUndefined(point); + assertEquals(0, point.x); + assertRoughlyEquals(0, point.y, 1e-9); +} + + +function testInverseSphericalMercatorOrigin() { + var point = ol.Projection.transformWithCodes( + new goog.math.Coordinate(0, 0), 'EPSG:3857', 'EPSG:4326'); + assertNotNullNorUndefined(point); + assertEquals(0, point.x); + assertEquals(0, point.y); +} + + +function testForwardSphericalMercatorAlastaira() { + // http://alastaira.wordpress.com/2011/01/23/the-google-maps-bing-maps-spherical-mercator-projection/ + var point = ol.Projection.transformWithCodes( + new goog.math.Coordinate(-5.625, 52.4827802220782), + 'EPSG:4326', + 'EPSG:900913'); + assertNotNullNorUndefined(point); + assertRoughlyEquals(-626172.13571216376, point.x, 1e-9); + assertRoughlyEquals(6887893.4928337997, point.y, 1e-9); +} + + +function testInverseSphericalMercatorAlastaira() { + // http://alastaira.wordpress.com/2011/01/23/the-google-maps-bing-maps-spherical-mercator-projection/ + var point = ol.Projection.transformWithCodes( + new goog.math.Coordinate(-626172.13571216376, 6887893.4928337997), + 'EPSG:900913', + 'EPSG:4326'); + assertNotNullNorUndefined(point); + assertRoughlyEquals(-5.625, point.x, 1e-9); + assertRoughlyEquals(52.4827802220782, point.y, 1e-9); +} From a2cf655bfab032b92801a7d24a5b193609511efa Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Fri, 6 Jul 2012 12:27:31 +0200 Subject: [PATCH 028/562] Add ol.Layer --- Makefile | 1 - src/all.js | 1 + src/ol/layer.js | 77 +++++++++++++++++++++++++++++++++++++++++++ src/ol/layer/Layer.js | 22 ------------- 4 files changed, 78 insertions(+), 23 deletions(-) create mode 100644 src/ol/layer.js delete mode 100644 src/ol/layer/Layer.js diff --git a/Makefile b/Makefile index 683661c3ba..840530f2f5 100644 --- a/Makefile +++ b/Makefile @@ -34,7 +34,6 @@ GSLINT_EXCLUDES= \ src/ol/geom/MultiPoint.js \ src/ol/geom/Point.js \ src/ol/handler/Drag.js \ - src/ol/layer/Layer.js \ src/ol/layer/OSM.js \ src/ol/layer/TileLayer.js \ src/ol/layer/WMS.js \ diff --git a/src/all.js b/src/all.js index 015da3bdb1..4acf926f1f 100644 --- a/src/all.js +++ b/src/all.js @@ -3,6 +3,7 @@ goog.provide('ol'); goog.require('ol.Bounds'); goog.require('ol.Camera'); goog.require('ol.Extent'); +goog.require('ol.Layer'); goog.require('ol.LayerView'); goog.require('ol.MVCArray'); goog.require('ol.MVCObject'); diff --git a/src/ol/layer.js b/src/ol/layer.js new file mode 100644 index 0000000000..a7164de7f0 --- /dev/null +++ b/src/ol/layer.js @@ -0,0 +1,77 @@ +goog.provide('ol.Layer'); + +goog.require('ol.Extent'); +goog.require('ol.MVCObject'); +goog.require('ol.Projection'); + + +/** + * @enum {string} + * @private + */ +ol.LayerProperty_ = { + ATTRIBUTION: 'attribution', + EXTENT: 'extent', + PROJECTION: 'projection' +}; + + + +/** + * @constructor + * @extends {ol.MVCObject} + */ +ol.Layer = function() { + + goog.base(this); + +}; +goog.inherits(ol.Layer, ol.MVCObject); + + +/** + * @return {string} Attribution. + */ +ol.Layer.prototype.getAttribution = function() { + return /** @type {string} */ (this.get(ol.LayerProperty_.ATTRIBUTION)); +}; + + +/** + * @return {ol.Extent} Extent. + */ +ol.Layer.prototype.getExtent = function() { + return /** @type {ol.Extent} */ (this.get(ol.LayerProperty_.EXTENT)); +}; + + +/** + * @return {ol.Projection} Projection. + */ +ol.Layer.prototype.getProjection = function() { + return /** @type {ol.Projection} */ (this.get(ol.LayerProperty_.PROJECTION)); +}; + + +/** + * @param {string} attribution Attribution. + */ +ol.Layer.prototype.setAttribution = function(attribution) { + this.set(ol.LayerProperty_.ATTRIBUTION, attribution); +}; + + +/** + * @param {ol.Extent} extent Extent. + */ +ol.Layer.prototype.setExtent = function(extent) { + this.set(ol.LayerProperty_.EXTENT, extent); +}; + + +/** + * @param {ol.Projection} projection Projetion. + */ +ol.Layer.prototype.setProjection = function(projection) { + this.set(ol.LayerProperty_.PROJECTION, projection); +}; diff --git a/src/ol/layer/Layer.js b/src/ol/layer/Layer.js deleted file mode 100644 index 8f588e5684..0000000000 --- a/src/ol/layer/Layer.js +++ /dev/null @@ -1,22 +0,0 @@ -goog.provide('ol.layer.Layer'); - -/** - * @constructor - * @export - */ -ol.layer.Layer = function() { - - /** - * @type {string} - * @protected - */ - this.attribution_; - -}; - -/** - * @return {string} - */ -ol.layer.Layer.prototype.getAttribution = function() { - return this.attribution_; -}; From 9368f05d1cb9ac6a8a24ffd56238ada390d195cf Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Fri, 6 Jul 2012 13:23:43 +0200 Subject: [PATCH 029/562] Factor out ol.TransformFunction --- src/all.js | 1 + src/ol/projection.js | 7 +------ src/ol/transformfunction.js | 9 +++++++++ 3 files changed, 11 insertions(+), 6 deletions(-) create mode 100644 src/ol/transformfunction.js diff --git a/src/all.js b/src/all.js index 4acf926f1f..54f9026c22 100644 --- a/src/all.js +++ b/src/all.js @@ -12,3 +12,4 @@ goog.require('ol.TileBounds'); goog.require('ol.TileCoord'); goog.require('ol.TileGrid'); goog.require('ol.TileUrl'); +goog.require('ol.TransformFunction'); diff --git a/src/ol/projection.js b/src/ol/projection.js index 177d584f22..4a9f08d7ff 100644 --- a/src/ol/projection.js +++ b/src/ol/projection.js @@ -5,12 +5,7 @@ goog.require('goog.asserts'); goog.require('goog.math.Coordinate'); goog.require('goog.object'); goog.require('ol.Extent'); - - -/** - * @typedef {function(goog.math.Coordinate): goog.math.Coordinate} - */ -ol.TransformFunction; +goog.require('ol.TransformFunction'); /** diff --git a/src/ol/transformfunction.js b/src/ol/transformfunction.js new file mode 100644 index 0000000000..2f2f2ed532 --- /dev/null +++ b/src/ol/transformfunction.js @@ -0,0 +1,9 @@ +goog.provide('ol.TransformFunction'); + +goog.require('goog.math.Coordinate'); + + +/** + * @typedef {function(goog.math.Coordinate): goog.math.Coordinate} + */ +ol.TransformFunction; From 4bdaf293b016c7658b701a1fdc8e0bd2197c9bf3 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Fri, 6 Jul 2012 13:24:20 +0200 Subject: [PATCH 030/562] Add ol.Extent.transform --- src/ol/extent.js | 12 ++++++++++++ src/ol/extent_test.js | 16 ++++++++++++++++ 2 files changed, 28 insertions(+) create mode 100644 src/ol/extent_test.js diff --git a/src/ol/extent.js b/src/ol/extent.js index 58e2f764f3..d6f971483b 100644 --- a/src/ol/extent.js +++ b/src/ol/extent.js @@ -1,6 +1,7 @@ goog.provide('ol.Extent'); goog.require('goog.math.Box'); +goog.require('ol.TransformFunction'); @@ -26,3 +27,14 @@ goog.inherits(ol.Extent, goog.math.Box); ol.Extent.prototype.clone = function() { return new ol.Extent(this.top, this.right, this.bottom, this.left); }; + + +/** + * @param {ol.TransformFunction} transform Transform. + * @return {ol.Extent} Extent. + */ +ol.Extent.prototype.transform = function(transform) { + var topRight = transform(new goog.math.Coordinate(this.right, this.top)); + var bottomLeft = transform(new goog.math.Coordinate(this.left, this.bottom)); + return new ol.Extent(topRight.y, topRight.x, bottomLeft.y, bottomLeft.x); +}; diff --git a/src/ol/extent_test.js b/src/ol/extent_test.js new file mode 100644 index 0000000000..a1648c2658 --- /dev/null +++ b/src/ol/extent_test.js @@ -0,0 +1,16 @@ +goog.require('goog.testing.jsunit'); +goog.require('ol.Extent'); +goog.require('ol.Projection'); + + +function testTransform() { + var transform = ol.Projection.getTransformFromCodes('EPSG:4326', 'EPSG:3857'); + var sourceExtent = new ol.Extent(60, 45, -30, -15); + var destinationExtent = sourceExtent.transform(transform); + assertNotNullNorUndefined(destinationExtent); + // FIXME check values with third-party tool + assertRoughlyEquals(8399737.889818361, destinationExtent.top, 1e-9); + assertRoughlyEquals(5009377.085697311, destinationExtent.right, 1e-9); + assertRoughlyEquals(-3503549.843504376, destinationExtent.bottom, 1e-9); + assertRoughlyEquals(-1669792.3618991037, destinationExtent.left, 1e-9); +} From 438d5f2484779a2e1a1ac7fde8dc6d22613d214b Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Fri, 6 Jul 2012 20:25:37 +0200 Subject: [PATCH 031/562] Rename ol.MVCObject to ol.Object --- src/all.js | 2 +- src/ol/camera.js | 6 +- src/ol/layer.js | 6 +- src/ol/layerview.js | 6 +- src/ol/mvcarray.js | 6 +- src/ol/{mvcobject.js => object.js} | 102 +++++++------- src/ol/{mvcobject_test.js => object_test.js} | 132 +++++++++---------- 7 files changed, 129 insertions(+), 131 deletions(-) rename src/ol/{mvcobject.js => object.js} (60%) rename src/ol/{mvcobject_test.js => object_test.js} (77%) diff --git a/src/all.js b/src/all.js index 54f9026c22..0567eacfc7 100644 --- a/src/all.js +++ b/src/all.js @@ -6,7 +6,7 @@ goog.require('ol.Extent'); goog.require('ol.Layer'); goog.require('ol.LayerView'); goog.require('ol.MVCArray'); -goog.require('ol.MVCObject'); +goog.require('ol.Object'); goog.require('ol.Projection'); goog.require('ol.TileBounds'); goog.require('ol.TileCoord'); diff --git a/src/ol/camera.js b/src/ol/camera.js index 8c524f42f7..4844de2312 100644 --- a/src/ol/camera.js +++ b/src/ol/camera.js @@ -1,7 +1,7 @@ goog.provide('ol.Camera'); goog.require('goog.math.Coordinate'); -goog.require('ol.MVCObject'); +goog.require('ol.Object'); /** @@ -18,14 +18,14 @@ ol.CameraProperty_ = { /** * @constructor - * @extends {ol.MVCObject} + * @extends {ol.Object} */ ol.Camera = function() { goog.base(this); }; -goog.inherits(ol.Camera, ol.MVCObject); +goog.inherits(ol.Camera, ol.Object); /** diff --git a/src/ol/layer.js b/src/ol/layer.js index a7164de7f0..d6234990a0 100644 --- a/src/ol/layer.js +++ b/src/ol/layer.js @@ -1,7 +1,7 @@ goog.provide('ol.Layer'); goog.require('ol.Extent'); -goog.require('ol.MVCObject'); +goog.require('ol.Object'); goog.require('ol.Projection'); @@ -19,14 +19,14 @@ ol.LayerProperty_ = { /** * @constructor - * @extends {ol.MVCObject} + * @extends {ol.Object} */ ol.Layer = function() { goog.base(this); }; -goog.inherits(ol.Layer, ol.MVCObject); +goog.inherits(ol.Layer, ol.Object); /** diff --git a/src/ol/layerview.js b/src/ol/layerview.js index 452e15c410..b5a3e6cf25 100644 --- a/src/ol/layerview.js +++ b/src/ol/layerview.js @@ -1,6 +1,6 @@ goog.provide('ol.LayerView'); -goog.require('ol.MVCObject'); +goog.require('ol.Object'); /** @@ -16,7 +16,7 @@ ol.LayerViewProperty_ = { /** * @constructor - * @extends {ol.MVCObject} + * @extends {ol.Object} */ ol.LayerView = function() { @@ -26,7 +26,7 @@ ol.LayerView = function() { this.setOpacity(1); }; -goog.inherits(ol.LayerView, ol.MVCObject); +goog.inherits(ol.LayerView, ol.Object); /** diff --git a/src/ol/mvcarray.js b/src/ol/mvcarray.js index 98e3abc252..7be13a3056 100644 --- a/src/ol/mvcarray.js +++ b/src/ol/mvcarray.js @@ -11,7 +11,7 @@ goog.provide('ol.MVCArrayEventType'); goog.require('goog.array'); goog.require('goog.asserts'); goog.require('goog.events.Event'); -goog.require('ol.MVCObject'); +goog.require('ol.Object'); /** @@ -54,7 +54,7 @@ goog.inherits(ol.MVCArrayEvent, goog.events.Event); /** * @constructor - * @extends {ol.MVCObject} + * @extends {ol.Object} * @param {Array=} opt_array Array. */ ol.MVCArray = function(opt_array) { @@ -70,7 +70,7 @@ ol.MVCArray = function(opt_array) { this.updateLength_(); }; -goog.inherits(ol.MVCArray, ol.MVCObject); +goog.inherits(ol.MVCArray, ol.Object); /** diff --git a/src/ol/mvcobject.js b/src/ol/object.js similarity index 60% rename from src/ol/mvcobject.js rename to src/ol/object.js index a62738b516..a979ac1bfe 100644 --- a/src/ol/mvcobject.js +++ b/src/ol/object.js @@ -5,7 +5,7 @@ * @see https://developers.google.com/maps/documentation/javascript/reference */ -goog.provide('ol.MVCObject'); +goog.provide('ol.Object'); goog.require('goog.array'); goog.require('goog.events'); @@ -14,9 +14,9 @@ goog.require('goog.object'); /** - * @typedef {{target: ol.MVCObject, key: string}} + * @typedef {{target: ol.Object, key: string}} */ -ol.MVCObjectAccessor; +ol.ObjectAccessor; @@ -24,32 +24,32 @@ ol.MVCObjectAccessor; * @constructor * @extends {goog.events.EventTarget} */ -ol.MVCObject = function() { +ol.Object = function() { goog.base(this); }; -goog.inherits(ol.MVCObject, goog.events.EventTarget); +goog.inherits(ol.Object, goog.events.EventTarget); /** * @param {string} str String. * @return {string} Capitalized string. */ -ol.MVCObject.capitalize = function(str) { +ol.Object.capitalize = function(str) { return str.substr(0, 1).toUpperCase() + str.substr(1); }; /** - * @param {ol.MVCObject|Object} arg Argument. - * @return {ol.MVCObject} MVCObject. + * @param {ol.Object|Object} arg Argument. + * @return {ol.Object} Object. */ -ol.MVCObject.create = function(arg) { - if (arg instanceof ol.MVCObject) { +ol.Object.create = function(arg) { + if (arg instanceof ol.Object) { return arg; } else { - var mvcObject = new ol.MVCObject(); - mvcObject.setOptions(arg); - return mvcObject; + var object = new ol.Object(); + object.setOptions(arg); + return object; } }; @@ -58,7 +58,7 @@ ol.MVCObject.create = function(arg) { * @private * @type {Object.} */ -ol.MVCObject.getterNameCache_ = {}; +ol.Object.getterNameCache_ = {}; /** @@ -66,10 +66,9 @@ ol.MVCObject.getterNameCache_ = {}; * @private * @return {string} Capitalized string. */ -ol.MVCObject.getGetterName_ = function(str) { - return ol.MVCObject.getterNameCache_[str] || - (ol.MVCObject.getterNameCache_[str] = - 'get' + ol.MVCObject.capitalize(str)); +ol.Object.getGetterName_ = function(str) { + return ol.Object.getterNameCache_[str] || + (ol.Object.getterNameCache_[str] = 'get' + ol.Object.capitalize(str)); }; @@ -77,7 +76,7 @@ ol.MVCObject.getGetterName_ = function(str) { * @private * @type {Object.} */ -ol.MVCObject.setterNameCache_ = {}; +ol.Object.setterNameCache_ = {}; /** @@ -85,47 +84,46 @@ ol.MVCObject.setterNameCache_ = {}; * @private * @return {string} Capitalized string. */ -ol.MVCObject.getSetterName_ = function(str) { - return ol.MVCObject.setterNameCache_[str] || - (ol.MVCObject.setterNameCache_[str] = - 'set' + ol.MVCObject.capitalize(str)); +ol.Object.getSetterName_ = function(str) { + return ol.Object.setterNameCache_[str] || + (ol.Object.setterNameCache_[str] = 'set' + ol.Object.capitalize(str)); }; /** - * @param {ol.MVCObject} obj Object. - * @return {Object.} Accessors. + * @param {ol.Object} obj Object. + * @return {Object.} Accessors. */ -ol.MVCObject.getAccessors = function(obj) { - return obj['gm_accessors_'] || (obj['gm_accessors_'] = {}); +ol.Object.getAccessors = function(obj) { + return obj['ol_accessors_'] || (obj['ol_accessors_'] = {}); }; /** - * @param {ol.MVCObject} obj Object. + * @param {ol.Object} obj Object. * @return {Object.} Listeners. */ -ol.MVCObject.getListeners = function(obj) { - return obj['gm_bindings_'] || (obj['gm_bindings_'] = {}); +ol.Object.getListeners = function(obj) { + return obj['ol_bindings_'] || (obj['ol_bindings_'] = {}); }; /** * @param {string} key Key. - * @param {ol.MVCObject} target Target. + * @param {ol.Object} target Target. * @param {string=} opt_targetKey Target key. * @param {boolean=} opt_noNotify No notify. */ -ol.MVCObject.prototype.bindTo = +ol.Object.prototype.bindTo = function(key, target, opt_targetKey, opt_noNotify) { var targetKey = goog.isDef(opt_targetKey) ? opt_targetKey : key; this.unbind(key); var eventType = targetKey.toLowerCase() + '_changed'; - var listeners = ol.MVCObject.getListeners(this); + var listeners = ol.Object.getListeners(this); listeners[key] = goog.events.listen(target, eventType, function() { this.notifyInternal_(key); }, undefined, this); - var accessors = ol.MVCObject.getAccessors(this); + var accessors = ol.Object.getAccessors(this); accessors[key] = {target: target, key: targetKey}; var noNotify = goog.isDef(opt_noNotify) ? opt_noNotify : false; if (!noNotify) { @@ -137,7 +135,7 @@ ol.MVCObject.prototype.bindTo = /** * @param {string} key Key. */ -ol.MVCObject.prototype.changed = function(key) { +ol.Object.prototype.changed = function(key) { }; @@ -145,13 +143,13 @@ ol.MVCObject.prototype.changed = function(key) { * @param {string} key Key. * @return {*} Value. */ -ol.MVCObject.prototype.get = function(key) { - var accessors = ol.MVCObject.getAccessors(this); +ol.Object.prototype.get = function(key) { + var accessors = ol.Object.getAccessors(this); if (goog.object.containsKey(accessors, key)) { var accessor = accessors[key]; var target = accessor.target; var targetKey = accessor.key; - var getterName = ol.MVCObject.getGetterName_(targetKey); + var getterName = ol.Object.getGetterName_(targetKey); if (target[getterName]) { return target[getterName](); } else { @@ -166,8 +164,8 @@ ol.MVCObject.prototype.get = function(key) { /** * @param {string} key Key. */ -ol.MVCObject.prototype.notify = function(key) { - var accessors = ol.MVCObject.getAccessors(this); +ol.Object.prototype.notify = function(key) { + var accessors = ol.Object.getAccessors(this); if (goog.object.containsKey(accessors, key)) { var accessor = accessors[key]; var target = accessor.target; @@ -183,7 +181,7 @@ ol.MVCObject.prototype.notify = function(key) { * @param {string} key Key. * @private */ -ol.MVCObject.prototype.notifyInternal_ = function(key) { +ol.Object.prototype.notifyInternal_ = function(key) { var changedMethodName = key + '_changed'; if (this[changedMethodName]) { this[changedMethodName](); @@ -199,13 +197,13 @@ ol.MVCObject.prototype.notifyInternal_ = function(key) { * @param {string} key Key. * @param {*} value Value. */ -ol.MVCObject.prototype.set = function(key, value) { - var accessors = ol.MVCObject.getAccessors(this); +ol.Object.prototype.set = function(key, value) { + var accessors = ol.Object.getAccessors(this); if (goog.object.containsKey(accessors, key)) { var accessor = accessors[key]; var target = accessor.target; var targetKey = accessor.key; - var setterName = ol.MVCObject.getSetterName_(targetKey); + var setterName = ol.Object.getSetterName_(targetKey); if (target[setterName]) { target[setterName](value); } else { @@ -221,9 +219,9 @@ ol.MVCObject.prototype.set = function(key, value) { /** * @param {Object.} options Options. */ -ol.MVCObject.prototype.setOptions = function(options) { +ol.Object.prototype.setOptions = function(options) { goog.object.forEach(options, function(value, key) { - var setterName = ol.MVCObject.getSetterName_(key); + var setterName = ol.Object.getSetterName_(key); if (this[setterName]) { this[setterName](value); } else { @@ -236,20 +234,20 @@ ol.MVCObject.prototype.setOptions = function(options) { /** * @param {Object.} values Values. */ -ol.MVCObject.prototype.setValues = ol.MVCObject.prototype.setOptions; +ol.Object.prototype.setValues = ol.Object.prototype.setOptions; /** * @param {string} key Key. */ -ol.MVCObject.prototype.unbind = function(key) { - var listeners = ol.MVCObject.getListeners(this); +ol.Object.prototype.unbind = function(key) { + var listeners = ol.Object.getListeners(this); var listener = listeners[key]; if (listener) { delete listeners[key]; goog.events.unlistenByKey(listener); var value = this.get(key); - var accessors = ol.MVCObject.getAccessors(this); + var accessors = ol.Object.getAccessors(this); delete accessors[key]; this[key] = value; } @@ -258,8 +256,8 @@ ol.MVCObject.prototype.unbind = function(key) { /** */ -ol.MVCObject.prototype.unbindAll = function() { - var listeners = ol.MVCObject.getListeners(this); +ol.Object.prototype.unbindAll = function() { + var listeners = ol.Object.getListeners(this); var keys = goog.object.getKeys(listeners); goog.array.forEach(keys, function(key) { this.unbind(key); diff --git a/src/ol/mvcobject_test.js b/src/ol/object_test.js similarity index 77% rename from src/ol/mvcobject_test.js rename to src/ol/object_test.js index 594987e3d0..680bdc4c4f 100644 --- a/src/ol/mvcobject_test.js +++ b/src/ol/object_test.js @@ -1,21 +1,21 @@ goog.require('goog.testing.jsunit'); -goog.require('ol.MVCObject'); +goog.require('ol.Object'); function testModel() { - var m = new ol.MVCObject(); + var m = new ol.Object(); assertNotNullNorUndefined(m); } function testGetUndefined() { - var m = new ol.MVCObject(); + var m = new ol.Object(); assertUndefined(m.get('k')); } function testGetSetGet() { - var m = new ol.MVCObject(); + var m = new ol.Object(); assertUndefined(m.get('k')); m.set('k', 1); assertEquals(1, m.get('k')); @@ -23,7 +23,7 @@ function testGetSetGet() { function testSetValues() { - var m = new ol.MVCObject(); + var m = new ol.Object(); m.setValues({ k1: 1, k2: 2 @@ -33,7 +33,7 @@ function testSetValues() { } function testNotifyCallback() { - var m = new ol.MVCObject(); + var m = new ol.Object(); var callbackCalled; m.changed = function() { callbackCalled = true; @@ -44,7 +44,7 @@ function testNotifyCallback() { function testNotifyKeyCallback() { - var m = new ol.MVCObject(); + var m = new ol.Object(); var callbackCalled = false; m.k_changed = function() { callbackCalled = true; @@ -55,7 +55,7 @@ function testNotifyKeyCallback() { function testNotifyKeyEvent() { - var m = new ol.MVCObject(); + var m = new ol.Object(); var eventDispatched = false; goog.events.listen(m, 'k_changed', function() { eventDispatched = true; @@ -66,7 +66,7 @@ function testNotifyKeyEvent() { function testSetNotifyCallback() { - var m = new ol.MVCObject(); + var m = new ol.Object(); var callbackCalled; m.changed = function() { callbackCalled = true; @@ -77,7 +77,7 @@ function testSetNotifyCallback() { function testSetNotifyKeyCallback() { - var m = new ol.MVCObject(); + var m = new ol.Object(); var callbackCalled = false; m.k_changed = function(v) { callbackCalled = true; @@ -88,8 +88,8 @@ function testSetNotifyKeyCallback() { function testBindSetNotifyKeyCallback() { - var m = new ol.MVCObject(); - var n = new ol.MVCObject(); + var m = new ol.Object(); + var n = new ol.Object(); var callbackCalled = false; n.k_changed = function(v) { callbackCalled = true; @@ -101,7 +101,7 @@ function testBindSetNotifyKeyCallback() { function testSetNotifyKeyEvent() { - var m = new ol.MVCObject(); + var m = new ol.Object(); var eventDispatched = false; goog.events.listen(m, 'k_changed', function() { eventDispatched = true; @@ -112,8 +112,8 @@ function testSetNotifyKeyEvent() { function testSetBind() { - var m = new ol.MVCObject(); - var n = new ol.MVCObject(); + var m = new ol.Object(); + var n = new ol.Object(); m.set('k', 1); assertEquals(1, m.get('k')); assertUndefined(n.get('k')); @@ -124,8 +124,8 @@ function testSetBind() { function testBindSet() { - var m = new ol.MVCObject(); - var n = new ol.MVCObject(); + var m = new ol.Object(); + var n = new ol.Object(); n.bindTo('k', m); m.set('k', 1); assertEquals(1, m.get('k')); @@ -134,8 +134,8 @@ function testBindSet() { function testBindSetBackwards() { - var m = new ol.MVCObject(); - var n = new ol.MVCObject(); + var m = new ol.Object(); + var n = new ol.Object(); n.bindTo('k', m); n.set('k', 1); assertEquals(1, m.get('k')); @@ -144,8 +144,8 @@ function testBindSetBackwards() { function testSetBindBackwards() { - var m = new ol.MVCObject(); - var n = new ol.MVCObject(); + var m = new ol.Object(); + var n = new ol.Object(); n.set('k', 1); n.bindTo('k', m); assertUndefined(m.get('k')); @@ -154,8 +154,8 @@ function testSetBindBackwards() { function testBindSetUnbind() { - var m = new ol.MVCObject(); - var n = new ol.MVCObject(); + var m = new ol.Object(); + var n = new ol.Object(); n.bindTo('k', m); n.set('k', 1); assertEquals(1, m.get('k')); @@ -170,8 +170,8 @@ function testBindSetUnbind() { function testUnbindAll() { - var m = new ol.MVCObject(); - var n = new ol.MVCObject(); + var m = new ol.Object(); + var n = new ol.Object(); n.bindTo('k', m); n.set('k', 1); assertEquals(m.get('k'), 1); @@ -186,8 +186,8 @@ function testUnbindAll() { function testBindNotify() { - var m = new ol.MVCObject(); - var n = new ol.MVCObject(); + var m = new ol.Object(); + var n = new ol.Object(); m.bindTo('k', n); mCallbackCalled = false; m.k_changed = function() { @@ -204,8 +204,8 @@ function testBindNotify() { function testBindBackwardsNotify() { - var m = new ol.MVCObject(); - var n = new ol.MVCObject(); + var m = new ol.Object(); + var n = new ol.Object(); n.bindTo('k', m); mCallbackCalled = false; m.k_changed = function() { @@ -222,8 +222,8 @@ function testBindBackwardsNotify() { function testBindRename() { - var m = new ol.MVCObject(); - var n = new ol.MVCObject(); + var m = new ol.Object(); + var n = new ol.Object(); n.bindTo('kn', m, 'km'); m.set('km', 1); assertEquals(m.get('km'), 1); @@ -232,8 +232,8 @@ function testBindRename() { function testBindRenameCallbacks() { - var m = new ol.MVCObject(); - var n = new ol.MVCObject(); + var m = new ol.Object(); + var n = new ol.Object(); var kmCallbackCalled = false; m.km_changed = function() { kmCallbackCalled = true; @@ -252,9 +252,9 @@ function testBindRenameCallbacks() { function testTransitiveBindForwards() { - var m = new ol.MVCObject(); - var n = new ol.MVCObject(); - var o = new ol.MVCObject(); + var m = new ol.Object(); + var n = new ol.Object(); + var o = new ol.Object(); n.bindTo('kn', m, 'km'); o.bindTo('ko', n, 'kn'); m.set('km', 1); @@ -265,9 +265,9 @@ function testTransitiveBindForwards() { function testTransitiveBindBackwards() { - var m = new ol.MVCObject(); - var n = new ol.MVCObject(); - var o = new ol.MVCObject(); + var m = new ol.Object(); + var n = new ol.Object(); + var o = new ol.Object(); n.bindTo('kn', m, 'km'); o.bindTo('ko', n, 'kn'); o.set('ko', 1); @@ -279,7 +279,7 @@ function testTransitiveBindBackwards() { function testInheritance() { var C = function() {}; - C.prototype = new ol.MVCObject(); + C.prototype = new ol.Object(); var callbackCalled; C.prototype.k_changed = function() { callbackCalled = true; @@ -293,10 +293,10 @@ function testInheritance() { function testMrideyAccessors() { // http://blog.mridey.com/2010/03/maps-javascript-api-v3-more-about.html - var a = new ol.MVCObject(); + var a = new ol.Object(); a.set('level', 2); assertEquals(2, a.get('level')); - var b = new ol.MVCObject(); + var b = new ol.Object(); b.setValues({ level: 2, index: 3, @@ -308,16 +308,16 @@ function testMrideyAccessors() { function testMrideyBinding() { // http://blog.mridey.com/2010/03/maps-javascript-api-v3-more-about.html - var a = new ol.MVCObject(); + var a = new ol.Object(); a.set('level', 2); - var b = new ol.MVCObject(); + var b = new ol.Object(); b.bindTo('index', a, 'level'); assertEquals(2, b.get('index')); a.set('level', 3); assertEquals(3, b.get('index')); b.set('index', 4); assertEquals(4, a.get('level')); - var c = new ol.MVCObject(); + var c = new ol.Object(); c.bindTo('zoom', a, 'level'); assertEquals(4, c.get('zoom')); b.unbind('index'); @@ -329,8 +329,8 @@ function testMrideyBinding() { function testCircularBind() { - var a = new ol.MVCObject(); - var b = new ol.MVCObject(); + var a = new ol.Object(); + var b = new ol.Object(); a.bindTo('k', b); assertThrows(function() { b.bindTo('k', a); @@ -339,8 +339,8 @@ function testCircularBind() { function testPriority() { - var a = new ol.MVCObject(); - var b = new ol.MVCObject(); + var a = new ol.Object(); + var b = new ol.Object(); a.set('k', 1); b.set('k', 2); a.bindTo('k', b); @@ -350,8 +350,8 @@ function testPriority() { function testPriorityUndefined() { - var a = new ol.MVCObject(); - var b = new ol.MVCObject(); + var a = new ol.Object(); + var b = new ol.Object(); a.set('k', 1); a.bindTo('k', b); assertUndefined(a.get('k')); @@ -360,7 +360,7 @@ function testPriorityUndefined() { function testSetter() { - var a = new ol.MVCObject(); + var a = new ol.Object(); var x; var setterCalled; a.setX = function(value) { @@ -374,14 +374,14 @@ function testSetter() { function testSetterBind() { - var a = new ol.MVCObject(); + var a = new ol.Object(); var x; var setterCalled; a.setX = function(value) { this.x = value; setterCalled = true; }; - var b = new ol.MVCObject(); + var b = new ol.Object(); b.bindTo('x', a); b.set('x', 1); assertEquals(1, a.get('x')); @@ -391,7 +391,7 @@ function testSetterBind() { function testGetter() { - var a = new ol.MVCObject(); + var a = new ol.Object(); var getterCalled; a.getX = function() { getterCalled = true; @@ -403,13 +403,13 @@ function testGetter() { function testGetterBind() { - var a = new ol.MVCObject(); + var a = new ol.Object(); var getterCalled; a.getX = function() { getterCalled = true; return 1; }; - var b = new ol.MVCObject(); + var b = new ol.Object(); b.bindTo('x', a); assertEquals(1, b.get('x')); assertTrue(getterCalled); @@ -417,7 +417,7 @@ function testGetterBind() { function testBindSelf() { - var a = new ol.MVCObject(); + var a = new ol.Object(); assertThrows(function() { a.bindTo('k', a); }); @@ -425,7 +425,7 @@ function testBindSelf() { function testChangedKey() { - var a = new ol.MVCObject(); + var a = new ol.Object(); var changedKey; a.changed = function(key) { changedKey = key; @@ -437,14 +437,14 @@ function testChangedKey() { function testCreateFromObject() { var obj = {k: 1}; - var mvcObject = ol.MVCObject.create(obj); - assertTrue(mvcObject instanceof ol.MVCObject); - assertEquals(1, mvcObject.get('k')); + var obj = ol.Object.create(obj); + assertTrue(obj instanceof ol.Object); + assertEquals(1, obj.get('k')); } -function testCreateFromMVCObject() { - var mvcObject1 = new ol.MVCObject(); - var mvcObject2 = ol.MVCObject.create(mvcObject1); - assertTrue(mvcObject2 === mvcObject1); +function testCreateFromObject() { + var obj1 = new ol.Object(); + var obj2 = ol.Object.create(obj1); + assertTrue(obj2 === obj1); } From 331ee15ac8235aea0e69374ee4a759a7a7d0f8af Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Fri, 6 Jul 2012 20:29:28 +0200 Subject: [PATCH 032/562] Enumerate ol.Object properties --- src/ol/object.js | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/ol/object.js b/src/ol/object.js index a979ac1bfe..c80c10ca18 100644 --- a/src/ol/object.js +++ b/src/ol/object.js @@ -19,6 +19,15 @@ goog.require('goog.object'); ol.ObjectAccessor; +/** + * @enum {string} + */ +ol.ObjectProperty = { + ACCESSORS: 'ol_accessors_', + BINDINGS: 'ol_bindings_' +}; + + /** * @constructor @@ -95,7 +104,8 @@ ol.Object.getSetterName_ = function(str) { * @return {Object.} Accessors. */ ol.Object.getAccessors = function(obj) { - return obj['ol_accessors_'] || (obj['ol_accessors_'] = {}); + return obj[ol.ObjectProperty.ACCESSORS] || + (obj[ol.ObjectProperty.ACCESSORS] = {}); }; @@ -104,7 +114,8 @@ ol.Object.getAccessors = function(obj) { * @return {Object.} Listeners. */ ol.Object.getListeners = function(obj) { - return obj['ol_bindings_'] || (obj['ol_bindings_'] = {}); + return obj[ol.ObjectProperty.BINDINGS] || + (obj[ol.ObjectProperty.BINDINGS] = {}); }; From d70869c702025fbec3ebe144e3d0fdfc30808dbf Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Fri, 6 Jul 2012 20:37:53 +0200 Subject: [PATCH 033/562] Rename ol.MVCArray to ol.Array --- src/all.js | 2 +- src/ol/{mvcarray.js => array.js} | 78 +++++++++++----------- src/ol/{mvcarray_test.js => array_test.js} | 56 ++++++++-------- 3 files changed, 68 insertions(+), 68 deletions(-) rename src/ol/{mvcarray.js => array.js} (56%) rename src/ol/{mvcarray_test.js => array_test.js} (67%) diff --git a/src/all.js b/src/all.js index 0567eacfc7..df772a0103 100644 --- a/src/all.js +++ b/src/all.js @@ -1,11 +1,11 @@ goog.provide('ol'); +goog.require('ol.Array'); goog.require('ol.Bounds'); goog.require('ol.Camera'); goog.require('ol.Extent'); goog.require('ol.Layer'); goog.require('ol.LayerView'); -goog.require('ol.MVCArray'); goog.require('ol.Object'); goog.require('ol.Projection'); goog.require('ol.TileBounds'); diff --git a/src/ol/mvcarray.js b/src/ol/array.js similarity index 56% rename from src/ol/mvcarray.js rename to src/ol/array.js index 7be13a3056..c970f7f587 100644 --- a/src/ol/mvcarray.js +++ b/src/ol/array.js @@ -4,9 +4,9 @@ * @see https://developers.google.com/maps/documentation/javascript/reference */ -goog.provide('ol.MVCArray'); -goog.provide('ol.MVCArrayEvent'); -goog.provide('ol.MVCArrayEventType'); +goog.provide('ol.Array'); +goog.provide('ol.ArrayEvent'); +goog.provide('ol.ArrayEventType'); goog.require('goog.array'); goog.require('goog.asserts'); @@ -17,7 +17,7 @@ goog.require('ol.Object'); /** * @enum {string} */ -ol.MVCArrayEventType = { +ol.ArrayEventType = { INSERT_AT: 'insert_at', REMOVE_AT: 'remove_at', SET_AT: 'set_at' @@ -28,12 +28,12 @@ ol.MVCArrayEventType = { /** * @constructor * @extends {goog.events.Event} - * @param {ol.MVCArrayEventType} type Type. + * @param {ol.ArrayEventType} type Type. * @param {number} index Index. * @param {*=} opt_prev Value. * @param {Object=} opt_target Target. */ -ol.MVCArrayEvent = function(type, index, opt_prev, opt_target) { +ol.ArrayEvent = function(type, index, opt_prev, opt_target) { goog.base(this, type, opt_target); @@ -48,7 +48,7 @@ ol.MVCArrayEvent = function(type, index, opt_prev, opt_target) { this.prev = opt_prev; }; -goog.inherits(ol.MVCArrayEvent, goog.events.Event); +goog.inherits(ol.ArrayEvent, goog.events.Event); @@ -57,7 +57,7 @@ goog.inherits(ol.MVCArrayEvent, goog.events.Event); * @extends {ol.Object} * @param {Array=} opt_array Array. */ -ol.MVCArray = function(opt_array) { +ol.Array = function(opt_array) { goog.base(this); @@ -70,33 +70,33 @@ ol.MVCArray = function(opt_array) { this.updateLength_(); }; -goog.inherits(ol.MVCArray, ol.Object); +goog.inherits(ol.Array, ol.Object); /** * @const * @type {string} */ -ol.MVCArray.LENGTH = 'length'; +ol.Array.LENGTH = 'length'; /** - * @param {ol.MVCArray|Array} arg Argument. - * @return {ol.MVCArray} MVCArray. + * @param {ol.Array|Array} arg Argument. + * @return {ol.Array} Array. */ -ol.MVCArray.create = function(arg) { - if (arg instanceof ol.MVCArray) { +ol.Array.create = function(arg) { + if (arg instanceof ol.Array) { return arg; } else { - return new ol.MVCArray(arg); + return new ol.Array(arg); } }; /** */ -ol.MVCArray.prototype.clear = function() { - while (this[ol.MVCArray.LENGTH]) { +ol.Array.prototype.clear = function() { + while (this[ol.Array.LENGTH]) { this.pop(); } }; @@ -105,7 +105,7 @@ ol.MVCArray.prototype.clear = function() { /** * @param {function(*, number)} callback Callback. */ -ol.MVCArray.prototype.forEach = function(callback) { +ol.Array.prototype.forEach = function(callback) { goog.array.forEach(this.array_, callback); }; @@ -113,7 +113,7 @@ ol.MVCArray.prototype.forEach = function(callback) { /** * @return {Array} Array. */ -ol.MVCArray.prototype.getArray = function() { +ol.Array.prototype.getArray = function() { return this.array_; }; @@ -122,7 +122,7 @@ ol.MVCArray.prototype.getArray = function() { * @param {number} index Index. * @return {*} Element. */ -ol.MVCArray.prototype.getAt = function(index) { +ol.Array.prototype.getAt = function(index) { return this.array_[index]; }; @@ -130,8 +130,8 @@ ol.MVCArray.prototype.getAt = function(index) { /** * @return {number} Length. */ -ol.MVCArray.prototype.getLength = function() { - return /** @type {number} */ (this.get(ol.MVCArray.LENGTH)); +ol.Array.prototype.getLength = function() { + return /** @type {number} */ (this.get(ol.Array.LENGTH)); }; @@ -139,13 +139,13 @@ ol.MVCArray.prototype.getLength = function() { * @param {number} index Index. * @param {*} elem Element. */ -ol.MVCArray.prototype.insertAt = function(index, elem) { +ol.Array.prototype.insertAt = function(index, elem) { goog.array.insertAt(this.array_, elem, index); this.updateLength_(); - this.dispatchEvent(new ol.MVCArrayEvent( - ol.MVCArrayEventType.INSERT_AT, index, undefined, this)); - if (this[ol.MVCArrayEventType.INSERT_AT]) { - this[ol.MVCArrayEventType.INSERT_AT](index); + this.dispatchEvent(new ol.ArrayEvent( + ol.ArrayEventType.INSERT_AT, index, undefined, this)); + if (this[ol.ArrayEventType.INSERT_AT]) { + this[ol.ArrayEventType.INSERT_AT](index); } }; @@ -153,7 +153,7 @@ ol.MVCArray.prototype.insertAt = function(index, elem) { /** * @return {*} Element. */ -ol.MVCArray.prototype.pop = function() { +ol.Array.prototype.pop = function() { return this.removeAt(this.getLength() - 1); }; @@ -162,7 +162,7 @@ ol.MVCArray.prototype.pop = function() { * @param {*} elem Element. * @return {number} Length. */ -ol.MVCArray.prototype.push = function(elem) { +ol.Array.prototype.push = function(elem) { var n = this.array_.length; this.insertAt(n, elem); return n; @@ -173,14 +173,14 @@ ol.MVCArray.prototype.push = function(elem) { * @param {number} index Index. * @return {*} Value. */ -ol.MVCArray.prototype.removeAt = function(index) { +ol.Array.prototype.removeAt = function(index) { var prev = this.array_[index]; goog.array.removeAt(this.array_, index); this.updateLength_(); - this.dispatchEvent(new ol.MVCArrayEvent(ol.MVCArrayEventType.REMOVE_AT, + this.dispatchEvent(new ol.ArrayEvent(ol.ArrayEventType.REMOVE_AT, index, prev, this)); - if (this[ol.MVCArrayEventType.REMOVE_AT]) { - this[ol.MVCArrayEventType.REMOVE_AT](index); + if (this[ol.ArrayEventType.REMOVE_AT]) { + this[ol.ArrayEventType.REMOVE_AT](index); } return prev; }; @@ -190,15 +190,15 @@ ol.MVCArray.prototype.removeAt = function(index) { * @param {number} index Index. * @param {*} elem Element. */ -ol.MVCArray.prototype.setAt = function(index, elem) { - var n = this[ol.MVCArray.LENGTH]; +ol.Array.prototype.setAt = function(index, elem) { + var n = this[ol.Array.LENGTH]; if (index < n) { var prev = this.array_[index]; this.array_[index] = elem; - this.dispatchEvent(new ol.MVCArrayEvent(ol.MVCArrayEventType.SET_AT, + this.dispatchEvent(new ol.ArrayEvent(ol.ArrayEventType.SET_AT, index, prev, this)); - if (this[ol.MVCArrayEventType.SET_AT]) { - this[ol.MVCArrayEventType.SET_AT](index, prev); + if (this[ol.ArrayEventType.SET_AT]) { + this[ol.ArrayEventType.SET_AT](index, prev); } } else { var j; @@ -213,6 +213,6 @@ ol.MVCArray.prototype.setAt = function(index, elem) { /** * @private */ -ol.MVCArray.prototype.updateLength_ = function() { +ol.Array.prototype.updateLength_ = function() { this.set('length', this.array_.length); }; diff --git a/src/ol/mvcarray_test.js b/src/ol/array_test.js similarity index 67% rename from src/ol/mvcarray_test.js rename to src/ol/array_test.js index bb41c2b7ba..c073b22b2a 100644 --- a/src/ol/mvcarray_test.js +++ b/src/ol/array_test.js @@ -1,11 +1,11 @@ goog.require('goog.array'); goog.require('goog.testing.jsunit'); -goog.require('ol.MVCArray'); -goog.require('ol.MVCArrayEventType'); +goog.require('ol.Array'); +goog.require('ol.ArrayEventType'); function testEmpty() { - var a = new ol.MVCArray(); + var a = new ol.Array(); assertEquals(0, a.getLength()); assertTrue(goog.array.equals(a.getArray(), [])); assertUndefined(a.getAt(0)); @@ -14,7 +14,7 @@ function testEmpty() { function testConstruct() { var array = [0, 1, 2]; - var a = new ol.MVCArray(array); + var a = new ol.Array(array); assertEquals(0, a.getAt(0)); assertEquals(1, a.getAt(1)); assertEquals(2, a.getAt(2)); @@ -22,7 +22,7 @@ function testConstruct() { function testPush() { - var a = new ol.MVCArray(); + var a = new ol.Array(); a.push(1); assertEquals(1, a.getLength()); assertTrue(goog.array.equals(a.getArray(), [1])); @@ -31,7 +31,7 @@ function testPush() { function testPushPop() { - var a = new ol.MVCArray(); + var a = new ol.Array(); a.push(1); a.pop(); assertEquals(0, a.getLength()); @@ -41,7 +41,7 @@ function testPushPop() { function testInsertAt() { - var a = new ol.MVCArray([0, 2]); + var a = new ol.Array([0, 2]); a.insertAt(1, 1); assertEquals(0, a.getAt(0)); assertEquals(1, a.getAt(1)); @@ -50,7 +50,7 @@ function testInsertAt() { function testSetAt() { - var a = new ol.MVCArray(); + var a = new ol.Array(); a.setAt(1, 1); assertEquals(2, a.getLength()); assertUndefined(a.getAt(0)); @@ -59,7 +59,7 @@ function testSetAt() { function testRemoveAt() { - var a = new ol.MVCArray([0, 1, 2]); + var a = new ol.Array([0, 1, 2]); a.removeAt(1); assertEquals(0, a.getAt(0)); assertEquals(2, a.getAt(1)); @@ -67,7 +67,7 @@ function testRemoveAt() { function testForEachEmpty() { - var a = new ol.MVCArray(); + var a = new ol.Array(); var forEachCalled = false; a.forEach(function() { forEachCalled = true; @@ -77,7 +77,7 @@ function testForEachEmpty() { function testForEachPopulated() { - var a = new ol.MVCArray(); + var a = new ol.Array(); a.push(1); a.push(2); var forEachCount = 0; @@ -89,9 +89,9 @@ function testForEachPopulated() { function testSetAtEvent() { - var a = new ol.MVCArray(['a', 'b']); + var a = new ol.Array(['a', 'b']); var index, prev; - goog.events.listen(a, ol.MVCArrayEventType.SET_AT, function(e) { + goog.events.listen(a, ol.ArrayEventType.SET_AT, function(e) { index = e.index; prev = e.prev; }); @@ -102,9 +102,9 @@ function testSetAtEvent() { function testRemoveAtEvent() { - var a = new ol.MVCArray(['a']); + var a = new ol.Array(['a']); var index, prev; - goog.events.listen(a, ol.MVCArrayEventType.REMOVE_AT, function(e) { + goog.events.listen(a, ol.ArrayEventType.REMOVE_AT, function(e) { index = e.index; prev = e.prev; }); @@ -115,9 +115,9 @@ function testRemoveAtEvent() { function testInsertAtEvent() { - var a = new ol.MVCArray([0, 2]); + var a = new ol.Array([0, 2]); var index; - goog.events.listen(a, ol.MVCArrayEventType.INSERT_AT, function(e) { + goog.events.listen(a, ol.ArrayEventType.INSERT_AT, function(e) { index = e.index; }); a.insertAt(1, 1); @@ -126,7 +126,7 @@ function testInsertAtEvent() { function testSetAtBeyondEnd() { - var a = new ol.MVCArray(); + var a = new ol.Array(); var inserts = []; a.insert_at = function(index) { inserts.push(index); @@ -145,18 +145,18 @@ function testSetAtBeyondEnd() { function testCreateFromArray() { var a = [0, 1, 2]; - var mvcArray = ol.MVCArray.create(a); - assertTrue(mvcArray instanceof ol.MVCArray); - assertEquals(3, mvcArray.getLength()); - assertEquals(0, mvcArray.getAt(0)); - assertEquals(1, mvcArray.getAt(1)); - assertEquals(2, mvcArray.getAt(2)); + var array = ol.Array.create(a); + assertTrue(array instanceof ol.Array); + assertEquals(3, array.getLength()); + assertEquals(0, array.getAt(0)); + assertEquals(1, array.getAt(1)); + assertEquals(2, array.getAt(2)); } -function testCreateFromMVCArray() { - var mvcArray1 = new ol.MVCArray(); - var mvcArray2 = ol.MVCArray.create(mvcArray1); - assertTrue(mvcArray1 === mvcArray2); +function testCreateFromArray() { + var array1 = new ol.Array(); + var array2 = ol.Array.create(array1); + assertTrue(array1 === array2); } From 7b6fb0b4ca206bd531a4d664018cb226a451ea65 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Fri, 6 Jul 2012 20:40:19 +0200 Subject: [PATCH 034/562] Enumerate ol.Array properties --- src/ol/array.js | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/src/ol/array.js b/src/ol/array.js index c970f7f587..b397baa073 100644 --- a/src/ol/array.js +++ b/src/ol/array.js @@ -51,6 +51,14 @@ ol.ArrayEvent = function(type, index, opt_prev, opt_target) { goog.inherits(ol.ArrayEvent, goog.events.Event); +/** + * @enum {string} + */ +ol.ArrayProperty = { + LENGTH: 'length' +}; + + /** * @constructor @@ -73,13 +81,6 @@ ol.Array = function(opt_array) { goog.inherits(ol.Array, ol.Object); -/** - * @const - * @type {string} - */ -ol.Array.LENGTH = 'length'; - - /** * @param {ol.Array|Array} arg Argument. * @return {ol.Array} Array. @@ -96,7 +97,7 @@ ol.Array.create = function(arg) { /** */ ol.Array.prototype.clear = function() { - while (this[ol.Array.LENGTH]) { + while (this[ol.ArrayProperty.LENGTH]) { this.pop(); } }; @@ -131,7 +132,7 @@ ol.Array.prototype.getAt = function(index) { * @return {number} Length. */ ol.Array.prototype.getLength = function() { - return /** @type {number} */ (this.get(ol.Array.LENGTH)); + return /** @type {number} */ (this.get(ol.ArrayProperty.LENGTH)); }; @@ -191,7 +192,7 @@ ol.Array.prototype.removeAt = function(index) { * @param {*} elem Element. */ ol.Array.prototype.setAt = function(index, elem) { - var n = this[ol.Array.LENGTH]; + var n = this[ol.ArrayProperty.LENGTH]; if (index < n) { var prev = this.array_[index]; this.array_[index] = elem; From b92a958bcd3ff59045d2cd2c2b31b7dc136837dd Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Fri, 6 Jul 2012 20:43:29 +0200 Subject: [PATCH 035/562] Add more ol.Array tests --- src/ol/array_test.js | 34 +++++++++++++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/src/ol/array_test.js b/src/ol/array_test.js index c073b22b2a..1d77583d5d 100644 --- a/src/ol/array_test.js +++ b/src/ol/array_test.js @@ -158,5 +158,37 @@ function testCreateFromArray() { var array1 = new ol.Array(); var array2 = ol.Array.create(array1); assertTrue(array1 === array2); - +} + + +function testLengthChangeInsertAt() { + var array = ol.Array.create([0, 1, 2]); + var lengthChangedCalled; + array.length_changed = function() { + lengthChangedCalled = true; + }; + array.insertAt(2, 3); + assertTrue(lengthChangedCalled); +} + + +function testLengthChangeRemoveAt() { + var array = ol.Array.create([0, 1, 2]); + var lengthChangedCalled; + array.length_changed = function() { + lengthChangedCalled = true; + }; + array.removeAt(0); + assertTrue(lengthChangedCalled); +} + + +function testLengthChangeSetAt() { + var array = ol.Array.create([0, 1, 2]); + var lengthChangedCalled; + array.length_changed = function() { + lengthChangedCalled = true; + }; + array.setAt(1, 1); + assertUndefined(lengthChangedCalled); } From 727b2905f7534bced7a05a9fe022e5a60b7a8c78 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Fri, 6 Jul 2012 20:44:48 +0200 Subject: [PATCH 036/562] Suppress gjslint warnings --- externs/proj4js.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/externs/proj4js.js b/externs/proj4js.js index a6fa18768a..1bc605df59 100644 --- a/externs/proj4js.js +++ b/externs/proj4js.js @@ -70,4 +70,6 @@ Proj4js.Proj.prototype.units; * @param {Proj4js.Point|{x:number, y:number}} point Point. * @return {Proj4js.Point} Point. */ -Proj4js.transform = function(source, dest, point) {}; +Proj4js.transform = function(source, dest, point) { + return new Proj4js.Point(0, 0); +}; From 896c4c102adc21ca502c87794bdef334c84cf2ed Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Sat, 7 Jul 2012 12:46:53 +0200 Subject: [PATCH 037/562] Check resolutions are strictly monotonically decreasing --- src/ol/tilegrid.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/ol/tilegrid.js b/src/ol/tilegrid.js index 0cd02d49cf..8b6ddb385a 100644 --- a/src/ol/tilegrid.js +++ b/src/ol/tilegrid.js @@ -1,5 +1,6 @@ goog.provide('ol.TileGrid'); +goog.require('goog.array'); goog.require('goog.asserts'); goog.require('goog.math.Size'); goog.require('goog.positioning.Corner'); @@ -11,7 +12,7 @@ goog.require('ol.TileCoord'); /** * @constructor - * @param {Array.} resolutions Resolutions. + * @param {!Array.} resolutions Resolutions. * @param {ol.Extent} extent Extent. * @param {goog.positioning.Corner} corner Corner. * @param {goog.math.Coordinate|Array.} origin Origin. @@ -24,6 +25,9 @@ ol.TileGrid = function(resolutions, extent, corner, origin, opt_tileSize) { * @type {Array.} */ this.resolutions_ = resolutions; + goog.asserts.assert(goog.array.isSorted(resolutions, function(a, b) { + return -goog.array.defaultCompare(a, b); + }, true)); /** * @private From ad30fbe5443fe4314b26c900470e8d621fecfa16 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Sat, 7 Jul 2012 12:49:32 +0200 Subject: [PATCH 038/562] Add initial ol.TileGrid tests --- src/ol/tilegrid_test.js | 187 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 187 insertions(+) create mode 100644 src/ol/tilegrid_test.js diff --git a/src/ol/tilegrid_test.js b/src/ol/tilegrid_test.js new file mode 100644 index 0000000000..00c8f67767 --- /dev/null +++ b/src/ol/tilegrid_test.js @@ -0,0 +1,187 @@ +goog.require('goog.math.Coordinate'); +goog.require('goog.math.Size'); +goog.require('goog.positioning.Corner'); +goog.require('goog.testing.jsunit'); +goog.require('ol.Extent'); +goog.require('ol.TileCoord'); +goog.require('ol.TileGrid'); + + +var corner; +var extent; +var resolutions; +var origin; +var origins; +var tileSize; + + +function setUp() { + corner = goog.positioning.Corner.TOP_LEFT; + resolutions = [1000, 500, 250, 100]; + extent = new ol.Extent(100000, 100000, 0, 0); + origin = new goog.math.Coordinate(0, 100000); + origins = []; + tileSize = new goog.math.Size(100, 100); +} + + +function testCreateValid() { + assertNotThrows(function() { + return new ol.TileGrid(resolutions, extent, corner, origin, tileSize); + }); +} + + +function testCreateDuplicateResolutions() { + var resolutions = [100, 50, 50, 25, 10]; + assertThrows(function() { + return new ol.TileGrid(resolutions, extent, corner, origin, tileSize); + }); +} + + +function testCreateOutOfOrderResolutions() { + var resolutions = [100, 25, 50, 10]; + assertThrows(function() { + return new ol.TileGrid(resolutions, extent, corner, origin, tileSize); + }); +} + + +function testCreateOrigins() { + var resolutions = [100, 50, 25, 10]; + var origins = [origin, origin, origin, origin]; + assertNotThrows(function() { + return new ol.TileGrid(resolutions, extent, corner, origins, tileSize); + }); +} + + +function testCreateTooFewOrigins() { + var resolutions = [100, 50, 25, 10]; + var origins = [origin, origin, origin]; + assertThrows(function() { + return new ol.TileGrid(resolutions, extent, corner, origins, tileSize); + }); +} + + +function testCreateTooManyOrigins() { + var resolutions = [100, 50, 25, 10]; + var origins = [origin, origin, origin, origin, origin]; + assertThrows(function() { + return new ol.TileGrid(resolutions, extent, corner, origins, tileSize); + }); +} + + +function testGetTileCoordTopLeft() { + + corner = goog.positioning.Corner.TOP_LEFT; + origin = new goog.math.Coordinate(0, 100000); + var tileGrid = + new ol.TileGrid(resolutions, extent, corner, origin, tileSize); + var tileCoord; + + tileCoord = tileGrid.getTileCoord(3, new goog.math.Coordinate(0, 0)); + assertEquals(3, tileCoord.z); + assertEquals(0, tileCoord.x); + assertEquals(10, tileCoord.y); + + tileCoord = tileGrid.getTileCoord(3, new goog.math.Coordinate(0, 100000)); + assertEquals(3, tileCoord.z); + assertEquals(0, tileCoord.x); + assertEquals(0, tileCoord.y); + + tileCoord = tileGrid.getTileCoord(3, new goog.math.Coordinate(100000, 0)); + assertEquals(3, tileCoord.z); + assertEquals(10, tileCoord.x); + assertEquals(10, tileCoord.y); + + tileCoord = + tileGrid.getTileCoord(3, new goog.math.Coordinate(100000, 100000)); + assertEquals(3, tileCoord.z); + assertEquals(10, tileCoord.x); + assertEquals(0, tileCoord.y); + +} + + +function testGetTileCoordBottomLeft() { + + corner = goog.positioning.Corner.BOTTOM_LEFT; + origin = new goog.math.Coordinate(0, 0); + var tileGrid = + new ol.TileGrid(resolutions, extent, corner, origin, tileSize); + var tileCoord; + + tileCoord = tileGrid.getTileCoord(3, new goog.math.Coordinate(0, 0)); + assertEquals(3, tileCoord.z); + assertEquals(0, tileCoord.x); + assertEquals(0, tileCoord.y); + + tileCoord = tileGrid.getTileCoord(3, new goog.math.Coordinate(0, 100000)); + assertEquals(3, tileCoord.z); + assertEquals(0, tileCoord.x); + assertEquals(10, tileCoord.y); + + tileCoord = tileGrid.getTileCoord(3, new goog.math.Coordinate(100000, 0)); + assertEquals(3, tileCoord.z); + assertEquals(10, tileCoord.x); + assertEquals(0, tileCoord.y); + + tileCoord = + tileGrid.getTileCoord(3, new goog.math.Coordinate(100000, 100000)); + assertEquals(3, tileCoord.z); + assertEquals(10, tileCoord.x); + assertEquals(10, tileCoord.y); + +} + + +function testGetTileCoordCenter() { + + var tileGrid = + new ol.TileGrid(resolutions, extent, corner, origin, tileSize); + var center; + + center = tileGrid.getTileCoordCenter(new ol.TileCoord(0, 0, 0)); + assertEquals(50000, center.x); + assertEquals(50000, center.y); + + center = tileGrid.getTileCoordCenter(new ol.TileCoord(3, 0, 0)); + assertEquals(5000, center.x); + assertEquals(95000, center.y); + + center = tileGrid.getTileCoordCenter(new ol.TileCoord(3, 9, 9)); + assertEquals(95000, center.x); + assertEquals(5000, center.y); + +} + + +function testGetTileCoordExtent() { + + var tileGrid = + new ol.TileGrid(resolutions, extent, corner, origin, tileSize); + var tileCoordExtent; + + tileCoordExtent = tileGrid.getTileCoordExtent(new ol.TileCoord(0, 0, 0)); + assertEquals(tileCoordExtent.top, 100000); + assertEquals(tileCoordExtent.right, 100000); + assertEquals(tileCoordExtent.bottom, 0); + assertEquals(tileCoordExtent.left, 0); + + tileCoordExtent = tileGrid.getTileCoordExtent(new ol.TileCoord(3, 9, 0)); + assertEquals(tileCoordExtent.top, 100000); + assertEquals(tileCoordExtent.right, 100000); + assertEquals(tileCoordExtent.bottom, 90000); + assertEquals(tileCoordExtent.left, 90000); + + tileCoordExtent = tileGrid.getTileCoordExtent(new ol.TileCoord(3, 0, 9)); + assertEquals(tileCoordExtent.top, 10000); + assertEquals(tileCoordExtent.right, 10000); + assertEquals(tileCoordExtent.bottom, 0); + assertEquals(tileCoordExtent.left, 0); + +} From e656597a591110419a658a3c1e2b88725e9fcbbd Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Sat, 7 Jul 2012 12:50:15 +0200 Subject: [PATCH 039/562] Stricter type checking on ol.TileGrid origins --- src/ol/tilegrid.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ol/tilegrid.js b/src/ol/tilegrid.js index 8b6ddb385a..b97a601c76 100644 --- a/src/ol/tilegrid.js +++ b/src/ol/tilegrid.js @@ -15,7 +15,7 @@ goog.require('ol.TileCoord'); * @param {!Array.} resolutions Resolutions. * @param {ol.Extent} extent Extent. * @param {goog.positioning.Corner} corner Corner. - * @param {goog.math.Coordinate|Array.} origin Origin. + * @param {goog.math.Coordinate|!Array.} origin Origin. * @param {goog.math.Size=} opt_tileSize Tile size. */ ol.TileGrid = function(resolutions, extent, corner, origin, opt_tileSize) { From fe38bb694baad04cf0fd19854879f7fed29df6a1 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Sat, 7 Jul 2012 12:53:44 +0200 Subject: [PATCH 040/562] Re-order functions alphabetically --- src/ol/tilegrid.js | 42 +++++++++++++++++++++--------------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/src/ol/tilegrid.js b/src/ol/tilegrid.js index b97a601c76..bb13c6e547 100644 --- a/src/ol/tilegrid.js +++ b/src/ol/tilegrid.js @@ -143,27 +143,6 @@ ol.TileGrid.prototype.getTileBounds = function(z, extent) { }; -/** - * @param {ol.TileCoord} tileCoord Tile coordinate. - * @return {goog.math.Coordinate} Tile center. - */ -ol.TileGrid.prototype.getTileCenter = function(tileCoord) { - var corner = this.corner_; - var origin = this.getOrigin(tileCoord.z); - var resolution = this.getResolution(tileCoord.z); - var tileSize = this.tileSize_; - var x = origin.x + (tileCoord.x + 0.5) * tileSize.width * resolution; - var y; - if (corner == goog.positioning.Corner.TOP_LEFT) { - y = origin.y - (tileCoord.y + 0.5) * tileSize.height * resolution; - } else { - goog.asserts.assert(corner == goog.positioning.Corner.TOP_RIGHT); - y = origin.y + (tileCoord.y + 0.5) * tileSize.height * resolution; - } - return new goog.math.Coordinate(x, y); -}; - - /** * @param {number} z Z. * @param {goog.math.Coordinate} coordinate Coordinate. @@ -190,6 +169,27 @@ ol.TileGrid.prototype.getTileCoord = function(z, coordinate) { }; +/** + * @param {ol.TileCoord} tileCoord Tile coordinate. + * @return {goog.math.Coordinate} Tile center. + */ +ol.TileGrid.prototype.getTileCoordCenter = function(tileCoord) { + var corner = this.corner_; + var origin = this.getOrigin(tileCoord.z); + var resolution = this.getResolution(tileCoord.z); + var tileSize = this.tileSize_; + var x = origin.x + (tileCoord.x + 0.5) * tileSize.width * resolution; + var y; + if (corner == goog.positioning.Corner.TOP_LEFT) { + y = origin.y - (tileCoord.y + 0.5) * tileSize.height * resolution; + } else { + goog.asserts.assert(corner == goog.positioning.Corner.TOP_RIGHT); + y = origin.y + (tileCoord.y + 0.5) * tileSize.height * resolution; + } + return new goog.math.Coordinate(x, y); +}; + + /** * @param {ol.TileCoord} tileCoord Tile coordinate. * @return {ol.Extent} Extent. From e63f7d166fbb86c32c3a3d03f2fe2d682e958046 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Sat, 7 Jul 2012 12:54:14 +0200 Subject: [PATCH 041/562] Don't crop against TileGrid extent in TileGrid --- src/ol/tilegrid.js | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/ol/tilegrid.js b/src/ol/tilegrid.js index bb13c6e547..9e5a03ad2b 100644 --- a/src/ol/tilegrid.js +++ b/src/ol/tilegrid.js @@ -149,9 +149,6 @@ ol.TileGrid.prototype.getTileBounds = function(z, extent) { * @return {ol.TileCoord} Tile coordinate. */ ol.TileGrid.prototype.getTileCoord = function(z, coordinate) { - if (!this.extent_.contains(coordinate)) { - return null; - } var corner = this.corner_; var origin = this.getOrigin(z); var resolution = this.getResolution(z); From 656974090fb210ce9475ffec604c9780b334e42e Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Sat, 7 Jul 2012 12:55:00 +0200 Subject: [PATCH 042/562] Pass z when yielding TileCoord parents --- src/ol/tilegrid.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ol/tilegrid.js b/src/ol/tilegrid.js index 9e5a03ad2b..85d5fa8e80 100644 --- a/src/ol/tilegrid.js +++ b/src/ol/tilegrid.js @@ -232,13 +232,13 @@ ol.TileGrid.prototype.getTileResolution = function(tileCoord) { /** * @param {ol.TileCoord} tileCoord Tile coordinate. - * @param {function(ol.TileBounds): boolean} callback Callback. + * @param {function(number, ol.TileBounds): boolean} callback Callback. */ ol.TileGrid.prototype.yieldTileCoordParents = function(tileCoord, callback) { var extent = this.getTileCoordExtent(tileCoord); var z = tileCoord.z - 1; while (z >= 0) { - if (callback(this.getTileBounds(z, extent))) { + if (callback(z, this.getTileBounds(z, extent))) { return; } --z; From 4ff6f03834dbad18ad0a29de6746c31602fee5ff Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Sat, 7 Jul 2012 13:27:19 +0200 Subject: [PATCH 043/562] s/getTileBounds/getExtentTileBounds/ --- doc/ol3.md | 2 +- src/ol/tilegrid.js | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/doc/ol3.md b/doc/ol3.md index a6b43e0ad4..d23b248652 100644 --- a/doc/ol3.md +++ b/doc/ol3.md @@ -170,7 +170,7 @@ TileGrid corner TOP_LEFT | BOTTOM_LEFT origin(s) Coord|Array. tileSize goog.math.Size - getTileBounds(z, extent) -> TileBounds + getExtentTileBounds(z, extent) -> TileBounds getTileCoordCenter(tileCoord) -> goog.math.Coordinate getTileCoord(coordinate) -> TileCoord getTileCoordExtent(tileCoord) -> ol.Extent diff --git a/src/ol/tilegrid.js b/src/ol/tilegrid.js index 85d5fa8e80..9425c3d911 100644 --- a/src/ol/tilegrid.js +++ b/src/ol/tilegrid.js @@ -134,7 +134,7 @@ ol.TileGrid.prototype.getResolutions = function() { * @param {ol.Extent} extent Extent. * @return {ol.TileBounds} Tile bounds. */ -ol.TileGrid.prototype.getTileBounds = function(z, extent) { +ol.TileGrid.prototype.getExtentTileBounds = function(z, extent) { var topRight = new goog.math.Coordinate(extent.right, extent.top); var bottomLeft = new goog.math.Coordinate(extent.left, extent.bottom); return ol.TileBounds.boundingTileBounds( @@ -235,10 +235,10 @@ ol.TileGrid.prototype.getTileResolution = function(tileCoord) { * @param {function(number, ol.TileBounds): boolean} callback Callback. */ ol.TileGrid.prototype.yieldTileCoordParents = function(tileCoord, callback) { - var extent = this.getTileCoordExtent(tileCoord); + var tileCoordExtent = this.getTileCoordExtent(tileCoord); var z = tileCoord.z - 1; while (z >= 0) { - if (callback(z, this.getTileBounds(z, extent))) { + if (callback(z, this.getExtentTileBounds(z, tileCoordExtent))) { return; } --z; From 9712c706ba15470dd5d46836679afa10f9c42322 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Sat, 7 Jul 2012 13:44:23 +0200 Subject: [PATCH 044/562] Test ol.TileGrid.getExtentTileBounds --- src/ol/tilegrid_test.js | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/src/ol/tilegrid_test.js b/src/ol/tilegrid_test.js index 00c8f67767..9dbe312e5e 100644 --- a/src/ol/tilegrid_test.js +++ b/src/ol/tilegrid_test.js @@ -185,3 +185,38 @@ function testGetTileCoordExtent() { assertEquals(tileCoordExtent.left, 0); } + + +function testGetExtentTileBounds() { + + var tileGrid = + new ol.TileGrid(resolutions, extent, corner, origin, tileSize); + var e = new ol.Extent(15000, 55000, 5000, 45000); + var tileBounds; + + tileBounds = tileGrid.getExtentTileBounds(0, e); + assertEquals(0, tileBounds.top); + assertEquals(0, tileBounds.right); + assertEquals(0, tileBounds.bottom); + assertEquals(0, tileBounds.left); + + tileBounds = tileGrid.getExtentTileBounds(1, e); + assertEquals(1, tileBounds.top); + assertEquals(1, tileBounds.right); + assertEquals(1, tileBounds.bottom); + assertEquals(0, tileBounds.left); + + tileBounds = tileGrid.getExtentTileBounds(2, e); + assertEquals(3, tileBounds.top); + assertEquals(2, tileBounds.right); + assertEquals(3, tileBounds.bottom); + assertEquals(1, tileBounds.left); + + tileBounds = tileGrid.getExtentTileBounds(3, e); + window.console.log(tileBounds); + assertEquals(9, tileBounds.top); + assertEquals(5, tileBounds.right); + assertEquals(8, tileBounds.bottom); + assertEquals(4, tileBounds.left); + +} From ff34400d966f57511a919202dbaee69b724fe356 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Sat, 7 Jul 2012 14:27:57 +0200 Subject: [PATCH 045/562] Add ol.TileCoord.clone --- doc/ol3.md | 1 + src/ol/tilecoord.js | 8 ++++++++ 2 files changed, 9 insertions(+) diff --git a/doc/ol3.md b/doc/ol3.md index d23b248652..ac97f47055 100644 --- a/doc/ol3.md +++ b/doc/ol3.md @@ -123,6 +123,7 @@ MVCObject unfreeze() TileCoord + clone() -> TileCoord getHash() -> number Tile diff --git a/src/ol/tilecoord.js b/src/ol/tilecoord.js index 9651586460..a34e2e55c9 100644 --- a/src/ol/tilecoord.js +++ b/src/ol/tilecoord.js @@ -24,6 +24,14 @@ ol.TileCoord = function(z, x, y) { goog.inherits(ol.TileCoord, goog.math.Coordinate); +/** + * @return {ol.TileCoord} Clone. + */ +ol.TileCoord.prototype.clone = function() { + return new ol.TileCoord(this.z, this.x, this.y); +}; + + /** * @return {number} Hash. */ From 9a89814896984214f018a4abd4aeae7f667bf38c Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Sat, 7 Jul 2012 13:27:59 +0200 Subject: [PATCH 046/562] Store number of resolutions in member variable --- src/ol/tilegrid.js | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/ol/tilegrid.js b/src/ol/tilegrid.js index 9425c3d911..80f2f05ad6 100644 --- a/src/ol/tilegrid.js +++ b/src/ol/tilegrid.js @@ -29,6 +29,12 @@ ol.TileGrid = function(resolutions, extent, corner, origin, opt_tileSize) { return -goog.array.defaultCompare(a, b); }, true)); + /** + * @private + * @type {number} + */ + this.numResolutions_ = this.resolutions_.length; + /** * @private * @type {ol.Extent} @@ -56,7 +62,7 @@ ol.TileGrid = function(resolutions, extent, corner, origin, opt_tileSize) { if (origin instanceof goog.math.Coordinate) { this.origin_ = origin; } else if (goog.isArray(origin)) { - goog.asserts.assert(origin.length == this.resolutions_.length); + goog.asserts.assert(origin.length == this.numResolutions_); this.origins_ = origin; } else { goog.asserts.assert(false); @@ -116,7 +122,7 @@ ol.TileGrid.prototype.getOrigin = function(z) { * @return {number} Resolution. */ ol.TileGrid.prototype.getResolution = function(z) { - goog.asserts.assert(0 <= z && z < this.resolutions_.length); + goog.asserts.assert(0 <= z && z < this.numResolutions_); return this.resolutions_[z]; }; @@ -224,8 +230,7 @@ ol.TileGrid.prototype.getTileSize = function() { * @return {number} Tile resolution. */ ol.TileGrid.prototype.getTileResolution = function(tileCoord) { - goog.asserts.assert( - 0 <= tileCoord.z && tileCoord.z < this.resolutions_.length); + goog.asserts.assert(0 <= tileCoord.z && tileCoord.z < this.numResolutions_); return this.resolutions_[tileCoord.z]; }; From 85716afa38460c11294fdb711784f069c9aafcc9 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Sat, 7 Jul 2012 13:42:58 +0200 Subject: [PATCH 047/562] Top should always be greater than or equal to bottom in ol.TileBounds --- src/ol/tilebounds.js | 3 +++ src/ol/tilegrid_test.js | 4 ++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/ol/tilebounds.js b/src/ol/tilebounds.js index efe576df84..fbf61b7de4 100644 --- a/src/ol/tilebounds.js +++ b/src/ol/tilebounds.js @@ -16,6 +16,9 @@ goog.require('ol.TileCoord'); */ ol.TileBounds = function(top, right, bottom, left) { + goog.asserts.assert(top <= bottom); + goog.asserts.assert(left <= right); + goog.base(this, top, right, bottom, left); }; diff --git a/src/ol/tilegrid_test.js b/src/ol/tilegrid_test.js index 9dbe312e5e..41ee4ca547 100644 --- a/src/ol/tilegrid_test.js +++ b/src/ol/tilegrid_test.js @@ -214,9 +214,9 @@ function testGetExtentTileBounds() { tileBounds = tileGrid.getExtentTileBounds(3, e); window.console.log(tileBounds); - assertEquals(9, tileBounds.top); + assertEquals(8, tileBounds.top); assertEquals(5, tileBounds.right); - assertEquals(8, tileBounds.bottom); + assertEquals(9, tileBounds.bottom); assertEquals(4, tileBounds.left); } From abb49a899ade78364860d98b0ab5125901792f51 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Sat, 7 Jul 2012 14:31:14 +0200 Subject: [PATCH 048/562] Add ol.TileBounds.forEachTileCoord --- doc/ol3.md | 3 +++ src/ol/tilebounds.js | 23 +++++++++++++++++++++++ src/ol/tilebounds_test.js | 30 ++++++++++++++++++++++++++++++ 3 files changed, 56 insertions(+) diff --git a/doc/ol3.md b/doc/ol3.md index ac97f47055..491f52945e 100644 --- a/doc/ol3.md +++ b/doc/ol3.md @@ -126,6 +126,9 @@ TileCoord clone() -> TileCoord getHash() -> number +TileBounds + forEachTileCoord(z, function(tileCoord)) + Tile tileCoord TileCoord url string diff --git a/src/ol/tilebounds.js b/src/ol/tilebounds.js index fbf61b7de4..13d4884ebb 100644 --- a/src/ol/tilebounds.js +++ b/src/ol/tilebounds.js @@ -25,6 +25,29 @@ ol.TileBounds = function(top, right, bottom, left) { goog.inherits(ol.TileBounds, goog.math.Box); +/** + * @param {number} z Z. + * @param {function(this: T, ol.TileCoord): boolean} f Callback. + * @param {T=} opt_obj The object to be used for the value of 'this' within f. + */ +ol.TileBounds.prototype.forEachTileCoord = function(z, f, opt_obj) { + var tileCoord = new ol.TileCoord(z, 0, 0); + var x, y; + for (x = this.left; x <= this.right; ++x) { + tileCoord.x = x; + for (y = this.top; y <= this.bottom; ++y) { + tileCoord.y = y; + if (f.call(opt_obj, tileCoord)) { + return; + } + goog.asserts.assert(tileCoord.z == z); + goog.asserts.assert(tileCoord.x == x); + goog.asserts.assert(tileCoord.y == y); + } + } +}; + + /** * @param {...ol.TileCoord} var_args Tile coordinates. * @return {!ol.TileBounds} Bounding tile box. diff --git a/src/ol/tilebounds_test.js b/src/ol/tilebounds_test.js index 842eb1ab34..a07fd785ec 100644 --- a/src/ol/tilebounds_test.js +++ b/src/ol/tilebounds_test.js @@ -34,3 +34,33 @@ function testBoundingTileBoundsMixedZ() { new ol.TileCoord(4, 2, 0)); }); } + + +function testForEachTileCoord() { + + var tileBounds = new ol.TileBounds(2, 1, 3, 0); + + var tileCoords = []; + tileBounds.forEachTileCoord(5, function(tileCoord) { + tileCoords.push(tileCoord.clone()); + }); + + assertEquals(4, tileCoords.length); + + assertEquals(5, tileCoords[0].z); + assertEquals(0, tileCoords[0].x); + assertEquals(2, tileCoords[0].y); + + assertEquals(5, tileCoords[1].z); + assertEquals(0, tileCoords[1].x); + assertEquals(3, tileCoords[1].y); + + assertEquals(5, tileCoords[2].z); + assertEquals(1, tileCoords[2].x); + assertEquals(2, tileCoords[2].y); + + assertEquals(5, tileCoords[3].z); + assertEquals(1, tileCoords[3].x); + assertEquals(3, tileCoords[3].y); + +} From 65b0094a78cc0e37f37234b3595f7fa68d2ab2e2 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Sat, 7 Jul 2012 14:44:04 +0200 Subject: [PATCH 049/562] Test ol.TileGrid.yieldTileCoordParents --- src/ol/tilegrid_test.js | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/src/ol/tilegrid_test.js b/src/ol/tilegrid_test.js index 41ee4ca547..2ec64f5f0f 100644 --- a/src/ol/tilegrid_test.js +++ b/src/ol/tilegrid_test.js @@ -220,3 +220,41 @@ function testGetExtentTileBounds() { assertEquals(4, tileBounds.left); } + + +function testYieldTileCoordParents() { + + var tileGrid = + new ol.TileGrid(resolutions, extent, corner, origin, tileSize); + var zs = [], tileBoundss = []; + + tileGrid.yieldTileCoordParents( + new ol.TileCoord(3, 7, 3), + function(z, tileBounds) { + zs.push(z); + tileBoundss.push(tileBounds); + return false; + }); + + assertEquals(3, zs.length); + assertEquals(3, tileBoundss.length); + + assertEquals(2, zs[0]); + assertEquals(1, tileBoundss[0].top); + assertEquals(3, tileBoundss[0].right); + assertEquals(1, tileBoundss[0].bottom); + assertEquals(2, tileBoundss[0].left); + + assertEquals(1, zs[1]); + assertEquals(0, tileBoundss[1].top); + assertEquals(1, tileBoundss[1].right); + assertEquals(0, tileBoundss[1].bottom); + assertEquals(1, tileBoundss[1].left); + + assertEquals(0, zs[2]); + assertEquals(0, tileBoundss[2].top); + assertEquals(0, tileBoundss[2].right); + assertEquals(0, tileBoundss[2].bottom); + assertEquals(0, tileBoundss[2].left); + +} From 24ba87bf92c3387b6bbf197788bffd103107931a Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Sat, 7 Jul 2012 14:46:01 +0200 Subject: [PATCH 050/562] s/yield/forEach/ --- doc/ol3.md | 6 +++--- src/ol/tilegrid.js | 2 +- src/ol/tilegrid_test.js | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/doc/ol3.md b/doc/ol3.md index 491f52945e..e2e7ced940 100644 --- a/doc/ol3.md +++ b/doc/ol3.md @@ -179,8 +179,8 @@ TileGrid getTileCoord(coordinate) -> TileCoord getTileCoordExtent(tileCoord) -> ol.Extent getZForResolution(resolution) -> number - yieldTileCoordChildren(tileCoord, function(z, TileBounds)) - yieldTileCoordParents(tileCoord, function(z, TileBounds)) + forEachTileCoordChild(tileCoord, function(z, TileBounds)) + forEachTileCoordParent(tileCoord, function(z, TileBounds)) TileLayer tileGrid TileGrid @@ -193,7 +193,7 @@ TileQueue enqueueTile(Tile) VectorLayer - yieldFeatures(resolution, extent, projection, function(Feature)) + forEachFeature(resolution, extent, projection, function(Feature)) Renderer target HTMLDivElement diff --git a/src/ol/tilegrid.js b/src/ol/tilegrid.js index 80f2f05ad6..6baaea7dbd 100644 --- a/src/ol/tilegrid.js +++ b/src/ol/tilegrid.js @@ -239,7 +239,7 @@ ol.TileGrid.prototype.getTileResolution = function(tileCoord) { * @param {ol.TileCoord} tileCoord Tile coordinate. * @param {function(number, ol.TileBounds): boolean} callback Callback. */ -ol.TileGrid.prototype.yieldTileCoordParents = function(tileCoord, callback) { +ol.TileGrid.prototype.forEachTileCoordParent = function(tileCoord, callback) { var tileCoordExtent = this.getTileCoordExtent(tileCoord); var z = tileCoord.z - 1; while (z >= 0) { diff --git a/src/ol/tilegrid_test.js b/src/ol/tilegrid_test.js index 2ec64f5f0f..134aa5c2c6 100644 --- a/src/ol/tilegrid_test.js +++ b/src/ol/tilegrid_test.js @@ -222,13 +222,13 @@ function testGetExtentTileBounds() { } -function testYieldTileCoordParents() { +function testForEachTileCoordParent() { var tileGrid = new ol.TileGrid(resolutions, extent, corner, origin, tileSize); var zs = [], tileBoundss = []; - tileGrid.yieldTileCoordParents( + tileGrid.forEachTileCoordParent( new ol.TileCoord(3, 7, 3), function(z, tileBounds) { zs.push(z); From d444618a1195fe648482eb00398c5abfa2b5b4d5 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Sat, 7 Jul 2012 17:12:59 +0200 Subject: [PATCH 051/562] Add missing @template declaration --- src/ol/tilebounds.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/ol/tilebounds.js b/src/ol/tilebounds.js index 13d4884ebb..04a77a43fe 100644 --- a/src/ol/tilebounds.js +++ b/src/ol/tilebounds.js @@ -29,6 +29,7 @@ goog.inherits(ol.TileBounds, goog.math.Box); * @param {number} z Z. * @param {function(this: T, ol.TileCoord): boolean} f Callback. * @param {T=} opt_obj The object to be used for the value of 'this' within f. + * @template T */ ol.TileBounds.prototype.forEachTileCoord = function(z, f, opt_obj) { var tileCoord = new ol.TileCoord(z, 0, 0); From 58e9ba322e60b62e00ee3d117450d9025fbe5bd4 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Sat, 7 Jul 2012 17:13:30 +0200 Subject: [PATCH 052/562] Replace corner with xEast/ySouth --- doc/ol3.md | 3 +- src/ol/tilegrid.js | 68 ++++++++++++++++++++++++++++------------- src/ol/tilegrid_test.js | 44 ++++++++++++++------------ 3 files changed, 73 insertions(+), 42 deletions(-) diff --git a/doc/ol3.md b/doc/ol3.md index e2e7ced940..ee7f4fccd9 100644 --- a/doc/ol3.md +++ b/doc/ol3.md @@ -171,7 +171,8 @@ Map TileGrid resolutions Array. extent ol.Extent - corner TOP_LEFT | BOTTOM_LEFT + xEast boolean + ySouth boolean origin(s) Coord|Array. tileSize goog.math.Size getExtentTileBounds(z, extent) -> TileBounds diff --git a/src/ol/tilegrid.js b/src/ol/tilegrid.js index 6baaea7dbd..a05b69806a 100644 --- a/src/ol/tilegrid.js +++ b/src/ol/tilegrid.js @@ -3,7 +3,6 @@ goog.provide('ol.TileGrid'); goog.require('goog.array'); goog.require('goog.asserts'); goog.require('goog.math.Size'); -goog.require('goog.positioning.Corner'); goog.require('ol.Extent'); goog.require('ol.TileBounds'); goog.require('ol.TileCoord'); @@ -14,11 +13,13 @@ goog.require('ol.TileCoord'); * @constructor * @param {!Array.} resolutions Resolutions. * @param {ol.Extent} extent Extent. - * @param {goog.positioning.Corner} corner Corner. * @param {goog.math.Coordinate|!Array.} origin Origin. + * @param {boolean=} opt_xEast Tile coordinates increase eastwards. + * @param {boolean=} opt_ySouth Tile coordinates increas southwards. * @param {goog.math.Size=} opt_tileSize Tile size. */ -ol.TileGrid = function(resolutions, extent, corner, origin, opt_tileSize) { +ol.TileGrid = + function(resolutions, extent, origin, opt_xEast, opt_ySouth, opt_tileSize) { /** * @private @@ -43,9 +44,15 @@ ol.TileGrid = function(resolutions, extent, corner, origin, opt_tileSize) { /** * @private - * @type {goog.positioning.Corner} + * @type {boolean} */ - this.corner_ = corner; + this.xEast_ = goog.isDef(opt_xEast) ? opt_xEast : true; + + /** + * @private + * @type {boolean} + */ + this.ySouth_ = goog.isDef(opt_ySouth) ? opt_ySouth : true; /** * @private @@ -79,10 +86,18 @@ ol.TileGrid = function(resolutions, extent, corner, origin, opt_tileSize) { /** - * @return {goog.positioning.Corner} Corner. + * @return {boolean} X East. */ -ol.TileGrid.prototype.getCorner = function() { - return this.corner_; +ol.TileGrid.prototype.getXEast = function() { + return this.xEast_; +}; + + +/** + * @return {boolean} Y South. + */ +ol.TileGrid.prototype.getYSouth = function() { + return this.ySouth_; }; @@ -155,17 +170,19 @@ ol.TileGrid.prototype.getExtentTileBounds = function(z, extent) { * @return {ol.TileCoord} Tile coordinate. */ ol.TileGrid.prototype.getTileCoord = function(z, coordinate) { - var corner = this.corner_; var origin = this.getOrigin(z); var resolution = this.getResolution(z); var tileSize = this.getTileSize(); - var x = - Math.floor((coordinate.x - origin.x) / (tileSize.width * resolution)); + var x; + if (this.xEast_) { + x = Math.floor((coordinate.x - origin.x) / (tileSize.width * resolution)); + } else { + x = Math.floor((origin.x - coordinate.x) / (tileSize.width * resolution)); + } var y; - if (corner == goog.positioning.Corner.TOP_LEFT) { + if (this.ySouth_) { y = Math.floor((origin.y - coordinate.y) / (tileSize.height * resolution)); } else { - goog.asserts.assert(corner == goog.positioning.Corner.BOTTOM_LEFT); y = Math.floor((coordinate.y - origin.y) / (tileSize.height * resolution)); } return new ol.TileCoord(z, x, y); @@ -177,16 +194,19 @@ ol.TileGrid.prototype.getTileCoord = function(z, coordinate) { * @return {goog.math.Coordinate} Tile center. */ ol.TileGrid.prototype.getTileCoordCenter = function(tileCoord) { - var corner = this.corner_; var origin = this.getOrigin(tileCoord.z); var resolution = this.getResolution(tileCoord.z); var tileSize = this.tileSize_; - var x = origin.x + (tileCoord.x + 0.5) * tileSize.width * resolution; + var x; + if (this.xEast_) { + x = origin.x + (tileCoord.x + 0.5) * tileSize.width * resolution; + } else { + x = origin.x - (tileCoord.x + 0.5) * tileSize.width * resolution; + } var y; - if (corner == goog.positioning.Corner.TOP_LEFT) { + if (this.ySouth_) { y = origin.y - (tileCoord.y + 0.5) * tileSize.height * resolution; } else { - goog.asserts.assert(corner == goog.positioning.Corner.TOP_RIGHT); y = origin.y + (tileCoord.y + 0.5) * tileSize.height * resolution; } return new goog.math.Coordinate(x, y); @@ -198,18 +218,22 @@ ol.TileGrid.prototype.getTileCoordCenter = function(tileCoord) { * @return {ol.Extent} Extent. */ ol.TileGrid.prototype.getTileCoordExtent = function(tileCoord) { - var corner = this.corner_; var origin = this.getOrigin(tileCoord.z); var resolution = this.getResolution(tileCoord.z); var tileSize = this.tileSize_; - var left = origin.x + tileCoord.x * tileSize.width * resolution; - var right = left + tileSize.width * resolution; + var left, right; + if (this.xEast_) { + left = origin.x + tileCoord.x * tileSize.width * resolution; + right = left + tileSize.width * resolution; + } else { + right = origin.x - tileCoord.x * tileSize.width * resolution; + left = right - tileSize.height * resolution; + } var top, bottom; - if (corner == goog.positioning.Corner.TOP_LEFT) { + if (this.ySouth_) { top = origin.y - tileCoord.y * tileSize.height * resolution; bottom = top - tileSize.height * resolution; } else { - goog.asserts.assert(corner == goog.positioning.Corner.BOTTOM_LEFT); bottom = origin.y + tileCoord.y * tileSize.height * resolution; top = bottom + tileSize.height * resolution; } diff --git a/src/ol/tilegrid_test.js b/src/ol/tilegrid_test.js index 134aa5c2c6..47fe0d51b8 100644 --- a/src/ol/tilegrid_test.js +++ b/src/ol/tilegrid_test.js @@ -1,33 +1,35 @@ goog.require('goog.math.Coordinate'); goog.require('goog.math.Size'); -goog.require('goog.positioning.Corner'); goog.require('goog.testing.jsunit'); goog.require('ol.Extent'); goog.require('ol.TileCoord'); goog.require('ol.TileGrid'); -var corner; var extent; var resolutions; var origin; var origins; var tileSize; +var xEast; +var ySouth; function setUp() { - corner = goog.positioning.Corner.TOP_LEFT; resolutions = [1000, 500, 250, 100]; extent = new ol.Extent(100000, 100000, 0, 0); origin = new goog.math.Coordinate(0, 100000); origins = []; tileSize = new goog.math.Size(100, 100); + xEast = true; + ySouth = true; } function testCreateValid() { assertNotThrows(function() { - return new ol.TileGrid(resolutions, extent, corner, origin, tileSize); + return new ol.TileGrid( + resolutions, extent, origin, xEast, ySouth, tileSize); }); } @@ -35,7 +37,8 @@ function testCreateValid() { function testCreateDuplicateResolutions() { var resolutions = [100, 50, 50, 25, 10]; assertThrows(function() { - return new ol.TileGrid(resolutions, extent, corner, origin, tileSize); + return new ol.TileGrid( + resolutions, extent, origin, xEast, ySouth, tileSize); }); } @@ -43,7 +46,8 @@ function testCreateDuplicateResolutions() { function testCreateOutOfOrderResolutions() { var resolutions = [100, 25, 50, 10]; assertThrows(function() { - return new ol.TileGrid(resolutions, extent, corner, origin, tileSize); + return new ol.TileGrid( + resolutions, extent, origin, xEast, ySouth, tileSize); }); } @@ -52,7 +56,8 @@ function testCreateOrigins() { var resolutions = [100, 50, 25, 10]; var origins = [origin, origin, origin, origin]; assertNotThrows(function() { - return new ol.TileGrid(resolutions, extent, corner, origins, tileSize); + return new ol.TileGrid( + resolutions, extent, origins, xEast, ySouth, tileSize); }); } @@ -61,7 +66,8 @@ function testCreateTooFewOrigins() { var resolutions = [100, 50, 25, 10]; var origins = [origin, origin, origin]; assertThrows(function() { - return new ol.TileGrid(resolutions, extent, corner, origins, tileSize); + return new ol.TileGrid( + resolutions, extent, origins, xEast, ySouth, tileSize); }); } @@ -70,17 +76,17 @@ function testCreateTooManyOrigins() { var resolutions = [100, 50, 25, 10]; var origins = [origin, origin, origin, origin, origin]; assertThrows(function() { - return new ol.TileGrid(resolutions, extent, corner, origins, tileSize); + return new ol.TileGrid( + resolutions, extent, origins, xEast, ySouth, tileSize); }); } -function testGetTileCoordTopLeft() { +function testGetTileCoord() { - corner = goog.positioning.Corner.TOP_LEFT; origin = new goog.math.Coordinate(0, 100000); var tileGrid = - new ol.TileGrid(resolutions, extent, corner, origin, tileSize); + new ol.TileGrid(resolutions, extent, origin, xEast, ySouth, tileSize); var tileCoord; tileCoord = tileGrid.getTileCoord(3, new goog.math.Coordinate(0, 0)); @@ -107,12 +113,12 @@ function testGetTileCoordTopLeft() { } -function testGetTileCoordBottomLeft() { +function testGetTileCoordYNorth() { - corner = goog.positioning.Corner.BOTTOM_LEFT; + ySouth = false; origin = new goog.math.Coordinate(0, 0); var tileGrid = - new ol.TileGrid(resolutions, extent, corner, origin, tileSize); + new ol.TileGrid(resolutions, extent, origin, xEast, ySouth, tileSize); var tileCoord; tileCoord = tileGrid.getTileCoord(3, new goog.math.Coordinate(0, 0)); @@ -142,7 +148,7 @@ function testGetTileCoordBottomLeft() { function testGetTileCoordCenter() { var tileGrid = - new ol.TileGrid(resolutions, extent, corner, origin, tileSize); + new ol.TileGrid(resolutions, extent, origin, xEast, ySouth, tileSize); var center; center = tileGrid.getTileCoordCenter(new ol.TileCoord(0, 0, 0)); @@ -163,7 +169,7 @@ function testGetTileCoordCenter() { function testGetTileCoordExtent() { var tileGrid = - new ol.TileGrid(resolutions, extent, corner, origin, tileSize); + new ol.TileGrid(resolutions, extent, origin, xEast, ySouth, tileSize); var tileCoordExtent; tileCoordExtent = tileGrid.getTileCoordExtent(new ol.TileCoord(0, 0, 0)); @@ -190,7 +196,7 @@ function testGetTileCoordExtent() { function testGetExtentTileBounds() { var tileGrid = - new ol.TileGrid(resolutions, extent, corner, origin, tileSize); + new ol.TileGrid(resolutions, extent, origin, xEast, ySouth, tileSize); var e = new ol.Extent(15000, 55000, 5000, 45000); var tileBounds; @@ -225,7 +231,7 @@ function testGetExtentTileBounds() { function testForEachTileCoordParent() { var tileGrid = - new ol.TileGrid(resolutions, extent, corner, origin, tileSize); + new ol.TileGrid(resolutions, extent, origin, xEast, ySouth, tileSize); var zs = [], tileBoundss = []; tileGrid.forEachTileCoordParent( From d30c30f01df881dbd7a48463da1dfc870137eecd Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Sun, 8 Jul 2012 12:21:35 +0200 Subject: [PATCH 053/562] s/TileUrl/TileUrlFunction/ --- src/all.js | 3 ++- src/ol/{tileurl.js => tileurlfunction.js} | 15 ++++++++------- .../{tileurl_test.js => tileurlfunction_test.js} | 10 +++++----- 3 files changed, 15 insertions(+), 13 deletions(-) rename src/ol/{tileurl.js => tileurlfunction.js} (55%) rename src/ol/{tileurl_test.js => tileurlfunction_test.js} (57%) diff --git a/src/all.js b/src/all.js index df772a0103..8885885b62 100644 --- a/src/all.js +++ b/src/all.js @@ -11,5 +11,6 @@ goog.require('ol.Projection'); goog.require('ol.TileBounds'); goog.require('ol.TileCoord'); goog.require('ol.TileGrid'); -goog.require('ol.TileUrl'); +goog.require('ol.TileUrlFunction'); +goog.require('ol.TileUrlFunctionType'); goog.require('ol.TransformFunction'); diff --git a/src/ol/tileurl.js b/src/ol/tileurlfunction.js similarity index 55% rename from src/ol/tileurl.js rename to src/ol/tileurlfunction.js index 116e20ee64..7021c035d2 100644 --- a/src/ol/tileurl.js +++ b/src/ol/tileurlfunction.js @@ -1,4 +1,5 @@ -goog.provide('ol.TileUrl'); +goog.provide('ol.TileUrlFunction'); +goog.provide('ol.TileUrlFunctionType'); goog.require('goog.math'); goog.require('ol.TileCoord'); @@ -7,14 +8,14 @@ goog.require('ol.TileCoord'); /** * @typedef {function(ol.TileCoord): string} */ -ol.TileUrlFunction; +ol.TileUrlFunctionType; /** * @param {string} template Template. - * @return {ol.TileUrlFunction} Tile URL function. + * @return {ol.TileUrlFunctionType} Tile URL function. */ -ol.TileUrl.createFromTemplate = function(template) { +ol.TileUrlFunction.createFromTemplate = function(template) { return function(tileCoord) { return template.replace(/\{z\}/, tileCoord.z) .replace(/\{x\}/, tileCoord.x) @@ -24,10 +25,10 @@ ol.TileUrl.createFromTemplate = function(template) { /** - * @param {Array.} tileUrlFunctions Tile URL Functions. - * @return {ol.TileUrlFunction} Tile URL function. + * @param {Array.} tileUrlFunctions Tile URL Functions. + * @return {ol.TileUrlFunctionType} Tile URL function. */ -ol.TileUrl.createFromTileUrlFunctions = function(tileUrlFunctions) { +ol.TileUrlFunction.createFromTileUrlFunctions = function(tileUrlFunctions) { return function(tileCoord) { var index = goog.math.modulo(tileCoord.hash(), tileUrlFunctions.length); return tileUrlFunctions[index](tileCoord); diff --git a/src/ol/tileurl_test.js b/src/ol/tileurlfunction_test.js similarity index 57% rename from src/ol/tileurl_test.js rename to src/ol/tileurlfunction_test.js index 014f044db0..4812bbcadd 100644 --- a/src/ol/tileurl_test.js +++ b/src/ol/tileurlfunction_test.js @@ -1,18 +1,18 @@ goog.require('goog.testing.jsunit'); goog.require('ol.TileCoord'); -goog.require('ol.TileUrl'); +goog.require('ol.TileUrlFunction'); function testCreateFromTemplate() { - var tileUrl = ol.TileUrl.createFromTemplate('{z}/{x}/{y}'); + var tileUrl = ol.TileUrlFunction.createFromTemplate('{z}/{x}/{y}'); assertEquals('3/2/1', tileUrl(new ol.TileCoord(3, 2, 1))); } function testCreateFromTileUrlFunctions() { - var tileUrl = ol.TileUrl.createFromTileUrlFunctions([ - ol.TileUrl.createFromTemplate('a'), - ol.TileUrl.createFromTemplate('b') + var tileUrl = ol.TileUrlFunction.createFromTileUrlFunctions([ + ol.TileUrlFunction.createFromTemplate('a'), + ol.TileUrlFunction.createFromTemplate('b') ]); var tileUrl1 = tileUrl(new ol.TileCoord(1, 0, 0)); var tileUrl2 = tileUrl(new ol.TileCoord(1, 0, 1)); From 391b5906bccfdb90d61de7f3930b084bac778a8e Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Sun, 8 Jul 2012 12:29:23 +0200 Subject: [PATCH 054/562] s/getTileResolution/getTileCoordResolution/g --- doc/ol3.md | 1 + src/ol/tilegrid.js | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/doc/ol3.md b/doc/ol3.md index ee7f4fccd9..41535ba745 100644 --- a/doc/ol3.md +++ b/doc/ol3.md @@ -179,6 +179,7 @@ TileGrid getTileCoordCenter(tileCoord) -> goog.math.Coordinate getTileCoord(coordinate) -> TileCoord getTileCoordExtent(tileCoord) -> ol.Extent + getTileCoordResolution(tileCoord) -> number getZForResolution(resolution) -> number forEachTileCoordChild(tileCoord, function(z, TileBounds)) forEachTileCoordParent(tileCoord, function(z, TileBounds)) diff --git a/src/ol/tilegrid.js b/src/ol/tilegrid.js index a05b69806a..3303794f19 100644 --- a/src/ol/tilegrid.js +++ b/src/ol/tilegrid.js @@ -253,7 +253,7 @@ ol.TileGrid.prototype.getTileSize = function() { * @param {ol.TileCoord} tileCoord Tile coordinate. * @return {number} Tile resolution. */ -ol.TileGrid.prototype.getTileResolution = function(tileCoord) { +ol.TileGrid.prototype.getTileCoordResolution = function(tileCoord) { goog.asserts.assert(0 <= tileCoord.z && tileCoord.z < this.numResolutions_); return this.resolutions_[tileCoord.z]; }; From 40acb70a3cce5b9d194ac10c2b789a96d2acc424 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Sun, 8 Jul 2012 12:37:22 +0200 Subject: [PATCH 055/562] Add ol.TileGrid.getZForResolution --- src/ol/tilegrid.js | 24 ++++++++++++++++++++++++ src/ol/tilegrid_test.js | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 59 insertions(+) diff --git a/src/ol/tilegrid.js b/src/ol/tilegrid.js index 3303794f19..0619ca2e8a 100644 --- a/src/ol/tilegrid.js +++ b/src/ol/tilegrid.js @@ -259,6 +259,30 @@ ol.TileGrid.prototype.getTileCoordResolution = function(tileCoord) { }; +/** + * @param {number} resolution Resolution. + * @return {number} Z. + */ +ol.TileGrid.prototype.getZForResolution = function(resolution) { + var z; + for (z = 0; z < this.numResolutions_; ++z) { + if (this.resolutions_[z] == resolution) { + return z; + } else if (this.resolutions_[z] < resolution) { + if (z === 0) { + return z; + } else if (resolution - this.resolutions_[z] <= + this.resolutions_[z - 1] - resolution) { + return z; + } else { + return z - 1; + } + } + } + return this.numResolutions_ - 1; +}; + + /** * @param {ol.TileCoord} tileCoord Tile coordinate. * @param {function(number, ol.TileBounds): boolean} callback Callback. diff --git a/src/ol/tilegrid_test.js b/src/ol/tilegrid_test.js index 47fe0d51b8..e9568af3a4 100644 --- a/src/ol/tilegrid_test.js +++ b/src/ol/tilegrid_test.js @@ -264,3 +264,38 @@ function testForEachTileCoordParent() { assertEquals(0, tileBoundss[2].left); } + + +function testGetZForResolutionExact() { + + var tileGrid = + new ol.TileGrid(resolutions, extent, origin, xEast, ySouth, tileSize); + + assertEquals(0, tileGrid.getZForResolution(1000)); + assertEquals(1, tileGrid.getZForResolution(500)); + assertEquals(2, tileGrid.getZForResolution(250)); + assertEquals(3, tileGrid.getZForResolution(100)); + +} + + +function testGetZForResolutionApproximate() { + + var tileGrid = + new ol.TileGrid(resolutions, extent, origin, xEast, ySouth, tileSize); + + assertEquals(0, tileGrid.getZForResolution(2000)); + assertEquals(0, tileGrid.getZForResolution(1000)); + assertEquals(0, tileGrid.getZForResolution(900)); + assertEquals(1, tileGrid.getZForResolution(750)); + assertEquals(1, tileGrid.getZForResolution(625)); + assertEquals(1, tileGrid.getZForResolution(500)); + assertEquals(1, tileGrid.getZForResolution(475)); + assertEquals(2, tileGrid.getZForResolution(375)); + assertEquals(2, tileGrid.getZForResolution(250)); + assertEquals(2, tileGrid.getZForResolution(200)); + assertEquals(3, tileGrid.getZForResolution(125)); + assertEquals(3, tileGrid.getZForResolution(100)); + assertEquals(3, tileGrid.getZForResolution(50)); + +} From 5494c367486d0b9f26450b9d747bcb4f79cda885 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Sun, 8 Jul 2012 12:44:47 +0200 Subject: [PATCH 056/562] Sort functions alphabetically --- doc/ol3.md | 6 +-- src/ol/tilegrid.js | 92 +++++++++++++++++++++++----------------------- 2 files changed, 49 insertions(+), 49 deletions(-) diff --git a/doc/ol3.md b/doc/ol3.md index 41535ba745..3616345d42 100644 --- a/doc/ol3.md +++ b/doc/ol3.md @@ -175,14 +175,14 @@ TileGrid ySouth boolean origin(s) Coord|Array. tileSize goog.math.Size + forEachTileCoordChild(tileCoord, function(z, TileBounds)) + forEachTileCoordParent(tileCoord, function(z, TileBounds)) getExtentTileBounds(z, extent) -> TileBounds - getTileCoordCenter(tileCoord) -> goog.math.Coordinate getTileCoord(coordinate) -> TileCoord + getTileCoordCenter(tileCoord) -> goog.math.Coordinate getTileCoordExtent(tileCoord) -> ol.Extent getTileCoordResolution(tileCoord) -> number getZForResolution(resolution) -> number - forEachTileCoordChild(tileCoord, function(z, TileBounds)) - forEachTileCoordParent(tileCoord, function(z, TileBounds)) TileLayer tileGrid TileGrid diff --git a/src/ol/tilegrid.js b/src/ol/tilegrid.js index 0619ca2e8a..fe29122c81 100644 --- a/src/ol/tilegrid.js +++ b/src/ol/tilegrid.js @@ -86,18 +86,18 @@ ol.TileGrid = /** - * @return {boolean} X East. + * @param {ol.TileCoord} tileCoord Tile coordinate. + * @param {function(number, ol.TileBounds): boolean} callback Callback. */ -ol.TileGrid.prototype.getXEast = function() { - return this.xEast_; -}; - - -/** - * @return {boolean} Y South. - */ -ol.TileGrid.prototype.getYSouth = function() { - return this.ySouth_; +ol.TileGrid.prototype.forEachTileCoordParent = function(tileCoord, callback) { + var tileCoordExtent = this.getTileCoordExtent(tileCoord); + var z = tileCoord.z - 1; + while (z >= 0) { + if (callback(z, this.getExtentTileBounds(z, tileCoordExtent))) { + return; + } + --z; + } }; @@ -109,6 +109,20 @@ ol.TileGrid.prototype.getExtent = function() { }; +/** + * @param {number} z Z. + * @param {ol.Extent} extent Extent. + * @return {ol.TileBounds} Tile bounds. + */ +ol.TileGrid.prototype.getExtentTileBounds = function(z, extent) { + var topRight = new goog.math.Coordinate(extent.right, extent.top); + var bottomLeft = new goog.math.Coordinate(extent.left, extent.bottom); + return ol.TileBounds.boundingTileBounds( + this.getTileCoord(z, topRight), + this.getTileCoord(z, bottomLeft)); +}; + + /** * @return {number} Maximum resolution. */ @@ -150,20 +164,6 @@ ol.TileGrid.prototype.getResolutions = function() { }; -/** - * @param {number} z Z. - * @param {ol.Extent} extent Extent. - * @return {ol.TileBounds} Tile bounds. - */ -ol.TileGrid.prototype.getExtentTileBounds = function(z, extent) { - var topRight = new goog.math.Coordinate(extent.right, extent.top); - var bottomLeft = new goog.math.Coordinate(extent.left, extent.bottom); - return ol.TileBounds.boundingTileBounds( - this.getTileCoord(z, topRight), - this.getTileCoord(z, bottomLeft)); -}; - - /** * @param {number} z Z. * @param {goog.math.Coordinate} coordinate Coordinate. @@ -241,6 +241,16 @@ ol.TileGrid.prototype.getTileCoordExtent = function(tileCoord) { }; +/** + * @param {ol.TileCoord} tileCoord Tile coordinate. + * @return {number} Tile resolution. + */ +ol.TileGrid.prototype.getTileCoordResolution = function(tileCoord) { + goog.asserts.assert(0 <= tileCoord.z && tileCoord.z < this.numResolutions_); + return this.resolutions_[tileCoord.z]; +}; + + /** * @return {goog.math.Size} Tile size. */ @@ -250,12 +260,18 @@ ol.TileGrid.prototype.getTileSize = function() { /** - * @param {ol.TileCoord} tileCoord Tile coordinate. - * @return {number} Tile resolution. + * @return {boolean} X East. */ -ol.TileGrid.prototype.getTileCoordResolution = function(tileCoord) { - goog.asserts.assert(0 <= tileCoord.z && tileCoord.z < this.numResolutions_); - return this.resolutions_[tileCoord.z]; +ol.TileGrid.prototype.getXEast = function() { + return this.xEast_; +}; + + +/** + * @return {boolean} Y South. + */ +ol.TileGrid.prototype.getYSouth = function() { + return this.ySouth_; }; @@ -281,19 +297,3 @@ ol.TileGrid.prototype.getZForResolution = function(resolution) { } return this.numResolutions_ - 1; }; - - -/** - * @param {ol.TileCoord} tileCoord Tile coordinate. - * @param {function(number, ol.TileBounds): boolean} callback Callback. - */ -ol.TileGrid.prototype.forEachTileCoordParent = function(tileCoord, callback) { - var tileCoordExtent = this.getTileCoordExtent(tileCoord); - var z = tileCoord.z - 1; - while (z >= 0) { - if (callback(z, this.getExtentTileBounds(z, tileCoordExtent))) { - return; - } - --z; - } -}; From 3050268eb07696cd307b1ebeab92cfed20224ce7 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Sun, 8 Jul 2012 12:46:30 +0200 Subject: [PATCH 057/562] Add initial ol.TileLayer skeleton --- src/all.js | 1 + src/ol/tilelayer.js | 51 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 52 insertions(+) create mode 100644 src/ol/tilelayer.js diff --git a/src/all.js b/src/all.js index 8885885b62..f28582c646 100644 --- a/src/all.js +++ b/src/all.js @@ -11,6 +11,7 @@ goog.require('ol.Projection'); goog.require('ol.TileBounds'); goog.require('ol.TileCoord'); goog.require('ol.TileGrid'); +goog.require('ol.TileLayer'); goog.require('ol.TileUrlFunction'); goog.require('ol.TileUrlFunctionType'); goog.require('ol.TransformFunction'); diff --git a/src/ol/tilelayer.js b/src/ol/tilelayer.js new file mode 100644 index 0000000000..56ce521939 --- /dev/null +++ b/src/ol/tilelayer.js @@ -0,0 +1,51 @@ +goog.provide('ol.TileLayer'); + +goog.require('ol.Layer'); +goog.require('ol.TileCoord'); +goog.require('ol.TileGrid'); +goog.require('ol.TileUrlFunctionType'); + + + +/** + * @constructor + * @extends {ol.Layer} + * @param {ol.TileGrid} tileGrid Tile grid. + * @param {ol.TileUrlFunctionType} tileUrlFunction Tile URL. + */ +ol.TileLayer = function(tileGrid, tileUrlFunction) { + + goog.base(this); + + /** + * @private + * @type {ol.TileGrid} + */ + this.tileGrid_ = tileGrid; + + /** + * @private + * @type {ol.TileUrlFunctionType} + */ + this.tileUrlFunction_ = tileUrlFunction; + +}; +goog.inherits(ol.TileLayer, ol.Layer); + + +/** + * @param {ol.TileCoord} tileCoord Tile coordinate. + * @return {string} Tile coord URL. + */ +ol.TileLayer.prototype.getTileCoordUrl = function(tileCoord) { + // FIXME maybe wrap x and y + return this.tileUrlFunction_(tileCoord); +}; + + +/** + * @return {ol.TileGrid} Tile grid. + */ +ol.TileLayer.prototype.getTileGrid = function() { + return this.tileGrid_; +}; From 10f8f1198b55bc48fb809ea53b77247a81695576 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Mon, 9 Jul 2012 14:22:25 +0200 Subject: [PATCH 058/562] Add ol.TileGrid.createOpenStreetMap --- src/ol/tilegrid.js | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/src/ol/tilegrid.js b/src/ol/tilegrid.js index fe29122c81..6df3de6ce2 100644 --- a/src/ol/tilegrid.js +++ b/src/ol/tilegrid.js @@ -4,6 +4,7 @@ goog.require('goog.array'); goog.require('goog.asserts'); goog.require('goog.math.Size'); goog.require('ol.Extent'); +goog.require('ol.Projection'); goog.require('ol.TileBounds'); goog.require('ol.TileCoord'); @@ -85,6 +86,28 @@ ol.TileGrid = }; +/** + * @param {number} maxZoom Maximum zoom. + * @return {ol.TileGrid} Tile grid. + */ +ol.TileGrid.createOpenStreetMap = function(maxZoom) { + + var resolutions = new Array(maxZoom + 1); + var z; + for (z = 0; z <= maxZoom; ++z) { + resolutions[z] = ol.Projection.EPSG_3857_HALF_SIZE / (128 << z); + } + + var extent = ol.Projection.EPSG_3857_EXTENT; + var origin = new goog.math.Coordinate( + -ol.Projection.EPSG_3857_HALF_SIZE, ol.Projection.EPSG_3857_HALF_SIZE); + var tileSize = new goog.math.Size(256, 256); + + return new ol.TileGrid(resolutions, extent, origin, true, true, tileSize); + +}; + + /** * @param {ol.TileCoord} tileCoord Tile coordinate. * @param {function(number, ol.TileBounds): boolean} callback Callback. From 1c344ffa9f933804312e158df01350589a95b250 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Mon, 9 Jul 2012 14:26:53 +0200 Subject: [PATCH 059/562] s/LayerView/LayerRendererOptions/ --- doc/ol3.md | 14 ++++---- src/all.js | 2 +- src/ol/layerrendereroptions.js | 63 ++++++++++++++++++++++++++++++++++ src/ol/layerview.js | 61 -------------------------------- 4 files changed, 71 insertions(+), 69 deletions(-) create mode 100644 src/ol/layerrendereroptions.js delete mode 100644 src/ol/layerview.js diff --git a/doc/ol3.md b/doc/ol3.md index 3616345d42..3b78e33c8c 100644 --- a/doc/ol3.md +++ b/doc/ol3.md @@ -42,7 +42,7 @@ goog.events.EventTarget | | | +- LayerRenderer | | -| +- LayerView +| +- LayerRendererOptions | | | +- Map | | @@ -151,7 +151,7 @@ LayerArray getResolutions() -> Array.|null getMaxResolution() = this.getResolutions()[0] | null -LayerView +LayerRendererOptions layer Layer visible boolean opacity number @@ -238,12 +238,12 @@ Layer - A layer advertizes the projections it supports. - A layer returns no data if asked data for an unsupported projection. -LayerView +LayerRendererOptions -- 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. +- A layer renderer options object stores view-related states for a layer. +- Options include visibility, opacity, saturation, hue, etc. +- A layer renderer options object has a layer. +- Multiple layer renderer options can share the same layer. - In other words a layer can be viewed in different manners. Renderer diff --git a/src/all.js b/src/all.js index f28582c646..1d8f95810e 100644 --- a/src/all.js +++ b/src/all.js @@ -5,7 +5,7 @@ goog.require('ol.Bounds'); goog.require('ol.Camera'); goog.require('ol.Extent'); goog.require('ol.Layer'); -goog.require('ol.LayerView'); +goog.require('ol.LayerRendererOptions'); goog.require('ol.Object'); goog.require('ol.Projection'); goog.require('ol.TileBounds'); diff --git a/src/ol/layerrendereroptions.js b/src/ol/layerrendereroptions.js new file mode 100644 index 0000000000..f3922b3de8 --- /dev/null +++ b/src/ol/layerrendereroptions.js @@ -0,0 +1,63 @@ +goog.provide('ol.LayerRendererOptions'); + +goog.require('ol.Object'); + + +/** + * @enum {string} + * @private + */ +ol.LayerRendererOptionsProperty_ = { + OPACITY: 'opacity', + VISIBLE: 'visible' +}; + + + +/** + * @constructor + * @extends {ol.Object} + */ +ol.LayerRendererOptions = function() { + + goog.base(this); + + this.setVisible(true); + this.setOpacity(1); + +}; +goog.inherits(ol.LayerRendererOptions, ol.Object); + + +/** + * @return {number} Opacity. + */ +ol.LayerRendererOptions.prototype.getOpacity = function() { + return /** @type {number} */ ( + this.get(ol.LayerRendererOptionsProperty_.OPACITY)); +}; + + +/** + * @return {boolean} Visible. + */ +ol.LayerRendererOptions.prototype.getVisible = function() { + return /** @type {boolean} */ ( + this.get(ol.LayerRendererOptionsProperty_.VISIBLE)); +}; + + +/** + * @param {number} opacity Opacity. + */ +ol.LayerRendererOptions.prototype.setOpacity = function(opacity) { + this.set(ol.LayerRendererOptionsProperty_.OPACITY, opacity); +}; + + +/** + * @param {boolean} visible Visible. + */ +ol.LayerRendererOptions.prototype.setVisible = function(visible) { + this.set(ol.LayerRendererOptionsProperty_.VISIBLE, visible); +}; diff --git a/src/ol/layerview.js b/src/ol/layerview.js deleted file mode 100644 index b5a3e6cf25..0000000000 --- a/src/ol/layerview.js +++ /dev/null @@ -1,61 +0,0 @@ -goog.provide('ol.LayerView'); - -goog.require('ol.Object'); - - -/** - * @enum {string} - * @private - */ -ol.LayerViewProperty_ = { - OPACITY: 'opacity', - VISIBLE: 'visible' -}; - - - -/** - * @constructor - * @extends {ol.Object} - */ -ol.LayerView = function() { - - goog.base(this); - - this.setVisible(true); - this.setOpacity(1); - -}; -goog.inherits(ol.LayerView, ol.Object); - - -/** - * @return {number} Opacity. - */ -ol.LayerView.prototype.getOpacity = function() { - return /** @type {number} */ (this.get(ol.LayerViewProperty_.OPACITY)); -}; - - -/** - * @return {boolean} Visible. - */ -ol.LayerView.prototype.getVisible = function() { - return /** @type {boolean} */ (this.get(ol.LayerViewProperty_.VISIBLE)); -}; - - -/** - * @param {number} opacity Opacity. - */ -ol.LayerView.prototype.setOpacity = function(opacity) { - this.set(ol.LayerViewProperty_.OPACITY, opacity); -}; - - -/** - * @param {boolean} visible Visible. - */ -ol.LayerView.prototype.setVisible = function(visible) { - this.set(ol.LayerViewProperty_.VISIBLE, visible); -}; From dd3dead3cdf7a2ae0d1885379b4c3c3757aeac63 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Mon, 9 Jul 2012 15:29:44 +0200 Subject: [PATCH 060/562] Add layer to LayerRendererOptions --- src/ol/layerrendereroptions.js | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/src/ol/layerrendereroptions.js b/src/ol/layerrendereroptions.js index f3922b3de8..ef6d02f8a7 100644 --- a/src/ol/layerrendereroptions.js +++ b/src/ol/layerrendereroptions.js @@ -1,5 +1,6 @@ goog.provide('ol.LayerRendererOptions'); +goog.require('ol.Layer'); goog.require('ol.Object'); @@ -17,11 +18,18 @@ ol.LayerRendererOptionsProperty_ = { /** * @constructor * @extends {ol.Object} + * @param {ol.Layer} layer Layer. */ -ol.LayerRendererOptions = function() { +ol.LayerRendererOptions = function(layer) { goog.base(this); + /** + * @private + * @type {ol.Layer} + */ + this.layer_ = layer; + this.setVisible(true); this.setOpacity(1); @@ -29,6 +37,14 @@ ol.LayerRendererOptions = function() { goog.inherits(ol.LayerRendererOptions, ol.Object); +/** + * @return {ol.Layer} Layer. + */ +ol.LayerRendererOptions.prototype.getLayer = function() { + return this.layer_; +}; + + /** * @return {number} Opacity. */ From 5a7c2e72a69b3d8620e047eca05760fe3af109d9 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Mon, 9 Jul 2012 15:34:13 +0200 Subject: [PATCH 061/562] Better type checking in Layer --- src/ol/layer.js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/ol/layer.js b/src/ol/layer.js index d6234990a0..759230ef04 100644 --- a/src/ol/layer.js +++ b/src/ol/layer.js @@ -25,12 +25,15 @@ ol.Layer = function() { goog.base(this); + this.setExtent(null); + this.setProjection(null); + }; goog.inherits(ol.Layer, ol.Object); /** - * @return {string} Attribution. + * @return {string|undefined} Attribution. */ ol.Layer.prototype.getAttribution = function() { return /** @type {string} */ (this.get(ol.LayerProperty_.ATTRIBUTION)); @@ -54,7 +57,7 @@ ol.Layer.prototype.getProjection = function() { /** - * @param {string} attribution Attribution. + * @param {string|undefined} attribution Attribution. */ ol.Layer.prototype.setAttribution = function(attribution) { this.set(ol.LayerProperty_.ATTRIBUTION, attribution); From defffdada8ca983af88296846e369c0fe0d251a7 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Tue, 10 Jul 2012 16:56:28 +0200 Subject: [PATCH 062/562] Allow optional initial values to be passed to ol.Object --- src/ol/object.js | 6 +++++- src/ol/object_test.js | 6 ++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/ol/object.js b/src/ol/object.js index c80c10ca18..98c96cebda 100644 --- a/src/ol/object.js +++ b/src/ol/object.js @@ -32,9 +32,13 @@ ol.ObjectProperty = { /** * @constructor * @extends {goog.events.EventTarget} + * @param {Object.=} opt_values Values. */ -ol.Object = function() { +ol.Object = function(opt_values) { goog.base(this); + if (goog.isDef(opt_values)) { + this.setValues(opt_values); + } }; goog.inherits(ol.Object, goog.events.EventTarget); diff --git a/src/ol/object_test.js b/src/ol/object_test.js index 680bdc4c4f..65e02fcbaf 100644 --- a/src/ol/object_test.js +++ b/src/ol/object_test.js @@ -448,3 +448,9 @@ function testCreateFromObject() { var obj2 = ol.Object.create(obj1); assertTrue(obj2 === obj1); } + + +function testCreateWithOptions() { + var obj = new ol.Object({k: 1}); + assertEquals(1, obj.get('k')); +} From 6610496e56efa7f1a4164c9a1d02c01a951fb9a4 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Tue, 10 Jul 2012 17:03:26 +0200 Subject: [PATCH 063/562] Clean up comments and argument name --- src/ol/object.js | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/ol/object.js b/src/ol/object.js index 98c96cebda..24d8fd38bb 100644 --- a/src/ol/object.js +++ b/src/ol/object.js @@ -75,13 +75,13 @@ ol.Object.getterNameCache_ = {}; /** - * @param {string} str String. + * @param {string} key String. * @private - * @return {string} Capitalized string. + * @return {string} Getter name. */ -ol.Object.getGetterName_ = function(str) { - return ol.Object.getterNameCache_[str] || - (ol.Object.getterNameCache_[str] = 'get' + ol.Object.capitalize(str)); +ol.Object.getGetterName_ = function(key) { + return ol.Object.getterNameCache_[key] || + (ol.Object.getterNameCache_[key] = 'get' + ol.Object.capitalize(key)); }; @@ -93,13 +93,13 @@ ol.Object.setterNameCache_ = {}; /** - * @param {string} str String. + * @param {string} key String. * @private - * @return {string} Capitalized string. + * @return {string} Setter name. */ -ol.Object.getSetterName_ = function(str) { - return ol.Object.setterNameCache_[str] || - (ol.Object.setterNameCache_[str] = 'set' + ol.Object.capitalize(str)); +ol.Object.getSetterName_ = function(key) { + return ol.Object.setterNameCache_[key] || + (ol.Object.setterNameCache_[key] = 'set' + ol.Object.capitalize(key)); }; From fc585de50f507b8c29bf89023765f8c3b692f7ec Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Tue, 10 Jul 2012 17:22:50 +0200 Subject: [PATCH 064/562] Cache event types and changed method names --- src/ol/object.js | 42 +++++++++++++++++++++++++++++++++++++++--- src/ol/object_test.js | 26 ++++++++++++++++++++++++++ 2 files changed, 65 insertions(+), 3 deletions(-) diff --git a/src/ol/object.js b/src/ol/object.js index 24d8fd38bb..3d2fc9036f 100644 --- a/src/ol/object.js +++ b/src/ol/object.js @@ -67,6 +67,24 @@ ol.Object.create = function(arg) { }; +/** + * @private + * @type {Object.} + */ +ol.Object.changedEventTypeCache_ = {}; + + +/** + * @param {string} key Key. + * @private + * @return {string} Changed name. + */ +ol.Object.getChangedEventType_ = function(key) { + return ol.Object.changedEventTypeCache_[key] || + (ol.Object.changedEventTypeCache_[key] = key.toLowerCase() + '_changed'); +}; + + /** * @private * @type {Object.} @@ -85,6 +103,24 @@ ol.Object.getGetterName_ = function(key) { }; +/** + * @private + * @type {Object.} + */ +ol.Object.changedMethodNameCache_ = {}; + + +/** + * @param {string} key String. + * @private + * @return {string} Changed method name. + */ +ol.Object.getChangedMethodName_ = function(key) { + return ol.Object.changedMethodNameCache_[key] || + (ol.Object.changedMethodNameCache_[key] = key + '_changed'); +}; + + /** * @private * @type {Object.} @@ -133,7 +169,7 @@ ol.Object.prototype.bindTo = function(key, target, opt_targetKey, opt_noNotify) { var targetKey = goog.isDef(opt_targetKey) ? opt_targetKey : key; this.unbind(key); - var eventType = targetKey.toLowerCase() + '_changed'; + var eventType = ol.Object.getChangedEventType_(targetKey); var listeners = ol.Object.getListeners(this); listeners[key] = goog.events.listen(target, eventType, function() { this.notifyInternal_(key); @@ -197,13 +233,13 @@ ol.Object.prototype.notify = function(key) { * @private */ ol.Object.prototype.notifyInternal_ = function(key) { - var changedMethodName = key + '_changed'; + var changedMethodName = ol.Object.getChangedMethodName_(key); if (this[changedMethodName]) { this[changedMethodName](); } else { this.changed(key); } - var eventType = key.toLowerCase() + '_changed'; + var eventType = ol.Object.getChangedEventType_(key); this.dispatchEvent(eventType); }; diff --git a/src/ol/object_test.js b/src/ol/object_test.js index 65e02fcbaf..28b0339535 100644 --- a/src/ol/object_test.js +++ b/src/ol/object_test.js @@ -454,3 +454,29 @@ function testCreateWithOptions() { var obj = new ol.Object({k: 1}); assertEquals(1, obj.get('k')); } + + +function testEventTypeCaseSensitivity() { + var obj = new ol.Object(); + var lowercaseChangedMethodCalled = false; + obj.k_changed = function() { + lowercaseChangedMethodCalled = true; + }; + var uppercaseChangedMethodCalled = false; + obj.K_changed = function() { + uppercaseChangedMethodCalled = true; + }; + var lowercaseEventDispatched = false; + goog.events.listen(obj, 'k_changed', function() { + lowercaseEventDispatched = true; + }); + var uppercaseEventDispatched = false; + goog.events.listen(obj, 'K_changed', function() { + uppercaseEventDispatched = true; + }); + obj.set('K', 1); + assertTrue(lowercaseEventDispatched); + assertFalse(uppercaseEventDispatched); + assertFalse(lowercaseChangedMethodCalled); + assertTrue(uppercaseChangedMethodCalled); +} From 2dbd9c676b5906abe87c38d58c68bb8d049381f4 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Tue, 10 Jul 2012 17:25:35 +0200 Subject: [PATCH 065/562] Make name calculations public --- src/ol/object.js | 24 ++++++++++-------------- 1 file changed, 10 insertions(+), 14 deletions(-) diff --git a/src/ol/object.js b/src/ol/object.js index 3d2fc9036f..7e9690266b 100644 --- a/src/ol/object.js +++ b/src/ol/object.js @@ -76,10 +76,9 @@ ol.Object.changedEventTypeCache_ = {}; /** * @param {string} key Key. - * @private * @return {string} Changed name. */ -ol.Object.getChangedEventType_ = function(key) { +ol.Object.getChangedEventType = function(key) { return ol.Object.changedEventTypeCache_[key] || (ol.Object.changedEventTypeCache_[key] = key.toLowerCase() + '_changed'); }; @@ -94,10 +93,9 @@ ol.Object.getterNameCache_ = {}; /** * @param {string} key String. - * @private * @return {string} Getter name. */ -ol.Object.getGetterName_ = function(key) { +ol.Object.getGetterName = function(key) { return ol.Object.getterNameCache_[key] || (ol.Object.getterNameCache_[key] = 'get' + ol.Object.capitalize(key)); }; @@ -112,10 +110,9 @@ ol.Object.changedMethodNameCache_ = {}; /** * @param {string} key String. - * @private * @return {string} Changed method name. */ -ol.Object.getChangedMethodName_ = function(key) { +ol.Object.getChangedMethodName = function(key) { return ol.Object.changedMethodNameCache_[key] || (ol.Object.changedMethodNameCache_[key] = key + '_changed'); }; @@ -130,10 +127,9 @@ ol.Object.setterNameCache_ = {}; /** * @param {string} key String. - * @private * @return {string} Setter name. */ -ol.Object.getSetterName_ = function(key) { +ol.Object.getSetterName = function(key) { return ol.Object.setterNameCache_[key] || (ol.Object.setterNameCache_[key] = 'set' + ol.Object.capitalize(key)); }; @@ -169,7 +165,7 @@ ol.Object.prototype.bindTo = function(key, target, opt_targetKey, opt_noNotify) { var targetKey = goog.isDef(opt_targetKey) ? opt_targetKey : key; this.unbind(key); - var eventType = ol.Object.getChangedEventType_(targetKey); + var eventType = ol.Object.getChangedEventType(targetKey); var listeners = ol.Object.getListeners(this); listeners[key] = goog.events.listen(target, eventType, function() { this.notifyInternal_(key); @@ -200,7 +196,7 @@ ol.Object.prototype.get = function(key) { var accessor = accessors[key]; var target = accessor.target; var targetKey = accessor.key; - var getterName = ol.Object.getGetterName_(targetKey); + var getterName = ol.Object.getGetterName(targetKey); if (target[getterName]) { return target[getterName](); } else { @@ -233,13 +229,13 @@ ol.Object.prototype.notify = function(key) { * @private */ ol.Object.prototype.notifyInternal_ = function(key) { - var changedMethodName = ol.Object.getChangedMethodName_(key); + var changedMethodName = ol.Object.getChangedMethodName(key); if (this[changedMethodName]) { this[changedMethodName](); } else { this.changed(key); } - var eventType = ol.Object.getChangedEventType_(key); + var eventType = ol.Object.getChangedEventType(key); this.dispatchEvent(eventType); }; @@ -254,7 +250,7 @@ ol.Object.prototype.set = function(key, value) { var accessor = accessors[key]; var target = accessor.target; var targetKey = accessor.key; - var setterName = ol.Object.getSetterName_(targetKey); + var setterName = ol.Object.getSetterName(targetKey); if (target[setterName]) { target[setterName](value); } else { @@ -272,7 +268,7 @@ ol.Object.prototype.set = function(key, value) { */ ol.Object.prototype.setOptions = function(options) { goog.object.forEach(options, function(value, key) { - var setterName = ol.Object.getSetterName_(key); + var setterName = ol.Object.getSetterName(key); if (this[setterName]) { this[setterName](value); } else { From 5de1ac3dd64649efd525bac1c88bf18e899ce864 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Tue, 10 Jul 2012 17:30:11 +0200 Subject: [PATCH 066/562] Don't use typedef for type that is only used once --- src/ol/object.js | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/src/ol/object.js b/src/ol/object.js index 7e9690266b..c8828d5e47 100644 --- a/src/ol/object.js +++ b/src/ol/object.js @@ -13,12 +13,6 @@ goog.require('goog.events.EventTarget'); goog.require('goog.object'); -/** - * @typedef {{target: ol.Object, key: string}} - */ -ol.ObjectAccessor; - - /** * @enum {string} */ @@ -137,7 +131,7 @@ ol.Object.getSetterName = function(key) { /** * @param {ol.Object} obj Object. - * @return {Object.} Accessors. + * @return {Object.} Accessors. */ ol.Object.getAccessors = function(obj) { return obj[ol.ObjectProperty.ACCESSORS] || From 01cb568a508f6423e7adbd7ade7a45ed1c796b12 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Tue, 10 Jul 2012 17:36:20 +0200 Subject: [PATCH 067/562] Rename Layer to Store and LayerRendereOptions to Layer --- src/all.js | 4 +- src/ol/layer.js | 63 +++++++++++---------- src/ol/layerrendereroptions.js | 79 -------------------------- src/ol/store.js | 80 +++++++++++++++++++++++++++ src/ol/{tilelayer.js => tilestore.js} | 14 ++--- 5 files changed, 120 insertions(+), 120 deletions(-) delete mode 100644 src/ol/layerrendereroptions.js create mode 100644 src/ol/store.js rename src/ol/{tilelayer.js => tilestore.js} (70%) diff --git a/src/all.js b/src/all.js index 1d8f95810e..cd57d0dd57 100644 --- a/src/all.js +++ b/src/all.js @@ -5,13 +5,13 @@ goog.require('ol.Bounds'); goog.require('ol.Camera'); goog.require('ol.Extent'); goog.require('ol.Layer'); -goog.require('ol.LayerRendererOptions'); goog.require('ol.Object'); goog.require('ol.Projection'); +goog.require('ol.Store'); goog.require('ol.TileBounds'); goog.require('ol.TileCoord'); goog.require('ol.TileGrid'); -goog.require('ol.TileLayer'); +goog.require('ol.TileStore'); goog.require('ol.TileUrlFunction'); goog.require('ol.TileUrlFunctionType'); goog.require('ol.TransformFunction'); diff --git a/src/ol/layer.js b/src/ol/layer.js index 759230ef04..6048010d70 100644 --- a/src/ol/layer.js +++ b/src/ol/layer.js @@ -1,18 +1,16 @@ goog.provide('ol.Layer'); -goog.require('ol.Extent'); goog.require('ol.Object'); -goog.require('ol.Projection'); +goog.require('ol.Store'); /** * @enum {string} * @private */ -ol.LayerProperty_ = { - ATTRIBUTION: 'attribution', - EXTENT: 'extent', - PROJECTION: 'projection' +ol.LayerRendererOptionsProperty_ = { + OPACITY: 'opacity', + VISIBLE: 'visible' }; @@ -20,61 +18,62 @@ ol.LayerProperty_ = { /** * @constructor * @extends {ol.Object} + * @param {ol.Store} store Store. */ -ol.Layer = function() { +ol.Layer = function(store) { goog.base(this); - this.setExtent(null); - this.setProjection(null); + /** + * @private + * @type {ol.Store} + */ + this.store_ = store; + + this.setVisible(true); + this.setOpacity(1); }; goog.inherits(ol.Layer, ol.Object); /** - * @return {string|undefined} Attribution. + * @return {number} Opacity. */ -ol.Layer.prototype.getAttribution = function() { - return /** @type {string} */ (this.get(ol.LayerProperty_.ATTRIBUTION)); +ol.Layer.prototype.getOpacity = function() { + return /** @type {number} */ ( + this.get(ol.LayerRendererOptionsProperty_.OPACITY)); }; /** - * @return {ol.Extent} Extent. + * @return {ol.Store} Store. */ -ol.Layer.prototype.getExtent = function() { - return /** @type {ol.Extent} */ (this.get(ol.LayerProperty_.EXTENT)); +ol.Layer.prototype.getStore = function() { + return this.store_; }; /** - * @return {ol.Projection} Projection. + * @return {boolean} Visible. */ -ol.Layer.prototype.getProjection = function() { - return /** @type {ol.Projection} */ (this.get(ol.LayerProperty_.PROJECTION)); +ol.Layer.prototype.getVisible = function() { + return /** @type {boolean} */ ( + this.get(ol.LayerRendererOptionsProperty_.VISIBLE)); }; /** - * @param {string|undefined} attribution Attribution. + * @param {number} opacity Opacity. */ -ol.Layer.prototype.setAttribution = function(attribution) { - this.set(ol.LayerProperty_.ATTRIBUTION, attribution); +ol.Layer.prototype.setOpacity = function(opacity) { + this.set(ol.LayerRendererOptionsProperty_.OPACITY, opacity); }; /** - * @param {ol.Extent} extent Extent. + * @param {boolean} visible Visible. */ -ol.Layer.prototype.setExtent = function(extent) { - this.set(ol.LayerProperty_.EXTENT, extent); -}; - - -/** - * @param {ol.Projection} projection Projetion. - */ -ol.Layer.prototype.setProjection = function(projection) { - this.set(ol.LayerProperty_.PROJECTION, projection); +ol.Layer.prototype.setVisible = function(visible) { + this.set(ol.LayerRendererOptionsProperty_.VISIBLE, visible); }; diff --git a/src/ol/layerrendereroptions.js b/src/ol/layerrendereroptions.js deleted file mode 100644 index ef6d02f8a7..0000000000 --- a/src/ol/layerrendereroptions.js +++ /dev/null @@ -1,79 +0,0 @@ -goog.provide('ol.LayerRendererOptions'); - -goog.require('ol.Layer'); -goog.require('ol.Object'); - - -/** - * @enum {string} - * @private - */ -ol.LayerRendererOptionsProperty_ = { - OPACITY: 'opacity', - VISIBLE: 'visible' -}; - - - -/** - * @constructor - * @extends {ol.Object} - * @param {ol.Layer} layer Layer. - */ -ol.LayerRendererOptions = function(layer) { - - goog.base(this); - - /** - * @private - * @type {ol.Layer} - */ - this.layer_ = layer; - - this.setVisible(true); - this.setOpacity(1); - -}; -goog.inherits(ol.LayerRendererOptions, ol.Object); - - -/** - * @return {ol.Layer} Layer. - */ -ol.LayerRendererOptions.prototype.getLayer = function() { - return this.layer_; -}; - - -/** - * @return {number} Opacity. - */ -ol.LayerRendererOptions.prototype.getOpacity = function() { - return /** @type {number} */ ( - this.get(ol.LayerRendererOptionsProperty_.OPACITY)); -}; - - -/** - * @return {boolean} Visible. - */ -ol.LayerRendererOptions.prototype.getVisible = function() { - return /** @type {boolean} */ ( - this.get(ol.LayerRendererOptionsProperty_.VISIBLE)); -}; - - -/** - * @param {number} opacity Opacity. - */ -ol.LayerRendererOptions.prototype.setOpacity = function(opacity) { - this.set(ol.LayerRendererOptionsProperty_.OPACITY, opacity); -}; - - -/** - * @param {boolean} visible Visible. - */ -ol.LayerRendererOptions.prototype.setVisible = function(visible) { - this.set(ol.LayerRendererOptionsProperty_.VISIBLE, visible); -}; diff --git a/src/ol/store.js b/src/ol/store.js new file mode 100644 index 0000000000..0f0d218db1 --- /dev/null +++ b/src/ol/store.js @@ -0,0 +1,80 @@ +goog.provide('ol.Store'); + +goog.require('ol.Extent'); +goog.require('ol.Object'); +goog.require('ol.Projection'); + + +/** + * @enum {string} + * @private + */ +ol.StoreProperty_ = { + ATTRIBUTION: 'attribution', + EXTENT: 'extent', + PROJECTION: 'projection' +}; + + + +/** + * @constructor + * @extends {ol.Object} + */ +ol.Store = function() { + + goog.base(this); + + this.setExtent(null); + this.setProjection(null); + +}; +goog.inherits(ol.Store, ol.Object); + + +/** + * @return {string|undefined} Attribution. + */ +ol.Store.prototype.getAttribution = function() { + return /** @type {string} */ (this.get(ol.StoreProperty_.ATTRIBUTION)); +}; + + +/** + * @return {ol.Extent} Extent. + */ +ol.Store.prototype.getExtent = function() { + return /** @type {ol.Extent} */ (this.get(ol.StoreProperty_.EXTENT)); +}; + + +/** + * @return {ol.Projection} Projection. + */ +ol.Store.prototype.getProjection = function() { + return /** @type {ol.Projection} */ (this.get(ol.StoreProperty_.PROJECTION)); +}; + + +/** + * @param {string|undefined} attribution Attribution. + */ +ol.Store.prototype.setAttribution = function(attribution) { + this.set(ol.StoreProperty_.ATTRIBUTION, attribution); +}; + + +/** + * @param {ol.Extent} extent Extent. + */ +ol.Store.prototype.setExtent = function(extent) { + this.set(ol.StoreProperty_.EXTENT, extent); +}; + + +/** + * @param {ol.Projection} projection Projetion. + */ +ol.Store.prototype.setProjection = function(projection) { + this.set(ol.StoreProperty_.PROJECTION, projection); +}; diff --git a/src/ol/tilelayer.js b/src/ol/tilestore.js similarity index 70% rename from src/ol/tilelayer.js rename to src/ol/tilestore.js index 56ce521939..d2d708da90 100644 --- a/src/ol/tilelayer.js +++ b/src/ol/tilestore.js @@ -1,6 +1,6 @@ -goog.provide('ol.TileLayer'); +goog.provide('ol.TileStore'); -goog.require('ol.Layer'); +goog.require('ol.Store'); goog.require('ol.TileCoord'); goog.require('ol.TileGrid'); goog.require('ol.TileUrlFunctionType'); @@ -9,11 +9,11 @@ goog.require('ol.TileUrlFunctionType'); /** * @constructor - * @extends {ol.Layer} + * @extends {ol.Store} * @param {ol.TileGrid} tileGrid Tile grid. * @param {ol.TileUrlFunctionType} tileUrlFunction Tile URL. */ -ol.TileLayer = function(tileGrid, tileUrlFunction) { +ol.TileStore = function(tileGrid, tileUrlFunction) { goog.base(this); @@ -30,14 +30,14 @@ ol.TileLayer = function(tileGrid, tileUrlFunction) { this.tileUrlFunction_ = tileUrlFunction; }; -goog.inherits(ol.TileLayer, ol.Layer); +goog.inherits(ol.TileStore, ol.Store); /** * @param {ol.TileCoord} tileCoord Tile coordinate. * @return {string} Tile coord URL. */ -ol.TileLayer.prototype.getTileCoordUrl = function(tileCoord) { +ol.TileStore.prototype.getTileCoordUrl = function(tileCoord) { // FIXME maybe wrap x and y return this.tileUrlFunction_(tileCoord); }; @@ -46,6 +46,6 @@ ol.TileLayer.prototype.getTileCoordUrl = function(tileCoord) { /** * @return {ol.TileGrid} Tile grid. */ -ol.TileLayer.prototype.getTileGrid = function() { +ol.TileStore.prototype.getTileGrid = function() { return this.tileGrid_; }; From e199fbd7f64332e50d1ad72f63294de3e9e8bcab Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Tue, 10 Jul 2012 18:21:54 +0200 Subject: [PATCH 068/562] Update ol.Tile --- src/all.js | 1 + src/ol/Tile.js | 172 ------------------------------------------------- src/ol/tile.js | 129 +++++++++++++++++++++++++++++++++++++ 3 files changed, 130 insertions(+), 172 deletions(-) delete mode 100644 src/ol/Tile.js create mode 100644 src/ol/tile.js diff --git a/src/all.js b/src/all.js index cd57d0dd57..14180a12a5 100644 --- a/src/all.js +++ b/src/all.js @@ -8,6 +8,7 @@ goog.require('ol.Layer'); goog.require('ol.Object'); goog.require('ol.Projection'); goog.require('ol.Store'); +goog.require('ol.Tile'); goog.require('ol.TileBounds'); goog.require('ol.TileCoord'); goog.require('ol.TileGrid'); diff --git a/src/ol/Tile.js b/src/ol/Tile.js deleted file mode 100644 index 8e9c7a7cc2..0000000000 --- a/src/ol/Tile.js +++ /dev/null @@ -1,172 +0,0 @@ -goog.provide('ol.Tile'); - -goog.require('goog.events'); -goog.require('goog.asserts'); -goog.require('ol.Bounds'); -goog.require('ol.event.Events'); - -/** - * The Tile class. - * @constructor - * @param {string} url - * @param {ol.Bounds|undefined} opt_bounds - */ -ol.Tile = function(url, opt_bounds) { - - /** - * @private - * @type {string} - */ - this.url_ = url; - - /** - * @private - * @type {ol.Bounds|undefined} - */ - this.bounds_ = opt_bounds; - - /** - * @private - * @type {boolean} - */ - this.loaded_ = false; - - /** - * @private - * @type {boolean} - */ - this.loading_ = false; - - /** - * @private - * @type {HTMLImageElement} - */ - this.img_ = this.createImage(); - goog.events.listenOnce(this.img_, goog.events.EventType.LOAD, - this.handleImageLoad, false, this); - goog.events.listenOnce(this.img_, goog.events.EventType.ERROR, - this.handleImageError, false, this); - - /** - * @private - * @type {ol.event.Events} - */ - this.events_ = new ol.event.Events(this); -}; - -/** - * @protected - * @return {HTMLImageElement} - */ -ol.Tile.prototype.createImage = function() { - // overriden by subclasses -}; - -/** - * Load the tile. A tile should loaded only once. - */ -ol.Tile.prototype.load = function() { - goog.asserts.assert(!this.loaded_ && !this.loading_); - this.loading_ = true; - this.img_.src = this.url_; -}; - -/** - * Get the tile url. - * @return {string} - */ -ol.Tile.prototype.getUrl = function() { - return this.url_; -}; - -/** - * Get the tile bounds. - * @return {ol.Bounds|undefined} - */ -ol.Tile.prototype.getBounds = function() { - return this.bounds_; -}; - -/** - * Get the tile image. - * @return {HTMLImageElement} - */ -ol.Tile.prototype.getImg = function() { - return this.img_; -}; - -/** - * Handle load event on the image. - * @param {goog.events.BrowserEvent} evt Event. - */ -ol.Tile.prototype.handleImageLoad = function(evt) { - this.loading_ = false; - this.loaded_ = true; - this.img_.style.visibility = "inherit"; - this.img_.style.opacity = 1; // TODO: allow for layer opacity - this.events_.triggerEvent('load'); -}; - -/** - * Handle load error event on the image. - * @param {goog.events.BrowserEvent} evt Event. - */ -ol.Tile.prototype.handleImageError = function(evt) { - this.loading_ = false; - this.events_.triggerEvent('error'); -}; - -/** - * Is the tile loaded already? - * @return {boolean} - */ -ol.Tile.prototype.isLoaded = function() { - return this.loaded_; -}; - -/** - * Is the tile being loaded? - * @return {boolean} - */ -ol.Tile.prototype.isLoading = function() { - return this.loading_; -}; - -/** - * - */ -ol.Tile.prototype.destroy = function() { - this.events_.triggerEvent('destroy'); -}; - -/** - * Create a tile constructor, for specific width and height values - * for the tiles. - * @param {number} width - * @param {number} height - * @return {function(new:ol.Tile, string, ol.Bounds=)} - */ -ol.Tile.createConstructor = function(width, height) { - /** - * @constructor - * @extends {ol.Tile} - */ - var Tile = function(url, opt_bounds) { - goog.base(this, url, opt_bounds); - }; - goog.inherits(Tile, ol.Tile); - /** @inheritDoc */ - Tile.prototype.createImage = (function() { - var img = document.createElement("img"); - img.className = "olTile"; - img.style.position = "absolute"; - img.style.width = width + "px"; - img.style.height = height + "px"; - img.style.opacity = 0; - img.src = "data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs="; - return function() { - return img.cloneNode(false); - }; - })(); - return Tile; -}; diff --git a/src/ol/tile.js b/src/ol/tile.js new file mode 100644 index 0000000000..598651f9fc --- /dev/null +++ b/src/ol/tile.js @@ -0,0 +1,129 @@ +goog.provide('ol.Tile'); + +goog.require('goog.events'); +goog.require('goog.events.EventTarget'); +goog.require('goog.events.EventType'); +goog.require('ol.TileCoord'); + + +/** + * @enum {number} + */ +ol.TileLoadState = { + IDLE: 0, + LOADING: 1, + LOADED: 2, + ERROR: 3 +}; + + + +/** + * @constructor + * @extends {goog.events.EventTarget} + * @param {ol.TileCoord} tileCoord Tile coordinate. + * @param {string} src Source. + * @param {string=} opt_crossOrigin Cross origin. + */ +ol.Tile = function(tileCoord, src, opt_crossOrigin) { + + goog.base(this); + + /** + * @type {ol.TileCoord} + */ + this.tileCoord = tileCoord; + + /** + * @private + * @type {string} + */ + this.src_ = src; + + /** + * @private + * @type {ol.TileLoadState} + */ + this.state_ = ol.TileLoadState.IDLE; + + /** + * @private + * @type {Image} + */ + this.image_ = new Image(); + if (goog.isDef(opt_crossOrigin)) { + this.image_.crossOrigin = opt_crossOrigin; + } + + /** + * @private + * @type {Array.} + */ + this.imageListenerKeys_ = null; + +}; +goog.inherits(ol.Tile, goog.events.EventTarget); + + +/** + * @return {Image} Image. + */ +ol.Tile.prototype.getImage = function() { + return this.image_; +}; + + +/** + * @private + */ +ol.Tile.prototype.handleImageError_ = function() { + this.state_ = ol.TileLoadState.ERROR; + this.unlistenImage_(); +}; + + +/** + * @private + */ +ol.Tile.prototype.handleImageLoad_ = function() { + this.state_ = ol.TileLoadState.LOADED; + this.unlistenImage_(); +}; + + +/** + * @return {boolean} Is loaded. + */ +ol.Tile.prototype.isLoaded = function() { + return this.state_ == ol.TileLoadState.LOADED; +}; + + +/** + * @return {EventTarget} Event target. + */ +ol.Tile.prototype.load = function() { + if (this.state_ == ol.TileLoadState.IDLE) { + this.state_ = ol.TileLoadState.LOADING; + goog.asserts.assert(goog.isNull(this.imageListenerKeys_)); + this.imageListenerKeys_ = [ + goog.events.listenOnce(this.image_, goog.events.EventType.ERROR, + this.handleImageError_, false, this), + goog.events.listenOnce(this.image_, goog.events.EventType.LOAD, + this.handleImageLoad_, false, this) + ]; + this.image_.src = this.src_; + } + return this.image_; +}; + + +/** + * @private + */ +ol.Tile.prototype.unlistenImage_ = function() { + goog.asserts.assert(!goog.isNull(this.imageListenerKeys_)); + goog.array.forEach(this.imageListenerKeys_, goog.events.unlistenByKey); + this.imageListenerKeys_ = null; +}; + From 5adbd137050f2dea0e1d44a7330e1aa6a13d90b3 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Tue, 10 Jul 2012 18:28:56 +0200 Subject: [PATCH 069/562] Add ol.TileCoord.toString --- src/ol/tilecoord.js | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/ol/tilecoord.js b/src/ol/tilecoord.js index a34e2e55c9..4252ee098e 100644 --- a/src/ol/tilecoord.js +++ b/src/ol/tilecoord.js @@ -38,3 +38,11 @@ ol.TileCoord.prototype.clone = function() { ol.TileCoord.prototype.hash = function() { return (this.x << this.z) + this.y; }; + + +/** + * @return {string} String. + */ +ol.TileCoord.prototype.toString = function() { + return [this.z, this.x, this.y].join('/'); +}; From b2b9a41be17f413f573f755486a2bdd701edc65f Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Tue, 10 Jul 2012 18:29:55 +0200 Subject: [PATCH 070/562] Merge tile cache into TileStore --- src/ol/TileCache.js | 23 ----------------------- src/ol/tilestore.js | 35 ++++++++++++++++++++++++++++++++++- 2 files changed, 34 insertions(+), 24 deletions(-) delete mode 100644 src/ol/TileCache.js diff --git a/src/ol/TileCache.js b/src/ol/TileCache.js deleted file mode 100644 index 0772adf06b..0000000000 --- a/src/ol/TileCache.js +++ /dev/null @@ -1,23 +0,0 @@ -goog.provide('ol.TileCache'); - -goog.require('goog.structs.LinkedMap'); - -/** - * A cache of ol.Tile objects. - * @constructor - * @extends {goog.structs.LinkedMap} - * @param {number=} opt_size - */ -ol.TileCache = function(opt_size) { - goog.base(this, opt_size || 100, true /* cache mode */); -}; - -goog.inherits(ol.TileCache, goog.structs.LinkedMap); - -/** - * @inheritDoc - */ -ol.TileCache.prototype.removeNode = function(node) { - goog.base(this, 'removeNode', node); - node.value.destroy(); -}; diff --git a/src/ol/tilestore.js b/src/ol/tilestore.js index d2d708da90..2327c86d24 100644 --- a/src/ol/tilestore.js +++ b/src/ol/tilestore.js @@ -1,6 +1,7 @@ goog.provide('ol.TileStore'); goog.require('ol.Store'); +goog.require('ol.Tile'); goog.require('ol.TileCoord'); goog.require('ol.TileGrid'); goog.require('ol.TileUrlFunctionType'); @@ -12,8 +13,9 @@ goog.require('ol.TileUrlFunctionType'); * @extends {ol.Store} * @param {ol.TileGrid} tileGrid Tile grid. * @param {ol.TileUrlFunctionType} tileUrlFunction Tile URL. + * @param {string=} opt_crossOrigin Cross origin. */ -ol.TileStore = function(tileGrid, tileUrlFunction) { +ol.TileStore = function(tileGrid, tileUrlFunction, opt_crossOrigin) { goog.base(this); @@ -29,10 +31,41 @@ ol.TileStore = function(tileGrid, tileUrlFunction) { */ this.tileUrlFunction_ = tileUrlFunction; + /** + * @private + * @type {string|undefined} + */ + this.crossOrigin_ = opt_crossOrigin; + + /** + * @private + * @type {Object.} + * FIXME will need to expire elements from this cache + * FIXME see elemoine's work with goog.structs.LinkedMap + */ + this.tileCache_ = {}; + }; goog.inherits(ol.TileStore, ol.Store); +/** + * @param {ol.TileCoord} tileCoord Tile coordinate. + * @return {ol.Tile} Tile. + */ +ol.TileStore.prototype.getTile = function(tileCoord) { + var key = tileCoord.toString(); + if (goog.object.containsKey(this.tileCache_, key)) { + return this.tileCache_[key]; + } else { + var tileUrl = this.getTileCoordUrl(tileCoord); + var tile = new ol.Tile(tileCoord, tileUrl, this.crossOrigin_); + this.tileCache_[key] = tile; + return tile; + } +}; + + /** * @param {ol.TileCoord} tileCoord Tile coordinate. * @return {string} Tile coord URL. From 11835b18c9ede387cb7a0d930218b4515636be21 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Tue, 10 Jul 2012 18:32:17 +0200 Subject: [PATCH 071/562] Remove ol.coord.AccessorInterface --- src/ol/coord/AccessorInterface.js | 58 ------------------------------- 1 file changed, 58 deletions(-) delete mode 100644 src/ol/coord/AccessorInterface.js diff --git a/src/ol/coord/AccessorInterface.js b/src/ol/coord/AccessorInterface.js deleted file mode 100644 index 46fe6ab219..0000000000 --- a/src/ol/coord/AccessorInterface.js +++ /dev/null @@ -1,58 +0,0 @@ -goog.provide('ol.coord.AccessorInterface'); - -goog.require('ol.Projection'); - -/** - * The AccessorInterface in coord package - * - * @interface - * - * @param {number} x X. - * @param {number} y Y. - * @param {number=} opt_z Z. - * @param {ol.Projection=} opt_projection Projection. - */ -ol.coord.AccessorInterface = function(x, y, opt_z, opt_projection){ - -}; - -/** - * @return {number} X. - */ -ol.coord.AccessorInterface.prototype.getX = function(){}; - -/** - * @return {number} Y. - */ -ol.coord.AccessorInterface.prototype.getY = function(){}; - -/** - * @return {number|undefined} Z. - */ -ol.coord.AccessorInterface.prototype.getZ = function(){}; - -/** - * @return {ol.Projection|undefined} Projection. - */ -ol.coord.AccessorInterface.prototype.getProjection = function() {}; - -/** - * @param {number} x X. - */ -ol.coord.AccessorInterface.prototype.setX = function(x){}; - -/** - * @param {number} y Y. - */ -ol.coord.AccessorInterface.prototype.setY = function(y){}; - -/** - * @param {number|undefined} z Z. - */ -ol.coord.AccessorInterface.prototype.setZ = function(z){}; - -/** - * @param {ol.Projection} projection Projection. - */ -ol.coord.AccessorInterface.prototype.setProjection = function(projection) {}; - From 56de224667ba7b4ac5df2868dbf00e122a9ca39f Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Tue, 10 Jul 2012 18:42:50 +0200 Subject: [PATCH 072/562] Add missing require --- src/ol/tile.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/ol/tile.js b/src/ol/tile.js index 598651f9fc..6967f3e5a4 100644 --- a/src/ol/tile.js +++ b/src/ol/tile.js @@ -1,5 +1,6 @@ goog.provide('ol.Tile'); +goog.require('goog.array'); goog.require('goog.events'); goog.require('goog.events.EventTarget'); goog.require('goog.events.EventType'); From 06d32b3819bd6c13b32562ed93154ec4eae82812 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Tue, 10 Jul 2012 19:40:00 +0200 Subject: [PATCH 073/562] Allow values to be passed to ol.Layer --- src/ol/layer.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/ol/layer.js b/src/ol/layer.js index 6048010d70..13e3bd1ed3 100644 --- a/src/ol/layer.js +++ b/src/ol/layer.js @@ -19,8 +19,9 @@ ol.LayerRendererOptionsProperty_ = { * @constructor * @extends {ol.Object} * @param {ol.Store} store Store. + * @param {Object.} opt_values Values. */ -ol.Layer = function(store) { +ol.Layer = function(store, opt_values) { goog.base(this); @@ -33,6 +34,10 @@ ol.Layer = function(store) { this.setVisible(true); this.setOpacity(1); + if (goog.isDef(opt_values)) { + this.setValues(opt_values); + } + }; goog.inherits(ol.Layer, ol.Object); From 6c1090a2df8df8e3aeb7df04ece234211b559e2c Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Tue, 10 Jul 2012 19:40:28 +0200 Subject: [PATCH 074/562] Add initial ol.LayerRenderer skeleton --- src/all.js | 1 + src/ol/layerrenderer.js | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 33 insertions(+) create mode 100644 src/ol/layerrenderer.js diff --git a/src/all.js b/src/all.js index 14180a12a5..cf45c42432 100644 --- a/src/all.js +++ b/src/all.js @@ -5,6 +5,7 @@ goog.require('ol.Bounds'); goog.require('ol.Camera'); goog.require('ol.Extent'); goog.require('ol.Layer'); +goog.require('ol.LayerRenderer'); goog.require('ol.Object'); goog.require('ol.Projection'); goog.require('ol.Store'); diff --git a/src/ol/layerrenderer.js b/src/ol/layerrenderer.js new file mode 100644 index 0000000000..6b53ce8d93 --- /dev/null +++ b/src/ol/layerrenderer.js @@ -0,0 +1,32 @@ +goog.provide('ol.LayerRenderer'); + +goog.require('ol.Layer'); +goog.require('ol.Object'); + + + +/** + * @constructor + * @extends {ol.Object} + * @param {ol.Layer} layer Layer. + */ +ol.LayerRenderer = function(layer) { + + goog.base(this); + + /** + * @private + * @type {ol.Layer} + */ + this.layer_ = layer; + +}; +goog.inherits(ol.LayerRenderer, ol.Object); + + +/** + * @return {ol.Layer} Layer. + */ +ol.LayerRenderer.prototype.getLayer = function() { + return this.layer_; +}; From bcf4d9416c4d1c4b7e4e7147755b4d97897d0405 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Tue, 10 Jul 2012 19:40:48 +0200 Subject: [PATCH 075/562] Add initial ol.MapRenderer skeleton --- src/all.js | 1 + src/ol/maprenderer.js | 215 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 216 insertions(+) create mode 100644 src/ol/maprenderer.js diff --git a/src/all.js b/src/all.js index cf45c42432..5cc23c1d54 100644 --- a/src/all.js +++ b/src/all.js @@ -6,6 +6,7 @@ goog.require('ol.Camera'); goog.require('ol.Extent'); goog.require('ol.Layer'); goog.require('ol.LayerRenderer'); +goog.require('ol.MapRenderer'); goog.require('ol.Object'); goog.require('ol.Projection'); goog.require('ol.Store'); diff --git a/src/ol/maprenderer.js b/src/ol/maprenderer.js new file mode 100644 index 0000000000..5340c1ac8e --- /dev/null +++ b/src/ol/maprenderer.js @@ -0,0 +1,215 @@ +goog.provide('ol.MapRenderer'); + +goog.require('goog.array'); +goog.require('goog.events'); +goog.require('ol.Array'); +goog.require('ol.Camera'); +goog.require('ol.LayerRenderer'); +goog.require('ol.Object'); +goog.require('ol.Projection'); + + +/** + * @enum {string} + */ +ol.MapRendererProperty = { + CAMERA: 'camera', + LAYERS: 'layers', + PROJECTION: 'projection' +}; + + + +/** + * @constructor + * @extends {ol.Object} + * @param {HTMLDivElement} target Target. + * @param {Object=} opt_values Values. + */ +ol.MapRenderer = function(target, opt_values) { + + goog.base(this); + + /** + * @private + * @type {HTMLDivElement} + */ + this.target_ = target; + + /** + * @private + * @type {Array.} + */ + this.layersListenerKeys_ = null; + + /** + * @private + * @type {Object.} + */ + this.layerRenderers_ = {}; + + goog.events.listen( + this, ol.Object.getChangedEventType(ol.MapRendererProperty.CAMERA), + this.handleCameraChanged, false, this); + + goog.events.listen( + this, ol.Object.getChangedEventType(ol.MapRendererProperty.LAYERS), + this.handleLayersChanged, false, this); + + if (goog.isDef(opt_values)) { + this.setValues(opt_values); + } + +}; +goog.inherits(ol.MapRenderer, ol.Object); + + +/** + * @param {ol.Layer} layer Layer. + * @protected + * @return {ol.LayerRenderer} layerRenderer Layer renderer. + */ +ol.MapRenderer.prototype.createLayerRenderer = goog.abstractMethod; + + +/** + * @return {ol.Camera} Camera. + */ +ol.MapRenderer.prototype.getCamera = function() { + return /** @type {ol.Camera} */ (this.get(ol.MapRendererProperty.CAMERA)); +}; + + +/** + * @return {ol.Array} Layers. + */ +ol.MapRenderer.prototype.getLayers = function() { + return /** @type {ol.Array} */ (this.get(ol.MapRendererProperty.LAYERS)); +}; + + +/** + * @return {ol.Projection} Projection. + */ +ol.MapRenderer.prototype.getProjection = function() { + return /** @type {ol.Projection} */ ( + this.get(ol.MapRendererProperty.PROJECTION)); +}; + + +/** + * @return {HTMLDivElement} Target. + */ +ol.MapRenderer.prototype.getTarget = function() { + return this.target_; +}; + + +/** + * @protected + */ +ol.MapRenderer.prototype.handleCameraChanged = function() { +}; + + +/** + * @param {ol.Layer} layer Layer. + * @protected + */ +ol.MapRenderer.prototype.handleLayerAdd = function(layer) { + var key = goog.getUid(layer); + var layerRenderer = this.createLayerRenderer(layer); + this.layerRenderers_[key] = layerRenderer; +}; + + +/** + * @param {ol.Layer} layer Layer. + * @protected + */ +ol.MapRenderer.prototype.handleLayerRemove = function(layer) { + var key = goog.getUid(layer); + goog.asserts.assert(key in this.layerRenderers_); + var layerRenderer = this.layerRenderers_[key]; + delete this.layerRenderers_[key]; + goog.dispose(layerRenderer); +}; + + +/** + * @param {ol.ArrayEvent} event Event. + * @protected + */ +ol.MapRenderer.prototype.handleLayersInsertAt = function(event) { + var layers = /** @type {ol.Array} */ (event.target); + var layer = /** @type {ol.Layer} */ layers.getAt(event.index); + this.handleLayerAdd(layer); +}; + + +/** + * @param {ol.ArrayEvent} event Event. + * @protected + */ +ol.MapRenderer.prototype.handleLayersRemoveAt = function(event) { + var layer = /** @type {ol.Layer} */ (event.prev); + this.handleLayerRemove(layer); +}; + + +/** + * @param {ol.ArrayEvent} event Event. + * @protected + */ +ol.MapRenderer.prototype.handleLayersSetAt = function(event) { + var prevLayer = /** @type {ol.Layer} */ (event.prev); + this.handleLayerRemove(prevLayer); + var layers = /** @type {ol.Array} */ (event.target); + var layer = /** @type {ol.Layer} */ layers.getAt(event.index); + this.handleLayerAdd(layer); +}; + + +/** + */ +ol.MapRenderer.prototype.handleLayersChanged = function() { + if (!goog.isNull(this.layersListenerKeys_)) { + goog.array.forEach(this.layersListenerKeys_, goog.events.unlistenByKey); + this.layersListenerKeys_ = null; + } + var layers = this.getLayers(); + if (!goog.isNull(layers)) { + this.layersListenerKeys_ = [ + goog.events.listen(layers, ol.ArrayEventType.INSERT_AT, + this.handleLayersInsertAt, false, this), + goog.events.listen(layers, ol.ArrayEventType.REMOVE_AT, + this.handleLayersRemoveAt, false, this), + goog.events.listen(layers, ol.ArrayEventType.SET_AT, + this.handleLayersSetAt, false, this) + ]; + } +}; + + +/** + * @param {ol.Camera} camera Camera. + */ +ol.MapRenderer.prototype.setCamera = function(camera) { + this.set(ol.MapRendererProperty.CAMERA, camera); +}; + + +/** + * @param {ol.Array} layers Layers. + */ +ol.MapRenderer.prototype.setLayers = function(layers) { + this.set(ol.MapRendererProperty.LAYERS, layers); +}; + + +/** + * @param {ol.Projection} projection Projection. + */ +ol.MapRenderer.prototype.setProjection = function(projection) { + this.set(ol.MapRendererProperty.PROJECTION, projection); +}; From fbefb980261517733832892b9afc03de8246a863 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Tue, 10 Jul 2012 19:41:14 +0200 Subject: [PATCH 076/562] Add initial ol.WebGLMapRenderer skeleton --- src/all.js | 1 + src/ol/webglmaprenderer.js | 44 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+) create mode 100644 src/ol/webglmaprenderer.js diff --git a/src/all.js b/src/all.js index 5cc23c1d54..18bbe65b1b 100644 --- a/src/all.js +++ b/src/all.js @@ -18,3 +18,4 @@ goog.require('ol.TileStore'); goog.require('ol.TileUrlFunction'); goog.require('ol.TileUrlFunctionType'); goog.require('ol.TransformFunction'); +goog.require('ol.WebGLMapRenderer'); diff --git a/src/ol/webglmaprenderer.js b/src/ol/webglmaprenderer.js new file mode 100644 index 0000000000..c6ee2487ee --- /dev/null +++ b/src/ol/webglmaprenderer.js @@ -0,0 +1,44 @@ +goog.provide('ol.WebGLMapRenderer'); + +goog.require('ol.Layer'); +goog.require('ol.MapRenderer'); +goog.require('ol.TileStore'); + + + +/** + * @constructor + * @extends {ol.MapRenderer} + * @param {HTMLDivElement} target Target. + * @param {Object.=} opt_values Values. + */ +ol.WebGLMapRenderer = function(target, opt_values) { + + goog.base(this, target); + + if (goog.isDef(opt_values)) { + this.setValues(opt_values); + } + +}; +goog.inherits(ol.WebGLMapRenderer, ol.MapRenderer); + + +/** + * @return {boolean} Is supported. + */ +ol.WebGLMapRenderer.isSupported = function() { + return 'WebGLRenderingContext' in goog.global; +}; + + +/** + * @inheritDoc + */ +ol.WebGLMapRenderer.prototype.createLayerRenderer = function(layer) { + var store = layer.getStore(); + if (layer instanceof ol.TileStore) { + // FIXME create WebGLTileLayerRenderer + } + return null; +}; From 995aa76d1a8aa33b2f07ba7d34ccec9a38876428 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Tue, 10 Jul 2012 19:41:31 +0200 Subject: [PATCH 077/562] Add initial ol.DOMMapRenderer skeleton --- src/all.js | 1 + src/ol/dommaprenderer.js | 46 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+) create mode 100644 src/ol/dommaprenderer.js diff --git a/src/all.js b/src/all.js index 18bbe65b1b..5e1845f88a 100644 --- a/src/all.js +++ b/src/all.js @@ -3,6 +3,7 @@ goog.provide('ol'); goog.require('ol.Array'); goog.require('ol.Bounds'); goog.require('ol.Camera'); +goog.require('ol.DOMMapRenderer'); goog.require('ol.Extent'); goog.require('ol.Layer'); goog.require('ol.LayerRenderer'); diff --git a/src/ol/dommaprenderer.js b/src/ol/dommaprenderer.js new file mode 100644 index 0000000000..4938682a85 --- /dev/null +++ b/src/ol/dommaprenderer.js @@ -0,0 +1,46 @@ +goog.provide('ol.DOMMapRenderer'); + +goog.require('ol.Layer'); +goog.require('ol.MapRenderer'); +goog.require('ol.TileStore'); + + + +/** + * @constructor + * @extends {ol.MapRenderer} + * @param {HTMLDivElement} target Target. + * @param {Object.=} opt_values Values. + */ +ol.DOMMapRenderer = function(target, opt_values) { + + goog.base(this, target); + + // FIXME write initialization code here + + if (goog.isDef(opt_values)) { + this.setValues(opt_values); + } + +}; +goog.inherits(ol.DOMMapRenderer, ol.MapRenderer); + + +/** + * @return {boolean} Is supported. + */ +ol.DOMMapRenderer.isSupported = function() { + return true; +}; + + +/** + * @inheritDoc + */ +ol.DOMMapRenderer.prototype.createLayerRenderer = function(layer) { + var store = layer.getStore(); + if (layer instanceof ol.TileStore) { + // FIXME create DOMTileLayerRenderer + } + return null; +}; From 1298cc3da3cf7e41e162589ffa7d6dae6963e44f Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Tue, 10 Jul 2012 19:54:15 +0200 Subject: [PATCH 078/562] Add ol.Map skeleton --- src/all.js | 1 + src/ol/Map.js | 562 -------------------------------------------------- src/ol/map.js | 132 ++++++++++++ 3 files changed, 133 insertions(+), 562 deletions(-) delete mode 100644 src/ol/Map.js create mode 100644 src/ol/map.js diff --git a/src/all.js b/src/all.js index 5e1845f88a..ced5b8d7cf 100644 --- a/src/all.js +++ b/src/all.js @@ -7,6 +7,7 @@ goog.require('ol.DOMMapRenderer'); goog.require('ol.Extent'); goog.require('ol.Layer'); goog.require('ol.LayerRenderer'); +goog.require('ol.Map'); goog.require('ol.MapRenderer'); goog.require('ol.Object'); goog.require('ol.Projection'); diff --git a/src/ol/Map.js b/src/ol/Map.js deleted file mode 100644 index 180e5a11c2..0000000000 --- a/src/ol/Map.js +++ /dev/null @@ -1,562 +0,0 @@ -goog.provide('ol.Map'); - -goog.require('ol.Loc'); -goog.require('ol.Bounds'); -goog.require('ol.Projection'); -goog.require('ol.event'); -goog.require('ol.event.Events'); -goog.require('ol.control.Control'); -goog.require('ol.renderer.MapRenderer'); - -goog.require('goog.dom'); -goog.require('goog.math'); -goog.require('goog.asserts'); - - -/** - * @export - * @constructor - * - * @event layeradd Fires when a layer is added to the map. The event object - * contains a 'layer' property referencing the added layer. - */ -ol.Map = function() { - - /** - * @private - * @type {ol.Projection} - */ - this.projection_ = null; - - /** - * @private - * @type {ol.Projection} - */ - this.userProjection_ = null; - - /** - * @private - * @type {ol.Loc} - */ - this.center_ = null; - - /** - * @private - * @type {number|undefined} - */ - this.zoom_ = undefined; - - /** - * @private - * @type {number} - */ - this.numZoomLevels_ = 22; - - /** - * @private - * @type {Array} - */ - this.resolutions_ = null; - - /** - * @private - * @type {Array} - */ - this.layers_ = null; - - /** - * @private - * @type {Array} - */ - this.controls_ = null; - - /** - * @private - * @type {ol.Bounds} - */ - this.maxExtent_ = null; - - /** - * @private - * @type {number|undefined} - */ - this.maxResolution_ = undefined; - - /** - * @private - * @type {Element} - */ - this.viewport_ = null; - - /** - * @private - * @type {Node} - */ - this.mapOverlay_ = null; - - /** - * @private - * @type {Node} - */ - this.staticOverlay_ = null; - - /** - * @private - * @type {ol.event.Events} - */ - this.events_ = new ol.event.Events( - this, undefined, false, ['drag', 'scroll'] - ); - - /** - * @private - * @type {Element} - */ - this.container_ = null; - -}; - -/** - @const - @type {string} -*/ -ol.Map.prototype.DEFAULT_PROJECTION = "EPSG:3857"; -/** - @const - @type {string} -*/ -ol.Map.prototype.DEFAULT_USER_PROJECTION = "EPSG:4326"; -/** - @const - @type {number} -*/ -ol.Map.ZOOM_FACTOR = 2; -/** - @const - @type {number} -*/ -ol.Map.DEFAULT_TILE_SIZE = 256; -/** - @const - @type {Array.} - */ -ol.Map.DEFAULT_CONTROLS = ["attribution", "navigation", "zoom"]; - -/** - * @return {ol.Loc} Map center in map projection. - */ -ol.Map.prototype.getCenter = function() { - return this.center_; -}; - - -/** - * @return {!ol.Projection} Projection. - */ -ol.Map.prototype.getProjection = function() { - if (goog.isNull(this.projection_)) { - this.projection_ = new ol.Projection(this.DEFAULT_PROJECTION); - } - return this.projection_; -}; - - -/** - * @return {!ol.Projection} User projection. - */ -ol.Map.prototype.getUserProjection = function() { - if (goog.isNull(this.userProjection_)) { - this.userProjection_ = new ol.Projection(this.DEFAULT_USER_PROJECTION); - } - return this.userProjection_; -}; - - -/** - * @return {number|undefined} Zoom. - */ -ol.Map.prototype.getZoom = function() { - return this.zoom_; -}; - - -/** - * @return {number} number of zoom levels. - */ -ol.Map.prototype.getNumZoomLevels = function() { - return this.numZoomLevels_; -}; - - -/** - * @return {Array|undefined} array of resolutions available for this map - */ -ol.Map.prototype.getResolutions = function() { - return this.resolutions_; -}; - - -/** - * @return {Array|undefined} array of layers available for this map - */ -ol.Map.prototype.getLayers = function() { - return this.layers_; -}; - - -/** - * @return {Array.} - */ -ol.Map.prototype.getControls = function() { - return this.controls_; -}; - - -/** - * @return {ol.Bounds} the maxExtent for the map - */ -ol.Map.prototype.getMaxExtent = function() { - if (goog.isDefAndNotNull(this.maxExtent_)) { - return this.maxExtent_; - } else { - var projection = this.getProjection(); - var extent = projection.getExtent(); - if (goog.isDefAndNotNull(extent)) { - extent = new ol.Bounds( - extent.getMinX(), extent.getMinY(), - extent.getMaxX(), extent.getMaxY()); - extent.setProjection(projection); - return extent; - } else { - throw('maxExtent must be defined either in the map or the projection'); - } - } -}; - - -/** - * @return {number} the max resolution for the map - */ -ol.Map.prototype.getMaxResolution = function() { - if (goog.isDefAndNotNull(this.maxResolution_)) { - return this.maxResolution_; - } else { - var extent = this.getMaxExtent(); - var dim = Math.max( - (extent.getMaxX()-extent.getMinX()), - (extent.getMaxY()-extent.getMinY()) - ); - return dim/ol.Map.DEFAULT_TILE_SIZE; - } -}; - - -/** - * @param {number} zoom the zoom level being requested - * @return {number} the resolution for the map at the given zoom level - */ -ol.Map.prototype.getResolutionForZoom = function(zoom) { - if (goog.isDefAndNotNull(this.resolutions_)) { - return this.resolutions_[zoom]; - } else { - var maxResolution = this.getMaxResolution(); - return maxResolution/Math.pow(ol.Map.ZOOM_FACTOR, zoom); - } -}; - - -/** - * @param {goog.math.Coordinate|{x: number, y: number}} pixel - * @return {ol.Loc} - */ -ol.Map.prototype.getLocForPixel = function(pixel) { - return goog.isDef(this.renderer_) ? - this.renderer_.getLocForPixel(pixel) : null; -}; - -/** - * @param {ol.Loc} loc - * @return {{x: number, y: number}} - */ -ol.Map.prototype.getPixelForLoc = function(loc) { - return goog.isDef(this.renderer_) ? - this.renderer_.getPixelForLoc(loc) : null; -}; - -/** - * @return {goog.math.Size} The currently rendered map size in pixels. - */ -ol.Map.prototype.getSize = function() { - //TODO consider caching this when we have something like updateSize - return goog.isDef(this.renderer_) ? this.renderer_.getSize() : null; -}; - - -/** - * @param {ol.Loc} center Center in map projection. - */ -ol.Map.prototype.setCenter = function(center) { - goog.asserts.assert(!goog.isNull(center.getProjection())); - this.center_ = center.doTransform(this.getProjection()); - this.conditionallyRender(); -}; - - -/** - * @param {ol.Loc} center - * @param {number} zoom - */ -ol.Map.prototype.setCenterAndZoom = function(center, zoom) { - goog.asserts.assert(!goog.isNull(center.getProjection())); - this.center_ = center.doTransform(this.getProjection()); - this.zoom_ = this.limitZoom(zoom); - this.conditionallyRender(); -}; - - -/** - * @param {number} zoom The zoom level to zoom to - * @param {goog.math.Coordinate|{x: number, y: number}=} opt_anchor - * Optional anchor pixel for the zoom origin. - */ -ol.Map.prototype.setZoom = function(zoom, opt_anchor) { - var currentZoom = this.zoom_, - newZoom = this.limitZoom(zoom), - newCenter; - if (newZoom === currentZoom) { - return; - } - if (goog.isDef(opt_anchor)) { - var size = this.getSize(), - anchorLoc = this.getLocForPixel(opt_anchor), - newRes = this.getResolutionForZoom(newZoom); - newCenter = anchorLoc.add( - (size.width/2 - opt_anchor.x) * newRes, - (opt_anchor.y - size.height/2) * newRes - ); - } else { - newCenter = this.center_; - } - this.setCenterAndZoom(newCenter, newZoom); -}; - - -/** - * @param {ol.Projection} projection Projection. - */ -ol.Map.prototype.setProjection = function(projection) { - this.projection_ = projection; -}; - - -/** - * @param {ol.Projection} userProjection set the user projection. - */ -ol.Map.prototype.setUserProjection = function(userProjection) { - this.userProjection_ = userProjection; -}; - - -/** - * @param {number} zoom - * @return {number} zoom clamped to the range of available zoom levels. - */ -ol.Map.prototype.limitZoom = function(zoom) { - return goog.math.clamp(zoom, 0, this.getNumZoomLevels()-1); -}; - - -/** - * @param {number} nZoom Zoom. - */ -ol.Map.prototype.setNumZoomLevels = function(nZoom) { - this.numZoomLevels_ = nZoom; -}; - -/** - * @param {Array} resolutions the map resolutions if set on the map - */ -ol.Map.prototype.setResolutions = function(resolutions) { - this.resolutions_ = resolutions; -}; - -/** - * @param {Array} layers the layers set on the map - */ -ol.Map.prototype.setLayers = function(layers) { - //TODO remove layers properly if there are layers already - this.layers_ = []; - this.addLayers(layers); -}; - -ol.Map.prototype.addLayers = function(layers) { - var layer; - for (var i=0, ii=layers.length; i|undefined} opt_controls - */ -ol.Map.prototype.setControls = function(opt_controls) { - if (!this.controls_) { - var control; - for (var i=0, ii=opt_controls.length; i} - */ -ol.Map.preferredRenderers = ["webgl", "canvas"]; - diff --git a/src/ol/map.js b/src/ol/map.js new file mode 100644 index 0000000000..5773141922 --- /dev/null +++ b/src/ol/map.js @@ -0,0 +1,132 @@ +goog.provide('ol.Map'); + +goog.require('ol.Array'); +goog.require('ol.Camera'); +goog.require('ol.DOMMapRenderer'); +goog.require('ol.MapRenderer'); +goog.require('ol.Object'); +goog.require('ol.Projection'); +goog.require('ol.WebGLMapRenderer'); + + +/** + * @define {boolean} Whether to enable the DOM renderer. + */ +ol.ENABLE_DOM_RENDERER = true; + + +/** + * @define {boolean} Whether to enable the WebGL renderer. + */ +ol.ENABLE_WEBGL_RENDERER = true; + + +/** + * @enum {string} + */ +ol.MapProperty = { + CAMERA: 'camera', + LAYERS: 'layers', + PROJECTION: 'projection' +}; + + + +/** + * @constructor + * @extends {ol.Object} + * @param {HTMLDivElement} target Target. + * @param {Object.=} opt_values Values. + */ +ol.Map = function(target, opt_values) { + + goog.base(this); + + /** + * @private + * @type {HTMLDivElement} + */ + this.target_ = target; + + /** + * @private + * @type {ol.MapRenderer} + */ + this.mapRenderer_ = null; + + if (ol.ENABLE_WEBGL_RENDERER && goog.isNull(this.mapRenderer_)) { + if (ol.WebGLMapRenderer.isSupported()) { + this.mapRenderer_ = new ol.WebGLMapRenderer(this.target_); + } + } + + if (ol.ENABLE_DOM_RENDERER && goog.isNull(this.mapRenderer_)) { + if (ol.DOMMapRenderer.isSupported()) { + this.mapRenderer_ = new ol.DOMMapRenderer(this.target_); + } + } + + goog.asserts.assert(!goog.isNull(this.mapRenderer_)); + + if (goog.isDef(opt_values)) { + this.setValues(opt_values); + } + +}; +goog.inherits(ol.Map, ol.Object); + + +/** + * @return {ol.Camera} Camera. + */ +ol.Map.prototype.getCamera = function() { + return /** @type {ol.Camera} */ (this.get(ol.MapProperty.CAMERA)); +}; + + +/** + * @return {ol.Array} Layers. + */ +ol.Map.prototype.getLayers = function() { + return /** @type {ol.Array} */ (this.get(ol.MapProperty.LAYERS)); +}; + + +/** + * @return {ol.Projection} Projection. + */ +ol.Map.prototype.getProjection = function() { + return /** @type {ol.Projection} */ (this.get(ol.MapProperty.PROJECTION)); +}; + + +/** + * @return {HTMLDivElement} Target. + */ +ol.Map.prototype.getTarget = function() { + return this.target_; +}; + + +/** + * @param {ol.Camera} camera Camera. + */ +ol.Map.prototype.setCamera = function(camera) { + this.set(ol.MapProperty.CAMERA, camera); +}; + + +/** + * @param {ol.Projection} projection Projection. + */ +ol.Map.prototype.setProjection = function(projection) { + this.set(ol.MapProperty.PROJECTION, projection); +}; + + +/** + * @param {ol.Array} layers Layers. + */ +ol.Map.prototype.setLayers = function(layers) { + this.set(ol.MapProperty.LAYERS, layers); +}; From d9077f3002e9b310bdeccd7ccf61bb32afcec709 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Tue, 10 Jul 2012 20:34:07 +0200 Subject: [PATCH 079/562] Correct type of opt_values --- src/ol/layer.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ol/layer.js b/src/ol/layer.js index 13e3bd1ed3..d437bb9c76 100644 --- a/src/ol/layer.js +++ b/src/ol/layer.js @@ -19,7 +19,7 @@ ol.LayerRendererOptionsProperty_ = { * @constructor * @extends {ol.Object} * @param {ol.Store} store Store. - * @param {Object.} opt_values Values. + * @param {Object.=} opt_values Values. */ ol.Layer = function(store, opt_values) { From b9667c208b328327a86e218d05b01f3b82a06ba7 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Tue, 10 Jul 2012 20:35:19 +0200 Subject: [PATCH 080/562] Add ol.TileUrlFunction.createFromTemplates --- src/ol/tileurlfunction.js | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/ol/tileurlfunction.js b/src/ol/tileurlfunction.js index 7021c035d2..cece788e46 100644 --- a/src/ol/tileurlfunction.js +++ b/src/ol/tileurlfunction.js @@ -34,3 +34,12 @@ ol.TileUrlFunction.createFromTileUrlFunctions = function(tileUrlFunctions) { return tileUrlFunctions[index](tileCoord); }; }; + + +/** + * @param {Array.} templates Templates. + */ +ol.TileUrlFunction.createFromTemplates = function(templates) { + return ol.TileUrlFunction.createFromTileUrlFunctions( + goog.array.map(templates, ol.TileUrlFunction.createFromTemplate)); +}; From 1485137f7b7ea2f67be8eadd22224b20d4d7baa4 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Tue, 10 Jul 2012 20:35:49 +0200 Subject: [PATCH 081/562] Add ol.TileStore.createOpenStreetMap --- src/ol/tilestore.js | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/ol/tilestore.js b/src/ol/tilestore.js index 2327c86d24..b1106d43c4 100644 --- a/src/ol/tilestore.js +++ b/src/ol/tilestore.js @@ -49,6 +49,24 @@ ol.TileStore = function(tileGrid, tileUrlFunction, opt_crossOrigin) { goog.inherits(ol.TileStore, ol.Store); +/** + * @return {ol.TileStore} Tile store. + */ +ol.TileStore.createOpenStreetMap = function() { + + var tileGrid = ol.TileGrid.createOpenStreetMap(18); + var tileUrlFunction = ol.TileUrlFunction.createFromTemplates([ + 'http://a.tile.openstreetmap.org/{z}/{x}/{y}.png', + 'http://b.tile.openstreetmap.org/{z}/{x}/{y}.png', + 'http://c.tile.openstreetmap.org/{z}/{x}/{y}.png' + ]); + var crossOrigin = ''; + + return new ol.TileStore(tileGrid, tileUrlFunction, crossOrigin); + +}; + + /** * @param {ol.TileCoord} tileCoord Tile coordinate. * @return {ol.Tile} Tile. From 62a25d72425806b6ab24acbbfe00249dd408a17c Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Tue, 10 Jul 2012 20:36:08 +0200 Subject: [PATCH 082/562] Add ol.TileLayer.createOpenStreetMap --- src/all.js | 1 + src/ol/tilelayer.js | 14 ++++++++++++++ 2 files changed, 15 insertions(+) create mode 100644 src/ol/tilelayer.js diff --git a/src/all.js b/src/all.js index ced5b8d7cf..01b6584d7d 100644 --- a/src/all.js +++ b/src/all.js @@ -16,6 +16,7 @@ goog.require('ol.Tile'); goog.require('ol.TileBounds'); goog.require('ol.TileCoord'); goog.require('ol.TileGrid'); +goog.require('ol.TileLayer'); goog.require('ol.TileStore'); goog.require('ol.TileUrlFunction'); goog.require('ol.TileUrlFunctionType'); diff --git a/src/ol/tilelayer.js b/src/ol/tilelayer.js new file mode 100644 index 0000000000..879a4f8738 --- /dev/null +++ b/src/ol/tilelayer.js @@ -0,0 +1,14 @@ +goog.provide('ol.TileLayer'); + +goog.require('ol.Layer'); +goog.require('ol.TileStore'); + + +/** + * @param {Object.=} opt_values Values. + * @return {ol.Layer} Layer. + */ +ol.TileLayer.createOpenStreetMap = function(opt_values) { + var store = ol.TileStore.createOpenStreetMap(); + return new ol.Layer(store, opt_values); +}; From a6ea18c4fcfdb9a73f1539a89a268e2c44506c94 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Tue, 10 Jul 2012 20:38:28 +0200 Subject: [PATCH 083/562] Add skeleton HTML --- skeleton.html | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 skeleton.html diff --git a/skeleton.html b/skeleton.html new file mode 100644 index 0000000000..66a711e20a --- /dev/null +++ b/skeleton.html @@ -0,0 +1,30 @@ + + + + + +
+ + + + From cf9a41f77e4d15c96226b125f5963e9f981d8ecb Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Tue, 10 Jul 2012 20:52:32 +0200 Subject: [PATCH 084/562] Create camera, layers and projection if not specified --- skeleton.html | 15 +++------------ src/ol/map.js | 15 +++++++++++++-- 2 files changed, 16 insertions(+), 14 deletions(-) diff --git a/skeleton.html b/skeleton.html index 66a711e20a..7afb8463cc 100644 --- a/skeleton.html +++ b/skeleton.html @@ -7,23 +7,14 @@ diff --git a/src/ol/map.js b/src/ol/map.js index 5773141922..560b7a3189 100644 --- a/src/ol/map.js +++ b/src/ol/map.js @@ -1,5 +1,6 @@ goog.provide('ol.Map'); +goog.require('goog.object'); goog.require('ol.Array'); goog.require('ol.Camera'); goog.require('ol.DOMMapRenderer'); @@ -68,9 +69,19 @@ ol.Map = function(target, opt_values) { goog.asserts.assert(!goog.isNull(this.mapRenderer_)); - if (goog.isDef(opt_values)) { - this.setValues(opt_values); + var values = goog.isDef(opt_values) ? goog.object.clone(opt_values) : {}; + + if (!(ol.MapProperty.CAMERA in values)) { + values[ol.MapProperty.CAMERA] = new ol.Camera(); } + if (!(ol.MapProperty.LAYERS in values)) { + values[ol.MapProperty.LAYERS] = new ol.Array(); + } + if (!(ol.MapProperty.PROJECTION in values)) { + values[ol.MapProperty.PROJECTION] = ol.Projection.createFromCode('EPSG:3857'); + } + + this.setValues(values); }; goog.inherits(ol.Map, ol.Object); From 133f6199f781d561a5c0af6ca2c0659ecb89c8e9 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Tue, 10 Jul 2012 21:01:00 +0200 Subject: [PATCH 085/562] Fix gjslint errors --- src/ol/map.js | 3 ++- src/ol/tilestore.js | 6 +++--- src/ol/tileurlfunction.js | 1 + 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/ol/map.js b/src/ol/map.js index 560b7a3189..8f4f5ca9e1 100644 --- a/src/ol/map.js +++ b/src/ol/map.js @@ -78,7 +78,8 @@ ol.Map = function(target, opt_values) { values[ol.MapProperty.LAYERS] = new ol.Array(); } if (!(ol.MapProperty.PROJECTION in values)) { - values[ol.MapProperty.PROJECTION] = ol.Projection.createFromCode('EPSG:3857'); + values[ol.MapProperty.PROJECTION] = + ol.Projection.createFromCode('EPSG:3857'); } this.setValues(values); diff --git a/src/ol/tilestore.js b/src/ol/tilestore.js index b1106d43c4..f1541e5241 100644 --- a/src/ol/tilestore.js +++ b/src/ol/tilestore.js @@ -56,9 +56,9 @@ ol.TileStore.createOpenStreetMap = function() { var tileGrid = ol.TileGrid.createOpenStreetMap(18); var tileUrlFunction = ol.TileUrlFunction.createFromTemplates([ - 'http://a.tile.openstreetmap.org/{z}/{x}/{y}.png', - 'http://b.tile.openstreetmap.org/{z}/{x}/{y}.png', - 'http://c.tile.openstreetmap.org/{z}/{x}/{y}.png' + 'http://a.tile.openstreetmap.org/{z}/{x}/{y}.png', + 'http://b.tile.openstreetmap.org/{z}/{x}/{y}.png', + 'http://c.tile.openstreetmap.org/{z}/{x}/{y}.png' ]); var crossOrigin = ''; diff --git a/src/ol/tileurlfunction.js b/src/ol/tileurlfunction.js index cece788e46..87fdcd6c72 100644 --- a/src/ol/tileurlfunction.js +++ b/src/ol/tileurlfunction.js @@ -38,6 +38,7 @@ ol.TileUrlFunction.createFromTileUrlFunctions = function(tileUrlFunctions) { /** * @param {Array.} templates Templates. + * @return {ol.TileUrlFunctionType} Tile URL function. */ ol.TileUrlFunction.createFromTemplates = function(templates) { return ol.TileUrlFunction.createFromTileUrlFunctions( From 00462bb9e4ba574706d149f5a00357f956b4ce18 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Tue, 10 Jul 2012 22:13:18 +0200 Subject: [PATCH 086/562] Move renderers into their own directories --- src/ol/{ => domrenderer}/dommaprenderer.js | 0 src/ol/{ => webglrenderer}/webglmaprenderer.js | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename src/ol/{ => domrenderer}/dommaprenderer.js (100%) rename src/ol/{ => webglrenderer}/webglmaprenderer.js (100%) diff --git a/src/ol/dommaprenderer.js b/src/ol/domrenderer/dommaprenderer.js similarity index 100% rename from src/ol/dommaprenderer.js rename to src/ol/domrenderer/dommaprenderer.js diff --git a/src/ol/webglmaprenderer.js b/src/ol/webglrenderer/webglmaprenderer.js similarity index 100% rename from src/ol/webglmaprenderer.js rename to src/ol/webglrenderer/webglmaprenderer.js From 87853a5f544e3aa7cdd6ce88c7bd5e34cb9cf453 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Wed, 11 Jul 2012 19:33:17 +0200 Subject: [PATCH 087/562] Stricter type checking on target --- src/ol/domrenderer/dommaprenderer.js | 2 +- src/ol/map.js | 2 +- src/ol/webglrenderer/webglmaprenderer.js | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/ol/domrenderer/dommaprenderer.js b/src/ol/domrenderer/dommaprenderer.js index 4938682a85..69b1b97fab 100644 --- a/src/ol/domrenderer/dommaprenderer.js +++ b/src/ol/domrenderer/dommaprenderer.js @@ -9,7 +9,7 @@ goog.require('ol.TileStore'); /** * @constructor * @extends {ol.MapRenderer} - * @param {HTMLDivElement} target Target. + * @param {!HTMLDivElement} target Target. * @param {Object.=} opt_values Values. */ ol.DOMMapRenderer = function(target, opt_values) { diff --git a/src/ol/map.js b/src/ol/map.js index 8f4f5ca9e1..4cc82ab425 100644 --- a/src/ol/map.js +++ b/src/ol/map.js @@ -36,7 +36,7 @@ ol.MapProperty = { /** * @constructor * @extends {ol.Object} - * @param {HTMLDivElement} target Target. + * @param {!HTMLDivElement} target Target. * @param {Object.=} opt_values Values. */ ol.Map = function(target, opt_values) { diff --git a/src/ol/webglrenderer/webglmaprenderer.js b/src/ol/webglrenderer/webglmaprenderer.js index c6ee2487ee..6b9aedace5 100644 --- a/src/ol/webglrenderer/webglmaprenderer.js +++ b/src/ol/webglrenderer/webglmaprenderer.js @@ -9,7 +9,7 @@ goog.require('ol.TileStore'); /** * @constructor * @extends {ol.MapRenderer} - * @param {HTMLDivElement} target Target. + * @param {!HTMLDivElement} target Target. * @param {Object.=} opt_values Values. */ ol.WebGLMapRenderer = function(target, opt_values) { From 73abd6e8b8efc030b679d7a738ae51dea9169bf4 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Wed, 11 Jul 2012 21:15:28 +0200 Subject: [PATCH 088/562] Make ol.CameraProperty public --- src/ol/camera.js | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/ol/camera.js b/src/ol/camera.js index 4844de2312..b8a69d0e1c 100644 --- a/src/ol/camera.js +++ b/src/ol/camera.js @@ -1,4 +1,5 @@ goog.provide('ol.Camera'); +goog.provide('ol.CameraProperty'); goog.require('goog.math.Coordinate'); goog.require('ol.Object'); @@ -6,9 +7,8 @@ goog.require('ol.Object'); /** * @enum {string} - * @private */ -ol.CameraProperty_ = { +ol.CameraProperty = { POSITION: 'center', RESOLUTION: 'resolution', ROTATION: 'rotation' @@ -33,7 +33,7 @@ goog.inherits(ol.Camera, ol.Object); */ ol.Camera.prototype.getPosition = function() { return /** @type {goog.math.Coordinate} */ ( - this.get(ol.CameraProperty_.POSITION)); + this.get(ol.CameraProperty.POSITION)); }; @@ -41,7 +41,7 @@ ol.Camera.prototype.getPosition = function() { * @return {number} Resolution. */ ol.Camera.prototype.getResolution = function() { - return /** @type {number} */ (this.get(ol.CameraProperty_.RESOLUTION)); + return /** @type {number} */ (this.get(ol.CameraProperty.RESOLUTION)); }; @@ -49,7 +49,7 @@ ol.Camera.prototype.getResolution = function() { * @return {number} Rotation. */ ol.Camera.prototype.getRotation = function() { - return /** @type {number} */ (this.get(ol.CameraProperty_.ROTATION)); + return /** @type {number} */ (this.get(ol.CameraProperty.ROTATION)); }; @@ -57,7 +57,7 @@ ol.Camera.prototype.getRotation = function() { * @param {goog.math.Coordinate} position Position. */ ol.Camera.prototype.setPosition = function(position) { - this.set(ol.CameraProperty_.POSITION, position.clone()); + this.set(ol.CameraProperty.POSITION, position.clone()); }; @@ -65,7 +65,7 @@ ol.Camera.prototype.setPosition = function(position) { * @param {number} resolution Resolution. */ ol.Camera.prototype.setResolution = function(resolution) { - this.set(ol.CameraProperty_.RESOLUTION, resolution); + this.set(ol.CameraProperty.RESOLUTION, resolution); }; @@ -73,5 +73,5 @@ ol.Camera.prototype.setResolution = function(resolution) { * @param {number} rotation Rotation. */ ol.Camera.prototype.setRotation = function(rotation) { - this.set(ol.CameraProperty_.ROTATION, rotation); + this.set(ol.CameraProperty.ROTATION, rotation); }; From 02113f05be7b5d4325f3306d2250346a9c902649 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Wed, 11 Jul 2012 21:18:34 +0200 Subject: [PATCH 089/562] Make ol.StoreProperty public --- src/ol/store.js | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/ol/store.js b/src/ol/store.js index 0f0d218db1..23796efe78 100644 --- a/src/ol/store.js +++ b/src/ol/store.js @@ -1,4 +1,5 @@ goog.provide('ol.Store'); +goog.provide('ol.StoreProperty'); goog.require('ol.Extent'); goog.require('ol.Object'); @@ -7,9 +8,8 @@ goog.require('ol.Projection'); /** * @enum {string} - * @private */ -ol.StoreProperty_ = { +ol.StoreProperty = { ATTRIBUTION: 'attribution', EXTENT: 'extent', PROJECTION: 'projection' @@ -36,7 +36,7 @@ goog.inherits(ol.Store, ol.Object); * @return {string|undefined} Attribution. */ ol.Store.prototype.getAttribution = function() { - return /** @type {string} */ (this.get(ol.StoreProperty_.ATTRIBUTION)); + return /** @type {string} */ (this.get(ol.StoreProperty.ATTRIBUTION)); }; @@ -44,7 +44,7 @@ ol.Store.prototype.getAttribution = function() { * @return {ol.Extent} Extent. */ ol.Store.prototype.getExtent = function() { - return /** @type {ol.Extent} */ (this.get(ol.StoreProperty_.EXTENT)); + return /** @type {ol.Extent} */ (this.get(ol.StoreProperty.EXTENT)); }; @@ -52,7 +52,7 @@ ol.Store.prototype.getExtent = function() { * @return {ol.Projection} Projection. */ ol.Store.prototype.getProjection = function() { - return /** @type {ol.Projection} */ (this.get(ol.StoreProperty_.PROJECTION)); + return /** @type {ol.Projection} */ (this.get(ol.StoreProperty.PROJECTION)); }; @@ -60,7 +60,7 @@ ol.Store.prototype.getProjection = function() { * @param {string|undefined} attribution Attribution. */ ol.Store.prototype.setAttribution = function(attribution) { - this.set(ol.StoreProperty_.ATTRIBUTION, attribution); + this.set(ol.StoreProperty.ATTRIBUTION, attribution); }; @@ -68,7 +68,7 @@ ol.Store.prototype.setAttribution = function(attribution) { * @param {ol.Extent} extent Extent. */ ol.Store.prototype.setExtent = function(extent) { - this.set(ol.StoreProperty_.EXTENT, extent); + this.set(ol.StoreProperty.EXTENT, extent); }; @@ -76,5 +76,5 @@ ol.Store.prototype.setExtent = function(extent) { * @param {ol.Projection} projection Projetion. */ ol.Store.prototype.setProjection = function(projection) { - this.set(ol.StoreProperty_.PROJECTION, projection); + this.set(ol.StoreProperty.PROJECTION, projection); }; From 9c0ce6e635166feeb1c9ff22d8c1f14a032806c3 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Wed, 11 Jul 2012 21:18:47 +0200 Subject: [PATCH 090/562] Make ol.LayerProperty public --- src/ol/layer.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/ol/layer.js b/src/ol/layer.js index d437bb9c76..d684502eea 100644 --- a/src/ol/layer.js +++ b/src/ol/layer.js @@ -1,4 +1,5 @@ goog.provide('ol.Layer'); +goog.provide('ol.LayerProperty'); goog.require('ol.Object'); goog.require('ol.Store'); @@ -6,9 +7,8 @@ goog.require('ol.Store'); /** * @enum {string} - * @private */ -ol.LayerRendererOptionsProperty_ = { +ol.LayerProperty = { OPACITY: 'opacity', VISIBLE: 'visible' }; @@ -47,7 +47,7 @@ goog.inherits(ol.Layer, ol.Object); */ ol.Layer.prototype.getOpacity = function() { return /** @type {number} */ ( - this.get(ol.LayerRendererOptionsProperty_.OPACITY)); + this.get(ol.LayerProperty.OPACITY)); }; @@ -64,7 +64,7 @@ ol.Layer.prototype.getStore = function() { */ ol.Layer.prototype.getVisible = function() { return /** @type {boolean} */ ( - this.get(ol.LayerRendererOptionsProperty_.VISIBLE)); + this.get(ol.LayerProperty.VISIBLE)); }; @@ -72,7 +72,7 @@ ol.Layer.prototype.getVisible = function() { * @param {number} opacity Opacity. */ ol.Layer.prototype.setOpacity = function(opacity) { - this.set(ol.LayerRendererOptionsProperty_.OPACITY, opacity); + this.set(ol.LayerProperty.OPACITY, opacity); }; @@ -80,5 +80,5 @@ ol.Layer.prototype.setOpacity = function(opacity) { * @param {boolean} visible Visible. */ ol.Layer.prototype.setVisible = function(visible) { - this.set(ol.LayerRendererOptionsProperty_.VISIBLE, visible); + this.set(ol.LayerProperty.VISIBLE, visible); }; From 5c40e1d570fda27608dc60c67245e33abb489be0 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Wed, 11 Jul 2012 21:20:05 +0200 Subject: [PATCH 091/562] Listen for all camera property changes --- src/ol/maprenderer.js | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/src/ol/maprenderer.js b/src/ol/maprenderer.js index 5340c1ac8e..4231062259 100644 --- a/src/ol/maprenderer.js +++ b/src/ol/maprenderer.js @@ -2,8 +2,10 @@ goog.provide('ol.MapRenderer'); goog.require('goog.array'); goog.require('goog.events'); +goog.require('goog.object'); goog.require('ol.Array'); goog.require('ol.Camera'); +goog.require('ol.CameraProperty'); goog.require('ol.LayerRenderer'); goog.require('ol.Object'); goog.require('ol.Projection'); @@ -36,6 +38,12 @@ ol.MapRenderer = function(target, opt_values) { */ this.target_ = target; + /** + * @private + * @type {Array.} + */ + this.cameraListenerKeys_ = null; + /** * @private * @type {Array.} @@ -109,6 +117,26 @@ ol.MapRenderer.prototype.getTarget = function() { * @protected */ ol.MapRenderer.prototype.handleCameraChanged = function() { + if (!goog.isNull(this.cameraListenerKeys_)) { + goog.array.forEach(this.cameraListenerKeys_, goog.events.unlistenByKey); + this.cameraListenerKeys_ = null; + } + var camera = this.getCamera(); + if (!goog.isNull(camera)) { + this.cameraListenerKeys_ = goog.array.map( + goog.object.getValues(ol.CameraProperty), + function(cameraProperty) { + return goog.events.listen(camera, cameraProperty, + this.handleCameraPropertyChanged, false, this); + }); + } +}; + + +/** + * @protected + */ +ol.MapRenderer.prototype.handleCameraPropertyChanged = function() { }; From 7a4e3aa323952c7bd6673cab33bd853a164db127 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Wed, 11 Jul 2012 21:21:38 +0200 Subject: [PATCH 092/562] Listen for target resizes in ol.MapRenderer --- src/ol/maprenderer.js | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/src/ol/maprenderer.js b/src/ol/maprenderer.js index 4231062259..8c3a745f42 100644 --- a/src/ol/maprenderer.js +++ b/src/ol/maprenderer.js @@ -2,6 +2,8 @@ goog.provide('ol.MapRenderer'); goog.require('goog.array'); goog.require('goog.events'); +goog.require('goog.events.Event'); +goog.require('goog.events.EventType'); goog.require('goog.object'); goog.require('ol.Array'); goog.require('ol.Camera'); @@ -38,6 +40,12 @@ ol.MapRenderer = function(target, opt_values) { */ this.target_ = target; + /** + * @private + * @type {goog.math.Size} + */ + this.size_ = new goog.math.Size(target.clientWidth, target.clientHeight); + /** * @private * @type {Array.} @@ -56,6 +64,9 @@ ol.MapRenderer = function(target, opt_values) { */ this.layerRenderers_ = {}; + goog.events.listen(target, goog.events.EventType.RESIZE, + this.handleTargetResize, false, this); + goog.events.listen( this, ol.Object.getChangedEventType(ol.MapRendererProperty.CAMERA), this.handleCameraChanged, false, this); @@ -105,6 +116,15 @@ ol.MapRenderer.prototype.getProjection = function() { }; +/** + * @protected + * @return {goog.math.Size} Size. + */ +ol.MapRenderer.prototype.getSize = function() { + return this.size_; +}; + + /** * @return {HTMLDivElement} Target. */ @@ -219,6 +239,17 @@ ol.MapRenderer.prototype.handleLayersChanged = function() { }; +/** + * @param {goog.events.Event} event Event. + * @protected + */ +ol.MapRenderer.prototype.handleTargetResize = function(event) { + goog.asserts.assert(event.target == this.target_); + this.size_.width = this.target_.clientWidth; + this.size_.height = this.target_.clientHeight; +}; + + /** * @param {ol.Camera} camera Camera. */ From e4f729f1b97fb4f58bb2d919a562d34671b140d8 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Wed, 11 Jul 2012 21:57:01 +0200 Subject: [PATCH 093/562] Add ol.webglrender.IGLObject --- src/ol/webglrenderer/iglobject.js | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 src/ol/webglrenderer/iglobject.js diff --git a/src/ol/webglrenderer/iglobject.js b/src/ol/webglrenderer/iglobject.js new file mode 100644 index 0000000000..ea5a88f798 --- /dev/null +++ b/src/ol/webglrenderer/iglobject.js @@ -0,0 +1,20 @@ +goog.provide('ol.webglrenderer.IGLObject'); + + + +/** + * @interface + */ +ol.webglrenderer.IGLObject = function() {}; + + +/** + * @return {WebGLRenderingContext} GL. + */ +ol.webglrenderer.IGLObject.prototype.getGL = function() {}; + + +/** + * @param {WebGLRenderingContext} gl GL. + */ +ol.webglrenderer.IGLObject.prototype.setGL = function(gl) {}; From 7ae4fc3eb5e4a6c1ab4e3efe14ea5ce7ff04d6a1 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Wed, 11 Jul 2012 21:58:18 +0200 Subject: [PATCH 094/562] Add initial ol.WebLGLMapRenderer experiments (size not working) --- src/ol/webglrenderer/webglmaprenderer.js | 129 +++++++++++++++++++++++ 1 file changed, 129 insertions(+) diff --git a/src/ol/webglrenderer/webglmaprenderer.js b/src/ol/webglrenderer/webglmaprenderer.js index 6b9aedace5..b5afa4db23 100644 --- a/src/ol/webglrenderer/webglmaprenderer.js +++ b/src/ol/webglrenderer/webglmaprenderer.js @@ -1,14 +1,19 @@ goog.provide('ol.WebGLMapRenderer'); +goog.require('goog.dom'); +goog.require('goog.style'); +goog.require('goog.webgl'); goog.require('ol.Layer'); goog.require('ol.MapRenderer'); goog.require('ol.TileStore'); +goog.require('ol.webglrenderer.IGLObject'); /** * @constructor * @extends {ol.MapRenderer} + * @implements {ol.webglrenderer.IGLObject} * @param {!HTMLDivElement} target Target. * @param {Object.=} opt_values Values. */ @@ -16,6 +21,30 @@ ol.WebGLMapRenderer = function(target, opt_values) { goog.base(this, target); + /** + * @private + * @type {Element} + */ + this.canvas_ = goog.dom.createElement('canvas'); + target.appendChild(this.canvas_); + + /** + * @private + * @type {WebGLRenderingContext} + */ + this.gl_ = null; + + /** @type {WebGLRenderingContext} */ + var gl = this.canvas_.getContext('experimental-webgl', { + alpha: false, + depth: false, + antialias: true, + stencil: false, + preserveDrawingBuffer: false + }); + goog.asserts.assert(!goog.isNull(gl)); + this.setGL(gl); + if (goog.isDef(opt_values)) { this.setValues(opt_values); } @@ -42,3 +71,103 @@ ol.WebGLMapRenderer.prototype.createLayerRenderer = function(layer) { } return null; }; + + +/** + * @inheritDoc + */ +ol.WebGLMapRenderer.prototype.disposeInternal = function() { + this.setGL(null); + goog.base(this, 'disposeInternal'); +}; + + +/** + * @inheritDoc + */ +ol.WebGLMapRenderer.prototype.getGL = function() { + var gl = this.gl_; + goog.asserts.assert(!goog.isNull(gl)); + return gl; +}; + + +/** + * @inheritDoc + */ +ol.WebGLMapRenderer.prototype.handleCameraPropertyChanged = function() { + this.redraw_(); +}; + + +/** + * @inheritDoc + */ +ol.WebGLMapRenderer.prototype.handleLayerAdd = function(layer) { + goog.base(this, 'handleLayerAdd', layer); + this.redraw_(); +}; + + +/** + * @inheritDoc + */ +ol.WebGLMapRenderer.prototype.handleLayerRemove = function(layer) { + goog.base(this, 'handleLayerRemove', layer); + this.redraw_(); +}; + + +/** + * @inheritDoc + */ +ol.WebGLMapRenderer.prototype.handleTargetResize = function(event) { + goog.base(this, 'handleTargetResize', event); + this.updateSize_(); +}; + + +/** + * @private + */ +ol.WebGLMapRenderer.prototype.redraw_ = function() { + + var gl = this.getGL(); + + gl.clear(goog.webgl.COLOR_BUFFER_BIT); + +}; + + +/** + * @inheritDoc + */ +ol.WebGLMapRenderer.prototype.setGL = function(gl) { + if (!goog.isNull(this.gl_)) { + this.gl_ = null; + } + this.gl_ = gl; + if (!goog.isNull(gl)) { + gl.clearColor(1, 0, 0, 1); + gl.disable(goog.webgl.CULL_FACE); + gl.disable(goog.webgl.DEPTH_TEST); + gl.disable(goog.webgl.SCISSOR_TEST); + this.updateSize_(); + this.redraw_(); + } +}; + + +/** + * @private + */ +ol.WebGLMapRenderer.prototype.updateSize_ = function() { + var size = this.getSize(); + this.canvas_.width = size.width; + this.canvas_.height = size.height; + var gl = this.gl_; + if (!goog.isNull(gl)) { + gl.viewport(0, 0, size.width, size.height); + this.redraw_(); + } +}; From 964bbf41bd309892f0294087f7d1009d7d4f8283 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Thu, 12 Jul 2012 19:23:06 +0200 Subject: [PATCH 095/562] Add scope to ol.Array.forEach --- src/ol/array.js | 8 +++++--- src/ol/array_test.js | 21 +++++++++++++++++++++ 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/src/ol/array.js b/src/ol/array.js index b397baa073..a5b7dbbded 100644 --- a/src/ol/array.js +++ b/src/ol/array.js @@ -104,10 +104,12 @@ ol.Array.prototype.clear = function() { /** - * @param {function(*, number)} callback Callback. + * @param {function(this: T, *, number)} f Function. + * @param {T=} opt_obj The object to be used for the value of 'this' within f. + * @template T */ -ol.Array.prototype.forEach = function(callback) { - goog.array.forEach(this.array_, callback); +ol.Array.prototype.forEach = function(f, opt_obj) { + goog.array.forEach(this.array_, f, opt_obj); }; diff --git a/src/ol/array_test.js b/src/ol/array_test.js index 1d77583d5d..580c908301 100644 --- a/src/ol/array_test.js +++ b/src/ol/array_test.js @@ -192,3 +192,24 @@ function testLengthChangeSetAt() { array.setAt(1, 1); assertUndefined(lengthChangedCalled); } + + +function testForEach() { + var array = ol.Array.create([1, 2, 4]); + var sum = 0; + array.forEach(function(elem) { + sum += elem; + }); + assertEquals(7, sum); +} + + +function testForEachScope() { + var array = ol.Array.create([0]); + var that; + var uniqueObj = {}; + array.forEach(function(elem) { + that = this; + }, uniqueObj); + assertTrue(that === uniqueObj); +} From d2caf1543fb6e4b4404967f2432080ed2fe9af77 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Fri, 13 Jul 2012 19:09:41 +0200 Subject: [PATCH 096/562] Add CSS to ensure map fills body --- skeleton.html | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/skeleton.html b/skeleton.html index 7afb8463cc..23b57e01c7 100644 --- a/skeleton.html +++ b/skeleton.html @@ -1,6 +1,14 @@ +
From 8ac2cb7103f9609fd9253878b701a6975866ad12 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Fri, 13 Jul 2012 19:11:01 +0200 Subject: [PATCH 097/562] Provide default layer change handlers --- src/ol/layerrenderer.js | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/src/ol/layerrenderer.js b/src/ol/layerrenderer.js index 6b53ce8d93..d674f30626 100644 --- a/src/ol/layerrenderer.js +++ b/src/ol/layerrenderer.js @@ -1,6 +1,8 @@ goog.provide('ol.LayerRenderer'); +goog.require('goog.events'); goog.require('ol.Layer'); +goog.require('ol.LayerProperty'); goog.require('ol.Object'); @@ -20,6 +22,14 @@ ol.LayerRenderer = function(layer) { */ this.layer_ = layer; + goog.events.listen(this.layer_, + ol.Object.getChangedEventType(ol.LayerProperty.OPACITY), + this.handleLayerOpacityChange, false, this); + + goog.events.listen(this.layer_, + ol.Object.getChangedEventType(ol.LayerProperty.VISIBLE), + this.handleLayerVisibleChange, false, this); + }; goog.inherits(ol.LayerRenderer, ol.Object); @@ -30,3 +40,15 @@ goog.inherits(ol.LayerRenderer, ol.Object); ol.LayerRenderer.prototype.getLayer = function() { return this.layer_; }; + + +/** + * @protected + */ +ol.LayerRenderer.prototype.handleLayerOpacityChange = goog.nullFunction; + + +/** + * @protected + */ +ol.LayerRenderer.prototype.handleLayerVisibleChange = goog.nullFunction; From 152c0e9f784949d660a23eb9730dd59166a2353b Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Fri, 13 Jul 2012 19:11:47 +0200 Subject: [PATCH 098/562] Export ol.MapRendererProperty --- src/ol/maprenderer.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/ol/maprenderer.js b/src/ol/maprenderer.js index 8c3a745f42..e518d171dc 100644 --- a/src/ol/maprenderer.js +++ b/src/ol/maprenderer.js @@ -1,4 +1,5 @@ goog.provide('ol.MapRenderer'); +goog.provide('ol.MapRendererProperty'); goog.require('goog.array'); goog.require('goog.events'); From 773590345ab583d91f93d3efaf5331659411f426 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Fri, 13 Jul 2012 19:12:14 +0200 Subject: [PATCH 099/562] Bind Map to MapRenderer properties --- src/ol/map.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/ol/map.js b/src/ol/map.js index 4cc82ab425..baa92840af 100644 --- a/src/ol/map.js +++ b/src/ol/map.js @@ -5,6 +5,7 @@ goog.require('ol.Array'); goog.require('ol.Camera'); goog.require('ol.DOMMapRenderer'); goog.require('ol.MapRenderer'); +goog.require('ol.MapRendererProperty'); goog.require('ol.Object'); goog.require('ol.Projection'); goog.require('ol.WebGLMapRenderer'); @@ -69,6 +70,11 @@ ol.Map = function(target, opt_values) { goog.asserts.assert(!goog.isNull(this.mapRenderer_)); + this.mapRenderer_.bindTo( + ol.MapRendererProperty.CAMERA, this, ol.MapProperty.CAMERA); + this.mapRenderer_.bindTo( + ol.MapRendererProperty.LAYERS, this, ol.MapProperty.LAYERS); + var values = goog.isDef(opt_values) ? goog.object.clone(opt_values) : {}; if (!(ol.MapProperty.CAMERA in values)) { From bb1e81b72a3437fe1d2b033ec9d18971c07db450 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Fri, 13 Jul 2012 19:12:40 +0200 Subject: [PATCH 100/562] Add ol.MapRenderer.forEachLayerRenderer --- src/ol/maprenderer.js | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/ol/maprenderer.js b/src/ol/maprenderer.js index e518d171dc..7b565f994b 100644 --- a/src/ol/maprenderer.js +++ b/src/ol/maprenderer.js @@ -92,6 +92,24 @@ goog.inherits(ol.MapRenderer, ol.Object); ol.MapRenderer.prototype.createLayerRenderer = goog.abstractMethod; +/** + * @protected + * @param {function(this: T, ol.LayerRenderer)} f Function. + * @param {T=} opt_obj The object to be used for the value of 'this' within f. + * @template T + */ +ol.MapRenderer.prototype.forEachLayerRenderer = function(f, opt_obj) { + var layers = this.getLayers(); + if (goog.isDefAndNotNull(layers)) { + layers.forEach(function(layer) { + var key = goog.getUid(layer); + var layerRenderer = this.layerRenderers_[key]; + f.call(opt_obj, layerRenderer); + }, this); + } +}; + + /** * @return {ol.Camera} Camera. */ From 8279e79818e87ad5ceaaf4371f716f3f3e7e98a4 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Fri, 13 Jul 2012 19:13:17 +0200 Subject: [PATCH 101/562] Handle undefined properties --- src/ol/maprenderer.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/ol/maprenderer.js b/src/ol/maprenderer.js index 7b565f994b..a1e1b564e8 100644 --- a/src/ol/maprenderer.js +++ b/src/ol/maprenderer.js @@ -161,13 +161,14 @@ ol.MapRenderer.prototype.handleCameraChanged = function() { this.cameraListenerKeys_ = null; } var camera = this.getCamera(); - if (!goog.isNull(camera)) { + if (goog.isDefAndNotNull(camera)) { this.cameraListenerKeys_ = goog.array.map( goog.object.getValues(ol.CameraProperty), function(cameraProperty) { return goog.events.listen(camera, cameraProperty, this.handleCameraPropertyChanged, false, this); - }); + }, + this); } }; @@ -245,7 +246,7 @@ ol.MapRenderer.prototype.handleLayersChanged = function() { this.layersListenerKeys_ = null; } var layers = this.getLayers(); - if (!goog.isNull(layers)) { + if (goog.isDefAndNotNull(layers)) { this.layersListenerKeys_ = [ goog.events.listen(layers, ol.ArrayEventType.INSERT_AT, this.handleLayersInsertAt, false, this), From f5790e14f2733067850b8ad4947385b1d6748f64 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Fri, 13 Jul 2012 19:13:51 +0200 Subject: [PATCH 102/562] Use goog.nullFunction --- src/ol/maprenderer.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/ol/maprenderer.js b/src/ol/maprenderer.js index a1e1b564e8..761b9d9caf 100644 --- a/src/ol/maprenderer.js +++ b/src/ol/maprenderer.js @@ -176,8 +176,7 @@ ol.MapRenderer.prototype.handleCameraChanged = function() { /** * @protected */ -ol.MapRenderer.prototype.handleCameraPropertyChanged = function() { -}; +ol.MapRenderer.prototype.handleCameraPropertyChanged = goog.nullFunction; /** From a35cd158be7858a8848332c3f31083c009b472b6 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Fri, 13 Jul 2012 19:14:34 +0200 Subject: [PATCH 103/562] Snapshot WebGLMapRenderer --- src/ol/webglrenderer/webglmaprenderer.js | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/src/ol/webglrenderer/webglmaprenderer.js b/src/ol/webglrenderer/webglmaprenderer.js index b5afa4db23..b591ddf67b 100644 --- a/src/ol/webglrenderer/webglmaprenderer.js +++ b/src/ol/webglrenderer/webglmaprenderer.js @@ -1,12 +1,14 @@ goog.provide('ol.WebGLMapRenderer'); goog.require('goog.dom'); +goog.require('goog.dom.TagName'); goog.require('goog.style'); goog.require('goog.webgl'); goog.require('ol.Layer'); goog.require('ol.MapRenderer'); goog.require('ol.TileStore'); goog.require('ol.webglrenderer.IGLObject'); +goog.require('ol.webglrenderer.TileLayerRenderer'); @@ -25,7 +27,10 @@ ol.WebGLMapRenderer = function(target, opt_values) { * @private * @type {Element} */ - this.canvas_ = goog.dom.createElement('canvas'); + this.canvas_ = goog.dom.createElement(goog.dom.TagName.CANVAS); + this.canvas_.height = target.clientHeight; + this.canvas_.width = target.clientWidth; + this.canvas_.style.overflow = 'hidden'; target.appendChild(this.canvas_); /** @@ -37,10 +42,10 @@ ol.WebGLMapRenderer = function(target, opt_values) { /** @type {WebGLRenderingContext} */ var gl = this.canvas_.getContext('experimental-webgl', { alpha: false, - depth: false, antialias: true, - stencil: false, - preserveDrawingBuffer: false + depth: false, + preserveDrawingBuffer: false, + stencil: false }); goog.asserts.assert(!goog.isNull(gl)); this.setGL(gl); @@ -66,10 +71,12 @@ ol.WebGLMapRenderer.isSupported = function() { */ ol.WebGLMapRenderer.prototype.createLayerRenderer = function(layer) { var store = layer.getStore(); - if (layer instanceof ol.TileStore) { - // FIXME create WebGLTileLayerRenderer + if (store instanceof ol.TileStore) { + return new ol.webglrenderer.TileLayerRenderer(layer, this.getGL()); + } else { + goog.asserts.assert(false); + return null; } - return null; }; @@ -152,6 +159,9 @@ ol.WebGLMapRenderer.prototype.setGL = function(gl) { gl.disable(goog.webgl.CULL_FACE); gl.disable(goog.webgl.DEPTH_TEST); gl.disable(goog.webgl.SCISSOR_TEST); + this.forEachLayerRenderer(function(layerRenderer) { + layerRenderer.setGL(gl); + }); this.updateSize_(); this.redraw_(); } From 19ea6a0cba6404475124430c3918974222c227d3 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Fri, 13 Jul 2012 19:27:48 +0200 Subject: [PATCH 104/562] Import WebGL code from WebGL Maps --- src/ol/webglrenderer/arraybuffer.js | 47 +++++++++ src/ol/webglrenderer/framebuffer.js | 118 ++++++++++++++++++++++ src/ol/webglrenderer/globject.js | 50 +++++++++ src/ol/webglrenderer/program.js | 79 +++++++++++++++ src/ol/webglrenderer/programcache.js | 64 ++++++++++++ src/ol/webglrenderer/shader.js | 117 +++++++++++++++++++++ src/ol/webglrenderer/shader/fragment.js | 27 +++++ src/ol/webglrenderer/shader/vertex.js | 27 +++++ src/ol/webglrenderer/staticglobject.js | 49 +++++++++ src/ol/webglrenderer/texture.js | 64 ++++++++++++ src/ol/webglrenderer/tilelayerrenderer.js | 71 +++++++++++++ src/ol/webglrenderer/uniform.js | 101 ++++++++++++++++++ src/ol/webglrenderer/vertexattrib.js | 78 ++++++++++++++ 13 files changed, 892 insertions(+) create mode 100644 src/ol/webglrenderer/arraybuffer.js create mode 100644 src/ol/webglrenderer/framebuffer.js create mode 100644 src/ol/webglrenderer/globject.js create mode 100644 src/ol/webglrenderer/program.js create mode 100644 src/ol/webglrenderer/programcache.js create mode 100644 src/ol/webglrenderer/shader.js create mode 100644 src/ol/webglrenderer/shader/fragment.js create mode 100644 src/ol/webglrenderer/shader/vertex.js create mode 100644 src/ol/webglrenderer/staticglobject.js create mode 100644 src/ol/webglrenderer/texture.js create mode 100644 src/ol/webglrenderer/tilelayerrenderer.js create mode 100644 src/ol/webglrenderer/uniform.js create mode 100644 src/ol/webglrenderer/vertexattrib.js diff --git a/src/ol/webglrenderer/arraybuffer.js b/src/ol/webglrenderer/arraybuffer.js new file mode 100644 index 0000000000..9e18c5b5ca --- /dev/null +++ b/src/ol/webglrenderer/arraybuffer.js @@ -0,0 +1,47 @@ +goog.provide('ol.webglrenderer.ArrayBuffer'); + +goog.require('goog.webgl'); +goog.require('ol.webglrenderer.StaticGLObject'); + + + +/** + * @constructor + * @extends {ol.webglrenderer.StaticGLObject} + * @param {WebGLRenderingContext} gl GL. + * @param {ArrayBuffer|ArrayBufferView|null|number} data Data. + * @param {number} usage Usage. + */ +ol.webglrenderer.ArrayBuffer = function(gl, data, usage) { + + goog.base(this, gl); + + /** + * @private + * @type {WebGLBuffer} + */ + this.buffer_ = gl.createBuffer(); + gl.bindBuffer(goog.webgl.ARRAY_BUFFER, this.buffer_); + gl.bufferData(goog.webgl.ARRAY_BUFFER, data, usage); + +}; +goog.inherits(ol.webglrenderer.ArrayBuffer, ol.webglrenderer.StaticGLObject); + + +/** + */ +ol.webglrenderer.ArrayBuffer.prototype.bind = function() { + var gl = this.getGL(); + gl.bindBuffer(goog.webgl.ARRAY_BUFFER, this.buffer_); +}; + + +/** + * @inheritDoc + */ +ol.webglrenderer.ArrayBuffer.prototype.disposeInternal = function() { + var gl = this.getGL(); + gl.deleteBuffer(this.buffer_); + this.buffer_ = null; + goog.base(this, 'disposeInternal'); +}; diff --git a/src/ol/webglrenderer/framebuffer.js b/src/ol/webglrenderer/framebuffer.js new file mode 100644 index 0000000000..c8ace09462 --- /dev/null +++ b/src/ol/webglrenderer/framebuffer.js @@ -0,0 +1,118 @@ +goog.provide('ol.webglrenderer.Framebuffer'); + +goog.require('goog.asserts'); +goog.require('goog.webgl'); +goog.require('ol.webglrenderer.GLObject'); + + + +/** + * @constructor + * @extends {ol.webglrenderer.GLObject} + * @param {number} size Size. + */ +ol.webglrenderer.Framebuffer = function(size) { + + goog.base(this); + + /** + * @private + * @type {WebGLFramebuffer} + */ + this.framebuffer_ = null; + + /** + * @private + * @type {WebGLTexture} + */ + this.texture_ = null; + + /** + * @private + * @type {number} + */ + this.size_ = size; + +}; +goog.inherits(ol.webglrenderer.Framebuffer, ol.webglrenderer.GLObject); + + +/** + */ +ol.webglrenderer.Framebuffer.prototype.bind = function() { + var gl = this.getGL(); + var framebuffer = this.get(); + gl.bindFramebuffer(goog.webgl.FRAMEBUFFER, framebuffer); +}; + + +/** + * @param {number} size Size. + * @private + * @return {WebGLTexture} Texture. + */ +ol.webglrenderer.Framebuffer.prototype.createTexture_ = function(size) { + var gl = this.getGL(); + var texture = gl.createTexture(); + gl.bindTexture(goog.webgl.TEXTURE_2D, this.texture_); + gl.texImage2D(goog.webgl.TEXTURE_2D, 0, goog.webgl.RGBA, size, size, 0, + goog.webgl.RGBA, goog.webgl.UNSIGNED_BYTE, null); + gl.texParameteri( + goog.webgl.TEXTURE_2D, goog.webgl.TEXTURE_MAG_FILTER, goog.webgl.LINEAR); + gl.texParameteri( + goog.webgl.TEXTURE_2D, goog.webgl.TEXTURE_MIN_FILTER, goog.webgl.LINEAR); + return texture; +}; + + +/** + * @return {WebGLFramebuffer} Framebuffer. + */ +ol.webglrenderer.Framebuffer.prototype.get = function() { + goog.asserts.assert(!goog.isNull(this.framebuffer_)); + return this.framebuffer_; +}; + + +/** + * @param {WebGLRenderingContext} gl GL. + */ +ol.webglrenderer.Framebuffer.prototype.setGL = function(gl) { + if (!goog.isNull(this.gl)) { + if (!goog.isNull(this.framebuffer_)) { + this.gl.deleteFramebuffer(this.framebuffer_); + this.framebuffer_ = null; + } + if (!goog.isNull(this.texture_)) { + this.gl.deleteTexture(this.texture_); + this.texture_ = null; + } + } + goog.base(this, 'setGL', gl); + if (!goog.isNull(gl)) { + this.texture_ = this.createTexture_(this.size_); + this.framebuffer_ = gl.createFramebuffer(); + gl.bindFramebuffer(goog.webgl.FRAMEBUFFER, this.framebuffer_); + gl.framebufferTexture2D(goog.webgl.FRAMEBUFFER, + goog.webgl.COLOR_ATTACHMENT0, goog.webgl.TEXTURE_2D, this.texture_, 0); + } +}; + + +/** + * @param {number} size Size. + */ +ol.webglrenderer.Framebuffer.prototype.setSize = function(size) { + var gl = this.getGL(); + goog.asserts.assert(!(size & (size - 1))); + if (this.size_ != size && !goog.isNull(gl)) { + var texture = this.createTexture_(size); + goog.asserts.assert(!goog.isNull(this.framebuffer_)); + gl.bindFramebuffer(goog.webgl.FRAMEBUFFER, this.framebuffer_); + gl.framebufferTexture2D(goog.webgl.FRAMEBUFFER, + goog.webgl.COLOR_ATTACHMENT0, goog.webgl.TEXTURE_2D, texture, 0); + goog.asserts.assert(!goog.isNull(this.texture_)); + gl.deleteTexture(this.texture_); + this.texture = texture; + } +}; diff --git a/src/ol/webglrenderer/globject.js b/src/ol/webglrenderer/globject.js new file mode 100644 index 0000000000..785a64d93a --- /dev/null +++ b/src/ol/webglrenderer/globject.js @@ -0,0 +1,50 @@ +goog.provide('ol.webglrenderer.GLObject'); + +goog.require('goog.Disposable'); +goog.require('ol.webglrenderer.IGLObject'); + + + +/** + * @constructor + * @extends {goog.Disposable} + * @implements {ol.webglrenderer.IGLObject} + */ +ol.webglrenderer.GLObject = function() { + + goog.base(this); + + /** + * @private + * @type {WebGLRenderingContext} + */ + this.gl_ = null; + +}; +goog.inherits(ol.webglrenderer.GLObject, goog.Disposable); + + +/** + * @inheritDoc + */ +ol.webglrenderer.GLObject.prototype.disposeInternal = function() { + this.setGL(null); + goog.base(this, 'disposeInternal'); +}; + + +/** + * @inheritDoc + */ +ol.webglrenderer.GLObject.prototype.getGL = function() { + goog.asserts.assert(!goog.isNull(this.gl_)); + return this.gl_; +}; + + +/** + * @inheritDoc + */ +ol.webglrenderer.GLObject.prototype.setGL = function(gl) { + this.gl_ = gl; +}; diff --git a/src/ol/webglrenderer/program.js b/src/ol/webglrenderer/program.js new file mode 100644 index 0000000000..4b625dcae2 --- /dev/null +++ b/src/ol/webglrenderer/program.js @@ -0,0 +1,79 @@ +goog.provide('ol.webglrenderer.Program'); + +goog.require('goog.asserts'); +goog.require('goog.webgl'); +goog.require('ol.webglrenderer.GLObject'); +goog.require('ol.webglrenderer.VertexAttrib'); +goog.require('ol.webglrenderer.shader.Fragment'); +goog.require('ol.webglrenderer.shader.Vertex'); + + + +/** + * @constructor + * @extends {ol.webglrenderer.GLObject} + * @param {ol.webglrenderer.shader.Fragment} fragmentShader Fragment shader. + * @param {ol.webglrenderer.shader.Vertex} vertexShader Vertex shader. + */ +ol.webglrenderer.Program = function(fragmentShader, vertexShader) { + + goog.base(this); + + /** + * @private + * @type {ol.webglrenderer.shader.Fragment} + */ + this.fragmentShader_ = fragmentShader; + + /** + * @private + * @type {ol.webglrenderer.shader.Vertex} + */ + this.vertexShader_ = vertexShader; + + /** + * @private + * @type {WebGLProgram} + */ + this.program_ = null; + +}; +goog.inherits(ol.webglrenderer.Program, ol.webglrenderer.GLObject); + + +/** + * @inheritDoc + */ +ol.webglrenderer.Program.prototype.setGL = function(gl) { + if (!goog.isNull(this.gl)) { + if (!goog.isNull(this.program_)) { + this.gl.deleteProgram(this.program_); + this.program_ = null; + } + this.fragmentShader_.setGL(null); + this.vertexShader_.setGL(null); + } + goog.base(this, 'setGL', gl); + if (!goog.isNull(gl)) { + this.fragmentShader_.setGL(gl); + this.vertexShader_.setGL(gl); + var program = gl.createProgram(); + gl.attachShader(program, this.fragmentShader_.get()); + gl.attachShader(program, this.vertexShader_.get()); + gl.linkProgram(program); + if (!gl.getProgramParameter(program, goog.webgl.LINK_STATUS)) { + window.console.log(gl.getProgramInfoLog(program)); + goog.asserts.assert( + gl.getProgramParameter(program, goog.webgl.LINK_STATUS)); + } + this.program_ = program; + } +}; + + +/** + */ +ol.webglrenderer.Program.prototype.use = function() { + var gl = this.getGL(); + gl.useProgram(this.program_); +}; diff --git a/src/ol/webglrenderer/programcache.js b/src/ol/webglrenderer/programcache.js new file mode 100644 index 0000000000..0cd9ef9ded --- /dev/null +++ b/src/ol/webglrenderer/programcache.js @@ -0,0 +1,64 @@ +goog.provide('ol.webglrenderer.ProgramCache'); + +goog.require('goog.dispose'); +goog.require('goog.object'); +goog.require('ol.webglrenderer.GLObject'); +goog.require('ol.webglrenderer.Program'); +goog.require('ol.webglrenderer.shader.Fragment'); +goog.require('ol.webglrenderer.shader.Vertex'); + + + +/** + * @constructor + * @extends {ol.webglrenderer.GLObject} + */ +ol.webglrenderer.ProgramCache = function() { + + goog.base(this); + + /** + * @private + * @type {Object.>} + */ + this.programss_ = {}; + +}; +goog.inherits(ol.webglrenderer.ProgramCache, ol.webglrenderer.GLObject); + + +/** + * @param {ol.webglrenderer.shader.Fragment} fragmentShader Fragment shader. + * @param {ol.webglrenderer.shader.Vertex} vertexShader Vertex shader. + * @return {ol.webglrenderer.Program} Program. + */ +ol.webglrenderer.ProgramCache.prototype.get = + function(fragmentShader, vertexShader) { + var program, programs; + var fragmentShaderKey = goog.getUid(fragmentShader); + if (fragmentShaderKey in this.programss_) { + programs = this.programss_[fragmentShaderKey]; + } else { + programs = {}; + this.programss_[fragmentShaderKey] = programs; + } + var vertexShaderKey = goog.getUid(vertexShader); + if (vertexShaderKey in programs) { + program = programs[vertexShaderKey]; + } else { + program = new ol.webglrenderer.Program(fragmentShader, vertexShader); + programs[vertexShaderKey] = program; + } + return program; +}; + + +/** + * @inheritDoc + */ +ol.webglrenderer.ProgramCache.prototype.setGL = function(gl) { + goog.object.forEach(this.programss_, function(programs) { + goog.disposeAll(goog.object.getValues(programs)); + }); + goog.base(this, 'setGL', gl); +}; diff --git a/src/ol/webglrenderer/shader.js b/src/ol/webglrenderer/shader.js new file mode 100644 index 0000000000..d41c739339 --- /dev/null +++ b/src/ol/webglrenderer/shader.js @@ -0,0 +1,117 @@ +goog.provide('ol.webglrenderer.Shader'); + +goog.require('goog.array'); +goog.require('goog.asserts'); +goog.require('goog.webgl'); +goog.require('ol.webglrenderer.GLObject'); +goog.require('ol.webglrenderer.Uniform'); + + + +/** + * @constructor + * @extends {ol.webglrenderer.GLObject} + * @param {string} source Source. + * @param {Array.=} opt_uniforms Uniforms. + */ +ol.webglrenderer.Shader = function(source, opt_uniforms) { + + goog.base(this); + + /** + * @private + * @type {WebGLShader} + */ + this.shader_ = null; + + /** + * @private + * @type {string} + */ + this.source_ = source; + + /** + * @private + * @type {Array.} + */ + this.uniforms_ = opt_uniforms || []; + +}; +goog.inherits(ol.webglrenderer.Shader, ol.webglrenderer.GLObject); + + +/** + */ +ol.webglrenderer.Shader.prototype.compile = function() { + var gl = this.getGL(); + this.shader_ = this.create(); + gl.shaderSource(this.shader_, this.source_); + gl.compileShader(this.shader_); + if (!gl.getShaderParameter(this.shader_, goog.webgl.COMPILE_STATUS)) { + window.console.log(gl.getShaderInfoLog(this.shader_)); + goog.asserts.assert( + gl.getShaderParameter(this.shader_, goog.webgl.COMPILE_STATUS)); + } +}; + + +/** + * @protected + * @return {WebGLShader} Shader. + */ +ol.webglrenderer.Shader.prototype.create = goog.abstractMethod; + + +/** + * @return {WebGLShader} Shader. + */ +ol.webglrenderer.Shader.prototype.get = function() { + return this.shader_; +}; + + +/** + * @return {boolean} Is animated? + */ +ol.webglrenderer.Shader.prototype.isAnimated = function() { + return false; +}; + + +/** + * @inheritDoc + */ +ol.webglrenderer.Shader.prototype.setGL = function(gl) { + if (!goog.isNull(this.gl)) { + goog.array.forEach(this.uniforms_, function(uniform) { + uniform.setGL(null); + }); + if (!goog.isNull(this.shader_)) { + this.gl.deleteShader(this.shader_); + this.shader_ = null; + } + } + goog.base(this, 'setGL', gl); + if (!goog.isNull(gl)) { + this.compile(); + goog.array.forEach(this.uniforms_, function(uniform) { + uniform.setGL(gl); + }); + } +}; + + +/** + * @param {WebGLProgram} program Program. + */ +ol.webglrenderer.Shader.prototype.setProgram = function(program) { + goog.array.forEach(this.uniforms_, function(uniform) { + uniform.setProgram(program); + }); +}; + + +/** + */ +ol.webglrenderer.Shader.prototype.setUniforms = function() { +}; diff --git a/src/ol/webglrenderer/shader/fragment.js b/src/ol/webglrenderer/shader/fragment.js new file mode 100644 index 0000000000..d68e671578 --- /dev/null +++ b/src/ol/webglrenderer/shader/fragment.js @@ -0,0 +1,27 @@ +goog.provide('ol.webglrenderer.shader.Fragment'); + +goog.require('goog.asserts'); +goog.require('ol.webglrenderer.Shader'); + + + +/** + * @constructor + * @extends {ol.webglrenderer.Shader} + * @param {string} source Source. + * @param {Array.=} opt_uniforms Uniforms. + */ +ol.webglrenderer.shader.Fragment = function(source, opt_uniforms) { + goog.base(this, source, opt_uniforms); +}; +goog.inherits(ol.webglrenderer.shader.Fragment, ol.webglrenderer.Shader); + + +/** + * @protected + * @return {WebGLShader} Shader. + */ +ol.webglrenderer.shader.Fragment.prototype.create = function() { + var gl = this.getGL(); + return gl.createShader(gl.FRAGMENT_SHADER); +}; diff --git a/src/ol/webglrenderer/shader/vertex.js b/src/ol/webglrenderer/shader/vertex.js new file mode 100644 index 0000000000..f234778882 --- /dev/null +++ b/src/ol/webglrenderer/shader/vertex.js @@ -0,0 +1,27 @@ +goog.provide('ol.webglrenderer.shader.Vertex'); + +goog.require('goog.asserts'); +goog.require('ol.webglrenderer.Shader'); + + + +/** + * @constructor + * @extends {ol.webglrenderer.Shader} + * @param {string} source Source. + * @param {Array.=} opt_uniforms Uniforms. + */ +ol.webglrenderer.shader.Vertex = function(source, opt_uniforms) { + goog.base(this, source, opt_uniforms); +}; +goog.inherits(ol.webglrenderer.shader.Vertex, ol.webglrenderer.Shader); + + +/** + * @protected + * @return {WebGLShader} Shader. + */ +ol.webglrenderer.shader.Vertex.prototype.create = function() { + var gl = this.getGL(); + return gl.createShader(gl.VERTEX_SHADER); +}; diff --git a/src/ol/webglrenderer/staticglobject.js b/src/ol/webglrenderer/staticglobject.js new file mode 100644 index 0000000000..b94b6daf33 --- /dev/null +++ b/src/ol/webglrenderer/staticglobject.js @@ -0,0 +1,49 @@ +goog.provide('ol.webglrenderer.StaticGLObject'); + +goog.require('goog.Disposable'); + + + +/** + * @constructor + * @extends {goog.Disposable} + * @param {WebGLRenderingContext} gl GL. + */ +ol.webglrenderer.StaticGLObject = function(gl) { + + goog.asserts.assert(!goog.isNull(gl)); + + /** + * @protected + * @type {WebGLRenderingContext} + */ + this.gl = gl; + +}; +goog.inherits(ol.webglrenderer.StaticGLObject, goog.Disposable); + + +/** + * @inheritDoc + */ +ol.webglrenderer.StaticGLObject.prototype.disposeInternal = function() { + this.gl = null; + goog.base(this, 'disposeInternal'); +}; + + +/** + * @return {!WebGLRenderingContext} GL. + */ +ol.webglrenderer.StaticGLObject.prototype.getGL = function() { + goog.asserts.assert(!goog.isNull(this.gl)); + return this.gl; +}; + + +/** + * @return {WebGLRenderingContext} GL. + */ +ol.webglrenderer.StaticGLObject.prototype.unsafeGetGL = function() { + return this.gl; +}; diff --git a/src/ol/webglrenderer/texture.js b/src/ol/webglrenderer/texture.js new file mode 100644 index 0000000000..6531189ae5 --- /dev/null +++ b/src/ol/webglrenderer/texture.js @@ -0,0 +1,64 @@ +goog.provide('ol.webglrenderer.Texture'); + +goog.require('goog.asserts'); +goog.require('ol.webglrenderer.GLObject'); + + + +/** + * @constructor + * @extends {ol.webglrenderer.GLObject} + * @param {Image} image Image. + */ +ol.webglrenderer.Texture = function(image) { + + goog.base(this); + + /** + * @private + * @type {WebGLTexture} + */ + this.texture_ = null; + + /** + * @private + * @type {Image} + */ + this.image_ = image; + +}; +goog.inherits(ol.webglrenderer.Texture, ol.webglrenderer.GLObject); + + +/** + */ +ol.webglrenderer.Texture.prototype.bind = function() { + var gl = this.getGL(); + if (goog.isNull(this.texture_)) { + var texture = gl.createTexture(); + gl.bindTexture(goog.webgl.TEXTURE_2D, texture); + gl.texImage2D(goog.webgl.TEXTURE_2D, 0, goog.webgl.RGBA, goog.webgl.RGBA, + goog.webgl.UNSIGNED_BYTE, this.image_); + gl.texParameteri(goog.webgl.TEXTURE_2D, goog.webgl.TEXTURE_MAG_FILTER, + goog.webgl.NEAREST); + gl.texParameteri(goog.webgl.TEXTURE_2D, goog.webgl.TEXTURE_MIN_FILTER, + goog.webgl.NEAREST); + this.texture_ = texture; + } else { + gl.bindTexture(goog.webgl.TEXTURE_2D, this.texture_); + } +}; + + +/** + * @inheritDoc + */ +ol.webglrenderer.Texture.prototype.setGL = function(gl) { + if (!goog.isNull(this.gl)) { + if (!goog.isNull(this.texture_)) { + this.gl.deleteTexture(this.texture_); + this.texture_ = null; + } + } + goog.base(this, 'setGL', gl); +}; diff --git a/src/ol/webglrenderer/tilelayerrenderer.js b/src/ol/webglrenderer/tilelayerrenderer.js new file mode 100644 index 0000000000..b91b8cefb3 --- /dev/null +++ b/src/ol/webglrenderer/tilelayerrenderer.js @@ -0,0 +1,71 @@ +goog.provide('ol.webglrenderer.TileLayerRenderer'); + +goog.require('goog.events.EventType'); +goog.require('ol.LayerRenderer'); +goog.require('ol.webglrenderer.IGLObject'); + + + +/** + * @constructor + * @extends {ol.LayerRenderer} + * @implements {ol.webglrenderer.IGLObject} + * @param {ol.Layer} layer Layer. + * @param {WebGLRenderingContext} gl GL. + */ +ol.webglrenderer.TileLayerRenderer = function(layer, gl) { + + goog.base(this, layer); + + /** + * @type {WebGLRenderingContext} + * @private + */ + this.gl_ = null; + + this.setGL(gl); + +}; +goog.inherits(ol.webglrenderer.TileLayerRenderer, ol.LayerRenderer); + + +/** + * @protected + */ +ol.webglrenderer.TileLayerRenderer.prototype.dispatchChangeEvent = function() { + this.dispatchEvent(goog.events.EventType.CHANGE); +}; + + +/** + * @inheritDoc + */ +ol.webglrenderer.TileLayerRenderer.prototype.getGL = function() { + return this.gl_; +}; + + +/** + * @inheritDoc + */ +ol.webglrenderer.TileLayerRenderer.prototype.handleLayerOpacityChange = + function() { + this.dispatchChangeEvent(); +}; + + +/** + * @inheritDoc + */ +ol.webglrenderer.TileLayerRenderer.prototype.handleLayerVisibleChange = + function() { + this.dispatchChangeEvent(); +}; + + +/** + * @inheritDoc + */ +ol.webglrenderer.TileLayerRenderer.prototype.setGL = function(gl) { + this.gl_ = gl; +}; diff --git a/src/ol/webglrenderer/uniform.js b/src/ol/webglrenderer/uniform.js new file mode 100644 index 0000000000..ca33224478 --- /dev/null +++ b/src/ol/webglrenderer/uniform.js @@ -0,0 +1,101 @@ +goog.provide('ol.webglrenderer.Uniform'); + +goog.require('goog.asserts'); +goog.require('goog.vec.Mat4'); +goog.require('ol.webglrenderer.GLObject'); + + + +/** + * @constructor + * @extends {ol.webglrenderer.GLObject} + * @param {string} name Name. + */ +ol.webglrenderer.Uniform = function(name) { + + goog.base(this); + + /** + * @private + * @type {WebGLProgram} + */ + this.program_ = null; + + /** + * @private + * @type {string} + */ + this.name_ = name; + + /** + * @private + * @type {WebGLUniformLocation} + */ + this.location_ = null; + +}; +goog.inherits(ol.webglrenderer.Uniform, ol.webglrenderer.GLObject); + + +/** + * @return {string} Name. + */ +ol.webglrenderer.Uniform.prototype.getName = function() { + return this.name_; +}; + + +/** + * @param {WebGLRenderingContext} gl GL. + */ +ol.webglrenderer.Uniform.prototype.setGL = function(gl) { + this.location_ = null; + goog.base(this, 'setGL', gl); +}; + + +/** + * @param {number} value Value. + */ +ol.webglrenderer.Uniform.prototype.set1f = function(value) { + var gl = this.getGL(); + if (!goog.isNull(this.location_)) { + gl.uniform1f(this.location_, value); + } +}; + + +/** + * @param {number} value Value. + */ +ol.webglrenderer.Uniform.prototype.set1i = function(value) { + var gl = this.getGL(); + if (!goog.isNull(this.location_)) { + gl.uniform1i(this.location_, value); + } +}; + + +/** + * @param {boolean} transpose Transpose. + * @param {goog.vec.Mat4.Mat4Like} value Value. + */ +ol.webglrenderer.Uniform.prototype.setMatrix4fv = function(transpose, value) { + var gl = this.getGL(); + if (!goog.isNull(this.location_)) { + gl.uniformMatrix4fv(this.location_, transpose, value); + } +}; + + +/** + * @param {WebGLProgram} program Program. + */ +ol.webglrenderer.Uniform.prototype.setProgram = function(program) { + if (goog.isNull(program)) { + this.location_ = null; + } else { + var gl = this.getGL(); + this.location_ = gl.getUniformLocation(program, this.name_); + } +}; diff --git a/src/ol/webglrenderer/vertexattrib.js b/src/ol/webglrenderer/vertexattrib.js new file mode 100644 index 0000000000..9aabef8700 --- /dev/null +++ b/src/ol/webglrenderer/vertexattrib.js @@ -0,0 +1,78 @@ +goog.provide('ol.webglrenderer.VertexAttrib'); + +goog.require('goog.asserts'); +goog.require('ol.webglrenderer.GLObject'); + + + +/** + * @constructor + * @extends {ol.webglrenderer.GLObject} + * @param {string} name Name. + */ +ol.webglrenderer.VertexAttrib = function(name) { + + goog.base(this); + + /** + * @private + * @type {string} + */ + this.name_ = name; + + /** + * @private + * @type {number} + */ + this.location_ = -1; + +}; +goog.inherits(ol.webglrenderer.VertexAttrib, ol.webglrenderer.GLObject); + + +/** + */ +ol.webglrenderer.VertexAttrib.prototype.enableArray = function() { + var gl = this.getGL(); + goog.asserts.assert(this.location_ != -1); + gl.enableVertexAttribArray(this.location_); +}; + + +/** + * @param {number} size Size. + * @param {number} type Type. + * @param {boolean} normalize Normalized. + * @param {number} stride Stride. + * @param {number} offset Offset. + */ +ol.webglrenderer.VertexAttrib.prototype.pointer = + function(size, type, normalize, stride, offset) { + var gl = this.getGL(); + goog.asserts.assert(this.location_ != -1); + gl.vertexAttribPointer( + this.location_, size, type, normalize, stride, offset); +}; + + +/** + * @param {WebGLRenderingContext} gl GL. + */ +ol.webglrenderer.VertexAttrib.prototype.setGL = function(gl) { + this.location_ = -1; + goog.base(this, 'setGL', gl); +}; + + +/** + * @param {WebGLProgram} program Program. + */ +ol.webglrenderer.VertexAttrib.prototype.setProgram = function(program) { + if (goog.isNull(program)) { + this.location_ = -1; + } else { + var gl = this.getGL(); + this.location_ = gl.getAttribLocation(program, this.name_); + goog.asserts.assert(!goog.isNull(this.location_)); + } +}; From d1e5906e2cf815e80681a99b92abd57ba3dc53a9 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Sat, 14 Jul 2012 13:36:24 +0200 Subject: [PATCH 105/562] Merge Map and MapRenderer --- skeleton.html | 2 +- src/all.js | 8 +- src/ol/createmap.js | 66 ++++ src/ol/dom/dom.js | 9 + .../dommaprenderer.js => dom/map.js} | 22 +- src/ol/map.js | 262 ++++++++++++---- src/ol/maprenderer.js | 293 ------------------ .../{webglrenderer => webgl}/arraybuffer.js | 14 +- .../{webglrenderer => webgl}/framebuffer.js | 20 +- src/ol/{webglrenderer => webgl}/globject.js | 16 +- src/ol/webgl/iglobject.js | 20 ++ .../webglmaprenderer.js => webgl/map.js} | 46 ++- src/ol/{webglrenderer => webgl}/program.js | 28 +- .../{webglrenderer => webgl}/programcache.js | 30 +- src/ol/{webglrenderer => webgl}/shader.js | 30 +- src/ol/webgl/shader/fragment.js | 27 ++ src/ol/webgl/shader/vertex.js | 27 ++ .../staticglobject.js | 12 +- src/ol/{webglrenderer => webgl}/texture.js | 14 +- .../tilelayerrenderer.js | 20 +- src/ol/{webglrenderer => webgl}/uniform.js | 22 +- .../{webglrenderer => webgl}/vertexattrib.js | 18 +- src/ol/webgl/webgl.js | 9 + src/ol/webglrenderer/iglobject.js | 20 -- src/ol/webglrenderer/shader/fragment.js | 27 -- src/ol/webglrenderer/shader/vertex.js | 27 -- 26 files changed, 504 insertions(+), 585 deletions(-) create mode 100644 src/ol/createmap.js create mode 100644 src/ol/dom/dom.js rename src/ol/{domrenderer/dommaprenderer.js => dom/map.js} (51%) delete mode 100644 src/ol/maprenderer.js rename src/ol/{webglrenderer => webgl}/arraybuffer.js (61%) rename src/ol/{webglrenderer => webgl}/framebuffer.js (81%) rename src/ol/{webglrenderer => webgl}/globject.js (50%) create mode 100644 src/ol/webgl/iglobject.js rename src/ol/{webglrenderer/webglmaprenderer.js => webgl/map.js} (67%) rename src/ol/{webglrenderer => webgl}/program.js (61%) rename src/ol/{webglrenderer => webgl}/programcache.js (50%) rename src/ol/{webglrenderer => webgl}/shader.js (65%) create mode 100644 src/ol/webgl/shader/fragment.js create mode 100644 src/ol/webgl/shader/vertex.js rename src/ol/{webglrenderer => webgl}/staticglobject.js (59%) rename src/ol/{webglrenderer => webgl}/texture.js (75%) rename src/ol/{webglrenderer => webgl}/tilelayerrenderer.js (51%) rename src/ol/{webglrenderer => webgl}/uniform.js (67%) rename src/ol/{webglrenderer => webgl}/vertexattrib.js (69%) create mode 100644 src/ol/webgl/webgl.js delete mode 100644 src/ol/webglrenderer/iglobject.js delete mode 100644 src/ol/webglrenderer/shader/fragment.js delete mode 100644 src/ol/webglrenderer/shader/vertex.js diff --git a/skeleton.html b/skeleton.html index 23b57e01c7..dfe546215c 100644 --- a/skeleton.html +++ b/skeleton.html @@ -16,7 +16,7 @@ - + diff --git a/src/ol/map.js b/src/ol/map.js index eb3fb65a94..76a6163feb 100644 --- a/src/ol/map.js +++ b/src/ol/map.js @@ -320,7 +320,6 @@ ol.Map.prototype.handleLayersInsertAt = function(event) { var layers = /** @type {ol.Array} */ (event.target); var layer = /** @type {ol.Layer} */ layers.getAt(event.index); this.handleLayerAdd(layer); - this.setDefaultCenterAndResolution_(); }; @@ -364,7 +363,6 @@ ol.Map.prototype.handleLayersChanged = function() { goog.events.listen(layers, ol.ArrayEventType.SET_AT, this.handleLayersSetAt, false, this) ]; - this.setDefaultCenterAndResolution_(); } }; @@ -467,23 +465,6 @@ ol.Map.prototype.setCenter = function(center) { }; -/** - * @private - */ -ol.Map.prototype.setDefaultCenterAndResolution_ = function() { - if (goog.isDef(this.getCenter()) && goog.isDef(this.getResolution())) { - return; - } - var layers = this.getLayers(); - if (layers.getLength() < 1) { - return; - } - var layer = /** @type {ol.Layer} */ (layers.getAt(0)); - var storeExtent = layer.getStore().getExtent(); - this.setExtent(storeExtent); -}; - - /** * @param {ol.Extent} extent Extent. */ From aded70d6e6d2e2dd87c2207e69d165eb84a2f203 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Tue, 17 Jul 2012 16:06:10 +0200 Subject: [PATCH 189/562] Add ol.TileBounds.getSize --- src/ol/tilebounds.js | 10 ++++++++++ src/ol/tilebounds_test.js | 8 ++++++++ 2 files changed, 18 insertions(+) diff --git a/src/ol/tilebounds.js b/src/ol/tilebounds.js index 216ee49e0a..5da030a29d 100644 --- a/src/ol/tilebounds.js +++ b/src/ol/tilebounds.js @@ -1,6 +1,7 @@ goog.provide('ol.TileBounds'); goog.require('goog.asserts'); +goog.require('goog.math.Size'); goog.require('ol.Rectangle'); goog.require('ol.TileCoord'); @@ -71,3 +72,12 @@ ol.TileBounds.prototype.forEachTileCoord = function(z, f, opt_obj) { } } }; + + +/** + * @return {goog.math.Size} Size. + */ +ol.TileBounds.prototype.getSize = function() { + return new goog.math.Size( + this.maxX - this.minX + 1, this.maxY - this.minY + 1); +}; diff --git a/src/ol/tilebounds_test.js b/src/ol/tilebounds_test.js index 9a877c4c12..152c287980 100644 --- a/src/ol/tilebounds_test.js +++ b/src/ol/tilebounds_test.js @@ -76,3 +76,11 @@ function testForEachTileCoord() { assertEquals(3, tileCoords[3].y); } + + +function testSize() { + var tileBounds = new ol.TileBounds(0, 1, 2, 4); + var size = tileBounds.getSize(); + assertEquals(3, size.width); + assertEquals(4, size.height); +} From be94eafae65d90020fd6576de6c5445b9444a1f6 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Tue, 17 Jul 2012 17:39:47 +0200 Subject: [PATCH 190/562] Override getLayer in ol.webgl.TileLayerRenderer --- src/ol/webgl/tilelayerrenderer.js | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/ol/webgl/tilelayerrenderer.js b/src/ol/webgl/tilelayerrenderer.js index 5e1f136d5f..04fb35aaed 100644 --- a/src/ol/webgl/tilelayerrenderer.js +++ b/src/ol/webgl/tilelayerrenderer.js @@ -114,6 +114,15 @@ ol.webgl.TileLayerRenderer = function(map, tileLayer) { goog.inherits(ol.webgl.TileLayerRenderer, ol.webgl.LayerRenderer); +/** + * @return {ol.TileLayer} Layer. + * @override + */ +ol.webgl.TileLayerRenderer.prototype.getLayer = function() { + return /** @type {ol.TileLayer} */ goog.base(this, 'getLayer'); +}; + + /** * @inheritDoc */ @@ -176,7 +185,7 @@ ol.webgl.TileLayerRenderer.prototype.redraw = function() { return; } - var tileLayer = /** @type {ol.TileLayer} */ (this.getLayer()); + var tileLayer = this.getLayer(); var tileStore = tileLayer.getStore(); var tileGrid = tileStore.getTileGrid(); var z = tileGrid.getZForResolution(resolution); From 40e83b925894643c3b088f73c7261411e45897d2 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Tue, 17 Jul 2012 18:55:33 +0200 Subject: [PATCH 191/562] Don't redraw if center or resolution is not defined --- src/ol/webgl/map.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/ol/webgl/map.js b/src/ol/webgl/map.js index 8ae5106a46..ece844a560 100644 --- a/src/ol/webgl/map.js +++ b/src/ol/webgl/map.js @@ -380,9 +380,13 @@ ol.webgl.Map.prototype.handleWebGLContextRestored = function() { */ ol.webgl.Map.prototype.redrawInternal = function() { - var animate = goog.base(this, 'redrawInternal'); + var center = this.getCenter(); + var resolution = this.getResolution(); + if (!goog.isDef(center) || !goog.isDef(resolution)) { + return false; + } - var gl = this.getGL(); + var animate = goog.base(this, 'redrawInternal'); this.forEachVisibleLayer(function(layer, layerRenderer) { if (layerRenderer.redraw()) { From f77ad158f0159b27c393d4863501f4ccfeeb1488 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Tue, 17 Jul 2012 18:56:10 +0200 Subject: [PATCH 192/562] Initial working WebGL TileLayerRenderer --- src/ol/webgl/tilelayerrenderer.js | 84 +++++++++++++++++++++++++++---- 1 file changed, 73 insertions(+), 11 deletions(-) diff --git a/src/ol/webgl/tilelayerrenderer.js b/src/ol/webgl/tilelayerrenderer.js index 04fb35aaed..413641e774 100644 --- a/src/ol/webgl/tilelayerrenderer.js +++ b/src/ol/webgl/tilelayerrenderer.js @@ -4,6 +4,7 @@ goog.provide('ol.webgl.tilelayerrenderer.shader'); goog.require('goog.asserts'); goog.require('goog.events.EventType'); goog.require('goog.webgl'); +goog.require('goog.vec.Mat4'); goog.require('ol.TileLayer'); goog.require('ol.webgl.LayerRenderer'); goog.require('ol.webgl.shader.Fragment'); @@ -45,8 +46,10 @@ ol.webgl.tilelayerrenderer.shader.Vertex = function() { '', 'varying vec2 vTexCoord;', '', + 'uniform mat4 uMatrix;', + '', 'void main(void) {', - ' gl_Position = vec4(aPosition, 0., 1.);', + ' gl_Position = uMatrix * vec4(aPosition, 0., 1.);', ' vTexCoord = aTexCoord;', '}' ].join('\n')); @@ -80,6 +83,21 @@ ol.webgl.TileLayerRenderer = function(map, tileLayer) { */ this.vertexShader_ = ol.webgl.tilelayerrenderer.shader.Vertex.getInstance(); + /** + * @private + * @type {{aPosition: number, + * aTexCoord: number, + * uMatrix: WebGLUniformLocation, + * uTexture: WebGLUniformLocation}|null} + */ + this.locations_ = null; + + /** + * @private + * @type {WebGLBuffer} + */ + this.arrayBuffer_ = null; + /** * @private * @type {WebGLTexture} @@ -145,6 +163,7 @@ ol.webgl.TileLayerRenderer.prototype.dispatchChangeEvent = function() { ol.webgl.TileLayerRenderer.prototype.disposeInternal = function() { var gl = this.getGL(); if (!gl.isContextLost()) { + gl.deleteBuffer(this.arrayBuffer_); gl.deleteFramebuffer(this.framebuffer_); gl.deleteRenderbuffer(this.renderbuffer_); gl.deleteTexture(this.texture_); @@ -156,6 +175,8 @@ ol.webgl.TileLayerRenderer.prototype.disposeInternal = function() { /** */ ol.webgl.TileLayerRenderer.prototype.handleWebGLContextLost = function() { + this.locations_ = null; + this.arrayBuffer_ = null; this.texture_ = null; this.renderbuffer_ = null; this.framebuffer_ = null; @@ -181,20 +202,18 @@ ol.webgl.TileLayerRenderer.prototype.redraw = function() { var map = this.getMap(); var extent = map.getExtent(); var resolution = map.getResolution(); - if (!goog.isDef(extent) || !goog.isDef(resolution)) { - return; - } var tileLayer = this.getLayer(); var tileStore = tileLayer.getStore(); var tileGrid = tileStore.getTileGrid(); var z = tileGrid.getZForResolution(resolution); var tileBounds = tileGrid.getExtentTileBounds(z, extent); + var tileBoundsSize = tileBounds.getSize(); var tileSize = tileGrid.getTileSize(); var framebufferSize = new goog.math.Size( - tileSize.width * (tileBounds.maxX - tileBounds.minX + 1), - tileSize.height * (tileBounds.maxY - tileBounds.minY + 1)); + tileSize.width * tileBoundsSize.width, + tileSize.height * tileBoundsSize.height); if (goog.isNull(this.framebufferSize_) || !goog.math.Size.equals(this.framebufferSize_, framebufferSize)) { @@ -209,9 +228,9 @@ ol.webgl.TileLayerRenderer.prototype.redraw = function() { framebufferSize.height, 0, goog.webgl.RGBA, goog.webgl.UNSIGNED_BYTE, null); gl.texParameteri(goog.webgl.TEXTURE_2D, goog.webgl.TEXTURE_MAG_FILTER, - goog.webgl.NEAREST); + goog.webgl.LINEAR); gl.texParameteri(goog.webgl.TEXTURE_2D, goog.webgl.TEXTURE_MIN_FILTER, - goog.webgl.NEAREST); + goog.webgl.LINEAR); var renderbuffer = gl.createRenderbuffer(); gl.bindRenderbuffer(goog.webgl.RENDERBUFFER, renderbuffer); @@ -235,15 +254,58 @@ ol.webgl.TileLayerRenderer.prototype.redraw = function() { gl.bindFramebuffer(goog.webgl.FRAMEBUFFER, this.framebuffer_); } - gl.useProgram(map.getProgram(this.fragmentShader_, this.vertexShader_)); + gl.disable(goog.webgl.BLEND); + + var program = map.getProgram(this.fragmentShader_, this.vertexShader_); + gl.useProgram(program); + if (goog.isNull(this.locations_)) { + this.locations_ = { + aPosition: gl.getAttribLocation(program, 'aPosition'), + aTexCoord: gl.getAttribLocation(program, 'aTexCoord'), + uMatrix: gl.getUniformLocation(program, 'uMatrix'), + uTexture: gl.getUniformLocation(program, 'uTexture') + }; + } + + if (goog.isNull(this.arrayBuffer_)) { + var arrayBuffer = gl.createBuffer(); + gl.bindBuffer(goog.webgl.ARRAY_BUFFER, arrayBuffer); + gl.bufferData(goog.webgl.ARRAY_BUFFER, new Float32Array([ + 0, 0, 0, 1, + 1, 0, 1, 1, + 0, 1, 0, 0, + 1, 1, 1, 0 + ]), goog.webgl.STATIC_DRAW); + this.arrayBuffer_ = arrayBuffer; + } else { + gl.bindBuffer(goog.webgl.ARRAY_BUFFER, this.arrayBuffer_); + } + + gl.enableVertexAttribArray(this.locations_.aPosition); + gl.vertexAttribPointer( + this.locations_.aPosition, 2, goog.webgl.FLOAT, false, 16, 0); + gl.enableVertexAttribArray(this.locations_.aTexCoord); + gl.vertexAttribPointer( + this.locations_.aTexCoord, 2, goog.webgl.FLOAT, false, 16, 8); + gl.uniform1i(this.locations_.uTexture, 0); tileBounds.forEachTileCoord(z, function(tileCoord) { var tile = tileStore.getTile(tileCoord); if (goog.isNull(tile)) { } else if (tile.isLoaded()) { - var x = tileSize.width * (tileCoord.x - tileBounds.minX); - var y = tileSize.height * (tileCoord.y - tileBounds.minY); + var uMatrix = goog.vec.Mat4.createFloat32Identity(); + goog.vec.Mat4.translate(uMatrix, + 2 * (tileCoord.x - tileBounds.minX) / tileBoundsSize.width - 1, + 2 * (tileCoord.y - tileBounds.minY) / tileBoundsSize.height - 1, + 0); + goog.vec.Mat4.scale(uMatrix, + 2 / tileBoundsSize.width, + 2 / tileBoundsSize.height, + 1); + gl.uniformMatrix4fv(this.locations_.uMatrix, false, uMatrix); gl.bindTexture(goog.webgl.TEXTURE_2D, map.getTexture(tile.getImage())); + gl.activeTexture(goog.webgl.TEXTURE0); + gl.drawArrays(goog.webgl.TRIANGLE_STRIP, 0, 4); } else { var key = goog.getUid(tile); if (!(key in this.tileChangeListenerKeys_)) { From 5b5b89819ee822ed78f26e50be014a011174bc7e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Lemoine?= Date: Tue, 17 Jul 2012 22:13:15 +0200 Subject: [PATCH 193/562] alphabetize goog.require classes for gjslint --- src/ol/webgl/tilelayerrenderer.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ol/webgl/tilelayerrenderer.js b/src/ol/webgl/tilelayerrenderer.js index 413641e774..1262c0c103 100644 --- a/src/ol/webgl/tilelayerrenderer.js +++ b/src/ol/webgl/tilelayerrenderer.js @@ -3,8 +3,8 @@ goog.provide('ol.webgl.tilelayerrenderer.shader'); goog.require('goog.asserts'); goog.require('goog.events.EventType'); -goog.require('goog.webgl'); goog.require('goog.vec.Mat4'); +goog.require('goog.webgl'); goog.require('ol.TileLayer'); goog.require('ol.webgl.LayerRenderer'); goog.require('ol.webgl.shader.Fragment'); From b31c3f90bd4536bad4d9d7a961b1756510b1722e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Lemoine?= Date: Tue, 17 Jul 2012 22:28:58 +0200 Subject: [PATCH 194/562] initial port of @tschaub DOM renderer --- src/ol/dom/layerrenderer.js | 56 ++++++++++ src/ol/dom/map.js | 191 ++++++++++++++++++++++++++++++-- src/ol/dom/tilelayerrenderer.js | 132 ++++++++++++++++++++++ src/ol/tilecoord.js | 14 +++ src/ol/tilecoord_test.js | 9 ++ 5 files changed, 394 insertions(+), 8 deletions(-) create mode 100644 src/ol/dom/layerrenderer.js create mode 100644 src/ol/dom/tilelayerrenderer.js diff --git a/src/ol/dom/layerrenderer.js b/src/ol/dom/layerrenderer.js new file mode 100644 index 0000000000..c2a368206a --- /dev/null +++ b/src/ol/dom/layerrenderer.js @@ -0,0 +1,56 @@ +goog.provide('ol.dom.LayerRenderer'); + +goog.require('ol.LayerRenderer'); + + + +/** + * @constructor + * @extends {ol.LayerRenderer} + * @param {ol.dom.Map} map Map. + * @param {ol.Layer} layer Layer. + * @param {!Element} target Target. + */ +ol.dom.LayerRenderer = function(map, layer, target) { + goog.base(this, map, layer); + + /** + * @type {!Element} + * @protected + */ + this.target = target; + + /** + * Location of the top-left corner of the renderer container in map coords. + * + * @type {goog.math.Coordinate} + * @protected + */ + this.containerOrigin = null; + +}; +goog.inherits(ol.dom.LayerRenderer, ol.LayerRenderer); + + +/** + * @override + * @return {ol.dom.Map} Map. + */ +ol.dom.LayerRenderer.prototype.getMap = function() { + return /** @type {ol.dom.Map} */ (goog.base(this, 'getMap')); +}; + + +/** + * Set the location of the top-left corner of the renderer container. + * + * @param {goog.math.Coordinate} origin The container origin. + */ +ol.dom.LayerRenderer.prototype.setContainerOrigin = function(origin) { + this.containerOrigin = origin; +}; + + +/** + */ +ol.dom.LayerRenderer.prototype.redraw = goog.abstractMethod; diff --git a/src/ol/dom/map.js b/src/ol/dom/map.js index 1a8c66f2f0..617ff6b163 100644 --- a/src/ol/dom/map.js +++ b/src/ol/dom/map.js @@ -1,8 +1,12 @@ goog.provide('ol.dom.Map'); -goog.require('ol.Layer'); +goog.require('goog.dom'); +goog.require('goog.dom.TagName'); +goog.require('goog.math.Coordinate'); +goog.require('goog.style'); goog.require('ol.Map'); -goog.require('ol.TileStore'); +goog.require('ol.TileLayer'); +goog.require('ol.dom.TileLayerRenderer'); @@ -13,26 +17,197 @@ goog.require('ol.TileStore'); * @param {Object.=} opt_values Values. */ ol.dom.Map = function(target, opt_values) { - goog.base(this, target); - // FIXME write initialization code here + /** + * @type {Element} + * @private + */ + this.layersPane_ = goog.dom.createElement(goog.dom.TagName.DIV); + this.layersPane_.style.position = 'absolute'; + this.layersPane_.className = 'ol-renderer-dom'; + target.appendChild(this.layersPane_); + + /** + * The current top left corner location of the layersPane element + * (map coords). + * + * @type {goog.math.Coordinate} + * @private + */ + this.layersPaneOrigin_ = null; + + /** + * The pixel offset of the layersPane element with respect to its + * container. + * + * @type {goog.math.Coordinate} + * @private + */ + this.layersPaneOffset_ = null; + + /** + * @type {goog.math.Coordinate|undefined} + * @private + */ + this.renderedCenter_ = undefined; + + /** + * @type {number|undefined} + * @private + */ + this.renderedResolution_ = undefined; + + /** + * @type {Object} + * @private + */ + this.layerPanes_ = {}; if (goog.isDef(opt_values)) { this.setValues(opt_values); } + this.handleViewportResize(); + }; goog.inherits(ol.dom.Map, ol.Map); +/** + * Reset the layers pane to its initial position. + * @private + */ +ol.dom.Map.prototype.resetLayersPane_ = function() { + this.layersPaneOrigin_ = this.getOrigin_(); + goog.object.forEach(this.layerRenderers, function(layerRenderer) { + layerRenderer.setContainerOrigin(this.layersPaneOrigin_); + }); + var offset = new goog.math.Coordinate(0, 0); + goog.style.setPosition(this.layersPane_, offset); + this.renderedCenter_ = this.getCenter(); +}; + + +/** + * Get the position of the top-left corner of the layers pane. + * @private + * @return {goog.math.Coordinate} Origin. + */ +ol.dom.Map.prototype.getOrigin_ = function() { + var center = this.getCenter(); + var resolution = this.getResolution(); + var targetSize = this.getSize(); + var targetWidth = targetSize.width; + var targetHeight = targetSize.height; + return new goog.math.Coordinate( + center.x - resolution * targetWidth / 2, + center.y + resolution * targetHeight / 2); +}; + + +/** + * Move the layers pane. + * @private + */ +ol.dom.Map.prototype.shiftLayersPane_ = function() { + var center = this.getCenter(); + var oldCenter = this.renderedCenter_; + var resolution = this.getResolution(); + var dx = Math.round((oldCenter.x - center.x) / resolution); + var dy = Math.round((center.y - oldCenter.y) / resolution); + if (!(dx === 0 && dy === 0)) { + var offset = this.layersPaneOffset_; + offset.x += Math.round((oldCenter.x - center.x) / resolution); + offset.y += Math.round((center.y - oldCenter.y) / resolution); + goog.style.setPosition(this.layersPane_, offset); + } +}; + + /** * @inheritDoc */ ol.dom.Map.prototype.createLayerRenderer = function(layer) { - var store = layer.getStore(); - if (layer instanceof ol.TileStore) { - // FIXME create ol.dom.TileLayerRenderer + + if (layer instanceof ol.TileLayer) { + + var layerPane = goog.dom.createElement(goog.dom.TagName.DIV); + layerPane.className = 'ol-renderer-dom-layer'; + layerPane.style.position = 'absolute'; + layerPane.style.width = '100%'; + layerPane.style.height = '100%'; + layerPane.style.top = 0 + 'px'; + layerPane.style.left = 0 + 'px'; + this.layersPane_.appendChild(layerPane); + + var layerRenderer = new ol.dom.TileLayerRenderer(this, layer, layerPane); + layerRenderer.setContainerOrigin(this.layersPaneOrigin_); + + this.layerPanes_[goog.getUid(layerRenderer)] = layerPane; + + return layerRenderer; + + } else { + goog.asserts.assert(false); + return null; } - return null; +}; + + +/** + * @inheritDoc + */ +ol.dom.Map.prototype.handleCenterChanged = function() { + goog.base(this, 'handleCenterChanged'); + //this.shiftLayersPane_(); +}; + + +/** + * @inheritDoc + */ +ol.dom.Map.prototype.handleLayerAdd = function(layer) { + goog.base(this, 'handleLayerAdd', layer); +}; + + +/** + * @inheritDoc + */ +ol.dom.Map.prototype.handleLayerRemove = function(layer) { + goog.base(this, 'handleLayerRemove', layer); +}; + + +/** + * @inheritDoc + */ +ol.dom.Map.prototype.handleResolutionChanged = function() { + goog.base(this, 'handleResolutionChanged'); + var resolution = this.getResolution(); + if (resolution != this.renderedResolution_) { + this.resetLayersPane_(); + this.redraw(); + } +}; + + +/** + * @inheritDoc + */ +ol.dom.Map.prototype.handleSizeChanged = function() { + goog.base(this, 'handleSizeChanged'); +}; + + +/** + * @inheritDoc + */ +ol.dom.Map.prototype.redrawInternal = function() { + goog.base(this, 'redrawInternal'); + this.forEachVisibleLayer(function(layer, layerRenderer) { + layerRenderer.redraw(); + }, this); + return false; }; diff --git a/src/ol/dom/tilelayerrenderer.js b/src/ol/dom/tilelayerrenderer.js new file mode 100644 index 0000000000..455f91af71 --- /dev/null +++ b/src/ol/dom/tilelayerrenderer.js @@ -0,0 +1,132 @@ +goog.provide('ol.dom.TileLayerRenderer'); + +goog.require('ol.dom.LayerRenderer'); + + + +/** + * @constructor + * @extends {ol.dom.LayerRenderer} + * @param {ol.dom.Map} map Map. + * @param {ol.TileLayer} tileLayer Tile layer. + * @param {!Element} target Target. + */ +ol.dom.TileLayerRenderer = function(map, tileLayer, target) { + goog.base(this, map, tileLayer, target); + + /** + * @type {Object} + * @private + */ + this.renderedTiles_ = {}; +}; +goog.inherits(ol.dom.TileLayerRenderer, ol.dom.LayerRenderer); + + +/** + * @inheritDoc + */ +ol.dom.TileLayerRenderer.prototype.redraw = function() { + + var map = this.getMap(); + var extent = /** @type {ol.Extent} */ (map.getExtent()); + var resolution = /** @type {number} */ (map.getResolution()); + + var tileLayer = /** @type {ol.TileLayer} */ (this.getLayer()); + var tileStore = tileLayer.getStore(); + var tileGrid = tileStore.getTileGrid(); + var z = tileGrid.getZForResolution(resolution); + + var tileBounds = tileGrid.getExtentTileBounds(z, extent); + var tileSize = tileGrid.getTileSize(); + + var offset = this.getTilesMapOffset_(extent, tileBounds, resolution); + + var fragment = document.createDocumentFragment(); + + var key, tile, x, y, img, newTiles = false; + tileBounds.forEachTileCoord(z, function(tileCoord) { + key = tileCoord.toString(); + tile = this.renderedTiles_[key]; + if (!goog.isDef(tile)) { + tile = tileStore.getTile(tileCoord); + if (goog.isNull(tile)) { + } else { + if (!tile.isLoaded()) { + tile.load(); + } + this.renderedTiles_[key] = tile; + x = tileSize.width * (tileCoord.x - tileBounds.minX); + y = tileSize.height * (tileBounds.maxY - tileCoord.y); + img = tile.getImage(); + img.style.position = 'absolute'; + img.style.top = (y - offset.y) + 'px'; + img.style.left = (x - offset.x) + 'px'; + img.style.width = tileSize.width + 'px'; + img.style.height = tileSize.height + 'px'; + goog.dom.appendChild(fragment, img); + newTiles = true; + } + } + return false; + }, this); + + if (newTiles) { + this.target.appendChild(fragment); + } + + this.removeInvisibleTiles_(tileBounds, z); +}; + + +/** + * Get the pixel offset between top-left corner of tiles and top-left + * corner of map. Return positive values. + * + * @private + * @param {ol.Extent} extent Map extent. + * @param {ol.TileBounds} tileBounds Tile bounds. + * @param {number} resolution Resolution. + * @return {goog.math.Coordinate} Offset. + */ +ol.dom.TileLayerRenderer.prototype.getTilesMapOffset_ = function( + extent, tileBounds, resolution) { + + var tileLayer = /** @type {ol.TileLayer} */ (this.getLayer()); + var tileStore = tileLayer.getStore(); + var tileGrid = tileStore.getTileGrid(); + var z = tileGrid.getZForResolution(resolution); + var tileCoord = new ol.TileCoord(z, tileBounds.minX, tileBounds.maxY); + var tileCoordExtent = tileGrid.getTileCoordExtent(tileCoord); + + var offset = new goog.math.Coordinate( + Math.round((extent.minX - tileCoordExtent.minX) / resolution), + Math.round((tileCoordExtent.maxY - extent.maxY) / resolution)); + + return offset; +}; + + +/** + * Get rid of tiles outside the rendered extent. + * @private + * @param {ol.TileBounds} tileBounds Tile bounds. + * @param {number} z Z. + */ +ol.dom.TileLayerRenderer.prototype.removeInvisibleTiles_ = function( + tileBounds, z) { + var key, tileCoord, prune, tile; + for (key in this.renderedTiles_) { + tileCoord = ol.TileCoord.fromString(key); + prune = z !== tileCoord.z || + tileCoord.x < tileBounds.minX || + tileCoord.x > tileBounds.maxX || + tileCoord.y < tileBounds.minY || + tileCoord.y > tileBounds.maxY; + if (prune) { + tile = this.renderedTiles_[key]; + delete this.renderedTiles_[key]; + this.target.removeChild(tile.getImage()); + } + } +}; diff --git a/src/ol/tilecoord.js b/src/ol/tilecoord.js index 4252ee098e..6e00091d6a 100644 --- a/src/ol/tilecoord.js +++ b/src/ol/tilecoord.js @@ -1,5 +1,6 @@ goog.provide('ol.TileCoord'); +goog.require('goog.array'); goog.require('goog.math.Coordinate'); @@ -46,3 +47,16 @@ ol.TileCoord.prototype.hash = function() { ol.TileCoord.prototype.toString = function() { return [this.z, this.x, this.y].join('/'); }; + + +/** + * @param {string} str String. + * @return {ol.TileCoord} Tile coord. + */ +ol.TileCoord.fromString = function(str) { + var v = str.split('/'); + v = goog.array.map(v, function(e, i, a) { + return parseInt(e); + }); + return new ol.TileCoord(v[0], v[1], v[2]); +}; diff --git a/src/ol/tilecoord_test.js b/src/ol/tilecoord_test.js index d017085fa5..b106a60a81 100644 --- a/src/ol/tilecoord_test.js +++ b/src/ol/tilecoord_test.js @@ -15,3 +15,12 @@ function testHashX() { var tc2 = new ol.TileCoord(3, 1, 1); assertTrue(tc1.hash() != tc2.hash()); } + + +function testFromString() { + var str = '1/2/3'; + var tc = ol.TileCoord.fromString(str); + assertEquals(1, tc.z); + assertEquals(2, tc.x); + assertEquals(3, tc.y); +} From 0d5bc443266f716c49fab833c4083409274005cd Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Tue, 17 Jul 2012 22:37:21 +0200 Subject: [PATCH 195/562] Add ol.Rectangle.getSize --- src/ol/rectangle.js | 9 +++++++++ src/ol/rectangle_test.js | 8 ++++++++ src/ol/tilebounds.js | 1 + 3 files changed, 18 insertions(+) diff --git a/src/ol/rectangle.js b/src/ol/rectangle.js index 4c665acc0a..f537b57f70 100644 --- a/src/ol/rectangle.js +++ b/src/ol/rectangle.js @@ -2,6 +2,7 @@ goog.provide('ol.Rectangle'); goog.require('goog.asserts'); goog.require('goog.math.Coordinate'); +goog.require('goog.math.Size'); @@ -78,3 +79,11 @@ ol.Rectangle.prototype.getCenter = function() { return new goog.math.Coordinate( (this.minX + this.maxX) / 2, (this.minY + this.maxY) / 2); }; + + +/** + * @return {goog.math.Size} Size. + */ +ol.Rectangle.prototype.getSize = function() { + return new goog.math.Size(this.maxX - this.minX, this.maxY - this.minY); +}; diff --git a/src/ol/rectangle_test.js b/src/ol/rectangle_test.js index c33771736b..3a8c7d4475 100644 --- a/src/ol/rectangle_test.js +++ b/src/ol/rectangle_test.js @@ -99,3 +99,11 @@ function testIntersects() { assertNotIntersects(new ol.Rectangle(80, 120, 120, 140)); assertNotIntersects(new ol.Rectangle(120, 120, 140, 140)); } + + +function testSize() { + var rectangle = new ol.Rectangle(0, 1, 2, 4); + var size = rectangle.getSize(); + assertEquals(2, size.width); + assertEquals(3, size.height); +} diff --git a/src/ol/tilebounds.js b/src/ol/tilebounds.js index 5da030a29d..9638de67c9 100644 --- a/src/ol/tilebounds.js +++ b/src/ol/tilebounds.js @@ -75,6 +75,7 @@ ol.TileBounds.prototype.forEachTileCoord = function(z, f, opt_obj) { /** + * @override * @return {goog.math.Size} Size. */ ol.TileBounds.prototype.getSize = function() { From d0233600d5b364b768fd19c0f5ce85d9383e2003 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Tue, 17 Jul 2012 22:38:55 +0200 Subject: [PATCH 196/562] Add ol.TileGrid.getTileBoundsExtent --- src/ol/tilegrid.js | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/ol/tilegrid.js b/src/ol/tilegrid.js index 189d4b9c0a..a0b7b88987 100644 --- a/src/ol/tilegrid.js +++ b/src/ol/tilegrid.js @@ -195,6 +195,23 @@ ol.TileGrid.prototype.getTileCoordCenter = function(tileCoord) { }; +/** + * @param {number} z Z. + * @param {ol.TileBounds} tileBounds Tile bounds. + * @return {ol.Extent} Extent. + */ +ol.TileGrid.prototype.getTileBoundsExtent = function(z, tileBounds) { + var origin = this.getOrigin(z); + var resolution = this.getResolution(z); + var tileSize = this.tileSize_; + var minX = origin.x + tileBounds.minX * tileSize.width * resolution; + var minY = origin.y + tileBounds.minY * tileSize.height * resolution; + var maxX = origin.x + (tileBounds.maxX + 1) * tileSize.width * resolution; + var maxY = origin.y + (tileBounds.maxY + 1) * tileSize.height * resolution; + return new ol.Extent(minX, minY, maxX, maxY); +}; + + /** * @param {ol.TileCoord} tileCoord Tile coordinate. * @return {ol.Extent} Extent. From 6abcc5678905c5ff382da03aeba03c874b29aebe Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Tue, 17 Jul 2012 22:39:49 +0200 Subject: [PATCH 197/562] Suppress compiler warnings --- src/ol/webgl/tilelayerrenderer.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ol/webgl/tilelayerrenderer.js b/src/ol/webgl/tilelayerrenderer.js index 1262c0c103..7458087c53 100644 --- a/src/ol/webgl/tilelayerrenderer.js +++ b/src/ol/webgl/tilelayerrenderer.js @@ -200,8 +200,8 @@ ol.webgl.TileLayerRenderer.prototype.redraw = function() { var gl = this.getGL(); var map = this.getMap(); - var extent = map.getExtent(); - var resolution = map.getResolution(); + var extent = /** @type {!ol.Extent} */ map.getExtent(); + var resolution = /** @type {number} */ map.getResolution(); var tileLayer = this.getLayer(); var tileStore = tileLayer.getStore(); From 7dc28844988af60c96fa689950df259e93256227 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Tue, 17 Jul 2012 22:54:58 +0200 Subject: [PATCH 198/562] Fix tile edge artefacts --- src/ol/webgl/map.js | 8 ++++++-- src/ol/webgl/tilelayerrenderer.js | 10 ++++++---- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/src/ol/webgl/map.js b/src/ol/webgl/map.js index ece844a560..127e61b0cc 100644 --- a/src/ol/webgl/map.js +++ b/src/ol/webgl/map.js @@ -269,9 +269,13 @@ ol.webgl.Map.prototype.getTexture = function(image) { gl.texImage2D(goog.webgl.TEXTURE_2D, 0, goog.webgl.RGBA, goog.webgl.RGBA, goog.webgl.UNSIGNED_BYTE, image); gl.texParameteri(goog.webgl.TEXTURE_2D, goog.webgl.TEXTURE_MAG_FILTER, - goog.webgl.LINEAR); + goog.webgl.NEAREST); gl.texParameteri(goog.webgl.TEXTURE_2D, goog.webgl.TEXTURE_MIN_FILTER, - goog.webgl.LINEAR); + goog.webgl.NEAREST); + gl.texParameteri(goog.webgl.TEXTURE_2D, goog.webgl.TEXTURE_WRAP_S, + goog.webgl.CLAMP_TO_EDGE); + gl.texParameteri(goog.webgl.TEXTURE_2D, goog.webgl.TEXTURE_WRAP_T, + goog.webgl.CLAMP_TO_EDGE); this.textureCache_[image.src] = texture; return texture; } diff --git a/src/ol/webgl/tilelayerrenderer.js b/src/ol/webgl/tilelayerrenderer.js index 7458087c53..50929628de 100644 --- a/src/ol/webgl/tilelayerrenderer.js +++ b/src/ol/webgl/tilelayerrenderer.js @@ -270,11 +270,13 @@ ol.webgl.TileLayerRenderer.prototype.redraw = function() { if (goog.isNull(this.arrayBuffer_)) { var arrayBuffer = gl.createBuffer(); gl.bindBuffer(goog.webgl.ARRAY_BUFFER, arrayBuffer); + var textureOffsetX = 0.5 / tileSize.width; + var textureOffsetY = 0.5 / tileSize.height; gl.bufferData(goog.webgl.ARRAY_BUFFER, new Float32Array([ - 0, 0, 0, 1, - 1, 0, 1, 1, - 0, 1, 0, 0, - 1, 1, 1, 0 + 0, 0, 0 + textureOffsetX, 1 + textureOffsetY, + 1, 0, 1 + textureOffsetX, 1 + textureOffsetY, + 0, 1, 0 + textureOffsetX, 0 + textureOffsetY, + 1, 1, 1 + textureOffsetX, 0 + textureOffsetY ]), goog.webgl.STATIC_DRAW); this.arrayBuffer_ = arrayBuffer; } else { From db59dfd5a2f6675e8a03d337358cb23ea1afd6d5 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Tue, 17 Jul 2012 22:56:31 +0200 Subject: [PATCH 199/562] Rename textureCache to tileTextureCache --- src/ol/webgl/map.js | 17 +++++++++-------- src/ol/webgl/tilelayerrenderer.js | 2 +- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/src/ol/webgl/map.js b/src/ol/webgl/map.js index 127e61b0cc..a09a14828f 100644 --- a/src/ol/webgl/map.js +++ b/src/ol/webgl/map.js @@ -128,7 +128,7 @@ ol.webgl.Map = function(target, opt_values) { * @private * @type {Object.} */ - this.textureCache_ = {}; + this.tileTextureCache_ = {}; /** * @private @@ -185,7 +185,7 @@ ol.webgl.Map.prototype.disposeInternal = function() { goog.object.forEach(this.shaderCache_, function(shader) { gl.deleteShader(shader); }); - goog.object.forEach(this.textureCache_, function(texture) { + goog.object.forEach(this.tileTextureCache_, function(texture) { gl.deleteTexture(texture); }); } @@ -256,12 +256,13 @@ ol.webgl.Map.prototype.getShader = function(shaderObject) { /** - * @param {Image} image Image. + * @param {ol.Tile} tile Tile. * @return {WebGLTexture} Texture. */ -ol.webgl.Map.prototype.getTexture = function(image) { - if (image.src in this.textureCache_) { - return this.textureCache_[image.src]; +ol.webgl.Map.prototype.getTileTexture = function(tile) { + var image = tile.getImage(); + if (image.src in this.tileTextureCache_) { + return this.tileTextureCache_[image.src]; } else { var gl = this.getGL(); var texture = gl.createTexture(); @@ -276,7 +277,7 @@ ol.webgl.Map.prototype.getTexture = function(image) { goog.webgl.CLAMP_TO_EDGE); gl.texParameteri(goog.webgl.TEXTURE_2D, goog.webgl.TEXTURE_WRAP_T, goog.webgl.CLAMP_TO_EDGE); - this.textureCache_[image.src] = texture; + this.tileTextureCache_[image.src] = texture; return texture; } }; @@ -361,7 +362,7 @@ ol.webgl.Map.prototype.handleWebGLContextLost = function(event) { event.preventDefault(); this.shaderCache_ = {}; this.programCache_ = {}; - this.textureCache_ = {}; + this.tileTextureCache_ = {}; goog.object.forEach(this.layerRenderers, function(layerRenderer) { layerRenderer.handleWebGLContextLost(); }); diff --git a/src/ol/webgl/tilelayerrenderer.js b/src/ol/webgl/tilelayerrenderer.js index 50929628de..0dcc987a3f 100644 --- a/src/ol/webgl/tilelayerrenderer.js +++ b/src/ol/webgl/tilelayerrenderer.js @@ -305,7 +305,7 @@ ol.webgl.TileLayerRenderer.prototype.redraw = function() { 2 / tileBoundsSize.height, 1); gl.uniformMatrix4fv(this.locations_.uMatrix, false, uMatrix); - gl.bindTexture(goog.webgl.TEXTURE_2D, map.getTexture(tile.getImage())); + gl.bindTexture(goog.webgl.TEXTURE_2D, map.getTileTexture(tile)); gl.activeTexture(goog.webgl.TEXTURE0); gl.drawArrays(goog.webgl.TRIANGLE_STRIP, 0, 4); } else { From fad873d44c4ac739de791e859aa8c2411c6cc98b Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Tue, 17 Jul 2012 23:49:47 +0200 Subject: [PATCH 200/562] Refine getSize in terms of getWidth and getHeight --- src/ol/rectangle.js | 18 +++++++++++++++++- src/ol/tilebounds.js | 16 ++++++++++++---- 2 files changed, 29 insertions(+), 5 deletions(-) diff --git a/src/ol/rectangle.js b/src/ol/rectangle.js index f537b57f70..5c51090971 100644 --- a/src/ol/rectangle.js +++ b/src/ol/rectangle.js @@ -81,9 +81,25 @@ ol.Rectangle.prototype.getCenter = function() { }; +/** + * @return {number} Height. + */ +ol.Rectangle.prototype.getHeight = function() { + return this.maxY - this.minY; +}; + + /** * @return {goog.math.Size} Size. */ ol.Rectangle.prototype.getSize = function() { - return new goog.math.Size(this.maxX - this.minX, this.maxY - this.minY); + return new goog.math.Size(this.getWidth(), this.getHeight()); +}; + + +/** + * @return {number} Width. + */ +ol.Rectangle.prototype.getWidth = function() { + return this.maxX - this.minX; }; diff --git a/src/ol/tilebounds.js b/src/ol/tilebounds.js index 9638de67c9..58e1383064 100644 --- a/src/ol/tilebounds.js +++ b/src/ol/tilebounds.js @@ -76,9 +76,17 @@ ol.TileBounds.prototype.forEachTileCoord = function(z, f, opt_obj) { /** * @override - * @return {goog.math.Size} Size. + * @return {number} Height. */ -ol.TileBounds.prototype.getSize = function() { - return new goog.math.Size( - this.maxX - this.minX + 1, this.maxY - this.minY + 1); +ol.TileBounds.prototype.getHeight = function() { + return this.maxY - this.minY + 1; +}; + + +/** + * @override + * @return {number} Width. + */ +ol.TileBounds.prototype.getWidth = function() { + return this.maxX - this.minX + 1; }; From b93cb7c47af5792944cc3316481a9045c09dfc29 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Wed, 18 Jul 2012 00:06:27 +0200 Subject: [PATCH 201/562] Add ol.Rectangle.normalize --- src/ol/rectangle.js | 11 +++++++++++ src/ol/rectangle_test.js | 27 +++++++++++++++++++++++++++ 2 files changed, 38 insertions(+) diff --git a/src/ol/rectangle.js b/src/ol/rectangle.js index 5c51090971..c1b961d1b7 100644 --- a/src/ol/rectangle.js +++ b/src/ol/rectangle.js @@ -103,3 +103,14 @@ ol.Rectangle.prototype.getSize = function() { ol.Rectangle.prototype.getWidth = function() { return this.maxX - this.minX; }; + + +/** + * @param {goog.math.Coordinate} coordinate Coordinate. + * @return {goog.math.Coordinate} Coordinate. + */ +ol.Rectangle.prototype.normalize = function(coordinate) { + return new goog.math.Coordinate( + (coordinate.x - this.minX) / this.getWidth(), + (coordinate.y - this.minY) / this.getHeight()); +}; diff --git a/src/ol/rectangle_test.js b/src/ol/rectangle_test.js index 3a8c7d4475..56986c68f3 100644 --- a/src/ol/rectangle_test.js +++ b/src/ol/rectangle_test.js @@ -107,3 +107,30 @@ function testSize() { assertEquals(2, size.width); assertEquals(3, size.height); } + + +function testNormalize() { + var rectangle = new ol.Rectangle(0, 1, 2, 3); + var coordinate; + + coordinate = rectangle.normalize(new goog.math.Coordinate(1, 2)); + assertEquals(0.5, coordinate.x); + assertEquals(0.5, coordinate.y); + + coordinate = rectangle.normalize(new goog.math.Coordinate(0, 3)); + assertEquals(0, coordinate.x); + assertEquals(1, coordinate.y); + + coordinate = rectangle.normalize(new goog.math.Coordinate(2, 1)); + assertEquals(1, coordinate.x); + assertEquals(0, coordinate.y); + + coordinate = rectangle.normalize(new goog.math.Coordinate(0, 0)); + assertEquals(0, coordinate.x); + assertEquals(-0.5, coordinate.y); + + coordinate = rectangle.normalize(new goog.math.Coordinate(-1, 1)); + assertEquals(-0.5, coordinate.x); + assertEquals(0, coordinate.y); + +} From 29f149976fef0792d106bc15e88971558f735ce6 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Wed, 18 Jul 2012 00:07:17 +0200 Subject: [PATCH 202/562] Add missing require --- src/ol/webgl/layerrenderer.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/ol/webgl/layerrenderer.js b/src/ol/webgl/layerrenderer.js index 290bf03327..713ba665b2 100644 --- a/src/ol/webgl/layerrenderer.js +++ b/src/ol/webgl/layerrenderer.js @@ -1,5 +1,6 @@ goog.provide('ol.webgl.LayerRenderer'); +goog.require('ol.Layer'); goog.require('ol.LayerRenderer'); From b6db84a54cff3eaa04bf462f823fea9cad60f209 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Wed, 18 Jul 2012 00:07:40 +0200 Subject: [PATCH 203/562] Add ol.webgl.LayerRenderer.getMatrix --- src/ol/webgl/layerrenderer.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/ol/webgl/layerrenderer.js b/src/ol/webgl/layerrenderer.js index 713ba665b2..7e04754c98 100644 --- a/src/ol/webgl/layerrenderer.js +++ b/src/ol/webgl/layerrenderer.js @@ -1,5 +1,6 @@ goog.provide('ol.webgl.LayerRenderer'); +goog.require('goog.vec.Mat4'); goog.require('ol.Layer'); goog.require('ol.LayerRenderer'); @@ -41,6 +42,12 @@ ol.webgl.LayerRenderer.prototype.getMap = function() { }; +/** + * @return {goog.vec.Mat4.AnyType} Matrix. + */ +ol.webgl.LayerRenderer.prototype.getMatrix = goog.abstractMethod; + + /** */ ol.webgl.LayerRenderer.prototype.handleWebGLContextLost = goog.nullFunction; From 7febc1c8b3c5050659ea58f218d328b25fee8e41 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Wed, 18 Jul 2012 00:09:03 +0200 Subject: [PATCH 204/562] Add ol.webgl.TileLayerRenderer.getMatrix --- src/ol/webgl/tilelayerrenderer.js | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/ol/webgl/tilelayerrenderer.js b/src/ol/webgl/tilelayerrenderer.js index 0dcc987a3f..68d26359b4 100644 --- a/src/ol/webgl/tilelayerrenderer.js +++ b/src/ol/webgl/tilelayerrenderer.js @@ -128,6 +128,12 @@ ol.webgl.TileLayerRenderer = function(map, tileLayer) { */ this.tileChangeListenerKeys_ = {}; + /** + * @private + * @type {goog.vec.Mat4.AnyType} + */ + this.matrix_ = goog.vec.Mat4.createFloat32(); + }; goog.inherits(ol.webgl.TileLayerRenderer, ol.webgl.LayerRenderer); @@ -172,6 +178,14 @@ ol.webgl.TileLayerRenderer.prototype.disposeInternal = function() { }; +/** + * @inheritDoc + */ +ol.webgl.TileLayerRenderer.prototype.getMatrix = function() { + return this.matrix_; +}; + + /** */ ol.webgl.TileLayerRenderer.prototype.handleWebGLContextLost = function() { From 854280eb11471d31cc9d0c0e92d74294a42f12f9 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Wed, 18 Jul 2012 00:08:35 +0200 Subject: [PATCH 205/562] Snapshot ol.webgl.Map --- src/ol/webgl/map.js | 74 ++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 69 insertions(+), 5 deletions(-) diff --git a/src/ol/webgl/map.js b/src/ol/webgl/map.js index a09a14828f..b3d9493840 100644 --- a/src/ol/webgl/map.js +++ b/src/ol/webgl/map.js @@ -33,13 +33,13 @@ ol.webgl.map.shader.Fragment = function() { goog.base(this, [ 'precision mediump float;', '', - 'uniform float uAlpha;', + 'uniform float uOpacity;', 'uniform sampler2D uTexture;', '', 'varying vec2 vTexCoord;', '', 'void main(void) {', - ' gl_FragColor = vec4(texture2D(uTexture, vTexCoord).rgb, uAlpha);', + ' gl_FragColor = vec4(texture2D(uTexture, vTexCoord).rgb, uOpacity);', '}' ].join('\n')); }; @@ -59,8 +59,10 @@ ol.webgl.map.shader.Vertex = function() { '', 'varying vec2 vTexCoord;', '', + 'uniform mat4 uMatrix;', + '', 'void main(void) {', - ' gl_Position = vec4(aPosition, 0., 1.);', + ' gl_Position = uMatrix * vec4(aPosition, 0., 1.);', ' vTexCoord = aTexCoord;', '}' ].join('\n')); @@ -112,6 +114,22 @@ ol.webgl.Map = function(target, opt_values) { goog.events.listen(this.canvas_, ol.webgl.WebGLContextEventType.RESTORED, this.handleWebGLContextRestored, false, this); + /** + * @private + * @type {{aPosition: number, + * aTexCoord: number, + * uMatrix: WebGLUniformLocation, + * uOpacity: WebGLUniformLocation, + * uTexture: WebGLUniformLocation}|null} + */ + this.locations_ = null; + + /** + * @private + * @type {WebGLBuffer} + */ + this.arrayBuffer_ = null; + /** * @private * @type {Object.} @@ -360,6 +378,8 @@ ol.webgl.Map.prototype.handleSizeChanged = function() { */ ol.webgl.Map.prototype.handleWebGLContextLost = function(event) { event.preventDefault(); + this.locations_ = null; + this.arrayBuffer_ = null; this.shaderCache_ = {}; this.programCache_ = {}; this.tileTextureCache_ = {}; @@ -399,11 +419,55 @@ ol.webgl.Map.prototype.redrawInternal = function() { } }); - gl.clear(goog.webgl.COLOR_BUFFER_BIT); + var gl = this.getGL(); + gl.bindFramebuffer(goog.webgl.FRAMEBUFFER, null); - gl.useProgram(this.getProgram(this.fragmentShader_, this.vertexShader_)); + gl.clearColor(0, 0, 0, 0); + gl.clear(goog.webgl.COLOR_BUFFER_BIT); + gl.enable(goog.webgl.BLEND); + gl.blendFunc(goog.webgl.SRC_ALPHA, goog.webgl.ONE_MINUS_SRC_ALPHA); + + var program = this.getProgram(this.fragmentShader_, this.vertexShader_); + gl.useProgram(program); + if (goog.isNull(this.locations_)) { + this.locations_ = { + aPosition: gl.getAttribLocation(program, 'aPosition'), + aTexCoord: gl.getAttribLocation(program, 'aTexCoord'), + uMatrix: gl.getUniformLocation(program, 'uMatrix'), + uOpacity: gl.getUniformLocation(program, 'uOpacity'), + uTexture: gl.getUniformLocation(program, 'uTexture') + }; + } + + if (goog.isNull(this.arrayBuffer_)) { + var arrayBuffer = gl.createBuffer(); + gl.bindBuffer(goog.webgl.ARRAY_BUFFER, arrayBuffer); + gl.bufferData(goog.webgl.ARRAY_BUFFER, new Float32Array([ + 0, 0, 0, 0, + 1, 0, 1, 0, + 0, 1, 0, 1, + 1, 1, 1, 1 + ]), goog.webgl.STATIC_DRAW); + this.arrayBuffer_ = arrayBuffer; + } else { + gl.bindBuffer(goog.webgl.ARRAY_BUFFER, this.arrayBuffer_); + } + + gl.enableVertexAttribArray(this.locations_.aPosition); + gl.vertexAttribPointer( + this.locations_.aPosition, 2, goog.webgl.FLOAT, false, 16, 0); + gl.enableVertexAttribArray(this.locations_.aTexCoord); + gl.vertexAttribPointer( + this.locations_.aTexCoord, 2, goog.webgl.FLOAT, false, 16, 8); + gl.uniform1i(this.locations_.uTexture, 0); + this.forEachVisibleLayer(function(layer, layerRenderer) { + gl.uniformMatrix4fv( + this.locations_.uMatrix, false, layerRenderer.getMatrix()); + gl.uniform1f(this.locations_.uOpacity, layer.getOpacity()); gl.bindTexture(goog.webgl.TEXTURE_2D, layerRenderer.getTexture()); + gl.activeTexture(goog.webgl.TEXTURE0); + gl.drawArrays(goog.webgl.TRIANGLE_STRIP, 0, 4); }, this); return animate; From 4ca1fd00c7acd355c47fca28ba625e2442deec24 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Wed, 18 Jul 2012 00:09:31 +0200 Subject: [PATCH 206/562] Suppress compiler warning --- src/ol/webgl/tilelayerrenderer.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/ol/webgl/tilelayerrenderer.js b/src/ol/webgl/tilelayerrenderer.js index 68d26359b4..216d324747 100644 --- a/src/ol/webgl/tilelayerrenderer.js +++ b/src/ol/webgl/tilelayerrenderer.js @@ -214,6 +214,7 @@ ol.webgl.TileLayerRenderer.prototype.redraw = function() { var gl = this.getGL(); var map = this.getMap(); + var center = /** @type {!goog.math.Coordinate} */ map.getCenter(); var extent = /** @type {!ol.Extent} */ map.getExtent(); var resolution = /** @type {number} */ map.getResolution(); From a421943eb1d4c880ad845becd7d5b7fe558a884c Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Wed, 18 Jul 2012 00:09:54 +0200 Subject: [PATCH 207/562] Clear framebuffer before writing tiles --- src/ol/webgl/tilelayerrenderer.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/ol/webgl/tilelayerrenderer.js b/src/ol/webgl/tilelayerrenderer.js index 216d324747..a3407dc4ee 100644 --- a/src/ol/webgl/tilelayerrenderer.js +++ b/src/ol/webgl/tilelayerrenderer.js @@ -269,6 +269,8 @@ ol.webgl.TileLayerRenderer.prototype.redraw = function() { gl.bindFramebuffer(goog.webgl.FRAMEBUFFER, this.framebuffer_); } + gl.clearColor(0, 0, 0, 0); + gl.clear(goog.webgl.COLOR_BUFFER_BIT); gl.disable(goog.webgl.BLEND); var program = map.getProgram(this.fragmentShader_, this.vertexShader_); From 86335211a637dba2dcb082fd98116a556276711f Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Wed, 18 Jul 2012 00:12:22 +0200 Subject: [PATCH 208/562] Always pass base to parseInt --- src/ol/tilecoord.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ol/tilecoord.js b/src/ol/tilecoord.js index 6e00091d6a..d1525ae6a6 100644 --- a/src/ol/tilecoord.js +++ b/src/ol/tilecoord.js @@ -56,7 +56,7 @@ ol.TileCoord.prototype.toString = function() { ol.TileCoord.fromString = function(str) { var v = str.split('/'); v = goog.array.map(v, function(e, i, a) { - return parseInt(e); + return parseInt(e, 10); }); return new ol.TileCoord(v[0], v[1], v[2]); }; From 659ef30802a3bfed06ddea9dfa0ef8196716b9b9 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Wed, 18 Jul 2012 00:21:20 +0200 Subject: [PATCH 209/562] Lift common composite rendering code into ol.Map --- src/ol/dom/map.js | 12 ------------ src/ol/map.js | 11 ++++++++++- src/ol/webgl/map.js | 6 ------ 3 files changed, 10 insertions(+), 19 deletions(-) diff --git a/src/ol/dom/map.js b/src/ol/dom/map.js index 617ff6b163..4ffaad81c8 100644 --- a/src/ol/dom/map.js +++ b/src/ol/dom/map.js @@ -199,15 +199,3 @@ ol.dom.Map.prototype.handleResolutionChanged = function() { ol.dom.Map.prototype.handleSizeChanged = function() { goog.base(this, 'handleSizeChanged'); }; - - -/** - * @inheritDoc - */ -ol.dom.Map.prototype.redrawInternal = function() { - goog.base(this, 'redrawInternal'); - this.forEachVisibleLayer(function(layer, layerRenderer) { - layerRenderer.redraw(); - }, this); - return false; -}; diff --git a/src/ol/map.js b/src/ol/map.js index 76a6163feb..e17a522ebb 100644 --- a/src/ol/map.js +++ b/src/ol/map.js @@ -436,7 +436,16 @@ ol.Map.prototype.redraw = function() { */ ol.Map.prototype.redrawInternal = function() { this.dirty_ = false; - return false; + + var animate = false; + + this.forEachVisibleLayer(function(layer, layerRenderer) { + if (layerRenderer.redraw()) { + animate = true; + } + }); + + return animate; }; diff --git a/src/ol/webgl/map.js b/src/ol/webgl/map.js index b3d9493840..5f3f98d16c 100644 --- a/src/ol/webgl/map.js +++ b/src/ol/webgl/map.js @@ -413,12 +413,6 @@ ol.webgl.Map.prototype.redrawInternal = function() { var animate = goog.base(this, 'redrawInternal'); - this.forEachVisibleLayer(function(layer, layerRenderer) { - if (layerRenderer.redraw()) { - animate = true; - } - }); - var gl = this.getGL(); gl.bindFramebuffer(goog.webgl.FRAMEBUFFER, null); From 0abc4219b3b88e7d9f208944249544cd318f329d Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Wed, 18 Jul 2012 00:35:44 +0200 Subject: [PATCH 210/562] Document various FIXMEs --- src/ol/map.js | 2 +- src/ol/webgl/map.js | 6 ++++++ src/ol/webgl/tilelayerrenderer.js | 2 ++ 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/ol/map.js b/src/ol/map.js index e17a522ebb..7885dcfcce 100644 --- a/src/ol/map.js +++ b/src/ol/map.js @@ -410,6 +410,7 @@ ol.Map.prototype.recalculateExtent_ = function() { var maxX = center.x + resolution * size.width / 2; var maxY = center.y + resolution * size.height / 2; var extent = new ol.Extent(minX, minY, maxX, maxY); + // FIXME check whether this causes an infinite loop! this.set(ol.MapProperty.EXTENT, extent); } }; @@ -509,7 +510,6 @@ ol.Map.prototype.setLayers = function(layers) { * @param {number} resolution Resolution. */ ol.Map.prototype.setResolution = function(resolution) { - // FIXME support discrete resolutions this.set(ol.MapProperty.RESOLUTION, resolution); }; diff --git a/src/ol/webgl/map.js b/src/ol/webgl/map.js index 5f3f98d16c..a8aa461771 100644 --- a/src/ol/webgl/map.js +++ b/src/ol/webgl/map.js @@ -1,3 +1,9 @@ +// FIXME clear tileTextureCache +// FIXME defer texture loads until after redraw when animating +// FIXME generational tile texture garbage collector newFrame/get +// FIXME defer cleanup until post-render +// FIXME check against gl.getParameter(webgl.MAX_TEXTURE_SIZE) + goog.provide('ol.webgl.Map'); goog.provide('ol.webgl.map.shader'); diff --git a/src/ol/webgl/tilelayerrenderer.js b/src/ol/webgl/tilelayerrenderer.js index a3407dc4ee..c9778e6368 100644 --- a/src/ol/webgl/tilelayerrenderer.js +++ b/src/ol/webgl/tilelayerrenderer.js @@ -1,3 +1,5 @@ +// FIXME animated shaders! check in redraw + goog.provide('ol.webgl.TileLayerRenderer'); goog.provide('ol.webgl.tilelayerrenderer.shader'); From cf2bb5a8416e0935fcaf120b00999f94730e5338 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Wed, 18 Jul 2012 00:52:31 +0200 Subject: [PATCH 211/562] Don't use webgl-debug.js for now --- skeleton.html | 1 - 1 file changed, 1 deletion(-) diff --git a/skeleton.html b/skeleton.html index 909dcd97a6..00b534e28a 100644 --- a/skeleton.html +++ b/skeleton.html @@ -12,7 +12,6 @@
- - + diff --git a/skeleton.js b/skeleton.js new file mode 100644 index 0000000000..569fe260a5 --- /dev/null +++ b/skeleton.js @@ -0,0 +1,20 @@ +goog.require('goog.math.Coordinate'); +goog.require('goog.object'); +goog.require('ol.createMap'); +goog.require('ol.tilelayer.createOpenStreetMap'); + + +var target = /** @type {!HTMLDivElement} */ document.getElementById('map'); +var map = ol.createMap(target); + +var layer = ol.tilelayer.createOpenStreetMap({ + 'opacity': 0.5 +}); +map.getLayers().push(layer); + +var resolutions = layer.getStore().getResolutions(); +map.setCenter(new goog.math.Coordinate(0, 0)); +map.setResolution(resolutions[0]); + +goog.exportSymbol('layer', layer); +goog.exportSymbol('map', map); diff --git a/src/all.js b/src/ol/ol.js similarity index 51% rename from src/all.js rename to src/ol/ol.js index 04218cf2fa..debf9c1d63 100644 --- a/src/all.js +++ b/src/ol/ol.js @@ -1,12 +1,17 @@ goog.provide('ol'); goog.require('ol.Array'); +goog.require('ol.ArrayEvent'); +goog.require('ol.ArrayEventType'); goog.require('ol.Extent'); goog.require('ol.Layer'); +goog.require('ol.LayerProperty'); goog.require('ol.LayerRenderer'); goog.require('ol.Map'); +goog.require('ol.MapProperty'); goog.require('ol.Object'); goog.require('ol.Projection'); +goog.require('ol.Rectangle'); goog.require('ol.Store'); goog.require('ol.Tile'); goog.require('ol.TileBounds'); @@ -19,6 +24,17 @@ goog.require('ol.TileUrlFunctionType'); goog.require('ol.TransformFunction'); goog.require('ol.createMap'); goog.require('ol.dom'); +goog.require('ol.dom.LayerRenderer'); goog.require('ol.dom.Map'); +goog.require('ol.dom.TileLayerRenderer'); +goog.require('ol.tilegrid.createOpenStreetMap'); +goog.require('ol.tilelayer.createOpenStreetMap'); +goog.require('ol.tilestore.createOpenStreetMap'); goog.require('ol.webgl'); +goog.require('ol.webgl.LayerRenderer'); goog.require('ol.webgl.Map'); +goog.require('ol.webgl.TileLayerRenderer'); +goog.require('ol.webgl.WebGLContextEventType'); +goog.require('ol.webgl.map.shader'); +goog.require('ol.webgl.shader.Fragment'); +goog.require('ol.webgl.shader.Vertex'); diff --git a/src/ol/tilegrid/openstreetmap.js b/src/ol/tilegrid/openstreetmap.js new file mode 100644 index 0000000000..7e8955c0d6 --- /dev/null +++ b/src/ol/tilegrid/openstreetmap.js @@ -0,0 +1,28 @@ +goog.provide('ol.tilegrid.createOpenStreetMap'); + +goog.require('goog.math.Coordinate'); +goog.require('goog.math.Size'); +goog.require('ol.Projection'); +goog.require('ol.TileGrid'); + + +/** + * @param {number} maxZoom Maximum zoom. + * @return {ol.TileGrid} Tile grid. + */ +ol.tilegrid.createOpenStreetMap = function(maxZoom) { + + var resolutions = new Array(maxZoom + 1); + var z; + for (z = 0; z <= maxZoom; ++z) { + resolutions[z] = ol.Projection.EPSG_3857_HALF_SIZE / (128 << z); + } + + var extent = ol.Projection.EPSG_3857_EXTENT; + var origin = new goog.math.Coordinate( + -ol.Projection.EPSG_3857_HALF_SIZE, ol.Projection.EPSG_3857_HALF_SIZE); + var tileSize = new goog.math.Size(256, 256); + + return new ol.TileGrid(resolutions, extent, origin, tileSize); + +}; diff --git a/src/ol/tilegrid.js b/src/ol/tilegrid/tilegrid.js similarity index 90% rename from src/ol/tilegrid.js rename to src/ol/tilegrid/tilegrid.js index a0b7b88987..3e5f3ca51a 100644 --- a/src/ol/tilegrid.js +++ b/src/ol/tilegrid/tilegrid.js @@ -1,11 +1,10 @@ goog.provide('ol.TileGrid'); -goog.provide('ol.TileGrid.createOpenStreetMap'); goog.require('goog.array'); goog.require('goog.asserts'); +goog.require('goog.math.Coordinate'); goog.require('goog.math.Size'); goog.require('ol.Extent'); -goog.require('ol.Projection'); goog.require('ol.TileBounds'); goog.require('ol.TileCoord'); @@ -72,28 +71,6 @@ ol.TileGrid = function(resolutions, extent, origin, opt_tileSize) { }; -/** - * @param {number} maxZoom Maximum zoom. - * @return {ol.TileGrid} Tile grid. - */ -ol.TileGrid.createOpenStreetMap = function(maxZoom) { - - var resolutions = new Array(maxZoom + 1); - var z; - for (z = 0; z <= maxZoom; ++z) { - resolutions[z] = ol.Projection.EPSG_3857_HALF_SIZE / (128 << z); - } - - var extent = ol.Projection.EPSG_3857_EXTENT; - var origin = new goog.math.Coordinate( - -ol.Projection.EPSG_3857_HALF_SIZE, ol.Projection.EPSG_3857_HALF_SIZE); - var tileSize = new goog.math.Size(256, 256); - - return new ol.TileGrid(resolutions, extent, origin, tileSize); - -}; - - /** * @param {ol.TileCoord} tileCoord Tile coordinate. * @param {function(number, ol.TileBounds): boolean} callback Callback. diff --git a/src/ol/tilegrid_test.js b/src/ol/tilegrid/tilegrid_test.js similarity index 100% rename from src/ol/tilegrid_test.js rename to src/ol/tilegrid/tilegrid_test.js diff --git a/src/ol/tilelayer.js b/src/ol/tilelayer.js index 0552711a5d..c23741155f 100644 --- a/src/ol/tilelayer.js +++ b/src/ol/tilelayer.js @@ -24,13 +24,3 @@ goog.inherits(ol.TileLayer, ol.Layer); ol.TileLayer.prototype.getStore = function() { return /** @type {ol.TileStore} */ goog.base(this, 'getStore'); }; - - -/** - * @param {Object.=} opt_values Values. - * @return {ol.Layer} Layer. - */ -ol.TileLayer.createOpenStreetMap = function(opt_values) { - var store = ol.TileStore.createOpenStreetMap(); - return new ol.TileLayer(store, opt_values); -}; diff --git a/src/ol/tilelayer/openstreetmap.js b/src/ol/tilelayer/openstreetmap.js new file mode 100644 index 0000000000..65c6923b77 --- /dev/null +++ b/src/ol/tilelayer/openstreetmap.js @@ -0,0 +1,15 @@ +goog.provide('ol.tilelayer.createOpenStreetMap'); + +goog.require('ol.Layer'); +goog.require('ol.TileLayer'); +goog.require('ol.tilestore.createOpenStreetMap'); + + +/** + * @param {Object.=} opt_values Values. + * @return {ol.Layer} Layer. + */ +ol.tilelayer.createOpenStreetMap = function(opt_values) { + var store = ol.tilestore.createOpenStreetMap(); + return new ol.TileLayer(store, opt_values); +}; diff --git a/src/ol/tilestore/openstreetmap.js b/src/ol/tilestore/openstreetmap.js new file mode 100644 index 0000000000..fe725bfe1a --- /dev/null +++ b/src/ol/tilestore/openstreetmap.js @@ -0,0 +1,48 @@ +goog.provide('ol.tilestore.createOpenStreetMap'); + +goog.require('goog.math'); +goog.require('ol.Projection'); +goog.require('ol.TileCoord'); +goog.require('ol.TileGrid'); +goog.require('ol.TileStore'); +goog.require('ol.TileUrlFunction'); +goog.require('ol.tilegrid.createOpenStreetMap'); + + +/** + * @return {ol.TileStore} Tile store. + */ +ol.tilestore.createOpenStreetMap = function() { + + var projection = ol.Projection.createFromCode('EPSG:3857'); + var tileGrid = ol.tilegrid.createOpenStreetMap(18); + var tileUrlFunction = ol.TileUrlFunction.withTileCoordTransform( + function(tileCoord) { + var n = 1 << tileCoord.z; + var y = -tileCoord.y - 1; + if (y < 0 || n <= y) { + return null; + } else { + var x = goog.math.modulo(tileCoord.x, n); + return new ol.TileCoord(tileCoord.z, x, y); + } + }, + ol.TileUrlFunction.createFromTemplates([ + 'http://a.tile.openstreetmap.org/{z}/{x}/{y}.png', + 'http://b.tile.openstreetmap.org/{z}/{x}/{y}.png', + 'http://c.tile.openstreetmap.org/{z}/{x}/{y}.png' + ])); + var extent = projection.getExtent(); + var attribution = + '© ' + + 'OpenStreetMap ' + + 'contributors, ' + + 'CC BY-SA'; + var crossOrigin = ''; + + return new ol.TileStore( + projection, tileGrid, tileUrlFunction, extent, attribution, crossOrigin); + +}; + + diff --git a/src/ol/tilestore.js b/src/ol/tilestore/tilestore.js similarity index 63% rename from src/ol/tilestore.js rename to src/ol/tilestore/tilestore.js index ff710cc3a3..0be1f12b76 100644 --- a/src/ol/tilestore.js +++ b/src/ol/tilestore/tilestore.js @@ -1,7 +1,5 @@ goog.provide('ol.TileStore'); -goog.provide('ol.TileStore.createOpenStreetMap'); -goog.require('goog.math'); goog.require('ol.Store'); goog.require('ol.Tile'); goog.require('ol.TileCoord'); @@ -55,43 +53,6 @@ ol.TileStore = function(projection, tileGrid, tileUrlFunction, opt_extent, goog.inherits(ol.TileStore, ol.Store); -/** - * @return {ol.TileStore} Tile store. - */ -ol.TileStore.createOpenStreetMap = function() { - - var projection = ol.Projection.createFromCode('EPSG:3857'); - var tileGrid = ol.TileGrid.createOpenStreetMap(18); - var tileUrlFunction = ol.TileUrlFunction.withTileCoordTransform( - function(tileCoord) { - var n = 1 << tileCoord.z; - var y = -tileCoord.y - 1; - if (y < 0 || n <= y) { - return null; - } else { - var x = goog.math.modulo(tileCoord.x, n); - return new ol.TileCoord(tileCoord.z, x, y); - } - }, - ol.TileUrlFunction.createFromTemplates([ - 'http://a.tile.openstreetmap.org/{z}/{x}/{y}.png', - 'http://b.tile.openstreetmap.org/{z}/{x}/{y}.png', - 'http://c.tile.openstreetmap.org/{z}/{x}/{y}.png' - ])); - var extent = projection.getExtent(); - var attribution = - '© ' + - 'OpenStreetMap ' + - 'contributors, ' + - 'CC BY-SA'; - var crossOrigin = ''; - - return new ol.TileStore( - projection, tileGrid, tileUrlFunction, extent, attribution, crossOrigin); - -}; - - /** * @inheritDoc */ diff --git a/src/ol/tilestore_test.js b/src/ol/tilestore/tilestore_test.js similarity index 90% rename from src/ol/tilestore_test.js rename to src/ol/tilestore/tilestore_test.js index 3e7f2b9a1e..4125f45696 100644 --- a/src/ol/tilestore_test.js +++ b/src/ol/tilestore/tilestore_test.js @@ -1,6 +1,6 @@ goog.require('goog.testing.jsunit'); goog.require('ol.TileCoord'); -goog.require('ol.TileStore.createOpenStreetMap'); +goog.require('ol.tilestore.createOpenStreetMap'); function getTileCoordPart(tileUrl) { @@ -10,7 +10,7 @@ function getTileCoordPart(tileUrl) { function testOpenStreetMap() { - var tileStore = ol.TileStore.createOpenStreetMap(8); + var tileStore = ol.tilestore.createOpenStreetMap(8); var tileGrid = tileStore.getTileGrid(); var coordinate = @@ -43,7 +43,7 @@ function testOpenStreetMap() { function testOpenStreetMapWrapX() { - var tileStore = ol.TileStore.createOpenStreetMap(8); + var tileStore = ol.tilestore.createOpenStreetMap(8); tileUrl = tileStore.getTileCoordUrl(new ol.TileCoord(6, -31, -23)); assertEquals('6/33/22', getTileCoordPart(tileUrl)); @@ -59,7 +59,7 @@ function testOpenStreetMapWrapX() { function testOpenStreetMapCropY() { - var tileStore = ol.TileStore.createOpenStreetMap(8); + var tileStore = ol.tilestore.createOpenStreetMap(8); tileUrl = tileStore.getTileCoordUrl(new ol.TileCoord(6, 33, -87)); assertUndefined(tileUrl); diff --git a/src/ol/webgl/tilelayerrenderer.js b/src/ol/webgl/tilelayerrenderer.js index c9778e6368..2d2b030789 100644 --- a/src/ol/webgl/tilelayerrenderer.js +++ b/src/ol/webgl/tilelayerrenderer.js @@ -1,7 +1,8 @@ // FIXME animated shaders! check in redraw goog.provide('ol.webgl.TileLayerRenderer'); -goog.provide('ol.webgl.tilelayerrenderer.shader'); +goog.provide('ol.webgl.tilelayerrenderer.shader.Fragment'); +goog.provide('ol.webgl.tilelayerrenderer.shader.Vertex'); goog.require('goog.asserts'); goog.require('goog.events.EventType'); From fc603372c2b3d24cc7eb490255b9d21c4b54807e Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Wed, 18 Jul 2012 07:32:40 +0200 Subject: [PATCH 214/562] Add renderer hint --- src/ol/createmap.js | 51 ++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 46 insertions(+), 5 deletions(-) diff --git a/src/ol/createmap.js b/src/ol/createmap.js index 01d1efbf1b..42b32e40c9 100644 --- a/src/ol/createmap.js +++ b/src/ol/createmap.js @@ -1,3 +1,4 @@ +goog.provide('ol.RendererHint'); goog.provide('ol.createMap'); goog.require('goog.object'); @@ -29,12 +30,32 @@ ol.ENABLE_DOM = true; ol.ENABLE_WEBGL = true; +/** + * @enum {string} + */ +ol.RendererHint = { + DOM: 'dom', + WEBGL: 'webgl' +}; + + +/** + * @type {Array.}} + */ +ol.DEFAULT_RENDERER_HINT = [ + ol.RendererHint.WEBGL, + ol.RendererHint.DOM +]; + + /** * @param {!HTMLDivElement} target Target. * @param {Object.=} opt_values Values. + * @param {ol.RendererHint|Array.=} opt_rendererHints + * Renderer hints. * @return {ol.Map} Map. */ -ol.createMap = function(target, opt_values) { +ol.createMap = function(target, opt_values, opt_rendererHints) { var values = {}; if (goog.isDef(opt_values)) { @@ -50,12 +71,32 @@ ol.createMap = function(target, opt_values) { ol.Projection.createFromCode(ol.DEFAULT_PROJECTION_CODE); } - if (ol.ENABLE_WEBGL && ol.webgl.isSupported()) { - return new ol.webgl.Map(target, values); + /** + * @type {Array.} + */ + var rendererHints; + if (goog.isDef(opt_rendererHints)) { + if (goog.isArray(opt_rendererHints)) { + rendererHints = opt_rendererHints; + } else { + rendererHints = [opt_rendererHints]; + } + } else { + rendererHints = ol.DEFAULT_RENDERER_HINT; } - if (ol.ENABLE_DOM && ol.dom.isSupported()) { - return new ol.dom.Map(target, values); + var i, rendererHint; + for (i = 0; i < rendererHints.length; ++i) { + rendererHint = rendererHints[i]; + if (rendererHint == ol.RendererHint.DOM) { + if (ol.ENABLE_DOM && ol.dom.isSupported()) { + return new ol.dom.Map(target, values); + } + } else if (rendererHint == ol.RendererHint.WEBGL) { + if (ol.ENABLE_WEBGL && ol.webgl.isSupported()) { + return new ol.webgl.Map(target, values); + } + } } return null; From 88721ce2307b18059e14ad8fae22e2fced2764d1 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Wed, 18 Jul 2012 07:33:11 +0200 Subject: [PATCH 215/562] Use DOM renderer by default --- skeleton.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/skeleton.js b/skeleton.js index 569fe260a5..f3c1aab91a 100644 --- a/skeleton.js +++ b/skeleton.js @@ -1,11 +1,12 @@ goog.require('goog.math.Coordinate'); goog.require('goog.object'); +goog.require('ol.RendererHint'); goog.require('ol.createMap'); goog.require('ol.tilelayer.createOpenStreetMap'); var target = /** @type {!HTMLDivElement} */ document.getElementById('map'); -var map = ol.createMap(target); +var map = ol.createMap(target, undefined, ol.RendererHint.DOM); var layer = ol.tilelayer.createOpenStreetMap({ 'opacity': 0.5 From bffc5862189ab44711cb6056bb6065a4b7ff3642 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Wed, 18 Jul 2012 07:33:38 +0200 Subject: [PATCH 216/562] Rename ol.Map.setExtent to fitExtent --- src/ol/map.js | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/src/ol/map.js b/src/ol/map.js index 7885dcfcce..b2fb5829dd 100644 --- a/src/ol/map.js +++ b/src/ol/map.js @@ -150,6 +150,17 @@ ol.Map.prototype.disposeInternal = function() { }; +/** + * @param {ol.Extent} extent Extent. + */ +ol.Map.prototype.fitExtent = function(extent) { + this.whileFrozen(function() { + this.setCenter(extent.getCenter()); + this.setResolution(this.getResolutionForExtent(extent)); + }, this); +}; + + /** * @param {function(this: T, ol.Layer, ol.LayerRenderer, number)} f Function. * @param {T=} opt_obj Object. @@ -410,7 +421,6 @@ ol.Map.prototype.recalculateExtent_ = function() { var maxX = center.x + resolution * size.width / 2; var maxY = center.y + resolution * size.height / 2; var extent = new ol.Extent(minX, minY, maxX, maxY); - // FIXME check whether this causes an infinite loop! this.set(ol.MapProperty.EXTENT, extent); } }; @@ -475,17 +485,6 @@ ol.Map.prototype.setCenter = function(center) { }; -/** - * @param {ol.Extent} extent Extent. - */ -ol.Map.prototype.setExtent = function(extent) { - this.whileFrozen(function() { - this.setCenter(extent.getCenter()); - this.setResolution(this.getResolutionForExtent(extent)); - }, this); -}; - - /** * @param {ol.Layer} layer Layer. * @param {ol.LayerRenderer} layerRenderer Layer renderer. From 40c767c3309eb64e5a7159114bba52f4acd70cfa Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Wed, 18 Jul 2012 09:01:12 +0200 Subject: [PATCH 217/562] Remove main.json (replaced with ol.json) --- main.json | 48 ------------------------------------------------ 1 file changed, 48 deletions(-) delete mode 100644 main.json diff --git a/main.json b/main.json deleted file mode 100644 index 34174c46bc..0000000000 --- a/main.json +++ /dev/null @@ -1,48 +0,0 @@ -{ - "id": "ol", - - "inputs": [ - "src/all.js" - ], - "paths": [ - "src" - ], - - "define": { - // "goog.dom.ASSUME_STANDARDS_MODE": true, - // "ol.ENABLE_DOM": false, - // "ol.ENABLE_WEBGL": false, - "goog.DEBUG": false - }, - - "externs": [ - "externs/geojson.js", - "externs/webgl-debug.js" - ], - - "mode": "ADVANCED", - "level": "VERBOSE", - // "pretty-print": true, - // "debug": true, - - // "experimental-compiler-options": { - // "generateExports": true - // }, - - "checks": { - // acceptable values are "ERROR", "WARNING", and "OFF" - "accessControls": "ERROR", - "visibility": "ERROR", - "checkTypes": "ERROR", - "checkRegExp": "ERROR", - "checkVars": "ERROR", - "deprecated": "ERROR", - "fileoverviewTags": "ERROR", - "invalidCasts": "ERROR", - "missingProperties": "ERROR", - "nonStandardJsDocs": "ERROR", - "undefinedVars": "ERROR" - }, - - "jsdoc-html-output-path": "jsdoc" -} From be97a57cad577017355a8fbe7a394540ee95df76 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Lemoine?= Date: Wed, 18 Jul 2012 11:12:14 +0200 Subject: [PATCH 218/562] remove state variables from the dom map and dom layer renderers --- src/ol/dom/layerrenderer.js | 19 --------- src/ol/dom/map.js | 82 ++++++------------------------------- 2 files changed, 13 insertions(+), 88 deletions(-) diff --git a/src/ol/dom/layerrenderer.js b/src/ol/dom/layerrenderer.js index c2a368206a..eee5021d6f 100644 --- a/src/ol/dom/layerrenderer.js +++ b/src/ol/dom/layerrenderer.js @@ -19,15 +19,6 @@ ol.dom.LayerRenderer = function(map, layer, target) { * @protected */ this.target = target; - - /** - * Location of the top-left corner of the renderer container in map coords. - * - * @type {goog.math.Coordinate} - * @protected - */ - this.containerOrigin = null; - }; goog.inherits(ol.dom.LayerRenderer, ol.LayerRenderer); @@ -41,16 +32,6 @@ ol.dom.LayerRenderer.prototype.getMap = function() { }; -/** - * Set the location of the top-left corner of the renderer container. - * - * @param {goog.math.Coordinate} origin The container origin. - */ -ol.dom.LayerRenderer.prototype.setContainerOrigin = function(origin) { - this.containerOrigin = origin; -}; - - /** */ ol.dom.LayerRenderer.prototype.redraw = goog.abstractMethod; diff --git a/src/ol/dom/map.js b/src/ol/dom/map.js index 4ffaad81c8..d12d84034c 100644 --- a/src/ol/dom/map.js +++ b/src/ol/dom/map.js @@ -28,36 +28,6 @@ ol.dom.Map = function(target, opt_values) { this.layersPane_.className = 'ol-renderer-dom'; target.appendChild(this.layersPane_); - /** - * The current top left corner location of the layersPane element - * (map coords). - * - * @type {goog.math.Coordinate} - * @private - */ - this.layersPaneOrigin_ = null; - - /** - * The pixel offset of the layersPane element with respect to its - * container. - * - * @type {goog.math.Coordinate} - * @private - */ - this.layersPaneOffset_ = null; - - /** - * @type {goog.math.Coordinate|undefined} - * @private - */ - this.renderedCenter_ = undefined; - - /** - * @type {number|undefined} - * @private - */ - this.renderedResolution_ = undefined; - /** * @type {Object} * @private @@ -79,30 +49,8 @@ goog.inherits(ol.dom.Map, ol.Map); * @private */ ol.dom.Map.prototype.resetLayersPane_ = function() { - this.layersPaneOrigin_ = this.getOrigin_(); - goog.object.forEach(this.layerRenderers, function(layerRenderer) { - layerRenderer.setContainerOrigin(this.layersPaneOrigin_); - }); var offset = new goog.math.Coordinate(0, 0); goog.style.setPosition(this.layersPane_, offset); - this.renderedCenter_ = this.getCenter(); -}; - - -/** - * Get the position of the top-left corner of the layers pane. - * @private - * @return {goog.math.Coordinate} Origin. - */ -ol.dom.Map.prototype.getOrigin_ = function() { - var center = this.getCenter(); - var resolution = this.getResolution(); - var targetSize = this.getSize(); - var targetWidth = targetSize.width; - var targetHeight = targetSize.height; - return new goog.math.Coordinate( - center.x - resolution * targetWidth / 2, - center.y + resolution * targetHeight / 2); }; @@ -111,17 +59,17 @@ ol.dom.Map.prototype.getOrigin_ = function() { * @private */ ol.dom.Map.prototype.shiftLayersPane_ = function() { - var center = this.getCenter(); - var oldCenter = this.renderedCenter_; - var resolution = this.getResolution(); - var dx = Math.round((oldCenter.x - center.x) / resolution); - var dy = Math.round((center.y - oldCenter.y) / resolution); - if (!(dx === 0 && dy === 0)) { - var offset = this.layersPaneOffset_; - offset.x += Math.round((oldCenter.x - center.x) / resolution); - offset.y += Math.round((center.y - oldCenter.y) / resolution); - goog.style.setPosition(this.layersPane_, offset); - } + //var center = this.getCenter(); + //var oldCenter = this.renderedCenter_; + //var resolution = this.getResolution(); + //var dx = Math.round((oldCenter.x - center.x) / resolution); + //var dy = Math.round((center.y - oldCenter.y) / resolution); + //if (!(dx === 0 && dy === 0)) { + //var offset = this.layersPaneOffset_; + //offset.x += Math.round((oldCenter.x - center.x) / resolution); + //offset.y += Math.round((center.y - oldCenter.y) / resolution); + //goog.style.setPosition(this.layersPane_, offset); + //} }; @@ -142,7 +90,6 @@ ol.dom.Map.prototype.createLayerRenderer = function(layer) { this.layersPane_.appendChild(layerPane); var layerRenderer = new ol.dom.TileLayerRenderer(this, layer, layerPane); - layerRenderer.setContainerOrigin(this.layersPaneOrigin_); this.layerPanes_[goog.getUid(layerRenderer)] = layerPane; @@ -185,11 +132,8 @@ ol.dom.Map.prototype.handleLayerRemove = function(layer) { */ ol.dom.Map.prototype.handleResolutionChanged = function() { goog.base(this, 'handleResolutionChanged'); - var resolution = this.getResolution(); - if (resolution != this.renderedResolution_) { - this.resetLayersPane_(); - this.redraw(); - } + this.resetLayersPane_(); + this.redraw(); }; From f491a5a4d28b2985fe174381a375b746a7b0791d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Lemoine?= Date: Wed, 18 Jul 2012 11:12:46 +0200 Subject: [PATCH 219/562] setting top and left to 0 is not necessary --- src/ol/dom/map.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/ol/dom/map.js b/src/ol/dom/map.js index d12d84034c..f0a117707f 100644 --- a/src/ol/dom/map.js +++ b/src/ol/dom/map.js @@ -85,8 +85,6 @@ ol.dom.Map.prototype.createLayerRenderer = function(layer) { layerPane.style.position = 'absolute'; layerPane.style.width = '100%'; layerPane.style.height = '100%'; - layerPane.style.top = 0 + 'px'; - layerPane.style.left = 0 + 'px'; this.layersPane_.appendChild(layerPane); var layerRenderer = new ol.dom.TileLayerRenderer(this, layer, layerPane); From db4603940d8ac7e6abd47b1dac3c9c35d26fc2b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Lemoine?= Date: Wed, 18 Jul 2012 11:13:32 +0200 Subject: [PATCH 220/562] dom renderer - reset the layers pane when center changes --- src/ol/dom/map.js | 3 ++- src/ol/dom/tilelayerrenderer.js | 8 ++++++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/ol/dom/map.js b/src/ol/dom/map.js index f0a117707f..13cf0a6148 100644 --- a/src/ol/dom/map.js +++ b/src/ol/dom/map.js @@ -105,7 +105,8 @@ ol.dom.Map.prototype.createLayerRenderer = function(layer) { */ ol.dom.Map.prototype.handleCenterChanged = function() { goog.base(this, 'handleCenterChanged'); - //this.shiftLayersPane_(); + this.resetLayersPane_(); + this.redraw(); }; diff --git a/src/ol/dom/tilelayerrenderer.js b/src/ol/dom/tilelayerrenderer.js index 455f91af71..7c8c11030a 100644 --- a/src/ol/dom/tilelayerrenderer.js +++ b/src/ol/dom/tilelayerrenderer.js @@ -29,8 +29,12 @@ goog.inherits(ol.dom.TileLayerRenderer, ol.dom.LayerRenderer); ol.dom.TileLayerRenderer.prototype.redraw = function() { var map = this.getMap(); - var extent = /** @type {ol.Extent} */ (map.getExtent()); - var resolution = /** @type {number} */ (map.getResolution()); + var extent = map.getExtent(); + var resolution = map.getResolution(); + + if (!goog.isDef(extent) || !goog.isDef(resolution)) { + return; + } var tileLayer = /** @type {ol.TileLayer} */ (this.getLayer()); var tileStore = tileLayer.getStore(); From da6263fec8ba8edbfe160a786840189da5f41fdf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Lemoine?= Date: Wed, 18 Jul 2012 14:43:16 +0200 Subject: [PATCH 221/562] dom layer renderer - origin and setOrigin are back --- src/ol/dom/layerrenderer.js | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/ol/dom/layerrenderer.js b/src/ol/dom/layerrenderer.js index eee5021d6f..2f7c89b6eb 100644 --- a/src/ol/dom/layerrenderer.js +++ b/src/ol/dom/layerrenderer.js @@ -19,6 +19,15 @@ ol.dom.LayerRenderer = function(map, layer, target) { * @protected */ this.target = target; + + /** + * Top left corner of the target in map coords. + * + * @type {goog.math.Coordinate} + * @protected + */ + this.origin = null; + }; goog.inherits(ol.dom.LayerRenderer, ol.LayerRenderer); @@ -31,6 +40,15 @@ ol.dom.LayerRenderer.prototype.getMap = function() { return /** @type {ol.dom.Map} */ (goog.base(this, 'getMap')); }; +/** + * Set the location of the top left corner of the target. + * + * @param {goog.math.Coordinate} origin Origin. + */ +ol.dom.LayerRenderer.prototype.setOrigin = function(origin) { + this.origin = origin; +}; + /** */ From 1d565fc4d6dc15f65a5d847baa577b4cd46a955d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Lemoine?= Date: Wed, 18 Jul 2012 14:43:57 +0200 Subject: [PATCH 222/562] dom map renderer - use goog.asserts --- src/ol/dom/map.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/ol/dom/map.js b/src/ol/dom/map.js index 13cf0a6148..5f46562050 100644 --- a/src/ol/dom/map.js +++ b/src/ol/dom/map.js @@ -1,5 +1,6 @@ goog.provide('ol.dom.Map'); +goog.require('goog.asserts'); goog.require('goog.dom'); goog.require('goog.dom.TagName'); goog.require('goog.math.Coordinate'); From 808a854d0fa93b943b38e01d7d3b7e53de3c8a5d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Lemoine?= Date: Wed, 18 Jul 2012 14:47:41 +0200 Subject: [PATCH 223/562] dom map renderer - add a viewport div to the top of hierarchy, this is to handle overflow of tiles --- src/ol/dom/map.js | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/src/ol/dom/map.js b/src/ol/dom/map.js index 5f46562050..c1b3ad1368 100644 --- a/src/ol/dom/map.js +++ b/src/ol/dom/map.js @@ -21,13 +21,25 @@ ol.dom.Map = function(target, opt_values) { goog.base(this, target); /** - * @type {Element} + * @type {!Element} + * @private + */ + this.viewport_ = goog.dom.createElement(goog.dom.TagName.DIV); + this.viewport_.className = 'ol-viewport'; + this.viewport_.style.position = 'relative'; + this.viewport_.style.overflow = 'hidden'; + this.viewport_.style.width = '100%'; + this.viewport_.style.height = '100%'; + target.appendChild(this.viewport_); + + /** + * @type {!Element} * @private */ this.layersPane_ = goog.dom.createElement(goog.dom.TagName.DIV); + this.layersPane_.className = 'ol-layers-pane'; this.layersPane_.style.position = 'absolute'; - this.layersPane_.className = 'ol-renderer-dom'; - target.appendChild(this.layersPane_); + this.viewport_.appendChild(this.layersPane_); /** * @type {Object} From 6d61ac2bc5eee5660dbe3da924624e2f537bd2ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Lemoine?= Date: Wed, 18 Jul 2012 14:49:30 +0200 Subject: [PATCH 224/562] dom map renderer - map shiftLayersPane_ work --- src/ol/dom/map.js | 67 +++++++++++++++++++++++++++------ src/ol/dom/tilelayerrenderer.js | 4 +- 2 files changed, 57 insertions(+), 14 deletions(-) diff --git a/src/ol/dom/map.js b/src/ol/dom/map.js index c1b3ad1368..c11c0cc0ea 100644 --- a/src/ol/dom/map.js +++ b/src/ol/dom/map.js @@ -47,6 +47,20 @@ ol.dom.Map = function(target, opt_values) { */ this.layerPanes_ = {}; + /** + * @type {goog.math.Coordinate|undefined} + * @private + */ + this.renderedCenter_ = undefined; + + /** + * The pixel offset of the layers pane with respect to its container. + * + * @type {goog.math.Coordinate} + * @private + */ + this.layersPaneOffset_ = null; + if (goog.isDef(opt_values)) { this.setValues(opt_values); } @@ -64,6 +78,30 @@ goog.inherits(ol.dom.Map, ol.Map); ol.dom.Map.prototype.resetLayersPane_ = function() { var offset = new goog.math.Coordinate(0, 0); goog.style.setPosition(this.layersPane_, offset); + + this.layersPaneOffset_ = offset; + this.renderedCenter_ = this.getCenter(); + + this.setOrigin_(); +}; + + +/** + * Set the origin for each layer renderer. + * @private + */ +ol.dom.Map.prototype.setOrigin_ = function() { + var center = this.getCenter(); + var resolution = this.getResolution(); + var targetSize = this.getSize(); + var targetWidth = targetSize.width; + var targetHeight = targetSize.height; + var origin = new goog.math.Coordinate( + center.x - resolution * targetWidth / 2, + center.y + resolution * targetHeight / 2); + goog.object.forEach(this.layerRenderers, function(layerRenderer) { + layerRenderer.setOrigin(origin); + }); }; @@ -72,17 +110,18 @@ ol.dom.Map.prototype.resetLayersPane_ = function() { * @private */ ol.dom.Map.prototype.shiftLayersPane_ = function() { - //var center = this.getCenter(); - //var oldCenter = this.renderedCenter_; - //var resolution = this.getResolution(); - //var dx = Math.round((oldCenter.x - center.x) / resolution); - //var dy = Math.round((center.y - oldCenter.y) / resolution); - //if (!(dx === 0 && dy === 0)) { - //var offset = this.layersPaneOffset_; - //offset.x += Math.round((oldCenter.x - center.x) / resolution); - //offset.y += Math.round((center.y - oldCenter.y) / resolution); - //goog.style.setPosition(this.layersPane_, offset); - //} + var center = this.getCenter(); + var oldCenter = this.renderedCenter_; + var resolution = this.getResolution(); + var dx = Math.round((oldCenter.x - center.x) / resolution); + var dy = Math.round((center.y - oldCenter.y) / resolution); + if (!(dx === 0 && dy === 0)) { + var offset = this.layersPaneOffset_; + offset.x += Math.round((oldCenter.x - center.x) / resolution); + offset.y += Math.round((center.y - oldCenter.y) / resolution); + goog.style.setPosition(this.layersPane_, offset); + this.renderedCenter_ = center; + } }; @@ -118,7 +157,11 @@ ol.dom.Map.prototype.createLayerRenderer = function(layer) { */ ol.dom.Map.prototype.handleCenterChanged = function() { goog.base(this, 'handleCenterChanged'); - this.resetLayersPane_(); + if (goog.isDef(this.renderedCenter_)) { + this.shiftLayersPane_(); + } else { + this.resetLayersPane_(); + } this.redraw(); }; diff --git a/src/ol/dom/tilelayerrenderer.js b/src/ol/dom/tilelayerrenderer.js index 7c8c11030a..5b7b6436f9 100644 --- a/src/ol/dom/tilelayerrenderer.js +++ b/src/ol/dom/tilelayerrenderer.js @@ -104,8 +104,8 @@ ol.dom.TileLayerRenderer.prototype.getTilesMapOffset_ = function( var tileCoordExtent = tileGrid.getTileCoordExtent(tileCoord); var offset = new goog.math.Coordinate( - Math.round((extent.minX - tileCoordExtent.minX) / resolution), - Math.round((tileCoordExtent.maxY - extent.maxY) / resolution)); + Math.round((this.origin.x - tileCoordExtent.minX) / resolution), + Math.round((tileCoordExtent.maxY - this.origin.y) / resolution)); return offset; }; From a9438fefd9f639eb379e41cde275b090139b807b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Lemoine?= Date: Wed, 18 Jul 2012 14:50:01 +0200 Subject: [PATCH 225/562] make gjslint happy --- src/ol/dom/layerrenderer.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/ol/dom/layerrenderer.js b/src/ol/dom/layerrenderer.js index 2f7c89b6eb..c704636cc1 100644 --- a/src/ol/dom/layerrenderer.js +++ b/src/ol/dom/layerrenderer.js @@ -40,6 +40,7 @@ ol.dom.LayerRenderer.prototype.getMap = function() { return /** @type {ol.dom.Map} */ (goog.base(this, 'getMap')); }; + /** * Set the location of the top left corner of the target. * From 3724fca57dc3f7cff70d075d4a388f4b56ae7255 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Lemoine?= Date: Wed, 18 Jul 2012 14:50:34 +0200 Subject: [PATCH 226/562] dom map renderer - new properties for layerPane --- src/ol/dom/map.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/ol/dom/map.js b/src/ol/dom/map.js index c11c0cc0ea..dd3484ee90 100644 --- a/src/ol/dom/map.js +++ b/src/ol/dom/map.js @@ -133,10 +133,8 @@ ol.dom.Map.prototype.createLayerRenderer = function(layer) { if (layer instanceof ol.TileLayer) { var layerPane = goog.dom.createElement(goog.dom.TagName.DIV); - layerPane.className = 'ol-renderer-dom-layer'; + layerPane.className = 'ol-layer'; layerPane.style.position = 'absolute'; - layerPane.style.width = '100%'; - layerPane.style.height = '100%'; this.layersPane_.appendChild(layerPane); var layerRenderer = new ol.dom.TileLayerRenderer(this, layer, layerPane); From 1af79ede29dd3761bb3539490d5a73918f03a26a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Lemoine?= Date: Wed, 18 Jul 2012 14:52:12 +0200 Subject: [PATCH 227/562] dom map renderer - add FIXMEs --- src/ol/dom/map.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/ol/dom/map.js b/src/ol/dom/map.js index dd3484ee90..91e9c451e3 100644 --- a/src/ol/dom/map.js +++ b/src/ol/dom/map.js @@ -155,6 +155,8 @@ ol.dom.Map.prototype.createLayerRenderer = function(layer) { */ ol.dom.Map.prototype.handleCenterChanged = function() { goog.base(this, 'handleCenterChanged'); + // FIXME: shiftLayersPane_ and resetLayersPane_ should be called + // elsewhere as we may be frozen here if (goog.isDef(this.renderedCenter_)) { this.shiftLayersPane_(); } else { @@ -185,6 +187,8 @@ ol.dom.Map.prototype.handleLayerRemove = function(layer) { */ ol.dom.Map.prototype.handleResolutionChanged = function() { goog.base(this, 'handleResolutionChanged'); + // FIXME: resetLayersPane_ should be called + // elsewhere as we may be frozen here this.resetLayersPane_(); this.redraw(); }; From c6343ed2bcac06987592b0ac64c449e02f3478d9 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Wed, 18 Jul 2012 13:32:22 +0200 Subject: [PATCH 228/562] Add experimental controls infrastructure, thanks @elemoine --- src/ol/control/Attribution.js | 103 ---------------------------- src/ol/control/Control.js | 85 ----------------------- src/ol/control/Navigation.js | 71 ------------------- src/ol/control/Zoom.js | 122 --------------------------------- src/ol/control/control.js | 17 +++++ src/ol/control/dblclickzoom.js | 34 +++++++++ src/ol/createmap.js | 7 ++ src/ol/map.js | 59 ++++++++++++++++ src/ol/mapbrowserevent.js | 59 ++++++++++++++++ src/ol/mapevent.js | 35 ++++++++++ src/ol/ol.js | 3 + 11 files changed, 214 insertions(+), 381 deletions(-) delete mode 100644 src/ol/control/Attribution.js delete mode 100644 src/ol/control/Control.js delete mode 100644 src/ol/control/Navigation.js delete mode 100644 src/ol/control/Zoom.js create mode 100644 src/ol/control/control.js create mode 100644 src/ol/control/dblclickzoom.js create mode 100644 src/ol/mapbrowserevent.js create mode 100644 src/ol/mapevent.js diff --git a/src/ol/control/Attribution.js b/src/ol/control/Attribution.js deleted file mode 100644 index 0c03182366..0000000000 --- a/src/ol/control/Attribution.js +++ /dev/null @@ -1,103 +0,0 @@ -goog.provide('ol.control.Attribution'); - -goog.require('ol.event'); -goog.require('ol.control.Control'); - -goog.require('goog.dom'); - - -/** - * @constructor - * @extends {ol.control.Control} - * @param {boolean|undefined} opt_autoActivate - */ -ol.control.Attribution = function(opt_autoActivate) { - - goog.base(this, opt_autoActivate); - - /** - * @type {Node} - */ - this.container_ = null; - - /** - * Activate this control when it is added to a map. Default is true. - * - * @type {boolean} autoActivate - */ - this.autoActivate_ = - goog.isDef(opt_autoActivate) ? opt_autoActivate : true; - -}; -goog.inherits(ol.control.Attribution, ol.control.Control); - -/** - * @const {string} - */ -ol.control.Attribution.prototype.CLS = 'ol-control-attribution'; - -/** - * @param {ol.Map} map - */ -ol.control.Attribution.prototype.setMap = function(map) { - var staticOverlay = map.getStaticOverlay(); - if (goog.isNull(this.container_)) { - this.container_ = goog.dom.createDom('div', this.CLS); - // This is not registered as priority listener, so priority listeners - // can still get the click event. - map.getEvents().register('click', this.stopLinkClick, this); - } - if (!goog.isNull(staticOverlay)) { - goog.dom.append(staticOverlay, this.container_); - } - goog.base(this, 'setMap', map); -}; - -/** - * Prevent clicks on links in the attribution from getting through to - * listeners. - */ -ol.control.Attribution.prototype.stopLinkClick = function(evt) { - var node = evt.target; - return node.nodeName !== 'A' || - !goog.dom.getAncestorByClass(node, this.CLS); -}; - -/** @inheritDoc */ -ol.control.Attribution.prototype.activate = function() { - var active = goog.base(this, 'activate'); - if (active) { - this.map_.getEvents().register('layeradd', this.update, this); - this.update(); - } - return active; -}; - -/** @inheritDoc */ -ol.control.Attribution.prototype.deactivate = function() { - var inactive = goog.base(this, 'deactivate'); - if (inactive) { - this.map_.getEvents().unregister('layeradd', this.update, this); - } - return inactive; -}; - -ol.control.Attribution.prototype.update = function() { - var attribution = [], - layers = this.map_.getLayers(), layerAttribution; - for (var i=0, ii=layers.length; i} */ controls.getArray(); + goog.array.every(controlsArray, function(control) { + control.handleMapBrowserEvent(mapBrowserEvent); + return !mapBrowserEvent.defaultPrevented; + }); +}; + + /** * @protected */ @@ -485,6 +536,14 @@ ol.Map.prototype.setCenter = function(center) { }; +/** + * @param {ol.Array} controls Controls. + */ +ol.Map.prototype.setControls = function(controls) { + this.set(ol.MapProperty.CONTROLS, controls); +}; + + /** * @param {ol.Layer} layer Layer. * @param {ol.LayerRenderer} layerRenderer Layer renderer. diff --git a/src/ol/mapbrowserevent.js b/src/ol/mapbrowserevent.js new file mode 100644 index 0000000000..c78a4c0844 --- /dev/null +++ b/src/ol/mapbrowserevent.js @@ -0,0 +1,59 @@ +goog.provide('ol.MapBrowserEvent'); + +goog.require('goog.events.BrowserEvent'); +goog.require('goog.math.Coordinate'); +goog.require('ol.MapEvent'); + + + +/** + * @constructor + * @extends {ol.MapEvent} + * @param {string} type Event type. + * @param {ol.Map} map Map. + * @param {goog.events.BrowserEvent} browserEventObject Browser event object. + */ +ol.MapBrowserEvent = function(type, map, browserEventObject) { + + goog.base(this, type, map); + + /** + * @private + * @type {goog.events.BrowserEvent} + */ + this.browserEventObject_ = browserEventObject; + +}; +goog.inherits(ol.MapBrowserEvent, ol.MapEvent); + + +/** + * @private + * @type {goog.math.Coordinate} + */ +ol.MapBrowserEvent.prototype.coordinate_; + + +/** + * @return {goog.math.Coordinate} Coordinate. + */ +ol.MapBrowserEvent.prototype.getCoordinate = function() { + if (goog.isDef(this.coordinate_)) { + return this.coordinate_; + } else { + var browserEventObject = this.getBrowserEventObject(); + var pixel = new goog.math.Coordinate( + browserEventObject.offsetX, browserEventObject.offsetY); + var coordinate = this.map.getCoordinateFromPixel(pixel); + this.coordinate_ = coordinate; + return coordinate; + } +}; + + +/** + * @return {goog.events.BrowserEvent} Browser event object. + */ +ol.MapBrowserEvent.prototype.getBrowserEventObject = function() { + return this.browserEventObject_; +}; diff --git a/src/ol/mapevent.js b/src/ol/mapevent.js new file mode 100644 index 0000000000..1afc7c7afa --- /dev/null +++ b/src/ol/mapevent.js @@ -0,0 +1,35 @@ +goog.provide('ol.MapEvent'); + +goog.require('goog.events.Event'); + + + +/** + * @constructor + * @extends {goog.events.Event} + * @param {string} type Event type. + * @param {ol.Map} map Map. + */ +ol.MapEvent = function(type, map) { + + goog.base(this, type); + + /** + * @type {ol.Map} + */ + this.map = map; + + /** + * @type {boolean} + */ + this.defaultPrevented = false; + +}; +goog.inherits(ol.MapEvent, goog.events.Event); + + +/** + */ +ol.MapEvent.prototype.preventDefault = function() { + this.defaultPrevented = true; +}; diff --git a/src/ol/ol.js b/src/ol/ol.js index debf9c1d63..33e09481ce 100644 --- a/src/ol/ol.js +++ b/src/ol/ol.js @@ -3,11 +3,13 @@ goog.provide('ol'); goog.require('ol.Array'); goog.require('ol.ArrayEvent'); goog.require('ol.ArrayEventType'); +goog.require('ol.Control'); goog.require('ol.Extent'); goog.require('ol.Layer'); goog.require('ol.LayerProperty'); goog.require('ol.LayerRenderer'); goog.require('ol.Map'); +goog.require('ol.MapBrowserEvent'); goog.require('ol.MapProperty'); goog.require('ol.Object'); goog.require('ol.Projection'); @@ -22,6 +24,7 @@ goog.require('ol.TileStore'); goog.require('ol.TileUrlFunction'); goog.require('ol.TileUrlFunctionType'); goog.require('ol.TransformFunction'); +goog.require('ol.control.DblClickZoom'); goog.require('ol.createMap'); goog.require('ol.dom'); goog.require('ol.dom.LayerRenderer'); From 4754ed1cc2c2e1d92d4cdbdad1fe1497f9a19985 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Wed, 18 Jul 2012 14:07:59 +0200 Subject: [PATCH 229/562] Add ol.control.MouseWheelZoom --- src/ol/control/mousewheelzoom.js | 39 ++++++++++++++++++++++++++++++++ src/ol/createmap.js | 2 ++ src/ol/map.js | 9 ++++++++ src/ol/ol.js | 1 + 4 files changed, 51 insertions(+) create mode 100644 src/ol/control/mousewheelzoom.js diff --git a/src/ol/control/mousewheelzoom.js b/src/ol/control/mousewheelzoom.js new file mode 100644 index 0000000000..8b94a52b7a --- /dev/null +++ b/src/ol/control/mousewheelzoom.js @@ -0,0 +1,39 @@ +goog.provide('ol.control.MouseWheelZoom'); + +goog.require('goog.events.MouseWheelEvent'); +goog.require('goog.events.MouseWheelHandler.EventType'); +goog.require('ol.MapBrowserEvent'); + + + +/** + * @constructor + * @extends {ol.Control} + */ +ol.control.MouseWheelZoom = function() { + goog.base(this); +}; +goog.inherits(ol.control.MouseWheelZoom, ol.Control); + + +/** + * @inheritDoc + */ +ol.control.MouseWheelZoom.prototype.handleMapBrowserEvent = function(event) { + if (event.type == goog.events.MouseWheelHandler.EventType.MOUSEWHEEL) { + var map = event.map; + var mouseWheelEvent = /** @type {goog.events.MouseWheelEvent} */ + event.getBrowserEventObject(); + goog.asserts.assert(mouseWheelEvent instanceof goog.events.MouseWheelEvent); + if (mouseWheelEvent.deltaY !== 0) { + map.whileFrozen(function() { + // FIXME compute correct center for zoom + map.setCenter(event.getCoordinate()); + var scale = mouseWheelEvent.deltaY < 0 ? 0.5 : 2; + map.setResolution(scale * map.getResolution()); + }); + event.preventDefault(); + mouseWheelEvent.preventDefault(); + } + } +}; diff --git a/src/ol/createmap.js b/src/ol/createmap.js index 4f2eb82926..3a9e9089d9 100644 --- a/src/ol/createmap.js +++ b/src/ol/createmap.js @@ -7,6 +7,7 @@ goog.require('ol.Map'); goog.require('ol.MapProperty'); goog.require('ol.Projection'); goog.require('ol.control.DblClickZoom'); +goog.require('ol.control.MouseWheelZoom'); goog.require('ol.dom'); goog.require('ol.dom.Map'); goog.require('ol.webgl'); @@ -66,6 +67,7 @@ ol.createMap = function(target, opt_values, opt_rendererHints) { if (!goog.object.containsKey(values, ol.MapProperty.CONTROLS)) { var controls = new ol.Array(); controls.push(new ol.control.DblClickZoom()); + controls.push(new ol.control.MouseWheelZoom()); values[ol.MapProperty.CONTROLS] = controls; } diff --git a/src/ol/map.js b/src/ol/map.js index 3e408daa93..3ffcd317dd 100644 --- a/src/ol/map.js +++ b/src/ol/map.js @@ -7,6 +7,9 @@ goog.require('goog.events'); goog.require('goog.events.BrowserEvent'); goog.require('goog.events.Event'); goog.require('goog.events.EventType'); +goog.require('goog.events.MouseWheelEvent'); +goog.require('goog.events.MouseWheelHandler'); +goog.require('goog.events.MouseWheelHandler.EventType'); goog.require('goog.fx.anim'); goog.require('goog.fx.anim.Animated'); goog.require('goog.math.Coordinate'); @@ -73,6 +76,12 @@ ol.Map = function(target, opt_values, opt_viewportSizeMonitor) { goog.events.EventType.CLICK ], this.handleBrowserEvent, false, this); + var mouseWheelHandler = new goog.events.MouseWheelHandler(this.eventsPane_); + goog.events.listen(mouseWheelHandler, + goog.events.MouseWheelHandler.EventType.MOUSEWHEEL, + this.handleBrowserEvent, false, this); + this.registerDisposable(mouseWheelHandler); + /** * @private * @type {goog.fx.anim.Animated} diff --git a/src/ol/ol.js b/src/ol/ol.js index 33e09481ce..fe31aa9114 100644 --- a/src/ol/ol.js +++ b/src/ol/ol.js @@ -25,6 +25,7 @@ goog.require('ol.TileUrlFunction'); goog.require('ol.TileUrlFunctionType'); goog.require('ol.TransformFunction'); goog.require('ol.control.DblClickZoom'); +goog.require('ol.control.MouseWheelZoom'); goog.require('ol.createMap'); goog.require('ol.dom'); goog.require('ol.dom.LayerRenderer'); From aab2bc093a14303651da5559bc46b7d0f98a69d6 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Wed, 18 Jul 2012 15:10:39 +0200 Subject: [PATCH 230/562] Add experimental drag control (to be replaced) --- src/ol/control/drag.js | 106 ++++++++++++++++++++++++++++++++++++++ src/ol/control/dragpan.js | 49 ++++++++++++++++++ src/ol/createmap.js | 2 + src/ol/map.js | 5 +- src/ol/ol.js | 2 + 5 files changed, 163 insertions(+), 1 deletion(-) create mode 100644 src/ol/control/drag.js create mode 100644 src/ol/control/dragpan.js diff --git a/src/ol/control/drag.js b/src/ol/control/drag.js new file mode 100644 index 0000000000..2049d66f0c --- /dev/null +++ b/src/ol/control/drag.js @@ -0,0 +1,106 @@ +// FIXME support touch events? +// FIXME use goog.fx.Dragger in ol.Map instead? + +goog.provide('ol.control.Drag'); + +goog.require('goog.events.EventType'); +goog.require('goog.functions'); +goog.require('ol.Control'); +goog.require('ol.MapBrowserEvent'); + + + +/** + * @constructor + * @extends {ol.Control} + */ +ol.control.Drag = function() { + + goog.base(this); + + /** + * @private + * @type {boolean} + */ + this.dragging_ = false; + + /** + * @type {number} + */ + this.startX = 0; + + /** + * @type {number} + */ + this.startY = 0; + + /** + * @type {number} + */ + this.offsetX = 0; + + /** + * @type {number} + */ + this.offsetY = 0; + +}; +goog.inherits(ol.control.Drag, ol.Control); + + +/** + * @param {ol.MapBrowserEvent} event Event. + * @protected + */ +ol.control.Drag.prototype.handleDrag = goog.nullFunction; + + +/** + * @param {ol.MapBrowserEvent} event Event. + * @protected + * @return {boolean} Capture dragging. + */ +ol.control.Drag.prototype.handleDragStart = goog.functions.FALSE; + + +/** + * @param {ol.MapBrowserEvent} event Event. + * @protected + */ +ol.control.Drag.prototype.handleDragEnd = goog.nullFunction; + + +/** + * @inheritDoc + */ +ol.control.Drag.prototype.handleMapBrowserEvent = function(event) { + var browserEventObject; + if (this.dragging_) { + if (event.type == goog.events.EventType.MOUSEMOVE || + event.type == goog.events.EventType.MOUSEOUT || + event.type == goog.events.EventType.MOUSEUP) { + browserEventObject = event.getBrowserEventObject(); + this.deltaX = browserEventObject.offsetX - this.startX; + this.deltaY = browserEventObject.offsetY - this.startY; + if (event.type == goog.events.EventType.MOUSEMOVE) { + this.handleDrag(event); + } else { + this.handleDragEnd(event); + this.dragging_ = false; + } + event.preventDefault(); + } + } else { + if (event.type == goog.events.EventType.MOUSEDOWN) { + browserEventObject = event.getBrowserEventObject(); + this.startX = browserEventObject.offsetX; + this.startY = browserEventObject.offsetY; + this.deltaX = 0; + this.deltaY = 0; + if (this.handleDragStart(event)) { + this.dragging_ = true; + event.preventDefault(); + } + } + } +}; diff --git a/src/ol/control/dragpan.js b/src/ol/control/dragpan.js new file mode 100644 index 0000000000..c02374fdcc --- /dev/null +++ b/src/ol/control/dragpan.js @@ -0,0 +1,49 @@ +goog.provide('ol.control.DragPan'); + +goog.require('ol.MapBrowserEvent'); +goog.require('ol.control.Drag'); + + + +/** + * @constructor + * @extends {ol.control.Drag} + */ +ol.control.DragPan = function() { + goog.base(this); +}; +goog.inherits(ol.control.DragPan, ol.control.Drag); + + +/** + * @inheritDoc + */ +ol.control.DragPan.prototype.handleDrag = function(event) { + window.console.log( + 'drag delta (' + this.deltaX + ', ' + this.deltaY + ')'); +}; + + +/** + * @inheritDoc + */ +ol.control.DragPan.prototype.handleDragEnd = function(event) { + window.console.log( + 'drag end at delta (' + this.deltaX + ', ' + this.deltaY + ')'); +}; + + +/** + * @inheritDoc + */ +ol.control.DragPan.prototype.handleDragStart = function(event) { + var browserEventObject = event.getBrowserEventObject(); + if (browserEventObject.shiftKey) { + window.console.log('not starting drag while shift key is pressed'); + return false; + } else { + window.console.log( + 'drag start at (' + this.startX + ', ' + this.startY + ')'); + return true; + } +}; diff --git a/src/ol/createmap.js b/src/ol/createmap.js index 3a9e9089d9..64515f186c 100644 --- a/src/ol/createmap.js +++ b/src/ol/createmap.js @@ -7,6 +7,7 @@ goog.require('ol.Map'); goog.require('ol.MapProperty'); goog.require('ol.Projection'); goog.require('ol.control.DblClickZoom'); +goog.require('ol.control.DragPan'); goog.require('ol.control.MouseWheelZoom'); goog.require('ol.dom'); goog.require('ol.dom.Map'); @@ -67,6 +68,7 @@ ol.createMap = function(target, opt_values, opt_rendererHints) { if (!goog.object.containsKey(values, ol.MapProperty.CONTROLS)) { var controls = new ol.Array(); controls.push(new ol.control.DblClickZoom()); + controls.push(new ol.control.DragPan()); controls.push(new ol.control.MouseWheelZoom()); values[ol.MapProperty.CONTROLS] = controls; } diff --git a/src/ol/map.js b/src/ol/map.js index 3ffcd317dd..b8bb18b0be 100644 --- a/src/ol/map.js +++ b/src/ol/map.js @@ -73,7 +73,10 @@ ol.Map = function(target, opt_values, opt_viewportSizeMonitor) { goog.events.listen(this.eventsPane_, [ goog.events.EventType.DBLCLICK, - goog.events.EventType.CLICK + goog.events.EventType.MOUSEDOWN, + goog.events.EventType.MOUSEMOVE, + goog.events.EventType.MOUSEOUT, + goog.events.EventType.MOUSEUP ], this.handleBrowserEvent, false, this); var mouseWheelHandler = new goog.events.MouseWheelHandler(this.eventsPane_); diff --git a/src/ol/ol.js b/src/ol/ol.js index fe31aa9114..16f2a34e7f 100644 --- a/src/ol/ol.js +++ b/src/ol/ol.js @@ -25,6 +25,8 @@ goog.require('ol.TileUrlFunction'); goog.require('ol.TileUrlFunctionType'); goog.require('ol.TransformFunction'); goog.require('ol.control.DblClickZoom'); +goog.require('ol.control.Drag'); +goog.require('ol.control.DragPan'); goog.require('ol.control.MouseWheelZoom'); goog.require('ol.createMap'); goog.require('ol.dom'); From b53e5a3fda85c671d05008aad46508fcc31b8cba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Lemoine?= Date: Wed, 18 Jul 2012 16:32:16 +0200 Subject: [PATCH 231/562] two maps in the skeleton example --- skeleton.html | 37 +++++++++++++++++++++++-------------- skeleton.js | 27 ++++++++++++++++++++++----- 2 files changed, 45 insertions(+), 19 deletions(-) diff --git a/skeleton.html b/skeleton.html index eecfdc6f80..063448b8bc 100644 --- a/skeleton.html +++ b/skeleton.html @@ -1,17 +1,26 @@ - - - - -
- - + + + + +
+
+ + diff --git a/skeleton.js b/skeleton.js index f3c1aab91a..09a91152a5 100644 --- a/skeleton.js +++ b/skeleton.js @@ -4,18 +4,35 @@ goog.require('ol.RendererHint'); goog.require('ol.createMap'); goog.require('ol.tilelayer.createOpenStreetMap'); +var twoMaps = true; -var target = /** @type {!HTMLDivElement} */ document.getElementById('map'); -var map = ol.createMap(target, undefined, ol.RendererHint.DOM); +var target; +var map, map1, map2; +var layer; -var layer = ol.tilelayer.createOpenStreetMap({ +target = /** @type {!HTMLDivElement} */ document.getElementById('map1'); +map = map1 = ol.createMap(target, undefined, ol.RendererHint.DOM); +layer = ol.tilelayer.createOpenStreetMap({ 'opacity': 0.5 }); map.getLayers().push(layer); var resolutions = layer.getStore().getResolutions(); -map.setCenter(new goog.math.Coordinate(0, 0)); -map.setResolution(resolutions[0]); +map1.setCenter(new goog.math.Coordinate(0, 0)); +map1.setResolution(resolutions[0]); + +if (twoMaps) { + target = /** @type {!HTMLDivElement} */ document.getElementById('map2'); + map2 = ol.createMap(target, undefined, ol.RendererHint.DOM); + layer = ol.tilelayer.createOpenStreetMap({ + 'opacity': 0.5 + }); + map2.getLayers().push(layer); + map2.bindTo('center', map1); + map2.bindTo('resolution', map1); +} goog.exportSymbol('layer', layer); goog.exportSymbol('map', map); +goog.exportSymbol('map1', map1); +goog.exportSymbol('map2', map2); From 7fc82daafa40501c2d2770628cd750c07437c659 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Lemoine?= Date: Wed, 18 Jul 2012 16:32:43 +0200 Subject: [PATCH 232/562] dom layer renderer - support opacity and visibility change --- src/ol/dom/layerrenderer.js | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/ol/dom/layerrenderer.js b/src/ol/dom/layerrenderer.js index c704636cc1..c45ff8e423 100644 --- a/src/ol/dom/layerrenderer.js +++ b/src/ol/dom/layerrenderer.js @@ -51,6 +51,22 @@ ol.dom.LayerRenderer.prototype.setOrigin = function(origin) { }; +/** + * @inheritDoc + */ +ol.dom.LayerRenderer.prototype.handleLayerOpacityChange = function() { + goog.style.setOpacity(this.target, this.layer_.getOpacity()); +}; + + +/** + * @inheritDoc + */ +ol.dom.LayerRenderer.prototype.handleLayerVisibleChange = function() { + goog.style.showElement(this.target, this.layer_.getVisible()); +}; + + /** */ ol.dom.LayerRenderer.prototype.redraw = goog.abstractMethod; From db91206d418a90e2d0d9a84401b185fbb8b3b918 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Lemoine?= Date: Wed, 18 Jul 2012 20:27:38 +0200 Subject: [PATCH 233/562] code styling --- src/ol/dom/map.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/ol/dom/map.js b/src/ol/dom/map.js index 91e9c451e3..2225346b63 100644 --- a/src/ol/dom/map.js +++ b/src/ol/dom/map.js @@ -61,6 +61,7 @@ ol.dom.Map = function(target, opt_values) { */ this.layersPaneOffset_ = null; + if (goog.isDef(opt_values)) { this.setValues(opt_values); } From 62f3f46b51b73cbb04a1b826d1248d1726e0757f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Lemoine?= Date: Thu, 19 Jul 2012 00:00:23 +0200 Subject: [PATCH 234/562] fix compilation - private property cannot be used in subclasses --- src/ol/dom/layerrenderer.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ol/dom/layerrenderer.js b/src/ol/dom/layerrenderer.js index c45ff8e423..6707d103ff 100644 --- a/src/ol/dom/layerrenderer.js +++ b/src/ol/dom/layerrenderer.js @@ -55,7 +55,7 @@ ol.dom.LayerRenderer.prototype.setOrigin = function(origin) { * @inheritDoc */ ol.dom.LayerRenderer.prototype.handleLayerOpacityChange = function() { - goog.style.setOpacity(this.target, this.layer_.getOpacity()); + goog.style.setOpacity(this.target, this.getLayer().getOpacity()); }; @@ -63,7 +63,7 @@ ol.dom.LayerRenderer.prototype.handleLayerOpacityChange = function() { * @inheritDoc */ ol.dom.LayerRenderer.prototype.handleLayerVisibleChange = function() { - goog.style.showElement(this.target, this.layer_.getVisible()); + goog.style.showElement(this.target, this.getLayer().getVisible()); }; From 0a33077ecc86ccf5aea4766469002f96ceef953f Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Wed, 18 Jul 2012 19:40:07 +0200 Subject: [PATCH 235/562] Add ol.Rectangle.toString --- src/ol/rectangle.js | 8 ++++++++ src/ol/rectangle_test.js | 6 ++++++ 2 files changed, 14 insertions(+) diff --git a/src/ol/rectangle.js b/src/ol/rectangle.js index c1b961d1b7..c0a3d3eba6 100644 --- a/src/ol/rectangle.js +++ b/src/ol/rectangle.js @@ -114,3 +114,11 @@ ol.Rectangle.prototype.normalize = function(coordinate) { (coordinate.x - this.minX) / this.getWidth(), (coordinate.y - this.minY) / this.getHeight()); }; + + +/** + * @return {string} String. + */ +ol.Rectangle.prototype.toString = function() { + return '(' + [this.minX, this.minY, this.maxX, this.maxY].join(', ') + ')'; +}; diff --git a/src/ol/rectangle_test.js b/src/ol/rectangle_test.js index 56986c68f3..a492f4afe2 100644 --- a/src/ol/rectangle_test.js +++ b/src/ol/rectangle_test.js @@ -134,3 +134,9 @@ function testNormalize() { assertEquals(0, coordinate.y); } + + +function testToString() { + var rectangle = new ol.Rectangle(0, 1, 2, 3); + assertEquals('(0, 1, 2, 3)', rectangle.toString()); +} From d3ed8b315c8c839f843450c7ee6456b241b6fafe Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Wed, 18 Jul 2012 19:40:33 +0200 Subject: [PATCH 236/562] Make ol.Map.getSize public --- src/ol/map.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/ol/map.js b/src/ol/map.js index b8bb18b0be..400f9974a3 100644 --- a/src/ol/map.js +++ b/src/ol/map.js @@ -325,7 +325,6 @@ ol.Map.prototype.getResolutionForExtent = function(extent) { /** - * @protected * @return {goog.math.Size|undefined} Size. */ ol.Map.prototype.getSize = function() { From 52ce0b3fd011edd5e371074f015bc1438632827b Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Wed, 18 Jul 2012 19:42:47 +0200 Subject: [PATCH 237/562] Assure redraw is called when layer becomes invisible --- src/ol/webgl/map.js | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/ol/webgl/map.js b/src/ol/webgl/map.js index a8aa461771..6207f24f0a 100644 --- a/src/ol/webgl/map.js +++ b/src/ol/webgl/map.js @@ -332,10 +332,7 @@ ol.webgl.Map.prototype.handleLayerAdd = function(layer) { * @protected */ ol.webgl.Map.prototype.handleLayerRendererChange = function(event) { - var layerRenderer = /** @type {ol.LayerRenderer} */ (event.target); - if (layerRenderer.getLayer().getVisible()) { - this.redraw(); - } + this.redraw(); }; From 092fce96eceef617d4e4ab4f20fc7a0b1ad0b659 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Wed, 18 Jul 2012 20:00:18 +0200 Subject: [PATCH 238/562] Add background color property --- src/ol/map.js | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/src/ol/map.js b/src/ol/map.js index 400f9974a3..1e81b6dc7c 100644 --- a/src/ol/map.js +++ b/src/ol/map.js @@ -2,6 +2,7 @@ goog.provide('ol.Map'); goog.provide('ol.MapProperty'); goog.require('goog.array'); +goog.require('goog.color'); goog.require('goog.dom.ViewportSizeMonitor'); goog.require('goog.events'); goog.require('goog.events.BrowserEvent'); @@ -27,6 +28,7 @@ goog.require('ol.Projection'); * @enum {string} */ ol.MapProperty = { + BACKGROUND_COLOR: 'backgroundColor', CENTER: 'center', CONTROLS: 'controls', EXTENT: 'extent', @@ -131,6 +133,10 @@ ol.Map = function(target, opt_values, opt_viewportSizeMonitor) { goog.events.listen(this.viewportSizeMonitor_, goog.events.EventType.RESIZE, this.handleViewportResize, false, this); + goog.events.listen(this, + ol.Object.getChangedEventType(ol.MapProperty.BACKGROUND_COLOR), + this.handleBackgroundColorChanged, false, this); + goog.events.listen( this, ol.Object.getChangedEventType(ol.MapProperty.CENTER), this.handleCenterChanged, false, this); @@ -216,6 +222,15 @@ ol.Map.prototype.forEachVisibleLayer = function(f, opt_obj) { }; +/** + * @return {string|undefined} Background color. + */ +ol.Map.prototype.getBackgroundColor = function() { + return /** @type {string|undefined} */ ( + this.get(ol.MapProperty.BACKGROUND_COLOR)); +}; + + /** * @return {goog.math.Coordinate|undefined} Center. */ @@ -341,6 +356,11 @@ ol.Map.prototype.getTarget = function() { }; +/** + */ +ol.Map.prototype.handleBackgroundColorChanged = goog.nullFunction; + + /** * @param {goog.events.BrowserEvent} event Event. */ @@ -539,6 +559,15 @@ ol.Map.prototype.removeLayerRenderer = function(layer) { }; +/** + * @param {string} backgroundColor Background color. + */ +ol.Map.prototype.setBackgroundColor = function(backgroundColor) { + goog.color.parse(backgroundColor); + this.set(ol.MapProperty.BACKGROUND_COLOR, backgroundColor); +}; + + /** * @param {goog.math.Coordinate} center Center. */ From da941562cc875363c8cf6ee83e9d9ea520fd8b38 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Wed, 18 Jul 2012 20:00:57 +0200 Subject: [PATCH 239/562] Handle background color in ol.webgl.Map --- src/ol/webgl/map.js | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/src/ol/webgl/map.js b/src/ol/webgl/map.js index 6207f24f0a..60c6538f21 100644 --- a/src/ol/webgl/map.js +++ b/src/ol/webgl/map.js @@ -7,6 +7,7 @@ goog.provide('ol.webgl.Map'); goog.provide('ol.webgl.map.shader'); +goog.require('goog.color'); goog.require('goog.dispose'); goog.require('goog.dom'); goog.require('goog.dom.TagName'); @@ -307,6 +308,14 @@ ol.webgl.Map.prototype.getTileTexture = function(tile) { }; +/** + * @inheritDoc + */ +ol.webgl.Map.prototype.handleBackgroundColorChanged = function() { + this.redraw(); +}; + + /** * @inheritDoc */ @@ -397,7 +406,6 @@ ol.webgl.Map.prototype.handleWebGLContextLost = function(event) { */ ol.webgl.Map.prototype.handleWebGLContextRestored = function() { var gl = this.gl_; - gl.clearColor(1, 0, 0, 1); gl.disable(goog.webgl.CULL_FACE); gl.disable(goog.webgl.SCISSOR_TEST); }; @@ -419,7 +427,18 @@ ol.webgl.Map.prototype.redrawInternal = function() { var gl = this.getGL(); gl.bindFramebuffer(goog.webgl.FRAMEBUFFER, null); - gl.clearColor(0, 0, 0, 0); + + var red, green, blue; + var backgroundColor = this.getBackgroundColor(); + if (goog.isDef(backgroundColor)) { + var rgb = goog.color.hexToRgb(goog.color.parse(backgroundColor).hex); + red = rgb[0] / 255; + green = rgb[1] / 255; + blue = rgb[2] / 255; + } else { + red = green = blue = 1; + } + gl.clearColor(red, green, blue, 1); gl.clear(goog.webgl.COLOR_BUFFER_BIT); gl.enable(goog.webgl.BLEND); gl.blendFunc(goog.webgl.SRC_ALPHA, goog.webgl.ONE_MINUS_SRC_ALPHA); From 376d75ea4f004c798fda3ef8e9adee689711b726 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Wed, 18 Jul 2012 23:01:53 +0200 Subject: [PATCH 240/562] Rename ol.Projection.createFromCode to getFromCode --- src/ol/createmap.js | 2 +- src/ol/projection.js | 6 +++--- src/ol/projection_test.js | 4 ++-- src/ol/tilestore/openstreetmap.js | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/ol/createmap.js b/src/ol/createmap.js index 64515f186c..dc5a783039 100644 --- a/src/ol/createmap.js +++ b/src/ol/createmap.js @@ -79,7 +79,7 @@ ol.createMap = function(target, opt_values, opt_rendererHints) { if (!goog.object.containsKey(values, ol.MapProperty.PROJECTION)) { values[ol.MapProperty.PROJECTION] = - ol.Projection.createFromCode(ol.DEFAULT_PROJECTION_CODE); + ol.Projection.getFromCode(ol.DEFAULT_PROJECTION_CODE); } /** diff --git a/src/ol/projection.js b/src/ol/projection.js index b8ba0ec2de..0bd6b5a00a 100644 --- a/src/ol/projection.js +++ b/src/ol/projection.js @@ -162,7 +162,7 @@ ol.Projection.addTransform = function(source, destination, transform) { * @param {string} code Code. * @return {ol.Projection} Projection. */ -ol.Projection.createFromCode = function(code) { +ol.Projection.getFromCode = function(code) { var projections = ol.Projection.projections_; goog.asserts.assert(goog.object.containsKey(projections, code)); return projections[code]; @@ -208,8 +208,8 @@ ol.Projection.getTransform = function(source, destination) { * @return {ol.TransformFunction} Transform. */ ol.Projection.getTransformFromCodes = function(sourceCode, destinationCode) { - var source = ol.Projection.createFromCode(sourceCode); - var destination = ol.Projection.createFromCode(destinationCode); + var source = ol.Projection.getFromCode(sourceCode); + var destination = ol.Projection.getFromCode(destinationCode); return ol.Projection.getTransform(source, destination); }; diff --git a/src/ol/projection_test.js b/src/ol/projection_test.js index a47a037882..7200f1236a 100644 --- a/src/ol/projection_test.js +++ b/src/ol/projection_test.js @@ -5,7 +5,7 @@ goog.require('ol.Projection'); function _testAllEquivalent(codes) { - var projections = goog.array.map(codes, ol.Projection.createFromCode); + var projections = goog.array.map(codes, ol.Projection.getFromCode); goog.array.forEach(projections, function(source) { goog.array.forEach(projections, function(destination) { assertTrue(ol.Projection.equivalent(source, destination)); @@ -34,7 +34,7 @@ function testEpsg4326Equivalence() { function testIdentityTransform() { - var epsg4326 = ol.Projection.createFromCode('EPSG:4326'); + var epsg4326 = ol.Projection.getFromCode('EPSG:4326'); var uniqueObject = {}; var sourcePoint = new goog.math.Coordinate(uniqueObject, uniqueObject); var destinationPoint = ol.Projection.transform( diff --git a/src/ol/tilestore/openstreetmap.js b/src/ol/tilestore/openstreetmap.js index fe725bfe1a..08684d91d5 100644 --- a/src/ol/tilestore/openstreetmap.js +++ b/src/ol/tilestore/openstreetmap.js @@ -14,7 +14,7 @@ goog.require('ol.tilegrid.createOpenStreetMap'); */ ol.tilestore.createOpenStreetMap = function() { - var projection = ol.Projection.createFromCode('EPSG:3857'); + var projection = ol.Projection.getFromCode('EPSG:3857'); var tileGrid = ol.tilegrid.createOpenStreetMap(18); var tileUrlFunction = ol.TileUrlFunction.withTileCoordTransform( function(tileCoord) { From eb43cf14c1c3b609b9dcbad18b2d635fff779609 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Wed, 18 Jul 2012 23:37:12 +0200 Subject: [PATCH 241/562] Clean up layer renderers when layers changes --- src/ol/map.js | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/ol/map.js b/src/ol/map.js index 1e81b6dc7c..0a1fd4ced6 100644 --- a/src/ol/map.js +++ b/src/ol/map.js @@ -442,12 +442,21 @@ ol.Map.prototype.handleLayersSetAt = function(event) { /** */ ol.Map.prototype.handleLayersChanged = function() { + var layerRenderers = goog.object.getValues(this.layerRenderers); + goog.array.forEach(layerRenderers, function(layerRenderer) { + this.removeLayerRenderer(layerRenderer); + }, this); + this.layerRenderers = {}; if (!goog.isNull(this.layersListenerKeys_)) { goog.array.forEach(this.layersListenerKeys_, goog.events.unlistenByKey); this.layersListenerKeys_ = null; } var layers = this.getLayers(); if (goog.isDefAndNotNull(layers)) { + goog.array.forEach(layers.getArray(), function(layer) { + var layerRenderer = this.createLayerRenderer(layer); + this.setLayerRenderer(layer, layerRenderer); + }, this); this.layersListenerKeys_ = [ goog.events.listen(layers, ol.ArrayEventType.INSERT_AT, this.handleLayersInsertAt, false, this), From 4ddcfcc0375fab0c45cd67941042c96cfdec1d34 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Wed, 18 Jul 2012 23:37:39 +0200 Subject: [PATCH 242/562] Add context argument to Tile.getImage to support re-use in DOM renderer --- src/ol/tile.js | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/src/ol/tile.js b/src/ol/tile.js index 322e234f8a..6ab24d6244 100644 --- a/src/ol/tile.js +++ b/src/ol/tile.js @@ -56,6 +56,12 @@ ol.Tile = function(tileCoord, src, opt_crossOrigin) { this.image_.crossOrigin = opt_crossOrigin; } + /** + * @private + * @type {Object.} + */ + this.imageByContext_ = {}; + /** * @private * @type {Array.} @@ -75,10 +81,25 @@ ol.Tile.prototype.dispatchChangeEvent = function() { /** + * @param {Object=} opt_context Object. * @return {Image} Image. */ -ol.Tile.prototype.getImage = function() { - return this.image_; +ol.Tile.prototype.getImage = function(opt_context) { + if (goog.isDef(opt_context)) { + var image; + var key = goog.getUid(opt_context); + if (key in this.imageByContext_) { + return this.imageByContext_[key]; + } else if (goog.object.isEmpty(this.imageByContext_)) { + image = this.image_; + } else { + image = /** @type {Image} */ this.image_.cloneNode(false); + } + this.imageByContext_[key] = image; + return image; + } else { + return this.image_; + } }; From a6e2b501bdec90d33037261a46e602760a85d4c7 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Wed, 18 Jul 2012 23:37:58 +0200 Subject: [PATCH 243/562] Enable DOM renderers to share tile layers --- src/ol/dom/tilelayerrenderer.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ol/dom/tilelayerrenderer.js b/src/ol/dom/tilelayerrenderer.js index 5b7b6436f9..6941bded32 100644 --- a/src/ol/dom/tilelayerrenderer.js +++ b/src/ol/dom/tilelayerrenderer.js @@ -62,7 +62,7 @@ ol.dom.TileLayerRenderer.prototype.redraw = function() { this.renderedTiles_[key] = tile; x = tileSize.width * (tileCoord.x - tileBounds.minX); y = tileSize.height * (tileBounds.maxY - tileCoord.y); - img = tile.getImage(); + img = tile.getImage(this); img.style.position = 'absolute'; img.style.top = (y - offset.y) + 'px'; img.style.left = (x - offset.x) + 'px'; @@ -130,7 +130,7 @@ ol.dom.TileLayerRenderer.prototype.removeInvisibleTiles_ = function( if (prune) { tile = this.renderedTiles_[key]; delete this.renderedTiles_[key]; - this.target.removeChild(tile.getImage()); + this.target.removeChild(tile.getImage(this)); } } }; From 15d2ad984b255073c486e5c5fc346e59292364ff Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Wed, 18 Jul 2012 23:38:16 +0200 Subject: [PATCH 244/562] Bind map layers in demo --- skeleton.js | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/skeleton.js b/skeleton.js index 09a91152a5..30f5db27a7 100644 --- a/skeleton.js +++ b/skeleton.js @@ -24,11 +24,8 @@ map1.setResolution(resolutions[0]); if (twoMaps) { target = /** @type {!HTMLDivElement} */ document.getElementById('map2'); map2 = ol.createMap(target, undefined, ol.RendererHint.DOM); - layer = ol.tilelayer.createOpenStreetMap({ - 'opacity': 0.5 - }); - map2.getLayers().push(layer); map2.bindTo('center', map1); + map2.bindTo('layers', map1); map2.bindTo('resolution', map1); } From 82b8a4675217fde914351cf39c91217729c0cf1c Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Wed, 18 Jul 2012 23:38:57 +0200 Subject: [PATCH 245/562] Use RAW mode for demo while ol.Object is not adapted for compiled mode --- skeleton.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/skeleton.html b/skeleton.html index 063448b8bc..6098f362ed 100644 --- a/skeleton.html +++ b/skeleton.html @@ -21,6 +21,6 @@
- + From 4299cf4fae378d1622f11ad4675863231c269181 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Wed, 18 Jul 2012 23:57:49 +0200 Subject: [PATCH 246/562] Add startCenter and startCoordinate to ol.control.Drag --- src/ol/control/drag.js | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/ol/control/drag.js b/src/ol/control/drag.js index 2049d66f0c..6077b84238 100644 --- a/src/ol/control/drag.js +++ b/src/ol/control/drag.js @@ -44,6 +44,16 @@ ol.control.Drag = function() { */ this.offsetY = 0; + /** + * @type {goog.math.Coordinate} + */ + this.startCenter = null; + + /** + * @type {goog.math.Coordinate} + */ + this.startCoordinate = null; + }; goog.inherits(ol.control.Drag, ol.Control); @@ -97,6 +107,8 @@ ol.control.Drag.prototype.handleMapBrowserEvent = function(event) { this.startY = browserEventObject.offsetY; this.deltaX = 0; this.deltaY = 0; + this.startCenter = event.map.getCenter(); + this.startCoordinate = event.getCoordinate(); if (this.handleDragStart(event)) { this.dragging_ = true; event.preventDefault(); From 1d6101a5a15c8abcd525ec563f061cbf426a9f40 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Wed, 18 Jul 2012 23:59:58 +0200 Subject: [PATCH 247/562] Implement ol.control.DragPan --- src/ol/control/dragpan.js | 31 +++++++++---------------------- 1 file changed, 9 insertions(+), 22 deletions(-) diff --git a/src/ol/control/dragpan.js b/src/ol/control/dragpan.js index c02374fdcc..7f7302db93 100644 --- a/src/ol/control/dragpan.js +++ b/src/ol/control/dragpan.js @@ -1,5 +1,7 @@ goog.provide('ol.control.DragPan'); +goog.require('goog.functions'); +goog.require('goog.math.Coordinate'); goog.require('ol.MapBrowserEvent'); goog.require('ol.control.Drag'); @@ -19,31 +21,16 @@ goog.inherits(ol.control.DragPan, ol.control.Drag); * @inheritDoc */ ol.control.DragPan.prototype.handleDrag = function(event) { - window.console.log( - 'drag delta (' + this.deltaX + ', ' + this.deltaY + ')'); + var map = event.map; + var resolution = map.getResolution(); + var center = new goog.math.Coordinate( + this.startCenter.x - resolution * this.deltaX, + this.startCenter.y + resolution * this.deltaY); + map.setCenter(center); }; /** * @inheritDoc */ -ol.control.DragPan.prototype.handleDragEnd = function(event) { - window.console.log( - 'drag end at delta (' + this.deltaX + ', ' + this.deltaY + ')'); -}; - - -/** - * @inheritDoc - */ -ol.control.DragPan.prototype.handleDragStart = function(event) { - var browserEventObject = event.getBrowserEventObject(); - if (browserEventObject.shiftKey) { - window.console.log('not starting drag while shift key is pressed'); - return false; - } else { - window.console.log( - 'drag start at (' + this.startX + ', ' + this.startY + ')'); - return true; - } -}; +ol.control.DragPan.prototype.handleDragStart = goog.functions.TRUE; From 0e3b97a0b673afd6594f6d80fe28112dbaa63cda Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Thu, 19 Jul 2012 00:05:27 +0200 Subject: [PATCH 248/562] s/event/mapBrowserEvent/g --- src/ol/control/control.js | 2 +- src/ol/control/dblclickzoom.js | 13 ++++++------ src/ol/control/drag.js | 36 ++++++++++++++++---------------- src/ol/control/dragpan.js | 4 ++-- src/ol/control/mousewheelzoom.js | 14 +++++++------ 5 files changed, 36 insertions(+), 33 deletions(-) diff --git a/src/ol/control/control.js b/src/ol/control/control.js index 5a31a59715..dba60d9f74 100644 --- a/src/ol/control/control.js +++ b/src/ol/control/control.js @@ -12,6 +12,6 @@ ol.Control = function() { /** - * @param {ol.MapBrowserEvent} event Map browser event. + * @param {ol.MapBrowserEvent} mapBrowserEvent Map browser event. */ ol.Control.prototype.handleMapBrowserEvent = goog.abstractMethod; diff --git a/src/ol/control/dblclickzoom.js b/src/ol/control/dblclickzoom.js index 0e23170e57..fd11979d11 100644 --- a/src/ol/control/dblclickzoom.js +++ b/src/ol/control/dblclickzoom.js @@ -19,16 +19,17 @@ goog.inherits(ol.control.DblClickZoom, ol.Control); /** * @inheritDoc */ -ol.control.DblClickZoom.prototype.handleMapBrowserEvent = function(event) { - if (event.type == goog.events.EventType.DBLCLICK) { - var map = event.map; +ol.control.DblClickZoom.prototype.handleMapBrowserEvent = + function(mapBrowserEvent) { + if (mapBrowserEvent.type == goog.events.EventType.DBLCLICK) { + var map = mapBrowserEvent.map; map.whileFrozen(function() { // FIXME compute correct center for zoom - map.setCenter(event.getCoordinate()); - var browserEventObject = event.getBrowserEventObject(); + map.setCenter(mapBrowserEvent.getCoordinate()); + var browserEventObject = mapBrowserEvent.getBrowserEventObject(); var scale = browserEventObject.shiftKey ? 2 : 0.5; map.setResolution(scale * map.getResolution()); }); - event.preventDefault(); + mapBrowserEvent.preventDefault(); } }; diff --git a/src/ol/control/drag.js b/src/ol/control/drag.js index 6077b84238..8a8f0ebc01 100644 --- a/src/ol/control/drag.js +++ b/src/ol/control/drag.js @@ -59,14 +59,14 @@ goog.inherits(ol.control.Drag, ol.Control); /** - * @param {ol.MapBrowserEvent} event Event. + * @param {ol.MapBrowserEvent} mapBrowserEvent Event. * @protected */ ol.control.Drag.prototype.handleDrag = goog.nullFunction; /** - * @param {ol.MapBrowserEvent} event Event. + * @param {ol.MapBrowserEvent} mapBrowserEvent Event. * @protected * @return {boolean} Capture dragging. */ @@ -74,7 +74,7 @@ ol.control.Drag.prototype.handleDragStart = goog.functions.FALSE; /** - * @param {ol.MapBrowserEvent} event Event. + * @param {ol.MapBrowserEvent} mapBrowserEvent Event. * @protected */ ol.control.Drag.prototype.handleDragEnd = goog.nullFunction; @@ -83,35 +83,35 @@ ol.control.Drag.prototype.handleDragEnd = goog.nullFunction; /** * @inheritDoc */ -ol.control.Drag.prototype.handleMapBrowserEvent = function(event) { +ol.control.Drag.prototype.handleMapBrowserEvent = function(mapBrowserEvent) { var browserEventObject; if (this.dragging_) { - if (event.type == goog.events.EventType.MOUSEMOVE || - event.type == goog.events.EventType.MOUSEOUT || - event.type == goog.events.EventType.MOUSEUP) { - browserEventObject = event.getBrowserEventObject(); + if (mapBrowserEvent.type == goog.events.EventType.MOUSEMOVE || + mapBrowserEvent.type == goog.events.EventType.MOUSEOUT || + mapBrowserEvent.type == goog.events.EventType.MOUSEUP) { + browserEventObject = mapBrowserEvent.getBrowserEventObject(); this.deltaX = browserEventObject.offsetX - this.startX; this.deltaY = browserEventObject.offsetY - this.startY; - if (event.type == goog.events.EventType.MOUSEMOVE) { - this.handleDrag(event); + if (mapBrowserEvent.type == goog.events.EventType.MOUSEMOVE) { + this.handleDrag(mapBrowserEvent); } else { - this.handleDragEnd(event); + this.handleDragEnd(mapBrowserEvent); this.dragging_ = false; } - event.preventDefault(); + mapBrowserEvent.preventDefault(); } } else { - if (event.type == goog.events.EventType.MOUSEDOWN) { - browserEventObject = event.getBrowserEventObject(); + if (mapBrowserEvent.type == goog.events.EventType.MOUSEDOWN) { + browserEventObject = mapBrowserEvent.getBrowserEventObject(); this.startX = browserEventObject.offsetX; this.startY = browserEventObject.offsetY; this.deltaX = 0; this.deltaY = 0; - this.startCenter = event.map.getCenter(); - this.startCoordinate = event.getCoordinate(); - if (this.handleDragStart(event)) { + this.startCenter = mapBrowserEvent.map.getCenter(); + this.startCoordinate = mapBrowserEvent.getCoordinate(); + if (this.handleDragStart(mapBrowserEvent)) { this.dragging_ = true; - event.preventDefault(); + mapBrowserEvent.preventDefault(); } } } diff --git a/src/ol/control/dragpan.js b/src/ol/control/dragpan.js index 7f7302db93..4c8f85e22d 100644 --- a/src/ol/control/dragpan.js +++ b/src/ol/control/dragpan.js @@ -20,8 +20,8 @@ goog.inherits(ol.control.DragPan, ol.control.Drag); /** * @inheritDoc */ -ol.control.DragPan.prototype.handleDrag = function(event) { - var map = event.map; +ol.control.DragPan.prototype.handleDrag = function(mapBrowserEvent) { + var map = mapBrowserEvent.map; var resolution = map.getResolution(); var center = new goog.math.Coordinate( this.startCenter.x - resolution * this.deltaX, diff --git a/src/ol/control/mousewheelzoom.js b/src/ol/control/mousewheelzoom.js index 8b94a52b7a..0decb59dab 100644 --- a/src/ol/control/mousewheelzoom.js +++ b/src/ol/control/mousewheelzoom.js @@ -19,20 +19,22 @@ goog.inherits(ol.control.MouseWheelZoom, ol.Control); /** * @inheritDoc */ -ol.control.MouseWheelZoom.prototype.handleMapBrowserEvent = function(event) { - if (event.type == goog.events.MouseWheelHandler.EventType.MOUSEWHEEL) { - var map = event.map; +ol.control.MouseWheelZoom.prototype.handleMapBrowserEvent = + function(mapBrowserEvent) { + if (mapBrowserEvent.type == + goog.events.MouseWheelHandler.EventType.MOUSEWHEEL) { + var map = mapBrowserEvent.map; var mouseWheelEvent = /** @type {goog.events.MouseWheelEvent} */ - event.getBrowserEventObject(); + mapBrowserEvent.getBrowserEventObject(); goog.asserts.assert(mouseWheelEvent instanceof goog.events.MouseWheelEvent); if (mouseWheelEvent.deltaY !== 0) { map.whileFrozen(function() { // FIXME compute correct center for zoom - map.setCenter(event.getCoordinate()); + map.setCenter(mapBrowserEvent.getCoordinate()); var scale = mouseWheelEvent.deltaY < 0 ? 0.5 : 2; map.setResolution(scale * map.getResolution()); }); - event.preventDefault(); + mapBrowserEvent.preventDefault(); mouseWheelEvent.preventDefault(); } } From 4e347dcf45a538cac9c1d7e3c5a9859219ff4671 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Thu, 19 Jul 2012 00:09:32 +0200 Subject: [PATCH 249/562] Don't drag on incompletely defined maps --- src/ol/control/drag.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/ol/control/drag.js b/src/ol/control/drag.js index 8a8f0ebc01..3f54b46ea4 100644 --- a/src/ol/control/drag.js +++ b/src/ol/control/drag.js @@ -84,6 +84,11 @@ ol.control.Drag.prototype.handleDragEnd = goog.nullFunction; * @inheritDoc */ ol.control.Drag.prototype.handleMapBrowserEvent = function(mapBrowserEvent) { + var center = mapBrowserEvent.map.getCenter(); + var resolution = mapBrowserEvent.map.getResolution(); + if (!goog.isDef(center) || !goog.isDef(resolution)) { + return; + } var browserEventObject; if (this.dragging_) { if (mapBrowserEvent.type == goog.events.EventType.MOUSEMOVE || @@ -107,7 +112,7 @@ ol.control.Drag.prototype.handleMapBrowserEvent = function(mapBrowserEvent) { this.startY = browserEventObject.offsetY; this.deltaX = 0; this.deltaY = 0; - this.startCenter = mapBrowserEvent.map.getCenter(); + this.startCenter = center; this.startCoordinate = mapBrowserEvent.getCoordinate(); if (this.handleDragStart(mapBrowserEvent)) { this.dragging_ = true; From 3ff84dce9b10234495657b0a7fa6f1b1c8d2e392 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Thu, 19 Jul 2012 00:28:08 +0200 Subject: [PATCH 250/562] Add ol.Extent.boundingExtent --- src/ol/extent.js | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/ol/extent.js b/src/ol/extent.js index 7f9639068f..8807bc5c00 100644 --- a/src/ol/extent.js +++ b/src/ol/extent.js @@ -19,6 +19,26 @@ ol.Extent = function(minX, minY, maxX, maxY) { goog.inherits(ol.Extent, ol.Rectangle); +/** + * @param {...goog.math.Coordinate} var_args Coordinates. + * @return {!ol.Extent} Boundin extent. + */ +ol.Extent.boundingExtent = function(var_args) { + var coordinate0 = arguments[0]; + var extent = new ol.Extent(coordinate0.x, coordinate0.y, + coordinate0.x, coordinate0.y); + var i; + for (i = 1; i < arguments.length; ++i) { + var coordinate = arguments[i]; + extent.minX = Math.min(extent.minX, coordinate.x); + extent.minY = Math.min(extent.minY, coordinate.y); + extent.maxX = Math.max(extent.maxX, coordinate.x); + extent.maxY = Math.max(extent.maxY, coordinate.y); + } + return extent; +}; + + /** * @return {ol.Extent} Extent. */ From d47eb3453ff338113a855a039a4f7365832347eb Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Thu, 19 Jul 2012 00:28:49 +0200 Subject: [PATCH 251/562] Implement initial drag zoom control (shift + drag) --- src/ol/control/dragzoom.js | 52 ++++++++++++++++++++++++++++++++++++++ src/ol/ol.js | 1 + 2 files changed, 53 insertions(+) create mode 100644 src/ol/control/dragzoom.js diff --git a/src/ol/control/dragzoom.js b/src/ol/control/dragzoom.js new file mode 100644 index 0000000000..3b84146202 --- /dev/null +++ b/src/ol/control/dragzoom.js @@ -0,0 +1,52 @@ +// FIXME draw drag box + +goog.provide('ol.control.DragZoom'); + +goog.require('ol.Extent'); +goog.require('ol.MapBrowserEvent'); +goog.require('ol.control.Drag'); + + +/** + * @define {number} Hysterisis pixels. + */ +ol.DRAG_ZOOM_HYSTERESIS_PIXELS = 8; + + + +/** + * @constructor + * @extends {ol.control.Drag} + */ +ol.control.DragZoom = function() { + goog.base(this); +}; +goog.inherits(ol.control.DragZoom, ol.control.Drag); + + +/** + * @inheritDoc + */ +ol.control.DragZoom.prototype.handleDragEnd = function(mapBrowserEvent) { + if (this.deltaX * this.deltaX + this.deltaY * this.deltaY >= + ol.DRAG_ZOOM_HYSTERESIS_PIXELS * ol.DRAG_ZOOM_HYSTERESIS_PIXELS) { + var extent = ol.Extent.boundingExtent( + this.startCoordinate, + mapBrowserEvent.getCoordinate()); + mapBrowserEvent.map.fitExtent(extent); + } +}; + + +/** + * @inheritDoc + */ +ol.control.DragZoom.prototype.handleDragStart = function(mapBrowserEvent) { + var browserEventObject = mapBrowserEvent.getBrowserEventObject(); + if (browserEventObject.shiftKey) { + browserEventObject.preventDefault(); + return true; + } else { + return false; + } +}; diff --git a/src/ol/ol.js b/src/ol/ol.js index 16f2a34e7f..56fc39ea9a 100644 --- a/src/ol/ol.js +++ b/src/ol/ol.js @@ -27,6 +27,7 @@ goog.require('ol.TransformFunction'); goog.require('ol.control.DblClickZoom'); goog.require('ol.control.Drag'); goog.require('ol.control.DragPan'); +goog.require('ol.control.DragZoom'); goog.require('ol.control.MouseWheelZoom'); goog.require('ol.createMap'); goog.require('ol.dom'); From d83235b5dc02c0f44983a04a9354d61d6a671439 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Thu, 19 Jul 2012 00:29:15 +0200 Subject: [PATCH 252/562] Include drag zoom control in default map --- src/ol/createmap.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/ol/createmap.js b/src/ol/createmap.js index dc5a783039..6558006dc1 100644 --- a/src/ol/createmap.js +++ b/src/ol/createmap.js @@ -8,6 +8,7 @@ goog.require('ol.MapProperty'); goog.require('ol.Projection'); goog.require('ol.control.DblClickZoom'); goog.require('ol.control.DragPan'); +goog.require('ol.control.DragZoom'); goog.require('ol.control.MouseWheelZoom'); goog.require('ol.dom'); goog.require('ol.dom.Map'); @@ -68,6 +69,7 @@ ol.createMap = function(target, opt_values, opt_rendererHints) { if (!goog.object.containsKey(values, ol.MapProperty.CONTROLS)) { var controls = new ol.Array(); controls.push(new ol.control.DblClickZoom()); + controls.push(new ol.control.DragZoom()); controls.push(new ol.control.DragPan()); controls.push(new ol.control.MouseWheelZoom()); values[ol.MapProperty.CONTROLS] = controls; From 5ace389ccb6306dc6864f51717281f9bc44a761e Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Thu, 19 Jul 2012 09:12:22 +0200 Subject: [PATCH 253/562] Redraw map when WebGL context is restored --- src/ol/webgl/map.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/ol/webgl/map.js b/src/ol/webgl/map.js index 60c6538f21..dccd636a28 100644 --- a/src/ol/webgl/map.js +++ b/src/ol/webgl/map.js @@ -408,6 +408,7 @@ ol.webgl.Map.prototype.handleWebGLContextRestored = function() { var gl = this.gl_; gl.disable(goog.webgl.CULL_FACE); gl.disable(goog.webgl.SCISSOR_TEST); + this.redraw(); }; From 43c32e6da7cb0f411488e4fda06ce328b195e853 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Thu, 19 Jul 2012 09:51:08 +0200 Subject: [PATCH 254/562] Differentiate between identity and clone transforms --- src/ol/projection.js | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/ol/projection.js b/src/ol/projection.js index 0bd6b5a00a..976cb894cf 100644 --- a/src/ol/projection.js +++ b/src/ol/projection.js @@ -93,7 +93,7 @@ ol.Projection.addEquivalentProjections = function(projections) { goog.array.forEach(projections, function(source) { goog.array.forEach(projections, function(destination) { ol.Projection.addTransform( - source, destination, ol.Projection.identityTransform); + source, destination, ol.Projection.cloneTransform); }); }); }; @@ -181,7 +181,7 @@ ol.Projection.equivalent = function(projection1, projection2) { return false; } else { var transform = ol.Projection.getTransform(projection1, projection2); - return transform === ol.Projection.identityTransform; + return transform === ol.Projection.cloneTransform; } }; @@ -219,6 +219,15 @@ ol.Projection.getTransformFromCodes = function(sourceCode, destinationCode) { * @return {goog.math.Coordinate} Point. */ ol.Projection.identityTransform = function(point) { + return point; +}; + + +/** + * @param {goog.math.Coordinate} point Point. + * @return {goog.math.Coordinate} Point. + */ +ol.Projection.cloneTransform = function(point) { return point.clone(); }; From 305462f57a6b85a4d3e7310f9533afd0c1557130 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Thu, 19 Jul 2012 09:56:04 +0200 Subject: [PATCH 255/562] Stricter type checking for map projection --- src/ol/map.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/ol/map.js b/src/ol/map.js index 0a1fd4ced6..61d0f152d1 100644 --- a/src/ol/map.js +++ b/src/ol/map.js @@ -1,3 +1,5 @@ +// FIXME recheck layer/map projection compatability when projection changes + goog.provide('ol.Map'); goog.provide('ol.MapProperty'); @@ -311,7 +313,7 @@ ol.Map.prototype.getPixelFromCoordinate = function(coordinate) { /** - * @return {ol.Projection} Projection. + * @return {ol.Projection|undefined} Projection. */ ol.Map.prototype.getProjection = function() { return /** @type {ol.Projection} */ (this.get(ol.MapProperty.PROJECTION)); @@ -390,7 +392,9 @@ ol.Map.prototype.handleCenterChanged = function() { ol.Map.prototype.handleLayerAdd = function(layer) { var projection = this.getProjection(); var storeProjection = layer.getStore().getProjection(); - goog.asserts.assert(ol.Projection.equivalent(projection, storeProjection)); + if (goog.isDef(projection)) { + goog.asserts.assert(ol.Projection.equivalent(projection, storeProjection)); + } var layerRenderer = this.createLayerRenderer(layer); this.setLayerRenderer(layer, layerRenderer); }; From e0d17ca09ceec24a2016c2ff45d3595584c0dd38 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Thu, 19 Jul 2012 10:01:30 +0200 Subject: [PATCH 256/562] Add user projections --- src/ol/map.js | 117 +++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 116 insertions(+), 1 deletion(-) diff --git a/src/ol/map.js b/src/ol/map.js index 61d0f152d1..4eab27e50c 100644 --- a/src/ol/map.js +++ b/src/ol/map.js @@ -24,6 +24,7 @@ goog.require('ol.Extent'); goog.require('ol.LayerRenderer'); goog.require('ol.Object'); goog.require('ol.Projection'); +goog.require('ol.TransformFunction'); /** @@ -37,7 +38,8 @@ ol.MapProperty = { LAYERS: 'layers', PROJECTION: 'projection', RESOLUTION: 'resolution', - SIZE: 'size' + SIZE: 'size', + USER_PROJECTION: 'userProjection' }; @@ -62,6 +64,18 @@ ol.Map = function(target, opt_values, opt_viewportSizeMonitor) { goog.base(this); + /** + * @type {ol.TransformFunction} + * @private + */ + this.userToMapTransform_ = ol.Projection.identityTransform; + + /** + * @type {ol.TransformFunction} + * @private + */ + this.mapToUserTransform_ = ol.Projection.cloneTransform; + /** * @private * @type {HTMLDivElement} @@ -147,6 +161,10 @@ ol.Map = function(target, opt_values, opt_viewportSizeMonitor) { this, ol.Object.getChangedEventType(ol.MapProperty.LAYERS), this.handleLayersChanged, false, this); + goog.events.listen( + this, ol.Object.getChangedEventType(ol.MapProperty.PROJECTION), + this.handleProjectionChanged, false, this); + goog.events.listen( this, ol.Object.getChangedEventType(ol.MapProperty.RESOLUTION), this.handleResolutionChanged, false, this); @@ -155,6 +173,10 @@ ol.Map = function(target, opt_values, opt_viewportSizeMonitor) { this, ol.Object.getChangedEventType(ol.MapProperty.SIZE), this.handleSizeChanged, false, this); + goog.events.listen( + this, ol.Object.getChangedEventType(ol.MapProperty.USER_PROJECTION), + this.handleUserProjectionChanged, false, this); + if (goog.isDef(opt_values)) { this.setValues(opt_values); } @@ -210,6 +232,14 @@ ol.Map.prototype.fitExtent = function(extent) { }; +/** + * @param {ol.Extent} userExtent Extent in user projection. + */ +ol.Map.prototype.fitUserExtent = function(userExtent) { + this.fitExtent(userExtent.transform(this.userToMapTransform_)); +}; + + /** * @param {function(this: T, ol.Layer, ol.LayerRenderer, number)} f Function. * @param {T=} opt_obj Object. @@ -358,6 +388,40 @@ ol.Map.prototype.getTarget = function() { }; +/** + * @return {goog.math.Coordinate|undefined} Center in user projection. + */ +ol.Map.prototype.getUserCenter = function() { + var center = this.getCenter(); + if (goog.isDef(center)) { + return this.mapToUserTransform_(center); + } else { + return undefined; + } +}; + + +/** + * @return {ol.Extent|undefined} Extent in user projection. + */ +ol.Map.prototype.getUserExtent = function() { + var extent = this.getExtent(); + if (goog.isDef(extent)) { + return extent.transform(this.mapToUserTransform_); + } else { + return undefined; + } +}; + + +/** + * @return {ol.Projection|undefined} Projection. + */ +ol.Map.prototype.getUserProjection = function() { + return /** @type {ol.Projection} */ this.get(ol.MapProperty.USER_PROJECTION); +}; + + /** */ ol.Map.prototype.handleBackgroundColorChanged = goog.nullFunction; @@ -473,6 +537,14 @@ ol.Map.prototype.handleLayersChanged = function() { }; +/** + * @protected + */ +ol.Map.prototype.handleProjectionChanged = function() { + this.recalculateTransforms_(); +}; + + /** * @protected */ @@ -489,6 +561,14 @@ ol.Map.prototype.handleSizeChanged = function() { }; +/** + * @protected + */ +ol.Map.prototype.handleUserProjectionChanged = function() { + this.recalculateTransforms_(); +}; + + /** * @protected */ @@ -521,6 +601,25 @@ ol.Map.prototype.recalculateExtent_ = function() { }; +/** + * @private + */ +ol.Map.prototype.recalculateTransforms_ = function() { + var projection = this.getProjection(); + var userProjection = this.getUserProjection(); + if (goog.isDefAndNotNull(projection) && + goog.isDefAndNotNull(userProjection)) { + this.mapToUserTransform_ = ol.Projection.getTransform( + projection, userProjection); + this.userToMapTransform_ = ol.Projection.getTransform( + userProjection, projection); + } else { + this.mapToUserTransform_ = ol.Projection.cloneTransform; + this.userToMapTransform_ = ol.Projection.identityTransform; + } +}; + + /** */ ol.Map.prototype.redraw = function() { @@ -644,6 +743,22 @@ ol.Map.prototype.setProjection = function(projection) { }; +/** + * @param {goog.math.Coordinate} userCenter Center in user projection. + */ +ol.Map.prototype.setUserCenter = function(userCenter) { + this.setCenter(this.userToMapTransform_(userCenter)); +}; + + +/** + * @param {ol.Projection} userProjection User projection. + */ +ol.Map.prototype.setUserProjection = function(userProjection) { + this.set(ol.MapProperty.USER_PROJECTION, userProjection); +}; + + /** * @param {function(this: T)} f Function. * @param {T=} opt_obj Object. From 5e39d051e6f9794fe052fcc34a666a02d01b16c0 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Thu, 19 Jul 2012 10:02:07 +0200 Subject: [PATCH 257/562] Set default user projection to EPSG:4326 --- src/ol/createmap.js | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/ol/createmap.js b/src/ol/createmap.js index 6558006dc1..1e2f375026 100644 --- a/src/ol/createmap.js +++ b/src/ol/createmap.js @@ -22,6 +22,12 @@ goog.require('ol.webgl.Map'); ol.DEFAULT_PROJECTION_CODE = 'EPSG:3857'; +/** + * @define {string} Default user projection code. + */ +ol.DEFAULT_USER_PROJECTION_CODE = 'EPSG:4326'; + + /** * @define {boolean} Whether to enable DOM. */ @@ -84,6 +90,11 @@ ol.createMap = function(target, opt_values, opt_rendererHints) { ol.Projection.getFromCode(ol.DEFAULT_PROJECTION_CODE); } + if (!goog.object.containsKey(values, ol.MapProperty.USER_PROJECTION)) { + values[ol.MapProperty.USER_PROJECTION] = + ol.Projection.getFromCode(ol.DEFAULT_USER_PROJECTION_CODE); + } + /** * @type {Array.} */ From 33d252f0f7b50b6f42616c2b2052e1cf80e3be5a Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Thu, 19 Jul 2012 10:08:35 +0200 Subject: [PATCH 258/562] Only start drag pan if shift key is not pressed --- src/ol/control/dragpan.js | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/ol/control/dragpan.js b/src/ol/control/dragpan.js index 4c8f85e22d..f0390b2c56 100644 --- a/src/ol/control/dragpan.js +++ b/src/ol/control/dragpan.js @@ -1,6 +1,5 @@ goog.provide('ol.control.DragPan'); -goog.require('goog.functions'); goog.require('goog.math.Coordinate'); goog.require('ol.MapBrowserEvent'); goog.require('ol.control.Drag'); @@ -33,4 +32,12 @@ ol.control.DragPan.prototype.handleDrag = function(mapBrowserEvent) { /** * @inheritDoc */ -ol.control.DragPan.prototype.handleDragStart = goog.functions.TRUE; +ol.control.DragPan.prototype.handleDragStart = function(mapBrowserEvent) { + var browserEventObject = mapBrowserEvent.getBrowserEventObject(); + if (!browserEventObject.shiftKey) { + browserEventObject.preventDefault(); + return true; + } else { + return false; + } +}; From d62ba69458ff6e1817e4163d6230a959ea4f0a71 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Thu, 19 Jul 2012 10:10:07 +0200 Subject: [PATCH 259/562] Order controls alphabetically --- src/ol/createmap.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ol/createmap.js b/src/ol/createmap.js index 1e2f375026..cb11f5891a 100644 --- a/src/ol/createmap.js +++ b/src/ol/createmap.js @@ -75,8 +75,8 @@ ol.createMap = function(target, opt_values, opt_rendererHints) { if (!goog.object.containsKey(values, ol.MapProperty.CONTROLS)) { var controls = new ol.Array(); controls.push(new ol.control.DblClickZoom()); - controls.push(new ol.control.DragZoom()); controls.push(new ol.control.DragPan()); + controls.push(new ol.control.DragZoom()); controls.push(new ol.control.MouseWheelZoom()); values[ol.MapProperty.CONTROLS] = controls; } From c547404615045b2872310f734bf34c67846aa73d Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Thu, 19 Jul 2012 10:34:12 +0200 Subject: [PATCH 260/562] Create ol.Coordinate around goog.math.Coordinate --- skeleton.js | 4 +- src/ol/control/drag.js | 5 ++- src/ol/control/dragpan.js | 4 +- src/ol/coordinate.js | 24 ++++++++++++ src/ol/dom/layerrenderer.js | 5 ++- src/ol/dom/map.js | 10 ++--- src/ol/dom/tilelayerrenderer.js | 5 ++- src/ol/extent.js | 7 ++-- src/ol/extent_test.js | 1 - src/ol/map.js | 24 ++++++------ src/ol/mapbrowserevent.js | 8 ++-- src/ol/projection.js | 30 +++++++-------- src/ol/projection_test.js | 12 +++--- src/ol/rectangle.js | 14 +++---- src/ol/rectangle_test.js | 62 +++++++++++++++--------------- src/ol/tilecoord.js | 6 +-- src/ol/tilegrid/openstreetmap.js | 4 +- src/ol/tilegrid/tilegrid.js | 24 ++++++------ src/ol/tilegrid/tilegrid_test.js | 26 ++++++------- src/ol/tilestore/tilestore_test.js | 4 +- src/ol/transformfunction.js | 4 +- src/ol/webgl/tilelayerrenderer.js | 3 +- 22 files changed, 155 insertions(+), 131 deletions(-) create mode 100644 src/ol/coordinate.js diff --git a/skeleton.js b/skeleton.js index 30f5db27a7..5f01f80e5d 100644 --- a/skeleton.js +++ b/skeleton.js @@ -1,5 +1,5 @@ -goog.require('goog.math.Coordinate'); goog.require('goog.object'); +goog.require('ol.Coordinate'); goog.require('ol.RendererHint'); goog.require('ol.createMap'); goog.require('ol.tilelayer.createOpenStreetMap'); @@ -18,7 +18,7 @@ layer = ol.tilelayer.createOpenStreetMap({ map.getLayers().push(layer); var resolutions = layer.getStore().getResolutions(); -map1.setCenter(new goog.math.Coordinate(0, 0)); +map1.setCenter(new ol.Coordinate(0, 0)); map1.setResolution(resolutions[0]); if (twoMaps) { diff --git a/src/ol/control/drag.js b/src/ol/control/drag.js index 3f54b46ea4..bbc7703d24 100644 --- a/src/ol/control/drag.js +++ b/src/ol/control/drag.js @@ -6,6 +6,7 @@ goog.provide('ol.control.Drag'); goog.require('goog.events.EventType'); goog.require('goog.functions'); goog.require('ol.Control'); +goog.require('ol.Coordinate'); goog.require('ol.MapBrowserEvent'); @@ -45,12 +46,12 @@ ol.control.Drag = function() { this.offsetY = 0; /** - * @type {goog.math.Coordinate} + * @type {ol.Coordinate} */ this.startCenter = null; /** - * @type {goog.math.Coordinate} + * @type {ol.Coordinate} */ this.startCoordinate = null; diff --git a/src/ol/control/dragpan.js b/src/ol/control/dragpan.js index f0390b2c56..d02d7cee9f 100644 --- a/src/ol/control/dragpan.js +++ b/src/ol/control/dragpan.js @@ -1,6 +1,6 @@ goog.provide('ol.control.DragPan'); -goog.require('goog.math.Coordinate'); +goog.require('ol.Coordinate'); goog.require('ol.MapBrowserEvent'); goog.require('ol.control.Drag'); @@ -22,7 +22,7 @@ goog.inherits(ol.control.DragPan, ol.control.Drag); ol.control.DragPan.prototype.handleDrag = function(mapBrowserEvent) { var map = mapBrowserEvent.map; var resolution = map.getResolution(); - var center = new goog.math.Coordinate( + var center = new ol.Coordinate( this.startCenter.x - resolution * this.deltaX, this.startCenter.y + resolution * this.deltaY); map.setCenter(center); diff --git a/src/ol/coordinate.js b/src/ol/coordinate.js new file mode 100644 index 0000000000..2c22bd98a0 --- /dev/null +++ b/src/ol/coordinate.js @@ -0,0 +1,24 @@ +goog.provide('ol.Coordinate'); + +goog.require('goog.math.Coordinate'); + + + +/** + * @constructor + * @extends {goog.math.Coordinate} + * @param {number} x X. + * @param {number} y Y. + */ +ol.Coordinate = function(x, y) { + goog.base(this, x, y); +}; +goog.inherits(ol.Coordinate, goog.math.Coordinate); + + +/** + * @return {ol.Coordinate} Clone. + */ +ol.Coordinate.prototype.clone = function() { + return new ol.Coordinate(this.x, this.y); +}; diff --git a/src/ol/dom/layerrenderer.js b/src/ol/dom/layerrenderer.js index 6707d103ff..98a99456e6 100644 --- a/src/ol/dom/layerrenderer.js +++ b/src/ol/dom/layerrenderer.js @@ -1,5 +1,6 @@ goog.provide('ol.dom.LayerRenderer'); +goog.require('ol.Coordinate'); goog.require('ol.LayerRenderer'); @@ -23,7 +24,7 @@ ol.dom.LayerRenderer = function(map, layer, target) { /** * Top left corner of the target in map coords. * - * @type {goog.math.Coordinate} + * @type {ol.Coordinate} * @protected */ this.origin = null; @@ -44,7 +45,7 @@ ol.dom.LayerRenderer.prototype.getMap = function() { /** * Set the location of the top left corner of the target. * - * @param {goog.math.Coordinate} origin Origin. + * @param {ol.Coordinate} origin Origin. */ ol.dom.LayerRenderer.prototype.setOrigin = function(origin) { this.origin = origin; diff --git a/src/ol/dom/map.js b/src/ol/dom/map.js index 2225346b63..79faa165fe 100644 --- a/src/ol/dom/map.js +++ b/src/ol/dom/map.js @@ -3,8 +3,8 @@ goog.provide('ol.dom.Map'); goog.require('goog.asserts'); goog.require('goog.dom'); goog.require('goog.dom.TagName'); -goog.require('goog.math.Coordinate'); goog.require('goog.style'); +goog.require('ol.Coordinate'); goog.require('ol.Map'); goog.require('ol.TileLayer'); goog.require('ol.dom.TileLayerRenderer'); @@ -48,7 +48,7 @@ ol.dom.Map = function(target, opt_values) { this.layerPanes_ = {}; /** - * @type {goog.math.Coordinate|undefined} + * @type {ol.Coordinate|undefined} * @private */ this.renderedCenter_ = undefined; @@ -56,7 +56,7 @@ ol.dom.Map = function(target, opt_values) { /** * The pixel offset of the layers pane with respect to its container. * - * @type {goog.math.Coordinate} + * @type {ol.Coordinate} * @private */ this.layersPaneOffset_ = null; @@ -77,7 +77,7 @@ goog.inherits(ol.dom.Map, ol.Map); * @private */ ol.dom.Map.prototype.resetLayersPane_ = function() { - var offset = new goog.math.Coordinate(0, 0); + var offset = new ol.Coordinate(0, 0); goog.style.setPosition(this.layersPane_, offset); this.layersPaneOffset_ = offset; @@ -97,7 +97,7 @@ ol.dom.Map.prototype.setOrigin_ = function() { var targetSize = this.getSize(); var targetWidth = targetSize.width; var targetHeight = targetSize.height; - var origin = new goog.math.Coordinate( + var origin = new ol.Coordinate( center.x - resolution * targetWidth / 2, center.y + resolution * targetHeight / 2); goog.object.forEach(this.layerRenderers, function(layerRenderer) { diff --git a/src/ol/dom/tilelayerrenderer.js b/src/ol/dom/tilelayerrenderer.js index 6941bded32..1a49082e78 100644 --- a/src/ol/dom/tilelayerrenderer.js +++ b/src/ol/dom/tilelayerrenderer.js @@ -1,5 +1,6 @@ goog.provide('ol.dom.TileLayerRenderer'); +goog.require('ol.Coordinate'); goog.require('ol.dom.LayerRenderer'); @@ -91,7 +92,7 @@ ol.dom.TileLayerRenderer.prototype.redraw = function() { * @param {ol.Extent} extent Map extent. * @param {ol.TileBounds} tileBounds Tile bounds. * @param {number} resolution Resolution. - * @return {goog.math.Coordinate} Offset. + * @return {ol.Coordinate} Offset. */ ol.dom.TileLayerRenderer.prototype.getTilesMapOffset_ = function( extent, tileBounds, resolution) { @@ -103,7 +104,7 @@ ol.dom.TileLayerRenderer.prototype.getTilesMapOffset_ = function( var tileCoord = new ol.TileCoord(z, tileBounds.minX, tileBounds.maxY); var tileCoordExtent = tileGrid.getTileCoordExtent(tileCoord); - var offset = new goog.math.Coordinate( + var offset = new ol.Coordinate( Math.round((this.origin.x - tileCoordExtent.minX) / resolution), Math.round((tileCoordExtent.maxY - this.origin.y) / resolution)); diff --git a/src/ol/extent.js b/src/ol/extent.js index 8807bc5c00..0e8db0a3ff 100644 --- a/src/ol/extent.js +++ b/src/ol/extent.js @@ -1,5 +1,6 @@ goog.provide('ol.Extent'); +goog.require('ol.Coordinate'); goog.require('ol.Rectangle'); goog.require('ol.TransformFunction'); @@ -20,7 +21,7 @@ goog.inherits(ol.Extent, ol.Rectangle); /** - * @param {...goog.math.Coordinate} var_args Coordinates. + * @param {...ol.Coordinate} var_args Coordinates. * @return {!ol.Extent} Boundin extent. */ ol.Extent.boundingExtent = function(var_args) { @@ -52,7 +53,7 @@ ol.Extent.prototype.clone = function() { * @return {ol.Extent} Extent. */ ol.Extent.prototype.transform = function(transform) { - var min = transform(new goog.math.Coordinate(this.minX, this.minY)); - var max = transform(new goog.math.Coordinate(this.maxX, this.maxY)); + var min = transform(new ol.Coordinate(this.minX, this.minY)); + var max = transform(new ol.Coordinate(this.maxX, this.maxY)); return new ol.Extent(min.x, min.y, max.x, max.y); }; diff --git a/src/ol/extent_test.js b/src/ol/extent_test.js index 45b8997fed..4cf509f607 100644 --- a/src/ol/extent_test.js +++ b/src/ol/extent_test.js @@ -1,4 +1,3 @@ -goog.require('goog.math.Coordinate'); goog.require('goog.testing.jsunit'); goog.require('ol.Extent'); goog.require('ol.Projection'); diff --git a/src/ol/map.js b/src/ol/map.js index 4eab27e50c..e98aa3f1d1 100644 --- a/src/ol/map.js +++ b/src/ol/map.js @@ -15,11 +15,11 @@ goog.require('goog.events.MouseWheelHandler'); goog.require('goog.events.MouseWheelHandler.EventType'); goog.require('goog.fx.anim'); goog.require('goog.fx.anim.Animated'); -goog.require('goog.math.Coordinate'); goog.require('goog.math.Size'); goog.require('goog.object'); goog.require('ol.Array'); goog.require('ol.Control'); +goog.require('ol.Coordinate'); goog.require('ol.Extent'); goog.require('ol.LayerRenderer'); goog.require('ol.Object'); @@ -264,10 +264,10 @@ ol.Map.prototype.getBackgroundColor = function() { /** - * @return {goog.math.Coordinate|undefined} Center. + * @return {ol.Coordinate|undefined} Center. */ ol.Map.prototype.getCenter = function() { - return /** @type {goog.math.Coordinate} */ (this.get(ol.MapProperty.CENTER)); + return /** @type {ol.Coordinate} */ (this.get(ol.MapProperty.CENTER)); }; @@ -280,8 +280,8 @@ ol.Map.prototype.getControls = function() { /** - * @param {goog.math.Coordinate} pixel Pixel. - * @return {goog.math.Coordinate} Coordinate. + * @param {ol.Coordinate} pixel Pixel. + * @return {ol.Coordinate} Coordinate. */ ol.Map.prototype.getCoordinateFromPixel = function(pixel) { var center = this.getCenter(); @@ -292,7 +292,7 @@ ol.Map.prototype.getCoordinateFromPixel = function(pixel) { goog.asserts.assert(goog.isDef(size)); var x = center.x + resolution * (pixel.x - size.width / 2); var y = center.y - resolution * (pixel.y - size.height / 2); - return new goog.math.Coordinate(x, y); + return new ol.Coordinate(x, y); }; @@ -326,8 +326,8 @@ ol.Map.prototype.getLayers = function() { /** - * @param {goog.math.Coordinate} coordinate Coordinate. - * @return {goog.math.Coordinate} Pixel. + * @param {ol.Coordinate} coordinate Coordinate. + * @return {ol.Coordinate} Pixel. */ ol.Map.prototype.getPixelFromCoordinate = function(coordinate) { var center = this.getCenter(); @@ -338,7 +338,7 @@ ol.Map.prototype.getPixelFromCoordinate = function(coordinate) { goog.asserts.assert(goog.isDef(size)); var x = (coordinate.x - center.x) / resolution + size.width / 2; var y = (center.y - coordinate.y) / resolution + size.height / 2; - return new goog.math.Coordinate(x, y); + return new ol.Coordinate(x, y); }; @@ -389,7 +389,7 @@ ol.Map.prototype.getTarget = function() { /** - * @return {goog.math.Coordinate|undefined} Center in user projection. + * @return {ol.Coordinate|undefined} Center in user projection. */ ol.Map.prototype.getUserCenter = function() { var center = this.getCenter(); @@ -681,7 +681,7 @@ ol.Map.prototype.setBackgroundColor = function(backgroundColor) { /** - * @param {goog.math.Coordinate} center Center. + * @param {ol.Coordinate} center Center. */ ol.Map.prototype.setCenter = function(center) { this.set(ol.MapProperty.CENTER, center); @@ -744,7 +744,7 @@ ol.Map.prototype.setProjection = function(projection) { /** - * @param {goog.math.Coordinate} userCenter Center in user projection. + * @param {ol.Coordinate} userCenter Center in user projection. */ ol.Map.prototype.setUserCenter = function(userCenter) { this.setCenter(this.userToMapTransform_(userCenter)); diff --git a/src/ol/mapbrowserevent.js b/src/ol/mapbrowserevent.js index c78a4c0844..95716b0ec4 100644 --- a/src/ol/mapbrowserevent.js +++ b/src/ol/mapbrowserevent.js @@ -1,7 +1,7 @@ goog.provide('ol.MapBrowserEvent'); goog.require('goog.events.BrowserEvent'); -goog.require('goog.math.Coordinate'); +goog.require('ol.Coordinate'); goog.require('ol.MapEvent'); @@ -29,20 +29,20 @@ goog.inherits(ol.MapBrowserEvent, ol.MapEvent); /** * @private - * @type {goog.math.Coordinate} + * @type {ol.Coordinate} */ ol.MapBrowserEvent.prototype.coordinate_; /** - * @return {goog.math.Coordinate} Coordinate. + * @return {ol.Coordinate} Coordinate. */ ol.MapBrowserEvent.prototype.getCoordinate = function() { if (goog.isDef(this.coordinate_)) { return this.coordinate_; } else { var browserEventObject = this.getBrowserEventObject(); - var pixel = new goog.math.Coordinate( + var pixel = new ol.Coordinate( browserEventObject.offsetX, browserEventObject.offsetY); var coordinate = this.map.getCoordinateFromPixel(pixel); this.coordinate_ = coordinate; diff --git a/src/ol/projection.js b/src/ol/projection.js index 976cb894cf..84ce030a80 100644 --- a/src/ol/projection.js +++ b/src/ol/projection.js @@ -2,8 +2,8 @@ goog.provide('ol.Projection'); goog.require('goog.array'); goog.require('goog.asserts'); -goog.require('goog.math.Coordinate'); goog.require('goog.object'); +goog.require('ol.Coordinate'); goog.require('ol.Extent'); goog.require('ol.TransformFunction'); @@ -215,8 +215,8 @@ ol.Projection.getTransformFromCodes = function(sourceCode, destinationCode) { /** - * @param {goog.math.Coordinate} point Point. - * @return {goog.math.Coordinate} Point. + * @param {ol.Coordinate} point Point. + * @return {ol.Coordinate} Point. */ ol.Projection.identityTransform = function(point) { return point; @@ -224,8 +224,8 @@ ol.Projection.identityTransform = function(point) { /** - * @param {goog.math.Coordinate} point Point. - * @return {goog.math.Coordinate} Point. + * @param {ol.Coordinate} point Point. + * @return {ol.Coordinate} Point. */ ol.Projection.cloneTransform = function(point) { return point.clone(); @@ -233,10 +233,10 @@ ol.Projection.cloneTransform = function(point) { /** - * @param {goog.math.Coordinate} point Point. + * @param {ol.Coordinate} point Point. * @param {ol.Projection} source Source. * @param {ol.Projection} destination Destination. - * @return {goog.math.Coordinate} Point. + * @return {ol.Coordinate} Point. */ ol.Projection.transform = function(point, source, destination) { var transform = ol.Projection.getTransform(source, destination); @@ -245,10 +245,10 @@ ol.Projection.transform = function(point, source, destination) { /** - * @param {goog.math.Coordinate} point Point. + * @param {ol.Coordinate} point Point. * @param {string} sourceCode Source code. * @param {string} destinationCode Destination code. - * @return {goog.math.Coordinate} Point. + * @return {ol.Coordinate} Point. */ ol.Projection.transformWithCodes = function(point, sourceCode, destinationCode) { @@ -266,26 +266,26 @@ ol.Projection.EPSG_3857_RADIUS = 6378137; /** - * @param {goog.math.Coordinate} point Point. - * @return {goog.math.Coordinate} Point. + * @param {ol.Coordinate} point Point. + * @return {ol.Coordinate} Point. */ ol.Projection.forwardSphericalMercator = function(point) { var x = ol.Projection.EPSG_3857_RADIUS * Math.PI * point.x / 180; var y = ol.Projection.EPSG_3857_RADIUS * Math.log(Math.tan(Math.PI * (point.y + 90) / 360)); - return new goog.math.Coordinate(x, y); + return new ol.Coordinate(x, y); }; /** - * @param {goog.math.Coordinate} point Point. - * @return {goog.math.Coordinate} Point. + * @param {ol.Coordinate} point Point. + * @return {ol.Coordinate} Point. */ ol.Projection.inverseSphericalMercator = function(point) { var x = 180 * point.x / (ol.Projection.EPSG_3857_RADIUS * Math.PI); var y = 360 * Math.atan( Math.exp(point.y / ol.Projection.EPSG_3857_RADIUS)) / Math.PI - 90; - return new goog.math.Coordinate(x, y); + return new ol.Coordinate(x, y); }; diff --git a/src/ol/projection_test.js b/src/ol/projection_test.js index 7200f1236a..d105ace417 100644 --- a/src/ol/projection_test.js +++ b/src/ol/projection_test.js @@ -1,6 +1,6 @@ goog.require('goog.array'); -goog.require('goog.math.Coordinate'); goog.require('goog.testing.jsunit'); +goog.require('ol.Coordinate'); goog.require('ol.Projection'); @@ -36,7 +36,7 @@ function testEpsg4326Equivalence() { function testIdentityTransform() { var epsg4326 = ol.Projection.getFromCode('EPSG:4326'); var uniqueObject = {}; - var sourcePoint = new goog.math.Coordinate(uniqueObject, uniqueObject); + var sourcePoint = new ol.Coordinate(uniqueObject, uniqueObject); var destinationPoint = ol.Projection.transform( sourcePoint, epsg4326, epsg4326); assertFalse(sourcePoint === destinationPoint); @@ -47,7 +47,7 @@ function testIdentityTransform() { function testForwardSphericalMercatorOrigin() { var point = ol.Projection.transformWithCodes( - new goog.math.Coordinate(0, 0), 'EPSG:4326', 'EPSG:3857'); + new ol.Coordinate(0, 0), 'EPSG:4326', 'EPSG:3857'); assertNotNullNorUndefined(point); assertEquals(0, point.x); assertRoughlyEquals(0, point.y, 1e-9); @@ -56,7 +56,7 @@ function testForwardSphericalMercatorOrigin() { function testInverseSphericalMercatorOrigin() { var point = ol.Projection.transformWithCodes( - new goog.math.Coordinate(0, 0), 'EPSG:3857', 'EPSG:4326'); + new ol.Coordinate(0, 0), 'EPSG:3857', 'EPSG:4326'); assertNotNullNorUndefined(point); assertEquals(0, point.x); assertEquals(0, point.y); @@ -66,7 +66,7 @@ function testInverseSphericalMercatorOrigin() { function testForwardSphericalMercatorAlastaira() { // http://alastaira.wordpress.com/2011/01/23/the-google-maps-bing-maps-spherical-mercator-projection/ var point = ol.Projection.transformWithCodes( - new goog.math.Coordinate(-5.625, 52.4827802220782), + new ol.Coordinate(-5.625, 52.4827802220782), 'EPSG:4326', 'EPSG:900913'); assertNotNullNorUndefined(point); @@ -78,7 +78,7 @@ function testForwardSphericalMercatorAlastaira() { function testInverseSphericalMercatorAlastaira() { // http://alastaira.wordpress.com/2011/01/23/the-google-maps-bing-maps-spherical-mercator-projection/ var point = ol.Projection.transformWithCodes( - new goog.math.Coordinate(-626172.13571216376, 6887893.4928337997), + new ol.Coordinate(-626172.13571216376, 6887893.4928337997), 'EPSG:900913', 'EPSG:4326'); assertNotNullNorUndefined(point); diff --git a/src/ol/rectangle.js b/src/ol/rectangle.js index c0a3d3eba6..2b099e899a 100644 --- a/src/ol/rectangle.js +++ b/src/ol/rectangle.js @@ -1,8 +1,8 @@ goog.provide('ol.Rectangle'); goog.require('goog.asserts'); -goog.require('goog.math.Coordinate'); goog.require('goog.math.Size'); +goog.require('ol.Coordinate'); @@ -63,7 +63,7 @@ ol.Rectangle.prototype.clone = function() { /** - * @param {goog.math.Coordinate} coordinate Coordinate. + * @param {ol.Coordinate} coordinate Coordinate. * @return {boolean} Contains. */ ol.Rectangle.prototype.contains = function(coordinate) { @@ -73,10 +73,10 @@ ol.Rectangle.prototype.contains = function(coordinate) { /** - * @return {goog.math.Coordinate} Center. + * @return {ol.Coordinate} Center. */ ol.Rectangle.prototype.getCenter = function() { - return new goog.math.Coordinate( + return new ol.Coordinate( (this.minX + this.maxX) / 2, (this.minY + this.maxY) / 2); }; @@ -106,11 +106,11 @@ ol.Rectangle.prototype.getWidth = function() { /** - * @param {goog.math.Coordinate} coordinate Coordinate. - * @return {goog.math.Coordinate} Coordinate. + * @param {ol.Coordinate} coordinate Coordinate. + * @return {ol.Coordinate} Coordinate. */ ol.Rectangle.prototype.normalize = function(coordinate) { - return new goog.math.Coordinate( + return new ol.Coordinate( (coordinate.x - this.minX) / this.getWidth(), (coordinate.y - this.minY) / this.getHeight()); }; diff --git a/src/ol/rectangle_test.js b/src/ol/rectangle_test.js index a492f4afe2..3e5d716f1c 100644 --- a/src/ol/rectangle_test.js +++ b/src/ol/rectangle_test.js @@ -1,5 +1,5 @@ -goog.require('goog.math.Coordinate'); goog.require('goog.testing.jsunit'); +goog.require('ol.Coordinate'); goog.require('ol.Rectangle'); @@ -25,36 +25,36 @@ function testClone() { function testContainsPositive() { var rectangle = new ol.Rectangle(1, 2, 3, 4); - assertTrue(rectangle.contains(new goog.math.Coordinate(1, 2))); - assertTrue(rectangle.contains(new goog.math.Coordinate(1, 3))); - assertTrue(rectangle.contains(new goog.math.Coordinate(1, 4))); - assertTrue(rectangle.contains(new goog.math.Coordinate(2, 2))); - assertTrue(rectangle.contains(new goog.math.Coordinate(2, 3))); - assertTrue(rectangle.contains(new goog.math.Coordinate(2, 4))); - assertTrue(rectangle.contains(new goog.math.Coordinate(3, 2))); - assertTrue(rectangle.contains(new goog.math.Coordinate(3, 3))); - assertTrue(rectangle.contains(new goog.math.Coordinate(3, 4))); + assertTrue(rectangle.contains(new ol.Coordinate(1, 2))); + assertTrue(rectangle.contains(new ol.Coordinate(1, 3))); + assertTrue(rectangle.contains(new ol.Coordinate(1, 4))); + assertTrue(rectangle.contains(new ol.Coordinate(2, 2))); + assertTrue(rectangle.contains(new ol.Coordinate(2, 3))); + assertTrue(rectangle.contains(new ol.Coordinate(2, 4))); + assertTrue(rectangle.contains(new ol.Coordinate(3, 2))); + assertTrue(rectangle.contains(new ol.Coordinate(3, 3))); + assertTrue(rectangle.contains(new ol.Coordinate(3, 4))); } function testContainsNegative() { var rectangle = new ol.Rectangle(1, 2, 3, 4); - assertFalse(rectangle.contains(new goog.math.Coordinate(0, 1))); - assertFalse(rectangle.contains(new goog.math.Coordinate(0, 2))); - assertFalse(rectangle.contains(new goog.math.Coordinate(0, 3))); - assertFalse(rectangle.contains(new goog.math.Coordinate(0, 4))); - assertFalse(rectangle.contains(new goog.math.Coordinate(0, 5))); - assertFalse(rectangle.contains(new goog.math.Coordinate(1, 1))); - assertFalse(rectangle.contains(new goog.math.Coordinate(1, 5))); - assertFalse(rectangle.contains(new goog.math.Coordinate(2, 1))); - assertFalse(rectangle.contains(new goog.math.Coordinate(2, 5))); - assertFalse(rectangle.contains(new goog.math.Coordinate(3, 1))); - assertFalse(rectangle.contains(new goog.math.Coordinate(3, 5))); - assertFalse(rectangle.contains(new goog.math.Coordinate(4, 1))); - assertFalse(rectangle.contains(new goog.math.Coordinate(4, 2))); - assertFalse(rectangle.contains(new goog.math.Coordinate(4, 3))); - assertFalse(rectangle.contains(new goog.math.Coordinate(4, 4))); - assertFalse(rectangle.contains(new goog.math.Coordinate(4, 5))); + assertFalse(rectangle.contains(new ol.Coordinate(0, 1))); + assertFalse(rectangle.contains(new ol.Coordinate(0, 2))); + assertFalse(rectangle.contains(new ol.Coordinate(0, 3))); + assertFalse(rectangle.contains(new ol.Coordinate(0, 4))); + assertFalse(rectangle.contains(new ol.Coordinate(0, 5))); + assertFalse(rectangle.contains(new ol.Coordinate(1, 1))); + assertFalse(rectangle.contains(new ol.Coordinate(1, 5))); + assertFalse(rectangle.contains(new ol.Coordinate(2, 1))); + assertFalse(rectangle.contains(new ol.Coordinate(2, 5))); + assertFalse(rectangle.contains(new ol.Coordinate(3, 1))); + assertFalse(rectangle.contains(new ol.Coordinate(3, 5))); + assertFalse(rectangle.contains(new ol.Coordinate(4, 1))); + assertFalse(rectangle.contains(new ol.Coordinate(4, 2))); + assertFalse(rectangle.contains(new ol.Coordinate(4, 3))); + assertFalse(rectangle.contains(new ol.Coordinate(4, 4))); + assertFalse(rectangle.contains(new ol.Coordinate(4, 5))); } @@ -113,23 +113,23 @@ function testNormalize() { var rectangle = new ol.Rectangle(0, 1, 2, 3); var coordinate; - coordinate = rectangle.normalize(new goog.math.Coordinate(1, 2)); + coordinate = rectangle.normalize(new ol.Coordinate(1, 2)); assertEquals(0.5, coordinate.x); assertEquals(0.5, coordinate.y); - coordinate = rectangle.normalize(new goog.math.Coordinate(0, 3)); + coordinate = rectangle.normalize(new ol.Coordinate(0, 3)); assertEquals(0, coordinate.x); assertEquals(1, coordinate.y); - coordinate = rectangle.normalize(new goog.math.Coordinate(2, 1)); + coordinate = rectangle.normalize(new ol.Coordinate(2, 1)); assertEquals(1, coordinate.x); assertEquals(0, coordinate.y); - coordinate = rectangle.normalize(new goog.math.Coordinate(0, 0)); + coordinate = rectangle.normalize(new ol.Coordinate(0, 0)); assertEquals(0, coordinate.x); assertEquals(-0.5, coordinate.y); - coordinate = rectangle.normalize(new goog.math.Coordinate(-1, 1)); + coordinate = rectangle.normalize(new ol.Coordinate(-1, 1)); assertEquals(-0.5, coordinate.x); assertEquals(0, coordinate.y); diff --git a/src/ol/tilecoord.js b/src/ol/tilecoord.js index d1525ae6a6..693fa8b870 100644 --- a/src/ol/tilecoord.js +++ b/src/ol/tilecoord.js @@ -1,13 +1,13 @@ goog.provide('ol.TileCoord'); goog.require('goog.array'); -goog.require('goog.math.Coordinate'); +goog.require('ol.Coordinate'); /** * @constructor - * @extends {goog.math.Coordinate} + * @extends {ol.Coordinate} * @param {number} z Z. * @param {number} x X. * @param {number} y Y. @@ -22,7 +22,7 @@ ol.TileCoord = function(z, x, y) { this.z = z; }; -goog.inherits(ol.TileCoord, goog.math.Coordinate); +goog.inherits(ol.TileCoord, ol.Coordinate); /** diff --git a/src/ol/tilegrid/openstreetmap.js b/src/ol/tilegrid/openstreetmap.js index 7e8955c0d6..c3778fc55d 100644 --- a/src/ol/tilegrid/openstreetmap.js +++ b/src/ol/tilegrid/openstreetmap.js @@ -1,7 +1,7 @@ goog.provide('ol.tilegrid.createOpenStreetMap'); -goog.require('goog.math.Coordinate'); goog.require('goog.math.Size'); +goog.require('ol.Coordinate'); goog.require('ol.Projection'); goog.require('ol.TileGrid'); @@ -19,7 +19,7 @@ ol.tilegrid.createOpenStreetMap = function(maxZoom) { } var extent = ol.Projection.EPSG_3857_EXTENT; - var origin = new goog.math.Coordinate( + var origin = new ol.Coordinate( -ol.Projection.EPSG_3857_HALF_SIZE, ol.Projection.EPSG_3857_HALF_SIZE); var tileSize = new goog.math.Size(256, 256); diff --git a/src/ol/tilegrid/tilegrid.js b/src/ol/tilegrid/tilegrid.js index 3e5f3ca51a..75406a104d 100644 --- a/src/ol/tilegrid/tilegrid.js +++ b/src/ol/tilegrid/tilegrid.js @@ -2,8 +2,8 @@ goog.provide('ol.TileGrid'); goog.require('goog.array'); goog.require('goog.asserts'); -goog.require('goog.math.Coordinate'); goog.require('goog.math.Size'); +goog.require('ol.Coordinate'); goog.require('ol.Extent'); goog.require('ol.TileBounds'); goog.require('ol.TileCoord'); @@ -14,7 +14,7 @@ goog.require('ol.TileCoord'); * @constructor * @param {!Array.} resolutions Resolutions. * @param {ol.Extent} extent Extent. - * @param {goog.math.Coordinate|!Array.} origin Origin. + * @param {ol.Coordinate|!Array.} origin Origin. * @param {goog.math.Size=} opt_tileSize Tile size. */ ol.TileGrid = function(resolutions, extent, origin, opt_tileSize) { @@ -42,17 +42,17 @@ ol.TileGrid = function(resolutions, extent, origin, opt_tileSize) { /** * @private - * @type {goog.math.Coordinate} + * @type {ol.Coordinate} */ this.origin_ = null; /** * @private - * @type {Array.} + * @type {Array.} */ this.origins_ = null; - if (origin instanceof goog.math.Coordinate) { + if (origin instanceof ol.Coordinate) { this.origin_ = origin; } else if (goog.isArray(origin)) { goog.asserts.assert(origin.length == this.numResolutions_); @@ -101,17 +101,15 @@ ol.TileGrid.prototype.getExtent = function() { * @return {ol.TileBounds} Tile bounds. */ ol.TileGrid.prototype.getExtentTileBounds = function(z, extent) { - var min = - this.getTileCoord(z, new goog.math.Coordinate(extent.minX, extent.minY)); - var max = - this.getTileCoord(z, new goog.math.Coordinate(extent.maxX, extent.maxY)); + var min = this.getTileCoord(z, new ol.Coordinate(extent.minX, extent.minY)); + var max = this.getTileCoord(z, new ol.Coordinate(extent.maxX, extent.maxY)); return new ol.TileBounds(min.x, min.y, max.x, max.y); }; /** * @param {number} z Z. - * @return {goog.math.Coordinate} Origin. + * @return {ol.Coordinate} Origin. */ ol.TileGrid.prototype.getOrigin = function(z) { if (!goog.isNull(this.origin_)) { @@ -144,7 +142,7 @@ ol.TileGrid.prototype.getResolutions = function() { /** * @param {number} z Z. - * @param {goog.math.Coordinate} coordinate Coordinate. + * @param {ol.Coordinate} coordinate Coordinate. * @return {ol.TileCoord} Tile coordinate. */ ol.TileGrid.prototype.getTileCoord = function(z, coordinate) { @@ -160,7 +158,7 @@ ol.TileGrid.prototype.getTileCoord = function(z, coordinate) { /** * @param {ol.TileCoord} tileCoord Tile coordinate. - * @return {goog.math.Coordinate} Tile center. + * @return {ol.Coordinate} Tile center. */ ol.TileGrid.prototype.getTileCoordCenter = function(tileCoord) { var origin = this.getOrigin(tileCoord.z); @@ -168,7 +166,7 @@ ol.TileGrid.prototype.getTileCoordCenter = function(tileCoord) { var tileSize = this.tileSize_; var x = origin.x + (tileCoord.x + 0.5) * tileSize.width * resolution; var y = origin.y + (tileCoord.y + 0.5) * tileSize.height * resolution; - return new goog.math.Coordinate(x, y); + return new ol.Coordinate(x, y); }; diff --git a/src/ol/tilegrid/tilegrid_test.js b/src/ol/tilegrid/tilegrid_test.js index 68278cb614..0b609390fd 100644 --- a/src/ol/tilegrid/tilegrid_test.js +++ b/src/ol/tilegrid/tilegrid_test.js @@ -1,6 +1,6 @@ -goog.require('goog.math.Coordinate'); goog.require('goog.math.Size'); goog.require('goog.testing.jsunit'); +goog.require('ol.Coordinate'); goog.require('ol.Extent'); goog.require('ol.TileCoord'); goog.require('ol.TileGrid'); @@ -16,7 +16,7 @@ var tileSize; function setUp() { resolutions = [1000, 500, 250, 100]; extent = new ol.Extent(0, 0, 100000, 100000); - origin = new goog.math.Coordinate(0, 0); + origin = new ol.Coordinate(0, 0); origins = []; tileSize = new goog.math.Size(100, 100); } @@ -74,27 +74,26 @@ function testCreateTooManyOrigins() { function testGetTileCoord() { - origin = new goog.math.Coordinate(0, 0); + origin = new ol.Coordinate(0, 0); var tileGrid = new ol.TileGrid(resolutions, extent, origin, tileSize); var tileCoord; - tileCoord = tileGrid.getTileCoord(3, new goog.math.Coordinate(0, 0)); + tileCoord = tileGrid.getTileCoord(3, new ol.Coordinate(0, 0)); assertEquals(3, tileCoord.z); assertEquals(0, tileCoord.x); assertEquals(0, tileCoord.y); - tileCoord = tileGrid.getTileCoord(3, new goog.math.Coordinate(0, 100000)); + tileCoord = tileGrid.getTileCoord(3, new ol.Coordinate(0, 100000)); assertEquals(3, tileCoord.z); assertEquals(0, tileCoord.x); assertEquals(10, tileCoord.y); - tileCoord = tileGrid.getTileCoord(3, new goog.math.Coordinate(100000, 0)); + tileCoord = tileGrid.getTileCoord(3, new ol.Coordinate(100000, 0)); assertEquals(3, tileCoord.z); assertEquals(10, tileCoord.x); assertEquals(0, tileCoord.y); - tileCoord = - tileGrid.getTileCoord(3, new goog.math.Coordinate(100000, 100000)); + tileCoord = tileGrid.getTileCoord(3, new ol.Coordinate(100000, 100000)); assertEquals(3, tileCoord.z); assertEquals(10, tileCoord.x); assertEquals(10, tileCoord.y); @@ -104,27 +103,26 @@ function testGetTileCoord() { function testGetTileCoordYSouth() { - origin = new goog.math.Coordinate(0, 100000); + origin = new ol.Coordinate(0, 100000); var tileGrid = new ol.TileGrid(resolutions, extent, origin, tileSize); var tileCoord; - tileCoord = tileGrid.getTileCoord(3, new goog.math.Coordinate(0, 0)); + tileCoord = tileGrid.getTileCoord(3, new ol.Coordinate(0, 0)); assertEquals(3, tileCoord.z); assertEquals(0, tileCoord.x); assertEquals(-10, tileCoord.y); - tileCoord = tileGrid.getTileCoord(3, new goog.math.Coordinate(0, 100000)); + tileCoord = tileGrid.getTileCoord(3, new ol.Coordinate(0, 100000)); assertEquals(3, tileCoord.z); assertEquals(0, tileCoord.x); assertEquals(0, tileCoord.y); - tileCoord = tileGrid.getTileCoord(3, new goog.math.Coordinate(100000, 0)); + tileCoord = tileGrid.getTileCoord(3, new ol.Coordinate(100000, 0)); assertEquals(3, tileCoord.z); assertEquals(10, tileCoord.x); assertEquals(-10, tileCoord.y); - tileCoord = - tileGrid.getTileCoord(3, new goog.math.Coordinate(100000, 100000)); + tileCoord = tileGrid.getTileCoord(3, new ol.Coordinate(100000, 100000)); assertEquals(3, tileCoord.z); assertEquals(10, tileCoord.x); assertEquals(0, tileCoord.y); diff --git a/src/ol/tilestore/tilestore_test.js b/src/ol/tilestore/tilestore_test.js index 4125f45696..12dd05d27b 100644 --- a/src/ol/tilestore/tilestore_test.js +++ b/src/ol/tilestore/tilestore_test.js @@ -1,4 +1,5 @@ goog.require('goog.testing.jsunit'); +goog.require('ol.Coordinate'); goog.require('ol.TileCoord'); goog.require('ol.tilestore.createOpenStreetMap'); @@ -13,8 +14,7 @@ function testOpenStreetMap() { var tileStore = ol.tilestore.createOpenStreetMap(8); var tileGrid = tileStore.getTileGrid(); - var coordinate = - new goog.math.Coordinate(829330.2064098881, 5933916.615134273); + var coordinate = new ol.Coordinate(829330.2064098881, 5933916.615134273); var tileUrl; tileUrl = tileStore.getTileCoordUrl(tileGrid.getTileCoord(0, coordinate)); diff --git a/src/ol/transformfunction.js b/src/ol/transformfunction.js index 2f2f2ed532..a8be2c0f28 100644 --- a/src/ol/transformfunction.js +++ b/src/ol/transformfunction.js @@ -1,9 +1,9 @@ goog.provide('ol.TransformFunction'); -goog.require('goog.math.Coordinate'); +goog.require('ol.Coordinate'); /** - * @typedef {function(goog.math.Coordinate): goog.math.Coordinate} + * @typedef {function(ol.Coordinate): ol.Coordinate} */ ol.TransformFunction; diff --git a/src/ol/webgl/tilelayerrenderer.js b/src/ol/webgl/tilelayerrenderer.js index 2d2b030789..8a700abf1d 100644 --- a/src/ol/webgl/tilelayerrenderer.js +++ b/src/ol/webgl/tilelayerrenderer.js @@ -8,6 +8,7 @@ goog.require('goog.asserts'); goog.require('goog.events.EventType'); goog.require('goog.vec.Mat4'); goog.require('goog.webgl'); +goog.require('ol.Coordinate'); goog.require('ol.TileLayer'); goog.require('ol.webgl.LayerRenderer'); goog.require('ol.webgl.shader.Fragment'); @@ -217,7 +218,7 @@ ol.webgl.TileLayerRenderer.prototype.redraw = function() { var gl = this.getGL(); var map = this.getMap(); - var center = /** @type {!goog.math.Coordinate} */ map.getCenter(); + var center = /** @type {!ol.Coordinate} */ map.getCenter(); var extent = /** @type {!ol.Extent} */ map.getExtent(); var resolution = /** @type {number} */ map.getResolution(); From 513d8e7268d7f1fd778cbe9129f3838ae87eb152 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Thu, 19 Jul 2012 10:46:43 +0200 Subject: [PATCH 261/562] Create ol.Size around goog.math.Size --- src/ol/map.js | 14 ++++++-------- src/ol/rectangle.js | 6 +++--- src/ol/size.js | 25 +++++++++++++++++++++++++ src/ol/tilebounds.js | 1 - src/ol/tilegrid/openstreetmap.js | 4 ++-- src/ol/tilegrid/tilegrid.js | 10 +++++----- src/ol/tilegrid/tilegrid_test.js | 4 ++-- src/ol/webgl/tilelayerrenderer.js | 7 ++++--- 8 files changed, 47 insertions(+), 24 deletions(-) create mode 100644 src/ol/size.js diff --git a/src/ol/map.js b/src/ol/map.js index e98aa3f1d1..5fe2ec60b2 100644 --- a/src/ol/map.js +++ b/src/ol/map.js @@ -15,7 +15,6 @@ goog.require('goog.events.MouseWheelHandler'); goog.require('goog.events.MouseWheelHandler.EventType'); goog.require('goog.fx.anim'); goog.require('goog.fx.anim.Animated'); -goog.require('goog.math.Size'); goog.require('goog.object'); goog.require('ol.Array'); goog.require('ol.Control'); @@ -24,6 +23,7 @@ goog.require('ol.Extent'); goog.require('ol.LayerRenderer'); goog.require('ol.Object'); goog.require('ol.Projection'); +goog.require('ol.Size'); goog.require('ol.TransformFunction'); @@ -372,11 +372,10 @@ ol.Map.prototype.getResolutionForExtent = function(extent) { /** - * @return {goog.math.Size|undefined} Size. + * @return {ol.Size|undefined} Size. */ ol.Map.prototype.getSize = function() { - return /** @type {goog.math.Size|undefined} */ ( - this.get(ol.MapProperty.SIZE)); + return /** @type {ol.Size|undefined} */ this.get(ol.MapProperty.SIZE); }; @@ -573,8 +572,7 @@ ol.Map.prototype.handleUserProjectionChanged = function() { * @protected */ ol.Map.prototype.handleViewportResize = function() { - var size = new goog.math.Size( - this.target_.clientWidth, this.target_.clientHeight); + var size = new ol.Size(this.target_.clientWidth, this.target_.clientHeight); this.setSize(size); }; @@ -725,11 +723,11 @@ ol.Map.prototype.setResolution = function(resolution) { /** - * @param {goog.math.Size} size Size. + * @param {ol.Size} size Size. */ ol.Map.prototype.setSize = function(size) { var currentSize = this.getSize(); - if (!goog.isDef(currentSize) || !goog.math.Size.equals(size, currentSize)) { + if (!goog.isDef(currentSize) || !currentSize.equals(size)) { this.set(ol.MapProperty.SIZE, size); } }; diff --git a/src/ol/rectangle.js b/src/ol/rectangle.js index 2b099e899a..f35768e2c8 100644 --- a/src/ol/rectangle.js +++ b/src/ol/rectangle.js @@ -1,8 +1,8 @@ goog.provide('ol.Rectangle'); goog.require('goog.asserts'); -goog.require('goog.math.Size'); goog.require('ol.Coordinate'); +goog.require('ol.Size'); @@ -90,10 +90,10 @@ ol.Rectangle.prototype.getHeight = function() { /** - * @return {goog.math.Size} Size. + * @return {ol.Size} Size. */ ol.Rectangle.prototype.getSize = function() { - return new goog.math.Size(this.getWidth(), this.getHeight()); + return new ol.Size(this.getWidth(), this.getHeight()); }; diff --git a/src/ol/size.js b/src/ol/size.js new file mode 100644 index 0000000000..c751b14fae --- /dev/null +++ b/src/ol/size.js @@ -0,0 +1,25 @@ +goog.provide('ol.Size'); + +goog.require('goog.math.Size'); + + + +/** + * @constructor + * @extends {goog.math.Size} + * @param {number} width Width. + * @param {number} height Height. + */ +ol.Size = function(width, height) { + goog.base(this, width, height); +}; +goog.inherits(ol.Size, goog.math.Size); + + +/** + * @param {ol.Size} size Size. + * @return {boolean} Equals. + */ +ol.Size.prototype.equals = function(size) { + return this.width == size.width && this.height == size.height; +}; diff --git a/src/ol/tilebounds.js b/src/ol/tilebounds.js index 58e1383064..2caa10da29 100644 --- a/src/ol/tilebounds.js +++ b/src/ol/tilebounds.js @@ -1,7 +1,6 @@ goog.provide('ol.TileBounds'); goog.require('goog.asserts'); -goog.require('goog.math.Size'); goog.require('ol.Rectangle'); goog.require('ol.TileCoord'); diff --git a/src/ol/tilegrid/openstreetmap.js b/src/ol/tilegrid/openstreetmap.js index c3778fc55d..f5ffddc9d6 100644 --- a/src/ol/tilegrid/openstreetmap.js +++ b/src/ol/tilegrid/openstreetmap.js @@ -1,8 +1,8 @@ goog.provide('ol.tilegrid.createOpenStreetMap'); -goog.require('goog.math.Size'); goog.require('ol.Coordinate'); goog.require('ol.Projection'); +goog.require('ol.Size'); goog.require('ol.TileGrid'); @@ -21,7 +21,7 @@ ol.tilegrid.createOpenStreetMap = function(maxZoom) { var extent = ol.Projection.EPSG_3857_EXTENT; var origin = new ol.Coordinate( -ol.Projection.EPSG_3857_HALF_SIZE, ol.Projection.EPSG_3857_HALF_SIZE); - var tileSize = new goog.math.Size(256, 256); + var tileSize = new ol.Size(256, 256); return new ol.TileGrid(resolutions, extent, origin, tileSize); diff --git a/src/ol/tilegrid/tilegrid.js b/src/ol/tilegrid/tilegrid.js index 75406a104d..85fff11749 100644 --- a/src/ol/tilegrid/tilegrid.js +++ b/src/ol/tilegrid/tilegrid.js @@ -2,9 +2,9 @@ goog.provide('ol.TileGrid'); goog.require('goog.array'); goog.require('goog.asserts'); -goog.require('goog.math.Size'); goog.require('ol.Coordinate'); goog.require('ol.Extent'); +goog.require('ol.Size'); goog.require('ol.TileBounds'); goog.require('ol.TileCoord'); @@ -15,7 +15,7 @@ goog.require('ol.TileCoord'); * @param {!Array.} resolutions Resolutions. * @param {ol.Extent} extent Extent. * @param {ol.Coordinate|!Array.} origin Origin. - * @param {goog.math.Size=} opt_tileSize Tile size. + * @param {ol.Size=} opt_tileSize Tile size. */ ol.TileGrid = function(resolutions, extent, origin, opt_tileSize) { @@ -63,10 +63,10 @@ ol.TileGrid = function(resolutions, extent, origin, opt_tileSize) { /** * @private - * @type {goog.math.Size} + * @type {ol.Size} */ this.tileSize_ = goog.isDef(opt_tileSize) ? - opt_tileSize : new goog.math.Size(256, 256); + opt_tileSize : new ol.Size(256, 256); }; @@ -214,7 +214,7 @@ ol.TileGrid.prototype.getTileCoordResolution = function(tileCoord) { /** - * @return {goog.math.Size} Tile size. + * @return {ol.Size} Tile size. */ ol.TileGrid.prototype.getTileSize = function() { return this.tileSize_; diff --git a/src/ol/tilegrid/tilegrid_test.js b/src/ol/tilegrid/tilegrid_test.js index 0b609390fd..84f904a17c 100644 --- a/src/ol/tilegrid/tilegrid_test.js +++ b/src/ol/tilegrid/tilegrid_test.js @@ -1,7 +1,7 @@ -goog.require('goog.math.Size'); goog.require('goog.testing.jsunit'); goog.require('ol.Coordinate'); goog.require('ol.Extent'); +goog.require('ol.Size'); goog.require('ol.TileCoord'); goog.require('ol.TileGrid'); @@ -18,7 +18,7 @@ function setUp() { extent = new ol.Extent(0, 0, 100000, 100000); origin = new ol.Coordinate(0, 0); origins = []; - tileSize = new goog.math.Size(100, 100); + tileSize = new ol.Size(100, 100); } diff --git a/src/ol/webgl/tilelayerrenderer.js b/src/ol/webgl/tilelayerrenderer.js index 8a700abf1d..4ef5af132c 100644 --- a/src/ol/webgl/tilelayerrenderer.js +++ b/src/ol/webgl/tilelayerrenderer.js @@ -9,6 +9,7 @@ goog.require('goog.events.EventType'); goog.require('goog.vec.Mat4'); goog.require('goog.webgl'); goog.require('ol.Coordinate'); +goog.require('ol.Size'); goog.require('ol.TileLayer'); goog.require('ol.webgl.LayerRenderer'); goog.require('ol.webgl.shader.Fragment'); @@ -122,7 +123,7 @@ ol.webgl.TileLayerRenderer = function(map, tileLayer) { /** * @private - * @type {goog.math.Size} + * @type {ol.Size} */ this.framebufferSize_ = null; @@ -230,12 +231,12 @@ ol.webgl.TileLayerRenderer.prototype.redraw = function() { var tileBoundsSize = tileBounds.getSize(); var tileSize = tileGrid.getTileSize(); - var framebufferSize = new goog.math.Size( + var framebufferSize = new ol.Size( tileSize.width * tileBoundsSize.width, tileSize.height * tileBoundsSize.height); if (goog.isNull(this.framebufferSize_) || - !goog.math.Size.equals(this.framebufferSize_, framebufferSize)) { + !this.framebufferSize_.equals(framebufferSize)) { gl.deleteFramebuffer(this.framebuffer_); gl.deleteRenderbuffer(this.renderbuffer_); From 9ce406c203fbe4aff060272668750f0b6201c01b Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Thu, 19 Jul 2012 10:48:25 +0200 Subject: [PATCH 262/562] Fix type, thanks @elemoine --- src/ol/extent.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ol/extent.js b/src/ol/extent.js index 0e8db0a3ff..2e82fcba09 100644 --- a/src/ol/extent.js +++ b/src/ol/extent.js @@ -22,7 +22,7 @@ goog.inherits(ol.Extent, ol.Rectangle); /** * @param {...ol.Coordinate} var_args Coordinates. - * @return {!ol.Extent} Boundin extent. + * @return {!ol.Extent} Bounding extent. */ ol.Extent.boundingExtent = function(var_args) { var coordinate0 = arguments[0]; From 08b4ef665b2928d1595eba0114497751407835ac Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Thu, 19 Jul 2012 14:58:02 +0200 Subject: [PATCH 263/562] Call inherited method, thanks @elemoine --- src/ol/mapevent.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/ol/mapevent.js b/src/ol/mapevent.js index 1afc7c7afa..8a878be0b9 100644 --- a/src/ol/mapevent.js +++ b/src/ol/mapevent.js @@ -31,5 +31,6 @@ goog.inherits(ol.MapEvent, goog.events.Event); /** */ ol.MapEvent.prototype.preventDefault = function() { + goog.base(this, 'preventDefault'); this.defaultPrevented = true; }; From e2824745d1a451f225ee897ba6ac86a38f41c3a0 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Thu, 19 Jul 2012 15:46:00 +0200 Subject: [PATCH 264/562] Ensure visibility and opacity are set when DOM layer renderer is created --- src/ol/dom/layerrenderer.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/ol/dom/layerrenderer.js b/src/ol/dom/layerrenderer.js index 98a99456e6..2fdb0e144f 100644 --- a/src/ol/dom/layerrenderer.js +++ b/src/ol/dom/layerrenderer.js @@ -29,6 +29,9 @@ ol.dom.LayerRenderer = function(map, layer, target) { */ this.origin = null; + this.handleLayerOpacityChange(); + this.handleLayerVisibleChange(); + }; goog.inherits(ol.dom.LayerRenderer, ol.LayerRenderer); From 1190bc08db91f5276ef351410c710f117ffed65d Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Thu, 19 Jul 2012 15:47:19 +0200 Subject: [PATCH 265/562] Make demo layer more opaque --- skeleton.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/skeleton.js b/skeleton.js index 5f01f80e5d..9a7c7bdf4d 100644 --- a/skeleton.js +++ b/skeleton.js @@ -13,7 +13,7 @@ var layer; target = /** @type {!HTMLDivElement} */ document.getElementById('map1'); map = map1 = ol.createMap(target, undefined, ol.RendererHint.DOM); layer = ol.tilelayer.createOpenStreetMap({ - 'opacity': 0.5 + 'opacity': 0.9 }); map.getLayers().push(layer); From 45c067dfdaf60b0131020216cfeb80f65b6ef00b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Lemoine?= Date: Thu, 19 Jul 2012 17:47:34 +0200 Subject: [PATCH 266/562] add ol.PixelBounds --- src/ol/pixelbounds.js | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 src/ol/pixelbounds.js diff --git a/src/ol/pixelbounds.js b/src/ol/pixelbounds.js new file mode 100644 index 0000000000..52eb9f0eff --- /dev/null +++ b/src/ol/pixelbounds.js @@ -0,0 +1,19 @@ +goog.provide('ol.PixelBounds'); + +goog.require('goog.asserts'); +goog.require('ol.Rectangle'); + + + +/** + * @constructor + * @extends {ol.Rectangle} + * @param {number} minX Minimum X. + * @param {number} minY Minimum Y. + * @param {number} maxX Maximum X. + * @param {number} maxY Maximum Y. + */ +ol.PixelBounds = function(minX, minY, maxX, maxY) { + goog.base(this, minX, minY, maxX, maxY); +}; +goog.inherits(ol.PixelBounds, ol.Rectangle); From 404d123623ee47f5790cce0f681bdce94e255498 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Lemoine?= Date: Thu, 19 Jul 2012 17:48:39 +0200 Subject: [PATCH 267/562] add TileGrid getTileCoordForArbitraryResolution and getTileCoordPixelBoundsForArbitraryResolution + tests, based on @tschaub work --- src/ol/tilegrid/tilegrid.js | 69 ++++++++++++ src/ol/tilegrid/tilegrid_test.js | 176 +++++++++++++++++++++++++++++++ 2 files changed, 245 insertions(+) diff --git a/src/ol/tilegrid/tilegrid.js b/src/ol/tilegrid/tilegrid.js index 85fff11749..b48521753d 100644 --- a/src/ol/tilegrid/tilegrid.js +++ b/src/ol/tilegrid/tilegrid.js @@ -4,6 +4,7 @@ goog.require('goog.array'); goog.require('goog.asserts'); goog.require('ol.Coordinate'); goog.require('ol.Extent'); +goog.require('ol.PixelBounds'); goog.require('ol.Size'); goog.require('ol.TileBounds'); goog.require('ol.TileCoord'); @@ -156,6 +157,52 @@ ol.TileGrid.prototype.getTileCoord = function(z, coordinate) { }; +/** + * @param {number} z Z. + * @param {number} resolution Resolution. + * @param {goog.math.Coordinate} coordinate Coordinate. + * @return {ol.TileCoord} Tile coordinate. + */ +ol.TileGrid.prototype.getTileCoordForArbitraryResolution = function( + z, resolution, coordinate) { + var resolutionForZ = this.getResolution(z); + var scale = resolution / resolutionForZ; + var origin = this.getOrigin(z); + + var offsetFromOrigin = new goog.math.Coordinate( + Math.floor((coordinate.x - origin.x) / resolution), + Math.floor((coordinate.y - origin.y) / resolution)); + + var tileSize = this.getTileSize(); + tileSize = new goog.math.Size(tileSize.width / scale, + tileSize.height / scale); + + var x, y; + x = Math.floor(offsetFromOrigin.x / tileSize.width); + y = Math.floor(offsetFromOrigin.y / tileSize.height); + + var tileCoord = new ol.TileCoord(z, x, y); + var tileCoordPixelBounds = + this.getTileCoordPixelBoundsForArbitraryResolution( + tileCoord, resolution); + + // adjust x to allow for stretched tiles + if (offsetFromOrigin.x < tileCoordPixelBounds.minX) { + tileCoord.x -= 1; + } else if (offsetFromOrigin.x >= tileCoordPixelBounds.maxX) { + tileCoord.x += 1; + } + // adjust y to allow for stretched tiles + if (offsetFromOrigin.y < tileCoordPixelBounds.minY) { + tileCoord.y -= 1; + } else if (offsetFromOrigin.y >= tileCoordPixelBounds.maxY) { + tileCoord.y += 1; + } + + return tileCoord; +}; + + /** * @param {ol.TileCoord} tileCoord Tile coordinate. * @return {ol.Coordinate} Tile center. @@ -203,6 +250,28 @@ ol.TileGrid.prototype.getTileCoordExtent = function(tileCoord) { }; +/** + * @param {ol.TileCoord} tileCoord Tile coordinate. + * @param {number} resolution Resolution. + * @return {ol.PixelBounds} Pixel bounds. + */ +ol.TileGrid.prototype.getTileCoordPixelBoundsForArbitraryResolution = function( + tileCoord, resolution) { + var resolutionForZ = this.getResolution(tileCoord.z); + var scale = resolution / resolutionForZ; + var tileSize = this.getTileSize(); + tileSize = new goog.math.Size(tileSize.width / scale, + tileSize.height / scale); + var minX, maxX, minY, maxY; + minX = Math.round(tileCoord.x * tileSize.width); + maxX = Math.round((tileCoord.x + 1) * tileSize.width); + minY = Math.round(tileCoord.y * tileSize.height); + maxY = Math.round((tileCoord.y + 1) * tileSize.height); + + return new ol.PixelBounds(minX, minY, maxX, maxY); +}; + + /** * @param {ol.TileCoord} tileCoord Tile coordinate. * @return {number} Tile resolution. diff --git a/src/ol/tilegrid/tilegrid_test.js b/src/ol/tilegrid/tilegrid_test.js index 84f904a17c..84e9702eab 100644 --- a/src/ol/tilegrid/tilegrid_test.js +++ b/src/ol/tilegrid/tilegrid_test.js @@ -129,6 +129,181 @@ function testGetTileCoordYSouth() { } +function testGetTileCoordForArbitraryResolution() { + + var tileSize = new ol.Size(256, 256); + var tileGrid = new ol.TileGrid([10], extent, origin, tileSize); + + var coordinate; + var tileCoord; + + // gets the first tile at the origin + coordinate = new ol.Coordinate(0, 0); + tileCoord = tileGrid.getTileCoordForArbitraryResolution( + 0, 10, coordinate); + assertEquals(0, tileCoord.z); + assertEquals(0, tileCoord.x); + assertEquals(0, tileCoord.y); + + // gets one tile northwest of the origin + coordinate = new ol.Coordinate(-1280, 1280); + tileCoord = tileGrid.getTileCoordForArbitraryResolution( + 0, 10, coordinate); + assertEquals(0, tileCoord.z); + assertEquals(-1, tileCoord.x); + assertEquals(0, tileCoord.y); + + // gets one tile northeast of the origin + coordinate = new ol.Coordinate(1280, 1280); + tileCoord = tileGrid.getTileCoordForArbitraryResolution( + 0, 10, coordinate); + assertEquals(0, tileCoord.z); + assertEquals(0, tileCoord.x); + assertEquals(0, tileCoord.y); + + // gets one tile southeast of the origin + coordinate = new ol.Coordinate(1280, -1280); + tileCoord = tileGrid.getTileCoordForArbitraryResolution( + 0, 10, coordinate); + assertEquals(0, tileCoord.z); + assertEquals(0, tileCoord.x); + assertEquals(-1, tileCoord.y); + + // gets one tile southwest of the origin + coordinate = new ol.Coordinate(-1280, -1280); + tileCoord = tileGrid.getTileCoordForArbitraryResolution( + 0, 10, coordinate); + assertEquals(0, tileCoord.z); + assertEquals(-1, tileCoord.x); + assertEquals(-1, tileCoord.y); + + // gets the tile to the east when on the edge + coordinate = new ol.Coordinate(2560, -1280); + tileCoord = tileGrid.getTileCoordForArbitraryResolution( + 0, 10, coordinate); + assertEquals(0, tileCoord.z); + assertEquals(1, tileCoord.x); + assertEquals(-1, tileCoord.y); + + // gets the tile to the north when on the edge + coordinate = new ol.Coordinate(1280, -2560); + tileCoord = tileGrid.getTileCoordForArbitraryResolution( + 0, 10, coordinate); + assertEquals(0, tileCoord.z); + assertEquals(0, tileCoord.x); + assertEquals(-1, tileCoord.y); + + // pixels are top aligned to the origin + coordinate = new ol.Coordinate(1280, -2559.999); + tileCoord = tileGrid.getTileCoordForArbitraryResolution( + 0, 10, coordinate); + assertEquals(0, tileCoord.z); + assertEquals(0, tileCoord.x); + assertEquals(-1, tileCoord.y); + + // pixels are left aligned to the origin + coordinate = new ol.Coordinate(2559.999, -1280); + tileCoord = tileGrid.getTileCoordForArbitraryResolution( + 0, 10, coordinate); + assertEquals(0, tileCoord.z); + assertEquals(0, tileCoord.x); + assertEquals(-1, tileCoord.y); +} + +function testGetTileCoordForArbitraryResolutionFractional() { + + var tileSize = new ol.Size(256, 256); + var tileGrid = new ol.TileGrid([1 / 3], extent, origin, tileSize); + + var coordinate; + var tileCoord; + + // These tests render at a resolution of 1. Because the layer's + // closest resolution is 1/3, the images are scaled by 1/3. + // In this scenario, every third tile will be one pixel wider when + // rendered (0,0 is normal; 1,0 is wider; 0,1 is taller; etc.) + + // gets the first tile at the origin + coordinate = new ol.Coordinate(0, 0); + tileCoord = tileGrid.getTileCoordForArbitraryResolution( + 0, 1, coordinate); + assertEquals(0, tileCoord.z); + assertEquals(0, tileCoord.x); + assertEquals(0, tileCoord.y); + + // gets the 1,0 tile at 256/3,0 + coordinate = new ol.Coordinate(256 / 3, 0); + tileCoord = tileGrid.getTileCoordForArbitraryResolution( + 0, 1, coordinate); + assertEquals(0, tileCoord.z); + assertEquals(1, tileCoord.x); + assertEquals(0, tileCoord.y); + + // still gets the 1,0 tile at 512/3,0 - wider tile + coordinate = new ol.Coordinate(512 / 3, 0); + tileCoord = tileGrid.getTileCoordForArbitraryResolution( + 0, 1, coordinate); + assertEquals(0, tileCoord.z); + assertEquals(1, tileCoord.x); + assertEquals(0, tileCoord.y); + + // gets the 2,0 tile at 513/3,0 + coordinate = new ol.Coordinate(513 / 3, 0); + tileCoord = tileGrid.getTileCoordForArbitraryResolution( + 0, 1, coordinate); + assertEquals(0, tileCoord.z); + assertEquals(2, tileCoord.x); + assertEquals(0, tileCoord.y); + + // gets the 3,0 tile at 768/3,0 + coordinate = new ol.Coordinate(768 / 3, 0); + tileCoord = tileGrid.getTileCoordForArbitraryResolution( + 0, 1, coordinate); + assertEquals(0, tileCoord.z); + assertEquals(3, tileCoord.x); + assertEquals(0, tileCoord.y); + + // gets the 4,0 tile at 1024/3,0 + coordinate = new ol.Coordinate(1024 / 3, 0); + tileCoord = tileGrid.getTileCoordForArbitraryResolution( + 0, 1, coordinate); + assertEquals(0, tileCoord.z); + assertEquals(4, tileCoord.x); + assertEquals(0, tileCoord.y); + + // still gets the 4,0 tile at 1280/3,0 - wider tile + coordinate = new ol.Coordinate(1280 / 3, 0); + tileCoord = tileGrid.getTileCoordForArbitraryResolution( + 0, 1, coordinate); + assertEquals(0, tileCoord.z); + assertEquals(4, tileCoord.x); + assertEquals(0, tileCoord.y); + + // gets the 5,0 tile at 1281/3,0 + coordinate = new ol.Coordinate(1281 / 3, 0); + tileCoord = tileGrid.getTileCoordForArbitraryResolution( + 0, 1, coordinate); + assertEquals(0, tileCoord.z); + assertEquals(5, tileCoord.x); + assertEquals(0, tileCoord.y); + + // gets the 0,1 tile at 0,-256/3 + coordinate = new ol.Coordinate(0, -256 / 3); + tileCoord = tileGrid.getTileCoordForArbitraryResolution( + 0, 1, coordinate); + assertEquals(0, tileCoord.z); + assertEquals(0, tileCoord.x); + assertEquals(-2, tileCoord.y); + + // still gets the 0,1 tile at 0,-512/3 - taller tile + coordinate = new ol.Coordinate(0, -512 / 3); + tileCoord = tileGrid.getTileCoordForArbitraryResolution( + 0, 1, coordinate); + assertEquals(0, tileCoord.z); + assertEquals(0, tileCoord.x); + assertEquals(-2, tileCoord.y); +} + function testGetTileCoordCenter() { @@ -150,6 +325,7 @@ function testGetTileCoordCenter() { } + function testGetTileCoordExtent() { var tileGrid = new ol.TileGrid(resolutions, extent, origin, tileSize); From 8f5d0ac642686a9e156ad0cf480a33a8ec2b13c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Lemoine?= Date: Thu, 19 Jul 2012 23:28:35 +0200 Subject: [PATCH 268/562] add TileLayerRenderer.getPreferredZ_ plus tests --- src/ol/dom/tilelayerrenderer.js | 36 ++++++++++++++ src/ol/dom/tilelayerrenderer_test.js | 73 ++++++++++++++++++++++++++++ 2 files changed, 109 insertions(+) create mode 100644 src/ol/dom/tilelayerrenderer_test.js diff --git a/src/ol/dom/tilelayerrenderer.js b/src/ol/dom/tilelayerrenderer.js index 1a49082e78..2984db6757 100644 --- a/src/ol/dom/tilelayerrenderer.js +++ b/src/ol/dom/tilelayerrenderer.js @@ -135,3 +135,39 @@ ol.dom.TileLayerRenderer.prototype.removeInvisibleTiles_ = function( } } }; + + +/** + * Get the best/preferred z for an arbitrary resolution. + * @private + * @param {number} resolution Resolution. + * @return {number} Z. + * TODO: this should probably be shared with the WebGL TileLayerRenderer, + * but our current class hierarchy does not allow this sharing. +*/ +ol.dom.TileLayerRenderer.prototype.getPreferredZ_ = (function() { + var cache = {}; + return function(resolution) { + if (resolution in cache) { + return cache[resolution]; + } + var tileLayer = /** @type {ol.TileLayer} */ (this.getLayer()); + var tileStore = tileLayer.getStore(); + var tileGrid = tileStore.getTileGrid(); + var gridResolutions = tileGrid.getResolutions(); + var minDiff = Number.POSITIVE_INFINITY; + var candidate, diff, z, r; + for (var i = 0, ii = gridResolutions.length; i < ii; ++i) { + // assumes sorted resolutions + diff = Math.abs(resolution - gridResolutions[i]); + if (diff < minDiff) { + z = i; + minDiff = diff; + } else { + break; + } + } + cache[resolution] = z; + return z; + }; +})(); diff --git a/src/ol/dom/tilelayerrenderer_test.js b/src/ol/dom/tilelayerrenderer_test.js new file mode 100644 index 0000000000..36f01d2eff --- /dev/null +++ b/src/ol/dom/tilelayerrenderer_test.js @@ -0,0 +1,73 @@ +goog.require('goog.dom'); +goog.require('goog.dom.TagName'); +goog.require('goog.testing.jsunit'); +goog.require('ol.Coordinate'); +goog.require('ol.Extent'); +goog.require('ol.Projection'); +goog.require('ol.TileGrid'); +goog.require('ol.TileLayer'); +goog.require('ol.TileStore'); +goog.require('ol.TileUrlFunction'); +goog.require('ol.dom.Map'); +goog.require('ol.dom.TileLayerRenderer'); + + +var tileLayerRenderer; + + +function setUp() { + var map = new ol.dom.Map( + goog.dom.createElement(goog.dom.TagName.DIV)); + + var resolutions = [100, 80, 50, 10, 1, 0.1]; + var extent = new ol.Extent(0, 0, 100000, 100000); + var origin = new ol.Coordinate(0, 0); + var tileGrid = new ol.TileGrid(resolutions, extent, origin); + + var projection = ol.Projection.getFromCode('EPSG:3857'); + var tileUrlFunction = ol.TileUrlFunction.createFromTemplate('{z}/{x}/{y}'); + var tileStore = new ol.TileStore(projection, tileGrid, tileUrlFunction); + + var tileLayer = new ol.TileLayer(tileStore); + + tileLayerRenderer = new ol.dom.TileLayerRenderer( + map, tileLayer, + goog.dom.createElement(goog.dom.TagName.DIV)); +} + + +function testGetPreferredZ() { + + var z; + + // gets the max resolution. + z = tileLayerRenderer.getPreferredZ_(100); + assertEquals(0, z); + + // gets the min resolution. + z = tileLayerRenderer.getPreferredZ_(0.1); + assertEquals(5, z); + + // gets the max when bigger. + z = tileLayerRenderer.getPreferredZ_(200); + assertEquals(0, z); + + // gets the min when smaller. + z = tileLayerRenderer.getPreferredZ_(0.01); + assertEquals(5, z); + + // gets the first when in the middle. + z = tileLayerRenderer.getPreferredZ_(90); + assertEquals(0, z); + + // gets the closer when elsewhere. + + z = tileLayerRenderer.getPreferredZ_(89); + assertEquals(1, z); + + z = tileLayerRenderer.getPreferredZ_(49); + assertEquals(2, z); + + z = tileLayerRenderer.getPreferredZ_(0.5); + assertEquals(5, z); +} From c723e719c645a4d93ac83ab7310be5abde09ccc1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Lemoine?= Date: Thu, 19 Jul 2012 23:36:16 +0200 Subject: [PATCH 269/562] use ol instead of goog.math --- src/ol/tilegrid/tilegrid.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/ol/tilegrid/tilegrid.js b/src/ol/tilegrid/tilegrid.js index b48521753d..168ce3ca77 100644 --- a/src/ol/tilegrid/tilegrid.js +++ b/src/ol/tilegrid/tilegrid.js @@ -160,7 +160,7 @@ ol.TileGrid.prototype.getTileCoord = function(z, coordinate) { /** * @param {number} z Z. * @param {number} resolution Resolution. - * @param {goog.math.Coordinate} coordinate Coordinate. + * @param {ol.Coordinate} coordinate Coordinate. * @return {ol.TileCoord} Tile coordinate. */ ol.TileGrid.prototype.getTileCoordForArbitraryResolution = function( @@ -169,13 +169,13 @@ ol.TileGrid.prototype.getTileCoordForArbitraryResolution = function( var scale = resolution / resolutionForZ; var origin = this.getOrigin(z); - var offsetFromOrigin = new goog.math.Coordinate( + var offsetFromOrigin = new ol.Coordinate( Math.floor((coordinate.x - origin.x) / resolution), Math.floor((coordinate.y - origin.y) / resolution)); var tileSize = this.getTileSize(); - tileSize = new goog.math.Size(tileSize.width / scale, - tileSize.height / scale); + tileSize = new ol.Size(tileSize.width / scale, + tileSize.height / scale); var x, y; x = Math.floor(offsetFromOrigin.x / tileSize.width); @@ -260,8 +260,8 @@ ol.TileGrid.prototype.getTileCoordPixelBoundsForArbitraryResolution = function( var resolutionForZ = this.getResolution(tileCoord.z); var scale = resolution / resolutionForZ; var tileSize = this.getTileSize(); - tileSize = new goog.math.Size(tileSize.width / scale, - tileSize.height / scale); + tileSize = new ol.Size(tileSize.width / scale, + tileSize.height / scale); var minX, maxX, minY, maxY; minX = Math.round(tileCoord.x * tileSize.width); maxX = Math.round((tileCoord.x + 1) * tileSize.width); From 0b6f4e348c115af4ec0719d5337fe78cead2b383 Mon Sep 17 00:00:00 2001 From: Frederic Junod Date: Fri, 20 Jul 2012 13:36:21 +0200 Subject: [PATCH 270/562] Fix plovr download path --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index a8e0e715d6..b9e9df4e14 100644 --- a/Makefile +++ b/Makefile @@ -97,7 +97,7 @@ webgl-debug.js: curl https://cvs.khronos.org/svn/repos/registry/trunk/public/webgl/sdk/debug/webgl-debug.js > $@ $(PLOVR_JAR): - curl http://plovr.googlecode.com/files/$(PLOVR_JAR) > $@ + curl http://plovr.googlecode.com/files/$(notdir $@) > $@ clean: rm -f ol-skeleton.js From 0d7426e1be4fb9f1041e5aaabae4bb50c156a8d3 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Fri, 20 Jul 2012 23:06:00 +0200 Subject: [PATCH 271/562] Fix bug where forEachVisibleLayer returned invisible layers --- src/ol/map.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/ol/map.js b/src/ol/map.js index 5fe2ec60b2..4919ac1fcd 100644 --- a/src/ol/map.js +++ b/src/ol/map.js @@ -248,8 +248,10 @@ ol.Map.prototype.fitUserExtent = function(userExtent) { ol.Map.prototype.forEachVisibleLayer = function(f, opt_obj) { var layers = this.getLayers(); layers.forEach(function(layer, index) { - var layerRenderer = this.getLayerRenderer(layer); - f.call(opt_obj, layer, layerRenderer, index); + if (layer.getVisible()) { + var layerRenderer = this.getLayerRenderer(layer); + f.call(opt_obj, layer, layerRenderer, index); + } }, this); }; From 0602942cf88a74638667b374dfe084a4a681acb3 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Fri, 20 Jul 2012 23:07:44 +0200 Subject: [PATCH 272/562] Add ol.Color --- src/ol/color.js | 56 +++++++++++++++++++++++++++++++++++++++++++++ src/ol/map.js | 9 ++++---- src/ol/webgl/map.js | 26 +++++++++++---------- 3 files changed, 74 insertions(+), 17 deletions(-) create mode 100644 src/ol/color.js diff --git a/src/ol/color.js b/src/ol/color.js new file mode 100644 index 0000000000..0792334ce4 --- /dev/null +++ b/src/ol/color.js @@ -0,0 +1,56 @@ +goog.provide('ol.Color'); + +goog.require('goog.color'); + + + +/** + * @constructor + * @param {number} r Red. + * @param {number} g Green. + * @param {number} b Blue. + * @param {number} a Alpha. + */ +ol.Color = function(r, g, b, a) { + + /** + * @type {number} + */ + this.r = r; + + /** + * @type {number} + */ + this.g = g; + + /** + * @type {number} + */ + this.b = b; + + /** + * @type {number} + */ + this.a = a; + +}; + + +/** + * @param {string} str String. + * @param {number=} opt_a Alpha. + * @return {ol.Color} Color. + */ +ol.Color.createFromString = function(str, opt_a) { + var rgb = goog.color.hexToRgb(goog.color.parse(str).hex); + var a = goog.isDef(opt_a) ? opt_a : 255; + return new ol.Color(rgb[0], rgb[1], rgb[2], a); +}; + + +/** + * @return {ol.Color} Clone. + */ +ol.Color.prototype.clone = function() { + return new ol.Color(this.r, this.g, this.b, this.a); +}; diff --git a/src/ol/map.js b/src/ol/map.js index 4919ac1fcd..5d860736e4 100644 --- a/src/ol/map.js +++ b/src/ol/map.js @@ -4,7 +4,6 @@ goog.provide('ol.Map'); goog.provide('ol.MapProperty'); goog.require('goog.array'); -goog.require('goog.color'); goog.require('goog.dom.ViewportSizeMonitor'); goog.require('goog.events'); goog.require('goog.events.BrowserEvent'); @@ -17,6 +16,7 @@ goog.require('goog.fx.anim'); goog.require('goog.fx.anim.Animated'); goog.require('goog.object'); goog.require('ol.Array'); +goog.require('ol.Color'); goog.require('ol.Control'); goog.require('ol.Coordinate'); goog.require('ol.Extent'); @@ -257,10 +257,10 @@ ol.Map.prototype.forEachVisibleLayer = function(f, opt_obj) { /** - * @return {string|undefined} Background color. + * @return {ol.Color|undefined} Background color. */ ol.Map.prototype.getBackgroundColor = function() { - return /** @type {string|undefined} */ ( + return /** @type {ol.Color|undefined} */ ( this.get(ol.MapProperty.BACKGROUND_COLOR)); }; @@ -672,10 +672,9 @@ ol.Map.prototype.removeLayerRenderer = function(layer) { /** - * @param {string} backgroundColor Background color. + * @param {ol.Color} backgroundColor Background color. */ ol.Map.prototype.setBackgroundColor = function(backgroundColor) { - goog.color.parse(backgroundColor); this.set(ol.MapProperty.BACKGROUND_COLOR, backgroundColor); }; diff --git a/src/ol/webgl/map.js b/src/ol/webgl/map.js index dccd636a28..1af8c09464 100644 --- a/src/ol/webgl/map.js +++ b/src/ol/webgl/map.js @@ -7,7 +7,6 @@ goog.provide('ol.webgl.Map'); goog.provide('ol.webgl.map.shader'); -goog.require('goog.color'); goog.require('goog.dispose'); goog.require('goog.dom'); goog.require('goog.dom.TagName'); @@ -121,6 +120,12 @@ ol.webgl.Map = function(target, opt_values) { goog.events.listen(this.canvas_, ol.webgl.WebGLContextEventType.RESTORED, this.handleWebGLContextRestored, false, this); + /** + * @private + * @type {ol.Color} + */ + this.clearColor_ = new ol.Color(1, 1, 1, 1); + /** * @private * @type {{aPosition: number, @@ -312,6 +317,12 @@ ol.webgl.Map.prototype.getTileTexture = function(tile) { * @inheritDoc */ ol.webgl.Map.prototype.handleBackgroundColorChanged = function() { + var backgroundColor = this.getBackgroundColor(); + this.clearColor_ = new ol.Color( + backgroundColor.r / 255, + backgroundColor.g / 255, + backgroundColor.b / 255, + backgroundColor.a / 255); this.redraw(); }; @@ -429,17 +440,8 @@ ol.webgl.Map.prototype.redrawInternal = function() { gl.bindFramebuffer(goog.webgl.FRAMEBUFFER, null); - var red, green, blue; - var backgroundColor = this.getBackgroundColor(); - if (goog.isDef(backgroundColor)) { - var rgb = goog.color.hexToRgb(goog.color.parse(backgroundColor).hex); - red = rgb[0] / 255; - green = rgb[1] / 255; - blue = rgb[2] / 255; - } else { - red = green = blue = 1; - } - gl.clearColor(red, green, blue, 1); + gl.clearColor(this.clearColor_.r, this.clearColor_.g, this.clearColor_.b, + this.clearColor_.a); gl.clear(goog.webgl.COLOR_BUFFER_BIT); gl.enable(goog.webgl.BLEND); gl.blendFunc(goog.webgl.SRC_ALPHA, goog.webgl.ONE_MINUS_SRC_ALPHA); From 277c1ea3a614ef4b32ad74a37f48c9899dbc0fdb Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Fri, 20 Jul 2012 23:33:59 +0200 Subject: [PATCH 273/562] Use XYZ to indicate OpenStreetMap-style tile grids --- src/ol/ol.js | 5 +- src/ol/tilegrid/{openstreetmap.js => xyz.js} | 4 +- src/ol/tilelayer/openstreetmap.js | 16 ++++++- src/ol/{ => tilelayer}/tilelayer.js | 0 src/ol/tilelayer/xyz.js | 21 +++++++++ src/ol/tilestore/openstreetmap.js | 48 -------------------- src/ol/tilestore/tilestore_test.js | 41 ++++++++--------- src/ol/tilestore/xyz.js | 43 ++++++++++++++++++ 8 files changed, 101 insertions(+), 77 deletions(-) rename src/ol/tilegrid/{openstreetmap.js => xyz.js} (86%) rename src/ol/{ => tilelayer}/tilelayer.js (100%) create mode 100644 src/ol/tilelayer/xyz.js delete mode 100644 src/ol/tilestore/openstreetmap.js create mode 100644 src/ol/tilestore/xyz.js diff --git a/src/ol/ol.js b/src/ol/ol.js index 56fc39ea9a..b1adcab3fe 100644 --- a/src/ol/ol.js +++ b/src/ol/ol.js @@ -34,9 +34,10 @@ goog.require('ol.dom'); goog.require('ol.dom.LayerRenderer'); goog.require('ol.dom.Map'); goog.require('ol.dom.TileLayerRenderer'); -goog.require('ol.tilegrid.createOpenStreetMap'); +goog.require('ol.tilegrid.createXYZ'); goog.require('ol.tilelayer.createOpenStreetMap'); -goog.require('ol.tilestore.createOpenStreetMap'); +goog.require('ol.tilelayer.createXYZ'); +goog.require('ol.tilestore.createXYZ'); goog.require('ol.webgl'); goog.require('ol.webgl.LayerRenderer'); goog.require('ol.webgl.Map'); diff --git a/src/ol/tilegrid/openstreetmap.js b/src/ol/tilegrid/xyz.js similarity index 86% rename from src/ol/tilegrid/openstreetmap.js rename to src/ol/tilegrid/xyz.js index f5ffddc9d6..b4bbac80dc 100644 --- a/src/ol/tilegrid/openstreetmap.js +++ b/src/ol/tilegrid/xyz.js @@ -1,4 +1,4 @@ -goog.provide('ol.tilegrid.createOpenStreetMap'); +goog.provide('ol.tilegrid.createXYZ'); goog.require('ol.Coordinate'); goog.require('ol.Projection'); @@ -10,7 +10,7 @@ goog.require('ol.TileGrid'); * @param {number} maxZoom Maximum zoom. * @return {ol.TileGrid} Tile grid. */ -ol.tilegrid.createOpenStreetMap = function(maxZoom) { +ol.tilegrid.createXYZ = function(maxZoom) { var resolutions = new Array(maxZoom + 1); var z; diff --git a/src/ol/tilelayer/openstreetmap.js b/src/ol/tilelayer/openstreetmap.js index 65c6923b77..8d2b95919a 100644 --- a/src/ol/tilelayer/openstreetmap.js +++ b/src/ol/tilelayer/openstreetmap.js @@ -2,7 +2,7 @@ goog.provide('ol.tilelayer.createOpenStreetMap'); goog.require('ol.Layer'); goog.require('ol.TileLayer'); -goog.require('ol.tilestore.createOpenStreetMap'); +goog.require('ol.tilestore.createXYZ'); /** @@ -10,6 +10,18 @@ goog.require('ol.tilestore.createOpenStreetMap'); * @return {ol.Layer} Layer. */ ol.tilelayer.createOpenStreetMap = function(opt_values) { - var store = ol.tilestore.createOpenStreetMap(); + var store = ol.tilestore.createXYZ( + 18, + [ + 'http://a.tile.openstreetmap.org/{z}/{x}/{y}.png', + 'http://b.tile.openstreetmap.org/{z}/{x}/{y}.png', + 'http://c.tile.openstreetmap.org/{z}/{x}/{y}.png' + ], + '© ' + + 'OpenStreetMap ' + + 'contributors, ' + + 'CC BY-SA', + '' + ); return new ol.TileLayer(store, opt_values); }; diff --git a/src/ol/tilelayer.js b/src/ol/tilelayer/tilelayer.js similarity index 100% rename from src/ol/tilelayer.js rename to src/ol/tilelayer/tilelayer.js diff --git a/src/ol/tilelayer/xyz.js b/src/ol/tilelayer/xyz.js new file mode 100644 index 0000000000..d7ec1b6bda --- /dev/null +++ b/src/ol/tilelayer/xyz.js @@ -0,0 +1,21 @@ +goog.provide('ol.tilelayer.createXYZ'); + +goog.require('ol.Layer'); +goog.require('ol.TileLayer'); +goog.require('ol.tilestore.createXYZ'); + + +/** + * @param {number} maxZoom Maximum zoom. + * @param {Array.} templates Templates. + * @param {string=} opt_attribution Attribution. + * @param {string=} opt_crossOrigin Cross origin. + * @param {Object.=} opt_values Values. + * @return {ol.Layer} Layer. + */ +ol.tilelayer.createXYZ = + function(maxZoom, templates, opt_attribution, opt_crossOrigin, opt_values) { + var store = ol.tilestore.createXYZ( + maxZoom, templates, opt_attribution, opt_crossOrigin); + return new ol.TileLayer(store, opt_values); +}; diff --git a/src/ol/tilestore/openstreetmap.js b/src/ol/tilestore/openstreetmap.js deleted file mode 100644 index 08684d91d5..0000000000 --- a/src/ol/tilestore/openstreetmap.js +++ /dev/null @@ -1,48 +0,0 @@ -goog.provide('ol.tilestore.createOpenStreetMap'); - -goog.require('goog.math'); -goog.require('ol.Projection'); -goog.require('ol.TileCoord'); -goog.require('ol.TileGrid'); -goog.require('ol.TileStore'); -goog.require('ol.TileUrlFunction'); -goog.require('ol.tilegrid.createOpenStreetMap'); - - -/** - * @return {ol.TileStore} Tile store. - */ -ol.tilestore.createOpenStreetMap = function() { - - var projection = ol.Projection.getFromCode('EPSG:3857'); - var tileGrid = ol.tilegrid.createOpenStreetMap(18); - var tileUrlFunction = ol.TileUrlFunction.withTileCoordTransform( - function(tileCoord) { - var n = 1 << tileCoord.z; - var y = -tileCoord.y - 1; - if (y < 0 || n <= y) { - return null; - } else { - var x = goog.math.modulo(tileCoord.x, n); - return new ol.TileCoord(tileCoord.z, x, y); - } - }, - ol.TileUrlFunction.createFromTemplates([ - 'http://a.tile.openstreetmap.org/{z}/{x}/{y}.png', - 'http://b.tile.openstreetmap.org/{z}/{x}/{y}.png', - 'http://c.tile.openstreetmap.org/{z}/{x}/{y}.png' - ])); - var extent = projection.getExtent(); - var attribution = - '© ' + - 'OpenStreetMap ' + - 'contributors, ' + - 'CC BY-SA'; - var crossOrigin = ''; - - return new ol.TileStore( - projection, tileGrid, tileUrlFunction, extent, attribution, crossOrigin); - -}; - - diff --git a/src/ol/tilestore/tilestore_test.js b/src/ol/tilestore/tilestore_test.js index 12dd05d27b..031b4d1061 100644 --- a/src/ol/tilestore/tilestore_test.js +++ b/src/ol/tilestore/tilestore_test.js @@ -1,71 +1,66 @@ goog.require('goog.testing.jsunit'); goog.require('ol.Coordinate'); goog.require('ol.TileCoord'); -goog.require('ol.tilestore.createOpenStreetMap'); +goog.require('ol.tilestore.createXYZ'); -function getTileCoordPart(tileUrl) { - return tileUrl.substr(32, tileUrl.length - 36); -} +function testXYZ() { - -function testOpenStreetMap() { - - var tileStore = ol.tilestore.createOpenStreetMap(8); + var tileStore = ol.tilestore.createXYZ(6, ['{z}/{x}/{y}']); var tileGrid = tileStore.getTileGrid(); var coordinate = new ol.Coordinate(829330.2064098881, 5933916.615134273); var tileUrl; tileUrl = tileStore.getTileCoordUrl(tileGrid.getTileCoord(0, coordinate)); - assertEquals('0/0/0', getTileCoordPart(tileUrl)); + assertEquals('0/0/0', tileUrl); tileUrl = tileStore.getTileCoordUrl(tileGrid.getTileCoord(1, coordinate)); - assertEquals('1/1/0', getTileCoordPart(tileUrl)); + assertEquals('1/1/0', tileUrl); tileUrl = tileStore.getTileCoordUrl(tileGrid.getTileCoord(2, coordinate)); - assertEquals('2/2/1', getTileCoordPart(tileUrl)); + assertEquals('2/2/1', tileUrl); tileUrl = tileStore.getTileCoordUrl(tileGrid.getTileCoord(3, coordinate)); - assertEquals('3/4/2', getTileCoordPart(tileUrl)); + assertEquals('3/4/2', tileUrl); tileUrl = tileStore.getTileCoordUrl(tileGrid.getTileCoord(4, coordinate)); - assertEquals('4/8/5', getTileCoordPart(tileUrl)); + assertEquals('4/8/5', tileUrl); tileUrl = tileStore.getTileCoordUrl(tileGrid.getTileCoord(5, coordinate)); - assertEquals('5/16/11', getTileCoordPart(tileUrl)); + assertEquals('5/16/11', tileUrl); tileUrl = tileStore.getTileCoordUrl(tileGrid.getTileCoord(6, coordinate)); - assertEquals('6/33/22', getTileCoordPart(tileUrl)); + assertEquals('6/33/22', tileUrl); } -function testOpenStreetMapWrapX() { +function testXYZWrapX() { - var tileStore = ol.tilestore.createOpenStreetMap(8); + var tileStore = ol.tilestore.createXYZ(6, ['{z}/{x}/{y}']); tileUrl = tileStore.getTileCoordUrl(new ol.TileCoord(6, -31, -23)); - assertEquals('6/33/22', getTileCoordPart(tileUrl)); + assertEquals('6/33/22', tileUrl); tileUrl = tileStore.getTileCoordUrl(new ol.TileCoord(6, 33, -23)); - assertEquals('6/33/22', getTileCoordPart(tileUrl)); + assertEquals('6/33/22', tileUrl); tileUrl = tileStore.getTileCoordUrl(new ol.TileCoord(6, 97, -23)); - assertEquals('6/33/22', getTileCoordPart(tileUrl)); + assertEquals('6/33/22', tileUrl); } -function testOpenStreetMapCropY() { +function testXYZCropY() { - var tileStore = ol.tilestore.createOpenStreetMap(8); + var tileStore = ol.tilestore.createXYZ(6, ['{z}/{x}/{y}']); tileUrl = tileStore.getTileCoordUrl(new ol.TileCoord(6, 33, -87)); assertUndefined(tileUrl); tileUrl = tileStore.getTileCoordUrl(new ol.TileCoord(6, 33, -23)); - assertEquals('6/33/22', getTileCoordPart(tileUrl)); + assertEquals('6/33/22', tileUrl); tileUrl = tileStore.getTileCoordUrl(new ol.TileCoord(6, 33, 41)); assertUndefined(tileUrl); diff --git a/src/ol/tilestore/xyz.js b/src/ol/tilestore/xyz.js new file mode 100644 index 0000000000..ad639379e6 --- /dev/null +++ b/src/ol/tilestore/xyz.js @@ -0,0 +1,43 @@ +goog.provide('ol.tilestore.createXYZ'); + +goog.require('goog.math'); +goog.require('ol.Projection'); +goog.require('ol.TileCoord'); +goog.require('ol.TileGrid'); +goog.require('ol.TileStore'); +goog.require('ol.TileUrlFunction'); +goog.require('ol.tilegrid.createXYZ'); + + +/** + * @param {number} maxZoom Maximum zoom. + * @param {Array.} templates Templates. + * @param {string=} opt_attribution Attribution. + * @param {string=} opt_crossOrigin Cross origin. + * @return {ol.TileStore} Tile store. + */ +ol.tilestore.createXYZ = + function(maxZoom, templates, opt_attribution, opt_crossOrigin) { + + var projection = ol.Projection.getFromCode('EPSG:3857'); + var tileGrid = ol.tilegrid.createXYZ(maxZoom); + var tileUrlFunction = ol.TileUrlFunction.withTileCoordTransform( + function(tileCoord) { + var n = 1 << tileCoord.z; + var y = -tileCoord.y - 1; + if (y < 0 || n <= y) { + return null; + } else { + var x = goog.math.modulo(tileCoord.x, n); + return new ol.TileCoord(tileCoord.z, x, y); + } + }, + ol.TileUrlFunction.createFromTemplates(templates)); + var extent = projection.getExtent(); + + return new ol.TileStore(projection, tileGrid, tileUrlFunction, extent, + opt_attribution, opt_crossOrigin); + +}; + + From 89efc96dd5090d9bb556addcb24ff7e248a0d8ef Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Sat, 21 Jul 2012 00:23:45 +0200 Subject: [PATCH 274/562] Don't bother making forEachTileCoord abortable --- src/ol/dom/tilelayerrenderer.js | 1 - src/ol/tilebounds.js | 6 ++---- src/ol/webgl/tilelayerrenderer.js | 1 - 3 files changed, 2 insertions(+), 6 deletions(-) diff --git a/src/ol/dom/tilelayerrenderer.js b/src/ol/dom/tilelayerrenderer.js index 2984db6757..c5e3d634bd 100644 --- a/src/ol/dom/tilelayerrenderer.js +++ b/src/ol/dom/tilelayerrenderer.js @@ -73,7 +73,6 @@ ol.dom.TileLayerRenderer.prototype.redraw = function() { newTiles = true; } } - return false; }, this); if (newTiles) { diff --git a/src/ol/tilebounds.js b/src/ol/tilebounds.js index 2caa10da29..57347567b0 100644 --- a/src/ol/tilebounds.js +++ b/src/ol/tilebounds.js @@ -51,7 +51,7 @@ ol.TileBounds.prototype.clone = function() { /** * @param {number} z Z. - * @param {function(this: T, ol.TileCoord): boolean} f Callback. + * @param {function(this: T, ol.TileCoord)} f Callback. * @param {T=} opt_obj The object to be used for the value of 'this' within f. * @template T */ @@ -62,9 +62,7 @@ ol.TileBounds.prototype.forEachTileCoord = function(z, f, opt_obj) { tileCoord.x = x; for (y = this.minY; y <= this.maxY; ++y) { tileCoord.y = y; - if (f.call(opt_obj, tileCoord)) { - return; - } + f.call(opt_obj, tileCoord); goog.asserts.assert(tileCoord.z == z); goog.asserts.assert(tileCoord.x == x); goog.asserts.assert(tileCoord.y == y); diff --git a/src/ol/webgl/tilelayerrenderer.js b/src/ol/webgl/tilelayerrenderer.js index 4ef5af132c..e1141c86b5 100644 --- a/src/ol/webgl/tilelayerrenderer.js +++ b/src/ol/webgl/tilelayerrenderer.js @@ -339,7 +339,6 @@ ol.webgl.TileLayerRenderer.prototype.redraw = function() { goog.events.EventType.CHANGE, this.handleTileChange, false, this); } } - return false; }, this); }; From 753ebab2adaf7562438486e060e9dcca88d5adc3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Lemoine?= Date: Sat, 21 Jul 2012 16:00:45 +0200 Subject: [PATCH 275/562] Revert "add TileLayerRenderer.getPreferredZ_ plus tests". As noted by @twpayne, TileGrid.getZForResolution already returns the "preferred" z for an arbitrary resolution. This reverts commit 8f5d0ac642686a9e156ad0cf480a33a8ec2b13c1. --- src/ol/dom/tilelayerrenderer.js | 36 -------------- src/ol/dom/tilelayerrenderer_test.js | 73 ---------------------------- 2 files changed, 109 deletions(-) delete mode 100644 src/ol/dom/tilelayerrenderer_test.js diff --git a/src/ol/dom/tilelayerrenderer.js b/src/ol/dom/tilelayerrenderer.js index c5e3d634bd..ea9b287c63 100644 --- a/src/ol/dom/tilelayerrenderer.js +++ b/src/ol/dom/tilelayerrenderer.js @@ -134,39 +134,3 @@ ol.dom.TileLayerRenderer.prototype.removeInvisibleTiles_ = function( } } }; - - -/** - * Get the best/preferred z for an arbitrary resolution. - * @private - * @param {number} resolution Resolution. - * @return {number} Z. - * TODO: this should probably be shared with the WebGL TileLayerRenderer, - * but our current class hierarchy does not allow this sharing. -*/ -ol.dom.TileLayerRenderer.prototype.getPreferredZ_ = (function() { - var cache = {}; - return function(resolution) { - if (resolution in cache) { - return cache[resolution]; - } - var tileLayer = /** @type {ol.TileLayer} */ (this.getLayer()); - var tileStore = tileLayer.getStore(); - var tileGrid = tileStore.getTileGrid(); - var gridResolutions = tileGrid.getResolutions(); - var minDiff = Number.POSITIVE_INFINITY; - var candidate, diff, z, r; - for (var i = 0, ii = gridResolutions.length; i < ii; ++i) { - // assumes sorted resolutions - diff = Math.abs(resolution - gridResolutions[i]); - if (diff < minDiff) { - z = i; - minDiff = diff; - } else { - break; - } - } - cache[resolution] = z; - return z; - }; -})(); diff --git a/src/ol/dom/tilelayerrenderer_test.js b/src/ol/dom/tilelayerrenderer_test.js deleted file mode 100644 index 36f01d2eff..0000000000 --- a/src/ol/dom/tilelayerrenderer_test.js +++ /dev/null @@ -1,73 +0,0 @@ -goog.require('goog.dom'); -goog.require('goog.dom.TagName'); -goog.require('goog.testing.jsunit'); -goog.require('ol.Coordinate'); -goog.require('ol.Extent'); -goog.require('ol.Projection'); -goog.require('ol.TileGrid'); -goog.require('ol.TileLayer'); -goog.require('ol.TileStore'); -goog.require('ol.TileUrlFunction'); -goog.require('ol.dom.Map'); -goog.require('ol.dom.TileLayerRenderer'); - - -var tileLayerRenderer; - - -function setUp() { - var map = new ol.dom.Map( - goog.dom.createElement(goog.dom.TagName.DIV)); - - var resolutions = [100, 80, 50, 10, 1, 0.1]; - var extent = new ol.Extent(0, 0, 100000, 100000); - var origin = new ol.Coordinate(0, 0); - var tileGrid = new ol.TileGrid(resolutions, extent, origin); - - var projection = ol.Projection.getFromCode('EPSG:3857'); - var tileUrlFunction = ol.TileUrlFunction.createFromTemplate('{z}/{x}/{y}'); - var tileStore = new ol.TileStore(projection, tileGrid, tileUrlFunction); - - var tileLayer = new ol.TileLayer(tileStore); - - tileLayerRenderer = new ol.dom.TileLayerRenderer( - map, tileLayer, - goog.dom.createElement(goog.dom.TagName.DIV)); -} - - -function testGetPreferredZ() { - - var z; - - // gets the max resolution. - z = tileLayerRenderer.getPreferredZ_(100); - assertEquals(0, z); - - // gets the min resolution. - z = tileLayerRenderer.getPreferredZ_(0.1); - assertEquals(5, z); - - // gets the max when bigger. - z = tileLayerRenderer.getPreferredZ_(200); - assertEquals(0, z); - - // gets the min when smaller. - z = tileLayerRenderer.getPreferredZ_(0.01); - assertEquals(5, z); - - // gets the first when in the middle. - z = tileLayerRenderer.getPreferredZ_(90); - assertEquals(0, z); - - // gets the closer when elsewhere. - - z = tileLayerRenderer.getPreferredZ_(89); - assertEquals(1, z); - - z = tileLayerRenderer.getPreferredZ_(49); - assertEquals(2, z); - - z = tileLayerRenderer.getPreferredZ_(0.5); - assertEquals(5, z); -} From 014c5e89059e547af2c3ce13d7d8e4fa74fdb7b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Lemoine?= Date: Sat, 21 Jul 2012 23:52:56 +0200 Subject: [PATCH 276/562] refactoring, and renamings in tilegrid.js (related to continous zooming) --- src/ol/tilegrid/tilegrid.js | 57 ++++++++------- src/ol/tilegrid/tilegrid_test.js | 112 +++++++++++++++-------------- src/ol/tilestore/tilestore_test.js | 21 ++++-- src/ol/webgl/tilelayerrenderer.js | 2 +- 4 files changed, 106 insertions(+), 86 deletions(-) diff --git a/src/ol/tilegrid/tilegrid.js b/src/ol/tilegrid/tilegrid.js index 168ce3ca77..829c66ca21 100644 --- a/src/ol/tilegrid/tilegrid.js +++ b/src/ol/tilegrid/tilegrid.js @@ -80,7 +80,7 @@ ol.TileGrid.prototype.forEachTileCoordParent = function(tileCoord, callback) { var tileCoordExtent = this.getTileCoordExtent(tileCoord); var z = tileCoord.z - 1; while (z >= 0) { - if (callback(z, this.getExtentTileBounds(z, tileCoordExtent))) { + if (callback(z, this.getTileBoundsForExtentAndZ(tileCoordExtent, z))) { return; } --z; @@ -97,13 +97,27 @@ ol.TileGrid.prototype.getExtent = function() { /** - * @param {number} z Z. * @param {ol.Extent} extent Extent. + * @param {number} z Z. * @return {ol.TileBounds} Tile bounds. */ -ol.TileGrid.prototype.getExtentTileBounds = function(z, extent) { - var min = this.getTileCoord(z, new ol.Coordinate(extent.minX, extent.minY)); - var max = this.getTileCoord(z, new ol.Coordinate(extent.maxX, extent.maxY)); +ol.TileGrid.prototype.getTileBoundsForExtentAndZ = function(extent, z) { + var resolution = this.getResolution(z); + return this.getTileBoundsForExtentAndResolution(extent, resolution); +}; + + +/** + * @param {ol.Extent} extent Extent. + * @param {number} resolution Resolution. + * @return {ol.TileBounds} Tile bounds. + */ +ol.TileGrid.prototype.getTileBoundsForExtentAndResolution = function( + extent, resolution) { + var min = this.getTileCoordForCoordAndResolution( + new ol.Coordinate(extent.minX, extent.minY), resolution); + var max = this.getTileCoordForCoordAndResolution( + new ol.Coordinate(extent.maxX, extent.maxY), resolution); return new ol.TileBounds(min.x, min.y, max.x, max.y); }; @@ -142,31 +156,25 @@ ol.TileGrid.prototype.getResolutions = function() { /** - * @param {number} z Z. * @param {ol.Coordinate} coordinate Coordinate. + * @param {number} z Z. * @return {ol.TileCoord} Tile coordinate. */ -ol.TileGrid.prototype.getTileCoord = function(z, coordinate) { - var origin = this.getOrigin(z); +ol.TileGrid.prototype.getTileCoordForCoordAndZ = function(coordinate, z) { var resolution = this.getResolution(z); - var tileSize = this.getTileSize(); - var x, y; - x = Math.floor((coordinate.x - origin.x) / (tileSize.width * resolution)); - y = Math.floor((coordinate.y - origin.y) / (tileSize.height * resolution)); - return new ol.TileCoord(z, x, y); + return this.getTileCoordForCoordAndResolution(coordinate, resolution); }; /** - * @param {number} z Z. - * @param {number} resolution Resolution. * @param {ol.Coordinate} coordinate Coordinate. + * @param {number} resolution Resolution. * @return {ol.TileCoord} Tile coordinate. */ -ol.TileGrid.prototype.getTileCoordForArbitraryResolution = function( - z, resolution, coordinate) { - var resolutionForZ = this.getResolution(z); - var scale = resolution / resolutionForZ; +ol.TileGrid.prototype.getTileCoordForCoordAndResolution = function( + coordinate, resolution) { + var z = this.getZForResolution(resolution); + var scale = resolution / this.getResolution(z); var origin = this.getOrigin(z); var offsetFromOrigin = new ol.Coordinate( @@ -182,9 +190,8 @@ ol.TileGrid.prototype.getTileCoordForArbitraryResolution = function( y = Math.floor(offsetFromOrigin.y / tileSize.height); var tileCoord = new ol.TileCoord(z, x, y); - var tileCoordPixelBounds = - this.getTileCoordPixelBoundsForArbitraryResolution( - tileCoord, resolution); + var tileCoordPixelBounds = this.getPixelBoundsForTileCoordAndResolution( + tileCoord, resolution); // adjust x to allow for stretched tiles if (offsetFromOrigin.x < tileCoordPixelBounds.minX) { @@ -255,10 +262,9 @@ ol.TileGrid.prototype.getTileCoordExtent = function(tileCoord) { * @param {number} resolution Resolution. * @return {ol.PixelBounds} Pixel bounds. */ -ol.TileGrid.prototype.getTileCoordPixelBoundsForArbitraryResolution = function( +ol.TileGrid.prototype.getPixelBoundsForTileCoordAndResolution = function( tileCoord, resolution) { - var resolutionForZ = this.getResolution(tileCoord.z); - var scale = resolution / resolutionForZ; + var scale = resolution / this.getResolution(tileCoord.z); var tileSize = this.getTileSize(); tileSize = new ol.Size(tileSize.width / scale, tileSize.height / scale); @@ -267,7 +273,6 @@ ol.TileGrid.prototype.getTileCoordPixelBoundsForArbitraryResolution = function( maxX = Math.round((tileCoord.x + 1) * tileSize.width); minY = Math.round(tileCoord.y * tileSize.height); maxY = Math.round((tileCoord.y + 1) * tileSize.height); - return new ol.PixelBounds(minX, minY, maxX, maxY); }; diff --git a/src/ol/tilegrid/tilegrid_test.js b/src/ol/tilegrid/tilegrid_test.js index 84e9702eab..8dc41472f8 100644 --- a/src/ol/tilegrid/tilegrid_test.js +++ b/src/ol/tilegrid/tilegrid_test.js @@ -78,22 +78,26 @@ function testGetTileCoord() { var tileGrid = new ol.TileGrid(resolutions, extent, origin, tileSize); var tileCoord; - tileCoord = tileGrid.getTileCoord(3, new ol.Coordinate(0, 0)); + tileCoord = tileGrid.getTileCoordForCoordAndZ( + new ol.Coordinate(0, 0), 3); assertEquals(3, tileCoord.z); assertEquals(0, tileCoord.x); assertEquals(0, tileCoord.y); - tileCoord = tileGrid.getTileCoord(3, new ol.Coordinate(0, 100000)); + tileCoord = tileGrid.getTileCoordForCoordAndZ( + new ol.Coordinate(0, 100000), 3); assertEquals(3, tileCoord.z); assertEquals(0, tileCoord.x); assertEquals(10, tileCoord.y); - tileCoord = tileGrid.getTileCoord(3, new ol.Coordinate(100000, 0)); + tileCoord = tileGrid.getTileCoordForCoordAndZ( + new ol.Coordinate(100000, 0), 3); assertEquals(3, tileCoord.z); assertEquals(10, tileCoord.x); assertEquals(0, tileCoord.y); - tileCoord = tileGrid.getTileCoord(3, new ol.Coordinate(100000, 100000)); + tileCoord = tileGrid.getTileCoordForCoordAndZ( + new ol.Coordinate(100000, 100000), 3); assertEquals(3, tileCoord.z); assertEquals(10, tileCoord.x); assertEquals(10, tileCoord.y); @@ -107,29 +111,33 @@ function testGetTileCoordYSouth() { var tileGrid = new ol.TileGrid(resolutions, extent, origin, tileSize); var tileCoord; - tileCoord = tileGrid.getTileCoord(3, new ol.Coordinate(0, 0)); + tileCoord = tileGrid.getTileCoordForCoordAndZ( + new ol.Coordinate(0, 0), 3); assertEquals(3, tileCoord.z); assertEquals(0, tileCoord.x); assertEquals(-10, tileCoord.y); - tileCoord = tileGrid.getTileCoord(3, new ol.Coordinate(0, 100000)); + tileCoord = tileGrid.getTileCoordForCoordAndZ( + new ol.Coordinate(0, 100000), 3); assertEquals(3, tileCoord.z); assertEquals(0, tileCoord.x); assertEquals(0, tileCoord.y); - tileCoord = tileGrid.getTileCoord(3, new ol.Coordinate(100000, 0)); + tileCoord = tileGrid.getTileCoordForCoordAndZ( + new ol.Coordinate(100000, 0), 3); assertEquals(3, tileCoord.z); assertEquals(10, tileCoord.x); assertEquals(-10, tileCoord.y); - tileCoord = tileGrid.getTileCoord(3, new ol.Coordinate(100000, 100000)); + tileCoord = tileGrid.getTileCoordForCoordAndZ( + new ol.Coordinate(100000, 100000), 3); assertEquals(3, tileCoord.z); assertEquals(10, tileCoord.x); assertEquals(0, tileCoord.y); } -function testGetTileCoordForArbitraryResolution() { +function testGetTileCoordForCoordAndResolution() { var tileSize = new ol.Size(256, 256); var tileGrid = new ol.TileGrid([10], extent, origin, tileSize); @@ -139,78 +147,78 @@ function testGetTileCoordForArbitraryResolution() { // gets the first tile at the origin coordinate = new ol.Coordinate(0, 0); - tileCoord = tileGrid.getTileCoordForArbitraryResolution( - 0, 10, coordinate); + tileCoord = tileGrid.getTileCoordForCoordAndResolution( + coordinate, 10); assertEquals(0, tileCoord.z); assertEquals(0, tileCoord.x); assertEquals(0, tileCoord.y); // gets one tile northwest of the origin coordinate = new ol.Coordinate(-1280, 1280); - tileCoord = tileGrid.getTileCoordForArbitraryResolution( - 0, 10, coordinate); + tileCoord = tileGrid.getTileCoordForCoordAndResolution( + coordinate, 10); assertEquals(0, tileCoord.z); assertEquals(-1, tileCoord.x); assertEquals(0, tileCoord.y); // gets one tile northeast of the origin coordinate = new ol.Coordinate(1280, 1280); - tileCoord = tileGrid.getTileCoordForArbitraryResolution( - 0, 10, coordinate); + tileCoord = tileGrid.getTileCoordForCoordAndResolution( + coordinate, 10); assertEquals(0, tileCoord.z); assertEquals(0, tileCoord.x); assertEquals(0, tileCoord.y); // gets one tile southeast of the origin coordinate = new ol.Coordinate(1280, -1280); - tileCoord = tileGrid.getTileCoordForArbitraryResolution( - 0, 10, coordinate); + tileCoord = tileGrid.getTileCoordForCoordAndResolution( + coordinate, 10); assertEquals(0, tileCoord.z); assertEquals(0, tileCoord.x); assertEquals(-1, tileCoord.y); // gets one tile southwest of the origin coordinate = new ol.Coordinate(-1280, -1280); - tileCoord = tileGrid.getTileCoordForArbitraryResolution( - 0, 10, coordinate); + tileCoord = tileGrid.getTileCoordForCoordAndResolution( + coordinate, 10); assertEquals(0, tileCoord.z); assertEquals(-1, tileCoord.x); assertEquals(-1, tileCoord.y); // gets the tile to the east when on the edge coordinate = new ol.Coordinate(2560, -1280); - tileCoord = tileGrid.getTileCoordForArbitraryResolution( - 0, 10, coordinate); + tileCoord = tileGrid.getTileCoordForCoordAndResolution( + coordinate, 10); assertEquals(0, tileCoord.z); assertEquals(1, tileCoord.x); assertEquals(-1, tileCoord.y); // gets the tile to the north when on the edge coordinate = new ol.Coordinate(1280, -2560); - tileCoord = tileGrid.getTileCoordForArbitraryResolution( - 0, 10, coordinate); + tileCoord = tileGrid.getTileCoordForCoordAndResolution( + coordinate, 10); assertEquals(0, tileCoord.z); assertEquals(0, tileCoord.x); assertEquals(-1, tileCoord.y); // pixels are top aligned to the origin coordinate = new ol.Coordinate(1280, -2559.999); - tileCoord = tileGrid.getTileCoordForArbitraryResolution( - 0, 10, coordinate); + tileCoord = tileGrid.getTileCoordForCoordAndResolution( + coordinate, 10); assertEquals(0, tileCoord.z); assertEquals(0, tileCoord.x); assertEquals(-1, tileCoord.y); // pixels are left aligned to the origin coordinate = new ol.Coordinate(2559.999, -1280); - tileCoord = tileGrid.getTileCoordForArbitraryResolution( - 0, 10, coordinate); + tileCoord = tileGrid.getTileCoordForCoordAndResolution( + coordinate, 10); assertEquals(0, tileCoord.z); assertEquals(0, tileCoord.x); assertEquals(-1, tileCoord.y); } -function testGetTileCoordForArbitraryResolutionFractional() { +function testGetTileCoordForCoordAndResolutionFractional() { var tileSize = new ol.Size(256, 256); var tileGrid = new ol.TileGrid([1 / 3], extent, origin, tileSize); @@ -225,80 +233,80 @@ function testGetTileCoordForArbitraryResolutionFractional() { // gets the first tile at the origin coordinate = new ol.Coordinate(0, 0); - tileCoord = tileGrid.getTileCoordForArbitraryResolution( - 0, 1, coordinate); + tileCoord = tileGrid.getTileCoordForCoordAndResolution( + coordinate, 1); assertEquals(0, tileCoord.z); assertEquals(0, tileCoord.x); assertEquals(0, tileCoord.y); // gets the 1,0 tile at 256/3,0 coordinate = new ol.Coordinate(256 / 3, 0); - tileCoord = tileGrid.getTileCoordForArbitraryResolution( - 0, 1, coordinate); + tileCoord = tileGrid.getTileCoordForCoordAndResolution( + coordinate, 1); assertEquals(0, tileCoord.z); assertEquals(1, tileCoord.x); assertEquals(0, tileCoord.y); // still gets the 1,0 tile at 512/3,0 - wider tile coordinate = new ol.Coordinate(512 / 3, 0); - tileCoord = tileGrid.getTileCoordForArbitraryResolution( - 0, 1, coordinate); + tileCoord = tileGrid.getTileCoordForCoordAndResolution( + coordinate, 1); assertEquals(0, tileCoord.z); assertEquals(1, tileCoord.x); assertEquals(0, tileCoord.y); // gets the 2,0 tile at 513/3,0 coordinate = new ol.Coordinate(513 / 3, 0); - tileCoord = tileGrid.getTileCoordForArbitraryResolution( - 0, 1, coordinate); + tileCoord = tileGrid.getTileCoordForCoordAndResolution( + coordinate, 1); assertEquals(0, tileCoord.z); assertEquals(2, tileCoord.x); assertEquals(0, tileCoord.y); // gets the 3,0 tile at 768/3,0 coordinate = new ol.Coordinate(768 / 3, 0); - tileCoord = tileGrid.getTileCoordForArbitraryResolution( - 0, 1, coordinate); + tileCoord = tileGrid.getTileCoordForCoordAndResolution( + coordinate, 1); assertEquals(0, tileCoord.z); assertEquals(3, tileCoord.x); assertEquals(0, tileCoord.y); // gets the 4,0 tile at 1024/3,0 coordinate = new ol.Coordinate(1024 / 3, 0); - tileCoord = tileGrid.getTileCoordForArbitraryResolution( - 0, 1, coordinate); + tileCoord = tileGrid.getTileCoordForCoordAndResolution( + coordinate, 1); assertEquals(0, tileCoord.z); assertEquals(4, tileCoord.x); assertEquals(0, tileCoord.y); // still gets the 4,0 tile at 1280/3,0 - wider tile coordinate = new ol.Coordinate(1280 / 3, 0); - tileCoord = tileGrid.getTileCoordForArbitraryResolution( - 0, 1, coordinate); + tileCoord = tileGrid.getTileCoordForCoordAndResolution( + coordinate, 1); assertEquals(0, tileCoord.z); assertEquals(4, tileCoord.x); assertEquals(0, tileCoord.y); // gets the 5,0 tile at 1281/3,0 coordinate = new ol.Coordinate(1281 / 3, 0); - tileCoord = tileGrid.getTileCoordForArbitraryResolution( - 0, 1, coordinate); + tileCoord = tileGrid.getTileCoordForCoordAndResolution( + coordinate, 1); assertEquals(0, tileCoord.z); assertEquals(5, tileCoord.x); assertEquals(0, tileCoord.y); // gets the 0,1 tile at 0,-256/3 coordinate = new ol.Coordinate(0, -256 / 3); - tileCoord = tileGrid.getTileCoordForArbitraryResolution( - 0, 1, coordinate); + tileCoord = tileGrid.getTileCoordForCoordAndResolution( + coordinate, 1); assertEquals(0, tileCoord.z); assertEquals(0, tileCoord.x); assertEquals(-2, tileCoord.y); // still gets the 0,1 tile at 0,-512/3 - taller tile coordinate = new ol.Coordinate(0, -512 / 3); - tileCoord = tileGrid.getTileCoordForArbitraryResolution( - 0, 1, coordinate); + tileCoord = tileGrid.getTileCoordForCoordAndResolution( + coordinate, 1); assertEquals(0, tileCoord.z); assertEquals(0, tileCoord.x); assertEquals(-2, tileCoord.y); @@ -358,25 +366,25 @@ function testGetExtentTileBounds() { var e = new ol.Extent(45000, 5000, 55000, 15000); var tileBounds; - tileBounds = tileGrid.getExtentTileBounds(0, e); + tileBounds = tileGrid.getTileBoundsForExtentAndZ(e, 0); assertEquals(0, tileBounds.minY); assertEquals(0, tileBounds.minX); assertEquals(0, tileBounds.maxX); assertEquals(0, tileBounds.maxY); - tileBounds = tileGrid.getExtentTileBounds(1, e); + tileBounds = tileGrid.getTileBoundsForExtentAndZ(e, 1); assertEquals(0, tileBounds.minX); assertEquals(0, tileBounds.minY); assertEquals(1, tileBounds.maxX); assertEquals(0, tileBounds.maxY); - tileBounds = tileGrid.getExtentTileBounds(2, e); + tileBounds = tileGrid.getTileBoundsForExtentAndZ(e, 2); assertEquals(1, tileBounds.minX); assertEquals(0, tileBounds.minY); assertEquals(2, tileBounds.maxX); assertEquals(0, tileBounds.maxY); - tileBounds = tileGrid.getExtentTileBounds(3, e); + tileBounds = tileGrid.getTileBoundsForExtentAndZ(e, 3); assertEquals(4, tileBounds.minX); assertEquals(0, tileBounds.minY); assertEquals(5, tileBounds.maxX); diff --git a/src/ol/tilestore/tilestore_test.js b/src/ol/tilestore/tilestore_test.js index 031b4d1061..69880a262f 100644 --- a/src/ol/tilestore/tilestore_test.js +++ b/src/ol/tilestore/tilestore_test.js @@ -12,25 +12,32 @@ function testXYZ() { var coordinate = new ol.Coordinate(829330.2064098881, 5933916.615134273); var tileUrl; - tileUrl = tileStore.getTileCoordUrl(tileGrid.getTileCoord(0, coordinate)); + tileUrl = tileStore.getTileCoordUrl( + tileGrid.getTileCoordForCoordAndZ(coordinate, 0)); assertEquals('0/0/0', tileUrl); - tileUrl = tileStore.getTileCoordUrl(tileGrid.getTileCoord(1, coordinate)); + tileUrl = tileStore.getTileCoordUrl( + tileGrid.getTileCoordForCoordAndZ(coordinate, 1)); assertEquals('1/1/0', tileUrl); - tileUrl = tileStore.getTileCoordUrl(tileGrid.getTileCoord(2, coordinate)); + tileUrl = tileStore.getTileCoordUrl( + tileGrid.getTileCoordForCoordAndZ(coordinate, 2)); assertEquals('2/2/1', tileUrl); - tileUrl = tileStore.getTileCoordUrl(tileGrid.getTileCoord(3, coordinate)); + tileUrl = tileStore.getTileCoordUrl( + tileGrid.getTileCoordForCoordAndZ(coordinate, 3)); assertEquals('3/4/2', tileUrl); - tileUrl = tileStore.getTileCoordUrl(tileGrid.getTileCoord(4, coordinate)); + tileUrl = tileStore.getTileCoordUrl( + tileGrid.getTileCoordForCoordAndZ(coordinate, 4)); assertEquals('4/8/5', tileUrl); - tileUrl = tileStore.getTileCoordUrl(tileGrid.getTileCoord(5, coordinate)); + tileUrl = tileStore.getTileCoordUrl( + tileGrid.getTileCoordForCoordAndZ(coordinate, 5)); assertEquals('5/16/11', tileUrl); - tileUrl = tileStore.getTileCoordUrl(tileGrid.getTileCoord(6, coordinate)); + tileUrl = tileStore.getTileCoordUrl( + tileGrid.getTileCoordForCoordAndZ(coordinate, 6)); assertEquals('6/33/22', tileUrl); } diff --git a/src/ol/webgl/tilelayerrenderer.js b/src/ol/webgl/tilelayerrenderer.js index e1141c86b5..1c5022d42a 100644 --- a/src/ol/webgl/tilelayerrenderer.js +++ b/src/ol/webgl/tilelayerrenderer.js @@ -227,7 +227,7 @@ ol.webgl.TileLayerRenderer.prototype.redraw = function() { var tileStore = tileLayer.getStore(); var tileGrid = tileStore.getTileGrid(); var z = tileGrid.getZForResolution(resolution); - var tileBounds = tileGrid.getExtentTileBounds(z, extent); + var tileBounds = tileGrid.getTileBoundsForExtentAndZ(extent, z); var tileBoundsSize = tileBounds.getSize(); var tileSize = tileGrid.getTileSize(); From 089f069456b321116ed7216e449baae270c3c716 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Lemoine?= Date: Sat, 21 Jul 2012 23:53:51 +0200 Subject: [PATCH 277/562] finish porting tschaub's infinite zooming work --- src/ol/dom/tilelayerrenderer.js | 112 ++++++++++++++++++++++---------- 1 file changed, 79 insertions(+), 33 deletions(-) diff --git a/src/ol/dom/tilelayerrenderer.js b/src/ol/dom/tilelayerrenderer.js index ea9b287c63..16fd80003e 100644 --- a/src/ol/dom/tilelayerrenderer.js +++ b/src/ol/dom/tilelayerrenderer.js @@ -1,6 +1,8 @@ goog.provide('ol.dom.TileLayerRenderer'); +goog.require('goog.dom'); goog.require('ol.Coordinate'); +goog.require('ol.Extent'); goog.require('ol.dom.LayerRenderer'); @@ -20,6 +22,12 @@ ol.dom.TileLayerRenderer = function(map, tileLayer, target) { * @private */ this.renderedTiles_ = {}; + + /** + * @type {number|undefined} + * @private + */ + this.renderedResolution_ = undefined; }; goog.inherits(ol.dom.TileLayerRenderer, ol.dom.LayerRenderer); @@ -30,26 +38,30 @@ goog.inherits(ol.dom.TileLayerRenderer, ol.dom.LayerRenderer); ol.dom.TileLayerRenderer.prototype.redraw = function() { var map = this.getMap(); - var extent = map.getExtent(); + var center = map.getCenter(); var resolution = map.getResolution(); - if (!goog.isDef(extent) || !goog.isDef(resolution)) { + if (!goog.isDef(center) || !goog.isDef(resolution)) { return; } - var tileLayer = /** @type {ol.TileLayer} */ (this.getLayer()); - var tileStore = tileLayer.getStore(); + var tileStore = this.getTileStore_(); var tileGrid = tileStore.getTileGrid(); + + if (resolution != this.renderedResolution_) { + this.renderedTiles_ = {}; + goog.dom.removeChildren(this.target); + } + + // z represents the "best" resolution var z = tileGrid.getZForResolution(resolution); - var tileBounds = tileGrid.getExtentTileBounds(z, extent); - var tileSize = tileGrid.getTileSize(); - - var offset = this.getTilesMapOffset_(extent, tileBounds, resolution); + var tileBounds = this.getTileBounds_(center, resolution); + var tileOffset = this.getTileOffset_(z, resolution); var fragment = document.createDocumentFragment(); - var key, tile, x, y, img, newTiles = false; + var key, tile, pixelBounds, img, newTiles = false; tileBounds.forEachTileCoord(z, function(tileCoord) { key = tileCoord.toString(); tile = this.renderedTiles_[key]; @@ -61,14 +73,14 @@ ol.dom.TileLayerRenderer.prototype.redraw = function() { tile.load(); } this.renderedTiles_[key] = tile; - x = tileSize.width * (tileCoord.x - tileBounds.minX); - y = tileSize.height * (tileBounds.maxY - tileCoord.y); + pixelBounds = tileGrid.getPixelBoundsForTileCoordAndResolution( + tileCoord, resolution); img = tile.getImage(this); img.style.position = 'absolute'; - img.style.top = (y - offset.y) + 'px'; - img.style.left = (x - offset.x) + 'px'; - img.style.width = tileSize.width + 'px'; - img.style.height = tileSize.height + 'px'; + img.style.left = (pixelBounds.minX - tileOffset.x) + 'px'; + img.style.top = (-pixelBounds.maxY - tileOffset.y) + 'px'; + img.style.width = pixelBounds.getWidth() + 'px'; + img.style.height = pixelBounds.getHeight() + 'px'; goog.dom.appendChild(fragment, img); newTiles = true; } @@ -80,37 +92,50 @@ ol.dom.TileLayerRenderer.prototype.redraw = function() { } this.removeInvisibleTiles_(tileBounds, z); + this.renderedResolution_ = resolution; }; /** - * Get the pixel offset between top-left corner of tiles and top-left - * corner of map. Return positive values. - * + * Get the pixel offset between the tile origin and the container origin. * @private - * @param {ol.Extent} extent Map extent. - * @param {ol.TileBounds} tileBounds Tile bounds. + * @param {number} z Z. * @param {number} resolution Resolution. * @return {ol.Coordinate} Offset. */ -ol.dom.TileLayerRenderer.prototype.getTilesMapOffset_ = function( - extent, tileBounds, resolution) { - - var tileLayer = /** @type {ol.TileLayer} */ (this.getLayer()); - var tileStore = tileLayer.getStore(); - var tileGrid = tileStore.getTileGrid(); - var z = tileGrid.getZForResolution(resolution); - var tileCoord = new ol.TileCoord(z, tileBounds.minX, tileBounds.maxY); - var tileCoordExtent = tileGrid.getTileCoordExtent(tileCoord); - +ol.dom.TileLayerRenderer.prototype.getTileOffset_ = function(z, resolution) { + var tileGrid = this.getTileGrid_(); + var tileOrigin = tileGrid.getOrigin(z); var offset = new ol.Coordinate( - Math.round((this.origin.x - tileCoordExtent.minX) / resolution), - Math.round((tileCoordExtent.maxY - this.origin.y) / resolution)); - + Math.round((this.origin.x - tileOrigin.x) / resolution), + Math.round((tileOrigin.y - this.origin.y) / resolution)); return offset; }; +/** + * @private + * @param {ol.Coordinate} center Center. + * @param {number} resolution Resolution. + * @return {ol.TileBounds} Tile bounds. + */ +ol.dom.TileLayerRenderer.prototype.getTileBounds_ = function( + center, resolution) { + var map = this.getMap(); + var size = map.getSize(); + var halfSize = new ol.Size(size.width / 2, size.height / 2); + var leftTop = new ol.Coordinate( + center.x - (resolution * halfSize.width), + center.y + (resolution * halfSize.height)); + var rightBottom = new ol.Coordinate( + center.x + (resolution * halfSize.width), + center.y - (resolution * halfSize.height)); + var extent = ol.Extent.boundingExtent(leftTop, rightBottom); + var tileGrid = this.getTileGrid_(); + return tileGrid.getTileBoundsForExtentAndResolution(extent, resolution); +}; + + /** * Get rid of tiles outside the rendered extent. * @private @@ -134,3 +159,24 @@ ol.dom.TileLayerRenderer.prototype.removeInvisibleTiles_ = function( } } }; + + +/** + * Get the tile grid. + * @private + * @return {ol.TileGrid} Tile grid. + */ +ol.dom.TileLayerRenderer.prototype.getTileGrid_ = function() { + return this.getTileStore_().getTileGrid(); +}; + + +/** + * Get the tile store. + * @private + * @return {ol.TileStore} Tile store. + */ +ol.dom.TileLayerRenderer.prototype.getTileStore_ = function() { + var tileLayer = /** @type {ol.TileLayer} */ (this.getLayer()); + return tileLayer.getStore(); +}; From f46c9e12fb5c5983de1fb13a6061ff0a293725c3 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Sun, 22 Jul 2012 01:13:26 +0200 Subject: [PATCH 278/562] Add ol.TileBounds.containsTileBounds --- src/ol/tilebounds.js | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/ol/tilebounds.js b/src/ol/tilebounds.js index 57347567b0..ace41a050a 100644 --- a/src/ol/tilebounds.js +++ b/src/ol/tilebounds.js @@ -49,6 +49,16 @@ ol.TileBounds.prototype.clone = function() { }; +/** + * @param {ol.TileBounds} tileBounds Tile bounds. + * @return {boolean} Contains. + */ +ol.TileBounds.prototype.contains = function(tileBounds) { + return this.minX <= tileBounds.minX && tileBounds.maxX <= this.maxX && + this.minY <= tileBounds.minY && tileBounds.minY <= this.minY; +}; + + /** * @param {number} z Z. * @param {function(this: T, ol.TileCoord)} f Callback. From c82bacb762e54c335c977af8734b2847ec1a1da6 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Sun, 22 Jul 2012 02:50:12 +0200 Subject: [PATCH 279/562] Add ol.TileBounds.equals --- src/ol/tilebounds.js | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/ol/tilebounds.js b/src/ol/tilebounds.js index ace41a050a..133f62117c 100644 --- a/src/ol/tilebounds.js +++ b/src/ol/tilebounds.js @@ -59,6 +59,16 @@ ol.TileBounds.prototype.contains = function(tileBounds) { }; +/** + * @param {ol.TileBounds} tileBounds Tile bounds. + * @return {boolean} Equals. + */ +ol.TileBounds.prototype.equals = function(tileBounds) { + return this.minX == tileBounds.minX && tileBounds.maxX == this.maxX && + this.minY == tileBounds.minY && tileBounds.minY == this.minY; +}; + + /** * @param {number} z Z. * @param {function(this: T, ol.TileCoord)} f Callback. From 4906bdced547fc02db7c358073c244e6d8633048 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Sun, 22 Jul 2012 01:14:27 +0200 Subject: [PATCH 280/562] Add working WebGL renderer --- src/ol/webgl/map.js | 23 +++-- src/ol/webgl/tilelayerrenderer.js | 166 +++++++++++++++++++----------- 2 files changed, 118 insertions(+), 71 deletions(-) diff --git a/src/ol/webgl/map.js b/src/ol/webgl/map.js index 1af8c09464..62ac562ccc 100644 --- a/src/ol/webgl/map.js +++ b/src/ol/webgl/map.js @@ -39,13 +39,17 @@ ol.webgl.map.shader.Fragment = function() { goog.base(this, [ 'precision mediump float;', '', + 'uniform mat4 uMatrix;', 'uniform float uOpacity;', 'uniform sampler2D uTexture;', '', 'varying vec2 vTexCoord;', '', 'void main(void) {', - ' gl_FragColor = vec4(texture2D(uTexture, vTexCoord).rgb, uOpacity);', + ' vec4 texCoord = uMatrix * vec4(vTexCoord, 0., 1.);', + ' vec4 srcColor = texture2D(uTexture, texCoord.st);', + ' gl_FragColor.rgb = srcColor.rgb;', + ' gl_FragColor.a = srcColor.a * uOpacity;', '}' ].join('\n')); }; @@ -65,10 +69,8 @@ ol.webgl.map.shader.Vertex = function() { '', 'varying vec2 vTexCoord;', '', - 'uniform mat4 uMatrix;', - '', 'void main(void) {', - ' gl_Position = uMatrix * vec4(aPosition, 0., 1.);', + ' gl_Position = vec4(aPosition, 0., 1.);', ' vTexCoord = aTexCoord;', '}' ].join('\n')); @@ -417,7 +419,10 @@ ol.webgl.Map.prototype.handleWebGLContextLost = function(event) { */ ol.webgl.Map.prototype.handleWebGLContextRestored = function() { var gl = this.gl_; + gl.activeTexture(goog.webgl.TEXTURE0); + gl.blendFunc(goog.webgl.SRC_ALPHA, goog.webgl.ONE_MINUS_SRC_ALPHA); gl.disable(goog.webgl.CULL_FACE); + gl.disable(goog.webgl.DEPTH_TEST); gl.disable(goog.webgl.SCISSOR_TEST); this.redraw(); }; @@ -433,6 +438,7 @@ ol.webgl.Map.prototype.redrawInternal = function() { if (!goog.isDef(center) || !goog.isDef(resolution)) { return false; } + var size = this.getSize(); var animate = goog.base(this, 'redrawInternal'); @@ -444,7 +450,7 @@ ol.webgl.Map.prototype.redrawInternal = function() { this.clearColor_.a); gl.clear(goog.webgl.COLOR_BUFFER_BIT); gl.enable(goog.webgl.BLEND); - gl.blendFunc(goog.webgl.SRC_ALPHA, goog.webgl.ONE_MINUS_SRC_ALPHA); + gl.viewport(0, 0, size.width, size.height); var program = this.getProgram(this.fragmentShader_, this.vertexShader_); gl.useProgram(program); @@ -462,9 +468,9 @@ ol.webgl.Map.prototype.redrawInternal = function() { var arrayBuffer = gl.createBuffer(); gl.bindBuffer(goog.webgl.ARRAY_BUFFER, arrayBuffer); gl.bufferData(goog.webgl.ARRAY_BUFFER, new Float32Array([ - 0, 0, 0, 0, - 1, 0, 1, 0, - 0, 1, 0, 1, + -1, -1, 0, 0, + 1, -1, 1, 0, + -1, 1, 0, 1, 1, 1, 1, 1 ]), goog.webgl.STATIC_DRAW); this.arrayBuffer_ = arrayBuffer; @@ -485,7 +491,6 @@ ol.webgl.Map.prototype.redrawInternal = function() { this.locations_.uMatrix, false, layerRenderer.getMatrix()); gl.uniform1f(this.locations_.uOpacity, layer.getOpacity()); gl.bindTexture(goog.webgl.TEXTURE_2D, layerRenderer.getTexture()); - gl.activeTexture(goog.webgl.TEXTURE0); gl.drawArrays(goog.webgl.TRIANGLE_STRIP, 0, 4); }, this); diff --git a/src/ol/webgl/tilelayerrenderer.js b/src/ol/webgl/tilelayerrenderer.js index 1c5022d42a..85b914597e 100644 --- a/src/ol/webgl/tilelayerrenderer.js +++ b/src/ol/webgl/tilelayerrenderer.js @@ -30,7 +30,7 @@ ol.webgl.tilelayerrenderer.shader.Fragment = function() { 'varying vec2 vTexCoord;', '', 'void main(void) {', - ' gl_FragColor = vec4(texture2D(uTexture, vTexCoord).rgb, 1.);', + ' gl_FragColor = texture2D(uTexture, vTexCoord);', '}' ].join('\n')); }; @@ -123,9 +123,9 @@ ol.webgl.TileLayerRenderer = function(map, tileLayer) { /** * @private - * @type {ol.Size} + * @type {number|undefined} */ - this.framebufferSize_ = null; + this.framebufferDimension_ = undefined; /** * @private @@ -137,12 +137,62 @@ ol.webgl.TileLayerRenderer = function(map, tileLayer) { * @private * @type {goog.vec.Mat4.AnyType} */ - this.matrix_ = goog.vec.Mat4.createFloat32(); + this.matrix_ = goog.vec.Mat4.createNumber(); }; goog.inherits(ol.webgl.TileLayerRenderer, ol.webgl.LayerRenderer); +/** + * @param {number} framebufferDimension Framebuffer dimension. + * @private + */ +ol.webgl.TileLayerRenderer.prototype.bindFramebuffer_ = + function(framebufferDimension) { + + var gl = this.getGL(); + + if (!goog.isDef(this.framebufferDimension_) || + this.framebufferDimension_ != framebufferDimension) { + + gl.deleteFramebuffer(this.framebuffer_); + gl.deleteRenderbuffer(this.renderbuffer_); + gl.deleteTexture(this.texture_); + + var texture = gl.createTexture(); + gl.bindTexture(goog.webgl.TEXTURE_2D, texture); + gl.texImage2D(goog.webgl.TEXTURE_2D, 0, gl.RGBA, framebufferDimension, + framebufferDimension, 0, goog.webgl.RGBA, goog.webgl.UNSIGNED_BYTE, + null); + gl.texParameteri(goog.webgl.TEXTURE_2D, goog.webgl.TEXTURE_MAG_FILTER, + goog.webgl.LINEAR); + gl.texParameteri(goog.webgl.TEXTURE_2D, goog.webgl.TEXTURE_MIN_FILTER, + goog.webgl.LINEAR); + + var renderbuffer = gl.createRenderbuffer(); + gl.bindRenderbuffer(goog.webgl.RENDERBUFFER, renderbuffer); + gl.renderbufferStorage(goog.webgl.RENDERBUFFER, + goog.webgl.DEPTH_COMPONENT16, framebufferDimension, + framebufferDimension); + + var framebuffer = gl.createFramebuffer(); + gl.bindFramebuffer(goog.webgl.FRAMEBUFFER, framebuffer); + gl.framebufferTexture2D(goog.webgl.FRAMEBUFFER, + goog.webgl.COLOR_ATTACHMENT0, goog.webgl.TEXTURE_2D, texture, 0); + gl.framebufferRenderbuffer(goog.webgl.FRAMEBUFFER, + goog.webgl.DEPTH_ATTACHMENT, goog.webgl.RENDERBUFFER, renderbuffer); + + this.texture_ = texture; + this.renderbuffer_ = renderbuffer; + this.framebuffer_ = framebuffer; + this.framebufferDimension_ = framebufferDimension; + + } else { + gl.bindFramebuffer(goog.webgl.FRAMEBUFFER, this.framebuffer_); + } +}; + + /** * @return {ol.TileLayer} Layer. * @override @@ -199,7 +249,7 @@ ol.webgl.TileLayerRenderer.prototype.handleWebGLContextLost = function() { this.texture_ = null; this.renderbuffer_ = null; this.framebuffer_ = null; - this.framebufferSize_ = null; + this.framebufferDimension_ = undefined; }; @@ -219,60 +269,37 @@ ol.webgl.TileLayerRenderer.prototype.redraw = function() { var gl = this.getGL(); var map = this.getMap(); - var center = /** @type {!ol.Coordinate} */ map.getCenter(); - var extent = /** @type {!ol.Extent} */ map.getExtent(); - var resolution = /** @type {number} */ map.getResolution(); + var mapExtent = /** @type {!ol.Extent} */ map.getExtent(); + var mapResolution = /** @type {number} */ map.getResolution(); + var mapSize = map.getSize(); var tileLayer = this.getLayer(); var tileStore = tileLayer.getStore(); var tileGrid = tileStore.getTileGrid(); - var z = tileGrid.getZForResolution(resolution); - var tileBounds = tileGrid.getTileBoundsForExtentAndZ(extent, z); + var z = tileGrid.getZForResolution(mapResolution); + var tileBounds = tileGrid.getTileBoundsForExtentAndZ(mapExtent, z); var tileBoundsSize = tileBounds.getSize(); var tileSize = tileGrid.getTileSize(); - var framebufferSize = new ol.Size( - tileSize.width * tileBoundsSize.width, - tileSize.height * tileBoundsSize.height); - - if (goog.isNull(this.framebufferSize_) || - !this.framebufferSize_.equals(framebufferSize)) { - - gl.deleteFramebuffer(this.framebuffer_); - gl.deleteRenderbuffer(this.renderbuffer_); - gl.deleteTexture(this.texture_); - - var texture = gl.createTexture(); - gl.bindTexture(goog.webgl.TEXTURE_2D, texture); - gl.texImage2D(goog.webgl.TEXTURE_2D, 0, gl.RGBA, framebufferSize.width, - framebufferSize.height, 0, goog.webgl.RGBA, goog.webgl.UNSIGNED_BYTE, - null); - gl.texParameteri(goog.webgl.TEXTURE_2D, goog.webgl.TEXTURE_MAG_FILTER, - goog.webgl.LINEAR); - gl.texParameteri(goog.webgl.TEXTURE_2D, goog.webgl.TEXTURE_MIN_FILTER, - goog.webgl.LINEAR); - - var renderbuffer = gl.createRenderbuffer(); - gl.bindRenderbuffer(goog.webgl.RENDERBUFFER, renderbuffer); - gl.renderbufferStorage(goog.webgl.RENDERBUFFER, - goog.webgl.DEPTH_COMPONENT16, framebufferSize.width, - framebufferSize.height); - - var framebuffer = gl.createFramebuffer(); - gl.bindFramebuffer(goog.webgl.FRAMEBUFFER, framebuffer); - gl.framebufferTexture2D(goog.webgl.FRAMEBUFFER, - goog.webgl.COLOR_ATTACHMENT0, goog.webgl.TEXTURE_2D, texture, 0); - gl.framebufferRenderbuffer(goog.webgl.FRAMEBUFFER, - goog.webgl.DEPTH_ATTACHMENT, goog.webgl.RENDERBUFFER, renderbuffer); - - this.texture_ = texture; - this.renderbuffer_ = renderbuffer; - this.framebuffer_ = framebuffer; - this.framebufferSize_ = framebufferSize; - - } else { - gl.bindFramebuffer(goog.webgl.FRAMEBUFFER, this.framebuffer_); + var maxDimension = Math.max( + tileBoundsSize.width * tileSize.width, + tileBoundsSize.height * tileSize.height); + // FIXME find a better algorithms for rounding up to the next power of two + var framebufferDimension = Math.max(tileSize.width, tileSize.height); + while (framebufferDimension < maxDimension) { + framebufferDimension *= 2; } + var nTilesX = framebufferDimension / tileSize.width; + var nTilesY = framebufferDimension / tileSize.height; + var framebufferTileBounds = new ol.TileBounds( + tileBounds.minX, + tileBounds.minY, + tileBounds.minX + nTilesX - 1, + tileBounds.minY + nTilesY - 1); + goog.asserts.assert(framebufferTileBounds.contains(tileBounds)); + + this.bindFramebuffer_(framebufferDimension); + gl.viewport(0, 0, framebufferDimension, framebufferDimension); gl.clearColor(0, 0, 0, 0); gl.clear(goog.webgl.COLOR_BUFFER_BIT); @@ -292,13 +319,11 @@ ol.webgl.TileLayerRenderer.prototype.redraw = function() { if (goog.isNull(this.arrayBuffer_)) { var arrayBuffer = gl.createBuffer(); gl.bindBuffer(goog.webgl.ARRAY_BUFFER, arrayBuffer); - var textureOffsetX = 0.5 / tileSize.width; - var textureOffsetY = 0.5 / tileSize.height; gl.bufferData(goog.webgl.ARRAY_BUFFER, new Float32Array([ - 0, 0, 0 + textureOffsetX, 1 + textureOffsetY, - 1, 0, 1 + textureOffsetX, 1 + textureOffsetY, - 0, 1, 0 + textureOffsetX, 0 + textureOffsetY, - 1, 1, 1 + textureOffsetX, 0 + textureOffsetY + -1, -1, 0, 1, + 1, -1, 1, 1, + -1, 1, 0, 0, + 1, 1, 1, 0 ]), goog.webgl.STATIC_DRAW); this.arrayBuffer_ = arrayBuffer; } else { @@ -319,16 +344,19 @@ ol.webgl.TileLayerRenderer.prototype.redraw = function() { } else if (tile.isLoaded()) { var uMatrix = goog.vec.Mat4.createFloat32Identity(); goog.vec.Mat4.translate(uMatrix, - 2 * (tileCoord.x - tileBounds.minX) / tileBoundsSize.width - 1, - 2 * (tileCoord.y - tileBounds.minY) / tileBoundsSize.height - 1, + 0.5 / tileSize.width, + 0.5 / tileSize.height, + 0); + goog.vec.Mat4.translate(uMatrix, + 2 * (tileCoord.x - framebufferTileBounds.minX + 0.5) / nTilesX - 1, + 2 * (tileCoord.y - framebufferTileBounds.minY + 0.5) / nTilesY - 1, 0); goog.vec.Mat4.scale(uMatrix, - 2 / tileBoundsSize.width, - 2 / tileBoundsSize.height, + 1 / nTilesX, + 1 / nTilesY, 1); gl.uniformMatrix4fv(this.locations_.uMatrix, false, uMatrix); gl.bindTexture(goog.webgl.TEXTURE_2D, map.getTileTexture(tile)); - gl.activeTexture(goog.webgl.TEXTURE0); gl.drawArrays(goog.webgl.TRIANGLE_STRIP, 0, 4); } else { var key = goog.getUid(tile); @@ -341,6 +369,20 @@ ol.webgl.TileLayerRenderer.prototype.redraw = function() { } }, this); + var framebufferTileBoundsExtent = + tileGrid.getTileBoundsExtent(z, framebufferTileBounds); + goog.vec.Mat4.makeIdentity(this.matrix_); + goog.vec.Mat4.translate(this.matrix_, + (mapExtent.minX - framebufferTileBoundsExtent.minX) / + (framebufferTileBoundsExtent.maxX - framebufferTileBoundsExtent.minX), + (mapExtent.minY - framebufferTileBoundsExtent.minY) / + (framebufferTileBoundsExtent.maxY - framebufferTileBoundsExtent.minY), + 0); + goog.vec.Mat4.scale(this.matrix_, + mapSize.width / framebufferDimension, + mapSize.height / framebufferDimension, + 1); + }; From f859a4803382a2433015681ff1a1a7c55e25a145 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Sun, 22 Jul 2012 01:15:02 +0200 Subject: [PATCH 281/562] Enable side-by-side DOM and WebGL demo --- skeleton.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/skeleton.js b/skeleton.js index 9a7c7bdf4d..87fb13c185 100644 --- a/skeleton.js +++ b/skeleton.js @@ -23,7 +23,7 @@ map1.setResolution(resolutions[0]); if (twoMaps) { target = /** @type {!HTMLDivElement} */ document.getElementById('map2'); - map2 = ol.createMap(target, undefined, ol.RendererHint.DOM); + map2 = ol.createMap(target, undefined, ol.RendererHint.WEBGL); map2.bindTo('center', map1); map2.bindTo('layers', map1); map2.bindTo('resolution', map1); From 33449e657ab171293b1070082a4476f0a5a32177 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Sun, 22 Jul 2012 01:15:43 +0200 Subject: [PATCH 282/562] Add various FIXMEs --- src/ol/map.js | 4 ++++ src/ol/webgl/tilelayerrenderer.js | 2 ++ 2 files changed, 6 insertions(+) diff --git a/src/ol/map.js b/src/ol/map.js index 5d860736e4..aaec74f022 100644 --- a/src/ol/map.js +++ b/src/ol/map.js @@ -1,4 +1,8 @@ +// FIXME rename redraw to render +// FIXME rename freeze/thaw to freezeRendering/unfreezeRendering +// FIXME add change resolution by zoom step function // FIXME recheck layer/map projection compatability when projection changes +// FIXME layer renderers should skip when they can't reproject goog.provide('ol.Map'); goog.provide('ol.MapProperty'); diff --git a/src/ol/webgl/tilelayerrenderer.js b/src/ol/webgl/tilelayerrenderer.js index 85b914597e..ecdf12ae8f 100644 --- a/src/ol/webgl/tilelayerrenderer.js +++ b/src/ol/webgl/tilelayerrenderer.js @@ -1,4 +1,6 @@ +// FIXME large resolutions lead to too large framebuffers :-( // FIXME animated shaders! check in redraw +// FIXME out-by-one error in texture alignment? goog.provide('ol.webgl.TileLayerRenderer'); goog.provide('ol.webgl.tilelayerrenderer.shader.Fragment'); From abc1b4ff042157adc4b15231a007536177a3c0a6 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Sun, 22 Jul 2012 01:22:18 +0200 Subject: [PATCH 283/562] Rename redraw to render --- src/ol/dom/layerrenderer.js | 2 +- src/ol/dom/map.js | 4 ++-- src/ol/dom/tilelayerrenderer.js | 2 +- src/ol/map.js | 14 +++++++------- src/ol/webgl/layerrenderer.js | 2 +- src/ol/webgl/map.js | 22 +++++++++++----------- src/ol/webgl/tilelayerrenderer.js | 2 +- 7 files changed, 24 insertions(+), 24 deletions(-) diff --git a/src/ol/dom/layerrenderer.js b/src/ol/dom/layerrenderer.js index 2fdb0e144f..50ff69acf0 100644 --- a/src/ol/dom/layerrenderer.js +++ b/src/ol/dom/layerrenderer.js @@ -73,4 +73,4 @@ ol.dom.LayerRenderer.prototype.handleLayerVisibleChange = function() { /** */ -ol.dom.LayerRenderer.prototype.redraw = goog.abstractMethod; +ol.dom.LayerRenderer.prototype.render = goog.abstractMethod; diff --git a/src/ol/dom/map.js b/src/ol/dom/map.js index 79faa165fe..c5418bb31b 100644 --- a/src/ol/dom/map.js +++ b/src/ol/dom/map.js @@ -163,7 +163,7 @@ ol.dom.Map.prototype.handleCenterChanged = function() { } else { this.resetLayersPane_(); } - this.redraw(); + this.render(); }; @@ -191,7 +191,7 @@ ol.dom.Map.prototype.handleResolutionChanged = function() { // FIXME: resetLayersPane_ should be called // elsewhere as we may be frozen here this.resetLayersPane_(); - this.redraw(); + this.render(); }; diff --git a/src/ol/dom/tilelayerrenderer.js b/src/ol/dom/tilelayerrenderer.js index 16fd80003e..7dd623cf24 100644 --- a/src/ol/dom/tilelayerrenderer.js +++ b/src/ol/dom/tilelayerrenderer.js @@ -35,7 +35,7 @@ goog.inherits(ol.dom.TileLayerRenderer, ol.dom.LayerRenderer); /** * @inheritDoc */ -ol.dom.TileLayerRenderer.prototype.redraw = function() { +ol.dom.TileLayerRenderer.prototype.render = function() { var map = this.getMap(); var center = map.getCenter(); diff --git a/src/ol/map.js b/src/ol/map.js index aaec74f022..5420b2cc32 100644 --- a/src/ol/map.js +++ b/src/ol/map.js @@ -1,4 +1,3 @@ -// FIXME rename redraw to render // FIXME rename freeze/thaw to freezeRendering/unfreezeRendering // FIXME add change resolution by zoom step function // FIXME recheck layer/map projection compatability when projection changes @@ -626,10 +625,10 @@ ol.Map.prototype.recalculateTransforms_ = function() { /** */ -ol.Map.prototype.redraw = function() { +ol.Map.prototype.render = function() { if (!this.animating_) { if (this.freezeCount_ === 0) { - if (this.redrawInternal()) { + if (this.renderInternal()) { this.animate_(); } } else { @@ -643,13 +642,14 @@ ol.Map.prototype.redraw = function() { * @protected * @return {boolean} Animating. */ -ol.Map.prototype.redrawInternal = function() { +ol.Map.prototype.renderInternal = function() { + this.dirty_ = false; var animate = false; this.forEachVisibleLayer(function(layer, layerRenderer) { - if (layerRenderer.redraw()) { + if (layerRenderer.render()) { animate = true; } }); @@ -783,7 +783,7 @@ ol.Map.prototype.thaw = function() { goog.asserts.assert(this.freezeCount_ > 0); if (--this.freezeCount_ === 0) { if (!this.animating_ && this.dirty_) { - if (this.redrawInternal()) { + if (this.renderInternal()) { this.animate_(); } } @@ -812,7 +812,7 @@ ol.MapAnimation = function(map) { * @inheritDoc */ ol.MapAnimation.prototype.onAnimationFrame = function() { - if (!this.map_.redrawInternal()) { + if (!this.map_.renderInternal()) { goog.fx.anim.unregisterAnimation(this); } }; diff --git a/src/ol/webgl/layerrenderer.js b/src/ol/webgl/layerrenderer.js index 7e04754c98..86b67feadb 100644 --- a/src/ol/webgl/layerrenderer.js +++ b/src/ol/webgl/layerrenderer.js @@ -55,4 +55,4 @@ ol.webgl.LayerRenderer.prototype.handleWebGLContextLost = goog.nullFunction; /** */ -ol.webgl.LayerRenderer.prototype.redraw = goog.abstractMethod; +ol.webgl.LayerRenderer.prototype.render = goog.abstractMethod; diff --git a/src/ol/webgl/map.js b/src/ol/webgl/map.js index 62ac562ccc..0d2ac8292e 100644 --- a/src/ol/webgl/map.js +++ b/src/ol/webgl/map.js @@ -1,5 +1,5 @@ // FIXME clear tileTextureCache -// FIXME defer texture loads until after redraw when animating +// FIXME defer texture loads until after render when animating // FIXME generational tile texture garbage collector newFrame/get // FIXME defer cleanup until post-render // FIXME check against gl.getParameter(webgl.MAX_TEXTURE_SIZE) @@ -325,7 +325,7 @@ ol.webgl.Map.prototype.handleBackgroundColorChanged = function() { backgroundColor.g / 255, backgroundColor.b / 255, backgroundColor.a / 255); - this.redraw(); + this.render(); }; @@ -334,7 +334,7 @@ ol.webgl.Map.prototype.handleBackgroundColorChanged = function() { */ ol.webgl.Map.prototype.handleCenterChanged = function() { goog.base(this, 'handleCenterChanged'); - this.redraw(); + this.render(); }; @@ -344,7 +344,7 @@ ol.webgl.Map.prototype.handleCenterChanged = function() { ol.webgl.Map.prototype.handleLayerAdd = function(layer) { goog.base(this, 'handleLayerAdd', layer); if (layer.getVisible()) { - this.redraw(); + this.render(); } }; @@ -354,7 +354,7 @@ ol.webgl.Map.prototype.handleLayerAdd = function(layer) { * @protected */ ol.webgl.Map.prototype.handleLayerRendererChange = function(event) { - this.redraw(); + this.render(); }; @@ -364,7 +364,7 @@ ol.webgl.Map.prototype.handleLayerRendererChange = function(event) { ol.webgl.Map.prototype.handleLayerRemove = function(layer) { goog.base(this, 'handleLayerRemove', layer); if (layer.getVisible()) { - this.redraw(); + this.render(); } }; @@ -374,7 +374,7 @@ ol.webgl.Map.prototype.handleLayerRemove = function(layer) { */ ol.webgl.Map.prototype.handleResolutionChanged = function() { goog.base(this, 'handleResolutionChanged'); - this.redraw(); + this.render(); }; @@ -392,7 +392,7 @@ ol.webgl.Map.prototype.handleSizeChanged = function() { var gl = this.gl_; if (!goog.isNull(gl)) { gl.viewport(0, 0, size.width, size.height); - this.redraw(); + this.render(); } }; @@ -424,14 +424,14 @@ ol.webgl.Map.prototype.handleWebGLContextRestored = function() { gl.disable(goog.webgl.CULL_FACE); gl.disable(goog.webgl.DEPTH_TEST); gl.disable(goog.webgl.SCISSOR_TEST); - this.redraw(); + this.render(); }; /** * @inheritDoc */ -ol.webgl.Map.prototype.redrawInternal = function() { +ol.webgl.Map.prototype.renderInternal = function() { var center = this.getCenter(); var resolution = this.getResolution(); @@ -440,7 +440,7 @@ ol.webgl.Map.prototype.redrawInternal = function() { } var size = this.getSize(); - var animate = goog.base(this, 'redrawInternal'); + var animate = goog.base(this, 'renderInternal'); var gl = this.getGL(); diff --git a/src/ol/webgl/tilelayerrenderer.js b/src/ol/webgl/tilelayerrenderer.js index ecdf12ae8f..902bb57cc6 100644 --- a/src/ol/webgl/tilelayerrenderer.js +++ b/src/ol/webgl/tilelayerrenderer.js @@ -266,7 +266,7 @@ ol.webgl.TileLayerRenderer.prototype.handleTileChange = function() { /** * @inheritDoc */ -ol.webgl.TileLayerRenderer.prototype.redraw = function() { +ol.webgl.TileLayerRenderer.prototype.render = function() { var gl = this.getGL(); From 3eefbaa3372270e9cb9a3ef68374c0527836610a Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Sun, 22 Jul 2012 01:26:55 +0200 Subject: [PATCH 284/562] Remove merged code --- Makefile | 8 +- src/ol/Loc.js | 147 ------------ src/ol/layer/OSM.js | 21 -- src/ol/layer/TileLayer.js | 490 -------------------------------------- src/ol/layer/XYZ.js | 35 --- src/ol/renderer/WebGL.js | 273 --------------------- 6 files changed, 1 insertion(+), 973 deletions(-) delete mode 100644 src/ol/Loc.js delete mode 100644 src/ol/layer/OSM.js delete mode 100644 src/ol/layer/TileLayer.js delete mode 100644 src/ol/layer/XYZ.js delete mode 100644 src/ol/renderer/WebGL.js diff --git a/Makefile b/Makefile index b9e9df4e14..edd10287c4 100644 --- a/Makefile +++ b/Makefile @@ -20,7 +20,6 @@ GSLINT_EXCLUDES= \ src/ol/control/Control.js \ src/ol/control/Navigation.js \ src/ol/control/Zoom.js \ - src/ol/coord/AccessorInterface.js \ src/ol/event/Drag.js \ src/ol/event/Events.js \ src/ol/event/ISequence.js \ @@ -34,17 +33,12 @@ GSLINT_EXCLUDES= \ src/ol/geom/MultiPoint.js \ src/ol/geom/Point.js \ src/ol/handler/Drag.js \ - src/ol/layer/OSM.js \ - src/ol/layer/TileLayer.js \ src/ol/layer/WMS.js \ - src/ol/layer/XYZ.js \ - src/ol/Loc.js \ src/ol/Popup.js \ src/ol/renderer/Composite.js \ src/ol/renderer/LayerRenderer.js \ src/ol/renderer/MapRenderer.js \ - src/ol/renderer/TileLayerRenderer.js \ - src/ol/renderer/WebGL.js + src/ol/renderer/TileLayerRenderer.js comma := , empty := space := $(empty) $(empty) diff --git a/src/ol/Loc.js b/src/ol/Loc.js deleted file mode 100644 index 035ffa933a..0000000000 --- a/src/ol/Loc.js +++ /dev/null @@ -1,147 +0,0 @@ -goog.provide('ol.Loc'); - -goog.require('ol.Projection'); - - - -/** - * @export - * @constructor - * @param {number} x X. - * @param {number} y Y. - * @param {number=} opt_z Z. - * @param {ol.Projection=} opt_projection Projection. - */ -ol.Loc = function(x, y, opt_z, opt_projection) { - - /** - * @private - * @type {number} - */ - this.x_ = x; - - /** - * @private - * @type {number} - */ - this.y_ = y; - - /** - * @private - * @type {number|undefined} - */ - this.z_ = opt_z; - - /** - * @private - * @type {ol.Projection} - */ - this.projection_ = goog.isDef(opt_projection) ? opt_projection : null; - -}; - - -/** - * @return {ol.Projection|undefined} Projection. - */ -ol.Loc.prototype.getProjection = function() { - return this.projection_; -}; - - -/** - * @return {number} X. - */ -ol.Loc.prototype.getX = function() { - return this.x_; -}; - - -/** - * @return {number} Y. - */ -ol.Loc.prototype.getY = function() { - return this.y_; -}; - - -/** - * @return {number|undefined} Z. - */ -ol.Loc.prototype.getZ = function() { - return this.z_; -}; - - -/** - * @param {ol.Projection} projection Projection. - */ -ol.Loc.prototype.setProjection = function(projection) { - this.projection_ = projection; -}; - - -/** - * @param {number} x X. - */ -ol.Loc.prototype.setX = function(x) { - this.x_ = x; -}; - - -/** - * @param {number} y Y. - */ -ol.Loc.prototype.setY = function(y) { - this.y_ = y; -}; - - -/** - * @param {number|undefined} z Z. - */ -ol.Loc.prototype.setZ = function(z) { - this.z_ = z; -}; - -/** - * Transform this location to a new location given a projection object. - * - * @param {ol.Projection} proj The destination projection. - * @returns {ol.Loc} - */ -ol.Loc.prototype.doTransform = function(proj) { - var point = {'x': this.x_, 'y': this.y_}; - var sourceProj = this.projection_; - if (!goog.isDefAndNotNull(sourceProj)) { - throw new Error("Cannot transform a location without a source projection."); - } - ol.Projection.transform(point, sourceProj, proj); - return new ol.Loc(point['x'], point['y'], this.z_, proj); -}; - -/** - * Adds the passed x, y(, z) delta to a new location. - * - * @param {number} x - * @param {number} y - * @param {number=} opt_z - * @returns {ol.Loc} - */ -ol.Loc.prototype.add = function(x, y, opt_z) { - var newZ; - if (goog.isDef(this.z_)) { - newZ = (opt_z || 0) + this.z_; - } - return new ol.Loc(this.x_ + x, this.y_ + y, newZ, this.projection_); -}; - -/** - * Clean up. - * @export - */ -ol.Loc.prototype.destroy = function() { - for (var key in this) { - delete this[key]; - } -}; diff --git a/src/ol/layer/OSM.js b/src/ol/layer/OSM.js deleted file mode 100644 index b628e3119d..0000000000 --- a/src/ol/layer/OSM.js +++ /dev/null @@ -1,21 +0,0 @@ -goog.provide('ol.layer.OSM'); - -goog.require('ol.layer.XYZ'); - -/** - * Class for OSM layers. - * - * @export - * @constructor - * @extends {ol.layer.XYZ} - */ -ol.layer.OSM = function() { - - //TODO Is this attribution still correct? - /** @inheritDoc */ - this.attribution_ = "Data CC-By-SA by OpenStreetMap"; - - goog.base(this, 'http://a.tile.openstreetmap.org/{z}/{x}/{y}.png'); -}; - -goog.inherits(ol.layer.OSM, ol.layer.XYZ); diff --git a/src/ol/layer/TileLayer.js b/src/ol/layer/TileLayer.js deleted file mode 100644 index 0b2bc7cc1e..0000000000 --- a/src/ol/layer/TileLayer.js +++ /dev/null @@ -1,490 +0,0 @@ -goog.provide('ol.layer.TileLayer'); - -goog.require('ol.error'); -goog.require('ol.layer.Layer'); -goog.require('ol.Tile'); -goog.require('ol.TileCache'); - -/** - * @constructor - * @extends {ol.layer.Layer} - */ -ol.layer.TileLayer = function() { - - /** - * @private - * @type {string|undefined} - */ - this.url_ = undefined; - - /** - * @protected - * @type {ol.Projection} - */ - this.projection_ = null; - - /** - * @private - * @type {ol.Bounds} - */ - this.extent_ = null; - - /** - * @protected - * @type {number} - */ - this.tileWidth_ = 256; - - /** - * @protected - * @type {number} - */ - this.tileHeight_ = 256; - - /** - * @protected - * @type {function(new:ol.Tile, string, ol.Bounds=)} - */ - this.Tile = ol.Tile.createConstructor(this.tileWidth_, this.tileHeight_); - - /** - * @protected - * @type {number|undefined} - */ - this.tileOriginX_ = undefined; - - /** - * @protected - * @type {number|undefined} - */ - this.tileOriginY_ = undefined; - - /** - * @private - * @type {string} - */ - this.tileOriginCorner_ = 'tl'; - - /** - * @private - * @type {number|undefined} - */ - this.maxResolution_ = undefined; - - /** - * @private - * @type {boolean} - */ - this.xRight_ = true; - - /** - * @private - * @type {boolean} - */ - this.yDown_ = true; - - /** - * @private - * @type {number|undefined} - */ - this.numZoomLevels_ = undefined; - - /** - * @protected - * @type {Array.} - */ - this.resolutions_ = null; - - /** - * @private - * @type {ol.TileCache} - */ - this.cache_ = new ol.TileCache(); - -}; - -goog.inherits(ol.layer.TileLayer, ol.layer.Layer); - -/** - * @protected - * @param {number} x - * @param {number} y - * @param {number} z - * @return {string} - */ -ol.layer.TileLayer.prototype.getTileUrl = function(x, y, z) { - // overridden by subclasses -}; - -/** - * @return {string|undefined} The layer URL. - */ -ol.layer.TileLayer.prototype.getUrl = function() { - return this.url_; -}; - -/** - * @return {boolean} The tile index increases from left to right. - */ -ol.layer.TileLayer.prototype.getXRight = function() { - return this.xRight_; -}; - -/** - * @return {boolean} The tile index increases from top to bottom. - */ -ol.layer.TileLayer.prototype.getYDown = function() { - return this.yDown_; -}; - -/** - * @param {boolean} right The tile index increases from left to right. - */ -ol.layer.TileLayer.prototype.setXRight = function(right) { - this.xRight_ = right; -}; - -/** - * @param {boolean} down The tile index increases from top to bottom. - */ -ol.layer.TileLayer.prototype.setYDown = function(down) { - this.yDown_ = down; -}; - -/** - * Get layer extent. Return null if the layer has no extent - * and no projection. - * @return {ol.UnreferencedBounds} - */ -ol.layer.TileLayer.prototype.getExtent = function() { - if (!goog.isNull(this.extent_)) { - return this.extent_; - } - if (!goog.isNull(this.projection_)) { - return this.projection_.getExtent(); - } - return null; -}; - -/** - * Get tile size. - * @return {Array.} - */ -ol.layer.TileLayer.prototype.getTileSize = function() { - return [this.tileWidth_, this.tileHeight_]; -}; - -/** - * Get tile origin. - * @return {Array.} - */ -ol.layer.TileLayer.prototype.getTileOrigin = function() { - if (goog.isDef(this.tileOriginX_) && - goog.isDef(this.tileOriginY_)) { - return [this.tileOriginX_, this.tileOriginY_]; - } - var errmsg = 'Cannot calculate tile origin; '; - if (goog.isDef(this.tileOriginCorner_)) { - var extent = this.getExtent(); - if (!goog.isNull(extent)) { - var tileOriginX, tileOriginY; - switch (this.tileOriginCorner_) { - case "tl": - tileOriginX = extent.getMinX(); - tileOriginY = extent.getMaxY(); - break; - case "tr": - tileOriginX = extent.getMaxX(); - tileOriginY = extent.getMaxY(); - break; - case "bl": - tileOriginX = extent.getMinX(); - tileOriginY = extent.getMinY(); - break; - case "br": - tileOriginX = extent.getMaxX(); - tileOriginY = extent.getMinY(); - break; - default: - errmsg += 'tileOriginCorner value is incorrect.'; - ol.error(errmsg); - } - return [tileOriginX, tileOriginY]; - } - errmsg += 'layer has no extent.'; - ol.error(errmsg); - } - errmsg += 'layer has no tileOriginCorner.'; - ol.error(errmsg); - return null; -}; - -/** - * Get max resolution. Return undefined if the layer has no maxResolution, - * and no extent from which maxResolution could be derived. - * @return {number|undefined} - */ -ol.layer.TileLayer.prototype.getMaxResolution = function() { - if (!goog.isDef(this.maxResolution_)) { - var extent = this.getExtent(); - if (!goog.isNull(extent)) { - this.maxResolution_ = Math.max( - (extent.getMaxX() - extent.getMinX()) / this.tileWidth_, - (extent.getMaxY() - extent.getMinY()) / this.tileHeight_); - } - } - return this.maxResolution_; -}; - -/** - * Get the number of the zoom levels. - * @return {number|undefined} - */ -ol.layer.TileLayer.prototype.getNumZoomLevels = function() { - return this.numZoomLevels_; -}; - -/** - * Get layer resolutions. Return null if the layer has no resolutions. - * @return {Array.} - */ -ol.layer.TileLayer.prototype.getResolutions = function() { - if (goog.isNull(this.resolutions_)) { - var maxResolution = this.getMaxResolution(), - numZoomLevels = this.getNumZoomLevels(); - if (goog.isDef(maxResolution) && goog.isDef(numZoomLevels)) { - this.resolutions_ = []; - for (var i = 0; i < numZoomLevels; i++) { - this.resolutions_[i] = maxResolution / Math.pow(2, i); - } - } - } - return this.resolutions_; -}; - -/** - * Set the layer URL. - * @param {string} url - */ -ol.layer.TileLayer.prototype.setUrl = function(url) { - this.url_ = url; -}; - -/** - * Set layer projection. - * @param {ol.Projection} projection - */ -ol.layer.TileLayer.prototype.setProjection = function(projection) { - this.projection_ = projection; -}; - -/** - * Set layer extent. - * @param {ol.Bounds} extent - */ -ol.layer.TileLayer.prototype.setExtent = function(extent) { - this.extent_ = extent; -}; - -/** - * Set tile origin. - * @param {number} tileOriginX - * @param {number} tileOriginY - */ -ol.layer.TileLayer.prototype.setTileOrigin = function(tileOriginX, tileOriginY) { - this.tileOriginX_ = tileOriginX; - this.tileOriginY_ = tileOriginY; -}; - -/** - * Set tile origin corner. - * @param {string} tileOriginCorner - */ -ol.layer.TileLayer.prototype.setTileOriginCorner = function(tileOriginCorner) { - this.tileOriginCorner_ = tileOriginCorner; -}; - -/** - * Set maximum resolution. - * @param {number} maxResolution - */ -ol.layer.TileLayer.prototype.setMaxResolution = function(maxResolution) { - this.maxResolution_ = maxResolution; -}; - -/** - * Set the number of zoom levels. - * @param {number} numZoomLevels - */ -ol.layer.TileLayer.prototype.setNumZoomLevels = function(numZoomLevels) { - this.numZoomLevels_ = numZoomLevels; -}; - -/** - * Set resolutions for the layer. - * @param {Array.} resolutions - */ -ol.layer.TileLayer.prototype.setResolutions = function(resolutions) { - this.resolutions_ = resolutions; -}; - -/** - * Get a tile from the cache, or create a tile and add to - * the cache. - * @param url {string} - * @param bounds {ol.Bounds} - */ -ol.layer.TileLayer.prototype.getTile = function(url, bounds) { - var tile = this.cache_.get(url); - if (!goog.isDef(tile)) { - tile = new this.Tile(url, bounds); - this.cache_.set(tile.getUrl(), tile); - } - return tile; -}; - -/** - * Get a tile from the cache, or create a tile and add to - * the cache. - * @param {number} x - * @param {number} y - * @param {number} z - */ -ol.layer.TileLayer.prototype.getTileForXYZ = function(x, y, z) { - if (!this.validXY(x, y, z)) { - return null; - } - var tileUrl = this.getTileUrl(x, y, z); - var tile = this.cache_.get(tileUrl); - if (!goog.isDef(tile)) { - tile = new this.Tile(tileUrl); - this.cache_.set(tileUrl, tile); - } - return tile; -}; - -/** - * Determine if the tile x/y/z intersects the layer extent. Always - * return true if the layer has no extent. - * @param {number} x - * @param {number} y - * @param {number} z - * @return {boolean} - */ -ol.layer.TileLayer.prototype.validXY = function(x, y, z) { - var extent = this.getExtent(); - if (goog.isNull(extent)) { - return true; - } - var extentMinX = extent.getMinX(), - extentMinY = extent.getMinY(), - extentMaxX = extent.getMaxX(), - extentMaxY = extent.getMaxY(); - var tileOrigin = this.getTileOrigin(), - tileOriginX = tileOrigin[0], - tileOriginY = tileOrigin[1]; - var resolution = this.getResolutions()[z]; - var tileWidth = this.tileWidth_ * resolution, - tileHeight = this.tileHeight_ * resolution; - var minX, maxX; - if (this.xRight_) { - minX = Math.floor((extentMinX - tileOriginX) / tileWidth); - maxX = Math.ceil((extentMaxX - tileOriginX) / tileWidth) - 1; - } else { - minX = Math.floor((tileOriginX - extentMaxX) / tileWidth); - maxX = Math.ceil((tileOriginX - extentMinX) / tileWidth) - 1; - } - var minY, maxY; - if (this.yDown_) { - minY = Math.floor((tileOriginY - extentMaxY) / tileHeight); - maxY = Math.ceil((tileOriginY - extentMinY) / tileHeight) - 1; - } else { - minY = Math.floor((extentMinY - tileOriginY) / tileHeight); - maxY = Math.ceil((extentMaxY - tileOriginY) / tileHeight) - 1; - } - return x >= minX && x <= maxX && y >= minY && y <= maxY; -}; - -/** - * Get data from the layer. This is the layer's main API function. - * @param {ol.Bounds} bounds - * @param {number} resolution - */ -ol.layer.TileLayer.prototype.getData = function(bounds, resolution) { - var me = this, - zoomAndRes = me.getZoomAndRes(resolution), - zoom = zoomAndRes[0]; - resolution = zoomAndRes[1]; - - // define some values used for the actual tiling - var boundsMinX = bounds.getMinX(), - boundsMaxX = bounds.getMaxX(), - boundsMinY = bounds.getMinY(), - boundsMaxY = bounds.getMaxY(), - tileWidth = me.tileWidth_, - tileHeight = me.tileHeight_, - tileOrigin = me.getTileOrigin(), - tileOriginX = tileOrigin[0], - tileOriginY = tileOrigin[1], - tileWidthGeo = tileWidth * resolution, - tileHeightGeo = tileHeight * resolution; - - // make sure we don't create tiles outside the layer extent - var extent = this.getExtent(); - if (extent) { - boundsMinX = Math.max(boundsMinX, extent.getMinX()); - boundsMaxX = Math.min(boundsMaxX, extent.getMaxX()); - boundsMinY = Math.max(boundsMinY, extent.getMinY()); - boundsMaxY = Math.min(boundsMaxY, extent.getMaxY()); - } - - var offsetX = Math.floor( - (boundsMinX - tileOriginX) / tileWidthGeo), - offsetY = Math.floor( - (tileOriginY - boundsMaxY) / tileHeightGeo), - gridLeft = tileOriginX + tileWidthGeo * offsetX, - gridTop = tileOriginY - tileHeightGeo * offsetY; - - // now tile - var tiles = [], - tile, - url, - tileBottom, tileRight, tileBounds; - for (var y=0, tileTop=gridTop; tileTop > boundsMinY; - ++y, tileTop-=tileHeightGeo) { - tiles[y] = []; - tileBottom = tileTop - tileHeightGeo; - for (var x=0, tileLeft=gridLeft; tileLeft < boundsMaxX; - ++x, tileLeft+=tileWidthGeo) { - tileRight = tileLeft + tileWidthGeo; - tileBounds = new ol.Bounds(tileLeft, tileBottom, - tileRight, tileTop, this.projection_); - url = this.getTileUrl(offsetX + x, offsetY + y, zoom); - tile = this.getTile(url, tileBounds); - tiles[y][x] = tile; - } - } - - return new ol.TileSet(tiles, tileWidth, tileHeight, resolution); -}; - -/** - * Get the zoom level (z) and layer resolution for the given resolution. - * @param {number} resolution - * @return {Array.} - */ -ol.layer.TileLayer.prototype.getZoomAndRes = function(resolution) { - var delta = Number.POSITIVE_INFINITY, - currentDelta, - resolutions = this.getResolutions(), - zoom; - for (var i=resolutions.length-1; i>=0; --i) { - currentDelta = Math.abs(resolutions[i] - resolution); - if (currentDelta > delta) { - break; - } - delta = currentDelta; - } - zoom = i + 1; - return [zoom, resolutions[zoom]]; -}; diff --git a/src/ol/layer/XYZ.js b/src/ol/layer/XYZ.js deleted file mode 100644 index 4a1c16fe86..0000000000 --- a/src/ol/layer/XYZ.js +++ /dev/null @@ -1,35 +0,0 @@ -goog.provide('ol.layer.XYZ'); - -goog.require('ol.layer.TileLayer'); -goog.require('ol.Projection'); -goog.require('ol.TileSet'); - -/** - * Class for XYZ layers. - * - * @export - * @constructor - * @extends {ol.layer.TileLayer} - * @param {string} url URL template. E.g. - * http://a.tile.openstreetmap.org/{z}/{x}/{y}.png. - */ -ol.layer.XYZ = function(url) { - - goog.base(this); - - this.setUrl(url); - this.setProjection(new ol.Projection("EPSG:3857")); - this.setNumZoomLevels(22); -}; - -goog.inherits(ol.layer.XYZ, ol.layer.TileLayer); - -/** - * @inheritDoc - */ -ol.layer.XYZ.prototype.getTileUrl = function(x, y, z) { - var base = this.getUrl(); - return base.replace('{x}', x + '') - .replace('{y}', y + '') - .replace('{z}', z + ''); -}; diff --git a/src/ol/renderer/WebGL.js b/src/ol/renderer/WebGL.js deleted file mode 100644 index ff86f4584e..0000000000 --- a/src/ol/renderer/WebGL.js +++ /dev/null @@ -1,273 +0,0 @@ -/** - * @fileoverview WebGL based MapRenderer drawing all the supplied layers in OpenGL - */ - -goog.provide('ol.renderer.WebGL'); - -goog.require('ol.renderer.MapRenderer'); -goog.require('ol.layer.Layer'); -goog.require('ol.Loc'); - -goog.require('goog.array'); -goog.require('goog.asserts'); -goog.require('goog.vec.Mat4'); -goog.require('goog.webgl'); - -/** - * Initialization of the native WebGL renderer (canvas, context, layers) - * @constructor - * @param {!Element} container - * @extends {ol.renderer.MapRenderer} - */ -ol.renderer.WebGL = function(container) { - - /** - * @private - * @type {!Element} - */ - this.canvas_ = goog.dom.createDom('canvas', 'ol-renderer-webgl-canvas'); // Suppose to have: style: 'width:100%;height:100%;' - - /** - * @private - * @type {WebGLRenderingContext} - */ - this.gl_ = (this.canvas_.getContext('experimental-webgl', { - 'alpha': false, - 'depth': false, - 'antialias': true, - 'stencil': false, - 'preserveDrawingBuffer': false - })); - goog.asserts.assert(!goog.isNull(this.gl_), "The WebGL is not supported on your browser. Check http://get.webgl.org/"); - - goog.dom.append(container, this.canvas_); - - goog.base(this, container); - - /** - * @private - * @type {Object.} - */ - this.textureCache_ = {}; - - var gl = this.gl_; - - var clearColor = [0, 0, 0]; // hardcoded background color - gl.clearColor(clearColor[0], clearColor[1], clearColor[2], 1); - gl.disable(goog.webgl.DEPTH_TEST); - gl.disable(goog.webgl.SCISSOR_TEST); - gl.disable(goog.webgl.CULL_FACE); - - var fragmentShader = gl.createShader(goog.webgl.FRAGMENT_SHADER); - gl.shaderSource(fragmentShader, [ - 'precision mediump float;', - '', - 'uniform sampler2D uTexture;', - '', - 'varying vec2 vTexCoord;', - '', - 'void main(void) {', - ' gl_FragColor = vec4(vec3(texture2D(uTexture, vTexCoord)), 1.);', - '}' - ].join('\n')); - gl.compileShader(fragmentShader); - if (!gl.getShaderParameter(fragmentShader, goog.webgl.COMPILE_STATUS)) { - window.console.log(gl.getShaderInfoLog(fragmentShader)); - goog.asserts.assert(gl.getShaderParameter(fragmentShader, goog.webgl.COMPILE_STATUS)); - } - - var vertexShader = gl.createShader(goog.webgl.VERTEX_SHADER); - gl.shaderSource(vertexShader, [ - 'attribute vec2 aPosition;', - 'attribute vec2 aTexCoord;', - '', - 'uniform mat4 uMVPMatrix;', - '', - 'varying vec2 vTexCoord;', - '', - 'void main(void) {', - ' gl_Position = uMVPMatrix * vec4(aPosition, 0.0, 1.0);', - ' vTexCoord = aTexCoord;', - '}' - ].join('\n')); - if (!gl.getShaderParameter(vertexShader, goog.webgl.COMPILE_STATUS)) { - window.console.log(gl.getShaderInfoLog(vertexShader)); - goog.asserts.assert(gl.getShaderParameter(vertexShader, goog.webgl.COMPILE_STATUS)); - } - - var program = gl.createProgram(); - gl.attachShader(program, fragmentShader); - gl.attachShader(program, vertexShader); - gl.linkProgram(program); - if (!gl.getProgramParameter(program, goog.webgl.LINK_STATUS)) { - window.console.log(gl.getProgramInfoLog(program)); - goog.asserts.assert(gl.getProgramParameter(program, goog.webgl.LINK_STATUS)); - } - - this.mvpMatrixLocation_ = gl.getUniformLocation(program, 'uMVPMatrix'); - this.textureLocation_ = gl.getUniformLocation(program, 'uTexture'); - - var texCoordBuffer = gl.createBuffer(); - gl.bindBuffer(goog.webgl.ARRAY_BUFFER, texCoordBuffer); - gl.bufferData(goog.webgl.ARRAY_BUFFER, new Float32Array([0, 1, 1, 1, 0, 0, 1, 0]), goog.webgl.STATIC_DRAW); - var texCoordLocation = gl.getAttributeLocation(program, 'aTexCoord'); - gl.enableVertexAttribArray(texCoordLocation); - gl.vertexAttribPointer(texCoordLocation, 2, goog.webgl.FLOAT, false, 0, 0); - gl.bindBuffer(goog.webgl.ARRAY_BUFFER, null); - - this.positionLocation_ = gl.getAttributeLocation(program, 'aPosition'); - gl.enableVertexAttribArray(this.positionLocation_); - this.positionBuffer_ = gl.createBuffer(); - -}; - -goog.inherits(ol.renderer.WebGL, ol.renderer.MapRenderer); - - -/** - * Determine if this renderer type is supported in this environment. - * A static method. - * @returns {boolean} This renderer is supported. - */ -ol.renderer.WebGL.isSupported = function() { - return !goog.isNull( goog.dom.createDom('canvas').getContext('experimental-webgl') ); -}; - - -/** - * @param {ol.Tile} tile Tile. - * @protected - */ -ol.renderer.WebGL.prototype.bindTexture = function(tile) { - var gl = this.gl_; - var url = tile.getUrl(); - if (url in this.textureCache_) { - gl.bindTexture(gl.TEXTURE_2D, this.textureCache_[url]); - } else { - var texture = gl.createTexture(); - gl.bindTexture(goog.webgl.TEXTURE_2D, texture); - gl.texImage2D(goog.webgl.TEXTURE_2D, 0, goog.webgl.RGBA, goog.webgl.RGBA, goog.webgl.UNSIGNED_BYTE, tile.getImg()); - gl.texParameteri(goog.webgl.TEXTURE_2D, goog.webgl.TEXTURE_MAG_FILTER, goog.webgl.LINEAR); - gl.texParameteri(goog.webgl.TEXTURE_2D, goog.webgl.TEXTURE_MIN_FILTER, goog.webgl.LINEAR); - this.textureCache_[url] = texture; - } -}; - - -/** - * @param {ol.Tile} tile Tile. - * @protected - */ -ol.renderer.WebGL.prototype.handleTileLoad = function(tile) { - this.redraw(); -}; - - -/** - * @param {ol.Tile} tile Tile. - * @protected - */ -ol.renderer.WebGL.prototype.handleTileDestroy = function(tile) { - var gl = this.gl_; - var url = tile.getUrl(); - if (url in this.textureCache_) { - gl.deleteTexture(this.textureCache_[url]); - delete this.textureCache_[url]; - } -}; - - -/** - * @inheritDoc - */ -ol.renderer.WebGL.prototype.draw = function(layers, center, resolution, animate) { - - var gl = this.gl_; - - var width = this.canvas_.width; - var height = this.canvas_.height; - - var bounds = new ol.Bounds( - center.getX() - width * resolution / 2, - center.getY() - height * resolution / 2, - center.getX() + width * resolution / 2, - center.getY() + height * resolution / 2, - center.getProjection()); - - /** @type {goog.vec.Mat4.Type} */ - var cameraMatrix; - goog.vec.Mat4.makeIdentity(cameraMatrix); - goog.vec.Mat4.scale(cameraMatrix, resolution, resolution, 1); - goog.vec.Mat4.translate(cameraMatrix, -center.getX(), -center.getY(), 0); - - /** @type {goog.vec.Mat4.Type} */ - var positionToViewportMatrix; - goog.vec.Mat4.makeIdentity(positionToViewportMatrix); - goog.vec.Mat4.scale(positionToViewportMatrix, 1 / width, 1 / height, 1); - goog.vec.Mat4.multMat(positionToViewportMatrix, cameraMatrix, positionToViewportMatrix); - - /** @type {goog.vec.Mat4.Type} */ - var viewportToPositionMatrix; - var inverted = goog.vec.Mat4.invert(positionToViewportMatrix, viewportToPositionMatrix); - goog.asserts.assert(inverted); - - /** @type {goog.vec.Mat4.Type} */ - var targetPixelToPositionMatrix; - goog.vec.Mat4.makeIdentity(targetPixelToPositionMatrix); - goog.vec.Mat4.translate(targetPixelToPositionMatrix, -1, 1, 0); - goog.vec.Mat4.scale(targetPixelToPositionMatrix, 2 / width, -2 / height, 1); - goog.vec.Mat4.multMat(viewportToPositionMatrix, targetPixelToPositionMatrix, targetPixelToPositionMatrix); - - gl.clear(goog.webgl.COLOR_BUFFER_BIT); - gl.bindBuffer(goog.webgl.ARRAY_BUFFER, this.positionBuffer_); - gl.uniform1i(this.textureLocation_, 0); - gl.uniformMatrix4fv(this.positionLocation_, false, positionToViewportMatrix); - - goog.array.forEach(layers, function(layer) { - if (!(layer instanceof ol.layer.TileLayer)) { - return; - } - var tileLayer = /** @type {ol.layer.TileLayer} */ (layer); - var tileSet = layer.getData(bounds, resolution); - var tiles = tileSet.getTiles(); - var i, j, row, tile, tileBounds, positions, texture; - for (i = 0; i < tiles.length; ++i) { - row = tiles[i]; - for (j = 0; j < row.length; ++j) { - tile = row[j]; - if (!tile.isLoaded()) { - if (!tile.isLoading()) { - tile.register('load', this.handleTileLoad, this); - tile.register('destroy', this.handleTileDestroy, this); - tile.load(); - } - continue; - } - tileBounds = tile.getBounds(); - positions = [ - tileBounds.getMinX(), tileBounds.getMinY(), - tileBounds.getMaxX(), tileBounds.getMinY(), - tileBounds.getMinX(), tileBounds.getMaxY(), - tileBounds.getMaxX(), tileBounds.getMaxY() - ]; - gl.bufferData(goog.webgl.ARRAY_BUFFER, new Float32Array(positions), goog.webgl.DYNAMIC_DRAW); - gl.vertexAttribPointer(this.positionLocation_, 2, goog.webgl.FLOAT, false, 0, 0); - this.bindTexture(tile); - gl.drawArrays(goog.webgl.TRIANGLES, 0, 4); - } - } - }, this); - - this.renderedLayers_ = layers; - this.renderedCenter_ = center; - this.renderedResolution_ = resolution; - this.renderedAnimate_ = animate; - -}; - - -/** - */ -ol.renderer.WebGL.prototype.redraw = function() { - this.draw(this.renderedLayers_, this.renderedCenter_, this.renderedResolution_, this.renderedAnimate_); -}; From 65b7504c9f665f0057a21a022b632b4e5d93c790 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Sun, 22 Jul 2012 01:37:58 +0200 Subject: [PATCH 285/562] Clean up directory structure --- src/ol/{ => base}/array.js | 0 src/ol/{ => base}/array_test.js | 0 src/ol/{ => base}/color.js | 0 src/ol/{ => base}/coordinate.js | 0 src/ol/{ => base}/createmap.js | 0 src/ol/{ => base}/extent.js | 0 src/ol/{ => base}/extent_test.js | 0 src/ol/{ => base}/layer.js | 0 src/ol/{ => base}/map.js | 0 src/ol/{ => base}/mapbrowserevent.js | 0 src/ol/{ => base}/mapevent.js | 0 src/ol/{ => base}/object.js | 0 src/ol/{ => base}/object_test.js | 0 src/ol/{ => base}/pixelbounds.js | 0 src/ol/{ => base}/projection.js | 0 src/ol/{ => base}/projection_test.js | 0 src/ol/{ => base}/rectangle.js | 0 src/ol/{ => base}/rectangle_test.js | 0 src/ol/{ => base}/size.js | 0 src/ol/{ => base}/store.js | 0 src/ol/{ => base}/transformfunction.js | 0 src/ol/{ => layerrenderer}/layerrenderer.js | 0 src/ol/{ => tile}/tile.js | 0 src/ol/{ => tile}/tilebounds.js | 0 src/ol/{ => tile}/tilebounds_test.js | 0 src/ol/{ => tile}/tilecoord.js | 0 src/ol/{ => tile}/tilecoord_test.js | 0 src/ol/{tilegrid => tile}/tilegrid.js | 0 src/ol/{tilegrid => tile}/tilegrid_test.js | 0 src/ol/{tilegrid/xyz.js => tile/tilegridxyz.js} | 0 src/ol/{tilelayer => tile}/tilelayer.js | 0 .../openstreetmap.js => tile/tilelayeropenstreetmap.js} | 0 src/ol/{tilelayer/xyz.js => tile/tilelayerxyz.js} | 0 src/ol/{tilestore => tile}/tilestore.js | 0 src/ol/{tilestore => tile}/tilestore_test.js | 0 src/ol/{tilestore/xyz.js => tile/tilestorexyz.js} | 0 src/ol/{ => tile}/tileurlfunction.js | 0 src/ol/{ => tile}/tileurlfunction_test.js | 0 38 files changed, 0 insertions(+), 0 deletions(-) rename src/ol/{ => base}/array.js (100%) rename src/ol/{ => base}/array_test.js (100%) rename src/ol/{ => base}/color.js (100%) rename src/ol/{ => base}/coordinate.js (100%) rename src/ol/{ => base}/createmap.js (100%) rename src/ol/{ => base}/extent.js (100%) rename src/ol/{ => base}/extent_test.js (100%) rename src/ol/{ => base}/layer.js (100%) rename src/ol/{ => base}/map.js (100%) rename src/ol/{ => base}/mapbrowserevent.js (100%) rename src/ol/{ => base}/mapevent.js (100%) rename src/ol/{ => base}/object.js (100%) rename src/ol/{ => base}/object_test.js (100%) rename src/ol/{ => base}/pixelbounds.js (100%) rename src/ol/{ => base}/projection.js (100%) rename src/ol/{ => base}/projection_test.js (100%) rename src/ol/{ => base}/rectangle.js (100%) rename src/ol/{ => base}/rectangle_test.js (100%) rename src/ol/{ => base}/size.js (100%) rename src/ol/{ => base}/store.js (100%) rename src/ol/{ => base}/transformfunction.js (100%) rename src/ol/{ => layerrenderer}/layerrenderer.js (100%) rename src/ol/{ => tile}/tile.js (100%) rename src/ol/{ => tile}/tilebounds.js (100%) rename src/ol/{ => tile}/tilebounds_test.js (100%) rename src/ol/{ => tile}/tilecoord.js (100%) rename src/ol/{ => tile}/tilecoord_test.js (100%) rename src/ol/{tilegrid => tile}/tilegrid.js (100%) rename src/ol/{tilegrid => tile}/tilegrid_test.js (100%) rename src/ol/{tilegrid/xyz.js => tile/tilegridxyz.js} (100%) rename src/ol/{tilelayer => tile}/tilelayer.js (100%) rename src/ol/{tilelayer/openstreetmap.js => tile/tilelayeropenstreetmap.js} (100%) rename src/ol/{tilelayer/xyz.js => tile/tilelayerxyz.js} (100%) rename src/ol/{tilestore => tile}/tilestore.js (100%) rename src/ol/{tilestore => tile}/tilestore_test.js (100%) rename src/ol/{tilestore/xyz.js => tile/tilestorexyz.js} (100%) rename src/ol/{ => tile}/tileurlfunction.js (100%) rename src/ol/{ => tile}/tileurlfunction_test.js (100%) diff --git a/src/ol/array.js b/src/ol/base/array.js similarity index 100% rename from src/ol/array.js rename to src/ol/base/array.js diff --git a/src/ol/array_test.js b/src/ol/base/array_test.js similarity index 100% rename from src/ol/array_test.js rename to src/ol/base/array_test.js diff --git a/src/ol/color.js b/src/ol/base/color.js similarity index 100% rename from src/ol/color.js rename to src/ol/base/color.js diff --git a/src/ol/coordinate.js b/src/ol/base/coordinate.js similarity index 100% rename from src/ol/coordinate.js rename to src/ol/base/coordinate.js diff --git a/src/ol/createmap.js b/src/ol/base/createmap.js similarity index 100% rename from src/ol/createmap.js rename to src/ol/base/createmap.js diff --git a/src/ol/extent.js b/src/ol/base/extent.js similarity index 100% rename from src/ol/extent.js rename to src/ol/base/extent.js diff --git a/src/ol/extent_test.js b/src/ol/base/extent_test.js similarity index 100% rename from src/ol/extent_test.js rename to src/ol/base/extent_test.js diff --git a/src/ol/layer.js b/src/ol/base/layer.js similarity index 100% rename from src/ol/layer.js rename to src/ol/base/layer.js diff --git a/src/ol/map.js b/src/ol/base/map.js similarity index 100% rename from src/ol/map.js rename to src/ol/base/map.js diff --git a/src/ol/mapbrowserevent.js b/src/ol/base/mapbrowserevent.js similarity index 100% rename from src/ol/mapbrowserevent.js rename to src/ol/base/mapbrowserevent.js diff --git a/src/ol/mapevent.js b/src/ol/base/mapevent.js similarity index 100% rename from src/ol/mapevent.js rename to src/ol/base/mapevent.js diff --git a/src/ol/object.js b/src/ol/base/object.js similarity index 100% rename from src/ol/object.js rename to src/ol/base/object.js diff --git a/src/ol/object_test.js b/src/ol/base/object_test.js similarity index 100% rename from src/ol/object_test.js rename to src/ol/base/object_test.js diff --git a/src/ol/pixelbounds.js b/src/ol/base/pixelbounds.js similarity index 100% rename from src/ol/pixelbounds.js rename to src/ol/base/pixelbounds.js diff --git a/src/ol/projection.js b/src/ol/base/projection.js similarity index 100% rename from src/ol/projection.js rename to src/ol/base/projection.js diff --git a/src/ol/projection_test.js b/src/ol/base/projection_test.js similarity index 100% rename from src/ol/projection_test.js rename to src/ol/base/projection_test.js diff --git a/src/ol/rectangle.js b/src/ol/base/rectangle.js similarity index 100% rename from src/ol/rectangle.js rename to src/ol/base/rectangle.js diff --git a/src/ol/rectangle_test.js b/src/ol/base/rectangle_test.js similarity index 100% rename from src/ol/rectangle_test.js rename to src/ol/base/rectangle_test.js diff --git a/src/ol/size.js b/src/ol/base/size.js similarity index 100% rename from src/ol/size.js rename to src/ol/base/size.js diff --git a/src/ol/store.js b/src/ol/base/store.js similarity index 100% rename from src/ol/store.js rename to src/ol/base/store.js diff --git a/src/ol/transformfunction.js b/src/ol/base/transformfunction.js similarity index 100% rename from src/ol/transformfunction.js rename to src/ol/base/transformfunction.js diff --git a/src/ol/layerrenderer.js b/src/ol/layerrenderer/layerrenderer.js similarity index 100% rename from src/ol/layerrenderer.js rename to src/ol/layerrenderer/layerrenderer.js diff --git a/src/ol/tile.js b/src/ol/tile/tile.js similarity index 100% rename from src/ol/tile.js rename to src/ol/tile/tile.js diff --git a/src/ol/tilebounds.js b/src/ol/tile/tilebounds.js similarity index 100% rename from src/ol/tilebounds.js rename to src/ol/tile/tilebounds.js diff --git a/src/ol/tilebounds_test.js b/src/ol/tile/tilebounds_test.js similarity index 100% rename from src/ol/tilebounds_test.js rename to src/ol/tile/tilebounds_test.js diff --git a/src/ol/tilecoord.js b/src/ol/tile/tilecoord.js similarity index 100% rename from src/ol/tilecoord.js rename to src/ol/tile/tilecoord.js diff --git a/src/ol/tilecoord_test.js b/src/ol/tile/tilecoord_test.js similarity index 100% rename from src/ol/tilecoord_test.js rename to src/ol/tile/tilecoord_test.js diff --git a/src/ol/tilegrid/tilegrid.js b/src/ol/tile/tilegrid.js similarity index 100% rename from src/ol/tilegrid/tilegrid.js rename to src/ol/tile/tilegrid.js diff --git a/src/ol/tilegrid/tilegrid_test.js b/src/ol/tile/tilegrid_test.js similarity index 100% rename from src/ol/tilegrid/tilegrid_test.js rename to src/ol/tile/tilegrid_test.js diff --git a/src/ol/tilegrid/xyz.js b/src/ol/tile/tilegridxyz.js similarity index 100% rename from src/ol/tilegrid/xyz.js rename to src/ol/tile/tilegridxyz.js diff --git a/src/ol/tilelayer/tilelayer.js b/src/ol/tile/tilelayer.js similarity index 100% rename from src/ol/tilelayer/tilelayer.js rename to src/ol/tile/tilelayer.js diff --git a/src/ol/tilelayer/openstreetmap.js b/src/ol/tile/tilelayeropenstreetmap.js similarity index 100% rename from src/ol/tilelayer/openstreetmap.js rename to src/ol/tile/tilelayeropenstreetmap.js diff --git a/src/ol/tilelayer/xyz.js b/src/ol/tile/tilelayerxyz.js similarity index 100% rename from src/ol/tilelayer/xyz.js rename to src/ol/tile/tilelayerxyz.js diff --git a/src/ol/tilestore/tilestore.js b/src/ol/tile/tilestore.js similarity index 100% rename from src/ol/tilestore/tilestore.js rename to src/ol/tile/tilestore.js diff --git a/src/ol/tilestore/tilestore_test.js b/src/ol/tile/tilestore_test.js similarity index 100% rename from src/ol/tilestore/tilestore_test.js rename to src/ol/tile/tilestore_test.js diff --git a/src/ol/tilestore/xyz.js b/src/ol/tile/tilestorexyz.js similarity index 100% rename from src/ol/tilestore/xyz.js rename to src/ol/tile/tilestorexyz.js diff --git a/src/ol/tileurlfunction.js b/src/ol/tile/tileurlfunction.js similarity index 100% rename from src/ol/tileurlfunction.js rename to src/ol/tile/tileurlfunction.js diff --git a/src/ol/tileurlfunction_test.js b/src/ol/tile/tileurlfunction_test.js similarity index 100% rename from src/ol/tileurlfunction_test.js rename to src/ol/tile/tileurlfunction_test.js From 21e3f2fe8309e0a0284e1d5c7e52e49ab6d6b4bf Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Sun, 22 Jul 2012 02:05:48 +0200 Subject: [PATCH 286/562] Promote opacity/visibility changes into base class --- src/ol/webgl/layerrenderer.js | 24 ++++++++++++++++++++++++ src/ol/webgl/tilelayerrenderer.js | 24 ------------------------ 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/src/ol/webgl/layerrenderer.js b/src/ol/webgl/layerrenderer.js index 86b67feadb..6e0a3bdbb1 100644 --- a/src/ol/webgl/layerrenderer.js +++ b/src/ol/webgl/layerrenderer.js @@ -18,6 +18,14 @@ ol.webgl.LayerRenderer = function(map, layer) { goog.inherits(ol.webgl.LayerRenderer, ol.LayerRenderer); +/** + * @protected + */ +ol.webgl.LayerRenderer.prototype.dispatchChangeEvent = function() { + this.dispatchEvent(goog.events.EventType.CHANGE); +}; + + /** * @return {WebGLTexture} Texture. */ @@ -48,6 +56,22 @@ ol.webgl.LayerRenderer.prototype.getMap = function() { ol.webgl.LayerRenderer.prototype.getMatrix = goog.abstractMethod; +/** + * @inheritDoc + */ +ol.webgl.LayerRenderer.prototype.handleLayerOpacityChange = function() { + this.dispatchChangeEvent(); +}; + + +/** + * @inheritDoc + */ +ol.webgl.LayerRenderer.prototype.handleLayerVisibleChange = function() { + this.dispatchChangeEvent(); +}; + + /** */ ol.webgl.LayerRenderer.prototype.handleWebGLContextLost = goog.nullFunction; diff --git a/src/ol/webgl/tilelayerrenderer.js b/src/ol/webgl/tilelayerrenderer.js index 902bb57cc6..379a5e2347 100644 --- a/src/ol/webgl/tilelayerrenderer.js +++ b/src/ol/webgl/tilelayerrenderer.js @@ -212,14 +212,6 @@ ol.webgl.TileLayerRenderer.prototype.getTexture = function() { }; -/** - * @protected - */ -ol.webgl.TileLayerRenderer.prototype.dispatchChangeEvent = function() { - this.dispatchEvent(goog.events.EventType.CHANGE); -}; - - /** * @protected */ @@ -386,19 +378,3 @@ ol.webgl.TileLayerRenderer.prototype.render = function() { 1); }; - - -/** - * @inheritDoc - */ -ol.webgl.TileLayerRenderer.prototype.handleLayerOpacityChange = function() { - this.dispatchChangeEvent(); -}; - - -/** - * @inheritDoc - */ -ol.webgl.TileLayerRenderer.prototype.handleLayerVisibleChange = function() { - this.dispatchChangeEvent(); -}; From f280faff67499ebf9822718d708502442c154b06 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Sun, 22 Jul 2012 02:06:31 +0200 Subject: [PATCH 287/562] Add hue and saturation controls, thanks @evanw --- src/ol/base/layer.js | 36 +++++++++++++++++++++++++++ src/ol/layerrenderer/layerrenderer.js | 20 +++++++++++++++ src/ol/webgl/layerrenderer.js | 16 ++++++++++++ src/ol/webgl/map.js | 36 ++++++++++++++++++++++++--- 4 files changed, 105 insertions(+), 3 deletions(-) diff --git a/src/ol/base/layer.js b/src/ol/base/layer.js index d684502eea..ef9de59107 100644 --- a/src/ol/base/layer.js +++ b/src/ol/base/layer.js @@ -9,7 +9,9 @@ goog.require('ol.Store'); * @enum {string} */ ol.LayerProperty = { + HUE: 'hue', OPACITY: 'opacity', + SATURATION: 'saturation', VISIBLE: 'visible' }; @@ -32,7 +34,9 @@ ol.Layer = function(store, opt_values) { this.store_ = store; this.setVisible(true); + this.setHue(0); this.setOpacity(1); + this.setSaturation(0); if (goog.isDef(opt_values)) { this.setValues(opt_values); @@ -42,6 +46,14 @@ ol.Layer = function(store, opt_values) { goog.inherits(ol.Layer, ol.Object); +/** + * @return {number} Hue. + */ +ol.Layer.prototype.getHue = function() { + return /** @type {number} */ this.get(ol.LayerProperty.HUE); +}; + + /** * @return {number} Opacity. */ @@ -51,6 +63,14 @@ ol.Layer.prototype.getOpacity = function() { }; +/** + * @return {number} Saturation. + */ +ol.Layer.prototype.getSaturation = function() { + return /** @type {number} */ this.get(ol.LayerProperty.SATURATION); +}; + + /** * @return {ol.Store} Store. */ @@ -68,6 +88,14 @@ ol.Layer.prototype.getVisible = function() { }; +/** + * @param {number} hue Hue. + */ +ol.Layer.prototype.setHue = function(hue) { + this.set(ol.LayerProperty.HUE, hue); +}; + + /** * @param {number} opacity Opacity. */ @@ -76,6 +104,14 @@ ol.Layer.prototype.setOpacity = function(opacity) { }; +/** + * @param {number} saturation Saturation. + */ +ol.Layer.prototype.setSaturation = function(saturation) { + this.set(ol.LayerProperty.SATURATION, saturation); +}; + + /** * @param {boolean} visible Visible. */ diff --git a/src/ol/layerrenderer/layerrenderer.js b/src/ol/layerrenderer/layerrenderer.js index a7cc644099..74b6d85929 100644 --- a/src/ol/layerrenderer/layerrenderer.js +++ b/src/ol/layerrenderer/layerrenderer.js @@ -29,10 +29,18 @@ ol.LayerRenderer = function(map, layer) { */ this.layer_ = layer; + goog.events.listen(this.layer_, + ol.Object.getChangedEventType(ol.LayerProperty.HUE), + this.handleLayerHueChange, false, this); + goog.events.listen(this.layer_, ol.Object.getChangedEventType(ol.LayerProperty.OPACITY), this.handleLayerOpacityChange, false, this); + goog.events.listen(this.layer_, + ol.Object.getChangedEventType(ol.LayerProperty.SATURATION), + this.handleLayerSaturationChange, false, this); + goog.events.listen(this.layer_, ol.Object.getChangedEventType(ol.LayerProperty.VISIBLE), this.handleLayerVisibleChange, false, this); @@ -57,12 +65,24 @@ ol.LayerRenderer.prototype.getMap = function() { }; +/** + * @protected + */ +ol.LayerRenderer.prototype.handleLayerHueChange = goog.nullFunction; + + /** * @protected */ ol.LayerRenderer.prototype.handleLayerOpacityChange = goog.nullFunction; +/** + * @protected + */ +ol.LayerRenderer.prototype.handleLayerSaturationChange = goog.nullFunction; + + /** * @protected */ diff --git a/src/ol/webgl/layerrenderer.js b/src/ol/webgl/layerrenderer.js index 6e0a3bdbb1..91eb3e45b0 100644 --- a/src/ol/webgl/layerrenderer.js +++ b/src/ol/webgl/layerrenderer.js @@ -56,6 +56,14 @@ ol.webgl.LayerRenderer.prototype.getMap = function() { ol.webgl.LayerRenderer.prototype.getMatrix = goog.abstractMethod; +/** + * @inheritDoc + */ +ol.webgl.LayerRenderer.prototype.handleLayerHueChange = function() { + this.dispatchChangeEvent(); +}; + + /** * @inheritDoc */ @@ -64,6 +72,14 @@ ol.webgl.LayerRenderer.prototype.handleLayerOpacityChange = function() { }; +/** + * @inheritDoc + */ +ol.webgl.LayerRenderer.prototype.handleLayerSaturationChange = function() { + this.dispatchChangeEvent(); +}; + + /** * @inheritDoc */ diff --git a/src/ol/webgl/map.js b/src/ol/webgl/map.js index 0d2ac8292e..77ac1dee4c 100644 --- a/src/ol/webgl/map.js +++ b/src/ol/webgl/map.js @@ -34,22 +34,46 @@ ol.DEBUG_WEBGL = false; /** * @constructor * @extends {ol.webgl.shader.Fragment} + * @see https://github.com/evanw/glfx.js/blob/master/src/filters/adjust/huesaturation.js */ ol.webgl.map.shader.Fragment = function() { goog.base(this, [ 'precision mediump float;', '', 'uniform mat4 uMatrix;', + 'uniform float uHue;', 'uniform float uOpacity;', + 'uniform float uSaturation;', 'uniform sampler2D uTexture;', '', 'varying vec2 vTexCoord;', '', 'void main(void) {', ' vec4 texCoord = uMatrix * vec4(vTexCoord, 0., 1.);', - ' vec4 srcColor = texture2D(uTexture, texCoord.st);', - ' gl_FragColor.rgb = srcColor.rgb;', - ' gl_FragColor.a = srcColor.a * uOpacity;', + ' vec4 color = texture2D(uTexture, texCoord.st);', + '', + ' float angle = uHue * 3.14159265;', + ' float s = sin(angle), c = cos(angle);', + ' vec3 weights = (vec3(2.0 * c, -sqrt(3.0) * s - c, sqrt(3.0) * s - c)', + ' + 1.0) / 3.0;', + ' float len = length(color.rgb);', + ' color.rgb = vec3(', + ' dot(color.rgb, weights.xyz),', + ' dot(color.rgb, weights.zxy),', + ' dot(color.rgb, weights.yzx)', + ' );', + ' ', + ' float average = (color.r + color.g + color.b) / 3.0;', + ' if (uSaturation > 0.0) {', + ' color.rgb += (average - color.rgb)', + ' * (1.0 - 1.0 / (1.001 - uSaturation));', + ' } else if (uSaturation < 0.0) {', + ' color.rgb += (average - color.rgb) * (-uSaturation);', + ' }', + '', + ' color.a = color.a * uOpacity;', + '', + ' gl_FragColor = color;', '}' ].join('\n')); }; @@ -132,8 +156,10 @@ ol.webgl.Map = function(target, opt_values) { * @private * @type {{aPosition: number, * aTexCoord: number, + * uHue: WebGLUniformLocation, * uMatrix: WebGLUniformLocation, * uOpacity: WebGLUniformLocation, + * uSaturation: WebGLUniformLocation, * uTexture: WebGLUniformLocation}|null} */ this.locations_ = null; @@ -458,8 +484,10 @@ ol.webgl.Map.prototype.renderInternal = function() { this.locations_ = { aPosition: gl.getAttribLocation(program, 'aPosition'), aTexCoord: gl.getAttribLocation(program, 'aTexCoord'), + uHue: gl.getUniformLocation(program, 'uHue'), uMatrix: gl.getUniformLocation(program, 'uMatrix'), uOpacity: gl.getUniformLocation(program, 'uOpacity'), + uSaturation: gl.getUniformLocation(program, 'uSaturation'), uTexture: gl.getUniformLocation(program, 'uTexture') }; } @@ -489,7 +517,9 @@ ol.webgl.Map.prototype.renderInternal = function() { this.forEachVisibleLayer(function(layer, layerRenderer) { gl.uniformMatrix4fv( this.locations_.uMatrix, false, layerRenderer.getMatrix()); + gl.uniform1f(this.locations_.uHue, layer.getHue()); gl.uniform1f(this.locations_.uOpacity, layer.getOpacity()); + gl.uniform1f(this.locations_.uSaturation, layer.getSaturation()); gl.bindTexture(goog.webgl.TEXTURE_2D, layerRenderer.getTexture()); gl.drawArrays(goog.webgl.TRIANGLE_STRIP, 0, 4); }, this); From 883089c3d124ae30a78c4ba886b7a2466aa09906 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Sun, 22 Jul 2012 02:07:01 +0200 Subject: [PATCH 288/562] Sort properties --- src/ol/base/layer.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ol/base/layer.js b/src/ol/base/layer.js index ef9de59107..df5999eb2c 100644 --- a/src/ol/base/layer.js +++ b/src/ol/base/layer.js @@ -33,10 +33,10 @@ ol.Layer = function(store, opt_values) { */ this.store_ = store; - this.setVisible(true); this.setHue(0); this.setOpacity(1); this.setSaturation(0); + this.setVisible(true); if (goog.isDef(opt_values)) { this.setValues(opt_values); From ec2ab8265c8ceb9562e6290e25ec54491071e207 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Sun, 22 Jul 2012 02:24:17 +0200 Subject: [PATCH 289/562] Add brightness and contrast controls, thanks @evanw --- src/ol/base/layer.js | 36 +++++++++++++++++++++++++++ src/ol/layerrenderer/layerrenderer.js | 20 +++++++++++++++ src/ol/webgl/layerrenderer.js | 16 ++++++++++++ src/ol/webgl/map.js | 16 ++++++++++++ 4 files changed, 88 insertions(+) diff --git a/src/ol/base/layer.js b/src/ol/base/layer.js index df5999eb2c..163534d612 100644 --- a/src/ol/base/layer.js +++ b/src/ol/base/layer.js @@ -9,6 +9,8 @@ goog.require('ol.Store'); * @enum {string} */ ol.LayerProperty = { + BRIGHTNESS: 'brightness', + CONTRAST: 'contrast', HUE: 'hue', OPACITY: 'opacity', SATURATION: 'saturation', @@ -33,6 +35,8 @@ ol.Layer = function(store, opt_values) { */ this.store_ = store; + this.setBrightness(0); + this.setContrast(0); this.setHue(0); this.setOpacity(1); this.setSaturation(0); @@ -46,6 +50,22 @@ ol.Layer = function(store, opt_values) { goog.inherits(ol.Layer, ol.Object); +/** + * @return {number} Brightness. + */ +ol.Layer.prototype.getBrightness = function() { + return /** @type {number} */ this.get(ol.LayerProperty.BRIGHTNESS); +}; + + +/** + * @return {number} Contrast. + */ +ol.Layer.prototype.getContrast = function() { + return /** @type {number} */ this.get(ol.LayerProperty.CONTRAST); +}; + + /** * @return {number} Hue. */ @@ -88,6 +108,22 @@ ol.Layer.prototype.getVisible = function() { }; +/** + * @param {number} brightness Brightness. + */ +ol.Layer.prototype.setBrightness = function(brightness) { + this.set(ol.LayerProperty.BRIGHTNESS, brightness); +}; + + +/** + * @param {number} contrast Contrast. + */ +ol.Layer.prototype.setContrast = function(contrast) { + this.set(ol.LayerProperty.CONTRAST, contrast); +}; + + /** * @param {number} hue Hue. */ diff --git a/src/ol/layerrenderer/layerrenderer.js b/src/ol/layerrenderer/layerrenderer.js index 74b6d85929..d1320d7a5c 100644 --- a/src/ol/layerrenderer/layerrenderer.js +++ b/src/ol/layerrenderer/layerrenderer.js @@ -29,6 +29,14 @@ ol.LayerRenderer = function(map, layer) { */ this.layer_ = layer; + goog.events.listen(this.layer_, + ol.Object.getChangedEventType(ol.LayerProperty.BRIGHTNESS), + this.handleLayerBrightnessChange, false, this); + + goog.events.listen(this.layer_, + ol.Object.getChangedEventType(ol.LayerProperty.CONTRAST), + this.handleLayerContrastChange, false, this); + goog.events.listen(this.layer_, ol.Object.getChangedEventType(ol.LayerProperty.HUE), this.handleLayerHueChange, false, this); @@ -65,6 +73,18 @@ ol.LayerRenderer.prototype.getMap = function() { }; +/** + * @protected + */ +ol.LayerRenderer.prototype.handleLayerBrightnessChange = goog.nullFunction; + + +/** + * @protected + */ +ol.LayerRenderer.prototype.handleLayerContrastChange = goog.nullFunction; + + /** * @protected */ diff --git a/src/ol/webgl/layerrenderer.js b/src/ol/webgl/layerrenderer.js index 91eb3e45b0..94e2518742 100644 --- a/src/ol/webgl/layerrenderer.js +++ b/src/ol/webgl/layerrenderer.js @@ -56,6 +56,22 @@ ol.webgl.LayerRenderer.prototype.getMap = function() { ol.webgl.LayerRenderer.prototype.getMatrix = goog.abstractMethod; +/** + * @inheritDoc + */ +ol.webgl.LayerRenderer.prototype.handleLayerBrightnessChange = function() { + this.dispatchChangeEvent(); +}; + + +/** + * @inheritDoc + */ +ol.webgl.LayerRenderer.prototype.handleLayerContrastChange = function() { + this.dispatchChangeEvent(); +}; + + /** * @inheritDoc */ diff --git a/src/ol/webgl/map.js b/src/ol/webgl/map.js index 77ac1dee4c..bdff207a7d 100644 --- a/src/ol/webgl/map.js +++ b/src/ol/webgl/map.js @@ -34,6 +34,7 @@ ol.DEBUG_WEBGL = false; /** * @constructor * @extends {ol.webgl.shader.Fragment} + * @see https://github.com/evanw/glfx.js/blob/master/src/filters/adjust/brightnesscontrast.js * @see https://github.com/evanw/glfx.js/blob/master/src/filters/adjust/huesaturation.js */ ol.webgl.map.shader.Fragment = function() { @@ -41,6 +42,8 @@ ol.webgl.map.shader.Fragment = function() { 'precision mediump float;', '', 'uniform mat4 uMatrix;', + 'uniform float uBrightness;', + 'uniform float uContrast;', 'uniform float uHue;', 'uniform float uOpacity;', 'uniform float uSaturation;', @@ -71,6 +74,13 @@ ol.webgl.map.shader.Fragment = function() { ' color.rgb += (average - color.rgb) * (-uSaturation);', ' }', '', + ' color.rgb += uBrightness;', + ' if (uContrast > 0.0) {', + ' color.rgb = (color.rgb - 0.5) / (1.0 - uContrast) + 0.5;', + ' } else {', + ' color.rgb = (color.rgb - 0.5) * (1.0 + uContrast) + 0.5;', + ' }', + '', ' color.a = color.a * uOpacity;', '', ' gl_FragColor = color;', @@ -156,6 +166,8 @@ ol.webgl.Map = function(target, opt_values) { * @private * @type {{aPosition: number, * aTexCoord: number, + * uBrightness: WebGLUniformLocation, + * uContrast: WebGLUniformLocation, * uHue: WebGLUniformLocation, * uMatrix: WebGLUniformLocation, * uOpacity: WebGLUniformLocation, @@ -484,6 +496,8 @@ ol.webgl.Map.prototype.renderInternal = function() { this.locations_ = { aPosition: gl.getAttribLocation(program, 'aPosition'), aTexCoord: gl.getAttribLocation(program, 'aTexCoord'), + uBrightness: gl.getUniformLocation(program, 'uBrightness'), + uContrast: gl.getUniformLocation(program, 'uContrast'), uHue: gl.getUniformLocation(program, 'uHue'), uMatrix: gl.getUniformLocation(program, 'uMatrix'), uOpacity: gl.getUniformLocation(program, 'uOpacity'), @@ -517,6 +531,8 @@ ol.webgl.Map.prototype.renderInternal = function() { this.forEachVisibleLayer(function(layer, layerRenderer) { gl.uniformMatrix4fv( this.locations_.uMatrix, false, layerRenderer.getMatrix()); + gl.uniform1f(this.locations_.uBrightness, layer.getBrightness()); + gl.uniform1f(this.locations_.uContrast, layer.getContrast()); gl.uniform1f(this.locations_.uHue, layer.getHue()); gl.uniform1f(this.locations_.uOpacity, layer.getOpacity()); gl.uniform1f(this.locations_.uSaturation, layer.getSaturation()); From 511ca18b237bc7b01a8d25f23e174b5c167433ad Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Sun, 22 Jul 2012 02:33:08 +0200 Subject: [PATCH 290/562] Tidy up fragment shader --- src/ol/webgl/map.js | 52 ++++++++++++++++++++++++++------------------- 1 file changed, 30 insertions(+), 22 deletions(-) diff --git a/src/ol/webgl/map.js b/src/ol/webgl/map.js index bdff207a7d..268410e617 100644 --- a/src/ol/webgl/map.js +++ b/src/ol/webgl/map.js @@ -41,49 +41,57 @@ ol.webgl.map.shader.Fragment = function() { goog.base(this, [ 'precision mediump float;', '', - 'uniform mat4 uMatrix;', 'uniform float uBrightness;', 'uniform float uContrast;', 'uniform float uHue;', 'uniform float uOpacity;', + 'uniform mat4 uMatrix;', 'uniform float uSaturation;', 'uniform sampler2D uTexture;', '', 'varying vec2 vTexCoord;', '', 'void main(void) {', + '', ' vec4 texCoord = uMatrix * vec4(vTexCoord, 0., 1.);', ' vec4 color = texture2D(uTexture, texCoord.st);', '', - ' float angle = uHue * 3.14159265;', - ' float s = sin(angle), c = cos(angle);', - ' vec3 weights = (vec3(2.0 * c, -sqrt(3.0) * s - c, sqrt(3.0) * s - c)', - ' + 1.0) / 3.0;', - ' float len = length(color.rgb);', - ' color.rgb = vec3(', - ' dot(color.rgb, weights.xyz),', - ' dot(color.rgb, weights.zxy),', - ' dot(color.rgb, weights.yzx)', - ' );', - ' ', - ' float average = (color.r + color.g + color.b) / 3.0;', - ' if (uSaturation > 0.0) {', - ' color.rgb += (average - color.rgb)', - ' * (1.0 - 1.0 / (1.001 - uSaturation));', - ' } else if (uSaturation < 0.0) {', - ' color.rgb += (average - color.rgb) * (-uSaturation);', + ' if (uHue != 0.) {', + ' float angle = uHue * 3.14159265;', + ' float s = sin(angle), c = cos(angle);', + ' vec3 weights = (vec3(2. * c, -sqrt(3.) * s - c, sqrt(3.) * s - c)', + ' + 1.) / 3.;', + ' color.rgb = vec3(', + ' dot(color.rgb, weights.xyz),', + ' dot(color.rgb, weights.zxy),', + ' dot(color.rgb, weights.yzx)', + ' );', + ' }', + '', + ' if (uSaturation != 0.) {', + ' float average = (color.r + color.g + color.b) / 3.0;', + ' if (uSaturation > 0.0) {', + ' color.rgb += (average - color.rgb)', + ' * (1. - 1. / (1. - uSaturation));', + ' } else {', + ' color.rgb += (average - color.rgb) * -uSaturation;', + ' }', ' }', '', ' color.rgb += uBrightness;', - ' if (uContrast > 0.0) {', - ' color.rgb = (color.rgb - 0.5) / (1.0 - uContrast) + 0.5;', - ' } else {', - ' color.rgb = (color.rgb - 0.5) * (1.0 + uContrast) + 0.5;', + '', + ' if (uContrast != 0.) {', + ' if (uContrast > 0.0) {', + ' color.rgb = (color.rgb - 0.5) / (1. - uContrast) + 0.5;', + ' } else {', + ' color.rgb = (color.rgb - 0.5) * (1. + uContrast) + 0.5;', + ' }', ' }', '', ' color.a = color.a * uOpacity;', '', ' gl_FragColor = color;', + '', '}' ].join('\n')); }; From cbafc0795dbd21bd29b1fd1ca66ab7bc042a2b8d Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Sun, 22 Jul 2012 03:06:12 +0200 Subject: [PATCH 291/562] Add another FIXME --- src/ol/base/map.js | 4 ++++ src/ol/control/control.js | 4 ++++ src/ol/webgl/tilelayerrenderer.js | 1 + 3 files changed, 9 insertions(+) diff --git a/src/ol/base/map.js b/src/ol/base/map.js index 5420b2cc32..8f285aebd3 100644 --- a/src/ol/base/map.js +++ b/src/ol/base/map.js @@ -2,6 +2,10 @@ // FIXME add change resolution by zoom step function // FIXME recheck layer/map projection compatability when projection changes // FIXME layer renderers should skip when they can't reproject +// FIXME add rotation +// FIXME add tilt and height? +// FIXME split out renderer +// FIXME add renderer selection strategy goog.provide('ol.Map'); goog.provide('ol.MapProperty'); diff --git a/src/ol/control/control.js b/src/ol/control/control.js index dba60d9f74..e0a8f2b37c 100644 --- a/src/ol/control/control.js +++ b/src/ol/control/control.js @@ -1,3 +1,7 @@ +// FIXME add keyboard pan +// FIXME add snap-to-pixel pan strategy +// FIXME add rotation control + goog.provide('ol.Control'); goog.require('ol.MapBrowserEvent'); diff --git a/src/ol/webgl/tilelayerrenderer.js b/src/ol/webgl/tilelayerrenderer.js index 379a5e2347..225e39d074 100644 --- a/src/ol/webgl/tilelayerrenderer.js +++ b/src/ol/webgl/tilelayerrenderer.js @@ -1,6 +1,7 @@ // FIXME large resolutions lead to too large framebuffers :-( // FIXME animated shaders! check in redraw // FIXME out-by-one error in texture alignment? +// FIXME bad things happen when we go outside the zoom levels goog.provide('ol.webgl.TileLayerRenderer'); goog.provide('ol.webgl.tilelayerrenderer.shader.Fragment'); From 8987dc86077eb5e4f27bdae2bf9c8a0f8aef5c60 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Sun, 22 Jul 2012 12:17:06 +0200 Subject: [PATCH 292/562] Improve modularity --- ...layeropenstreetmap.js => openstreetmap.js} | 0 src/ol/tile/tilegridxyz.js | 28 ------- src/ol/tile/tilelayerxyz.js | 21 ----- src/ol/tile/tilestorexyz.js | 43 ---------- src/ol/tile/xyz.js | 84 +++++++++++++++++++ .../tile/{tilestore_test.js => xyz_test.js} | 0 6 files changed, 84 insertions(+), 92 deletions(-) rename src/ol/tile/{tilelayeropenstreetmap.js => openstreetmap.js} (100%) delete mode 100644 src/ol/tile/tilegridxyz.js delete mode 100644 src/ol/tile/tilelayerxyz.js delete mode 100644 src/ol/tile/tilestorexyz.js create mode 100644 src/ol/tile/xyz.js rename src/ol/tile/{tilestore_test.js => xyz_test.js} (100%) diff --git a/src/ol/tile/tilelayeropenstreetmap.js b/src/ol/tile/openstreetmap.js similarity index 100% rename from src/ol/tile/tilelayeropenstreetmap.js rename to src/ol/tile/openstreetmap.js diff --git a/src/ol/tile/tilegridxyz.js b/src/ol/tile/tilegridxyz.js deleted file mode 100644 index b4bbac80dc..0000000000 --- a/src/ol/tile/tilegridxyz.js +++ /dev/null @@ -1,28 +0,0 @@ -goog.provide('ol.tilegrid.createXYZ'); - -goog.require('ol.Coordinate'); -goog.require('ol.Projection'); -goog.require('ol.Size'); -goog.require('ol.TileGrid'); - - -/** - * @param {number} maxZoom Maximum zoom. - * @return {ol.TileGrid} Tile grid. - */ -ol.tilegrid.createXYZ = function(maxZoom) { - - var resolutions = new Array(maxZoom + 1); - var z; - for (z = 0; z <= maxZoom; ++z) { - resolutions[z] = ol.Projection.EPSG_3857_HALF_SIZE / (128 << z); - } - - var extent = ol.Projection.EPSG_3857_EXTENT; - var origin = new ol.Coordinate( - -ol.Projection.EPSG_3857_HALF_SIZE, ol.Projection.EPSG_3857_HALF_SIZE); - var tileSize = new ol.Size(256, 256); - - return new ol.TileGrid(resolutions, extent, origin, tileSize); - -}; diff --git a/src/ol/tile/tilelayerxyz.js b/src/ol/tile/tilelayerxyz.js deleted file mode 100644 index d7ec1b6bda..0000000000 --- a/src/ol/tile/tilelayerxyz.js +++ /dev/null @@ -1,21 +0,0 @@ -goog.provide('ol.tilelayer.createXYZ'); - -goog.require('ol.Layer'); -goog.require('ol.TileLayer'); -goog.require('ol.tilestore.createXYZ'); - - -/** - * @param {number} maxZoom Maximum zoom. - * @param {Array.} templates Templates. - * @param {string=} opt_attribution Attribution. - * @param {string=} opt_crossOrigin Cross origin. - * @param {Object.=} opt_values Values. - * @return {ol.Layer} Layer. - */ -ol.tilelayer.createXYZ = - function(maxZoom, templates, opt_attribution, opt_crossOrigin, opt_values) { - var store = ol.tilestore.createXYZ( - maxZoom, templates, opt_attribution, opt_crossOrigin); - return new ol.TileLayer(store, opt_values); -}; diff --git a/src/ol/tile/tilestorexyz.js b/src/ol/tile/tilestorexyz.js deleted file mode 100644 index ad639379e6..0000000000 --- a/src/ol/tile/tilestorexyz.js +++ /dev/null @@ -1,43 +0,0 @@ -goog.provide('ol.tilestore.createXYZ'); - -goog.require('goog.math'); -goog.require('ol.Projection'); -goog.require('ol.TileCoord'); -goog.require('ol.TileGrid'); -goog.require('ol.TileStore'); -goog.require('ol.TileUrlFunction'); -goog.require('ol.tilegrid.createXYZ'); - - -/** - * @param {number} maxZoom Maximum zoom. - * @param {Array.} templates Templates. - * @param {string=} opt_attribution Attribution. - * @param {string=} opt_crossOrigin Cross origin. - * @return {ol.TileStore} Tile store. - */ -ol.tilestore.createXYZ = - function(maxZoom, templates, opt_attribution, opt_crossOrigin) { - - var projection = ol.Projection.getFromCode('EPSG:3857'); - var tileGrid = ol.tilegrid.createXYZ(maxZoom); - var tileUrlFunction = ol.TileUrlFunction.withTileCoordTransform( - function(tileCoord) { - var n = 1 << tileCoord.z; - var y = -tileCoord.y - 1; - if (y < 0 || n <= y) { - return null; - } else { - var x = goog.math.modulo(tileCoord.x, n); - return new ol.TileCoord(tileCoord.z, x, y); - } - }, - ol.TileUrlFunction.createFromTemplates(templates)); - var extent = projection.getExtent(); - - return new ol.TileStore(projection, tileGrid, tileUrlFunction, extent, - opt_attribution, opt_crossOrigin); - -}; - - diff --git a/src/ol/tile/xyz.js b/src/ol/tile/xyz.js new file mode 100644 index 0000000000..92f6f70f34 --- /dev/null +++ b/src/ol/tile/xyz.js @@ -0,0 +1,84 @@ +goog.provide('ol.tilegrid.createXYZ'); +goog.provide('ol.tilelayer.createXYZ'); +goog.provide('ol.tilestore.createXYZ'); + +goog.require('goog.math'); +goog.require('ol.Coordinate'); +goog.require('ol.Layer'); +goog.require('ol.Projection'); +goog.require('ol.Size'); +goog.require('ol.TileCoord'); +goog.require('ol.TileGrid'); +goog.require('ol.TileLayer'); +goog.require('ol.TileStore'); +goog.require('ol.TileUrlFunction'); + + +/** + * @param {number} maxZoom Maximum zoom. + * @return {ol.TileGrid} Tile grid. + */ +ol.tilegrid.createXYZ = function(maxZoom) { + + var resolutions = new Array(maxZoom + 1); + var z; + for (z = 0; z <= maxZoom; ++z) { + resolutions[z] = ol.Projection.EPSG_3857_HALF_SIZE / (128 << z); + } + + var extent = ol.Projection.EPSG_3857_EXTENT; + var origin = new ol.Coordinate( + -ol.Projection.EPSG_3857_HALF_SIZE, ol.Projection.EPSG_3857_HALF_SIZE); + var tileSize = new ol.Size(256, 256); + + return new ol.TileGrid(resolutions, extent, origin, tileSize); + +}; + + +/** + * @param {number} maxZoom Maximum zoom. + * @param {Array.} templates Templates. + * @param {string=} opt_attribution Attribution. + * @param {string=} opt_crossOrigin Cross origin. + * @param {Object.=} opt_values Values. + * @return {ol.Layer} Layer. + */ +ol.tilelayer.createXYZ = + function(maxZoom, templates, opt_attribution, opt_crossOrigin, opt_values) { + var store = ol.tilestore.createXYZ( + maxZoom, templates, opt_attribution, opt_crossOrigin); + return new ol.TileLayer(store, opt_values); +}; + + +/** + * @param {number} maxZoom Maximum zoom. + * @param {Array.} templates Templates. + * @param {string=} opt_attribution Attribution. + * @param {string=} opt_crossOrigin Cross origin. + * @return {ol.TileStore} Tile store. + */ +ol.tilestore.createXYZ = + function(maxZoom, templates, opt_attribution, opt_crossOrigin) { + + var projection = ol.Projection.getFromCode('EPSG:3857'); + var tileGrid = ol.tilegrid.createXYZ(maxZoom); + var tileUrlFunction = ol.TileUrlFunction.withTileCoordTransform( + function(tileCoord) { + var n = 1 << tileCoord.z; + var y = -tileCoord.y - 1; + if (y < 0 || n <= y) { + return null; + } else { + var x = goog.math.modulo(tileCoord.x, n); + return new ol.TileCoord(tileCoord.z, x, y); + } + }, + ol.TileUrlFunction.createFromTemplates(templates)); + var extent = projection.getExtent(); + + return new ol.TileStore(projection, tileGrid, tileUrlFunction, extent, + opt_attribution, opt_crossOrigin); + +}; diff --git a/src/ol/tile/tilestore_test.js b/src/ol/tile/xyz_test.js similarity index 100% rename from src/ol/tile/tilestore_test.js rename to src/ol/tile/xyz_test.js From ea623b7be60f9124aba0de398325e8316e8cefff Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Sun, 22 Jul 2012 12:18:56 +0200 Subject: [PATCH 293/562] Fix some stupid bugs in ol.TileBounds --- src/ol/tile/tilebounds.js | 14 ++++++++++-- src/ol/tile/tilebounds_test.js | 38 ++++++++++++++++++++++--------- src/ol/webgl/tilelayerrenderer.js | 2 +- 3 files changed, 40 insertions(+), 14 deletions(-) diff --git a/src/ol/tile/tilebounds.js b/src/ol/tile/tilebounds.js index 133f62117c..4c139d2026 100644 --- a/src/ol/tile/tilebounds.js +++ b/src/ol/tile/tilebounds.js @@ -49,13 +49,23 @@ ol.TileBounds.prototype.clone = function() { }; +/** + * @param {ol.TileCoord} tileCoord Tile coordinate. + * @return {boolean} Contains tile coordinate. + */ +ol.TileBounds.prototype.contains = function(tileCoord) { + return this.minX <= tileCoord.x && tileCoord.x <= this.maxX && + this.minY <= tileCoord.y && tileCoord.y <= this.maxY; +}; + + /** * @param {ol.TileBounds} tileBounds Tile bounds. * @return {boolean} Contains. */ -ol.TileBounds.prototype.contains = function(tileBounds) { +ol.TileBounds.prototype.containsTileBounds = function(tileBounds) { return this.minX <= tileBounds.minX && tileBounds.maxX <= this.maxX && - this.minY <= tileBounds.minY && tileBounds.minY <= this.minY; + this.minY <= tileBounds.minY && tileBounds.minY <= this.maxY; }; diff --git a/src/ol/tile/tilebounds_test.js b/src/ol/tile/tilebounds_test.js index 152c287980..2d6c01ae44 100644 --- a/src/ol/tile/tilebounds_test.js +++ b/src/ol/tile/tilebounds_test.js @@ -14,17 +14,33 @@ function testClone() { } -function testContainsPositive() { - var tileBounds = new ol.TileBounds(0, 0, 2, 2); - var tileCoord = new ol.TileCoord(3, 1, 1); - assertTrue(tileBounds.contains(tileCoord)); -} - - -function testContainsNegative() { - var tileBounds = new ol.TileBounds(0, 0, 2, 2); - var tileCoord = new ol.TileCoord(3, 1, 3); - assertFalse(tileBounds.contains(tileCoord)); +function testContains() { + var tileBounds = new ol.TileBounds(1, 1, 3, 3); + assertFalse(tileBounds.contains(new ol.TileCoord(0, 0, 0))); + assertFalse(tileBounds.contains(new ol.TileCoord(0, 0, 1))); + assertFalse(tileBounds.contains(new ol.TileCoord(0, 0, 2))); + assertFalse(tileBounds.contains(new ol.TileCoord(0, 0, 3))); + assertFalse(tileBounds.contains(new ol.TileCoord(0, 0, 4))); + assertFalse(tileBounds.contains(new ol.TileCoord(0, 1, 0))); + assertTrue(tileBounds.contains(new ol.TileCoord(0, 1, 1))); + assertTrue(tileBounds.contains(new ol.TileCoord(0, 1, 2))); + assertTrue(tileBounds.contains(new ol.TileCoord(0, 1, 3))); + assertFalse(tileBounds.contains(new ol.TileCoord(0, 1, 4))); + assertFalse(tileBounds.contains(new ol.TileCoord(0, 2, 0))); + assertTrue(tileBounds.contains(new ol.TileCoord(0, 2, 1))); + assertTrue(tileBounds.contains(new ol.TileCoord(0, 2, 2))); + assertTrue(tileBounds.contains(new ol.TileCoord(0, 2, 3))); + assertFalse(tileBounds.contains(new ol.TileCoord(0, 2, 4))); + assertFalse(tileBounds.contains(new ol.TileCoord(0, 3, 0))); + assertTrue(tileBounds.contains(new ol.TileCoord(0, 3, 1))); + assertTrue(tileBounds.contains(new ol.TileCoord(0, 3, 2))); + assertTrue(tileBounds.contains(new ol.TileCoord(0, 3, 3))); + assertFalse(tileBounds.contains(new ol.TileCoord(0, 3, 4))); + assertFalse(tileBounds.contains(new ol.TileCoord(0, 4, 0))); + assertFalse(tileBounds.contains(new ol.TileCoord(0, 4, 1))); + assertFalse(tileBounds.contains(new ol.TileCoord(0, 4, 2))); + assertFalse(tileBounds.contains(new ol.TileCoord(0, 4, 3))); + assertFalse(tileBounds.contains(new ol.TileCoord(0, 4, 4))); } diff --git a/src/ol/webgl/tilelayerrenderer.js b/src/ol/webgl/tilelayerrenderer.js index 225e39d074..bc0ed2a4ef 100644 --- a/src/ol/webgl/tilelayerrenderer.js +++ b/src/ol/webgl/tilelayerrenderer.js @@ -291,7 +291,7 @@ ol.webgl.TileLayerRenderer.prototype.render = function() { tileBounds.minY, tileBounds.minX + nTilesX - 1, tileBounds.minY + nTilesY - 1); - goog.asserts.assert(framebufferTileBounds.contains(tileBounds)); + goog.asserts.assert(framebufferTileBounds.containsTileBounds(tileBounds)); this.bindFramebuffer_(framebufferDimension); gl.viewport(0, 0, framebufferDimension, framebufferDimension); From 75c7bee6d90737a4d4bc2b1e5974623d4635a40f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Lemoine?= Date: Sun, 22 Jul 2012 13:48:57 +0200 Subject: [PATCH 294/562] update readme.md --- readme.md | 84 ++++++++++--------------------------------------------- 1 file changed, 14 insertions(+), 70 deletions(-) diff --git a/readme.md b/readme.md index f41fcc8bb8..b51f7b8f9e 100644 --- a/readme.md +++ b/readme.md @@ -1,79 +1,23 @@ -# OpenLayers +# OpenLayers 3 -Copyright (c) 2005-2012 OpenLayers Contributors. See authors.txt for -more details. +## Run Tests -OpenLayers is a JavaScript library for building map applications -on the web. OpenLayers is made available under a BSD-license. -Please see license.txt in this distribution for more details. +Run the [plovr](http://plovr.com/) web server with: -## Getting OpenLayers + $ make serve -OpenLayers lives at http://www.openlayers.org/. Find details on downloading stable releases or the development version the [development site](http://trac.osgeo.org/openlayers/wiki/HowToDownload). +Open http://localhost:9810/ in the browser, and select *List of tests* or *Test +runner*. -## Installing OpenLayers +## Run the example -You can use OpenLayers as-is by copying build/OpenLayers.js and the -entire theme/ and img/ directories up to your webserver and putting them -in the same directory. The files can be in subdirectories on your website, -or right in the root of the site, as in these examples. -To include the OpenLayers library in your web page from the root of the site, use: +Run the plovr web server (see above), and open skeleton.html in the browser +(e.g. http://localhost/~elemoine/ol3/skeleton.html). - + + diff --git a/demos/side-by-side/side-by-side.js b/demos/side-by-side/side-by-side.js new file mode 100644 index 0000000000..3d670e8b76 --- /dev/null +++ b/demos/side-by-side/side-by-side.js @@ -0,0 +1,35 @@ +goog.require('ol.RendererHint'); +goog.require('ol.createMap'); +goog.require('ol.layer.MapQuestOpenAerial'); +goog.require('ol.view.Attribution'); + + +var layer = new ol.layer.MapQuestOpenAerial(); + +var layers = new ol.Collection(); +layers.push(layer); + +var domMap = ol.createMap( + document.getElementById('domMap'), + {'layers': layers}, + ol.RendererHint.DOM); +domMap.setCenter(new ol.Coordinate(0, 0)); +domMap.setResolution(layer.getStore().getResolutions()[0]); + +var webglMap = ol.createMap( + document.getElementById('webglMap'), + {}, + ol.RendererHint.WEBGL); +webglMap.bindTo('center', domMap); +webglMap.bindTo('layers', domMap); +webglMap.bindTo('resolution', domMap); +webglMap.bindTo('rotation', domMap); + +var attributionView = new ol.view.Attribution(domMap); +document.getElementById('attribution').appendChild( + attributionView.getElement()); + +goog.exportSymbol('layer', layer); +goog.exportSymbol('layers', layers); +goog.exportSymbol('domMap', domMap); +goog.exportSymbol('webglMap', webglMap); diff --git a/demos/side-by-side/side-by-side.json b/demos/side-by-side/side-by-side.json new file mode 100644 index 0000000000..9b14a6766a --- /dev/null +++ b/demos/side-by-side/side-by-side.json @@ -0,0 +1,9 @@ +{ + + "id": "demo-side-by-side", + + "inherits": "../../base.json", + + "inputs": "demos/side-by-side/side-by-side.js" + +} diff --git a/ol-api.json b/ol-api.json deleted file mode 100644 index 86b6ef73cc..0000000000 --- a/ol-api.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - - "id": "ol-api", - - "inherits": "ol-base.json", - - "inputs": "ol.js" - -} diff --git a/ol-skeleton.json b/ol-skeleton.json deleted file mode 100644 index dcee805a21..0000000000 --- a/ol-skeleton.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - - "id": "ol-skeleton", - - "inherits": "ol-base.json", - - "inputs": "skeleton.js" - -} diff --git a/readme.md b/readme.md index 42a1db78d7..1895d719de 100644 --- a/readme.md +++ b/readme.md @@ -6,24 +6,30 @@ Run make: $ make -## Run the example +## Run the examples -Run the [plovr](http://plovr.com/) web server with: +Run make (as above), then explore the `demos/` directory with your web browser. + +## Run the examples in debug mode + +Run the [Plovr](http://plovr.com/) web server with: $ make serve -Then open skeleton.html in the browser (e.g. -). +Then, start a simple webserver, for example: + + $ python -mSimpleHTTPServer + +Explore the `demos/` directory through this server, for example . You can turn off compilation by appending `?mode=RAW` to the URL, for example . + +Note that appending `?mode=RAW` doesn't work with `file://` URLs, which is why you need to access the `demos/` directory though a web server. ## Run tests -Run the plovr web server (see above), then open in -your browser and select *List of tests* or *Test runner*. +Run the plovr web server (see above), then open in your browser and select *List of tests* or *Test runner*. ## Run the linter -First, install the [Closure -Linter](https://developers.google.com/closure/utilities/docs/linter_howto). -Then: +First, install the [Closure Linter](https://developers.google.com/closure/utilities/docs/linter_howto). Then: $ make lint diff --git a/skeleton.html b/skeleton.html deleted file mode 100644 index 6098f362ed..0000000000 --- a/skeleton.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - -
-
- - - diff --git a/skeleton.js b/skeleton.js deleted file mode 100644 index 153437b658..0000000000 --- a/skeleton.js +++ /dev/null @@ -1,40 +0,0 @@ -goog.require('goog.debug.Console'); -goog.require('goog.object'); -goog.require('ol.Coordinate'); -goog.require('ol.RendererHint'); -goog.require('ol.createMap'); -goog.require('ol.layer.OpenStreetMap'); - -goog.debug.Console.autoInstall(); -goog.debug.Console.instance.setCapturing(true); - -var twoMaps = true; - -var target; -var map, map1, map2; -var layer; - -target = /** @type {!HTMLDivElement} */ document.getElementById('map1'); -map = map1 = ol.createMap(target, undefined, ol.RendererHint.DOM); -layer = new ol.layer.OpenStreetMap({ - 'opacity': 0.9 -}); -map.getLayers().push(layer); - -var resolutions = layer.getStore().getResolutions(); -map1.setCenter(new ol.Coordinate(0, 0)); -map1.setResolution(resolutions[0]); - -if (twoMaps) { - target = /** @type {!HTMLDivElement} */ document.getElementById('map2'); - map2 = ol.createMap(target, undefined, ol.RendererHint.WEBGL); - map2.bindTo('center', map1); - map2.bindTo('layers', map1); - map2.bindTo('resolution', map1); - map2.bindTo('rotation', map1); -} - -goog.exportSymbol('layer', layer); -goog.exportSymbol('map', map); -goog.exportSymbol('map1', map1); -goog.exportSymbol('map2', map2); From 76120549136c803dc91f3bfa3b4e4bd5e5d21803 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Tue, 7 Aug 2012 14:55:07 +0200 Subject: [PATCH 465/562] Cosmetic touchups to side-by-side demo --- demos/side-by-side/index.html.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/demos/side-by-side/index.html.in b/demos/side-by-side/index.html.in index 51827ccecd..45547452ad 100644 --- a/demos/side-by-side/index.html.in +++ b/demos/side-by-side/index.html.in @@ -34,7 +34,7 @@ Zoom: - double-click, shift+double-click, mouse wheel, +/- keys, shift+drag (DOM only) + double-click, shift+double-click, mouse wheel, +/- keys; shift+drag (DOM only) Rotate: From 49dc2788d5d001f1e390d6ffc1f31a4251c7ccf5 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Tue, 7 Aug 2012 14:59:28 +0200 Subject: [PATCH 466/562] Add ol.control.Keyboard hack --- src/ol/control/keyboard.js | 53 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 src/ol/control/keyboard.js diff --git a/src/ol/control/keyboard.js b/src/ol/control/keyboard.js new file mode 100644 index 0000000000..e72bfaf803 --- /dev/null +++ b/src/ol/control/keyboard.js @@ -0,0 +1,53 @@ +// FIXME this class is ugly and should be removed + +goog.provide('ol.control.Keyboard'); + +goog.require('ol.Control'); + + + +/** + * @constructor + * @extends {ol.Control} + */ +ol.control.Keyboard = function() { + + goog.base(this, null); + + /** + * @private + * @type {Object.} + */ + this.charCodeCallbacks_ = {}; + +}; +goog.inherits(ol.control.Keyboard, ol.Control); + + +/** + * @param {string} s String. + * @param {Function} callback Callback. + */ +ol.control.Keyboard.prototype.addCallback = function(s, callback) { + var i; + for (i = 0; i < s.length; ++i) { + this.charCodeCallbacks_[s.charCodeAt(i)] = callback; + } +}; + + +/** + * @inheritDoc + */ +ol.control.Keyboard.prototype.handleMapBrowserEvent = + function(mapBrowserEvent) { + if (mapBrowserEvent.type == goog.events.KeyHandler.EventType.KEY) { + var keyEvent = /** @type {goog.events.KeyEvent} */ + mapBrowserEvent.browserEvent; + var callback = this.charCodeCallbacks_[keyEvent.charCode]; + if (callback) { + callback(); + mapBrowserEvent.preventDefault(); + } + } +}; From afe85dd6207f7dc5b81535d882fd3c452e3c3bc4 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Tue, 7 Aug 2012 14:55:49 +0200 Subject: [PATCH 467/562] Add keyboard controls to side-by-side demo --- demos/side-by-side/index.html.in | 20 +++++++++++++ demos/side-by-side/side-by-side.js | 45 ++++++++++++++++++++++++++++++ 2 files changed, 65 insertions(+) diff --git a/demos/side-by-side/index.html.in b/demos/side-by-side/index.html.in index 45547452ad..edb9bcc971 100644 --- a/demos/side-by-side/index.html.in +++ b/demos/side-by-side/index.html.in @@ -40,6 +40,26 @@ Rotate: shift+drag (WebGL only) + + Brightness/contrast: + b/B/c/C keys (WebGL only) + + + Hue/saturation: + h/H/s/S keys (WebGL only) + + + Opacity: + o/O keys + + + Visibility: + v/V keys + + + Reset + 0 key + diff --git a/demos/side-by-side/side-by-side.js b/demos/side-by-side/side-by-side.js index 3d670e8b76..68387625b8 100644 --- a/demos/side-by-side/side-by-side.js +++ b/demos/side-by-side/side-by-side.js @@ -1,4 +1,5 @@ goog.require('ol.RendererHint'); +goog.require('ol.control.Keyboard'); goog.require('ol.createMap'); goog.require('ol.layer.MapQuestOpenAerial'); goog.require('ol.view.Attribution'); @@ -29,6 +30,50 @@ var attributionView = new ol.view.Attribution(domMap); document.getElementById('attribution').appendChild( attributionView.getElement()); +var keyboardControl = new ol.control.Keyboard(); +keyboardControl.addCallback('0', function() { + layer.setBrightness(0); + layer.setContrast(0); + layer.setHue(0); + layer.setSaturation(0); + layer.setOpacity(1); + layer.setVisible(true); +}); +keyboardControl.addCallback('b', function() { + layer.setBrightness(layer.getBrightness() - 0.1); +}); +keyboardControl.addCallback('B', function() { + layer.setBrightness(layer.getBrightness() + 0.1); +}); +keyboardControl.addCallback('c', function() { + layer.setContrast(layer.getContrast() - 0.1); +}); +keyboardControl.addCallback('C', function() { + layer.setContrast(layer.getContrast() + 0.1); +}); +keyboardControl.addCallback('h', function() { + layer.setHue(layer.getHue() - 0.1); +}); +keyboardControl.addCallback('H', function() { + layer.setHue(layer.getHue() + 0.1); +}); +keyboardControl.addCallback('o', function() { + layer.setOpacity(layer.getOpacity() - 0.1); +}); +keyboardControl.addCallback('O', function() { + layer.setOpacity(layer.getOpacity() + 0.1); +}); +keyboardControl.addCallback('s', function() { + layer.setSaturation(layer.getSaturation() - 0.1); +}); +keyboardControl.addCallback('S', function() { + layer.setSaturation(layer.getSaturation() + 0.1); +}); +keyboardControl.addCallback('vV', function() { + layer.setVisible(!layer.getVisible()); +}); +domMap.getControls().push(keyboardControl); + goog.exportSymbol('layer', layer); goog.exportSymbol('layers', layers); goog.exportSymbol('domMap', domMap); From 74a332d1665b4e46568e9547cea64499c759dd51 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Tue, 7 Aug 2012 14:56:21 +0200 Subject: [PATCH 468/562] Add side-by-side demo notes --- demos/side-by-side/index.html.in | 3 +++ 1 file changed, 3 insertions(+) diff --git a/demos/side-by-side/index.html.in b/demos/side-by-side/index.html.in index edb9bcc971..4c8f1a150a 100644 --- a/demos/side-by-side/index.html.in +++ b/demos/side-by-side/index.html.in @@ -61,6 +61,9 @@ 0 key +

Notes: the two maps share the same center, resolution, rotation and layers. Currently the DOM map does not support rotation.

+

Console tips: If you want to play around with the API in the console, first make sure that you're using the whitespace only version of this demo, then open a console and experiment with the domMap, webglMap and layer variables in the console. The source code is in side-by-side.js.

+

Known bugs: Dragging is captured on the entire page, not just on the maps. When the map is rotated, panning on the WebGL map doesn't work as expected.

From c53e91e205dbfbdea7d63d3c9c14687da9919608 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Tue, 7 Aug 2012 15:53:51 +0200 Subject: [PATCH 469/562] Degrade gracefully if WebGL is not supported --- demos/side-by-side/side-by-side.js | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/demos/side-by-side/side-by-side.js b/demos/side-by-side/side-by-side.js index 68387625b8..67b72bc41a 100644 --- a/demos/side-by-side/side-by-side.js +++ b/demos/side-by-side/side-by-side.js @@ -21,10 +21,12 @@ var webglMap = ol.createMap( document.getElementById('webglMap'), {}, ol.RendererHint.WEBGL); -webglMap.bindTo('center', domMap); -webglMap.bindTo('layers', domMap); -webglMap.bindTo('resolution', domMap); -webglMap.bindTo('rotation', domMap); +if (!goog.isNull(webglMap)) { + webglMap.bindTo('center', domMap); + webglMap.bindTo('layers', domMap); + webglMap.bindTo('resolution', domMap); + webglMap.bindTo('rotation', domMap); +} var attributionView = new ol.view.Attribution(domMap); document.getElementById('attribution').appendChild( From 991c61110bd623e4a4bca652eeb36ebbbc4844f6 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Tue, 7 Aug 2012 15:55:40 +0200 Subject: [PATCH 470/562] Use simple optimizations instead of whitespace only --- .gitignore | 6 +++--- Makefile | 18 ++++++++++-------- demos/side-by-side/index.html.in | 2 +- 3 files changed, 14 insertions(+), 12 deletions(-) diff --git a/.gitignore b/.gitignore index a5f7db3bdb..889d38a5bd 100644 --- a/.gitignore +++ b/.gitignore @@ -3,9 +3,9 @@ /build/OpenLayers.js /build/ol3.js /build/ol3-compiled.js -/demos/*/*.html -/demos/*/advanced-optimizations.js -/demos/*/whitespace-only.js +/demos/*/advanced-optimizations.* +/demos/*/debug.html +/demos/*/simple-optimizations.* /doc/apidocs/ /examples/example-list.js /examples/example-list.xml diff --git a/Makefile b/Makefile index 726daeb3bd..7157ab6584 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,6 @@ PLOVR_JAR=bin/plovr-4b3caf2b7d84.jar SRC = $(shell find externs src/ol -name \*.js) -TARGETS = $(shell find demos -name advanced-optimizations.js -o -name whitespace-only.js) +TARGETS = $(shell find demos -name advanced-optimizations.js -o -name simple-optimizations.js) comma := , empty := space := $(empty) $(empty) @@ -28,8 +28,8 @@ demos/side-by-side: \ demos/side-by-side/advanced-optimizations.html \ demos/side-by-side/advanced-optimizations.js \ demos/side-by-side/debug.html \ - demos/side-by-side/whitespace-only.html \ - demos/side-by-side/whitespace-only.js + demos/side-by-side/simple-optimizations.html \ + demos/side-by-side/simple-optimizations.js demos/side-by-side/advanced-optimizations.html: demos/side-by-side/index.html.in sed -e 's|@SRC@|advanced-optimizations.js|' $< > $@ @@ -43,13 +43,13 @@ demos/side-by-side/advanced-optimizations.js: $(PLOVR_JAR) $(SRC) base.json \ demos/side-by-side/debug.html: demos/side-by-side/index.html.in sed -e 's|@SRC@|http://localhost:9810/compile?id=demo-side-by-side|' $< > $@ -demos/side-by-side/whitespace-only.html: demos/side-by-side/index.html.in - sed -e 's|@SRC@|whitespace-only.js|' $< > $@ +demos/side-by-side/simple-optimizations.html: demos/side-by-side/index.html.in + sed -e 's|@SRC@|simple-optimizations.js|' $< > $@ # FIXME invoke plovr directly, rather than assuming that the server is running -demos/side-by-side/whitespace-only.js: $(PLOVR_JAR) $(SRC) base.json \ +demos/side-by-side/simple-optimizations.js: $(PLOVR_JAR) $(SRC) base.json \ demos/side-by-side/side-by-side.json demos/side-by-side/side-by-side.js - curl 'http://localhost:9810/compile?id=demo-side-by-side&mode=WHITESPACE' > $@ + curl 'http://localhost:9810/compile?id=demo-side-by-side&mode=SIMPLE' > $@ @echo $@ "uncompressed:" $$(wc -c <$@) bytes @echo $@ " compressed:" $$(gzip -9 -c <$@ | wc -c) bytes @@ -70,7 +70,9 @@ $(PLOVR_JAR): clean: rm -f build/all.js rm -f build/ol3.js - rm -f demos/*/compiled.js + rm -f demos/*/advanced-optimizations.* + rm -f demos/*/debug.html + rm -f demos/*/simple-optimizations.* reallyclean: clean rm -f $(PLOVR_JAR) diff --git a/demos/side-by-side/index.html.in b/demos/side-by-side/index.html.in index 4c8f1a150a..75d65daab2 100644 --- a/demos/side-by-side/index.html.in +++ b/demos/side-by-side/index.html.in @@ -62,7 +62,7 @@

Notes: the two maps share the same center, resolution, rotation and layers. Currently the DOM map does not support rotation.

-

Console tips: If you want to play around with the API in the console, first make sure that you're using the whitespace only version of this demo, then open a console and experiment with the domMap, webglMap and layer variables in the console. The source code is in side-by-side.js.

+

Console tips: If you want to play around with the API in the console, first make sure that you're using the simple optimizations version of this demo, then open a console and experiment with the domMap, webglMap and layer variables in the console. The source code is in side-by-side.js.

Known bugs: Dragging is captured on the entire page, not just on the maps. When the map is rotated, panning on the WebGL map doesn't work as expected.

From 43a940027f53e8c7bb356336c49796ef3bb658d8 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Tue, 7 Aug 2012 16:36:37 +0200 Subject: [PATCH 471/562] Set events pane width and height in pixels --- demos/side-by-side/index.html.in | 2 +- src/ol/base/map.js | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/demos/side-by-side/index.html.in b/demos/side-by-side/index.html.in index 75d65daab2..91724e3762 100644 --- a/demos/side-by-side/index.html.in +++ b/demos/side-by-side/index.html.in @@ -63,7 +63,7 @@

Notes: the two maps share the same center, resolution, rotation and layers. Currently the DOM map does not support rotation.

Console tips: If you want to play around with the API in the console, first make sure that you're using the simple optimizations version of this demo, then open a console and experiment with the domMap, webglMap and layer variables in the console. The source code is in side-by-side.js.

-

Known bugs: Dragging is captured on the entire page, not just on the maps. When the map is rotated, panning on the WebGL map doesn't work as expected.

+

Known bugs: When the map is rotated, panning on the WebGL map doesn't work as expected.

diff --git a/src/ol/base/map.js b/src/ol/base/map.js index 66fd91ff56..ad53eb213a 100644 --- a/src/ol/base/map.js +++ b/src/ol/base/map.js @@ -1,4 +1,3 @@ -// FIXME dragger - prevent page scrolling // FIXME better map browser event types // FIXME recheck layer/map projection compatability when projection changes // FIXME layer renderers should skip when they can't reproject @@ -117,8 +116,9 @@ ol.Map = function(target, opt_values, opt_viewportSizeMonitor) { this.eventsPane_ = goog.dom.createElement(goog.dom.TagName.DIV); this.eventsPane_.className = 'ol-pane-events'; this.eventsPane_.style.position = 'absolute'; - this.eventsPane_.style.width = '100%'; - this.eventsPane_.style.height = '100%'; + // FIXME why can't we use width and height 100% here? + this.eventsPane_.style.width = target.clientWidth + 'px'; + this.eventsPane_.style.height = target.clientHeight + 'px'; this.eventsPane_.style.zIndex = ol.MapPaneZIndex.EVENTS; goog.dom.appendChild(target, this.eventsPane_); From f76b34bc3845b648caa28d80c76cf93ef6158693 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Tue, 7 Aug 2012 16:40:40 +0200 Subject: [PATCH 472/562] Consistent capitalization --- demos/side-by-side/index.html.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/demos/side-by-side/index.html.in b/demos/side-by-side/index.html.in index 91724e3762..e3454e9ba9 100644 --- a/demos/side-by-side/index.html.in +++ b/demos/side-by-side/index.html.in @@ -61,7 +61,7 @@ 0 key -

Notes: the two maps share the same center, resolution, rotation and layers. Currently the DOM map does not support rotation.

+

Notes: The two maps share the same center, resolution, rotation and layers. Currently the DOM map does not support rotation.

Console tips: If you want to play around with the API in the console, first make sure that you're using the simple optimizations version of this demo, then open a console and experiment with the domMap, webglMap and layer variables in the console. The source code is in side-by-side.js.

Known bugs: When the map is rotated, panning on the WebGL map doesn't work as expected.

From eab38e9042606819ab7ae32341349f8250692f80 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Tue, 7 Aug 2012 17:20:42 +0200 Subject: [PATCH 473/562] Use Alt key instead of Shift for rotation --- demos/side-by-side/index.html.in | 4 ++-- src/ol/base/createmap.js | 4 ++-- .../{shiftdragrotate.js => altdragrotate.js} | 14 +++++++------- 3 files changed, 11 insertions(+), 11 deletions(-) rename src/ol/control/{shiftdragrotate.js => altdragrotate.js} (72%) diff --git a/demos/side-by-side/index.html.in b/demos/side-by-side/index.html.in index e3454e9ba9..3abd7841ff 100644 --- a/demos/side-by-side/index.html.in +++ b/demos/side-by-side/index.html.in @@ -34,11 +34,11 @@ Zoom: - double-click, shift+double-click, mouse wheel, +/- keys; shift+drag (DOM only) + double-click, Shift+double-click, mouse wheel, +/- keys; Shift+drag Rotate: - shift+drag (WebGL only) + Alt+drag (WebGL only) Brightness/contrast: diff --git a/src/ol/base/createmap.js b/src/ol/base/createmap.js index c44d275d05..dde61bdeb8 100644 --- a/src/ol/base/createmap.js +++ b/src/ol/base/createmap.js @@ -6,6 +6,7 @@ goog.require('ol.Collection'); goog.require('ol.Map'); goog.require('ol.MapProperty'); goog.require('ol.Projection'); +goog.require('ol.control.AltDragRotate'); goog.require('ol.control.CenterConstraint'); goog.require('ol.control.Constraints'); goog.require('ol.control.DblClickZoom'); @@ -15,7 +16,6 @@ goog.require('ol.control.KeyboardZoom'); goog.require('ol.control.MouseWheelZoom'); goog.require('ol.control.ResolutionConstraint'); goog.require('ol.control.RotationConstraint'); -goog.require('ol.control.ShiftDragRotate'); goog.require('ol.control.ShiftDragZoom'); goog.require('ol.dom'); goog.require('ol.dom.Map'); @@ -89,12 +89,12 @@ ol.createMap = function(target, opt_values, opt_rendererHints) { if (!goog.object.containsKey(values, ol.MapProperty.CONTROLS)) { var controls = new ol.Collection(); + controls.push(new ol.control.AltDragRotate(constraints)); controls.push(new ol.control.DblClickZoom(constraints)); controls.push(new ol.control.DragPan(constraints)); controls.push(new ol.control.KeyboardPan(constraints, 16)); controls.push(new ol.control.KeyboardZoom(constraints)); controls.push(new ol.control.MouseWheelZoom(constraints)); - controls.push(new ol.control.ShiftDragRotate(constraints)); controls.push(new ol.control.ShiftDragZoom(constraints)); values[ol.MapProperty.CONTROLS] = controls; } diff --git a/src/ol/control/shiftdragrotate.js b/src/ol/control/altdragrotate.js similarity index 72% rename from src/ol/control/shiftdragrotate.js rename to src/ol/control/altdragrotate.js index 1d5e8d2b8a..7121af6b39 100644 --- a/src/ol/control/shiftdragrotate.js +++ b/src/ol/control/altdragrotate.js @@ -1,4 +1,4 @@ -goog.provide('ol.control.ShiftDragRotate'); +goog.provide('ol.control.AltDragRotate'); goog.require('ol.MapBrowserEvent'); goog.require('ol.control.Drag'); @@ -10,23 +10,23 @@ goog.require('ol.control.Drag'); * @extends {ol.control.Drag} * @param {ol.control.Constraints} constraints Constraints. */ -ol.control.ShiftDragRotate = function(constraints) { +ol.control.AltDragRotate = function(constraints) { goog.base(this, constraints); }; -goog.inherits(ol.control.ShiftDragRotate, ol.control.Drag); +goog.inherits(ol.control.AltDragRotate, ol.control.Drag); /** * @private * @type {number} */ -ol.control.ShiftDragRotate.prototype.startRotation_; +ol.control.AltDragRotate.prototype.startRotation_; /** * @inheritDoc */ -ol.control.ShiftDragRotate.prototype.handleDrag = function(mapBrowserEvent) { +ol.control.AltDragRotate.prototype.handleDrag = function(mapBrowserEvent) { var browserEvent = mapBrowserEvent.browserEvent; var map = mapBrowserEvent.map; var size = map.getSize(); @@ -40,11 +40,11 @@ ol.control.ShiftDragRotate.prototype.handleDrag = function(mapBrowserEvent) { /** * @inheritDoc */ -ol.control.ShiftDragRotate.prototype.handleDragStart = +ol.control.AltDragRotate.prototype.handleDragStart = function(mapBrowserEvent) { var browserEvent = mapBrowserEvent.browserEvent; var map = mapBrowserEvent.map; - if (map.canRotate() && browserEvent.shiftKey) { + if (map.canRotate() && browserEvent.altKey) { var size = map.getSize(); var theta = Math.atan2( size.height / 2 - browserEvent.offsetY, From 05b6ca05fe69b9d30705660fa3996c053210ecb1 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Tue, 7 Aug 2012 17:46:06 +0200 Subject: [PATCH 474/562] Improve WebGL pixel precision --- src/ol/webgl/tilelayerrenderer.js | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/src/ol/webgl/tilelayerrenderer.js b/src/ol/webgl/tilelayerrenderer.js index a93ac9f8ce..0929c9563c 100644 --- a/src/ol/webgl/tilelayerrenderer.js +++ b/src/ol/webgl/tilelayerrenderer.js @@ -374,8 +374,8 @@ ol.webgl.TileLayerRenderer.prototype.render = function() { var zs = goog.object.getKeys(tilesToDrawByZ); goog.array.sort(zs); var uTileOffset = goog.vec.Vec4.createFloat32(); - goog.array.forEach(zs, function(z) { - goog.object.forEach(tilesToDrawByZ[z], function(tile) { + goog.array.forEach(zs, function(tileZ) { + goog.object.forEach(tilesToDrawByZ[tileZ], function(tile) { var tileExtent = tileGrid.getTileCoordExtent(tile.tileCoord); var sx = 2 * tileExtent.getWidth() / framebufferExtentSize.width; var sy = 2 * tileExtent.getHeight() / framebufferExtentSize.height; @@ -383,10 +383,17 @@ ol.webgl.TileLayerRenderer.prototype.render = function() { framebufferExtentSize.width - 1; var ty = 2 * (tileExtent.minY - framebufferExtent.minY) / framebufferExtentSize.height - 1; + var filter; + if (tileZ == z) { + tx += 0.5 * sx / tileSize.width; + ty += 0.5 * sy / tileSize.height; + filter = goog.webgl.NEAREST; + } else { + filter = goog.webgl.LINEAR; + } goog.vec.Vec4.setFromValues(uTileOffset, sx, sy, tx, ty); gl.uniform4fv(this.locations_.uTileOffset, uTileOffset); - map.bindImageTexture( - tile.getImage(), goog.webgl.LINEAR, goog.webgl.LINEAR); + map.bindImageTexture(tile.getImage(), filter, filter); gl.drawArrays(goog.webgl.TRIANGLE_STRIP, 0, 4); }, this); }, this); @@ -412,8 +419,8 @@ ol.webgl.TileLayerRenderer.prototype.render = function() { 1); } goog.vec.Mat4.translate(this.matrix_, - -0.5, - -0.5, + -0.5 - 0.5 / framebufferDimension, + -0.5 - 0.5 / framebufferDimension, 0); }; From ebe132f7650d185b42c9bd1e68259bbed5b62ef0 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Tue, 7 Aug 2012 17:48:38 +0200 Subject: [PATCH 475/562] Add reset rotation key to side-by-side demo --- demos/side-by-side/index.html.in | 2 +- demos/side-by-side/side-by-side.js | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/demos/side-by-side/index.html.in b/demos/side-by-side/index.html.in index 3abd7841ff..179592c67f 100644 --- a/demos/side-by-side/index.html.in +++ b/demos/side-by-side/index.html.in @@ -38,7 +38,7 @@ Rotate: - Alt+drag (WebGL only) + Alt+drag, r to reset (WebGL only) Brightness/contrast: diff --git a/demos/side-by-side/side-by-side.js b/demos/side-by-side/side-by-side.js index 67b72bc41a..2fcfb7e40c 100644 --- a/demos/side-by-side/side-by-side.js +++ b/demos/side-by-side/side-by-side.js @@ -65,6 +65,9 @@ keyboardControl.addCallback('o', function() { keyboardControl.addCallback('O', function() { layer.setOpacity(layer.getOpacity() + 0.1); }); +keyboardControl.addCallback('r', function() { + webglMap.setRotation(0); +}); keyboardControl.addCallback('s', function() { layer.setSaturation(layer.getSaturation() - 0.1); }); From 6cb362218bd8df352993b325808b1de251eef4de Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Tue, 7 Aug 2012 20:29:12 +0200 Subject: [PATCH 476/562] Add initial simplified API --- .gitignore | 1 + Makefile | 13 ++++- build/ol3-api.json | 9 +++ src/api/api.js | 142 +++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 162 insertions(+), 3 deletions(-) create mode 100644 build/ol3-api.json create mode 100644 src/api/api.js diff --git a/.gitignore b/.gitignore index 889d38a5bd..43ed93388a 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,7 @@ /bin/plovr*.jar /build/OpenLayers.js /build/ol3.js +/build/ol3-api.js /build/ol3-compiled.js /demos/*/advanced-optimizations.* /demos/*/debug.html diff --git a/Makefile b/Makefile index 7157ab6584..bd57db5f09 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,6 @@ PLOVR_JAR=bin/plovr-4b3caf2b7d84.jar SRC = $(shell find externs src/ol -name \*.js) +API = $(shell find src/api -name \*.js) TARGETS = $(shell find demos -name advanced-optimizations.js -o -name simple-optimizations.js) comma := , empty := @@ -9,7 +10,13 @@ space := $(empty) $(empty) all: build demos webgl-debug.js .PHONY: build -build: build/ol3-compiled.js +build: build/ol3-api.js build/ol3-compiled.js + +build/ol3-api.js: $(PLOVR_JAR) $(SRC) base.json \ + build/ol3-api.json src/api/api.js + java -jar $(PLOVR_JAR) build build/ol3-api.json >$@ + @echo $@ "uncompressed:" $$(wc -c <$@) bytes + @echo $@ " compressed:" $$(gzip -9 -c <$@ | wc -c) bytes build/ol3-compiled.js: $(PLOVR_JAR) $(SRC) base.json \ build/ol3.json build/ol3.js @@ -55,11 +62,11 @@ demos/side-by-side/simple-optimizations.js: $(PLOVR_JAR) $(SRC) base.json \ .PHONY: serve serve: $(PLOVR_JAR) - java -jar $(PLOVR_JAR) serve build/ol3.json demos/*/*.json + java -jar $(PLOVR_JAR) serve build/ol3.json build/ol3-api.json demos/*/*.json .PHONY: lint lint: - gjslint --strict --limited_doc_files=$(subst $(space),$(comma),$(shell find externs -name \*.js)) $(SRC) $(filter-out $(TARGETS),$(shell find demos -name \*.js)) + gjslint --strict --limited_doc_files=$(subst $(space),$(comma),$(shell find externs -name \*.js)) $(SRC) $(API) $(filter-out $(TARGETS),$(shell find demos -name \*.js)) webgl-debug.js: curl https://cvs.khronos.org/svn/repos/registry/trunk/public/webgl/sdk/debug/webgl-debug.js > $@ diff --git a/build/ol3-api.json b/build/ol3-api.json new file mode 100644 index 0000000000..f45d301498 --- /dev/null +++ b/build/ol3-api.json @@ -0,0 +1,9 @@ +{ + + "id": "ol3-api", + + "inherits": "../base.json", + + "inputs": "src/api/api.js" + +} diff --git a/src/api/api.js b/src/api/api.js new file mode 100644 index 0000000000..d01d3c23bb --- /dev/null +++ b/src/api/api.js @@ -0,0 +1,142 @@ +goog.provide('ol3'); +goog.provide('ol3.layer'); + +goog.require('goog.dom'); +goog.require('ol.Coordinate'); +goog.require('ol.Layer'); +goog.require('ol.Map'); +goog.require('ol.Projection'); +goog.require('ol.createMap'); +goog.require('ol.layer.OpenStreetMap'); + + +goog.exportSymbol('ol3', ol3); + + +/** + * @typedef {Array.|ol.Coordinate|{x: number, y: number}} + */ +ol3.Coordinate; + + +/** + * @typedef {Array.|ol.Collection} + */ +ol3.Layers; + + +/** + * @typedef {{center: (ol3.Coordinate|undefined), + * layers: (ol3.Layers|undefined), + * renderTo: (Element|string|undefined), + * resolution: (number|undefined), + * zoom: (number|undefined)}} + */ +ol3.MapOptions; + + +/** + * @typedef {ol.Projection|string} + */ +ol3.Projection; + + +/** + * @param {ol3.Coordinate} coordinate Coordinate. + * @return {ol.Coordinate} Coordinate. + */ +ol3.coordinate = function(coordinate) { + if (coordinate instanceof ol.Coordinate) { + return coordinate; + } else if (goog.isArray(coordinate)) { + var array = /** @type {Array.} */ coordinate; + return new ol.Coordinate(array[1], array[0]); + } else if (goog.isObject(coordinate)) { + var object = /** @type {{x: number, y: number}} */ coordinate; + return new ol.Coordinate(object.x, object.y); + } else { + return null; + } +}; +goog.exportProperty(ol3, 'coordinate', ol3.coordinate); + + +goog.exportProperty(ol3, 'layer', ol3.layer); + + +/** + * @return {ol.Layer} Layer. + */ +ol3.layer.osm = function() { + return new ol.layer.OpenStreetMap(); +}; +goog.exportProperty(ol3.layer, 'osm', ol3.layer.osm); + + +/** + * @param {ol3.Layers} layers Layers. + * @return {ol.Collection} Layers. + */ +ol3.layers = function(layers) { + if (layers instanceof ol.Collection) { + return layers; + } else if (goog.isArray(layers)) { + return new ol.Collection(layers); + } else { + return null; + } +}; +goog.exportProperty(ol3, 'layers', ol3.layers); + + +/** + * @param {ol3.MapOptions=} opt_mapOptions Options. + * @return {ol.Map} Map. + */ +ol3.map = function(opt_mapOptions) { + var options = opt_mapOptions || {}; + var center = ol3.coordinate(/** @type {ol3.Coordinate} */ + (goog.object.get(options, 'center', null))); + var layers = ol3.layers(/** @type {ol3.Layers} */ + (goog.object.get(options, 'layers', null))); + var projection = ol3.projection(/** @type {ol3.Projection} */ + (goog.object.get(options, 'projection', 'EPSG:3857'))); + var resolution = /** @type {number|undefined} */ + goog.object.get(options, 'resolution'); + if (!goog.isDef(resolution) && goog.object.containsKey(options, 'zoom')) { + var zoom = /** @type {number} */ goog.object.get(options, 'zoom'); + resolution = ol.Projection.EPSG_3857_HALF_SIZE / (128 << zoom); + } + var target = goog.dom.getElement(/** @type {Element|string} */ + (goog.object.get(options, 'renderTo', 'map'))); + var userProjection = ol3.projection(/** @type {ol3.Projection} */ + (goog.object.get(options, 'userProjection', 'EPSG:4326'))); + var map = ol.createMap(target, { + 'layers': layers, + 'projection': projection, + 'resolution': resolution, + 'userProjection': userProjection + }); + if (!goog.isNull(center)) { + map.setUserCenter(center); + } + return map; +}; +goog.exportProperty(ol3, 'map', ol3.map); + + +/** + * @param {ol3.Projection} projection Projection. + * @return {ol.Projection} Projection. + */ +ol3.projection = function(projection) { + if (projection instanceof ol.Projection) { + return projection; + } else if (goog.isString(projection)) { + var code = /** @type {string} */ projection; + return ol.Projection.getFromCode(code); + } else { + return null; + } +}; +goog.exportProperty(ol3, 'projection', ol3.projection); From 5062b71b3c602982ac8ac79700398e60862523f6 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Tue, 7 Aug 2012 20:31:09 +0200 Subject: [PATCH 477/562] Add simplified API demo --- .gitignore | 1 + Makefile | 14 +++++++++++++- demos/api1/api1.js | 6 ++++++ demos/api1/index.html.in | 19 +++++++++++++++++++ 4 files changed, 39 insertions(+), 1 deletion(-) create mode 100644 demos/api1/api1.js create mode 100644 demos/api1/index.html.in diff --git a/.gitignore b/.gitignore index 43ed93388a..c824840200 100644 --- a/.gitignore +++ b/.gitignore @@ -5,6 +5,7 @@ /build/ol3-api.js /build/ol3-compiled.js /demos/*/advanced-optimizations.* +/demos/*/build.html /demos/*/debug.html /demos/*/simple-optimizations.* /doc/apidocs/ diff --git a/Makefile b/Makefile index bd57db5f09..a541419f9a 100644 --- a/Makefile +++ b/Makefile @@ -28,7 +28,19 @@ build/ol3.js: $(SRC) ( echo "goog.require('goog.dom');" ; find src/ol -name \*.js | xargs grep -rh ^goog.provide | sort | uniq | sed -e 's/provide/require/g' ) > $@ .PHONY: demos -demos: demos/side-by-side +demos: demos/api1 demos/side-by-side + +.PHONY: demos/api1 +demos/api1: \ + build/ol3-api.js \ + demos/api1/build.html \ + demos/api1/debug.html + +demos/api1/build.html: demos/api1/index.html.in + sed -e 's|@SRC@|../../build/ol3-api.js|' $< > $@ + +demos/api1/debug.html: demos/api1/index.html.in + sed -e 's|@SRC@|http://localhost:9810/compile?id=ol3-api|' $< > $@ .PHONY: demos/side-by-side demos/side-by-side: \ diff --git a/demos/api1/api1.js b/demos/api1/api1.js new file mode 100644 index 0000000000..0e3259e5fd --- /dev/null +++ b/demos/api1/api1.js @@ -0,0 +1,6 @@ +var map = ol3.map({ + renderTo: 'map', + layers: [ol3.layer.osm()], + center: [45, 5], + zoom: 10 +}); diff --git a/demos/api1/index.html.in b/demos/api1/index.html.in new file mode 100644 index 0000000000..c2b0b0fa81 --- /dev/null +++ b/demos/api1/index.html.in @@ -0,0 +1,19 @@ + + + + + + ol3 api1 demo + + +

ol3 api1 demo

+
+ + + From 21cb524a5348dd778c09b124b3be3e4ca45479ba Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Wed, 8 Aug 2012 00:37:25 +0200 Subject: [PATCH 478/562] Better clean up in Makefile --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index a541419f9a..8d16a252f2 100644 --- a/Makefile +++ b/Makefile @@ -89,8 +89,8 @@ $(PLOVR_JAR): clean: rm -f build/all.js rm -f build/ol3.js + rm -f demos/*/*.html rm -f demos/*/advanced-optimizations.* - rm -f demos/*/debug.html rm -f demos/*/simple-optimizations.* reallyclean: clean From 4aa7745de571baa2faa1148e068cdbb058c916d3 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Wed, 8 Aug 2012 00:37:41 +0200 Subject: [PATCH 479/562] Enable Proj4js externs --- base.json | 1 + 1 file changed, 1 insertion(+) diff --git a/base.json b/base.json index 142140ce81..e4d98e1efa 100644 --- a/base.json +++ b/base.json @@ -21,6 +21,7 @@ "externs": [ "externs/bingmaps.js", + "externs/proj4js.js", "externs/tilejson.js", "externs/webgl-debug.js" ], From 6bab81ffe7e2e6fb64a7a494dfdebd90b6c71cce Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Wed, 8 Aug 2012 00:38:06 +0200 Subject: [PATCH 480/562] Add Proj4js support --- .gitignore | 1 + src/ol/base/projection.js | 138 +++++++++++++++++++++++++++++++++++--- 2 files changed, 130 insertions(+), 9 deletions(-) diff --git a/.gitignore b/.gitignore index c824840200..d57aa6b00d 100644 --- a/.gitignore +++ b/.gitignore @@ -12,6 +12,7 @@ /examples/example-list.js /examples/example-list.xml /jsdoc/ +/proj4js-combined.js /tools/*.pyc /tools/closure-compiler.jar /webgl-debug.js diff --git a/src/ol/base/projection.js b/src/ol/base/projection.js index 66e1f24424..306e9a8cef 100644 --- a/src/ol/base/projection.js +++ b/src/ol/base/projection.js @@ -8,6 +8,12 @@ goog.require('ol.Extent'); goog.require('ol.TransformFunction'); +/** + * @define {boolean} Enable Proj4js. + */ +ol.ENABLE_PROJ4JS = true; + + /** * @enum {string} */ @@ -71,6 +77,44 @@ ol.Projection.prototype.getUnits = function() { }; + +/** + * @constructor + * @extends {ol.Projection} + * @param {string} code Code. + * @param {Proj4js.Proj} proj4jsProj Proj4js projection. + */ +ol.Proj4jsProjection = function(code, proj4jsProj) { + + var units = /** @type {ol.ProjectionUnits} */ proj4jsProj.units; + + goog.base(this, code, units, null); + + /** + * @private + * @type {Proj4js.Proj} + */ + this.proj4jsProj_ = proj4jsProj; + +}; +goog.inherits(ol.Proj4jsProjection, ol.Projection); + + +/** + * @return {Proj4js.Proj} Proj4js projection. + */ +ol.Proj4jsProjection.prototype.getProj4jsProj = function() { + return this.proj4jsProj_; +}; + + +/** + * @private + * @type {Object.} + */ +ol.Projection.proj4jsProjections_ = {}; + + /** * @private * @type {Object.} @@ -116,6 +160,17 @@ ol.Projection.addEquivalentTransforms = }; +/** + * @param {ol.Proj4jsProjection} proj4jsProjection Proj4js projection. + */ +ol.Projection.addProj4jsProjection = function(proj4jsProjection) { + var proj4jsProjections = ol.Projection.proj4jsProjections_; + var code = proj4jsProjection.getCode(); + goog.asserts.assert(!goog.object.containsKey(proj4jsProjections, code)); + proj4jsProjections[code] = proj4jsProjection; +}; + + /** * @param {ol.Projection} projection Projection. */ @@ -145,9 +200,7 @@ ol.Projection.addProjections = function(projections) { ol.Projection.addTransform = function(source, destination, transformFn) { var projections = ol.Projection.projections_; var sourceCode = source.getCode(); - goog.asserts.assert(goog.object.containsKey(projections, sourceCode)); var destinationCode = destination.getCode(); - goog.asserts.assert(goog.object.containsKey(projections, destinationCode)); var transforms = ol.Projection.transforms_; if (!goog.object.containsKey(transforms, sourceCode)) { transforms[sourceCode] = {}; @@ -163,9 +216,32 @@ ol.Projection.addTransform = function(source, destination, transformFn) { * @return {ol.Projection} Projection. */ ol.Projection.getFromCode = function(code) { - var projections = ol.Projection.projections_; - goog.asserts.assert(goog.object.containsKey(projections, code)); - return projections[code]; + var projection = ol.Projection.projections_[code]; + if (ol.Projection.isProj4jsSupported() && !goog.isDef(projection)) { + projection = ol.Projection.getProj4jsProjectionFromCode_(code); + } + if (!goog.isDef(projection)) { + goog.asserts.assert(goog.isDef(projection)); + projection = null; + } + return projection; +}; + + +/** + * @param {string} code Code. + * @private + * @return {ol.Proj4jsProjection} Proj4js projection. + */ +ol.Projection.getProj4jsProjectionFromCode_ = function(code) { + var proj4jsProjections = ol.Projection.proj4jsProjections_; + var proj4jsProjection = proj4jsProjections[code]; + if (!goog.isDef(proj4jsProjection)) { + var proj4jsProj = new Proj4js.Proj(code); + proj4jsProjection = new ol.Proj4jsProjection(code, proj4jsProj); + proj4jsProjections[code] = proj4jsProjection; + } + return proj4jsProjection; }; @@ -195,10 +271,46 @@ ol.Projection.getTransform = function(source, destination) { var transforms = ol.Projection.transforms_; var sourceCode = source.getCode(); var destinationCode = destination.getCode(); - goog.asserts.assert(goog.object.containsKey(transforms, sourceCode)); - goog.asserts.assert( - goog.object.containsKey(transforms[sourceCode], destinationCode)); - return transforms[sourceCode][destinationCode]; + var transform; + if (goog.object.containsKey(transforms, sourceCode) && + goog.object.containsKey(transforms[sourceCode], destinationCode)) { + transform = transforms[sourceCode][destinationCode]; + } + if (ol.Projection.isProj4jsSupported() && !goog.isDef(transform)) { + var proj4jsSource; + if (source instanceof ol.Proj4jsProjection) { + proj4jsSource = source; + } else { + proj4jsSource = + ol.Projection.getProj4jsProjectionFromCode_(source.getCode()); + } + var sourceProj4jsProj = proj4jsSource.getProj4jsProj(); + var proj4jsDestination; + if (destination instanceof ol.Proj4jsProjection) { + proj4jsDestination = destination; + } else { + proj4jsDestination = + ol.Projection.getProj4jsProjectionFromCode_(source.getCode()); + } + var destinationProj4jsProj = proj4jsDestination.getProj4jsProj(); + transform = + /** + * @param {ol.Coordinate} coordinate Coordinate. + * @return {ol.Coordinate} Coordinate. + */ + function(coordinate) { + var proj4jsPoint = new Proj4js.Point(coordinate.x, coordinate.y); + proj4jsPoint = Proj4js.transform( + sourceProj4jsProj, destinationProj4jsProj, proj4jsPoint); + return new ol.Coordinate(proj4jsPoint.x, proj4jsPoint.y); + }; + ol.Projection.addTransform(source, destination, transform); + } + if (!goog.isDef(transform)) { + goog.asserts.assert(goog.isDef(transform)); + transform = ol.Projection.identityTransform; + } + return transform; }; @@ -214,6 +326,14 @@ ol.Projection.getTransformFromCodes = function(sourceCode, destinationCode) { }; +/** + * @return {boolean} Has Proj4js. + */ +ol.Projection.isProj4jsSupported = function() { + return ol.ENABLE_PROJ4JS && 'Proj4js' in goog.global; +}; + + /** * @param {ol.Coordinate} point Point. * @return {ol.Coordinate} Point. From e78986c95427af5b048ad68f40386d669b0e38de Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Wed, 8 Aug 2012 00:38:33 +0200 Subject: [PATCH 481/562] Add Proj4js demo --- Makefile | 14 +++++++++++++- demos/proj4js/index.html.in | 13 +++++++++++++ demos/proj4js/proj4js.js | 23 +++++++++++++++++++++++ 3 files changed, 49 insertions(+), 1 deletion(-) create mode 100644 demos/proj4js/index.html.in create mode 100644 demos/proj4js/proj4js.js diff --git a/Makefile b/Makefile index 8d16a252f2..000889bc29 100644 --- a/Makefile +++ b/Makefile @@ -28,7 +28,7 @@ build/ol3.js: $(SRC) ( echo "goog.require('goog.dom');" ; find src/ol -name \*.js | xargs grep -rh ^goog.provide | sort | uniq | sed -e 's/provide/require/g' ) > $@ .PHONY: demos -demos: demos/api1 demos/side-by-side +demos: demos/api1 demos/proj4js demos/side-by-side .PHONY: demos/api1 demos/api1: \ @@ -42,6 +42,18 @@ demos/api1/build.html: demos/api1/index.html.in demos/api1/debug.html: demos/api1/index.html.in sed -e 's|@SRC@|http://localhost:9810/compile?id=ol3-api|' $< > $@ +.PHONY: demos/proj4js +demos/proj4js: \ + build/ol3-api.js \ + demos/proj4js/build.html \ + demos/proj4js/debug.html + +demos/proj4js/build.html: demos/proj4js/index.html.in + sed -e 's|@SRC@|../../build/ol3-api.js|' $< > $@ + +demos/proj4js/debug.html: demos/proj4js/index.html.in + sed -e 's|@SRC@|http://localhost:9810/compile?id=ol3-api|' $< > $@ + .PHONY: demos/side-by-side demos/side-by-side: \ demos/side-by-side/advanced-optimizations.html \ diff --git a/demos/proj4js/index.html.in b/demos/proj4js/index.html.in new file mode 100644 index 0000000000..5239fee524 --- /dev/null +++ b/demos/proj4js/index.html.in @@ -0,0 +1,13 @@ + + + + + + ol3 proj4js demo + + +

ol3 proj4js demo

+
+ + + diff --git a/demos/proj4js/proj4js.js b/demos/proj4js/proj4js.js new file mode 100644 index 0000000000..1325dbb16a --- /dev/null +++ b/demos/proj4js/proj4js.js @@ -0,0 +1,23 @@ +goog.require('goog.dom'); +goog.require('ol.Coordinate'); +goog.require('ol.Projection'); + + +var outputElement = document.getElementById('output'), p; + +var point, transformedPoint; + +point = new ol.Coordinate(-626172.13571216376, 6887893.4928337997); +transformedPoint = ol.Projection.transformWithCodes( + point, 'GOOGLE', 'WGS84'); +outputElement.appendChild(goog.dom.createTextNode(transformedPoint.toString())); + +Proj4js.defs['EPSG:21781'] = + '+proj=somerc +lat_0=46.95240555555556 +lon_0=7.439583333333333 +k_0=1 ' + + '+x_0=600000 +y_0=200000 +ellps=bessel ' + + '+towgs84=674.374,15.056,405.346,0,0,0,0 +units=m +no_defs'; + +point = new ol.Coordinate(7.439583333333333, 46.95240555555556); +transformedPoint = ol.Projection.transformWithCodes( + point, 'EPSG:4326', 'EPSG:21781'); +outputElement.appendChild(goog.dom.createTextNode(transformedPoint.toString())); From 7ed5f42fb9ab630ede72c26cf544d2af0566ca51 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Wed, 8 Aug 2012 00:42:57 +0200 Subject: [PATCH 482/562] Make some projection functions private, for now --- src/ol/base/projection.js | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/ol/base/projection.js b/src/ol/base/projection.js index 306e9a8cef..b994e73b89 100644 --- a/src/ol/base/projection.js +++ b/src/ol/base/projection.js @@ -131,8 +131,9 @@ ol.Projection.transforms_ = {}; /** * @param {Array.} projections Projections. + * @private */ -ol.Projection.addEquivalentProjections = function(projections) { +ol.Projection.addEquivalentProjections_ = function(projections) { ol.Projection.addProjections(projections); goog.array.forEach(projections, function(source) { goog.array.forEach(projections, function(destination) { @@ -148,8 +149,9 @@ ol.Projection.addEquivalentProjections = function(projections) { * @param {Array.} projections2 Projections. * @param {ol.TransformFunction} forwardTransform Forward transform. * @param {ol.TransformFunction} inverseTransform Inverse transform. + * @private */ -ol.Projection.addEquivalentTransforms = +ol.Projection.addEquivalentTransforms_ = function(projections1, projections2, forwardTransform, inverseTransform) { goog.array.forEach(projections1, function(projection1) { goog.array.forEach(projections2, function(projection2) { @@ -483,11 +485,11 @@ ol.Projection.EPSG_4326_LIKE_PROJECTIONS = goog.array.map( }); -ol.Projection.addEquivalentProjections( +ol.Projection.addEquivalentProjections_( ol.Projection.EPSG_3857_LIKE_PROJECTIONS); -ol.Projection.addEquivalentProjections( +ol.Projection.addEquivalentProjections_( ol.Projection.EPSG_4326_LIKE_PROJECTIONS); -ol.Projection.addEquivalentTransforms( +ol.Projection.addEquivalentTransforms_( ol.Projection.EPSG_4326_LIKE_PROJECTIONS, ol.Projection.EPSG_3857_LIKE_PROJECTIONS, ol.Projection.forwardSphericalMercator, From 35cf4db8cf67c586229aa831278bc1bf615b8c92 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Wed, 8 Aug 2012 01:20:57 +0200 Subject: [PATCH 483/562] Remove stray variable --- demos/proj4js/proj4js.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/demos/proj4js/proj4js.js b/demos/proj4js/proj4js.js index 1325dbb16a..d9b73f3c79 100644 --- a/demos/proj4js/proj4js.js +++ b/demos/proj4js/proj4js.js @@ -3,7 +3,7 @@ goog.require('ol.Coordinate'); goog.require('ol.Projection'); -var outputElement = document.getElementById('output'), p; +var outputElement = document.getElementById('output'); var point, transformedPoint; From e434695082a6e49bece13906d0ff506c5c04978a Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Wed, 8 Aug 2012 01:27:05 +0200 Subject: [PATCH 484/562] Make more projection constants private --- src/ol/base/projection.js | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/src/ol/base/projection.js b/src/ol/base/projection.js index b994e73b89..86f1998542 100644 --- a/src/ol/base/projection.js +++ b/src/ol/base/projection.js @@ -430,9 +430,10 @@ ol.Projection.EPSG_3857_EXTENT = new ol.Extent( /** + * @private * @type {Array.} */ -ol.Projection.EPSG_3857_LIKE_CODES = [ +ol.Projection.EPSG_3857_LIKE_CODES_ = [ 'EPSG:3857', 'EPSG:102113', 'EPSG:102100', @@ -442,10 +443,11 @@ ol.Projection.EPSG_3857_LIKE_CODES = [ /** * @const + * @private * @type {Array.} */ -ol.Projection.EPSG_3857_LIKE_PROJECTIONS = goog.array.map( - ol.Projection.EPSG_3857_LIKE_CODES, +ol.Projection.EPSG_3857_LIKE_PROJECTIONS_ = goog.array.map( + ol.Projection.EPSG_3857_LIKE_CODES_, function(code) { return new ol.Projection( code, @@ -456,15 +458,17 @@ ol.Projection.EPSG_3857_LIKE_PROJECTIONS = goog.array.map( /** * @const + * @private * @type {ol.Extent} */ -ol.Projection.EPSG_4326_EXTENT = new ol.Extent(-180, -90, 180, 90); +ol.Projection.EPSG_4326_EXTENT_ = new ol.Extent(-180, -90, 180, 90); /** + * @private * @type {Array.} */ -ol.Projection.EPSG_4326_LIKE_CODES = [ +ol.Projection.EPSG_4326_LIKE_CODES_ = [ 'EPSG:4326', 'CRS:84', 'urn:ogc:def:crs:EPSG:6.6:4326' @@ -476,21 +480,21 @@ ol.Projection.EPSG_4326_LIKE_CODES = [ * @type {Array.} */ ol.Projection.EPSG_4326_LIKE_PROJECTIONS = goog.array.map( - ol.Projection.EPSG_4326_LIKE_CODES, + ol.Projection.EPSG_4326_LIKE_CODES_, function(code) { return new ol.Projection( code, ol.ProjectionUnits.DEGREES, - ol.Projection.EPSG_4326_EXTENT); + ol.Projection.EPSG_4326_EXTENT_); }); ol.Projection.addEquivalentProjections_( - ol.Projection.EPSG_3857_LIKE_PROJECTIONS); + ol.Projection.EPSG_3857_LIKE_PROJECTIONS_); ol.Projection.addEquivalentProjections_( ol.Projection.EPSG_4326_LIKE_PROJECTIONS); ol.Projection.addEquivalentTransforms_( ol.Projection.EPSG_4326_LIKE_PROJECTIONS, - ol.Projection.EPSG_3857_LIKE_PROJECTIONS, + ol.Projection.EPSG_3857_LIKE_PROJECTIONS_, ol.Projection.forwardSphericalMercator, ol.Projection.inverseSphericalMercator); From ad2061ae5c91ac04077d9b2fbec68c9d53830f84 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Wed, 8 Aug 2012 11:53:23 +0200 Subject: [PATCH 485/562] Sort projections --- src/ol/base/projection.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ol/base/projection.js b/src/ol/base/projection.js index 86f1998542..5a88da9603 100644 --- a/src/ol/base/projection.js +++ b/src/ol/base/projection.js @@ -435,8 +435,8 @@ ol.Projection.EPSG_3857_EXTENT = new ol.Extent( */ ol.Projection.EPSG_3857_LIKE_CODES_ = [ 'EPSG:3857', - 'EPSG:102113', 'EPSG:102100', + 'EPSG:102113', 'EPSG:900913' ]; @@ -469,8 +469,8 @@ ol.Projection.EPSG_4326_EXTENT_ = new ol.Extent(-180, -90, 180, 90); * @type {Array.} */ ol.Projection.EPSG_4326_LIKE_CODES_ = [ - 'EPSG:4326', 'CRS:84', + 'EPSG:4326', 'urn:ogc:def:crs:EPSG:6.6:4326' ]; From b2da697519abddab999663f2d64c6536f188fb7f Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Wed, 8 Aug 2012 15:30:41 +0200 Subject: [PATCH 486/562] Revert "Improve WebGL pixel precision" This reverts commit 05b6ca05fe69b9d30705660fa3996c053210ecb1. --- src/ol/webgl/tilelayerrenderer.js | 19 ++++++------------- 1 file changed, 6 insertions(+), 13 deletions(-) diff --git a/src/ol/webgl/tilelayerrenderer.js b/src/ol/webgl/tilelayerrenderer.js index 0929c9563c..a93ac9f8ce 100644 --- a/src/ol/webgl/tilelayerrenderer.js +++ b/src/ol/webgl/tilelayerrenderer.js @@ -374,8 +374,8 @@ ol.webgl.TileLayerRenderer.prototype.render = function() { var zs = goog.object.getKeys(tilesToDrawByZ); goog.array.sort(zs); var uTileOffset = goog.vec.Vec4.createFloat32(); - goog.array.forEach(zs, function(tileZ) { - goog.object.forEach(tilesToDrawByZ[tileZ], function(tile) { + goog.array.forEach(zs, function(z) { + goog.object.forEach(tilesToDrawByZ[z], function(tile) { var tileExtent = tileGrid.getTileCoordExtent(tile.tileCoord); var sx = 2 * tileExtent.getWidth() / framebufferExtentSize.width; var sy = 2 * tileExtent.getHeight() / framebufferExtentSize.height; @@ -383,17 +383,10 @@ ol.webgl.TileLayerRenderer.prototype.render = function() { framebufferExtentSize.width - 1; var ty = 2 * (tileExtent.minY - framebufferExtent.minY) / framebufferExtentSize.height - 1; - var filter; - if (tileZ == z) { - tx += 0.5 * sx / tileSize.width; - ty += 0.5 * sy / tileSize.height; - filter = goog.webgl.NEAREST; - } else { - filter = goog.webgl.LINEAR; - } goog.vec.Vec4.setFromValues(uTileOffset, sx, sy, tx, ty); gl.uniform4fv(this.locations_.uTileOffset, uTileOffset); - map.bindImageTexture(tile.getImage(), filter, filter); + map.bindImageTexture( + tile.getImage(), goog.webgl.LINEAR, goog.webgl.LINEAR); gl.drawArrays(goog.webgl.TRIANGLE_STRIP, 0, 4); }, this); }, this); @@ -419,8 +412,8 @@ ol.webgl.TileLayerRenderer.prototype.render = function() { 1); } goog.vec.Mat4.translate(this.matrix_, - -0.5 - 0.5 / framebufferDimension, - -0.5 - 0.5 / framebufferDimension, + -0.5, + -0.5, 0); }; From 208db33bfc74a0ef1289c275c63f16f2b94b11ef Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Mon, 13 Aug 2012 15:12:02 +0200 Subject: [PATCH 487/562] s/Control/Interaction/, thanks @elemoine --- demos/side-by-side/side-by-side.js | 32 +++++------ src/ol/base/createmap.js | 53 ++++++++++--------- src/ol/base/map.js | 47 ++++++++-------- src/ol/control/constraints.js | 35 ------------ .../{control => interaction}/altdragrotate.js | 18 +++---- .../centerconstraint.js | 11 ++-- src/ol/interaction/constraints.js | 36 +++++++++++++ .../{control => interaction}/dblclickzoom.js | 16 +++--- src/ol/{control => interaction}/drag.js | 23 ++++---- src/ol/{control => interaction}/dragpan.js | 18 +++---- .../control.js => interaction/interaction.js} | 22 ++++---- src/ol/{control => interaction}/keyboard.js | 14 ++--- .../{control => interaction}/keyboardpan.js | 16 +++--- .../{control => interaction}/keyboardzoom.js | 16 +++--- .../mousewheelzoom.js | 14 ++--- .../resolutionconstraint.js | 18 +++---- .../resolutionconstraint_test.js | 22 ++++---- .../rotationconstraint.js | 12 ++--- .../shiftdragrotateandzoom.js | 22 ++++---- .../{control => interaction}/shiftdragzoom.js | 20 +++---- 20 files changed, 236 insertions(+), 229 deletions(-) delete mode 100644 src/ol/control/constraints.js rename src/ol/{control => interaction}/altdragrotate.js (65%) rename src/ol/{control => interaction}/centerconstraint.js (78%) create mode 100644 src/ol/interaction/constraints.js rename src/ol/{control => interaction}/dblclickzoom.js (58%) rename src/ol/{control => interaction}/drag.js (79%) rename src/ol/{control => interaction}/dragpan.js (55%) rename src/ol/{control/control.js => interaction/interaction.js} (78%) rename src/ol/{control => interaction}/keyboard.js (70%) rename src/ol/{control => interaction}/keyboardpan.js (78%) rename src/ol/{control => interaction}/keyboardzoom.js (65%) rename src/ol/{control => interaction}/mousewheelzoom.js (71%) rename src/ol/{control => interaction}/resolutionconstraint.js (75%) rename src/ol/{control => interaction}/resolutionconstraint_test.js (88%) rename src/ol/{control => interaction}/rotationconstraint.js (62%) rename src/ol/{control => interaction}/shiftdragrotateandzoom.js (69%) rename src/ol/{control => interaction}/shiftdragzoom.js (63%) diff --git a/demos/side-by-side/side-by-side.js b/demos/side-by-side/side-by-side.js index 2fcfb7e40c..cf15deb693 100644 --- a/demos/side-by-side/side-by-side.js +++ b/demos/side-by-side/side-by-side.js @@ -1,6 +1,6 @@ goog.require('ol.RendererHint'); -goog.require('ol.control.Keyboard'); goog.require('ol.createMap'); +goog.require('ol.interaction.Keyboard'); goog.require('ol.layer.MapQuestOpenAerial'); goog.require('ol.view.Attribution'); @@ -32,8 +32,8 @@ var attributionView = new ol.view.Attribution(domMap); document.getElementById('attribution').appendChild( attributionView.getElement()); -var keyboardControl = new ol.control.Keyboard(); -keyboardControl.addCallback('0', function() { +var keyboardInteraction = new ol.interaction.Keyboard(); +keyboardInteraction.addCallback('0', function() { layer.setBrightness(0); layer.setContrast(0); layer.setHue(0); @@ -41,43 +41,43 @@ keyboardControl.addCallback('0', function() { layer.setOpacity(1); layer.setVisible(true); }); -keyboardControl.addCallback('b', function() { +keyboardInteraction.addCallback('b', function() { layer.setBrightness(layer.getBrightness() - 0.1); }); -keyboardControl.addCallback('B', function() { +keyboardInteraction.addCallback('B', function() { layer.setBrightness(layer.getBrightness() + 0.1); }); -keyboardControl.addCallback('c', function() { +keyboardInteraction.addCallback('c', function() { layer.setContrast(layer.getContrast() - 0.1); }); -keyboardControl.addCallback('C', function() { +keyboardInteraction.addCallback('C', function() { layer.setContrast(layer.getContrast() + 0.1); }); -keyboardControl.addCallback('h', function() { +keyboardInteraction.addCallback('h', function() { layer.setHue(layer.getHue() - 0.1); }); -keyboardControl.addCallback('H', function() { +keyboardInteraction.addCallback('H', function() { layer.setHue(layer.getHue() + 0.1); }); -keyboardControl.addCallback('o', function() { +keyboardInteraction.addCallback('o', function() { layer.setOpacity(layer.getOpacity() - 0.1); }); -keyboardControl.addCallback('O', function() { +keyboardInteraction.addCallback('O', function() { layer.setOpacity(layer.getOpacity() + 0.1); }); -keyboardControl.addCallback('r', function() { +keyboardInteraction.addCallback('r', function() { webglMap.setRotation(0); }); -keyboardControl.addCallback('s', function() { +keyboardInteraction.addCallback('s', function() { layer.setSaturation(layer.getSaturation() - 0.1); }); -keyboardControl.addCallback('S', function() { +keyboardInteraction.addCallback('S', function() { layer.setSaturation(layer.getSaturation() + 0.1); }); -keyboardControl.addCallback('vV', function() { +keyboardInteraction.addCallback('vV', function() { layer.setVisible(!layer.getVisible()); }); -domMap.getControls().push(keyboardControl); +domMap.getInteractions().push(keyboardInteraction); goog.exportSymbol('layer', layer); goog.exportSymbol('layers', layers); diff --git a/src/ol/base/createmap.js b/src/ol/base/createmap.js index dde61bdeb8..e0d90a3c66 100644 --- a/src/ol/base/createmap.js +++ b/src/ol/base/createmap.js @@ -6,19 +6,19 @@ goog.require('ol.Collection'); goog.require('ol.Map'); goog.require('ol.MapProperty'); goog.require('ol.Projection'); -goog.require('ol.control.AltDragRotate'); -goog.require('ol.control.CenterConstraint'); -goog.require('ol.control.Constraints'); -goog.require('ol.control.DblClickZoom'); -goog.require('ol.control.DragPan'); -goog.require('ol.control.KeyboardPan'); -goog.require('ol.control.KeyboardZoom'); -goog.require('ol.control.MouseWheelZoom'); -goog.require('ol.control.ResolutionConstraint'); -goog.require('ol.control.RotationConstraint'); -goog.require('ol.control.ShiftDragZoom'); goog.require('ol.dom'); goog.require('ol.dom.Map'); +goog.require('ol.interaction.AltDragRotate'); +goog.require('ol.interaction.CenterConstraint'); +goog.require('ol.interaction.Constraints'); +goog.require('ol.interaction.DblClickZoom'); +goog.require('ol.interaction.DragPan'); +goog.require('ol.interaction.KeyboardPan'); +goog.require('ol.interaction.KeyboardZoom'); +goog.require('ol.interaction.MouseWheelZoom'); +goog.require('ol.interaction.ResolutionConstraint'); +goog.require('ol.interaction.RotationConstraint'); +goog.require('ol.interaction.ShiftDragZoom'); goog.require('ol.webgl'); goog.require('ol.webgl.Map'); @@ -80,23 +80,24 @@ ol.createMap = function(target, opt_values, opt_rendererHints) { } // FIXME this should be a configuration option - var centerConstraint = ol.control.CenterConstraint.snapToPixel; - var resolutionConstraint = ol.control.ResolutionConstraint.createSnapToPower( - Math.exp(Math.log(2) / 8), ol.Projection.EPSG_3857_HALF_SIZE / 128); - var rotationConstraint = ol.control.RotationConstraint.none; - var constraints = new ol.control.Constraints( + var centerConstraint = ol.interaction.CenterConstraint.snapToPixel; + var resolutionConstraint = + ol.interaction.ResolutionConstraint.createSnapToPower( + Math.exp(Math.log(2) / 8), ol.Projection.EPSG_3857_HALF_SIZE / 128); + var rotationConstraint = ol.interaction.RotationConstraint.none; + var constraints = new ol.interaction.Constraints( centerConstraint, resolutionConstraint, rotationConstraint); - if (!goog.object.containsKey(values, ol.MapProperty.CONTROLS)) { - var controls = new ol.Collection(); - controls.push(new ol.control.AltDragRotate(constraints)); - controls.push(new ol.control.DblClickZoom(constraints)); - controls.push(new ol.control.DragPan(constraints)); - controls.push(new ol.control.KeyboardPan(constraints, 16)); - controls.push(new ol.control.KeyboardZoom(constraints)); - controls.push(new ol.control.MouseWheelZoom(constraints)); - controls.push(new ol.control.ShiftDragZoom(constraints)); - values[ol.MapProperty.CONTROLS] = controls; + if (!goog.object.containsKey(values, ol.MapProperty.INTERACTIONS)) { + var interactions = new ol.Collection(); + interactions.push(new ol.interaction.AltDragRotate(constraints)); + interactions.push(new ol.interaction.DblClickZoom(constraints)); + interactions.push(new ol.interaction.DragPan(constraints)); + interactions.push(new ol.interaction.KeyboardPan(constraints, 16)); + interactions.push(new ol.interaction.KeyboardZoom(constraints)); + interactions.push(new ol.interaction.MouseWheelZoom(constraints)); + interactions.push(new ol.interaction.ShiftDragZoom(constraints)); + values[ol.MapProperty.INTERACTIONS] = interactions; } if (!goog.object.containsKey(values, ol.MapProperty.LAYERS)) { diff --git a/src/ol/base/map.js b/src/ol/base/map.js index ad53eb213a..4e7ab7aa0a 100644 --- a/src/ol/base/map.js +++ b/src/ol/base/map.js @@ -30,9 +30,9 @@ goog.require('goog.object'); goog.require('goog.vec.Mat4'); goog.require('ol.Collection'); goog.require('ol.Color'); -goog.require('ol.Control'); goog.require('ol.Coordinate'); goog.require('ol.Extent'); +goog.require('ol.Interaction'); goog.require('ol.LayerRenderer'); goog.require('ol.MapBrowserEvent'); goog.require('ol.Object'); @@ -48,7 +48,7 @@ goog.require('ol.TransformFunction'); ol.MapProperty = { BACKGROUND_COLOR: 'backgroundColor', CENTER: 'center', - CONTROLS: 'controls', + INTERACTIONS: 'interactions', LAYERS: 'layers', PROJECTION: 'projection', RESOLUTION: 'resolution', @@ -349,18 +349,6 @@ goog.exportProperty( ol.Map.prototype.getCenter); -/** - * @return {ol.Collection} Controls. - */ -ol.Map.prototype.getControls = function() { - return /** @type {ol.Collection} */ this.get(ol.MapProperty.CONTROLS); -}; -goog.exportProperty( - ol.Map.prototype, - 'getControls', - ol.Map.prototype.getControls); - - /** * @param {ol.Pixel} pixel Pixel. * @return {ol.Coordinate|undefined} Coordinate. @@ -396,6 +384,18 @@ ol.Map.prototype.getExtent = function() { }; +/** + * @return {ol.Collection} Interactions. + */ +ol.Map.prototype.getInteractions = function() { + return /** @type {ol.Collection} */ this.get(ol.MapProperty.INTERACTIONS); +}; +goog.exportProperty( + ol.Map.prototype, + 'getInteractions', + ol.Map.prototype.getInteractions); + + /** * @param {ol.Layer} layer Layer. * @protected @@ -581,10 +581,11 @@ ol.Map.prototype.handleBackgroundColorChanged = goog.nullFunction; ol.Map.prototype.handleBrowserEvent = function(browserEvent, opt_type) { var type = opt_type || browserEvent.type; var mapBrowserEvent = new ol.MapBrowserEvent(type, this, browserEvent); - var controls = this.getControls(); - var controlsArray = /** @type {Array.} */ controls.getArray(); - goog.array.every(controlsArray, function(control) { - control.handleMapBrowserEvent(mapBrowserEvent); + var interactions = this.getInteractions(); + var interactionsArray = /** @type {Array.} */ + interactions.getArray(); + goog.array.every(interactionsArray, function(interaction) { + interaction.handleMapBrowserEvent(mapBrowserEvent); return !mapBrowserEvent.defaultPrevented; }); }; @@ -813,15 +814,15 @@ goog.exportProperty( /** - * @param {ol.Collection} controls Controls. + * @param {ol.Collection} interactions Interactions. */ -ol.Map.prototype.setControls = function(controls) { - this.set(ol.MapProperty.CONTROLS, controls); +ol.Map.prototype.setInteractions = function(interactions) { + this.set(ol.MapProperty.INTERACTIONS, interactions); }; goog.exportProperty( ol.Map.prototype, - 'setControls', - ol.Map.prototype.setControls); + 'setInteractions', + ol.Map.prototype.setInteractions); /** diff --git a/src/ol/control/constraints.js b/src/ol/control/constraints.js deleted file mode 100644 index b9f0acc99d..0000000000 --- a/src/ol/control/constraints.js +++ /dev/null @@ -1,35 +0,0 @@ -goog.provide('ol.control.Constraints'); - -goog.require('ol.control.CenterConstraintType'); -goog.require('ol.control.ResolutionConstraintType'); -goog.require('ol.control.RotationConstraintType'); - - - -/** - * @constructor - * @param {ol.control.CenterConstraintType} centerConstraint Center constraint. - * @param {ol.control.ResolutionConstraintType} resolutionConstraint - * Resolution constraint. - * @param {ol.control.RotationConstraintType} rotationConstraint - * Rotation constraint. - */ -ol.control.Constraints = - function(centerConstraint, resolutionConstraint, rotationConstraint) { - - /** - * @type {ol.control.CenterConstraintType} - */ - this.center = centerConstraint; - - /** - * @type {ol.control.ResolutionConstraintType} - */ - this.resolution = resolutionConstraint; - - /** - * @type {ol.control.RotationConstraintType} - */ - this.rotation = rotationConstraint; - -}; diff --git a/src/ol/control/altdragrotate.js b/src/ol/interaction/altdragrotate.js similarity index 65% rename from src/ol/control/altdragrotate.js rename to src/ol/interaction/altdragrotate.js index 7121af6b39..03cbbf6d71 100644 --- a/src/ol/control/altdragrotate.js +++ b/src/ol/interaction/altdragrotate.js @@ -1,32 +1,32 @@ -goog.provide('ol.control.AltDragRotate'); +goog.provide('ol.interaction.AltDragRotate'); goog.require('ol.MapBrowserEvent'); -goog.require('ol.control.Drag'); +goog.require('ol.interaction.Drag'); /** * @constructor - * @extends {ol.control.Drag} - * @param {ol.control.Constraints} constraints Constraints. + * @extends {ol.interaction.Drag} + * @param {ol.interaction.Constraints} constraints Constraints. */ -ol.control.AltDragRotate = function(constraints) { +ol.interaction.AltDragRotate = function(constraints) { goog.base(this, constraints); }; -goog.inherits(ol.control.AltDragRotate, ol.control.Drag); +goog.inherits(ol.interaction.AltDragRotate, ol.interaction.Drag); /** * @private * @type {number} */ -ol.control.AltDragRotate.prototype.startRotation_; +ol.interaction.AltDragRotate.prototype.startRotation_; /** * @inheritDoc */ -ol.control.AltDragRotate.prototype.handleDrag = function(mapBrowserEvent) { +ol.interaction.AltDragRotate.prototype.handleDrag = function(mapBrowserEvent) { var browserEvent = mapBrowserEvent.browserEvent; var map = mapBrowserEvent.map; var size = map.getSize(); @@ -40,7 +40,7 @@ ol.control.AltDragRotate.prototype.handleDrag = function(mapBrowserEvent) { /** * @inheritDoc */ -ol.control.AltDragRotate.prototype.handleDragStart = +ol.interaction.AltDragRotate.prototype.handleDragStart = function(mapBrowserEvent) { var browserEvent = mapBrowserEvent.browserEvent; var map = mapBrowserEvent.map; diff --git a/src/ol/control/centerconstraint.js b/src/ol/interaction/centerconstraint.js similarity index 78% rename from src/ol/control/centerconstraint.js rename to src/ol/interaction/centerconstraint.js index ad85e13e4c..7532427221 100644 --- a/src/ol/control/centerconstraint.js +++ b/src/ol/interaction/centerconstraint.js @@ -1,5 +1,5 @@ -goog.provide('ol.control.CenterConstraint'); -goog.provide('ol.control.CenterConstraintType'); +goog.provide('ol.interaction.CenterConstraint'); +goog.provide('ol.interaction.CenterConstraintType'); goog.require('ol.Coordinate'); @@ -9,7 +9,7 @@ goog.require('ol.Coordinate'); * (number|undefined), * ol.Coordinate): (ol.Coordinate|undefined)} */ -ol.control.CenterConstraintType; +ol.interaction.CenterConstraintType; /** @@ -18,7 +18,7 @@ ol.control.CenterConstraintType; * @param {ol.Coordinate} delta Delta. * @return {ol.Coordinate|undefined} Center. */ -ol.control.CenterConstraint.none = function(center, resolution, delta) { +ol.interaction.CenterConstraint.none = function(center, resolution, delta) { if (goog.isDefAndNotNull(center) && goog.isDef(resolution)) { var x = center.x + delta.x; var y = center.y + delta.y; @@ -35,7 +35,8 @@ ol.control.CenterConstraint.none = function(center, resolution, delta) { * @param {ol.Coordinate} delta Delta. * @return {ol.Coordinate|undefined} Center. */ -ol.control.CenterConstraint.snapToPixel = function(center, resolution, delta) { +ol.interaction.CenterConstraint.snapToPixel = + function(center, resolution, delta) { if (goog.isDefAndNotNull(center) && goog.isDef(resolution)) { var x = Math.floor((center.x + delta.x) / resolution + 0.5) * resolution; var y = Math.floor((center.y + delta.y) / resolution + 0.5) * resolution; diff --git a/src/ol/interaction/constraints.js b/src/ol/interaction/constraints.js new file mode 100644 index 0000000000..4774b7693f --- /dev/null +++ b/src/ol/interaction/constraints.js @@ -0,0 +1,36 @@ +goog.provide('ol.interaction.Constraints'); + +goog.require('ol.interaction.CenterConstraintType'); +goog.require('ol.interaction.ResolutionConstraintType'); +goog.require('ol.interaction.RotationConstraintType'); + + + +/** + * @constructor + * @param {ol.interaction.CenterConstraintType} centerConstraint + * Center constraint. + * @param {ol.interaction.ResolutionConstraintType} resolutionConstraint + * Resolution constraint. + * @param {ol.interaction.RotationConstraintType} rotationConstraint + * Rotation constraint. + */ +ol.interaction.Constraints = + function(centerConstraint, resolutionConstraint, rotationConstraint) { + + /** + * @type {ol.interaction.CenterConstraintType} + */ + this.center = centerConstraint; + + /** + * @type {ol.interaction.ResolutionConstraintType} + */ + this.resolution = resolutionConstraint; + + /** + * @type {ol.interaction.RotationConstraintType} + */ + this.rotation = rotationConstraint; + +}; diff --git a/src/ol/control/dblclickzoom.js b/src/ol/interaction/dblclickzoom.js similarity index 58% rename from src/ol/control/dblclickzoom.js rename to src/ol/interaction/dblclickzoom.js index 0241916588..2a223c81ac 100644 --- a/src/ol/control/dblclickzoom.js +++ b/src/ol/interaction/dblclickzoom.js @@ -1,27 +1,27 @@ -goog.provide('ol.control.DblClickZoom'); +goog.provide('ol.interaction.DblClickZoom'); goog.require('goog.events.EventType'); -goog.require('ol.Control'); +goog.require('ol.Interaction'); goog.require('ol.MapBrowserEvent'); -goog.require('ol.control.Constraints'); +goog.require('ol.interaction.Constraints'); /** * @constructor - * @extends {ol.Control} - * @param {ol.control.Constraints} constraints Constraints. + * @extends {ol.Interaction} + * @param {ol.interaction.Constraints} constraints Constraints. */ -ol.control.DblClickZoom = function(constraints) { +ol.interaction.DblClickZoom = function(constraints) { goog.base(this, constraints); }; -goog.inherits(ol.control.DblClickZoom, ol.Control); +goog.inherits(ol.interaction.DblClickZoom, ol.Interaction); /** * @inheritDoc */ -ol.control.DblClickZoom.prototype.handleMapBrowserEvent = +ol.interaction.DblClickZoom.prototype.handleMapBrowserEvent = function(mapBrowserEvent) { if (mapBrowserEvent.type == goog.events.EventType.DBLCLICK) { var map = mapBrowserEvent.map; diff --git a/src/ol/control/drag.js b/src/ol/interaction/drag.js similarity index 79% rename from src/ol/control/drag.js rename to src/ol/interaction/drag.js index da2f8eb05c..85dc8f3880 100644 --- a/src/ol/control/drag.js +++ b/src/ol/interaction/drag.js @@ -1,22 +1,22 @@ -goog.provide('ol.control.Drag'); +goog.provide('ol.interaction.Drag'); goog.require('goog.asserts'); goog.require('goog.events.EventType'); goog.require('goog.functions'); -goog.require('ol.Control'); goog.require('ol.Coordinate'); +goog.require('ol.Interaction'); goog.require('ol.MapBrowserEvent'); -goog.require('ol.control.Constraints'); +goog.require('ol.interaction.Constraints'); /** * @constructor - * @extends {ol.Control} - * @param {ol.control.Constraints} constraints Constraints. + * @extends {ol.Interaction} + * @param {ol.interaction.Constraints} constraints Constraints. */ -ol.control.Drag = function(constraints) { +ol.interaction.Drag = function(constraints) { goog.base(this, constraints); @@ -57,14 +57,14 @@ ol.control.Drag = function(constraints) { this.startCoordinate = null; }; -goog.inherits(ol.control.Drag, ol.Control); +goog.inherits(ol.interaction.Drag, ol.Interaction); /** * @param {ol.MapBrowserEvent} mapBrowserEvent Event. * @protected */ -ol.control.Drag.prototype.handleDrag = goog.nullFunction; +ol.interaction.Drag.prototype.handleDrag = goog.nullFunction; /** @@ -72,20 +72,21 @@ ol.control.Drag.prototype.handleDrag = goog.nullFunction; * @protected * @return {boolean} Capture dragging. */ -ol.control.Drag.prototype.handleDragStart = goog.functions.FALSE; +ol.interaction.Drag.prototype.handleDragStart = goog.functions.FALSE; /** * @param {ol.MapBrowserEvent} mapBrowserEvent Event. * @protected */ -ol.control.Drag.prototype.handleDragEnd = goog.nullFunction; +ol.interaction.Drag.prototype.handleDragEnd = goog.nullFunction; /** * @inheritDoc */ -ol.control.Drag.prototype.handleMapBrowserEvent = function(mapBrowserEvent) { +ol.interaction.Drag.prototype.handleMapBrowserEvent = + function(mapBrowserEvent) { var map = mapBrowserEvent.map; if (!map.isDef()) { return; diff --git a/src/ol/control/dragpan.js b/src/ol/interaction/dragpan.js similarity index 55% rename from src/ol/control/dragpan.js rename to src/ol/interaction/dragpan.js index e30fb1fba2..9fe4639823 100644 --- a/src/ol/control/dragpan.js +++ b/src/ol/interaction/dragpan.js @@ -1,29 +1,29 @@ // FIXME cope with rotation -goog.provide('ol.control.DragPan'); +goog.provide('ol.interaction.DragPan'); goog.require('ol.Coordinate'); goog.require('ol.MapBrowserEvent'); -goog.require('ol.control.Constraints'); -goog.require('ol.control.Drag'); +goog.require('ol.interaction.Constraints'); +goog.require('ol.interaction.Drag'); /** * @constructor - * @extends {ol.control.Drag} - * @param {ol.control.Constraints} constraints Constraints. + * @extends {ol.interaction.Drag} + * @param {ol.interaction.Constraints} constraints Constraints. */ -ol.control.DragPan = function(constraints) { +ol.interaction.DragPan = function(constraints) { goog.base(this, constraints); }; -goog.inherits(ol.control.DragPan, ol.control.Drag); +goog.inherits(ol.interaction.DragPan, ol.interaction.Drag); /** * @inheritDoc */ -ol.control.DragPan.prototype.handleDrag = function(mapBrowserEvent) { +ol.interaction.DragPan.prototype.handleDrag = function(mapBrowserEvent) { var map = mapBrowserEvent.map; var resolution = map.getResolution(); var delta = @@ -35,7 +35,7 @@ ol.control.DragPan.prototype.handleDrag = function(mapBrowserEvent) { /** * @inheritDoc */ -ol.control.DragPan.prototype.handleDragStart = function(mapBrowserEvent) { +ol.interaction.DragPan.prototype.handleDragStart = function(mapBrowserEvent) { var browserEvent = mapBrowserEvent.browserEvent; if (!browserEvent.shiftKey) { browserEvent.preventDefault(); diff --git a/src/ol/control/control.js b/src/ol/interaction/interaction.js similarity index 78% rename from src/ol/control/control.js rename to src/ol/interaction/interaction.js index 20c02f0aa1..30532e870e 100644 --- a/src/ol/control/control.js +++ b/src/ol/interaction/interaction.js @@ -1,21 +1,21 @@ // FIXME factor out key precondition (shift et. al) -goog.provide('ol.Control'); +goog.provide('ol.Interaction'); goog.require('ol.MapBrowserEvent'); -goog.require('ol.control.Constraints'); +goog.require('ol.interaction.Constraints'); /** * @constructor - * @param {ol.control.Constraints} constraints Constraints. + * @param {ol.interaction.Constraints} constraints Constraints. */ -ol.Control = function(constraints) { +ol.Interaction = function(constraints) { /** * @protected - * @type {ol.control.Constraints} + * @type {ol.interaction.Constraints} */ this.constraints = constraints; @@ -25,14 +25,14 @@ ol.Control = function(constraints) { /** * @param {ol.MapBrowserEvent} mapBrowserEvent Map browser event. */ -ol.Control.prototype.handleMapBrowserEvent = goog.abstractMethod; +ol.Interaction.prototype.handleMapBrowserEvent = goog.abstractMethod; /** * @param {ol.Map} map Map. * @param {ol.Extent} extent Extent. */ -ol.Control.prototype.fitExtent = function(map, extent) { +ol.Interaction.prototype.fitExtent = function(map, extent) { var resolution = map.getResolutionForExtent(extent); resolution = this.constraints.resolution(resolution, 0); var center = extent.getCenter(); @@ -49,7 +49,7 @@ ol.Control.prototype.fitExtent = function(map, extent) { * @param {ol.Coordinate} delta Delta. * @param {ol.Coordinate=} opt_anchor Anchor. */ -ol.Control.prototype.pan = function(map, delta, opt_anchor) { +ol.Interaction.prototype.pan = function(map, delta, opt_anchor) { var center = opt_anchor ? opt_anchor : map.getCenter(); var resolution = map.getResolution(); center = this.constraints.center(center, resolution, delta); @@ -63,7 +63,7 @@ ol.Control.prototype.pan = function(map, delta, opt_anchor) { * @param {number} delta Delta. * @param {ol.Coordinate=} opt_anchor Anchor. */ -ol.Control.prototype.rotate = function(map, rotation, delta, opt_anchor) { +ol.Interaction.prototype.rotate = function(map, rotation, delta, opt_anchor) { // FIXME handle rotation about anchor rotation = this.constraints.rotation(rotation, delta); map.setRotation(rotation); @@ -74,7 +74,7 @@ ol.Control.prototype.rotate = function(map, rotation, delta, opt_anchor) { * @param {ol.Map} map Map. * @param {number|undefined} resolution Resolution. */ -ol.Control.prototype.setResolution = function(map, resolution) { +ol.Interaction.prototype.setResolution = function(map, resolution) { resolution = this.constraints.resolution(resolution, 0); map.setResolution(resolution); }; @@ -86,7 +86,7 @@ ol.Control.prototype.setResolution = function(map, resolution) { * @param {number} delta Delta. * @param {ol.Coordinate=} opt_anchor Anchor. */ -ol.Control.prototype.zoom = function(map, resolution, delta, opt_anchor) { +ol.Interaction.prototype.zoom = function(map, resolution, delta, opt_anchor) { if (goog.isDefAndNotNull(opt_anchor)) { var anchor = opt_anchor; var mapCenter = /** @type {!ol.Coordinate} */ map.getCenter(); diff --git a/src/ol/control/keyboard.js b/src/ol/interaction/keyboard.js similarity index 70% rename from src/ol/control/keyboard.js rename to src/ol/interaction/keyboard.js index e72bfaf803..ba21904668 100644 --- a/src/ol/control/keyboard.js +++ b/src/ol/interaction/keyboard.js @@ -1,16 +1,16 @@ // FIXME this class is ugly and should be removed -goog.provide('ol.control.Keyboard'); +goog.provide('ol.interaction.Keyboard'); -goog.require('ol.Control'); +goog.require('ol.Interaction'); /** * @constructor - * @extends {ol.Control} + * @extends {ol.Interaction} */ -ol.control.Keyboard = function() { +ol.interaction.Keyboard = function() { goog.base(this, null); @@ -21,14 +21,14 @@ ol.control.Keyboard = function() { this.charCodeCallbacks_ = {}; }; -goog.inherits(ol.control.Keyboard, ol.Control); +goog.inherits(ol.interaction.Keyboard, ol.Interaction); /** * @param {string} s String. * @param {Function} callback Callback. */ -ol.control.Keyboard.prototype.addCallback = function(s, callback) { +ol.interaction.Keyboard.prototype.addCallback = function(s, callback) { var i; for (i = 0; i < s.length; ++i) { this.charCodeCallbacks_[s.charCodeAt(i)] = callback; @@ -39,7 +39,7 @@ ol.control.Keyboard.prototype.addCallback = function(s, callback) { /** * @inheritDoc */ -ol.control.Keyboard.prototype.handleMapBrowserEvent = +ol.interaction.Keyboard.prototype.handleMapBrowserEvent = function(mapBrowserEvent) { if (mapBrowserEvent.type == goog.events.KeyHandler.EventType.KEY) { var keyEvent = /** @type {goog.events.KeyEvent} */ diff --git a/src/ol/control/keyboardpan.js b/src/ol/interaction/keyboardpan.js similarity index 78% rename from src/ol/control/keyboardpan.js rename to src/ol/interaction/keyboardpan.js index b222519c31..3d9b1efe7a 100644 --- a/src/ol/control/keyboardpan.js +++ b/src/ol/interaction/keyboardpan.js @@ -1,19 +1,19 @@ -goog.provide('ol.control.KeyboardPan'); +goog.provide('ol.interaction.KeyboardPan'); goog.require('goog.events.KeyCodes'); goog.require('goog.events.KeyHandler.EventType'); -goog.require('ol.Control'); -goog.require('ol.control.Constraints'); +goog.require('ol.Interaction'); +goog.require('ol.interaction.Constraints'); /** * @constructor - * @extends {ol.Control} - * @param {ol.control.Constraints} constraints Constraints. + * @extends {ol.Interaction} + * @param {ol.interaction.Constraints} constraints Constraints. * @param {number} pixelDelta Pixel delta. */ -ol.control.KeyboardPan = function(constraints, pixelDelta) { +ol.interaction.KeyboardPan = function(constraints, pixelDelta) { goog.base(this, constraints); @@ -24,13 +24,13 @@ ol.control.KeyboardPan = function(constraints, pixelDelta) { this.pixelDelta_ = pixelDelta; }; -goog.inherits(ol.control.KeyboardPan, ol.Control); +goog.inherits(ol.interaction.KeyboardPan, ol.Interaction); /** * @inheritDoc */ -ol.control.KeyboardPan.prototype.handleMapBrowserEvent = +ol.interaction.KeyboardPan.prototype.handleMapBrowserEvent = function(mapBrowserEvent) { if (mapBrowserEvent.type == goog.events.KeyHandler.EventType.KEY) { var keyEvent = /** @type {goog.events.KeyEvent} */ diff --git a/src/ol/control/keyboardzoom.js b/src/ol/interaction/keyboardzoom.js similarity index 65% rename from src/ol/control/keyboardzoom.js rename to src/ol/interaction/keyboardzoom.js index 97dff8658b..dd88f90729 100644 --- a/src/ol/control/keyboardzoom.js +++ b/src/ol/interaction/keyboardzoom.js @@ -1,27 +1,27 @@ -goog.provide('ol.control.KeyboardZoom'); +goog.provide('ol.interaction.KeyboardZoom'); goog.require('goog.events.KeyCodes'); goog.require('goog.events.KeyHandler.EventType'); -goog.require('ol.Control'); -goog.require('ol.control.ResolutionConstraintType'); +goog.require('ol.Interaction'); +goog.require('ol.interaction.ResolutionConstraintType'); /** * @constructor - * @extends {ol.Control} - * @param {ol.control.Constraints} constraints Constraints. + * @extends {ol.Interaction} + * @param {ol.interaction.Constraints} constraints Constraints. */ -ol.control.KeyboardZoom = function(constraints) { +ol.interaction.KeyboardZoom = function(constraints) { goog.base(this, constraints); }; -goog.inherits(ol.control.KeyboardZoom, ol.Control); +goog.inherits(ol.interaction.KeyboardZoom, ol.Interaction); /** * @inheritDoc */ -ol.control.KeyboardZoom.prototype.handleMapBrowserEvent = +ol.interaction.KeyboardZoom.prototype.handleMapBrowserEvent = function(mapBrowserEvent) { if (mapBrowserEvent.type == goog.events.KeyHandler.EventType.KEY) { var keyEvent = /** @type {goog.events.KeyEvent} */ diff --git a/src/ol/control/mousewheelzoom.js b/src/ol/interaction/mousewheelzoom.js similarity index 71% rename from src/ol/control/mousewheelzoom.js rename to src/ol/interaction/mousewheelzoom.js index 9b55cab962..23a92750d5 100644 --- a/src/ol/control/mousewheelzoom.js +++ b/src/ol/interaction/mousewheelzoom.js @@ -1,27 +1,27 @@ -goog.provide('ol.control.MouseWheelZoom'); +goog.provide('ol.interaction.MouseWheelZoom'); goog.require('goog.events.MouseWheelEvent'); goog.require('goog.events.MouseWheelHandler.EventType'); goog.require('ol.MapBrowserEvent'); -goog.require('ol.control.Constraints'); +goog.require('ol.interaction.Constraints'); /** * @constructor - * @extends {ol.Control} - * @param {ol.control.Constraints} constraints Constraints. + * @extends {ol.Interaction} + * @param {ol.interaction.Constraints} constraints Constraints. */ -ol.control.MouseWheelZoom = function(constraints) { +ol.interaction.MouseWheelZoom = function(constraints) { goog.base(this, constraints); }; -goog.inherits(ol.control.MouseWheelZoom, ol.Control); +goog.inherits(ol.interaction.MouseWheelZoom, ol.Interaction); /** * @inheritDoc */ -ol.control.MouseWheelZoom.prototype.handleMapBrowserEvent = +ol.interaction.MouseWheelZoom.prototype.handleMapBrowserEvent = function(mapBrowserEvent) { if (mapBrowserEvent.type == goog.events.MouseWheelHandler.EventType.MOUSEWHEEL) { diff --git a/src/ol/control/resolutionconstraint.js b/src/ol/interaction/resolutionconstraint.js similarity index 75% rename from src/ol/control/resolutionconstraint.js rename to src/ol/interaction/resolutionconstraint.js index 140abbf544..79eb7b800c 100644 --- a/src/ol/control/resolutionconstraint.js +++ b/src/ol/interaction/resolutionconstraint.js @@ -1,5 +1,5 @@ -goog.provide('ol.control.ResolutionConstraint'); -goog.provide('ol.control.ResolutionConstraintType'); +goog.provide('ol.interaction.ResolutionConstraint'); +goog.provide('ol.interaction.ResolutionConstraintType'); goog.require('goog.math'); goog.require('ol.array'); @@ -8,16 +8,16 @@ goog.require('ol.array'); /** * @typedef {function((number|undefined), number): (number|undefined)} */ -ol.control.ResolutionConstraintType; +ol.interaction.ResolutionConstraintType; /** * @param {number} power Power. * @param {number} maxResolution Maximum resolution. * @param {number=} opt_minResolution Minimum resolution. - * @return {ol.control.ResolutionConstraintType} Zoom function. + * @return {ol.interaction.ResolutionConstraintType} Zoom function. */ -ol.control.ResolutionConstraint.createContinuous = +ol.interaction.ResolutionConstraint.createContinuous = function(power, maxResolution, opt_minResolution) { var minResolution = opt_minResolution || 0; return function(resolution, delta) { @@ -33,9 +33,9 @@ ol.control.ResolutionConstraint.createContinuous = /** * @param {Array.} resolutions Resolutions. - * @return {ol.control.ResolutionConstraintType} Zoom function. + * @return {ol.interaction.ResolutionConstraintType} Zoom function. */ -ol.control.ResolutionConstraint.createSnapToResolutions = +ol.interaction.ResolutionConstraint.createSnapToResolutions = function(resolutions) { return function(resolution, delta) { if (goog.isDef(resolution)) { @@ -53,9 +53,9 @@ ol.control.ResolutionConstraint.createSnapToResolutions = * @param {number} power Power. * @param {number} maxResolution Maximum resolution. * @param {number=} opt_maxLevel Maximum level. - * @return {ol.control.ResolutionConstraintType} Zoom function. + * @return {ol.interaction.ResolutionConstraintType} Zoom function. */ -ol.control.ResolutionConstraint.createSnapToPower = +ol.interaction.ResolutionConstraint.createSnapToPower = function(power, maxResolution, opt_maxLevel) { return function(resolution, delta) { if (goog.isDef(resolution)) { diff --git a/src/ol/control/resolutionconstraint_test.js b/src/ol/interaction/resolutionconstraint_test.js similarity index 88% rename from src/ol/control/resolutionconstraint_test.js rename to src/ol/interaction/resolutionconstraint_test.js index 89c8707ad0..6d61f256f0 100644 --- a/src/ol/control/resolutionconstraint_test.js +++ b/src/ol/interaction/resolutionconstraint_test.js @@ -1,10 +1,10 @@ goog.require('goog.testing.jsunit'); -goog.require('ol.control.ResolutionConstraint'); +goog.require('ol.interaction.ResolutionConstraint'); function testSnapToResolutionsZero() { var resolutionConstraint = - ol.control.ResolutionConstraint.createSnapToResolutions( + ol.interaction.ResolutionConstraint.createSnapToResolutions( [1000, 500, 250, 100]); assertEquals(1000, resolutionConstraint(1000, 0)); assertEquals(500, resolutionConstraint(500, 0)); @@ -15,7 +15,7 @@ function testSnapToResolutionsZero() { function testSnapToResolutionsZoomIn() { var resolutionConstraint = - ol.control.ResolutionConstraint.createSnapToResolutions( + ol.interaction.ResolutionConstraint.createSnapToResolutions( [1000, 500, 250, 100]); assertEquals(500, resolutionConstraint(1000, 1)); assertEquals(250, resolutionConstraint(500, 1)); @@ -26,7 +26,7 @@ function testSnapToResolutionsZoomIn() { function testSnapToResolutionsZoomOut() { var resolutionConstraint = - ol.control.ResolutionConstraint.createSnapToResolutions( + ol.interaction.ResolutionConstraint.createSnapToResolutions( [1000, 500, 250, 100]); assertEquals(1000, resolutionConstraint(1000, -1)); assertEquals(1000, resolutionConstraint(500, -1)); @@ -37,7 +37,7 @@ function testSnapToResolutionsZoomOut() { function testSnapToResolutionsNearestZero() { var resolutionConstraint = - ol.control.ResolutionConstraint.createSnapToResolutions( + ol.interaction.ResolutionConstraint.createSnapToResolutions( [1000, 500, 250, 100]); assertEquals(1000, resolutionConstraint(1050, 0)); assertEquals(1000, resolutionConstraint(950, 0)); @@ -52,7 +52,7 @@ function testSnapToResolutionsNearestZero() { function testSnapToResolutionsNearestZoomIn() { var resolutionConstraint = - ol.control.ResolutionConstraint.createSnapToResolutions( + ol.interaction.ResolutionConstraint.createSnapToResolutions( [1000, 500, 250, 100]); assertEquals(500, resolutionConstraint(1050, 1)); assertEquals(500, resolutionConstraint(950, 1)); @@ -67,7 +67,7 @@ function testSnapToResolutionsNearestZoomIn() { function testSnapToResolutionsNearestZoomOut() { var resolutionConstraint = - ol.control.ResolutionConstraint.createSnapToResolutions( + ol.interaction.ResolutionConstraint.createSnapToResolutions( [1000, 500, 250, 100]); assertEquals(1000, resolutionConstraint(1050, -1)); assertEquals(1000, resolutionConstraint(950, -1)); @@ -82,7 +82,7 @@ function testSnapToResolutionsNearestZoomOut() { function testSnapToPowerZero() { var resolutionConstraint = - ol.control.ResolutionConstraint.createSnapToPower(2, 1024, 10); + ol.interaction.ResolutionConstraint.createSnapToPower(2, 1024, 10); assertEquals(1024, resolutionConstraint(1024, 0)); assertEquals(512, resolutionConstraint(512, 0)); assertEquals(256, resolutionConstraint(256, 0)); @@ -99,7 +99,7 @@ function testSnapToPowerZero() { function testSnapToPowerZoomIn() { var resolutionConstraint = - ol.control.ResolutionConstraint.createSnapToPower(2, 1024, 10); + ol.interaction.ResolutionConstraint.createSnapToPower(2, 1024, 10); assertEquals(512, resolutionConstraint(1024, 1)); assertEquals(256, resolutionConstraint(512, 1)); assertEquals(128, resolutionConstraint(256, 1)); @@ -116,7 +116,7 @@ function testSnapToPowerZoomIn() { function testSnapToPowerZoomOut() { var resolutionConstraint = - ol.control.ResolutionConstraint.createSnapToPower(2, 1024, 10); + ol.interaction.ResolutionConstraint.createSnapToPower(2, 1024, 10); assertEquals(1024, resolutionConstraint(1024, -1)); assertEquals(1024, resolutionConstraint(512, -1)); assertEquals(512, resolutionConstraint(256, -1)); @@ -133,7 +133,7 @@ function testSnapToPowerZoomOut() { function testSnapToPowerNearestZero() { var resolutionConstraint = - ol.control.ResolutionConstraint.createSnapToPower(2, 1024, 10); + ol.interaction.ResolutionConstraint.createSnapToPower(2, 1024, 10); assertEquals(1024, resolutionConstraint(1050, 0)); assertEquals(1024, resolutionConstraint(9050, 0)); assertEquals(512, resolutionConstraint(550, 0)); diff --git a/src/ol/control/rotationconstraint.js b/src/ol/interaction/rotationconstraint.js similarity index 62% rename from src/ol/control/rotationconstraint.js rename to src/ol/interaction/rotationconstraint.js index dde5403272..a978999a2d 100644 --- a/src/ol/control/rotationconstraint.js +++ b/src/ol/interaction/rotationconstraint.js @@ -1,11 +1,11 @@ -goog.provide('ol.control.RotationConstraint'); -goog.provide('ol.control.RotationConstraintType'); +goog.provide('ol.interaction.RotationConstraint'); +goog.provide('ol.interaction.RotationConstraintType'); /** * @typedef {function((number|undefined), number): (number|undefined)} */ -ol.control.RotationConstraintType; +ol.interaction.RotationConstraintType; /** @@ -13,7 +13,7 @@ ol.control.RotationConstraintType; * @param {number} delta Delta. * @return {number|undefined} Rotation. */ -ol.control.RotationConstraint.none = function(rotation, delta) { +ol.interaction.RotationConstraint.none = function(rotation, delta) { if (goog.isDef(rotation)) { return rotation + delta; } else { @@ -24,9 +24,9 @@ ol.control.RotationConstraint.none = function(rotation, delta) { /** * @param {number} n N. - * @return {ol.control.RotationConstraintType} Rotation constraint. + * @return {ol.interaction.RotationConstraintType} Rotation constraint. */ -ol.control.RotationConstraint.createSnapToN = function(n) { +ol.interaction.RotationConstraint.createSnapToN = function(n) { var theta = 2 * Math.PI / n; return function(rotation, delta) { if (goog.isDef(rotation)) { diff --git a/src/ol/control/shiftdragrotateandzoom.js b/src/ol/interaction/shiftdragrotateandzoom.js similarity index 69% rename from src/ol/control/shiftdragrotateandzoom.js rename to src/ol/interaction/shiftdragrotateandzoom.js index 3a1f276c20..748209c412 100644 --- a/src/ol/control/shiftdragrotateandzoom.js +++ b/src/ol/interaction/shiftdragrotateandzoom.js @@ -1,41 +1,41 @@ -goog.provide('ol.control.ShiftDragRotateAndZoom'); +goog.provide('ol.interaction.ShiftDragRotateAndZoom'); goog.require('goog.math.Vec2'); goog.require('ol.MapBrowserEvent'); -goog.require('ol.control.Constraints'); -goog.require('ol.control.Drag'); +goog.require('ol.interaction.Constraints'); +goog.require('ol.interaction.Drag'); /** * @constructor - * @extends {ol.control.Drag} - * @param {ol.control.Constraints} constraints Constraints. + * @extends {ol.interaction.Drag} + * @param {ol.interaction.Constraints} constraints Constraints. */ -ol.control.ShiftDragRotateAndZoom = function(constraints) { +ol.interaction.ShiftDragRotateAndZoom = function(constraints) { goog.base(this, constraints); }; -goog.inherits(ol.control.ShiftDragRotateAndZoom, ol.control.Drag); +goog.inherits(ol.interaction.ShiftDragRotateAndZoom, ol.interaction.Drag); /** * @private * @type {number} */ -ol.control.ShiftDragRotateAndZoom.prototype.startRatio_; +ol.interaction.ShiftDragRotateAndZoom.prototype.startRatio_; /** * @private * @type {number} */ -ol.control.ShiftDragRotateAndZoom.prototype.startRotation_; +ol.interaction.ShiftDragRotateAndZoom.prototype.startRotation_; /** * @inheritDoc */ -ol.control.ShiftDragRotateAndZoom.prototype.handleDrag = +ol.interaction.ShiftDragRotateAndZoom.prototype.handleDrag = function(mapBrowserEvent) { var browserEvent = mapBrowserEvent.browserEvent; var map = mapBrowserEvent.map; @@ -54,7 +54,7 @@ ol.control.ShiftDragRotateAndZoom.prototype.handleDrag = /** * @inheritDoc */ -ol.control.ShiftDragRotateAndZoom.prototype.handleDragStart = +ol.interaction.ShiftDragRotateAndZoom.prototype.handleDragStart = function(mapBrowserEvent) { var browserEvent = mapBrowserEvent.browserEvent; var map = mapBrowserEvent.map; diff --git a/src/ol/control/shiftdragzoom.js b/src/ol/interaction/shiftdragzoom.js similarity index 63% rename from src/ol/control/shiftdragzoom.js rename to src/ol/interaction/shiftdragzoom.js index 71a04fd680..a10e887d17 100644 --- a/src/ol/control/shiftdragzoom.js +++ b/src/ol/interaction/shiftdragzoom.js @@ -1,11 +1,11 @@ // FIXME draw drag box -goog.provide('ol.control.ShiftDragZoom'); +goog.provide('ol.interaction.ShiftDragZoom'); goog.require('ol.Extent'); goog.require('ol.MapBrowserEvent'); -goog.require('ol.control.Constraints'); -goog.require('ol.control.Drag'); +goog.require('ol.interaction.Constraints'); +goog.require('ol.interaction.Drag'); /** @@ -24,19 +24,20 @@ ol.SHIFT_DRAG_ZOOM_HYSTERESIS_PIXELS_SQUARED = /** * @constructor - * @extends {ol.control.Drag} - * @param {ol.control.Constraints} constraints Constraints. + * @extends {ol.interaction.Drag} + * @param {ol.interaction.Constraints} constraints Constraints. */ -ol.control.ShiftDragZoom = function(constraints) { +ol.interaction.ShiftDragZoom = function(constraints) { goog.base(this, constraints); }; -goog.inherits(ol.control.ShiftDragZoom, ol.control.Drag); +goog.inherits(ol.interaction.ShiftDragZoom, ol.interaction.Drag); /** * @inheritDoc */ -ol.control.ShiftDragZoom.prototype.handleDragEnd = function(mapBrowserEvent) { +ol.interaction.ShiftDragZoom.prototype.handleDragEnd = + function(mapBrowserEvent) { if (this.deltaX * this.deltaX + this.deltaY * this.deltaY >= ol.SHIFT_DRAG_ZOOM_HYSTERESIS_PIXELS_SQUARED) { var map = mapBrowserEvent.map; @@ -51,7 +52,8 @@ ol.control.ShiftDragZoom.prototype.handleDragEnd = function(mapBrowserEvent) { /** * @inheritDoc */ -ol.control.ShiftDragZoom.prototype.handleDragStart = function(mapBrowserEvent) { +ol.interaction.ShiftDragZoom.prototype.handleDragStart = + function(mapBrowserEvent) { var browserEvent = mapBrowserEvent.browserEvent; if (browserEvent.shiftKey) { browserEvent.preventDefault(); From ec3475806edc45c8d8f188ad895df7d4d36d5ff3 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Mon, 13 Aug 2012 15:18:17 +0200 Subject: [PATCH 488/562] s/View/Control/, thanks @elemoine --- demos/side-by-side/side-by-side.js | 6 ++-- src/ol/{view => control}/attribution.js | 35 +++++++++++---------- src/ol/{view/view.js => control/control.js} | 8 ++--- 3 files changed, 25 insertions(+), 24 deletions(-) rename src/ol/{view => control}/attribution.js (90%) rename src/ol/{view/view.js => control/control.js} (61%) diff --git a/demos/side-by-side/side-by-side.js b/demos/side-by-side/side-by-side.js index cf15deb693..c5cd067739 100644 --- a/demos/side-by-side/side-by-side.js +++ b/demos/side-by-side/side-by-side.js @@ -1,8 +1,8 @@ goog.require('ol.RendererHint'); +goog.require('ol.control.Attribution'); goog.require('ol.createMap'); goog.require('ol.interaction.Keyboard'); goog.require('ol.layer.MapQuestOpenAerial'); -goog.require('ol.view.Attribution'); var layer = new ol.layer.MapQuestOpenAerial(); @@ -28,9 +28,9 @@ if (!goog.isNull(webglMap)) { webglMap.bindTo('rotation', domMap); } -var attributionView = new ol.view.Attribution(domMap); +var attributionControl = new ol.control.Attribution(domMap); document.getElementById('attribution').appendChild( - attributionView.getElement()); + attributionControl.getElement()); var keyboardInteraction = new ol.interaction.Keyboard(); keyboardInteraction.addCallback('0', function() { diff --git a/src/ol/view/attribution.js b/src/ol/control/attribution.js similarity index 90% rename from src/ol/view/attribution.js rename to src/ol/control/attribution.js index c2e8d3d271..1b45e36ef2 100644 --- a/src/ol/view/attribution.js +++ b/src/ol/control/attribution.js @@ -3,7 +3,7 @@ // FIXME handle layer order // FIXME check clean-up code -goog.provide('ol.view.Attribution'); +goog.provide('ol.control.Attribution'); goog.require('goog.dom'); goog.require('goog.dom.TagName'); @@ -12,20 +12,20 @@ goog.require('goog.events.EventType'); goog.require('goog.object'); goog.require('goog.style'); goog.require('ol.Collection'); +goog.require('ol.Control'); goog.require('ol.CoverageArea'); goog.require('ol.Layer'); goog.require('ol.MapProperty'); goog.require('ol.TileCoverageArea'); -goog.require('ol.View'); /** * @constructor - * @extends {ol.View} + * @extends {ol.Control} * @param {ol.Map} map Map. */ -ol.view.Attribution = function(map) { +ol.control.Attribution = function(map) { goog.base(this, map); @@ -75,14 +75,14 @@ ol.view.Attribution = function(map) { this.handleMapLayersChanged(); }; -goog.inherits(ol.view.Attribution, ol.View); +goog.inherits(ol.control.Attribution, ol.Control); /** * @param {ol.Layer} layer Layer. * @private */ -ol.view.Attribution.prototype.createAttributionElementsForLayer_ = +ol.control.Attribution.prototype.createAttributionElementsForLayer_ = function(layer) { var store = layer.getStore(); @@ -132,7 +132,7 @@ ol.view.Attribution.prototype.createAttributionElementsForLayer_ = /** * @inheritDoc */ -ol.view.Attribution.prototype.getElement = function() { +ol.control.Attribution.prototype.getElement = function() { return this.ulElement_; }; @@ -141,7 +141,7 @@ ol.view.Attribution.prototype.getElement = function() { * @param {ol.Layer} layer Layer. * @protected */ -ol.view.Attribution.prototype.addLayer = function(layer) { +ol.control.Attribution.prototype.addLayer = function(layer) { var layerKey = goog.getUid(layer); @@ -162,7 +162,7 @@ ol.view.Attribution.prototype.addLayer = function(layer) { /** * @param {goog.events.Event} event Event. */ -ol.view.Attribution.prototype.handleLayerLoad = function(event) { +ol.control.Attribution.prototype.handleLayerLoad = function(event) { var layer = /** @type {ol.Layer} */ event.target; this.createAttributionElementsForLayer_(layer); }; @@ -172,7 +172,7 @@ ol.view.Attribution.prototype.handleLayerLoad = function(event) { * @param {ol.Layer} layer Layer. * @protected */ -ol.view.Attribution.prototype.removeLayer = function(layer) { +ol.control.Attribution.prototype.removeLayer = function(layer) { var layerKey = goog.getUid(layer); @@ -194,7 +194,7 @@ ol.view.Attribution.prototype.removeLayer = function(layer) { * @param {goog.events.Event} event Eveny. * @protected */ -ol.view.Attribution.prototype.handleLayerVisibleChanged = function(event) { +ol.control.Attribution.prototype.handleLayerVisibleChanged = function(event) { var map = this.getMap(); var mapIsDef = map.isDef(); @@ -214,7 +214,7 @@ ol.view.Attribution.prototype.handleLayerVisibleChanged = function(event) { * @param {ol.CollectionEvent} collectionEvent Collection event. * @protected */ -ol.view.Attribution.prototype.handleLayersAdd = function(collectionEvent) { +ol.control.Attribution.prototype.handleLayersAdd = function(collectionEvent) { var layer = /** @type {ol.Layer} */ collectionEvent.elem; this.addLayer(layer); }; @@ -224,7 +224,8 @@ ol.view.Attribution.prototype.handleLayersAdd = function(collectionEvent) { * @param {ol.CollectionEvent} collectionEvent Collection event. * @protected */ -ol.view.Attribution.prototype.handleLayersRemove = function(collectionEvent) { +ol.control.Attribution.prototype.handleLayersRemove = + function(collectionEvent) { var layer = /** @type {ol.Layer} */ collectionEvent.elem; this.removeLayer(layer); }; @@ -233,7 +234,7 @@ ol.view.Attribution.prototype.handleLayersRemove = function(collectionEvent) { /** * @protected */ -ol.view.Attribution.prototype.handleMapChanged = function() { +ol.control.Attribution.prototype.handleMapChanged = function() { var map = this.getMap(); var mapIsDef = map.isDef(); @@ -253,7 +254,7 @@ ol.view.Attribution.prototype.handleMapChanged = function() { /** * @protected */ -ol.view.Attribution.prototype.handleMapLayersChanged = function() { +ol.control.Attribution.prototype.handleMapLayersChanged = function() { if (!goog.isNull(this.layersListenerKeys_)) { goog.array.forEach(this.layersListenerKeys_, goog.events.unlistenByKey); this.layersListenerKeys_ = null; @@ -285,7 +286,7 @@ ol.view.Attribution.prototype.handleMapLayersChanged = function() { * @return {Object.} Attribution visibilities. * @private */ -ol.view.Attribution.prototype.getLayerAttributionVisiblities_ = +ol.control.Attribution.prototype.getLayerAttributionVisiblities_ = function(layer, mapExtent, mapResolution, mapProjection) { var store = layer.getStore(); @@ -367,7 +368,7 @@ ol.view.Attribution.prototype.getLayerAttributionVisiblities_ = * @param {ol.Projection} mapProjection Map projection. * @private */ -ol.view.Attribution.prototype.updateLayerAttributionsVisibility_ = +ol.control.Attribution.prototype.updateLayerAttributionsVisibility_ = function(layer, mapIsDef, mapExtent, mapResolution, mapProjection) { if (mapIsDef && layer.getVisible()) { var attributionVisibilities = this.getLayerAttributionVisiblities_( diff --git a/src/ol/view/view.js b/src/ol/control/control.js similarity index 61% rename from src/ol/view/view.js rename to src/ol/control/control.js index 6e3b685ba8..d6b66c1bf1 100644 --- a/src/ol/view/view.js +++ b/src/ol/control/control.js @@ -1,4 +1,4 @@ -goog.provide('ol.View'); +goog.provide('ol.Control'); goog.require('ol.Map'); @@ -8,7 +8,7 @@ goog.require('ol.Map'); * @constructor * @param {ol.Map} map Map. */ -ol.View = function(map) { +ol.Control = function(map) { /** * @private @@ -22,12 +22,12 @@ ol.View = function(map) { /** * @return {Element} Element. */ -ol.View.prototype.getElement = goog.abstractMethod; +ol.Control.prototype.getElement = goog.abstractMethod; /** * @return {ol.Map} Map. */ -ol.View.prototype.getMap = function() { +ol.Control.prototype.getMap = function() { return this.map_; }; From 6495cfb043bba1791ecceca3820ff83a799d87b0 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Mon, 13 Aug 2012 16:41:07 +0200 Subject: [PATCH 489/562] Add crude coordinate formatter --- src/ol/base/coordinateformat.js | 57 +++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 src/ol/base/coordinateformat.js diff --git a/src/ol/base/coordinateformat.js b/src/ol/base/coordinateformat.js new file mode 100644 index 0000000000..fa8ef51423 --- /dev/null +++ b/src/ol/base/coordinateformat.js @@ -0,0 +1,57 @@ +goog.provide('ol.CoordinateFormat'); +goog.provide('ol.CoordinateFormatType'); + +goog.require('goog.math'); +goog.require('ol.Coordinate'); + + +/** + * @typedef {function((ol.Coordinate|undefined)): string} + */ +ol.CoordinateFormatType; + + +/** + * @private + * @param {number} degrees Degrees. + * @param {string} hemispheres Hemispheres. + * @return {string} String. + */ +ol.CoordinateFormat.degreesToHDMS_ = function(degrees, hemispheres) { + var normalizedDegrees = goog.math.modulo(degrees + 180, 360) - 180; + var x = Math.abs(Math.round(3600 * normalizedDegrees)); + return Math.floor(x / 3600) + '\u00b0 ' + + Math.floor((x / 60) % 60) + '\u2032 ' + + Math.floor(x % 60) + '\u2033 ' + + hemispheres.charAt(normalizedDegrees < 0 ? 1 : 0); +}; + + +/** + * @param {number} precision Precision. + * @return {ol.CoordinateFormatType} Coordinate format. + */ +ol.CoordinateFormat.createXY = function(precision) { + return function(coordinate) { + if (goog.isDef(coordinate)) { + return coordinate.x.toFixed(precision) + ', ' + + coordinate.y.toFixed(precision); + } else { + return ''; + } + }; +}; + + +/** + * @param {ol.Coordinate|undefined} coordinate Coordinate. + * @return {string} Coordinate format. + */ +ol.CoordinateFormat.hdms = function(coordinate) { + if (goog.isDef(coordinate)) { + return ol.CoordinateFormat.degreesToHDMS_(coordinate.y, 'NS') + ' ' + + ol.CoordinateFormat.degreesToHDMS_(coordinate.x, 'EW'); + } else { + return ''; + } +}; From 85ca630935b93d4014f478cbd6d20d8f9d8a2458 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Mon, 13 Aug 2012 16:41:31 +0200 Subject: [PATCH 490/562] Add ol.control.MousePosition --- src/ol/control/mouseposition.js | 124 ++++++++++++++++++++++++++++++++ 1 file changed, 124 insertions(+) create mode 100644 src/ol/control/mouseposition.js diff --git a/src/ol/control/mouseposition.js b/src/ol/control/mouseposition.js new file mode 100644 index 0000000000..d03bb38646 --- /dev/null +++ b/src/ol/control/mouseposition.js @@ -0,0 +1,124 @@ +goog.provide('ol.control.MousePosition'); + +goog.require('goog.events'); +goog.require('goog.events.EventType'); +goog.require('ol.Control'); +goog.require('ol.MapProperty'); +goog.require('ol.Object'); +goog.require('ol.Projection'); +goog.require('ol.TransformFunction'); + + + +/** + * @constructor + * @extends {ol.Control} + * @param {ol.Map} map Map. + * @param {ol.Projection=} opt_projection Projection. + * @param {ol.CoordinateFormatType=} opt_coordinateFormat Coordinate format. + * @param {string=} opt_undefinedHTML Undefined HTML. + */ +ol.control.MousePosition = + function(map, opt_projection, opt_coordinateFormat, opt_undefinedHTML) { + + goog.base(this, map); + + /** + * @private + * @type {Element} + */ + this.divElement_ = goog.dom.createElement(goog.dom.TagName.DIV); + + /** + * @private + * @type {ol.Projection} + */ + this.projection_ = opt_projection || null; + + /** + * @private + * @type {ol.CoordinateFormatType|undefined} + */ + this.coordinateFormat_ = opt_coordinateFormat; + + /** + * @private + * @type {string} + */ + this.undefinedHTML_ = opt_undefinedHTML || ''; + + goog.events.listen(map, + ol.Object.getChangedEventType(ol.MapProperty.PROJECTION), + this.handleMapProjectionChanged, false, this); + + goog.events.listen(map.getTarget(), goog.events.EventType.MOUSEMOVE, + this.handleMouseMove, false, this); + + goog.events.listen(map.getTarget(), goog.events.EventType.MOUSEOUT, + this.handleMouseOut, false, this); + + this.handleMapProjectionChanged(); + +}; +goog.inherits(ol.control.MousePosition, ol.Control); + + +/** + * @private + * @type {ol.TransformFunction} + */ +ol.control.MousePosition.prototype.transform_; + + +/** + * @inheritDoc + */ +ol.control.MousePosition.prototype.getElement = function() { + return this.divElement_; +}; + + +/** + * @protected + */ +ol.control.MousePosition.prototype.handleMapProjectionChanged = function() { + var map = this.getMap(); + var mapProjection = map.getProjection(); + if (!goog.isDef(mapProjection) || goog.isNull(this.projection_)) { + this.transform_ = ol.Projection.identityTransform; + } else { + this.transform_ = + ol.Projection.getTransform(mapProjection, this.projection_); + } + this.divElement_.innerHTML = this.undefinedHTML_; +}; + + +/** + * @param {goog.events.BrowserEvent} browserEvent Browser event. + * @protected + */ +ol.control.MousePosition.prototype.handleMouseOut = function(browserEvent) { + this.divElement_.innerHTML = this.undefinedHTML_; +}; + + +/** + * @param {goog.events.BrowserEvent} browserEvent Browser event. + * @protected + */ +ol.control.MousePosition.prototype.handleMouseMove = function(browserEvent) { + var map = this.getMap(); + var pixel = new ol.Pixel(browserEvent.offsetX, browserEvent.offsetY); + var coordinate = map.getCoordinateFromPixel(pixel); + if (goog.isDef(coordinate)) { + coordinate = this.transform_(coordinate); + } + var html; + if (goog.isDef(this.coordinateFormat_)) { + html = this.coordinateFormat_(coordinate); + } else { + html = coordinate.toString(); + } + this.divElement_.innerHTML = html; +}; From d5bd49d86b83e82e224e42c4b7cf53d4abce6d60 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Mon, 13 Aug 2012 16:41:52 +0200 Subject: [PATCH 491/562] Use ol.control.MousePosition in demo --- demos/side-by-side/index.html.in | 3 +++ demos/side-by-side/side-by-side.js | 12 ++++++++++++ 2 files changed, 15 insertions(+) diff --git a/demos/side-by-side/index.html.in b/demos/side-by-side/index.html.in index 179592c67f..38b77955dd 100644 --- a/demos/side-by-side/index.html.in +++ b/demos/side-by-side/index.html.in @@ -21,6 +21,9 @@
+ +
+
diff --git a/demos/side-by-side/side-by-side.js b/demos/side-by-side/side-by-side.js index c5cd067739..15643b8f55 100644 --- a/demos/side-by-side/side-by-side.js +++ b/demos/side-by-side/side-by-side.js @@ -1,5 +1,7 @@ +goog.require('ol.CoordinateFormat'); goog.require('ol.RendererHint'); goog.require('ol.control.Attribution'); +goog.require('ol.control.MousePosition'); goog.require('ol.createMap'); goog.require('ol.interaction.Keyboard'); goog.require('ol.layer.MapQuestOpenAerial'); @@ -32,6 +34,16 @@ var attributionControl = new ol.control.Attribution(domMap); document.getElementById('attribution').appendChild( attributionControl.getElement()); +var domMousePositionControl = new ol.control.MousePosition(domMap, + ol.Projection.getFromCode('EPSG:4326'), ol.CoordinateFormat.hdms, ' '); +document.getElementById('domMousePosition').appendChild( + domMousePositionControl.getElement()); + +var webglMousePositionControl = new ol.control.MousePosition(webglMap, + ol.Projection.getFromCode('EPSG:4326'), ol.CoordinateFormat.hdms, ' '); +document.getElementById('webglMousePosition').appendChild( + webglMousePositionControl.getElement()); + var keyboardInteraction = new ol.interaction.Keyboard(); keyboardInteraction.addCallback('0', function() { layer.setBrightness(0); From e9e1b8eaa9efdeaa135ad5cda2cf7394be4e3c80 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Mon, 13 Aug 2012 17:24:25 +0200 Subject: [PATCH 492/562] Improve handling of undefined coordinates --- src/ol/control/mouseposition.js | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/ol/control/mouseposition.js b/src/ol/control/mouseposition.js index d03bb38646..3739fdeec2 100644 --- a/src/ol/control/mouseposition.js +++ b/src/ol/control/mouseposition.js @@ -111,14 +111,16 @@ ol.control.MousePosition.prototype.handleMouseMove = function(browserEvent) { var map = this.getMap(); var pixel = new ol.Pixel(browserEvent.offsetX, browserEvent.offsetY); var coordinate = map.getCoordinateFromPixel(pixel); + var html; if (goog.isDef(coordinate)) { coordinate = this.transform_(coordinate); - } - var html; - if (goog.isDef(this.coordinateFormat_)) { - html = this.coordinateFormat_(coordinate); + if (goog.isDef(this.coordinateFormat_)) { + html = this.coordinateFormat_(coordinate); + } else { + html = coordinate.toString(); + } } else { - html = coordinate.toString(); + html = this.undefinedHTML_; } this.divElement_.innerHTML = html; }; From 5ae3d25f52199d59da1dc710fd8603515706e5d4 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Mon, 13 Aug 2012 17:24:31 +0200 Subject: [PATCH 493/562] Add some FIXMEs --- src/ol/control/mouseposition.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/ol/control/mouseposition.js b/src/ol/control/mouseposition.js index 3739fdeec2..4288772805 100644 --- a/src/ol/control/mouseposition.js +++ b/src/ol/control/mouseposition.js @@ -1,3 +1,5 @@ +// FIXME should listen on appropriate pane, once it is defined + goog.provide('ol.control.MousePosition'); goog.require('goog.events'); @@ -90,6 +92,7 @@ ol.control.MousePosition.prototype.handleMapProjectionChanged = function() { this.transform_ = ol.Projection.getTransform(mapProjection, this.projection_); } + // FIXME should we instead re-calculate using the last known mouse position? this.divElement_.innerHTML = this.undefinedHTML_; }; From 85fb3980b67e44617a9d0a44581b2aa4e5414f43 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Mon, 13 Aug 2012 17:52:46 +0200 Subject: [PATCH 494/562] Add missing closing tag --- demos/side-by-side/index.html.in | 1 + 1 file changed, 1 insertion(+) diff --git a/demos/side-by-side/index.html.in b/demos/side-by-side/index.html.in index 38b77955dd..1865bc9f00 100644 --- a/demos/side-by-side/index.html.in +++ b/demos/side-by-side/index.html.in @@ -24,6 +24,7 @@
+
From 07c3cd3d8d32ef40967402562f1befd6e4c0f6cc Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Mon, 13 Aug 2012 18:02:05 +0200 Subject: [PATCH 495/562] Fix drag pan for rotated maps --- demos/side-by-side/index.html.in | 1 - src/ol/interaction/dragpan.js | 6 ++++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/demos/side-by-side/index.html.in b/demos/side-by-side/index.html.in index 1865bc9f00..0e9ced36a5 100644 --- a/demos/side-by-side/index.html.in +++ b/demos/side-by-side/index.html.in @@ -67,7 +67,6 @@

Notes: The two maps share the same center, resolution, rotation and layers. Currently the DOM map does not support rotation.

Console tips: If you want to play around with the API in the console, first make sure that you're using the simple optimizations version of this demo, then open a console and experiment with the domMap, webglMap and layer variables in the console. The source code is in side-by-side.js.

-

Known bugs: When the map is rotated, panning on the WebGL map doesn't work as expected.

diff --git a/src/ol/interaction/dragpan.js b/src/ol/interaction/dragpan.js index 9fe4639823..4e7b40ab5b 100644 --- a/src/ol/interaction/dragpan.js +++ b/src/ol/interaction/dragpan.js @@ -1,5 +1,3 @@ -// FIXME cope with rotation - goog.provide('ol.interaction.DragPan'); goog.require('ol.Coordinate'); @@ -26,8 +24,12 @@ goog.inherits(ol.interaction.DragPan, ol.interaction.Drag); ol.interaction.DragPan.prototype.handleDrag = function(mapBrowserEvent) { var map = mapBrowserEvent.map; var resolution = map.getResolution(); + var rotation = map.getRotation(); var delta = new ol.Coordinate(-resolution * this.deltaX, resolution * this.deltaY); + if (map.canRotate() && goog.isDef(rotation)) { + delta.rotate(rotation); + } this.pan(map, delta, this.startCenter); }; From 8a2074a3838338a2459690497a707834ba06224f Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Mon, 13 Aug 2012 18:40:03 +0200 Subject: [PATCH 496/562] Don't listen to earlycancel dragger events earlycancel drag events do not have a corresponding goog.events.BrowserEvent object, which breaks many interactions. --- src/ol/base/map.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/ol/base/map.js b/src/ol/base/map.js index 4e7ab7aa0a..8bc070dcc8 100644 --- a/src/ol/base/map.js +++ b/src/ol/base/map.js @@ -143,8 +143,7 @@ ol.Map = function(target, opt_values, opt_viewportSizeMonitor) { goog.events.listen(dragger, [ goog.fx.Dragger.EventType.START, goog.fx.Dragger.EventType.DRAG, - goog.fx.Dragger.EventType.END, - goog.fx.Dragger.EventType.EARLY_CANCEL + goog.fx.Dragger.EventType.END ], this.handleDraggerEvent, false, this); this.registerDisposable(dragger); From c7f78caec9ea01daf1af7c4e1cee29a456a1657f Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Mon, 13 Aug 2012 18:41:10 +0200 Subject: [PATCH 497/562] Check left mouse button is pressed in interactions --- src/ol/interaction/altdragrotate.js | 3 ++- src/ol/interaction/dblclickzoom.js | 4 +++- src/ol/interaction/shiftdragzoom.js | 2 +- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/ol/interaction/altdragrotate.js b/src/ol/interaction/altdragrotate.js index 03cbbf6d71..5c42c4d434 100644 --- a/src/ol/interaction/altdragrotate.js +++ b/src/ol/interaction/altdragrotate.js @@ -44,7 +44,8 @@ ol.interaction.AltDragRotate.prototype.handleDragStart = function(mapBrowserEvent) { var browserEvent = mapBrowserEvent.browserEvent; var map = mapBrowserEvent.map; - if (map.canRotate() && browserEvent.altKey) { + if (browserEvent.isMouseActionButton() && browserEvent.altKey && + map.canRotate()) { var size = map.getSize(); var theta = Math.atan2( size.height / 2 - browserEvent.offsetY, diff --git a/src/ol/interaction/dblclickzoom.js b/src/ol/interaction/dblclickzoom.js index 2a223c81ac..89bad5955d 100644 --- a/src/ol/interaction/dblclickzoom.js +++ b/src/ol/interaction/dblclickzoom.js @@ -23,7 +23,9 @@ goog.inherits(ol.interaction.DblClickZoom, ol.Interaction); */ ol.interaction.DblClickZoom.prototype.handleMapBrowserEvent = function(mapBrowserEvent) { - if (mapBrowserEvent.type == goog.events.EventType.DBLCLICK) { + var browserEvent = mapBrowserEvent.browserEvent; + if (browserEvent.type == goog.events.EventType.DBLCLICK && + browserEvent.isMouseActionButton()) { var map = mapBrowserEvent.map; var resolution = map.getResolution(); var delta = mapBrowserEvent.browserEvent.shiftKey ? -1 : 1; diff --git a/src/ol/interaction/shiftdragzoom.js b/src/ol/interaction/shiftdragzoom.js index a10e887d17..ce70e4d0c7 100644 --- a/src/ol/interaction/shiftdragzoom.js +++ b/src/ol/interaction/shiftdragzoom.js @@ -55,7 +55,7 @@ ol.interaction.ShiftDragZoom.prototype.handleDragEnd = ol.interaction.ShiftDragZoom.prototype.handleDragStart = function(mapBrowserEvent) { var browserEvent = mapBrowserEvent.browserEvent; - if (browserEvent.shiftKey) { + if (browserEvent.isMouseActionButton() && browserEvent.shiftKey) { browserEvent.preventDefault(); return true; } else { From d9eb9eda60389ed24bfce34c8cec74f2bb904ec3 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Mon, 13 Aug 2012 21:31:41 +0200 Subject: [PATCH 498/562] Add missing check --- src/ol/control/attribution.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/ol/control/attribution.js b/src/ol/control/attribution.js index 1b45e36ef2..8157301ff1 100644 --- a/src/ol/control/attribution.js +++ b/src/ol/control/attribution.js @@ -116,6 +116,7 @@ ol.control.Attribution.prototype.createAttributionElementsForLayer_ = if (!map.isDef || !layerVisible || + goog.isNull(attributionVisibilities) || !attributionVisibilities[attributionKey]) { goog.style.showElement(attributionElement, false); } From 9b4b35f9eb08ad891258a084681d3fabd3c88fa2 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Mon, 13 Aug 2012 21:32:41 +0200 Subject: [PATCH 499/562] Add two layers demo --- Makefile | 32 +++++++++++++++++- demos/two-layers/index.html.in | 32 ++++++++++++++++++ demos/two-layers/two-layers.js | 57 ++++++++++++++++++++++++++++++++ demos/two-layers/two-layers.json | 9 +++++ 4 files changed, 129 insertions(+), 1 deletion(-) create mode 100644 demos/two-layers/index.html.in create mode 100644 demos/two-layers/two-layers.js create mode 100644 demos/two-layers/two-layers.json diff --git a/Makefile b/Makefile index 000889bc29..7d8934de3d 100644 --- a/Makefile +++ b/Makefile @@ -28,7 +28,7 @@ build/ol3.js: $(SRC) ( echo "goog.require('goog.dom');" ; find src/ol -name \*.js | xargs grep -rh ^goog.provide | sort | uniq | sed -e 's/provide/require/g' ) > $@ .PHONY: demos -demos: demos/api1 demos/proj4js demos/side-by-side +demos: demos/api1 demos/proj4js demos/side-by-side demos/two-layers .PHONY: demos/api1 demos/api1: \ @@ -84,6 +84,36 @@ demos/side-by-side/simple-optimizations.js: $(PLOVR_JAR) $(SRC) base.json \ @echo $@ "uncompressed:" $$(wc -c <$@) bytes @echo $@ " compressed:" $$(gzip -9 -c <$@ | wc -c) bytes +.PHONY: demos/two-layers +demos/two-layers: \ + demos/two-layers/advanced-optimizations.html \ + demos/two-layers/advanced-optimizations.js \ + demos/two-layers/debug.html \ + demos/two-layers/simple-optimizations.html \ + demos/two-layers/simple-optimizations.js + +demos/two-layers/advanced-optimizations.html: demos/two-layers/index.html.in + sed -e 's|@SRC@|advanced-optimizations.js|' $< > $@ + +demos/two-layers/advanced-optimizations.js: $(PLOVR_JAR) $(SRC) base.json \ + demos/two-layers/two-layers.json demos/two-layers/two-layers.js + java -jar $(PLOVR_JAR) build demos/two-layers/two-layers.json >$@ + @echo $@ "uncompressed:" $$(wc -c <$@) bytes + @echo $@ " compressed:" $$(gzip -9 -c <$@ | wc -c) bytes + +demos/two-layers/debug.html: demos/two-layers/index.html.in + sed -e 's|@SRC@|http://localhost:9810/compile?id=demo-two-layers|' $< > $@ + +demos/two-layers/simple-optimizations.html: demos/two-layers/index.html.in + sed -e 's|@SRC@|simple-optimizations.js|' $< > $@ + +# FIXME invoke plovr directly, rather than assuming that the server is running +demos/two-layers/simple-optimizations.js: $(PLOVR_JAR) $(SRC) base.json \ + demos/two-layers/two-layers.json demos/two-layers/two-layers.js + curl 'http://localhost:9810/compile?id=demo-two-layers&mode=SIMPLE' > $@ + @echo $@ "uncompressed:" $$(wc -c <$@) bytes + @echo $@ " compressed:" $$(gzip -9 -c <$@ | wc -c) bytes + .PHONY: serve serve: $(PLOVR_JAR) java -jar $(PLOVR_JAR) serve build/ol3.json build/ol3-api.json demos/*/*.json diff --git a/demos/two-layers/index.html.in b/demos/two-layers/index.html.in new file mode 100644 index 0000000000..96c1c5922b --- /dev/null +++ b/demos/two-layers/index.html.in @@ -0,0 +1,32 @@ + + + + + ol3 two-layers demo + + +

ol3 two-layers demo

+ + + + + + + + + + + + +
DOMWebGL
Coming soon...
+
+
+ + + diff --git a/demos/two-layers/two-layers.js b/demos/two-layers/two-layers.js new file mode 100644 index 0000000000..844d456a97 --- /dev/null +++ b/demos/two-layers/two-layers.js @@ -0,0 +1,57 @@ +goog.require('ol.Coordinate'); +goog.require('ol.RendererHint'); +goog.require('ol.control.Attribution'); +goog.require('ol.createMap'); +goog.require('ol.layer.BingMaps'); +goog.require('ol.layer.TileJSON'); + + +/** + * @define {boolean} Enable DOM map. + * FIXME The DOM renderer doesn't support partially-loaded layers yet + * FIXME Remove this define when it does + */ +ol.TWO_LAYERS_DEMO_ENABLE_DOM = false; + + +var layer1 = new ol.layer.BingMaps( + ol.BingMapsStyle.AERIAL, + 'AheP841R-MsLErKQChaTba_xDoOCl40-EeTubD9uNhNAyQTePwFY9iVD1_pyqqlE'); +var layer2 = new ol.layer.TileJSON( + 'http://api.tiles.mapbox.com/v3/mapbox.va-quake-aug.jsonp'); + +var layers = new ol.Collection([layer1, layer2]); + +var webglMap = ol.createMap( + document.getElementById('webglMap'), + {'layers': new ol.Collection([layer1, layer2])}, + ol.RendererHint.WEBGL); + +goog.events.listen(layer2, goog.events.EventType.LOAD, function() { + webglMap.setUserCenter(new ol.Coordinate(-77.93254999999999, 37.9555)); + webglMap.setResolution(layer2.getStore().getResolutions()[5]); +}); + +var domMap; +if (ol.TWO_LAYERS_DEMO_ENABLE_DOM) { + domMap = ol.createMap( + document.getElementById('domMap'), + {'layers': layers}, + ol.RendererHint.DOM); + domMap.bindTo('center', webglMap); + domMap.bindTo('layers', webglMap); + domMap.bindTo('resolution', webglMap); + domMap.bindTo('rotation', webglMap); +} else { + domMap = null; +} + +var attributionControl = new ol.control.Attribution(webglMap); +document.getElementById('attribution').appendChild( + attributionControl.getElement()); + +goog.exportSymbol('layer1', layer1); +goog.exportSymbol('layer2', layer2); +goog.exportSymbol('layers', layers); +goog.exportSymbol('domMap', domMap); +goog.exportSymbol('webglMap', webglMap); diff --git a/demos/two-layers/two-layers.json b/demos/two-layers/two-layers.json new file mode 100644 index 0000000000..722701e841 --- /dev/null +++ b/demos/two-layers/two-layers.json @@ -0,0 +1,9 @@ +{ + + "id": "demo-two-layers", + + "inherits": "../../base.json", + + "inputs": "demos/two-layers/two-layers.js" + +} From 9efa34a2a340d9d8788fddbb91eafacfab1a3805 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Lemoine?= Date: Mon, 13 Aug 2012 23:38:37 +0200 Subject: [PATCH 500/562] separate map and renderer --- src/ol/base/createmap.js | 12 +- src/ol/base/layerrenderer.js | 18 +- src/ol/base/map.js | 285 +----------------- src/ol/base/maprenderer.js | 367 ++++++++++++++++++++++++ src/ol/dom/layerrenderer.js | 12 +- src/ol/dom/{map.js => maprenderer.js} | 44 ++- src/ol/dom/tilelayerrenderer.js | 6 +- src/ol/webgl/layerrenderer.js | 15 +- src/ol/webgl/{map.js => maprenderer.js} | 67 ++--- src/ol/webgl/tilelayerrenderer.js | 14 +- 10 files changed, 473 insertions(+), 367 deletions(-) create mode 100644 src/ol/base/maprenderer.js rename src/ol/dom/{map.js => maprenderer.js} (79%) rename src/ol/webgl/{map.js => maprenderer.js} (89%) diff --git a/src/ol/base/createmap.js b/src/ol/base/createmap.js index e0d90a3c66..304005cdd6 100644 --- a/src/ol/base/createmap.js +++ b/src/ol/base/createmap.js @@ -7,7 +7,7 @@ goog.require('ol.Map'); goog.require('ol.MapProperty'); goog.require('ol.Projection'); goog.require('ol.dom'); -goog.require('ol.dom.Map'); +goog.require('ol.dom.MapRenderer'); goog.require('ol.interaction.AltDragRotate'); goog.require('ol.interaction.CenterConstraint'); goog.require('ol.interaction.Constraints'); @@ -20,7 +20,7 @@ goog.require('ol.interaction.ResolutionConstraint'); goog.require('ol.interaction.RotationConstraint'); goog.require('ol.interaction.ShiftDragZoom'); goog.require('ol.webgl'); -goog.require('ol.webgl.Map'); +goog.require('ol.webgl.MapRenderer'); /** @@ -128,16 +128,18 @@ ol.createMap = function(target, opt_values, opt_rendererHints) { rendererHints = ol.DEFAULT_RENDERER_HINT; } - var i, rendererHint; + var i, rendererHint, rendererConstructor; for (i = 0; i < rendererHints.length; ++i) { rendererHint = rendererHints[i]; if (rendererHint == ol.RendererHint.DOM) { if (ol.ENABLE_DOM && ol.dom.isSupported()) { - return new ol.dom.Map(target, values); + rendererConstructor = ol.dom.MapRenderer; + return new ol.Map(target, rendererConstructor, values); } } else if (rendererHint == ol.RendererHint.WEBGL) { if (ol.ENABLE_WEBGL && ol.webgl.isSupported()) { - return new ol.webgl.Map(target, values); + rendererConstructor = ol.webgl.MapRenderer; + return new ol.Map(target, rendererConstructor, values); } } } diff --git a/src/ol/base/layerrenderer.js b/src/ol/base/layerrenderer.js index f6c94f6abf..cc4074761a 100644 --- a/src/ol/base/layerrenderer.js +++ b/src/ol/base/layerrenderer.js @@ -11,18 +11,18 @@ goog.require('ol.Object'); /** * @constructor * @extends {ol.Object} - * @param {ol.Map} map Map. + * @param {ol.MapRenderer} mapRenderer Map renderer. * @param {ol.Layer} layer Layer. */ -ol.LayerRenderer = function(map, layer) { +ol.LayerRenderer = function(mapRenderer, layer) { goog.base(this); /** * @private - * @type {ol.Map} + * @type {ol.MapRenderer} */ - this.map_ = map; + this.mapRenderer_ = mapRenderer; /** * @private @@ -69,11 +69,19 @@ ol.LayerRenderer.prototype.getLayer = function() { }; +/** + * @return {ol.MapRenderer} Map renderer. + */ +ol.LayerRenderer.prototype.getMapRenderer = function() { + return this.mapRenderer_; +}; + + /** * @return {ol.Map} Map. */ ol.LayerRenderer.prototype.getMap = function() { - return this.map_; + return this.mapRenderer_.getMap(); }; diff --git a/src/ol/base/map.js b/src/ol/base/map.js index 8bc070dcc8..2a92bbd577 100644 --- a/src/ol/base/map.js +++ b/src/ol/base/map.js @@ -71,11 +71,13 @@ ol.MapPaneZIndex = { * @constructor * @extends {ol.Object} * @param {Element} target Target. + * @param {Function} rendererConstructor Renderer constructor. * @param {Object=} opt_values Values. * @param {goog.dom.ViewportSizeMonitor=} opt_viewportSizeMonitor * Viewport size monitor. */ -ol.Map = function(target, opt_values, opt_viewportSizeMonitor) { +ol.Map = function( + target, rendererConstructor, opt_values, opt_viewportSizeMonitor) { goog.base(this); @@ -148,22 +150,11 @@ ol.Map = function(target, opt_values, opt_viewportSizeMonitor) { this.registerDisposable(dragger); /** + * @type {ol.MapRenderer} * @private - * @type {goog.fx.anim.Animated} */ - this.animation_ = new ol.MapAnimation(this); - - /** - * @private - * @type {boolean} - */ - this.animating_ = false; - - /** - * @private - * @type {number} - */ - this.freezeRenderingCount_ = 0; + this.renderer_ = new rendererConstructor(target, this); + this.registerDisposable(this.renderer_); /** * @private @@ -171,18 +162,6 @@ ol.Map = function(target, opt_values, opt_viewportSizeMonitor) { */ this.target_ = target; - /** - * @private - * @type {Array.} - */ - this.layersListenerKeys_ = null; - - /** - * @protected - * @type {Object.} - */ - this.layerRenderers = {}; - /** * @private * @type {goog.dom.ViewportSizeMonitor} @@ -193,18 +172,10 @@ ol.Map = function(target, opt_values, opt_viewportSizeMonitor) { goog.events.listen(this.viewportSizeMonitor_, goog.events.EventType.RESIZE, this.handleViewportResize, false, this); - goog.events.listen(this, - ol.Object.getChangedEventType(ol.MapProperty.BACKGROUND_COLOR), - this.handleBackgroundColorChanged, false, this); - goog.events.listen( this, ol.Object.getChangedEventType(ol.MapProperty.CENTER), this.handleCenterChanged, false, this); - goog.events.listen( - this, ol.Object.getChangedEventType(ol.MapProperty.LAYERS), - this.handleLayersChanged, false, this); - goog.events.listen( this, ol.Object.getChangedEventType(ol.MapProperty.PROJECTION), this.handleProjectionChanged, false, this); @@ -229,52 +200,17 @@ ol.Map = function(target, opt_values, opt_viewportSizeMonitor) { this.setValues(opt_values); } + this.handleViewportResize(); + }; goog.inherits(ol.Map, ol.Object); -/** - * @param {ol.Layer} layer Layer. - * @protected - */ -ol.Map.prototype.addLayer = function(layer) { - var layerRenderer = this.createLayerRenderer(layer); - this.setLayerRenderer(layer, layerRenderer); -}; - - -/** - * @private - */ -ol.Map.prototype.animate_ = function() { - goog.asserts.assert(!this.animating_); - goog.fx.anim.registerAnimation(this.animation_); - this.animating_ = true; -}; - - /** * @return {boolean} Can rotate. */ -ol.Map.prototype.canRotate = goog.functions.FALSE; - - -/** - * @param {ol.Layer} layer Layer. - * @protected - * @return {ol.LayerRenderer} layerRenderer Layer renderer. - */ -ol.Map.prototype.createLayerRenderer = goog.abstractMethod; - - -/** - * @inheritDoc - */ -ol.Map.prototype.disposeInternal = function() { - goog.object.forEach(this.layerRenderers, function(layerRenderer) { - goog.dispose(layerRenderer); - }); - goog.base(this, 'disposeInternal'); +ol.Map.prototype.canRotate = function() { + return this.renderer_.canRotate(); }; @@ -300,29 +236,6 @@ ol.Map.prototype.fitUserExtent = function(userExtent) { }; -/** - * @param {function(this: T, ol.Layer, ol.LayerRenderer, number)} f Function. - * @param {T=} opt_obj Object. - * @template T - */ -ol.Map.prototype.forEachReadyVisibleLayer = function(f, opt_obj) { - var layers = this.getLayers(); - layers.forEach(function(layer, index) { - if (layer.isReady() && layer.getVisible()) { - var layerRenderer = this.getLayerRenderer(layer); - f.call(opt_obj, layer, layerRenderer, index); - } - }, this); -}; - - -/** - */ -ol.Map.prototype.freezeRendering = function() { - ++this.freezeRenderingCount_; -}; - - /** * @return {ol.Color|undefined} Background color. */ @@ -395,19 +308,6 @@ goog.exportProperty( ol.Map.prototype.getInteractions); -/** - * @param {ol.Layer} layer Layer. - * @protected - * @return {ol.LayerRenderer} Layer renderer. - */ -ol.Map.prototype.getLayerRenderer = function(layer) { - var key = goog.getUid(layer); - var layerRenderer = this.layerRenderers[key]; - goog.asserts.assert(goog.isDef(layerRenderer)); - return layerRenderer; -}; - - /** * @return {ol.Collection} Layers. */ @@ -568,11 +468,6 @@ goog.exportProperty( ol.Map.prototype.getUserProjection); -/** - */ -ol.Map.prototype.handleBackgroundColorChanged = goog.nullFunction; - - /** * @param {goog.events.BrowserEvent} browserEvent Browser event. * @param {string=} opt_type Type. @@ -607,52 +502,6 @@ ol.Map.prototype.handleDraggerEvent = function(dragEvent) { }; -/** - * @param {ol.CollectionEvent} collectionEvent Collection event. - * @protected - */ -ol.Map.prototype.handleLayersAdd = function(collectionEvent) { - var layer = /** @type {ol.Layer} */ collectionEvent.elem; - this.addLayer(layer); -}; - - -/** - * @protected - */ -ol.Map.prototype.handleLayersChanged = function() { - var layerRenderers = goog.object.getValues(this.layerRenderers); - goog.array.forEach(layerRenderers, function(layerRenderer) { - this.removeLayerRenderer(layerRenderer); - }, this); - this.layerRenderers = {}; - if (!goog.isNull(this.layersListenerKeys_)) { - goog.array.forEach(this.layersListenerKeys_, goog.events.unlistenByKey); - this.layersListenerKeys_ = null; - } - var layers = this.getLayers(); - if (goog.isDefAndNotNull(layers)) { - layers.forEach(this.addLayer, this); - this.layersListenerKeys_ = [ - goog.events.listen(layers, ol.CollectionEventType.ADD, - this.handleLayersAdd, false, this), - goog.events.listen(layers, ol.CollectionEventType.REMOVE, - this.handleLayersRemove, false, this) - ]; - } -}; - - -/** - * @param {ol.CollectionEvent} collectionEvent Collection event. - * @protected - */ -ol.Map.prototype.handleLayersRemove = function(collectionEvent) { - var layer = /** @type {ol.Layer} */ collectionEvent.elem; - this.removeLayer(layer); -}; - - /** * @protected */ @@ -731,63 +580,6 @@ ol.Map.prototype.recalculateTransforms_ = function() { }; -/** - * @param {ol.Layer} layer Layer. - * @protected - */ -ol.Map.prototype.removeLayer = function(layer) { - goog.dispose(this.removeLayerRenderer(layer)); -}; - - -/** - * @param {ol.Layer} layer Layer. - * @return {ol.LayerRenderer} Layer renderer. - * @protected - */ -ol.Map.prototype.removeLayerRenderer = function(layer) { - var key = goog.getUid(layer); - if (key in this.layerRenderers) { - var layerRenderer = this.layerRenderers[key]; - delete this.layerRenderers[key]; - return layerRenderer; - } else { - return null; - } -}; - - -/** - */ -ol.Map.prototype.render = function() { - if (!this.animating_) { - if (this.freezeRenderingCount_ === 0) { - if (this.renderInternal()) { - this.animate_(); - } - } else { - this.dirty_ = true; - } - } -}; - - -/** - * @protected - * @return {boolean} Animating. - */ -ol.Map.prototype.renderInternal = function() { - this.dirty_ = false; - var animate = false; - this.forEachReadyVisibleLayer(function(layer, layerRenderer) { - if (layerRenderer.render()) { - animate = true; - } - }); - return animate; -}; - - /** * @param {ol.Color} backgroundColor Background color. */ @@ -824,18 +616,6 @@ goog.exportProperty( ol.Map.prototype.setInteractions); -/** - * @param {ol.Layer} layer Layer. - * @param {ol.LayerRenderer} layerRenderer Layer renderer. - * @protected - */ -ol.Map.prototype.setLayerRenderer = function(layer, layerRenderer) { - var key = goog.getUid(layer); - goog.asserts.assert(!(key in this.layerRenderers)); - this.layerRenderers[key] = layerRenderer; -}; - - /** * @export * @param {ol.Collection} layers Layers. @@ -929,20 +709,6 @@ goog.exportProperty( ol.Map.prototype.setUserProjection); -/** - */ -ol.Map.prototype.unfreezeRendering = function() { - goog.asserts.assert(this.freezeRenderingCount_ > 0); - if (--this.freezeRenderingCount_ === 0) { - if (!this.animating_ && this.dirty_) { - if (this.renderInternal()) { - this.animate_(); - } - } - } -}; - - /** * @private */ @@ -1010,37 +776,10 @@ ol.Map.prototype.updateMatrices_ = function() { * @template T */ ol.Map.prototype.withFrozenRendering = function(f, opt_obj) { - this.freezeRendering(); + this.renderer_.freezeRendering(); try { f.call(opt_obj); } finally { - this.unfreezeRendering(); - } -}; - - - -/** - * @constructor - * @implements {goog.fx.anim.Animated} - * @param {!ol.Map} map Map. - */ -ol.MapAnimation = function(map) { - - /** - * @private - * @type {ol.Map} - */ - this.map_ = map; - -}; - - -/** - * @inheritDoc - */ -ol.MapAnimation.prototype.onAnimationFrame = function() { - if (!this.map_.renderInternal()) { - goog.fx.anim.unregisterAnimation(this); + this.renderer_.unfreezeRendering(); } }; diff --git a/src/ol/base/maprenderer.js b/src/ol/base/maprenderer.js new file mode 100644 index 0000000000..5a23174be0 --- /dev/null +++ b/src/ol/base/maprenderer.js @@ -0,0 +1,367 @@ +// FIXME unregister listeners when disposed + +goog.provide('ol.MapRenderer'); + +goog.require('goog.events'); +goog.require('goog.Disposable'); +goog.require('goog.fx.anim'); +goog.require('goog.fx.anim.Animated'); +goog.require('ol.Map'); +goog.require('ol.MapProperty'); + +/** + * @constructor + * @extends {goog.Disposable} + * @param {Element} target Target. + * @param {ol.Map} map Map. + */ +ol.MapRenderer = function(target, map) { + + goog.base(this); + + /** + * @private + * @type {Element} + */ + this.target_ = target; + + /** + * @protected + * @type {ol.Map} + */ + this.map = map; + + /** + * @private + * @type {ol.MapRendererAnimation} + */ + this.animation_ = new ol.MapRendererAnimation(this); + + /** + * @private + * @type {boolean} + */ + this.animating_ = false; + + /** + * @private + * @type {boolean} + */ + this.dirty_ = false; + + /** + * @private + * @type {number} + */ + this.freezeRenderingCount_ = 0; + + /** + * @private + * @type {Array.} + */ + this.layersListenerKeys_ = null; + + /** + * @protected + * @type {Object.} + */ + this.layerRenderers = {}; + + goog.events.listen(map, + ol.Object.getChangedEventType(ol.MapProperty.BACKGROUND_COLOR), + this.handleBackgroundColorChanged, false, this); + + goog.events.listen( + map, ol.Object.getChangedEventType(ol.MapProperty.CENTER), + this.handleCenterChanged, false, this); + + goog.events.listen( + map, ol.Object.getChangedEventType(ol.MapProperty.LAYERS), + this.handleLayersChanged, false, this); + + goog.events.listen( + map, ol.Object.getChangedEventType(ol.MapProperty.RESOLUTION), + this.handleResolutionChanged, false, this); + + goog.events.listen( + map, ol.Object.getChangedEventType(ol.MapProperty.ROTATION), + this.handleRotationChanged, false, this); + + goog.events.listen( + map, ol.Object.getChangedEventType(ol.MapProperty.SIZE), + this.handleSizeChanged, false, this); +}; +goog.inherits(ol.MapRenderer, goog.Disposable); + + +/** + * @inheritDoc + */ +ol.MapRenderer.prototype.disposeInternal = function() { + goog.object.forEach(this.layerRenderers, function(layerRenderer) { + goog.dispose(layerRenderer); + }); + goog.base(this, 'disposeInternal'); +}; + + +/** + * @param {function(this: T, ol.Layer, ol.LayerRenderer, number)} f Function. + * @param {T=} opt_obj Object. + * @template T + */ +ol.MapRenderer.prototype.forEachReadyVisibleLayer = function(f, opt_obj) { + var layers = this.map.getLayers(); + layers.forEach(function(layer, index) { + if (layer.isReady() && layer.getVisible()) { + var layerRenderer = this.getLayerRenderer(layer); + f.call(opt_obj, layer, layerRenderer, index); + } + }, this); +}; + + +/** + * @return {ol.Map} + */ +ol.MapRenderer.prototype.getMap = function() { + return this.map; +}; + + +/** + * @param {ol.Layer} layer Layer. + * @protected + * @return {ol.LayerRenderer} Layer renderer. + */ +ol.MapRenderer.prototype.getLayerRenderer = function(layer) { + var key = goog.getUid(layer); + var layerRenderer = this.layerRenderers[key]; + goog.asserts.assert(goog.isDef(layerRenderer)); + return layerRenderer; +}; + + +/** + * @param {ol.Layer} layer Layer. + * @param {ol.LayerRenderer} layerRenderer Layer renderer. + * @protected + */ +ol.MapRenderer.prototype.setLayerRenderer = function(layer, layerRenderer) { + var key = goog.getUid(layer); + goog.asserts.assert(!(key in this.layerRenderers)); + this.layerRenderers[key] = layerRenderer; +}; + + +/** + * @return {boolean} Can rotate. + */ +ol.MapRenderer.prototype.canRotate = goog.functions.FALSE; + + +/** + */ +ol.MapRenderer.prototype.handleBackgroundColorChanged = goog.nullFunction; + + +/** + * @protected + */ +ol.MapRenderer.prototype.handleCenterChanged = goog.nullFunction; + + +/** + * @protected + */ +ol.MapRenderer.prototype.handleLayersChanged = function() { + var layerRenderers = goog.object.getValues(this.layerRenderers); + goog.array.forEach(layerRenderers, function(layerRenderer) { + this.removeLayerRenderer(layerRenderer); + }, this); + this.layerRenderers = {}; + if (!goog.isNull(this.layersListenerKeys_)) { + goog.array.forEach(this.layersListenerKeys_, goog.events.unlistenByKey); + this.layersListenerKeys_ = null; + } + var layers = this.map.getLayers(); + if (goog.isDefAndNotNull(layers)) { + layers.forEach(this.addLayer, this); + this.layersListenerKeys_ = [ + goog.events.listen(layers, ol.CollectionEventType.ADD, + this.handleLayersAdd, false, this), + goog.events.listen(layers, ol.CollectionEventType.REMOVE, + this.handleLayersRemove, false, this) + ]; + } +}; + + +/** + * @param {ol.CollectionEvent} collectionEvent Collection event. + * @protected + */ +ol.MapRenderer.prototype.handleLayersAdd = function(collectionEvent) { + var layer = /** @type {ol.Layer} */ collectionEvent.elem; + this.addLayer(layer); +}; + + +/** + * @param {ol.Layer} layer Layer. + * @protected + */ +ol.MapRenderer.prototype.addLayer = function(layer) { + var layerRenderer = this.createLayerRenderer(layer); + this.setLayerRenderer(layer, layerRenderer); +}; + + +/** + * @param {ol.Layer} layer Layer. + * @protected + * @return {ol.LayerRenderer} layerRenderer Layer renderer. + */ +ol.MapRenderer.prototype.createLayerRenderer = goog.abstractMethod; + + +/** + * @param {ol.CollectionEvent} collectionEvent Collection event. + * @protected + */ +ol.MapRenderer.prototype.handleLayersRemove = function(collectionEvent) { + var layer = /** @type {ol.Layer} */ collectionEvent.elem; + this.removeLayer(layer); +}; + + +/** + * @param {ol.Layer} layer Layer. + * @protected + */ +ol.MapRenderer.prototype.removeLayer = function(layer) { + goog.dispose(this.removeLayerRenderer(layer)); +}; + + +/** + * @param {ol.Layer} layer Layer. + * @return {ol.LayerRenderer} Layer renderer. + * @protected + */ +ol.MapRenderer.prototype.removeLayerRenderer = function(layer) { + var key = goog.getUid(layer); + if (key in this.layerRenderers) { + var layerRenderer = this.layerRenderers[key]; + delete this.layerRenderers[key]; + return layerRenderer; + } else { + return null; + } +}; + + +/** + * @protected + */ +ol.MapRenderer.prototype.handleResolutionChanged = goog.nullFunction; + + +/** + * @protected + */ +ol.MapRenderer.prototype.handleRotationChanged = goog.nullFunction; + + +/** + * @protected + */ +ol.MapRenderer.prototype.handleSizeChanged = goog.nullFunction; + + +/** + */ +ol.MapRenderer.prototype.render = function() { + if (!this.animating_) { + if (this.freezeRenderingCount_ === 0) { + if (this.renderInternal()) { + this.animate_(); + } + } else { + this.dirty_ = true; + } + } +}; + + +/** + * @protected + * @return {boolean} Animating. + */ +ol.MapRenderer.prototype.renderInternal = function() { + this.dirty_ = false; + var animate = false; + this.forEachReadyVisibleLayer(function(layer, layerRenderer) { + if (layerRenderer.render()) { + animate = true; + } + }); + return animate; +}; + + +/** + * @private + */ +ol.MapRenderer.prototype.animate_ = function() { + goog.asserts.assert(!this.animating_); + goog.fx.anim.registerAnimation(this.animation_); + this.animating_ = true; +}; + + +/** + */ +ol.MapRenderer.prototype.freezeRendering = function() { + ++this.freezeRenderingCount_; +}; + + +/** + */ +ol.MapRenderer.prototype.unfreezeRendering = function() { + goog.asserts.assert(this.freezeRenderingCount_ > 0); + if (--this.freezeRenderingCount_ === 0) { + if (!this.animating_ && this.dirty_) { + if (this.renderInternal()) { + this.animate_(); + } + } + } +}; + + +/** + * @constructor + * @implements {goog.fx.anim.Animated} + * @param {!ol.MapRenderer} renderer renderer. + */ +ol.MapRendererAnimation = function(renderer) { + + /** + * @private + * @type {ol.MapRenderer} + */ + this.renderer_ = renderer; + +}; + + +/** + * @inheritDoc + */ +ol.MapRendererAnimation.prototype.onAnimationFrame = function() { + if (!this.renderer_.renderInternal()) { + goog.fx.anim.unregisterAnimation(this); + } +}; diff --git a/src/ol/dom/layerrenderer.js b/src/ol/dom/layerrenderer.js index 679e676868..72352f7e30 100644 --- a/src/ol/dom/layerrenderer.js +++ b/src/ol/dom/layerrenderer.js @@ -8,12 +8,12 @@ goog.require('ol.LayerRenderer'); /** * @constructor * @extends {ol.LayerRenderer} - * @param {ol.dom.Map} map Map. + * @param {ol.MapRenderer} mapRenderer Map renderer. * @param {ol.Layer} layer Layer. * @param {!Element} target Target. */ -ol.dom.LayerRenderer = function(map, layer, target) { - goog.base(this, map, layer); +ol.dom.LayerRenderer = function(mapRenderer, layer, target) { + goog.base(this, mapRenderer, layer); /** * @type {!Element} @@ -38,10 +38,10 @@ goog.inherits(ol.dom.LayerRenderer, ol.LayerRenderer); /** * @override - * @return {ol.dom.Map} Map. + * @return {ol.MapRenderer} Map renderer. */ -ol.dom.LayerRenderer.prototype.getMap = function() { - return /** @type {ol.dom.Map} */ goog.base(this, 'getMap'); +ol.dom.LayerRenderer.prototype.getMapRenderer = function() { + return /** @type {ol.dom.MapRenderer} */ goog.base(this, 'getMapRenderer'); }; diff --git a/src/ol/dom/map.js b/src/ol/dom/maprenderer.js similarity index 79% rename from src/ol/dom/map.js rename to src/ol/dom/maprenderer.js index 9949836481..cd42503188 100644 --- a/src/ol/dom/map.js +++ b/src/ol/dom/maprenderer.js @@ -1,4 +1,4 @@ -goog.provide('ol.dom.Map'); +goog.provide('ol.dom.MapRenderer'); goog.require('goog.asserts'); goog.require('goog.dom'); @@ -6,6 +6,7 @@ goog.require('goog.dom.TagName'); goog.require('goog.style'); goog.require('ol.Coordinate'); goog.require('ol.Map'); +goog.require('ol.MapRenderer'); goog.require('ol.TileLayer'); goog.require('ol.dom.TileLayerRenderer'); @@ -13,13 +14,13 @@ goog.require('ol.dom.TileLayerRenderer'); /** * @constructor - * @extends {ol.Map} + * @extends {ol.MapRenderer} * @param {Element} target Target. - * @param {Object.=} opt_values Values. + * @param {ol.Map} map Map. */ -ol.dom.Map = function(target, opt_values) { +ol.dom.MapRenderer = function(target, map) { - goog.base(this, target); + goog.base(this, target, map); /** * @type {!Element} @@ -61,27 +62,20 @@ ol.dom.Map = function(target, opt_values) { * @private */ this.layersPaneOffset_ = null; - - if (goog.isDef(opt_values)) { - this.setValues(opt_values); - } - - this.handleViewportResize(); - }; -goog.inherits(ol.dom.Map, ol.Map); +goog.inherits(ol.dom.MapRenderer, ol.MapRenderer); /** * Reset the layers pane to its initial position. * @private */ -ol.dom.Map.prototype.resetLayersPane_ = function() { +ol.dom.MapRenderer.prototype.resetLayersPane_ = function() { var offset = new ol.Coordinate(0, 0); goog.style.setPosition(this.layersPane_, offset); this.layersPaneOffset_ = offset; - this.renderedCenter_ = this.getCenter(); + this.renderedCenter_ = this.map.getCenter(); this.setOrigin_(); }; @@ -91,10 +85,10 @@ ol.dom.Map.prototype.resetLayersPane_ = function() { * Set the origin for each layer renderer. * @private */ -ol.dom.Map.prototype.setOrigin_ = function() { - var center = this.getCenter(); - var resolution = this.getResolution(); - var targetSize = this.getSize(); +ol.dom.MapRenderer.prototype.setOrigin_ = function() { + var center = this.map.getCenter(); + var resolution = this.map.getResolution(); + var targetSize = this.map.getSize(); var targetWidth = targetSize.width; var targetHeight = targetSize.height; var origin = new ol.Coordinate( @@ -110,10 +104,10 @@ ol.dom.Map.prototype.setOrigin_ = function() { * Move the layers pane. * @private */ -ol.dom.Map.prototype.shiftLayersPane_ = function() { - var center = this.getCenter(); +ol.dom.MapRenderer.prototype.shiftLayersPane_ = function() { + var center = this.map.getCenter(); var oldCenter = this.renderedCenter_; - var resolution = this.getResolution(); + var resolution = this.map.getResolution(); var dx = Math.round((oldCenter.x - center.x) / resolution); var dy = Math.round((center.y - oldCenter.y) / resolution); if (!(dx === 0 && dy === 0)) { @@ -129,7 +123,7 @@ ol.dom.Map.prototype.shiftLayersPane_ = function() { /** * @inheritDoc */ -ol.dom.Map.prototype.createLayerRenderer = function(layer) { +ol.dom.MapRenderer.prototype.createLayerRenderer = function(layer) { if (layer instanceof ol.TileLayer) { @@ -154,7 +148,7 @@ ol.dom.Map.prototype.createLayerRenderer = function(layer) { /** * @inheritDoc */ -ol.dom.Map.prototype.handleCenterChanged = function() { +ol.dom.MapRenderer.prototype.handleCenterChanged = function() { goog.base(this, 'handleCenterChanged'); // FIXME: shiftLayersPane_ and resetLayersPane_ should be called // elsewhere as we may be frozen here @@ -170,7 +164,7 @@ ol.dom.Map.prototype.handleCenterChanged = function() { /** * @inheritDoc */ -ol.dom.Map.prototype.handleResolutionChanged = function() { +ol.dom.MapRenderer.prototype.handleResolutionChanged = function() { goog.base(this, 'handleResolutionChanged'); // FIXME: resetLayersPane_ should be called // elsewhere as we may be frozen here diff --git a/src/ol/dom/tilelayerrenderer.js b/src/ol/dom/tilelayerrenderer.js index a969ff2647..8bdd0aaa9f 100644 --- a/src/ol/dom/tilelayerrenderer.js +++ b/src/ol/dom/tilelayerrenderer.js @@ -13,12 +13,12 @@ goog.require('ol.dom.LayerRenderer'); /** * @constructor * @extends {ol.dom.LayerRenderer} - * @param {ol.dom.Map} map Map. + * @param {ol.MapRenderer} mapRenderer Map renderer.. * @param {ol.TileLayer} tileLayer Tile layer. * @param {!Element} target Target. */ -ol.dom.TileLayerRenderer = function(map, tileLayer, target) { - goog.base(this, map, tileLayer, target); +ol.dom.TileLayerRenderer = function(mapRenderer, tileLayer, target) { + goog.base(this, mapRenderer, tileLayer, target); /** * @type {Object} diff --git a/src/ol/webgl/layerrenderer.js b/src/ol/webgl/layerrenderer.js index 357de29eac..fb85a7ed04 100644 --- a/src/ol/webgl/layerrenderer.js +++ b/src/ol/webgl/layerrenderer.js @@ -9,11 +9,11 @@ goog.require('ol.LayerRenderer'); /** * @constructor * @extends {ol.LayerRenderer} - * @param {ol.webgl.Map} map Map. + * @param {ol.MapRenderer} mapRenderer Map renderer. * @param {ol.Layer} layer Layer. */ -ol.webgl.LayerRenderer = function(map, layer) { - goog.base(this, map, layer); +ol.webgl.LayerRenderer = function(mapRenderer, layer) { + goog.base(this, mapRenderer, layer); }; goog.inherits(ol.webgl.LayerRenderer, ol.LayerRenderer); @@ -36,17 +36,16 @@ ol.webgl.LayerRenderer.prototype.getTexture = goog.abstractMethod; * @return {WebGLRenderingContext} GL. */ ol.webgl.LayerRenderer.prototype.getGL = function() { - var map = /** @type {ol.webgl.Map} */ this.getMap(); - return map.getGL(); + return this.getMapRenderer().getGL(); }; /** * @override - * @return {ol.webgl.Map} Map. + * @return {ol.MapRenderer} MapRenderer. */ -ol.webgl.LayerRenderer.prototype.getMap = function() { - return /** @type {ol.webgl.Map} */ goog.base(this, 'getMap'); +ol.webgl.LayerRenderer.prototype.getMapRenderer = function() { + return /** @type {ol.webgl.MapRenderer} */ goog.base(this, 'getMapRenderer'); }; diff --git a/src/ol/webgl/map.js b/src/ol/webgl/maprenderer.js similarity index 89% rename from src/ol/webgl/map.js rename to src/ol/webgl/maprenderer.js index 2a923431c0..7a3872a004 100644 --- a/src/ol/webgl/map.js +++ b/src/ol/webgl/maprenderer.js @@ -4,7 +4,7 @@ // FIXME defer cleanup until post-render // FIXME check against gl.getParameter(webgl.MAX_TEXTURE_SIZE) -goog.provide('ol.webgl.Map'); +goog.provide('ol.webgl.MapRenderer'); goog.provide('ol.webgl.map.shader'); goog.require('goog.debug.Logger'); @@ -134,13 +134,13 @@ goog.addSingletonGetter(ol.webgl.map.shader.Vertex); /** * @constructor - * @extends {ol.Map} + * @extends {ol.MapRenderer} * @param {Element} target Target. - * @param {Object.=} opt_values Values. + * @param {ol.Map} map Map. */ -ol.webgl.Map = function(target, opt_values) { +ol.webgl.MapRenderer = function(target, map) { - goog.base(this, target); + goog.base(this, target, map); /** * @private @@ -232,21 +232,16 @@ ol.webgl.Map = function(target, opt_values) { */ this.layerRendererChangeListenKeys_ = {}; - if (goog.isDef(opt_values)) { - this.setValues(opt_values); - } - - this.handleViewportResize(); this.handleWebGLContextRestored(); }; -goog.inherits(ol.webgl.Map, ol.Map); +goog.inherits(ol.webgl.MapRenderer, ol.MapRenderer); /** * @inheritDoc */ -ol.webgl.Map.prototype.addLayer = function(layer) { +ol.webgl.MapRenderer.prototype.addLayer = function(layer) { goog.base(this, 'addLayer', layer); if (layer.getVisible()) { this.render(); @@ -259,7 +254,7 @@ ol.webgl.Map.prototype.addLayer = function(layer) { * @param {number} magFilter Mag filter. * @param {number} minFilter Min filter. */ -ol.webgl.Map.prototype.bindImageTexture = +ol.webgl.MapRenderer.prototype.bindImageTexture = function(image, magFilter, minFilter) { var gl = this.getGL(); var imageKey = image.src; @@ -301,13 +296,13 @@ ol.webgl.Map.prototype.bindImageTexture = /** * @inheritDoc */ -ol.webgl.Map.prototype.canRotate = goog.functions.TRUE; +ol.webgl.MapRenderer.prototype.canRotate = goog.functions.TRUE; /** * @inheritDoc */ -ol.webgl.Map.prototype.createLayerRenderer = function(layer) { +ol.webgl.MapRenderer.prototype.createLayerRenderer = function(layer) { var gl = this.getGL(); if (layer instanceof ol.TileLayer) { return new ol.webgl.TileLayerRenderer(this, layer); @@ -321,7 +316,7 @@ ol.webgl.Map.prototype.createLayerRenderer = function(layer) { /** * @inheritDoc */ -ol.webgl.Map.prototype.disposeInternal = function() { +ol.webgl.MapRenderer.prototype.disposeInternal = function() { var gl = this.getGL(); if (!gl.isContextLost()) { goog.object.forEach(this.programCache_, function(program) { @@ -341,7 +336,7 @@ ol.webgl.Map.prototype.disposeInternal = function() { /** * @return {WebGLRenderingContext} GL. */ -ol.webgl.Map.prototype.getGL = function() { +ol.webgl.MapRenderer.prototype.getGL = function() { return this.gl_; }; @@ -351,7 +346,7 @@ ol.webgl.Map.prototype.getGL = function() { * @param {ol.webgl.shader.Vertex} vertexShaderObject Vertex shader. * @return {WebGLProgram} Program. */ -ol.webgl.Map.prototype.getProgram = function( +ol.webgl.MapRenderer.prototype.getProgram = function( fragmentShaderObject, vertexShaderObject) { var programKey = goog.getUid(fragmentShaderObject) + '/' + goog.getUid(vertexShaderObject); @@ -381,7 +376,7 @@ ol.webgl.Map.prototype.getProgram = function( * @param {ol.webgl.Shader} shaderObject Shader object. * @return {WebGLShader} Shader. */ -ol.webgl.Map.prototype.getShader = function(shaderObject) { +ol.webgl.MapRenderer.prototype.getShader = function(shaderObject) { var shaderKey = goog.getUid(shaderObject); if (shaderKey in this.shaderCache_) { return this.shaderCache_[shaderKey]; @@ -407,8 +402,8 @@ ol.webgl.Map.prototype.getShader = function(shaderObject) { /** * @inheritDoc */ -ol.webgl.Map.prototype.handleBackgroundColorChanged = function() { - var backgroundColor = this.getBackgroundColor(); +ol.webgl.MapRenderer.prototype.handleBackgroundColorChanged = function() { + var backgroundColor = this.getMap().getBackgroundColor(); this.clearColor_ = new ol.Color( backgroundColor.r / 255, backgroundColor.g / 255, @@ -421,7 +416,7 @@ ol.webgl.Map.prototype.handleBackgroundColorChanged = function() { /** * @inheritDoc */ -ol.webgl.Map.prototype.handleCenterChanged = function() { +ol.webgl.MapRenderer.prototype.handleCenterChanged = function() { goog.base(this, 'handleCenterChanged'); this.render(); }; @@ -431,7 +426,7 @@ ol.webgl.Map.prototype.handleCenterChanged = function() { * @param {goog.events.Event} event Event. * @protected */ -ol.webgl.Map.prototype.handleLayerRendererChange = function(event) { +ol.webgl.MapRenderer.prototype.handleLayerRendererChange = function(event) { this.render(); }; @@ -439,7 +434,7 @@ ol.webgl.Map.prototype.handleLayerRendererChange = function(event) { /** * @inheritDoc */ -ol.webgl.Map.prototype.handleResolutionChanged = function() { +ol.webgl.MapRenderer.prototype.handleResolutionChanged = function() { goog.base(this, 'handleResolutionChanged'); this.render(); }; @@ -448,7 +443,7 @@ ol.webgl.Map.prototype.handleResolutionChanged = function() { /** * @inheritDoc */ -ol.webgl.Map.prototype.handleRotationChanged = function() { +ol.webgl.MapRenderer.prototype.handleRotationChanged = function() { goog.base(this, 'handleRotationChanged'); this.render(); }; @@ -457,9 +452,9 @@ ol.webgl.Map.prototype.handleRotationChanged = function() { /** * @inheritDoc */ -ol.webgl.Map.prototype.handleSizeChanged = function() { +ol.webgl.MapRenderer.prototype.handleSizeChanged = function() { goog.base(this, 'handleSizeChanged'); - var size = this.getSize(); + var size = this.getMap().getSize(); if (!goog.isDef(size)) { return; } @@ -477,7 +472,7 @@ ol.webgl.Map.prototype.handleSizeChanged = function() { * @param {goog.events.Event} event Event. * @protected */ -ol.webgl.Map.prototype.handleWebGLContextLost = function(event) { +ol.webgl.MapRenderer.prototype.handleWebGLContextLost = function(event) { if (goog.DEBUG) { ol.webgl.map.logger.info('WebGLContextLost'); } @@ -496,7 +491,7 @@ ol.webgl.Map.prototype.handleWebGLContextLost = function(event) { /** * @protected */ -ol.webgl.Map.prototype.handleWebGLContextRestored = function() { +ol.webgl.MapRenderer.prototype.handleWebGLContextRestored = function() { if (goog.DEBUG) { ol.webgl.map.logger.info('WebGLContextRestored'); } @@ -514,7 +509,7 @@ ol.webgl.Map.prototype.handleWebGLContextRestored = function() { * @param {Image} image Image. * @return {boolean} Is image texture loaded. */ -ol.webgl.Map.prototype.isImageTextureLoaded = function(image) { +ol.webgl.MapRenderer.prototype.isImageTextureLoaded = function(image) { return image.src in this.textureCache_[image.src]; }; @@ -522,13 +517,13 @@ ol.webgl.Map.prototype.isImageTextureLoaded = function(image) { /** * @inheritDoc */ -ol.webgl.Map.prototype.renderInternal = function() { +ol.webgl.MapRenderer.prototype.renderInternal = function() { - if (!this.isDef()) { + if (!this.getMap().isDef()) { return false; } - var size = this.getSize(); + var size = this.getMap().getSize(); var animate = goog.base(this, 'renderInternal'); @@ -600,7 +595,7 @@ ol.webgl.Map.prototype.renderInternal = function() { /** * @inheritDoc */ -ol.webgl.Map.prototype.removeLayer = function(layer) { +ol.webgl.MapRenderer.prototype.removeLayer = function(layer) { goog.base(this, 'removeLayer', layer); if (layer.getVisible()) { this.render(); @@ -611,7 +606,7 @@ ol.webgl.Map.prototype.removeLayer = function(layer) { /** * @inheritDoc */ -ol.webgl.Map.prototype.removeLayerRenderer = function(layer) { +ol.webgl.MapRenderer.prototype.removeLayerRenderer = function(layer) { var layerRenderer = goog.base(this, 'removeLayerRenderer', layer); if (!goog.isNull(layerRenderer)) { var layerKey = goog.getUid(layer); @@ -625,7 +620,7 @@ ol.webgl.Map.prototype.removeLayerRenderer = function(layer) { /** * @inheritDoc */ -ol.webgl.Map.prototype.setLayerRenderer = function(layer, layerRenderer) { +ol.webgl.MapRenderer.prototype.setLayerRenderer = function(layer, layerRenderer) { goog.base(this, 'setLayerRenderer', layer, layerRenderer); var layerKey = goog.getUid(layer); this.layerRendererChangeListenKeys_[layerKey] = goog.events.listen( diff --git a/src/ol/webgl/tilelayerrenderer.js b/src/ol/webgl/tilelayerrenderer.js index a93ac9f8ce..bf2ff8bfc9 100644 --- a/src/ol/webgl/tilelayerrenderer.js +++ b/src/ol/webgl/tilelayerrenderer.js @@ -76,12 +76,12 @@ goog.addSingletonGetter(ol.webgl.tilelayerrenderer.shader.Vertex); /** * @constructor * @extends {ol.webgl.LayerRenderer} - * @param {ol.webgl.Map} map Map. + * @param {ol.MapRenderer} mapRenderer Map renderer. * @param {ol.TileLayer} tileLayer Tile layer. */ -ol.webgl.TileLayerRenderer = function(map, tileLayer) { +ol.webgl.TileLayerRenderer = function(mapRenderer, tileLayer) { - goog.base(this, map, tileLayer); + goog.base(this, mapRenderer, tileLayer); /** * @private @@ -250,8 +250,9 @@ ol.webgl.TileLayerRenderer.prototype.handleWebGLContextLost = function() { ol.webgl.TileLayerRenderer.prototype.render = function() { var gl = this.getGL(); - var map = this.getMap(); + var mapRenderer = this.getMapRenderer(); + goog.asserts.assert(map.isDef()); var mapCenter = map.getCenter(); var mapExtent = map.getExtent(); @@ -293,7 +294,8 @@ ol.webgl.TileLayerRenderer.prototype.render = function() { gl.clear(goog.webgl.COLOR_BUFFER_BIT); gl.disable(goog.webgl.BLEND); - var program = map.getProgram(this.fragmentShader_, this.vertexShader_); + var program = mapRenderer.getProgram( + this.fragmentShader_, this.vertexShader_); gl.useProgram(program); if (goog.isNull(this.locations_)) { this.locations_ = { @@ -385,7 +387,7 @@ ol.webgl.TileLayerRenderer.prototype.render = function() { framebufferExtentSize.height - 1; goog.vec.Vec4.setFromValues(uTileOffset, sx, sy, tx, ty); gl.uniform4fv(this.locations_.uTileOffset, uTileOffset); - map.bindImageTexture( + mapRenderer.bindImageTexture( tile.getImage(), goog.webgl.LINEAR, goog.webgl.LINEAR); gl.drawArrays(goog.webgl.TRIANGLE_STRIP, 0, 4); }, this); From 6f0ae684f77b07fe8014d5c46b61e54c9126d270 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Lemoine?= Date: Tue, 14 Aug 2012 07:15:54 +0200 Subject: [PATCH 501/562] fix linter errors --- src/ol/base/maprenderer.js | 7 +++++-- src/ol/webgl/maprenderer.js | 3 ++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/ol/base/maprenderer.js b/src/ol/base/maprenderer.js index 5a23174be0..d3026f3da3 100644 --- a/src/ol/base/maprenderer.js +++ b/src/ol/base/maprenderer.js @@ -2,13 +2,15 @@ goog.provide('ol.MapRenderer'); -goog.require('goog.events'); goog.require('goog.Disposable'); +goog.require('goog.events'); goog.require('goog.fx.anim'); goog.require('goog.fx.anim.Animated'); goog.require('ol.Map'); goog.require('ol.MapProperty'); + + /** * @constructor * @extends {goog.Disposable} @@ -122,7 +124,7 @@ ol.MapRenderer.prototype.forEachReadyVisibleLayer = function(f, opt_obj) { /** - * @return {ol.Map} + * @return {ol.Map} Map. */ ol.MapRenderer.prototype.getMap = function() { return this.map; @@ -341,6 +343,7 @@ ol.MapRenderer.prototype.unfreezeRendering = function() { }; + /** * @constructor * @implements {goog.fx.anim.Animated} diff --git a/src/ol/webgl/maprenderer.js b/src/ol/webgl/maprenderer.js index 7a3872a004..aad37c6427 100644 --- a/src/ol/webgl/maprenderer.js +++ b/src/ol/webgl/maprenderer.js @@ -620,7 +620,8 @@ ol.webgl.MapRenderer.prototype.removeLayerRenderer = function(layer) { /** * @inheritDoc */ -ol.webgl.MapRenderer.prototype.setLayerRenderer = function(layer, layerRenderer) { +ol.webgl.MapRenderer.prototype.setLayerRenderer = function( + layer, layerRenderer) { goog.base(this, 'setLayerRenderer', layer, layerRenderer); var layerKey = goog.getUid(layer); this.layerRendererChangeListenKeys_[layerKey] = goog.events.listen( From 7be8a735fa0a9f30b942d6d1f60e52c82ee092e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Lemoine?= Date: Tue, 14 Aug 2012 07:26:43 +0200 Subject: [PATCH 502/562] better code (thanks @twpayne) --- src/ol/base/createmap.js | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/ol/base/createmap.js b/src/ol/base/createmap.js index 304005cdd6..8ed5ae62bb 100644 --- a/src/ol/base/createmap.js +++ b/src/ol/base/createmap.js @@ -134,16 +134,18 @@ ol.createMap = function(target, opt_values, opt_rendererHints) { if (rendererHint == ol.RendererHint.DOM) { if (ol.ENABLE_DOM && ol.dom.isSupported()) { rendererConstructor = ol.dom.MapRenderer; - return new ol.Map(target, rendererConstructor, values); } } else if (rendererHint == ol.RendererHint.WEBGL) { if (ol.ENABLE_WEBGL && ol.webgl.isSupported()) { rendererConstructor = ol.webgl.MapRenderer; - return new ol.Map(target, rendererConstructor, values); } } } - return null; + if (goog.isDef(rendererConstructor)) { + return new ol.Map(target, rendererConstructor, values); + } else { + return null; + } }; From f0ecf858c8b1aeeb3d2df043e7f7a004a7b127ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Lemoine?= Date: Tue, 14 Aug 2012 07:35:24 +0200 Subject: [PATCH 503/562] better type --- src/ol/base/map.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/ol/base/map.js b/src/ol/base/map.js index 2a92bbd577..4da257857b 100644 --- a/src/ol/base/map.js +++ b/src/ol/base/map.js @@ -71,7 +71,8 @@ ol.MapPaneZIndex = { * @constructor * @extends {ol.Object} * @param {Element} target Target. - * @param {Function} rendererConstructor Renderer constructor. + * @param {function(new: ol.MapRenderer, Element, ol.Map)} rendererConstructor + * Renderer constructor. * @param {Object=} opt_values Values. * @param {goog.dom.ViewportSizeMonitor=} opt_viewportSizeMonitor * Viewport size monitor. From e7696dd6aa69e3d6296de11d41ddbcdfec20aa14 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Lemoine?= Date: Tue, 14 Aug 2012 07:44:25 +0200 Subject: [PATCH 504/562] map renderer unregisters listeners on dispose --- src/ol/base/maprenderer.js | 58 ++++++++++++++++++++++---------------- 1 file changed, 33 insertions(+), 25 deletions(-) diff --git a/src/ol/base/maprenderer.js b/src/ol/base/maprenderer.js index d3026f3da3..a69d8ac48b 100644 --- a/src/ol/base/maprenderer.js +++ b/src/ol/base/maprenderer.js @@ -1,5 +1,3 @@ -// FIXME unregister listeners when disposed - goog.provide('ol.MapRenderer'); goog.require('goog.Disposable'); @@ -57,11 +55,6 @@ ol.MapRenderer = function(target, map) { */ this.freezeRenderingCount_ = 0; - /** - * @private - * @type {Array.} - */ - this.layersListenerKeys_ = null; /** * @protected @@ -69,29 +62,42 @@ ol.MapRenderer = function(target, map) { */ this.layerRenderers = {}; - goog.events.listen(map, - ol.Object.getChangedEventType(ol.MapProperty.BACKGROUND_COLOR), - this.handleBackgroundColorChanged, false, this); + /** + * @private + * @type {Array.} + */ + this.layersListenerKeys_ = null; - goog.events.listen( - map, ol.Object.getChangedEventType(ol.MapProperty.CENTER), - this.handleCenterChanged, false, this); + /** + * @private + * @type {Array.} + */ + this.mapListenerKeys_ = [ + goog.events.listen( + map, ol.Object.getChangedEventType(ol.MapProperty.BACKGROUND_COLOR), + this.handleBackgroundColorChanged, false, this), - goog.events.listen( - map, ol.Object.getChangedEventType(ol.MapProperty.LAYERS), - this.handleLayersChanged, false, this); + goog.events.listen( + map, ol.Object.getChangedEventType(ol.MapProperty.CENTER), + this.handleCenterChanged, false, this), - goog.events.listen( - map, ol.Object.getChangedEventType(ol.MapProperty.RESOLUTION), - this.handleResolutionChanged, false, this); + goog.events.listen( + map, ol.Object.getChangedEventType(ol.MapProperty.LAYERS), + this.handleLayersChanged, false, this), - goog.events.listen( - map, ol.Object.getChangedEventType(ol.MapProperty.ROTATION), - this.handleRotationChanged, false, this); + goog.events.listen( + map, ol.Object.getChangedEventType(ol.MapProperty.RESOLUTION), + this.handleResolutionChanged, false, this), + + goog.events.listen( + map, ol.Object.getChangedEventType(ol.MapProperty.ROTATION), + this.handleRotationChanged, false, this), + + goog.events.listen( + map, ol.Object.getChangedEventType(ol.MapProperty.SIZE), + this.handleSizeChanged, false, this) + ]; - goog.events.listen( - map, ol.Object.getChangedEventType(ol.MapProperty.SIZE), - this.handleSizeChanged, false, this); }; goog.inherits(ol.MapRenderer, goog.Disposable); @@ -103,6 +109,8 @@ ol.MapRenderer.prototype.disposeInternal = function() { goog.object.forEach(this.layerRenderers, function(layerRenderer) { goog.dispose(layerRenderer); }); + goog.array.forEach(this.mapListenerKeys_, goog.events.unlistenByKey); + goog.array.forEach(this.layersListenerKeys_, goog.events.unlistenByKey); goog.base(this, 'disposeInternal'); }; From 85c8dddc0228d8b4f8406f3c40d574d3de318548 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Lemoine?= Date: Tue, 14 Aug 2012 07:48:13 +0200 Subject: [PATCH 505/562] add a FIXME --- src/ol/base/map.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/ol/base/map.js b/src/ol/base/map.js index 4da257857b..6979f10e91 100644 --- a/src/ol/base/map.js +++ b/src/ol/base/map.js @@ -4,6 +4,7 @@ // FIXME add tilt and height? // FIXME split out renderer // FIXME add postrender event +// FIXME does the map really need to listen to itself (for center, etc.)? goog.provide('ol.Map'); goog.provide('ol.MapProperty'); From d9009eae1049686e87b819350c0b0e548867cc49 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Tue, 14 Aug 2012 09:20:51 +0200 Subject: [PATCH 506/562] Fix missed used of goog.webgl --- src/ol/webgl/tilelayerrenderer.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/ol/webgl/tilelayerrenderer.js b/src/ol/webgl/tilelayerrenderer.js index a93ac9f8ce..5aba0439fa 100644 --- a/src/ol/webgl/tilelayerrenderer.js +++ b/src/ol/webgl/tilelayerrenderer.js @@ -176,9 +176,9 @@ ol.webgl.TileLayerRenderer.prototype.bindFramebuffer_ = var texture = gl.createTexture(); gl.bindTexture(goog.webgl.TEXTURE_2D, texture); - gl.texImage2D(goog.webgl.TEXTURE_2D, 0, gl.RGBA, framebufferDimension, - framebufferDimension, 0, goog.webgl.RGBA, goog.webgl.UNSIGNED_BYTE, - null); + gl.texImage2D(goog.webgl.TEXTURE_2D, 0, goog.webgl.RGBA, + framebufferDimension, framebufferDimension, 0, goog.webgl.RGBA, + goog.webgl.UNSIGNED_BYTE, null); gl.texParameteri(goog.webgl.TEXTURE_2D, goog.webgl.TEXTURE_MAG_FILTER, goog.webgl.LINEAR); gl.texParameteri(goog.webgl.TEXTURE_2D, goog.webgl.TEXTURE_MIN_FILTER, From 477dc0b92b54d21f6aa6f806bfbf4a7230a252ab Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Tue, 14 Aug 2012 09:37:16 +0200 Subject: [PATCH 507/562] Fix direction of rotation in coordinate to pixel matrix --- src/ol/base/map.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ol/base/map.js b/src/ol/base/map.js index 8bc070dcc8..3cf02f037d 100644 --- a/src/ol/base/map.js +++ b/src/ol/base/map.js @@ -966,7 +966,7 @@ ol.Map.prototype.updateMatrices_ = function() { 1); if (this.canRotate() && goog.isDef(rotation)) { goog.vec.Mat4.rotate(this.coordinateToPixelMatrix_, - rotation, + -rotation, 0, 0, 1); From dafbd503a530085501161debf0c13e67f54508d5 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Tue, 14 Aug 2012 09:37:48 +0200 Subject: [PATCH 508/562] Use matrix inversion to calculate pixel to coordinate matrix --- src/ol/base/map.js | 23 +++-------------------- 1 file changed, 3 insertions(+), 20 deletions(-) diff --git a/src/ol/base/map.js b/src/ol/base/map.js index 3cf02f037d..2e433e45fe 100644 --- a/src/ol/base/map.js +++ b/src/ol/base/map.js @@ -976,26 +976,9 @@ ol.Map.prototype.updateMatrices_ = function() { -center.y, 0); - goog.vec.Mat4.makeIdentity(this.pixelToCoordinateMatrix_); - goog.vec.Mat4.translate(this.pixelToCoordinateMatrix_, - center.x, - center.y, - 0); - if (this.canRotate() && goog.isDef(rotation)) { - goog.vec.Mat4.rotate(this.coordinateToPixelMatrix_, - -rotation, - 0, - 0, - 1); - } - goog.vec.Mat4.scale(this.pixelToCoordinateMatrix_, - resolution, - -resolution, - 1); - goog.vec.Mat4.translate(this.pixelToCoordinateMatrix_, - -size.width / 2, - -size.height / 2, - 0); + var inverted = goog.vec.Mat4.invert( + this.coordinateToPixelMatrix_, this.pixelToCoordinateMatrix_); + goog.asserts.assert(inverted); this.matriciesDirty_ = false; From da9de171d23835d6244e0e7c2855120eb6b7a523 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Lemoine?= Date: Tue, 14 Aug 2012 10:22:46 +0200 Subject: [PATCH 509/562] exit renderer hint for loop when map renderer is found --- src/ol/base/createmap.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/ol/base/createmap.js b/src/ol/base/createmap.js index 8ed5ae62bb..ae2cbdc7f7 100644 --- a/src/ol/base/createmap.js +++ b/src/ol/base/createmap.js @@ -134,10 +134,12 @@ ol.createMap = function(target, opt_values, opt_rendererHints) { if (rendererHint == ol.RendererHint.DOM) { if (ol.ENABLE_DOM && ol.dom.isSupported()) { rendererConstructor = ol.dom.MapRenderer; + break; } } else if (rendererHint == ol.RendererHint.WEBGL) { if (ol.ENABLE_WEBGL && ol.webgl.isSupported()) { rendererConstructor = ol.webgl.MapRenderer; + break; } } } From 9f5b98e70cf8d0742ecbef0fa30ca423e9ae1453 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Lemoine?= Date: Tue, 14 Aug 2012 10:23:06 +0200 Subject: [PATCH 510/562] remove split out renderer FIXME --- src/ol/base/map.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/ol/base/map.js b/src/ol/base/map.js index 6979f10e91..94c2578664 100644 --- a/src/ol/base/map.js +++ b/src/ol/base/map.js @@ -2,7 +2,6 @@ // FIXME recheck layer/map projection compatability when projection changes // FIXME layer renderers should skip when they can't reproject // FIXME add tilt and height? -// FIXME split out renderer // FIXME add postrender event // FIXME does the map really need to listen to itself (for center, etc.)? From 0f401a2d5168f4cf492cce52ea2eb3c8a1efc1be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Lemoine?= Date: Tue, 14 Aug 2012 10:24:12 +0200 Subject: [PATCH 511/562] forEach cannot iterate over a null object --- src/ol/base/maprenderer.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/ol/base/maprenderer.js b/src/ol/base/maprenderer.js index a69d8ac48b..cbb0cca078 100644 --- a/src/ol/base/maprenderer.js +++ b/src/ol/base/maprenderer.js @@ -110,7 +110,9 @@ ol.MapRenderer.prototype.disposeInternal = function() { goog.dispose(layerRenderer); }); goog.array.forEach(this.mapListenerKeys_, goog.events.unlistenByKey); - goog.array.forEach(this.layersListenerKeys_, goog.events.unlistenByKey); + if (!goog.isNull(this.layersListenerKeys_)) { + goog.array.forEach(this.layersListenerKeys_, goog.events.unlistenByKey); + } goog.base(this, 'disposeInternal'); }; From d9b51cdc7f1a3edd7660ee3557ac786c5f0cec07 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Lemoine?= Date: Tue, 14 Aug 2012 10:24:30 +0200 Subject: [PATCH 512/562] fix typo in API doc --- src/ol/dom/tilelayerrenderer.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ol/dom/tilelayerrenderer.js b/src/ol/dom/tilelayerrenderer.js index 8bdd0aaa9f..d60b4bad37 100644 --- a/src/ol/dom/tilelayerrenderer.js +++ b/src/ol/dom/tilelayerrenderer.js @@ -13,7 +13,7 @@ goog.require('ol.dom.LayerRenderer'); /** * @constructor * @extends {ol.dom.LayerRenderer} - * @param {ol.MapRenderer} mapRenderer Map renderer.. + * @param {ol.MapRenderer} mapRenderer Map renderer. * @param {ol.TileLayer} tileLayer Tile layer. * @param {!Element} target Target. */ From 104c859f85daad1eaf22c8de2569af341bcb6ab0 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Tue, 14 Aug 2012 15:09:57 +0200 Subject: [PATCH 513/562] Satisfy gjslint --- demos/two-layers/two-layers.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/demos/two-layers/two-layers.js b/demos/two-layers/two-layers.js index 844d456a97..5daf7010ba 100644 --- a/demos/two-layers/two-layers.js +++ b/demos/two-layers/two-layers.js @@ -7,9 +7,9 @@ goog.require('ol.layer.TileJSON'); /** - * @define {boolean} Enable DOM map. * FIXME The DOM renderer doesn't support partially-loaded layers yet * FIXME Remove this define when it does + * @define {boolean} Enable DOM map. */ ol.TWO_LAYERS_DEMO_ENABLE_DOM = false; From 65278c4322566defdad09aeefe6a862cf6296e27 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Tue, 14 Aug 2012 16:00:18 +0200 Subject: [PATCH 514/562] Remove support for *_changed methods --- src/ol/base/collection_test.js | 30 +++---- src/ol/base/object.js | 23 ----- src/ol/base/object_test.js | 152 ++++++++------------------------- 3 files changed, 52 insertions(+), 153 deletions(-) diff --git a/src/ol/base/collection_test.js b/src/ol/base/collection_test.js index 26dff88534..020cbdfa7d 100644 --- a/src/ol/base/collection_test.js +++ b/src/ol/base/collection_test.js @@ -163,34 +163,34 @@ function testCreateFromCollection() { function testLengthChangeInsertAt() { var collection = ol.Collection.create([0, 1, 2]); - var lengthChangedCalled; - collection.length_changed = function() { - lengthChangedCalled = true; - }; + var lengthEventDispatched; + goog.events.listen(collection, 'length_changed', function() { + lengthEventDispatched = true; + }); collection.insertAt(2, 3); - assertTrue(lengthChangedCalled); + assertTrue(lengthEventDispatched); } function testLengthChangeRemoveAt() { var collection = ol.Collection.create([0, 1, 2]); - var lengthChangedCalled; - collection.length_changed = function() { - lengthChangedCalled = true; - }; + var lengthEventDispatched; + goog.events.listen(collection, 'length_changed', function() { + lengthEventDispatched = true; + }); collection.removeAt(0); - assertTrue(lengthChangedCalled); + assertTrue(lengthEventDispatched); } function testLengthChangeSetAt() { var collection = ol.Collection.create([0, 1, 2]); - var lengthChangedCalled; - collection.length_changed = function() { - lengthChangedCalled = true; - }; + var lengthEventDispatched; + goog.events.listen(collection, 'length_changed', function() { + lengthEventDispatched = true; + }); collection.setAt(1, 1); - assertUndefined(lengthChangedCalled); + assertUndefined(lengthEventDispatched); } diff --git a/src/ol/base/object.js b/src/ol/base/object.js index 6518c89b83..e3555d3332 100644 --- a/src/ol/base/object.js +++ b/src/ol/base/object.js @@ -95,23 +95,6 @@ ol.Object.getGetterName = function(key) { }; -/** - * @private - * @type {Object.} - */ -ol.Object.changedMethodNameCache_ = {}; - - -/** - * @param {string} key String. - * @return {string} Changed method name. - */ -ol.Object.getChangedMethodName = function(key) { - return ol.Object.changedMethodNameCache_[key] || - (ol.Object.changedMethodNameCache_[key] = key + '_changed'); -}; - - /** * @private * @type {Object.} @@ -222,12 +205,6 @@ ol.Object.prototype.notify = function(key) { * @private */ ol.Object.prototype.notifyInternal_ = function(key) { - var changedMethodName = ol.Object.getChangedMethodName(key); - if (this[changedMethodName]) { - this[changedMethodName](); - } else { - this.changed(key); - } var eventType = ol.Object.getChangedEventType(key); this.dispatchEvent(eventType); }; diff --git a/src/ol/base/object_test.js b/src/ol/base/object_test.js index 28b0339535..e93185f08d 100644 --- a/src/ol/base/object_test.js +++ b/src/ol/base/object_test.js @@ -32,27 +32,6 @@ function testSetValues() { assertEquals(2, m.get('k2')); } -function testNotifyCallback() { - var m = new ol.Object(); - var callbackCalled; - m.changed = function() { - callbackCalled = true; - }; - m.notify('k'); - assertTrue(callbackCalled); -} - - -function testNotifyKeyCallback() { - var m = new ol.Object(); - var callbackCalled = false; - m.k_changed = function() { - callbackCalled = true; - }; - m.notify('k'); - assertTrue(callbackCalled); -} - function testNotifyKeyEvent() { var m = new ol.Object(); @@ -65,38 +44,16 @@ function testNotifyKeyEvent() { } -function testSetNotifyCallback() { - var m = new ol.Object(); - var callbackCalled; - m.changed = function() { - callbackCalled = true; - }; - m.set('k', 1); - assertTrue(callbackCalled); -} - - -function testSetNotifyKeyCallback() { - var m = new ol.Object(); - var callbackCalled = false; - m.k_changed = function(v) { - callbackCalled = true; - }; - m.set('k', 1); - assertTrue(callbackCalled); -} - - -function testBindSetNotifyKeyCallback() { +function testBindSetNotifyKeyEvent() { var m = new ol.Object(); var n = new ol.Object(); var callbackCalled = false; - n.k_changed = function(v) { - callbackCalled = true; - }; + goog.events.listen(n, 'k_changed', function() { + eventDispatched = true; + }); n.bindTo('k', m); m.set('k', 1); - assertTrue(callbackCalled); + assertTrue(eventDispatched); } @@ -189,17 +146,17 @@ function testBindNotify() { var m = new ol.Object(); var n = new ol.Object(); m.bindTo('k', n); - mCallbackCalled = false; - m.k_changed = function() { - mCallbackCalled = true; - }; - nCallbackCalled = false; - n.k_changed = function() { - nCallbackCalled = true; - }; + mEventDispatched = false; + goog.events.listen(m, 'k_changed', function() { + mEventDispatched = true; + }); + nEventDispatched = false; + goog.events.listen(n, 'k_changed', function() { + nEventDispatched = true; + }); n.set('k', 1); - assertTrue(mCallbackCalled); - assertTrue(nCallbackCalled); + assertTrue(mEventDispatched); + assertTrue(nEventDispatched); } @@ -207,17 +164,17 @@ function testBindBackwardsNotify() { var m = new ol.Object(); var n = new ol.Object(); n.bindTo('k', m); - mCallbackCalled = false; - m.k_changed = function() { - mCallbackCalled = true; - }; - nCallbackCalled = false; - n.k_changed = function() { - nCallbackCalled = true; - }; + mEventDispatched = false; + goog.events.listen(m, 'k_changed', function() { + mEventDispatched = true; + }); + nEventDispatched = false; + goog.events.listen(n, 'k_changed', function() { + nEventDispatched = true; + }); n.set('k', 1); - assertTrue(mCallbackCalled); - assertTrue(nCallbackCalled); + assertTrue(mEventDispatched); + assertTrue(nEventDispatched); } @@ -231,23 +188,23 @@ function testBindRename() { } -function testBindRenameCallbacks() { +function testBindRenameEvents() { var m = new ol.Object(); var n = new ol.Object(); - var kmCallbackCalled = false; - m.km_changed = function() { - kmCallbackCalled = true; - }; - var knCallbackCalled = false; - n.kn_changed = function() { - knCallbackCalled = true; - }; + kmEventDispatched = false; + goog.events.listen(m, 'km_changed', function() { + kmEventDispatched = true; + }); + knEventDispatched = false; + goog.events.listen(n, 'kn_changed', function() { + knEventDispatched = true; + }); n.bindTo('kn', m, 'km'); m.set('km', 1); assertEquals(m.get('km'), 1); assertEquals(n.get('kn'), 1); - assertTrue(kmCallbackCalled); - assertTrue(knCallbackCalled); + assertTrue(kmEventDispatched); + assertTrue(knEventDispatched); } @@ -277,20 +234,6 @@ function testTransitiveBindBackwards() { } -function testInheritance() { - var C = function() {}; - C.prototype = new ol.Object(); - var callbackCalled; - C.prototype.k_changed = function() { - callbackCalled = true; - }; - var c = new C(); - c.set('k', 1); - assertEquals(1, c.get('k')); - assertTrue(callbackCalled); -} - - function testMrideyAccessors() { // http://blog.mridey.com/2010/03/maps-javascript-api-v3-more-about.html var a = new ol.Object(); @@ -424,20 +367,9 @@ function testBindSelf() { } -function testChangedKey() { - var a = new ol.Object(); - var changedKey; - a.changed = function(key) { - changedKey = key; - }; - a.set('k', 1); - assertEquals('k', changedKey); -} - - function testCreateFromObject() { var obj = {k: 1}; - var obj = ol.Object.create(obj); + obj = ol.Object.create(obj); assertTrue(obj instanceof ol.Object); assertEquals(1, obj.get('k')); } @@ -458,14 +390,6 @@ function testCreateWithOptions() { function testEventTypeCaseSensitivity() { var obj = new ol.Object(); - var lowercaseChangedMethodCalled = false; - obj.k_changed = function() { - lowercaseChangedMethodCalled = true; - }; - var uppercaseChangedMethodCalled = false; - obj.K_changed = function() { - uppercaseChangedMethodCalled = true; - }; var lowercaseEventDispatched = false; goog.events.listen(obj, 'k_changed', function() { lowercaseEventDispatched = true; @@ -477,6 +401,4 @@ function testEventTypeCaseSensitivity() { obj.set('K', 1); assertTrue(lowercaseEventDispatched); assertFalse(uppercaseEventDispatched); - assertFalse(lowercaseChangedMethodCalled); - assertTrue(uppercaseChangedMethodCalled); } From f7185f1c7570cdf29d43680b188bb1f2a55b1ccc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Lemoine?= Date: Thu, 16 Aug 2012 14:57:42 +0200 Subject: [PATCH 515/562] remove map FIXME --- src/ol/base/map.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/ol/base/map.js b/src/ol/base/map.js index 1b18c325d9..88a17e811d 100644 --- a/src/ol/base/map.js +++ b/src/ol/base/map.js @@ -3,7 +3,6 @@ // FIXME layer renderers should skip when they can't reproject // FIXME add tilt and height? // FIXME add postrender event -// FIXME does the map really need to listen to itself (for center, etc.)? goog.provide('ol.Map'); goog.provide('ol.MapProperty'); From 89eadc5770734949260f753e4fbf73bf3d48b125 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Lemoine?= Date: Thu, 16 Aug 2012 15:00:14 +0200 Subject: [PATCH 516/562] move back rendering freeze/unfreeze and animation from map renderer to map --- src/ol/base/map.js | 101 ++++++++++++++++++++++++++++++++++- src/ol/base/maprenderer.js | 102 +----------------------------------- src/ol/webgl/maprenderer.js | 4 +- 3 files changed, 102 insertions(+), 105 deletions(-) diff --git a/src/ol/base/map.js b/src/ol/base/map.js index 88a17e811d..5789d72685 100644 --- a/src/ol/base/map.js +++ b/src/ol/base/map.js @@ -105,6 +105,24 @@ ol.Map = function( */ this.pixelToCoordinateMatrix_ = goog.vec.Mat4.createNumber(); + /** + * @private + * @type {boolean} + */ + this.animating_ = false; + + /** + * @private + * @type {boolean} + */ + this.dirty_ = false; + + /** + * @private + * @type {number} + */ + this.freezeRenderingCount_ = 0; + /** * @private * @type {boolean} @@ -156,6 +174,12 @@ ol.Map = function( this.renderer_ = new rendererConstructor(target, this); this.registerDisposable(this.renderer_); + /** + * @private + * @type {ol.MapAnimation} + */ + this.animation_ = new ol.MapAnimation(this.renderer_); + /** * @private * @type {Element} @@ -753,16 +777,89 @@ ol.Map.prototype.updateMatrices_ = function() { }; +/** + */ +ol.Map.prototype.render = function() { + if (!this.animating_) { + if (this.freezeRenderingCount_ === 0) { + if (this.renderer_.render()) { + this.animate_(); + } + } else { + this.dirty_ = true; + } + } +}; + + +/** + * @private + */ +ol.Map.prototype.animate_ = function() { + goog.asserts.assert(!this.animating_); + goog.fx.anim.registerAnimation(this.animation_); + this.animating_ = true; +}; + + /** * @param {function(this: T)} f Function. * @param {T=} opt_obj Object. * @template T */ ol.Map.prototype.withFrozenRendering = function(f, opt_obj) { - this.renderer_.freezeRendering(); + this.freezeRendering(); try { f.call(opt_obj); } finally { - this.renderer_.unfreezeRendering(); + this.unfreezeRendering(); + } +}; + + +/** + */ +ol.Map.prototype.freezeRendering = function() { + ++this.freezeRenderingCount_; +}; + + +/** + */ +ol.Map.prototype.unfreezeRendering = function() { + goog.asserts.assert(this.freezeRenderingCount_ > 0); + if (--this.freezeRenderingCount_ === 0) { + if (!this.animating_ && this.dirty_) { + if (this.renderer_.render()) { + this.animate_(); + } + } + } +}; + + + +/** + * @constructor + * @implements {goog.fx.anim.Animated} + * @param {!ol.MapRenderer} renderer Map renderer. + */ +ol.MapAnimation = function(renderer) { + + /** + * @private + * @type {ol.MapRenderer} + */ + this.renderer_ = renderer; + +}; + + +/** + * @inheritDoc + */ +ol.MapAnimation.prototype.onAnimationFrame = function() { + if (!this.renderer_.render()) { + goog.fx.anim.unregisterAnimation(this); } }; diff --git a/src/ol/base/maprenderer.js b/src/ol/base/maprenderer.js index cbb0cca078..a2fa959ec6 100644 --- a/src/ol/base/maprenderer.js +++ b/src/ol/base/maprenderer.js @@ -31,31 +31,6 @@ ol.MapRenderer = function(target, map) { */ this.map = map; - /** - * @private - * @type {ol.MapRendererAnimation} - */ - this.animation_ = new ol.MapRendererAnimation(this); - - /** - * @private - * @type {boolean} - */ - this.animating_ = false; - - /** - * @private - * @type {boolean} - */ - this.dirty_ = false; - - /** - * @private - * @type {number} - */ - this.freezeRenderingCount_ = 0; - - /** * @protected * @type {Object.} @@ -292,26 +267,9 @@ ol.MapRenderer.prototype.handleSizeChanged = goog.nullFunction; /** - */ -ol.MapRenderer.prototype.render = function() { - if (!this.animating_) { - if (this.freezeRenderingCount_ === 0) { - if (this.renderInternal()) { - this.animate_(); - } - } else { - this.dirty_ = true; - } - } -}; - - -/** - * @protected * @return {boolean} Animating. */ -ol.MapRenderer.prototype.renderInternal = function() { - this.dirty_ = false; +ol.MapRenderer.prototype.render = function() { var animate = false; this.forEachReadyVisibleLayer(function(layer, layerRenderer) { if (layerRenderer.render()) { @@ -320,61 +278,3 @@ ol.MapRenderer.prototype.renderInternal = function() { }); return animate; }; - - -/** - * @private - */ -ol.MapRenderer.prototype.animate_ = function() { - goog.asserts.assert(!this.animating_); - goog.fx.anim.registerAnimation(this.animation_); - this.animating_ = true; -}; - - -/** - */ -ol.MapRenderer.prototype.freezeRendering = function() { - ++this.freezeRenderingCount_; -}; - - -/** - */ -ol.MapRenderer.prototype.unfreezeRendering = function() { - goog.asserts.assert(this.freezeRenderingCount_ > 0); - if (--this.freezeRenderingCount_ === 0) { - if (!this.animating_ && this.dirty_) { - if (this.renderInternal()) { - this.animate_(); - } - } - } -}; - - - -/** - * @constructor - * @implements {goog.fx.anim.Animated} - * @param {!ol.MapRenderer} renderer renderer. - */ -ol.MapRendererAnimation = function(renderer) { - - /** - * @private - * @type {ol.MapRenderer} - */ - this.renderer_ = renderer; - -}; - - -/** - * @inheritDoc - */ -ol.MapRendererAnimation.prototype.onAnimationFrame = function() { - if (!this.renderer_.renderInternal()) { - goog.fx.anim.unregisterAnimation(this); - } -}; diff --git a/src/ol/webgl/maprenderer.js b/src/ol/webgl/maprenderer.js index aad37c6427..a923626336 100644 --- a/src/ol/webgl/maprenderer.js +++ b/src/ol/webgl/maprenderer.js @@ -517,7 +517,7 @@ ol.webgl.MapRenderer.prototype.isImageTextureLoaded = function(image) { /** * @inheritDoc */ -ol.webgl.MapRenderer.prototype.renderInternal = function() { +ol.webgl.MapRenderer.prototype.render = function() { if (!this.getMap().isDef()) { return false; @@ -525,7 +525,7 @@ ol.webgl.MapRenderer.prototype.renderInternal = function() { var size = this.getMap().getSize(); - var animate = goog.base(this, 'renderInternal'); + var animate = goog.base(this, 'render'); var gl = this.getGL(); From 9eb031ed89b237a6ad0e7cb26c40a9bee941f898 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Lemoine?= Date: Thu, 16 Aug 2012 15:04:23 +0200 Subject: [PATCH 517/562] remove ol.webgl.LayerRenderer.prototype.getGL (as suggest by @twpayne) --- src/ol/webgl/layerrenderer.js | 8 -------- src/ol/webgl/tilelayerrenderer.js | 10 ++++++---- 2 files changed, 6 insertions(+), 12 deletions(-) diff --git a/src/ol/webgl/layerrenderer.js b/src/ol/webgl/layerrenderer.js index fb85a7ed04..59ca120d7a 100644 --- a/src/ol/webgl/layerrenderer.js +++ b/src/ol/webgl/layerrenderer.js @@ -32,14 +32,6 @@ ol.webgl.LayerRenderer.prototype.dispatchChangeEvent = function() { ol.webgl.LayerRenderer.prototype.getTexture = goog.abstractMethod; -/** - * @return {WebGLRenderingContext} GL. - */ -ol.webgl.LayerRenderer.prototype.getGL = function() { - return this.getMapRenderer().getGL(); -}; - - /** * @override * @return {ol.MapRenderer} MapRenderer. diff --git a/src/ol/webgl/tilelayerrenderer.js b/src/ol/webgl/tilelayerrenderer.js index 65b39c0ded..de57ee598b 100644 --- a/src/ol/webgl/tilelayerrenderer.js +++ b/src/ol/webgl/tilelayerrenderer.js @@ -149,7 +149,8 @@ goog.inherits(ol.webgl.TileLayerRenderer, ol.webgl.LayerRenderer); * @protected */ ol.webgl.TileLayerRenderer.prototype.disposeInternal = function() { - var gl = this.getGL(); + var mapRenderer = this.getMapRenderer(); + var gl = mapRenderer.getGL(); if (!gl.isContextLost()) { gl.deleteBuffer(this.arrayBuffer_); gl.deleteFramebuffer(this.framebuffer_); @@ -166,7 +167,8 @@ ol.webgl.TileLayerRenderer.prototype.disposeInternal = function() { ol.webgl.TileLayerRenderer.prototype.bindFramebuffer_ = function(framebufferDimension) { - var gl = this.getGL(); + var mapRenderer = this.getMapRenderer(); + var gl = mapRenderer.getGL(); if (!goog.isDef(this.framebufferDimension_) || this.framebufferDimension_ != framebufferDimension) { @@ -249,9 +251,9 @@ ol.webgl.TileLayerRenderer.prototype.handleWebGLContextLost = function() { */ ol.webgl.TileLayerRenderer.prototype.render = function() { - var gl = this.getGL(); - var map = this.getMap(); var mapRenderer = this.getMapRenderer(); + var map = this.getMap(); + var gl = mapRenderer.getGL(); goog.asserts.assert(map.isDef()); var mapCenter = map.getCenter(); From 70587af9473fa627bd367f06d047bd9641a8e722 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Lemoine?= Date: Thu, 16 Aug 2012 15:35:33 +0200 Subject: [PATCH 518/562] move pixel to/from coordinate calculation functions from Map to MapRenderer --- src/ol/base/map.js | 121 +------------------------------------ src/ol/base/maprenderer.js | 104 +++++++++++++++++++++++++++++-- 2 files changed, 102 insertions(+), 123 deletions(-) diff --git a/src/ol/base/map.js b/src/ol/base/map.js index 5789d72685..9c07fa3917 100644 --- a/src/ol/base/map.js +++ b/src/ol/base/map.js @@ -26,7 +26,6 @@ goog.require('goog.fx.Dragger'); goog.require('goog.fx.anim'); goog.require('goog.fx.anim.Animated'); goog.require('goog.object'); -goog.require('goog.vec.Mat4'); goog.require('ol.Collection'); goog.require('ol.Color'); goog.require('ol.Coordinate'); @@ -93,18 +92,6 @@ ol.Map = function( */ this.mapToUserTransform_ = ol.Projection.cloneTransform; - /** - * @private - * @type {goog.vec.Mat4.Number} - */ - this.coordinateToPixelMatrix_ = goog.vec.Mat4.createNumber(); - - /** - * @private - * @type {goog.vec.Mat4.Number} - */ - this.pixelToCoordinateMatrix_ = goog.vec.Mat4.createNumber(); - /** * @private * @type {boolean} @@ -123,12 +110,6 @@ ol.Map = function( */ this.freezeRenderingCount_ = 0; - /** - * @private - * @type {boolean} - */ - this.matriciesDirty_ = true; - /** * @private * @type {Element} @@ -196,26 +177,10 @@ ol.Map = function( goog.events.listen(this.viewportSizeMonitor_, goog.events.EventType.RESIZE, this.handleViewportResize, false, this); - goog.events.listen( - this, ol.Object.getChangedEventType(ol.MapProperty.CENTER), - this.handleCenterChanged, false, this); - goog.events.listen( this, ol.Object.getChangedEventType(ol.MapProperty.PROJECTION), this.handleProjectionChanged, false, this); - goog.events.listen( - this, ol.Object.getChangedEventType(ol.MapProperty.RESOLUTION), - this.handleResolutionChanged, false, this); - - goog.events.listen( - this, ol.Object.getChangedEventType(ol.MapProperty.ROTATION), - this.handleRotationChanged, false, this); - - goog.events.listen( - this, ol.Object.getChangedEventType(ol.MapProperty.SIZE), - this.handleSizeChanged, false, this); - goog.events.listen( this, ol.Object.getChangedEventType(ol.MapProperty.USER_PROJECTION), this.handleUserProjectionChanged, false, this); @@ -291,10 +256,7 @@ goog.exportProperty( */ ol.Map.prototype.getCoordinateFromPixel = function(pixel) { if (this.isDef()) { - this.updateMatrices_(); - var vec3 = [pixel.x, pixel.y, 0]; - goog.vec.Mat4.multVec3(this.pixelToCoordinateMatrix_, vec3, vec3); - return new ol.Coordinate(vec3[0], vec3[1]); + return this.renderer_.getCoordinateFromPixel(pixel); } else { return undefined; } @@ -346,10 +308,7 @@ ol.Map.prototype.getLayers = function() { */ ol.Map.prototype.getPixelFromCoordinate = function(coordinate) { if (this.isDef()) { - this.updateMatrices_(); - var vec3 = [coordinate.x, coordinate.y, 0]; - goog.vec.Mat4.multVec3(this.coordinateToPixelMatrix_, vec3, vec3); - return new ol.Pixel(vec3[0], vec3[1]); + return this.renderer_.getPixelFromCoordinate(coordinate); } else { return undefined; } @@ -509,14 +468,6 @@ ol.Map.prototype.handleBrowserEvent = function(browserEvent, opt_type) { }; -/** - * @protected - */ -ol.Map.prototype.handleCenterChanged = function() { - this.matriciesDirty_ = true; -}; - - /** * @param {goog.fx.DragEvent} dragEvent Drag event. */ @@ -534,30 +485,6 @@ ol.Map.prototype.handleProjectionChanged = function() { }; -/** - * @protected - */ -ol.Map.prototype.handleResolutionChanged = function() { - this.matriciesDirty_ = true; -}; - - -/** - * @protected - */ -ol.Map.prototype.handleRotationChanged = function() { - this.matriciesDirty_ = true; -}; - - -/** - * @protected - */ -ol.Map.prototype.handleSizeChanged = function() { - this.matriciesDirty_ = true; -}; - - /** * @protected */ @@ -733,50 +660,6 @@ goog.exportProperty( ol.Map.prototype.setUserProjection); -/** - * @private - */ -ol.Map.prototype.updateMatrices_ = function() { - - if (this.matriciesDirty_) { - - var center = /** @type {!ol.Coordinate} */ this.getCenter(); - var resolution = /** @type {number} */ this.getResolution(); - var rotation = this.getRotation(); - var size = /** @type {!ol.Size} */ this.getSize(); - - goog.vec.Mat4.makeIdentity(this.coordinateToPixelMatrix_); - goog.vec.Mat4.translate(this.coordinateToPixelMatrix_, - size.width / 2, - size.height / 2, - 0); - goog.vec.Mat4.scale(this.coordinateToPixelMatrix_, - 1 / resolution, - -1 / resolution, - 1); - if (this.canRotate() && goog.isDef(rotation)) { - goog.vec.Mat4.rotate(this.coordinateToPixelMatrix_, - -rotation, - 0, - 0, - 1); - } - goog.vec.Mat4.translate(this.coordinateToPixelMatrix_, - -center.x, - -center.y, - 0); - - var inverted = goog.vec.Mat4.invert( - this.coordinateToPixelMatrix_, this.pixelToCoordinateMatrix_); - goog.asserts.assert(inverted); - - this.matriciesDirty_ = false; - - } - -}; - - /** */ ol.Map.prototype.render = function() { diff --git a/src/ol/base/maprenderer.js b/src/ol/base/maprenderer.js index a2fa959ec6..e9db1b7a3e 100644 --- a/src/ol/base/maprenderer.js +++ b/src/ol/base/maprenderer.js @@ -4,6 +4,7 @@ goog.require('goog.Disposable'); goog.require('goog.events'); goog.require('goog.fx.anim'); goog.require('goog.fx.anim.Animated'); +goog.require('goog.vec.Mat4'); goog.require('ol.Map'); goog.require('ol.MapProperty'); @@ -43,6 +44,24 @@ ol.MapRenderer = function(target, map) { */ this.layersListenerKeys_ = null; + /** + * @private + * @type {goog.vec.Mat4.Number} + */ + this.coordinateToPixelMatrix_ = goog.vec.Mat4.createNumber(); + + /** + * @private + * @type {goog.vec.Mat4.Number} + */ + this.pixelToCoordinateMatrix_ = goog.vec.Mat4.createNumber(); + + /** + * @private + * @type {boolean} + */ + this.matricesDirty_ = true; + /** * @private * @type {Array.} @@ -155,7 +174,9 @@ ol.MapRenderer.prototype.handleBackgroundColorChanged = goog.nullFunction; /** * @protected */ -ol.MapRenderer.prototype.handleCenterChanged = goog.nullFunction; +ol.MapRenderer.prototype.handleCenterChanged = function() { + this.matricesDirty_ = true; +}; /** @@ -251,19 +272,25 @@ ol.MapRenderer.prototype.removeLayerRenderer = function(layer) { /** * @protected */ -ol.MapRenderer.prototype.handleResolutionChanged = goog.nullFunction; +ol.MapRenderer.prototype.handleResolutionChanged = function() { + this.matricesDirty_ = true; +}; /** * @protected */ -ol.MapRenderer.prototype.handleRotationChanged = goog.nullFunction; +ol.MapRenderer.prototype.handleRotationChanged = function() { + this.matricesDirty_ = true; +}; /** * @protected */ -ol.MapRenderer.prototype.handleSizeChanged = goog.nullFunction; +ol.MapRenderer.prototype.handleSizeChanged = function() { + this.matricesDirty_ = true; +}; /** @@ -278,3 +305,72 @@ ol.MapRenderer.prototype.render = function() { }); return animate; }; + + +/** + * @private + */ +ol.MapRenderer.prototype.updateMatrices_ = function() { + + if (this.matricesDirty_) { + + var map = this.map; + var center = /** @type {!ol.Coordinate} */ map.getCenter(); + var resolution = /** @type {number} */ map.getResolution(); + var rotation = map.getRotation(); + var size = /** @type {!ol.Size} */ map.getSize(); + + goog.vec.Mat4.makeIdentity(this.coordinateToPixelMatrix_); + goog.vec.Mat4.translate(this.coordinateToPixelMatrix_, + size.width / 2, + size.height / 2, + 0); + goog.vec.Mat4.scale(this.coordinateToPixelMatrix_, + 1 / resolution, + -1 / resolution, + 1); + if (this.canRotate() && goog.isDef(rotation)) { + goog.vec.Mat4.rotate(this.coordinateToPixelMatrix_, + -rotation, + 0, + 0, + 1); + } + goog.vec.Mat4.translate(this.coordinateToPixelMatrix_, + -center.x, + -center.y, + 0); + + var inverted = goog.vec.Mat4.invert( + this.coordinateToPixelMatrix_, this.pixelToCoordinateMatrix_); + goog.asserts.assert(inverted); + + this.matricesDirty_ = false; + + } + +}; + + +/** + * @param {ol.Pixel} pixel Pixel. + * @return {ol.Coordinate} Coordinate. + */ +ol.MapRenderer.prototype.getCoordinateFromPixel = function(pixel) { + this.updateMatrices_(); + var vec3 = [pixel.x, pixel.y, 0]; + goog.vec.Mat4.multVec3(this.pixelToCoordinateMatrix_, vec3, vec3); + return new ol.Coordinate(vec3[0], vec3[1]); +}; + + +/** + * @param {ol.Coordinate} coordinate Coordinate. + * @return {ol.Pixel} Pixel. + */ +ol.MapRenderer.prototype.getPixelFromCoordinate = function(coordinate) { + this.updateMatrices_(); + var vec3 = [coordinate.x, coordinate.y, 0]; + goog.vec.Mat4.multVec3(this.coordinateToPixelMatrix_, vec3, vec3); + return new ol.Pixel(vec3[0], vec3[1]); +}; From adb209c3f98580b590dae48b5d837aed8bae29f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Lemoine?= Date: Thu, 16 Aug 2012 16:14:16 +0200 Subject: [PATCH 519/562] map functions in alphabetical order --- src/ol/base/map.js | 72 +++++++++++++++++++++++----------------------- 1 file changed, 36 insertions(+), 36 deletions(-) diff --git a/src/ol/base/map.js b/src/ol/base/map.js index 9c07fa3917..26e1febc0e 100644 --- a/src/ol/base/map.js +++ b/src/ol/base/map.js @@ -195,6 +195,16 @@ ol.Map = function( goog.inherits(ol.Map, ol.Object); +/** + * @private + */ +ol.Map.prototype.animate_ = function() { + goog.asserts.assert(!this.animating_); + goog.fx.anim.registerAnimation(this.animation_); + this.animating_ = true; +}; + + /** * @return {boolean} Can rotate. */ @@ -225,6 +235,13 @@ ol.Map.prototype.fitUserExtent = function(userExtent) { }; +/** + */ +ol.Map.prototype.freezeRendering = function() { + ++this.freezeRenderingCount_; +}; + + /** * @return {ol.Color|undefined} Background color. */ @@ -531,6 +548,21 @@ ol.Map.prototype.recalculateTransforms_ = function() { }; +/** + */ +ol.Map.prototype.render = function() { + if (!this.animating_) { + if (this.freezeRenderingCount_ === 0) { + if (this.renderer_.render()) { + this.animate_(); + } + } else { + this.dirty_ = true; + } + } +}; + + /** * @param {ol.Color} backgroundColor Background color. */ @@ -662,29 +694,18 @@ goog.exportProperty( /** */ -ol.Map.prototype.render = function() { - if (!this.animating_) { - if (this.freezeRenderingCount_ === 0) { +ol.Map.prototype.unfreezeRendering = function() { + goog.asserts.assert(this.freezeRenderingCount_ > 0); + if (--this.freezeRenderingCount_ === 0) { + if (!this.animating_ && this.dirty_) { if (this.renderer_.render()) { this.animate_(); } - } else { - this.dirty_ = true; } } }; -/** - * @private - */ -ol.Map.prototype.animate_ = function() { - goog.asserts.assert(!this.animating_); - goog.fx.anim.registerAnimation(this.animation_); - this.animating_ = true; -}; - - /** * @param {function(this: T)} f Function. * @param {T=} opt_obj Object. @@ -700,27 +721,6 @@ ol.Map.prototype.withFrozenRendering = function(f, opt_obj) { }; -/** - */ -ol.Map.prototype.freezeRendering = function() { - ++this.freezeRenderingCount_; -}; - - -/** - */ -ol.Map.prototype.unfreezeRendering = function() { - goog.asserts.assert(this.freezeRenderingCount_ > 0); - if (--this.freezeRenderingCount_ === 0) { - if (!this.animating_ && this.dirty_) { - if (this.renderer_.render()) { - this.animate_(); - } - } - } -}; - - /** * @constructor From 4f2b6a0c22799a697b217ec2877cef986fd97d8b Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Tue, 14 Aug 2012 18:21:45 +0200 Subject: [PATCH 520/562] Initialize all member variables in constructor --- src/ol/base/mapbrowserevent.js | 13 +++++---- src/ol/control/mouseposition.js | 13 +++++---- src/ol/interaction/altdragrotate.js | 15 ++++++----- src/ol/interaction/shiftdragrotateandzoom.js | 28 ++++++++++---------- 4 files changed, 34 insertions(+), 35 deletions(-) diff --git a/src/ol/base/mapbrowserevent.js b/src/ol/base/mapbrowserevent.js index 6466e4a9fc..5c9421531d 100644 --- a/src/ol/base/mapbrowserevent.js +++ b/src/ol/base/mapbrowserevent.js @@ -23,17 +23,16 @@ ol.MapBrowserEvent = function(type, map, browserEvent) { */ this.browserEvent = browserEvent; + /** + * @private + * @type {ol.Coordinate|undefined} + */ + this.coordinate_ = undefined; + }; goog.inherits(ol.MapBrowserEvent, ol.MapEvent); -/** - * @private - * @type {ol.Coordinate|undefined} - */ -ol.MapBrowserEvent.prototype.coordinate_; - - /** * @return {ol.Coordinate|undefined} Coordinate. */ diff --git a/src/ol/control/mouseposition.js b/src/ol/control/mouseposition.js index 4288772805..52f7ca220d 100644 --- a/src/ol/control/mouseposition.js +++ b/src/ol/control/mouseposition.js @@ -49,6 +49,12 @@ ol.control.MousePosition = */ this.undefinedHTML_ = opt_undefinedHTML || ''; + /** + * @private + * @type {ol.TransformFunction} + */ + this.transform_ = ol.Projection.identityTransform; + goog.events.listen(map, ol.Object.getChangedEventType(ol.MapProperty.PROJECTION), this.handleMapProjectionChanged, false, this); @@ -65,13 +71,6 @@ ol.control.MousePosition = goog.inherits(ol.control.MousePosition, ol.Control); -/** - * @private - * @type {ol.TransformFunction} - */ -ol.control.MousePosition.prototype.transform_; - - /** * @inheritDoc */ diff --git a/src/ol/interaction/altdragrotate.js b/src/ol/interaction/altdragrotate.js index 5c42c4d434..50dc5c0980 100644 --- a/src/ol/interaction/altdragrotate.js +++ b/src/ol/interaction/altdragrotate.js @@ -11,18 +11,19 @@ goog.require('ol.interaction.Drag'); * @param {ol.interaction.Constraints} constraints Constraints. */ ol.interaction.AltDragRotate = function(constraints) { + goog.base(this, constraints); + + /** + * @private + * @type {number} + */ + this.startRotation_ = 0; + }; goog.inherits(ol.interaction.AltDragRotate, ol.interaction.Drag); -/** - * @private - * @type {number} - */ -ol.interaction.AltDragRotate.prototype.startRotation_; - - /** * @inheritDoc */ diff --git a/src/ol/interaction/shiftdragrotateandzoom.js b/src/ol/interaction/shiftdragrotateandzoom.js index 748209c412..ec779a9088 100644 --- a/src/ol/interaction/shiftdragrotateandzoom.js +++ b/src/ol/interaction/shiftdragrotateandzoom.js @@ -13,25 +13,25 @@ goog.require('ol.interaction.Drag'); * @param {ol.interaction.Constraints} constraints Constraints. */ ol.interaction.ShiftDragRotateAndZoom = function(constraints) { + goog.base(this, constraints); + + /** + * @private + * @type {number} + */ + this.startRatio_ = 0; + + /** + * @private + * @type {number} + */ + this.startRotation_ = 0; + }; goog.inherits(ol.interaction.ShiftDragRotateAndZoom, ol.interaction.Drag); -/** - * @private - * @type {number} - */ -ol.interaction.ShiftDragRotateAndZoom.prototype.startRatio_; - - -/** - * @private - * @type {number} - */ -ol.interaction.ShiftDragRotateAndZoom.prototype.startRotation_; - - /** * @inheritDoc */ From 44cd3ceccb2f323f3be53dc87336caed220042e6 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Thu, 16 Aug 2012 17:54:22 +0200 Subject: [PATCH 521/562] Re-order functions alphabetically --- src/ol/base/coordinateformat.js | 32 ++--- src/ol/base/layerrenderer.js | 20 +-- src/ol/base/maprenderer.js | 176 ++++++++++++------------- src/ol/base/object.js | 66 +++++----- src/ol/control/attribution.js | 210 +++++++++++++++--------------- src/ol/control/mouseposition.js | 18 +-- src/ol/dom/layerrenderer.js | 20 +-- src/ol/dom/maprenderer.js | 106 +++++++-------- src/ol/dom/tilelayerrenderer.js | 88 ++++++------- src/ol/interaction/drag.js | 6 +- src/ol/interaction/interaction.js | 12 +- src/ol/tile/tileurlfunction.js | 20 +-- src/ol/webgl/layerrenderer.js | 12 +- src/ol/webgl/maprenderer.js | 50 +++---- src/ol/webgl/tilelayerrenderer.js | 30 ++--- 15 files changed, 433 insertions(+), 433 deletions(-) diff --git a/src/ol/base/coordinateformat.js b/src/ol/base/coordinateformat.js index fa8ef51423..a654b757a8 100644 --- a/src/ol/base/coordinateformat.js +++ b/src/ol/base/coordinateformat.js @@ -11,22 +11,6 @@ goog.require('ol.Coordinate'); ol.CoordinateFormatType; -/** - * @private - * @param {number} degrees Degrees. - * @param {string} hemispheres Hemispheres. - * @return {string} String. - */ -ol.CoordinateFormat.degreesToHDMS_ = function(degrees, hemispheres) { - var normalizedDegrees = goog.math.modulo(degrees + 180, 360) - 180; - var x = Math.abs(Math.round(3600 * normalizedDegrees)); - return Math.floor(x / 3600) + '\u00b0 ' + - Math.floor((x / 60) % 60) + '\u2032 ' + - Math.floor(x % 60) + '\u2033 ' + - hemispheres.charAt(normalizedDegrees < 0 ? 1 : 0); -}; - - /** * @param {number} precision Precision. * @return {ol.CoordinateFormatType} Coordinate format. @@ -43,6 +27,22 @@ ol.CoordinateFormat.createXY = function(precision) { }; +/** + * @private + * @param {number} degrees Degrees. + * @param {string} hemispheres Hemispheres. + * @return {string} String. + */ +ol.CoordinateFormat.degreesToHDMS_ = function(degrees, hemispheres) { + var normalizedDegrees = goog.math.modulo(degrees + 180, 360) - 180; + var x = Math.abs(Math.round(3600 * normalizedDegrees)); + return Math.floor(x / 3600) + '\u00b0 ' + + Math.floor((x / 60) % 60) + '\u2032 ' + + Math.floor(x % 60) + '\u2033 ' + + hemispheres.charAt(normalizedDegrees < 0 ? 1 : 0); +}; + + /** * @param {ol.Coordinate|undefined} coordinate Coordinate. * @return {string} Coordinate format. diff --git a/src/ol/base/layerrenderer.js b/src/ol/base/layerrenderer.js index cc4074761a..cfbcfff4b6 100644 --- a/src/ol/base/layerrenderer.js +++ b/src/ol/base/layerrenderer.js @@ -69,14 +69,6 @@ ol.LayerRenderer.prototype.getLayer = function() { }; -/** - * @return {ol.MapRenderer} Map renderer. - */ -ol.LayerRenderer.prototype.getMapRenderer = function() { - return this.mapRenderer_; -}; - - /** * @return {ol.Map} Map. */ @@ -85,6 +77,14 @@ ol.LayerRenderer.prototype.getMap = function() { }; +/** + * @return {ol.MapRenderer} Map renderer. + */ +ol.LayerRenderer.prototype.getMapRenderer = function() { + return this.mapRenderer_; +}; + + /** * @protected */ @@ -106,13 +106,13 @@ ol.LayerRenderer.prototype.handleLayerHueChange = goog.nullFunction; /** * @protected */ -ol.LayerRenderer.prototype.handleLayerOpacityChange = goog.nullFunction; +ol.LayerRenderer.prototype.handleLayerLoad = goog.nullFunction; /** * @protected */ -ol.LayerRenderer.prototype.handleLayerLoad = goog.nullFunction; +ol.LayerRenderer.prototype.handleLayerOpacityChange = goog.nullFunction; /** diff --git a/src/ol/base/maprenderer.js b/src/ol/base/maprenderer.js index e9db1b7a3e..06546c5a61 100644 --- a/src/ol/base/maprenderer.js +++ b/src/ol/base/maprenderer.js @@ -96,6 +96,30 @@ ol.MapRenderer = function(target, map) { goog.inherits(ol.MapRenderer, goog.Disposable); +/** + * @param {ol.Layer} layer Layer. + * @protected + */ +ol.MapRenderer.prototype.addLayer = function(layer) { + var layerRenderer = this.createLayerRenderer(layer); + this.setLayerRenderer(layer, layerRenderer); +}; + + +/** + * @return {boolean} Can rotate. + */ +ol.MapRenderer.prototype.canRotate = goog.functions.FALSE; + + +/** + * @param {ol.Layer} layer Layer. + * @protected + * @return {ol.LayerRenderer} layerRenderer Layer renderer. + */ +ol.MapRenderer.prototype.createLayerRenderer = goog.abstractMethod; + + /** * @inheritDoc */ @@ -128,10 +152,14 @@ ol.MapRenderer.prototype.forEachReadyVisibleLayer = function(f, opt_obj) { /** - * @return {ol.Map} Map. + * @param {ol.Pixel} pixel Pixel. + * @return {ol.Coordinate} Coordinate. */ -ol.MapRenderer.prototype.getMap = function() { - return this.map; +ol.MapRenderer.prototype.getCoordinateFromPixel = function(pixel) { + this.updateMatrices_(); + var vec3 = [pixel.x, pixel.y, 0]; + goog.vec.Mat4.multVec3(this.pixelToCoordinateMatrix_, vec3, vec3); + return new ol.Coordinate(vec3[0], vec3[1]); }; @@ -149,21 +177,23 @@ ol.MapRenderer.prototype.getLayerRenderer = function(layer) { /** - * @param {ol.Layer} layer Layer. - * @param {ol.LayerRenderer} layerRenderer Layer renderer. - * @protected + * @return {ol.Map} Map. */ -ol.MapRenderer.prototype.setLayerRenderer = function(layer, layerRenderer) { - var key = goog.getUid(layer); - goog.asserts.assert(!(key in this.layerRenderers)); - this.layerRenderers[key] = layerRenderer; +ol.MapRenderer.prototype.getMap = function() { + return this.map; }; /** - * @return {boolean} Can rotate. + * @param {ol.Coordinate} coordinate Coordinate. + * @return {ol.Pixel} Pixel. */ -ol.MapRenderer.prototype.canRotate = goog.functions.FALSE; +ol.MapRenderer.prototype.getPixelFromCoordinate = function(coordinate) { + this.updateMatrices_(); + var vec3 = [coordinate.x, coordinate.y, 0]; + goog.vec.Mat4.multVec3(this.coordinateToPixelMatrix_, vec3, vec3); + return new ol.Pixel(vec3[0], vec3[1]); +}; /** @@ -179,6 +209,16 @@ ol.MapRenderer.prototype.handleCenterChanged = function() { }; +/** + * @param {ol.CollectionEvent} collectionEvent Collection event. + * @protected + */ +ol.MapRenderer.prototype.handleLayersAdd = function(collectionEvent) { + var layer = /** @type {ol.Layer} */ collectionEvent.elem; + this.addLayer(layer); +}; + + /** * @protected */ @@ -205,34 +245,6 @@ ol.MapRenderer.prototype.handleLayersChanged = function() { }; -/** - * @param {ol.CollectionEvent} collectionEvent Collection event. - * @protected - */ -ol.MapRenderer.prototype.handleLayersAdd = function(collectionEvent) { - var layer = /** @type {ol.Layer} */ collectionEvent.elem; - this.addLayer(layer); -}; - - -/** - * @param {ol.Layer} layer Layer. - * @protected - */ -ol.MapRenderer.prototype.addLayer = function(layer) { - var layerRenderer = this.createLayerRenderer(layer); - this.setLayerRenderer(layer, layerRenderer); -}; - - -/** - * @param {ol.Layer} layer Layer. - * @protected - * @return {ol.LayerRenderer} layerRenderer Layer renderer. - */ -ol.MapRenderer.prototype.createLayerRenderer = goog.abstractMethod; - - /** * @param {ol.CollectionEvent} collectionEvent Collection event. * @protected @@ -243,6 +255,30 @@ ol.MapRenderer.prototype.handleLayersRemove = function(collectionEvent) { }; +/** + * @protected + */ +ol.MapRenderer.prototype.handleResolutionChanged = function() { + this.matricesDirty_ = true; +}; + + +/** + * @protected + */ +ol.MapRenderer.prototype.handleRotationChanged = function() { + this.matricesDirty_ = true; +}; + + +/** + * @protected + */ +ol.MapRenderer.prototype.handleSizeChanged = function() { + this.matricesDirty_ = true; +}; + + /** * @param {ol.Layer} layer Layer. * @protected @@ -269,30 +305,6 @@ ol.MapRenderer.prototype.removeLayerRenderer = function(layer) { }; -/** - * @protected - */ -ol.MapRenderer.prototype.handleResolutionChanged = function() { - this.matricesDirty_ = true; -}; - - -/** - * @protected - */ -ol.MapRenderer.prototype.handleRotationChanged = function() { - this.matricesDirty_ = true; -}; - - -/** - * @protected - */ -ol.MapRenderer.prototype.handleSizeChanged = function() { - this.matricesDirty_ = true; -}; - - /** * @return {boolean} Animating. */ @@ -307,6 +319,18 @@ ol.MapRenderer.prototype.render = function() { }; +/** + * @param {ol.Layer} layer Layer. + * @param {ol.LayerRenderer} layerRenderer Layer renderer. + * @protected + */ +ol.MapRenderer.prototype.setLayerRenderer = function(layer, layerRenderer) { + var key = goog.getUid(layer); + goog.asserts.assert(!(key in this.layerRenderers)); + this.layerRenderers[key] = layerRenderer; +}; + + /** * @private */ @@ -350,27 +374,3 @@ ol.MapRenderer.prototype.updateMatrices_ = function() { } }; - - -/** - * @param {ol.Pixel} pixel Pixel. - * @return {ol.Coordinate} Coordinate. - */ -ol.MapRenderer.prototype.getCoordinateFromPixel = function(pixel) { - this.updateMatrices_(); - var vec3 = [pixel.x, pixel.y, 0]; - goog.vec.Mat4.multVec3(this.pixelToCoordinateMatrix_, vec3, vec3); - return new ol.Coordinate(vec3[0], vec3[1]); -}; - - -/** - * @param {ol.Coordinate} coordinate Coordinate. - * @return {ol.Pixel} Pixel. - */ -ol.MapRenderer.prototype.getPixelFromCoordinate = function(coordinate) { - this.updateMatrices_(); - var vec3 = [coordinate.x, coordinate.y, 0]; - goog.vec.Mat4.multVec3(this.coordinateToPixelMatrix_, vec3, vec3); - return new ol.Pixel(vec3[0], vec3[1]); -}; diff --git a/src/ol/base/object.js b/src/ol/base/object.js index e3555d3332..2d67333247 100644 --- a/src/ol/base/object.js +++ b/src/ol/base/object.js @@ -37,6 +37,27 @@ ol.Object = function(opt_values) { goog.inherits(ol.Object, goog.events.EventTarget); +/** + * @private + * @type {Object.} + */ +ol.Object.changedEventTypeCache_ = {}; + + +/** + * @private + * @type {Object.} + */ +ol.Object.getterNameCache_ = {}; + + +/** + * @private + * @type {Object.} + */ +ol.Object.setterNameCache_ = {}; + + /** * @param {string} str String. * @return {string} Capitalized string. @@ -62,10 +83,13 @@ ol.Object.create = function(arg) { /** - * @private - * @type {Object.} + * @param {ol.Object} obj Object. + * @return {Object.} Accessors. */ -ol.Object.changedEventTypeCache_ = {}; +ol.Object.getAccessors = function(obj) { + return obj[ol.ObjectProperty.ACCESSORS] || + (obj[ol.ObjectProperty.ACCESSORS] = {}); +}; /** @@ -78,13 +102,6 @@ ol.Object.getChangedEventType = function(key) { }; -/** - * @private - * @type {Object.} - */ -ol.Object.getterNameCache_ = {}; - - /** * @param {string} key String. * @return {string} Getter name. @@ -96,10 +113,13 @@ ol.Object.getGetterName = function(key) { /** - * @private - * @type {Object.} + * @param {ol.Object} obj Object. + * @return {Object.} Listeners. */ -ol.Object.setterNameCache_ = {}; +ol.Object.getListeners = function(obj) { + return obj[ol.ObjectProperty.BINDINGS] || + (obj[ol.ObjectProperty.BINDINGS] = {}); +}; /** @@ -112,26 +132,6 @@ ol.Object.getSetterName = function(key) { }; -/** - * @param {ol.Object} obj Object. - * @return {Object.} Accessors. - */ -ol.Object.getAccessors = function(obj) { - return obj[ol.ObjectProperty.ACCESSORS] || - (obj[ol.ObjectProperty.ACCESSORS] = {}); -}; - - -/** - * @param {ol.Object} obj Object. - * @return {Object.} Listeners. - */ -ol.Object.getListeners = function(obj) { - return obj[ol.ObjectProperty.BINDINGS] || - (obj[ol.ObjectProperty.BINDINGS] = {}); -}; - - /** * @param {string} key Key. * @param {ol.Object} target Target. diff --git a/src/ol/control/attribution.js b/src/ol/control/attribution.js index 8157301ff1..5cc4bf28c3 100644 --- a/src/ol/control/attribution.js +++ b/src/ol/control/attribution.js @@ -78,6 +78,28 @@ ol.control.Attribution = function(map) { goog.inherits(ol.control.Attribution, ol.Control); +/** + * @param {ol.Layer} layer Layer. + * @protected + */ +ol.control.Attribution.prototype.addLayer = function(layer) { + + var layerKey = goog.getUid(layer); + + this.layerVisibleChangeListenerKeys_[layerKey] = goog.events.listen( + layer, ol.Object.getChangedEventType(ol.LayerProperty.VISIBLE), + this.handleLayerVisibleChanged, false, this); + + if (layer.getStore().isReady()) { + this.createAttributionElementsForLayer_(layer); + } else { + goog.events.listenOnce(layer, goog.events.EventType.LOAD, + this.handleLayerLoad, false, this); + } + +}; + + /** * @param {ol.Layer} layer Layer. * @private @@ -140,23 +162,83 @@ ol.control.Attribution.prototype.getElement = function() { /** * @param {ol.Layer} layer Layer. - * @protected + * @param {ol.Extent} mapExtent Map extent. + * @param {number} mapResolution Map resolution. + * @param {ol.Projection} mapProjection Map projection. + * @return {Object.} Attribution visibilities. + * @private */ -ol.control.Attribution.prototype.addLayer = function(layer) { +ol.control.Attribution.prototype.getLayerAttributionVisiblities_ = + function(layer, mapExtent, mapResolution, mapProjection) { - var layerKey = goog.getUid(layer); + var store = layer.getStore(); + var attributions = store.getAttributions(); - this.layerVisibleChangeListenerKeys_[layerKey] = goog.events.listen( - layer, ol.Object.getChangedEventType(ol.LayerProperty.VISIBLE), - this.handleLayerVisibleChanged, false, this); - - if (layer.getStore().isReady()) { - this.createAttributionElementsForLayer_(layer); - } else { - goog.events.listenOnce(layer, goog.events.EventType.LOAD, - this.handleLayerLoad, false, this); + if (goog.isNull(attributions)) { + return null; } + var mapZ; + if (store instanceof ol.TileStore) { + var tileStore = /** @type {ol.TileStore} */ store; + var tileGrid = tileStore.getTileGrid(); + mapZ = tileGrid.getZForResolution(mapResolution); + } + + var attributionVisibilities = {}; + goog.array.forEach(attributions, function(attribution) { + + var attributionKey = goog.getUid(attribution); + + var attributionVisible = true; + + var coverageAreas; + if (attributionKey in this.coverageAreass_) { + coverageAreas = this.coverageAreass_[attributionKey]; + } else { + var attributionProjection = attribution.getProjection(); + coverageAreas = attribution.getCoverageAreas(); + if (!goog.isNull(coverageAreas) && + !ol.Projection.equivalent(attributionProjection, mapProjection)) { + var transformFn = ol.Projection.getTransform( + attributionProjection, mapProjection); + if (transformFn !== ol.Projection.cloneTransform) { + coverageAreas = goog.array.map(coverageAreas, function(coverageArea) { + return coverageArea.transform(transformFn); + }); + } + } + this.coverageAreass_[attributionKey] = coverageAreas; + } + + if (!goog.isNull(coverageAreas)) { + if (store instanceof ol.TileStore) { + attributionVisible = goog.array.some( + coverageAreas, + /** + * @param {ol.TileCoverageArea} tileCoverageArea Tile coverage area. + */ + function(tileCoverageArea) { + goog.asserts.assert( + tileCoverageArea instanceof ol.TileCoverageArea); + return tileCoverageArea.intersectsExtentAndZ(mapExtent, mapZ); + }); + } else { + attributionVisible = goog.array.some( + coverageAreas, + function(coverageArea) { + return coverageArea.intersectsExtentAndResolution( + mapExtent, mapResolution); + }); + } + } + + attributionVisibilities[attributionKey] = attributionVisible; + + }, this); + + return attributionVisibilities; + }; @@ -170,29 +252,7 @@ ol.control.Attribution.prototype.handleLayerLoad = function(event) { /** - * @param {ol.Layer} layer Layer. - * @protected - */ -ol.control.Attribution.prototype.removeLayer = function(layer) { - - var layerKey = goog.getUid(layer); - - goog.events.unlistenByKey(this.layerVisibleChangeListenerKeys_[layerKey]); - delete this.layerVisibleChangeListenerKeys_[layerKey]; - - goog.array.forEach(layer.getStore().getAttributions(), function(attribution) { - var attributionKey = goog.getUid(attribution); - delete this.coverageAreass_[attributionKey]; - var attributionElement = this.attributionElements_[attributionKey]; - goog.dom.removeNode(attributionElement); - delete this.attributionElements_[attributionKey]; - }, this); - -}; - - -/** - * @param {goog.events.Event} event Eveny. + * @param {goog.events.Event} event Event. * @protected */ ol.control.Attribution.prototype.handleLayerVisibleChanged = function(event) { @@ -281,83 +341,23 @@ ol.control.Attribution.prototype.handleMapLayersChanged = function() { /** * @param {ol.Layer} layer Layer. - * @param {ol.Extent} mapExtent Map extent. - * @param {number} mapResolution Map resolution. - * @param {ol.Projection} mapProjection Map projection. - * @return {Object.} Attribution visibilities. - * @private + * @protected */ -ol.control.Attribution.prototype.getLayerAttributionVisiblities_ = - function(layer, mapExtent, mapResolution, mapProjection) { +ol.control.Attribution.prototype.removeLayer = function(layer) { - var store = layer.getStore(); - var attributions = store.getAttributions(); + var layerKey = goog.getUid(layer); - if (goog.isNull(attributions)) { - return null; - } - - var mapZ; - if (store instanceof ol.TileStore) { - var tileStore = /** @type {ol.TileStore} */ store; - var tileGrid = tileStore.getTileGrid(); - mapZ = tileGrid.getZForResolution(mapResolution); - } - - var attributionVisibilities = {}; - goog.array.forEach(attributions, function(attribution) { + goog.events.unlistenByKey(this.layerVisibleChangeListenerKeys_[layerKey]); + delete this.layerVisibleChangeListenerKeys_[layerKey]; + goog.array.forEach(layer.getStore().getAttributions(), function(attribution) { var attributionKey = goog.getUid(attribution); - - var attributionVisible = true; - - var coverageAreas; - if (attributionKey in this.coverageAreass_) { - coverageAreas = this.coverageAreass_[attributionKey]; - } else { - var attributionProjection = attribution.getProjection(); - coverageAreas = attribution.getCoverageAreas(); - if (!goog.isNull(coverageAreas) && - !ol.Projection.equivalent(attributionProjection, mapProjection)) { - var transformFn = ol.Projection.getTransform( - attributionProjection, mapProjection); - if (transformFn !== ol.Projection.cloneTransform) { - coverageAreas = goog.array.map(coverageAreas, function(coverageArea) { - return coverageArea.transform(transformFn); - }); - } - } - this.coverageAreass_[attributionKey] = coverageAreas; - } - - if (!goog.isNull(coverageAreas)) { - if (store instanceof ol.TileStore) { - attributionVisible = goog.array.some( - coverageAreas, - /** - * @param {ol.TileCoverageArea} tileCoverageArea Tile coverage area. - */ - function(tileCoverageArea) { - goog.asserts.assert( - tileCoverageArea instanceof ol.TileCoverageArea); - return tileCoverageArea.intersectsExtentAndZ(mapExtent, mapZ); - }); - } else { - attributionVisible = goog.array.some( - coverageAreas, - function(coverageArea) { - return coverageArea.intersectsExtentAndResolution( - mapExtent, mapResolution); - }); - } - } - - attributionVisibilities[attributionKey] = attributionVisible; - + delete this.coverageAreass_[attributionKey]; + var attributionElement = this.attributionElements_[attributionKey]; + goog.dom.removeNode(attributionElement); + delete this.attributionElements_[attributionKey]; }, this); - return attributionVisibilities; - }; diff --git a/src/ol/control/mouseposition.js b/src/ol/control/mouseposition.js index 52f7ca220d..c8ed67088e 100644 --- a/src/ol/control/mouseposition.js +++ b/src/ol/control/mouseposition.js @@ -96,15 +96,6 @@ ol.control.MousePosition.prototype.handleMapProjectionChanged = function() { }; -/** - * @param {goog.events.BrowserEvent} browserEvent Browser event. - * @protected - */ -ol.control.MousePosition.prototype.handleMouseOut = function(browserEvent) { - this.divElement_.innerHTML = this.undefinedHTML_; -}; - - /** * @param {goog.events.BrowserEvent} browserEvent Browser event. * @protected @@ -126,3 +117,12 @@ ol.control.MousePosition.prototype.handleMouseMove = function(browserEvent) { } this.divElement_.innerHTML = html; }; + + +/** + * @param {goog.events.BrowserEvent} browserEvent Browser event. + * @protected + */ +ol.control.MousePosition.prototype.handleMouseOut = function(browserEvent) { + this.divElement_.innerHTML = this.undefinedHTML_; +}; diff --git a/src/ol/dom/layerrenderer.js b/src/ol/dom/layerrenderer.js index 72352f7e30..7667c13b30 100644 --- a/src/ol/dom/layerrenderer.js +++ b/src/ol/dom/layerrenderer.js @@ -45,16 +45,6 @@ ol.dom.LayerRenderer.prototype.getMapRenderer = function() { }; -/** - * Set the location of the top left corner of the target. - * - * @param {ol.Coordinate} origin Origin. - */ -ol.dom.LayerRenderer.prototype.setOrigin = function(origin) { - this.origin = origin; -}; - - /** * @inheritDoc */ @@ -74,3 +64,13 @@ ol.dom.LayerRenderer.prototype.handleLayerVisibleChange = function() { /** */ ol.dom.LayerRenderer.prototype.render = goog.abstractMethod; + + +/** + * Set the location of the top left corner of the target. + * + * @param {ol.Coordinate} origin Origin. + */ +ol.dom.LayerRenderer.prototype.setOrigin = function(origin) { + this.origin = origin; +}; diff --git a/src/ol/dom/maprenderer.js b/src/ol/dom/maprenderer.js index cd42503188..2014f10901 100644 --- a/src/ol/dom/maprenderer.js +++ b/src/ol/dom/maprenderer.js @@ -66,6 +66,59 @@ ol.dom.MapRenderer = function(target, map) { goog.inherits(ol.dom.MapRenderer, ol.MapRenderer); +/** + * @inheritDoc + */ +ol.dom.MapRenderer.prototype.createLayerRenderer = function(layer) { + + if (layer instanceof ol.TileLayer) { + + var layerPane = goog.dom.createElement(goog.dom.TagName.DIV); + layerPane.className = 'ol-layer'; + layerPane.style.position = 'absolute'; + goog.dom.appendChild(this.layersPane_, layerPane); + + var layerRenderer = new ol.dom.TileLayerRenderer(this, layer, layerPane); + + this.layerPanes_[goog.getUid(layerRenderer)] = layerPane; + + return layerRenderer; + + } else { + goog.asserts.assert(false); + return null; + } +}; + + +/** + * @inheritDoc + */ +ol.dom.MapRenderer.prototype.handleCenterChanged = function() { + goog.base(this, 'handleCenterChanged'); + // FIXME: shiftLayersPane_ and resetLayersPane_ should be called + // elsewhere as we may be frozen here + if (goog.isDef(this.renderedCenter_)) { + this.shiftLayersPane_(); + } else { + this.resetLayersPane_(); + } + this.render(); +}; + + +/** + * @inheritDoc + */ +ol.dom.MapRenderer.prototype.handleResolutionChanged = function() { + goog.base(this, 'handleResolutionChanged'); + // FIXME: resetLayersPane_ should be called + // elsewhere as we may be frozen here + this.resetLayersPane_(); + this.render(); +}; + + /** * Reset the layers pane to its initial position. * @private @@ -118,56 +171,3 @@ ol.dom.MapRenderer.prototype.shiftLayersPane_ = function() { this.renderedCenter_ = center; } }; - - -/** - * @inheritDoc - */ -ol.dom.MapRenderer.prototype.createLayerRenderer = function(layer) { - - if (layer instanceof ol.TileLayer) { - - var layerPane = goog.dom.createElement(goog.dom.TagName.DIV); - layerPane.className = 'ol-layer'; - layerPane.style.position = 'absolute'; - goog.dom.appendChild(this.layersPane_, layerPane); - - var layerRenderer = new ol.dom.TileLayerRenderer(this, layer, layerPane); - - this.layerPanes_[goog.getUid(layerRenderer)] = layerPane; - - return layerRenderer; - - } else { - goog.asserts.assert(false); - return null; - } -}; - - -/** - * @inheritDoc - */ -ol.dom.MapRenderer.prototype.handleCenterChanged = function() { - goog.base(this, 'handleCenterChanged'); - // FIXME: shiftLayersPane_ and resetLayersPane_ should be called - // elsewhere as we may be frozen here - if (goog.isDef(this.renderedCenter_)) { - this.shiftLayersPane_(); - } else { - this.resetLayersPane_(); - } - this.render(); -}; - - -/** - * @inheritDoc - */ -ol.dom.MapRenderer.prototype.handleResolutionChanged = function() { - goog.base(this, 'handleResolutionChanged'); - // FIXME: resetLayersPane_ should be called - // elsewhere as we may be frozen here - this.resetLayersPane_(); - this.render(); -}; diff --git a/src/ol/dom/tilelayerrenderer.js b/src/ol/dom/tilelayerrenderer.js index d60b4bad37..5c66bcf786 100644 --- a/src/ol/dom/tilelayerrenderer.js +++ b/src/ol/dom/tilelayerrenderer.js @@ -44,6 +44,50 @@ ol.dom.TileLayerRenderer.prototype.getLayer = function() { }; +/** + * Get the pixel offset between the tile origin and the container origin. + * @private + * @param {number} z Z. + * @param {number} resolution Resolution. + * @return {ol.Coordinate} Offset. + */ +ol.dom.TileLayerRenderer.prototype.getTileOffset_ = function(z, resolution) { + var tileLayer = this.getLayer(); + var tileStore = tileLayer.getStore(); + var tileGrid = tileStore.getTileGrid(); + var tileOrigin = tileGrid.getOrigin(z); + var offset = new ol.Coordinate( + Math.round((this.origin.x - tileOrigin.x) / resolution), + Math.round((tileOrigin.y - this.origin.y) / resolution)); + return offset; +}; + + +/** + * Get rid of tiles outside the rendered extent. + * @private + * @param {ol.TileBounds} tileBounds Tile bounds. + * @param {number} z Z. + */ +ol.dom.TileLayerRenderer.prototype.removeInvisibleTiles_ = function( + tileBounds, z) { + var key, tileCoord, prune, tile; + for (key in this.renderedTiles_) { + tileCoord = ol.TileCoord.createFromString(key); + prune = z !== tileCoord.z || + tileCoord.x < tileBounds.minX || + tileCoord.x > tileBounds.maxX || + tileCoord.y < tileBounds.minY || + tileCoord.y > tileBounds.maxY; + if (prune) { + tile = this.renderedTiles_[key]; + delete this.renderedTiles_[key]; + goog.dom.removeNode(tile.getImage(this)); + } + } +}; + + /** * @inheritDoc */ @@ -105,47 +149,3 @@ ol.dom.TileLayerRenderer.prototype.render = function() { this.removeInvisibleTiles_(tileBounds, z); this.renderedMapResolution_ = mapResolution; }; - - -/** - * Get the pixel offset between the tile origin and the container origin. - * @private - * @param {number} z Z. - * @param {number} resolution Resolution. - * @return {ol.Coordinate} Offset. - */ -ol.dom.TileLayerRenderer.prototype.getTileOffset_ = function(z, resolution) { - var tileLayer = this.getLayer(); - var tileStore = tileLayer.getStore(); - var tileGrid = tileStore.getTileGrid(); - var tileOrigin = tileGrid.getOrigin(z); - var offset = new ol.Coordinate( - Math.round((this.origin.x - tileOrigin.x) / resolution), - Math.round((tileOrigin.y - this.origin.y) / resolution)); - return offset; -}; - - -/** - * Get rid of tiles outside the rendered extent. - * @private - * @param {ol.TileBounds} tileBounds Tile bounds. - * @param {number} z Z. - */ -ol.dom.TileLayerRenderer.prototype.removeInvisibleTiles_ = function( - tileBounds, z) { - var key, tileCoord, prune, tile; - for (key in this.renderedTiles_) { - tileCoord = ol.TileCoord.createFromString(key); - prune = z !== tileCoord.z || - tileCoord.x < tileBounds.minX || - tileCoord.x > tileBounds.maxX || - tileCoord.y < tileBounds.minY || - tileCoord.y > tileBounds.maxY; - if (prune) { - tile = this.renderedTiles_[key]; - delete this.renderedTiles_[key]; - goog.dom.removeNode(tile.getImage(this)); - } - } -}; diff --git a/src/ol/interaction/drag.js b/src/ol/interaction/drag.js index 85dc8f3880..a7e57ea505 100644 --- a/src/ol/interaction/drag.js +++ b/src/ol/interaction/drag.js @@ -70,16 +70,16 @@ ol.interaction.Drag.prototype.handleDrag = goog.nullFunction; /** * @param {ol.MapBrowserEvent} mapBrowserEvent Event. * @protected - * @return {boolean} Capture dragging. */ -ol.interaction.Drag.prototype.handleDragStart = goog.functions.FALSE; +ol.interaction.Drag.prototype.handleDragEnd = goog.nullFunction; /** * @param {ol.MapBrowserEvent} mapBrowserEvent Event. * @protected + * @return {boolean} Capture dragging. */ -ol.interaction.Drag.prototype.handleDragEnd = goog.nullFunction; +ol.interaction.Drag.prototype.handleDragStart = goog.functions.FALSE; /** diff --git a/src/ol/interaction/interaction.js b/src/ol/interaction/interaction.js index 30532e870e..b148a63e82 100644 --- a/src/ol/interaction/interaction.js +++ b/src/ol/interaction/interaction.js @@ -22,12 +22,6 @@ ol.Interaction = function(constraints) { }; -/** - * @param {ol.MapBrowserEvent} mapBrowserEvent Map browser event. - */ -ol.Interaction.prototype.handleMapBrowserEvent = goog.abstractMethod; - - /** * @param {ol.Map} map Map. * @param {ol.Extent} extent Extent. @@ -44,6 +38,12 @@ ol.Interaction.prototype.fitExtent = function(map, extent) { }; +/** + * @param {ol.MapBrowserEvent} mapBrowserEvent Map browser event. + */ +ol.Interaction.prototype.handleMapBrowserEvent = goog.abstractMethod; + + /** * @param {ol.Map} map Map. * @param {ol.Coordinate} delta Delta. diff --git a/src/ol/tile/tileurlfunction.js b/src/ol/tile/tileurlfunction.js index 03a3c32561..d61cf898e2 100644 --- a/src/ol/tile/tileurlfunction.js +++ b/src/ol/tile/tileurlfunction.js @@ -41,6 +41,16 @@ ol.TileUrlFunction.createFromTemplate = function(template) { }; +/** + * @param {Array.} templates Templates. + * @return {ol.TileUrlFunctionType} Tile URL function. + */ +ol.TileUrlFunction.createFromTemplates = function(templates) { + return ol.TileUrlFunction.createFromTileUrlFunctions( + goog.array.map(templates, ol.TileUrlFunction.createFromTemplate)); +}; + + /** * @param {Array.} tileUrlFunctions Tile URL Functions. * @return {ol.TileUrlFunctionType} Tile URL function. @@ -57,16 +67,6 @@ ol.TileUrlFunction.createFromTileUrlFunctions = function(tileUrlFunctions) { }; -/** - * @param {Array.} templates Templates. - * @return {ol.TileUrlFunctionType} Tile URL function. - */ -ol.TileUrlFunction.createFromTemplates = function(templates) { - return ol.TileUrlFunction.createFromTileUrlFunctions( - goog.array.map(templates, ol.TileUrlFunction.createFromTemplate)); -}; - - /** * @param {ol.TileCoord} tileCoord Tile coordinate. * @return {string|undefined} Tile URL. diff --git a/src/ol/webgl/layerrenderer.js b/src/ol/webgl/layerrenderer.js index 59ca120d7a..9e0f70a9ac 100644 --- a/src/ol/webgl/layerrenderer.js +++ b/src/ol/webgl/layerrenderer.js @@ -26,12 +26,6 @@ ol.webgl.LayerRenderer.prototype.dispatchChangeEvent = function() { }; -/** - * @return {WebGLTexture} Texture. - */ -ol.webgl.LayerRenderer.prototype.getTexture = goog.abstractMethod; - - /** * @override * @return {ol.MapRenderer} MapRenderer. @@ -47,6 +41,12 @@ ol.webgl.LayerRenderer.prototype.getMapRenderer = function() { ol.webgl.LayerRenderer.prototype.getMatrix = goog.abstractMethod; +/** + * @return {WebGLTexture} Texture. + */ +ol.webgl.LayerRenderer.prototype.getTexture = goog.abstractMethod; + + /** * @inheritDoc */ diff --git a/src/ol/webgl/maprenderer.js b/src/ol/webgl/maprenderer.js index a923626336..d2b5055e67 100644 --- a/src/ol/webgl/maprenderer.js +++ b/src/ol/webgl/maprenderer.js @@ -514,6 +514,31 @@ ol.webgl.MapRenderer.prototype.isImageTextureLoaded = function(image) { }; +/** + * @inheritDoc + */ +ol.webgl.MapRenderer.prototype.removeLayer = function(layer) { + goog.base(this, 'removeLayer', layer); + if (layer.getVisible()) { + this.render(); + } +}; + + +/** + * @inheritDoc + */ +ol.webgl.MapRenderer.prototype.removeLayerRenderer = function(layer) { + var layerRenderer = goog.base(this, 'removeLayerRenderer', layer); + if (!goog.isNull(layerRenderer)) { + var layerKey = goog.getUid(layer); + goog.events.unlistenByKey(this.layerRendererChangeListenKeys_[layerKey]); + delete this.layerRendererChangeListenKeys_[layerKey]; + } + return layerRenderer; +}; + + /** * @inheritDoc */ @@ -592,31 +617,6 @@ ol.webgl.MapRenderer.prototype.render = function() { }; -/** - * @inheritDoc - */ -ol.webgl.MapRenderer.prototype.removeLayer = function(layer) { - goog.base(this, 'removeLayer', layer); - if (layer.getVisible()) { - this.render(); - } -}; - - -/** - * @inheritDoc - */ -ol.webgl.MapRenderer.prototype.removeLayerRenderer = function(layer) { - var layerRenderer = goog.base(this, 'removeLayerRenderer', layer); - if (!goog.isNull(layerRenderer)) { - var layerKey = goog.getUid(layer); - goog.events.unlistenByKey(this.layerRendererChangeListenKeys_[layerKey]); - delete this.layerRendererChangeListenKeys_[layerKey]; - } - return layerRenderer; -}; - - /** * @inheritDoc */ diff --git a/src/ol/webgl/tilelayerrenderer.js b/src/ol/webgl/tilelayerrenderer.js index de57ee598b..c193d38238 100644 --- a/src/ol/webgl/tilelayerrenderer.js +++ b/src/ol/webgl/tilelayerrenderer.js @@ -145,21 +145,6 @@ ol.webgl.TileLayerRenderer = function(mapRenderer, tileLayer) { goog.inherits(ol.webgl.TileLayerRenderer, ol.webgl.LayerRenderer); -/** - * @protected - */ -ol.webgl.TileLayerRenderer.prototype.disposeInternal = function() { - var mapRenderer = this.getMapRenderer(); - var gl = mapRenderer.getGL(); - if (!gl.isContextLost()) { - gl.deleteBuffer(this.arrayBuffer_); - gl.deleteFramebuffer(this.framebuffer_); - gl.deleteTexture(this.texture_); - } - goog.base(this, 'disposeInternal'); -}; - - /** * @param {number} framebufferDimension Framebuffer dimension. * @private @@ -202,6 +187,21 @@ ol.webgl.TileLayerRenderer.prototype.bindFramebuffer_ = }; +/** + * @protected + */ +ol.webgl.TileLayerRenderer.prototype.disposeInternal = function() { + var mapRenderer = this.getMapRenderer(); + var gl = mapRenderer.getGL(); + if (!gl.isContextLost()) { + gl.deleteBuffer(this.arrayBuffer_); + gl.deleteFramebuffer(this.framebuffer_); + gl.deleteTexture(this.texture_); + } + goog.base(this, 'disposeInternal'); +}; + + /** * @return {ol.TileLayer} Layer. * @override From 5a9fe22e8c7cd19eb0e7071fb40f9ce5f7792da8 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Thu, 16 Aug 2012 18:26:59 +0200 Subject: [PATCH 522/562] Avoid calling render() too early --- src/ol/webgl/maprenderer.js | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/ol/webgl/maprenderer.js b/src/ol/webgl/maprenderer.js index d2b5055e67..815b617205 100644 --- a/src/ol/webgl/maprenderer.js +++ b/src/ol/webgl/maprenderer.js @@ -232,7 +232,7 @@ ol.webgl.MapRenderer = function(target, map) { */ this.layerRendererChangeListenKeys_ = {}; - this.handleWebGLContextRestored(); + this.initializeGL_(); }; goog.inherits(ol.webgl.MapRenderer, ol.MapRenderer); @@ -495,13 +495,21 @@ ol.webgl.MapRenderer.prototype.handleWebGLContextRestored = function() { if (goog.DEBUG) { ol.webgl.map.logger.info('WebGLContextRestored'); } + this.initializeGL_(); + this.getMap().render(); +}; + + +/** + * @private + */ +ol.webgl.MapRenderer.prototype.initializeGL_ = function() { var gl = this.gl_; gl.activeTexture(goog.webgl.TEXTURE0); gl.blendFunc(goog.webgl.SRC_ALPHA, goog.webgl.ONE_MINUS_SRC_ALPHA); gl.disable(goog.webgl.CULL_FACE); gl.disable(goog.webgl.DEPTH_TEST); gl.disable(goog.webgl.SCISSOR_TEST); - this.render(); }; From 69cd2df009bf11bc156a9460af52f965c1af0628 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Thu, 16 Aug 2012 18:27:26 +0200 Subject: [PATCH 523/562] Trigger render in Map, not MapRenderer --- src/ol/webgl/maprenderer.js | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/ol/webgl/maprenderer.js b/src/ol/webgl/maprenderer.js index 815b617205..8cc7343d4f 100644 --- a/src/ol/webgl/maprenderer.js +++ b/src/ol/webgl/maprenderer.js @@ -244,7 +244,7 @@ goog.inherits(ol.webgl.MapRenderer, ol.MapRenderer); ol.webgl.MapRenderer.prototype.addLayer = function(layer) { goog.base(this, 'addLayer', layer); if (layer.getVisible()) { - this.render(); + this.getMap().render(); } }; @@ -409,7 +409,7 @@ ol.webgl.MapRenderer.prototype.handleBackgroundColorChanged = function() { backgroundColor.g / 255, backgroundColor.b / 255, backgroundColor.a / 255); - this.render(); + this.getMap().render(); }; @@ -418,7 +418,7 @@ ol.webgl.MapRenderer.prototype.handleBackgroundColorChanged = function() { */ ol.webgl.MapRenderer.prototype.handleCenterChanged = function() { goog.base(this, 'handleCenterChanged'); - this.render(); + this.getMap().render(); }; @@ -427,7 +427,7 @@ ol.webgl.MapRenderer.prototype.handleCenterChanged = function() { * @protected */ ol.webgl.MapRenderer.prototype.handleLayerRendererChange = function(event) { - this.render(); + this.getMap().render(); }; @@ -436,7 +436,7 @@ ol.webgl.MapRenderer.prototype.handleLayerRendererChange = function(event) { */ ol.webgl.MapRenderer.prototype.handleResolutionChanged = function() { goog.base(this, 'handleResolutionChanged'); - this.render(); + this.getMap().render(); }; @@ -445,7 +445,7 @@ ol.webgl.MapRenderer.prototype.handleResolutionChanged = function() { */ ol.webgl.MapRenderer.prototype.handleRotationChanged = function() { goog.base(this, 'handleRotationChanged'); - this.render(); + this.getMap().render(); }; @@ -463,7 +463,7 @@ ol.webgl.MapRenderer.prototype.handleSizeChanged = function() { var gl = this.gl_; if (!goog.isNull(gl)) { gl.viewport(0, 0, size.width, size.height); - this.render(); + this.getMap().render(); } }; @@ -528,7 +528,7 @@ ol.webgl.MapRenderer.prototype.isImageTextureLoaded = function(image) { ol.webgl.MapRenderer.prototype.removeLayer = function(layer) { goog.base(this, 'removeLayer', layer); if (layer.getVisible()) { - this.render(); + this.getMap().render(); } }; From a30b2f17957c891e130fd8d70a3e59370e058da9 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Thu, 16 Aug 2012 21:43:23 +0200 Subject: [PATCH 524/562] Move ol.Object.createFromObject to its proper home as a simplified API function --- src/api/api.js | 24 ++++++++++++++++++++++++ src/api/object_test.js | 19 +++++++++++++++++++ src/ol/base/object.js | 15 --------------- src/ol/base/object_test.js | 15 --------------- 4 files changed, 43 insertions(+), 30 deletions(-) create mode 100644 src/api/object_test.js diff --git a/src/api/api.js b/src/api/api.js index d01d3c23bb..5aebd36da4 100644 --- a/src/api/api.js +++ b/src/api/api.js @@ -5,6 +5,7 @@ goog.require('goog.dom'); goog.require('ol.Coordinate'); goog.require('ol.Layer'); goog.require('ol.Map'); +goog.require('ol.Object'); goog.require('ol.Projection'); goog.require('ol.createMap'); goog.require('ol.layer.OpenStreetMap'); @@ -35,6 +36,12 @@ ol3.Layers; ol3.MapOptions; +/** + * @typedef {Object|ol.Object} + */ +ol3.Object; + + /** * @typedef {ol.Projection|string} */ @@ -125,6 +132,23 @@ ol3.map = function(opt_mapOptions) { goog.exportProperty(ol3, 'map', ol3.map); +/** + * @param {ol3.Object} object Object. + * @return {ol.Object} Object. + */ +ol3.object = function(object) { + if (object instanceof ol.Object) { + return object; + } else if (goog.isObject(object)) { + var values = /** @type {Object} */ object; + return new ol.Object(values); + } else { + return null; + } +}; +goog.exportProperty(ol3, 'object', ol3.object); + + /** * @param {ol3.Projection} projection Projection. * @return {ol.Projection} Projection. diff --git a/src/api/object_test.js b/src/api/object_test.js new file mode 100644 index 0000000000..8df738f8d5 --- /dev/null +++ b/src/api/object_test.js @@ -0,0 +1,19 @@ +goog.require('goog.testing.jsunit'); +goog.require('ol.Object'); +goog.require('ol3'); + + +function testObject1() { + var obj = {k: 1}; + obj = ol3.object(obj); + assertTrue(obj instanceof ol.Object); + assertEquals(1, obj.get('k')); +} + + +function testObject2() { + var obj1 = new ol.Object(); + var obj2 = ol3.object(obj1); + assertTrue(obj2 === obj1); +} + diff --git a/src/ol/base/object.js b/src/ol/base/object.js index 2d67333247..52674edb18 100644 --- a/src/ol/base/object.js +++ b/src/ol/base/object.js @@ -67,21 +67,6 @@ ol.Object.capitalize = function(str) { }; -/** - * @param {ol.Object|Object} arg Argument. - * @return {ol.Object} Object. - */ -ol.Object.create = function(arg) { - if (arg instanceof ol.Object) { - return arg; - } else { - var object = new ol.Object(); - object.setOptions(arg); - return object; - } -}; - - /** * @param {ol.Object} obj Object. * @return {Object.} Accessors. diff --git a/src/ol/base/object_test.js b/src/ol/base/object_test.js index e93185f08d..03412f462f 100644 --- a/src/ol/base/object_test.js +++ b/src/ol/base/object_test.js @@ -367,21 +367,6 @@ function testBindSelf() { } -function testCreateFromObject() { - var obj = {k: 1}; - obj = ol.Object.create(obj); - assertTrue(obj instanceof ol.Object); - assertEquals(1, obj.get('k')); -} - - -function testCreateFromObject() { - var obj1 = new ol.Object(); - var obj2 = ol.Object.create(obj1); - assertTrue(obj2 === obj1); -} - - function testCreateWithOptions() { var obj = new ol.Object({k: 1}); assertEquals(1, obj.get('k')); From b8edf651e971319e2f1bae92152bd35d9bf282bd Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Thu, 16 Aug 2012 21:47:12 +0200 Subject: [PATCH 525/562] Move ol.Collection.create to ol3.collection --- src/api/api.js | 50 ++++++++++++++++++---------------- src/api/collection_test.js | 22 +++++++++++++++ src/ol/base/collection.js | 13 --------- src/ol/base/collection_test.js | 28 ++++--------------- 4 files changed, 53 insertions(+), 60 deletions(-) create mode 100644 src/api/collection_test.js diff --git a/src/api/api.js b/src/api/api.js index 5aebd36da4..2fce523118 100644 --- a/src/api/api.js +++ b/src/api/api.js @@ -2,6 +2,7 @@ goog.provide('ol3'); goog.provide('ol3.layer'); goog.require('goog.dom'); +goog.require('ol.Collection'); goog.require('ol.Coordinate'); goog.require('ol.Layer'); goog.require('ol.Map'); @@ -14,21 +15,21 @@ goog.require('ol.layer.OpenStreetMap'); goog.exportSymbol('ol3', ol3); +/** + * @typedef {Array|ol.Collection} + */ +ol3.Collection; + + /** * @typedef {Array.|ol.Coordinate|{x: number, y: number}} */ ol3.Coordinate; -/** - * @typedef {Array.|ol.Collection} - */ -ol3.Layers; - - /** * @typedef {{center: (ol3.Coordinate|undefined), - * layers: (ol3.Layers|undefined), + * layers: (ol3.Collection|undefined), * renderTo: (Element|string|undefined), * resolution: (number|undefined), * zoom: (number|undefined)}} @@ -48,6 +49,23 @@ ol3.Object; ol3.Projection; +/** + * @param {ol3.Collection} collection Collection. + * @return {ol.Collection} Collection. + */ +ol3.collection = function(collection) { + if (collection instanceof ol.Collection) { + return collection; + } else if (goog.isArray(collection)) { + var array = /** @type {Array} */ collection; + return new ol.Collection(collection); + } else { + return null; + } +}; +goog.exportProperty(ol3, 'collection', ol3.collection); + + /** * @param {ol3.Coordinate} coordinate Coordinate. * @return {ol.Coordinate} Coordinate. @@ -80,22 +98,6 @@ ol3.layer.osm = function() { goog.exportProperty(ol3.layer, 'osm', ol3.layer.osm); -/** - * @param {ol3.Layers} layers Layers. - * @return {ol.Collection} Layers. - */ -ol3.layers = function(layers) { - if (layers instanceof ol.Collection) { - return layers; - } else if (goog.isArray(layers)) { - return new ol.Collection(layers); - } else { - return null; - } -}; -goog.exportProperty(ol3, 'layers', ol3.layers); - - /** * @param {ol3.MapOptions=} opt_mapOptions Options. * @return {ol.Map} Map. @@ -104,7 +106,7 @@ ol3.map = function(opt_mapOptions) { var options = opt_mapOptions || {}; var center = ol3.coordinate(/** @type {ol3.Coordinate} */ (goog.object.get(options, 'center', null))); - var layers = ol3.layers(/** @type {ol3.Layers} */ + var layers = ol3.collection(/** @type {ol3.Collection} */ (goog.object.get(options, 'layers', null))); var projection = ol3.projection(/** @type {ol3.Projection} */ (goog.object.get(options, 'projection', 'EPSG:3857'))); diff --git a/src/api/collection_test.js b/src/api/collection_test.js new file mode 100644 index 0000000000..cb4a7fa2c0 --- /dev/null +++ b/src/api/collection_test.js @@ -0,0 +1,22 @@ +goog.require('goog.testing.jsunit'); +goog.require('ol.Collection'); +goog.require('ol3'); + + +function testCreateFromArray() { + var array = [0, 1, 2]; + var collection = ol3.collection(array); + assertTrue(collection instanceof ol.Collection); + assertEquals(3, collection.getLength()); + assertEquals(0, collection.getAt(0)); + assertEquals(1, collection.getAt(1)); + assertEquals(2, collection.getAt(2)); +} + + +function testCreateFromCollection() { + var collection1 = new ol.Collection(); + var collection2 = ol3.collection(collection1); + assertTrue(collection1 === collection2); +} + diff --git a/src/ol/base/collection.js b/src/ol/base/collection.js index bec2f650c3..734900c2d4 100644 --- a/src/ol/base/collection.js +++ b/src/ol/base/collection.js @@ -90,19 +90,6 @@ ol.Collection = function(opt_array) { goog.inherits(ol.Collection, ol.Object); -/** - * @param {ol.Collection|Array} arg Argument. - * @return {ol.Collection} Collection. - */ -ol.Collection.create = function(arg) { - if (arg instanceof ol.Collection) { - return arg; - } else { - return new ol.Collection(arg); - } -}; - - /** */ ol.Collection.prototype.clear = function() { diff --git a/src/ol/base/collection_test.js b/src/ol/base/collection_test.js index 020cbdfa7d..ebc853c733 100644 --- a/src/ol/base/collection_test.js +++ b/src/ol/base/collection_test.js @@ -143,26 +143,8 @@ function testSetAtBeyondEnd() { } -function testCreateFromArray() { - var array = [0, 1, 2]; - var collection = ol.Collection.create(array); - assertTrue(collection instanceof ol.Collection); - assertEquals(3, collection.getLength()); - assertEquals(0, collection.getAt(0)); - assertEquals(1, collection.getAt(1)); - assertEquals(2, collection.getAt(2)); -} - - -function testCreateFromCollection() { - var collection1 = new ol.Collection(); - var collection2 = ol.Collection.create(collection1); - assertTrue(collection1 === collection2); -} - - function testLengthChangeInsertAt() { - var collection = ol.Collection.create([0, 1, 2]); + var collection = new ol.Collection([0, 1, 2]); var lengthEventDispatched; goog.events.listen(collection, 'length_changed', function() { lengthEventDispatched = true; @@ -173,7 +155,7 @@ function testLengthChangeInsertAt() { function testLengthChangeRemoveAt() { - var collection = ol.Collection.create([0, 1, 2]); + var collection = new ol.Collection([0, 1, 2]); var lengthEventDispatched; goog.events.listen(collection, 'length_changed', function() { lengthEventDispatched = true; @@ -184,7 +166,7 @@ function testLengthChangeRemoveAt() { function testLengthChangeSetAt() { - var collection = ol.Collection.create([0, 1, 2]); + var collection = new ol.Collection([0, 1, 2]); var lengthEventDispatched; goog.events.listen(collection, 'length_changed', function() { lengthEventDispatched = true; @@ -195,7 +177,7 @@ function testLengthChangeSetAt() { function testForEach() { - var collection = ol.Collection.create([1, 2, 4]); + var collection = new ol.Collection([1, 2, 4]); var sum = 0; collection.forEach(function(elem) { sum += elem; @@ -205,7 +187,7 @@ function testForEach() { function testForEachScope() { - var collection = ol.Collection.create([0]); + var collection = new ol.Collection([0]); var that; var uniqueObj = {}; collection.forEach(function(elem) { From a49ea9bbed411918ecc8e35d75dad31832caeabc Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Thu, 16 Aug 2012 23:18:27 +0200 Subject: [PATCH 526/562] Enable finest logging in debug mode --- src/ol/base/ol.js | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 src/ol/base/ol.js diff --git a/src/ol/base/ol.js b/src/ol/base/ol.js new file mode 100644 index 0000000000..14a0e3d7b2 --- /dev/null +++ b/src/ol/base/ol.js @@ -0,0 +1,9 @@ +goog.provide('ol'); + +goog.require('goog.debug.Logger'); + + +if (goog.DEBUG) { + var logger = goog.debug.Logger.getLogger('ol'); + logger.setLevel(goog.debug.Logger.Level.FINEST); +} From 9b17d28b2bff90edc4023aa5a0697eebfe54e22e Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Thu, 16 Aug 2012 23:29:53 +0200 Subject: [PATCH 527/562] Add ol.webgl.tilelayerrenderer.logger --- demos/side-by-side/side-by-side.js | 7 +++++++ src/ol/webgl/tilelayerrenderer.js | 7 +++++++ 2 files changed, 14 insertions(+) diff --git a/demos/side-by-side/side-by-side.js b/demos/side-by-side/side-by-side.js index 15643b8f55..f54de6610a 100644 --- a/demos/side-by-side/side-by-side.js +++ b/demos/side-by-side/side-by-side.js @@ -1,3 +1,4 @@ +goog.require('goog.debug.Console'); goog.require('ol.CoordinateFormat'); goog.require('ol.RendererHint'); goog.require('ol.control.Attribution'); @@ -7,6 +8,12 @@ goog.require('ol.interaction.Keyboard'); goog.require('ol.layer.MapQuestOpenAerial'); +if (goog.DEBUG) { + goog.debug.Console.autoInstall(); +} + + + var layer = new ol.layer.MapQuestOpenAerial(); var layers = new ol.Collection(); diff --git a/src/ol/webgl/tilelayerrenderer.js b/src/ol/webgl/tilelayerrenderer.js index c193d38238..dd113bc72a 100644 --- a/src/ol/webgl/tilelayerrenderer.js +++ b/src/ol/webgl/tilelayerrenderer.js @@ -3,6 +3,7 @@ // FIXME defer texture uploads and delete* calls goog.provide('ol.webgl.TileLayerRenderer'); +goog.provide('ol.webgl.tilelayerrenderer'); goog.provide('ol.webgl.tilelayerrenderer.shader.Fragment'); goog.provide('ol.webgl.tilelayerrenderer.shader.Vertex'); @@ -22,6 +23,12 @@ goog.require('ol.webgl.shader.Fragment'); goog.require('ol.webgl.shader.Vertex'); +if (goog.DEBUG) { + ol.webgl.tilelayerrenderer.logger = + goog.debug.Logger.getLogger('ol.webgl.tilelayerrenderer'); +} + + /** * @constructor From 867b36410b73b7de88b940d56f594d234965168a Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Thu, 16 Aug 2012 23:26:44 +0200 Subject: [PATCH 528/562] Add Map postrender event --- src/ol/base/map.js | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/ol/base/map.js b/src/ol/base/map.js index 26e1febc0e..f271877945 100644 --- a/src/ol/base/map.js +++ b/src/ol/base/map.js @@ -2,9 +2,9 @@ // FIXME recheck layer/map projection compatability when projection changes // FIXME layer renderers should skip when they can't reproject // FIXME add tilt and height? -// FIXME add postrender event goog.provide('ol.Map'); +goog.provide('ol.MapEventType'); goog.provide('ol.MapProperty'); goog.require('goog.array'); @@ -40,6 +40,14 @@ goog.require('ol.Size'); goog.require('ol.TransformFunction'); +/** + * @enum {string} + */ +ol.MapEventType = { + POST_RENDER: 'postrender' +}; + + /** * @enum {string} */ From ee59e877e0232b799a6f392972ccfce105f74a61 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Thu, 16 Aug 2012 23:27:39 +0200 Subject: [PATCH 529/562] Refactor animation logic --- src/ol/base/map.js | 117 +++++++++++++++++++++++---------------------- 1 file changed, 61 insertions(+), 56 deletions(-) diff --git a/src/ol/base/map.js b/src/ol/base/map.js index f271877945..1ee8f668a2 100644 --- a/src/ol/base/map.js +++ b/src/ol/base/map.js @@ -76,6 +76,7 @@ ol.MapPaneZIndex = { /** * @constructor * @extends {ol.Object} + * @implements {goog.fx.anim.Animated} * @param {Element} target Target. * @param {function(new: ol.MapRenderer, Element, ol.Map)} rendererConstructor * Renderer constructor. @@ -104,13 +105,13 @@ ol.Map = function( * @private * @type {boolean} */ - this.animating_ = false; + this.animatedRenderer_ = false; /** * @private - * @type {boolean} + * @type {number} */ - this.dirty_ = false; + this.animatingCount_ = 0; /** * @private @@ -118,6 +119,12 @@ ol.Map = function( */ this.freezeRenderingCount_ = 0; + /** + * @private + * @type {boolean} + */ + this.dirty_ = false; + /** * @private * @type {Element} @@ -163,12 +170,6 @@ ol.Map = function( this.renderer_ = new rendererConstructor(target, this); this.registerDisposable(this.renderer_); - /** - * @private - * @type {ol.MapAnimation} - */ - this.animation_ = new ol.MapAnimation(this.renderer_); - /** * @private * @type {Element} @@ -203,16 +204,6 @@ ol.Map = function( goog.inherits(ol.Map, ol.Object); -/** - * @private - */ -ol.Map.prototype.animate_ = function() { - goog.asserts.assert(!this.animating_); - goog.fx.anim.registerAnimation(this.animation_); - this.animating_ = true; -}; - - /** * @return {boolean} Can rotate. */ @@ -537,6 +528,14 @@ ol.Map.prototype.isDef = function() { }; +/** + * @inheritDoc + */ +ol.Map.prototype.onAnimationFrame = function() { + this.renderFrame_(); +}; + + /** * @private */ @@ -559,11 +558,9 @@ ol.Map.prototype.recalculateTransforms_ = function() { /** */ ol.Map.prototype.render = function() { - if (!this.animating_) { + if (this.animatingCount_ < 1) { if (this.freezeRenderingCount_ === 0) { - if (this.renderer_.render()) { - this.animate_(); - } + this.renderFrame_(); } else { this.dirty_ = true; } @@ -571,6 +568,24 @@ ol.Map.prototype.render = function() { }; +/** + * @private + */ +ol.Map.prototype.renderFrame_ = function() { + var animatedRenderer = this.renderer_.render(); + this.dirty_ = false; + if (animatedRenderer != this.animatedRenderer_) { + if (animatedRenderer) { + this.startAnimating(); + } else { + this.stopAnimating(); + } + this.animatedRenderer_ = animatedRenderer; + } + this.dispatchEvent(ol.MapEventType.POST_RENDER); +}; + + /** * @param {ol.Color} backgroundColor Background color. */ @@ -700,16 +715,33 @@ goog.exportProperty( ol.Map.prototype.setUserProjection); +/** + */ +ol.Map.prototype.startAnimating = function() { + if (++this.animatingCount_ == 1) { + goog.fx.anim.registerAnimation(this); + } +}; + + +/** + */ +ol.Map.prototype.stopAnimating = function() { + goog.asserts.assert(this.animatingCount_ > 0); + if (--this.animatingCount_ === 0) { + goog.fx.anim.unregisterAnimation(this); + } +}; + + /** */ ol.Map.prototype.unfreezeRendering = function() { goog.asserts.assert(this.freezeRenderingCount_ > 0); - if (--this.freezeRenderingCount_ === 0) { - if (!this.animating_ && this.dirty_) { - if (this.renderer_.render()) { - this.animate_(); - } - } + if (--this.freezeRenderingCount_ === 0 && + this.animatingCount_ < 1 && + this.dirty_) { + this.renderFrame_(); } }; @@ -727,30 +759,3 @@ ol.Map.prototype.withFrozenRendering = function(f, opt_obj) { this.unfreezeRendering(); } }; - - - -/** - * @constructor - * @implements {goog.fx.anim.Animated} - * @param {!ol.MapRenderer} renderer Map renderer. - */ -ol.MapAnimation = function(renderer) { - - /** - * @private - * @type {ol.MapRenderer} - */ - this.renderer_ = renderer; - -}; - - -/** - * @inheritDoc - */ -ol.MapAnimation.prototype.onAnimationFrame = function() { - if (!this.renderer_.render()) { - goog.fx.anim.unregisterAnimation(this); - } -}; From 5df59d047d4cd60875d9f2b6b1cdb1f0ddb0058f Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Thu, 16 Aug 2012 23:30:28 +0200 Subject: [PATCH 530/562] Add gl.webgl.FREE_RESOURCES_IMMEDIATELY @define --- src/ol/webgl/webgl.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/ol/webgl/webgl.js b/src/ol/webgl/webgl.js index 0be6508785..fa4a04bc24 100644 --- a/src/ol/webgl/webgl.js +++ b/src/ol/webgl/webgl.js @@ -2,6 +2,12 @@ goog.provide('ol.webgl'); goog.provide('ol.webgl.WebGLContextEventType'); +/** + * @define {boolean} Free resources immediately. + */ +ol.webgl.FREE_RESOURCES_IMMEDIATELY = false; + + /** * @enum {string} */ From f4e04043368f0f3f20da7de04270a066f7697ca1 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Thu, 16 Aug 2012 23:31:43 +0200 Subject: [PATCH 531/562] Defer WebGL resource deletion to post-frame --- src/ol/webgl/tilelayerrenderer.js | 30 +++++++++++++++++++++++++++--- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/src/ol/webgl/tilelayerrenderer.js b/src/ol/webgl/tilelayerrenderer.js index dd113bc72a..8ea2b577af 100644 --- a/src/ol/webgl/tilelayerrenderer.js +++ b/src/ol/webgl/tilelayerrenderer.js @@ -1,6 +1,6 @@ // FIXME large resolutions lead to too large framebuffers :-( // FIXME animated shaders! check in redraw -// FIXME defer texture uploads and delete* calls +// FIXME defer texture uploads goog.provide('ol.webgl.TileLayerRenderer'); goog.provide('ol.webgl.tilelayerrenderer'); @@ -9,12 +9,14 @@ goog.provide('ol.webgl.tilelayerrenderer.shader.Vertex'); goog.require('goog.array'); goog.require('goog.asserts'); +goog.require('goog.debug.Logger'); goog.require('goog.events.EventType'); goog.require('goog.object'); goog.require('goog.vec.Mat4'); goog.require('goog.vec.Vec4'); goog.require('goog.webgl'); goog.require('ol.Coordinate'); +goog.require('ol.MapEventType'); goog.require('ol.Size'); goog.require('ol.TileLayer'); goog.require('ol.TileState'); @@ -165,8 +167,30 @@ ol.webgl.TileLayerRenderer.prototype.bindFramebuffer_ = if (!goog.isDef(this.framebufferDimension_) || this.framebufferDimension_ != framebufferDimension) { - gl.deleteFramebuffer(this.framebuffer_); - gl.deleteTexture(this.texture_); + if (goog.DEBUG) { + ol.webgl.tilelayerrenderer.logger.info('re-sizing framebuffer'); + } + + if (ol.webgl.FREE_RESOURCES_IMMEDIATELY) { + if (goog.DEBUG) { + ol.webgl.tilelayerrenderer.logger.info('freeing WebGL resources'); + } + gl.deleteFramebuffer(this.framebuffer_); + gl.deleteTexture(this.texture_); + } else { + var map = this.getMap(); + goog.events.listenOnce( + map, + ol.MapEventType.POST_RENDER, + goog.partial(function(gl, framebuffer, texture) { + if (goog.DEBUG) { + ol.webgl.tilelayerrenderer.logger.info( + 'freeing WebGL resources on postrender'); + } + gl.deleteFramebuffer(framebuffer); + gl.deleteTexture(texture); + }, gl, this.framebuffer_, this.texture_)); + } var texture = gl.createTexture(); gl.bindTexture(goog.webgl.TEXTURE_2D, texture); From bb8b1043d985dca70bb13d347cfc27d417ff71b6 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Thu, 16 Aug 2012 23:51:55 +0200 Subject: [PATCH 532/562] Add missing type declaration --- src/ol/webgl/tilelayerrenderer.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/ol/webgl/tilelayerrenderer.js b/src/ol/webgl/tilelayerrenderer.js index 8ea2b577af..717a3901bd 100644 --- a/src/ol/webgl/tilelayerrenderer.js +++ b/src/ol/webgl/tilelayerrenderer.js @@ -26,6 +26,9 @@ goog.require('ol.webgl.shader.Vertex'); if (goog.DEBUG) { + /** + * @type {goog.debug.Logger} + */ ol.webgl.tilelayerrenderer.logger = goog.debug.Logger.getLogger('ol.webgl.tilelayerrenderer'); } From 5096964ec2f6f63122ea6162ea6df245eb8388e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Lemoine?= Date: Fri, 17 Aug 2012 22:07:54 +0200 Subject: [PATCH 533/562] use setExtent to set extent of TileJSON tile store --- src/ol/tile/tilejson.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/ol/tile/tilejson.js b/src/ol/tile/tilejson.js index 1b6a17ea1f..a30e12254f 100644 --- a/src/ol/tile/tilejson.js +++ b/src/ol/tile/tilejson.js @@ -110,8 +110,9 @@ ol.tilestore.TileJSON.prototype.handleTileJSONResponse = function() { var bounds = tileJSON.bounds; epsg4326Extent = new ol.Extent( bounds[0], bounds[1], bounds[2], bounds[3]); - this.extent = epsg4326Extent.transform( + var transformedExtent = epsg4326Extent.transform( ol.Projection.getTransform(epsg4326Projection, this.getProjection())); + this.setExtent(transformedExtent); } else { epsg4326Extent = null; } From 189b43ad4a7b429e8713597ead303d8ecb110d9a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Lemoine?= Date: Fri, 17 Aug 2012 22:17:06 +0200 Subject: [PATCH 534/562] two-layers example - do not add layers twice --- demos/two-layers/two-layers.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/demos/two-layers/two-layers.js b/demos/two-layers/two-layers.js index 5daf7010ba..6b6b2a39c2 100644 --- a/demos/two-layers/two-layers.js +++ b/demos/two-layers/two-layers.js @@ -36,7 +36,7 @@ var domMap; if (ol.TWO_LAYERS_DEMO_ENABLE_DOM) { domMap = ol.createMap( document.getElementById('domMap'), - {'layers': layers}, + {}, ol.RendererHint.DOM); domMap.bindTo('center', webglMap); domMap.bindTo('layers', webglMap); From ca2b6e41891931939c169709c6fa2c5db9fa1ab5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Lemoine?= Date: Mon, 20 Aug 2012 21:41:44 +0200 Subject: [PATCH 535/562] map has a viewport --- src/ol/base/map.js | 40 +++++++++++++++++++++++++++------------- 1 file changed, 27 insertions(+), 13 deletions(-) diff --git a/src/ol/base/map.js b/src/ol/base/map.js index 1ee8f668a2..d526932743 100644 --- a/src/ol/base/map.js +++ b/src/ol/base/map.js @@ -68,7 +68,7 @@ ol.MapProperty = { * @enum {number} */ ol.MapPaneZIndex = { - EVENTS: 1000 + VIEWPORT: 1000 }; @@ -129,16 +129,22 @@ ol.Map = function( * @private * @type {Element} */ - this.eventsPane_ = goog.dom.createElement(goog.dom.TagName.DIV); - this.eventsPane_.className = 'ol-pane-events'; - this.eventsPane_.style.position = 'absolute'; - // FIXME why can't we use width and height 100% here? - this.eventsPane_.style.width = target.clientWidth + 'px'; - this.eventsPane_.style.height = target.clientHeight + 'px'; - this.eventsPane_.style.zIndex = ol.MapPaneZIndex.EVENTS; - goog.dom.appendChild(target, this.eventsPane_); + this.container_ = container; - goog.events.listen(this.eventsPane_, [ + /** + * @private + * @type {Element} + */ + this.viewport_ = goog.dom.createElement(goog.dom.TagName.DIV); + this.viewport_.className = 'ol-viewport'; + this.viewport_.style.position = 'relative'; + this.viewport_.style.overflow = 'hidden'; + this.viewport_.style.width = '100%'; + this.viewport_.style.height = '100%'; + this.viewport_.style.zIndex = ol.MapPaneZIndex.VIEWPORT; + goog.dom.appendChild(target, this.viewport_); + + goog.events.listen(this.viewport_, [ goog.events.EventType.DBLCLICK ], this.handleBrowserEvent, false, this); @@ -148,13 +154,13 @@ ol.Map = function( this.handleBrowserEvent, false, this); this.registerDisposable(keyHandler); - var mouseWheelHandler = new goog.events.MouseWheelHandler(this.eventsPane_); + var mouseWheelHandler = new goog.events.MouseWheelHandler(this.viewport_); goog.events.listen(mouseWheelHandler, goog.events.MouseWheelHandler.EventType.MOUSEWHEEL, this.handleBrowserEvent, false, this); this.registerDisposable(mouseWheelHandler); - var dragger = new goog.fx.Dragger(this.eventsPane_); + var dragger = new goog.fx.Dragger(this.viewport_); dragger.defaultAction = function() {}; goog.events.listen(dragger, [ goog.fx.Dragger.EventType.START, @@ -167,7 +173,7 @@ ol.Map = function( * @type {ol.MapRenderer} * @private */ - this.renderer_ = new rendererConstructor(target, this); + this.renderer_ = new rendererConstructor(this.viewport_, this); this.registerDisposable(this.renderer_); /** @@ -467,6 +473,14 @@ goog.exportProperty( ol.Map.prototype.getUserProjection); +/** + * @return {Element} Viewport. + */ +ol.Map.prototype.getViewport = function() { + return this.viewport_; +}; + + /** * @param {goog.events.BrowserEvent} browserEvent Browser event. * @param {string=} opt_type Type. From 66d4d199b49dd56d0cd5d5bc1a62948570abe924 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Lemoine?= Date: Mon, 20 Aug 2012 21:44:29 +0200 Subject: [PATCH 536/562] map target is now map container --- src/ol/base/map.js | 31 +++++++++++++------------------ 1 file changed, 13 insertions(+), 18 deletions(-) diff --git a/src/ol/base/map.js b/src/ol/base/map.js index d526932743..e4b9cc0514 100644 --- a/src/ol/base/map.js +++ b/src/ol/base/map.js @@ -77,7 +77,7 @@ ol.MapPaneZIndex = { * @constructor * @extends {ol.Object} * @implements {goog.fx.anim.Animated} - * @param {Element} target Target. + * @param {Element} container Container. * @param {function(new: ol.MapRenderer, Element, ol.Map)} rendererConstructor * Renderer constructor. * @param {Object=} opt_values Values. @@ -85,7 +85,7 @@ ol.MapPaneZIndex = { * Viewport size monitor. */ ol.Map = function( - target, rendererConstructor, opt_values, opt_viewportSizeMonitor) { + container, rendererConstructor, opt_values, opt_viewportSizeMonitor) { goog.base(this); @@ -142,7 +142,7 @@ ol.Map = function( this.viewport_.style.width = '100%'; this.viewport_.style.height = '100%'; this.viewport_.style.zIndex = ol.MapPaneZIndex.VIEWPORT; - goog.dom.appendChild(target, this.viewport_); + goog.dom.appendChild(container, this.viewport_); goog.events.listen(this.viewport_, [ goog.events.EventType.DBLCLICK @@ -176,12 +176,6 @@ ol.Map = function( this.renderer_ = new rendererConstructor(this.viewport_, this); this.registerDisposable(this.renderer_); - /** - * @private - * @type {Element} - */ - this.target_ = target; - /** * @private * @type {goog.dom.ViewportSizeMonitor} @@ -272,6 +266,14 @@ goog.exportProperty( ol.Map.prototype.getCenter); +/** + * @return {Element} Container. + */ +ol.Map.prototype.getContainer = function() { + return this.container_; +}; + + /** * @param {ol.Pixel} pixel Pixel. * @return {ol.Coordinate|undefined} Coordinate. @@ -426,14 +428,6 @@ goog.exportProperty( ol.Map.prototype.getSize); -/** - * @return {Element} Target. - */ -ol.Map.prototype.getTarget = function() { - return this.target_; -}; - - /** * @return {ol.Coordinate|undefined} Center in user projection. */ @@ -527,7 +521,8 @@ ol.Map.prototype.handleUserProjectionChanged = function() { * @protected */ ol.Map.prototype.handleViewportResize = function() { - var size = new ol.Size(this.target_.clientWidth, this.target_.clientHeight); + var size = new ol.Size(this.container_.clientWidth, + this.container_.clientHeight); this.setSize(size); }; From a9706cd84b2590a9b01d68c2bdbd42e07af9e722 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Lemoine?= Date: Mon, 20 Aug 2012 21:44:57 +0200 Subject: [PATCH 537/562] Map.handleViewportResize renamed handleBrowserWindowResize --- src/ol/base/map.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/ol/base/map.js b/src/ol/base/map.js index e4b9cc0514..546debe448 100644 --- a/src/ol/base/map.js +++ b/src/ol/base/map.js @@ -184,7 +184,7 @@ ol.Map = function( opt_viewportSizeMonitor || new goog.dom.ViewportSizeMonitor(); goog.events.listen(this.viewportSizeMonitor_, goog.events.EventType.RESIZE, - this.handleViewportResize, false, this); + this.handleBrowserWindowResize, false, this); goog.events.listen( this, ol.Object.getChangedEventType(ol.MapProperty.PROJECTION), @@ -198,7 +198,7 @@ ol.Map = function( this.setValues(opt_values); } - this.handleViewportResize(); + this.handleBrowserWindowResize(); }; goog.inherits(ol.Map, ol.Object); @@ -520,7 +520,7 @@ ol.Map.prototype.handleUserProjectionChanged = function() { /** * @protected */ -ol.Map.prototype.handleViewportResize = function() { +ol.Map.prototype.handleBrowserWindowResize = function() { var size = new ol.Size(this.container_.clientWidth, this.container_.clientHeight); this.setSize(size); From a6104138110aef0214049bf335199e294271c068 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Lemoine?= Date: Mon, 20 Aug 2012 21:48:30 +0200 Subject: [PATCH 538/562] map renderer target is now map renderer container --- src/ol/base/maprenderer.js | 6 +++--- src/ol/dom/maprenderer.js | 6 +++--- src/ol/webgl/maprenderer.js | 12 ++++++------ 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/ol/base/maprenderer.js b/src/ol/base/maprenderer.js index 06546c5a61..792bbe6179 100644 --- a/src/ol/base/maprenderer.js +++ b/src/ol/base/maprenderer.js @@ -13,10 +13,10 @@ goog.require('ol.MapProperty'); /** * @constructor * @extends {goog.Disposable} - * @param {Element} target Target. + * @param {Element} container Container. * @param {ol.Map} map Map. */ -ol.MapRenderer = function(target, map) { +ol.MapRenderer = function(container, map) { goog.base(this); @@ -24,7 +24,7 @@ ol.MapRenderer = function(target, map) { * @private * @type {Element} */ - this.target_ = target; + this.container_ = container; /** * @protected diff --git a/src/ol/dom/maprenderer.js b/src/ol/dom/maprenderer.js index 2014f10901..c648fdf4c9 100644 --- a/src/ol/dom/maprenderer.js +++ b/src/ol/dom/maprenderer.js @@ -15,12 +15,12 @@ goog.require('ol.dom.TileLayerRenderer'); /** * @constructor * @extends {ol.MapRenderer} - * @param {Element} target Target. + * @param {Element} container Container. * @param {ol.Map} map Map. */ -ol.dom.MapRenderer = function(target, map) { +ol.dom.MapRenderer = function(container, map) { - goog.base(this, target, map); + goog.base(this, container, map); /** * @type {!Element} diff --git a/src/ol/webgl/maprenderer.js b/src/ol/webgl/maprenderer.js index 8cc7343d4f..9b9c24678a 100644 --- a/src/ol/webgl/maprenderer.js +++ b/src/ol/webgl/maprenderer.js @@ -135,22 +135,22 @@ goog.addSingletonGetter(ol.webgl.map.shader.Vertex); /** * @constructor * @extends {ol.MapRenderer} - * @param {Element} target Target. + * @param {Element} container Container. * @param {ol.Map} map Map. */ -ol.webgl.MapRenderer = function(target, map) { +ol.webgl.MapRenderer = function(container, map) { - goog.base(this, target, map); + goog.base(this, container, map); /** * @private * @type {Element} */ this.canvas_ = goog.dom.createElement(goog.dom.TagName.CANVAS); - this.canvas_.height = target.clientHeight; - this.canvas_.width = target.clientWidth; this.canvas_.style.overflow = 'hidden'; - goog.dom.appendChild(target, this.canvas_); + this.canvas_.height = container.clientHeight; + this.canvas_.width = container.clientWidth; + goog.dom.appendChild(container, this.canvas_); /** * @private From 21ae6d1be36438d835cce540c358bebef3f1aab2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Lemoine?= Date: Mon, 20 Aug 2012 21:49:40 +0200 Subject: [PATCH 539/562] DOM map renderer no longer need a viewport --- src/ol/dom/maprenderer.js | 14 +------------- 1 file changed, 1 insertion(+), 13 deletions(-) diff --git a/src/ol/dom/maprenderer.js b/src/ol/dom/maprenderer.js index c648fdf4c9..ec51737a4d 100644 --- a/src/ol/dom/maprenderer.js +++ b/src/ol/dom/maprenderer.js @@ -22,18 +22,6 @@ ol.dom.MapRenderer = function(container, map) { goog.base(this, container, map); - /** - * @type {!Element} - * @private - */ - this.viewport_ = goog.dom.createElement(goog.dom.TagName.DIV); - this.viewport_.className = 'ol-viewport'; - this.viewport_.style.position = 'relative'; - this.viewport_.style.overflow = 'hidden'; - this.viewport_.style.width = '100%'; - this.viewport_.style.height = '100%'; - goog.dom.appendChild(target, this.viewport_); - /** * @type {!Element} * @private @@ -41,7 +29,7 @@ ol.dom.MapRenderer = function(container, map) { this.layersPane_ = goog.dom.createElement(goog.dom.TagName.DIV); this.layersPane_.className = 'ol-layers-pane'; this.layersPane_.style.position = 'absolute'; - goog.dom.appendChild(this.viewport_, this.layersPane_); + goog.dom.appendChild(container, this.layersPane_); /** * @type {Object} From d0572c081ef2e3acef0b0e94047a52cf3ba1946e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Lemoine?= Date: Mon, 20 Aug 2012 21:50:24 +0200 Subject: [PATCH 540/562] webgl canvas element does not need overflow:hidden --- src/ol/webgl/maprenderer.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/ol/webgl/maprenderer.js b/src/ol/webgl/maprenderer.js index 9b9c24678a..a7a76864ee 100644 --- a/src/ol/webgl/maprenderer.js +++ b/src/ol/webgl/maprenderer.js @@ -147,7 +147,6 @@ ol.webgl.MapRenderer = function(container, map) { * @type {Element} */ this.canvas_ = goog.dom.createElement(goog.dom.TagName.CANVAS); - this.canvas_.style.overflow = 'hidden'; this.canvas_.height = container.clientHeight; this.canvas_.width = container.clientWidth; goog.dom.appendChild(container, this.canvas_); From 83994081b50342f6467e6a6f2f217b5379a45ad0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Lemoine?= Date: Mon, 20 Aug 2012 21:51:23 +0200 Subject: [PATCH 541/562] mouseposition listens to mousemove and mouseout on map viewport --- src/ol/control/mouseposition.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ol/control/mouseposition.js b/src/ol/control/mouseposition.js index c8ed67088e..4d558a7855 100644 --- a/src/ol/control/mouseposition.js +++ b/src/ol/control/mouseposition.js @@ -59,10 +59,10 @@ ol.control.MousePosition = ol.Object.getChangedEventType(ol.MapProperty.PROJECTION), this.handleMapProjectionChanged, false, this); - goog.events.listen(map.getTarget(), goog.events.EventType.MOUSEMOVE, + goog.events.listen(map.getViewport(), goog.events.EventType.MOUSEMOVE, this.handleMouseMove, false, this); - goog.events.listen(map.getTarget(), goog.events.EventType.MOUSEOUT, + goog.events.listen(map.getViewport(), goog.events.EventType.MOUSEOUT, this.handleMouseOut, false, this); this.handleMapProjectionChanged(); From 0fd66294591b5743d5cc70847bdf8d226d8069fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Lemoine?= Date: Tue, 21 Aug 2012 06:54:42 +0200 Subject: [PATCH 542/562] map renderer should not render if map is not defined --- src/ol/dom/maprenderer.js | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/ol/dom/maprenderer.js b/src/ol/dom/maprenderer.js index 2014f10901..3198901244 100644 --- a/src/ol/dom/maprenderer.js +++ b/src/ol/dom/maprenderer.js @@ -96,6 +96,10 @@ ol.dom.MapRenderer.prototype.createLayerRenderer = function(layer) { */ ol.dom.MapRenderer.prototype.handleCenterChanged = function() { goog.base(this, 'handleCenterChanged'); + var map = this.getMap(); + if (!map.isDef()) { + return; + } // FIXME: shiftLayersPane_ and resetLayersPane_ should be called // elsewhere as we may be frozen here if (goog.isDef(this.renderedCenter_)) { @@ -112,6 +116,10 @@ ol.dom.MapRenderer.prototype.handleCenterChanged = function() { */ ol.dom.MapRenderer.prototype.handleResolutionChanged = function() { goog.base(this, 'handleResolutionChanged'); + var map = this.getMap(); + if (!map.isDef()) { + return; + } // FIXME: resetLayersPane_ should be called // elsewhere as we may be frozen here this.resetLayersPane_(); From 042893a81771b198e968b63b4fe5c42ddcc520b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Lemoine?= Date: Tue, 21 Aug 2012 06:55:21 +0200 Subject: [PATCH 543/562] enable DOM in two-layers example --- demos/two-layers/index.html.in | 2 +- demos/two-layers/two-layers.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/demos/two-layers/index.html.in b/demos/two-layers/index.html.in index 96c1c5922b..0e3abdb732 100644 --- a/demos/two-layers/index.html.in +++ b/demos/two-layers/index.html.in @@ -18,7 +18,7 @@ WebGL -
Coming soon...
+
diff --git a/demos/two-layers/two-layers.js b/demos/two-layers/two-layers.js index 6b6b2a39c2..e2f7a7634a 100644 --- a/demos/two-layers/two-layers.js +++ b/demos/two-layers/two-layers.js @@ -11,7 +11,7 @@ goog.require('ol.layer.TileJSON'); * FIXME Remove this define when it does * @define {boolean} Enable DOM map. */ -ol.TWO_LAYERS_DEMO_ENABLE_DOM = false; +ol.TWO_LAYERS_DEMO_ENABLE_DOM = true; var layer1 = new ol.layer.BingMaps( From 95a2b3845c4fb26e81a2da80587fe49ba4a1b862 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Lemoine?= Date: Tue, 21 Aug 2012 06:55:57 +0200 Subject: [PATCH 544/562] map renderer should call map.render instead of this.render --- src/ol/dom/maprenderer.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ol/dom/maprenderer.js b/src/ol/dom/maprenderer.js index 3198901244..460b333d36 100644 --- a/src/ol/dom/maprenderer.js +++ b/src/ol/dom/maprenderer.js @@ -107,7 +107,7 @@ ol.dom.MapRenderer.prototype.handleCenterChanged = function() { } else { this.resetLayersPane_(); } - this.render(); + map.render(); }; @@ -123,7 +123,7 @@ ol.dom.MapRenderer.prototype.handleResolutionChanged = function() { // FIXME: resetLayersPane_ should be called // elsewhere as we may be frozen here this.resetLayersPane_(); - this.render(); + map.render(); }; From 7c77b6a88b56a85fc11dd59b5ae88a18292eaa5e Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Tue, 21 Aug 2012 14:35:03 +0200 Subject: [PATCH 545/562] Respect extent when requesting TileJSON tiles --- src/ol/tile/tilejson.js | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/src/ol/tile/tilejson.js b/src/ol/tile/tilejson.js index a30e12254f..691a37e0ca 100644 --- a/src/ol/tile/tilejson.js +++ b/src/ol/tile/tilejson.js @@ -105,16 +105,17 @@ ol.tilestore.TileJSON.prototype.handleTileJSONResponse = function() { var epsg4326Projection = ol.Projection.getFromCode('EPSG:4326'); - var epsg4326Extent; + var epsg4326Extent, extent; if (goog.isDef(tileJSON.bounds)) { var bounds = tileJSON.bounds; epsg4326Extent = new ol.Extent( bounds[0], bounds[1], bounds[2], bounds[3]); - var transformedExtent = epsg4326Extent.transform( + extent = epsg4326Extent.transform( ol.Projection.getTransform(epsg4326Projection, this.getProjection())); - this.setExtent(transformedExtent); + this.setExtent(extent); } else { epsg4326Extent = null; + extent = null; } var scheme = goog.isDef(tileJSON.scheme) || 'xyz'; @@ -136,10 +137,16 @@ ol.tilestore.TileJSON.prototype.handleTileJSONResponse = function() { var y = -tileCoord.y - 1; if (y < 0 || n <= y) { return null; - } else { - var x = goog.math.modulo(tileCoord.x, n); - return new ol.TileCoord(tileCoord.z, x, y); } + var x = goog.math.modulo(tileCoord.x, n); + if (!goog.isNull(extent)) { + var tileExtent = tileGrid.getTileCoordExtent( + new ol.TileCoord(tileCoord.z, x, tileCoord.y)); + if (!tileExtent.intersects(extent)) { + return null; + } + } + return new ol.TileCoord(tileCoord.z, x, y); }, ol.TileUrlFunction.createFromTemplates(tileJSON.tiles)); From 1d5cdcb0ac7a89af233cc4c23c3930e9d58ae6c2 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Tue, 21 Aug 2012 15:30:39 +0200 Subject: [PATCH 546/562] Add Stamen maps support --- src/ol/tile/stamen.js | 92 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 92 insertions(+) create mode 100644 src/ol/tile/stamen.js diff --git a/src/ol/tile/stamen.js b/src/ol/tile/stamen.js new file mode 100644 index 0000000000..69d0985571 --- /dev/null +++ b/src/ol/tile/stamen.js @@ -0,0 +1,92 @@ +// FIXME Configure minZoom when supported by TileGrid + +goog.provide('ol.layer.Stamen'); +goog.provide('ol.store.Stamen'); + +goog.require('ol.TileUrlFunction'); +goog.require('ol.layer.XYZ'); + + +/** + * @enum {string} + */ +ol.StamenProvider = { + TERRAIN: 'terrain', + TONER: 'toner', + WATERCOLOR: 'watercolor' +}; + + +/** + * @enum {string} + */ +ol.StamenFlavor = { + TERRAIN_BACKGROUND: 'background', + TERRAIN_LABELS: 'labels', + TERRAIN_LINES: 'lines', + TONER_2010: '2010', + TONER_2011: '2011', + TONER_2011_LABELS: '2011-labels', + TONER_2011_LINES: '2011-lines', + TONER_2011_LITE: '2011-lite', + TONER_BACKGROUND: 'background', + TONER_HYBRID: 'hybrid', + TONER_LABELS: 'labels', + TONER_LINES: 'lines', + TONER_LITE: 'lite' +}; + + +/** + * @type {Object.} + */ +ol.StamenProviderConfig = {}; +ol.StamenProviderConfig[ol.StamenProvider.TERRAIN] = { + type: 'jpg', + minZoom: 4, + maxZoom: 18 +}; +ol.StamenProviderConfig[ol.StamenProvider.TONER] = { + type: 'png', + minZoom: 0, + maxZoom: 20 +}; +ol.StamenProviderConfig[ol.StamenProvider.WATERCOLOR] = { + type: 'jpg', + minZoom: 3, + maxZoom: 16 +}; + + + +/** + * @constructor + * @extends {ol.layer.XYZ} + * @param {ol.StamenProvider} provider Provider. + * @param {ol.StamenFlavor=} opt_flavor Flavor. + * @param {Object.=} opt_values Values. + */ +ol.layer.Stamen = function(provider, opt_flavor, opt_values) { + + var config = ol.StamenProviderConfig[provider]; + + var layer = provider; + if (goog.isDef(opt_flavor)) { + layer += '-' + opt_flavor; + } + var tileUrlFunction = ol.TileUrlFunction.createFromTemplate( + 'http://{a-d}.tile.stamen.com/' + layer + '/{z}/{x}/{y}.' + config.type); + + var attribution = new ol.Attribution( + 'Map tiles by Stamen Design, ' + + 'under ' + + 'CC BY 3.0. ' + + 'Data by OpenStreetMap, ' + + 'under ' + + 'CC BY SA.'); + + goog.base(this, config.maxZoom, tileUrlFunction, [attribution]); + +}; +goog.inherits(ol.layer.Stamen, ol.layer.XYZ); From bc22fd9ae489d9234a92f493ad2140502ccefb78 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Tue, 21 Aug 2012 17:56:38 +0200 Subject: [PATCH 547/562] Add ol.Map.prototype.isAnimating --- src/ol/base/map.js | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/ol/base/map.js b/src/ol/base/map.js index 546debe448..29bc868763 100644 --- a/src/ol/base/map.js +++ b/src/ol/base/map.js @@ -527,6 +527,14 @@ ol.Map.prototype.handleBrowserWindowResize = function() { }; +/** + * @return {boolean} Is animating. + */ +ol.Map.prototype.isAnimating = function() { + return this.animatingCount_ > 0; +}; + + /** * @return {boolean} Is defined. */ From f02a0d04715ec0f5aba5e53de434df1ed1cdee80 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Tue, 21 Aug 2012 17:56:57 +0200 Subject: [PATCH 548/562] Fix ol.webgl.MapRenderer.prototype.isImageTextureLoaded --- src/ol/webgl/maprenderer.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ol/webgl/maprenderer.js b/src/ol/webgl/maprenderer.js index a7a76864ee..b6c6c0e816 100644 --- a/src/ol/webgl/maprenderer.js +++ b/src/ol/webgl/maprenderer.js @@ -517,7 +517,7 @@ ol.webgl.MapRenderer.prototype.initializeGL_ = function() { * @return {boolean} Is image texture loaded. */ ol.webgl.MapRenderer.prototype.isImageTextureLoaded = function(image) { - return image.src in this.textureCache_[image.src]; + return image.src in this.textureCache_; }; From 0be2fb6e75ffb449131de2c01991e8df2c5eaebb Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Tue, 21 Aug 2012 18:00:27 +0200 Subject: [PATCH 549/562] Defer texture loads until post render --- src/ol/webgl/tilelayerrenderer.js | 83 +++++++++++++++++++++---------- 1 file changed, 58 insertions(+), 25 deletions(-) diff --git a/src/ol/webgl/tilelayerrenderer.js b/src/ol/webgl/tilelayerrenderer.js index 717a3901bd..a5c4723181 100644 --- a/src/ol/webgl/tilelayerrenderer.js +++ b/src/ol/webgl/tilelayerrenderer.js @@ -1,6 +1,5 @@ // FIXME large resolutions lead to too large framebuffers :-( // FIXME animated shaders! check in redraw -// FIXME defer texture uploads goog.provide('ol.webgl.TileLayerRenderer'); goog.provide('ol.webgl.tilelayerrenderer'); @@ -285,6 +284,8 @@ ol.webgl.TileLayerRenderer.prototype.handleWebGLContextLost = function() { */ ol.webgl.TileLayerRenderer.prototype.render = function() { + var animate = false; + var mapRenderer = this.getMapRenderer(); var map = this.getMap(); var gl = mapRenderer.getGL(); @@ -369,12 +370,24 @@ ol.webgl.TileLayerRenderer.prototype.render = function() { */ var tilesToDrawByZ = {}; + /** + * @type {Array.} + */ + var imagesToLoad = []; + tilesToDrawByZ[z] = {}; tileBounds.forEachTileCoord(z, function(tileCoord) { + var tile = tileStore.getTile(tileCoord); + if (goog.isNull(tile)) { } else if (tile.getState() == ol.TileState.LOADED) { - tilesToDrawByZ[z][tileCoord.toString()] = tile; + if (mapRenderer.isImageTextureLoaded(tile.getImage())) { + tilesToDrawByZ[z][tileCoord.toString()] = tile; + return; + } else { + imagesToLoad.push(tile.getImage()); + } } else { var tileKey = goog.getUid(tile); if (!(tileKey in this.tileChangeListenerKeys_)) { @@ -383,30 +396,32 @@ ol.webgl.TileLayerRenderer.prototype.render = function() { this.tileChangeListenerKeys_[tileKey] = goog.events.listen(tile, goog.events.EventType.CHANGE, this.handleTileChange, false, this); } - // FIXME this could be more efficient about filling partial holes - tileGrid.forEachTileCoordParentTileBounds( - tileCoord, - function(z, tileBounds) { - var fullyCovered = true; - tileBounds.forEachTileCoord(z, function(tileCoord) { - var tileCoordKey = tileCoord.toString(); - if (tilesToDrawByZ[z] && tilesToDrawByZ[z][tileCoordKey]) { - return; - } - var tile = tileStore.getTile(tileCoord); - if (!goog.isNull(tile) && - tile.getState() == ol.TileState.LOADED) { - if (!tilesToDrawByZ[z]) { - tilesToDrawByZ[z] = {}; - } - tilesToDrawByZ[z][tileCoordKey] = tile; - } else { - fullyCovered = false; - } - }); - return fullyCovered; - }); } + + // FIXME this could be more efficient about filling partial holes + tileGrid.forEachTileCoordParentTileBounds( + tileCoord, + function(z, tileBounds) { + var fullyCovered = true; + tileBounds.forEachTileCoord(z, function(tileCoord) { + var tileCoordKey = tileCoord.toString(); + if (tilesToDrawByZ[z] && tilesToDrawByZ[z][tileCoordKey]) { + return; + } + var tile = tileStore.getTile(tileCoord); + if (!goog.isNull(tile) && + tile.getState() == ol.TileState.LOADED) { + if (!tilesToDrawByZ[z]) { + tilesToDrawByZ[z] = {}; + } + tilesToDrawByZ[z][tileCoordKey] = tile; + } else { + fullyCovered = false; + } + }); + return fullyCovered; + }); + }, this); var zs = goog.object.getKeys(tilesToDrawByZ); @@ -454,4 +469,22 @@ ol.webgl.TileLayerRenderer.prototype.render = function() { -0.5, 0); + if (!goog.array.isEmpty(imagesToLoad)) { + goog.events.listenOnce( + map, + ol.MapEventType.POST_RENDER, + goog.partial(function(mapRenderer, imagesToLoad) { + if (goog.DEBUG) { + ol.webgl.tilelayerrenderer.logger.info('uploading textures'); + } + goog.array.forEach(imagesToLoad, function(image) { + mapRenderer.bindImageTexture( + image, goog.webgl.LINEAR, goog.webgl.LINEAR); + }); + }, mapRenderer, imagesToLoad)); + animate = true; + } + + return animate; + }; From 9fccf439dad5cdcd045f0205717970b0a02114d0 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Tue, 21 Aug 2012 18:00:44 +0200 Subject: [PATCH 550/562] Don't bother freeing resources when context is lost --- src/ol/webgl/tilelayerrenderer.js | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/ol/webgl/tilelayerrenderer.js b/src/ol/webgl/tilelayerrenderer.js index a5c4723181..0613968f24 100644 --- a/src/ol/webgl/tilelayerrenderer.js +++ b/src/ol/webgl/tilelayerrenderer.js @@ -177,8 +177,10 @@ ol.webgl.TileLayerRenderer.prototype.bindFramebuffer_ = if (goog.DEBUG) { ol.webgl.tilelayerrenderer.logger.info('freeing WebGL resources'); } - gl.deleteFramebuffer(this.framebuffer_); - gl.deleteTexture(this.texture_); + if (!gl.isContextLost()) { + gl.deleteFramebuffer(this.framebuffer_); + gl.deleteTexture(this.texture_); + } } else { var map = this.getMap(); goog.events.listenOnce( @@ -189,8 +191,10 @@ ol.webgl.TileLayerRenderer.prototype.bindFramebuffer_ = ol.webgl.tilelayerrenderer.logger.info( 'freeing WebGL resources on postrender'); } - gl.deleteFramebuffer(framebuffer); - gl.deleteTexture(texture); + if (!gl.isContextLost()) { + gl.deleteFramebuffer(framebuffer); + gl.deleteTexture(texture); + } }, gl, this.framebuffer_, this.texture_)); } From eae88600723e4342d3f26488de8aa1ce57993305 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Tue, 21 Aug 2012 18:01:02 +0200 Subject: [PATCH 551/562] Correct some jsdoc comments --- src/ol/webgl/tilelayerrenderer.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/ol/webgl/tilelayerrenderer.js b/src/ol/webgl/tilelayerrenderer.js index 0613968f24..5f3b5b8cfa 100644 --- a/src/ol/webgl/tilelayerrenderer.js +++ b/src/ol/webgl/tilelayerrenderer.js @@ -225,7 +225,7 @@ ol.webgl.TileLayerRenderer.prototype.bindFramebuffer_ = /** - * @protected + * @inheritDoc */ ol.webgl.TileLayerRenderer.prototype.disposeInternal = function() { var mapRenderer = this.getMapRenderer(); @@ -273,6 +273,7 @@ ol.webgl.TileLayerRenderer.prototype.handleTileChange = function() { /** + * @inheritDoc */ ol.webgl.TileLayerRenderer.prototype.handleWebGLContextLost = function() { this.locations_ = null; From f92d97592126e43eeb3a1a2e7483d93262d6bd51 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Tue, 21 Aug 2012 18:32:18 +0200 Subject: [PATCH 552/562] Give each instance its own logger, instead of using a per-class logger --- src/ol/webgl/maprenderer.js | 24 ++++++++++++------------ src/ol/webgl/tilelayerrenderer.js | 26 ++++++++++++-------------- 2 files changed, 24 insertions(+), 26 deletions(-) diff --git a/src/ol/webgl/maprenderer.js b/src/ol/webgl/maprenderer.js index b6c6c0e816..02ba82c3ca 100644 --- a/src/ol/webgl/maprenderer.js +++ b/src/ol/webgl/maprenderer.js @@ -26,14 +26,6 @@ goog.require('ol.webgl.shader.Fragment'); goog.require('ol.webgl.shader.Vertex'); -if (goog.DEBUG) { - /** - * @type {goog.debug.Logger} - */ - ol.webgl.map.logger = goog.debug.Logger.getLogger('ol.webgl.map'); -} - - /** * @typedef {{magFilter: number, minFilter: number, texture: WebGLTexture}} */ @@ -142,6 +134,14 @@ ol.webgl.MapRenderer = function(container, map) { goog.base(this, container, map); + if (goog.DEBUG) { + /** + * @inheritDoc + */ + this.logger = goog.debug.Logger.getLogger( + 'ol.webgl.maprenderer.' + goog.getUid(this)); + } + /** * @private * @type {Element} @@ -360,7 +360,7 @@ ol.webgl.MapRenderer.prototype.getProgram = function( if (goog.DEBUG) { if (!gl.getProgramParameter(program, goog.webgl.LINK_STATUS) && !gl.isContextLost()) { - ol.webgl.map.logger.severe(gl.getProgramInfoLog(program)); + this.logger.severe(gl.getProgramInfoLog(program)); goog.asserts.assert( gl.getProgramParameter(program, goog.webgl.LINK_STATUS)); } @@ -387,7 +387,7 @@ ol.webgl.MapRenderer.prototype.getShader = function(shaderObject) { if (goog.DEBUG) { if (!gl.getShaderParameter(shader, goog.webgl.COMPILE_STATUS) && !gl.isContextLost()) { - ol.webgl.map.logger.severe(gl.getShaderInfoLog(shader)); + this.logger.severe(gl.getShaderInfoLog(shader)); goog.asserts.assert( gl.getShaderParameter(shader, goog.webgl.COMPILE_STATUS)); } @@ -473,7 +473,7 @@ ol.webgl.MapRenderer.prototype.handleSizeChanged = function() { */ ol.webgl.MapRenderer.prototype.handleWebGLContextLost = function(event) { if (goog.DEBUG) { - ol.webgl.map.logger.info('WebGLContextLost'); + this.logger.info('WebGLContextLost'); } event.preventDefault(); this.locations_ = null; @@ -492,7 +492,7 @@ ol.webgl.MapRenderer.prototype.handleWebGLContextLost = function(event) { */ ol.webgl.MapRenderer.prototype.handleWebGLContextRestored = function() { if (goog.DEBUG) { - ol.webgl.map.logger.info('WebGLContextRestored'); + this.logger.info('WebGLContextRestored'); } this.initializeGL_(); this.getMap().render(); diff --git a/src/ol/webgl/tilelayerrenderer.js b/src/ol/webgl/tilelayerrenderer.js index 5f3b5b8cfa..428672474e 100644 --- a/src/ol/webgl/tilelayerrenderer.js +++ b/src/ol/webgl/tilelayerrenderer.js @@ -24,15 +24,6 @@ goog.require('ol.webgl.shader.Fragment'); goog.require('ol.webgl.shader.Vertex'); -if (goog.DEBUG) { - /** - * @type {goog.debug.Logger} - */ - ol.webgl.tilelayerrenderer.logger = - goog.debug.Logger.getLogger('ol.webgl.tilelayerrenderer'); -} - - /** * @constructor @@ -94,6 +85,14 @@ ol.webgl.TileLayerRenderer = function(mapRenderer, tileLayer) { goog.base(this, mapRenderer, tileLayer); + if (goog.DEBUG) { + /** + * @inheritDoc + */ + this.logger = goog.debug.Logger.getLogger( + 'ol.webgl.tilelayerrenderer.' + goog.getUid(this)); + } + /** * @private * @type {ol.webgl.shader.Fragment} @@ -170,12 +169,12 @@ ol.webgl.TileLayerRenderer.prototype.bindFramebuffer_ = this.framebufferDimension_ != framebufferDimension) { if (goog.DEBUG) { - ol.webgl.tilelayerrenderer.logger.info('re-sizing framebuffer'); + this.logger.info('re-sizing framebuffer'); } if (ol.webgl.FREE_RESOURCES_IMMEDIATELY) { if (goog.DEBUG) { - ol.webgl.tilelayerrenderer.logger.info('freeing WebGL resources'); + this.logger.info('freeing WebGL resources'); } if (!gl.isContextLost()) { gl.deleteFramebuffer(this.framebuffer_); @@ -188,8 +187,7 @@ ol.webgl.TileLayerRenderer.prototype.bindFramebuffer_ = ol.MapEventType.POST_RENDER, goog.partial(function(gl, framebuffer, texture) { if (goog.DEBUG) { - ol.webgl.tilelayerrenderer.logger.info( - 'freeing WebGL resources on postrender'); + this.logger.info('freeing WebGL resources on postrender'); } if (!gl.isContextLost()) { gl.deleteFramebuffer(framebuffer); @@ -480,7 +478,7 @@ ol.webgl.TileLayerRenderer.prototype.render = function() { ol.MapEventType.POST_RENDER, goog.partial(function(mapRenderer, imagesToLoad) { if (goog.DEBUG) { - ol.webgl.tilelayerrenderer.logger.info('uploading textures'); + this.logger.info('uploading textures'); } goog.array.forEach(imagesToLoad, function(image) { mapRenderer.bindImageTexture( From 6edc051548e2867207b385a91d370db91022466e Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Tue, 21 Aug 2012 18:33:02 +0200 Subject: [PATCH 553/562] Give each ol.Map instance its own logger --- src/ol/base/map.js | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/ol/base/map.js b/src/ol/base/map.js index 29bc868763..e71616a16c 100644 --- a/src/ol/base/map.js +++ b/src/ol/base/map.js @@ -8,6 +8,7 @@ goog.provide('ol.MapEventType'); goog.provide('ol.MapProperty'); goog.require('goog.array'); +goog.require('goog.debug.Logger'); goog.require('goog.dispose'); goog.require('goog.dom'); goog.require('goog.dom.ViewportSizeMonitor'); @@ -89,6 +90,14 @@ ol.Map = function( goog.base(this); + if (goog.DEBUG) { + /** + * @protected + * @type {goog.debug.Logger} + */ + this.logger = goog.debug.Logger.getLogger('ol.map.' + goog.getUid(this)); + } + /** * @type {ol.TransformFunction} * @private From 5d75d429668375c11802d30fe496ecb531edd163 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Tue, 21 Aug 2012 18:33:35 +0200 Subject: [PATCH 554/562] Log animation and rendering related actions --- src/ol/base/map.js | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/ol/base/map.js b/src/ol/base/map.js index e71616a16c..c15ae51cae 100644 --- a/src/ol/base/map.js +++ b/src/ol/base/map.js @@ -558,6 +558,9 @@ ol.Map.prototype.isDef = function() { * @inheritDoc */ ol.Map.prototype.onAnimationFrame = function() { + if (goog.DEBUG) { + this.logger.info('onAnimationFrame'); + } this.renderFrame_(); }; @@ -598,6 +601,9 @@ ol.Map.prototype.render = function() { * @private */ ol.Map.prototype.renderFrame_ = function() { + if (goog.DEBUG) { + this.logger.info('renderFrame_'); + } var animatedRenderer = this.renderer_.render(); this.dirty_ = false; if (animatedRenderer != this.animatedRenderer_) { @@ -608,6 +614,9 @@ ol.Map.prototype.renderFrame_ = function() { } this.animatedRenderer_ = animatedRenderer; } + if (goog.DEBUG) { + this.logger.info('postrender'); + } this.dispatchEvent(ol.MapEventType.POST_RENDER); }; @@ -745,6 +754,9 @@ goog.exportProperty( */ ol.Map.prototype.startAnimating = function() { if (++this.animatingCount_ == 1) { + if (goog.DEBUG) { + this.logger.info('startAnimating'); + } goog.fx.anim.registerAnimation(this); } }; @@ -755,6 +767,9 @@ ol.Map.prototype.startAnimating = function() { ol.Map.prototype.stopAnimating = function() { goog.asserts.assert(this.animatingCount_ > 0); if (--this.animatingCount_ === 0) { + if (goog.DEBUG) { + this.logger.info('stopAnimating'); + } goog.fx.anim.unregisterAnimation(this); } }; From 7a720d2c906143762f65b25dc2f6814b950eb8c7 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Tue, 21 Aug 2012 18:34:03 +0200 Subject: [PATCH 555/562] Configure more detailed logging by default in side-by-side demo --- demos/side-by-side/side-by-side.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/demos/side-by-side/side-by-side.js b/demos/side-by-side/side-by-side.js index f54de6610a..ad1b406240 100644 --- a/demos/side-by-side/side-by-side.js +++ b/demos/side-by-side/side-by-side.js @@ -1,4 +1,6 @@ goog.require('goog.debug.Console'); +goog.require('goog.debug.Logger'); +goog.require('goog.debug.Logger.Level'); goog.require('ol.CoordinateFormat'); goog.require('ol.RendererHint'); goog.require('ol.control.Attribution'); @@ -10,6 +12,7 @@ goog.require('ol.layer.MapQuestOpenAerial'); if (goog.DEBUG) { goog.debug.Console.autoInstall(); + goog.debug.Logger.getLogger('ol').setLevel(goog.debug.Logger.Level.INFO); } From 3afe799cf3765505c10574aae047ed8961a907f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Lemoine?= Date: Tue, 21 Aug 2012 21:23:45 +0200 Subject: [PATCH 556/562] dom.LayerRenderer.handleLayerLoad addition --- src/ol/dom/layerrenderer.js | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/ol/dom/layerrenderer.js b/src/ol/dom/layerrenderer.js index 7667c13b30..777da25442 100644 --- a/src/ol/dom/layerrenderer.js +++ b/src/ol/dom/layerrenderer.js @@ -45,6 +45,14 @@ ol.dom.LayerRenderer.prototype.getMapRenderer = function() { }; +/** + * @inheritDoc + */ +ol.dom.LayerRenderer.prototype.handleLayerLoad = function() { + this.getMap().render(); +}; + + /** * @inheritDoc */ From e0a6f3aeebdff307b11addbb8d96b02b9c0aba58 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Lemoine?= Date: Tue, 21 Aug 2012 21:24:12 +0200 Subject: [PATCH 557/562] remove ol.TWO_LAYERS_DEMO_ENABLE_DOM from two-layers example --- demos/two-layers/two-layers.js | 29 ++++++++--------------------- 1 file changed, 8 insertions(+), 21 deletions(-) diff --git a/demos/two-layers/two-layers.js b/demos/two-layers/two-layers.js index e2f7a7634a..fdc3cb0633 100644 --- a/demos/two-layers/two-layers.js +++ b/demos/two-layers/two-layers.js @@ -6,14 +6,6 @@ goog.require('ol.layer.BingMaps'); goog.require('ol.layer.TileJSON'); -/** - * FIXME The DOM renderer doesn't support partially-loaded layers yet - * FIXME Remove this define when it does - * @define {boolean} Enable DOM map. - */ -ol.TWO_LAYERS_DEMO_ENABLE_DOM = true; - - var layer1 = new ol.layer.BingMaps( ol.BingMapsStyle.AERIAL, 'AheP841R-MsLErKQChaTba_xDoOCl40-EeTubD9uNhNAyQTePwFY9iVD1_pyqqlE'); @@ -32,19 +24,14 @@ goog.events.listen(layer2, goog.events.EventType.LOAD, function() { webglMap.setResolution(layer2.getStore().getResolutions()[5]); }); -var domMap; -if (ol.TWO_LAYERS_DEMO_ENABLE_DOM) { - domMap = ol.createMap( - document.getElementById('domMap'), - {}, - ol.RendererHint.DOM); - domMap.bindTo('center', webglMap); - domMap.bindTo('layers', webglMap); - domMap.bindTo('resolution', webglMap); - domMap.bindTo('rotation', webglMap); -} else { - domMap = null; -} +var domMap = ol.createMap( + document.getElementById('domMap'), + {}, + ol.RendererHint.DOM); +domMap.bindTo('center', webglMap); +domMap.bindTo('layers', webglMap); +domMap.bindTo('resolution', webglMap); +domMap.bindTo('rotation', webglMap); var attributionControl = new ol.control.Attribution(webglMap); document.getElementById('attribution').appendChild( From d0ffc6186d36c2a840363cbfac569ae7c3c7a391 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Lemoine?= Date: Wed, 22 Aug 2012 10:33:30 +0200 Subject: [PATCH 558/562] remove FIXMEs --- src/ol/dom/tilelayerrenderer.js | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/ol/dom/tilelayerrenderer.js b/src/ol/dom/tilelayerrenderer.js index 5c66bcf786..25a77b3a5c 100644 --- a/src/ol/dom/tilelayerrenderer.js +++ b/src/ol/dom/tilelayerrenderer.js @@ -1,6 +1,3 @@ -// FIXME ol.dom.TileLayerRenderer should cope with "not ready" layers -// FIXME ol.dom.TileLayerRenderer should re-render when layer loads - goog.provide('ol.dom.TileLayerRenderer'); goog.require('goog.dom'); From cb6c73d99f02551da961a2e4247aa1b9dcbdf282 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Lemoine?= Date: Mon, 27 Aug 2012 11:49:19 +0200 Subject: [PATCH 559/562] MapBrowserEvent.getCoordinate may return wrong coords --- src/ol/base/mapbrowserevent.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/ol/base/mapbrowserevent.js b/src/ol/base/mapbrowserevent.js index 5c9421531d..0fa253d952 100644 --- a/src/ol/base/mapbrowserevent.js +++ b/src/ol/base/mapbrowserevent.js @@ -1,6 +1,7 @@ goog.provide('ol.MapBrowserEvent'); goog.require('goog.events.BrowserEvent'); +goog.require('goog.style'); goog.require('ol.Coordinate'); goog.require('ol.MapEvent'); goog.require('ol.Pixel'); @@ -40,9 +41,12 @@ ol.MapBrowserEvent.prototype.getCoordinate = function() { if (goog.isDef(this.coordinate_)) { return this.coordinate_; } else { + var map = this.map; var browserEvent = this.browserEvent; - var pixel = new ol.Pixel(browserEvent.offsetX, browserEvent.offsetY); - var coordinate = this.map.getCoordinateFromPixel(pixel); + var eventPosition = goog.style.getRelativePosition( + browserEvent, map.getViewport()); + var pixel = new ol.Pixel(eventPosition.x, eventPosition.y); + var coordinate = map.getCoordinateFromPixel(pixel); this.coordinate_ = coordinate; return coordinate; } From 4aff22e9805f826d98d6ab1bcb5ae67b0108bde8 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Wed, 29 Aug 2012 19:53:46 +0200 Subject: [PATCH 560/562] ol3 is now internal, ol is now external As discussed with @ahocevar, @elemoine and @tschaub. --- .gitignore | 2 +- Makefile | 44 +- build/ol.json | 9 + build/ol3-api.json | 9 - demos/api1/api1.js | 4 +- demos/proj4js/proj4js.js | 12 +- demos/side-by-side/side-by-side.js | 42 +- demos/two-layers/two-layers.js | 34 +- src/api/api.js | 168 ------ src/ol/base/array_test.js | 46 -- src/ol/base/attribution.js | 58 -- src/ol/base/coordinate.js | 31 -- src/ol/base/coveragearea.js | 45 -- src/ol/base/createmap.js | 153 ------ src/ol/base/extent.js | 59 --- src/ol/base/layer.js | 228 -------- src/ol/base/layerrenderer.js | 127 ----- src/ol/base/pixel.js | 24 - src/ol/base/projection.js | 500 ------------------ src/ol/base/rectangle_test.js | 142 ----- src/ol/base/store.js | 96 ---- src/ol/base/transformfunction.js | 9 - src/{api => ol}/collection_test.js | 12 +- src/ol/control/control.js | 33 -- src/ol/dom/layerrenderer.js | 84 --- src/ol/interaction/centerconstraint.js | 47 -- src/ol/interaction/constraints.js | 36 -- src/ol/interaction/dragpan.js | 48 -- src/ol/interaction/shiftdragzoom.js | 64 --- src/{api => ol}/object_test.js | 12 +- src/ol/ol.js | 168 ++++++ src/ol/tile/openstreetmap.js | 40 -- src/ol/tile/tilebounds_test.js | 102 ---- src/ol/tile/tilecoveragearea.js | 71 --- src/ol/tile/tilelayer.js | 26 - src/ol/tile/tileurlfunction_test.js | 33 -- src/ol/tile/xyz.js | 118 ----- src/ol/webgl/layerrenderer.js | 113 ---- src/ol/webgl/shader.js | 81 --- src/{ol => ol3}/base/array.js | 6 +- src/ol3/base/array_test.js | 46 ++ src/ol3/base/attribution.js | 58 ++ src/{ol => ol3}/base/collection.js | 74 +-- src/{ol => ol3}/base/collection_test.js | 79 +-- src/{ol => ol3}/base/color.js | 16 +- src/ol3/base/coordinate.js | 31 ++ src/{ol => ol3}/base/coordinateformat.js | 24 +- src/ol3/base/coveragearea.js | 45 ++ src/ol3/base/createmap.js | 153 ++++++ src/ol3/base/extent.js | 59 +++ src/{ol => ol3}/base/extent_test.js | 12 +- src/ol3/base/layer.js | 228 ++++++++ src/ol3/base/layerrenderer.js | 127 +++++ src/{ol => ol3}/base/map.js | 349 ++++++------ src/{ol => ol3}/base/mapbrowserevent.js | 24 +- src/{ol => ol3}/base/mapevent.js | 12 +- src/{ol => ol3}/base/maprenderer.js | 124 ++--- src/{ol => ol3}/base/object.js | 100 ++-- src/{ol => ol3}/base/object_test.js | 110 ++-- src/{ol => ol3}/base/ol.js | 4 +- src/ol3/base/pixel.js | 24 + src/{ol => ol3}/base/pixelbounds.js | 10 +- src/ol3/base/projection.js | 500 ++++++++++++++++++ src/{ol => ol3}/base/projection_test.js | 30 +- src/{ol => ol3}/base/rectangle.js | 48 +- src/ol3/base/rectangle_test.js | 142 +++++ src/{ol => ol3}/base/size.js | 10 +- src/ol3/base/store.js | 96 ++++ src/ol3/base/transformfunction.js | 9 + src/{ol => ol3}/control/attribution.js | 123 ++--- src/ol3/control/control.js | 33 ++ src/{ol => ol3}/control/mouseposition.js | 48 +- src/{ol => ol3}/dom/dom.js | 4 +- src/ol3/dom/layerrenderer.js | 84 +++ src/{ol => ol3}/dom/maprenderer.js | 44 +- src/{ol => ol3}/dom/tilelayerrenderer.js | 40 +- src/{ol => ol3}/interaction/altdragrotate.js | 18 +- src/ol3/interaction/centerconstraint.js | 47 ++ src/ol3/interaction/constraints.js | 36 ++ src/{ol => ol3}/interaction/dblclickzoom.js | 18 +- src/{ol => ol3}/interaction/drag.js | 40 +- src/ol3/interaction/dragpan.js | 48 ++ src/{ol => ol3}/interaction/interaction.js | 54 +- src/{ol => ol3}/interaction/keyboard.js | 14 +- src/{ol => ol3}/interaction/keyboardpan.js | 24 +- src/{ol => ol3}/interaction/keyboardzoom.js | 16 +- src/{ol => ol3}/interaction/mousewheelzoom.js | 16 +- .../interaction/resolutionconstraint.js | 22 +- .../interaction/resolutionconstraint_test.js | 22 +- .../interaction/rotationconstraint.js | 12 +- .../interaction/shiftdragrotateandzoom.js | 20 +- src/ol3/interaction/shiftdragzoom.js | 65 +++ src/{ol => ol3}/tile/bingmaps.js | 62 +-- src/{ol => ol3}/tile/mapquest.js | 34 +- src/ol3/tile/openstreetmap.js | 40 ++ src/{ol => ol3}/tile/stamen.js | 38 +- src/{ol => ol3}/tile/tile.js | 44 +- src/{ol => ol3}/tile/tilebounds.js | 50 +- src/ol3/tile/tilebounds_test.js | 102 ++++ src/{ol => ol3}/tile/tilecoord.js | 44 +- src/{ol => ol3}/tile/tilecoord_test.js | 14 +- src/ol3/tile/tilecoveragearea.js | 71 +++ src/{ol => ol3}/tile/tilegrid.js | 141 ++--- src/{ol => ol3}/tile/tilegrid_test.js | 126 ++--- src/{ol => ol3}/tile/tilejson.js | 66 +-- src/ol3/tile/tilelayer.js | 26 + src/{ol => ol3}/tile/tilestore.js | 52 +- src/{ol => ol3}/tile/tileurlfunction.js | 43 +- src/ol3/tile/tileurlfunction_test.js | 33 ++ src/ol3/tile/xyz.js | 118 +++++ src/{ol => ol3}/tile/xyz_test.js | 38 +- src/ol3/webgl/layerrenderer.js | 113 ++++ src/{ol => ol3}/webgl/maprenderer.js | 120 ++--- src/ol3/webgl/shader.js | 81 +++ src/{ol => ol3}/webgl/tilelayerrenderer.js | 98 ++-- src/{ol => ol3}/webgl/webgl.js | 10 +- 116 files changed, 3953 insertions(+), 3939 deletions(-) create mode 100644 build/ol.json delete mode 100644 build/ol3-api.json delete mode 100644 src/api/api.js delete mode 100644 src/ol/base/array_test.js delete mode 100644 src/ol/base/attribution.js delete mode 100644 src/ol/base/coordinate.js delete mode 100644 src/ol/base/coveragearea.js delete mode 100644 src/ol/base/createmap.js delete mode 100644 src/ol/base/extent.js delete mode 100644 src/ol/base/layer.js delete mode 100644 src/ol/base/layerrenderer.js delete mode 100644 src/ol/base/pixel.js delete mode 100644 src/ol/base/projection.js delete mode 100644 src/ol/base/rectangle_test.js delete mode 100644 src/ol/base/store.js delete mode 100644 src/ol/base/transformfunction.js rename src/{api => ol}/collection_test.js (59%) delete mode 100644 src/ol/control/control.js delete mode 100644 src/ol/dom/layerrenderer.js delete mode 100644 src/ol/interaction/centerconstraint.js delete mode 100644 src/ol/interaction/constraints.js delete mode 100644 src/ol/interaction/dragpan.js delete mode 100644 src/ol/interaction/shiftdragzoom.js rename src/{api => ol}/object_test.js (50%) create mode 100644 src/ol/ol.js delete mode 100644 src/ol/tile/openstreetmap.js delete mode 100644 src/ol/tile/tilebounds_test.js delete mode 100644 src/ol/tile/tilecoveragearea.js delete mode 100644 src/ol/tile/tilelayer.js delete mode 100644 src/ol/tile/tileurlfunction_test.js delete mode 100644 src/ol/tile/xyz.js delete mode 100644 src/ol/webgl/layerrenderer.js delete mode 100644 src/ol/webgl/shader.js rename src/{ol => ol3}/base/array.js (88%) create mode 100644 src/ol3/base/array_test.js create mode 100644 src/ol3/base/attribution.js rename src/{ol => ol3}/base/collection.js (56%) rename src/{ol => ol3}/base/collection_test.js (68%) rename src/{ol => ol3}/base/color.js (62%) create mode 100644 src/ol3/base/coordinate.js rename src/{ol => ol3}/base/coordinateformat.js (57%) create mode 100644 src/ol3/base/coveragearea.js create mode 100644 src/ol3/base/createmap.js create mode 100644 src/ol3/base/extent.js rename src/{ol => ol3}/base/extent_test.js (74%) create mode 100644 src/ol3/base/layer.js create mode 100644 src/ol3/base/layerrenderer.js rename src/{ol => ol3}/base/map.js (57%) rename src/{ol => ol3}/base/mapbrowserevent.js (60%) rename src/{ol => ol3}/base/mapevent.js (61%) rename src/{ol => ol3}/base/maprenderer.js (62%) rename src/{ol => ol3}/base/object.js (60%) rename src/{ol => ol3}/base/object_test.js (80%) rename src/{ol => ol3}/base/ol.js (60%) create mode 100644 src/ol3/base/pixel.js rename src/{ol => ol3}/base/pixelbounds.js (52%) create mode 100644 src/ol3/base/projection.js rename src/{ol => ol3}/base/projection_test.js (68%) rename src/{ol => ol3}/base/rectangle.js (55%) create mode 100644 src/ol3/base/rectangle_test.js rename src/{ol => ol3}/base/size.js (62%) create mode 100644 src/ol3/base/store.js create mode 100644 src/ol3/base/transformfunction.js rename src/{ol => ol3}/control/attribution.js (69%) create mode 100644 src/ol3/control/control.js rename src/{ol => ol3}/control/mouseposition.js (63%) rename src/{ol => ol3}/dom/dom.js (53%) create mode 100644 src/ol3/dom/layerrenderer.js rename src/{ol => ol3}/dom/maprenderer.js (75%) rename src/{ol => ol3}/dom/tilelayerrenderer.js (75%) rename src/{ol => ol3}/interaction/altdragrotate.js (66%) create mode 100644 src/ol3/interaction/centerconstraint.js create mode 100644 src/ol3/interaction/constraints.js rename src/{ol => ol3}/interaction/dblclickzoom.js (57%) rename src/{ol => ol3}/interaction/drag.js (66%) create mode 100644 src/ol3/interaction/dragpan.js rename src/{ol => ol3}/interaction/interaction.js (54%) rename src/{ol => ol3}/interaction/keyboard.js (69%) rename src/{ol => ol3}/interaction/keyboardpan.js (66%) rename src/{ol => ol3}/interaction/keyboardzoom.js (64%) rename src/{ol => ol3}/interaction/mousewheelzoom.js (67%) rename src/{ol => ol3}/interaction/resolutionconstraint.js (70%) rename src/{ol => ol3}/interaction/resolutionconstraint_test.js (87%) rename src/{ol => ol3}/interaction/rotationconstraint.js (62%) rename src/{ol => ol3}/interaction/shiftdragrotateandzoom.js (72%) create mode 100644 src/ol3/interaction/shiftdragzoom.js rename src/{ol => ol3}/tile/bingmaps.js (69%) rename src/{ol => ol3}/tile/mapquest.js (62%) create mode 100644 src/ol3/tile/openstreetmap.js rename src/{ol => ol3}/tile/stamen.js (63%) rename src/{ol => ol3}/tile/tile.js (71%) rename src/{ol => ol3}/tile/tilebounds.js (56%) create mode 100644 src/ol3/tile/tilebounds_test.js rename src/{ol => ol3}/tile/tilecoord.js (60%) rename src/{ol => ol3}/tile/tilecoord_test.js (61%) create mode 100644 src/ol3/tile/tilecoveragearea.js rename src/{ol => ol3}/tile/tilegrid.js (60%) rename src/{ol => ol3}/tile/tilegrid_test.js (76%) rename src/{ol => ol3}/tile/tilejson.js (62%) create mode 100644 src/ol3/tile/tilelayer.js rename src/{ol => ol3}/tile/tilestore.js (51%) rename src/{ol => ol3}/tile/tileurlfunction.js (53%) create mode 100644 src/ol3/tile/tileurlfunction_test.js create mode 100644 src/ol3/tile/xyz.js rename src/{ol => ol3}/tile/xyz_test.js (71%) create mode 100644 src/ol3/webgl/layerrenderer.js rename src/{ol => ol3}/webgl/maprenderer.js (81%) create mode 100644 src/ol3/webgl/shader.js rename src/{ol => ol3}/webgl/tilelayerrenderer.js (81%) rename src/{ol => ol3}/webgl/webgl.js (56%) diff --git a/.gitignore b/.gitignore index d57aa6b00d..c29095b406 100644 --- a/.gitignore +++ b/.gitignore @@ -1,8 +1,8 @@ /apidoc_config/Data/ /bin/plovr*.jar /build/OpenLayers.js +/build/ol.js /build/ol3.js -/build/ol3-api.js /build/ol3-compiled.js /demos/*/advanced-optimizations.* /demos/*/build.html diff --git a/Makefile b/Makefile index 7d8934de3d..ff38dab96d 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,6 @@ PLOVR_JAR=bin/plovr-4b3caf2b7d84.jar -SRC = $(shell find externs src/ol -name \*.js) -API = $(shell find src/api -name \*.js) +SRC_OL = $(shell find src/ol -name \*.js) +SRC_OL3 = $(shell find externs src/ol3 -name \*.js) TARGETS = $(shell find demos -name advanced-optimizations.js -o -name simple-optimizations.js) comma := , empty := @@ -10,49 +10,49 @@ space := $(empty) $(empty) all: build demos webgl-debug.js .PHONY: build -build: build/ol3-api.js build/ol3-compiled.js +build: build/ol.js build/ol3-compiled.js -build/ol3-api.js: $(PLOVR_JAR) $(SRC) base.json \ - build/ol3-api.json src/api/api.js - java -jar $(PLOVR_JAR) build build/ol3-api.json >$@ +build/ol.js: $(PLOVR_JAR) $(SRC_OL3) base.json \ + build/ol.json src/ol/ol.js + java -jar $(PLOVR_JAR) build build/ol.json >$@ @echo $@ "uncompressed:" $$(wc -c <$@) bytes @echo $@ " compressed:" $$(gzip -9 -c <$@ | wc -c) bytes -build/ol3-compiled.js: $(PLOVR_JAR) $(SRC) base.json \ +build/ol3-compiled.js: $(PLOVR_JAR) $(SRC_OL3) base.json \ build/ol3.json build/ol3.js java -jar $(PLOVR_JAR) build build/ol3.json >$@ @echo $@ "uncompressed:" $$(wc -c <$@) bytes @echo $@ " compressed:" $$(gzip -9 -c <$@ | wc -c) bytes -build/ol3.js: $(SRC) - ( echo "goog.require('goog.dom');" ; find src/ol -name \*.js | xargs grep -rh ^goog.provide | sort | uniq | sed -e 's/provide/require/g' ) > $@ +build/ol3.js: $(SRC_OL3) + ( echo "goog.require('goog.dom');" ; find src/ol3 -name \*.js | xargs grep -rh ^goog.provide | sort | uniq | sed -e 's/provide/require/g' ) > $@ .PHONY: demos demos: demos/api1 demos/proj4js demos/side-by-side demos/two-layers .PHONY: demos/api1 demos/api1: \ - build/ol3-api.js \ + build/ol.js \ demos/api1/build.html \ demos/api1/debug.html demos/api1/build.html: demos/api1/index.html.in - sed -e 's|@SRC@|../../build/ol3-api.js|' $< > $@ + sed -e 's|@SRC@|../../build/ol.js|' $< > $@ demos/api1/debug.html: demos/api1/index.html.in - sed -e 's|@SRC@|http://localhost:9810/compile?id=ol3-api|' $< > $@ + sed -e 's|@SRC@|http://localhost:9810/compile?id=ol|' $< > $@ .PHONY: demos/proj4js demos/proj4js: \ - build/ol3-api.js \ + build/ol.js \ demos/proj4js/build.html \ demos/proj4js/debug.html demos/proj4js/build.html: demos/proj4js/index.html.in - sed -e 's|@SRC@|../../build/ol3-api.js|' $< > $@ + sed -e 's|@SRC@|../../build/ol.js|' $< > $@ demos/proj4js/debug.html: demos/proj4js/index.html.in - sed -e 's|@SRC@|http://localhost:9810/compile?id=ol3-api|' $< > $@ + sed -e 's|@SRC@|http://localhost:9810/compile?id=ol|' $< > $@ .PHONY: demos/side-by-side demos/side-by-side: \ @@ -65,7 +65,7 @@ demos/side-by-side: \ demos/side-by-side/advanced-optimizations.html: demos/side-by-side/index.html.in sed -e 's|@SRC@|advanced-optimizations.js|' $< > $@ -demos/side-by-side/advanced-optimizations.js: $(PLOVR_JAR) $(SRC) base.json \ +demos/side-by-side/advanced-optimizations.js: $(PLOVR_JAR) $(SRC_OL3) base.json \ demos/side-by-side/side-by-side.json demos/side-by-side/side-by-side.js java -jar $(PLOVR_JAR) build demos/side-by-side/side-by-side.json >$@ @echo $@ "uncompressed:" $$(wc -c <$@) bytes @@ -78,7 +78,7 @@ demos/side-by-side/simple-optimizations.html: demos/side-by-side/index.html.in sed -e 's|@SRC@|simple-optimizations.js|' $< > $@ # FIXME invoke plovr directly, rather than assuming that the server is running -demos/side-by-side/simple-optimizations.js: $(PLOVR_JAR) $(SRC) base.json \ +demos/side-by-side/simple-optimizations.js: $(PLOVR_JAR) $(SRC_OL3) base.json \ demos/side-by-side/side-by-side.json demos/side-by-side/side-by-side.js curl 'http://localhost:9810/compile?id=demo-side-by-side&mode=SIMPLE' > $@ @echo $@ "uncompressed:" $$(wc -c <$@) bytes @@ -95,7 +95,7 @@ demos/two-layers: \ demos/two-layers/advanced-optimizations.html: demos/two-layers/index.html.in sed -e 's|@SRC@|advanced-optimizations.js|' $< > $@ -demos/two-layers/advanced-optimizations.js: $(PLOVR_JAR) $(SRC) base.json \ +demos/two-layers/advanced-optimizations.js: $(PLOVR_JAR) $(SRC_OL3) base.json \ demos/two-layers/two-layers.json demos/two-layers/two-layers.js java -jar $(PLOVR_JAR) build demos/two-layers/two-layers.json >$@ @echo $@ "uncompressed:" $$(wc -c <$@) bytes @@ -108,7 +108,7 @@ demos/two-layers/simple-optimizations.html: demos/two-layers/index.html.in sed -e 's|@SRC@|simple-optimizations.js|' $< > $@ # FIXME invoke plovr directly, rather than assuming that the server is running -demos/two-layers/simple-optimizations.js: $(PLOVR_JAR) $(SRC) base.json \ +demos/two-layers/simple-optimizations.js: $(PLOVR_JAR) $(SRC_OL3) base.json \ demos/two-layers/two-layers.json demos/two-layers/two-layers.js curl 'http://localhost:9810/compile?id=demo-two-layers&mode=SIMPLE' > $@ @echo $@ "uncompressed:" $$(wc -c <$@) bytes @@ -116,11 +116,11 @@ demos/two-layers/simple-optimizations.js: $(PLOVR_JAR) $(SRC) base.json \ .PHONY: serve serve: $(PLOVR_JAR) - java -jar $(PLOVR_JAR) serve build/ol3.json build/ol3-api.json demos/*/*.json + java -jar $(PLOVR_JAR) serve build/ol.json build/ol3.json demos/*/*.json .PHONY: lint lint: - gjslint --strict --limited_doc_files=$(subst $(space),$(comma),$(shell find externs -name \*.js)) $(SRC) $(API) $(filter-out $(TARGETS),$(shell find demos -name \*.js)) + gjslint --strict --limited_doc_files=$(subst $(space),$(comma),$(shell find externs -name \*.js)) $(SRC_OL3) $(SRC_OL) $(filter-out $(TARGETS),$(shell find demos -name \*.js)) webgl-debug.js: curl https://cvs.khronos.org/svn/repos/registry/trunk/public/webgl/sdk/debug/webgl-debug.js > $@ @@ -130,7 +130,9 @@ $(PLOVR_JAR): clean: rm -f build/all.js + rm -f build/ol.js rm -f build/ol3.js + rm -f build/ol3-compiled.js rm -f demos/*/*.html rm -f demos/*/advanced-optimizations.* rm -f demos/*/simple-optimizations.* diff --git a/build/ol.json b/build/ol.json new file mode 100644 index 0000000000..935a6aac49 --- /dev/null +++ b/build/ol.json @@ -0,0 +1,9 @@ +{ + + "id": "ol", + + "inherits": "../base.json", + + "inputs": "src/ol/ol.js" + +} diff --git a/build/ol3-api.json b/build/ol3-api.json deleted file mode 100644 index f45d301498..0000000000 --- a/build/ol3-api.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - - "id": "ol3-api", - - "inherits": "../base.json", - - "inputs": "src/api/api.js" - -} diff --git a/demos/api1/api1.js b/demos/api1/api1.js index 0e3259e5fd..c6d7e92ca2 100644 --- a/demos/api1/api1.js +++ b/demos/api1/api1.js @@ -1,6 +1,6 @@ -var map = ol3.map({ +var map = ol.map({ renderTo: 'map', - layers: [ol3.layer.osm()], + layers: [ol.layer.osm()], center: [45, 5], zoom: 10 }); diff --git a/demos/proj4js/proj4js.js b/demos/proj4js/proj4js.js index d9b73f3c79..70f3adfb62 100644 --- a/demos/proj4js/proj4js.js +++ b/demos/proj4js/proj4js.js @@ -1,14 +1,14 @@ goog.require('goog.dom'); -goog.require('ol.Coordinate'); -goog.require('ol.Projection'); +goog.require('ol3.Coordinate'); +goog.require('ol3.Projection'); var outputElement = document.getElementById('output'); var point, transformedPoint; -point = new ol.Coordinate(-626172.13571216376, 6887893.4928337997); -transformedPoint = ol.Projection.transformWithCodes( +point = new ol3.Coordinate(-626172.13571216376, 6887893.4928337997); +transformedPoint = ol3.Projection.transformWithCodes( point, 'GOOGLE', 'WGS84'); outputElement.appendChild(goog.dom.createTextNode(transformedPoint.toString())); @@ -17,7 +17,7 @@ Proj4js.defs['EPSG:21781'] = '+x_0=600000 +y_0=200000 +ellps=bessel ' + '+towgs84=674.374,15.056,405.346,0,0,0,0 +units=m +no_defs'; -point = new ol.Coordinate(7.439583333333333, 46.95240555555556); -transformedPoint = ol.Projection.transformWithCodes( +point = new ol3.Coordinate(7.439583333333333, 46.95240555555556); +transformedPoint = ol3.Projection.transformWithCodes( point, 'EPSG:4326', 'EPSG:21781'); outputElement.appendChild(goog.dom.createTextNode(transformedPoint.toString())); diff --git a/demos/side-by-side/side-by-side.js b/demos/side-by-side/side-by-side.js index ad1b406240..987d052a27 100644 --- a/demos/side-by-side/side-by-side.js +++ b/demos/side-by-side/side-by-side.js @@ -1,13 +1,13 @@ goog.require('goog.debug.Console'); goog.require('goog.debug.Logger'); goog.require('goog.debug.Logger.Level'); -goog.require('ol.CoordinateFormat'); -goog.require('ol.RendererHint'); -goog.require('ol.control.Attribution'); -goog.require('ol.control.MousePosition'); -goog.require('ol.createMap'); -goog.require('ol.interaction.Keyboard'); -goog.require('ol.layer.MapQuestOpenAerial'); +goog.require('ol3.CoordinateFormat'); +goog.require('ol3.RendererHint'); +goog.require('ol3.control.Attribution'); +goog.require('ol3.control.MousePosition'); +goog.require('ol3.createMap'); +goog.require('ol3.interaction.Keyboard'); +goog.require('ol3.layer.MapQuestOpenAerial'); if (goog.DEBUG) { @@ -17,22 +17,22 @@ if (goog.DEBUG) { -var layer = new ol.layer.MapQuestOpenAerial(); +var layer = new ol3.layer.MapQuestOpenAerial(); -var layers = new ol.Collection(); +var layers = new ol3.Collection(); layers.push(layer); -var domMap = ol.createMap( +var domMap = ol3.createMap( document.getElementById('domMap'), {'layers': layers}, - ol.RendererHint.DOM); -domMap.setCenter(new ol.Coordinate(0, 0)); + ol3.RendererHint.DOM); +domMap.setCenter(new ol3.Coordinate(0, 0)); domMap.setResolution(layer.getStore().getResolutions()[0]); -var webglMap = ol.createMap( +var webglMap = ol3.createMap( document.getElementById('webglMap'), {}, - ol.RendererHint.WEBGL); + ol3.RendererHint.WEBGL); if (!goog.isNull(webglMap)) { webglMap.bindTo('center', domMap); webglMap.bindTo('layers', domMap); @@ -40,21 +40,23 @@ if (!goog.isNull(webglMap)) { webglMap.bindTo('rotation', domMap); } -var attributionControl = new ol.control.Attribution(domMap); +var attributionControl = new ol3.control.Attribution(domMap); document.getElementById('attribution').appendChild( attributionControl.getElement()); -var domMousePositionControl = new ol.control.MousePosition(domMap, - ol.Projection.getFromCode('EPSG:4326'), ol.CoordinateFormat.hdms, ' '); +var domMousePositionControl = new ol3.control.MousePosition(domMap, + ol3.Projection.getFromCode('EPSG:4326'), ol3.CoordinateFormat.hdms, + ' '); document.getElementById('domMousePosition').appendChild( domMousePositionControl.getElement()); -var webglMousePositionControl = new ol.control.MousePosition(webglMap, - ol.Projection.getFromCode('EPSG:4326'), ol.CoordinateFormat.hdms, ' '); +var webglMousePositionControl = new ol3.control.MousePosition(webglMap, + ol3.Projection.getFromCode('EPSG:4326'), ol3.CoordinateFormat.hdms, + ' '); document.getElementById('webglMousePosition').appendChild( webglMousePositionControl.getElement()); -var keyboardInteraction = new ol.interaction.Keyboard(); +var keyboardInteraction = new ol3.interaction.Keyboard(); keyboardInteraction.addCallback('0', function() { layer.setBrightness(0); layer.setContrast(0); diff --git a/demos/two-layers/two-layers.js b/demos/two-layers/two-layers.js index fdc3cb0633..1428894886 100644 --- a/demos/two-layers/two-layers.js +++ b/demos/two-layers/two-layers.js @@ -1,39 +1,39 @@ -goog.require('ol.Coordinate'); -goog.require('ol.RendererHint'); -goog.require('ol.control.Attribution'); -goog.require('ol.createMap'); -goog.require('ol.layer.BingMaps'); -goog.require('ol.layer.TileJSON'); +goog.require('ol3.Coordinate'); +goog.require('ol3.RendererHint'); +goog.require('ol3.control.Attribution'); +goog.require('ol3.createMap'); +goog.require('ol3.layer.BingMaps'); +goog.require('ol3.layer.TileJSON'); -var layer1 = new ol.layer.BingMaps( - ol.BingMapsStyle.AERIAL, +var layer1 = new ol3.layer.BingMaps( + ol3.BingMapsStyle.AERIAL, 'AheP841R-MsLErKQChaTba_xDoOCl40-EeTubD9uNhNAyQTePwFY9iVD1_pyqqlE'); -var layer2 = new ol.layer.TileJSON( +var layer2 = new ol3.layer.TileJSON( 'http://api.tiles.mapbox.com/v3/mapbox.va-quake-aug.jsonp'); -var layers = new ol.Collection([layer1, layer2]); +var layers = new ol3.Collection([layer1, layer2]); -var webglMap = ol.createMap( +var webglMap = ol3.createMap( document.getElementById('webglMap'), - {'layers': new ol.Collection([layer1, layer2])}, - ol.RendererHint.WEBGL); + {'layers': new ol3.Collection([layer1, layer2])}, + ol3.RendererHint.WEBGL); goog.events.listen(layer2, goog.events.EventType.LOAD, function() { - webglMap.setUserCenter(new ol.Coordinate(-77.93254999999999, 37.9555)); + webglMap.setUserCenter(new ol3.Coordinate(-77.93254999999999, 37.9555)); webglMap.setResolution(layer2.getStore().getResolutions()[5]); }); -var domMap = ol.createMap( +var domMap = ol3.createMap( document.getElementById('domMap'), {}, - ol.RendererHint.DOM); + ol3.RendererHint.DOM); domMap.bindTo('center', webglMap); domMap.bindTo('layers', webglMap); domMap.bindTo('resolution', webglMap); domMap.bindTo('rotation', webglMap); -var attributionControl = new ol.control.Attribution(webglMap); +var attributionControl = new ol3.control.Attribution(webglMap); document.getElementById('attribution').appendChild( attributionControl.getElement()); diff --git a/src/api/api.js b/src/api/api.js deleted file mode 100644 index 2fce523118..0000000000 --- a/src/api/api.js +++ /dev/null @@ -1,168 +0,0 @@ -goog.provide('ol3'); -goog.provide('ol3.layer'); - -goog.require('goog.dom'); -goog.require('ol.Collection'); -goog.require('ol.Coordinate'); -goog.require('ol.Layer'); -goog.require('ol.Map'); -goog.require('ol.Object'); -goog.require('ol.Projection'); -goog.require('ol.createMap'); -goog.require('ol.layer.OpenStreetMap'); - - -goog.exportSymbol('ol3', ol3); - - -/** - * @typedef {Array|ol.Collection} - */ -ol3.Collection; - - -/** - * @typedef {Array.|ol.Coordinate|{x: number, y: number}} - */ -ol3.Coordinate; - - -/** - * @typedef {{center: (ol3.Coordinate|undefined), - * layers: (ol3.Collection|undefined), - * renderTo: (Element|string|undefined), - * resolution: (number|undefined), - * zoom: (number|undefined)}} - */ -ol3.MapOptions; - - -/** - * @typedef {Object|ol.Object} - */ -ol3.Object; - - -/** - * @typedef {ol.Projection|string} - */ -ol3.Projection; - - -/** - * @param {ol3.Collection} collection Collection. - * @return {ol.Collection} Collection. - */ -ol3.collection = function(collection) { - if (collection instanceof ol.Collection) { - return collection; - } else if (goog.isArray(collection)) { - var array = /** @type {Array} */ collection; - return new ol.Collection(collection); - } else { - return null; - } -}; -goog.exportProperty(ol3, 'collection', ol3.collection); - - -/** - * @param {ol3.Coordinate} coordinate Coordinate. - * @return {ol.Coordinate} Coordinate. - */ -ol3.coordinate = function(coordinate) { - if (coordinate instanceof ol.Coordinate) { - return coordinate; - } else if (goog.isArray(coordinate)) { - var array = /** @type {Array.} */ coordinate; - return new ol.Coordinate(array[1], array[0]); - } else if (goog.isObject(coordinate)) { - var object = /** @type {{x: number, y: number}} */ coordinate; - return new ol.Coordinate(object.x, object.y); - } else { - return null; - } -}; -goog.exportProperty(ol3, 'coordinate', ol3.coordinate); - - -goog.exportProperty(ol3, 'layer', ol3.layer); - - -/** - * @return {ol.Layer} Layer. - */ -ol3.layer.osm = function() { - return new ol.layer.OpenStreetMap(); -}; -goog.exportProperty(ol3.layer, 'osm', ol3.layer.osm); - - -/** - * @param {ol3.MapOptions=} opt_mapOptions Options. - * @return {ol.Map} Map. - */ -ol3.map = function(opt_mapOptions) { - var options = opt_mapOptions || {}; - var center = ol3.coordinate(/** @type {ol3.Coordinate} */ - (goog.object.get(options, 'center', null))); - var layers = ol3.collection(/** @type {ol3.Collection} */ - (goog.object.get(options, 'layers', null))); - var projection = ol3.projection(/** @type {ol3.Projection} */ - (goog.object.get(options, 'projection', 'EPSG:3857'))); - var resolution = /** @type {number|undefined} */ - goog.object.get(options, 'resolution'); - if (!goog.isDef(resolution) && goog.object.containsKey(options, 'zoom')) { - var zoom = /** @type {number} */ goog.object.get(options, 'zoom'); - resolution = ol.Projection.EPSG_3857_HALF_SIZE / (128 << zoom); - } - var target = goog.dom.getElement(/** @type {Element|string} */ - (goog.object.get(options, 'renderTo', 'map'))); - var userProjection = ol3.projection(/** @type {ol3.Projection} */ - (goog.object.get(options, 'userProjection', 'EPSG:4326'))); - var map = ol.createMap(target, { - 'layers': layers, - 'projection': projection, - 'resolution': resolution, - 'userProjection': userProjection - }); - if (!goog.isNull(center)) { - map.setUserCenter(center); - } - return map; -}; -goog.exportProperty(ol3, 'map', ol3.map); - - -/** - * @param {ol3.Object} object Object. - * @return {ol.Object} Object. - */ -ol3.object = function(object) { - if (object instanceof ol.Object) { - return object; - } else if (goog.isObject(object)) { - var values = /** @type {Object} */ object; - return new ol.Object(values); - } else { - return null; - } -}; -goog.exportProperty(ol3, 'object', ol3.object); - - -/** - * @param {ol3.Projection} projection Projection. - * @return {ol.Projection} Projection. - */ -ol3.projection = function(projection) { - if (projection instanceof ol.Projection) { - return projection; - } else if (goog.isString(projection)) { - var code = /** @type {string} */ projection; - return ol.Projection.getFromCode(code); - } else { - return null; - } -}; -goog.exportProperty(ol3, 'projection', ol3.projection); diff --git a/src/ol/base/array_test.js b/src/ol/base/array_test.js deleted file mode 100644 index 168f9e6639..0000000000 --- a/src/ol/base/array_test.js +++ /dev/null @@ -1,46 +0,0 @@ -goog.require('goog.testing.jsunit'); -goog.require('ol.array'); - - -function testBinaryFindNearest() { - var arr = [1000, 500, 100]; - - assertEquals(0, ol.array.binaryFindNearest(arr, 10000)); - assertEquals(0, ol.array.binaryFindNearest(arr, 1000)); - assertEquals(0, ol.array.binaryFindNearest(arr, 900)); - - assertEquals(1, ol.array.binaryFindNearest(arr, 750)); - - assertEquals(1, ol.array.binaryFindNearest(arr, 550)); - assertEquals(1, ol.array.binaryFindNearest(arr, 500)); - assertEquals(1, ol.array.binaryFindNearest(arr, 450)); - - assertEquals(2, ol.array.binaryFindNearest(arr, 300)); - - assertEquals(2, ol.array.binaryFindNearest(arr, 200)); - assertEquals(2, ol.array.binaryFindNearest(arr, 100)); - assertEquals(2, ol.array.binaryFindNearest(arr, 50)); - -} - - -function testLinearFindNearest() { - var arr = [1000, 500, 100]; - - assertEquals(0, ol.array.linearFindNearest(arr, 10000)); - assertEquals(0, ol.array.linearFindNearest(arr, 1000)); - assertEquals(0, ol.array.linearFindNearest(arr, 900)); - - assertEquals(1, ol.array.linearFindNearest(arr, 750)); - - assertEquals(1, ol.array.linearFindNearest(arr, 550)); - assertEquals(1, ol.array.linearFindNearest(arr, 500)); - assertEquals(1, ol.array.linearFindNearest(arr, 450)); - - assertEquals(2, ol.array.linearFindNearest(arr, 300)); - - assertEquals(2, ol.array.linearFindNearest(arr, 200)); - assertEquals(2, ol.array.linearFindNearest(arr, 100)); - assertEquals(2, ol.array.linearFindNearest(arr, 50)); - -} diff --git a/src/ol/base/attribution.js b/src/ol/base/attribution.js deleted file mode 100644 index acf59930e3..0000000000 --- a/src/ol/base/attribution.js +++ /dev/null @@ -1,58 +0,0 @@ -goog.provide('ol.Attribution'); - -goog.require('ol.CoverageArea'); -goog.require('ol.Projection'); - - - -/** - * @constructor - * @param {string} html HTML. - * @param {Array.=} opt_coverageAreas Coverage areas. - * @param {ol.Projection=} opt_projection Projection. - */ -ol.Attribution = function(html, opt_coverageAreas, opt_projection) { - - /** - * @private - * @type {string} - */ - this.html_ = html; - - /** - * @private - * @type {Array.} - */ - this.coverageAreas_ = opt_coverageAreas || null; - - /** - * @private - * @type {ol.Projection} - */ - this.projection_ = opt_projection || null; - -}; - - -/** - * @return {Array.} Coverage areas. - */ -ol.Attribution.prototype.getCoverageAreas = function() { - return this.coverageAreas_; -}; - - -/** - * @return {string} HTML. - */ -ol.Attribution.prototype.getHtml = function() { - return this.html_; -}; - - -/** - * @return {ol.Projection} Projection. - */ -ol.Attribution.prototype.getProjection = function() { - return this.projection_; -}; diff --git a/src/ol/base/coordinate.js b/src/ol/base/coordinate.js deleted file mode 100644 index f9521a1b11..0000000000 --- a/src/ol/base/coordinate.js +++ /dev/null @@ -1,31 +0,0 @@ -goog.provide('ol.Coordinate'); - -goog.require('goog.math.Vec2'); - - - -/** - * @constructor - * @extends {goog.math.Vec2} - * @param {number} x X. - * @param {number} y Y. - */ -ol.Coordinate = function(x, y) { - goog.base(this, x, y); -}; -goog.inherits(ol.Coordinate, goog.math.Vec2); - - -/** - * @const - * @type {ol.Coordinate} - */ -ol.Coordinate.ZERO = new ol.Coordinate(0, 0); - - -/** - * @return {ol.Coordinate} Clone. - */ -ol.Coordinate.prototype.clone = function() { - return new ol.Coordinate(this.x, this.y); -}; diff --git a/src/ol/base/coveragearea.js b/src/ol/base/coveragearea.js deleted file mode 100644 index 491028e7cb..0000000000 --- a/src/ol/base/coveragearea.js +++ /dev/null @@ -1,45 +0,0 @@ -goog.provide('ol.CoverageArea'); - -goog.require('ol.Extent'); - - - -/** - * @constructor - * @param {ol.Extent} extent Extent. - */ -ol.CoverageArea = function(extent) { - - /** - * @type {ol.Extent} - */ - this.extent = extent; - -}; - - -/** - * @param {ol.Extent} extent Extent. - * @return {boolean} Intersects. - */ -ol.CoverageArea.prototype.intersectsExtent = function(extent) { - return this.extent.intersects(extent); -}; - - -/** - * @param {ol.Extent} extent Extent. - * @param {number} resolution Resolution. - * @return {boolean} Intersects. - */ -ol.CoverageArea.prototype.intersectsExtentAndResolution = goog.abstractMethod; - - -/** - * @param {ol.TransformFunction} transformFn Transform. - * @return {ol.CoverageArea} Transformed coverage area. - */ -ol.CoverageArea.prototype.transform = function(transformFn) { - var extent = this.extent.transform(transformFn); - return new ol.CoverageArea(extent); -}; diff --git a/src/ol/base/createmap.js b/src/ol/base/createmap.js deleted file mode 100644 index ae2cbdc7f7..0000000000 --- a/src/ol/base/createmap.js +++ /dev/null @@ -1,153 +0,0 @@ -goog.provide('ol.RendererHint'); -goog.provide('ol.createMap'); - -goog.require('goog.object'); -goog.require('ol.Collection'); -goog.require('ol.Map'); -goog.require('ol.MapProperty'); -goog.require('ol.Projection'); -goog.require('ol.dom'); -goog.require('ol.dom.MapRenderer'); -goog.require('ol.interaction.AltDragRotate'); -goog.require('ol.interaction.CenterConstraint'); -goog.require('ol.interaction.Constraints'); -goog.require('ol.interaction.DblClickZoom'); -goog.require('ol.interaction.DragPan'); -goog.require('ol.interaction.KeyboardPan'); -goog.require('ol.interaction.KeyboardZoom'); -goog.require('ol.interaction.MouseWheelZoom'); -goog.require('ol.interaction.ResolutionConstraint'); -goog.require('ol.interaction.RotationConstraint'); -goog.require('ol.interaction.ShiftDragZoom'); -goog.require('ol.webgl'); -goog.require('ol.webgl.MapRenderer'); - - -/** - * @define {string} Default projection code. - */ -ol.DEFAULT_PROJECTION_CODE = 'EPSG:3857'; - - -/** - * @define {string} Default user projection code. - */ -ol.DEFAULT_USER_PROJECTION_CODE = 'EPSG:4326'; - - -/** - * @define {boolean} Whether to enable DOM. - */ -ol.ENABLE_DOM = true; - - -/** - * @define {boolean} Whether to enable WebGL. - */ -ol.ENABLE_WEBGL = true; - - -/** - * @enum {string} - */ -ol.RendererHint = { - DOM: 'dom', - WEBGL: 'webgl' -}; - - -/** - * @type {Array.} - */ -ol.DEFAULT_RENDERER_HINT = [ - ol.RendererHint.WEBGL, - ol.RendererHint.DOM -]; - - -/** - * @param {Element} target Target. - * @param {Object.=} opt_values Values. - * @param {ol.RendererHint|Array.=} opt_rendererHints - * Renderer hints. - * @return {ol.Map} Map. - */ -ol.createMap = function(target, opt_values, opt_rendererHints) { - - var values = {}; - if (goog.isDef(opt_values)) { - goog.object.extend(values, opt_values); - } - - // FIXME this should be a configuration option - var centerConstraint = ol.interaction.CenterConstraint.snapToPixel; - var resolutionConstraint = - ol.interaction.ResolutionConstraint.createSnapToPower( - Math.exp(Math.log(2) / 8), ol.Projection.EPSG_3857_HALF_SIZE / 128); - var rotationConstraint = ol.interaction.RotationConstraint.none; - var constraints = new ol.interaction.Constraints( - centerConstraint, resolutionConstraint, rotationConstraint); - - if (!goog.object.containsKey(values, ol.MapProperty.INTERACTIONS)) { - var interactions = new ol.Collection(); - interactions.push(new ol.interaction.AltDragRotate(constraints)); - interactions.push(new ol.interaction.DblClickZoom(constraints)); - interactions.push(new ol.interaction.DragPan(constraints)); - interactions.push(new ol.interaction.KeyboardPan(constraints, 16)); - interactions.push(new ol.interaction.KeyboardZoom(constraints)); - interactions.push(new ol.interaction.MouseWheelZoom(constraints)); - interactions.push(new ol.interaction.ShiftDragZoom(constraints)); - values[ol.MapProperty.INTERACTIONS] = interactions; - } - - if (!goog.object.containsKey(values, ol.MapProperty.LAYERS)) { - values[ol.MapProperty.LAYERS] = new ol.Collection(); - } - - if (!goog.object.containsKey(values, ol.MapProperty.PROJECTION)) { - values[ol.MapProperty.PROJECTION] = - ol.Projection.getFromCode(ol.DEFAULT_PROJECTION_CODE); - } - - if (!goog.object.containsKey(values, ol.MapProperty.USER_PROJECTION)) { - values[ol.MapProperty.USER_PROJECTION] = - ol.Projection.getFromCode(ol.DEFAULT_USER_PROJECTION_CODE); - } - - /** - * @type {Array.} - */ - var rendererHints; - if (goog.isDef(opt_rendererHints)) { - if (goog.isArray(opt_rendererHints)) { - rendererHints = opt_rendererHints; - } else { - rendererHints = [opt_rendererHints]; - } - } else { - rendererHints = ol.DEFAULT_RENDERER_HINT; - } - - var i, rendererHint, rendererConstructor; - for (i = 0; i < rendererHints.length; ++i) { - rendererHint = rendererHints[i]; - if (rendererHint == ol.RendererHint.DOM) { - if (ol.ENABLE_DOM && ol.dom.isSupported()) { - rendererConstructor = ol.dom.MapRenderer; - break; - } - } else if (rendererHint == ol.RendererHint.WEBGL) { - if (ol.ENABLE_WEBGL && ol.webgl.isSupported()) { - rendererConstructor = ol.webgl.MapRenderer; - break; - } - } - } - - if (goog.isDef(rendererConstructor)) { - return new ol.Map(target, rendererConstructor, values); - } else { - return null; - } - -}; diff --git a/src/ol/base/extent.js b/src/ol/base/extent.js deleted file mode 100644 index dc6288ae7b..0000000000 --- a/src/ol/base/extent.js +++ /dev/null @@ -1,59 +0,0 @@ -goog.provide('ol.Extent'); - -goog.require('ol.Coordinate'); -goog.require('ol.Rectangle'); -goog.require('ol.TransformFunction'); - - - -/** - * @constructor - * @extends {ol.Rectangle} - * @param {number} minX Minimum X. - * @param {number} minY Minimum Y. - * @param {number} maxX Maximum X. - * @param {number} maxY Maximum Y. - */ -ol.Extent = function(minX, minY, maxX, maxY) { - goog.base(this, minX, minY, maxX, maxY); -}; -goog.inherits(ol.Extent, ol.Rectangle); - - -/** - * @param {...ol.Coordinate} var_args Coordinates. - * @return {!ol.Extent} Bounding extent. - */ -ol.Extent.boundingExtent = function(var_args) { - var coordinate0 = arguments[0]; - var extent = new ol.Extent(coordinate0.x, coordinate0.y, - coordinate0.x, coordinate0.y); - var i; - for (i = 1; i < arguments.length; ++i) { - var coordinate = arguments[i]; - extent.minX = Math.min(extent.minX, coordinate.x); - extent.minY = Math.min(extent.minY, coordinate.y); - extent.maxX = Math.max(extent.maxX, coordinate.x); - extent.maxY = Math.max(extent.maxY, coordinate.y); - } - return extent; -}; - - -/** - * @return {ol.Extent} Extent. - */ -ol.Extent.prototype.clone = function() { - return new ol.Extent(this.minX, this.minY, this.maxX, this.maxY); -}; - - -/** - * @param {ol.TransformFunction} transformFn Transform function. - * @return {ol.Extent} Extent. - */ -ol.Extent.prototype.transform = function(transformFn) { - var min = transformFn(new ol.Coordinate(this.minX, this.minY)); - var max = transformFn(new ol.Coordinate(this.maxX, this.maxY)); - return new ol.Extent(min.x, min.y, max.x, max.y); -}; diff --git a/src/ol/base/layer.js b/src/ol/base/layer.js deleted file mode 100644 index a642fe34a3..0000000000 --- a/src/ol/base/layer.js +++ /dev/null @@ -1,228 +0,0 @@ -goog.provide('ol.Layer'); -goog.provide('ol.LayerProperty'); - -goog.require('goog.math'); -goog.require('ol.Object'); -goog.require('ol.Store'); - - -/** - * @enum {string} - */ -ol.LayerProperty = { - BRIGHTNESS: 'brightness', - CONTRAST: 'contrast', - HUE: 'hue', - OPACITY: 'opacity', - SATURATION: 'saturation', - VISIBLE: 'visible' -}; - - - -/** - * @constructor - * @extends {ol.Object} - * @param {ol.Store} store Store. - * @param {Object.=} opt_values Values. - */ -ol.Layer = function(store, opt_values) { - - goog.base(this); - - /** - * @private - * @type {ol.Store} - */ - this.store_ = store; - - this.setBrightness(0); - this.setContrast(0); - this.setHue(0); - this.setOpacity(1); - this.setSaturation(0); - this.setVisible(true); - - if (goog.isDef(opt_values)) { - this.setValues(opt_values); - } - -}; -goog.inherits(ol.Layer, ol.Object); - - -/** - * @return {number} Brightness. - */ -ol.Layer.prototype.getBrightness = function() { - return /** @type {number} */ this.get(ol.LayerProperty.BRIGHTNESS); -}; -goog.exportProperty( - ol.Layer.prototype, - 'getBrightness', - ol.Layer.prototype.getBrightness); - - -/** - * @return {number} Contrast. - */ -ol.Layer.prototype.getContrast = function() { - return /** @type {number} */ this.get(ol.LayerProperty.CONTRAST); -}; -goog.exportProperty( - ol.Layer.prototype, - 'getContrast', - ol.Layer.prototype.getContrast); - - -/** - * @return {number} Hue. - */ -ol.Layer.prototype.getHue = function() { - return /** @type {number} */ this.get(ol.LayerProperty.HUE); -}; -goog.exportProperty( - ol.Layer.prototype, - 'getHue', - ol.Layer.prototype.getHue); - - -/** - * @return {number} Opacity. - */ -ol.Layer.prototype.getOpacity = function() { - return /** @type {number} */ this.get(ol.LayerProperty.OPACITY); -}; -goog.exportProperty( - ol.Layer.prototype, - 'getOpacity', - ol.Layer.prototype.getOpacity); - - -/** - * @return {number} Saturation. - */ -ol.Layer.prototype.getSaturation = function() { - return /** @type {number} */ this.get(ol.LayerProperty.SATURATION); -}; -goog.exportProperty( - ol.Layer.prototype, - 'getSaturation', - ol.Layer.prototype.getSaturation); - - -/** - * @return {ol.Store} Store. - */ -ol.Layer.prototype.getStore = function() { - return this.store_; -}; - - -/** - * @return {boolean} Visible. - */ -ol.Layer.prototype.getVisible = function() { - return /** @type {boolean} */ this.get(ol.LayerProperty.VISIBLE); -}; -goog.exportProperty( - ol.Layer.prototype, - 'getVisible', - ol.Layer.prototype.getVisible); - - -/** - * @return {boolean} Is ready. - */ -ol.Layer.prototype.isReady = function() { - return this.getStore().isReady(); -}; - - -/** - * @param {number} brightness Brightness. - */ -ol.Layer.prototype.setBrightness = function(brightness) { - brightness = goog.math.clamp(brightness, -1, 1); - if (brightness != this.getBrightness()) { - this.set(ol.LayerProperty.BRIGHTNESS, brightness); - } -}; -goog.exportProperty( - ol.Layer.prototype, - 'setBrightness', - ol.Layer.prototype.setBrightness); - - -/** - * @param {number} contrast Contrast. - */ -ol.Layer.prototype.setContrast = function(contrast) { - contrast = goog.math.clamp(contrast, -1, 1); - if (contrast != this.getContrast()) { - this.set(ol.LayerProperty.CONTRAST, contrast); - } -}; -goog.exportProperty( - ol.Layer.prototype, - 'setContrast', - ol.Layer.prototype.setContrast); - - -/** - * @param {number} hue Hue. - */ -ol.Layer.prototype.setHue = function(hue) { - if (hue != this.getHue()) { - this.set(ol.LayerProperty.HUE, hue); - } -}; -goog.exportProperty( - ol.Layer.prototype, - 'setHue', - ol.Layer.prototype.setHue); - - -/** - * @param {number} opacity Opacity. - */ -ol.Layer.prototype.setOpacity = function(opacity) { - opacity = goog.math.clamp(opacity, 0, 1); - if (opacity != this.getOpacity()) { - this.set(ol.LayerProperty.OPACITY, opacity); - } -}; -goog.exportProperty( - ol.Layer.prototype, - 'setOpacity', - ol.Layer.prototype.setOpacity); - - -/** - * @param {number} saturation Saturation. - */ -ol.Layer.prototype.setSaturation = function(saturation) { - saturation = goog.math.clamp(saturation, -1, 1); - if (saturation != this.getSaturation()) { - this.set(ol.LayerProperty.SATURATION, saturation); - } -}; -goog.exportProperty( - ol.Layer.prototype, - 'setSaturation', - ol.Layer.prototype.setSaturation); - - -/** - * @param {boolean} visible Visible. - */ -ol.Layer.prototype.setVisible = function(visible) { - visible = !!visible; - if (visible != this.getVisible()) { - this.set(ol.LayerProperty.VISIBLE, visible); - } -}; -goog.exportProperty( - ol.Layer.prototype, - 'setVisible', - ol.Layer.prototype.setVisible); diff --git a/src/ol/base/layerrenderer.js b/src/ol/base/layerrenderer.js deleted file mode 100644 index cfbcfff4b6..0000000000 --- a/src/ol/base/layerrenderer.js +++ /dev/null @@ -1,127 +0,0 @@ -goog.provide('ol.LayerRenderer'); - -goog.require('goog.events'); -goog.require('goog.events.EventType'); -goog.require('ol.Layer'); -goog.require('ol.LayerProperty'); -goog.require('ol.Object'); - - - -/** - * @constructor - * @extends {ol.Object} - * @param {ol.MapRenderer} mapRenderer Map renderer. - * @param {ol.Layer} layer Layer. - */ -ol.LayerRenderer = function(mapRenderer, layer) { - - goog.base(this); - - /** - * @private - * @type {ol.MapRenderer} - */ - this.mapRenderer_ = mapRenderer; - - /** - * @private - * @type {ol.Layer} - */ - this.layer_ = layer; - - goog.events.listen(this.layer_, - ol.Object.getChangedEventType(ol.LayerProperty.BRIGHTNESS), - this.handleLayerBrightnessChange, false, this); - - goog.events.listen(this.layer_, - ol.Object.getChangedEventType(ol.LayerProperty.CONTRAST), - this.handleLayerContrastChange, false, this); - - goog.events.listen(this.layer_, - ol.Object.getChangedEventType(ol.LayerProperty.HUE), - this.handleLayerHueChange, false, this); - - goog.events.listen(this.layer_, goog.events.EventType.LOAD, - this.handleLayerLoad, false, this); - - goog.events.listen(this.layer_, - ol.Object.getChangedEventType(ol.LayerProperty.OPACITY), - this.handleLayerOpacityChange, false, this); - - goog.events.listen(this.layer_, - ol.Object.getChangedEventType(ol.LayerProperty.SATURATION), - this.handleLayerSaturationChange, false, this); - - goog.events.listen(this.layer_, - ol.Object.getChangedEventType(ol.LayerProperty.VISIBLE), - this.handleLayerVisibleChange, false, this); - -}; -goog.inherits(ol.LayerRenderer, ol.Object); - - -/** - * @return {ol.Layer} Layer. - */ -ol.LayerRenderer.prototype.getLayer = function() { - return this.layer_; -}; - - -/** - * @return {ol.Map} Map. - */ -ol.LayerRenderer.prototype.getMap = function() { - return this.mapRenderer_.getMap(); -}; - - -/** - * @return {ol.MapRenderer} Map renderer. - */ -ol.LayerRenderer.prototype.getMapRenderer = function() { - return this.mapRenderer_; -}; - - -/** - * @protected - */ -ol.LayerRenderer.prototype.handleLayerBrightnessChange = goog.nullFunction; - - -/** - * @protected - */ -ol.LayerRenderer.prototype.handleLayerContrastChange = goog.nullFunction; - - -/** - * @protected - */ -ol.LayerRenderer.prototype.handleLayerHueChange = goog.nullFunction; - - -/** - * @protected - */ -ol.LayerRenderer.prototype.handleLayerLoad = goog.nullFunction; - - -/** - * @protected - */ -ol.LayerRenderer.prototype.handleLayerOpacityChange = goog.nullFunction; - - -/** - * @protected - */ -ol.LayerRenderer.prototype.handleLayerSaturationChange = goog.nullFunction; - - -/** - * @protected - */ -ol.LayerRenderer.prototype.handleLayerVisibleChange = goog.nullFunction; diff --git a/src/ol/base/pixel.js b/src/ol/base/pixel.js deleted file mode 100644 index f799214b06..0000000000 --- a/src/ol/base/pixel.js +++ /dev/null @@ -1,24 +0,0 @@ -goog.provide('ol.Pixel'); - -goog.require('goog.math.Coordinate'); - - - -/** - * @constructor - * @extends {goog.math.Coordinate} - * @param {number} x X. - * @param {number} y Y. - */ -ol.Pixel = function(x, y) { - goog.base(this, x, y); -}; -goog.inherits(ol.Pixel, goog.math.Coordinate); - - -/** - * @return {ol.Pixel} Clone. - */ -ol.Pixel.prototype.clone = function() { - return new ol.Pixel(this.x, this.y); -}; diff --git a/src/ol/base/projection.js b/src/ol/base/projection.js deleted file mode 100644 index 5a88da9603..0000000000 --- a/src/ol/base/projection.js +++ /dev/null @@ -1,500 +0,0 @@ -goog.provide('ol.Projection'); - -goog.require('goog.array'); -goog.require('goog.asserts'); -goog.require('goog.object'); -goog.require('ol.Coordinate'); -goog.require('ol.Extent'); -goog.require('ol.TransformFunction'); - - -/** - * @define {boolean} Enable Proj4js. - */ -ol.ENABLE_PROJ4JS = true; - - -/** - * @enum {string} - */ -ol.ProjectionUnits = { - DEGREES: 'degrees', - METERS: 'm' -}; - - - -/** - * @constructor - * @param {string} code Code. - * @param {ol.ProjectionUnits} units Units. - * @param {ol.Extent} extent Extent. - */ -ol.Projection = function(code, units, extent) { - - /** - * @private - * @type {string} - */ - this.code_ = code; - - /** - * @private - * @type {ol.ProjectionUnits} - */ - this.units_ = units; - - /** - * @private - * @type {ol.Extent} - */ - this.extent_ = extent; - -}; - - -/** - * @return {string} Code. - */ -ol.Projection.prototype.getCode = function() { - return this.code_; -}; - - -/** - * @return {ol.Extent} Extent. - */ -ol.Projection.prototype.getExtent = function() { - return this.extent_; -}; - - -/** - * @return {ol.ProjectionUnits} Units. - */ -ol.Projection.prototype.getUnits = function() { - return this.units_; -}; - - - -/** - * @constructor - * @extends {ol.Projection} - * @param {string} code Code. - * @param {Proj4js.Proj} proj4jsProj Proj4js projection. - */ -ol.Proj4jsProjection = function(code, proj4jsProj) { - - var units = /** @type {ol.ProjectionUnits} */ proj4jsProj.units; - - goog.base(this, code, units, null); - - /** - * @private - * @type {Proj4js.Proj} - */ - this.proj4jsProj_ = proj4jsProj; - -}; -goog.inherits(ol.Proj4jsProjection, ol.Projection); - - -/** - * @return {Proj4js.Proj} Proj4js projection. - */ -ol.Proj4jsProjection.prototype.getProj4jsProj = function() { - return this.proj4jsProj_; -}; - - -/** - * @private - * @type {Object.} - */ -ol.Projection.proj4jsProjections_ = {}; - - -/** - * @private - * @type {Object.} - */ -ol.Projection.projections_ = {}; - - -/** - * @private - * @type {Object.>} - */ -ol.Projection.transforms_ = {}; - - -/** - * @param {Array.} projections Projections. - * @private - */ -ol.Projection.addEquivalentProjections_ = function(projections) { - ol.Projection.addProjections(projections); - goog.array.forEach(projections, function(source) { - goog.array.forEach(projections, function(destination) { - ol.Projection.addTransform( - source, destination, ol.Projection.cloneTransform); - }); - }); -}; - - -/** - * @param {Array.} projections1 Projections. - * @param {Array.} projections2 Projections. - * @param {ol.TransformFunction} forwardTransform Forward transform. - * @param {ol.TransformFunction} inverseTransform Inverse transform. - * @private - */ -ol.Projection.addEquivalentTransforms_ = - function(projections1, projections2, forwardTransform, inverseTransform) { - goog.array.forEach(projections1, function(projection1) { - goog.array.forEach(projections2, function(projection2) { - ol.Projection.addTransform(projection1, projection2, forwardTransform); - ol.Projection.addTransform(projection2, projection1, inverseTransform); - }); - }); -}; - - -/** - * @param {ol.Proj4jsProjection} proj4jsProjection Proj4js projection. - */ -ol.Projection.addProj4jsProjection = function(proj4jsProjection) { - var proj4jsProjections = ol.Projection.proj4jsProjections_; - var code = proj4jsProjection.getCode(); - goog.asserts.assert(!goog.object.containsKey(proj4jsProjections, code)); - proj4jsProjections[code] = proj4jsProjection; -}; - - -/** - * @param {ol.Projection} projection Projection. - */ -ol.Projection.addProjection = function(projection) { - var projections = ol.Projection.projections_; - var code = projection.getCode(); - goog.asserts.assert(!goog.object.containsKey(projections, code)); - projections[code] = projection; -}; - - -/** - * @param {Array.} projections Projections. - */ -ol.Projection.addProjections = function(projections) { - goog.array.forEach(projections, function(projection) { - ol.Projection.addProjection(projection); - }); -}; - - -/** - * @param {ol.Projection} source Source. - * @param {ol.Projection} destination Destination. - * @param {ol.TransformFunction} transformFn Transform. - */ -ol.Projection.addTransform = function(source, destination, transformFn) { - var projections = ol.Projection.projections_; - var sourceCode = source.getCode(); - var destinationCode = destination.getCode(); - var transforms = ol.Projection.transforms_; - if (!goog.object.containsKey(transforms, sourceCode)) { - transforms[sourceCode] = {}; - } - goog.asserts.assert( - !goog.object.containsKey(transforms[sourceCode], destinationCode)); - transforms[sourceCode][destinationCode] = transformFn; -}; - - -/** - * @param {string} code Code. - * @return {ol.Projection} Projection. - */ -ol.Projection.getFromCode = function(code) { - var projection = ol.Projection.projections_[code]; - if (ol.Projection.isProj4jsSupported() && !goog.isDef(projection)) { - projection = ol.Projection.getProj4jsProjectionFromCode_(code); - } - if (!goog.isDef(projection)) { - goog.asserts.assert(goog.isDef(projection)); - projection = null; - } - return projection; -}; - - -/** - * @param {string} code Code. - * @private - * @return {ol.Proj4jsProjection} Proj4js projection. - */ -ol.Projection.getProj4jsProjectionFromCode_ = function(code) { - var proj4jsProjections = ol.Projection.proj4jsProjections_; - var proj4jsProjection = proj4jsProjections[code]; - if (!goog.isDef(proj4jsProjection)) { - var proj4jsProj = new Proj4js.Proj(code); - proj4jsProjection = new ol.Proj4jsProjection(code, proj4jsProj); - proj4jsProjections[code] = proj4jsProjection; - } - return proj4jsProjection; -}; - - -/** - * @param {ol.Projection} projection1 Projection 1. - * @param {ol.Projection} projection2 Projection 2. - * @return {boolean} Equivalent. - */ -ol.Projection.equivalent = function(projection1, projection2) { - if (projection1 === projection2) { - return true; - } else if (projection1.getUnits() != projection2.getUnits()) { - return false; - } else { - var transformFn = ol.Projection.getTransform(projection1, projection2); - return transformFn === ol.Projection.cloneTransform; - } -}; - - -/** - * @param {ol.Projection} source Source. - * @param {ol.Projection} destination Destination. - * @return {ol.TransformFunction} Transform. - */ -ol.Projection.getTransform = function(source, destination) { - var transforms = ol.Projection.transforms_; - var sourceCode = source.getCode(); - var destinationCode = destination.getCode(); - var transform; - if (goog.object.containsKey(transforms, sourceCode) && - goog.object.containsKey(transforms[sourceCode], destinationCode)) { - transform = transforms[sourceCode][destinationCode]; - } - if (ol.Projection.isProj4jsSupported() && !goog.isDef(transform)) { - var proj4jsSource; - if (source instanceof ol.Proj4jsProjection) { - proj4jsSource = source; - } else { - proj4jsSource = - ol.Projection.getProj4jsProjectionFromCode_(source.getCode()); - } - var sourceProj4jsProj = proj4jsSource.getProj4jsProj(); - var proj4jsDestination; - if (destination instanceof ol.Proj4jsProjection) { - proj4jsDestination = destination; - } else { - proj4jsDestination = - ol.Projection.getProj4jsProjectionFromCode_(source.getCode()); - } - var destinationProj4jsProj = proj4jsDestination.getProj4jsProj(); - transform = - /** - * @param {ol.Coordinate} coordinate Coordinate. - * @return {ol.Coordinate} Coordinate. - */ - function(coordinate) { - var proj4jsPoint = new Proj4js.Point(coordinate.x, coordinate.y); - proj4jsPoint = Proj4js.transform( - sourceProj4jsProj, destinationProj4jsProj, proj4jsPoint); - return new ol.Coordinate(proj4jsPoint.x, proj4jsPoint.y); - }; - ol.Projection.addTransform(source, destination, transform); - } - if (!goog.isDef(transform)) { - goog.asserts.assert(goog.isDef(transform)); - transform = ol.Projection.identityTransform; - } - return transform; -}; - - -/** - * @param {string} sourceCode Source code. - * @param {string} destinationCode Destination code. - * @return {ol.TransformFunction} Transform. - */ -ol.Projection.getTransformFromCodes = function(sourceCode, destinationCode) { - var source = ol.Projection.getFromCode(sourceCode); - var destination = ol.Projection.getFromCode(destinationCode); - return ol.Projection.getTransform(source, destination); -}; - - -/** - * @return {boolean} Has Proj4js. - */ -ol.Projection.isProj4jsSupported = function() { - return ol.ENABLE_PROJ4JS && 'Proj4js' in goog.global; -}; - - -/** - * @param {ol.Coordinate} point Point. - * @return {ol.Coordinate} Point. - */ -ol.Projection.identityTransform = function(point) { - return point; -}; - - -/** - * @param {ol.Coordinate} point Point. - * @return {ol.Coordinate} Point. - */ -ol.Projection.cloneTransform = function(point) { - return point.clone(); -}; - - -/** - * @param {ol.Coordinate} point Point. - * @param {ol.Projection} source Source. - * @param {ol.Projection} destination Destination. - * @return {ol.Coordinate} Point. - */ -ol.Projection.transform = function(point, source, destination) { - var transformFn = ol.Projection.getTransform(source, destination); - return transformFn(point); -}; - - -/** - * @param {ol.Coordinate} point Point. - * @param {string} sourceCode Source code. - * @param {string} destinationCode Destination code. - * @return {ol.Coordinate} Point. - */ -ol.Projection.transformWithCodes = - function(point, sourceCode, destinationCode) { - var transformFn = ol.Projection.getTransformFromCodes( - sourceCode, destinationCode); - return transformFn(point); -}; - - -/** - * @const - * @type {number} - */ -ol.Projection.EPSG_3857_RADIUS = 6378137; - - -/** - * @param {ol.Coordinate} point Point. - * @return {ol.Coordinate} Point. - */ -ol.Projection.forwardSphericalMercator = function(point) { - var x = ol.Projection.EPSG_3857_RADIUS * Math.PI * point.x / 180; - var y = ol.Projection.EPSG_3857_RADIUS * - Math.log(Math.tan(Math.PI * (point.y + 90) / 360)); - return new ol.Coordinate(x, y); -}; - - -/** - * @param {ol.Coordinate} point Point. - * @return {ol.Coordinate} Point. - */ -ol.Projection.inverseSphericalMercator = function(point) { - var x = 180 * point.x / (ol.Projection.EPSG_3857_RADIUS * Math.PI); - var y = 360 * Math.atan( - Math.exp(point.y / ol.Projection.EPSG_3857_RADIUS)) / Math.PI - 90; - return new ol.Coordinate(x, y); -}; - - -/** - * @const - * @type {number} - */ -ol.Projection.EPSG_3857_HALF_SIZE = Math.PI * ol.Projection.EPSG_3857_RADIUS; - - -/** - * @const - * @type {ol.Extent} - */ -ol.Projection.EPSG_3857_EXTENT = new ol.Extent( - -ol.Projection.EPSG_3857_HALF_SIZE, - -ol.Projection.EPSG_3857_HALF_SIZE, - ol.Projection.EPSG_3857_HALF_SIZE, - ol.Projection.EPSG_3857_HALF_SIZE); - - -/** - * @private - * @type {Array.} - */ -ol.Projection.EPSG_3857_LIKE_CODES_ = [ - 'EPSG:3857', - 'EPSG:102100', - 'EPSG:102113', - 'EPSG:900913' -]; - - -/** - * @const - * @private - * @type {Array.} - */ -ol.Projection.EPSG_3857_LIKE_PROJECTIONS_ = goog.array.map( - ol.Projection.EPSG_3857_LIKE_CODES_, - function(code) { - return new ol.Projection( - code, - ol.ProjectionUnits.METERS, - ol.Projection.EPSG_3857_EXTENT); - }); - - -/** - * @const - * @private - * @type {ol.Extent} - */ -ol.Projection.EPSG_4326_EXTENT_ = new ol.Extent(-180, -90, 180, 90); - - -/** - * @private - * @type {Array.} - */ -ol.Projection.EPSG_4326_LIKE_CODES_ = [ - 'CRS:84', - 'EPSG:4326', - 'urn:ogc:def:crs:EPSG:6.6:4326' -]; - - -/** - * @const - * @type {Array.} - */ -ol.Projection.EPSG_4326_LIKE_PROJECTIONS = goog.array.map( - ol.Projection.EPSG_4326_LIKE_CODES_, - function(code) { - return new ol.Projection( - code, - ol.ProjectionUnits.DEGREES, - ol.Projection.EPSG_4326_EXTENT_); - }); - - -ol.Projection.addEquivalentProjections_( - ol.Projection.EPSG_3857_LIKE_PROJECTIONS_); -ol.Projection.addEquivalentProjections_( - ol.Projection.EPSG_4326_LIKE_PROJECTIONS); -ol.Projection.addEquivalentTransforms_( - ol.Projection.EPSG_4326_LIKE_PROJECTIONS, - ol.Projection.EPSG_3857_LIKE_PROJECTIONS_, - ol.Projection.forwardSphericalMercator, - ol.Projection.inverseSphericalMercator); diff --git a/src/ol/base/rectangle_test.js b/src/ol/base/rectangle_test.js deleted file mode 100644 index 0eea82c85b..0000000000 --- a/src/ol/base/rectangle_test.js +++ /dev/null @@ -1,142 +0,0 @@ -goog.require('goog.testing.jsunit'); -goog.require('ol.Coordinate'); -goog.require('ol.Rectangle'); - - -function testCenter() { - var rectangle = new ol.Rectangle(1, 2, 3, 4); - var center = rectangle.getCenter(); - assertEquals(2, center.x); - assertEquals(3, center.y); -} - - -function testClone() { - var rectangle = new ol.Rectangle(1, 2, 3, 4); - var clonedRectangle = rectangle.clone(); - assertTrue(clonedRectangle instanceof ol.Rectangle); - assertFalse(clonedRectangle === rectangle); - assertEquals(rectangle.minX, clonedRectangle.minX); - assertEquals(rectangle.minY, clonedRectangle.minY); - assertEquals(rectangle.maxX, clonedRectangle.maxX); - assertEquals(rectangle.maxY, clonedRectangle.maxY); -} - - -function testContainsPositive() { - var rectangle = new ol.Rectangle(1, 2, 3, 4); - assertTrue(rectangle.contains(new ol.Coordinate(1, 2))); - assertTrue(rectangle.contains(new ol.Coordinate(1, 3))); - assertTrue(rectangle.contains(new ol.Coordinate(1, 4))); - assertTrue(rectangle.contains(new ol.Coordinate(2, 2))); - assertTrue(rectangle.contains(new ol.Coordinate(2, 3))); - assertTrue(rectangle.contains(new ol.Coordinate(2, 4))); - assertTrue(rectangle.contains(new ol.Coordinate(3, 2))); - assertTrue(rectangle.contains(new ol.Coordinate(3, 3))); - assertTrue(rectangle.contains(new ol.Coordinate(3, 4))); -} - - -function testContainsNegative() { - var rectangle = new ol.Rectangle(1, 2, 3, 4); - assertFalse(rectangle.contains(new ol.Coordinate(0, 1))); - assertFalse(rectangle.contains(new ol.Coordinate(0, 2))); - assertFalse(rectangle.contains(new ol.Coordinate(0, 3))); - assertFalse(rectangle.contains(new ol.Coordinate(0, 4))); - assertFalse(rectangle.contains(new ol.Coordinate(0, 5))); - assertFalse(rectangle.contains(new ol.Coordinate(1, 1))); - assertFalse(rectangle.contains(new ol.Coordinate(1, 5))); - assertFalse(rectangle.contains(new ol.Coordinate(2, 1))); - assertFalse(rectangle.contains(new ol.Coordinate(2, 5))); - assertFalse(rectangle.contains(new ol.Coordinate(3, 1))); - assertFalse(rectangle.contains(new ol.Coordinate(3, 5))); - assertFalse(rectangle.contains(new ol.Coordinate(4, 1))); - assertFalse(rectangle.contains(new ol.Coordinate(4, 2))); - assertFalse(rectangle.contains(new ol.Coordinate(4, 3))); - assertFalse(rectangle.contains(new ol.Coordinate(4, 4))); - assertFalse(rectangle.contains(new ol.Coordinate(4, 5))); -} - - -function testIntersects() { - - var rectangle1 = new ol.Rectangle(50, 50, 100, 100); - - function assertIntersects(rectangle2) { - assertTrue(rectangle1 + ' expected to intersect ' + rectangle2, - rectangle1.intersects(rectangle2)); - } - function assertNotIntersects(rectangle2) { - assertFalse(rectangle1 + ' expected to not intersect ' + rectangle2, - rectangle1.intersects(rectangle2)); - } - - assertIntersects(rectangle1); - assertIntersects(new ol.Rectangle(20, 20, 80, 80)); - assertIntersects(new ol.Rectangle(20, 50, 80, 100)); - assertIntersects(new ol.Rectangle(20, 80, 80, 120)); - assertIntersects(new ol.Rectangle(50, 20, 100, 80)); - assertIntersects(new ol.Rectangle(50, 80, 100, 120)); - assertIntersects(new ol.Rectangle(80, 20, 120, 80)); - assertIntersects(new ol.Rectangle(80, 50, 120, 100)); - assertIntersects(new ol.Rectangle(80, 80, 120, 120)); - assertIntersects(new ol.Rectangle(20, 20, 120, 120)); - assertIntersects(new ol.Rectangle(70, 70, 80, 80)); - assertNotIntersects(new ol.Rectangle(10, 10, 30, 30)); - assertNotIntersects(new ol.Rectangle(30, 10, 70, 30)); - assertNotIntersects(new ol.Rectangle(50, 10, 100, 30)); - assertNotIntersects(new ol.Rectangle(80, 10, 120, 30)); - assertNotIntersects(new ol.Rectangle(120, 10, 140, 30)); - assertNotIntersects(new ol.Rectangle(10, 30, 30, 70)); - assertNotIntersects(new ol.Rectangle(120, 30, 140, 70)); - assertNotIntersects(new ol.Rectangle(10, 50, 30, 100)); - assertNotIntersects(new ol.Rectangle(120, 50, 140, 100)); - assertNotIntersects(new ol.Rectangle(10, 80, 30, 120)); - assertNotIntersects(new ol.Rectangle(120, 80, 140, 120)); - assertNotIntersects(new ol.Rectangle(10, 120, 30, 140)); - assertNotIntersects(new ol.Rectangle(30, 120, 70, 140)); - assertNotIntersects(new ol.Rectangle(50, 120, 100, 140)); - assertNotIntersects(new ol.Rectangle(80, 120, 120, 140)); - assertNotIntersects(new ol.Rectangle(120, 120, 140, 140)); -} - - -function testSize() { - var rectangle = new ol.Rectangle(0, 1, 2, 4); - var size = rectangle.getSize(); - assertEquals(2, size.width); - assertEquals(3, size.height); -} - - -function testNormalize() { - var rectangle = new ol.Rectangle(0, 1, 2, 3); - var coordinate; - - coordinate = rectangle.normalize(new ol.Coordinate(1, 2)); - assertEquals(0.5, coordinate.x); - assertEquals(0.5, coordinate.y); - - coordinate = rectangle.normalize(new ol.Coordinate(0, 3)); - assertEquals(0, coordinate.x); - assertEquals(1, coordinate.y); - - coordinate = rectangle.normalize(new ol.Coordinate(2, 1)); - assertEquals(1, coordinate.x); - assertEquals(0, coordinate.y); - - coordinate = rectangle.normalize(new ol.Coordinate(0, 0)); - assertEquals(0, coordinate.x); - assertEquals(-0.5, coordinate.y); - - coordinate = rectangle.normalize(new ol.Coordinate(-1, 1)); - assertEquals(-0.5, coordinate.x); - assertEquals(0, coordinate.y); - -} - - -function testToString() { - var rectangle = new ol.Rectangle(0, 1, 2, 3); - assertEquals('(0, 1, 2, 3)', rectangle.toString()); -} diff --git a/src/ol/base/store.js b/src/ol/base/store.js deleted file mode 100644 index 1bc9912a3e..0000000000 --- a/src/ol/base/store.js +++ /dev/null @@ -1,96 +0,0 @@ -goog.provide('ol.Store'); - -goog.require('goog.functions'); -goog.require('ol.Attribution'); -goog.require('ol.Extent'); -goog.require('ol.Projection'); - - - -/** - * @constructor - * @param {ol.Projection} projection Projection. - * @param {ol.Extent=} opt_extent Extent. - * @param {Array.=} opt_attributions Attributions. - */ -ol.Store = function(projection, opt_extent, opt_attributions) { - - /** - * @private - * @type {ol.Projection} - */ - this.projection_ = projection; - - /** - * @private - * @type {ol.Extent} - */ - this.extent_ = opt_extent || projection.getExtent(); - - /** - * @private - * @type {Array.} - */ - this.attributions_ = opt_attributions || null; - -}; - - -/** - * @return {Array.} Attributions. - */ -ol.Store.prototype.getAttributions = function() { - return this.attributions_; -}; - - -/** - * @return {ol.Extent} Extent. - */ -ol.Store.prototype.getExtent = function() { - return this.extent_; -}; - - -/** - * @return {ol.Projection} Projection. - */ -ol.Store.prototype.getProjection = function() { - return this.projection_; -}; - - -/** - * @return {Array.|undefined} Resolutions. - */ -ol.Store.prototype.getResolutions = goog.abstractMethod; - - -/** - * @return {boolean} Is ready. - */ -ol.Store.prototype.isReady = goog.functions.TRUE; - - -/** - * @param {Array.} attributions Attributions. - */ -ol.Store.prototype.setAttributions = function(attributions) { - this.attributions_ = attributions; -}; - - -/** - * @param {ol.Extent} extent Extent. - */ -ol.Store.prototype.setExtent = function(extent) { - this.extent_ = extent; -}; - - -/** - * @param {ol.Projection} projection Projetion. - */ -ol.Store.prototype.setProjection = function(projection) { - this.projection_ = projection; -}; diff --git a/src/ol/base/transformfunction.js b/src/ol/base/transformfunction.js deleted file mode 100644 index a8be2c0f28..0000000000 --- a/src/ol/base/transformfunction.js +++ /dev/null @@ -1,9 +0,0 @@ -goog.provide('ol.TransformFunction'); - -goog.require('ol.Coordinate'); - - -/** - * @typedef {function(ol.Coordinate): ol.Coordinate} - */ -ol.TransformFunction; diff --git a/src/api/collection_test.js b/src/ol/collection_test.js similarity index 59% rename from src/api/collection_test.js rename to src/ol/collection_test.js index cb4a7fa2c0..2e52fcdd91 100644 --- a/src/api/collection_test.js +++ b/src/ol/collection_test.js @@ -1,12 +1,12 @@ goog.require('goog.testing.jsunit'); -goog.require('ol.Collection'); -goog.require('ol3'); +goog.require('ol'); +goog.require('ol3.Collection'); function testCreateFromArray() { var array = [0, 1, 2]; - var collection = ol3.collection(array); - assertTrue(collection instanceof ol.Collection); + var collection = ol.collection(array); + assertTrue(collection instanceof ol3.Collection); assertEquals(3, collection.getLength()); assertEquals(0, collection.getAt(0)); assertEquals(1, collection.getAt(1)); @@ -15,8 +15,8 @@ function testCreateFromArray() { function testCreateFromCollection() { - var collection1 = new ol.Collection(); - var collection2 = ol3.collection(collection1); + var collection1 = new ol3.Collection(); + var collection2 = ol.collection(collection1); assertTrue(collection1 === collection2); } diff --git a/src/ol/control/control.js b/src/ol/control/control.js deleted file mode 100644 index d6b66c1bf1..0000000000 --- a/src/ol/control/control.js +++ /dev/null @@ -1,33 +0,0 @@ -goog.provide('ol.Control'); - -goog.require('ol.Map'); - - - -/** - * @constructor - * @param {ol.Map} map Map. - */ -ol.Control = function(map) { - - /** - * @private - * @type {ol.Map} - */ - this.map_ = map; - -}; - - -/** - * @return {Element} Element. - */ -ol.Control.prototype.getElement = goog.abstractMethod; - - -/** - * @return {ol.Map} Map. - */ -ol.Control.prototype.getMap = function() { - return this.map_; -}; diff --git a/src/ol/dom/layerrenderer.js b/src/ol/dom/layerrenderer.js deleted file mode 100644 index 777da25442..0000000000 --- a/src/ol/dom/layerrenderer.js +++ /dev/null @@ -1,84 +0,0 @@ -goog.provide('ol.dom.LayerRenderer'); - -goog.require('ol.Coordinate'); -goog.require('ol.LayerRenderer'); - - - -/** - * @constructor - * @extends {ol.LayerRenderer} - * @param {ol.MapRenderer} mapRenderer Map renderer. - * @param {ol.Layer} layer Layer. - * @param {!Element} target Target. - */ -ol.dom.LayerRenderer = function(mapRenderer, layer, target) { - goog.base(this, mapRenderer, layer); - - /** - * @type {!Element} - * @protected - */ - this.target = target; - - /** - * Top left corner of the target in map coords. - * - * @type {ol.Coordinate} - * @protected - */ - this.origin = null; - - this.handleLayerOpacityChange(); - this.handleLayerVisibleChange(); - -}; -goog.inherits(ol.dom.LayerRenderer, ol.LayerRenderer); - - -/** - * @override - * @return {ol.MapRenderer} Map renderer. - */ -ol.dom.LayerRenderer.prototype.getMapRenderer = function() { - return /** @type {ol.dom.MapRenderer} */ goog.base(this, 'getMapRenderer'); -}; - - -/** - * @inheritDoc - */ -ol.dom.LayerRenderer.prototype.handleLayerLoad = function() { - this.getMap().render(); -}; - - -/** - * @inheritDoc - */ -ol.dom.LayerRenderer.prototype.handleLayerOpacityChange = function() { - goog.style.setOpacity(this.target, this.getLayer().getOpacity()); -}; - - -/** - * @inheritDoc - */ -ol.dom.LayerRenderer.prototype.handleLayerVisibleChange = function() { - goog.style.showElement(this.target, this.getLayer().getVisible()); -}; - - -/** - */ -ol.dom.LayerRenderer.prototype.render = goog.abstractMethod; - - -/** - * Set the location of the top left corner of the target. - * - * @param {ol.Coordinate} origin Origin. - */ -ol.dom.LayerRenderer.prototype.setOrigin = function(origin) { - this.origin = origin; -}; diff --git a/src/ol/interaction/centerconstraint.js b/src/ol/interaction/centerconstraint.js deleted file mode 100644 index 7532427221..0000000000 --- a/src/ol/interaction/centerconstraint.js +++ /dev/null @@ -1,47 +0,0 @@ -goog.provide('ol.interaction.CenterConstraint'); -goog.provide('ol.interaction.CenterConstraintType'); - -goog.require('ol.Coordinate'); - - -/** - * @typedef {function((ol.Coordinate|undefined), - * (number|undefined), - * ol.Coordinate): (ol.Coordinate|undefined)} - */ -ol.interaction.CenterConstraintType; - - -/** - * @param {ol.Coordinate|undefined} center Center. - * @param {number|undefined} resolution Resolution. - * @param {ol.Coordinate} delta Delta. - * @return {ol.Coordinate|undefined} Center. - */ -ol.interaction.CenterConstraint.none = function(center, resolution, delta) { - if (goog.isDefAndNotNull(center) && goog.isDef(resolution)) { - var x = center.x + delta.x; - var y = center.y + delta.y; - return new ol.Coordinate(x, y); - } else { - return undefined; - } -}; - - -/** - * @param {ol.Coordinate|undefined} center Center. - * @param {number|undefined} resolution Resolution. - * @param {ol.Coordinate} delta Delta. - * @return {ol.Coordinate|undefined} Center. - */ -ol.interaction.CenterConstraint.snapToPixel = - function(center, resolution, delta) { - if (goog.isDefAndNotNull(center) && goog.isDef(resolution)) { - var x = Math.floor((center.x + delta.x) / resolution + 0.5) * resolution; - var y = Math.floor((center.y + delta.y) / resolution + 0.5) * resolution; - return new ol.Coordinate(x, y); - } else { - return undefined; - } -}; diff --git a/src/ol/interaction/constraints.js b/src/ol/interaction/constraints.js deleted file mode 100644 index 4774b7693f..0000000000 --- a/src/ol/interaction/constraints.js +++ /dev/null @@ -1,36 +0,0 @@ -goog.provide('ol.interaction.Constraints'); - -goog.require('ol.interaction.CenterConstraintType'); -goog.require('ol.interaction.ResolutionConstraintType'); -goog.require('ol.interaction.RotationConstraintType'); - - - -/** - * @constructor - * @param {ol.interaction.CenterConstraintType} centerConstraint - * Center constraint. - * @param {ol.interaction.ResolutionConstraintType} resolutionConstraint - * Resolution constraint. - * @param {ol.interaction.RotationConstraintType} rotationConstraint - * Rotation constraint. - */ -ol.interaction.Constraints = - function(centerConstraint, resolutionConstraint, rotationConstraint) { - - /** - * @type {ol.interaction.CenterConstraintType} - */ - this.center = centerConstraint; - - /** - * @type {ol.interaction.ResolutionConstraintType} - */ - this.resolution = resolutionConstraint; - - /** - * @type {ol.interaction.RotationConstraintType} - */ - this.rotation = rotationConstraint; - -}; diff --git a/src/ol/interaction/dragpan.js b/src/ol/interaction/dragpan.js deleted file mode 100644 index 4e7b40ab5b..0000000000 --- a/src/ol/interaction/dragpan.js +++ /dev/null @@ -1,48 +0,0 @@ -goog.provide('ol.interaction.DragPan'); - -goog.require('ol.Coordinate'); -goog.require('ol.MapBrowserEvent'); -goog.require('ol.interaction.Constraints'); -goog.require('ol.interaction.Drag'); - - - -/** - * @constructor - * @extends {ol.interaction.Drag} - * @param {ol.interaction.Constraints} constraints Constraints. - */ -ol.interaction.DragPan = function(constraints) { - goog.base(this, constraints); -}; -goog.inherits(ol.interaction.DragPan, ol.interaction.Drag); - - -/** - * @inheritDoc - */ -ol.interaction.DragPan.prototype.handleDrag = function(mapBrowserEvent) { - var map = mapBrowserEvent.map; - var resolution = map.getResolution(); - var rotation = map.getRotation(); - var delta = - new ol.Coordinate(-resolution * this.deltaX, resolution * this.deltaY); - if (map.canRotate() && goog.isDef(rotation)) { - delta.rotate(rotation); - } - this.pan(map, delta, this.startCenter); -}; - - -/** - * @inheritDoc - */ -ol.interaction.DragPan.prototype.handleDragStart = function(mapBrowserEvent) { - var browserEvent = mapBrowserEvent.browserEvent; - if (!browserEvent.shiftKey) { - browserEvent.preventDefault(); - return true; - } else { - return false; - } -}; diff --git a/src/ol/interaction/shiftdragzoom.js b/src/ol/interaction/shiftdragzoom.js deleted file mode 100644 index ce70e4d0c7..0000000000 --- a/src/ol/interaction/shiftdragzoom.js +++ /dev/null @@ -1,64 +0,0 @@ -// FIXME draw drag box - -goog.provide('ol.interaction.ShiftDragZoom'); - -goog.require('ol.Extent'); -goog.require('ol.MapBrowserEvent'); -goog.require('ol.interaction.Constraints'); -goog.require('ol.interaction.Drag'); - - -/** - * @define {number} Hysterisis pixels. - */ -ol.SHIFT_DRAG_ZOOM_HYSTERESIS_PIXELS = 8; - - -/** - * @const {number} - */ -ol.SHIFT_DRAG_ZOOM_HYSTERESIS_PIXELS_SQUARED = - ol.SHIFT_DRAG_ZOOM_HYSTERESIS_PIXELS * ol.SHIFT_DRAG_ZOOM_HYSTERESIS_PIXELS; - - - -/** - * @constructor - * @extends {ol.interaction.Drag} - * @param {ol.interaction.Constraints} constraints Constraints. - */ -ol.interaction.ShiftDragZoom = function(constraints) { - goog.base(this, constraints); -}; -goog.inherits(ol.interaction.ShiftDragZoom, ol.interaction.Drag); - - -/** - * @inheritDoc - */ -ol.interaction.ShiftDragZoom.prototype.handleDragEnd = - function(mapBrowserEvent) { - if (this.deltaX * this.deltaX + this.deltaY * this.deltaY >= - ol.SHIFT_DRAG_ZOOM_HYSTERESIS_PIXELS_SQUARED) { - var map = mapBrowserEvent.map; - var extent = ol.Extent.boundingExtent( - this.startCoordinate, - mapBrowserEvent.getCoordinate()); - this.fitExtent(map, extent); - } -}; - - -/** - * @inheritDoc - */ -ol.interaction.ShiftDragZoom.prototype.handleDragStart = - function(mapBrowserEvent) { - var browserEvent = mapBrowserEvent.browserEvent; - if (browserEvent.isMouseActionButton() && browserEvent.shiftKey) { - browserEvent.preventDefault(); - return true; - } else { - return false; - } -}; diff --git a/src/api/object_test.js b/src/ol/object_test.js similarity index 50% rename from src/api/object_test.js rename to src/ol/object_test.js index 8df738f8d5..d823851261 100644 --- a/src/api/object_test.js +++ b/src/ol/object_test.js @@ -1,19 +1,19 @@ goog.require('goog.testing.jsunit'); -goog.require('ol.Object'); -goog.require('ol3'); +goog.require('ol'); +goog.require('ol3.Object'); function testObject1() { var obj = {k: 1}; - obj = ol3.object(obj); - assertTrue(obj instanceof ol.Object); + obj = ol.object(obj); + assertTrue(obj instanceof ol3.Object); assertEquals(1, obj.get('k')); } function testObject2() { - var obj1 = new ol.Object(); - var obj2 = ol3.object(obj1); + var obj1 = new ol3.Object(); + var obj2 = ol.object(obj1); assertTrue(obj2 === obj1); } diff --git a/src/ol/ol.js b/src/ol/ol.js new file mode 100644 index 0000000000..e5f55b026d --- /dev/null +++ b/src/ol/ol.js @@ -0,0 +1,168 @@ +goog.provide('ol'); +goog.provide('ol.layer'); + +goog.require('goog.dom'); +goog.require('ol3.Collection'); +goog.require('ol3.Coordinate'); +goog.require('ol3.Layer'); +goog.require('ol3.Map'); +goog.require('ol3.Object'); +goog.require('ol3.Projection'); +goog.require('ol3.createMap'); +goog.require('ol3.layer.OpenStreetMap'); + + +goog.exportSymbol('ol', ol); + + +/** + * @typedef {Array|ol3.Collection} + */ +ol.Collection; + + +/** + * @typedef {Array.|ol3.Coordinate|{x: number, y: number}} + */ +ol.Coordinate; + + +/** + * @typedef {{center: (ol.Coordinate|undefined), + * layers: (ol.Collection|undefined), + * renderTo: (Element|string|undefined), + * resolution: (number|undefined), + * zoom: (number|undefined)}} + */ +ol.MapOptions; + + +/** + * @typedef {Object|ol3.Object} + */ +ol.Object; + + +/** + * @typedef {ol3.Projection|string} + */ +ol.Projection; + + +/** + * @param {ol.Collection} collection Collection. + * @return {ol3.Collection} Collection. + */ +ol.collection = function(collection) { + if (collection instanceof ol3.Collection) { + return collection; + } else if (goog.isArray(collection)) { + var array = /** @type {Array} */ collection; + return new ol3.Collection(collection); + } else { + return null; + } +}; +goog.exportProperty(ol, 'collection', ol.collection); + + +/** + * @param {ol.Coordinate} coordinate Coordinate. + * @return {ol3.Coordinate} Coordinate. + */ +ol.coordinate = function(coordinate) { + if (coordinate instanceof ol3.Coordinate) { + return coordinate; + } else if (goog.isArray(coordinate)) { + var array = /** @type {Array.} */ coordinate; + return new ol3.Coordinate(array[1], array[0]); + } else if (goog.isObject(coordinate)) { + var object = /** @type {{x: number, y: number}} */ coordinate; + return new ol3.Coordinate(object.x, object.y); + } else { + return null; + } +}; +goog.exportProperty(ol, 'coordinate', ol.coordinate); + + +goog.exportProperty(ol, 'layer', ol.layer); + + +/** + * @return {ol3.Layer} Layer. + */ +ol.layer.osm = function() { + return new ol3.layer.OpenStreetMap(); +}; +goog.exportProperty(ol.layer, 'osm', ol.layer.osm); + + +/** + * @param {ol.MapOptions=} opt_mapOptions Options. + * @return {ol3.Map} Map. + */ +ol.map = function(opt_mapOptions) { + var options = opt_mapOptions || {}; + var center = ol.coordinate(/** @type {ol.Coordinate} */ + (goog.object.get(options, 'center', null))); + var layers = ol.collection(/** @type {ol.Collection} */ + (goog.object.get(options, 'layers', null))); + var projection = ol.projection(/** @type {ol.Projection} */ + (goog.object.get(options, 'projection', 'EPSG:3857'))); + var resolution = /** @type {number|undefined} */ + goog.object.get(options, 'resolution'); + if (!goog.isDef(resolution) && goog.object.containsKey(options, 'zoom')) { + var zoom = /** @type {number} */ goog.object.get(options, 'zoom'); + resolution = ol3.Projection.EPSG_3857_HALF_SIZE / (128 << zoom); + } + var target = goog.dom.getElement(/** @type {Element|string} */ + (goog.object.get(options, 'renderTo', 'map'))); + var userProjection = ol.projection(/** @type {ol.Projection} */ + (goog.object.get(options, 'userProjection', 'EPSG:4326'))); + var map = ol3.createMap(target, { + 'layers': layers, + 'projection': projection, + 'resolution': resolution, + 'userProjection': userProjection + }); + if (!goog.isNull(center)) { + map.setUserCenter(center); + } + return map; +}; +goog.exportProperty(ol, 'map', ol.map); + + +/** + * @param {ol.Object} object Object. + * @return {ol3.Object} Object. + */ +ol.object = function(object) { + if (object instanceof ol3.Object) { + return object; + } else if (goog.isObject(object)) { + var values = /** @type {Object} */ object; + return new ol3.Object(values); + } else { + return null; + } +}; +goog.exportProperty(ol, 'object', ol.object); + + +/** + * @param {ol.Projection} projection Projection. + * @return {ol3.Projection} Projection. + */ +ol.projection = function(projection) { + if (projection instanceof ol3.Projection) { + return projection; + } else if (goog.isString(projection)) { + var code = /** @type {string} */ projection; + return ol3.Projection.getFromCode(code); + } else { + return null; + } +}; +goog.exportProperty(ol, 'projection', ol.projection); diff --git a/src/ol/tile/openstreetmap.js b/src/ol/tile/openstreetmap.js deleted file mode 100644 index 26694e88e9..0000000000 --- a/src/ol/tile/openstreetmap.js +++ /dev/null @@ -1,40 +0,0 @@ -goog.provide('ol.layer.OpenStreetMap'); -goog.provide('ol.store.OpenStreetMap'); - -goog.require('ol.TileLayer'); -goog.require('ol.TileUrlFunction'); -goog.require('ol.tilestore.XYZ'); - - - -/** - * @constructor - * @extends {ol.TileLayer} - * @param {Object.=} opt_values Values. - */ -ol.layer.OpenStreetMap = function(opt_values) { - var tileStore = new ol.store.OpenStreetMap(); - goog.base(this, tileStore, opt_values); -}; -goog.inherits(ol.layer.OpenStreetMap, ol.TileLayer); - - - -/** - * @constructor - * @extends {ol.tilestore.XYZ} - */ -ol.store.OpenStreetMap = function() { - - var tileUrlFunction = ol.TileUrlFunction.createFromTemplate( - 'http://{a-c}.tile.openstreetmap.org/{z}/{x}/{y}.png'); - - var attribution = new ol.Attribution( - '© OpenStreetMap ' + - 'contributors, ' + - 'CC BY-SA'); - - goog.base(this, 18, tileUrlFunction, [attribution]); - -}; -goog.inherits(ol.store.OpenStreetMap, ol.tilestore.XYZ); diff --git a/src/ol/tile/tilebounds_test.js b/src/ol/tile/tilebounds_test.js deleted file mode 100644 index 2d6c01ae44..0000000000 --- a/src/ol/tile/tilebounds_test.js +++ /dev/null @@ -1,102 +0,0 @@ -goog.require('goog.testing.jsunit'); -goog.require('ol.TileBounds'); - - -function testClone() { - var tileBounds = new ol.TileBounds(1, 2, 3, 4); - var clonedTileBounds = tileBounds.clone(); - assertTrue(clonedTileBounds instanceof ol.TileBounds); - assertFalse(clonedTileBounds === tileBounds); - assertEquals(tileBounds.minX, clonedTileBounds.minX); - assertEquals(tileBounds.minY, clonedTileBounds.minY); - assertEquals(tileBounds.maxX, clonedTileBounds.maxX); - assertEquals(tileBounds.maxY, clonedTileBounds.maxY); -} - - -function testContains() { - var tileBounds = new ol.TileBounds(1, 1, 3, 3); - assertFalse(tileBounds.contains(new ol.TileCoord(0, 0, 0))); - assertFalse(tileBounds.contains(new ol.TileCoord(0, 0, 1))); - assertFalse(tileBounds.contains(new ol.TileCoord(0, 0, 2))); - assertFalse(tileBounds.contains(new ol.TileCoord(0, 0, 3))); - assertFalse(tileBounds.contains(new ol.TileCoord(0, 0, 4))); - assertFalse(tileBounds.contains(new ol.TileCoord(0, 1, 0))); - assertTrue(tileBounds.contains(new ol.TileCoord(0, 1, 1))); - assertTrue(tileBounds.contains(new ol.TileCoord(0, 1, 2))); - assertTrue(tileBounds.contains(new ol.TileCoord(0, 1, 3))); - assertFalse(tileBounds.contains(new ol.TileCoord(0, 1, 4))); - assertFalse(tileBounds.contains(new ol.TileCoord(0, 2, 0))); - assertTrue(tileBounds.contains(new ol.TileCoord(0, 2, 1))); - assertTrue(tileBounds.contains(new ol.TileCoord(0, 2, 2))); - assertTrue(tileBounds.contains(new ol.TileCoord(0, 2, 3))); - assertFalse(tileBounds.contains(new ol.TileCoord(0, 2, 4))); - assertFalse(tileBounds.contains(new ol.TileCoord(0, 3, 0))); - assertTrue(tileBounds.contains(new ol.TileCoord(0, 3, 1))); - assertTrue(tileBounds.contains(new ol.TileCoord(0, 3, 2))); - assertTrue(tileBounds.contains(new ol.TileCoord(0, 3, 3))); - assertFalse(tileBounds.contains(new ol.TileCoord(0, 3, 4))); - assertFalse(tileBounds.contains(new ol.TileCoord(0, 4, 0))); - assertFalse(tileBounds.contains(new ol.TileCoord(0, 4, 1))); - assertFalse(tileBounds.contains(new ol.TileCoord(0, 4, 2))); - assertFalse(tileBounds.contains(new ol.TileCoord(0, 4, 3))); - assertFalse(tileBounds.contains(new ol.TileCoord(0, 4, 4))); -} - - -function testBoundingTileBounds() { - var tileBounds = new ol.TileBounds.boundingTileBounds( - new ol.TileCoord(3, 1, 3), - new ol.TileCoord(3, 2, 0)); - assertEquals(1, tileBounds.minX); - assertEquals(0, tileBounds.minY); - assertEquals(2, tileBounds.maxX); - assertEquals(3, tileBounds.maxY); -} - - -function testBoundingTileBoundsMixedZ() { - assertThrows(function() { - var tileBounds = new ol.TileBounds.boundingTileBounds( - new ol.TileCoord(3, 1, 3), - new ol.TileCoord(4, 2, 0)); - }); -} - - -function testForEachTileCoord() { - - var tileBounds = new ol.TileBounds(0, 2, 1, 3); - - var tileCoords = []; - tileBounds.forEachTileCoord(5, function(tileCoord) { - tileCoords.push(tileCoord.clone()); - }); - - assertEquals(4, tileCoords.length); - - assertEquals(5, tileCoords[0].z); - assertEquals(0, tileCoords[0].x); - assertEquals(2, tileCoords[0].y); - - assertEquals(5, tileCoords[1].z); - assertEquals(0, tileCoords[1].x); - assertEquals(3, tileCoords[1].y); - - assertEquals(5, tileCoords[2].z); - assertEquals(1, tileCoords[2].x); - assertEquals(2, tileCoords[2].y); - - assertEquals(5, tileCoords[3].z); - assertEquals(1, tileCoords[3].x); - assertEquals(3, tileCoords[3].y); - -} - - -function testSize() { - var tileBounds = new ol.TileBounds(0, 1, 2, 4); - var size = tileBounds.getSize(); - assertEquals(3, size.width); - assertEquals(4, size.height); -} diff --git a/src/ol/tile/tilecoveragearea.js b/src/ol/tile/tilecoveragearea.js deleted file mode 100644 index 5ca7e2fabe..0000000000 --- a/src/ol/tile/tilecoveragearea.js +++ /dev/null @@ -1,71 +0,0 @@ -goog.provide('ol.TileCoverageArea'); - -goog.require('ol.CoverageArea'); -goog.require('ol.Extent'); -goog.require('ol.TileGrid'); - - - -/** - * @constructor - * @extends {ol.CoverageArea} - * @param {ol.TileGrid} tileGrid Tile grid. - * @param {ol.Extent} extent Extent. - * @param {number} minZ Minimum Z. - * @param {number} maxZ Maximum Z. - */ -ol.TileCoverageArea = function(tileGrid, extent, minZ, maxZ) { - - goog.base(this, extent); - - /** - * @private - * @type {ol.TileGrid} - */ - this.tileGrid_ = tileGrid; - - /** - * @private - * @type {number} - */ - this.minZ_ = minZ; - - /** - * @private - * @type {number} - */ - this.maxZ_ = maxZ; - -}; -goog.inherits(ol.TileCoverageArea, ol.CoverageArea); - - -/** - * @inheritDoc - */ -ol.TileCoverageArea.prototype.intersectsExtentAndResolution = - function(extent, resolution) { - var z = this.tileGrid_.getZForResolution(resolution); - return this.intersectsExtentAndZ(extent, z); -}; - - -/** - * @param {ol.Extent} extent Extent. - * @param {number} z Z. - * @return {boolean} Intersects. - */ -ol.TileCoverageArea.prototype.intersectsExtentAndZ = function(extent, z) { - return this.minZ_ <= z && z <= this.maxZ_ && this.intersectsExtent(extent); -}; - - -/** - * @param {ol.TransformFunction} transformFn Transform. - * @return {ol.TileCoverageArea} Transformed tile coverage area. - */ -ol.TileCoverageArea.prototype.transform = function(transformFn) { - var extent = this.extent.transform(transformFn); - return new ol.TileCoverageArea( - this.tileGrid_, extent, this.minZ_, this.maxZ_); -}; diff --git a/src/ol/tile/tilelayer.js b/src/ol/tile/tilelayer.js deleted file mode 100644 index c23741155f..0000000000 --- a/src/ol/tile/tilelayer.js +++ /dev/null @@ -1,26 +0,0 @@ -goog.provide('ol.TileLayer'); - -goog.require('ol.Layer'); -goog.require('ol.TileStore'); - - - -/** - * @constructor - * @extends {ol.Layer} - * @param {ol.TileStore} tileStore Tile store. - * @param {Object.=} opt_values Values. - */ -ol.TileLayer = function(tileStore, opt_values) { - goog.base(this, tileStore, opt_values); -}; -goog.inherits(ol.TileLayer, ol.Layer); - - -/** - * @override - * @return {ol.TileStore} Store. - */ -ol.TileLayer.prototype.getStore = function() { - return /** @type {ol.TileStore} */ goog.base(this, 'getStore'); -}; diff --git a/src/ol/tile/tileurlfunction_test.js b/src/ol/tile/tileurlfunction_test.js deleted file mode 100644 index 965305eb96..0000000000 --- a/src/ol/tile/tileurlfunction_test.js +++ /dev/null @@ -1,33 +0,0 @@ -goog.require('goog.testing.jsunit'); -goog.require('ol.TileCoord'); -goog.require('ol.TileUrlFunction'); - - -function testCreateFromTemplate() { - var tileUrl = ol.TileUrlFunction.createFromTemplate('{z}/{x}/{y}'); - assertEquals('3/2/1', tileUrl(new ol.TileCoord(3, 2, 1))); - assertUndefined(tileUrl(null)); -} - - -function testWithTileCoordTransform() { - var tileUrl = ol.TileUrlFunction.withTileCoordTransform( - function(tileCoord) { - return new ol.TileCoord(tileCoord.z, tileCoord.x, -tileCoord.y); - }, - ol.TileUrlFunction.createFromTemplate('{z}/{x}/{y}')); - assertEquals('3/2/1', tileUrl(new ol.TileCoord(3, 2, -1))); - assertUndefined(tileUrl(null)); -} - - -function testCreateFromTileUrlFunctions() { - var tileUrl = ol.TileUrlFunction.createFromTileUrlFunctions([ - ol.TileUrlFunction.createFromTemplate('a'), - ol.TileUrlFunction.createFromTemplate('b') - ]); - var tileUrl1 = tileUrl(new ol.TileCoord(1, 0, 0)); - var tileUrl2 = tileUrl(new ol.TileCoord(1, 0, 1)); - assertTrue(tileUrl1 != tileUrl2); - assertUndefined(tileUrl(null)); -} diff --git a/src/ol/tile/xyz.js b/src/ol/tile/xyz.js deleted file mode 100644 index f843eb766e..0000000000 --- a/src/ol/tile/xyz.js +++ /dev/null @@ -1,118 +0,0 @@ -goog.provide('ol.layer.XYZ'); -goog.provide('ol.tilegrid.XYZ'); -goog.provide('ol.tilestore.XYZ'); - -goog.require('goog.math'); -goog.require('ol.Attribution'); -goog.require('ol.Coordinate'); -goog.require('ol.Layer'); -goog.require('ol.Projection'); -goog.require('ol.Size'); -goog.require('ol.TileCoord'); -goog.require('ol.TileGrid'); -goog.require('ol.TileLayer'); -goog.require('ol.TileStore'); -goog.require('ol.TileUrlFunction'); - - - -/** - * @constructor - * @extends {ol.TileGrid} - * @param {number} maxZoom Maximum zoom. - * @param {ol.Size=} opt_tileSize Tile size. - */ -ol.tilegrid.XYZ = function(maxZoom, opt_tileSize) { - - var resolutions = new Array(maxZoom + 1); - var z; - for (z = 0; z <= maxZoom; ++z) { - resolutions[z] = ol.Projection.EPSG_3857_HALF_SIZE / (128 << z); - } - - var extent = ol.Projection.EPSG_3857_EXTENT; - var origin = new ol.Coordinate( - -ol.Projection.EPSG_3857_HALF_SIZE, ol.Projection.EPSG_3857_HALF_SIZE); - - goog.base(this, resolutions, extent, origin, opt_tileSize); - -}; -goog.inherits(ol.tilegrid.XYZ, ol.TileGrid); - - -/** - * @inheritDoc - */ -ol.tilegrid.XYZ.prototype.forEachTileCoordParentTileBounds = - function(tileCoord, callback, opt_obj) { - var x = tileCoord.x; - var y = tileCoord.y; - var z = tileCoord.z; - var tileBounds; - while (true) { - z -= 1; - if (z < 0) { - break; - } - x = Math.floor(x / 2); - y = Math.floor(y / 2); - tileBounds = new ol.TileBounds(x, y, x, y); - if (callback.call(opt_obj, z, tileBounds)) { - break; - } - } -}; - - - -/** - * @constructor - * @extends {ol.TileLayer} - * @param {number} maxZoom Maximum zoom. - * @param {ol.TileUrlFunctionType} tileUrlFunction Tile URL function. - * @param {Array.=} opt_attributions Attributions. - * @param {string=} opt_crossOrigin Cross origin. - * @param {Object.=} opt_values Values. - */ -ol.layer.XYZ = function( - maxZoom, tileUrlFunction, opt_attributions, opt_crossOrigin, opt_values) { - var tileStore = new ol.tilestore.XYZ( - maxZoom, tileUrlFunction, opt_attributions, opt_crossOrigin); - goog.base(this, tileStore, opt_values); -}; -goog.inherits(ol.layer.XYZ, ol.TileLayer); - - - -/** - * @constructor - * @extends {ol.TileStore} - * @param {number} maxZoom Maximum zoom. - * @param {ol.TileUrlFunctionType} tileUrlFunction Tile URL function. - * @param {Array.=} opt_attributions Attributions. - * @param {string=} opt_crossOrigin Cross origin. - */ -ol.tilestore.XYZ = - function(maxZoom, tileUrlFunction, opt_attributions, opt_crossOrigin) { - - var projection = ol.Projection.getFromCode('EPSG:3857'); - var tileGrid = new ol.tilegrid.XYZ(maxZoom); - var tileUrlFunction2 = ol.TileUrlFunction.withTileCoordTransform( - function(tileCoord) { - var n = 1 << tileCoord.z; - var y = -tileCoord.y - 1; - if (y < 0 || n <= y) { - return null; - } else { - var x = goog.math.modulo(tileCoord.x, n); - return new ol.TileCoord(tileCoord.z, x, y); - } - }, - tileUrlFunction); - var extent = projection.getExtent(); - - goog.base(this, projection, tileGrid, tileUrlFunction2, extent, - opt_attributions, opt_crossOrigin); - -}; -goog.inherits(ol.tilestore.XYZ, ol.TileStore); diff --git a/src/ol/webgl/layerrenderer.js b/src/ol/webgl/layerrenderer.js deleted file mode 100644 index 9e0f70a9ac..0000000000 --- a/src/ol/webgl/layerrenderer.js +++ /dev/null @@ -1,113 +0,0 @@ -goog.provide('ol.webgl.LayerRenderer'); - -goog.require('goog.vec.Mat4'); -goog.require('ol.Layer'); -goog.require('ol.LayerRenderer'); - - - -/** - * @constructor - * @extends {ol.LayerRenderer} - * @param {ol.MapRenderer} mapRenderer Map renderer. - * @param {ol.Layer} layer Layer. - */ -ol.webgl.LayerRenderer = function(mapRenderer, layer) { - goog.base(this, mapRenderer, layer); -}; -goog.inherits(ol.webgl.LayerRenderer, ol.LayerRenderer); - - -/** - * @protected - */ -ol.webgl.LayerRenderer.prototype.dispatchChangeEvent = function() { - this.dispatchEvent(goog.events.EventType.CHANGE); -}; - - -/** - * @override - * @return {ol.MapRenderer} MapRenderer. - */ -ol.webgl.LayerRenderer.prototype.getMapRenderer = function() { - return /** @type {ol.webgl.MapRenderer} */ goog.base(this, 'getMapRenderer'); -}; - - -/** - * @return {goog.vec.Mat4.AnyType} Matrix. - */ -ol.webgl.LayerRenderer.prototype.getMatrix = goog.abstractMethod; - - -/** - * @return {WebGLTexture} Texture. - */ -ol.webgl.LayerRenderer.prototype.getTexture = goog.abstractMethod; - - -/** - * @inheritDoc - */ -ol.webgl.LayerRenderer.prototype.handleLayerBrightnessChange = function() { - this.dispatchChangeEvent(); -}; - - -/** - * @inheritDoc - */ -ol.webgl.LayerRenderer.prototype.handleLayerContrastChange = function() { - this.dispatchChangeEvent(); -}; - - -/** - * @inheritDoc - */ -ol.webgl.LayerRenderer.prototype.handleLayerHueChange = function() { - this.dispatchChangeEvent(); -}; - - -/** - * @inheritDoc - */ -ol.webgl.LayerRenderer.prototype.handleLayerLoad = function() { - this.dispatchChangeEvent(); -}; - - -/** - * @inheritDoc - */ -ol.webgl.LayerRenderer.prototype.handleLayerOpacityChange = function() { - this.dispatchChangeEvent(); -}; - - -/** - * @inheritDoc - */ -ol.webgl.LayerRenderer.prototype.handleLayerSaturationChange = function() { - this.dispatchChangeEvent(); -}; - - -/** - * @inheritDoc - */ -ol.webgl.LayerRenderer.prototype.handleLayerVisibleChange = function() { - this.dispatchChangeEvent(); -}; - - -/** - */ -ol.webgl.LayerRenderer.prototype.handleWebGLContextLost = goog.nullFunction; - - -/** - */ -ol.webgl.LayerRenderer.prototype.render = goog.abstractMethod; diff --git a/src/ol/webgl/shader.js b/src/ol/webgl/shader.js deleted file mode 100644 index 65dae77c7b..0000000000 --- a/src/ol/webgl/shader.js +++ /dev/null @@ -1,81 +0,0 @@ -goog.provide('ol.webgl.shader.Fragment'); -goog.provide('ol.webgl.shader.Vertex'); - -goog.require('goog.functions'); -goog.require('goog.webgl'); - - - -/** - * @constructor - * @param {string} source Source. - */ -ol.webgl.Shader = function(source) { - - /** - * @private - * @type {string} - */ - this.source_ = source; - -}; - - -/** - * @return {number} Type. - */ -ol.webgl.Shader.prototype.getType = goog.abstractMethod; - - -/** - * @return {string} Source. - */ -ol.webgl.Shader.prototype.getSource = function() { - return this.source_; -}; - - -/** - * @return {boolean} Is animated? - */ -ol.webgl.Shader.prototype.isAnimated = goog.functions.FALSE; - - - -/** - * @constructor - * @extends {ol.webgl.Shader} - * @param {string} source Source. - */ -ol.webgl.shader.Fragment = function(source) { - goog.base(this, source); -}; -goog.inherits(ol.webgl.shader.Fragment, ol.webgl.Shader); - - -/** - * @inheritDoc - */ -ol.webgl.shader.Fragment.prototype.getType = function() { - return goog.webgl.FRAGMENT_SHADER; -}; - - - -/** - * @constructor - * @extends {ol.webgl.Shader} - * @param {string} source Source. - */ -ol.webgl.shader.Vertex = function(source) { - goog.base(this, source); -}; -goog.inherits(ol.webgl.shader.Vertex, ol.webgl.Shader); - - -/** - * @inheritDoc - */ -ol.webgl.shader.Vertex.prototype.getType = function() { - return goog.webgl.VERTEX_SHADER; -}; diff --git a/src/ol/base/array.js b/src/ol3/base/array.js similarity index 88% rename from src/ol/base/array.js rename to src/ol3/base/array.js index 2a1ce13de4..a7259991e7 100644 --- a/src/ol/base/array.js +++ b/src/ol3/base/array.js @@ -1,4 +1,4 @@ -goog.provide('ol.array'); +goog.provide('ol3.array'); goog.require('goog.array'); @@ -8,7 +8,7 @@ goog.require('goog.array'); * @param {number} target Target. * @return {number} Index. */ -ol.array.binaryFindNearest = function(arr, target) { +ol3.array.binaryFindNearest = function(arr, target) { var index = goog.array.binarySearch(arr, target, function(a, b) { return b - a; }); @@ -35,7 +35,7 @@ ol.array.binaryFindNearest = function(arr, target) { * @param {number} target Target. * @return {number} Index. */ -ol.array.linearFindNearest = function(arr, target) { +ol3.array.linearFindNearest = function(arr, target) { var n = arr.length; if (arr[0] <= target) { return 0; diff --git a/src/ol3/base/array_test.js b/src/ol3/base/array_test.js new file mode 100644 index 0000000000..2b700aecae --- /dev/null +++ b/src/ol3/base/array_test.js @@ -0,0 +1,46 @@ +goog.require('goog.testing.jsunit'); +goog.require('ol3.array'); + + +function testBinaryFindNearest() { + var arr = [1000, 500, 100]; + + assertEquals(0, ol3.array.binaryFindNearest(arr, 10000)); + assertEquals(0, ol3.array.binaryFindNearest(arr, 1000)); + assertEquals(0, ol3.array.binaryFindNearest(arr, 900)); + + assertEquals(1, ol3.array.binaryFindNearest(arr, 750)); + + assertEquals(1, ol3.array.binaryFindNearest(arr, 550)); + assertEquals(1, ol3.array.binaryFindNearest(arr, 500)); + assertEquals(1, ol3.array.binaryFindNearest(arr, 450)); + + assertEquals(2, ol3.array.binaryFindNearest(arr, 300)); + + assertEquals(2, ol3.array.binaryFindNearest(arr, 200)); + assertEquals(2, ol3.array.binaryFindNearest(arr, 100)); + assertEquals(2, ol3.array.binaryFindNearest(arr, 50)); + +} + + +function testLinearFindNearest() { + var arr = [1000, 500, 100]; + + assertEquals(0, ol3.array.linearFindNearest(arr, 10000)); + assertEquals(0, ol3.array.linearFindNearest(arr, 1000)); + assertEquals(0, ol3.array.linearFindNearest(arr, 900)); + + assertEquals(1, ol3.array.linearFindNearest(arr, 750)); + + assertEquals(1, ol3.array.linearFindNearest(arr, 550)); + assertEquals(1, ol3.array.linearFindNearest(arr, 500)); + assertEquals(1, ol3.array.linearFindNearest(arr, 450)); + + assertEquals(2, ol3.array.linearFindNearest(arr, 300)); + + assertEquals(2, ol3.array.linearFindNearest(arr, 200)); + assertEquals(2, ol3.array.linearFindNearest(arr, 100)); + assertEquals(2, ol3.array.linearFindNearest(arr, 50)); + +} diff --git a/src/ol3/base/attribution.js b/src/ol3/base/attribution.js new file mode 100644 index 0000000000..a4723c076b --- /dev/null +++ b/src/ol3/base/attribution.js @@ -0,0 +1,58 @@ +goog.provide('ol3.Attribution'); + +goog.require('ol3.CoverageArea'); +goog.require('ol3.Projection'); + + + +/** + * @constructor + * @param {string} html HTML. + * @param {Array.=} opt_coverageAreas Coverage areas. + * @param {ol3.Projection=} opt_projection Projection. + */ +ol3.Attribution = function(html, opt_coverageAreas, opt_projection) { + + /** + * @private + * @type {string} + */ + this.html_ = html; + + /** + * @private + * @type {Array.} + */ + this.coverageAreas_ = opt_coverageAreas || null; + + /** + * @private + * @type {ol3.Projection} + */ + this.projection_ = opt_projection || null; + +}; + + +/** + * @return {Array.} Coverage areas. + */ +ol3.Attribution.prototype.getCoverageAreas = function() { + return this.coverageAreas_; +}; + + +/** + * @return {string} HTML. + */ +ol3.Attribution.prototype.getHtml = function() { + return this.html_; +}; + + +/** + * @return {ol3.Projection} Projection. + */ +ol3.Attribution.prototype.getProjection = function() { + return this.projection_; +}; diff --git a/src/ol/base/collection.js b/src/ol3/base/collection.js similarity index 56% rename from src/ol/base/collection.js rename to src/ol3/base/collection.js index 734900c2d4..4ee3b4c408 100644 --- a/src/ol/base/collection.js +++ b/src/ol3/base/collection.js @@ -4,20 +4,20 @@ * @see https://developers.google.com/maps/documentation/javascript/reference */ -goog.provide('ol.Collection'); -goog.provide('ol.CollectionEvent'); -goog.provide('ol.CollectionEventType'); +goog.provide('ol3.Collection'); +goog.provide('ol3.CollectionEvent'); +goog.provide('ol3.CollectionEventType'); goog.require('goog.array'); goog.require('goog.asserts'); goog.require('goog.events.Event'); -goog.require('ol.Object'); +goog.require('ol3.Object'); /** * @enum {string} */ -ol.CollectionEventType = { +ol3.CollectionEventType = { ADD: 'add', INSERT_AT: 'insert_at', REMOVE: 'remove', @@ -30,13 +30,13 @@ ol.CollectionEventType = { /** * @constructor * @extends {goog.events.Event} - * @param {ol.CollectionEventType} type Type. + * @param {ol3.CollectionEventType} type Type. * @param {*=} opt_elem Element. * @param {number=} opt_index Index. * @param {*=} opt_prev Value. * @param {Object=} opt_target Target. */ -ol.CollectionEvent = +ol3.CollectionEvent = function(type, opt_elem, opt_index, opt_prev, opt_target) { goog.base(this, type, opt_target); @@ -57,13 +57,13 @@ ol.CollectionEvent = this.prev = opt_prev; }; -goog.inherits(ol.CollectionEvent, goog.events.Event); +goog.inherits(ol3.CollectionEvent, goog.events.Event); /** * @enum {string} */ -ol.CollectionProperty = { +ol3.CollectionProperty = { LENGTH: 'length' }; @@ -71,10 +71,10 @@ ol.CollectionProperty = { /** * @constructor - * @extends {ol.Object} + * @extends {ol3.Object} * @param {Array=} opt_array Array. */ -ol.Collection = function(opt_array) { +ol3.Collection = function(opt_array) { goog.base(this); @@ -87,13 +87,13 @@ ol.Collection = function(opt_array) { this.updateLength_(); }; -goog.inherits(ol.Collection, ol.Object); +goog.inherits(ol3.Collection, ol3.Object); /** */ -ol.Collection.prototype.clear = function() { - while (this[ol.CollectionProperty.LENGTH]) { +ol3.Collection.prototype.clear = function() { + while (this[ol3.CollectionProperty.LENGTH]) { this.pop(); } }; @@ -103,7 +103,7 @@ ol.Collection.prototype.clear = function() { * @param {Function} f Function. * @param {Object=} opt_obj Object. */ -ol.Collection.prototype.forEach = function(f, opt_obj) { +ol3.Collection.prototype.forEach = function(f, opt_obj) { goog.array.forEach(this.array_, f, opt_obj); }; @@ -111,7 +111,7 @@ ol.Collection.prototype.forEach = function(f, opt_obj) { /** * @return {Array} Array. */ -ol.Collection.prototype.getArray = function() { +ol3.Collection.prototype.getArray = function() { return this.array_; }; @@ -120,7 +120,7 @@ ol.Collection.prototype.getArray = function() { * @param {number} index Index. * @return {*} Element. */ -ol.Collection.prototype.getAt = function(index) { +ol3.Collection.prototype.getAt = function(index) { return this.array_[index]; }; @@ -128,8 +128,8 @@ ol.Collection.prototype.getAt = function(index) { /** * @return {number} Length. */ -ol.Collection.prototype.getLength = function() { - return /** @type {number} */ this.get(ol.CollectionProperty.LENGTH); +ol3.Collection.prototype.getLength = function() { + return /** @type {number} */ this.get(ol3.CollectionProperty.LENGTH); }; @@ -137,20 +137,20 @@ ol.Collection.prototype.getLength = function() { * @param {number} index Index. * @param {*} elem Element. */ -ol.Collection.prototype.insertAt = function(index, elem) { +ol3.Collection.prototype.insertAt = function(index, elem) { goog.array.insertAt(this.array_, elem, index); this.updateLength_(); - this.dispatchEvent(new ol.CollectionEvent( - ol.CollectionEventType.ADD, elem, undefined, undefined, this)); - this.dispatchEvent(new ol.CollectionEvent( - ol.CollectionEventType.INSERT_AT, elem, index, undefined, this)); + this.dispatchEvent(new ol3.CollectionEvent( + ol3.CollectionEventType.ADD, elem, undefined, undefined, this)); + this.dispatchEvent(new ol3.CollectionEvent( + ol3.CollectionEventType.INSERT_AT, elem, index, undefined, this)); }; /** * @return {*} Element. */ -ol.Collection.prototype.pop = function() { +ol3.Collection.prototype.pop = function() { return this.removeAt(this.getLength() - 1); }; @@ -159,7 +159,7 @@ ol.Collection.prototype.pop = function() { * @param {*} elem Element. * @return {number} Length. */ -ol.Collection.prototype.push = function(elem) { +ol3.Collection.prototype.push = function(elem) { var n = this.array_.length; this.insertAt(n, elem); return n; @@ -170,13 +170,13 @@ ol.Collection.prototype.push = function(elem) { * @param {number} index Index. * @return {*} Value. */ -ol.Collection.prototype.removeAt = function(index) { +ol3.Collection.prototype.removeAt = function(index) { var prev = this.array_[index]; goog.array.removeAt(this.array_, index); this.updateLength_(); - this.dispatchEvent(new ol.CollectionEvent( - ol.CollectionEventType.REMOVE, prev, undefined, undefined, this)); - this.dispatchEvent(new ol.CollectionEvent(ol.CollectionEventType.REMOVE_AT, + this.dispatchEvent(new ol3.CollectionEvent( + ol3.CollectionEventType.REMOVE, prev, undefined, undefined, this)); + this.dispatchEvent(new ol3.CollectionEvent(ol3.CollectionEventType.REMOVE_AT, undefined, index, prev, this)); return prev; }; @@ -186,16 +186,16 @@ ol.Collection.prototype.removeAt = function(index) { * @param {number} index Index. * @param {*} elem Element. */ -ol.Collection.prototype.setAt = function(index, elem) { - var n = this[ol.CollectionProperty.LENGTH]; +ol3.Collection.prototype.setAt = function(index, elem) { + var n = this[ol3.CollectionProperty.LENGTH]; if (index < n) { var prev = this.array_[index]; this.array_[index] = elem; - this.dispatchEvent(new ol.CollectionEvent(ol.CollectionEventType.SET_AT, + this.dispatchEvent(new ol3.CollectionEvent(ol3.CollectionEventType.SET_AT, elem, index, prev, this)); - this.dispatchEvent(new ol.CollectionEvent(ol.CollectionEventType.REMOVE, + this.dispatchEvent(new ol3.CollectionEvent(ol3.CollectionEventType.REMOVE, prev, undefined, undefined, this)); - this.dispatchEvent(new ol.CollectionEvent(ol.CollectionEventType.ADD, + this.dispatchEvent(new ol3.CollectionEvent(ol3.CollectionEventType.ADD, elem, undefined, undefined, this)); } else { var j; @@ -210,6 +210,6 @@ ol.Collection.prototype.setAt = function(index, elem) { /** * @private */ -ol.Collection.prototype.updateLength_ = function() { - this.set(ol.CollectionProperty.LENGTH, this.array_.length); +ol3.Collection.prototype.updateLength_ = function() { + this.set(ol3.CollectionProperty.LENGTH, this.array_.length); }; diff --git a/src/ol/base/collection_test.js b/src/ol3/base/collection_test.js similarity index 68% rename from src/ol/base/collection_test.js rename to src/ol3/base/collection_test.js index ebc853c733..0b0feb840c 100644 --- a/src/ol/base/collection_test.js +++ b/src/ol3/base/collection_test.js @@ -1,11 +1,11 @@ goog.require('goog.array'); goog.require('goog.testing.jsunit'); -goog.require('ol.Collection'); -goog.require('ol.CollectionEventType'); +goog.require('ol3.Collection'); +goog.require('ol3.CollectionEventType'); function testEmpty() { - var collection = new ol.Collection(); + var collection = new ol3.Collection(); assertEquals(0, collection.getLength()); assertTrue(goog.array.equals(collection.getArray(), [])); assertUndefined(collection.getAt(0)); @@ -14,7 +14,7 @@ function testEmpty() { function testConstruct() { var array = [0, 1, 2]; - var collection = new ol.Collection(array); + var collection = new ol3.Collection(array); assertEquals(0, collection.getAt(0)); assertEquals(1, collection.getAt(1)); assertEquals(2, collection.getAt(2)); @@ -22,7 +22,7 @@ function testConstruct() { function testPush() { - var collection = new ol.Collection(); + var collection = new ol3.Collection(); collection.push(1); assertEquals(1, collection.getLength()); assertTrue(goog.array.equals(collection.getArray(), [1])); @@ -31,7 +31,7 @@ function testPush() { function testPushPop() { - var collection = new ol.Collection(); + var collection = new ol3.Collection(); collection.push(1); collection.pop(); assertEquals(0, collection.getLength()); @@ -41,7 +41,7 @@ function testPushPop() { function testInsertAt() { - var collection = new ol.Collection([0, 2]); + var collection = new ol3.Collection([0, 2]); collection.insertAt(1, 1); assertEquals(0, collection.getAt(0)); assertEquals(1, collection.getAt(1)); @@ -50,7 +50,7 @@ function testInsertAt() { function testSetAt() { - var collection = new ol.Collection(); + var collection = new ol3.Collection(); collection.setAt(1, 1); assertEquals(2, collection.getLength()); assertUndefined(collection.getAt(0)); @@ -59,7 +59,7 @@ function testSetAt() { function testRemoveAt() { - var collection = new ol.Collection([0, 1, 2]); + var collection = new ol3.Collection([0, 1, 2]); collection.removeAt(1); assertEquals(0, collection.getAt(0)); assertEquals(2, collection.getAt(1)); @@ -67,7 +67,7 @@ function testRemoveAt() { function testForEachEmpty() { - var collection = new ol.Collection(); + var collection = new ol3.Collection(); var forEachCalled = false; collection.forEach(function() { forEachCalled = true; @@ -77,7 +77,7 @@ function testForEachEmpty() { function testForEachPopulated() { - var collection = new ol.Collection(); + var collection = new ol3.Collection(); collection.push(1); collection.push(2); var forEachCount = 0; @@ -89,9 +89,9 @@ function testForEachPopulated() { function testSetAtEvent() { - var collection = new ol.Collection(['a', 'b']); + var collection = new ol3.Collection(['a', 'b']); var index, prev; - goog.events.listen(collection, ol.CollectionEventType.SET_AT, function(e) { + goog.events.listen(collection, ol3.CollectionEventType.SET_AT, function(e) { index = e.index; prev = e.prev; }); @@ -102,12 +102,13 @@ function testSetAtEvent() { function testRemoveAtEvent() { - var collection = new ol.Collection(['a']); + var collection = new ol3.Collection(['a']); var index, prev; - goog.events.listen(collection, ol.CollectionEventType.REMOVE_AT, function(e) { - index = e.index; - prev = e.prev; - }); + goog.events.listen( + collection, ol3.CollectionEventType.REMOVE_AT, function(e) { + index = e.index; + prev = e.prev; + }); collection.pop(); assertEquals(0, index); assertEquals('a', prev); @@ -115,22 +116,24 @@ function testRemoveAtEvent() { function testInsertAtEvent() { - var collection = new ol.Collection([0, 2]); + var collection = new ol3.Collection([0, 2]); var index; - goog.events.listen(collection, ol.CollectionEventType.INSERT_AT, function(e) { - index = e.index; - }); + goog.events.listen( + collection, ol3.CollectionEventType.INSERT_AT, function(e) { + index = e.index; + }); collection.insertAt(1, 1); assertEquals(1, index); } function testSetAtBeyondEnd() { - var collection = new ol.Collection(); + var collection = new ol3.Collection(); var inserts = []; - goog.events.listen(collection, ol.CollectionEventType.INSERT_AT, function(e) { - inserts.push(e.index); - }); + goog.events.listen( + collection, ol3.CollectionEventType.INSERT_AT, function(e) { + inserts.push(e.index); + }); collection.setAt(2, 0); assertEquals(3, collection.getLength()); assertUndefined(collection.getAt(0)); @@ -144,7 +147,7 @@ function testSetAtBeyondEnd() { function testLengthChangeInsertAt() { - var collection = new ol.Collection([0, 1, 2]); + var collection = new ol3.Collection([0, 1, 2]); var lengthEventDispatched; goog.events.listen(collection, 'length_changed', function() { lengthEventDispatched = true; @@ -155,7 +158,7 @@ function testLengthChangeInsertAt() { function testLengthChangeRemoveAt() { - var collection = new ol.Collection([0, 1, 2]); + var collection = new ol3.Collection([0, 1, 2]); var lengthEventDispatched; goog.events.listen(collection, 'length_changed', function() { lengthEventDispatched = true; @@ -166,7 +169,7 @@ function testLengthChangeRemoveAt() { function testLengthChangeSetAt() { - var collection = new ol.Collection([0, 1, 2]); + var collection = new ol3.Collection([0, 1, 2]); var lengthEventDispatched; goog.events.listen(collection, 'length_changed', function() { lengthEventDispatched = true; @@ -177,7 +180,7 @@ function testLengthChangeSetAt() { function testForEach() { - var collection = new ol.Collection([1, 2, 4]); + var collection = new ol3.Collection([1, 2, 4]); var sum = 0; collection.forEach(function(elem) { sum += elem; @@ -187,7 +190,7 @@ function testForEach() { function testForEachScope() { - var collection = new ol.Collection([0]); + var collection = new ol3.Collection([0]); var that; var uniqueObj = {}; collection.forEach(function(elem) { @@ -198,9 +201,9 @@ function testForEachScope() { function testAddEvent() { - var collection = new ol.Collection(); + var collection = new ol3.Collection(); var elem; - goog.events.listen(collection, ol.CollectionEventType.ADD, function(e) { + goog.events.listen(collection, ol3.CollectionEventType.ADD, function(e) { elem = e.elem; }); collection.push(1); @@ -209,13 +212,13 @@ function testAddEvent() { function testAddRemoveEvent() { - var collection = new ol.Collection([1]); + var collection = new ol3.Collection([1]); var addedElem; - goog.events.listen(collection, ol.CollectionEventType.ADD, function(e) { + goog.events.listen(collection, ol3.CollectionEventType.ADD, function(e) { addedElem = e.elem; }); var removedElem; - goog.events.listen(collection, ol.CollectionEventType.REMOVE, function(e) { + goog.events.listen(collection, ol3.CollectionEventType.REMOVE, function(e) { removedElem = e.elem; }); collection.setAt(0, 2); @@ -225,9 +228,9 @@ function testAddRemoveEvent() { function testRemove() { - var collection = new ol.Collection([1]); + var collection = new ol3.Collection([1]); var elem; - goog.events.listen(collection, ol.CollectionEventType.REMOVE, function(e) { + goog.events.listen(collection, ol3.CollectionEventType.REMOVE, function(e) { elem = e.elem; }); collection.pop(); diff --git a/src/ol/base/color.js b/src/ol3/base/color.js similarity index 62% rename from src/ol/base/color.js rename to src/ol3/base/color.js index 43e8e0c17f..9fdc81daa2 100644 --- a/src/ol/base/color.js +++ b/src/ol3/base/color.js @@ -1,4 +1,4 @@ -goog.provide('ol.Color'); +goog.provide('ol3.Color'); goog.require('goog.color'); @@ -11,7 +11,7 @@ goog.require('goog.color'); * @param {number} b Blue. * @param {number} a Alpha. */ -ol.Color = function(r, g, b, a) { +ol3.Color = function(r, g, b, a) { /** * @type {number} @@ -39,18 +39,18 @@ ol.Color = function(r, g, b, a) { /** * @param {string} str String. * @param {number=} opt_a Alpha. - * @return {ol.Color} Color. + * @return {ol3.Color} Color. */ -ol.Color.createFromString = function(str, opt_a) { +ol3.Color.createFromString = function(str, opt_a) { var rgb = goog.color.hexToRgb(goog.color.parse(str).hex); var a = opt_a || 255; - return new ol.Color(rgb[0], rgb[1], rgb[2], a); + return new ol3.Color(rgb[0], rgb[1], rgb[2], a); }; /** - * @return {ol.Color} Clone. + * @return {ol3.Color} Clone. */ -ol.Color.prototype.clone = function() { - return new ol.Color(this.r, this.g, this.b, this.a); +ol3.Color.prototype.clone = function() { + return new ol3.Color(this.r, this.g, this.b, this.a); }; diff --git a/src/ol3/base/coordinate.js b/src/ol3/base/coordinate.js new file mode 100644 index 0000000000..7fc72d0968 --- /dev/null +++ b/src/ol3/base/coordinate.js @@ -0,0 +1,31 @@ +goog.provide('ol3.Coordinate'); + +goog.require('goog.math.Vec2'); + + + +/** + * @constructor + * @extends {goog.math.Vec2} + * @param {number} x X. + * @param {number} y Y. + */ +ol3.Coordinate = function(x, y) { + goog.base(this, x, y); +}; +goog.inherits(ol3.Coordinate, goog.math.Vec2); + + +/** + * @const + * @type {ol3.Coordinate} + */ +ol3.Coordinate.ZERO = new ol3.Coordinate(0, 0); + + +/** + * @return {ol3.Coordinate} Clone. + */ +ol3.Coordinate.prototype.clone = function() { + return new ol3.Coordinate(this.x, this.y); +}; diff --git a/src/ol/base/coordinateformat.js b/src/ol3/base/coordinateformat.js similarity index 57% rename from src/ol/base/coordinateformat.js rename to src/ol3/base/coordinateformat.js index a654b757a8..7a7796cb58 100644 --- a/src/ol/base/coordinateformat.js +++ b/src/ol3/base/coordinateformat.js @@ -1,21 +1,21 @@ -goog.provide('ol.CoordinateFormat'); -goog.provide('ol.CoordinateFormatType'); +goog.provide('ol3.CoordinateFormat'); +goog.provide('ol3.CoordinateFormatType'); goog.require('goog.math'); -goog.require('ol.Coordinate'); +goog.require('ol3.Coordinate'); /** - * @typedef {function((ol.Coordinate|undefined)): string} + * @typedef {function((ol3.Coordinate|undefined)): string} */ -ol.CoordinateFormatType; +ol3.CoordinateFormatType; /** * @param {number} precision Precision. - * @return {ol.CoordinateFormatType} Coordinate format. + * @return {ol3.CoordinateFormatType} Coordinate format. */ -ol.CoordinateFormat.createXY = function(precision) { +ol3.CoordinateFormat.createXY = function(precision) { return function(coordinate) { if (goog.isDef(coordinate)) { return coordinate.x.toFixed(precision) + ', ' + @@ -33,7 +33,7 @@ ol.CoordinateFormat.createXY = function(precision) { * @param {string} hemispheres Hemispheres. * @return {string} String. */ -ol.CoordinateFormat.degreesToHDMS_ = function(degrees, hemispheres) { +ol3.CoordinateFormat.degreesToHDMS_ = function(degrees, hemispheres) { var normalizedDegrees = goog.math.modulo(degrees + 180, 360) - 180; var x = Math.abs(Math.round(3600 * normalizedDegrees)); return Math.floor(x / 3600) + '\u00b0 ' + @@ -44,13 +44,13 @@ ol.CoordinateFormat.degreesToHDMS_ = function(degrees, hemispheres) { /** - * @param {ol.Coordinate|undefined} coordinate Coordinate. + * @param {ol3.Coordinate|undefined} coordinate Coordinate. * @return {string} Coordinate format. */ -ol.CoordinateFormat.hdms = function(coordinate) { +ol3.CoordinateFormat.hdms = function(coordinate) { if (goog.isDef(coordinate)) { - return ol.CoordinateFormat.degreesToHDMS_(coordinate.y, 'NS') + ' ' + - ol.CoordinateFormat.degreesToHDMS_(coordinate.x, 'EW'); + return ol3.CoordinateFormat.degreesToHDMS_(coordinate.y, 'NS') + ' ' + + ol3.CoordinateFormat.degreesToHDMS_(coordinate.x, 'EW'); } else { return ''; } diff --git a/src/ol3/base/coveragearea.js b/src/ol3/base/coveragearea.js new file mode 100644 index 0000000000..a7c505a980 --- /dev/null +++ b/src/ol3/base/coveragearea.js @@ -0,0 +1,45 @@ +goog.provide('ol3.CoverageArea'); + +goog.require('ol3.Extent'); + + + +/** + * @constructor + * @param {ol3.Extent} extent Extent. + */ +ol3.CoverageArea = function(extent) { + + /** + * @type {ol3.Extent} + */ + this.extent = extent; + +}; + + +/** + * @param {ol3.Extent} extent Extent. + * @return {boolean} Intersects. + */ +ol3.CoverageArea.prototype.intersectsExtent = function(extent) { + return this.extent.intersects(extent); +}; + + +/** + * @param {ol3.Extent} extent Extent. + * @param {number} resolution Resolution. + * @return {boolean} Intersects. + */ +ol3.CoverageArea.prototype.intersectsExtentAndResolution = goog.abstractMethod; + + +/** + * @param {ol3.TransformFunction} transformFn Transform. + * @return {ol3.CoverageArea} Transformed coverage area. + */ +ol3.CoverageArea.prototype.transform = function(transformFn) { + var extent = this.extent.transform(transformFn); + return new ol3.CoverageArea(extent); +}; diff --git a/src/ol3/base/createmap.js b/src/ol3/base/createmap.js new file mode 100644 index 0000000000..079ffa4dd6 --- /dev/null +++ b/src/ol3/base/createmap.js @@ -0,0 +1,153 @@ +goog.provide('ol3.RendererHint'); +goog.provide('ol3.createMap'); + +goog.require('goog.object'); +goog.require('ol3.Collection'); +goog.require('ol3.Map'); +goog.require('ol3.MapProperty'); +goog.require('ol3.Projection'); +goog.require('ol3.dom'); +goog.require('ol3.dom.MapRenderer'); +goog.require('ol3.interaction.AltDragRotate'); +goog.require('ol3.interaction.CenterConstraint'); +goog.require('ol3.interaction.Constraints'); +goog.require('ol3.interaction.DblClickZoom'); +goog.require('ol3.interaction.DragPan'); +goog.require('ol3.interaction.KeyboardPan'); +goog.require('ol3.interaction.KeyboardZoom'); +goog.require('ol3.interaction.MouseWheelZoom'); +goog.require('ol3.interaction.ResolutionConstraint'); +goog.require('ol3.interaction.RotationConstraint'); +goog.require('ol3.interaction.ShiftDragZoom'); +goog.require('ol3.webgl'); +goog.require('ol3.webgl.MapRenderer'); + + +/** + * @define {string} Default projection code. + */ +ol3.DEFAULT_PROJECTION_CODE = 'EPSG:3857'; + + +/** + * @define {string} Default user projection code. + */ +ol3.DEFAULT_USER_PROJECTION_CODE = 'EPSG:4326'; + + +/** + * @define {boolean} Whether to enable DOM. + */ +ol3.ENABLE_DOM = true; + + +/** + * @define {boolean} Whether to enable WebGL. + */ +ol3.ENABLE_WEBGL = true; + + +/** + * @enum {string} + */ +ol3.RendererHint = { + DOM: 'dom', + WEBGL: 'webgl' +}; + + +/** + * @type {Array.} + */ +ol3.DEFAULT_RENDERER_HINT = [ + ol3.RendererHint.WEBGL, + ol3.RendererHint.DOM +]; + + +/** + * @param {Element} target Target. + * @param {Object.=} opt_values Values. + * @param {ol3.RendererHint|Array.=} opt_rendererHints + * Renderer hints. + * @return {ol3.Map} Map. + */ +ol3.createMap = function(target, opt_values, opt_rendererHints) { + + var values = {}; + if (goog.isDef(opt_values)) { + goog.object.extend(values, opt_values); + } + + // FIXME this should be a configuration option + var centerConstraint = ol3.interaction.CenterConstraint.snapToPixel; + var resolutionConstraint = + ol3.interaction.ResolutionConstraint.createSnapToPower( + Math.exp(Math.log(2) / 8), ol3.Projection.EPSG_3857_HALF_SIZE / 128); + var rotationConstraint = ol3.interaction.RotationConstraint.none; + var constraints = new ol3.interaction.Constraints( + centerConstraint, resolutionConstraint, rotationConstraint); + + if (!goog.object.containsKey(values, ol3.MapProperty.INTERACTIONS)) { + var interactions = new ol3.Collection(); + interactions.push(new ol3.interaction.AltDragRotate(constraints)); + interactions.push(new ol3.interaction.DblClickZoom(constraints)); + interactions.push(new ol3.interaction.DragPan(constraints)); + interactions.push(new ol3.interaction.KeyboardPan(constraints, 16)); + interactions.push(new ol3.interaction.KeyboardZoom(constraints)); + interactions.push(new ol3.interaction.MouseWheelZoom(constraints)); + interactions.push(new ol3.interaction.ShiftDragZoom(constraints)); + values[ol3.MapProperty.INTERACTIONS] = interactions; + } + + if (!goog.object.containsKey(values, ol3.MapProperty.LAYERS)) { + values[ol3.MapProperty.LAYERS] = new ol3.Collection(); + } + + if (!goog.object.containsKey(values, ol3.MapProperty.PROJECTION)) { + values[ol3.MapProperty.PROJECTION] = + ol3.Projection.getFromCode(ol3.DEFAULT_PROJECTION_CODE); + } + + if (!goog.object.containsKey(values, ol3.MapProperty.USER_PROJECTION)) { + values[ol3.MapProperty.USER_PROJECTION] = + ol3.Projection.getFromCode(ol3.DEFAULT_USER_PROJECTION_CODE); + } + + /** + * @type {Array.} + */ + var rendererHints; + if (goog.isDef(opt_rendererHints)) { + if (goog.isArray(opt_rendererHints)) { + rendererHints = opt_rendererHints; + } else { + rendererHints = [opt_rendererHints]; + } + } else { + rendererHints = ol3.DEFAULT_RENDERER_HINT; + } + + var i, rendererHint, rendererConstructor; + for (i = 0; i < rendererHints.length; ++i) { + rendererHint = rendererHints[i]; + if (rendererHint == ol3.RendererHint.DOM) { + if (ol3.ENABLE_DOM && ol3.dom.isSupported()) { + rendererConstructor = ol3.dom.MapRenderer; + break; + } + } else if (rendererHint == ol3.RendererHint.WEBGL) { + if (ol3.ENABLE_WEBGL && ol3.webgl.isSupported()) { + rendererConstructor = ol3.webgl.MapRenderer; + break; + } + } + } + + if (goog.isDef(rendererConstructor)) { + return new ol3.Map(target, rendererConstructor, values); + } else { + return null; + } + +}; diff --git a/src/ol3/base/extent.js b/src/ol3/base/extent.js new file mode 100644 index 0000000000..cd39773171 --- /dev/null +++ b/src/ol3/base/extent.js @@ -0,0 +1,59 @@ +goog.provide('ol3.Extent'); + +goog.require('ol3.Coordinate'); +goog.require('ol3.Rectangle'); +goog.require('ol3.TransformFunction'); + + + +/** + * @constructor + * @extends {ol3.Rectangle} + * @param {number} minX Minimum X. + * @param {number} minY Minimum Y. + * @param {number} maxX Maximum X. + * @param {number} maxY Maximum Y. + */ +ol3.Extent = function(minX, minY, maxX, maxY) { + goog.base(this, minX, minY, maxX, maxY); +}; +goog.inherits(ol3.Extent, ol3.Rectangle); + + +/** + * @param {...ol3.Coordinate} var_args Coordinates. + * @return {!ol3.Extent} Bounding extent. + */ +ol3.Extent.boundingExtent = function(var_args) { + var coordinate0 = arguments[0]; + var extent = new ol3.Extent(coordinate0.x, coordinate0.y, + coordinate0.x, coordinate0.y); + var i; + for (i = 1; i < arguments.length; ++i) { + var coordinate = arguments[i]; + extent.minX = Math.min(extent.minX, coordinate.x); + extent.minY = Math.min(extent.minY, coordinate.y); + extent.maxX = Math.max(extent.maxX, coordinate.x); + extent.maxY = Math.max(extent.maxY, coordinate.y); + } + return extent; +}; + + +/** + * @return {ol3.Extent} Extent. + */ +ol3.Extent.prototype.clone = function() { + return new ol3.Extent(this.minX, this.minY, this.maxX, this.maxY); +}; + + +/** + * @param {ol3.TransformFunction} transformFn Transform function. + * @return {ol3.Extent} Extent. + */ +ol3.Extent.prototype.transform = function(transformFn) { + var min = transformFn(new ol3.Coordinate(this.minX, this.minY)); + var max = transformFn(new ol3.Coordinate(this.maxX, this.maxY)); + return new ol3.Extent(min.x, min.y, max.x, max.y); +}; diff --git a/src/ol/base/extent_test.js b/src/ol3/base/extent_test.js similarity index 74% rename from src/ol/base/extent_test.js rename to src/ol3/base/extent_test.js index 4a5554e9ec..d618847a48 100644 --- a/src/ol/base/extent_test.js +++ b/src/ol3/base/extent_test.js @@ -1,12 +1,12 @@ goog.require('goog.testing.jsunit'); -goog.require('ol.Extent'); -goog.require('ol.Projection'); +goog.require('ol3.Extent'); +goog.require('ol3.Projection'); function testClone() { - var extent = new ol.Extent(1, 2, 3, 4); + var extent = new ol3.Extent(1, 2, 3, 4); var clonedExtent = extent.clone(); - assertTrue(clonedExtent instanceof ol.Extent); + assertTrue(clonedExtent instanceof ol3.Extent); assertFalse(clonedExtent === extent); assertEquals(extent.minX, clonedExtent.minX); assertEquals(extent.minY, clonedExtent.minY); @@ -17,8 +17,8 @@ function testClone() { function testTransform() { var transformFn = - ol.Projection.getTransformFromCodes('EPSG:4326', 'EPSG:3857'); - var sourceExtent = new ol.Extent(-15, -30, 45, 60); + ol3.Projection.getTransformFromCodes('EPSG:4326', 'EPSG:3857'); + var sourceExtent = new ol3.Extent(-15, -30, 45, 60); var destinationExtent = sourceExtent.transform(transformFn); assertNotNullNorUndefined(destinationExtent); // FIXME check values with third-party tool diff --git a/src/ol3/base/layer.js b/src/ol3/base/layer.js new file mode 100644 index 0000000000..f6819e4373 --- /dev/null +++ b/src/ol3/base/layer.js @@ -0,0 +1,228 @@ +goog.provide('ol3.Layer'); +goog.provide('ol3.LayerProperty'); + +goog.require('goog.math'); +goog.require('ol3.Object'); +goog.require('ol3.Store'); + + +/** + * @enum {string} + */ +ol3.LayerProperty = { + BRIGHTNESS: 'brightness', + CONTRAST: 'contrast', + HUE: 'hue', + OPACITY: 'opacity', + SATURATION: 'saturation', + VISIBLE: 'visible' +}; + + + +/** + * @constructor + * @extends {ol3.Object} + * @param {ol3.Store} store Store. + * @param {Object.=} opt_values Values. + */ +ol3.Layer = function(store, opt_values) { + + goog.base(this); + + /** + * @private + * @type {ol3.Store} + */ + this.store_ = store; + + this.setBrightness(0); + this.setContrast(0); + this.setHue(0); + this.setOpacity(1); + this.setSaturation(0); + this.setVisible(true); + + if (goog.isDef(opt_values)) { + this.setValues(opt_values); + } + +}; +goog.inherits(ol3.Layer, ol3.Object); + + +/** + * @return {number} Brightness. + */ +ol3.Layer.prototype.getBrightness = function() { + return /** @type {number} */ this.get(ol3.LayerProperty.BRIGHTNESS); +}; +goog.exportProperty( + ol3.Layer.prototype, + 'getBrightness', + ol3.Layer.prototype.getBrightness); + + +/** + * @return {number} Contrast. + */ +ol3.Layer.prototype.getContrast = function() { + return /** @type {number} */ this.get(ol3.LayerProperty.CONTRAST); +}; +goog.exportProperty( + ol3.Layer.prototype, + 'getContrast', + ol3.Layer.prototype.getContrast); + + +/** + * @return {number} Hue. + */ +ol3.Layer.prototype.getHue = function() { + return /** @type {number} */ this.get(ol3.LayerProperty.HUE); +}; +goog.exportProperty( + ol3.Layer.prototype, + 'getHue', + ol3.Layer.prototype.getHue); + + +/** + * @return {number} Opacity. + */ +ol3.Layer.prototype.getOpacity = function() { + return /** @type {number} */ this.get(ol3.LayerProperty.OPACITY); +}; +goog.exportProperty( + ol3.Layer.prototype, + 'getOpacity', + ol3.Layer.prototype.getOpacity); + + +/** + * @return {number} Saturation. + */ +ol3.Layer.prototype.getSaturation = function() { + return /** @type {number} */ this.get(ol3.LayerProperty.SATURATION); +}; +goog.exportProperty( + ol3.Layer.prototype, + 'getSaturation', + ol3.Layer.prototype.getSaturation); + + +/** + * @return {ol3.Store} Store. + */ +ol3.Layer.prototype.getStore = function() { + return this.store_; +}; + + +/** + * @return {boolean} Visible. + */ +ol3.Layer.prototype.getVisible = function() { + return /** @type {boolean} */ this.get(ol3.LayerProperty.VISIBLE); +}; +goog.exportProperty( + ol3.Layer.prototype, + 'getVisible', + ol3.Layer.prototype.getVisible); + + +/** + * @return {boolean} Is ready. + */ +ol3.Layer.prototype.isReady = function() { + return this.getStore().isReady(); +}; + + +/** + * @param {number} brightness Brightness. + */ +ol3.Layer.prototype.setBrightness = function(brightness) { + brightness = goog.math.clamp(brightness, -1, 1); + if (brightness != this.getBrightness()) { + this.set(ol3.LayerProperty.BRIGHTNESS, brightness); + } +}; +goog.exportProperty( + ol3.Layer.prototype, + 'setBrightness', + ol3.Layer.prototype.setBrightness); + + +/** + * @param {number} contrast Contrast. + */ +ol3.Layer.prototype.setContrast = function(contrast) { + contrast = goog.math.clamp(contrast, -1, 1); + if (contrast != this.getContrast()) { + this.set(ol3.LayerProperty.CONTRAST, contrast); + } +}; +goog.exportProperty( + ol3.Layer.prototype, + 'setContrast', + ol3.Layer.prototype.setContrast); + + +/** + * @param {number} hue Hue. + */ +ol3.Layer.prototype.setHue = function(hue) { + if (hue != this.getHue()) { + this.set(ol3.LayerProperty.HUE, hue); + } +}; +goog.exportProperty( + ol3.Layer.prototype, + 'setHue', + ol3.Layer.prototype.setHue); + + +/** + * @param {number} opacity Opacity. + */ +ol3.Layer.prototype.setOpacity = function(opacity) { + opacity = goog.math.clamp(opacity, 0, 1); + if (opacity != this.getOpacity()) { + this.set(ol3.LayerProperty.OPACITY, opacity); + } +}; +goog.exportProperty( + ol3.Layer.prototype, + 'setOpacity', + ol3.Layer.prototype.setOpacity); + + +/** + * @param {number} saturation Saturation. + */ +ol3.Layer.prototype.setSaturation = function(saturation) { + saturation = goog.math.clamp(saturation, -1, 1); + if (saturation != this.getSaturation()) { + this.set(ol3.LayerProperty.SATURATION, saturation); + } +}; +goog.exportProperty( + ol3.Layer.prototype, + 'setSaturation', + ol3.Layer.prototype.setSaturation); + + +/** + * @param {boolean} visible Visible. + */ +ol3.Layer.prototype.setVisible = function(visible) { + visible = !!visible; + if (visible != this.getVisible()) { + this.set(ol3.LayerProperty.VISIBLE, visible); + } +}; +goog.exportProperty( + ol3.Layer.prototype, + 'setVisible', + ol3.Layer.prototype.setVisible); diff --git a/src/ol3/base/layerrenderer.js b/src/ol3/base/layerrenderer.js new file mode 100644 index 0000000000..e724c679aa --- /dev/null +++ b/src/ol3/base/layerrenderer.js @@ -0,0 +1,127 @@ +goog.provide('ol3.LayerRenderer'); + +goog.require('goog.events'); +goog.require('goog.events.EventType'); +goog.require('ol3.Layer'); +goog.require('ol3.LayerProperty'); +goog.require('ol3.Object'); + + + +/** + * @constructor + * @extends {ol3.Object} + * @param {ol3.MapRenderer} mapRenderer Map renderer. + * @param {ol3.Layer} layer Layer. + */ +ol3.LayerRenderer = function(mapRenderer, layer) { + + goog.base(this); + + /** + * @private + * @type {ol3.MapRenderer} + */ + this.mapRenderer_ = mapRenderer; + + /** + * @private + * @type {ol3.Layer} + */ + this.layer_ = layer; + + goog.events.listen(this.layer_, + ol3.Object.getChangedEventType(ol3.LayerProperty.BRIGHTNESS), + this.handleLayerBrightnessChange, false, this); + + goog.events.listen(this.layer_, + ol3.Object.getChangedEventType(ol3.LayerProperty.CONTRAST), + this.handleLayerContrastChange, false, this); + + goog.events.listen(this.layer_, + ol3.Object.getChangedEventType(ol3.LayerProperty.HUE), + this.handleLayerHueChange, false, this); + + goog.events.listen(this.layer_, goog.events.EventType.LOAD, + this.handleLayerLoad, false, this); + + goog.events.listen(this.layer_, + ol3.Object.getChangedEventType(ol3.LayerProperty.OPACITY), + this.handleLayerOpacityChange, false, this); + + goog.events.listen(this.layer_, + ol3.Object.getChangedEventType(ol3.LayerProperty.SATURATION), + this.handleLayerSaturationChange, false, this); + + goog.events.listen(this.layer_, + ol3.Object.getChangedEventType(ol3.LayerProperty.VISIBLE), + this.handleLayerVisibleChange, false, this); + +}; +goog.inherits(ol3.LayerRenderer, ol3.Object); + + +/** + * @return {ol3.Layer} Layer. + */ +ol3.LayerRenderer.prototype.getLayer = function() { + return this.layer_; +}; + + +/** + * @return {ol3.Map} Map. + */ +ol3.LayerRenderer.prototype.getMap = function() { + return this.mapRenderer_.getMap(); +}; + + +/** + * @return {ol3.MapRenderer} Map renderer. + */ +ol3.LayerRenderer.prototype.getMapRenderer = function() { + return this.mapRenderer_; +}; + + +/** + * @protected + */ +ol3.LayerRenderer.prototype.handleLayerBrightnessChange = goog.nullFunction; + + +/** + * @protected + */ +ol3.LayerRenderer.prototype.handleLayerContrastChange = goog.nullFunction; + + +/** + * @protected + */ +ol3.LayerRenderer.prototype.handleLayerHueChange = goog.nullFunction; + + +/** + * @protected + */ +ol3.LayerRenderer.prototype.handleLayerLoad = goog.nullFunction; + + +/** + * @protected + */ +ol3.LayerRenderer.prototype.handleLayerOpacityChange = goog.nullFunction; + + +/** + * @protected + */ +ol3.LayerRenderer.prototype.handleLayerSaturationChange = goog.nullFunction; + + +/** + * @protected + */ +ol3.LayerRenderer.prototype.handleLayerVisibleChange = goog.nullFunction; diff --git a/src/ol/base/map.js b/src/ol3/base/map.js similarity index 57% rename from src/ol/base/map.js rename to src/ol3/base/map.js index c15ae51cae..1f1ecb57ff 100644 --- a/src/ol/base/map.js +++ b/src/ol3/base/map.js @@ -3,9 +3,9 @@ // FIXME layer renderers should skip when they can't reproject // FIXME add tilt and height? -goog.provide('ol.Map'); -goog.provide('ol.MapEventType'); -goog.provide('ol.MapProperty'); +goog.provide('ol3.Map'); +goog.provide('ol3.MapEventType'); +goog.provide('ol3.MapProperty'); goog.require('goog.array'); goog.require('goog.debug.Logger'); @@ -27,24 +27,24 @@ goog.require('goog.fx.Dragger'); goog.require('goog.fx.anim'); goog.require('goog.fx.anim.Animated'); goog.require('goog.object'); -goog.require('ol.Collection'); -goog.require('ol.Color'); -goog.require('ol.Coordinate'); -goog.require('ol.Extent'); -goog.require('ol.Interaction'); -goog.require('ol.LayerRenderer'); -goog.require('ol.MapBrowserEvent'); -goog.require('ol.Object'); -goog.require('ol.Pixel'); -goog.require('ol.Projection'); -goog.require('ol.Size'); -goog.require('ol.TransformFunction'); +goog.require('ol3.Collection'); +goog.require('ol3.Color'); +goog.require('ol3.Coordinate'); +goog.require('ol3.Extent'); +goog.require('ol3.Interaction'); +goog.require('ol3.LayerRenderer'); +goog.require('ol3.MapBrowserEvent'); +goog.require('ol3.Object'); +goog.require('ol3.Pixel'); +goog.require('ol3.Projection'); +goog.require('ol3.Size'); +goog.require('ol3.TransformFunction'); /** * @enum {string} */ -ol.MapEventType = { +ol3.MapEventType = { POST_RENDER: 'postrender' }; @@ -52,7 +52,7 @@ ol.MapEventType = { /** * @enum {string} */ -ol.MapProperty = { +ol3.MapProperty = { BACKGROUND_COLOR: 'backgroundColor', CENTER: 'center', INTERACTIONS: 'interactions', @@ -68,7 +68,7 @@ ol.MapProperty = { /** * @enum {number} */ -ol.MapPaneZIndex = { +ol3.MapPaneZIndex = { VIEWPORT: 1000 }; @@ -76,16 +76,16 @@ ol.MapPaneZIndex = { /** * @constructor - * @extends {ol.Object} + * @extends {ol3.Object} * @implements {goog.fx.anim.Animated} * @param {Element} container Container. - * @param {function(new: ol.MapRenderer, Element, ol.Map)} rendererConstructor + * @param {function(new: ol3.MapRenderer, Element, ol3.Map)} rendererConstructor * Renderer constructor. * @param {Object=} opt_values Values. * @param {goog.dom.ViewportSizeMonitor=} opt_viewportSizeMonitor * Viewport size monitor. */ -ol.Map = function( +ol3.Map = function( container, rendererConstructor, opt_values, opt_viewportSizeMonitor) { goog.base(this); @@ -95,20 +95,20 @@ ol.Map = function( * @protected * @type {goog.debug.Logger} */ - this.logger = goog.debug.Logger.getLogger('ol.map.' + goog.getUid(this)); + this.logger = goog.debug.Logger.getLogger('ol3.map.' + goog.getUid(this)); } /** - * @type {ol.TransformFunction} + * @type {ol3.TransformFunction} * @private */ - this.userToMapTransform_ = ol.Projection.identityTransform; + this.userToMapTransform_ = ol3.Projection.identityTransform; /** - * @type {ol.TransformFunction} + * @type {ol3.TransformFunction} * @private */ - this.mapToUserTransform_ = ol.Projection.cloneTransform; + this.mapToUserTransform_ = ol3.Projection.cloneTransform; /** * @private @@ -150,7 +150,7 @@ ol.Map = function( this.viewport_.style.overflow = 'hidden'; this.viewport_.style.width = '100%'; this.viewport_.style.height = '100%'; - this.viewport_.style.zIndex = ol.MapPaneZIndex.VIEWPORT; + this.viewport_.style.zIndex = ol3.MapPaneZIndex.VIEWPORT; goog.dom.appendChild(container, this.viewport_); goog.events.listen(this.viewport_, [ @@ -179,7 +179,7 @@ ol.Map = function( this.registerDisposable(dragger); /** - * @type {ol.MapRenderer} + * @type {ol3.MapRenderer} * @private */ this.renderer_ = new rendererConstructor(this.viewport_, this); @@ -196,11 +196,11 @@ ol.Map = function( this.handleBrowserWindowResize, false, this); goog.events.listen( - this, ol.Object.getChangedEventType(ol.MapProperty.PROJECTION), + this, ol3.Object.getChangedEventType(ol3.MapProperty.PROJECTION), this.handleProjectionChanged, false, this); goog.events.listen( - this, ol.Object.getChangedEventType(ol.MapProperty.USER_PROJECTION), + this, ol3.Object.getChangedEventType(ol3.MapProperty.USER_PROJECTION), this.handleUserProjectionChanged, false, this); if (goog.isDef(opt_values)) { @@ -210,21 +210,21 @@ ol.Map = function( this.handleBrowserWindowResize(); }; -goog.inherits(ol.Map, ol.Object); +goog.inherits(ol3.Map, ol3.Object); /** * @return {boolean} Can rotate. */ -ol.Map.prototype.canRotate = function() { +ol3.Map.prototype.canRotate = function() { return this.renderer_.canRotate(); }; /** - * @param {ol.Extent} extent Extent. + * @param {ol3.Extent} extent Extent. */ -ol.Map.prototype.fitExtent = function(extent) { +ol3.Map.prototype.fitExtent = function(extent) { this.withFrozenRendering(function() { this.setCenter(extent.getCenter()); this.setResolution(this.getResolutionForExtent(extent)); @@ -236,58 +236,58 @@ ol.Map.prototype.fitExtent = function(extent) { /** - * @param {ol.Extent} userExtent Extent in user projection. + * @param {ol3.Extent} userExtent Extent in user projection. */ -ol.Map.prototype.fitUserExtent = function(userExtent) { +ol3.Map.prototype.fitUserExtent = function(userExtent) { this.fitExtent(userExtent.transform(this.userToMapTransform_)); }; /** */ -ol.Map.prototype.freezeRendering = function() { +ol3.Map.prototype.freezeRendering = function() { ++this.freezeRenderingCount_; }; /** - * @return {ol.Color|undefined} Background color. + * @return {ol3.Color|undefined} Background color. */ -ol.Map.prototype.getBackgroundColor = function() { - return /** @type {ol.Color|undefined} */ ( - this.get(ol.MapProperty.BACKGROUND_COLOR)); +ol3.Map.prototype.getBackgroundColor = function() { + return /** @type {ol3.Color|undefined} */ ( + this.get(ol3.MapProperty.BACKGROUND_COLOR)); }; goog.exportProperty( - ol.Map.prototype, + ol3.Map.prototype, 'getBackgroundColor', - ol.Map.prototype.getBackgroundColor); + ol3.Map.prototype.getBackgroundColor); /** - * @return {ol.Coordinate|undefined} Center. + * @return {ol3.Coordinate|undefined} Center. */ -ol.Map.prototype.getCenter = function() { - return /** @type {ol.Coordinate} */ this.get(ol.MapProperty.CENTER); +ol3.Map.prototype.getCenter = function() { + return /** @type {ol3.Coordinate} */ this.get(ol3.MapProperty.CENTER); }; goog.exportProperty( - ol.Map.prototype, + ol3.Map.prototype, 'getCenter', - ol.Map.prototype.getCenter); + ol3.Map.prototype.getCenter); /** * @return {Element} Container. */ -ol.Map.prototype.getContainer = function() { +ol3.Map.prototype.getContainer = function() { return this.container_; }; /** - * @param {ol.Pixel} pixel Pixel. - * @return {ol.Coordinate|undefined} Coordinate. + * @param {ol3.Pixel} pixel Pixel. + * @return {ol3.Coordinate|undefined} Coordinate. */ -ol.Map.prototype.getCoordinateFromPixel = function(pixel) { +ol3.Map.prototype.getCoordinateFromPixel = function(pixel) { if (this.isDef()) { return this.renderer_.getCoordinateFromPixel(pixel); } else { @@ -297,9 +297,9 @@ ol.Map.prototype.getCoordinateFromPixel = function(pixel) { /** - * @return {ol.Extent|undefined} Extent. + * @return {ol3.Extent|undefined} Extent. */ -ol.Map.prototype.getExtent = function() { +ol3.Map.prototype.getExtent = function() { if (this.isDef()) { var center = this.getCenter(); var resolution = this.getResolution(); @@ -308,7 +308,7 @@ ol.Map.prototype.getExtent = function() { var minY = center.y - resolution * size.height / 2; var maxX = center.x + resolution * size.width / 2; var maxY = center.y + resolution * size.height / 2; - return new ol.Extent(minX, minY, maxX, maxY); + return new ol3.Extent(minX, minY, maxX, maxY); } else { return undefined; } @@ -316,30 +316,30 @@ ol.Map.prototype.getExtent = function() { /** - * @return {ol.Collection} Interactions. + * @return {ol3.Collection} Interactions. */ -ol.Map.prototype.getInteractions = function() { - return /** @type {ol.Collection} */ this.get(ol.MapProperty.INTERACTIONS); +ol3.Map.prototype.getInteractions = function() { + return /** @type {ol3.Collection} */ this.get(ol3.MapProperty.INTERACTIONS); }; goog.exportProperty( - ol.Map.prototype, + ol3.Map.prototype, 'getInteractions', - ol.Map.prototype.getInteractions); + ol3.Map.prototype.getInteractions); /** - * @return {ol.Collection} Layers. + * @return {ol3.Collection} Layers. */ -ol.Map.prototype.getLayers = function() { - return /** @type {ol.Collection} */ (this.get(ol.MapProperty.LAYERS)); +ol3.Map.prototype.getLayers = function() { + return /** @type {ol3.Collection} */ (this.get(ol3.MapProperty.LAYERS)); }; /** - * @param {ol.Coordinate} coordinate Coordinate. - * @return {ol.Pixel|undefined} Pixel. + * @param {ol3.Coordinate} coordinate Coordinate. + * @return {ol3.Pixel|undefined} Pixel. */ -ol.Map.prototype.getPixelFromCoordinate = function(coordinate) { +ol3.Map.prototype.getPixelFromCoordinate = function(coordinate) { if (this.isDef()) { return this.renderer_.getPixelFromCoordinate(coordinate); } else { @@ -349,34 +349,34 @@ ol.Map.prototype.getPixelFromCoordinate = function(coordinate) { /** - * @return {ol.Projection|undefined} Projection. + * @return {ol3.Projection|undefined} Projection. */ -ol.Map.prototype.getProjection = function() { - return /** @type {ol.Projection} */ this.get(ol.MapProperty.PROJECTION); +ol3.Map.prototype.getProjection = function() { + return /** @type {ol3.Projection} */ this.get(ol3.MapProperty.PROJECTION); }; goog.exportProperty( - ol.Map.prototype, + ol3.Map.prototype, 'getProjection', - ol.Map.prototype.getProjection); + ol3.Map.prototype.getProjection); /** * @return {number|undefined} Resolution. */ -ol.Map.prototype.getResolution = function() { - return /** @type {number} */ this.get(ol.MapProperty.RESOLUTION); +ol3.Map.prototype.getResolution = function() { + return /** @type {number} */ this.get(ol3.MapProperty.RESOLUTION); }; goog.exportProperty( - ol.Map.prototype, + ol3.Map.prototype, 'getResolution', - ol.Map.prototype.getResolution); + ol3.Map.prototype.getResolution); /** - * @param {ol.Extent} extent Extent. + * @param {ol3.Extent} extent Extent. * @return {number|undefined} Resolution. */ -ol.Map.prototype.getResolutionForExtent = function(extent) { +ol3.Map.prototype.getResolutionForExtent = function(extent) { var size = this.getSize(); if (goog.isDef(size)) { var xResolution = (extent.maxX - extent.minX) / size.width; @@ -389,58 +389,58 @@ ol.Map.prototype.getResolutionForExtent = function(extent) { /** - * @return {ol.Extent} Rotated extent. + * @return {ol3.Extent} Rotated extent. */ -ol.Map.prototype.getRotatedExtent = function() { +ol3.Map.prototype.getRotatedExtent = function() { goog.asserts.assert(this.isDef()); - var center = /** @type {!ol.Coordinate} */ this.getCenter(); + var center = /** @type {!ol3.Coordinate} */ this.getCenter(); var resolution = this.getResolution(); var rotation = this.getRotation() || 0; var size = this.getSize(); var xScale = resolution * size.width / 2; var yScale = resolution * size.height / 2; var corners = [ - new ol.Coordinate(-xScale, -yScale), - new ol.Coordinate(-xScale, yScale), - new ol.Coordinate(xScale, -yScale), - new ol.Coordinate(xScale, yScale) + new ol3.Coordinate(-xScale, -yScale), + new ol3.Coordinate(-xScale, yScale), + new ol3.Coordinate(xScale, -yScale), + new ol3.Coordinate(xScale, yScale) ]; goog.array.forEach(corners, function(corner) { corner.rotate(rotation); corner.add(center); }); - return ol.Extent.boundingExtent.apply(null, corners); + return ol3.Extent.boundingExtent.apply(null, corners); }; /** * @return {number|undefined} Rotation. */ -ol.Map.prototype.getRotation = function() { - return /** @type {number|undefined} */ this.get(ol.MapProperty.ROTATION); +ol3.Map.prototype.getRotation = function() { + return /** @type {number|undefined} */ this.get(ol3.MapProperty.ROTATION); }; goog.exportProperty( - ol.Map.prototype, + ol3.Map.prototype, 'getRotation', - ol.Map.prototype.getRotation); + ol3.Map.prototype.getRotation); /** - * @return {ol.Size|undefined} Size. + * @return {ol3.Size|undefined} Size. */ -ol.Map.prototype.getSize = function() { - return /** @type {ol.Size|undefined} */ this.get(ol.MapProperty.SIZE); +ol3.Map.prototype.getSize = function() { + return /** @type {ol3.Size|undefined} */ this.get(ol3.MapProperty.SIZE); }; goog.exportProperty( - ol.Map.prototype, + ol3.Map.prototype, 'getSize', - ol.Map.prototype.getSize); + ol3.Map.prototype.getSize); /** - * @return {ol.Coordinate|undefined} Center in user projection. + * @return {ol3.Coordinate|undefined} Center in user projection. */ -ol.Map.prototype.getUserCenter = function() { +ol3.Map.prototype.getUserCenter = function() { var center = this.getCenter(); if (goog.isDef(center)) { return this.mapToUserTransform_(center); @@ -451,9 +451,9 @@ ol.Map.prototype.getUserCenter = function() { /** - * @return {ol.Extent|undefined} Extent in user projection. + * @return {ol3.Extent|undefined} Extent in user projection. */ -ol.Map.prototype.getUserExtent = function() { +ol3.Map.prototype.getUserExtent = function() { var extent = this.getExtent(); if (goog.isDef(extent)) { return extent.transform(this.mapToUserTransform_); @@ -465,21 +465,22 @@ ol.Map.prototype.getUserExtent = function() { /** * @export - * @return {ol.Projection|undefined} Projection. + * @return {ol3.Projection|undefined} Projection. */ -ol.Map.prototype.getUserProjection = function() { - return /** @type {ol.Projection} */ this.get(ol.MapProperty.USER_PROJECTION); +ol3.Map.prototype.getUserProjection = function() { + return /** @type {ol3.Projection} */ this.get( + ol3.MapProperty.USER_PROJECTION); }; goog.exportProperty( - ol.Map.prototype, + ol3.Map.prototype, 'getUserProjection', - ol.Map.prototype.getUserProjection); + ol3.Map.prototype.getUserProjection); /** * @return {Element} Viewport. */ -ol.Map.prototype.getViewport = function() { +ol3.Map.prototype.getViewport = function() { return this.viewport_; }; @@ -488,11 +489,11 @@ ol.Map.prototype.getViewport = function() { * @param {goog.events.BrowserEvent} browserEvent Browser event. * @param {string=} opt_type Type. */ -ol.Map.prototype.handleBrowserEvent = function(browserEvent, opt_type) { +ol3.Map.prototype.handleBrowserEvent = function(browserEvent, opt_type) { var type = opt_type || browserEvent.type; - var mapBrowserEvent = new ol.MapBrowserEvent(type, this, browserEvent); + var mapBrowserEvent = new ol3.MapBrowserEvent(type, this, browserEvent); var interactions = this.getInteractions(); - var interactionsArray = /** @type {Array.} */ + var interactionsArray = /** @type {Array.} */ interactions.getArray(); goog.array.every(interactionsArray, function(interaction) { interaction.handleMapBrowserEvent(mapBrowserEvent); @@ -504,7 +505,7 @@ ol.Map.prototype.handleBrowserEvent = function(browserEvent, opt_type) { /** * @param {goog.fx.DragEvent} dragEvent Drag event. */ -ol.Map.prototype.handleDraggerEvent = function(dragEvent) { +ol3.Map.prototype.handleDraggerEvent = function(dragEvent) { var browserEvent = dragEvent.browserEvent; this.handleBrowserEvent(browserEvent, dragEvent.type); }; @@ -513,7 +514,7 @@ ol.Map.prototype.handleDraggerEvent = function(dragEvent) { /** * @protected */ -ol.Map.prototype.handleProjectionChanged = function() { +ol3.Map.prototype.handleProjectionChanged = function() { this.recalculateTransforms_(); }; @@ -521,7 +522,7 @@ ol.Map.prototype.handleProjectionChanged = function() { /** * @protected */ -ol.Map.prototype.handleUserProjectionChanged = function() { +ol3.Map.prototype.handleUserProjectionChanged = function() { this.recalculateTransforms_(); }; @@ -529,8 +530,8 @@ ol.Map.prototype.handleUserProjectionChanged = function() { /** * @protected */ -ol.Map.prototype.handleBrowserWindowResize = function() { - var size = new ol.Size(this.container_.clientWidth, +ol3.Map.prototype.handleBrowserWindowResize = function() { + var size = new ol3.Size(this.container_.clientWidth, this.container_.clientHeight); this.setSize(size); }; @@ -539,7 +540,7 @@ ol.Map.prototype.handleBrowserWindowResize = function() { /** * @return {boolean} Is animating. */ -ol.Map.prototype.isAnimating = function() { +ol3.Map.prototype.isAnimating = function() { return this.animatingCount_ > 0; }; @@ -547,7 +548,7 @@ ol.Map.prototype.isAnimating = function() { /** * @return {boolean} Is defined. */ -ol.Map.prototype.isDef = function() { +ol3.Map.prototype.isDef = function() { return goog.isDefAndNotNull(this.getCenter()) && goog.isDef(this.getResolution()) && goog.isDefAndNotNull(this.getSize()); @@ -557,7 +558,7 @@ ol.Map.prototype.isDef = function() { /** * @inheritDoc */ -ol.Map.prototype.onAnimationFrame = function() { +ol3.Map.prototype.onAnimationFrame = function() { if (goog.DEBUG) { this.logger.info('onAnimationFrame'); } @@ -568,25 +569,25 @@ ol.Map.prototype.onAnimationFrame = function() { /** * @private */ -ol.Map.prototype.recalculateTransforms_ = function() { +ol3.Map.prototype.recalculateTransforms_ = function() { var projection = this.getProjection(); var userProjection = this.getUserProjection(); if (goog.isDefAndNotNull(projection) && goog.isDefAndNotNull(userProjection)) { - this.mapToUserTransform_ = ol.Projection.getTransform( + this.mapToUserTransform_ = ol3.Projection.getTransform( projection, userProjection); - this.userToMapTransform_ = ol.Projection.getTransform( + this.userToMapTransform_ = ol3.Projection.getTransform( userProjection, projection); } else { - this.mapToUserTransform_ = ol.Projection.cloneTransform; - this.userToMapTransform_ = ol.Projection.identityTransform; + this.mapToUserTransform_ = ol3.Projection.cloneTransform; + this.userToMapTransform_ = ol3.Projection.identityTransform; } }; /** */ -ol.Map.prototype.render = function() { +ol3.Map.prototype.render = function() { if (this.animatingCount_ < 1) { if (this.freezeRenderingCount_ === 0) { this.renderFrame_(); @@ -600,7 +601,7 @@ ol.Map.prototype.render = function() { /** * @private */ -ol.Map.prototype.renderFrame_ = function() { +ol3.Map.prototype.renderFrame_ = function() { if (goog.DEBUG) { this.logger.info('renderFrame_'); } @@ -617,142 +618,142 @@ ol.Map.prototype.renderFrame_ = function() { if (goog.DEBUG) { this.logger.info('postrender'); } - this.dispatchEvent(ol.MapEventType.POST_RENDER); + this.dispatchEvent(ol3.MapEventType.POST_RENDER); }; /** - * @param {ol.Color} backgroundColor Background color. + * @param {ol3.Color} backgroundColor Background color. */ -ol.Map.prototype.setBackgroundColor = function(backgroundColor) { - this.set(ol.MapProperty.BACKGROUND_COLOR, backgroundColor); +ol3.Map.prototype.setBackgroundColor = function(backgroundColor) { + this.set(ol3.MapProperty.BACKGROUND_COLOR, backgroundColor); }; goog.exportProperty( - ol.Map.prototype, + ol3.Map.prototype, 'setBackgroundColor', - ol.Map.prototype.setBackgroundColor); + ol3.Map.prototype.setBackgroundColor); /** - * @param {ol.Coordinate|undefined} center Center. + * @param {ol3.Coordinate|undefined} center Center. */ -ol.Map.prototype.setCenter = function(center) { - this.set(ol.MapProperty.CENTER, center); +ol3.Map.prototype.setCenter = function(center) { + this.set(ol3.MapProperty.CENTER, center); }; goog.exportProperty( - ol.Map.prototype, + ol3.Map.prototype, 'setCenter', - ol.Map.prototype.setCenter); + ol3.Map.prototype.setCenter); /** - * @param {ol.Collection} interactions Interactions. + * @param {ol3.Collection} interactions Interactions. */ -ol.Map.prototype.setInteractions = function(interactions) { - this.set(ol.MapProperty.INTERACTIONS, interactions); +ol3.Map.prototype.setInteractions = function(interactions) { + this.set(ol3.MapProperty.INTERACTIONS, interactions); }; goog.exportProperty( - ol.Map.prototype, + ol3.Map.prototype, 'setInteractions', - ol.Map.prototype.setInteractions); + ol3.Map.prototype.setInteractions); /** * @export - * @param {ol.Collection} layers Layers. + * @param {ol3.Collection} layers Layers. */ -ol.Map.prototype.setLayers = function(layers) { - this.set(ol.MapProperty.LAYERS, layers); +ol3.Map.prototype.setLayers = function(layers) { + this.set(ol3.MapProperty.LAYERS, layers); }; goog.exportProperty( - ol.Map.prototype, + ol3.Map.prototype, 'setLayers', - ol.Map.prototype.setLayers); + ol3.Map.prototype.setLayers); /** * @export - * @param {ol.Projection} projection Projection. + * @param {ol3.Projection} projection Projection. */ -ol.Map.prototype.setProjection = function(projection) { - this.set(ol.MapProperty.PROJECTION, projection); +ol3.Map.prototype.setProjection = function(projection) { + this.set(ol3.MapProperty.PROJECTION, projection); }; goog.exportProperty( - ol.Map.prototype, + ol3.Map.prototype, 'setProjection', - ol.Map.prototype.setProjection); + ol3.Map.prototype.setProjection); /** * @export * @param {number|undefined} resolution Resolution. */ -ol.Map.prototype.setResolution = function(resolution) { - this.set(ol.MapProperty.RESOLUTION, resolution); +ol3.Map.prototype.setResolution = function(resolution) { + this.set(ol3.MapProperty.RESOLUTION, resolution); }; goog.exportProperty( - ol.Map.prototype, + ol3.Map.prototype, 'setResolution', - ol.Map.prototype.setResolution); + ol3.Map.prototype.setResolution); /** * @export * @param {number|undefined} rotation Rotation. */ -ol.Map.prototype.setRotation = function(rotation) { - this.set(ol.MapProperty.ROTATION, rotation); +ol3.Map.prototype.setRotation = function(rotation) { + this.set(ol3.MapProperty.ROTATION, rotation); }; goog.exportProperty( - ol.Map.prototype, + ol3.Map.prototype, 'setRotation', - ol.Map.prototype.setRotation); + ol3.Map.prototype.setRotation); /** - * @param {ol.Size} size Size. + * @param {ol3.Size} size Size. */ -ol.Map.prototype.setSize = function(size) { +ol3.Map.prototype.setSize = function(size) { var currentSize = this.getSize(); if (!goog.isDef(currentSize) || !currentSize.equals(size)) { - this.set(ol.MapProperty.SIZE, size); + this.set(ol3.MapProperty.SIZE, size); } }; goog.exportProperty( - ol.Map.prototype, + ol3.Map.prototype, 'setSize', - ol.Map.prototype.setSize); + ol3.Map.prototype.setSize); /** * @export - * @param {ol.Coordinate} userCenter Center in user projection. + * @param {ol3.Coordinate} userCenter Center in user projection. */ -ol.Map.prototype.setUserCenter = function(userCenter) { +ol3.Map.prototype.setUserCenter = function(userCenter) { this.setCenter(this.userToMapTransform_(userCenter)); }; goog.exportProperty( - ol.Map.prototype, + ol3.Map.prototype, 'setUserCenter', - ol.Map.prototype.setUserCenter); + ol3.Map.prototype.setUserCenter); /** * @export - * @param {ol.Projection} userProjection User projection. + * @param {ol3.Projection} userProjection User projection. */ -ol.Map.prototype.setUserProjection = function(userProjection) { - this.set(ol.MapProperty.USER_PROJECTION, userProjection); +ol3.Map.prototype.setUserProjection = function(userProjection) { + this.set(ol3.MapProperty.USER_PROJECTION, userProjection); }; goog.exportProperty( - ol.Map.prototype, + ol3.Map.prototype, 'setUserProjection', - ol.Map.prototype.setUserProjection); + ol3.Map.prototype.setUserProjection); /** */ -ol.Map.prototype.startAnimating = function() { +ol3.Map.prototype.startAnimating = function() { if (++this.animatingCount_ == 1) { if (goog.DEBUG) { this.logger.info('startAnimating'); @@ -764,7 +765,7 @@ ol.Map.prototype.startAnimating = function() { /** */ -ol.Map.prototype.stopAnimating = function() { +ol3.Map.prototype.stopAnimating = function() { goog.asserts.assert(this.animatingCount_ > 0); if (--this.animatingCount_ === 0) { if (goog.DEBUG) { @@ -777,7 +778,7 @@ ol.Map.prototype.stopAnimating = function() { /** */ -ol.Map.prototype.unfreezeRendering = function() { +ol3.Map.prototype.unfreezeRendering = function() { goog.asserts.assert(this.freezeRenderingCount_ > 0); if (--this.freezeRenderingCount_ === 0 && this.animatingCount_ < 1 && @@ -792,7 +793,7 @@ ol.Map.prototype.unfreezeRendering = function() { * @param {T=} opt_obj Object. * @template T */ -ol.Map.prototype.withFrozenRendering = function(f, opt_obj) { +ol3.Map.prototype.withFrozenRendering = function(f, opt_obj) { this.freezeRendering(); try { f.call(opt_obj); diff --git a/src/ol/base/mapbrowserevent.js b/src/ol3/base/mapbrowserevent.js similarity index 60% rename from src/ol/base/mapbrowserevent.js rename to src/ol3/base/mapbrowserevent.js index 0fa253d952..25b8081b04 100644 --- a/src/ol/base/mapbrowserevent.js +++ b/src/ol3/base/mapbrowserevent.js @@ -1,21 +1,21 @@ -goog.provide('ol.MapBrowserEvent'); +goog.provide('ol3.MapBrowserEvent'); goog.require('goog.events.BrowserEvent'); goog.require('goog.style'); -goog.require('ol.Coordinate'); -goog.require('ol.MapEvent'); -goog.require('ol.Pixel'); +goog.require('ol3.Coordinate'); +goog.require('ol3.MapEvent'); +goog.require('ol3.Pixel'); /** * @constructor - * @extends {ol.MapEvent} + * @extends {ol3.MapEvent} * @param {string} type Event type. - * @param {ol.Map} map Map. + * @param {ol3.Map} map Map. * @param {goog.events.BrowserEvent} browserEvent Browser event. */ -ol.MapBrowserEvent = function(type, map, browserEvent) { +ol3.MapBrowserEvent = function(type, map, browserEvent) { goog.base(this, type, map); @@ -26,18 +26,18 @@ ol.MapBrowserEvent = function(type, map, browserEvent) { /** * @private - * @type {ol.Coordinate|undefined} + * @type {ol3.Coordinate|undefined} */ this.coordinate_ = undefined; }; -goog.inherits(ol.MapBrowserEvent, ol.MapEvent); +goog.inherits(ol3.MapBrowserEvent, ol3.MapEvent); /** - * @return {ol.Coordinate|undefined} Coordinate. + * @return {ol3.Coordinate|undefined} Coordinate. */ -ol.MapBrowserEvent.prototype.getCoordinate = function() { +ol3.MapBrowserEvent.prototype.getCoordinate = function() { if (goog.isDef(this.coordinate_)) { return this.coordinate_; } else { @@ -45,7 +45,7 @@ ol.MapBrowserEvent.prototype.getCoordinate = function() { var browserEvent = this.browserEvent; var eventPosition = goog.style.getRelativePosition( browserEvent, map.getViewport()); - var pixel = new ol.Pixel(eventPosition.x, eventPosition.y); + var pixel = new ol3.Pixel(eventPosition.x, eventPosition.y); var coordinate = map.getCoordinateFromPixel(pixel); this.coordinate_ = coordinate; return coordinate; diff --git a/src/ol/base/mapevent.js b/src/ol3/base/mapevent.js similarity index 61% rename from src/ol/base/mapevent.js rename to src/ol3/base/mapevent.js index 8a878be0b9..52bd32a23a 100644 --- a/src/ol/base/mapevent.js +++ b/src/ol3/base/mapevent.js @@ -1,4 +1,4 @@ -goog.provide('ol.MapEvent'); +goog.provide('ol3.MapEvent'); goog.require('goog.events.Event'); @@ -8,14 +8,14 @@ goog.require('goog.events.Event'); * @constructor * @extends {goog.events.Event} * @param {string} type Event type. - * @param {ol.Map} map Map. + * @param {ol3.Map} map Map. */ -ol.MapEvent = function(type, map) { +ol3.MapEvent = function(type, map) { goog.base(this, type); /** - * @type {ol.Map} + * @type {ol3.Map} */ this.map = map; @@ -25,12 +25,12 @@ ol.MapEvent = function(type, map) { this.defaultPrevented = false; }; -goog.inherits(ol.MapEvent, goog.events.Event); +goog.inherits(ol3.MapEvent, goog.events.Event); /** */ -ol.MapEvent.prototype.preventDefault = function() { +ol3.MapEvent.prototype.preventDefault = function() { goog.base(this, 'preventDefault'); this.defaultPrevented = true; }; diff --git a/src/ol/base/maprenderer.js b/src/ol3/base/maprenderer.js similarity index 62% rename from src/ol/base/maprenderer.js rename to src/ol3/base/maprenderer.js index 792bbe6179..537b44113b 100644 --- a/src/ol/base/maprenderer.js +++ b/src/ol3/base/maprenderer.js @@ -1,12 +1,12 @@ -goog.provide('ol.MapRenderer'); +goog.provide('ol3.MapRenderer'); goog.require('goog.Disposable'); goog.require('goog.events'); goog.require('goog.fx.anim'); goog.require('goog.fx.anim.Animated'); goog.require('goog.vec.Mat4'); -goog.require('ol.Map'); -goog.require('ol.MapProperty'); +goog.require('ol3.Map'); +goog.require('ol3.MapProperty'); @@ -14,9 +14,9 @@ goog.require('ol.MapProperty'); * @constructor * @extends {goog.Disposable} * @param {Element} container Container. - * @param {ol.Map} map Map. + * @param {ol3.Map} map Map. */ -ol.MapRenderer = function(container, map) { +ol3.MapRenderer = function(container, map) { goog.base(this); @@ -28,13 +28,13 @@ ol.MapRenderer = function(container, map) { /** * @protected - * @type {ol.Map} + * @type {ol3.Map} */ this.map = map; /** * @protected - * @type {Object.} + * @type {Object.} */ this.layerRenderers = {}; @@ -68,39 +68,39 @@ ol.MapRenderer = function(container, map) { */ this.mapListenerKeys_ = [ goog.events.listen( - map, ol.Object.getChangedEventType(ol.MapProperty.BACKGROUND_COLOR), + map, ol3.Object.getChangedEventType(ol3.MapProperty.BACKGROUND_COLOR), this.handleBackgroundColorChanged, false, this), goog.events.listen( - map, ol.Object.getChangedEventType(ol.MapProperty.CENTER), + map, ol3.Object.getChangedEventType(ol3.MapProperty.CENTER), this.handleCenterChanged, false, this), goog.events.listen( - map, ol.Object.getChangedEventType(ol.MapProperty.LAYERS), + map, ol3.Object.getChangedEventType(ol3.MapProperty.LAYERS), this.handleLayersChanged, false, this), goog.events.listen( - map, ol.Object.getChangedEventType(ol.MapProperty.RESOLUTION), + map, ol3.Object.getChangedEventType(ol3.MapProperty.RESOLUTION), this.handleResolutionChanged, false, this), goog.events.listen( - map, ol.Object.getChangedEventType(ol.MapProperty.ROTATION), + map, ol3.Object.getChangedEventType(ol3.MapProperty.ROTATION), this.handleRotationChanged, false, this), goog.events.listen( - map, ol.Object.getChangedEventType(ol.MapProperty.SIZE), + map, ol3.Object.getChangedEventType(ol3.MapProperty.SIZE), this.handleSizeChanged, false, this) ]; }; -goog.inherits(ol.MapRenderer, goog.Disposable); +goog.inherits(ol3.MapRenderer, goog.Disposable); /** - * @param {ol.Layer} layer Layer. + * @param {ol3.Layer} layer Layer. * @protected */ -ol.MapRenderer.prototype.addLayer = function(layer) { +ol3.MapRenderer.prototype.addLayer = function(layer) { var layerRenderer = this.createLayerRenderer(layer); this.setLayerRenderer(layer, layerRenderer); }; @@ -109,21 +109,21 @@ ol.MapRenderer.prototype.addLayer = function(layer) { /** * @return {boolean} Can rotate. */ -ol.MapRenderer.prototype.canRotate = goog.functions.FALSE; +ol3.MapRenderer.prototype.canRotate = goog.functions.FALSE; /** - * @param {ol.Layer} layer Layer. + * @param {ol3.Layer} layer Layer. * @protected - * @return {ol.LayerRenderer} layerRenderer Layer renderer. + * @return {ol3.LayerRenderer} layerRenderer Layer renderer. */ -ol.MapRenderer.prototype.createLayerRenderer = goog.abstractMethod; +ol3.MapRenderer.prototype.createLayerRenderer = goog.abstractMethod; /** * @inheritDoc */ -ol.MapRenderer.prototype.disposeInternal = function() { +ol3.MapRenderer.prototype.disposeInternal = function() { goog.object.forEach(this.layerRenderers, function(layerRenderer) { goog.dispose(layerRenderer); }); @@ -136,11 +136,11 @@ ol.MapRenderer.prototype.disposeInternal = function() { /** - * @param {function(this: T, ol.Layer, ol.LayerRenderer, number)} f Function. + * @param {function(this: T, ol3.Layer, ol3.LayerRenderer, number)} f Function. * @param {T=} opt_obj Object. * @template T */ -ol.MapRenderer.prototype.forEachReadyVisibleLayer = function(f, opt_obj) { +ol3.MapRenderer.prototype.forEachReadyVisibleLayer = function(f, opt_obj) { var layers = this.map.getLayers(); layers.forEach(function(layer, index) { if (layer.isReady() && layer.getVisible()) { @@ -152,23 +152,23 @@ ol.MapRenderer.prototype.forEachReadyVisibleLayer = function(f, opt_obj) { /** - * @param {ol.Pixel} pixel Pixel. - * @return {ol.Coordinate} Coordinate. + * @param {ol3.Pixel} pixel Pixel. + * @return {ol3.Coordinate} Coordinate. */ -ol.MapRenderer.prototype.getCoordinateFromPixel = function(pixel) { +ol3.MapRenderer.prototype.getCoordinateFromPixel = function(pixel) { this.updateMatrices_(); var vec3 = [pixel.x, pixel.y, 0]; goog.vec.Mat4.multVec3(this.pixelToCoordinateMatrix_, vec3, vec3); - return new ol.Coordinate(vec3[0], vec3[1]); + return new ol3.Coordinate(vec3[0], vec3[1]); }; /** - * @param {ol.Layer} layer Layer. + * @param {ol3.Layer} layer Layer. * @protected - * @return {ol.LayerRenderer} Layer renderer. + * @return {ol3.LayerRenderer} Layer renderer. */ -ol.MapRenderer.prototype.getLayerRenderer = function(layer) { +ol3.MapRenderer.prototype.getLayerRenderer = function(layer) { var key = goog.getUid(layer); var layerRenderer = this.layerRenderers[key]; goog.asserts.assert(goog.isDef(layerRenderer)); @@ -177,44 +177,44 @@ ol.MapRenderer.prototype.getLayerRenderer = function(layer) { /** - * @return {ol.Map} Map. + * @return {ol3.Map} Map. */ -ol.MapRenderer.prototype.getMap = function() { +ol3.MapRenderer.prototype.getMap = function() { return this.map; }; /** - * @param {ol.Coordinate} coordinate Coordinate. - * @return {ol.Pixel} Pixel. + * @param {ol3.Coordinate} coordinate Coordinate. + * @return {ol3.Pixel} Pixel. */ -ol.MapRenderer.prototype.getPixelFromCoordinate = function(coordinate) { +ol3.MapRenderer.prototype.getPixelFromCoordinate = function(coordinate) { this.updateMatrices_(); var vec3 = [coordinate.x, coordinate.y, 0]; goog.vec.Mat4.multVec3(this.coordinateToPixelMatrix_, vec3, vec3); - return new ol.Pixel(vec3[0], vec3[1]); + return new ol3.Pixel(vec3[0], vec3[1]); }; /** */ -ol.MapRenderer.prototype.handleBackgroundColorChanged = goog.nullFunction; +ol3.MapRenderer.prototype.handleBackgroundColorChanged = goog.nullFunction; /** * @protected */ -ol.MapRenderer.prototype.handleCenterChanged = function() { +ol3.MapRenderer.prototype.handleCenterChanged = function() { this.matricesDirty_ = true; }; /** - * @param {ol.CollectionEvent} collectionEvent Collection event. + * @param {ol3.CollectionEvent} collectionEvent Collection event. * @protected */ -ol.MapRenderer.prototype.handleLayersAdd = function(collectionEvent) { - var layer = /** @type {ol.Layer} */ collectionEvent.elem; +ol3.MapRenderer.prototype.handleLayersAdd = function(collectionEvent) { + var layer = /** @type {ol3.Layer} */ collectionEvent.elem; this.addLayer(layer); }; @@ -222,7 +222,7 @@ ol.MapRenderer.prototype.handleLayersAdd = function(collectionEvent) { /** * @protected */ -ol.MapRenderer.prototype.handleLayersChanged = function() { +ol3.MapRenderer.prototype.handleLayersChanged = function() { var layerRenderers = goog.object.getValues(this.layerRenderers); goog.array.forEach(layerRenderers, function(layerRenderer) { this.removeLayerRenderer(layerRenderer); @@ -236,9 +236,9 @@ ol.MapRenderer.prototype.handleLayersChanged = function() { if (goog.isDefAndNotNull(layers)) { layers.forEach(this.addLayer, this); this.layersListenerKeys_ = [ - goog.events.listen(layers, ol.CollectionEventType.ADD, + goog.events.listen(layers, ol3.CollectionEventType.ADD, this.handleLayersAdd, false, this), - goog.events.listen(layers, ol.CollectionEventType.REMOVE, + goog.events.listen(layers, ol3.CollectionEventType.REMOVE, this.handleLayersRemove, false, this) ]; } @@ -246,11 +246,11 @@ ol.MapRenderer.prototype.handleLayersChanged = function() { /** - * @param {ol.CollectionEvent} collectionEvent Collection event. + * @param {ol3.CollectionEvent} collectionEvent Collection event. * @protected */ -ol.MapRenderer.prototype.handleLayersRemove = function(collectionEvent) { - var layer = /** @type {ol.Layer} */ collectionEvent.elem; +ol3.MapRenderer.prototype.handleLayersRemove = function(collectionEvent) { + var layer = /** @type {ol3.Layer} */ collectionEvent.elem; this.removeLayer(layer); }; @@ -258,7 +258,7 @@ ol.MapRenderer.prototype.handleLayersRemove = function(collectionEvent) { /** * @protected */ -ol.MapRenderer.prototype.handleResolutionChanged = function() { +ol3.MapRenderer.prototype.handleResolutionChanged = function() { this.matricesDirty_ = true; }; @@ -266,7 +266,7 @@ ol.MapRenderer.prototype.handleResolutionChanged = function() { /** * @protected */ -ol.MapRenderer.prototype.handleRotationChanged = function() { +ol3.MapRenderer.prototype.handleRotationChanged = function() { this.matricesDirty_ = true; }; @@ -274,26 +274,26 @@ ol.MapRenderer.prototype.handleRotationChanged = function() { /** * @protected */ -ol.MapRenderer.prototype.handleSizeChanged = function() { +ol3.MapRenderer.prototype.handleSizeChanged = function() { this.matricesDirty_ = true; }; /** - * @param {ol.Layer} layer Layer. + * @param {ol3.Layer} layer Layer. * @protected */ -ol.MapRenderer.prototype.removeLayer = function(layer) { +ol3.MapRenderer.prototype.removeLayer = function(layer) { goog.dispose(this.removeLayerRenderer(layer)); }; /** - * @param {ol.Layer} layer Layer. - * @return {ol.LayerRenderer} Layer renderer. + * @param {ol3.Layer} layer Layer. + * @return {ol3.LayerRenderer} Layer renderer. * @protected */ -ol.MapRenderer.prototype.removeLayerRenderer = function(layer) { +ol3.MapRenderer.prototype.removeLayerRenderer = function(layer) { var key = goog.getUid(layer); if (key in this.layerRenderers) { var layerRenderer = this.layerRenderers[key]; @@ -308,7 +308,7 @@ ol.MapRenderer.prototype.removeLayerRenderer = function(layer) { /** * @return {boolean} Animating. */ -ol.MapRenderer.prototype.render = function() { +ol3.MapRenderer.prototype.render = function() { var animate = false; this.forEachReadyVisibleLayer(function(layer, layerRenderer) { if (layerRenderer.render()) { @@ -320,11 +320,11 @@ ol.MapRenderer.prototype.render = function() { /** - * @param {ol.Layer} layer Layer. - * @param {ol.LayerRenderer} layerRenderer Layer renderer. + * @param {ol3.Layer} layer Layer. + * @param {ol3.LayerRenderer} layerRenderer Layer renderer. * @protected */ -ol.MapRenderer.prototype.setLayerRenderer = function(layer, layerRenderer) { +ol3.MapRenderer.prototype.setLayerRenderer = function(layer, layerRenderer) { var key = goog.getUid(layer); goog.asserts.assert(!(key in this.layerRenderers)); this.layerRenderers[key] = layerRenderer; @@ -334,15 +334,15 @@ ol.MapRenderer.prototype.setLayerRenderer = function(layer, layerRenderer) { /** * @private */ -ol.MapRenderer.prototype.updateMatrices_ = function() { +ol3.MapRenderer.prototype.updateMatrices_ = function() { if (this.matricesDirty_) { var map = this.map; - var center = /** @type {!ol.Coordinate} */ map.getCenter(); + var center = /** @type {!ol3.Coordinate} */ map.getCenter(); var resolution = /** @type {number} */ map.getResolution(); var rotation = map.getRotation(); - var size = /** @type {!ol.Size} */ map.getSize(); + var size = /** @type {!ol3.Size} */ map.getSize(); goog.vec.Mat4.makeIdentity(this.coordinateToPixelMatrix_); goog.vec.Mat4.translate(this.coordinateToPixelMatrix_, diff --git a/src/ol/base/object.js b/src/ol3/base/object.js similarity index 60% rename from src/ol/base/object.js rename to src/ol3/base/object.js index 52674edb18..70f0d17591 100644 --- a/src/ol/base/object.js +++ b/src/ol3/base/object.js @@ -5,7 +5,7 @@ * @see https://developers.google.com/maps/documentation/javascript/reference */ -goog.provide('ol.Object'); +goog.provide('ol3.Object'); goog.require('goog.array'); goog.require('goog.events'); @@ -16,7 +16,7 @@ goog.require('goog.object'); /** * @enum {string} */ -ol.ObjectProperty = { +ol3.ObjectProperty = { ACCESSORS: 'ol_accessors_', BINDINGS: 'ol_bindings_' }; @@ -28,52 +28,52 @@ ol.ObjectProperty = { * @extends {goog.events.EventTarget} * @param {Object.=} opt_values Values. */ -ol.Object = function(opt_values) { +ol3.Object = function(opt_values) { goog.base(this); if (goog.isDef(opt_values)) { this.setValues(opt_values); } }; -goog.inherits(ol.Object, goog.events.EventTarget); +goog.inherits(ol3.Object, goog.events.EventTarget); /** * @private * @type {Object.} */ -ol.Object.changedEventTypeCache_ = {}; +ol3.Object.changedEventTypeCache_ = {}; /** * @private * @type {Object.} */ -ol.Object.getterNameCache_ = {}; +ol3.Object.getterNameCache_ = {}; /** * @private * @type {Object.} */ -ol.Object.setterNameCache_ = {}; +ol3.Object.setterNameCache_ = {}; /** * @param {string} str String. * @return {string} Capitalized string. */ -ol.Object.capitalize = function(str) { +ol3.Object.capitalize = function(str) { return str.substr(0, 1).toUpperCase() + str.substr(1); }; /** - * @param {ol.Object} obj Object. - * @return {Object.} Accessors. + * @param {ol3.Object} obj Object. + * @return {Object.} Accessors. */ -ol.Object.getAccessors = function(obj) { - return obj[ol.ObjectProperty.ACCESSORS] || - (obj[ol.ObjectProperty.ACCESSORS] = {}); +ol3.Object.getAccessors = function(obj) { + return obj[ol3.ObjectProperty.ACCESSORS] || + (obj[ol3.ObjectProperty.ACCESSORS] = {}); }; @@ -81,9 +81,9 @@ ol.Object.getAccessors = function(obj) { * @param {string} key Key. * @return {string} Changed name. */ -ol.Object.getChangedEventType = function(key) { - return ol.Object.changedEventTypeCache_[key] || - (ol.Object.changedEventTypeCache_[key] = key.toLowerCase() + '_changed'); +ol3.Object.getChangedEventType = function(key) { + return ol3.Object.changedEventTypeCache_[key] || + (ol3.Object.changedEventTypeCache_[key] = key.toLowerCase() + '_changed'); }; @@ -91,19 +91,19 @@ ol.Object.getChangedEventType = function(key) { * @param {string} key String. * @return {string} Getter name. */ -ol.Object.getGetterName = function(key) { - return ol.Object.getterNameCache_[key] || - (ol.Object.getterNameCache_[key] = 'get' + ol.Object.capitalize(key)); +ol3.Object.getGetterName = function(key) { + return ol3.Object.getterNameCache_[key] || + (ol3.Object.getterNameCache_[key] = 'get' + ol3.Object.capitalize(key)); }; /** - * @param {ol.Object} obj Object. + * @param {ol3.Object} obj Object. * @return {Object.} Listeners. */ -ol.Object.getListeners = function(obj) { - return obj[ol.ObjectProperty.BINDINGS] || - (obj[ol.ObjectProperty.BINDINGS] = {}); +ol3.Object.getListeners = function(obj) { + return obj[ol3.ObjectProperty.BINDINGS] || + (obj[ol3.ObjectProperty.BINDINGS] = {}); }; @@ -111,28 +111,28 @@ ol.Object.getListeners = function(obj) { * @param {string} key String. * @return {string} Setter name. */ -ol.Object.getSetterName = function(key) { - return ol.Object.setterNameCache_[key] || - (ol.Object.setterNameCache_[key] = 'set' + ol.Object.capitalize(key)); +ol3.Object.getSetterName = function(key) { + return ol3.Object.setterNameCache_[key] || + (ol3.Object.setterNameCache_[key] = 'set' + ol3.Object.capitalize(key)); }; /** * @param {string} key Key. - * @param {ol.Object} target Target. + * @param {ol3.Object} target Target. * @param {string=} opt_targetKey Target key. * @param {boolean=} opt_noNotify No notify. */ -ol.Object.prototype.bindTo = +ol3.Object.prototype.bindTo = function(key, target, opt_targetKey, opt_noNotify) { var targetKey = opt_targetKey || key; this.unbind(key); - var eventType = ol.Object.getChangedEventType(targetKey); - var listeners = ol.Object.getListeners(this); + var eventType = ol3.Object.getChangedEventType(targetKey); + var listeners = ol3.Object.getListeners(this); listeners[key] = goog.events.listen(target, eventType, function() { this.notifyInternal_(key); }, undefined, this); - var accessors = ol.Object.getAccessors(this); + var accessors = ol3.Object.getAccessors(this); accessors[key] = {target: target, key: targetKey}; var noNotify = opt_noNotify || false; if (!noNotify) { @@ -144,20 +144,20 @@ ol.Object.prototype.bindTo = /** * @param {string} key Key. */ -ol.Object.prototype.changed = goog.nullFunction; +ol3.Object.prototype.changed = goog.nullFunction; /** * @param {string} key Key. * @return {*} Value. */ -ol.Object.prototype.get = function(key) { - var accessors = ol.Object.getAccessors(this); +ol3.Object.prototype.get = function(key) { + var accessors = ol3.Object.getAccessors(this); if (goog.object.containsKey(accessors, key)) { var accessor = accessors[key]; var target = accessor.target; var targetKey = accessor.key; - var getterName = ol.Object.getGetterName(targetKey); + var getterName = ol3.Object.getGetterName(targetKey); if (target[getterName]) { return target[getterName](); } else { @@ -172,8 +172,8 @@ ol.Object.prototype.get = function(key) { /** * @param {string} key Key. */ -ol.Object.prototype.notify = function(key) { - var accessors = ol.Object.getAccessors(this); +ol3.Object.prototype.notify = function(key) { + var accessors = ol3.Object.getAccessors(this); if (goog.object.containsKey(accessors, key)) { var accessor = accessors[key]; var target = accessor.target; @@ -189,8 +189,8 @@ ol.Object.prototype.notify = function(key) { * @param {string} key Key. * @private */ -ol.Object.prototype.notifyInternal_ = function(key) { - var eventType = ol.Object.getChangedEventType(key); +ol3.Object.prototype.notifyInternal_ = function(key) { + var eventType = ol3.Object.getChangedEventType(key); this.dispatchEvent(eventType); }; @@ -199,13 +199,13 @@ ol.Object.prototype.notifyInternal_ = function(key) { * @param {string} key Key. * @param {*} value Value. */ -ol.Object.prototype.set = function(key, value) { - var accessors = ol.Object.getAccessors(this); +ol3.Object.prototype.set = function(key, value) { + var accessors = ol3.Object.getAccessors(this); if (goog.object.containsKey(accessors, key)) { var accessor = accessors[key]; var target = accessor.target; var targetKey = accessor.key; - var setterName = ol.Object.getSetterName(targetKey); + var setterName = ol3.Object.getSetterName(targetKey); if (target[setterName]) { target[setterName](value); } else { @@ -221,9 +221,9 @@ ol.Object.prototype.set = function(key, value) { /** * @param {Object.} options Options. */ -ol.Object.prototype.setOptions = function(options) { +ol3.Object.prototype.setOptions = function(options) { goog.object.forEach(options, function(value, key) { - var setterName = ol.Object.getSetterName(key); + var setterName = ol3.Object.getSetterName(key); if (this[setterName]) { this[setterName](value); } else { @@ -236,20 +236,20 @@ ol.Object.prototype.setOptions = function(options) { /** * @param {Object.} values Values. */ -ol.Object.prototype.setValues = ol.Object.prototype.setOptions; +ol3.Object.prototype.setValues = ol3.Object.prototype.setOptions; /** * @param {string} key Key. */ -ol.Object.prototype.unbind = function(key) { - var listeners = ol.Object.getListeners(this); +ol3.Object.prototype.unbind = function(key) { + var listeners = ol3.Object.getListeners(this); var listener = listeners[key]; if (listener) { delete listeners[key]; goog.events.unlistenByKey(listener); var value = this.get(key); - var accessors = ol.Object.getAccessors(this); + var accessors = ol3.Object.getAccessors(this); delete accessors[key]; this[key] = value; } @@ -258,8 +258,8 @@ ol.Object.prototype.unbind = function(key) { /** */ -ol.Object.prototype.unbindAll = function() { - var listeners = ol.Object.getListeners(this); +ol3.Object.prototype.unbindAll = function() { + var listeners = ol3.Object.getListeners(this); var keys = goog.object.getKeys(listeners); goog.array.forEach(keys, function(key) { this.unbind(key); diff --git a/src/ol/base/object_test.js b/src/ol3/base/object_test.js similarity index 80% rename from src/ol/base/object_test.js rename to src/ol3/base/object_test.js index 03412f462f..fc209929b1 100644 --- a/src/ol/base/object_test.js +++ b/src/ol3/base/object_test.js @@ -1,21 +1,21 @@ goog.require('goog.testing.jsunit'); -goog.require('ol.Object'); +goog.require('ol3.Object'); function testModel() { - var m = new ol.Object(); + var m = new ol3.Object(); assertNotNullNorUndefined(m); } function testGetUndefined() { - var m = new ol.Object(); + var m = new ol3.Object(); assertUndefined(m.get('k')); } function testGetSetGet() { - var m = new ol.Object(); + var m = new ol3.Object(); assertUndefined(m.get('k')); m.set('k', 1); assertEquals(1, m.get('k')); @@ -23,7 +23,7 @@ function testGetSetGet() { function testSetValues() { - var m = new ol.Object(); + var m = new ol3.Object(); m.setValues({ k1: 1, k2: 2 @@ -34,7 +34,7 @@ function testSetValues() { function testNotifyKeyEvent() { - var m = new ol.Object(); + var m = new ol3.Object(); var eventDispatched = false; goog.events.listen(m, 'k_changed', function() { eventDispatched = true; @@ -45,8 +45,8 @@ function testNotifyKeyEvent() { function testBindSetNotifyKeyEvent() { - var m = new ol.Object(); - var n = new ol.Object(); + var m = new ol3.Object(); + var n = new ol3.Object(); var callbackCalled = false; goog.events.listen(n, 'k_changed', function() { eventDispatched = true; @@ -58,7 +58,7 @@ function testBindSetNotifyKeyEvent() { function testSetNotifyKeyEvent() { - var m = new ol.Object(); + var m = new ol3.Object(); var eventDispatched = false; goog.events.listen(m, 'k_changed', function() { eventDispatched = true; @@ -69,8 +69,8 @@ function testSetNotifyKeyEvent() { function testSetBind() { - var m = new ol.Object(); - var n = new ol.Object(); + var m = new ol3.Object(); + var n = new ol3.Object(); m.set('k', 1); assertEquals(1, m.get('k')); assertUndefined(n.get('k')); @@ -81,8 +81,8 @@ function testSetBind() { function testBindSet() { - var m = new ol.Object(); - var n = new ol.Object(); + var m = new ol3.Object(); + var n = new ol3.Object(); n.bindTo('k', m); m.set('k', 1); assertEquals(1, m.get('k')); @@ -91,8 +91,8 @@ function testBindSet() { function testBindSetBackwards() { - var m = new ol.Object(); - var n = new ol.Object(); + var m = new ol3.Object(); + var n = new ol3.Object(); n.bindTo('k', m); n.set('k', 1); assertEquals(1, m.get('k')); @@ -101,8 +101,8 @@ function testBindSetBackwards() { function testSetBindBackwards() { - var m = new ol.Object(); - var n = new ol.Object(); + var m = new ol3.Object(); + var n = new ol3.Object(); n.set('k', 1); n.bindTo('k', m); assertUndefined(m.get('k')); @@ -111,8 +111,8 @@ function testSetBindBackwards() { function testBindSetUnbind() { - var m = new ol.Object(); - var n = new ol.Object(); + var m = new ol3.Object(); + var n = new ol3.Object(); n.bindTo('k', m); n.set('k', 1); assertEquals(1, m.get('k')); @@ -127,8 +127,8 @@ function testBindSetUnbind() { function testUnbindAll() { - var m = new ol.Object(); - var n = new ol.Object(); + var m = new ol3.Object(); + var n = new ol3.Object(); n.bindTo('k', m); n.set('k', 1); assertEquals(m.get('k'), 1); @@ -143,8 +143,8 @@ function testUnbindAll() { function testBindNotify() { - var m = new ol.Object(); - var n = new ol.Object(); + var m = new ol3.Object(); + var n = new ol3.Object(); m.bindTo('k', n); mEventDispatched = false; goog.events.listen(m, 'k_changed', function() { @@ -161,8 +161,8 @@ function testBindNotify() { function testBindBackwardsNotify() { - var m = new ol.Object(); - var n = new ol.Object(); + var m = new ol3.Object(); + var n = new ol3.Object(); n.bindTo('k', m); mEventDispatched = false; goog.events.listen(m, 'k_changed', function() { @@ -179,8 +179,8 @@ function testBindBackwardsNotify() { function testBindRename() { - var m = new ol.Object(); - var n = new ol.Object(); + var m = new ol3.Object(); + var n = new ol3.Object(); n.bindTo('kn', m, 'km'); m.set('km', 1); assertEquals(m.get('km'), 1); @@ -189,8 +189,8 @@ function testBindRename() { function testBindRenameEvents() { - var m = new ol.Object(); - var n = new ol.Object(); + var m = new ol3.Object(); + var n = new ol3.Object(); kmEventDispatched = false; goog.events.listen(m, 'km_changed', function() { kmEventDispatched = true; @@ -209,9 +209,9 @@ function testBindRenameEvents() { function testTransitiveBindForwards() { - var m = new ol.Object(); - var n = new ol.Object(); - var o = new ol.Object(); + var m = new ol3.Object(); + var n = new ol3.Object(); + var o = new ol3.Object(); n.bindTo('kn', m, 'km'); o.bindTo('ko', n, 'kn'); m.set('km', 1); @@ -222,9 +222,9 @@ function testTransitiveBindForwards() { function testTransitiveBindBackwards() { - var m = new ol.Object(); - var n = new ol.Object(); - var o = new ol.Object(); + var m = new ol3.Object(); + var n = new ol3.Object(); + var o = new ol3.Object(); n.bindTo('kn', m, 'km'); o.bindTo('ko', n, 'kn'); o.set('ko', 1); @@ -236,10 +236,10 @@ function testTransitiveBindBackwards() { function testMrideyAccessors() { // http://blog.mridey.com/2010/03/maps-javascript-api-v3-more-about.html - var a = new ol.Object(); + var a = new ol3.Object(); a.set('level', 2); assertEquals(2, a.get('level')); - var b = new ol.Object(); + var b = new ol3.Object(); b.setValues({ level: 2, index: 3, @@ -251,16 +251,16 @@ function testMrideyAccessors() { function testMrideyBinding() { // http://blog.mridey.com/2010/03/maps-javascript-api-v3-more-about.html - var a = new ol.Object(); + var a = new ol3.Object(); a.set('level', 2); - var b = new ol.Object(); + var b = new ol3.Object(); b.bindTo('index', a, 'level'); assertEquals(2, b.get('index')); a.set('level', 3); assertEquals(3, b.get('index')); b.set('index', 4); assertEquals(4, a.get('level')); - var c = new ol.Object(); + var c = new ol3.Object(); c.bindTo('zoom', a, 'level'); assertEquals(4, c.get('zoom')); b.unbind('index'); @@ -272,8 +272,8 @@ function testMrideyBinding() { function testCircularBind() { - var a = new ol.Object(); - var b = new ol.Object(); + var a = new ol3.Object(); + var b = new ol3.Object(); a.bindTo('k', b); assertThrows(function() { b.bindTo('k', a); @@ -282,8 +282,8 @@ function testCircularBind() { function testPriority() { - var a = new ol.Object(); - var b = new ol.Object(); + var a = new ol3.Object(); + var b = new ol3.Object(); a.set('k', 1); b.set('k', 2); a.bindTo('k', b); @@ -293,8 +293,8 @@ function testPriority() { function testPriorityUndefined() { - var a = new ol.Object(); - var b = new ol.Object(); + var a = new ol3.Object(); + var b = new ol3.Object(); a.set('k', 1); a.bindTo('k', b); assertUndefined(a.get('k')); @@ -303,7 +303,7 @@ function testPriorityUndefined() { function testSetter() { - var a = new ol.Object(); + var a = new ol3.Object(); var x; var setterCalled; a.setX = function(value) { @@ -317,14 +317,14 @@ function testSetter() { function testSetterBind() { - var a = new ol.Object(); + var a = new ol3.Object(); var x; var setterCalled; a.setX = function(value) { this.x = value; setterCalled = true; }; - var b = new ol.Object(); + var b = new ol3.Object(); b.bindTo('x', a); b.set('x', 1); assertEquals(1, a.get('x')); @@ -334,7 +334,7 @@ function testSetterBind() { function testGetter() { - var a = new ol.Object(); + var a = new ol3.Object(); var getterCalled; a.getX = function() { getterCalled = true; @@ -346,13 +346,13 @@ function testGetter() { function testGetterBind() { - var a = new ol.Object(); + var a = new ol3.Object(); var getterCalled; a.getX = function() { getterCalled = true; return 1; }; - var b = new ol.Object(); + var b = new ol3.Object(); b.bindTo('x', a); assertEquals(1, b.get('x')); assertTrue(getterCalled); @@ -360,7 +360,7 @@ function testGetterBind() { function testBindSelf() { - var a = new ol.Object(); + var a = new ol3.Object(); assertThrows(function() { a.bindTo('k', a); }); @@ -368,13 +368,13 @@ function testBindSelf() { function testCreateWithOptions() { - var obj = new ol.Object({k: 1}); + var obj = new ol3.Object({k: 1}); assertEquals(1, obj.get('k')); } function testEventTypeCaseSensitivity() { - var obj = new ol.Object(); + var obj = new ol3.Object(); var lowercaseEventDispatched = false; goog.events.listen(obj, 'k_changed', function() { lowercaseEventDispatched = true; diff --git a/src/ol/base/ol.js b/src/ol3/base/ol.js similarity index 60% rename from src/ol/base/ol.js rename to src/ol3/base/ol.js index 14a0e3d7b2..d94603a335 100644 --- a/src/ol/base/ol.js +++ b/src/ol3/base/ol.js @@ -1,9 +1,9 @@ -goog.provide('ol'); +goog.provide('ol3'); goog.require('goog.debug.Logger'); if (goog.DEBUG) { - var logger = goog.debug.Logger.getLogger('ol'); + var logger = goog.debug.Logger.getLogger('ol3'); logger.setLevel(goog.debug.Logger.Level.FINEST); } diff --git a/src/ol3/base/pixel.js b/src/ol3/base/pixel.js new file mode 100644 index 0000000000..314766d64c --- /dev/null +++ b/src/ol3/base/pixel.js @@ -0,0 +1,24 @@ +goog.provide('ol3.Pixel'); + +goog.require('goog.math.Coordinate'); + + + +/** + * @constructor + * @extends {goog.math.Coordinate} + * @param {number} x X. + * @param {number} y Y. + */ +ol3.Pixel = function(x, y) { + goog.base(this, x, y); +}; +goog.inherits(ol3.Pixel, goog.math.Coordinate); + + +/** + * @return {ol3.Pixel} Clone. + */ +ol3.Pixel.prototype.clone = function() { + return new ol3.Pixel(this.x, this.y); +}; diff --git a/src/ol/base/pixelbounds.js b/src/ol3/base/pixelbounds.js similarity index 52% rename from src/ol/base/pixelbounds.js rename to src/ol3/base/pixelbounds.js index 42a63f3b91..7b95314e30 100644 --- a/src/ol/base/pixelbounds.js +++ b/src/ol3/base/pixelbounds.js @@ -1,18 +1,18 @@ -goog.provide('ol.PixelBounds'); +goog.provide('ol3.PixelBounds'); -goog.require('ol.Rectangle'); +goog.require('ol3.Rectangle'); /** * @constructor - * @extends {ol.Rectangle} + * @extends {ol3.Rectangle} * @param {number} minX Minimum X. * @param {number} minY Minimum Y. * @param {number} maxX Maximum X. * @param {number} maxY Maximum Y. */ -ol.PixelBounds = function(minX, minY, maxX, maxY) { +ol3.PixelBounds = function(minX, minY, maxX, maxY) { goog.base(this, minX, minY, maxX, maxY); }; -goog.inherits(ol.PixelBounds, ol.Rectangle); +goog.inherits(ol3.PixelBounds, ol3.Rectangle); diff --git a/src/ol3/base/projection.js b/src/ol3/base/projection.js new file mode 100644 index 0000000000..779b5de8aa --- /dev/null +++ b/src/ol3/base/projection.js @@ -0,0 +1,500 @@ +goog.provide('ol3.Projection'); + +goog.require('goog.array'); +goog.require('goog.asserts'); +goog.require('goog.object'); +goog.require('ol3.Coordinate'); +goog.require('ol3.Extent'); +goog.require('ol3.TransformFunction'); + + +/** + * @define {boolean} Enable Proj4js. + */ +ol3.ENABLE_PROJ4JS = true; + + +/** + * @enum {string} + */ +ol3.ProjectionUnits = { + DEGREES: 'degrees', + METERS: 'm' +}; + + + +/** + * @constructor + * @param {string} code Code. + * @param {ol3.ProjectionUnits} units Units. + * @param {ol3.Extent} extent Extent. + */ +ol3.Projection = function(code, units, extent) { + + /** + * @private + * @type {string} + */ + this.code_ = code; + + /** + * @private + * @type {ol3.ProjectionUnits} + */ + this.units_ = units; + + /** + * @private + * @type {ol3.Extent} + */ + this.extent_ = extent; + +}; + + +/** + * @return {string} Code. + */ +ol3.Projection.prototype.getCode = function() { + return this.code_; +}; + + +/** + * @return {ol3.Extent} Extent. + */ +ol3.Projection.prototype.getExtent = function() { + return this.extent_; +}; + + +/** + * @return {ol3.ProjectionUnits} Units. + */ +ol3.Projection.prototype.getUnits = function() { + return this.units_; +}; + + + +/** + * @constructor + * @extends {ol3.Projection} + * @param {string} code Code. + * @param {Proj4js.Proj} proj4jsProj Proj4js projection. + */ +ol3.Proj4jsProjection = function(code, proj4jsProj) { + + var units = /** @type {ol3.ProjectionUnits} */ proj4jsProj.units; + + goog.base(this, code, units, null); + + /** + * @private + * @type {Proj4js.Proj} + */ + this.proj4jsProj_ = proj4jsProj; + +}; +goog.inherits(ol3.Proj4jsProjection, ol3.Projection); + + +/** + * @return {Proj4js.Proj} Proj4js projection. + */ +ol3.Proj4jsProjection.prototype.getProj4jsProj = function() { + return this.proj4jsProj_; +}; + + +/** + * @private + * @type {Object.} + */ +ol3.Projection.proj4jsProjections_ = {}; + + +/** + * @private + * @type {Object.} + */ +ol3.Projection.projections_ = {}; + + +/** + * @private + * @type {Object.>} + */ +ol3.Projection.transforms_ = {}; + + +/** + * @param {Array.} projections Projections. + * @private + */ +ol3.Projection.addEquivalentProjections_ = function(projections) { + ol3.Projection.addProjections(projections); + goog.array.forEach(projections, function(source) { + goog.array.forEach(projections, function(destination) { + ol3.Projection.addTransform( + source, destination, ol3.Projection.cloneTransform); + }); + }); +}; + + +/** + * @param {Array.} projections1 Projections. + * @param {Array.} projections2 Projections. + * @param {ol3.TransformFunction} forwardTransform Forward transform. + * @param {ol3.TransformFunction} inverseTransform Inverse transform. + * @private + */ +ol3.Projection.addEquivalentTransforms_ = + function(projections1, projections2, forwardTransform, inverseTransform) { + goog.array.forEach(projections1, function(projection1) { + goog.array.forEach(projections2, function(projection2) { + ol3.Projection.addTransform(projection1, projection2, forwardTransform); + ol3.Projection.addTransform(projection2, projection1, inverseTransform); + }); + }); +}; + + +/** + * @param {ol3.Proj4jsProjection} proj4jsProjection Proj4js projection. + */ +ol3.Projection.addProj4jsProjection = function(proj4jsProjection) { + var proj4jsProjections = ol3.Projection.proj4jsProjections_; + var code = proj4jsProjection.getCode(); + goog.asserts.assert(!goog.object.containsKey(proj4jsProjections, code)); + proj4jsProjections[code] = proj4jsProjection; +}; + + +/** + * @param {ol3.Projection} projection Projection. + */ +ol3.Projection.addProjection = function(projection) { + var projections = ol3.Projection.projections_; + var code = projection.getCode(); + goog.asserts.assert(!goog.object.containsKey(projections, code)); + projections[code] = projection; +}; + + +/** + * @param {Array.} projections Projections. + */ +ol3.Projection.addProjections = function(projections) { + goog.array.forEach(projections, function(projection) { + ol3.Projection.addProjection(projection); + }); +}; + + +/** + * @param {ol3.Projection} source Source. + * @param {ol3.Projection} destination Destination. + * @param {ol3.TransformFunction} transformFn Transform. + */ +ol3.Projection.addTransform = function(source, destination, transformFn) { + var projections = ol3.Projection.projections_; + var sourceCode = source.getCode(); + var destinationCode = destination.getCode(); + var transforms = ol3.Projection.transforms_; + if (!goog.object.containsKey(transforms, sourceCode)) { + transforms[sourceCode] = {}; + } + goog.asserts.assert( + !goog.object.containsKey(transforms[sourceCode], destinationCode)); + transforms[sourceCode][destinationCode] = transformFn; +}; + + +/** + * @param {string} code Code. + * @return {ol3.Projection} Projection. + */ +ol3.Projection.getFromCode = function(code) { + var projection = ol3.Projection.projections_[code]; + if (ol3.Projection.isProj4jsSupported() && !goog.isDef(projection)) { + projection = ol3.Projection.getProj4jsProjectionFromCode_(code); + } + if (!goog.isDef(projection)) { + goog.asserts.assert(goog.isDef(projection)); + projection = null; + } + return projection; +}; + + +/** + * @param {string} code Code. + * @private + * @return {ol3.Proj4jsProjection} Proj4js projection. + */ +ol3.Projection.getProj4jsProjectionFromCode_ = function(code) { + var proj4jsProjections = ol3.Projection.proj4jsProjections_; + var proj4jsProjection = proj4jsProjections[code]; + if (!goog.isDef(proj4jsProjection)) { + var proj4jsProj = new Proj4js.Proj(code); + proj4jsProjection = new ol3.Proj4jsProjection(code, proj4jsProj); + proj4jsProjections[code] = proj4jsProjection; + } + return proj4jsProjection; +}; + + +/** + * @param {ol3.Projection} projection1 Projection 1. + * @param {ol3.Projection} projection2 Projection 2. + * @return {boolean} Equivalent. + */ +ol3.Projection.equivalent = function(projection1, projection2) { + if (projection1 === projection2) { + return true; + } else if (projection1.getUnits() != projection2.getUnits()) { + return false; + } else { + var transformFn = ol3.Projection.getTransform(projection1, projection2); + return transformFn === ol3.Projection.cloneTransform; + } +}; + + +/** + * @param {ol3.Projection} source Source. + * @param {ol3.Projection} destination Destination. + * @return {ol3.TransformFunction} Transform. + */ +ol3.Projection.getTransform = function(source, destination) { + var transforms = ol3.Projection.transforms_; + var sourceCode = source.getCode(); + var destinationCode = destination.getCode(); + var transform; + if (goog.object.containsKey(transforms, sourceCode) && + goog.object.containsKey(transforms[sourceCode], destinationCode)) { + transform = transforms[sourceCode][destinationCode]; + } + if (ol3.Projection.isProj4jsSupported() && !goog.isDef(transform)) { + var proj4jsSource; + if (source instanceof ol3.Proj4jsProjection) { + proj4jsSource = source; + } else { + proj4jsSource = + ol3.Projection.getProj4jsProjectionFromCode_(source.getCode()); + } + var sourceProj4jsProj = proj4jsSource.getProj4jsProj(); + var proj4jsDestination; + if (destination instanceof ol3.Proj4jsProjection) { + proj4jsDestination = destination; + } else { + proj4jsDestination = + ol3.Projection.getProj4jsProjectionFromCode_(source.getCode()); + } + var destinationProj4jsProj = proj4jsDestination.getProj4jsProj(); + transform = + /** + * @param {ol3.Coordinate} coordinate Coordinate. + * @return {ol3.Coordinate} Coordinate. + */ + function(coordinate) { + var proj4jsPoint = new Proj4js.Point(coordinate.x, coordinate.y); + proj4jsPoint = Proj4js.transform( + sourceProj4jsProj, destinationProj4jsProj, proj4jsPoint); + return new ol3.Coordinate(proj4jsPoint.x, proj4jsPoint.y); + }; + ol3.Projection.addTransform(source, destination, transform); + } + if (!goog.isDef(transform)) { + goog.asserts.assert(goog.isDef(transform)); + transform = ol3.Projection.identityTransform; + } + return transform; +}; + + +/** + * @param {string} sourceCode Source code. + * @param {string} destinationCode Destination code. + * @return {ol3.TransformFunction} Transform. + */ +ol3.Projection.getTransformFromCodes = function(sourceCode, destinationCode) { + var source = ol3.Projection.getFromCode(sourceCode); + var destination = ol3.Projection.getFromCode(destinationCode); + return ol3.Projection.getTransform(source, destination); +}; + + +/** + * @return {boolean} Has Proj4js. + */ +ol3.Projection.isProj4jsSupported = function() { + return ol3.ENABLE_PROJ4JS && 'Proj4js' in goog.global; +}; + + +/** + * @param {ol3.Coordinate} point Point. + * @return {ol3.Coordinate} Point. + */ +ol3.Projection.identityTransform = function(point) { + return point; +}; + + +/** + * @param {ol3.Coordinate} point Point. + * @return {ol3.Coordinate} Point. + */ +ol3.Projection.cloneTransform = function(point) { + return point.clone(); +}; + + +/** + * @param {ol3.Coordinate} point Point. + * @param {ol3.Projection} source Source. + * @param {ol3.Projection} destination Destination. + * @return {ol3.Coordinate} Point. + */ +ol3.Projection.transform = function(point, source, destination) { + var transformFn = ol3.Projection.getTransform(source, destination); + return transformFn(point); +}; + + +/** + * @param {ol3.Coordinate} point Point. + * @param {string} sourceCode Source code. + * @param {string} destinationCode Destination code. + * @return {ol3.Coordinate} Point. + */ +ol3.Projection.transformWithCodes = + function(point, sourceCode, destinationCode) { + var transformFn = ol3.Projection.getTransformFromCodes( + sourceCode, destinationCode); + return transformFn(point); +}; + + +/** + * @const + * @type {number} + */ +ol3.Projection.EPSG_3857_RADIUS = 6378137; + + +/** + * @param {ol3.Coordinate} point Point. + * @return {ol3.Coordinate} Point. + */ +ol3.Projection.forwardSphericalMercator = function(point) { + var x = ol3.Projection.EPSG_3857_RADIUS * Math.PI * point.x / 180; + var y = ol3.Projection.EPSG_3857_RADIUS * + Math.log(Math.tan(Math.PI * (point.y + 90) / 360)); + return new ol3.Coordinate(x, y); +}; + + +/** + * @param {ol3.Coordinate} point Point. + * @return {ol3.Coordinate} Point. + */ +ol3.Projection.inverseSphericalMercator = function(point) { + var x = 180 * point.x / (ol3.Projection.EPSG_3857_RADIUS * Math.PI); + var y = 360 * Math.atan( + Math.exp(point.y / ol3.Projection.EPSG_3857_RADIUS)) / Math.PI - 90; + return new ol3.Coordinate(x, y); +}; + + +/** + * @const + * @type {number} + */ +ol3.Projection.EPSG_3857_HALF_SIZE = Math.PI * ol3.Projection.EPSG_3857_RADIUS; + + +/** + * @const + * @type {ol3.Extent} + */ +ol3.Projection.EPSG_3857_EXTENT = new ol3.Extent( + -ol3.Projection.EPSG_3857_HALF_SIZE, + -ol3.Projection.EPSG_3857_HALF_SIZE, + ol3.Projection.EPSG_3857_HALF_SIZE, + ol3.Projection.EPSG_3857_HALF_SIZE); + + +/** + * @private + * @type {Array.} + */ +ol3.Projection.EPSG_3857_LIKE_CODES_ = [ + 'EPSG:3857', + 'EPSG:102100', + 'EPSG:102113', + 'EPSG:900913' +]; + + +/** + * @const + * @private + * @type {Array.} + */ +ol3.Projection.EPSG_3857_LIKE_PROJECTIONS_ = goog.array.map( + ol3.Projection.EPSG_3857_LIKE_CODES_, + function(code) { + return new ol3.Projection( + code, + ol3.ProjectionUnits.METERS, + ol3.Projection.EPSG_3857_EXTENT); + }); + + +/** + * @const + * @private + * @type {ol3.Extent} + */ +ol3.Projection.EPSG_4326_EXTENT_ = new ol3.Extent(-180, -90, 180, 90); + + +/** + * @private + * @type {Array.} + */ +ol3.Projection.EPSG_4326_LIKE_CODES_ = [ + 'CRS:84', + 'EPSG:4326', + 'urn:ogc:def:crs:EPSG:6.6:4326' +]; + + +/** + * @const + * @type {Array.} + */ +ol3.Projection.EPSG_4326_LIKE_PROJECTIONS = goog.array.map( + ol3.Projection.EPSG_4326_LIKE_CODES_, + function(code) { + return new ol3.Projection( + code, + ol3.ProjectionUnits.DEGREES, + ol3.Projection.EPSG_4326_EXTENT_); + }); + + +ol3.Projection.addEquivalentProjections_( + ol3.Projection.EPSG_3857_LIKE_PROJECTIONS_); +ol3.Projection.addEquivalentProjections_( + ol3.Projection.EPSG_4326_LIKE_PROJECTIONS); +ol3.Projection.addEquivalentTransforms_( + ol3.Projection.EPSG_4326_LIKE_PROJECTIONS, + ol3.Projection.EPSG_3857_LIKE_PROJECTIONS_, + ol3.Projection.forwardSphericalMercator, + ol3.Projection.inverseSphericalMercator); diff --git a/src/ol/base/projection_test.js b/src/ol3/base/projection_test.js similarity index 68% rename from src/ol/base/projection_test.js rename to src/ol3/base/projection_test.js index d105ace417..3e4d8568b7 100644 --- a/src/ol/base/projection_test.js +++ b/src/ol3/base/projection_test.js @@ -1,14 +1,14 @@ goog.require('goog.array'); goog.require('goog.testing.jsunit'); -goog.require('ol.Coordinate'); -goog.require('ol.Projection'); +goog.require('ol3.Coordinate'); +goog.require('ol3.Projection'); function _testAllEquivalent(codes) { - var projections = goog.array.map(codes, ol.Projection.getFromCode); + var projections = goog.array.map(codes, ol3.Projection.getFromCode); goog.array.forEach(projections, function(source) { goog.array.forEach(projections, function(destination) { - assertTrue(ol.Projection.equivalent(source, destination)); + assertTrue(ol3.Projection.equivalent(source, destination)); }); }); } @@ -34,10 +34,10 @@ function testEpsg4326Equivalence() { function testIdentityTransform() { - var epsg4326 = ol.Projection.getFromCode('EPSG:4326'); + var epsg4326 = ol3.Projection.getFromCode('EPSG:4326'); var uniqueObject = {}; - var sourcePoint = new ol.Coordinate(uniqueObject, uniqueObject); - var destinationPoint = ol.Projection.transform( + var sourcePoint = new ol3.Coordinate(uniqueObject, uniqueObject); + var destinationPoint = ol3.Projection.transform( sourcePoint, epsg4326, epsg4326); assertFalse(sourcePoint === destinationPoint); assertTrue(destinationPoint.x === sourcePoint.x); @@ -46,8 +46,8 @@ function testIdentityTransform() { function testForwardSphericalMercatorOrigin() { - var point = ol.Projection.transformWithCodes( - new ol.Coordinate(0, 0), 'EPSG:4326', 'EPSG:3857'); + var point = ol3.Projection.transformWithCodes( + new ol3.Coordinate(0, 0), 'EPSG:4326', 'EPSG:3857'); assertNotNullNorUndefined(point); assertEquals(0, point.x); assertRoughlyEquals(0, point.y, 1e-9); @@ -55,8 +55,8 @@ function testForwardSphericalMercatorOrigin() { function testInverseSphericalMercatorOrigin() { - var point = ol.Projection.transformWithCodes( - new ol.Coordinate(0, 0), 'EPSG:3857', 'EPSG:4326'); + var point = ol3.Projection.transformWithCodes( + new ol3.Coordinate(0, 0), 'EPSG:3857', 'EPSG:4326'); assertNotNullNorUndefined(point); assertEquals(0, point.x); assertEquals(0, point.y); @@ -65,8 +65,8 @@ function testInverseSphericalMercatorOrigin() { function testForwardSphericalMercatorAlastaira() { // http://alastaira.wordpress.com/2011/01/23/the-google-maps-bing-maps-spherical-mercator-projection/ - var point = ol.Projection.transformWithCodes( - new ol.Coordinate(-5.625, 52.4827802220782), + var point = ol3.Projection.transformWithCodes( + new ol3.Coordinate(-5.625, 52.4827802220782), 'EPSG:4326', 'EPSG:900913'); assertNotNullNorUndefined(point); @@ -77,8 +77,8 @@ function testForwardSphericalMercatorAlastaira() { function testInverseSphericalMercatorAlastaira() { // http://alastaira.wordpress.com/2011/01/23/the-google-maps-bing-maps-spherical-mercator-projection/ - var point = ol.Projection.transformWithCodes( - new ol.Coordinate(-626172.13571216376, 6887893.4928337997), + var point = ol3.Projection.transformWithCodes( + new ol3.Coordinate(-626172.13571216376, 6887893.4928337997), 'EPSG:900913', 'EPSG:4326'); assertNotNullNorUndefined(point); diff --git a/src/ol/base/rectangle.js b/src/ol3/base/rectangle.js similarity index 55% rename from src/ol/base/rectangle.js rename to src/ol3/base/rectangle.js index 3f88315d11..45a79a1e26 100644 --- a/src/ol/base/rectangle.js +++ b/src/ol3/base/rectangle.js @@ -1,8 +1,8 @@ -goog.provide('ol.Rectangle'); +goog.provide('ol3.Rectangle'); goog.require('goog.asserts'); -goog.require('ol.Coordinate'); -goog.require('ol.Size'); +goog.require('ol3.Coordinate'); +goog.require('ol3.Size'); @@ -13,7 +13,7 @@ goog.require('ol.Size'); * @param {number} maxX Maximum X. * @param {number} maxY Maximum Y. */ -ol.Rectangle = function(minX, minY, maxX, maxY) { +ol3.Rectangle = function(minX, minY, maxX, maxY) { goog.asserts.assert(minX <= maxX); goog.asserts.assert(minY <= maxY); @@ -42,28 +42,28 @@ ol.Rectangle = function(minX, minY, maxX, maxY) { /** - * @return {ol.Rectangle} Clone. + * @return {ol3.Rectangle} Clone. */ -ol.Rectangle.prototype.clone = function() { - return new ol.Rectangle(this.minX, this.minY, this.maxX, this.maxY); +ol3.Rectangle.prototype.clone = function() { + return new ol3.Rectangle(this.minX, this.minY, this.maxX, this.maxY); }; /** - * @param {ol.Coordinate} coordinate Coordinate. + * @param {ol3.Coordinate} coordinate Coordinate. * @return {boolean} Contains. */ -ol.Rectangle.prototype.contains = function(coordinate) { +ol3.Rectangle.prototype.contains = function(coordinate) { return this.minX <= coordinate.x && coordinate.x <= this.maxX && this.minY <= coordinate.y && coordinate.y <= this.maxY; }; /** - * @return {ol.Coordinate} Center. + * @return {ol3.Coordinate} Center. */ -ol.Rectangle.prototype.getCenter = function() { - return new ol.Coordinate( +ol3.Rectangle.prototype.getCenter = function() { + return new ol3.Coordinate( (this.minX + this.maxX) / 2, (this.minY + this.maxY) / 2); }; @@ -71,32 +71,32 @@ ol.Rectangle.prototype.getCenter = function() { /** * @return {number} Height. */ -ol.Rectangle.prototype.getHeight = function() { +ol3.Rectangle.prototype.getHeight = function() { return this.maxY - this.minY; }; /** - * @return {ol.Size} Size. + * @return {ol3.Size} Size. */ -ol.Rectangle.prototype.getSize = function() { - return new ol.Size(this.getWidth(), this.getHeight()); +ol3.Rectangle.prototype.getSize = function() { + return new ol3.Size(this.getWidth(), this.getHeight()); }; /** * @return {number} Width. */ -ol.Rectangle.prototype.getWidth = function() { +ol3.Rectangle.prototype.getWidth = function() { return this.maxX - this.minX; }; /** - * @param {ol.Rectangle} rectangle Rectangle. + * @param {ol3.Rectangle} rectangle Rectangle. * @return {boolean} Intersects. */ -ol.Rectangle.prototype.intersects = function(rectangle) { +ol3.Rectangle.prototype.intersects = function(rectangle) { return this.minX <= rectangle.maxX && this.maxX >= rectangle.minX && this.minY <= rectangle.maxY && @@ -105,11 +105,11 @@ ol.Rectangle.prototype.intersects = function(rectangle) { /** - * @param {ol.Coordinate} coordinate Coordinate. - * @return {ol.Coordinate} Coordinate. + * @param {ol3.Coordinate} coordinate Coordinate. + * @return {ol3.Coordinate} Coordinate. */ -ol.Rectangle.prototype.normalize = function(coordinate) { - return new ol.Coordinate( +ol3.Rectangle.prototype.normalize = function(coordinate) { + return new ol3.Coordinate( (coordinate.x - this.minX) / this.getWidth(), (coordinate.y - this.minY) / this.getHeight()); }; @@ -118,6 +118,6 @@ ol.Rectangle.prototype.normalize = function(coordinate) { /** * @return {string} String. */ -ol.Rectangle.prototype.toString = function() { +ol3.Rectangle.prototype.toString = function() { return '(' + [this.minX, this.minY, this.maxX, this.maxY].join(', ') + ')'; }; diff --git a/src/ol3/base/rectangle_test.js b/src/ol3/base/rectangle_test.js new file mode 100644 index 0000000000..dc990e8f00 --- /dev/null +++ b/src/ol3/base/rectangle_test.js @@ -0,0 +1,142 @@ +goog.require('goog.testing.jsunit'); +goog.require('ol3.Coordinate'); +goog.require('ol3.Rectangle'); + + +function testCenter() { + var rectangle = new ol3.Rectangle(1, 2, 3, 4); + var center = rectangle.getCenter(); + assertEquals(2, center.x); + assertEquals(3, center.y); +} + + +function testClone() { + var rectangle = new ol3.Rectangle(1, 2, 3, 4); + var clonedRectangle = rectangle.clone(); + assertTrue(clonedRectangle instanceof ol3.Rectangle); + assertFalse(clonedRectangle === rectangle); + assertEquals(rectangle.minX, clonedRectangle.minX); + assertEquals(rectangle.minY, clonedRectangle.minY); + assertEquals(rectangle.maxX, clonedRectangle.maxX); + assertEquals(rectangle.maxY, clonedRectangle.maxY); +} + + +function testContainsPositive() { + var rectangle = new ol3.Rectangle(1, 2, 3, 4); + assertTrue(rectangle.contains(new ol3.Coordinate(1, 2))); + assertTrue(rectangle.contains(new ol3.Coordinate(1, 3))); + assertTrue(rectangle.contains(new ol3.Coordinate(1, 4))); + assertTrue(rectangle.contains(new ol3.Coordinate(2, 2))); + assertTrue(rectangle.contains(new ol3.Coordinate(2, 3))); + assertTrue(rectangle.contains(new ol3.Coordinate(2, 4))); + assertTrue(rectangle.contains(new ol3.Coordinate(3, 2))); + assertTrue(rectangle.contains(new ol3.Coordinate(3, 3))); + assertTrue(rectangle.contains(new ol3.Coordinate(3, 4))); +} + + +function testContainsNegative() { + var rectangle = new ol3.Rectangle(1, 2, 3, 4); + assertFalse(rectangle.contains(new ol3.Coordinate(0, 1))); + assertFalse(rectangle.contains(new ol3.Coordinate(0, 2))); + assertFalse(rectangle.contains(new ol3.Coordinate(0, 3))); + assertFalse(rectangle.contains(new ol3.Coordinate(0, 4))); + assertFalse(rectangle.contains(new ol3.Coordinate(0, 5))); + assertFalse(rectangle.contains(new ol3.Coordinate(1, 1))); + assertFalse(rectangle.contains(new ol3.Coordinate(1, 5))); + assertFalse(rectangle.contains(new ol3.Coordinate(2, 1))); + assertFalse(rectangle.contains(new ol3.Coordinate(2, 5))); + assertFalse(rectangle.contains(new ol3.Coordinate(3, 1))); + assertFalse(rectangle.contains(new ol3.Coordinate(3, 5))); + assertFalse(rectangle.contains(new ol3.Coordinate(4, 1))); + assertFalse(rectangle.contains(new ol3.Coordinate(4, 2))); + assertFalse(rectangle.contains(new ol3.Coordinate(4, 3))); + assertFalse(rectangle.contains(new ol3.Coordinate(4, 4))); + assertFalse(rectangle.contains(new ol3.Coordinate(4, 5))); +} + + +function testIntersects() { + + var rectangle1 = new ol3.Rectangle(50, 50, 100, 100); + + function assertIntersects(rectangle2) { + assertTrue(rectangle1 + ' expected to intersect ' + rectangle2, + rectangle1.intersects(rectangle2)); + } + function assertNotIntersects(rectangle2) { + assertFalse(rectangle1 + ' expected to not intersect ' + rectangle2, + rectangle1.intersects(rectangle2)); + } + + assertIntersects(rectangle1); + assertIntersects(new ol3.Rectangle(20, 20, 80, 80)); + assertIntersects(new ol3.Rectangle(20, 50, 80, 100)); + assertIntersects(new ol3.Rectangle(20, 80, 80, 120)); + assertIntersects(new ol3.Rectangle(50, 20, 100, 80)); + assertIntersects(new ol3.Rectangle(50, 80, 100, 120)); + assertIntersects(new ol3.Rectangle(80, 20, 120, 80)); + assertIntersects(new ol3.Rectangle(80, 50, 120, 100)); + assertIntersects(new ol3.Rectangle(80, 80, 120, 120)); + assertIntersects(new ol3.Rectangle(20, 20, 120, 120)); + assertIntersects(new ol3.Rectangle(70, 70, 80, 80)); + assertNotIntersects(new ol3.Rectangle(10, 10, 30, 30)); + assertNotIntersects(new ol3.Rectangle(30, 10, 70, 30)); + assertNotIntersects(new ol3.Rectangle(50, 10, 100, 30)); + assertNotIntersects(new ol3.Rectangle(80, 10, 120, 30)); + assertNotIntersects(new ol3.Rectangle(120, 10, 140, 30)); + assertNotIntersects(new ol3.Rectangle(10, 30, 30, 70)); + assertNotIntersects(new ol3.Rectangle(120, 30, 140, 70)); + assertNotIntersects(new ol3.Rectangle(10, 50, 30, 100)); + assertNotIntersects(new ol3.Rectangle(120, 50, 140, 100)); + assertNotIntersects(new ol3.Rectangle(10, 80, 30, 120)); + assertNotIntersects(new ol3.Rectangle(120, 80, 140, 120)); + assertNotIntersects(new ol3.Rectangle(10, 120, 30, 140)); + assertNotIntersects(new ol3.Rectangle(30, 120, 70, 140)); + assertNotIntersects(new ol3.Rectangle(50, 120, 100, 140)); + assertNotIntersects(new ol3.Rectangle(80, 120, 120, 140)); + assertNotIntersects(new ol3.Rectangle(120, 120, 140, 140)); +} + + +function testSize() { + var rectangle = new ol3.Rectangle(0, 1, 2, 4); + var size = rectangle.getSize(); + assertEquals(2, size.width); + assertEquals(3, size.height); +} + + +function testNormalize() { + var rectangle = new ol3.Rectangle(0, 1, 2, 3); + var coordinate; + + coordinate = rectangle.normalize(new ol3.Coordinate(1, 2)); + assertEquals(0.5, coordinate.x); + assertEquals(0.5, coordinate.y); + + coordinate = rectangle.normalize(new ol3.Coordinate(0, 3)); + assertEquals(0, coordinate.x); + assertEquals(1, coordinate.y); + + coordinate = rectangle.normalize(new ol3.Coordinate(2, 1)); + assertEquals(1, coordinate.x); + assertEquals(0, coordinate.y); + + coordinate = rectangle.normalize(new ol3.Coordinate(0, 0)); + assertEquals(0, coordinate.x); + assertEquals(-0.5, coordinate.y); + + coordinate = rectangle.normalize(new ol3.Coordinate(-1, 1)); + assertEquals(-0.5, coordinate.x); + assertEquals(0, coordinate.y); + +} + + +function testToString() { + var rectangle = new ol3.Rectangle(0, 1, 2, 3); + assertEquals('(0, 1, 2, 3)', rectangle.toString()); +} diff --git a/src/ol/base/size.js b/src/ol3/base/size.js similarity index 62% rename from src/ol/base/size.js rename to src/ol3/base/size.js index c751b14fae..7f09aa964c 100644 --- a/src/ol/base/size.js +++ b/src/ol3/base/size.js @@ -1,4 +1,4 @@ -goog.provide('ol.Size'); +goog.provide('ol3.Size'); goog.require('goog.math.Size'); @@ -10,16 +10,16 @@ goog.require('goog.math.Size'); * @param {number} width Width. * @param {number} height Height. */ -ol.Size = function(width, height) { +ol3.Size = function(width, height) { goog.base(this, width, height); }; -goog.inherits(ol.Size, goog.math.Size); +goog.inherits(ol3.Size, goog.math.Size); /** - * @param {ol.Size} size Size. + * @param {ol3.Size} size Size. * @return {boolean} Equals. */ -ol.Size.prototype.equals = function(size) { +ol3.Size.prototype.equals = function(size) { return this.width == size.width && this.height == size.height; }; diff --git a/src/ol3/base/store.js b/src/ol3/base/store.js new file mode 100644 index 0000000000..597710b938 --- /dev/null +++ b/src/ol3/base/store.js @@ -0,0 +1,96 @@ +goog.provide('ol3.Store'); + +goog.require('goog.functions'); +goog.require('ol3.Attribution'); +goog.require('ol3.Extent'); +goog.require('ol3.Projection'); + + + +/** + * @constructor + * @param {ol3.Projection} projection Projection. + * @param {ol3.Extent=} opt_extent Extent. + * @param {Array.=} opt_attributions Attributions. + */ +ol3.Store = function(projection, opt_extent, opt_attributions) { + + /** + * @private + * @type {ol3.Projection} + */ + this.projection_ = projection; + + /** + * @private + * @type {ol3.Extent} + */ + this.extent_ = opt_extent || projection.getExtent(); + + /** + * @private + * @type {Array.} + */ + this.attributions_ = opt_attributions || null; + +}; + + +/** + * @return {Array.} Attributions. + */ +ol3.Store.prototype.getAttributions = function() { + return this.attributions_; +}; + + +/** + * @return {ol3.Extent} Extent. + */ +ol3.Store.prototype.getExtent = function() { + return this.extent_; +}; + + +/** + * @return {ol3.Projection} Projection. + */ +ol3.Store.prototype.getProjection = function() { + return this.projection_; +}; + + +/** + * @return {Array.|undefined} Resolutions. + */ +ol3.Store.prototype.getResolutions = goog.abstractMethod; + + +/** + * @return {boolean} Is ready. + */ +ol3.Store.prototype.isReady = goog.functions.TRUE; + + +/** + * @param {Array.} attributions Attributions. + */ +ol3.Store.prototype.setAttributions = function(attributions) { + this.attributions_ = attributions; +}; + + +/** + * @param {ol3.Extent} extent Extent. + */ +ol3.Store.prototype.setExtent = function(extent) { + this.extent_ = extent; +}; + + +/** + * @param {ol3.Projection} projection Projetion. + */ +ol3.Store.prototype.setProjection = function(projection) { + this.projection_ = projection; +}; diff --git a/src/ol3/base/transformfunction.js b/src/ol3/base/transformfunction.js new file mode 100644 index 0000000000..a25739f797 --- /dev/null +++ b/src/ol3/base/transformfunction.js @@ -0,0 +1,9 @@ +goog.provide('ol3.TransformFunction'); + +goog.require('ol3.Coordinate'); + + +/** + * @typedef {function(ol3.Coordinate): ol3.Coordinate} + */ +ol3.TransformFunction; diff --git a/src/ol/control/attribution.js b/src/ol3/control/attribution.js similarity index 69% rename from src/ol/control/attribution.js rename to src/ol3/control/attribution.js index 5cc4bf28c3..54dca48475 100644 --- a/src/ol/control/attribution.js +++ b/src/ol3/control/attribution.js @@ -3,7 +3,7 @@ // FIXME handle layer order // FIXME check clean-up code -goog.provide('ol.control.Attribution'); +goog.provide('ol3.control.Attribution'); goog.require('goog.dom'); goog.require('goog.dom.TagName'); @@ -11,21 +11,21 @@ goog.require('goog.events'); goog.require('goog.events.EventType'); goog.require('goog.object'); goog.require('goog.style'); -goog.require('ol.Collection'); -goog.require('ol.Control'); -goog.require('ol.CoverageArea'); -goog.require('ol.Layer'); -goog.require('ol.MapProperty'); -goog.require('ol.TileCoverageArea'); +goog.require('ol3.Collection'); +goog.require('ol3.Control'); +goog.require('ol3.CoverageArea'); +goog.require('ol3.Layer'); +goog.require('ol3.MapProperty'); +goog.require('ol3.TileCoverageArea'); /** * @constructor - * @extends {ol.Control} - * @param {ol.Map} map Map. + * @extends {ol3.Control} + * @param {ol3.Map} map Map. */ -ol.control.Attribution = function(map) { +ol3.control.Attribution = function(map) { goog.base(this, map); @@ -55,39 +55,41 @@ ol.control.Attribution = function(map) { /** * @private - * @type {Object.>} + * @type {Object.>} */ this.coverageAreass_ = {}; - goog.events.listen(map, ol.Object.getChangedEventType(ol.MapProperty.CENTER), + goog.events.listen( + map, ol3.Object.getChangedEventType(ol3.MapProperty.CENTER), this.handleMapChanged, false, this); - goog.events.listen(map, ol.Object.getChangedEventType(ol.MapProperty.LAYERS), + goog.events.listen( + map, ol3.Object.getChangedEventType(ol3.MapProperty.LAYERS), this.handleMapLayersChanged, false, this); goog.events.listen(map, - ol.Object.getChangedEventType(ol.MapProperty.RESOLUTION), + ol3.Object.getChangedEventType(ol3.MapProperty.RESOLUTION), this.handleMapChanged, false, this); - goog.events.listen(map, ol.Object.getChangedEventType(ol.MapProperty.SIZE), + goog.events.listen(map, ol3.Object.getChangedEventType(ol3.MapProperty.SIZE), this.handleMapChanged, false, this); this.handleMapLayersChanged(); }; -goog.inherits(ol.control.Attribution, ol.Control); +goog.inherits(ol3.control.Attribution, ol3.Control); /** - * @param {ol.Layer} layer Layer. + * @param {ol3.Layer} layer Layer. * @protected */ -ol.control.Attribution.prototype.addLayer = function(layer) { +ol3.control.Attribution.prototype.addLayer = function(layer) { var layerKey = goog.getUid(layer); this.layerVisibleChangeListenerKeys_[layerKey] = goog.events.listen( - layer, ol.Object.getChangedEventType(ol.LayerProperty.VISIBLE), + layer, ol3.Object.getChangedEventType(ol3.LayerProperty.VISIBLE), this.handleLayerVisibleChanged, false, this); if (layer.getStore().isReady()) { @@ -101,10 +103,10 @@ ol.control.Attribution.prototype.addLayer = function(layer) { /** - * @param {ol.Layer} layer Layer. + * @param {ol3.Layer} layer Layer. * @private */ -ol.control.Attribution.prototype.createAttributionElementsForLayer_ = +ol3.control.Attribution.prototype.createAttributionElementsForLayer_ = function(layer) { var store = layer.getStore(); @@ -115,8 +117,8 @@ ol.control.Attribution.prototype.createAttributionElementsForLayer_ = var map = this.getMap(); var mapIsDef = map.isDef(); - var mapExtent = /** @type {ol.Extent} */ map.getExtent(); - var mapProjection = /** @type {ol.Projection} */ map.getProjection(); + var mapExtent = /** @type {ol3.Extent} */ map.getExtent(); + var mapProjection = /** @type {ol3.Projection} */ map.getProjection(); var mapResolution = /** @type {number} */ map.getResolution(); var layerVisible = layer.getVisible(); @@ -155,20 +157,20 @@ ol.control.Attribution.prototype.createAttributionElementsForLayer_ = /** * @inheritDoc */ -ol.control.Attribution.prototype.getElement = function() { +ol3.control.Attribution.prototype.getElement = function() { return this.ulElement_; }; /** - * @param {ol.Layer} layer Layer. - * @param {ol.Extent} mapExtent Map extent. + * @param {ol3.Layer} layer Layer. + * @param {ol3.Extent} mapExtent Map extent. * @param {number} mapResolution Map resolution. - * @param {ol.Projection} mapProjection Map projection. + * @param {ol3.Projection} mapProjection Map projection. * @return {Object.} Attribution visibilities. * @private */ -ol.control.Attribution.prototype.getLayerAttributionVisiblities_ = +ol3.control.Attribution.prototype.getLayerAttributionVisiblities_ = function(layer, mapExtent, mapResolution, mapProjection) { var store = layer.getStore(); @@ -179,8 +181,8 @@ ol.control.Attribution.prototype.getLayerAttributionVisiblities_ = } var mapZ; - if (store instanceof ol.TileStore) { - var tileStore = /** @type {ol.TileStore} */ store; + if (store instanceof ol3.TileStore) { + var tileStore = /** @type {ol3.TileStore} */ store; var tileGrid = tileStore.getTileGrid(); mapZ = tileGrid.getZForResolution(mapResolution); } @@ -199,10 +201,10 @@ ol.control.Attribution.prototype.getLayerAttributionVisiblities_ = var attributionProjection = attribution.getProjection(); coverageAreas = attribution.getCoverageAreas(); if (!goog.isNull(coverageAreas) && - !ol.Projection.equivalent(attributionProjection, mapProjection)) { - var transformFn = ol.Projection.getTransform( + !ol3.Projection.equivalent(attributionProjection, mapProjection)) { + var transformFn = ol3.Projection.getTransform( attributionProjection, mapProjection); - if (transformFn !== ol.Projection.cloneTransform) { + if (transformFn !== ol3.Projection.cloneTransform) { coverageAreas = goog.array.map(coverageAreas, function(coverageArea) { return coverageArea.transform(transformFn); }); @@ -212,15 +214,16 @@ ol.control.Attribution.prototype.getLayerAttributionVisiblities_ = } if (!goog.isNull(coverageAreas)) { - if (store instanceof ol.TileStore) { + if (store instanceof ol3.TileStore) { attributionVisible = goog.array.some( coverageAreas, /** - * @param {ol.TileCoverageArea} tileCoverageArea Tile coverage area. + * @param {ol3.TileCoverageArea} tileCoverageArea + * Tile coverage area. */ function(tileCoverageArea) { goog.asserts.assert( - tileCoverageArea instanceof ol.TileCoverageArea); + tileCoverageArea instanceof ol3.TileCoverageArea); return tileCoverageArea.intersectsExtentAndZ(mapExtent, mapZ); }); } else { @@ -245,8 +248,8 @@ ol.control.Attribution.prototype.getLayerAttributionVisiblities_ = /** * @param {goog.events.Event} event Event. */ -ol.control.Attribution.prototype.handleLayerLoad = function(event) { - var layer = /** @type {ol.Layer} */ event.target; +ol3.control.Attribution.prototype.handleLayerLoad = function(event) { + var layer = /** @type {ol3.Layer} */ event.target; this.createAttributionElementsForLayer_(layer); }; @@ -255,15 +258,15 @@ ol.control.Attribution.prototype.handleLayerLoad = function(event) { * @param {goog.events.Event} event Event. * @protected */ -ol.control.Attribution.prototype.handleLayerVisibleChanged = function(event) { +ol3.control.Attribution.prototype.handleLayerVisibleChanged = function(event) { var map = this.getMap(); var mapIsDef = map.isDef(); - var mapExtent = /** @type {ol.Extent} */ map.getExtent(); - var mapProjection = /** @type {ol.Projection} */ map.getProjection(); + var mapExtent = /** @type {ol3.Extent} */ map.getExtent(); + var mapProjection = /** @type {ol3.Projection} */ map.getProjection(); var mapResolution = /** @type {number} */ map.getResolution(); - var layer = /** @type {ol.Layer} */ event.target; + var layer = /** @type {ol3.Layer} */ event.target; this.updateLayerAttributionsVisibility_( layer, mapIsDef, mapExtent, mapResolution, mapProjection); @@ -272,22 +275,22 @@ ol.control.Attribution.prototype.handleLayerVisibleChanged = function(event) { /** - * @param {ol.CollectionEvent} collectionEvent Collection event. + * @param {ol3.CollectionEvent} collectionEvent Collection event. * @protected */ -ol.control.Attribution.prototype.handleLayersAdd = function(collectionEvent) { - var layer = /** @type {ol.Layer} */ collectionEvent.elem; +ol3.control.Attribution.prototype.handleLayersAdd = function(collectionEvent) { + var layer = /** @type {ol3.Layer} */ collectionEvent.elem; this.addLayer(layer); }; /** - * @param {ol.CollectionEvent} collectionEvent Collection event. + * @param {ol3.CollectionEvent} collectionEvent Collection event. * @protected */ -ol.control.Attribution.prototype.handleLayersRemove = +ol3.control.Attribution.prototype.handleLayersRemove = function(collectionEvent) { - var layer = /** @type {ol.Layer} */ collectionEvent.elem; + var layer = /** @type {ol3.Layer} */ collectionEvent.elem; this.removeLayer(layer); }; @@ -295,12 +298,12 @@ ol.control.Attribution.prototype.handleLayersRemove = /** * @protected */ -ol.control.Attribution.prototype.handleMapChanged = function() { +ol3.control.Attribution.prototype.handleMapChanged = function() { var map = this.getMap(); var mapIsDef = map.isDef(); - var mapExtent = /** @type {ol.Extent} */ map.getExtent(); - var mapProjection = /** @type {ol.Projection} */ map.getProjection(); + var mapExtent = /** @type {ol3.Extent} */ map.getExtent(); + var mapProjection = /** @type {ol3.Projection} */ map.getProjection(); var mapResolution = map.getResolution(); var layers = map.getLayers(); @@ -315,7 +318,7 @@ ol.control.Attribution.prototype.handleMapChanged = function() { /** * @protected */ -ol.control.Attribution.prototype.handleMapLayersChanged = function() { +ol3.control.Attribution.prototype.handleMapLayersChanged = function() { if (!goog.isNull(this.layersListenerKeys_)) { goog.array.forEach(this.layersListenerKeys_, goog.events.unlistenByKey); this.layersListenerKeys_ = null; @@ -330,9 +333,9 @@ ol.control.Attribution.prototype.handleMapLayersChanged = function() { if (goog.isDefAndNotNull(layers)) { layers.forEach(this.addLayer, this); this.layersListenerKeys_ = [ - goog.events.listen(layers, ol.CollectionEventType.ADD, + goog.events.listen(layers, ol3.CollectionEventType.ADD, this.handleLayersAdd, false, this), - goog.events.listen(layers, ol.CollectionEventType.REMOVE, + goog.events.listen(layers, ol3.CollectionEventType.REMOVE, this.handleLayersRemove, false, this) ]; } @@ -340,10 +343,10 @@ ol.control.Attribution.prototype.handleMapLayersChanged = function() { /** - * @param {ol.Layer} layer Layer. + * @param {ol3.Layer} layer Layer. * @protected */ -ol.control.Attribution.prototype.removeLayer = function(layer) { +ol3.control.Attribution.prototype.removeLayer = function(layer) { var layerKey = goog.getUid(layer); @@ -362,14 +365,14 @@ ol.control.Attribution.prototype.removeLayer = function(layer) { /** - * @param {ol.Layer} layer Layer. + * @param {ol3.Layer} layer Layer. * @param {boolean} mapIsDef Map is defined. - * @param {ol.Extent} mapExtent Map extent. + * @param {ol3.Extent} mapExtent Map extent. * @param {number} mapResolution Map resolution. - * @param {ol.Projection} mapProjection Map projection. + * @param {ol3.Projection} mapProjection Map projection. * @private */ -ol.control.Attribution.prototype.updateLayerAttributionsVisibility_ = +ol3.control.Attribution.prototype.updateLayerAttributionsVisibility_ = function(layer, mapIsDef, mapExtent, mapResolution, mapProjection) { if (mapIsDef && layer.getVisible()) { var attributionVisibilities = this.getLayerAttributionVisiblities_( diff --git a/src/ol3/control/control.js b/src/ol3/control/control.js new file mode 100644 index 0000000000..9b019e5224 --- /dev/null +++ b/src/ol3/control/control.js @@ -0,0 +1,33 @@ +goog.provide('ol3.Control'); + +goog.require('ol3.Map'); + + + +/** + * @constructor + * @param {ol3.Map} map Map. + */ +ol3.Control = function(map) { + + /** + * @private + * @type {ol3.Map} + */ + this.map_ = map; + +}; + + +/** + * @return {Element} Element. + */ +ol3.Control.prototype.getElement = goog.abstractMethod; + + +/** + * @return {ol3.Map} Map. + */ +ol3.Control.prototype.getMap = function() { + return this.map_; +}; diff --git a/src/ol/control/mouseposition.js b/src/ol3/control/mouseposition.js similarity index 63% rename from src/ol/control/mouseposition.js rename to src/ol3/control/mouseposition.js index 4d558a7855..fdf9bee13d 100644 --- a/src/ol/control/mouseposition.js +++ b/src/ol3/control/mouseposition.js @@ -1,26 +1,26 @@ // FIXME should listen on appropriate pane, once it is defined -goog.provide('ol.control.MousePosition'); +goog.provide('ol3.control.MousePosition'); goog.require('goog.events'); goog.require('goog.events.EventType'); -goog.require('ol.Control'); -goog.require('ol.MapProperty'); -goog.require('ol.Object'); -goog.require('ol.Projection'); -goog.require('ol.TransformFunction'); +goog.require('ol3.Control'); +goog.require('ol3.MapProperty'); +goog.require('ol3.Object'); +goog.require('ol3.Projection'); +goog.require('ol3.TransformFunction'); /** * @constructor - * @extends {ol.Control} - * @param {ol.Map} map Map. - * @param {ol.Projection=} opt_projection Projection. - * @param {ol.CoordinateFormatType=} opt_coordinateFormat Coordinate format. + * @extends {ol3.Control} + * @param {ol3.Map} map Map. + * @param {ol3.Projection=} opt_projection Projection. + * @param {ol3.CoordinateFormatType=} opt_coordinateFormat Coordinate format. * @param {string=} opt_undefinedHTML Undefined HTML. */ -ol.control.MousePosition = +ol3.control.MousePosition = function(map, opt_projection, opt_coordinateFormat, opt_undefinedHTML) { goog.base(this, map); @@ -33,13 +33,13 @@ ol.control.MousePosition = /** * @private - * @type {ol.Projection} + * @type {ol3.Projection} */ this.projection_ = opt_projection || null; /** * @private - * @type {ol.CoordinateFormatType|undefined} + * @type {ol3.CoordinateFormatType|undefined} */ this.coordinateFormat_ = opt_coordinateFormat; @@ -51,12 +51,12 @@ ol.control.MousePosition = /** * @private - * @type {ol.TransformFunction} + * @type {ol3.TransformFunction} */ - this.transform_ = ol.Projection.identityTransform; + this.transform_ = ol3.Projection.identityTransform; goog.events.listen(map, - ol.Object.getChangedEventType(ol.MapProperty.PROJECTION), + ol3.Object.getChangedEventType(ol3.MapProperty.PROJECTION), this.handleMapProjectionChanged, false, this); goog.events.listen(map.getViewport(), goog.events.EventType.MOUSEMOVE, @@ -68,13 +68,13 @@ ol.control.MousePosition = this.handleMapProjectionChanged(); }; -goog.inherits(ol.control.MousePosition, ol.Control); +goog.inherits(ol3.control.MousePosition, ol3.Control); /** * @inheritDoc */ -ol.control.MousePosition.prototype.getElement = function() { +ol3.control.MousePosition.prototype.getElement = function() { return this.divElement_; }; @@ -82,14 +82,14 @@ ol.control.MousePosition.prototype.getElement = function() { /** * @protected */ -ol.control.MousePosition.prototype.handleMapProjectionChanged = function() { +ol3.control.MousePosition.prototype.handleMapProjectionChanged = function() { var map = this.getMap(); var mapProjection = map.getProjection(); if (!goog.isDef(mapProjection) || goog.isNull(this.projection_)) { - this.transform_ = ol.Projection.identityTransform; + this.transform_ = ol3.Projection.identityTransform; } else { this.transform_ = - ol.Projection.getTransform(mapProjection, this.projection_); + ol3.Projection.getTransform(mapProjection, this.projection_); } // FIXME should we instead re-calculate using the last known mouse position? this.divElement_.innerHTML = this.undefinedHTML_; @@ -100,9 +100,9 @@ ol.control.MousePosition.prototype.handleMapProjectionChanged = function() { * @param {goog.events.BrowserEvent} browserEvent Browser event. * @protected */ -ol.control.MousePosition.prototype.handleMouseMove = function(browserEvent) { +ol3.control.MousePosition.prototype.handleMouseMove = function(browserEvent) { var map = this.getMap(); - var pixel = new ol.Pixel(browserEvent.offsetX, browserEvent.offsetY); + var pixel = new ol3.Pixel(browserEvent.offsetX, browserEvent.offsetY); var coordinate = map.getCoordinateFromPixel(pixel); var html; if (goog.isDef(coordinate)) { @@ -123,6 +123,6 @@ ol.control.MousePosition.prototype.handleMouseMove = function(browserEvent) { * @param {goog.events.BrowserEvent} browserEvent Browser event. * @protected */ -ol.control.MousePosition.prototype.handleMouseOut = function(browserEvent) { +ol3.control.MousePosition.prototype.handleMouseOut = function(browserEvent) { this.divElement_.innerHTML = this.undefinedHTML_; }; diff --git a/src/ol/dom/dom.js b/src/ol3/dom/dom.js similarity index 53% rename from src/ol/dom/dom.js rename to src/ol3/dom/dom.js index 172cecad61..31b6c9dc19 100644 --- a/src/ol/dom/dom.js +++ b/src/ol3/dom/dom.js @@ -1,4 +1,4 @@ -goog.provide('ol.dom'); +goog.provide('ol3.dom'); goog.require('goog.functions'); @@ -6,4 +6,4 @@ goog.require('goog.functions'); /** * @return {boolean} Is supported. */ -ol.dom.isSupported = goog.functions.TRUE; +ol3.dom.isSupported = goog.functions.TRUE; diff --git a/src/ol3/dom/layerrenderer.js b/src/ol3/dom/layerrenderer.js new file mode 100644 index 0000000000..1b51c3ac40 --- /dev/null +++ b/src/ol3/dom/layerrenderer.js @@ -0,0 +1,84 @@ +goog.provide('ol3.dom.LayerRenderer'); + +goog.require('ol3.Coordinate'); +goog.require('ol3.LayerRenderer'); + + + +/** + * @constructor + * @extends {ol3.LayerRenderer} + * @param {ol3.MapRenderer} mapRenderer Map renderer. + * @param {ol3.Layer} layer Layer. + * @param {!Element} target Target. + */ +ol3.dom.LayerRenderer = function(mapRenderer, layer, target) { + goog.base(this, mapRenderer, layer); + + /** + * @type {!Element} + * @protected + */ + this.target = target; + + /** + * Top left corner of the target in map coords. + * + * @type {ol3.Coordinate} + * @protected + */ + this.origin = null; + + this.handleLayerOpacityChange(); + this.handleLayerVisibleChange(); + +}; +goog.inherits(ol3.dom.LayerRenderer, ol3.LayerRenderer); + + +/** + * @override + * @return {ol3.MapRenderer} Map renderer. + */ +ol3.dom.LayerRenderer.prototype.getMapRenderer = function() { + return /** @type {ol3.dom.MapRenderer} */ goog.base(this, 'getMapRenderer'); +}; + + +/** + * @inheritDoc + */ +ol3.dom.LayerRenderer.prototype.handleLayerLoad = function() { + this.getMap().render(); +}; + + +/** + * @inheritDoc + */ +ol3.dom.LayerRenderer.prototype.handleLayerOpacityChange = function() { + goog.style.setOpacity(this.target, this.getLayer().getOpacity()); +}; + + +/** + * @inheritDoc + */ +ol3.dom.LayerRenderer.prototype.handleLayerVisibleChange = function() { + goog.style.showElement(this.target, this.getLayer().getVisible()); +}; + + +/** + */ +ol3.dom.LayerRenderer.prototype.render = goog.abstractMethod; + + +/** + * Set the location of the top left corner of the target. + * + * @param {ol3.Coordinate} origin Origin. + */ +ol3.dom.LayerRenderer.prototype.setOrigin = function(origin) { + this.origin = origin; +}; diff --git a/src/ol/dom/maprenderer.js b/src/ol3/dom/maprenderer.js similarity index 75% rename from src/ol/dom/maprenderer.js rename to src/ol3/dom/maprenderer.js index b47a4eb078..4f793799ee 100644 --- a/src/ol/dom/maprenderer.js +++ b/src/ol3/dom/maprenderer.js @@ -1,24 +1,24 @@ -goog.provide('ol.dom.MapRenderer'); +goog.provide('ol3.dom.MapRenderer'); goog.require('goog.asserts'); goog.require('goog.dom'); goog.require('goog.dom.TagName'); goog.require('goog.style'); -goog.require('ol.Coordinate'); -goog.require('ol.Map'); -goog.require('ol.MapRenderer'); -goog.require('ol.TileLayer'); -goog.require('ol.dom.TileLayerRenderer'); +goog.require('ol3.Coordinate'); +goog.require('ol3.Map'); +goog.require('ol3.MapRenderer'); +goog.require('ol3.TileLayer'); +goog.require('ol3.dom.TileLayerRenderer'); /** * @constructor - * @extends {ol.MapRenderer} + * @extends {ol3.MapRenderer} * @param {Element} container Container. - * @param {ol.Map} map Map. + * @param {ol3.Map} map Map. */ -ol.dom.MapRenderer = function(container, map) { +ol3.dom.MapRenderer = function(container, map) { goog.base(this, container, map); @@ -38,7 +38,7 @@ ol.dom.MapRenderer = function(container, map) { this.layerPanes_ = {}; /** - * @type {ol.Coordinate|undefined} + * @type {ol3.Coordinate|undefined} * @private */ this.renderedCenter_ = undefined; @@ -46,27 +46,27 @@ ol.dom.MapRenderer = function(container, map) { /** * The pixel offset of the layers pane with respect to its container. * - * @type {ol.Coordinate} + * @type {ol3.Coordinate} * @private */ this.layersPaneOffset_ = null; }; -goog.inherits(ol.dom.MapRenderer, ol.MapRenderer); +goog.inherits(ol3.dom.MapRenderer, ol3.MapRenderer); /** * @inheritDoc */ -ol.dom.MapRenderer.prototype.createLayerRenderer = function(layer) { +ol3.dom.MapRenderer.prototype.createLayerRenderer = function(layer) { - if (layer instanceof ol.TileLayer) { + if (layer instanceof ol3.TileLayer) { var layerPane = goog.dom.createElement(goog.dom.TagName.DIV); layerPane.className = 'ol-layer'; layerPane.style.position = 'absolute'; goog.dom.appendChild(this.layersPane_, layerPane); - var layerRenderer = new ol.dom.TileLayerRenderer(this, layer, layerPane); + var layerRenderer = new ol3.dom.TileLayerRenderer(this, layer, layerPane); this.layerPanes_[goog.getUid(layerRenderer)] = layerPane; @@ -82,7 +82,7 @@ ol.dom.MapRenderer.prototype.createLayerRenderer = function(layer) { /** * @inheritDoc */ -ol.dom.MapRenderer.prototype.handleCenterChanged = function() { +ol3.dom.MapRenderer.prototype.handleCenterChanged = function() { goog.base(this, 'handleCenterChanged'); var map = this.getMap(); if (!map.isDef()) { @@ -102,7 +102,7 @@ ol.dom.MapRenderer.prototype.handleCenterChanged = function() { /** * @inheritDoc */ -ol.dom.MapRenderer.prototype.handleResolutionChanged = function() { +ol3.dom.MapRenderer.prototype.handleResolutionChanged = function() { goog.base(this, 'handleResolutionChanged'); var map = this.getMap(); if (!map.isDef()) { @@ -119,8 +119,8 @@ ol.dom.MapRenderer.prototype.handleResolutionChanged = function() { * Reset the layers pane to its initial position. * @private */ -ol.dom.MapRenderer.prototype.resetLayersPane_ = function() { - var offset = new ol.Coordinate(0, 0); +ol3.dom.MapRenderer.prototype.resetLayersPane_ = function() { + var offset = new ol3.Coordinate(0, 0); goog.style.setPosition(this.layersPane_, offset); this.layersPaneOffset_ = offset; @@ -134,13 +134,13 @@ ol.dom.MapRenderer.prototype.resetLayersPane_ = function() { * Set the origin for each layer renderer. * @private */ -ol.dom.MapRenderer.prototype.setOrigin_ = function() { +ol3.dom.MapRenderer.prototype.setOrigin_ = function() { var center = this.map.getCenter(); var resolution = this.map.getResolution(); var targetSize = this.map.getSize(); var targetWidth = targetSize.width; var targetHeight = targetSize.height; - var origin = new ol.Coordinate( + var origin = new ol3.Coordinate( center.x - resolution * targetWidth / 2, center.y + resolution * targetHeight / 2); goog.object.forEach(this.layerRenderers, function(layerRenderer) { @@ -153,7 +153,7 @@ ol.dom.MapRenderer.prototype.setOrigin_ = function() { * Move the layers pane. * @private */ -ol.dom.MapRenderer.prototype.shiftLayersPane_ = function() { +ol3.dom.MapRenderer.prototype.shiftLayersPane_ = function() { var center = this.map.getCenter(); var oldCenter = this.renderedCenter_; var resolution = this.map.getResolution(); diff --git a/src/ol/dom/tilelayerrenderer.js b/src/ol3/dom/tilelayerrenderer.js similarity index 75% rename from src/ol/dom/tilelayerrenderer.js rename to src/ol3/dom/tilelayerrenderer.js index 25a77b3a5c..50152687e7 100644 --- a/src/ol/dom/tilelayerrenderer.js +++ b/src/ol3/dom/tilelayerrenderer.js @@ -1,20 +1,20 @@ -goog.provide('ol.dom.TileLayerRenderer'); +goog.provide('ol3.dom.TileLayerRenderer'); goog.require('goog.dom'); -goog.require('ol.Coordinate'); -goog.require('ol.Extent'); -goog.require('ol.dom.LayerRenderer'); +goog.require('ol3.Coordinate'); +goog.require('ol3.Extent'); +goog.require('ol3.dom.LayerRenderer'); /** * @constructor - * @extends {ol.dom.LayerRenderer} - * @param {ol.MapRenderer} mapRenderer Map renderer. - * @param {ol.TileLayer} tileLayer Tile layer. + * @extends {ol3.dom.LayerRenderer} + * @param {ol3.MapRenderer} mapRenderer Map renderer. + * @param {ol3.TileLayer} tileLayer Tile layer. * @param {!Element} target Target. */ -ol.dom.TileLayerRenderer = function(mapRenderer, tileLayer, target) { +ol3.dom.TileLayerRenderer = function(mapRenderer, tileLayer, target) { goog.base(this, mapRenderer, tileLayer, target); /** @@ -29,15 +29,15 @@ ol.dom.TileLayerRenderer = function(mapRenderer, tileLayer, target) { */ this.renderedMapResolution_ = undefined; }; -goog.inherits(ol.dom.TileLayerRenderer, ol.dom.LayerRenderer); +goog.inherits(ol3.dom.TileLayerRenderer, ol3.dom.LayerRenderer); /** * @override - * @return {ol.TileLayer} Layer. + * @return {ol3.TileLayer} Layer. */ -ol.dom.TileLayerRenderer.prototype.getLayer = function() { - return /** @type {ol.TileLayer} */ goog.base(this, 'getLayer'); +ol3.dom.TileLayerRenderer.prototype.getLayer = function() { + return /** @type {ol3.TileLayer} */ goog.base(this, 'getLayer'); }; @@ -46,14 +46,14 @@ ol.dom.TileLayerRenderer.prototype.getLayer = function() { * @private * @param {number} z Z. * @param {number} resolution Resolution. - * @return {ol.Coordinate} Offset. + * @return {ol3.Coordinate} Offset. */ -ol.dom.TileLayerRenderer.prototype.getTileOffset_ = function(z, resolution) { +ol3.dom.TileLayerRenderer.prototype.getTileOffset_ = function(z, resolution) { var tileLayer = this.getLayer(); var tileStore = tileLayer.getStore(); var tileGrid = tileStore.getTileGrid(); var tileOrigin = tileGrid.getOrigin(z); - var offset = new ol.Coordinate( + var offset = new ol3.Coordinate( Math.round((this.origin.x - tileOrigin.x) / resolution), Math.round((tileOrigin.y - this.origin.y) / resolution)); return offset; @@ -63,14 +63,14 @@ ol.dom.TileLayerRenderer.prototype.getTileOffset_ = function(z, resolution) { /** * Get rid of tiles outside the rendered extent. * @private - * @param {ol.TileBounds} tileBounds Tile bounds. + * @param {ol3.TileBounds} tileBounds Tile bounds. * @param {number} z Z. */ -ol.dom.TileLayerRenderer.prototype.removeInvisibleTiles_ = function( +ol3.dom.TileLayerRenderer.prototype.removeInvisibleTiles_ = function( tileBounds, z) { var key, tileCoord, prune, tile; for (key in this.renderedTiles_) { - tileCoord = ol.TileCoord.createFromString(key); + tileCoord = ol3.TileCoord.createFromString(key); prune = z !== tileCoord.z || tileCoord.x < tileBounds.minX || tileCoord.x > tileBounds.maxX || @@ -88,13 +88,13 @@ ol.dom.TileLayerRenderer.prototype.removeInvisibleTiles_ = function( /** * @inheritDoc */ -ol.dom.TileLayerRenderer.prototype.render = function() { +ol3.dom.TileLayerRenderer.prototype.render = function() { var map = this.getMap(); if (!map.isDef()) { return; } - var mapExtent = /** @type {!ol.Extent} */ map.getExtent(); + var mapExtent = /** @type {!ol3.Extent} */ map.getExtent(); var mapResolution = /** @type {number} */ map.getResolution(); var tileLayer = this.getLayer(); diff --git a/src/ol/interaction/altdragrotate.js b/src/ol3/interaction/altdragrotate.js similarity index 66% rename from src/ol/interaction/altdragrotate.js rename to src/ol3/interaction/altdragrotate.js index 50dc5c0980..c38ad19e06 100644 --- a/src/ol/interaction/altdragrotate.js +++ b/src/ol3/interaction/altdragrotate.js @@ -1,16 +1,16 @@ -goog.provide('ol.interaction.AltDragRotate'); +goog.provide('ol3.interaction.AltDragRotate'); -goog.require('ol.MapBrowserEvent'); -goog.require('ol.interaction.Drag'); +goog.require('ol3.MapBrowserEvent'); +goog.require('ol3.interaction.Drag'); /** * @constructor - * @extends {ol.interaction.Drag} - * @param {ol.interaction.Constraints} constraints Constraints. + * @extends {ol3.interaction.Drag} + * @param {ol3.interaction.Constraints} constraints Constraints. */ -ol.interaction.AltDragRotate = function(constraints) { +ol3.interaction.AltDragRotate = function(constraints) { goog.base(this, constraints); @@ -21,13 +21,13 @@ ol.interaction.AltDragRotate = function(constraints) { this.startRotation_ = 0; }; -goog.inherits(ol.interaction.AltDragRotate, ol.interaction.Drag); +goog.inherits(ol3.interaction.AltDragRotate, ol3.interaction.Drag); /** * @inheritDoc */ -ol.interaction.AltDragRotate.prototype.handleDrag = function(mapBrowserEvent) { +ol3.interaction.AltDragRotate.prototype.handleDrag = function(mapBrowserEvent) { var browserEvent = mapBrowserEvent.browserEvent; var map = mapBrowserEvent.map; var size = map.getSize(); @@ -41,7 +41,7 @@ ol.interaction.AltDragRotate.prototype.handleDrag = function(mapBrowserEvent) { /** * @inheritDoc */ -ol.interaction.AltDragRotate.prototype.handleDragStart = +ol3.interaction.AltDragRotate.prototype.handleDragStart = function(mapBrowserEvent) { var browserEvent = mapBrowserEvent.browserEvent; var map = mapBrowserEvent.map; diff --git a/src/ol3/interaction/centerconstraint.js b/src/ol3/interaction/centerconstraint.js new file mode 100644 index 0000000000..46ee5f4bda --- /dev/null +++ b/src/ol3/interaction/centerconstraint.js @@ -0,0 +1,47 @@ +goog.provide('ol3.interaction.CenterConstraint'); +goog.provide('ol3.interaction.CenterConstraintType'); + +goog.require('ol3.Coordinate'); + + +/** + * @typedef {function((ol3.Coordinate|undefined), + * (number|undefined), + * ol3.Coordinate): (ol3.Coordinate|undefined)} + */ +ol3.interaction.CenterConstraintType; + + +/** + * @param {ol3.Coordinate|undefined} center Center. + * @param {number|undefined} resolution Resolution. + * @param {ol3.Coordinate} delta Delta. + * @return {ol3.Coordinate|undefined} Center. + */ +ol3.interaction.CenterConstraint.none = function(center, resolution, delta) { + if (goog.isDefAndNotNull(center) && goog.isDef(resolution)) { + var x = center.x + delta.x; + var y = center.y + delta.y; + return new ol3.Coordinate(x, y); + } else { + return undefined; + } +}; + + +/** + * @param {ol3.Coordinate|undefined} center Center. + * @param {number|undefined} resolution Resolution. + * @param {ol3.Coordinate} delta Delta. + * @return {ol3.Coordinate|undefined} Center. + */ +ol3.interaction.CenterConstraint.snapToPixel = + function(center, resolution, delta) { + if (goog.isDefAndNotNull(center) && goog.isDef(resolution)) { + var x = Math.floor((center.x + delta.x) / resolution + 0.5) * resolution; + var y = Math.floor((center.y + delta.y) / resolution + 0.5) * resolution; + return new ol3.Coordinate(x, y); + } else { + return undefined; + } +}; diff --git a/src/ol3/interaction/constraints.js b/src/ol3/interaction/constraints.js new file mode 100644 index 0000000000..c5e5855cc6 --- /dev/null +++ b/src/ol3/interaction/constraints.js @@ -0,0 +1,36 @@ +goog.provide('ol3.interaction.Constraints'); + +goog.require('ol3.interaction.CenterConstraintType'); +goog.require('ol3.interaction.ResolutionConstraintType'); +goog.require('ol3.interaction.RotationConstraintType'); + + + +/** + * @constructor + * @param {ol3.interaction.CenterConstraintType} centerConstraint + * Center constraint. + * @param {ol3.interaction.ResolutionConstraintType} resolutionConstraint + * Resolution constraint. + * @param {ol3.interaction.RotationConstraintType} rotationConstraint + * Rotation constraint. + */ +ol3.interaction.Constraints = + function(centerConstraint, resolutionConstraint, rotationConstraint) { + + /** + * @type {ol3.interaction.CenterConstraintType} + */ + this.center = centerConstraint; + + /** + * @type {ol3.interaction.ResolutionConstraintType} + */ + this.resolution = resolutionConstraint; + + /** + * @type {ol3.interaction.RotationConstraintType} + */ + this.rotation = rotationConstraint; + +}; diff --git a/src/ol/interaction/dblclickzoom.js b/src/ol3/interaction/dblclickzoom.js similarity index 57% rename from src/ol/interaction/dblclickzoom.js rename to src/ol3/interaction/dblclickzoom.js index 89bad5955d..15055f5000 100644 --- a/src/ol/interaction/dblclickzoom.js +++ b/src/ol3/interaction/dblclickzoom.js @@ -1,27 +1,27 @@ -goog.provide('ol.interaction.DblClickZoom'); +goog.provide('ol3.interaction.DblClickZoom'); goog.require('goog.events.EventType'); -goog.require('ol.Interaction'); -goog.require('ol.MapBrowserEvent'); -goog.require('ol.interaction.Constraints'); +goog.require('ol3.Interaction'); +goog.require('ol3.MapBrowserEvent'); +goog.require('ol3.interaction.Constraints'); /** * @constructor - * @extends {ol.Interaction} - * @param {ol.interaction.Constraints} constraints Constraints. + * @extends {ol3.Interaction} + * @param {ol3.interaction.Constraints} constraints Constraints. */ -ol.interaction.DblClickZoom = function(constraints) { +ol3.interaction.DblClickZoom = function(constraints) { goog.base(this, constraints); }; -goog.inherits(ol.interaction.DblClickZoom, ol.Interaction); +goog.inherits(ol3.interaction.DblClickZoom, ol3.Interaction); /** * @inheritDoc */ -ol.interaction.DblClickZoom.prototype.handleMapBrowserEvent = +ol3.interaction.DblClickZoom.prototype.handleMapBrowserEvent = function(mapBrowserEvent) { var browserEvent = mapBrowserEvent.browserEvent; if (browserEvent.type == goog.events.EventType.DBLCLICK && diff --git a/src/ol/interaction/drag.js b/src/ol3/interaction/drag.js similarity index 66% rename from src/ol/interaction/drag.js rename to src/ol3/interaction/drag.js index a7e57ea505..adf3ca4b72 100644 --- a/src/ol/interaction/drag.js +++ b/src/ol3/interaction/drag.js @@ -1,22 +1,22 @@ -goog.provide('ol.interaction.Drag'); +goog.provide('ol3.interaction.Drag'); goog.require('goog.asserts'); goog.require('goog.events.EventType'); goog.require('goog.functions'); -goog.require('ol.Coordinate'); -goog.require('ol.Interaction'); -goog.require('ol.MapBrowserEvent'); -goog.require('ol.interaction.Constraints'); +goog.require('ol3.Coordinate'); +goog.require('ol3.Interaction'); +goog.require('ol3.MapBrowserEvent'); +goog.require('ol3.interaction.Constraints'); /** * @constructor - * @extends {ol.Interaction} - * @param {ol.interaction.Constraints} constraints Constraints. + * @extends {ol3.Interaction} + * @param {ol3.interaction.Constraints} constraints Constraints. */ -ol.interaction.Drag = function(constraints) { +ol3.interaction.Drag = function(constraints) { goog.base(this, constraints); @@ -47,45 +47,45 @@ ol.interaction.Drag = function(constraints) { this.offsetY = 0; /** - * @type {ol.Coordinate} + * @type {ol3.Coordinate} */ this.startCenter = null; /** - * @type {ol.Coordinate} + * @type {ol3.Coordinate} */ this.startCoordinate = null; }; -goog.inherits(ol.interaction.Drag, ol.Interaction); +goog.inherits(ol3.interaction.Drag, ol3.Interaction); /** - * @param {ol.MapBrowserEvent} mapBrowserEvent Event. + * @param {ol3.MapBrowserEvent} mapBrowserEvent Event. * @protected */ -ol.interaction.Drag.prototype.handleDrag = goog.nullFunction; +ol3.interaction.Drag.prototype.handleDrag = goog.nullFunction; /** - * @param {ol.MapBrowserEvent} mapBrowserEvent Event. + * @param {ol3.MapBrowserEvent} mapBrowserEvent Event. * @protected */ -ol.interaction.Drag.prototype.handleDragEnd = goog.nullFunction; +ol3.interaction.Drag.prototype.handleDragEnd = goog.nullFunction; /** - * @param {ol.MapBrowserEvent} mapBrowserEvent Event. + * @param {ol3.MapBrowserEvent} mapBrowserEvent Event. * @protected * @return {boolean} Capture dragging. */ -ol.interaction.Drag.prototype.handleDragStart = goog.functions.FALSE; +ol3.interaction.Drag.prototype.handleDragStart = goog.functions.FALSE; /** * @inheritDoc */ -ol.interaction.Drag.prototype.handleMapBrowserEvent = +ol3.interaction.Drag.prototype.handleMapBrowserEvent = function(mapBrowserEvent) { var map = mapBrowserEvent.map; if (!map.isDef()) { @@ -111,8 +111,8 @@ ol.interaction.Drag.prototype.handleMapBrowserEvent = this.startY = browserEvent.clientY; this.deltaX = 0; this.deltaY = 0; - this.startCenter = /** @type {!ol.Coordinate} */ map.getCenter(); - this.startCoordinate = /** @type {ol.Coordinate} */ + this.startCenter = /** @type {!ol3.Coordinate} */ map.getCenter(); + this.startCoordinate = /** @type {ol3.Coordinate} */ mapBrowserEvent.getCoordinate(); if (this.handleDragStart(mapBrowserEvent)) { this.dragging_ = true; diff --git a/src/ol3/interaction/dragpan.js b/src/ol3/interaction/dragpan.js new file mode 100644 index 0000000000..6594e6fbd9 --- /dev/null +++ b/src/ol3/interaction/dragpan.js @@ -0,0 +1,48 @@ +goog.provide('ol3.interaction.DragPan'); + +goog.require('ol3.Coordinate'); +goog.require('ol3.MapBrowserEvent'); +goog.require('ol3.interaction.Constraints'); +goog.require('ol3.interaction.Drag'); + + + +/** + * @constructor + * @extends {ol3.interaction.Drag} + * @param {ol3.interaction.Constraints} constraints Constraints. + */ +ol3.interaction.DragPan = function(constraints) { + goog.base(this, constraints); +}; +goog.inherits(ol3.interaction.DragPan, ol3.interaction.Drag); + + +/** + * @inheritDoc + */ +ol3.interaction.DragPan.prototype.handleDrag = function(mapBrowserEvent) { + var map = mapBrowserEvent.map; + var resolution = map.getResolution(); + var rotation = map.getRotation(); + var delta = + new ol3.Coordinate(-resolution * this.deltaX, resolution * this.deltaY); + if (map.canRotate() && goog.isDef(rotation)) { + delta.rotate(rotation); + } + this.pan(map, delta, this.startCenter); +}; + + +/** + * @inheritDoc + */ +ol3.interaction.DragPan.prototype.handleDragStart = function(mapBrowserEvent) { + var browserEvent = mapBrowserEvent.browserEvent; + if (!browserEvent.shiftKey) { + browserEvent.preventDefault(); + return true; + } else { + return false; + } +}; diff --git a/src/ol/interaction/interaction.js b/src/ol3/interaction/interaction.js similarity index 54% rename from src/ol/interaction/interaction.js rename to src/ol3/interaction/interaction.js index b148a63e82..e5e07ddb95 100644 --- a/src/ol/interaction/interaction.js +++ b/src/ol3/interaction/interaction.js @@ -1,21 +1,21 @@ // FIXME factor out key precondition (shift et. al) -goog.provide('ol.Interaction'); +goog.provide('ol3.Interaction'); -goog.require('ol.MapBrowserEvent'); -goog.require('ol.interaction.Constraints'); +goog.require('ol3.MapBrowserEvent'); +goog.require('ol3.interaction.Constraints'); /** * @constructor - * @param {ol.interaction.Constraints} constraints Constraints. + * @param {ol3.interaction.Constraints} constraints Constraints. */ -ol.Interaction = function(constraints) { +ol3.Interaction = function(constraints) { /** * @protected - * @type {ol.interaction.Constraints} + * @type {ol3.interaction.Constraints} */ this.constraints = constraints; @@ -23,14 +23,14 @@ ol.Interaction = function(constraints) { /** - * @param {ol.Map} map Map. - * @param {ol.Extent} extent Extent. + * @param {ol3.Map} map Map. + * @param {ol3.Extent} extent Extent. */ -ol.Interaction.prototype.fitExtent = function(map, extent) { +ol3.Interaction.prototype.fitExtent = function(map, extent) { var resolution = map.getResolutionForExtent(extent); resolution = this.constraints.resolution(resolution, 0); var center = extent.getCenter(); - center = this.constraints.center(center, resolution, ol.Coordinate.ZERO); + center = this.constraints.center(center, resolution, ol3.Coordinate.ZERO); map.withFrozenRendering(function() { map.setCenter(center); map.setResolution(resolution); @@ -39,17 +39,17 @@ ol.Interaction.prototype.fitExtent = function(map, extent) { /** - * @param {ol.MapBrowserEvent} mapBrowserEvent Map browser event. + * @param {ol3.MapBrowserEvent} mapBrowserEvent Map browser event. */ -ol.Interaction.prototype.handleMapBrowserEvent = goog.abstractMethod; +ol3.Interaction.prototype.handleMapBrowserEvent = goog.abstractMethod; /** - * @param {ol.Map} map Map. - * @param {ol.Coordinate} delta Delta. - * @param {ol.Coordinate=} opt_anchor Anchor. + * @param {ol3.Map} map Map. + * @param {ol3.Coordinate} delta Delta. + * @param {ol3.Coordinate=} opt_anchor Anchor. */ -ol.Interaction.prototype.pan = function(map, delta, opt_anchor) { +ol3.Interaction.prototype.pan = function(map, delta, opt_anchor) { var center = opt_anchor ? opt_anchor : map.getCenter(); var resolution = map.getResolution(); center = this.constraints.center(center, resolution, delta); @@ -58,12 +58,12 @@ ol.Interaction.prototype.pan = function(map, delta, opt_anchor) { /** - * @param {ol.Map} map Map. + * @param {ol3.Map} map Map. * @param {number|undefined} rotation Rotation. * @param {number} delta Delta. - * @param {ol.Coordinate=} opt_anchor Anchor. + * @param {ol3.Coordinate=} opt_anchor Anchor. */ -ol.Interaction.prototype.rotate = function(map, rotation, delta, opt_anchor) { +ol3.Interaction.prototype.rotate = function(map, rotation, delta, opt_anchor) { // FIXME handle rotation about anchor rotation = this.constraints.rotation(rotation, delta); map.setRotation(rotation); @@ -71,31 +71,31 @@ ol.Interaction.prototype.rotate = function(map, rotation, delta, opt_anchor) { /** - * @param {ol.Map} map Map. + * @param {ol3.Map} map Map. * @param {number|undefined} resolution Resolution. */ -ol.Interaction.prototype.setResolution = function(map, resolution) { +ol3.Interaction.prototype.setResolution = function(map, resolution) { resolution = this.constraints.resolution(resolution, 0); map.setResolution(resolution); }; /** - * @param {ol.Map} map Map. + * @param {ol3.Map} map Map. * @param {number|undefined} resolution Resolution. * @param {number} delta Delta. - * @param {ol.Coordinate=} opt_anchor Anchor. + * @param {ol3.Coordinate=} opt_anchor Anchor. */ -ol.Interaction.prototype.zoom = function(map, resolution, delta, opt_anchor) { +ol3.Interaction.prototype.zoom = function(map, resolution, delta, opt_anchor) { if (goog.isDefAndNotNull(opt_anchor)) { var anchor = opt_anchor; - var mapCenter = /** @type {!ol.Coordinate} */ map.getCenter(); + var mapCenter = /** @type {!ol3.Coordinate} */ map.getCenter(); var mapResolution = map.getResolution(); resolution = this.constraints.resolution(resolution, delta); var x = anchor.x - resolution * (anchor.x - mapCenter.x) / mapResolution; var y = anchor.y - resolution * (anchor.y - mapCenter.y) / mapResolution; - var center = new ol.Coordinate(x, y); - center = this.constraints.center(center, resolution, ol.Coordinate.ZERO); + var center = new ol3.Coordinate(x, y); + center = this.constraints.center(center, resolution, ol3.Coordinate.ZERO); map.withFrozenRendering(function() { map.setCenter(center); map.setResolution(resolution); diff --git a/src/ol/interaction/keyboard.js b/src/ol3/interaction/keyboard.js similarity index 69% rename from src/ol/interaction/keyboard.js rename to src/ol3/interaction/keyboard.js index ba21904668..a81bafc163 100644 --- a/src/ol/interaction/keyboard.js +++ b/src/ol3/interaction/keyboard.js @@ -1,16 +1,16 @@ // FIXME this class is ugly and should be removed -goog.provide('ol.interaction.Keyboard'); +goog.provide('ol3.interaction.Keyboard'); -goog.require('ol.Interaction'); +goog.require('ol3.Interaction'); /** * @constructor - * @extends {ol.Interaction} + * @extends {ol3.Interaction} */ -ol.interaction.Keyboard = function() { +ol3.interaction.Keyboard = function() { goog.base(this, null); @@ -21,14 +21,14 @@ ol.interaction.Keyboard = function() { this.charCodeCallbacks_ = {}; }; -goog.inherits(ol.interaction.Keyboard, ol.Interaction); +goog.inherits(ol3.interaction.Keyboard, ol3.Interaction); /** * @param {string} s String. * @param {Function} callback Callback. */ -ol.interaction.Keyboard.prototype.addCallback = function(s, callback) { +ol3.interaction.Keyboard.prototype.addCallback = function(s, callback) { var i; for (i = 0; i < s.length; ++i) { this.charCodeCallbacks_[s.charCodeAt(i)] = callback; @@ -39,7 +39,7 @@ ol.interaction.Keyboard.prototype.addCallback = function(s, callback) { /** * @inheritDoc */ -ol.interaction.Keyboard.prototype.handleMapBrowserEvent = +ol3.interaction.Keyboard.prototype.handleMapBrowserEvent = function(mapBrowserEvent) { if (mapBrowserEvent.type == goog.events.KeyHandler.EventType.KEY) { var keyEvent = /** @type {goog.events.KeyEvent} */ diff --git a/src/ol/interaction/keyboardpan.js b/src/ol3/interaction/keyboardpan.js similarity index 66% rename from src/ol/interaction/keyboardpan.js rename to src/ol3/interaction/keyboardpan.js index 3d9b1efe7a..24c5166d98 100644 --- a/src/ol/interaction/keyboardpan.js +++ b/src/ol3/interaction/keyboardpan.js @@ -1,19 +1,19 @@ -goog.provide('ol.interaction.KeyboardPan'); +goog.provide('ol3.interaction.KeyboardPan'); goog.require('goog.events.KeyCodes'); goog.require('goog.events.KeyHandler.EventType'); -goog.require('ol.Interaction'); -goog.require('ol.interaction.Constraints'); +goog.require('ol3.Interaction'); +goog.require('ol3.interaction.Constraints'); /** * @constructor - * @extends {ol.Interaction} - * @param {ol.interaction.Constraints} constraints Constraints. + * @extends {ol3.Interaction} + * @param {ol3.interaction.Constraints} constraints Constraints. * @param {number} pixelDelta Pixel delta. */ -ol.interaction.KeyboardPan = function(constraints, pixelDelta) { +ol3.interaction.KeyboardPan = function(constraints, pixelDelta) { goog.base(this, constraints); @@ -24,13 +24,13 @@ ol.interaction.KeyboardPan = function(constraints, pixelDelta) { this.pixelDelta_ = pixelDelta; }; -goog.inherits(ol.interaction.KeyboardPan, ol.Interaction); +goog.inherits(ol3.interaction.KeyboardPan, ol3.Interaction); /** * @inheritDoc */ -ol.interaction.KeyboardPan.prototype.handleMapBrowserEvent = +ol3.interaction.KeyboardPan.prototype.handleMapBrowserEvent = function(mapBrowserEvent) { if (mapBrowserEvent.type == goog.events.KeyHandler.EventType.KEY) { var keyEvent = /** @type {goog.events.KeyEvent} */ @@ -45,14 +45,14 @@ ol.interaction.KeyboardPan.prototype.handleMapBrowserEvent = var delta; var mapUnitsDelta = resolution * this.pixelDelta_; if (keyCode == goog.events.KeyCodes.DOWN) { - delta = new ol.Coordinate(0, -mapUnitsDelta); + delta = new ol3.Coordinate(0, -mapUnitsDelta); } else if (keyCode == goog.events.KeyCodes.LEFT) { - delta = new ol.Coordinate(-mapUnitsDelta, 0); + delta = new ol3.Coordinate(-mapUnitsDelta, 0); } else if (keyCode == goog.events.KeyCodes.RIGHT) { - delta = new ol.Coordinate(mapUnitsDelta, 0); + delta = new ol3.Coordinate(mapUnitsDelta, 0); } else { goog.asserts.assert(keyCode == goog.events.KeyCodes.UP); - delta = new ol.Coordinate(0, mapUnitsDelta); + delta = new ol3.Coordinate(0, mapUnitsDelta); } this.pan(map, delta); keyEvent.preventDefault(); diff --git a/src/ol/interaction/keyboardzoom.js b/src/ol3/interaction/keyboardzoom.js similarity index 64% rename from src/ol/interaction/keyboardzoom.js rename to src/ol3/interaction/keyboardzoom.js index dd88f90729..23cafba2bf 100644 --- a/src/ol/interaction/keyboardzoom.js +++ b/src/ol3/interaction/keyboardzoom.js @@ -1,27 +1,27 @@ -goog.provide('ol.interaction.KeyboardZoom'); +goog.provide('ol3.interaction.KeyboardZoom'); goog.require('goog.events.KeyCodes'); goog.require('goog.events.KeyHandler.EventType'); -goog.require('ol.Interaction'); -goog.require('ol.interaction.ResolutionConstraintType'); +goog.require('ol3.Interaction'); +goog.require('ol3.interaction.ResolutionConstraintType'); /** * @constructor - * @extends {ol.Interaction} - * @param {ol.interaction.Constraints} constraints Constraints. + * @extends {ol3.Interaction} + * @param {ol3.interaction.Constraints} constraints Constraints. */ -ol.interaction.KeyboardZoom = function(constraints) { +ol3.interaction.KeyboardZoom = function(constraints) { goog.base(this, constraints); }; -goog.inherits(ol.interaction.KeyboardZoom, ol.Interaction); +goog.inherits(ol3.interaction.KeyboardZoom, ol3.Interaction); /** * @inheritDoc */ -ol.interaction.KeyboardZoom.prototype.handleMapBrowserEvent = +ol3.interaction.KeyboardZoom.prototype.handleMapBrowserEvent = function(mapBrowserEvent) { if (mapBrowserEvent.type == goog.events.KeyHandler.EventType.KEY) { var keyEvent = /** @type {goog.events.KeyEvent} */ diff --git a/src/ol/interaction/mousewheelzoom.js b/src/ol3/interaction/mousewheelzoom.js similarity index 67% rename from src/ol/interaction/mousewheelzoom.js rename to src/ol3/interaction/mousewheelzoom.js index 23a92750d5..40f41837a0 100644 --- a/src/ol/interaction/mousewheelzoom.js +++ b/src/ol3/interaction/mousewheelzoom.js @@ -1,27 +1,27 @@ -goog.provide('ol.interaction.MouseWheelZoom'); +goog.provide('ol3.interaction.MouseWheelZoom'); goog.require('goog.events.MouseWheelEvent'); goog.require('goog.events.MouseWheelHandler.EventType'); -goog.require('ol.MapBrowserEvent'); -goog.require('ol.interaction.Constraints'); +goog.require('ol3.MapBrowserEvent'); +goog.require('ol3.interaction.Constraints'); /** * @constructor - * @extends {ol.Interaction} - * @param {ol.interaction.Constraints} constraints Constraints. + * @extends {ol3.Interaction} + * @param {ol3.interaction.Constraints} constraints Constraints. */ -ol.interaction.MouseWheelZoom = function(constraints) { +ol3.interaction.MouseWheelZoom = function(constraints) { goog.base(this, constraints); }; -goog.inherits(ol.interaction.MouseWheelZoom, ol.Interaction); +goog.inherits(ol3.interaction.MouseWheelZoom, ol3.Interaction); /** * @inheritDoc */ -ol.interaction.MouseWheelZoom.prototype.handleMapBrowserEvent = +ol3.interaction.MouseWheelZoom.prototype.handleMapBrowserEvent = function(mapBrowserEvent) { if (mapBrowserEvent.type == goog.events.MouseWheelHandler.EventType.MOUSEWHEEL) { diff --git a/src/ol/interaction/resolutionconstraint.js b/src/ol3/interaction/resolutionconstraint.js similarity index 70% rename from src/ol/interaction/resolutionconstraint.js rename to src/ol3/interaction/resolutionconstraint.js index 79eb7b800c..35391158b9 100644 --- a/src/ol/interaction/resolutionconstraint.js +++ b/src/ol3/interaction/resolutionconstraint.js @@ -1,23 +1,23 @@ -goog.provide('ol.interaction.ResolutionConstraint'); -goog.provide('ol.interaction.ResolutionConstraintType'); +goog.provide('ol3.interaction.ResolutionConstraint'); +goog.provide('ol3.interaction.ResolutionConstraintType'); goog.require('goog.math'); -goog.require('ol.array'); +goog.require('ol3.array'); /** * @typedef {function((number|undefined), number): (number|undefined)} */ -ol.interaction.ResolutionConstraintType; +ol3.interaction.ResolutionConstraintType; /** * @param {number} power Power. * @param {number} maxResolution Maximum resolution. * @param {number=} opt_minResolution Minimum resolution. - * @return {ol.interaction.ResolutionConstraintType} Zoom function. + * @return {ol3.interaction.ResolutionConstraintType} Zoom function. */ -ol.interaction.ResolutionConstraint.createContinuous = +ol3.interaction.ResolutionConstraint.createContinuous = function(power, maxResolution, opt_minResolution) { var minResolution = opt_minResolution || 0; return function(resolution, delta) { @@ -33,13 +33,13 @@ ol.interaction.ResolutionConstraint.createContinuous = /** * @param {Array.} resolutions Resolutions. - * @return {ol.interaction.ResolutionConstraintType} Zoom function. + * @return {ol3.interaction.ResolutionConstraintType} Zoom function. */ -ol.interaction.ResolutionConstraint.createSnapToResolutions = +ol3.interaction.ResolutionConstraint.createSnapToResolutions = function(resolutions) { return function(resolution, delta) { if (goog.isDef(resolution)) { - var z = ol.array.linearFindNearest(resolutions, resolution); + var z = ol3.array.linearFindNearest(resolutions, resolution); z = goog.math.clamp(z + delta, 0, resolutions.length - 1); return resolutions[z]; } else { @@ -53,9 +53,9 @@ ol.interaction.ResolutionConstraint.createSnapToResolutions = * @param {number} power Power. * @param {number} maxResolution Maximum resolution. * @param {number=} opt_maxLevel Maximum level. - * @return {ol.interaction.ResolutionConstraintType} Zoom function. + * @return {ol3.interaction.ResolutionConstraintType} Zoom function. */ -ol.interaction.ResolutionConstraint.createSnapToPower = +ol3.interaction.ResolutionConstraint.createSnapToPower = function(power, maxResolution, opt_maxLevel) { return function(resolution, delta) { if (goog.isDef(resolution)) { diff --git a/src/ol/interaction/resolutionconstraint_test.js b/src/ol3/interaction/resolutionconstraint_test.js similarity index 87% rename from src/ol/interaction/resolutionconstraint_test.js rename to src/ol3/interaction/resolutionconstraint_test.js index 6d61f256f0..2ce4192a2f 100644 --- a/src/ol/interaction/resolutionconstraint_test.js +++ b/src/ol3/interaction/resolutionconstraint_test.js @@ -1,10 +1,10 @@ goog.require('goog.testing.jsunit'); -goog.require('ol.interaction.ResolutionConstraint'); +goog.require('ol3.interaction.ResolutionConstraint'); function testSnapToResolutionsZero() { var resolutionConstraint = - ol.interaction.ResolutionConstraint.createSnapToResolutions( + ol3.interaction.ResolutionConstraint.createSnapToResolutions( [1000, 500, 250, 100]); assertEquals(1000, resolutionConstraint(1000, 0)); assertEquals(500, resolutionConstraint(500, 0)); @@ -15,7 +15,7 @@ function testSnapToResolutionsZero() { function testSnapToResolutionsZoomIn() { var resolutionConstraint = - ol.interaction.ResolutionConstraint.createSnapToResolutions( + ol3.interaction.ResolutionConstraint.createSnapToResolutions( [1000, 500, 250, 100]); assertEquals(500, resolutionConstraint(1000, 1)); assertEquals(250, resolutionConstraint(500, 1)); @@ -26,7 +26,7 @@ function testSnapToResolutionsZoomIn() { function testSnapToResolutionsZoomOut() { var resolutionConstraint = - ol.interaction.ResolutionConstraint.createSnapToResolutions( + ol3.interaction.ResolutionConstraint.createSnapToResolutions( [1000, 500, 250, 100]); assertEquals(1000, resolutionConstraint(1000, -1)); assertEquals(1000, resolutionConstraint(500, -1)); @@ -37,7 +37,7 @@ function testSnapToResolutionsZoomOut() { function testSnapToResolutionsNearestZero() { var resolutionConstraint = - ol.interaction.ResolutionConstraint.createSnapToResolutions( + ol3.interaction.ResolutionConstraint.createSnapToResolutions( [1000, 500, 250, 100]); assertEquals(1000, resolutionConstraint(1050, 0)); assertEquals(1000, resolutionConstraint(950, 0)); @@ -52,7 +52,7 @@ function testSnapToResolutionsNearestZero() { function testSnapToResolutionsNearestZoomIn() { var resolutionConstraint = - ol.interaction.ResolutionConstraint.createSnapToResolutions( + ol3.interaction.ResolutionConstraint.createSnapToResolutions( [1000, 500, 250, 100]); assertEquals(500, resolutionConstraint(1050, 1)); assertEquals(500, resolutionConstraint(950, 1)); @@ -67,7 +67,7 @@ function testSnapToResolutionsNearestZoomIn() { function testSnapToResolutionsNearestZoomOut() { var resolutionConstraint = - ol.interaction.ResolutionConstraint.createSnapToResolutions( + ol3.interaction.ResolutionConstraint.createSnapToResolutions( [1000, 500, 250, 100]); assertEquals(1000, resolutionConstraint(1050, -1)); assertEquals(1000, resolutionConstraint(950, -1)); @@ -82,7 +82,7 @@ function testSnapToResolutionsNearestZoomOut() { function testSnapToPowerZero() { var resolutionConstraint = - ol.interaction.ResolutionConstraint.createSnapToPower(2, 1024, 10); + ol3.interaction.ResolutionConstraint.createSnapToPower(2, 1024, 10); assertEquals(1024, resolutionConstraint(1024, 0)); assertEquals(512, resolutionConstraint(512, 0)); assertEquals(256, resolutionConstraint(256, 0)); @@ -99,7 +99,7 @@ function testSnapToPowerZero() { function testSnapToPowerZoomIn() { var resolutionConstraint = - ol.interaction.ResolutionConstraint.createSnapToPower(2, 1024, 10); + ol3.interaction.ResolutionConstraint.createSnapToPower(2, 1024, 10); assertEquals(512, resolutionConstraint(1024, 1)); assertEquals(256, resolutionConstraint(512, 1)); assertEquals(128, resolutionConstraint(256, 1)); @@ -116,7 +116,7 @@ function testSnapToPowerZoomIn() { function testSnapToPowerZoomOut() { var resolutionConstraint = - ol.interaction.ResolutionConstraint.createSnapToPower(2, 1024, 10); + ol3.interaction.ResolutionConstraint.createSnapToPower(2, 1024, 10); assertEquals(1024, resolutionConstraint(1024, -1)); assertEquals(1024, resolutionConstraint(512, -1)); assertEquals(512, resolutionConstraint(256, -1)); @@ -133,7 +133,7 @@ function testSnapToPowerZoomOut() { function testSnapToPowerNearestZero() { var resolutionConstraint = - ol.interaction.ResolutionConstraint.createSnapToPower(2, 1024, 10); + ol3.interaction.ResolutionConstraint.createSnapToPower(2, 1024, 10); assertEquals(1024, resolutionConstraint(1050, 0)); assertEquals(1024, resolutionConstraint(9050, 0)); assertEquals(512, resolutionConstraint(550, 0)); diff --git a/src/ol/interaction/rotationconstraint.js b/src/ol3/interaction/rotationconstraint.js similarity index 62% rename from src/ol/interaction/rotationconstraint.js rename to src/ol3/interaction/rotationconstraint.js index a978999a2d..bd2da44fb8 100644 --- a/src/ol/interaction/rotationconstraint.js +++ b/src/ol3/interaction/rotationconstraint.js @@ -1,11 +1,11 @@ -goog.provide('ol.interaction.RotationConstraint'); -goog.provide('ol.interaction.RotationConstraintType'); +goog.provide('ol3.interaction.RotationConstraint'); +goog.provide('ol3.interaction.RotationConstraintType'); /** * @typedef {function((number|undefined), number): (number|undefined)} */ -ol.interaction.RotationConstraintType; +ol3.interaction.RotationConstraintType; /** @@ -13,7 +13,7 @@ ol.interaction.RotationConstraintType; * @param {number} delta Delta. * @return {number|undefined} Rotation. */ -ol.interaction.RotationConstraint.none = function(rotation, delta) { +ol3.interaction.RotationConstraint.none = function(rotation, delta) { if (goog.isDef(rotation)) { return rotation + delta; } else { @@ -24,9 +24,9 @@ ol.interaction.RotationConstraint.none = function(rotation, delta) { /** * @param {number} n N. - * @return {ol.interaction.RotationConstraintType} Rotation constraint. + * @return {ol3.interaction.RotationConstraintType} Rotation constraint. */ -ol.interaction.RotationConstraint.createSnapToN = function(n) { +ol3.interaction.RotationConstraint.createSnapToN = function(n) { var theta = 2 * Math.PI / n; return function(rotation, delta) { if (goog.isDef(rotation)) { diff --git a/src/ol/interaction/shiftdragrotateandzoom.js b/src/ol3/interaction/shiftdragrotateandzoom.js similarity index 72% rename from src/ol/interaction/shiftdragrotateandzoom.js rename to src/ol3/interaction/shiftdragrotateandzoom.js index ec779a9088..821fc5530e 100644 --- a/src/ol/interaction/shiftdragrotateandzoom.js +++ b/src/ol3/interaction/shiftdragrotateandzoom.js @@ -1,18 +1,18 @@ -goog.provide('ol.interaction.ShiftDragRotateAndZoom'); +goog.provide('ol3.interaction.ShiftDragRotateAndZoom'); goog.require('goog.math.Vec2'); -goog.require('ol.MapBrowserEvent'); -goog.require('ol.interaction.Constraints'); -goog.require('ol.interaction.Drag'); +goog.require('ol3.MapBrowserEvent'); +goog.require('ol3.interaction.Constraints'); +goog.require('ol3.interaction.Drag'); /** * @constructor - * @extends {ol.interaction.Drag} - * @param {ol.interaction.Constraints} constraints Constraints. + * @extends {ol3.interaction.Drag} + * @param {ol3.interaction.Constraints} constraints Constraints. */ -ol.interaction.ShiftDragRotateAndZoom = function(constraints) { +ol3.interaction.ShiftDragRotateAndZoom = function(constraints) { goog.base(this, constraints); @@ -29,13 +29,13 @@ ol.interaction.ShiftDragRotateAndZoom = function(constraints) { this.startRotation_ = 0; }; -goog.inherits(ol.interaction.ShiftDragRotateAndZoom, ol.interaction.Drag); +goog.inherits(ol3.interaction.ShiftDragRotateAndZoom, ol3.interaction.Drag); /** * @inheritDoc */ -ol.interaction.ShiftDragRotateAndZoom.prototype.handleDrag = +ol3.interaction.ShiftDragRotateAndZoom.prototype.handleDrag = function(mapBrowserEvent) { var browserEvent = mapBrowserEvent.browserEvent; var map = mapBrowserEvent.map; @@ -54,7 +54,7 @@ ol.interaction.ShiftDragRotateAndZoom.prototype.handleDrag = /** * @inheritDoc */ -ol.interaction.ShiftDragRotateAndZoom.prototype.handleDragStart = +ol3.interaction.ShiftDragRotateAndZoom.prototype.handleDragStart = function(mapBrowserEvent) { var browserEvent = mapBrowserEvent.browserEvent; var map = mapBrowserEvent.map; diff --git a/src/ol3/interaction/shiftdragzoom.js b/src/ol3/interaction/shiftdragzoom.js new file mode 100644 index 0000000000..2f1ffa0d9a --- /dev/null +++ b/src/ol3/interaction/shiftdragzoom.js @@ -0,0 +1,65 @@ +// FIXME draw drag box + +goog.provide('ol3.interaction.ShiftDragZoom'); + +goog.require('ol3.Extent'); +goog.require('ol3.MapBrowserEvent'); +goog.require('ol3.interaction.Constraints'); +goog.require('ol3.interaction.Drag'); + + +/** + * @define {number} Hysterisis pixels. + */ +ol3.SHIFT_DRAG_ZOOM_HYSTERESIS_PIXELS = 8; + + +/** + * @const {number} + */ +ol3.SHIFT_DRAG_ZOOM_HYSTERESIS_PIXELS_SQUARED = + ol3.SHIFT_DRAG_ZOOM_HYSTERESIS_PIXELS * + ol3.SHIFT_DRAG_ZOOM_HYSTERESIS_PIXELS; + + + +/** + * @constructor + * @extends {ol3.interaction.Drag} + * @param {ol3.interaction.Constraints} constraints Constraints. + */ +ol3.interaction.ShiftDragZoom = function(constraints) { + goog.base(this, constraints); +}; +goog.inherits(ol3.interaction.ShiftDragZoom, ol3.interaction.Drag); + + +/** + * @inheritDoc + */ +ol3.interaction.ShiftDragZoom.prototype.handleDragEnd = + function(mapBrowserEvent) { + if (this.deltaX * this.deltaX + this.deltaY * this.deltaY >= + ol3.SHIFT_DRAG_ZOOM_HYSTERESIS_PIXELS_SQUARED) { + var map = mapBrowserEvent.map; + var extent = ol3.Extent.boundingExtent( + this.startCoordinate, + mapBrowserEvent.getCoordinate()); + this.fitExtent(map, extent); + } +}; + + +/** + * @inheritDoc + */ +ol3.interaction.ShiftDragZoom.prototype.handleDragStart = + function(mapBrowserEvent) { + var browserEvent = mapBrowserEvent.browserEvent; + if (browserEvent.isMouseActionButton() && browserEvent.shiftKey) { + browserEvent.preventDefault(); + return true; + } else { + return false; + } +}; diff --git a/src/ol/tile/bingmaps.js b/src/ol3/tile/bingmaps.js similarity index 69% rename from src/ol/tile/bingmaps.js rename to src/ol3/tile/bingmaps.js index 0d282f2065..22bd612cfb 100644 --- a/src/ol/tile/bingmaps.js +++ b/src/ol3/tile/bingmaps.js @@ -1,20 +1,20 @@ -goog.provide('ol.layer.BingMaps'); -goog.provide('ol.tilestore.BingMaps'); +goog.provide('ol3.layer.BingMaps'); +goog.provide('ol3.tilestore.BingMaps'); goog.require('goog.Uri'); goog.require('goog.events'); goog.require('goog.events.EventType'); goog.require('goog.net.Jsonp'); -goog.require('ol.TileCoverageArea'); -goog.require('ol.TileLayer'); -goog.require('ol.TileStore'); -goog.require('ol.tilegrid.XYZ'); +goog.require('ol3.TileCoverageArea'); +goog.require('ol3.TileLayer'); +goog.require('ol3.TileStore'); +goog.require('ol3.tilegrid.XYZ'); /** * @enum {string} */ -ol.BingMapsStyle = { +ol3.BingMapsStyle = { AERIAL: 'Aerial', AERIAL_WITH_LABELS: 'AerialWithLabels', ROAD: 'Road', @@ -26,33 +26,33 @@ ol.BingMapsStyle = { /** * @constructor - * @extends {ol.TileLayer} - * @param {ol.BingMapsStyle} style Bing Maps style. + * @extends {ol3.TileLayer} + * @param {ol3.BingMapsStyle} style Bing Maps style. * @param {string} key Key. * @param {string=} opt_culture Culture. * @param {Object.=} opt_values Values. */ -ol.layer.BingMaps = function(style, key, opt_culture, opt_values) { - var tileStore = new ol.tilestore.BingMaps(style, key, opt_culture, +ol3.layer.BingMaps = function(style, key, opt_culture, opt_values) { + var tileStore = new ol3.tilestore.BingMaps(style, key, opt_culture, function(tileStore) { this.dispatchEvent(goog.events.EventType.LOAD); }, this); goog.base(this, tileStore, opt_values); }; -goog.inherits(ol.layer.BingMaps, ol.TileLayer); +goog.inherits(ol3.layer.BingMaps, ol3.TileLayer); /** * @constructor - * @extends {ol.TileStore} - * @param {ol.BingMapsStyle} style Bing Maps style. + * @extends {ol3.TileStore} + * @param {ol3.BingMapsStyle} style Bing Maps style. * @param {string} key Key. * @param {string=} opt_culture Culture. - * @param {?function(ol.tilestore.BingMaps)=} opt_callback Callback. + * @param {?function(ol3.tilestore.BingMaps)=} opt_callback Callback. * @param {*=} opt_obj Object. */ -ol.tilestore.BingMaps = +ol3.tilestore.BingMaps = function(style, key, opt_culture, opt_callback, opt_obj) { /** @@ -69,7 +69,7 @@ ol.tilestore.BingMaps = /** * @private - * @type {?function(ol.tilestore.BingMaps)} + * @type {?function(ol3.tilestore.BingMaps)} */ this.callback_ = opt_callback || null; @@ -87,20 +87,20 @@ ol.tilestore.BingMaps = 'key': key }, goog.bind(this.handleImageryMetadataResponse, this)); - var projection = ol.Projection.getFromCode('EPSG:3857'); + var projection = ol3.Projection.getFromCode('EPSG:3857'); var extent = projection.getExtent(); goog.base( - this, projection, null, ol.TileUrlFunction.nullTileUrlFunction, extent); + this, projection, null, ol3.TileUrlFunction.nullTileUrlFunction, extent); }; -goog.inherits(ol.tilestore.BingMaps, ol.TileStore); +goog.inherits(ol3.tilestore.BingMaps, ol3.TileStore); /** * @param {BingMapsImageryMetadataResponse} response Response. */ -ol.tilestore.BingMaps.prototype.handleImageryMetadataResponse = +ol3.tilestore.BingMaps.prototype.handleImageryMetadataResponse = function(response) { goog.asserts.assert( @@ -117,11 +117,11 @@ ol.tilestore.BingMaps.prototype.handleImageryMetadataResponse = var zoomMin = resource.zoomMin; var zoomMax = resource.zoomMax; - var tileSize = new ol.Size(resource.imageWidth, resource.imageHeight); - var tileGrid = new ol.tilegrid.XYZ(zoomMax, tileSize); + var tileSize = new ol3.Size(resource.imageWidth, resource.imageHeight); + var tileGrid = new ol3.tilegrid.XYZ(zoomMax, tileSize); this.tileGrid = tileGrid; - this.tileUrlFunction = ol.TileUrlFunction.withTileCoordTransform( + this.tileUrlFunction = ol3.TileUrlFunction.withTileCoordTransform( function(tileCoord) { if (tileCoord.z < zoomMin || zoomMax < tileCoord.z) { return null; @@ -132,10 +132,10 @@ ol.tilestore.BingMaps.prototype.handleImageryMetadataResponse = return null; } else { var x = goog.math.modulo(tileCoord.x, n); - return new ol.TileCoord(tileCoord.z, x, y); + return new ol3.TileCoord(tileCoord.z, x, y); } }, - ol.TileUrlFunction.createFromTileUrlFunctions( + ol3.TileUrlFunction.createFromTileUrlFunctions( goog.array.map( resource.imageUrlSubdomains, function(subdomain) { @@ -152,7 +152,7 @@ ol.tilestore.BingMaps.prototype.handleImageryMetadataResponse = }; }))); - var projection = ol.Projection.getFromCode('EPSG:4326'); + var projection = ol3.Projection.getFromCode('EPSG:4326'); var attributions = goog.array.map( resource.imageryProviders, function(imageryProvider) { @@ -161,12 +161,12 @@ ol.tilestore.BingMaps.prototype.handleImageryMetadataResponse = imageryProvider.coverageAreas, function(coverageArea) { var bbox = coverageArea.bbox; - var extent = new ol.Extent(bbox[1], bbox[0], bbox[3], bbox[2]); + var extent = new ol3.Extent(bbox[1], bbox[0], bbox[3], bbox[2]); var minZ = coverageArea.zoomMin; var maxZ = coverageArea.zoomMax; - return new ol.TileCoverageArea(tileGrid, extent, minZ, maxZ); + return new ol3.TileCoverageArea(tileGrid, extent, minZ, maxZ); }); - return new ol.Attribution(html, coverageAreas, projection); + return new ol3.Attribution(html, coverageAreas, projection); }); this.setAttributions(attributions); @@ -184,6 +184,6 @@ ol.tilestore.BingMaps.prototype.handleImageryMetadataResponse = /** * @inheritDoc */ -ol.tilestore.BingMaps.prototype.isReady = function() { +ol3.tilestore.BingMaps.prototype.isReady = function() { return this.ready_; }; diff --git a/src/ol/tile/mapquest.js b/src/ol3/tile/mapquest.js similarity index 62% rename from src/ol/tile/mapquest.js rename to src/ol3/tile/mapquest.js index cf2e02f50c..324788b175 100644 --- a/src/ol/tile/mapquest.js +++ b/src/ol3/tile/mapquest.js @@ -1,28 +1,28 @@ -goog.provide('ol.layer.MapQuestOSM'); -goog.provide('ol.layer.MapQuestOpenAerial'); +goog.provide('ol3.layer.MapQuestOSM'); +goog.provide('ol3.layer.MapQuestOpenAerial'); -goog.require('ol.Attribution'); -goog.require('ol.TileUrlFunction'); -goog.require('ol.layer.XYZ'); +goog.require('ol3.Attribution'); +goog.require('ol3.TileUrlFunction'); +goog.require('ol3.layer.XYZ'); /** * @constructor - * @extends {ol.layer.XYZ} + * @extends {ol3.layer.XYZ} * @param {Object.=} opt_values Values. */ -ol.layer.MapQuestOSM = function(opt_values) { +ol3.layer.MapQuestOSM = function(opt_values) { - var tileUrlFunction = ol.TileUrlFunction.createFromTemplate( + var tileUrlFunction = ol3.TileUrlFunction.createFromTemplate( 'http://otile{1-4}.mqcdn.com/tiles/1.0.0/osm/{z}/{x}/{y}.jpg'); var attributions = [ - new ol.Attribution( + new ol3.Attribution( 'Tiles Courtesy of ' + 'MapQuest ' + ''), - new ol.Attribution( + new ol3.Attribution( 'Data © ' + 'OpenStreetMap ' + 'contributors, ' + @@ -32,26 +32,26 @@ ol.layer.MapQuestOSM = function(opt_values) { goog.base(this, 18, tileUrlFunction, attributions); }; -goog.inherits(ol.layer.MapQuestOSM, ol.layer.XYZ); +goog.inherits(ol3.layer.MapQuestOSM, ol3.layer.XYZ); /** * @constructor - * @extends {ol.layer.XYZ} + * @extends {ol3.layer.XYZ} * @param {Object.=} opt_values Values. */ -ol.layer.MapQuestOpenAerial = function(opt_values) { +ol3.layer.MapQuestOpenAerial = function(opt_values) { - var tileUrlFunction = ol.TileUrlFunction.createFromTemplate( + var tileUrlFunction = ol3.TileUrlFunction.createFromTemplate( 'http://oatile{1-4}.mqcdn.com/tiles/1.0.0/sat/{z}/{x}/{y}.jpg'); var attributions = [ - new ol.Attribution( + new ol3.Attribution( 'Tiles Courtesy of ' + 'MapQuest ' + ''), - new ol.Attribution( + new ol3.Attribution( 'Portions Courtesy NASA/JPL-Caltech and ' + 'U.S. Depart. of Agriculture, Farm Service Agency') ]; @@ -59,4 +59,4 @@ ol.layer.MapQuestOpenAerial = function(opt_values) { goog.base(this, 18, tileUrlFunction, attributions); }; -goog.inherits(ol.layer.MapQuestOpenAerial, ol.layer.XYZ); +goog.inherits(ol3.layer.MapQuestOpenAerial, ol3.layer.XYZ); diff --git a/src/ol3/tile/openstreetmap.js b/src/ol3/tile/openstreetmap.js new file mode 100644 index 0000000000..a619403fc3 --- /dev/null +++ b/src/ol3/tile/openstreetmap.js @@ -0,0 +1,40 @@ +goog.provide('ol3.layer.OpenStreetMap'); +goog.provide('ol3.store.OpenStreetMap'); + +goog.require('ol3.TileLayer'); +goog.require('ol3.TileUrlFunction'); +goog.require('ol3.tilestore.XYZ'); + + + +/** + * @constructor + * @extends {ol3.TileLayer} + * @param {Object.=} opt_values Values. + */ +ol3.layer.OpenStreetMap = function(opt_values) { + var tileStore = new ol3.store.OpenStreetMap(); + goog.base(this, tileStore, opt_values); +}; +goog.inherits(ol3.layer.OpenStreetMap, ol3.TileLayer); + + + +/** + * @constructor + * @extends {ol3.tilestore.XYZ} + */ +ol3.store.OpenStreetMap = function() { + + var tileUrlFunction = ol3.TileUrlFunction.createFromTemplate( + 'http://{a-c}.tile.openstreetmap.org/{z}/{x}/{y}.png'); + + var attribution = new ol3.Attribution( + '© OpenStreetMap ' + + 'contributors, ' + + 'CC BY-SA'); + + goog.base(this, 18, tileUrlFunction, [attribution]); + +}; +goog.inherits(ol3.store.OpenStreetMap, ol3.tilestore.XYZ); diff --git a/src/ol/tile/stamen.js b/src/ol3/tile/stamen.js similarity index 63% rename from src/ol/tile/stamen.js rename to src/ol3/tile/stamen.js index 69d0985571..178e64571b 100644 --- a/src/ol/tile/stamen.js +++ b/src/ol3/tile/stamen.js @@ -1,16 +1,16 @@ // FIXME Configure minZoom when supported by TileGrid -goog.provide('ol.layer.Stamen'); -goog.provide('ol.store.Stamen'); +goog.provide('ol3.layer.Stamen'); +goog.provide('ol3.store.Stamen'); -goog.require('ol.TileUrlFunction'); -goog.require('ol.layer.XYZ'); +goog.require('ol3.TileUrlFunction'); +goog.require('ol3.layer.XYZ'); /** * @enum {string} */ -ol.StamenProvider = { +ol3.StamenProvider = { TERRAIN: 'terrain', TONER: 'toner', WATERCOLOR: 'watercolor' @@ -20,7 +20,7 @@ ol.StamenProvider = { /** * @enum {string} */ -ol.StamenFlavor = { +ol3.StamenFlavor = { TERRAIN_BACKGROUND: 'background', TERRAIN_LABELS: 'labels', TERRAIN_LINES: 'lines', @@ -38,21 +38,21 @@ ol.StamenFlavor = { /** - * @type {Object.} */ -ol.StamenProviderConfig = {}; -ol.StamenProviderConfig[ol.StamenProvider.TERRAIN] = { +ol3.StamenProviderConfig = {}; +ol3.StamenProviderConfig[ol3.StamenProvider.TERRAIN] = { type: 'jpg', minZoom: 4, maxZoom: 18 }; -ol.StamenProviderConfig[ol.StamenProvider.TONER] = { +ol3.StamenProviderConfig[ol3.StamenProvider.TONER] = { type: 'png', minZoom: 0, maxZoom: 20 }; -ol.StamenProviderConfig[ol.StamenProvider.WATERCOLOR] = { +ol3.StamenProviderConfig[ol3.StamenProvider.WATERCOLOR] = { type: 'jpg', minZoom: 3, maxZoom: 16 @@ -62,23 +62,23 @@ ol.StamenProviderConfig[ol.StamenProvider.WATERCOLOR] = { /** * @constructor - * @extends {ol.layer.XYZ} - * @param {ol.StamenProvider} provider Provider. - * @param {ol.StamenFlavor=} opt_flavor Flavor. + * @extends {ol3.layer.XYZ} + * @param {ol3.StamenProvider} provider Provider. + * @param {ol3.StamenFlavor=} opt_flavor Flavor. * @param {Object.=} opt_values Values. */ -ol.layer.Stamen = function(provider, opt_flavor, opt_values) { +ol3.layer.Stamen = function(provider, opt_flavor, opt_values) { - var config = ol.StamenProviderConfig[provider]; + var config = ol3.StamenProviderConfig[provider]; var layer = provider; if (goog.isDef(opt_flavor)) { layer += '-' + opt_flavor; } - var tileUrlFunction = ol.TileUrlFunction.createFromTemplate( + var tileUrlFunction = ol3.TileUrlFunction.createFromTemplate( 'http://{a-d}.tile.stamen.com/' + layer + '/{z}/{x}/{y}.' + config.type); - var attribution = new ol.Attribution( + var attribution = new ol3.Attribution( 'Map tiles by Stamen Design, ' + 'under ' + 'CC BY 3.0. ' + @@ -89,4 +89,4 @@ ol.layer.Stamen = function(provider, opt_flavor, opt_values) { goog.base(this, config.maxZoom, tileUrlFunction, [attribution]); }; -goog.inherits(ol.layer.Stamen, ol.layer.XYZ); +goog.inherits(ol3.layer.Stamen, ol3.layer.XYZ); diff --git a/src/ol/tile/tile.js b/src/ol3/tile/tile.js similarity index 71% rename from src/ol/tile/tile.js rename to src/ol3/tile/tile.js index 216449b6c3..d4b372d4ac 100644 --- a/src/ol/tile/tile.js +++ b/src/ol3/tile/tile.js @@ -1,17 +1,17 @@ -goog.provide('ol.Tile'); -goog.provide('ol.TileState'); +goog.provide('ol3.Tile'); +goog.provide('ol3.TileState'); goog.require('goog.array'); goog.require('goog.events'); goog.require('goog.events.EventTarget'); goog.require('goog.events.EventType'); -goog.require('ol.TileCoord'); +goog.require('ol3.TileCoord'); /** * @enum {number} */ -ol.TileState = { +ol3.TileState = { IDLE: 0, LOADING: 1, LOADED: 2, @@ -23,16 +23,16 @@ ol.TileState = { /** * @constructor * @extends {goog.events.EventTarget} - * @param {ol.TileCoord} tileCoord Tile coordinate. + * @param {ol3.TileCoord} tileCoord Tile coordinate. * @param {string} src Source. * @param {?string} crossOrigin Cross origin. */ -ol.Tile = function(tileCoord, src, crossOrigin) { +ol3.Tile = function(tileCoord, src, crossOrigin) { goog.base(this); /** - * @type {ol.TileCoord} + * @type {ol3.TileCoord} */ this.tileCoord = tileCoord; @@ -44,9 +44,9 @@ ol.Tile = function(tileCoord, src, crossOrigin) { /** * @private - * @type {ol.TileState} + * @type {ol3.TileState} */ - this.state_ = ol.TileState.IDLE; + this.state_ = ol3.TileState.IDLE; /** * @private @@ -70,13 +70,13 @@ ol.Tile = function(tileCoord, src, crossOrigin) { this.imageListenerKeys_ = null; }; -goog.inherits(ol.Tile, goog.events.EventTarget); +goog.inherits(ol3.Tile, goog.events.EventTarget); /** * @protected */ -ol.Tile.prototype.dispatchChangeEvent = function() { +ol3.Tile.prototype.dispatchChangeEvent = function() { this.dispatchEvent(goog.events.EventType.CHANGE); }; @@ -85,7 +85,7 @@ ol.Tile.prototype.dispatchChangeEvent = function() { * @param {Object=} opt_context Object. * @return {Image} Image. */ -ol.Tile.prototype.getImage = function(opt_context) { +ol3.Tile.prototype.getImage = function(opt_context) { if (goog.isDef(opt_context)) { var image; var key = goog.getUid(opt_context); @@ -105,9 +105,9 @@ ol.Tile.prototype.getImage = function(opt_context) { /** - * @return {ol.TileState} State. + * @return {ol3.TileState} State. */ -ol.Tile.prototype.getState = function() { +ol3.Tile.prototype.getState = function() { return this.state_; }; @@ -115,8 +115,8 @@ ol.Tile.prototype.getState = function() { /** * @private */ -ol.Tile.prototype.handleImageError_ = function() { - this.state_ = ol.TileState.ERROR; +ol3.Tile.prototype.handleImageError_ = function() { + this.state_ = ol3.TileState.ERROR; this.unlistenImage_(); }; @@ -124,8 +124,8 @@ ol.Tile.prototype.handleImageError_ = function() { /** * @private */ -ol.Tile.prototype.handleImageLoad_ = function() { - this.state_ = ol.TileState.LOADED; +ol3.Tile.prototype.handleImageLoad_ = function() { + this.state_ = ol3.TileState.LOADED; this.unlistenImage_(); this.dispatchChangeEvent(); }; @@ -133,9 +133,9 @@ ol.Tile.prototype.handleImageLoad_ = function() { /** */ -ol.Tile.prototype.load = function() { - if (this.state_ == ol.TileState.IDLE) { - this.state_ = ol.TileState.LOADING; +ol3.Tile.prototype.load = function() { + if (this.state_ == ol3.TileState.IDLE) { + this.state_ = ol3.TileState.LOADING; goog.asserts.assert(goog.isNull(this.imageListenerKeys_)); this.imageListenerKeys_ = [ goog.events.listenOnce(this.image_, goog.events.EventType.ERROR, @@ -151,7 +151,7 @@ ol.Tile.prototype.load = function() { /** * @private */ -ol.Tile.prototype.unlistenImage_ = function() { +ol3.Tile.prototype.unlistenImage_ = function() { goog.asserts.assert(!goog.isNull(this.imageListenerKeys_)); goog.array.forEach(this.imageListenerKeys_, goog.events.unlistenByKey); this.imageListenerKeys_ = null; diff --git a/src/ol/tile/tilebounds.js b/src/ol3/tile/tilebounds.js similarity index 56% rename from src/ol/tile/tilebounds.js rename to src/ol3/tile/tilebounds.js index 7a637a7d62..59e9eb8097 100644 --- a/src/ol/tile/tilebounds.js +++ b/src/ol3/tile/tilebounds.js @@ -1,33 +1,33 @@ -goog.provide('ol.TileBounds'); +goog.provide('ol3.TileBounds'); goog.require('goog.asserts'); -goog.require('ol.Rectangle'); -goog.require('ol.TileCoord'); +goog.require('ol3.Rectangle'); +goog.require('ol3.TileCoord'); /** * @constructor - * @extends {ol.Rectangle} + * @extends {ol3.Rectangle} * @param {number} minX Minimum X. * @param {number} minY Minimum Y. * @param {number} maxX Maximum X. * @param {number} maxY Maximum Y. */ -ol.TileBounds = function(minX, minY, maxX, maxY) { +ol3.TileBounds = function(minX, minY, maxX, maxY) { goog.base(this, minX, minY, maxX, maxY); }; -goog.inherits(ol.TileBounds, ol.Rectangle); +goog.inherits(ol3.TileBounds, ol3.Rectangle); /** - * @param {...ol.TileCoord} var_args Tile coordinates. - * @return {!ol.TileBounds} Bounding tile box. + * @param {...ol3.TileCoord} var_args Tile coordinates. + * @return {!ol3.TileBounds} Bounding tile box. */ -ol.TileBounds.boundingTileBounds = function(var_args) { +ol3.TileBounds.boundingTileBounds = function(var_args) { var tileCoord0 = arguments[0]; - var tileBounds = new ol.TileBounds(tileCoord0.x, tileCoord0.y, - tileCoord0.x, tileCoord0.y); + var tileBounds = new ol3.TileBounds(tileCoord0.x, tileCoord0.y, + tileCoord0.x, tileCoord0.y); var i; for (i = 1; i < arguments.length; ++i) { var tileCoord = arguments[i]; @@ -42,38 +42,38 @@ ol.TileBounds.boundingTileBounds = function(var_args) { /** - * @return {ol.TileBounds} Clone. + * @return {ol3.TileBounds} Clone. */ -ol.TileBounds.prototype.clone = function() { - return new ol.TileBounds(this.minX, this.minY, this.maxX, this.maxY); +ol3.TileBounds.prototype.clone = function() { + return new ol3.TileBounds(this.minX, this.minY, this.maxX, this.maxY); }; /** - * @param {ol.TileCoord} tileCoord Tile coordinate. + * @param {ol3.TileCoord} tileCoord Tile coordinate. * @return {boolean} Contains tile coordinate. */ -ol.TileBounds.prototype.contains = function(tileCoord) { +ol3.TileBounds.prototype.contains = function(tileCoord) { return this.minX <= tileCoord.x && tileCoord.x <= this.maxX && this.minY <= tileCoord.y && tileCoord.y <= this.maxY; }; /** - * @param {ol.TileBounds} tileBounds Tile bounds. + * @param {ol3.TileBounds} tileBounds Tile bounds. * @return {boolean} Contains. */ -ol.TileBounds.prototype.containsTileBounds = function(tileBounds) { +ol3.TileBounds.prototype.containsTileBounds = function(tileBounds) { return this.minX <= tileBounds.minX && tileBounds.maxX <= this.maxX && this.minY <= tileBounds.minY && tileBounds.minY <= this.maxY; }; /** - * @param {ol.TileBounds} tileBounds Tile bounds. + * @param {ol3.TileBounds} tileBounds Tile bounds. * @return {boolean} Equals. */ -ol.TileBounds.prototype.equals = function(tileBounds) { +ol3.TileBounds.prototype.equals = function(tileBounds) { return this.minX == tileBounds.minX && tileBounds.maxX == this.maxX && this.minY == tileBounds.minY && tileBounds.minY == this.minY; }; @@ -81,15 +81,15 @@ ol.TileBounds.prototype.equals = function(tileBounds) { /** * @param {number} z Z. - * @param {function(this: T, ol.TileCoord)} f Callback. + * @param {function(this: T, ol3.TileCoord)} f Callback. * @param {T=} opt_obj The object to be used for the value of 'this' within f. * @template T */ -ol.TileBounds.prototype.forEachTileCoord = function(z, f, opt_obj) { +ol3.TileBounds.prototype.forEachTileCoord = function(z, f, opt_obj) { var x, y; for (x = this.minX; x <= this.maxX; ++x) { for (y = this.minY; y <= this.maxY; ++y) { - f.call(opt_obj, new ol.TileCoord(z, x, y)); + f.call(opt_obj, new ol3.TileCoord(z, x, y)); } } }; @@ -99,7 +99,7 @@ ol.TileBounds.prototype.forEachTileCoord = function(z, f, opt_obj) { * @override * @return {number} Height. */ -ol.TileBounds.prototype.getHeight = function() { +ol3.TileBounds.prototype.getHeight = function() { return this.maxY - this.minY + 1; }; @@ -108,6 +108,6 @@ ol.TileBounds.prototype.getHeight = function() { * @override * @return {number} Width. */ -ol.TileBounds.prototype.getWidth = function() { +ol3.TileBounds.prototype.getWidth = function() { return this.maxX - this.minX + 1; }; diff --git a/src/ol3/tile/tilebounds_test.js b/src/ol3/tile/tilebounds_test.js new file mode 100644 index 0000000000..07bd9b4241 --- /dev/null +++ b/src/ol3/tile/tilebounds_test.js @@ -0,0 +1,102 @@ +goog.require('goog.testing.jsunit'); +goog.require('ol3.TileBounds'); + + +function testClone() { + var tileBounds = new ol3.TileBounds(1, 2, 3, 4); + var clonedTileBounds = tileBounds.clone(); + assertTrue(clonedTileBounds instanceof ol3.TileBounds); + assertFalse(clonedTileBounds === tileBounds); + assertEquals(tileBounds.minX, clonedTileBounds.minX); + assertEquals(tileBounds.minY, clonedTileBounds.minY); + assertEquals(tileBounds.maxX, clonedTileBounds.maxX); + assertEquals(tileBounds.maxY, clonedTileBounds.maxY); +} + + +function testContains() { + var tileBounds = new ol3.TileBounds(1, 1, 3, 3); + assertFalse(tileBounds.contains(new ol3.TileCoord(0, 0, 0))); + assertFalse(tileBounds.contains(new ol3.TileCoord(0, 0, 1))); + assertFalse(tileBounds.contains(new ol3.TileCoord(0, 0, 2))); + assertFalse(tileBounds.contains(new ol3.TileCoord(0, 0, 3))); + assertFalse(tileBounds.contains(new ol3.TileCoord(0, 0, 4))); + assertFalse(tileBounds.contains(new ol3.TileCoord(0, 1, 0))); + assertTrue(tileBounds.contains(new ol3.TileCoord(0, 1, 1))); + assertTrue(tileBounds.contains(new ol3.TileCoord(0, 1, 2))); + assertTrue(tileBounds.contains(new ol3.TileCoord(0, 1, 3))); + assertFalse(tileBounds.contains(new ol3.TileCoord(0, 1, 4))); + assertFalse(tileBounds.contains(new ol3.TileCoord(0, 2, 0))); + assertTrue(tileBounds.contains(new ol3.TileCoord(0, 2, 1))); + assertTrue(tileBounds.contains(new ol3.TileCoord(0, 2, 2))); + assertTrue(tileBounds.contains(new ol3.TileCoord(0, 2, 3))); + assertFalse(tileBounds.contains(new ol3.TileCoord(0, 2, 4))); + assertFalse(tileBounds.contains(new ol3.TileCoord(0, 3, 0))); + assertTrue(tileBounds.contains(new ol3.TileCoord(0, 3, 1))); + assertTrue(tileBounds.contains(new ol3.TileCoord(0, 3, 2))); + assertTrue(tileBounds.contains(new ol3.TileCoord(0, 3, 3))); + assertFalse(tileBounds.contains(new ol3.TileCoord(0, 3, 4))); + assertFalse(tileBounds.contains(new ol3.TileCoord(0, 4, 0))); + assertFalse(tileBounds.contains(new ol3.TileCoord(0, 4, 1))); + assertFalse(tileBounds.contains(new ol3.TileCoord(0, 4, 2))); + assertFalse(tileBounds.contains(new ol3.TileCoord(0, 4, 3))); + assertFalse(tileBounds.contains(new ol3.TileCoord(0, 4, 4))); +} + + +function testBoundingTileBounds() { + var tileBounds = new ol3.TileBounds.boundingTileBounds( + new ol3.TileCoord(3, 1, 3), + new ol3.TileCoord(3, 2, 0)); + assertEquals(1, tileBounds.minX); + assertEquals(0, tileBounds.minY); + assertEquals(2, tileBounds.maxX); + assertEquals(3, tileBounds.maxY); +} + + +function testBoundingTileBoundsMixedZ() { + assertThrows(function() { + var tileBounds = new ol3.TileBounds.boundingTileBounds( + new ol3.TileCoord(3, 1, 3), + new ol3.TileCoord(4, 2, 0)); + }); +} + + +function testForEachTileCoord() { + + var tileBounds = new ol3.TileBounds(0, 2, 1, 3); + + var tileCoords = []; + tileBounds.forEachTileCoord(5, function(tileCoord) { + tileCoords.push(tileCoord.clone()); + }); + + assertEquals(4, tileCoords.length); + + assertEquals(5, tileCoords[0].z); + assertEquals(0, tileCoords[0].x); + assertEquals(2, tileCoords[0].y); + + assertEquals(5, tileCoords[1].z); + assertEquals(0, tileCoords[1].x); + assertEquals(3, tileCoords[1].y); + + assertEquals(5, tileCoords[2].z); + assertEquals(1, tileCoords[2].x); + assertEquals(2, tileCoords[2].y); + + assertEquals(5, tileCoords[3].z); + assertEquals(1, tileCoords[3].x); + assertEquals(3, tileCoords[3].y); + +} + + +function testSize() { + var tileBounds = new ol3.TileBounds(0, 1, 2, 4); + var size = tileBounds.getSize(); + assertEquals(3, size.width); + assertEquals(4, size.height); +} diff --git a/src/ol/tile/tilecoord.js b/src/ol3/tile/tilecoord.js similarity index 60% rename from src/ol/tile/tilecoord.js rename to src/ol3/tile/tilecoord.js index e466013ad6..25d4993371 100644 --- a/src/ol/tile/tilecoord.js +++ b/src/ol3/tile/tilecoord.js @@ -1,13 +1,13 @@ -goog.provide('ol.TileCoord'); +goog.provide('ol3.TileCoord'); goog.require('goog.array'); -goog.require('ol.Coordinate'); +goog.require('ol3.Coordinate'); /** * @enum {number} */ -ol.QuadKeyCharCode = { +ol3.QuadKeyCharCode = { ZERO: '0'.charCodeAt(0), ONE: '1'.charCodeAt(0), TWO: '2'.charCodeAt(0), @@ -18,12 +18,12 @@ ol.QuadKeyCharCode = { /** * @constructor - * @extends {ol.Coordinate} + * @extends {ol3.Coordinate} * @param {number} z Z. * @param {number} x X. * @param {number} y Y. */ -ol.TileCoord = function(z, x, y) { +ol3.TileCoord = function(z, x, y) { goog.base(this, x, y); @@ -33,61 +33,61 @@ ol.TileCoord = function(z, x, y) { this.z = z; }; -goog.inherits(ol.TileCoord, ol.Coordinate); +goog.inherits(ol3.TileCoord, ol3.Coordinate); /** * @param {string} quadKey Quad key. - * @return {ol.TileCoord} Tile coordinate. + * @return {ol3.TileCoord} Tile coordinate. */ -ol.TileCoord.createFromQuadKey = function(quadKey) { +ol3.TileCoord.createFromQuadKey = function(quadKey) { var z = quadKey.length, x = 0, y = 0; var mask = 1 << (z - 1); var i; for (i = 0; i < z; ++i) { switch (quadKey.charCodeAt(i)) { - case ol.QuadKeyCharCode.ONE: + case ol3.QuadKeyCharCode.ONE: x += mask; break; - case ol.QuadKeyCharCode.TWO: + case ol3.QuadKeyCharCode.TWO: y += mask; break; - case ol.QuadKeyCharCode.THREE: + case ol3.QuadKeyCharCode.THREE: x += mask; y += mask; break; } mask >>= 1; } - return new ol.TileCoord(z, x, y); + return new ol3.TileCoord(z, x, y); }; /** * @param {string} str String. - * @return {ol.TileCoord} Tile coord. + * @return {ol3.TileCoord} Tile coord. */ -ol.TileCoord.createFromString = function(str) { +ol3.TileCoord.createFromString = function(str) { var v = str.split('/'); v = goog.array.map(v, function(e, i, a) { return parseInt(e, 10); }); - return new ol.TileCoord(v[0], v[1], v[2]); + return new ol3.TileCoord(v[0], v[1], v[2]); }; /** - * @return {ol.TileCoord} Clone. + * @return {ol3.TileCoord} Clone. */ -ol.TileCoord.prototype.clone = function() { - return new ol.TileCoord(this.z, this.x, this.y); +ol3.TileCoord.prototype.clone = function() { + return new ol3.TileCoord(this.z, this.x, this.y); }; /** * @return {number} Hash. */ -ol.TileCoord.prototype.hash = function() { +ol3.TileCoord.prototype.hash = function() { return (this.x << this.z) + this.y; }; @@ -95,12 +95,12 @@ ol.TileCoord.prototype.hash = function() { /** * @return {string} Quad key. */ -ol.TileCoord.prototype.quadKey = function() { +ol3.TileCoord.prototype.quadKey = function() { var digits = new Array(this.z); var mask = 1 << (this.z - 1); var i, charCode; for (i = 0; i < this.z; ++i) { - charCode = ol.QuadKeyCharCode.ZERO; + charCode = ol3.QuadKeyCharCode.ZERO; if (this.x & mask) { charCode += 1; } @@ -117,6 +117,6 @@ ol.TileCoord.prototype.quadKey = function() { /** * @return {string} String. */ -ol.TileCoord.prototype.toString = function() { +ol3.TileCoord.prototype.toString = function() { return [this.z, this.x, this.y].join('/'); }; diff --git a/src/ol/tile/tilecoord_test.js b/src/ol3/tile/tilecoord_test.js similarity index 61% rename from src/ol/tile/tilecoord_test.js rename to src/ol3/tile/tilecoord_test.js index cbc5a6d561..82580dcb5c 100644 --- a/src/ol/tile/tilecoord_test.js +++ b/src/ol3/tile/tilecoord_test.js @@ -1,9 +1,9 @@ goog.require('goog.testing.jsunit'); -goog.require('ol.TileCoord'); +goog.require('ol3.TileCoord'); function testConstructorOrderZXY() { - var tc1 = new ol.TileCoord(1, 2, 3); + var tc1 = new ol3.TileCoord(1, 2, 3); assertEquals(1, tc1.z); assertEquals(2, tc1.x); assertEquals(3, tc1.y); @@ -11,7 +11,7 @@ function testConstructorOrderZXY() { function testCreateFromQuadKey() { - var tileCoord = ol.TileCoord.createFromQuadKey('213'); + var tileCoord = ol3.TileCoord.createFromQuadKey('213'); assertEquals(3, tileCoord.z); assertEquals(3, tileCoord.x); assertEquals(5, tileCoord.y); @@ -20,7 +20,7 @@ function testCreateFromQuadKey() { function testCreateFromString() { var str = '1/2/3'; - var tc = ol.TileCoord.createFromString(str); + var tc = ol3.TileCoord.createFromString(str); assertEquals(1, tc.z); assertEquals(2, tc.x); assertEquals(3, tc.y); @@ -28,12 +28,12 @@ function testCreateFromString() { function testQuadKey() { - assertEquals('213', (new ol.TileCoord(3, 3, 5)).quadKey()); + assertEquals('213', (new ol3.TileCoord(3, 3, 5)).quadKey()); } function testHash() { - var tc1 = new ol.TileCoord(3, 2, 1); - var tc2 = new ol.TileCoord(3, 1, 1); + var tc1 = new ol3.TileCoord(3, 2, 1); + var tc2 = new ol3.TileCoord(3, 1, 1); assertTrue(tc1.hash() != tc2.hash()); } diff --git a/src/ol3/tile/tilecoveragearea.js b/src/ol3/tile/tilecoveragearea.js new file mode 100644 index 0000000000..6fd721b525 --- /dev/null +++ b/src/ol3/tile/tilecoveragearea.js @@ -0,0 +1,71 @@ +goog.provide('ol3.TileCoverageArea'); + +goog.require('ol3.CoverageArea'); +goog.require('ol3.Extent'); +goog.require('ol3.TileGrid'); + + + +/** + * @constructor + * @extends {ol3.CoverageArea} + * @param {ol3.TileGrid} tileGrid Tile grid. + * @param {ol3.Extent} extent Extent. + * @param {number} minZ Minimum Z. + * @param {number} maxZ Maximum Z. + */ +ol3.TileCoverageArea = function(tileGrid, extent, minZ, maxZ) { + + goog.base(this, extent); + + /** + * @private + * @type {ol3.TileGrid} + */ + this.tileGrid_ = tileGrid; + + /** + * @private + * @type {number} + */ + this.minZ_ = minZ; + + /** + * @private + * @type {number} + */ + this.maxZ_ = maxZ; + +}; +goog.inherits(ol3.TileCoverageArea, ol3.CoverageArea); + + +/** + * @inheritDoc + */ +ol3.TileCoverageArea.prototype.intersectsExtentAndResolution = + function(extent, resolution) { + var z = this.tileGrid_.getZForResolution(resolution); + return this.intersectsExtentAndZ(extent, z); +}; + + +/** + * @param {ol3.Extent} extent Extent. + * @param {number} z Z. + * @return {boolean} Intersects. + */ +ol3.TileCoverageArea.prototype.intersectsExtentAndZ = function(extent, z) { + return this.minZ_ <= z && z <= this.maxZ_ && this.intersectsExtent(extent); +}; + + +/** + * @param {ol3.TransformFunction} transformFn Transform. + * @return {ol3.TileCoverageArea} Transformed tile coverage area. + */ +ol3.TileCoverageArea.prototype.transform = function(transformFn) { + var extent = this.extent.transform(transformFn); + return new ol3.TileCoverageArea( + this.tileGrid_, extent, this.minZ_, this.maxZ_); +}; diff --git a/src/ol/tile/tilegrid.js b/src/ol3/tile/tilegrid.js similarity index 60% rename from src/ol/tile/tilegrid.js rename to src/ol3/tile/tilegrid.js index 4fea740353..809b63d0b4 100644 --- a/src/ol/tile/tilegrid.js +++ b/src/ol3/tile/tilegrid.js @@ -1,27 +1,27 @@ // FIXME cope with tile grids whose minium zoom is not zero -goog.provide('ol.TileGrid'); +goog.provide('ol3.TileGrid'); goog.require('goog.array'); goog.require('goog.asserts'); -goog.require('ol.Coordinate'); -goog.require('ol.Extent'); -goog.require('ol.PixelBounds'); -goog.require('ol.Size'); -goog.require('ol.TileBounds'); -goog.require('ol.TileCoord'); -goog.require('ol.array'); +goog.require('ol3.Coordinate'); +goog.require('ol3.Extent'); +goog.require('ol3.PixelBounds'); +goog.require('ol3.Size'); +goog.require('ol3.TileBounds'); +goog.require('ol3.TileCoord'); +goog.require('ol3.array'); /** * @constructor * @param {!Array.} resolutions Resolutions. - * @param {ol.Extent} extent Extent. - * @param {ol.Coordinate|!Array.} origin Origin. - * @param {ol.Size=} opt_tileSize Tile size. + * @param {ol3.Extent} extent Extent. + * @param {ol3.Coordinate|!Array.} origin Origin. + * @param {ol3.Size=} opt_tileSize Tile size. */ -ol.TileGrid = function(resolutions, extent, origin, opt_tileSize) { +ol3.TileGrid = function(resolutions, extent, origin, opt_tileSize) { /** * @private @@ -40,23 +40,23 @@ ol.TileGrid = function(resolutions, extent, origin, opt_tileSize) { /** * @private - * @type {ol.Extent} + * @type {ol3.Extent} */ this.extent_ = extent; /** * @private - * @type {ol.Coordinate} + * @type {ol3.Coordinate} */ this.origin_ = null; /** * @private - * @type {Array.} + * @type {Array.} */ this.origins_ = null; - if (origin instanceof ol.Coordinate) { + if (origin instanceof ol3.Coordinate) { this.origin_ = origin; } else if (goog.isArray(origin)) { goog.asserts.assert(origin.length == this.numResolutions_); @@ -67,20 +67,21 @@ ol.TileGrid = function(resolutions, extent, origin, opt_tileSize) { /** * @private - * @type {ol.Size} + * @type {ol3.Size} */ - this.tileSize_ = opt_tileSize || new ol.Size(256, 256); + this.tileSize_ = opt_tileSize || new ol3.Size(256, 256); }; /** - * @param {ol.TileCoord} tileCoord Tile coordinate. - * @param {function(this: T, number, ol.TileBounds): boolean} callback Callback. + * @param {ol3.TileCoord} tileCoord Tile coordinate. + * @param {function(this: T, number, ol3.TileBounds): boolean} callback + * Callback. * @param {T=} opt_obj Object. * @template T */ -ol.TileGrid.prototype.forEachTileCoordParentTileBounds = +ol3.TileGrid.prototype.forEachTileCoordParentTileBounds = function(tileCoord, callback, opt_obj) { var tileCoordExtent = this.getTileCoordExtent(tileCoord); var z = tileCoord.z - 1; @@ -95,18 +96,18 @@ ol.TileGrid.prototype.forEachTileCoordParentTileBounds = /** - * @return {ol.Extent} Extent. + * @return {ol3.Extent} Extent. */ -ol.TileGrid.prototype.getExtent = function() { +ol3.TileGrid.prototype.getExtent = function() { return this.extent_; }; /** * @param {number} z Z. - * @return {ol.Coordinate} Origin. + * @return {ol3.Coordinate} Origin. */ -ol.TileGrid.prototype.getOrigin = function(z) { +ol3.TileGrid.prototype.getOrigin = function(z) { if (!goog.isNull(this.origin_)) { return this.origin_; } else { @@ -118,22 +119,22 @@ ol.TileGrid.prototype.getOrigin = function(z) { /** - * @param {ol.TileCoord} tileCoord Tile coordinate. + * @param {ol3.TileCoord} tileCoord Tile coordinate. * @param {number} resolution Resolution. - * @return {ol.PixelBounds} Pixel bounds. + * @return {ol3.PixelBounds} Pixel bounds. */ -ol.TileGrid.prototype.getPixelBoundsForTileCoordAndResolution = function( +ol3.TileGrid.prototype.getPixelBoundsForTileCoordAndResolution = function( tileCoord, resolution) { var scale = resolution / this.getResolution(tileCoord.z); var tileSize = this.getTileSize(); - tileSize = new ol.Size(tileSize.width / scale, - tileSize.height / scale); + tileSize = new ol3.Size(tileSize.width / scale, + tileSize.height / scale); var minX, maxX, minY, maxY; minX = Math.round(tileCoord.x * tileSize.width); maxX = Math.round((tileCoord.x + 1) * tileSize.width); minY = Math.round(tileCoord.y * tileSize.height); maxY = Math.round((tileCoord.y + 1) * tileSize.height); - return new ol.PixelBounds(minX, minY, maxX, maxY); + return new ol3.PixelBounds(minX, minY, maxX, maxY); }; @@ -141,7 +142,7 @@ ol.TileGrid.prototype.getPixelBoundsForTileCoordAndResolution = function( * @param {number} z Z. * @return {number} Resolution. */ -ol.TileGrid.prototype.getResolution = function(z) { +ol3.TileGrid.prototype.getResolution = function(z) { goog.asserts.assert(0 <= z && z < this.numResolutions_); return this.resolutions_[z]; }; @@ -150,17 +151,17 @@ ol.TileGrid.prototype.getResolution = function(z) { /** * @return {Array.} Resolutions. */ -ol.TileGrid.prototype.getResolutions = function() { +ol3.TileGrid.prototype.getResolutions = function() { return this.resolutions_; }; /** * @param {number} z Z. - * @param {ol.TileBounds} tileBounds Tile bounds. - * @return {ol.Extent} Extent. + * @param {ol3.TileBounds} tileBounds Tile bounds. + * @return {ol3.Extent} Extent. */ -ol.TileGrid.prototype.getTileBoundsExtent = function(z, tileBounds) { +ol3.TileGrid.prototype.getTileBoundsExtent = function(z, tileBounds) { var origin = this.getOrigin(z); var resolution = this.getResolution(z); var tileSize = this.tileSize_; @@ -168,55 +169,55 @@ ol.TileGrid.prototype.getTileBoundsExtent = function(z, tileBounds) { var minY = origin.y + tileBounds.minY * tileSize.height * resolution; var maxX = origin.x + (tileBounds.maxX + 1) * tileSize.width * resolution; var maxY = origin.y + (tileBounds.maxY + 1) * tileSize.height * resolution; - return new ol.Extent(minX, minY, maxX, maxY); + return new ol3.Extent(minX, minY, maxX, maxY); }; /** - * @param {ol.Extent} extent Extent. + * @param {ol3.Extent} extent Extent. * @param {number} resolution Resolution. - * @return {ol.TileBounds} Tile bounds. + * @return {ol3.TileBounds} Tile bounds. */ -ol.TileGrid.prototype.getTileBoundsForExtentAndResolution = function( +ol3.TileGrid.prototype.getTileBoundsForExtentAndResolution = function( extent, resolution) { var min = this.getTileCoordForCoordAndResolution( - new ol.Coordinate(extent.minX, extent.minY), resolution); + new ol3.Coordinate(extent.minX, extent.minY), resolution); var max = this.getTileCoordForCoordAndResolution( - new ol.Coordinate(extent.maxX, extent.maxY), resolution); - return new ol.TileBounds(min.x, min.y, max.x, max.y); + new ol3.Coordinate(extent.maxX, extent.maxY), resolution); + return new ol3.TileBounds(min.x, min.y, max.x, max.y); }; /** - * @param {ol.Extent} extent Extent. + * @param {ol3.Extent} extent Extent. * @param {number} z Z. - * @return {ol.TileBounds} Tile bounds. + * @return {ol3.TileBounds} Tile bounds. */ -ol.TileGrid.prototype.getTileBoundsForExtentAndZ = function(extent, z) { +ol3.TileGrid.prototype.getTileBoundsForExtentAndZ = function(extent, z) { var resolution = this.getResolution(z); return this.getTileBoundsForExtentAndResolution(extent, resolution); }; /** - * @param {ol.TileCoord} tileCoord Tile coordinate. - * @return {ol.Coordinate} Tile center. + * @param {ol3.TileCoord} tileCoord Tile coordinate. + * @return {ol3.Coordinate} Tile center. */ -ol.TileGrid.prototype.getTileCoordCenter = function(tileCoord) { +ol3.TileGrid.prototype.getTileCoordCenter = function(tileCoord) { var origin = this.getOrigin(tileCoord.z); var resolution = this.getResolution(tileCoord.z); var tileSize = this.tileSize_; var x = origin.x + (tileCoord.x + 0.5) * tileSize.width * resolution; var y = origin.y + (tileCoord.y + 0.5) * tileSize.height * resolution; - return new ol.Coordinate(x, y); + return new ol3.Coordinate(x, y); }; /** - * @param {ol.TileCoord} tileCoord Tile coordinate. - * @return {ol.Extent} Extent. + * @param {ol3.TileCoord} tileCoord Tile coordinate. + * @return {ol3.Extent} Extent. */ -ol.TileGrid.prototype.getTileCoordExtent = function(tileCoord) { +ol3.TileGrid.prototype.getTileCoordExtent = function(tileCoord) { var origin = this.getOrigin(tileCoord.z); var resolution = this.getResolution(tileCoord.z); var tileSize = this.tileSize_; @@ -224,34 +225,34 @@ ol.TileGrid.prototype.getTileCoordExtent = function(tileCoord) { var minY = origin.y + tileCoord.y * tileSize.height * resolution; var maxX = minX + tileSize.width * resolution; var maxY = minY + tileSize.height * resolution; - return new ol.Extent(minX, minY, maxX, maxY); + return new ol3.Extent(minX, minY, maxX, maxY); }; /** - * @param {ol.Coordinate} coordinate Coordinate. + * @param {ol3.Coordinate} coordinate Coordinate. * @param {number} resolution Resolution. - * @return {ol.TileCoord} Tile coordinate. + * @return {ol3.TileCoord} Tile coordinate. */ -ol.TileGrid.prototype.getTileCoordForCoordAndResolution = function( +ol3.TileGrid.prototype.getTileCoordForCoordAndResolution = function( coordinate, resolution) { var z = this.getZForResolution(resolution); var scale = resolution / this.getResolution(z); var origin = this.getOrigin(z); - var offsetFromOrigin = new ol.Coordinate( + var offsetFromOrigin = new ol3.Coordinate( Math.floor((coordinate.x - origin.x) / resolution), Math.floor((coordinate.y - origin.y) / resolution)); var tileSize = this.getTileSize(); - tileSize = new ol.Size(tileSize.width / scale, - tileSize.height / scale); + tileSize = new ol3.Size(tileSize.width / scale, + tileSize.height / scale); var x, y; x = Math.floor(offsetFromOrigin.x / tileSize.width); y = Math.floor(offsetFromOrigin.y / tileSize.height); - var tileCoord = new ol.TileCoord(z, x, y); + var tileCoord = new ol3.TileCoord(z, x, y); var tileCoordPixelBounds = this.getPixelBoundsForTileCoordAndResolution( tileCoord, resolution); @@ -273,30 +274,30 @@ ol.TileGrid.prototype.getTileCoordForCoordAndResolution = function( /** - * @param {ol.Coordinate} coordinate Coordinate. + * @param {ol3.Coordinate} coordinate Coordinate. * @param {number} z Z. - * @return {ol.TileCoord} Tile coordinate. + * @return {ol3.TileCoord} Tile coordinate. */ -ol.TileGrid.prototype.getTileCoordForCoordAndZ = function(coordinate, z) { +ol3.TileGrid.prototype.getTileCoordForCoordAndZ = function(coordinate, z) { var resolution = this.getResolution(z); return this.getTileCoordForCoordAndResolution(coordinate, resolution); }; /** - * @param {ol.TileCoord} tileCoord Tile coordinate. + * @param {ol3.TileCoord} tileCoord Tile coordinate. * @return {number} Tile resolution. */ -ol.TileGrid.prototype.getTileCoordResolution = function(tileCoord) { +ol3.TileGrid.prototype.getTileCoordResolution = function(tileCoord) { goog.asserts.assert(0 <= tileCoord.z && tileCoord.z < this.numResolutions_); return this.resolutions_[tileCoord.z]; }; /** - * @return {ol.Size} Tile size. + * @return {ol3.Size} Tile size. */ -ol.TileGrid.prototype.getTileSize = function() { +ol3.TileGrid.prototype.getTileSize = function() { return this.tileSize_; }; @@ -305,6 +306,6 @@ ol.TileGrid.prototype.getTileSize = function() { * @param {number} resolution Resolution. * @return {number} Z. */ -ol.TileGrid.prototype.getZForResolution = function(resolution) { - return ol.array.linearFindNearest(this.resolutions_, resolution); +ol3.TileGrid.prototype.getZForResolution = function(resolution) { + return ol3.array.linearFindNearest(this.resolutions_, resolution); }; diff --git a/src/ol/tile/tilegrid_test.js b/src/ol3/tile/tilegrid_test.js similarity index 76% rename from src/ol/tile/tilegrid_test.js rename to src/ol3/tile/tilegrid_test.js index 34bb1451ab..0650885e18 100644 --- a/src/ol/tile/tilegrid_test.js +++ b/src/ol3/tile/tilegrid_test.js @@ -1,9 +1,9 @@ goog.require('goog.testing.jsunit'); -goog.require('ol.Coordinate'); -goog.require('ol.Extent'); -goog.require('ol.Size'); -goog.require('ol.TileCoord'); -goog.require('ol.TileGrid'); +goog.require('ol3.Coordinate'); +goog.require('ol3.Extent'); +goog.require('ol3.Size'); +goog.require('ol3.TileCoord'); +goog.require('ol3.TileGrid'); var extent; @@ -15,16 +15,16 @@ var tileSize; function setUp() { resolutions = [1000, 500, 250, 100]; - extent = new ol.Extent(0, 0, 100000, 100000); - origin = new ol.Coordinate(0, 0); + extent = new ol3.Extent(0, 0, 100000, 100000); + origin = new ol3.Coordinate(0, 0); origins = []; - tileSize = new ol.Size(100, 100); + tileSize = new ol3.Size(100, 100); } function testCreateValid() { assertNotThrows(function() { - return new ol.TileGrid(resolutions, extent, origin, tileSize); + return new ol3.TileGrid(resolutions, extent, origin, tileSize); }); } @@ -32,7 +32,7 @@ function testCreateValid() { function testCreateDuplicateResolutions() { var resolutions = [100, 50, 50, 25, 10]; assertThrows(function() { - return new ol.TileGrid(resolutions, extent, origin, tileSize); + return new ol3.TileGrid(resolutions, extent, origin, tileSize); }); } @@ -40,7 +40,7 @@ function testCreateDuplicateResolutions() { function testCreateOutOfOrderResolutions() { var resolutions = [100, 25, 50, 10]; assertThrows(function() { - return new ol.TileGrid(resolutions, extent, origin, tileSize); + return new ol3.TileGrid(resolutions, extent, origin, tileSize); }); } @@ -49,7 +49,7 @@ function testCreateOrigins() { var resolutions = [100, 50, 25, 10]; var origins = [origin, origin, origin, origin]; assertNotThrows(function() { - return new ol.TileGrid(resolutions, extent, origins, tileSize); + return new ol3.TileGrid(resolutions, extent, origins, tileSize); }); } @@ -58,7 +58,7 @@ function testCreateTooFewOrigins() { var resolutions = [100, 50, 25, 10]; var origins = [origin, origin, origin]; assertThrows(function() { - return new ol.TileGrid(resolutions, extent, origins, tileSize); + return new ol3.TileGrid(resolutions, extent, origins, tileSize); }); } @@ -67,37 +67,37 @@ function testCreateTooManyOrigins() { var resolutions = [100, 50, 25, 10]; var origins = [origin, origin, origin, origin, origin]; assertThrows(function() { - return new ol.TileGrid(resolutions, extent, origins, tileSize); + return new ol3.TileGrid(resolutions, extent, origins, tileSize); }); } function testGetTileCoord() { - origin = new ol.Coordinate(0, 0); - var tileGrid = new ol.TileGrid(resolutions, extent, origin, tileSize); + origin = new ol3.Coordinate(0, 0); + var tileGrid = new ol3.TileGrid(resolutions, extent, origin, tileSize); var tileCoord; tileCoord = tileGrid.getTileCoordForCoordAndZ( - new ol.Coordinate(0, 0), 3); + new ol3.Coordinate(0, 0), 3); assertEquals(3, tileCoord.z); assertEquals(0, tileCoord.x); assertEquals(0, tileCoord.y); tileCoord = tileGrid.getTileCoordForCoordAndZ( - new ol.Coordinate(0, 100000), 3); + new ol3.Coordinate(0, 100000), 3); assertEquals(3, tileCoord.z); assertEquals(0, tileCoord.x); assertEquals(10, tileCoord.y); tileCoord = tileGrid.getTileCoordForCoordAndZ( - new ol.Coordinate(100000, 0), 3); + new ol3.Coordinate(100000, 0), 3); assertEquals(3, tileCoord.z); assertEquals(10, tileCoord.x); assertEquals(0, tileCoord.y); tileCoord = tileGrid.getTileCoordForCoordAndZ( - new ol.Coordinate(100000, 100000), 3); + new ol3.Coordinate(100000, 100000), 3); assertEquals(3, tileCoord.z); assertEquals(10, tileCoord.x); assertEquals(10, tileCoord.y); @@ -107,30 +107,30 @@ function testGetTileCoord() { function testGetTileCoordYSouth() { - origin = new ol.Coordinate(0, 100000); - var tileGrid = new ol.TileGrid(resolutions, extent, origin, tileSize); + origin = new ol3.Coordinate(0, 100000); + var tileGrid = new ol3.TileGrid(resolutions, extent, origin, tileSize); var tileCoord; tileCoord = tileGrid.getTileCoordForCoordAndZ( - new ol.Coordinate(0, 0), 3); + new ol3.Coordinate(0, 0), 3); assertEquals(3, tileCoord.z); assertEquals(0, tileCoord.x); assertEquals(-10, tileCoord.y); tileCoord = tileGrid.getTileCoordForCoordAndZ( - new ol.Coordinate(0, 100000), 3); + new ol3.Coordinate(0, 100000), 3); assertEquals(3, tileCoord.z); assertEquals(0, tileCoord.x); assertEquals(0, tileCoord.y); tileCoord = tileGrid.getTileCoordForCoordAndZ( - new ol.Coordinate(100000, 0), 3); + new ol3.Coordinate(100000, 0), 3); assertEquals(3, tileCoord.z); assertEquals(10, tileCoord.x); assertEquals(-10, tileCoord.y); tileCoord = tileGrid.getTileCoordForCoordAndZ( - new ol.Coordinate(100000, 100000), 3); + new ol3.Coordinate(100000, 100000), 3); assertEquals(3, tileCoord.z); assertEquals(10, tileCoord.x); assertEquals(0, tileCoord.y); @@ -139,14 +139,14 @@ function testGetTileCoordYSouth() { function testGetTileCoordForCoordAndResolution() { - var tileSize = new ol.Size(256, 256); - var tileGrid = new ol.TileGrid([10], extent, origin, tileSize); + var tileSize = new ol3.Size(256, 256); + var tileGrid = new ol3.TileGrid([10], extent, origin, tileSize); var coordinate; var tileCoord; // gets the first tile at the origin - coordinate = new ol.Coordinate(0, 0); + coordinate = new ol3.Coordinate(0, 0); tileCoord = tileGrid.getTileCoordForCoordAndResolution( coordinate, 10); assertEquals(0, tileCoord.z); @@ -154,7 +154,7 @@ function testGetTileCoordForCoordAndResolution() { assertEquals(0, tileCoord.y); // gets one tile northwest of the origin - coordinate = new ol.Coordinate(-1280, 1280); + coordinate = new ol3.Coordinate(-1280, 1280); tileCoord = tileGrid.getTileCoordForCoordAndResolution( coordinate, 10); assertEquals(0, tileCoord.z); @@ -162,7 +162,7 @@ function testGetTileCoordForCoordAndResolution() { assertEquals(0, tileCoord.y); // gets one tile northeast of the origin - coordinate = new ol.Coordinate(1280, 1280); + coordinate = new ol3.Coordinate(1280, 1280); tileCoord = tileGrid.getTileCoordForCoordAndResolution( coordinate, 10); assertEquals(0, tileCoord.z); @@ -170,7 +170,7 @@ function testGetTileCoordForCoordAndResolution() { assertEquals(0, tileCoord.y); // gets one tile southeast of the origin - coordinate = new ol.Coordinate(1280, -1280); + coordinate = new ol3.Coordinate(1280, -1280); tileCoord = tileGrid.getTileCoordForCoordAndResolution( coordinate, 10); assertEquals(0, tileCoord.z); @@ -178,7 +178,7 @@ function testGetTileCoordForCoordAndResolution() { assertEquals(-1, tileCoord.y); // gets one tile southwest of the origin - coordinate = new ol.Coordinate(-1280, -1280); + coordinate = new ol3.Coordinate(-1280, -1280); tileCoord = tileGrid.getTileCoordForCoordAndResolution( coordinate, 10); assertEquals(0, tileCoord.z); @@ -186,7 +186,7 @@ function testGetTileCoordForCoordAndResolution() { assertEquals(-1, tileCoord.y); // gets the tile to the east when on the edge - coordinate = new ol.Coordinate(2560, -1280); + coordinate = new ol3.Coordinate(2560, -1280); tileCoord = tileGrid.getTileCoordForCoordAndResolution( coordinate, 10); assertEquals(0, tileCoord.z); @@ -194,7 +194,7 @@ function testGetTileCoordForCoordAndResolution() { assertEquals(-1, tileCoord.y); // gets the tile to the north when on the edge - coordinate = new ol.Coordinate(1280, -2560); + coordinate = new ol3.Coordinate(1280, -2560); tileCoord = tileGrid.getTileCoordForCoordAndResolution( coordinate, 10); assertEquals(0, tileCoord.z); @@ -202,7 +202,7 @@ function testGetTileCoordForCoordAndResolution() { assertEquals(-1, tileCoord.y); // pixels are top aligned to the origin - coordinate = new ol.Coordinate(1280, -2559.999); + coordinate = new ol3.Coordinate(1280, -2559.999); tileCoord = tileGrid.getTileCoordForCoordAndResolution( coordinate, 10); assertEquals(0, tileCoord.z); @@ -210,7 +210,7 @@ function testGetTileCoordForCoordAndResolution() { assertEquals(-1, tileCoord.y); // pixels are left aligned to the origin - coordinate = new ol.Coordinate(2559.999, -1280); + coordinate = new ol3.Coordinate(2559.999, -1280); tileCoord = tileGrid.getTileCoordForCoordAndResolution( coordinate, 10); assertEquals(0, tileCoord.z); @@ -220,8 +220,8 @@ function testGetTileCoordForCoordAndResolution() { function testGetTileCoordForCoordAndResolutionFractional() { - var tileSize = new ol.Size(256, 256); - var tileGrid = new ol.TileGrid([1 / 3], extent, origin, tileSize); + var tileSize = new ol3.Size(256, 256); + var tileGrid = new ol3.TileGrid([1 / 3], extent, origin, tileSize); var coordinate; var tileCoord; @@ -232,7 +232,7 @@ function testGetTileCoordForCoordAndResolutionFractional() { // rendered (0,0 is normal; 1,0 is wider; 0,1 is taller; etc.) // gets the first tile at the origin - coordinate = new ol.Coordinate(0, 0); + coordinate = new ol3.Coordinate(0, 0); tileCoord = tileGrid.getTileCoordForCoordAndResolution( coordinate, 1); assertEquals(0, tileCoord.z); @@ -240,7 +240,7 @@ function testGetTileCoordForCoordAndResolutionFractional() { assertEquals(0, tileCoord.y); // gets the 1,0 tile at 256/3,0 - coordinate = new ol.Coordinate(256 / 3, 0); + coordinate = new ol3.Coordinate(256 / 3, 0); tileCoord = tileGrid.getTileCoordForCoordAndResolution( coordinate, 1); assertEquals(0, tileCoord.z); @@ -248,7 +248,7 @@ function testGetTileCoordForCoordAndResolutionFractional() { assertEquals(0, tileCoord.y); // still gets the 1,0 tile at 512/3,0 - wider tile - coordinate = new ol.Coordinate(512 / 3, 0); + coordinate = new ol3.Coordinate(512 / 3, 0); tileCoord = tileGrid.getTileCoordForCoordAndResolution( coordinate, 1); assertEquals(0, tileCoord.z); @@ -256,7 +256,7 @@ function testGetTileCoordForCoordAndResolutionFractional() { assertEquals(0, tileCoord.y); // gets the 2,0 tile at 513/3,0 - coordinate = new ol.Coordinate(513 / 3, 0); + coordinate = new ol3.Coordinate(513 / 3, 0); tileCoord = tileGrid.getTileCoordForCoordAndResolution( coordinate, 1); assertEquals(0, tileCoord.z); @@ -264,7 +264,7 @@ function testGetTileCoordForCoordAndResolutionFractional() { assertEquals(0, tileCoord.y); // gets the 3,0 tile at 768/3,0 - coordinate = new ol.Coordinate(768 / 3, 0); + coordinate = new ol3.Coordinate(768 / 3, 0); tileCoord = tileGrid.getTileCoordForCoordAndResolution( coordinate, 1); assertEquals(0, tileCoord.z); @@ -272,7 +272,7 @@ function testGetTileCoordForCoordAndResolutionFractional() { assertEquals(0, tileCoord.y); // gets the 4,0 tile at 1024/3,0 - coordinate = new ol.Coordinate(1024 / 3, 0); + coordinate = new ol3.Coordinate(1024 / 3, 0); tileCoord = tileGrid.getTileCoordForCoordAndResolution( coordinate, 1); assertEquals(0, tileCoord.z); @@ -280,7 +280,7 @@ function testGetTileCoordForCoordAndResolutionFractional() { assertEquals(0, tileCoord.y); // still gets the 4,0 tile at 1280/3,0 - wider tile - coordinate = new ol.Coordinate(1280 / 3, 0); + coordinate = new ol3.Coordinate(1280 / 3, 0); tileCoord = tileGrid.getTileCoordForCoordAndResolution( coordinate, 1); assertEquals(0, tileCoord.z); @@ -288,7 +288,7 @@ function testGetTileCoordForCoordAndResolutionFractional() { assertEquals(0, tileCoord.y); // gets the 5,0 tile at 1281/3,0 - coordinate = new ol.Coordinate(1281 / 3, 0); + coordinate = new ol3.Coordinate(1281 / 3, 0); tileCoord = tileGrid.getTileCoordForCoordAndResolution( coordinate, 1); assertEquals(0, tileCoord.z); @@ -296,7 +296,7 @@ function testGetTileCoordForCoordAndResolutionFractional() { assertEquals(0, tileCoord.y); // gets the 0,1 tile at 0,-256/3 - coordinate = new ol.Coordinate(0, -256 / 3); + coordinate = new ol3.Coordinate(0, -256 / 3); tileCoord = tileGrid.getTileCoordForCoordAndResolution( coordinate, 1); assertEquals(0, tileCoord.z); @@ -304,7 +304,7 @@ function testGetTileCoordForCoordAndResolutionFractional() { assertEquals(-2, tileCoord.y); // still gets the 0,1 tile at 0,-512/3 - taller tile - coordinate = new ol.Coordinate(0, -512 / 3); + coordinate = new ol3.Coordinate(0, -512 / 3); tileCoord = tileGrid.getTileCoordForCoordAndResolution( coordinate, 1); assertEquals(0, tileCoord.z); @@ -315,18 +315,18 @@ function testGetTileCoordForCoordAndResolutionFractional() { function testGetTileCoordCenter() { - var tileGrid = new ol.TileGrid(resolutions, extent, origin, tileSize); + var tileGrid = new ol3.TileGrid(resolutions, extent, origin, tileSize); var center; - center = tileGrid.getTileCoordCenter(new ol.TileCoord(0, 0, 0)); + center = tileGrid.getTileCoordCenter(new ol3.TileCoord(0, 0, 0)); assertEquals(50000, center.x); assertEquals(50000, center.y); - center = tileGrid.getTileCoordCenter(new ol.TileCoord(3, 0, 0)); + center = tileGrid.getTileCoordCenter(new ol3.TileCoord(3, 0, 0)); assertEquals(5000, center.x); assertEquals(5000, center.y); - center = tileGrid.getTileCoordCenter(new ol.TileCoord(3, 9, 9)); + center = tileGrid.getTileCoordCenter(new ol3.TileCoord(3, 9, 9)); assertEquals(95000, center.x); assertEquals(95000, center.y); @@ -336,22 +336,22 @@ function testGetTileCoordCenter() { function testGetTileCoordExtent() { - var tileGrid = new ol.TileGrid(resolutions, extent, origin, tileSize); + var tileGrid = new ol3.TileGrid(resolutions, extent, origin, tileSize); var tileCoordExtent; - tileCoordExtent = tileGrid.getTileCoordExtent(new ol.TileCoord(0, 0, 0)); + tileCoordExtent = tileGrid.getTileCoordExtent(new ol3.TileCoord(0, 0, 0)); assertEquals(0, tileCoordExtent.minX); assertEquals(0, tileCoordExtent.minY); assertEquals(100000, tileCoordExtent.maxX); assertEquals(100000, tileCoordExtent.maxY); - tileCoordExtent = tileGrid.getTileCoordExtent(new ol.TileCoord(3, 9, 0)); + tileCoordExtent = tileGrid.getTileCoordExtent(new ol3.TileCoord(3, 9, 0)); assertEquals(90000, tileCoordExtent.minX); assertEquals(0, tileCoordExtent.minY); assertEquals(100000, tileCoordExtent.maxX); assertEquals(10000, tileCoordExtent.maxY); - tileCoordExtent = tileGrid.getTileCoordExtent(new ol.TileCoord(3, 0, 9)); + tileCoordExtent = tileGrid.getTileCoordExtent(new ol3.TileCoord(3, 0, 9)); assertEquals(0, tileCoordExtent.minX); assertEquals(90000, tileCoordExtent.minY); assertEquals(10000, tileCoordExtent.maxX); @@ -362,8 +362,8 @@ function testGetTileCoordExtent() { function testGetExtentTileBounds() { - var tileGrid = new ol.TileGrid(resolutions, extent, origin, tileSize); - var e = new ol.Extent(45000, 5000, 55000, 15000); + var tileGrid = new ol3.TileGrid(resolutions, extent, origin, tileSize); + var e = new ol3.Extent(45000, 5000, 55000, 15000); var tileBounds; tileBounds = tileGrid.getTileBoundsForExtentAndZ(e, 0); @@ -395,11 +395,11 @@ function testGetExtentTileBounds() { function testForEachTileCoordParent() { - var tileGrid = new ol.TileGrid(resolutions, extent, origin, tileSize); + var tileGrid = new ol3.TileGrid(resolutions, extent, origin, tileSize); var zs = [], tileBoundss = []; tileGrid.forEachTileCoordParentTileBounds( - new ol.TileCoord(3, 7, 3), + new ol3.TileCoord(3, 7, 3), function(z, tileBounds) { zs.push(z); tileBoundss.push(tileBounds); @@ -433,7 +433,7 @@ function testForEachTileCoordParent() { function testGetZForResolutionExact() { var tileGrid = - new ol.TileGrid(resolutions, extent, origin, tileSize); + new ol3.TileGrid(resolutions, extent, origin, tileSize); assertEquals(0, tileGrid.getZForResolution(1000)); assertEquals(1, tileGrid.getZForResolution(500)); @@ -446,7 +446,7 @@ function testGetZForResolutionExact() { function testGetZForResolutionApproximate() { var tileGrid = - new ol.TileGrid(resolutions, extent, origin, tileSize); + new ol3.TileGrid(resolutions, extent, origin, tileSize); assertEquals(0, tileGrid.getZForResolution(2000)); assertEquals(0, tileGrid.getZForResolution(1000)); diff --git a/src/ol/tile/tilejson.js b/src/ol3/tile/tilejson.js similarity index 62% rename from src/ol/tile/tilejson.js rename to src/ol3/tile/tilejson.js index 691a37e0ca..37abd086ff 100644 --- a/src/ol/tile/tilejson.js +++ b/src/ol3/tile/tilejson.js @@ -1,36 +1,36 @@ // FIXME add some error checking // FIXME check order of async callbacks -// FIXME use minzoom when supported by ol.TileGrid +// FIXME use minzoom when supported by ol3.TileGrid /** * @see http://mapbox.com/developers/api/ */ -goog.provide('ol.layer.TileJSON'); -goog.provide('ol.tilejson'); -goog.provide('ol.tilestore.TileJSON'); +goog.provide('ol3.layer.TileJSON'); +goog.provide('ol3.tilejson'); +goog.provide('ol3.tilestore.TileJSON'); goog.require('goog.asserts'); goog.require('goog.events.EventType'); goog.require('goog.net.jsloader'); goog.require('goog.string'); -goog.require('ol.TileLayer'); -goog.require('ol.TileStore'); -goog.require('ol.TileUrlFunction'); +goog.require('ol3.TileLayer'); +goog.require('ol3.TileStore'); +goog.require('ol3.TileUrlFunction'); /** * @private * @type {Array.} */ -ol.tilejson.grids_ = []; +ol3.tilejson.grids_ = []; /** * @param {TileJSON} tileJSON Tile JSON. */ var grid = function(tileJSON) { - ol.tilejson.grids_.push(tileJSON); + ol3.tilejson.grids_.push(tileJSON); }; goog.exportSymbol('grid', grid); @@ -38,38 +38,38 @@ goog.exportSymbol('grid', grid); /** * @constructor - * @extends {ol.TileLayer} + * @extends {ol3.TileLayer} * @param {string} url URL. * @param {Object.=} opt_values Values. */ -ol.layer.TileJSON = function(url, opt_values) { +ol3.layer.TileJSON = function(url, opt_values) { goog.asserts.assert(goog.string.endsWith(url, '.jsonp')); - var tileStore = new ol.tilestore.TileJSON(url, function(tileStore) { + var tileStore = new ol3.tilestore.TileJSON(url, function(tileStore) { this.dispatchEvent(goog.events.EventType.LOAD); }, this); goog.base(this, tileStore, opt_values); }; -goog.inherits(ol.layer.TileJSON, ol.TileLayer); +goog.inherits(ol3.layer.TileJSON, ol3.TileLayer); /** * @constructor - * @extends {ol.TileStore} + * @extends {ol3.TileStore} * @param {string} uri URI. - * @param {?function(ol.tilestore.TileJSON)=} opt_callback Callback. + * @param {?function(ol3.tilestore.TileJSON)=} opt_callback Callback. * @param {*=} opt_obj Object. */ -ol.tilestore.TileJSON = function(uri, opt_callback, opt_obj) { +ol3.tilestore.TileJSON = function(uri, opt_callback, opt_obj) { - var projection = ol.Projection.getFromCode('EPSG:3857'); + var projection = ol3.Projection.getFromCode('EPSG:3857'); goog.base( - this, projection, null, ol.TileUrlFunction.nullTileUrlFunction, null); + this, projection, null, ol3.TileUrlFunction.nullTileUrlFunction, null); /** * @private - * @type {?function(ol.tilestore.TileJSON)} + * @type {?function(ol3.tilestore.TileJSON)} */ this.callback_ = opt_callback || null; @@ -93,25 +93,25 @@ ol.tilestore.TileJSON = function(uri, opt_callback, opt_obj) { this.deferred_.addCallback(this.handleTileJSONResponse, this); }; -goog.inherits(ol.tilestore.TileJSON, ol.TileStore); +goog.inherits(ol3.tilestore.TileJSON, ol3.TileStore); /** * @protected */ -ol.tilestore.TileJSON.prototype.handleTileJSONResponse = function() { +ol3.tilestore.TileJSON.prototype.handleTileJSONResponse = function() { - var tileJSON = ol.tilejson.grids_.pop(); + var tileJSON = ol3.tilejson.grids_.pop(); - var epsg4326Projection = ol.Projection.getFromCode('EPSG:4326'); + var epsg4326Projection = ol3.Projection.getFromCode('EPSG:4326'); var epsg4326Extent, extent; if (goog.isDef(tileJSON.bounds)) { var bounds = tileJSON.bounds; - epsg4326Extent = new ol.Extent( + epsg4326Extent = new ol3.Extent( bounds[0], bounds[1], bounds[2], bounds[3]); extent = epsg4326Extent.transform( - ol.Projection.getTransform(epsg4326Projection, this.getProjection())); + ol3.Projection.getTransform(epsg4326Projection, this.getProjection())); this.setExtent(extent); } else { epsg4326Extent = null; @@ -125,10 +125,10 @@ ol.tilestore.TileJSON.prototype.handleTileJSONResponse = function() { var minzoom = tileJSON.minzoom || 0; goog.asserts.assert(minzoom === 0); // FIXME var maxzoom = tileJSON.maxzoom || 22; - var tileGrid = new ol.tilegrid.XYZ(maxzoom); + var tileGrid = new ol3.tilegrid.XYZ(maxzoom); this.tileGrid = tileGrid; - this.tileUrlFunction = ol.TileUrlFunction.withTileCoordTransform( + this.tileUrlFunction = ol3.TileUrlFunction.withTileCoordTransform( function(tileCoord) { if (tileCoord.z < minzoom || maxzoom < tileCoord.z) { return null; @@ -141,22 +141,22 @@ ol.tilestore.TileJSON.prototype.handleTileJSONResponse = function() { var x = goog.math.modulo(tileCoord.x, n); if (!goog.isNull(extent)) { var tileExtent = tileGrid.getTileCoordExtent( - new ol.TileCoord(tileCoord.z, x, tileCoord.y)); + new ol3.TileCoord(tileCoord.z, x, tileCoord.y)); if (!tileExtent.intersects(extent)) { return null; } } - return new ol.TileCoord(tileCoord.z, x, y); + return new ol3.TileCoord(tileCoord.z, x, y); }, - ol.TileUrlFunction.createFromTemplates(tileJSON.tiles)); + ol3.TileUrlFunction.createFromTemplates(tileJSON.tiles)); if (goog.isDef(tileJSON.attribution)) { var coverageAreas = [ - new ol.TileCoverageArea(tileGrid, epsg4326Extent, minzoom, maxzoom) + new ol3.TileCoverageArea(tileGrid, epsg4326Extent, minzoom, maxzoom) ]; var coverageAreaProjection = epsg4326Projection; this.setAttributions([ - new ol.Attribution( + new ol3.Attribution( tileJSON.attribution, coverageAreas, coverageAreaProjection) ]); } @@ -175,6 +175,6 @@ ol.tilestore.TileJSON.prototype.handleTileJSONResponse = function() { /** * @inheritDoc */ -ol.tilestore.TileJSON.prototype.isReady = function() { +ol3.tilestore.TileJSON.prototype.isReady = function() { return this.ready_; }; diff --git a/src/ol3/tile/tilelayer.js b/src/ol3/tile/tilelayer.js new file mode 100644 index 0000000000..5e254e2ee3 --- /dev/null +++ b/src/ol3/tile/tilelayer.js @@ -0,0 +1,26 @@ +goog.provide('ol3.TileLayer'); + +goog.require('ol3.Layer'); +goog.require('ol3.TileStore'); + + + +/** + * @constructor + * @extends {ol3.Layer} + * @param {ol3.TileStore} tileStore Tile store. + * @param {Object.=} opt_values Values. + */ +ol3.TileLayer = function(tileStore, opt_values) { + goog.base(this, tileStore, opt_values); +}; +goog.inherits(ol3.TileLayer, ol3.Layer); + + +/** + * @override + * @return {ol3.TileStore} Store. + */ +ol3.TileLayer.prototype.getStore = function() { + return /** @type {ol3.TileStore} */ goog.base(this, 'getStore'); +}; diff --git a/src/ol/tile/tilestore.js b/src/ol3/tile/tilestore.js similarity index 51% rename from src/ol/tile/tilestore.js rename to src/ol3/tile/tilestore.js index 9f9b1ba522..5040a2ec2d 100644 --- a/src/ol/tile/tilestore.js +++ b/src/ol3/tile/tilestore.js @@ -1,38 +1,38 @@ -goog.provide('ol.TileStore'); +goog.provide('ol3.TileStore'); -goog.require('ol.Attribution'); -goog.require('ol.Store'); -goog.require('ol.Tile'); -goog.require('ol.TileCoord'); -goog.require('ol.TileGrid'); -goog.require('ol.TileUrlFunctionType'); +goog.require('ol3.Attribution'); +goog.require('ol3.Store'); +goog.require('ol3.Tile'); +goog.require('ol3.TileCoord'); +goog.require('ol3.TileGrid'); +goog.require('ol3.TileUrlFunctionType'); /** * @constructor - * @extends {ol.Store} - * @param {ol.Projection} projection Projection. - * @param {ol.TileGrid} tileGrid Tile grid. - * @param {ol.TileUrlFunctionType} tileUrlFunction Tile URL. - * @param {ol.Extent=} opt_extent Extent. + * @extends {ol3.Store} + * @param {ol3.Projection} projection Projection. + * @param {ol3.TileGrid} tileGrid Tile grid. + * @param {ol3.TileUrlFunctionType} tileUrlFunction Tile URL. + * @param {ol3.Extent=} opt_extent Extent. * @param {Array.=} opt_attributions Attributions. * @param {?string=} opt_crossOrigin Cross origin. */ -ol.TileStore = function(projection, tileGrid, tileUrlFunction, opt_extent, +ol3.TileStore = function(projection, tileGrid, tileUrlFunction, opt_extent, opt_attributions, opt_crossOrigin) { goog.base(this, projection, opt_extent, opt_attributions); /** * @protected - * @type {ol.TileGrid} + * @type {ol3.TileGrid} */ this.tileGrid = tileGrid; /** * @protected - * @type {ol.TileUrlFunctionType} + * @type {ol3.TileUrlFunctionType} */ this.tileUrlFunction = tileUrlFunction; @@ -44,29 +44,29 @@ ol.TileStore = function(projection, tileGrid, tileUrlFunction, opt_extent, /** * @private - * @type {Object.} + * @type {Object.} * FIXME will need to expire elements from this cache * FIXME see elemoine's work with goog.structs.LinkedMap */ this.tileCache_ = {}; }; -goog.inherits(ol.TileStore, ol.Store); +goog.inherits(ol3.TileStore, ol3.Store); /** * @inheritDoc */ -ol.TileStore.prototype.getResolutions = function() { +ol3.TileStore.prototype.getResolutions = function() { return this.tileGrid.getResolutions(); }; /** - * @param {ol.TileCoord} tileCoord Tile coordinate. - * @return {ol.Tile} Tile. + * @param {ol3.TileCoord} tileCoord Tile coordinate. + * @return {ol3.Tile} Tile. */ -ol.TileStore.prototype.getTile = function(tileCoord) { +ol3.TileStore.prototype.getTile = function(tileCoord) { var key = tileCoord.toString(); if (goog.object.containsKey(this.tileCache_, key)) { return this.tileCache_[key]; @@ -74,7 +74,7 @@ ol.TileStore.prototype.getTile = function(tileCoord) { var tileUrl = this.getTileCoordUrl(tileCoord); var tile; if (goog.isDef(tileUrl)) { - tile = new ol.Tile(tileCoord, tileUrl, this.crossOrigin_); + tile = new ol3.Tile(tileCoord, tileUrl, this.crossOrigin_); } else { tile = null; } @@ -85,17 +85,17 @@ ol.TileStore.prototype.getTile = function(tileCoord) { /** - * @param {ol.TileCoord} tileCoord Tile coordinate. + * @param {ol3.TileCoord} tileCoord Tile coordinate. * @return {string|undefined} Tile URL. */ -ol.TileStore.prototype.getTileCoordUrl = function(tileCoord) { +ol3.TileStore.prototype.getTileCoordUrl = function(tileCoord) { return this.tileUrlFunction(tileCoord); }; /** - * @return {ol.TileGrid} Tile grid. + * @return {ol3.TileGrid} Tile grid. */ -ol.TileStore.prototype.getTileGrid = function() { +ol3.TileStore.prototype.getTileGrid = function() { return this.tileGrid; }; diff --git a/src/ol/tile/tileurlfunction.js b/src/ol3/tile/tileurlfunction.js similarity index 53% rename from src/ol/tile/tileurlfunction.js rename to src/ol3/tile/tileurlfunction.js index d61cf898e2..b9626a85e5 100644 --- a/src/ol/tile/tileurlfunction.js +++ b/src/ol3/tile/tileurlfunction.js @@ -1,21 +1,21 @@ -goog.provide('ol.TileUrlFunction'); -goog.provide('ol.TileUrlFunctionType'); +goog.provide('ol3.TileUrlFunction'); +goog.provide('ol3.TileUrlFunctionType'); goog.require('goog.math'); -goog.require('ol.TileCoord'); +goog.require('ol3.TileCoord'); /** - * @typedef {function(ol.TileCoord): (string|undefined)} + * @typedef {function(ol3.TileCoord): (string|undefined)} */ -ol.TileUrlFunctionType; +ol3.TileUrlFunctionType; /** * @param {string} template Template. - * @return {ol.TileUrlFunctionType} Tile URL function. + * @return {ol3.TileUrlFunctionType} Tile URL function. */ -ol.TileUrlFunction.createFromTemplate = function(template) { +ol3.TileUrlFunction.createFromTemplate = function(template) { var match = /\{(\d)-(\d)\}/.exec(template) || /\{([a-z])-([a-z])\}/.exec(template); if (match) { @@ -26,7 +26,7 @@ ol.TileUrlFunction.createFromTemplate = function(template) { for (charCode = startCharCode; charCode <= stopCharCode; ++charCode) { templates.push(template.replace(match[0], String.fromCharCode(charCode))); } - return ol.TileUrlFunction.createFromTemplates(templates); + return ol3.TileUrlFunction.createFromTemplates(templates); } else { return function(tileCoord) { if (goog.isNull(tileCoord)) { @@ -43,19 +43,19 @@ ol.TileUrlFunction.createFromTemplate = function(template) { /** * @param {Array.} templates Templates. - * @return {ol.TileUrlFunctionType} Tile URL function. + * @return {ol3.TileUrlFunctionType} Tile URL function. */ -ol.TileUrlFunction.createFromTemplates = function(templates) { - return ol.TileUrlFunction.createFromTileUrlFunctions( - goog.array.map(templates, ol.TileUrlFunction.createFromTemplate)); +ol3.TileUrlFunction.createFromTemplates = function(templates) { + return ol3.TileUrlFunction.createFromTileUrlFunctions( + goog.array.map(templates, ol3.TileUrlFunction.createFromTemplate)); }; /** - * @param {Array.} tileUrlFunctions Tile URL Functions. - * @return {ol.TileUrlFunctionType} Tile URL function. + * @param {Array.} tileUrlFunctions Tile URL Functions. + * @return {ol3.TileUrlFunctionType} Tile URL function. */ -ol.TileUrlFunction.createFromTileUrlFunctions = function(tileUrlFunctions) { +ol3.TileUrlFunction.createFromTileUrlFunctions = function(tileUrlFunctions) { return function(tileCoord) { if (goog.isNull(tileCoord)) { return undefined; @@ -68,20 +68,21 @@ ol.TileUrlFunction.createFromTileUrlFunctions = function(tileUrlFunctions) { /** - * @param {ol.TileCoord} tileCoord Tile coordinate. + * @param {ol3.TileCoord} tileCoord Tile coordinate. * @return {string|undefined} Tile URL. */ -ol.TileUrlFunction.nullTileUrlFunction = function(tileCoord) { +ol3.TileUrlFunction.nullTileUrlFunction = function(tileCoord) { return undefined; }; /** - * @param {function(ol.TileCoord): ol.TileCoord} transformFn Transform.function. - * @param {ol.TileUrlFunctionType} tileUrlFunction Tile URL function. - * @return {ol.TileUrlFunctionType} Tile URL function. + * @param {function(ol3.TileCoord): ol3.TileCoord} transformFn + * Transform.function. + * @param {ol3.TileUrlFunctionType} tileUrlFunction Tile URL function. + * @return {ol3.TileUrlFunctionType} Tile URL function. */ -ol.TileUrlFunction.withTileCoordTransform = +ol3.TileUrlFunction.withTileCoordTransform = function(transformFn, tileUrlFunction) { return function(tileCoord) { if (goog.isNull(tileCoord)) { diff --git a/src/ol3/tile/tileurlfunction_test.js b/src/ol3/tile/tileurlfunction_test.js new file mode 100644 index 0000000000..20f45f6f06 --- /dev/null +++ b/src/ol3/tile/tileurlfunction_test.js @@ -0,0 +1,33 @@ +goog.require('goog.testing.jsunit'); +goog.require('ol3.TileCoord'); +goog.require('ol3.TileUrlFunction'); + + +function testCreateFromTemplate() { + var tileUrl = ol3.TileUrlFunction.createFromTemplate('{z}/{x}/{y}'); + assertEquals('3/2/1', tileUrl(new ol3.TileCoord(3, 2, 1))); + assertUndefined(tileUrl(null)); +} + + +function testWithTileCoordTransform() { + var tileUrl = ol3.TileUrlFunction.withTileCoordTransform( + function(tileCoord) { + return new ol3.TileCoord(tileCoord.z, tileCoord.x, -tileCoord.y); + }, + ol3.TileUrlFunction.createFromTemplate('{z}/{x}/{y}')); + assertEquals('3/2/1', tileUrl(new ol3.TileCoord(3, 2, -1))); + assertUndefined(tileUrl(null)); +} + + +function testCreateFromTileUrlFunctions() { + var tileUrl = ol3.TileUrlFunction.createFromTileUrlFunctions([ + ol3.TileUrlFunction.createFromTemplate('a'), + ol3.TileUrlFunction.createFromTemplate('b') + ]); + var tileUrl1 = tileUrl(new ol3.TileCoord(1, 0, 0)); + var tileUrl2 = tileUrl(new ol3.TileCoord(1, 0, 1)); + assertTrue(tileUrl1 != tileUrl2); + assertUndefined(tileUrl(null)); +} diff --git a/src/ol3/tile/xyz.js b/src/ol3/tile/xyz.js new file mode 100644 index 0000000000..012bcc972b --- /dev/null +++ b/src/ol3/tile/xyz.js @@ -0,0 +1,118 @@ +goog.provide('ol3.layer.XYZ'); +goog.provide('ol3.tilegrid.XYZ'); +goog.provide('ol3.tilestore.XYZ'); + +goog.require('goog.math'); +goog.require('ol3.Attribution'); +goog.require('ol3.Coordinate'); +goog.require('ol3.Layer'); +goog.require('ol3.Projection'); +goog.require('ol3.Size'); +goog.require('ol3.TileCoord'); +goog.require('ol3.TileGrid'); +goog.require('ol3.TileLayer'); +goog.require('ol3.TileStore'); +goog.require('ol3.TileUrlFunction'); + + + +/** + * @constructor + * @extends {ol3.TileGrid} + * @param {number} maxZoom Maximum zoom. + * @param {ol3.Size=} opt_tileSize Tile size. + */ +ol3.tilegrid.XYZ = function(maxZoom, opt_tileSize) { + + var resolutions = new Array(maxZoom + 1); + var z; + for (z = 0; z <= maxZoom; ++z) { + resolutions[z] = ol3.Projection.EPSG_3857_HALF_SIZE / (128 << z); + } + + var extent = ol3.Projection.EPSG_3857_EXTENT; + var origin = new ol3.Coordinate( + -ol3.Projection.EPSG_3857_HALF_SIZE, ol3.Projection.EPSG_3857_HALF_SIZE); + + goog.base(this, resolutions, extent, origin, opt_tileSize); + +}; +goog.inherits(ol3.tilegrid.XYZ, ol3.TileGrid); + + +/** + * @inheritDoc + */ +ol3.tilegrid.XYZ.prototype.forEachTileCoordParentTileBounds = + function(tileCoord, callback, opt_obj) { + var x = tileCoord.x; + var y = tileCoord.y; + var z = tileCoord.z; + var tileBounds; + while (true) { + z -= 1; + if (z < 0) { + break; + } + x = Math.floor(x / 2); + y = Math.floor(y / 2); + tileBounds = new ol3.TileBounds(x, y, x, y); + if (callback.call(opt_obj, z, tileBounds)) { + break; + } + } +}; + + + +/** + * @constructor + * @extends {ol3.TileLayer} + * @param {number} maxZoom Maximum zoom. + * @param {ol3.TileUrlFunctionType} tileUrlFunction Tile URL function. + * @param {Array.=} opt_attributions Attributions. + * @param {string=} opt_crossOrigin Cross origin. + * @param {Object.=} opt_values Values. + */ +ol3.layer.XYZ = function( + maxZoom, tileUrlFunction, opt_attributions, opt_crossOrigin, opt_values) { + var tileStore = new ol3.tilestore.XYZ( + maxZoom, tileUrlFunction, opt_attributions, opt_crossOrigin); + goog.base(this, tileStore, opt_values); +}; +goog.inherits(ol3.layer.XYZ, ol3.TileLayer); + + + +/** + * @constructor + * @extends {ol3.TileStore} + * @param {number} maxZoom Maximum zoom. + * @param {ol3.TileUrlFunctionType} tileUrlFunction Tile URL function. + * @param {Array.=} opt_attributions Attributions. + * @param {string=} opt_crossOrigin Cross origin. + */ +ol3.tilestore.XYZ = + function(maxZoom, tileUrlFunction, opt_attributions, opt_crossOrigin) { + + var projection = ol3.Projection.getFromCode('EPSG:3857'); + var tileGrid = new ol3.tilegrid.XYZ(maxZoom); + var tileUrlFunction2 = ol3.TileUrlFunction.withTileCoordTransform( + function(tileCoord) { + var n = 1 << tileCoord.z; + var y = -tileCoord.y - 1; + if (y < 0 || n <= y) { + return null; + } else { + var x = goog.math.modulo(tileCoord.x, n); + return new ol3.TileCoord(tileCoord.z, x, y); + } + }, + tileUrlFunction); + var extent = projection.getExtent(); + + goog.base(this, projection, tileGrid, tileUrlFunction2, extent, + opt_attributions, opt_crossOrigin); + +}; +goog.inherits(ol3.tilestore.XYZ, ol3.TileStore); diff --git a/src/ol/tile/xyz_test.js b/src/ol3/tile/xyz_test.js similarity index 71% rename from src/ol/tile/xyz_test.js rename to src/ol3/tile/xyz_test.js index 05e6744c34..d4c5612842 100644 --- a/src/ol/tile/xyz_test.js +++ b/src/ol3/tile/xyz_test.js @@ -1,17 +1,17 @@ goog.require('goog.testing.jsunit'); -goog.require('ol.Coordinate'); -goog.require('ol.TileCoord'); -goog.require('ol.TileUrlFunction'); -goog.require('ol.tilestore.XYZ'); +goog.require('ol3.Coordinate'); +goog.require('ol3.TileCoord'); +goog.require('ol3.TileUrlFunction'); +goog.require('ol3.tilestore.XYZ'); function testXYZ() { - var xyzTileStore = new ol.tilestore.XYZ( - 6, ol.TileUrlFunction.createFromTemplate('{z}/{x}/{y}')); + var xyzTileStore = new ol3.tilestore.XYZ( + 6, ol3.TileUrlFunction.createFromTemplate('{z}/{x}/{y}')); var tileGrid = xyzTileStore.getTileGrid(); - var coordinate = new ol.Coordinate(829330.2064098881, 5933916.615134273); + var coordinate = new ol3.Coordinate(829330.2064098881, 5933916.615134273); var tileUrl; tileUrl = xyzTileStore.getTileCoordUrl( @@ -47,16 +47,16 @@ function testXYZ() { function testXYZWrapX() { - var xyzTileStore = new ol.tilestore.XYZ( - 6, ol.TileUrlFunction.createFromTemplate('{z}/{x}/{y}')); + var xyzTileStore = new ol3.tilestore.XYZ( + 6, ol3.TileUrlFunction.createFromTemplate('{z}/{x}/{y}')); - tileUrl = xyzTileStore.getTileCoordUrl(new ol.TileCoord(6, -31, -23)); + tileUrl = xyzTileStore.getTileCoordUrl(new ol3.TileCoord(6, -31, -23)); assertEquals('6/33/22', tileUrl); - tileUrl = xyzTileStore.getTileCoordUrl(new ol.TileCoord(6, 33, -23)); + tileUrl = xyzTileStore.getTileCoordUrl(new ol3.TileCoord(6, 33, -23)); assertEquals('6/33/22', tileUrl); - tileUrl = xyzTileStore.getTileCoordUrl(new ol.TileCoord(6, 97, -23)); + tileUrl = xyzTileStore.getTileCoordUrl(new ol3.TileCoord(6, 97, -23)); assertEquals('6/33/22', tileUrl); } @@ -64,16 +64,16 @@ function testXYZWrapX() { function testXYZCropY() { - var xyzTileStore = new ol.tilestore.XYZ( - 6, ol.TileUrlFunction.createFromTemplate('{z}/{x}/{y}')); + var xyzTileStore = new ol3.tilestore.XYZ( + 6, ol3.TileUrlFunction.createFromTemplate('{z}/{x}/{y}')); - tileUrl = xyzTileStore.getTileCoordUrl(new ol.TileCoord(6, 33, -87)); + tileUrl = xyzTileStore.getTileCoordUrl(new ol3.TileCoord(6, 33, -87)); assertUndefined(tileUrl); - tileUrl = xyzTileStore.getTileCoordUrl(new ol.TileCoord(6, 33, -23)); + tileUrl = xyzTileStore.getTileCoordUrl(new ol3.TileCoord(6, 33, -23)); assertEquals('6/33/22', tileUrl); - tileUrl = xyzTileStore.getTileCoordUrl(new ol.TileCoord(6, 33, 41)); + tileUrl = xyzTileStore.getTileCoordUrl(new ol3.TileCoord(6, 33, 41)); assertUndefined(tileUrl); } @@ -81,9 +81,9 @@ function testXYZCropY() { function testXYZTileGridForEachTileCoordParentTileBounds() { - var xyzTileGrid = new ol.tilegrid.XYZ(6); + var xyzTileGrid = new ol3.tilegrid.XYZ(6); - var tileCoord = new ol.TileCoord(5, 11, 21); + var tileCoord = new ol3.TileCoord(5, 11, 21); var zs = [], tileBoundss = []; xyzTileGrid.forEachTileCoordParentTileBounds( tileCoord, diff --git a/src/ol3/webgl/layerrenderer.js b/src/ol3/webgl/layerrenderer.js new file mode 100644 index 0000000000..b53d04cb84 --- /dev/null +++ b/src/ol3/webgl/layerrenderer.js @@ -0,0 +1,113 @@ +goog.provide('ol3.webgl.LayerRenderer'); + +goog.require('goog.vec.Mat4'); +goog.require('ol3.Layer'); +goog.require('ol3.LayerRenderer'); + + + +/** + * @constructor + * @extends {ol3.LayerRenderer} + * @param {ol3.MapRenderer} mapRenderer Map renderer. + * @param {ol3.Layer} layer Layer. + */ +ol3.webgl.LayerRenderer = function(mapRenderer, layer) { + goog.base(this, mapRenderer, layer); +}; +goog.inherits(ol3.webgl.LayerRenderer, ol3.LayerRenderer); + + +/** + * @protected + */ +ol3.webgl.LayerRenderer.prototype.dispatchChangeEvent = function() { + this.dispatchEvent(goog.events.EventType.CHANGE); +}; + + +/** + * @override + * @return {ol3.MapRenderer} MapRenderer. + */ +ol3.webgl.LayerRenderer.prototype.getMapRenderer = function() { + return /** @type {ol3.webgl.MapRenderer} */ goog.base(this, 'getMapRenderer'); +}; + + +/** + * @return {goog.vec.Mat4.AnyType} Matrix. + */ +ol3.webgl.LayerRenderer.prototype.getMatrix = goog.abstractMethod; + + +/** + * @return {WebGLTexture} Texture. + */ +ol3.webgl.LayerRenderer.prototype.getTexture = goog.abstractMethod; + + +/** + * @inheritDoc + */ +ol3.webgl.LayerRenderer.prototype.handleLayerBrightnessChange = function() { + this.dispatchChangeEvent(); +}; + + +/** + * @inheritDoc + */ +ol3.webgl.LayerRenderer.prototype.handleLayerContrastChange = function() { + this.dispatchChangeEvent(); +}; + + +/** + * @inheritDoc + */ +ol3.webgl.LayerRenderer.prototype.handleLayerHueChange = function() { + this.dispatchChangeEvent(); +}; + + +/** + * @inheritDoc + */ +ol3.webgl.LayerRenderer.prototype.handleLayerLoad = function() { + this.dispatchChangeEvent(); +}; + + +/** + * @inheritDoc + */ +ol3.webgl.LayerRenderer.prototype.handleLayerOpacityChange = function() { + this.dispatchChangeEvent(); +}; + + +/** + * @inheritDoc + */ +ol3.webgl.LayerRenderer.prototype.handleLayerSaturationChange = function() { + this.dispatchChangeEvent(); +}; + + +/** + * @inheritDoc + */ +ol3.webgl.LayerRenderer.prototype.handleLayerVisibleChange = function() { + this.dispatchChangeEvent(); +}; + + +/** + */ +ol3.webgl.LayerRenderer.prototype.handleWebGLContextLost = goog.nullFunction; + + +/** + */ +ol3.webgl.LayerRenderer.prototype.render = goog.abstractMethod; diff --git a/src/ol/webgl/maprenderer.js b/src/ol3/webgl/maprenderer.js similarity index 81% rename from src/ol/webgl/maprenderer.js rename to src/ol3/webgl/maprenderer.js index 02ba82c3ca..8c328b9973 100644 --- a/src/ol/webgl/maprenderer.js +++ b/src/ol3/webgl/maprenderer.js @@ -4,8 +4,8 @@ // FIXME defer cleanup until post-render // FIXME check against gl.getParameter(webgl.MAX_TEXTURE_SIZE) -goog.provide('ol.webgl.MapRenderer'); -goog.provide('ol.webgl.map.shader'); +goog.provide('ol3.webgl.MapRenderer'); +goog.provide('ol3.webgl.map.shader'); goog.require('goog.debug.Logger'); goog.require('goog.dispose'); @@ -17,29 +17,29 @@ goog.require('goog.events.EventType'); goog.require('goog.functions'); goog.require('goog.style'); goog.require('goog.webgl'); -goog.require('ol.Layer'); -goog.require('ol.Map'); -goog.require('ol.TileLayer'); -goog.require('ol.webgl.TileLayerRenderer'); -goog.require('ol.webgl.WebGLContextEventType'); -goog.require('ol.webgl.shader.Fragment'); -goog.require('ol.webgl.shader.Vertex'); +goog.require('ol3.Layer'); +goog.require('ol3.Map'); +goog.require('ol3.TileLayer'); +goog.require('ol3.webgl.TileLayerRenderer'); +goog.require('ol3.webgl.WebGLContextEventType'); +goog.require('ol3.webgl.shader.Fragment'); +goog.require('ol3.webgl.shader.Vertex'); /** * @typedef {{magFilter: number, minFilter: number, texture: WebGLTexture}} */ -ol.webgl.TextureCacheEntry; +ol3.webgl.TextureCacheEntry; /** * @constructor - * @extends {ol.webgl.shader.Fragment} + * @extends {ol3.webgl.shader.Fragment} * @see https://github.com/evanw/glfx.js/blob/master/src/filters/adjust/brightnesscontrast.js * @see https://github.com/evanw/glfx.js/blob/master/src/filters/adjust/huesaturation.js */ -ol.webgl.map.shader.Fragment = function() { +ol3.webgl.map.shader.Fragment = function() { goog.base(this, [ 'precision mediump float;', '', @@ -97,16 +97,16 @@ ol.webgl.map.shader.Fragment = function() { '}' ].join('\n')); }; -goog.inherits(ol.webgl.map.shader.Fragment, ol.webgl.shader.Fragment); -goog.addSingletonGetter(ol.webgl.map.shader.Fragment); +goog.inherits(ol3.webgl.map.shader.Fragment, ol3.webgl.shader.Fragment); +goog.addSingletonGetter(ol3.webgl.map.shader.Fragment); /** * @constructor - * @extends {ol.webgl.shader.Vertex} + * @extends {ol3.webgl.shader.Vertex} */ -ol.webgl.map.shader.Vertex = function() { +ol3.webgl.map.shader.Vertex = function() { goog.base(this, [ 'attribute vec2 aPosition;', 'attribute vec2 aTexCoord;', @@ -119,18 +119,18 @@ ol.webgl.map.shader.Vertex = function() { '}' ].join('\n')); }; -goog.inherits(ol.webgl.map.shader.Vertex, ol.webgl.shader.Vertex); -goog.addSingletonGetter(ol.webgl.map.shader.Vertex); +goog.inherits(ol3.webgl.map.shader.Vertex, ol3.webgl.shader.Vertex); +goog.addSingletonGetter(ol3.webgl.map.shader.Vertex); /** * @constructor - * @extends {ol.MapRenderer} + * @extends {ol3.MapRenderer} * @param {Element} container Container. - * @param {ol.Map} map Map. + * @param {ol3.Map} map Map. */ -ol.webgl.MapRenderer = function(container, map) { +ol3.webgl.MapRenderer = function(container, map) { goog.base(this, container, map); @@ -139,7 +139,7 @@ ol.webgl.MapRenderer = function(container, map) { * @inheritDoc */ this.logger = goog.debug.Logger.getLogger( - 'ol.webgl.maprenderer.' + goog.getUid(this)); + 'ol3.webgl.maprenderer.' + goog.getUid(this)); } /** @@ -164,16 +164,16 @@ ol.webgl.MapRenderer = function(container, map) { }); goog.asserts.assert(!goog.isNull(this.gl_)); - goog.events.listen(this.canvas_, ol.webgl.WebGLContextEventType.LOST, + goog.events.listen(this.canvas_, ol3.webgl.WebGLContextEventType.LOST, this.handleWebGLContextLost, false, this); - goog.events.listen(this.canvas_, ol.webgl.WebGLContextEventType.RESTORED, + goog.events.listen(this.canvas_, ol3.webgl.WebGLContextEventType.RESTORED, this.handleWebGLContextRestored, false, this); /** * @private - * @type {ol.Color} + * @type {ol3.Color} */ - this.clearColor_ = new ol.Color(1, 1, 1, 1); + this.clearColor_ = new ol3.Color(1, 1, 1, 1); /** * @private @@ -209,21 +209,21 @@ ol.webgl.MapRenderer = function(container, map) { /** * @private - * @type {Object.} + * @type {Object.} */ this.textureCache_ = {}; /** * @private - * @type {ol.webgl.shader.Fragment} + * @type {ol3.webgl.shader.Fragment} */ - this.fragmentShader_ = ol.webgl.map.shader.Fragment.getInstance(); + this.fragmentShader_ = ol3.webgl.map.shader.Fragment.getInstance(); /** * @private - * @type {ol.webgl.shader.Vertex} + * @type {ol3.webgl.shader.Vertex} */ - this.vertexShader_ = ol.webgl.map.shader.Vertex.getInstance(); + this.vertexShader_ = ol3.webgl.map.shader.Vertex.getInstance(); /** * @private @@ -234,13 +234,13 @@ ol.webgl.MapRenderer = function(container, map) { this.initializeGL_(); }; -goog.inherits(ol.webgl.MapRenderer, ol.MapRenderer); +goog.inherits(ol3.webgl.MapRenderer, ol3.MapRenderer); /** * @inheritDoc */ -ol.webgl.MapRenderer.prototype.addLayer = function(layer) { +ol3.webgl.MapRenderer.prototype.addLayer = function(layer) { goog.base(this, 'addLayer', layer); if (layer.getVisible()) { this.getMap().render(); @@ -253,7 +253,7 @@ ol.webgl.MapRenderer.prototype.addLayer = function(layer) { * @param {number} magFilter Mag filter. * @param {number} minFilter Min filter. */ -ol.webgl.MapRenderer.prototype.bindImageTexture = +ol3.webgl.MapRenderer.prototype.bindImageTexture = function(image, magFilter, minFilter) { var gl = this.getGL(); var imageKey = image.src; @@ -295,16 +295,16 @@ ol.webgl.MapRenderer.prototype.bindImageTexture = /** * @inheritDoc */ -ol.webgl.MapRenderer.prototype.canRotate = goog.functions.TRUE; +ol3.webgl.MapRenderer.prototype.canRotate = goog.functions.TRUE; /** * @inheritDoc */ -ol.webgl.MapRenderer.prototype.createLayerRenderer = function(layer) { +ol3.webgl.MapRenderer.prototype.createLayerRenderer = function(layer) { var gl = this.getGL(); - if (layer instanceof ol.TileLayer) { - return new ol.webgl.TileLayerRenderer(this, layer); + if (layer instanceof ol3.TileLayer) { + return new ol3.webgl.TileLayerRenderer(this, layer); } else { goog.asserts.assert(false); return null; @@ -315,7 +315,7 @@ ol.webgl.MapRenderer.prototype.createLayerRenderer = function(layer) { /** * @inheritDoc */ -ol.webgl.MapRenderer.prototype.disposeInternal = function() { +ol3.webgl.MapRenderer.prototype.disposeInternal = function() { var gl = this.getGL(); if (!gl.isContextLost()) { goog.object.forEach(this.programCache_, function(program) { @@ -335,17 +335,17 @@ ol.webgl.MapRenderer.prototype.disposeInternal = function() { /** * @return {WebGLRenderingContext} GL. */ -ol.webgl.MapRenderer.prototype.getGL = function() { +ol3.webgl.MapRenderer.prototype.getGL = function() { return this.gl_; }; /** - * @param {ol.webgl.shader.Fragment} fragmentShaderObject Fragment shader. - * @param {ol.webgl.shader.Vertex} vertexShaderObject Vertex shader. + * @param {ol3.webgl.shader.Fragment} fragmentShaderObject Fragment shader. + * @param {ol3.webgl.shader.Vertex} vertexShaderObject Vertex shader. * @return {WebGLProgram} Program. */ -ol.webgl.MapRenderer.prototype.getProgram = function( +ol3.webgl.MapRenderer.prototype.getProgram = function( fragmentShaderObject, vertexShaderObject) { var programKey = goog.getUid(fragmentShaderObject) + '/' + goog.getUid(vertexShaderObject); @@ -372,10 +372,10 @@ ol.webgl.MapRenderer.prototype.getProgram = function( /** - * @param {ol.webgl.Shader} shaderObject Shader object. + * @param {ol3.webgl.Shader} shaderObject Shader object. * @return {WebGLShader} Shader. */ -ol.webgl.MapRenderer.prototype.getShader = function(shaderObject) { +ol3.webgl.MapRenderer.prototype.getShader = function(shaderObject) { var shaderKey = goog.getUid(shaderObject); if (shaderKey in this.shaderCache_) { return this.shaderCache_[shaderKey]; @@ -401,9 +401,9 @@ ol.webgl.MapRenderer.prototype.getShader = function(shaderObject) { /** * @inheritDoc */ -ol.webgl.MapRenderer.prototype.handleBackgroundColorChanged = function() { +ol3.webgl.MapRenderer.prototype.handleBackgroundColorChanged = function() { var backgroundColor = this.getMap().getBackgroundColor(); - this.clearColor_ = new ol.Color( + this.clearColor_ = new ol3.Color( backgroundColor.r / 255, backgroundColor.g / 255, backgroundColor.b / 255, @@ -415,7 +415,7 @@ ol.webgl.MapRenderer.prototype.handleBackgroundColorChanged = function() { /** * @inheritDoc */ -ol.webgl.MapRenderer.prototype.handleCenterChanged = function() { +ol3.webgl.MapRenderer.prototype.handleCenterChanged = function() { goog.base(this, 'handleCenterChanged'); this.getMap().render(); }; @@ -425,7 +425,7 @@ ol.webgl.MapRenderer.prototype.handleCenterChanged = function() { * @param {goog.events.Event} event Event. * @protected */ -ol.webgl.MapRenderer.prototype.handleLayerRendererChange = function(event) { +ol3.webgl.MapRenderer.prototype.handleLayerRendererChange = function(event) { this.getMap().render(); }; @@ -433,7 +433,7 @@ ol.webgl.MapRenderer.prototype.handleLayerRendererChange = function(event) { /** * @inheritDoc */ -ol.webgl.MapRenderer.prototype.handleResolutionChanged = function() { +ol3.webgl.MapRenderer.prototype.handleResolutionChanged = function() { goog.base(this, 'handleResolutionChanged'); this.getMap().render(); }; @@ -442,7 +442,7 @@ ol.webgl.MapRenderer.prototype.handleResolutionChanged = function() { /** * @inheritDoc */ -ol.webgl.MapRenderer.prototype.handleRotationChanged = function() { +ol3.webgl.MapRenderer.prototype.handleRotationChanged = function() { goog.base(this, 'handleRotationChanged'); this.getMap().render(); }; @@ -451,7 +451,7 @@ ol.webgl.MapRenderer.prototype.handleRotationChanged = function() { /** * @inheritDoc */ -ol.webgl.MapRenderer.prototype.handleSizeChanged = function() { +ol3.webgl.MapRenderer.prototype.handleSizeChanged = function() { goog.base(this, 'handleSizeChanged'); var size = this.getMap().getSize(); if (!goog.isDef(size)) { @@ -471,7 +471,7 @@ ol.webgl.MapRenderer.prototype.handleSizeChanged = function() { * @param {goog.events.Event} event Event. * @protected */ -ol.webgl.MapRenderer.prototype.handleWebGLContextLost = function(event) { +ol3.webgl.MapRenderer.prototype.handleWebGLContextLost = function(event) { if (goog.DEBUG) { this.logger.info('WebGLContextLost'); } @@ -490,7 +490,7 @@ ol.webgl.MapRenderer.prototype.handleWebGLContextLost = function(event) { /** * @protected */ -ol.webgl.MapRenderer.prototype.handleWebGLContextRestored = function() { +ol3.webgl.MapRenderer.prototype.handleWebGLContextRestored = function() { if (goog.DEBUG) { this.logger.info('WebGLContextRestored'); } @@ -502,7 +502,7 @@ ol.webgl.MapRenderer.prototype.handleWebGLContextRestored = function() { /** * @private */ -ol.webgl.MapRenderer.prototype.initializeGL_ = function() { +ol3.webgl.MapRenderer.prototype.initializeGL_ = function() { var gl = this.gl_; gl.activeTexture(goog.webgl.TEXTURE0); gl.blendFunc(goog.webgl.SRC_ALPHA, goog.webgl.ONE_MINUS_SRC_ALPHA); @@ -516,7 +516,7 @@ ol.webgl.MapRenderer.prototype.initializeGL_ = function() { * @param {Image} image Image. * @return {boolean} Is image texture loaded. */ -ol.webgl.MapRenderer.prototype.isImageTextureLoaded = function(image) { +ol3.webgl.MapRenderer.prototype.isImageTextureLoaded = function(image) { return image.src in this.textureCache_; }; @@ -524,7 +524,7 @@ ol.webgl.MapRenderer.prototype.isImageTextureLoaded = function(image) { /** * @inheritDoc */ -ol.webgl.MapRenderer.prototype.removeLayer = function(layer) { +ol3.webgl.MapRenderer.prototype.removeLayer = function(layer) { goog.base(this, 'removeLayer', layer); if (layer.getVisible()) { this.getMap().render(); @@ -535,7 +535,7 @@ ol.webgl.MapRenderer.prototype.removeLayer = function(layer) { /** * @inheritDoc */ -ol.webgl.MapRenderer.prototype.removeLayerRenderer = function(layer) { +ol3.webgl.MapRenderer.prototype.removeLayerRenderer = function(layer) { var layerRenderer = goog.base(this, 'removeLayerRenderer', layer); if (!goog.isNull(layerRenderer)) { var layerKey = goog.getUid(layer); @@ -549,7 +549,7 @@ ol.webgl.MapRenderer.prototype.removeLayerRenderer = function(layer) { /** * @inheritDoc */ -ol.webgl.MapRenderer.prototype.render = function() { +ol3.webgl.MapRenderer.prototype.render = function() { if (!this.getMap().isDef()) { return false; @@ -627,7 +627,7 @@ ol.webgl.MapRenderer.prototype.render = function() { /** * @inheritDoc */ -ol.webgl.MapRenderer.prototype.setLayerRenderer = function( +ol3.webgl.MapRenderer.prototype.setLayerRenderer = function( layer, layerRenderer) { goog.base(this, 'setLayerRenderer', layer, layerRenderer); var layerKey = goog.getUid(layer); diff --git a/src/ol3/webgl/shader.js b/src/ol3/webgl/shader.js new file mode 100644 index 0000000000..5260134a58 --- /dev/null +++ b/src/ol3/webgl/shader.js @@ -0,0 +1,81 @@ +goog.provide('ol3.webgl.shader.Fragment'); +goog.provide('ol3.webgl.shader.Vertex'); + +goog.require('goog.functions'); +goog.require('goog.webgl'); + + + +/** + * @constructor + * @param {string} source Source. + */ +ol3.webgl.Shader = function(source) { + + /** + * @private + * @type {string} + */ + this.source_ = source; + +}; + + +/** + * @return {number} Type. + */ +ol3.webgl.Shader.prototype.getType = goog.abstractMethod; + + +/** + * @return {string} Source. + */ +ol3.webgl.Shader.prototype.getSource = function() { + return this.source_; +}; + + +/** + * @return {boolean} Is animated? + */ +ol3.webgl.Shader.prototype.isAnimated = goog.functions.FALSE; + + + +/** + * @constructor + * @extends {ol3.webgl.Shader} + * @param {string} source Source. + */ +ol3.webgl.shader.Fragment = function(source) { + goog.base(this, source); +}; +goog.inherits(ol3.webgl.shader.Fragment, ol3.webgl.Shader); + + +/** + * @inheritDoc + */ +ol3.webgl.shader.Fragment.prototype.getType = function() { + return goog.webgl.FRAGMENT_SHADER; +}; + + + +/** + * @constructor + * @extends {ol3.webgl.Shader} + * @param {string} source Source. + */ +ol3.webgl.shader.Vertex = function(source) { + goog.base(this, source); +}; +goog.inherits(ol3.webgl.shader.Vertex, ol3.webgl.Shader); + + +/** + * @inheritDoc + */ +ol3.webgl.shader.Vertex.prototype.getType = function() { + return goog.webgl.VERTEX_SHADER; +}; diff --git a/src/ol/webgl/tilelayerrenderer.js b/src/ol3/webgl/tilelayerrenderer.js similarity index 81% rename from src/ol/webgl/tilelayerrenderer.js rename to src/ol3/webgl/tilelayerrenderer.js index 428672474e..d39cb704b2 100644 --- a/src/ol/webgl/tilelayerrenderer.js +++ b/src/ol3/webgl/tilelayerrenderer.js @@ -1,10 +1,10 @@ // FIXME large resolutions lead to too large framebuffers :-( // FIXME animated shaders! check in redraw -goog.provide('ol.webgl.TileLayerRenderer'); -goog.provide('ol.webgl.tilelayerrenderer'); -goog.provide('ol.webgl.tilelayerrenderer.shader.Fragment'); -goog.provide('ol.webgl.tilelayerrenderer.shader.Vertex'); +goog.provide('ol3.webgl.TileLayerRenderer'); +goog.provide('ol3.webgl.tilelayerrenderer'); +goog.provide('ol3.webgl.tilelayerrenderer.shader.Fragment'); +goog.provide('ol3.webgl.tilelayerrenderer.shader.Vertex'); goog.require('goog.array'); goog.require('goog.asserts'); @@ -14,22 +14,22 @@ goog.require('goog.object'); goog.require('goog.vec.Mat4'); goog.require('goog.vec.Vec4'); goog.require('goog.webgl'); -goog.require('ol.Coordinate'); -goog.require('ol.MapEventType'); -goog.require('ol.Size'); -goog.require('ol.TileLayer'); -goog.require('ol.TileState'); -goog.require('ol.webgl.LayerRenderer'); -goog.require('ol.webgl.shader.Fragment'); -goog.require('ol.webgl.shader.Vertex'); +goog.require('ol3.Coordinate'); +goog.require('ol3.MapEventType'); +goog.require('ol3.Size'); +goog.require('ol3.TileLayer'); +goog.require('ol3.TileState'); +goog.require('ol3.webgl.LayerRenderer'); +goog.require('ol3.webgl.shader.Fragment'); +goog.require('ol3.webgl.shader.Vertex'); /** * @constructor - * @extends {ol.webgl.shader.Fragment} + * @extends {ol3.webgl.shader.Fragment} */ -ol.webgl.tilelayerrenderer.shader.Fragment = function() { +ol3.webgl.tilelayerrenderer.shader.Fragment = function() { goog.base(this, [ 'precision mediump float;', '', @@ -43,16 +43,16 @@ ol.webgl.tilelayerrenderer.shader.Fragment = function() { ].join('\n')); }; goog.inherits( - ol.webgl.tilelayerrenderer.shader.Fragment, ol.webgl.shader.Fragment); -goog.addSingletonGetter(ol.webgl.tilelayerrenderer.shader.Fragment); + ol3.webgl.tilelayerrenderer.shader.Fragment, ol3.webgl.shader.Fragment); +goog.addSingletonGetter(ol3.webgl.tilelayerrenderer.shader.Fragment); /** * @constructor - * @extends {ol.webgl.shader.Vertex} + * @extends {ol3.webgl.shader.Vertex} */ -ol.webgl.tilelayerrenderer.shader.Vertex = function() { +ol3.webgl.tilelayerrenderer.shader.Vertex = function() { goog.base(this, [ 'attribute vec2 aPosition;', 'attribute vec2 aTexCoord;', @@ -70,18 +70,18 @@ ol.webgl.tilelayerrenderer.shader.Vertex = function() { ].join('\n')); }; goog.inherits( - ol.webgl.tilelayerrenderer.shader.Vertex, ol.webgl.shader.Vertex); -goog.addSingletonGetter(ol.webgl.tilelayerrenderer.shader.Vertex); + ol3.webgl.tilelayerrenderer.shader.Vertex, ol3.webgl.shader.Vertex); +goog.addSingletonGetter(ol3.webgl.tilelayerrenderer.shader.Vertex); /** * @constructor - * @extends {ol.webgl.LayerRenderer} - * @param {ol.MapRenderer} mapRenderer Map renderer. - * @param {ol.TileLayer} tileLayer Tile layer. + * @extends {ol3.webgl.LayerRenderer} + * @param {ol3.MapRenderer} mapRenderer Map renderer. + * @param {ol3.TileLayer} tileLayer Tile layer. */ -ol.webgl.TileLayerRenderer = function(mapRenderer, tileLayer) { +ol3.webgl.TileLayerRenderer = function(mapRenderer, tileLayer) { goog.base(this, mapRenderer, tileLayer); @@ -90,21 +90,21 @@ ol.webgl.TileLayerRenderer = function(mapRenderer, tileLayer) { * @inheritDoc */ this.logger = goog.debug.Logger.getLogger( - 'ol.webgl.tilelayerrenderer.' + goog.getUid(this)); + 'ol3.webgl.tilelayerrenderer.' + goog.getUid(this)); } /** * @private - * @type {ol.webgl.shader.Fragment} + * @type {ol3.webgl.shader.Fragment} */ this.fragmentShader_ = - ol.webgl.tilelayerrenderer.shader.Fragment.getInstance(); + ol3.webgl.tilelayerrenderer.shader.Fragment.getInstance(); /** * @private - * @type {ol.webgl.shader.Vertex} + * @type {ol3.webgl.shader.Vertex} */ - this.vertexShader_ = ol.webgl.tilelayerrenderer.shader.Vertex.getInstance(); + this.vertexShader_ = ol3.webgl.tilelayerrenderer.shader.Vertex.getInstance(); /** * @private @@ -152,14 +152,14 @@ ol.webgl.TileLayerRenderer = function(mapRenderer, tileLayer) { this.matrix_ = goog.vec.Mat4.createNumber(); }; -goog.inherits(ol.webgl.TileLayerRenderer, ol.webgl.LayerRenderer); +goog.inherits(ol3.webgl.TileLayerRenderer, ol3.webgl.LayerRenderer); /** * @param {number} framebufferDimension Framebuffer dimension. * @private */ -ol.webgl.TileLayerRenderer.prototype.bindFramebuffer_ = +ol3.webgl.TileLayerRenderer.prototype.bindFramebuffer_ = function(framebufferDimension) { var mapRenderer = this.getMapRenderer(); @@ -172,7 +172,7 @@ ol.webgl.TileLayerRenderer.prototype.bindFramebuffer_ = this.logger.info('re-sizing framebuffer'); } - if (ol.webgl.FREE_RESOURCES_IMMEDIATELY) { + if (ol3.webgl.FREE_RESOURCES_IMMEDIATELY) { if (goog.DEBUG) { this.logger.info('freeing WebGL resources'); } @@ -184,7 +184,7 @@ ol.webgl.TileLayerRenderer.prototype.bindFramebuffer_ = var map = this.getMap(); goog.events.listenOnce( map, - ol.MapEventType.POST_RENDER, + ol3.MapEventType.POST_RENDER, goog.partial(function(gl, framebuffer, texture) { if (goog.DEBUG) { this.logger.info('freeing WebGL resources on postrender'); @@ -225,7 +225,7 @@ ol.webgl.TileLayerRenderer.prototype.bindFramebuffer_ = /** * @inheritDoc */ -ol.webgl.TileLayerRenderer.prototype.disposeInternal = function() { +ol3.webgl.TileLayerRenderer.prototype.disposeInternal = function() { var mapRenderer = this.getMapRenderer(); var gl = mapRenderer.getGL(); if (!gl.isContextLost()) { @@ -238,18 +238,18 @@ ol.webgl.TileLayerRenderer.prototype.disposeInternal = function() { /** - * @return {ol.TileLayer} Layer. + * @return {ol3.TileLayer} Layer. * @override */ -ol.webgl.TileLayerRenderer.prototype.getLayer = function() { - return /** @type {ol.TileLayer} */ goog.base(this, 'getLayer'); +ol3.webgl.TileLayerRenderer.prototype.getLayer = function() { + return /** @type {ol3.TileLayer} */ goog.base(this, 'getLayer'); }; /** * @inheritDoc */ -ol.webgl.TileLayerRenderer.prototype.getMatrix = function() { +ol3.webgl.TileLayerRenderer.prototype.getMatrix = function() { return this.matrix_; }; @@ -257,7 +257,7 @@ ol.webgl.TileLayerRenderer.prototype.getMatrix = function() { /** * @inheritDoc */ -ol.webgl.TileLayerRenderer.prototype.getTexture = function() { +ol3.webgl.TileLayerRenderer.prototype.getTexture = function() { return this.texture_; }; @@ -265,7 +265,7 @@ ol.webgl.TileLayerRenderer.prototype.getTexture = function() { /** * @protected */ -ol.webgl.TileLayerRenderer.prototype.handleTileChange = function() { +ol3.webgl.TileLayerRenderer.prototype.handleTileChange = function() { this.dispatchChangeEvent(); }; @@ -273,7 +273,7 @@ ol.webgl.TileLayerRenderer.prototype.handleTileChange = function() { /** * @inheritDoc */ -ol.webgl.TileLayerRenderer.prototype.handleWebGLContextLost = function() { +ol3.webgl.TileLayerRenderer.prototype.handleWebGLContextLost = function() { this.locations_ = null; this.arrayBuffer_ = null; this.texture_ = null; @@ -285,7 +285,7 @@ ol.webgl.TileLayerRenderer.prototype.handleWebGLContextLost = function() { /** * @inheritDoc */ -ol.webgl.TileLayerRenderer.prototype.render = function() { +ol3.webgl.TileLayerRenderer.prototype.render = function() { var animate = false; @@ -315,13 +315,13 @@ ol.webgl.TileLayerRenderer.prototype.render = function() { tileBoundsSize.height * tileSize.height); var framebufferDimension = Math.pow(2, Math.ceil(Math.log(maxDimension) / Math.log(2))); - var framebufferExtentSize = new ol.Size( + var framebufferExtentSize = new ol3.Size( tileResolution * framebufferDimension, tileResolution * framebufferDimension); var origin = tileGrid.getOrigin(z); var minX = origin.x + tileBounds.minX * tileSize.width * tileResolution; var minY = origin.y + tileBounds.minY * tileSize.height * tileResolution; - var framebufferExtent = new ol.Extent( + var framebufferExtent = new ol3.Extent( minX, minY, minX + framebufferExtentSize.width, @@ -369,12 +369,12 @@ ol.webgl.TileLayerRenderer.prototype.render = function() { gl.uniform1i(this.locations_.uTexture, 0); /** - * @type {Object.>} + * @type {Object.>} */ var tilesToDrawByZ = {}; /** - * @type {Array.} + * @type {Array.} */ var imagesToLoad = []; @@ -384,7 +384,7 @@ ol.webgl.TileLayerRenderer.prototype.render = function() { var tile = tileStore.getTile(tileCoord); if (goog.isNull(tile)) { - } else if (tile.getState() == ol.TileState.LOADED) { + } else if (tile.getState() == ol3.TileState.LOADED) { if (mapRenderer.isImageTextureLoaded(tile.getImage())) { tilesToDrawByZ[z][tileCoord.toString()] = tile; return; @@ -413,7 +413,7 @@ ol.webgl.TileLayerRenderer.prototype.render = function() { } var tile = tileStore.getTile(tileCoord); if (!goog.isNull(tile) && - tile.getState() == ol.TileState.LOADED) { + tile.getState() == ol3.TileState.LOADED) { if (!tilesToDrawByZ[z]) { tilesToDrawByZ[z] = {}; } @@ -475,7 +475,7 @@ ol.webgl.TileLayerRenderer.prototype.render = function() { if (!goog.array.isEmpty(imagesToLoad)) { goog.events.listenOnce( map, - ol.MapEventType.POST_RENDER, + ol3.MapEventType.POST_RENDER, goog.partial(function(mapRenderer, imagesToLoad) { if (goog.DEBUG) { this.logger.info('uploading textures'); diff --git a/src/ol/webgl/webgl.js b/src/ol3/webgl/webgl.js similarity index 56% rename from src/ol/webgl/webgl.js rename to src/ol3/webgl/webgl.js index fa4a04bc24..beaf9566f9 100644 --- a/src/ol/webgl/webgl.js +++ b/src/ol3/webgl/webgl.js @@ -1,17 +1,17 @@ -goog.provide('ol.webgl'); -goog.provide('ol.webgl.WebGLContextEventType'); +goog.provide('ol3.webgl'); +goog.provide('ol3.webgl.WebGLContextEventType'); /** * @define {boolean} Free resources immediately. */ -ol.webgl.FREE_RESOURCES_IMMEDIATELY = false; +ol3.webgl.FREE_RESOURCES_IMMEDIATELY = false; /** * @enum {string} */ -ol.webgl.WebGLContextEventType = { +ol3.webgl.WebGLContextEventType = { LOST: 'webglcontextlost', RESTORED: 'webglcontextrestored' }; @@ -20,6 +20,6 @@ ol.webgl.WebGLContextEventType = { /** * @return {boolean} Is supported. */ -ol.webgl.isSupported = function() { +ol3.webgl.isSupported = function() { return 'WebGLRenderingContext' in goog.global; }; From 211f93248c7390afea0a46ebfb6e290733fa6886 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Thu, 30 Aug 2012 15:12:45 +0200 Subject: [PATCH 561/562] Store webgl-debug.js in build --- .gitignore | 2 +- Makefile | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.gitignore b/.gitignore index c29095b406..7ec33e4db6 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,7 @@ /build/ol.js /build/ol3.js /build/ol3-compiled.js +/build/webgl-debug.js /demos/*/advanced-optimizations.* /demos/*/build.html /demos/*/debug.html @@ -15,4 +16,3 @@ /proj4js-combined.js /tools/*.pyc /tools/closure-compiler.jar -/webgl-debug.js diff --git a/Makefile b/Makefile index ff38dab96d..c335685327 100644 --- a/Makefile +++ b/Makefile @@ -7,10 +7,10 @@ empty := space := $(empty) $(empty) .PHONY: all -all: build demos webgl-debug.js +all: build demos .PHONY: build -build: build/ol.js build/ol3-compiled.js +build: build/ol.js build/ol3-compiled.js build/webgl-debug.js build/ol.js: $(PLOVR_JAR) $(SRC_OL3) base.json \ build/ol.json src/ol/ol.js @@ -122,7 +122,7 @@ serve: $(PLOVR_JAR) lint: gjslint --strict --limited_doc_files=$(subst $(space),$(comma),$(shell find externs -name \*.js)) $(SRC_OL3) $(SRC_OL) $(filter-out $(TARGETS),$(shell find demos -name \*.js)) -webgl-debug.js: +build/webgl-debug.js: curl https://cvs.khronos.org/svn/repos/registry/trunk/public/webgl/sdk/debug/webgl-debug.js > $@ $(PLOVR_JAR): @@ -139,4 +139,4 @@ clean: reallyclean: clean rm -f $(PLOVR_JAR) - rm -f webgl-debug.js + rm -f build/webgl-debug.js From 8ab2e5dfd23dfaf2d06733f53da0db2a0b0ca19d Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Thu, 30 Aug 2012 13:53:47 +0200 Subject: [PATCH 562/562] Remove attic --- attic/demo/hello-api.html | 26 -- attic/demo/hello-compiled.html | 15 -- attic/demo/hello-compiled.json | 42 ---- attic/demo/hello-epi-compiled.json | 42 ---- attic/demo/hello-epi.js | 16 -- attic/demo/hello.js | 10 - attic/demo/loader.js | 36 --- attic/demo/map.html | 17 -- attic/demo/map.js | 6 - attic/demo/map.json | 39 --- attic/src/api/bounds.js | 149 ----------- attic/src/api/feature.js | 92 ------- attic/src/api/geom/collection.js | 133 ---------- attic/src/api/geom/geometry.js | 35 --- attic/src/api/geom/linestring.js | 142 ----------- attic/src/api/geom/multilinestring.js | 138 ----------- attic/src/api/geom/multipoint.js | 137 ----------- attic/src/api/geom/point.js | 122 --------- attic/src/api/layer/osm.js | 11 - attic/src/api/layer/wms.js | 41 --- attic/src/api/layer/xyz.js | 31 --- attic/src/api/loc.js | 146 ----------- attic/src/api/map.js | 249 ------------------- attic/src/api/popup.js | 139 ----------- attic/src/api/projection.js | 88 ------- attic/src/exports/ol.js | 163 ------------ attic/src/ol/Feature.js | 77 ------ attic/src/ol/Popup.js | 342 -------------------------- attic/src/ol/geom/Collection.js | 198 --------------- attic/src/ol/geom/Geometry.js | 58 ----- attic/src/ol/geom/IGeometry.js | 27 -- attic/src/ol/geom/LineString.js | 76 ------ attic/src/ol/geom/MultiLineString.js | 61 ----- attic/src/ol/geom/MultiPoint.js | 61 ----- attic/src/ol/geom/Point.js | 163 ------------ attic/src/ol/layer/WMS.js | 74 ------ 36 files changed, 3202 deletions(-) delete mode 100644 attic/demo/hello-api.html delete mode 100644 attic/demo/hello-compiled.html delete mode 100644 attic/demo/hello-compiled.json delete mode 100644 attic/demo/hello-epi-compiled.json delete mode 100644 attic/demo/hello-epi.js delete mode 100644 attic/demo/hello.js delete mode 100644 attic/demo/loader.js delete mode 100644 attic/demo/map.html delete mode 100644 attic/demo/map.js delete mode 100644 attic/demo/map.json delete mode 100644 attic/src/api/bounds.js delete mode 100644 attic/src/api/feature.js delete mode 100644 attic/src/api/geom/collection.js delete mode 100644 attic/src/api/geom/geometry.js delete mode 100644 attic/src/api/geom/linestring.js delete mode 100644 attic/src/api/geom/multilinestring.js delete mode 100644 attic/src/api/geom/multipoint.js delete mode 100644 attic/src/api/geom/point.js delete mode 100644 attic/src/api/layer/osm.js delete mode 100644 attic/src/api/layer/wms.js delete mode 100644 attic/src/api/layer/xyz.js delete mode 100644 attic/src/api/loc.js delete mode 100644 attic/src/api/map.js delete mode 100644 attic/src/api/popup.js delete mode 100644 attic/src/api/projection.js delete mode 100644 attic/src/exports/ol.js delete mode 100644 attic/src/ol/Feature.js delete mode 100644 attic/src/ol/Popup.js delete mode 100644 attic/src/ol/geom/Collection.js delete mode 100644 attic/src/ol/geom/Geometry.js delete mode 100644 attic/src/ol/geom/IGeometry.js delete mode 100644 attic/src/ol/geom/LineString.js delete mode 100644 attic/src/ol/geom/MultiLineString.js delete mode 100644 attic/src/ol/geom/MultiPoint.js delete mode 100644 attic/src/ol/geom/Point.js delete mode 100644 attic/src/ol/layer/WMS.js diff --git a/attic/demo/hello-api.html b/attic/demo/hello-api.html deleted file mode 100644 index e0da39a20e..0000000000 --- a/attic/demo/hello-api.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - OL3 Hello World - - - - - - - -
- - diff --git a/attic/demo/hello-compiled.html b/attic/demo/hello-compiled.html deleted file mode 100644 index b50bd6b8f5..0000000000 --- a/attic/demo/hello-compiled.html +++ /dev/null @@ -1,15 +0,0 @@ - - - - - OL3 Hello World - - - - - -
- - \ No newline at end of file diff --git a/attic/demo/hello-compiled.json b/attic/demo/hello-compiled.json deleted file mode 100644 index 5cab96f3ea..0000000000 --- a/attic/demo/hello-compiled.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "id": "hello", - - "output-file": "hello-compiled.js", - - "inputs": [ - "hello.js", - "../src/ol.js" - ], - "paths": [ - "../src" - ], - - "define": { - // "goog.dom.ASSUME_STANDARDS_MODE": true, - "goog.DEBUG": false - }, - - "mode": "ADVANCED", - "level": "VERBOSE", - // "pretty-print": true, - // "debug": true, - - // "experimental-compiler-options": { - // "generateExports": true - // }, - - "checks": { - // acceptable values are "ERROR", "WARNING", and "OFF" - "accessControls": "WARNING", - "visibility": "WARNING", - "checkTypes": "WARNING", - "checkRegExp": "WARNING", - "checkVars": "WARNING", - "deprecated": "WARNING", - "fileoverviewTags": "WARNING", - "invalidCasts": "WARNING", - "missingProperties": "WARNING", - "nonStandardJsDocs": "WARNING", - "undefinedVars": "WARNING" - } -} diff --git a/attic/demo/hello-epi-compiled.json b/attic/demo/hello-epi-compiled.json deleted file mode 100644 index ac42ce4866..0000000000 --- a/attic/demo/hello-epi-compiled.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "id": "hello-epi", - - "output-file": "hello-epi-compiled.js", - - "inputs": [ - "hello-epi.js" - ], - "paths": [ - "../src" - ], - - "define": { - // "goog.dom.ASSUME_STANDARDS_MODE": true, - "goog.DEBUG": false - }, - - "mode": "ADVANCED", - "level": "VERBOSE", - // "pretty-print": true, - // "debug": true, - - // "experimental-compiler-options": { - // "generateExports": true - // }, - - - "checks": { - // acceptable values are "ERROR", "WARNING", and "OFF" - "accessControls": "WARNING", - "visibility": "WARNING", - "checkTypes": "WARNING", - "checkRegExp": "WARNING", - "checkVars": "WARNING", - "deprecated": "WARNING", - "fileoverviewTags": "WARNING", - "invalidCasts": "WARNING", - "missingProperties": "WARNING", - "nonStandardJsDocs": "WARNING", - "undefinedVars": "WARNING" - } -} diff --git a/attic/demo/hello-epi.js b/attic/demo/hello-epi.js deleted file mode 100644 index 2b6ba9467f..0000000000 --- a/attic/demo/hello-epi.js +++ /dev/null @@ -1,16 +0,0 @@ -/* This is a code which is going to be compiled together with the library */ - -goog.require('ol.Map'); -goog.require('ol.layer.OSM'); -goog.require('ol.Loc'); - -goog.require('goog.dom'); - -function init() { - var map = new ol.Map(); - map.setContainer(goog.dom.getElement('map')); - map.setLayers( [ new ol.layer.OSM() ] ); - map.setCenter( new ol.Loc(45, 5)); - map.setZoom(10); -} -window['init'] = init; diff --git a/attic/demo/hello.js b/attic/demo/hello.js deleted file mode 100644 index 90cfcae4e1..0000000000 --- a/attic/demo/hello.js +++ /dev/null @@ -1,10 +0,0 @@ -/* This is a code which is going to be compiled together with the library */ - -function init() { - var map = ol.map() - .renderTo('map') - .layers([ol.layer.osm()]) - .center([45, 5]) - .zoom(10); -} -window['init'] = init; diff --git a/attic/demo/loader.js b/attic/demo/loader.js deleted file mode 100644 index 0b9230f5a5..0000000000 --- a/attic/demo/loader.js +++ /dev/null @@ -1,36 +0,0 @@ -/** - Adds the plovr generated script to the document. The following default - values may be overridden with query string parameters: - - * hostname - localhost - * port - 9810 - * mode - SIMPLE - * id - ol - */ -(function() { - var search = window.location.search.substring(1); - var params = { - hostname: "localhost", - port: "9810", - mode: "SIMPLE", - id: "ol" - }; - var chunks = search.split("&"); - var pair; - for (var i=chunks.length-1; i>=0; --i) { - pair = chunks[i].split("="); - params[decodeURIComponent(pair[0])] = decodeURIComponent(pair[1]); - } - - var host = params.hostname + ":" + params.port; - delete params.hostname; - delete params.port; - - var pairs = []; - for (var key in params) { - pairs.push(encodeURIComponent(key) + "=" + encodeURIComponent(params[key])); - } - - var url = "http://" + host + "/compile?" + pairs.join("&"); - document.write(""); -})(); diff --git a/attic/demo/map.html b/attic/demo/map.html deleted file mode 100644 index 0374e68fa1..0000000000 --- a/attic/demo/map.html +++ /dev/null @@ -1,17 +0,0 @@ - - - - OL3 Map - - - - - - -
- - diff --git a/attic/demo/map.js b/attic/demo/map.js deleted file mode 100644 index c5ea52311c..0000000000 --- a/attic/demo/map.js +++ /dev/null @@ -1,6 +0,0 @@ -var map = ol.map({ - renderTo: 'map', - layers: [ol.layer.osm()], - center: [0, 0], - zoom: 1 -}); diff --git a/attic/demo/map.json b/attic/demo/map.json deleted file mode 100644 index 7725caf2bf..0000000000 --- a/attic/demo/map.json +++ /dev/null @@ -1,39 +0,0 @@ -/** - * Build configuration for the map.js example. Use following syntax: - * - * ol build map.json - * - * The output will be named map-compiled.js. - */ - -{ - "id": "hello", - - "output-file": "map-compiled.js", - - "inputs": ["../src/ol.js", "map.js"], - - "paths": ["../src"], - - "define": { - "goog.DEBUG": false - }, - - "mode": "ADVANCED", - "level": "VERBOSE", - - // acceptable values are "ERROR", "WARNING", and "OFF" - "checks": { - "accessControls": "WARNING", - "visibility": "WARNING", - "checkTypes": "WARNING", - "checkRegExp": "WARNING", - "checkVars": "WARNING", - "deprecated": "WARNING", - "fileoverviewTags": "WARNING", - "invalidCasts": "WARNING", - "missingProperties": "WARNING", - "nonStandardJsDocs": "WARNING", - "undefinedVars": "WARNING" - } -} diff --git a/attic/src/api/bounds.js b/attic/src/api/bounds.js deleted file mode 100644 index 9575ba0c7b..0000000000 --- a/attic/src/api/bounds.js +++ /dev/null @@ -1,149 +0,0 @@ -goog.provide('ol.bounds'); - -goog.require('ol.Bounds'); -goog.require('ol.projection'); - - -/** - * @typedef {ol.Bounds|Array.|Object} bounds Location. - */ -ol.LocLike; - - - -/** - * @export - * @param {ol.LocLike} opt_arg Location. - * @return {ol.Bounds} Location. - */ -ol.bounds = function(opt_arg){ - - if (opt_arg instanceof ol.Bounds) { - return opt_arg; - } - - var minX = 0; - var minY = 0; - var maxX = 0; - var maxY = 0; - var projection; - - var x = 0; - var y = 0; - var z; - - if (goog.isArray(opt_arg)) { - minX = opt_arg[0]; - minY = opt_arg[1]; - maxX = opt_arg[2]; - maxY = opt_arg[3]; - } else if (goog.isObject(opt_arg)) { - ol.base.checkKeys(opt_arg, ['minX', 'minY', 'maxX', 'maxY', 'projection']); - minX = ol.API ? opt_arg['minX'] : opt_arg.minX; - minY = ol.API ? opt_arg['minY'] : opt_arg.minY; - maxX = ol.API ? opt_arg['maxX'] : opt_arg.maxX; - maxY = ol.API ? opt_arg['maxY'] : opt_arg.maxY; - projection = ol.projection(ol.API ? opt_arg['projection'] : opt_arg.projection); - } - else { - throw new Error('ol.bounds'); - } - - var bounds = new ol.Bounds(minX, minY, maxX, maxY, projection); - return bounds; - -}; - - -/** - * @export - * @param {ol.Projection=} opt_arg Projection. - * @return {ol.Bounds|ol.Projection|undefined} Result. - */ -ol.Bounds.prototype.projection = function(opt_arg){ - if (arguments.length == 1 && goog.isDef(opt_arg)) { - this.setProjection(opt_arg); - return this; - } - else { - return this.getProjection(); - } -}; - - -/** - * @export - * @param {number=} opt_arg Minimum X. - * @return {!ol.Bounds|number} Result. - */ -ol.Bounds.prototype.minX = function(opt_arg){ - if (arguments.length == 1 && goog.isDef(opt_arg)) { - this.setMinX(opt_arg); - return this; - } - else { - return this.getMinX(); - } -}; - - -/** - * @export - * @param {number=} opt_arg Minimum Y. - * @return {ol.Bounds|number} Result. - */ -ol.Bounds.prototype.minY = function(opt_arg){ - if (arguments.length == 1 && goog.isDef(opt_arg)) { - this.setMinY(opt_arg); - return this; - } - else { - return this.getMinY(); - } -}; - - -/** - * @export - * @param {number=} opt_arg Maximum X. - * @return {ol.Bounds|number} Result. - */ -ol.Bounds.prototype.maxX = function(opt_arg){ - if (arguments.length == 1 && goog.isDef(opt_arg)) { - this.setMaxX(opt_arg); - return this; - } - else { - return this.getMaxX(); - } -}; - - -/** - * @export - * @param {number=} opt_arg Maximum Y. - * @return {ol.Bounds|number} Result. - */ -ol.Bounds.prototype.maxY = function(opt_arg){ - if (arguments.length == 1 && goog.isDef(opt_arg)) { - this.setMaxY(opt_arg); - return this; - } - else { - return this.getMaxY(); - } -}; - -/** - * Transform this node into another coordinate reference system. Returns a new - * bounds instead of modifying this bounds. - * - * @param {ol.Projection|string} proj Target projection (or string identifier). - * @return {ol.Bounds} A new bounds in the target projection. - */ -ol.Bounds.prototype.transform = function(proj) { - if (goog.isString(proj)) { - proj = new ol.Projection(proj); - } - return this.doTransform(proj); -}; diff --git a/attic/src/api/feature.js b/attic/src/api/feature.js deleted file mode 100644 index 62b3b8ce26..0000000000 --- a/attic/src/api/feature.js +++ /dev/null @@ -1,92 +0,0 @@ -goog.provide('ol.feature'); - -goog.require('ol.base'); -goog.require('ol.Feature'); -goog.require('ol.geom.Geometry'); - - -/** - * @typedef {ol.Feature|Object|string} - */ -ol.FeatureLike; - - -/** - * @export - * @param {ol.FeatureLike=} opt_arg Argument. - * @return {ol.Feature} Feature. - */ -ol.feature = function(opt_arg){ - - /** @type {Object|undefined} */ - var properties; - /** @type {ol.geom.Geometry|undefined} */ - var geometry; - /** @type {string|undefined} */ - var type; - - if (arguments.length == 1) { - if (opt_arg instanceof ol.Feature) { - return opt_arg; - } - else if (goog.isObject(opt_arg)) { - ol.base.checkKeys(opt_arg, ['geometry', 'properties', 'type']); - properties = ol.API ? opt_arg['properties'] : opt_arg.properties; - geometry = ol.API ? opt_arg['geometry'] : opt_arg.geometry; - type = ol.API ? opt_arg['type'] : opt_arg.type; - } - else { - throw new Error('ol.feature'); - } - } - - var feature = new ol.Feature(); - if (goog.isDef(type) && type == 'Feature') { - //this means it is a GeoJSON object - //format.read(opt_arg); - - } else { - if (goog.isDef(properties)) { - feature.setAttributes(properties); - } - if (goog.isDef(geometry)) { - feature.setGeometry(geometry); - } - } - return feature; - -}; - -/** - * @export - * @param {!string} attr The name of the attribute to be set. - * @param {string|number|boolean} value The value of the attribute to be set. - * @returns {ol.Feature} The feature so calls can be chained - */ -ol.Feature.prototype.set = function(attr, value) { - this.setAttribute(attr, value); - return this; -}; - -/** - * @export - * @param {!string} attr The name of the attribute to be set. - * @returns {string|number|boolean|undefined} The attribute value requested. - */ -ol.Feature.prototype.get = function(attr) { - return this.getAttribute(attr); -}; - -/** - * @export - * @param {ol.geom.Geometry=} opt_arg - * @returns {ol.Feature|ol.geom.Geometry|undefined} get or set the geometry on a feature - */ -ol.Feature.prototype.geometry = function(opt_arg) { - if (arguments.length == 1 && goog.isDef(opt_arg)) { - this.setGeometry(opt_arg); - return this; - } else { - return this.getGeometry(); - } -}; diff --git a/attic/src/api/geom/collection.js b/attic/src/api/geom/collection.js deleted file mode 100644 index 9a93ead0c4..0000000000 --- a/attic/src/api/geom/collection.js +++ /dev/null @@ -1,133 +0,0 @@ -goog.provide('ol.geom.collection'); - -goog.require('ol.geom.Collection'); -goog.require('ol.geom.point'); -goog.require('ol.projection'); - -/** - * @export - * @param {Array.} opt_arg Components. - * @return {ol.geom.Collection} Collection. - */ -ol.geom.collection = function(opt_arg){ - - if (opt_arg instanceof ol.geom.Collection) { - return opt_arg; - } - - var components = []; - if (arguments.length == 1 && goog.isDef(opt_arg)) { - if (goog.isArray(opt_arg)) { - var allValid = goog.array.every(opt_arg, function(geom){ - if (geom instanceof ol.geom.Geometry) { - components.push(geom); - return true; - } else { - return false; - } - }); - if (!allValid) { - var msg = 'ol.geom.collection: at least one component ' - + 'definition was no geometry.'; - throw new Error(msg); - } - } else { - throw new Error('ol.geom.collection'); - } - } - - var c = new ol.geom.Collection(components); - return c; -}; -goog.inherits(ol.geom.collection, ol.geom.geometry); - -/** - * @export - * @param {Array.=} opt_arg An array of point specifications. - * @return {Array.|ol.geom.Collection|undefined} Result. - */ -ol.geom.Collection.prototype.components = function(opt_arg){ - if (arguments.length == 1 && goog.isDef(opt_arg)) { - var components = [], - allValid = false; - - allValid = goog.array.every(opt_arg, function(geom){ - if (geom instanceof ol.geom.Geometry) { - components.push(geom); - return true; - } else { - return false; - } - }); - if (!allValid) { - components = []; - } - this.setComponents(components); - return this; - } - else { - return this.getComponents(); - } -}; - -/** - * @export - * @param {ol.geom.Geometry} geom A geometry. - * @param {number=} opt_index An optional index to add the point(s) at. If not - * provided, the point(s) will be added to the end of the list of components. - * @return {ol.geom.Collection} The Collection instance. - */ -ol.geom.Collection.prototype.add = function(geom, opt_index){ - var index = this.components_.length; - if (arguments.length == 2 && goog.isDef(opt_index)) { - index = opt_index; - } - this.addComponent(geom, index); - return this; -}; - -/** - * @export - * @param {Array.} components Some point specifications. - * @param {number=} opt_index An optional index to add the components at. If not - * provided, the components will be added to the end of the list of - * components. - * @return {ol.geom.Collection} The Collection instance. - */ -ol.geom.Collection.prototype.addAll = function(components, opt_index){ - var index = this.components_.length; - - if (arguments.length == 2 && goog.isDef(opt_index)) { - index = opt_index; - } - - goog.array.every(components, function(c){ - this.addComponent(c, index); - index++; - return true; - }, this); - - return this; -}; - -/** - * @export - * @param {(ol.geom.Geometry|Array.)} components A point specification or - * an array of point specifications. - * @return {ol.geom.Collection} The Collection instance. - */ -ol.geom.Collection.prototype.remove = function(components){ - var compArr = []; - if (!goog.isArray(components)) { - compArr.push(components); - } else { - compArr = components; - } - - goog.array.every(compArr, function(c){ - this.removeComponent(c); - return true; - }, this); - - return this; -}; diff --git a/attic/src/api/geom/geometry.js b/attic/src/api/geom/geometry.js deleted file mode 100644 index 5d8b9d09b9..0000000000 --- a/attic/src/api/geom/geometry.js +++ /dev/null @@ -1,35 +0,0 @@ -goog.provide('ol.geom.geometry'); - -goog.require('ol.geom.Geometry'); - -/** - * @export - * @return {ol.geom.Geometry} Geometry.. - */ -ol.geom.geometry = function(){ - var g = new ol.geom.Geometry(); - return g; -}; - -/** - * @export - * @param {ol.Bounds=} opt_arg new Bounds. - * @return {ol.geom.Geometry|ol.Bounds|undefined} either a Geometry (when used as - * setter) or a Bounds/undefined (if used as getter). - */ -ol.geom.Geometry.prototype.bounds = function(opt_arg) { - if (arguments.length == 1 && goog.isDef(opt_arg)) { - return this.setBounds(opt_arg); - } else { - return this.getBounds(); - } -}; - -/** - * Returns the centroid of the geometry. - * - * @returns {ol.geom.Point} The centroid of the geometry. - */ -ol.geom.Geometry.prototype.centroid = function() { - return this.getCentroid(); -}; \ No newline at end of file diff --git a/attic/src/api/geom/linestring.js b/attic/src/api/geom/linestring.js deleted file mode 100644 index 4debb2a62c..0000000000 --- a/attic/src/api/geom/linestring.js +++ /dev/null @@ -1,142 +0,0 @@ -goog.provide('ol.geom.linestring'); - -goog.require('ol.geom.LineString'); -goog.require('ol.geom.point'); -goog.require('ol.projection'); - -/** - * @typedef {Array.} linestring LineString. - */ -ol.LineStringLike; - -/** - * @export - * @param {ol.LineStringLike} opt_arg Points. - * @return {ol.geom.LineString} LineString. - */ -ol.geom.linestring = function(opt_arg){ - - if (opt_arg instanceof ol.geom.LineString) { - return opt_arg; - } - - var vertices = []; - if (arguments.length == 1 && goog.isDef(opt_arg)) { - if (goog.isArray(opt_arg)) { - var allValid = goog.array.every(opt_arg, function(spec){ - var v = ol.geom.point(spec); - if (v instanceof ol.geom.Point) { - vertices.push(v); - return true; - } else { - return false; - } - }); - if (!allValid) { - var msg = 'ol.geom.linestring: at least one point ' - + 'definition was erroneous.'; - throw new Error(msg); - } - } else { - throw new Error('ol.geom.linestring'); - } - } - - var ls = new ol.geom.LineString(vertices); - return ls; -}; -goog.inherits(ol.geom.linestring, ol.geom.geometry); - -/** - * @export - * @param {Array.=} opt_arg An array of vertex specifications. - * @return {Array.|ol.geom.LineString|undefined} Result. - */ -ol.geom.LineString.prototype.vertices = function(opt_arg){ - if (arguments.length == 1 && goog.isDef(opt_arg)) { - var vertices = [], - allValid = false; - goog.array.every(opt_arg, function(spec){ - var v = ol.geom.point(spec); - if (v instanceof ol.geom.Point) { - vertices.push(v); - return true; - } else { - return false; - } - }); - if (!allValid) { - vertices = []; - } - this.setVertices(vertices); - return this; - } - else { - return this.getVertices(); - } -}; - -/** - * @export - * @param {ol.PointLike} vertex A point specification. - * @param {number=} opt_index An optional index to add the vertices at. If not - * provided, the vertex will be added to the end of the list of vertices. - * @return {ol.geom.LineString} The LineString instance. - */ -ol.geom.LineString.prototype.add = function(vertex, opt_index){ - var index = this.vertices_.length, - allValid = false, - v = ol.geom.point(vertex); - if (arguments.length == 2 && goog.isDef(opt_index)) { - index = opt_index; - } - this.addVertex(v, index); - return this; -}; - -/** - * @export - * @param {Array.} vertices Some vertex specifications. - * @param {number=} opt_index An optional index to add the vertices at. If not - * provided, the points will be added to the end of the list of vertices. - * @return {ol.geom.LineString} The LineString instance. - */ -ol.geom.LineString.prototype.addAll = function(vertices, opt_index){ - var index = this.vertices_.length, - v; - - if (arguments.length == 2 && goog.isDef(opt_index)) { - index = opt_index; - } - - goog.array.every(vertices, function(vertexSpec){ - v = ol.geom.point(vertexSpec); - this.addVertex(v, index); - index++; - return true; - }, this); - - return this; -}; - -/** - * @export - * @param {(ol.geom.Point|Array.)} vertices A point specification or - * an array of point specifications. - * @return {ol.geom.LineString} The MultiPoint instance. - */ -ol.geom.LineString.prototype.remove = function(vertices){ - var vertexArr = []; - if (!goog.isArray(vertices)) { - vertexArr.push(vertices); - } else { - vertexArr = vertices; - } - - goog.array.every(vertexArr, function(v){ - this.removeVertex(v); - return true; - }, this); - - return this; -}; diff --git a/attic/src/api/geom/multilinestring.js b/attic/src/api/geom/multilinestring.js deleted file mode 100644 index 6349fb3be4..0000000000 --- a/attic/src/api/geom/multilinestring.js +++ /dev/null @@ -1,138 +0,0 @@ -goog.provide('ol.geom.multilinestring'); - -goog.require('ol.geom.MultiLineString'); -goog.require('ol.geom.point'); -goog.require('ol.geom.collection'); -goog.require('ol.projection'); - -/** - * @export - * @param {Array.} opt_arg Point. - * @return {ol.geom.MultiLineString} MultiLineString. - */ -ol.geom.multilinestring = function(opt_arg){ - - if (opt_arg instanceof ol.geom.MultiLineString) { - return opt_arg; - } - - var ls = []; - if (arguments.length == 1 && goog.isDef(opt_arg)) { - if (goog.isArray(opt_arg)) { - var allValid = goog.array.every(opt_arg, function(spec){ - var l = ol.geom.linestring(spec); - if (l instanceof ol.geom.LineString) { - ls.push(l); - return true; - } else { - return false; - } - }); - if (!allValid) { - var msg = 'ol.geom.linestring: at least one linestring ' - + 'definition was erroneous.'; - throw new Error(msg); - } - } else { - throw new Error('ol.geom.multilinestring'); - } - } - - var mls = new ol.geom.MultiLineString(ls); - return mls; -}; -goog.inherits(ol.geom.multilinestring, ol.geom.collection); - -/** - * @export - * @param {Array.=} opt_arg An array of point specifications. - * @return {Array.|ol.geom.MultiLineString|undefined} Result. - */ -ol.geom.MultiLineString.prototype.linestrings = function(opt_arg){ - if (arguments.length == 1 && goog.isDef(opt_arg)) { - var ls = [], - allValid = false; - allValid = goog.array.every(opt_arg, function(spec){ - var l = ol.geom.linestring(spec); - if (l instanceof ol.geom.LineString) { - ls.push(l); - return true; - } else { - return false; - } - }); - if (!allValid) { - ls = []; - } - this.setComponents(ls); - return this; - } - else { - return this.getComponents(); - } -}; - -/** - * @export - * @param {ol.LineStringLike} line A linestring specification. - * @param {number=} opt_index An optional index to add the point(s) at. If not - * provided, the point(s) will be added to the end of the list of points. - * @return {ol.geom.MultiLineString} The MultiPoint instance. - */ -ol.geom.MultiLineString.prototype.add = function(line, opt_index){ - var index = this.getLineStrings().length, - l = ol.geom.linestring(line); - if (arguments.length == 2 && goog.isDef(opt_index)) { - index = opt_index; - } - this.addLineString(l, index); - return this; -}; - -/** - * @export - * @param {Array.} lines Some linestring specifications. - * @param {number=} opt_index An optional index to add the points at. If not - * provided, the linestrings will be added to the end of the list of - * linestrings. - * @return {ol.geom.MultiLineString} The MultiLineString instance. - */ -ol.geom.MultiLineString.prototype.addAll = function(lines, opt_index){ - var index = this.getLineStrings().length, - l; - - if (arguments.length == 2 && goog.isDef(opt_index)) { - index = opt_index; - } - - goog.array.every(lines, function(pointSpec){ - l = ol.geom.linestring(pointSpec); - this.addLineString(l, index); - index++; - return true; - }, this); - - return this; -}; - -/** - * @export - * @param {(ol.geom.LineString|Array.)} lines A linestring - * specification or an array of linestring specifications. - * @return {ol.geom.MultiLineString} The MultiLineString instance. - */ -ol.geom.MultiLineString.prototype.remove = function(lines){ - var lineArr = []; - if (!goog.isArray(lines)) { - lineArr.push(lines); - } else { - lineArr = lines; - } - - goog.array.every(lineArr, function(l){ - this.removeLineString(l); - return true; - }, this); - - return this; -}; diff --git a/attic/src/api/geom/multipoint.js b/attic/src/api/geom/multipoint.js deleted file mode 100644 index 5ca6ec317e..0000000000 --- a/attic/src/api/geom/multipoint.js +++ /dev/null @@ -1,137 +0,0 @@ -goog.provide('ol.geom.multipoint'); - -goog.require('ol.geom.MultiPoint'); -goog.require('ol.geom.point'); -goog.require('ol.geom.collection'); -goog.require('ol.projection'); - -/** - * @export - * @param {Array.} opt_arg Point. - * @return {ol.geom.MultiPoint} MultiPoint. - */ -ol.geom.multipoint = function(opt_arg){ - - if (opt_arg instanceof ol.geom.MultiPoint) { - return opt_arg; - } - - var points = []; - if (arguments.length == 1 && goog.isDef(opt_arg)) { - if (goog.isArray(opt_arg)) { - var allValid = goog.array.every(opt_arg, function(spec){ - var p = ol.geom.point(spec); - if (p instanceof ol.geom.Point) { - points.push(p); - return true; - } else { - return false; - } - }); - if (!allValid) { - var msg = 'ol.geom.multipoint: at least one point ' - + 'definition was erroneous.'; - throw new Error(msg); - } - } else { - throw new Error('ol.geom.multipoint'); - } - } - - var mp = new ol.geom.MultiPoint(points); - return mp; -}; -goog.inherits(ol.geom.multipoint, ol.geom.collection); - -/** - * @export - * @param {Array.=} opt_arg An array of point specifications. - * @return {Array.|ol.geom.MultiPoint|undefined} Result. - */ -ol.geom.MultiPoint.prototype.points = function(opt_arg){ - if (arguments.length == 1 && goog.isDef(opt_arg)) { - var points = [], - allValid = false; - allValid = goog.array.every(opt_arg, function(spec){ - var p = ol.geom.point(spec); - if (p instanceof ol.geom.Point) { - points.push(p); - return true; - } else { - return false; - } - }); - if (!allValid) { - points = []; - } - this.setComponents(points); - return this; - } - else { - return this.getComponents(); - } -}; - -/** - * @export - * @param {ol.PointLike} point A point specification. - * @param {number=} opt_index An optional index to add the point(s) at. If not - * provided, the point(s) will be added to the end of the list of points. - * @return {ol.geom.MultiPoint} The MultiPoint instance. - */ -ol.geom.MultiPoint.prototype.add = function(point, opt_index){ - var index = this.getPoints().length, - p = ol.geom.point(point); - if (arguments.length == 2 && goog.isDef(opt_index)) { - index = opt_index; - } - this.addPoint(p, index); - return this; -}; - -/** - * @export - * @param {Array.} points Some point specifications. - * @param {number=} opt_index An optional index to add the points at. If not - * provided, the points will be added to the end of the list of points. - * @return {ol.geom.MultiPoint} The MultiPoint instance. - */ -ol.geom.MultiPoint.prototype.addAll = function(points, opt_index){ - var index = this.getPoints().length, - p; - - if (arguments.length == 2 && goog.isDef(opt_index)) { - index = opt_index; - } - - goog.array.every(points, function(pointSpec){ - p = ol.geom.point(pointSpec); - this.addPoint(p, index); - index++; - return true; - }, this); - - return this; -}; - -/** - * @export - * @param {(ol.geom.Point|Array.)} points A point specification or - * an array of point specifications. - * @return {ol.geom.MultiPoint} The MultiPoint instance. - */ -ol.geom.MultiPoint.prototype.remove = function(points){ - var pointArr = []; - if (!goog.isArray(points)) { - pointArr.push(points); - } else { - pointArr = points; - } - - goog.array.every(pointArr, function(p){ - this.removePoint(p); - return true; - }, this); - - return this; -}; diff --git a/attic/src/api/geom/point.js b/attic/src/api/geom/point.js deleted file mode 100644 index e9dab7648c..0000000000 --- a/attic/src/api/geom/point.js +++ /dev/null @@ -1,122 +0,0 @@ -goog.provide('ol.geom.point'); - -goog.require('ol.geom.Point'); -goog.require('ol.projection'); - -/** - * @typedef {Array.|Object} point Point. - */ -ol.PointLike; - -/** - * @export - * @param {ol.PointLike} opt_arg Point. - * @return {ol.geom.Point} Point. - */ -ol.geom.point = function(opt_arg){ - - if (opt_arg instanceof ol.geom.Point) { - return opt_arg; - } - - var x = 0; - var y = 0; - var z; - var projection; - - if (arguments.length == 1 && goog.isDef(opt_arg)) { - if (goog.isArray(opt_arg)) { - x = opt_arg[0]; - y = opt_arg[1]; - z = opt_arg[2]; - projection = opt_arg[3]; - - } else if (goog.isObject(opt_arg)) { - x = ol.API ? opt_arg['x'] : opt_arg.x; - y = ol.API ? opt_arg['y'] : opt_arg.y; - z = ol.API ? opt_arg['z'] : opt_arg.z; - projection = ol.API ? opt_arg['projection'] : opt_arg.projection; - } else { - throw new Error('ol.geom.point'); - } - } - if (goog.isDef(projection)) { - projection = ol.projection(projection); - } - - var p = new ol.geom.Point(x,y,z,projection); - return p; -}; -goog.inherits(ol.geom.point, ol.geom.geometry); - - -/** - * @export - * @param {number=} opt_arg X. - * @return {ol.geom.Point|number} Result. - */ -ol.geom.Point.prototype.x = function(opt_arg){ - if (arguments.length == 1 && goog.isDef(opt_arg)) { - this.setX(opt_arg); - return this; - } - else { - return this.getX(); - } -}; - - -/** - * @export - * @param {number=} opt_arg Y. - * @return {ol.geom.Point|number} Result. - */ -ol.geom.Point.prototype.y = function(opt_arg){ - if (arguments.length == 1 && goog.isDef(opt_arg)) { - this.setY(opt_arg); - return this; - } - else { - return this.getY(); - } -}; - - -/** - * @export - * @param {number=} opt_arg Z. - * @return {ol.geom.Point|number|undefined} Result. - */ -ol.geom.Point.prototype.z = function(opt_arg){ - if (arguments.length == 1 && goog.isDef(opt_arg)) { - this.setZ(opt_arg); - return this; - } - else { - return this.getZ(); - } -}; - -/** - * @export - * @param {ol.Projection=} opt_arg Projection. - * @return {ol.geom.Point|ol.Projection|undefined} Result. - */ -ol.geom.Point.prototype.projection = function(opt_arg){ - if (arguments.length == 1 && goog.isDef(opt_arg)) { - this.setProjection(ol.projection(opt_arg)); - return this; - } - else { - return this.getProjection(); - } -}; - -/** - * Returns the centroid of this point; which is a clone of the point itself. - * - * @return {ol.geom.Point} The centroid. - */ -ol.geom.Point.prototype.centroid = function() { - return this.getCentroid(); -}; diff --git a/attic/src/api/layer/osm.js b/attic/src/api/layer/osm.js deleted file mode 100644 index 7d8d31b95d..0000000000 --- a/attic/src/api/layer/osm.js +++ /dev/null @@ -1,11 +0,0 @@ -goog.provide('ol.layer.osm'); - -goog.require('ol.layer.OSM'); - -/** - * @export - * @return {ol.layer.OSM} - */ -ol.layer.osm = function() { - return new ol.layer.OSM(); -}; diff --git a/attic/src/api/layer/wms.js b/attic/src/api/layer/wms.js deleted file mode 100644 index dc4cfe22a4..0000000000 --- a/attic/src/api/layer/wms.js +++ /dev/null @@ -1,41 +0,0 @@ -goog.provide('ol.layer.wms'); - -goog.require('ol.layer.WMS'); - -/** - * @export - * @param {Object} opt_arg Config object. - * @return {ol.layer.WMS} - */ -ol.layer.wms = function(opt_arg) { - if (opt_arg instanceof ol.layer.WMS) { - return opt_arg; - } - - /** @type {string} */ - var url; - /** @type {Array.} */ - var layers; - /** @type {string} */ - var format; - - if (goog.isObject(opt_arg)) { - ol.base.checkKeys(opt_arg, ['url', 'layers', 'format']); - url = ol.API ? opt_arg['url'] : opt_arg.url; - layers = ol.API ? opt_arg['layers'] : opt_arg.layers; - format = ol.API ? opt_arg['format'] : opt_arg.format; - } - - var msg; - if (!goog.isDef(url)) { - msg = 'Cannot create WMS layer; option "url" is missing'; - ol.error(msg); - } - if (!goog.isArray(layers)) { - msg = 'Cannot create WMS layer; option "layers" is missing, ' + - 'or is not an array'; - ol.error(msg); - } - - return new ol.layer.WMS(url, layers, format); -}; diff --git a/attic/src/api/layer/xyz.js b/attic/src/api/layer/xyz.js deleted file mode 100644 index ce69d2dc6d..0000000000 --- a/attic/src/api/layer/xyz.js +++ /dev/null @@ -1,31 +0,0 @@ -goog.provide('ol.layer.xyz'); - -goog.require('ol.layer.XYZ'); - -/** - * @export - * @param {Object} opt_arg Config object. - * @return {ol.layer.XYZ} - */ -ol.layer.xyz = function(opt_arg) { - if (opt_arg instanceof ol.layer.XYZ) { - return opt_arg; - } - - /** @type {string} */ - var url; - - var usage = 'ol.layer.xyz accepts an object with a "url" property'; - - if (goog.isObject(opt_arg)) { - url = ol.API ? opt_arg['url'] : opt_arg.url; - } else { - throw new Error(usage); - } - - if (!goog.isDef(url)) { - throw new Error(usage); - } - - return new ol.layer.XYZ(url); -}; diff --git a/attic/src/api/loc.js b/attic/src/api/loc.js deleted file mode 100644 index d0cc3888e0..0000000000 --- a/attic/src/api/loc.js +++ /dev/null @@ -1,146 +0,0 @@ -goog.provide('ol.loc'); - -goog.require('ol.Loc'); -goog.require('ol.projection'); - - -/** - * @typedef {ol.Loc|Array.|Object} loc Location. - */ -ol.LocLike; - - - -/** - * @export - * @param {ol.LocLike} opt_arg Location. - * @return {ol.Loc} Location. - */ -ol.loc = function(opt_arg){ - - if (opt_arg instanceof ol.Loc) { - return opt_arg; - } - - /** @type {number|undefined} */ - var x; - - /** @type {number|undefined} */ - var y; - - /** @type {number|undefined} */ - var z; - - /** @type {Object|undefined} */ - var projection; - - var usage = 'ol.loc accepts a coordinate array or an object with x, y, and (optional) z properties'; - - if (arguments.length == 1 && goog.isDef(opt_arg)) { - if (goog.isArray(opt_arg)) { - x = opt_arg[0]; - y = opt_arg[1]; - z = opt_arg[2]; - projection = opt_arg[3]; - } else if (goog.isObject(opt_arg)) { - ol.base.checkKeys(opt_arg, ['projection', 'x', 'y', 'z']); - x = ol.API ? opt_arg['x'] : opt_arg.x; - y = ol.API ? opt_arg['y'] : opt_arg.y; - z = ol.API ? opt_arg['z'] : opt_arg.z; - projection = ol.API ? opt_arg['projection'] : opt_arg.projection; - } else { - throw new Error(usage); - } - } - - if (!goog.isNumber(x) || !goog.isNumber(y)) { - throw new Error(usage); - } - - if (goog.isDef(projection)) { - projection = ol.projection(projection); - } - - var loc = new ol.Loc(x, y, z, projection); - return loc; - -}; - -/** - * Transform this location to another coordinate reference system. This - * requires that this location has a projection set already (if not, an error - * will be thrown). Returns a new location object and does not modify this - * location. - * - * @export - * @param {string|ol.Projection} proj The destination projection. Can be - * supplied as a projection instance of a string identifier. - * @returns {ol.Loc} A new location. - */ -ol.Loc.prototype.transform = function(proj) { - if (goog.isString(proj)) { - proj = new ol.Projection(proj); - } - return this.doTransform(proj); -}; - -/** - * @export - * @param {ol.Projection=} opt_arg Projection. - * @return {ol.Loc|ol.Projection|undefined} Result. - */ -ol.Loc.prototype.projection = function(opt_arg){ - if (arguments.length == 1 && goog.isDef(opt_arg)) { - return this.setProjection(ol.projection(opt_arg)); - } - else { - return this.getProjection(); - } -}; - - -/** - * @export - * @param {number=} opt_arg X. - * @return {ol.Loc|number} Result. - */ -ol.Loc.prototype.x = function(opt_arg){ - if (arguments.length == 1 && goog.isDef(opt_arg)) { - this.setX(opt_arg); - return this; - } - else { - return this.getX(); - } -}; - - -/** - * @export - * @param {number=} opt_arg Y. - * @return {ol.Loc|number} Result. - */ -ol.Loc.prototype.y = function(opt_arg){ - if (arguments.length == 1 && goog.isDef(opt_arg)) { - this.setY(opt_arg); - return this; - } - else { - return this.getY(); - } -}; - - -/** - * @export - * @param {number=} opt_arg Z. - * @return {ol.Loc|number|undefined} Result. - */ -ol.Loc.prototype.z = function(opt_arg){ - if (arguments.length == 1 && goog.isDef(opt_arg)) { - return this.setZ(opt_arg); - } - else { - return this.getZ(); - } -}; diff --git a/attic/src/api/map.js b/attic/src/api/map.js deleted file mode 100644 index f6a090fe9b..0000000000 --- a/attic/src/api/map.js +++ /dev/null @@ -1,249 +0,0 @@ -goog.provide('ol.map'); - -goog.require('ol.Loc'); -goog.require('ol.Map'); -goog.require('ol.Projection'); -goog.require('ol.loc'); -goog.require('ol.projection'); -goog.require('ol.error'); - - -/** - * @typedef {ol.Map|{center, zoom, numZoomLevels, projection, userProjection, maxExtent, maxResolution, resolutions, renderTo, layers, controls}|string} - */ -ol.MapLike; - - -/** - * @export - * @param {ol.MapLike=} opt_arg Argument. - * @return {ol.Map} Map. - */ -ol.map = function(opt_arg) { - - /** @type {ol.Loc|undefined} */ - var center; - /** @type {number|undefined} */ - var zoom; - /** @type {number|undefined} */ - var numZoomLevels; - /** @type {ol.Projection|undefined} */ - var projection; - /** @type {ol.Projection|undefined} */ - var userProjection; - /** @type {ol.Bounds|undefined} */ - var maxExtent; - /** @type {number|undefined} */ - var maxResolution; - /** @type {Array.|undefined} */ - var resolutions; - /** @type {Element|string|undefined} */ - var renderTo; - /** @type {Array|undefined} */ - var layers; - /** @type {Array|undefined} */ - var controls; - - if (arguments.length == 1) { - if (opt_arg instanceof ol.Map) { - return opt_arg; - } - else if (goog.isObject(opt_arg)) { - ol.base.checkKeys(opt_arg, ['center', 'zoom', 'numZoomLevels', 'projection', 'userProjection', 'maxExtent', 'maxResolution', 'resolutions', 'renderTo', 'layers', 'controls']); - center = ol.API ? opt_arg['center'] : opt_arg.center; - zoom = ol.API ? opt_arg['zoom'] : opt_arg.zoom; - numZoomLevels = ol.API ? opt_arg['numZoomLevels'] : opt_arg.numZoomLevels; - projection = ol.API ? opt_arg['projection'] : opt_arg.projection; - userProjection = ol.API ? opt_arg['userProjection'] : opt_arg.userProjection; - maxExtent = ol.API ? opt_arg['maxExtent'] : opt_arg.maxExtent; - maxResolution = ol.API ? opt_arg['maxResolution'] : opt_arg.maxResolution; - resolutions = ol.API ? opt_arg['resolutions'] : opt_arg.resolutions; - renderTo = ol.API ? opt_arg['renderTo'] : opt_arg.renderTo; - layers = ol.API ? opt_arg['layers'] : opt_arg.layers; - controls = ol.API ? opt_arg['controls'] : opt_arg.controls; - } - else { - throw new Error('ol.map'); - } - } - - - var map = new ol.Map(); - if (goog.isDef(center)) { - map.center(center); - } - if (goog.isDef(zoom)) { - map.setZoom(zoom); - } - if (goog.isDef(numZoomLevels)) { - map.setNumZoomLevels(numZoomLevels); - } - if (goog.isDef(projection)) { - map.setProjection(ol.projection(projection)); - } - if (goog.isDef(userProjection)) { - map.setUserProjection(ol.projection(userProjection)); - } - if (goog.isDef(maxExtent)) { - map.setMaxExtent(ol.bounds(maxExtent)); - } - if (goog.isDef(maxResolution)) { - map.setMaxResolution(maxResolution); - } - if (goog.isDef(resolutions)) { - map.setResolutions(resolutions); - } - if (goog.isDef(layers)) { - map.setLayers(layers); - } - if (goog.isDef(controls)) { - map.setControls(controls); - } - if (goog.isDef(renderTo)) { - map.renderTo(renderTo); - } - return map; - -}; - -/** - * @export - * @param {ol.LocLike=} opt_arg - * @returns {ol.Map|ol.Loc|undefined} Map center. - */ -ol.Map.prototype.center = function(opt_arg) { - if (arguments.length == 1 && goog.isDef(opt_arg)) { - var loc = ol.loc(opt_arg); - var proj = loc.getProjection(); - if (goog.isNull(proj)) { - proj = this.getUserProjection(); - loc.setProjection(proj); - } - this.setCenter(loc); - return this; - } else { - var proj = this.getUserProjection(); - return this.getCenter().doTransform(proj); - } -}; - -/** - * @export - * @param {ol.ProjectionLike=} opt_arg - * @returns {ol.Map|ol.Projection|undefined} - */ -ol.Map.prototype.projection = function(opt_arg) { - if (arguments.length == 1 && goog.isDef(opt_arg)) { - this.setProjection(ol.projection(opt_arg)); - return this; - } else { - return this.getProjection(); - } -}; - -/** - * @export - * @param {ol.ProjectionLike=} opt_arg - * @returns {ol.Map|ol.Projection|undefined} - */ -ol.Map.prototype.userProjection = function(opt_arg) { - if (arguments.length == 1 && goog.isDef(opt_arg)) { - this.setUserProjection(ol.projection(opt_arg)); - return this; - } else { - return this.getUserProjection(); - } -}; - -/** - * @export - * @param {number=} opt_arg - * @returns {ol.Map|number|undefined} Map center. - */ -ol.Map.prototype.zoom = function(opt_arg) { - if (arguments.length == 1 && goog.isDef(opt_arg)) { - this.setZoom(opt_arg); - return this; - } else { - return this.getZoom(); - } -}; - -/** - * @export - * @param {number=} opt_arg - * @returns {ol.Map|number|undefined} Map center. - */ -ol.Map.prototype.numZoomLevels = function(opt_arg) { - if (arguments.length == 1 && goog.isDef(opt_arg)) { - this.setNumZoomLevels(opt_arg); - return this; - } else { - return this.getNumZoomLevels(); - } -}; - -/** - * @export - * @param {Array=} opt_arg - * @returns {ol.Map|Array|undefined} Map center. - */ -ol.Map.prototype.resolutions = function(opt_arg) { - if (arguments.length == 1 && goog.isDef(opt_arg)) { - this.setResolutions(opt_arg); - return this; - } else { - return this.getResolutions(); - } -}; - -/** - * @export - * @param {Array=} opt_arg - * @returns {ol.Map|Array|undefined} Map center. - */ -ol.Map.prototype.layers = function(opt_arg) { - if (arguments.length == 1 && goog.isDef(opt_arg)) { - this.setLayers(opt_arg); - return this; - } else { - return this.getLayers(); - } -}; - -/** - * @export - * @param {Array=} opt_arg - * @returns {ol.Map|Array|undefined} Map center. - */ -ol.Map.prototype.controls = function(opt_arg) { - if (arguments.length == 1 && goog.isDef(opt_arg)) { - this.setControls(opt_arg); - return this; - } else { - return this.getControls(); - } -}; - -/** - * @export - * @param {Array=} opt_arg - * @returns {ol.Map|ol.Bounds|undefined} Map max extent. - */ -ol.Map.prototype.maxExtent = function(opt_arg) { - if (arguments.length == 1 && goog.isDef(opt_arg)) { - this.setMaxExtent(ol.bounds(opt_arg)); - return this; - } else { - return this.getMaxExtent(); - } -}; - -/** - * @param {string|Element} arg Render the map to a container - * @returns {ol.Map} - */ -ol.Map.prototype.renderTo = function(arg) { - this.setContainer(goog.dom.getElement(arg)); - return this; -}; diff --git a/attic/src/api/popup.js b/attic/src/api/popup.js deleted file mode 100644 index dd51db9a73..0000000000 --- a/attic/src/api/popup.js +++ /dev/null @@ -1,139 +0,0 @@ -goog.provide('ol.popup'); - -goog.require('ol.Popup'); -goog.require('ol.map'); - - -/** - * @typedef {ol.Popup|{map, anchor, placement, content, template}} popup - */ -ol.PopupLike; - - - -/** - * @export - * @param {ol.PopupLike} opt_arg popup object literal. - * @return {ol.Popup} the popup. - */ -ol.popup = function(opt_arg){ - - if (opt_arg instanceof ol.Popup) { - return opt_arg; - } - - /** @type {ol.Map} */ - var map; - - /** @type {ol.Loc|ol.Feature|undefined} */ - var anchor; - - /** @type {string|undefined} */ - var placement; - - /** @type {string|undefined} */ - var content; - - /** @type {string|undefined} */ - var template; - - if (arguments.length == 1 && goog.isDef(opt_arg)) { - if (goog.isObject(opt_arg)) { - ol.base.checkKeys(opt_arg, ['map', 'anchor', 'placement', 'content', 'template']); - map = ol.API ? opt_arg['map'] : opt_arg.map; - anchor = ol.API ? opt_arg['anchor'] : opt_arg.anchor; - placement = ol.API ? opt_arg['placement'] : opt_arg.placement; - content = ol.API ? opt_arg['content'] : opt_arg.content; - template = ol.API ? opt_arg['template'] : opt_arg.template; - } - } - - var popup = new ol.Popup(map, anchor); - - if (goog.isDef(anchor)) { - popup.setAnchor(anchor); - } - if (goog.isDef(placement)) { - popup.setPlacement(placement); - } - if (goog.isDef(content)) { - popup.setContent(content); - } - if (goog.isDef(template)) { - popup.setTemplate(template); - } - - return popup; - -}; - - -/** - * @export - * @param {ol.Loc|ol.Feature=} opt_arg a feature or a location. - * @return {ol.Popup|ol.Feature|ol.Loc|undefined} Result. - */ -ol.Popup.prototype.anchor = function(opt_arg){ - if (arguments.length == 1 && goog.isDef(opt_arg)) { - this.setAnchor(opt_arg); - return this; - } - else { - return this.getAnchor(); - } -}; - - -/** - * @export - * @param {ol.Map=} opt_arg the map . - * @return {ol.Popup|ol.Map|undefined} the map or the popup. - */ -ol.Popup.prototype.map = function(opt_arg){ - if (arguments.length == 1 && goog.isDef(opt_arg)) { - this.setMap(opt_arg); - return this; - } - else { - return this.getMap(); - } -}; - -/** - * @export - * @param {string=} opt_arg the content for the map (HTML makrkup) - * @return {ol.Popup|string|undefined} the content or the popup. - */ -ol.Popup.prototype.content = function(opt_arg){ - if (arguments.length == 1 && goog.isDef(opt_arg)) { - this.setContent(opt_arg); - return this; - } - else { - return this.getContent(); - } -}; - -/** - * @export - * @param {string=} opt_arg the template to be used to generate the content - * @return {ol.Popup|string|undefined} the template or the popup. - */ -ol.Popup.prototype.template = function(opt_arg){ - if (arguments.length == 1 && goog.isDef(opt_arg)) { - this.setTemplate(opt_arg); - return this; - } - else { - return this.getTemplate(); - } -}; - -/** - * Open the popup. - * @export - * @param {ol.Feature|ol.Loc} opt_arg feature or location for the anchor - */ -ol.Popup.prototype.open = function(opt_arg) { - this.doOpen(opt_arg); -}; diff --git a/attic/src/api/projection.js b/attic/src/api/projection.js deleted file mode 100644 index 8e067a1efd..0000000000 --- a/attic/src/api/projection.js +++ /dev/null @@ -1,88 +0,0 @@ -goog.provide('ol.projection'); - -goog.require('ol.base'); -goog.require('ol.Projection'); - - -/** - * @typedef {ol.Projection|Object|string} - */ -ol.ProjectionLike; - - -/** - * @export - * @param {ol.ProjectionLike=} opt_arg Argument. - * @return {ol.Projection} Projection. - */ -ol.projection = function(opt_arg){ - /** @type {string} */ - var code; - - /** @type {undefined|number} */ - var units; - - /** @type {undefined|Array|ol.UnreferencedBounds} */ - var extent; - - if (arguments.length == 1 && goog.isDefAndNotNull(opt_arg)) { - if (opt_arg instanceof ol.Projection) { - return opt_arg; - } - else if (goog.isString(opt_arg)) { - code = opt_arg; - } - else if (goog.isObject(opt_arg)) { - ol.base.checkKeys(opt_arg, ['code', 'maxExtent', 'units']); - if (goog.isString(ol.API ? opt_arg['code'] : opt_arg.code)) { - code = ol.API ? opt_arg['code'] : opt_arg.code; - } else { - throw new Error('Projection requires a string code.'); - } - units = ol.API ? opt_arg['units'] : opt_arg.units; - extent = ol.API ? opt_arg['maxExtent'] : opt_arg.maxExtent; - } - else { - throw new Error('ol.projection'); - } - } - var proj = new ol.Projection(code); - if (goog.isDef(units)) { - proj.setUnits(units); - } - if (goog.isDef(extent)) { - proj.setExtent( - new ol.UnreferencedBounds(extent[0],extent[1],extent[2],extent[3]) - ); - } - return proj; -}; - -/** - * @export - * @param {string=} opt_code Code. - * @return {!ol.Projection|string} Result. - */ -ol.Projection.prototype.code = function(opt_code){ - if (arguments.length == 1 && goog.isDef(opt_code)) { - this.setCode(opt_code); - return this; - } - else { - return this.getCode(); - } -}; - -/** - * @export - * @param {string=} opt_units Units abbreviation. - * @return {undefined|!ol.Projection|string} Result. - */ -ol.Projection.prototype.units = function(opt_units){ - if (goog.isDef(opt_units)) { - return this.setUnits(opt_units); - } - else { - return this.getUnits(); - } -}; diff --git a/attic/src/exports/ol.js b/attic/src/exports/ol.js deleted file mode 100644 index 73315a2b6c..0000000000 --- a/attic/src/exports/ol.js +++ /dev/null @@ -1,163 +0,0 @@ -goog.require('ol.base'); -goog.require('ol.bounds'); -goog.require('ol.control.Attribution'); -goog.require('ol.control.Navigation'); -goog.require('ol.control.Zoom'); -goog.require('ol.event.Events'); -goog.require('ol.event.Scroll'); -goog.require('ol.handler.Drag'); -goog.require("ol.map"); -goog.require("ol.loc"); -goog.require("ol.feature"); -goog.require("ol.projection"); -goog.require("ol.layer.xyz"); -goog.require("ol.layer.osm"); -goog.require("ol.layer.wms"); -goog.require("ol.popup"); -goog.require("ol.Tile"); -goog.require("ol.TileSet"); -goog.require("ol.TileCache"); -goog.require("ol.geom.geometry"); -goog.require("ol.geom.point"); -goog.require("ol.geom.multipoint"); -goog.require("ol.geom.linestring"); -goog.require("ol.geom.multilinestring"); -goog.require("ol.geom.collection"); -goog.require('ol.layer.XYZ'); -goog.require('ol.layer.OSM'); -goog.require('ol.layer.WMS'); -goog.require('ol.renderer.Composite'); -goog.require('ol.renderer.TileLayerRenderer'); -goog.require('ol.renderer.WebGL'); - -// ol.map -goog.exportSymbol('ol.map', ol.map ); -goog.exportSymbol('ol.Map', ol.Map ); -goog.exportProperty( ol.Map.prototype, 'renderTo', ol.Map.prototype.renderTo ); -goog.exportProperty( ol.Map.prototype, 'center', ol.Map.prototype.center ); -goog.exportProperty( ol.Map.prototype, 'projection', ol.Map.prototype.projection ); -goog.exportProperty( ol.Map.prototype, 'userProjection', ol.Map.prototype.userProjection ); -goog.exportProperty( ol.Map.prototype, 'zoom', ol.Map.prototype.zoom ); -goog.exportProperty( ol.Map.prototype, 'numZoomLevels', ol.Map.prototype.numZoomLevels ); -goog.exportProperty( ol.Map.prototype, 'resolutions', ol.Map.prototype.resolutions ); -goog.exportProperty( ol.Map.prototype, 'layers', ol.Map.prototype.layers ); -goog.exportProperty( ol.Map.prototype, 'controls', ol.Map.prototype.controls ); -goog.exportProperty( ol.Map.prototype, 'maxExtent', ol.Map.prototype.maxExtent ); -goog.exportProperty( ol.Map.prototype, 'destroy', ol.Map.prototype.destroy ); - -// ol.loc -goog.exportSymbol('ol.loc', ol.loc ); -goog.exportSymbol('ol.Loc', ol.Loc ); // This is not required only for the tests with isInstanceOf -goog.exportProperty( ol.Loc.prototype, 'projection', ol.Loc.prototype.projection ); -goog.exportProperty( ol.Loc.prototype, 'x', ol.Loc.prototype.x ); -goog.exportProperty( ol.Loc.prototype, 'y', ol.Loc.prototype.y ); -goog.exportProperty( ol.Loc.prototype, 'z', ol.Loc.prototype.z ); -goog.exportProperty( ol.Loc.prototype, 'transform', ol.Loc.prototype.transform ); -goog.exportProperty( ol.Loc.prototype, 'destroy', ol.Loc.prototype.destroy ); - -// ol.projection -goog.exportSymbol('ol.projection', ol.projection ); -goog.exportSymbol('ol.Projection', ol.Projection ); -goog.exportProperty( ol.Projection.prototype, 'code', ol.Projection.prototype.code ); -goog.exportProperty( ol.Projection.prototype, 'units', ol.Projection.prototype.units ); - -// ol.bounds -goog.exportSymbol('ol.bounds', ol.bounds ); -goog.exportSymbol('ol.Bounds', ol.Bounds ); -goog.exportProperty( ol.Bounds.prototype, 'projection', ol.Bounds.prototype.projection ); -goog.exportProperty( ol.Bounds.prototype, 'minX', ol.Bounds.prototype.minX ); -goog.exportProperty( ol.Bounds.prototype, 'minY', ol.Bounds.prototype.minY ); -goog.exportProperty( ol.Bounds.prototype, 'maxX', ol.Bounds.prototype.maxX ); -goog.exportProperty( ol.Bounds.prototype, 'maxY', ol.Bounds.prototype.maxY ); - -// ol.layer.xyz -goog.exportSymbol('ol.layer.xyz', ol.layer.xyz); -goog.exportSymbol('ol.layer.XYZ', ol.layer.XYZ); - -// ol.layer.osm -goog.exportSymbol('ol.layer.osm', ol.layer.osm); -goog.exportSymbol('ol.layer.OSM', ol.layer.OSM); - -// ol.layer.wms -goog.exportSymbol('ol.layer.wms', ol.layer.wms); -goog.exportSymbol('ol.layer.WMS', ol.layer.WMS); - -// ol.feature -goog.exportSymbol('ol.feature', ol.feature); -goog.exportSymbol('ol.Feature', ol.Feature); -goog.exportProperty(ol.Feature.prototype, 'set', ol.Feature.prototype.set); -goog.exportProperty(ol.Feature.prototype, 'get', ol.Feature.prototype.get); -goog.exportProperty(ol.Feature.prototype, 'geometry', ol.Feature.prototype.geometry); - -// ol.geometry -goog.exportSymbol('ol.geom.geometry', ol.geom.geometry); -goog.exportSymbol('ol.geom.Geometry', ol.geom.Geometry); -goog.exportProperty(ol.geom.Geometry.prototype, 'bounds', ol.geom.Geometry.prototype.bounds); -goog.exportProperty(ol.geom.Geometry.prototype, 'centroid', ol.geom.Geometry.prototype.centroid); - -// ol.geom.collection -goog.exportSymbol('ol.geom.collection', ol.geom.collection); -goog.exportSymbol('ol.geom.Collection', ol.geom.Collection); -goog.exportProperty(ol.geom.Collection.prototype, 'components', ol.geom.Collection.prototype.components); -goog.exportProperty(ol.geom.Collection.prototype, 'add', ol.geom.Collection.prototype.add); -goog.exportProperty(ol.geom.Collection.prototype, 'addAll', ol.geom.Collection.prototype.addAll); -goog.exportProperty(ol.geom.Collection.prototype, 'remove', ol.geom.Collection.prototype.remove); -goog.exportProperty(ol.geom.Collection.prototype, 'centroid', ol.geom.Collection.prototype.centroid); - -// ol.geom.point -goog.exportSymbol('ol.geom.point', ol.geom.point); -goog.exportSymbol('ol.geom.Point', ol.geom.Point); -goog.exportProperty(ol.geom.Point.prototype, 'x', ol.geom.Point.prototype.x); -goog.exportProperty(ol.geom.Point.prototype, 'y', ol.geom.Point.prototype.y); -goog.exportProperty(ol.geom.Point.prototype, 'z', ol.geom.Point.prototype.z); -goog.exportProperty(ol.geom.Point.prototype, 'projection', ol.geom.Point.prototype.projection); -goog.exportProperty(ol.geom.Point.prototype, 'centroid', ol.geom.Point.prototype.centroid); - -// ol.geom.linestring -goog.exportSymbol('ol.geom.linestring', ol.geom.linestring); -goog.exportSymbol('ol.geom.LineString', ol.geom.LineString); -goog.exportProperty(ol.geom.LineString.prototype, 'vertices', ol.geom.LineString.prototype.vertices); -goog.exportProperty(ol.geom.LineString.prototype, 'add', ol.geom.LineString.prototype.add); -goog.exportProperty(ol.geom.LineString.prototype, 'addAll', ol.geom.LineString.prototype.addAll); -goog.exportProperty(ol.geom.LineString.prototype, 'remove', ol.geom.LineString.prototype.remove); -goog.exportProperty(ol.geom.LineString.prototype, 'centroid', ol.geom.LineString.prototype.centroid); - -// ol.geom.multipoint -goog.exportSymbol('ol.geom.multipoint', ol.geom.multipoint); -goog.exportSymbol('ol.geom.MultiPoint', ol.geom.MultiPoint); -goog.exportProperty(ol.geom.MultiPoint.prototype, 'points', ol.geom.MultiPoint.prototype.points); -goog.exportProperty(ol.geom.MultiPoint.prototype, 'add', ol.geom.MultiPoint.prototype.add); -goog.exportProperty(ol.geom.MultiPoint.prototype, 'addAll', ol.geom.MultiPoint.prototype.addAll); -goog.exportProperty(ol.geom.MultiPoint.prototype, 'remove', ol.geom.MultiPoint.prototype.remove); -goog.exportProperty(ol.geom.MultiPoint.prototype, 'centroid', ol.geom.MultiPoint.prototype.centroid); - -// ol.geom.multilinestring -goog.exportSymbol('ol.geom.multilinestring', ol.geom.multilinestring); -goog.exportSymbol('ol.geom.MultiLineString', ol.geom.MultiLineString); -goog.exportProperty(ol.geom.MultiLineString.prototype, 'linestrings', ol.geom.MultiLineString.prototype.linestrings); -goog.exportProperty(ol.geom.MultiLineString.prototype, 'add', ol.geom.MultiLineString.prototype.add); -goog.exportProperty(ol.geom.MultiLineString.prototype, 'addAll', ol.geom.MultiLineString.prototype.addAll); -goog.exportProperty(ol.geom.MultiLineString.prototype, 'remove', ol.geom.MultiLineString.prototype.remove); -goog.exportProperty(ol.geom.MultiLineString.prototype, 'centroid', ol.geom.MultiLineString.prototype.centroid); - - -// ol.popup -goog.exportSymbol('ol.popup', ol.popup); -goog.exportSymbol('ol.Popup', ol.Popup); -goog.exportProperty(ol.Popup.prototype, 'anchor', ol.Popup.prototype.anchor); -goog.exportProperty(ol.Popup.prototype, 'map', ol.Popup.prototype.map); -goog.exportProperty(ol.Popup.prototype, 'content', ol.Popup.prototype.content); -goog.exportProperty(ol.Popup.prototype, 'template', ol.Popup.prototype.template); -goog.exportProperty(ol.Popup.prototype, 'open', ol.Popup.prototype.open); - -/** - * Lookup for dynamically registered controls and renderers does not work in - * advanced compiled mode. For now, we duplicate the registration calls here. - * - * TODO: determine a good way for plugins to register - */ -goog.exportProperty(ol.renderer.Composite, 'isSupported', ol.renderer.Composite.isSupported); -goog.exportProperty(ol.renderer.TileLayerRenderer, 'isSupported', ol.renderer.TileLayerRenderer.isSupported); -goog.exportProperty(ol.renderer.TileLayerRenderer, 'canRender', ol.renderer.TileLayerRenderer.canRender); -goog.exportProperty(ol.renderer.TileLayerRenderer, 'getType', ol.renderer.TileLayerRenderer.getType); -ol.control.addControl('navigation', ol.control.Navigation); diff --git a/attic/src/ol/Feature.js b/attic/src/ol/Feature.js deleted file mode 100644 index 7fb7d4fab4..0000000000 --- a/attic/src/ol/Feature.js +++ /dev/null @@ -1,77 +0,0 @@ -goog.provide('ol.Feature'); - -goog.require('ol.geom.Geometry'); - - - -/** - * @export - * @constructor - */ -ol.Feature = function() { - - /** - * @private - * @type {ol.geom.Geometry} - */ - this.geometry_ = null; - - /** - * @private - * @type {Object} - */ - this.attributes_ = {}; - -}; - -/** - * @return {ol.geom.Geometry} The geometry associated with the feature. - */ -ol.Feature.prototype.getGeometry = function() { - return this.geometry_; -}; - -/** - * @param {ol.geom.Geometry} geom the geometry for the feature. - */ -ol.Feature.prototype.setGeometry = function(geom) { - this.geometry_ = geom; -}; - - -/** - * @param {!string} name the attribute value to retrieve. - @return {string|number|boolean} the attribute value. - */ -ol.Feature.prototype.getAttribute = function(name) { - return this.attributes_[name]; -}; - - -/** - * @param {!string} name of the attribute to set. - * @param {string|number|boolean} value the attribute value to set. - */ -ol.Feature.prototype.setAttribute = function(name, value) { - this.attributes_[name] = value; -}; - - -/** - * @param {Object} attrs An json structure containing key/value pairs. - */ -ol.Feature.prototype.setAttributes = function(attrs) { - for (var key in attrs) { - this.setAttribute(key, attrs[key]); - } -}; - - -/** -*/ -ol.Feature.prototype.destroy = function() { - //remove attributes and geometry, etc. - for (var key in this) { - delete this[key]; - } -}; diff --git a/attic/src/ol/Popup.js b/attic/src/ol/Popup.js deleted file mode 100644 index 8ec7018aee..0000000000 --- a/attic/src/ol/Popup.js +++ /dev/null @@ -1,342 +0,0 @@ -goog.provide('ol.Popup'); - -goog.require('ol.Map'); -goog.require('ol.Loc'); -goog.require('ol.Feature'); - - -/** - * @export - * @constructor - * @param {ol.Map} map the map on which the popup is placed. - * @param {ol.Loc|ol.Feature=} opt_anchor the anchor object for the popup. - * @param {string=} opt_placement the placement of the arrow on the popup. - * @param {boolean=} opt_close include a close button on the popup - */ -ol.Popup = function(map, opt_anchor, opt_placement, opt_close) { - - /** - * @private - * @type {ol.Map} - */ - this.map_ = map; - - /** - * @private - * @type {ol.Loc|ol.Feature|undefined} - */ - this.anchor_ = opt_anchor; - - /** - * can be 'top','bottom','right','left','auto' - * TODO: 'auto' not yet implemented - * @private - * @type {!string} - */ - this.placement_ = goog.isDefAndNotNull(opt_placement)?opt_placement:'top'; - - /** - * include a close button on the popup - defaults to true. - * @private - * @type {boolean|undefined} - */ - this.closeButton_ = goog.isDefAndNotNull(opt_close) ? opt_close : true; - - /** - * @private - * @type {string|undefined} - */ - this.content_ = undefined; - - /** - * @private - * @type {string|undefined} - */ - this.template_ = undefined; - - /** - * @private - * @type {Element} - */ - this.container_ = null; - - /** - * @private - * @type {number} - */ - this.arrowOffset_ = 30; //FIXME: set this from CSS dynamically somehow? - - /** - * if the CSS sets either width or height assume the app is specifying the - * size of the popup, if not auto size the popup. - * @private - * @type {boolean} - */ - this.autoSize_ = true; - -}; - -/** - * @const - */ -ol.Popup.CLASS_NAME = 'ol-popup'; - -/** - * @return {ol.Map} Projection. - */ -ol.Popup.prototype.getMap = function() { - return this.map_; -}; - -/** - * @param {ol.Map} map the map object to hold this popup. - */ -ol.Popup.prototype.setMap = function(map) { - this.map_ = map; -}; - -/** - * @return {ol.Feature|ol.Loc|undefined} the anchor . - */ -ol.Popup.prototype.getAnchor = function() { - return this.anchor_; -}; - -/** - * @param {ol.Feature|ol.Loc} anchor the anchor location to place this popup. - */ -ol.Popup.prototype.setAnchor = function(anchor) { - this.anchor_ = anchor; -}; - - -/** - * @return {string|undefined} the placement value relative to the anchor. - */ -ol.Popup.prototype.getPlacement = function() { - return this.placement_; -}; - -/** - * @param {string} placement where to place this popup relative to the anchor. - */ -ol.Popup.prototype.setPlacement = function(placement) { - if (!goog.isNull(this.container_)) { - goog.dom.classes.remove(this.container_, - ol.Popup.CLASS_NAME+'-'+this.placement_); - goog.dom.classes.add(this.container_,ol.Popup.CLASS_NAME+'-'+placement); - } - this.placement_ = placement; -}; - - -/** - * @return {string|undefined} static content to be displayed in the popup (HTML) - */ -ol.Popup.prototype.getContent = function() { - return this.content_; -}; - -/** - * @param {string} content the content to be displayed this popup. - */ -ol.Popup.prototype.setContent = function(content) { - this.content_ = content; -}; - - -/** - * @private - * @returns {string} generates the content - */ -ol.Popup.prototype.generateContent_ = function() { - //set the content - if ( goog.isDefAndNotNull(this.content_) ) { - return this.content_; - } else { - if ( goog.isDefAndNotNull(this.template_) && - goog.isDefAndNotNull(this.anchor_) && - (this.anchor_ instanceof ol.Feature)) { - //set content from feature attributes on the template - //TODO: this.setContent(template.apply(this.anchor_.getAttributes())); - return this.template_; //stub to return something - } else { - ol.error('ol.Popup unabale to generate any content'); - return '

no content

'; - } - } -}; - - -/** - * @return {string|undefined} the anchor . - */ -ol.Popup.prototype.getTemplate = function() { - return this.template_; -}; - -/** - * @param {string} template the map object to hold this popup. - */ -ol.Popup.prototype.setTemplate = function(template) { - this.template_ = template; -}; - -/** - * Open the popup. - * @param {ol.Feature|ol.Loc} opt_arg feature or location for the anchor - */ -ol.Popup.prototype.doOpen = function(opt_arg) { - if (goog.isDef(opt_arg)) { - this.setAnchor(opt_arg); - } - - //create popup container if it's not created already - if (goog.isNull(this.container_)) { - this.container_ = goog.dom.createElement('div'); - goog.dom.classes.add(this.container_, - ol.Popup.CLASS_NAME, ol.Popup.CLASS_NAME+'-'+this.placement_); - - //see if the style class sets width or height - if (goog.style.getStyle(this.container_, 'width').length>0 || - goog.style.getStyle(this.container_, 'height').length>0 ) { - this.autoSize_ = false; - } - - if (this.closeButton_) { - var closeButton = goog.dom.createElement('div'); - goog.dom.appendChild(this.container_, closeButton); - goog.dom.classes.add(closeButton, ol.Popup.CLASS_NAME+'-close'); - } - this.map_.getEvents().register('click', this.clickHandler, this); - goog.dom.appendChild(this.map_.getMapOverlay(), this.container_); - } - - this.childContent_=goog.dom.htmlToDocumentFragment(this.generateContent_()); - goog.dom.appendChild(this.container_, this.childContent_); - - if (this.autoSize_) { - this.registerImageListeners(); - } - - this.setAnchorOffset_(); -}; - -ol.Popup.prototype.setAnchorOffset_ = function() { - - if (goog.isNull(this.container_.parentNode)) { - //this means the popup has already been closed, nothing to do here - //which might happen while waiting for images to load - return; - } - - if (!goog.isDefAndNotNull(this.anchor_)) { - //must have an anchor when trying to set the position - ol.error("ol.Popup must have an anchor to set the position"); - return; - } - - //position the element - if (this.anchor_ instanceof ol.Feature) { - this.pos_ = this.anchor_.getGeometry().getCentroid(); - } else { - this.pos_ = new ol.geom.Point(this.anchor_.getX(), this.anchor_.getY()); - } - var pos = /** @type {ol.Loc} */ (this.pos_); - var popupPosPx = this.map_.getPixelForLoc(pos); - var popupSize = goog.style.getSize(this.container_); - - switch(this.placement_) { - default: - case 'auto': - //TODO: switch based on map quadrant - break; - case 'top': - case 'bottom': - popupPosPx[0] -= popupSize.width / 2.0; - - if (this.placement_ == "bottom") { - popupPosPx[1] -= popupSize.height + this.arrowOffset_; - } else { - popupPosPx[1] += this.arrowOffset_; - } - break; - case 'left': - case 'right': - popupPosPx[1] -= popupSize.height / 2.0; - - if (this.placement_ == "right") { - popupPosPx[0] -= popupSize.width + this.arrowOffset_; - } else { - popupPosPx[0] += this.arrowOffset_; - } - break; - } - this.moveTo_(popupPosPx); - -}; - -/** - * registerImageListeners - * Called when an image contained by the popup loaded. this function - * updates the popup size, then unregisters the image load listener. - */ -ol.Popup.prototype.registerImageListeners = function() { - - // As the images load, this function will call setAnchorOffset_() to - // resize the popup to fit the content div (which presumably is now - // bigger than when the image was not loaded). - // - //cycle through the images and if their size is 0x0, that means that - // they haven't been loaded yet, so we attach the listener, which - // will fire when the images finish loading and will resize the - // popup accordingly to its new size. - var images = this.container_.getElementsByTagName("img"); - for (var i = 0, len = images.length; i < len; i++) { - var img = images[i]; - if (img.width == 0 || img.height == 0) { - goog.events.listenOnce(img, 'load', - goog.bind(this.setAnchorOffset_, this)); - } - } -}; - - -/** - * @param px - {goog.} the top and left position of the popup div. - */ -ol.Popup.prototype.moveTo_ = function(px) { - if (goog.isDefAndNotNull(px)) { - goog.style.setPosition(this.container_, px[0], px[1]); - } -}; - -/** - * Click handler - * @param {Event} evt the event generated by a click - */ -ol.Popup.prototype.clickHandler = function(evt) { - var target = /** @type {Node} */ evt.target; - if (goog.dom.classes.has(target,ol.Popup.CLASS_NAME+'-close')) { - this.close(); - } -}; - -/** - * Clean up. - * @export - */ -ol.Popup.prototype.close = function() { - goog.dom.removeChildren(this.container_); - goog.dom.removeNode(this.container_); -}; - -/** - * Clean up. - * @export - */ -ol.Popup.prototype.destroy = function() { - for (var key in this) { - delete this[key]; - } -}; diff --git a/attic/src/ol/geom/Collection.js b/attic/src/ol/geom/Collection.js deleted file mode 100644 index 5bcb9b2a98..0000000000 --- a/attic/src/ol/geom/Collection.js +++ /dev/null @@ -1,198 +0,0 @@ -goog.provide('ol.geom.Collection'); - -goog.require('goog.array'); -goog.require('ol.geom.Geometry'); -goog.require('ol.Projection'); -goog.require('ol.base'); - -/** - * Creates ol.geom.Collection objects. - * - * @export - * @extends {ol.geom.Geometry} - * @param {Array.} components An array of components. - * - * @constructor - */ -ol.geom.Collection = function(components) { - - /** - * @private - * @type {Array.} - */ - this.typeBlacklist_ = [ - ol.geom.Collection - ]; - - /** - * @private - * @type {Array.} - */ - this.typeWhitelist_ = [ - ol.geom.MultiPoint, - ol.geom.MultiLineString - // TODO uncomment when implemented - // ,ol.geom.MultiPolygon - ]; - - /** - * @private - * @type {Array.} - */ - this.components_ = []; - - if (arguments.length === 1 && goog.isDef(components)) { - this.setComponents(components); - } -}; - -goog.inherits(ol.geom.Collection, ol.geom.Geometry); - -/** - * Sets the list of disallowed types for the collection. - * @param {Array.} typeBlacklist Array of constructors to disallow. - */ -ol.geom.Collection.prototype.setTypeBlacklist = function(typeBlacklist){ - this.typeBlacklist_ = typeBlacklist; -}; -/** - * Gets the list of disallowed types for the collection. - * @return {Array.} Array of constructors to disallow. - */ -ol.geom.Collection.prototype.getTypeBlacklist = function(){ - return this.typeBlacklist_; -}; - -/** - * Sets the list of always allowed types for the collection. - * @param {Array.} typeWhitelist Array of constructors to allow. - */ -ol.geom.Collection.prototype.setTypeWhitelist = function(typeWhitelist){ - this.typeWhitelist_ = typeWhitelist; -}; -/** - * Gets the list of always allowed types for the collection. - * @return {Array.} Array of constructors to allow. - */ -ol.geom.Collection.prototype.getTypeWhitelist = function(){ - return this.typeWhitelist_; -}; - - -/** - * Sets the Collection's components. - * - * @return {Array.} An array of components. - */ -ol.geom.Collection.prototype.getComponents = function() { - return this.components_; -}; - -/** - * Gets the Collection's components. - * - * @param {Array.} components An array of components. - */ -ol.geom.Collection.prototype.setComponents = function(components) { - var allValidTypes = goog.array.every( - components, - this.isAllowedComponent, - this - ); - if (allValidTypes) { - this.components_ = components; - } else { - var msg = 'ol.geom.Collection: at least one component passed to ' - + 'setComponents is not allowed.'; - ol.error(msg); - } -}; - -/** - * Adds the given component to the list of components at the specified index. - * - * @param {ol.geom.Geometry} component A component to be added. - * @param {number} index The index where to add. - */ -ol.geom.Collection.prototype.addComponent = function(component, index) { - if (this.isAllowedComponent(component)) { - goog.array.insertAt(this.components_, component, index); - } else { - var msg = 'ol.geom.Collection: component is not allowed to be added.'; - ol.error(msg); - } -}; - -/** - * Checks whether the passed component is an instance of any of the constructors - * listed in the passed list. - * - * @param {ol.geom.Geometry} component The component to check. - * @param {Array.} list The List of constructors to check the - * component against. - * - * @return {boolean} Whether the passed component is an instance of any of the - * constructors listed in the passed list. - * - * @private - */ -ol.geom.Collection.prototype.isOnList = function(component, list) { - var isOnList = !goog.array.every(list, function(listedConstr){ - if (component instanceof listedConstr) { - return false; - } else { - return true; - } - }); - return isOnList; -}; - -/** - * Checks whether the passed component is allowed according to the black and - * whitelists. - * - * @param {ol.geom.Geometry} component The component to check. - * @return {boolean} Whether the passed component is allowed as part of this - * collection according to black- and whitelist. - */ -ol.geom.Collection.prototype.isAllowedComponent = function(component){ - var whitelist = this.getTypeWhitelist(), - blacklist = this.getTypeBlacklist(), - isOnWhitelist = this.isOnList(component, whitelist), - isOnBlacklist = this.isOnList(component, blacklist); - return (isOnWhitelist || !isOnBlacklist); -}; - -/** - * Removes the given component from the list of components. - * - * @param {ol.geom.Geometry} component A component to be removed. - */ -ol.geom.Collection.prototype.removeComponent = function(component) { - goog.array.remove(this.components_, component); -}; - -/** - * Compute the centroid for this geometry collection. - * - * @returns {ol.geom.Point} The centroid of the collection. - */ -ol.geom.Collection.prototype.getCentroid = function() { - var components = this.getComponents(), - len = components.length, - sum_x = 0, sum_y = 0, - centroid = null; - if (len > 0) { - goog.array.forEach(components, function(component){ - var singleCentroid = component.getCentroid(); - if (goog.isDefAndNotNull(singleCentroid)) { - sum_x += singleCentroid.getX(); - sum_y += singleCentroid.getX(); - } else { - len--; - } - }); - centroid = new ol.geom.Point(sum_x / len, sum_y / len); - } - return centroid; -}; \ No newline at end of file diff --git a/attic/src/ol/geom/Geometry.js b/attic/src/ol/geom/Geometry.js deleted file mode 100644 index 2ed4420624..0000000000 --- a/attic/src/ol/geom/Geometry.js +++ /dev/null @@ -1,58 +0,0 @@ -goog.provide('ol.geom.Geometry'); - -goog.require('ol.geom.IGeometry'); -goog.require('ol.Bounds'); - -/** - * Creates ol.Geometry objects. - * - * @export - * @implements {ol.geom.IGeometry} - * @constructor - */ -ol.geom.Geometry = function() { - - /** - * @private - * @type {ol.Bounds|undefined} - */ - this.bounds_ = undefined; -}; - -/** - * @return {ol.Bounds|undefined} The ol.Bounds. - */ -ol.geom.Geometry.prototype.getBounds = function() { - return this.bounds_; -}; - -/** - * @param {ol.Bounds} bounds The new ol.Bounds. - * @return {ol.geom.Geometry} This. - */ -ol.geom.Geometry.prototype.setBounds = function(bounds) { - this.bounds_ = bounds; - return this; -}; - -/** - * Returns the centroid of the geometry. - * - * @returns {ol.geom.Point} The centroid of the geometry. - */ -ol.geom.Geometry.prototype.getCentroid = function() { - // throw an error to enforce subclasses to implement it properly - ol.error('ol.geom.Geometry: getCentroid must be implemented by subclasses'); - return null; -}; - -/** - * Returns the area of the geometry. - * - * @returns {number} The area of the geometry. - */ -ol.geom.Geometry.prototype.getArea = function() { - // throw an error to enforce subclasses to implement it properly - ol.error('ol.geom.Geometry: getArea must be implemented by subclasses'); - return 0; -}; diff --git a/attic/src/ol/geom/IGeometry.js b/attic/src/ol/geom/IGeometry.js deleted file mode 100644 index 2245be339c..0000000000 --- a/attic/src/ol/geom/IGeometry.js +++ /dev/null @@ -1,27 +0,0 @@ -goog.provide('ol.geom.IGeometry'); - -//goog.require('ol.geom.Point'); -//goog.require('ol.Bounds'); - -/** - * Interface for geometry classes forcing ol.geom.* classes to implement - * expected functionality. - * - * @interface - */ -ol.geom.IGeometry = function(){}; - -/** - * @return {ol.geom.Point} The centroid of the geometry. - */ -ol.geom.IGeometry.prototype.getCentroid = function(){}; - -/** - * @return {ol.Bounds|undefined} The centroid of the geometry. - */ -ol.geom.IGeometry.prototype.getBounds = function(){}; - -/** - * @return {number} The area of the geometry. - */ -ol.geom.IGeometry.prototype.getArea = function(){}; \ No newline at end of file diff --git a/attic/src/ol/geom/LineString.js b/attic/src/ol/geom/LineString.js deleted file mode 100644 index 23f6e8eb0c..0000000000 --- a/attic/src/ol/geom/LineString.js +++ /dev/null @@ -1,76 +0,0 @@ -goog.provide('ol.geom.LineString'); - -goog.require('goog.array'); -goog.require('ol.geom.Geometry'); -goog.require('ol.geom.Collection'); -goog.require('ol.geom.Point'); -goog.require('ol.Projection'); - -/** - * Creates ol.geom.LineString objects. - * - * @export - * @extends {ol.geom.Geometry} - * @param {Array.} vertices An array of points building the - * linestrings vertices. - * - * @constructor - */ -ol.geom.LineString = function(vertices) { - /** - * @private - * @type {Array.} - */ - this.vertices_ = vertices; - -}; - -goog.inherits(ol.geom.LineString, ol.geom.Geometry); - -/** - * Sets the LineString's points. - * - * @return {Array.} An array of points. - */ -ol.geom.LineString.prototype.getVertices = function() { - return this.vertices_; -}; - -/** - * Gets the LineString's points. - * - * @param {Array.} vertices An array of points. - */ -ol.geom.LineString.prototype.setVertices = function(vertices) { - this.vertices_ = vertices; -}; - -/** - * Adds the given vertex to the list of vertices at the specified index. - * - * @param {ol.geom.Point} vertex A point to be added. - * @param {number} index The index where to add. - */ -ol.geom.LineString.prototype.addVertex = function(vertex, index) { - goog.array.insertAt(this.vertices_,vertex,index); -}; - -/** - * Removes the given vertex from the list of vertices. - * - * @param {ol.geom.Point} vertex A point to be removed. - */ -ol.geom.LineString.prototype.removeVertex = function(vertex) { - goog.array.remove(this.vertices_, vertex); -}; - -/** - * Compute the centroid for this linestring. - * - * @returns {ol.geom.Point} The centroid of the linestring. - */ -ol.geom.LineString.prototype.getCentroid = function() { - var vertices = this.getVertices(), - collection = new ol.geom.Collection(vertices); - return collection.getCentroid(); -}; \ No newline at end of file diff --git a/attic/src/ol/geom/MultiLineString.js b/attic/src/ol/geom/MultiLineString.js deleted file mode 100644 index 4541a1a176..0000000000 --- a/attic/src/ol/geom/MultiLineString.js +++ /dev/null @@ -1,61 +0,0 @@ -goog.provide('ol.geom.MultiLineString'); - -goog.require('goog.array'); -goog.require('ol.geom.Collection'); - -/** - * Creates ol.geom.MultiLineString objects. - * - * @export - * @extends {ol.geom.Collection} - * @param {Array.} linestrings An array of linestrings. - * - * @constructor - */ -ol.geom.MultiLineString = function(linestrings) { - this.setTypeWhitelist([ol.geom.LineString]); - this.setTypeBlacklist([ol.geom.Geometry]); - if (arguments.length === 1 && goog.isDef(linestrings)) { - this.setLineStrings(linestrings); - } - -}; - -goog.inherits(ol.geom.MultiLineString, ol.geom.Collection); - -/** - * Gets the MultiLineString's linestrings. - * - * @return {Array.} An array of linestrings. - */ -ol.geom.MultiLineString.prototype.getLineStrings = function() { - return this.getComponents(); -}; - -/** - * Sets the MultiLineString's linestrings. - * - * @param {Array.} linestrings An array of linestrings. - */ -ol.geom.MultiLineString.prototype.setLineStrings = function(linestrings) { - this.setComponents(linestrings); -}; - -/** - * Adds the given linestring to the list of linestrings at the specified index. - * - * @param {ol.geom.LineString} linestring A linestring to be added. - * @param {number} index The index where to add. - */ -ol.geom.MultiLineString.prototype.addLineString = function(linestring, index) { - this.addComponent(linestring, index); -}; - -/** - * Removes the given linestring from the list of linestrings. - * - * @param {ol.geom.LineString} linestring A linestring to be removed. - */ -ol.geom.MultiLineString.prototype.removeLineString = function(linestring) { - this.removeComponent(linestring); -}; diff --git a/attic/src/ol/geom/MultiPoint.js b/attic/src/ol/geom/MultiPoint.js deleted file mode 100644 index 31db595017..0000000000 --- a/attic/src/ol/geom/MultiPoint.js +++ /dev/null @@ -1,61 +0,0 @@ -goog.provide('ol.geom.MultiPoint'); - -goog.require('goog.array'); -goog.require('ol.geom.Collection'); - -/** - * Creates ol.geom.MultiPoint objects. - * - * @export - * @extends {ol.geom.Collection} - * @param {Array.} points An array of points. - * - * @constructor - */ -ol.geom.MultiPoint = function(points) { - this.setTypeWhitelist([ol.geom.Point]); - this.setTypeBlacklist([ol.geom.Geometry]); - if (arguments.length === 1 && goog.isDef(points)) { - this.setPoints(points); - } - -}; - -goog.inherits(ol.geom.MultiPoint, ol.geom.Collection); - -/** - * Sets the MultiPoint's points. - * - * @return {Array.} An array of points. - */ -ol.geom.MultiPoint.prototype.getPoints = function() { - return this.getComponents(); -}; - -/** - * Gets the MultiPoint's points. - * - * @param {Array.} points An array of points. - */ -ol.geom.MultiPoint.prototype.setPoints = function(points) { - this.setComponents(points); -}; - -/** - * Adds the given point to the list of points at the specified index. - * - * @param {ol.geom.Point} point A point to be added. - * @param {number} index The index where to add. - */ -ol.geom.MultiPoint.prototype.addPoint = function(point, index) { - this.addComponent(point, index); -}; - -/** - * Removes the given point from the list of points. - * - * @param {ol.geom.Point} point A point to be removed. - */ -ol.geom.MultiPoint.prototype.removePoint = function(point) { - this.removeComponent(point); -}; diff --git a/attic/src/ol/geom/Point.js b/attic/src/ol/geom/Point.js deleted file mode 100644 index c1471b3809..0000000000 --- a/attic/src/ol/geom/Point.js +++ /dev/null @@ -1,163 +0,0 @@ -goog.provide('ol.geom.Point'); - -goog.require('ol.geom.Geometry'); - -goog.require('ol.Projection'); -goog.require('ol.coord.AccessorInterface'); -goog.require('ol.base'); - -/** - * Creates ol.geom.Point objects. - * - * @export - * @extends {ol.geom.Geometry} - * @param {number} x X. - * @param {number} y Y. - * @param {number=} opt_z Z. - * @param {ol.Projection=} opt_projection Projection. - * - * @implements {ol.coord.AccessorInterface} - * - * @constructor - */ -ol.geom.Point = function(x, y, opt_z, opt_projection) { - /** - * @private - * @type {number} - */ - this.x_ = x; - - /** - * @private - * @type {number} - */ - this.y_ = y; - - /** - * @private - * @type {number|undefined} - */ - this.z_ = opt_z; - - /** - * @private - * @type {ol.Projection} - */ - this.projection_ = goog.isDef(opt_projection) ? opt_projection : null; -}; - -goog.inherits(ol.geom.Point, ol.geom.Geometry); - -/** - * @return {number} X. - */ -ol.geom.Point.prototype.getX = function() { - return this.x_; -}; - - -/** - * @return {number} Y. - */ -ol.geom.Point.prototype.getY = function() { - return this.y_; -}; - - -/** - * @return {number|undefined} Z. - */ -ol.geom.Point.prototype.getZ = function() { - return this.z_; -}; - -/** - * @return {ol.Projection|undefined} Projection. - */ -ol.geom.Point.prototype.getProjection = function() { - return this.projection_; -}; - -/** - * @param {ol.Projection} projection Projection. - */ -ol.geom.Point.prototype.setProjection = function(projection) { - this.projection_ = projection; -}; - -/** - * @param {number} x X. - */ -ol.geom.Point.prototype.setX = function(x) { - this.x_ = x; -}; - - -/** - * @param {number} y Y. - */ -ol.geom.Point.prototype.setY = function(y) { - this.y_ = y; -}; - - -/** - * @param {number|undefined} z Z. - */ -ol.geom.Point.prototype.setZ = function(z) { - this.z_ = z; -}; - -/** - * Transform this point to another coordinate reference system. This - * requires that this point has a projection set already (if not, an error - * will be thrown). Returns a new point object and does not modify this - * point. - * - * @param {string|!ol.Projection} proj The destination projection. Can be - * supplied as a projection instance of a string identifier. - * @returns {!ol.geom.Point} A new location. - */ -ol.geom.Point.prototype.transform = function(proj) { - if (goog.isString(proj)) { - proj = new ol.Projection(proj); - } - return this._transform(proj); -}; - -/** - * Transform this point to a new location given a projection object. - * - * @param {!ol.Projection} proj The destination projection. - * @returns {!ol.geom.Point} - * @private - */ -ol.geom.Point.prototype._transform = function(proj) { - var point = {'x': this.x_, 'y': this.y_}; - var sourceProj = this.projection_; - if (!goog.isDefAndNotNull(sourceProj)) { - var msg = 'Cannot transform a point without a source projection.'; - ol.error(msg); - } - ol.Projection.transform(point, sourceProj, proj); - - return new ol.geom.Point(point['x'], point['y'], this.z_, proj); -}; - -/** - * Returns the centroid of the point. - * - * @returns {ol.geom.Point} The centroid of the point. - */ -ol.geom.Point.prototype.getCentroid = function() { - return new ol.geom.Point(this.x_, this.y_, this.z_, this.projection_); -}; - -/** - * Returns the area of the geometry whcih is always 0. - * - * @returns {number} The area of the point (always 0). - */ -ol.geom.Point.prototype.getArea = function() { - return 0; -}; diff --git a/attic/src/ol/layer/WMS.js b/attic/src/ol/layer/WMS.js deleted file mode 100644 index d3187183f9..0000000000 --- a/attic/src/ol/layer/WMS.js +++ /dev/null @@ -1,74 +0,0 @@ -goog.provide('ol.layer.WMS'); - -goog.require('goog.Uri'); -goog.require('ol.layer.TileLayer'); - -/** - * Class for WMS layers. - * - * @export - * @constructor - * @extends {ol.layer.TileLayer} - * @param {string} url The WMS URL. - * @param {Array.} layers List of layers. - * @param {string|undefined} format Image format (e.g. "image/jpeg") - */ -ol.layer.WMS = function(url, layers, format) { - goog.base(this); - this.setUrl(url); - - /** - * @private - * @type {Array.} - */ - this.layers_ = layers; - - /** - * @private - * @type {string|undefined} - */ - this.format_ = format; -}; - -goog.inherits(ol.layer.WMS, ol.layer.TileLayer); - -/** - * @const - * @type {Object} - */ -ol.layer.WMS.prototype.DEFAULT_PARAMS = { - "SERVICE": "WMS", - "VERSION": "1.1.1", - "REQUEST": "GetMap", - "STYLES": "", - "FORMAT": "image/png" -}; - -/** - * @inheritDoc - */ -ol.layer.WMS.prototype.getTileUrl = function(x, y, z) { - var tileOrigin = this.getTileOrigin(), - tileOriginX = tileOrigin[0], - tileOriginY = tileOrigin[1]; - var resolution = this.getResolutions()[z]; - var tileWidth = this.tileWidth_ * resolution, - tileHeight = this.tileHeight_ * resolution; - var minX = tileOriginX + (x * tileWidth), - maxY = tileOriginY - (y * tileHeight), - maxX = minX + tileWidth, - minY = maxY - tileHeight; - - var qd = new goog.Uri.QueryData(); - qd.extend(this.DEFAULT_PARAMS); - qd.set('WIDTH', this.tileWidth_); - qd.set('HEIGHT', this.tileHeight_); - qd.set('BBOX', [minX, minY, maxX, maxY].join(',')); - qd.set('LAYERS', [this.layers_].join(',')); - // FIXME this requires a projection in the layer, which should - // not be required - qd.set('SRS', this.projection_.getCode()); - var uri = new goog.Uri(this.getUrl()); - uri.setQueryData(qd); - return uri.toString(); -};