diff --git a/examples/geolocation.js b/examples/geolocation.js
index 99b4fcfcdb..e3b1263130 100644
--- a/examples/geolocation.js
+++ b/examples/geolocation.js
@@ -37,9 +37,9 @@ geolocation.on('change', function() {
});
var marker = new ol.Overlay({
- map: map,
element: /** @type {Element} */ ($('').addClass('icon-flag').get(0))
});
+map.addOverlay(marker);
// bind the marker position to the device location.
marker.bindTo('position', geolocation);
diff --git a/examples/icon.js b/examples/icon.js
index a2c2918f55..071dd10a16 100644
--- a/examples/icon.js
+++ b/examples/icon.js
@@ -63,9 +63,9 @@ var map = new ol.Map({
var element = document.getElementById('popup');
var popup = new ol.Overlay({
- map: map,
element: element
});
+map.addOverlay(popup);
map.on('click', function(evt) {
diff --git a/examples/overlay.js b/examples/overlay.js
index 8e44805f77..bd052fc983 100644
--- a/examples/overlay.js
+++ b/examples/overlay.js
@@ -24,17 +24,18 @@ var map = new ol.Map({
// Vienna label
var vienna = new ol.Overlay({
- map: map,
position: ol.proj.transform(
[16.3725, 48.208889], 'EPSG:4326', 'EPSG:3857'),
element: document.getElementById('vienna')
});
+map.addOverlay(vienna);
// Popup showing the position the user clicked
var popup = new ol.Overlay({
- map: map,
element: document.getElementById('popup')
});
+map.addOverlay(popup);
+
map.on('click', function(evt) {
var element = popup.getElement();
var coordinate = evt.getCoordinate();
diff --git a/examples/popup.js b/examples/popup.js
index f291751b8b..bc002694c0 100644
--- a/examples/popup.js
+++ b/examples/popup.js
@@ -7,24 +7,6 @@ goog.require('ol.proj');
goog.require('ol.source.TileJSON');
-var layer = new ol.layer.TileLayer({
- source: new ol.source.TileJSON({
- url: 'http://api.tiles.mapbox.com/v3/' +
- 'mapbox.natural-earth-hypso-bathy.jsonp',
- crossOrigin: 'anonymous'
- })
-});
-
-var map = new ol.Map({
- layers: [layer],
- target: 'map',
- view: new ol.View2D({
- center: [0, 0],
- zoom: 2
- })
-});
-
-
/**
* Elements that make up the popup.
*/
@@ -48,11 +30,32 @@ closer.onclick = function() {
* Create an overlay to anchor the popup to the map.
*/
var overlay = new ol.Overlay({
- map: map,
element: container
});
+/**
+ * Create the map.
+ */
+var map = new ol.Map({
+ layers: [
+ new ol.layer.TileLayer({
+ source: new ol.source.TileJSON({
+ url: 'http://api.tiles.mapbox.com/v3/' +
+ 'mapbox.natural-earth-hypso-bathy.jsonp',
+ crossOrigin: 'anonymous'
+ })
+ })
+ ],
+ overlays: [overlay],
+ target: 'map',
+ view: new ol.View2D({
+ center: [0, 0],
+ zoom: 2
+ })
+});
+
+
/**
* Add a click handler to the map to render the popup.
*/
diff --git a/src/objectliterals.jsdoc b/src/objectliterals.jsdoc
index 208f3d51f1..4265022b8c 100644
--- a/src/objectliterals.jsdoc
+++ b/src/objectliterals.jsdoc
@@ -54,6 +54,8 @@
* Controls initially added to the map.
* @property {ol.Collection|undefined} interactions Interactions.
* @property {Array.
|ol.Collection|undefined} layers Layers.
+ * @property {ol.Collection|Array.|undefined} overlays
+ * Overlays initially added to the map.
* @property {ol.RendererHint|undefined} renderer Renderer.
* @property {Array.|undefined} renderers Renderers.
* @property {Element|string|undefined} target The container for the map.
@@ -65,7 +67,6 @@
* Object literal with config options for the overlay.
* @typedef {Object} ol.OverlayOptions
* @property {Element|undefined} element The overlay element.
- * @property {ol.Map|undefined} map The map to overlay onto.
* @property {ol.Coordinate|undefined} position The overlay position in map
* projection.
* @property {ol.OverlayPositioning|undefined} positioning Positioning.
diff --git a/src/ol/map.exports b/src/ol/map.exports
index 7627017c2d..b6e7c8c4c6 100644
--- a/src/ol/map.exports
+++ b/src/ol/map.exports
@@ -1,6 +1,7 @@
@exportClass ol.Map ol.MapOptions
@exportProperty ol.Map.prototype.addControl
@exportProperty ol.Map.prototype.addLayer
+@exportProperty ol.Map.prototype.addOverlay
@exportProperty ol.Map.prototype.addPreRenderFunction
@exportProperty ol.Map.prototype.addPreRenderFunctions
@exportProperty ol.Map.prototype.getControls
@@ -8,9 +9,11 @@
@exportProperty ol.Map.prototype.getFeatures
@exportProperty ol.Map.prototype.getInteractions
@exportProperty ol.Map.prototype.getLayers
+@exportProperty ol.Map.prototype.getOverlays
@exportProperty ol.Map.prototype.getRenderer
@exportProperty ol.Map.prototype.removeControl
@exportProperty ol.Map.prototype.removeLayer
+@exportProperty ol.Map.prototype.removeOverlay
@exportProperty ol.Map.prototype.updateSize
@exportSymbol ol.RendererHint
diff --git a/src/ol/map.js b/src/ol/map.js
index b53816656c..dcddb06c72 100644
--- a/src/ol/map.js
+++ b/src/ol/map.js
@@ -264,6 +264,12 @@ ol.Map = function(options) {
*/
this.interactions_ = optionsInternal.interactions;
+ /**
+ * @type {ol.Collection}
+ * @private
+ */
+ this.overlays_ = optionsInternal.overlays;
+
/**
* @type {ol.renderer.Map}
* @private
@@ -334,6 +340,14 @@ ol.Map = function(options) {
control.setMap(this);
}, this);
+ this.overlays_.forEach(
+ /**
+ * @param {ol.Overlay} overlay Overlay.
+ */
+ function(overlay) {
+ overlay.setMap(this);
+ }, this);
+
};
goog.inherits(ol.Map, ol.Object);
@@ -361,6 +375,18 @@ ol.Map.prototype.addLayer = function(layer) {
};
+/**
+ * Add the given overlay to the map.
+ * @param {ol.Overlay} overlay Overlay.
+ */
+ol.Map.prototype.addOverlay = function(overlay) {
+ var overlays = this.getOverlays();
+ goog.asserts.assert(goog.isDef(overlays));
+ overlays.push(overlay);
+ overlay.setMap(this);
+};
+
+
/**
* Add a prerender function. This can be used for attaching animations to
* be performed before setting the map's center. The {@link ol.animation}
@@ -459,6 +485,14 @@ ol.Map.prototype.getControls = function() {
};
+/**
+ * @return {ol.Collection} Overlays.
+ */
+ol.Map.prototype.getOverlays = function() {
+ return this.overlays_;
+};
+
+
/**
* Get feature information for a pixel on the map.
*
@@ -854,6 +888,23 @@ ol.Map.prototype.removeLayer = function(layer) {
};
+/**
+ * Remove the given overlay from the map.
+ * @param {ol.Overlay} overlay Overlay.
+ * @return {ol.Overlay|undefined} The removed overlay of undefined
+ * if the overlay was not found.
+ */
+ol.Map.prototype.removeOverlay = function(overlay) {
+ var overlays = this.getOverlays();
+ goog.asserts.assert(goog.isDef(overlays));
+ if (goog.isDef(overlays.remove(overlay))) {
+ overlay.setMap(null);
+ return overlay;
+ }
+ return undefined;
+};
+
+
/**
* @param {number} time Time.
* @private
@@ -1042,6 +1093,7 @@ ol.Map.prototype.withFrozenRendering = function(f, opt_obj) {
/**
* @typedef {{controls: ol.Collection,
* interactions: ol.Collection,
+ * overlays: ol.Collection,
* rendererConstructor:
* function(new: ol.renderer.Map, Element, ol.Map),
* values: Object.}}
@@ -1123,9 +1175,22 @@ ol.Map.createOptionsInternal = function(options) {
var interactions = goog.isDef(options.interactions) ?
options.interactions : ol.interaction.defaults();
+ var overlays;
+ if (goog.isDef(options.overlays)) {
+ if (goog.isArray(options.overlays)) {
+ overlays = new ol.Collection(goog.array.clone(options.overlays));
+ } else {
+ goog.asserts.assertInstanceof(options.overlays, ol.Collection);
+ overlays = options.overlays;
+ }
+ } else {
+ overlays = new ol.Collection();
+ }
+
return {
controls: controls,
interactions: interactions,
+ overlays: overlays,
rendererConstructor: rendererConstructor,
values: values
};
diff --git a/src/ol/overlay.js b/src/ol/overlay.js
index c7cfc15e9a..c232f1ed11 100644
--- a/src/ol/overlay.js
+++ b/src/ol/overlay.js
@@ -42,7 +42,6 @@ ol.OverlayPositioning = {
* Example:
*
* var popup = new ol.Overlay({
- * map: map,
* element: document.getElementById('popup')
* });
* popup.setPosition(coordinate);
@@ -110,9 +109,6 @@ ol.Overlay = function(options) {
if (goog.isDef(options.positioning)) {
this.setPositioning(options.positioning);
}
- if (goog.isDef(options.map)) {
- this.setMap(options.map);
- }
};
goog.inherits(ol.Overlay, ol.Object);