Merge pull request #210 from elemoine/imageattribution

Image layer support to attribution control
This commit is contained in:
Éric Lemoine
2013-02-19 07:49:43 -08:00
9 changed files with 96 additions and 42 deletions

View File

@@ -1,5 +1,4 @@
// FIXME handle date line wrap // FIXME handle date line wrap
// FIXME does not handle image sources
goog.provide('ol.control.Attribution'); goog.provide('ol.control.Attribution');
@@ -10,11 +9,12 @@ goog.require('goog.events');
goog.require('goog.object'); goog.require('goog.object');
goog.require('goog.style'); goog.require('goog.style');
goog.require('ol.Attribution'); goog.require('ol.Attribution');
goog.require('ol.FrameState');
goog.require('ol.MapEvent'); goog.require('ol.MapEvent');
goog.require('ol.MapEventType'); goog.require('ol.MapEventType');
goog.require('ol.TileRange'); goog.require('ol.TileRange');
goog.require('ol.control.Control'); goog.require('ol.control.Control');
goog.require('ol.source.TileSource'); goog.require('ol.source.Source');
@@ -66,16 +66,46 @@ ol.control.Attribution = function(attributionOptions) {
goog.inherits(ol.control.Attribution, ol.control.Control); goog.inherits(ol.control.Attribution, ol.control.Control);
/**
* @param {?Object.<string, Object.<string, ol.TileRange>>} usedTiles Used
* tiles.
* @param {Object.<string, ol.source.Source>} sources Sources.
* @return {Object.<string, ol.Attribution>} Attributions.
*/
ol.control.Attribution.prototype.getTileSourceAttributions =
function(usedTiles, sources) {
/** @type {Object.<string, ol.Attribution>} */
var attributions = {};
var i, tileRanges, tileSource, tileSourceAttribution,
tileSourceAttributionKey, tileSourceAttributions, tileSourceKey, z;
for (tileSourceKey in usedTiles) {
goog.asserts.assert(tileSourceKey in sources);
tileSource = sources[tileSourceKey];
tileSourceAttributions = tileSource.getAttributions();
if (goog.isNull(tileSourceAttributions)) {
continue;
}
tileRanges = usedTiles[tileSourceKey];
for (i = 0; i < tileSourceAttributions.length; ++i) {
tileSourceAttribution = tileSourceAttributions[i];
tileSourceAttributionKey = goog.getUid(tileSourceAttribution).toString();
if (tileSourceAttributionKey in attributions) {
continue;
}
if (tileSourceAttribution.intersectsAnyTileRange(tileRanges)) {
attributions[tileSourceAttributionKey] = tileSourceAttribution;
}
}
}
return attributions;
};
/** /**
* @param {ol.MapEvent} mapEvent Map event. * @param {ol.MapEvent} mapEvent Map event.
*/ */
ol.control.Attribution.prototype.handleMapPostrender = function(mapEvent) { ol.control.Attribution.prototype.handleMapPostrender = function(mapEvent) {
var frameState = mapEvent.frameState; this.updateElement_(mapEvent.frameState);
if (goog.isNull(frameState)) {
this.updateElement_(null);
} else {
this.updateElement_(frameState.usedTiles);
}
}; };
@@ -99,12 +129,11 @@ ol.control.Attribution.prototype.setMap = function(map) {
/** /**
* @private * @private
* @param {?Object.<string, Object.<string, ol.TileRange>>} usedTiles Used * @param {?ol.FrameState} frameState Frame state.
* tiles.
*/ */
ol.control.Attribution.prototype.updateElement_ = function(usedTiles) { ol.control.Attribution.prototype.updateElement_ = function(frameState) {
if (goog.isNull(usedTiles)) { if (goog.isNull(frameState)) {
if (this.renderedVisible_) { if (this.renderedVisible_) {
goog.style.showElement(this.element, false); goog.style.showElement(this.element, false);
this.renderedVisible_ = false; this.renderedVisible_ = false;
@@ -116,15 +145,13 @@ ol.control.Attribution.prototype.updateElement_ = function(usedTiles) {
/** @type {Object.<string, boolean>} */ /** @type {Object.<string, boolean>} */
var attributionsToRemove = {}; var attributionsToRemove = {};
/** @type {Object.<string, ol.source.TileSource>} */ /** @type {Object.<string, ol.source.Source>} */
var tileSources = {}; var sources = {};
var layers = map.getLayers(); var layers = map.getLayers();
if (goog.isDef(layers)) { if (goog.isDef(layers)) {
layers.forEach(function(layer) { layers.forEach(function(layer) {
var source = layer.getSource(); var source = layer.getSource();
if (source instanceof ol.source.TileSource) { sources[goog.getUid(source).toString()] = source;
tileSources[goog.getUid(source).toString()] = source;
}
var attributions = source.getAttributions(); var attributions = source.getAttributions();
if (!goog.isNull(attributions)) { if (!goog.isNull(attributions)) {
var attribution, i; var attribution, i;
@@ -138,34 +165,16 @@ ol.control.Attribution.prototype.updateElement_ = function(usedTiles) {
} }
/** @type {Object.<string, ol.Attribution>} */ /** @type {Object.<string, ol.Attribution>} */
var attributions = {}; var attributions = goog.object.clone(frameState.attributions);
var i, tileRanges, tileSource, tileSourceAttribution, var tileSourceAttributions = this.getTileSourceAttributions(
tileSourceAttributionKey, tileSourceAttributions, tileSourceKey, z; frameState.usedTiles, sources);
for (tileSourceKey in usedTiles) { goog.object.extend(attributions, tileSourceAttributions);
goog.asserts.assert(tileSourceKey in tileSources);
tileSource = tileSources[tileSourceKey];
tileSourceAttributions = tileSource.getAttributions();
if (goog.isNull(tileSourceAttributions)) {
continue;
}
tileRanges = usedTiles[tileSourceKey];
for (i = 0; i < tileSourceAttributions.length; ++i) {
tileSourceAttribution = tileSourceAttributions[i];
tileSourceAttributionKey = goog.getUid(tileSourceAttribution).toString();
if (tileSourceAttributionKey in attributions) {
continue;
}
if (tileSourceAttribution.intersectsAnyTileRange(tileRanges)) {
attributions[tileSourceAttributionKey] = tileSourceAttribution;
}
}
}
/** @type {Array.<number>} */ /** @type {Array.<number>} */
var attributionKeys = var attributionKeys =
goog.array.map(goog.object.getKeys(attributions), Number); goog.array.map(goog.object.getKeys(attributions), Number);
goog.array.sort(attributionKeys); goog.array.sort(attributionKeys);
var attributionElement, attributionKey; var i, attributionElement, attributionKey;
for (i = 0; i < attributionKeys.length; ++i) { for (i = 0; i < attributionKeys.length; ++i) {
attributionKey = attributionKeys[i].toString(); attributionKey = attributionKeys[i].toString();
if (attributionKey in this.attributionElements_) { if (attributionKey in this.attributionElements_) {

View File

@@ -6,6 +6,7 @@ goog.provide('ol.PostRenderFunction');
goog.provide('ol.PreRenderFunction'); goog.provide('ol.PreRenderFunction');
goog.require('goog.vec.Mat4'); goog.require('goog.vec.Mat4');
goog.require('ol.Attribution');
goog.require('ol.Color'); goog.require('ol.Color');
goog.require('ol.Extent'); goog.require('ol.Extent');
goog.require('ol.Size'); goog.require('ol.Size');
@@ -18,6 +19,7 @@ goog.require('ol.layer.LayerState');
/** /**
* @typedef {{animate: boolean, * @typedef {{animate: boolean,
* attributions: Object.<string, ol.Attribution>,
* backgroundColor: ol.Color, * backgroundColor: ol.Color,
* coordinateToPixelMatrix: goog.vec.Mat4.Number, * coordinateToPixelMatrix: goog.vec.Mat4.Number,
* extent: (null|ol.Extent), * extent: (null|ol.Extent),

View File

@@ -5,6 +5,7 @@ goog.require('goog.array');
goog.require('goog.events'); goog.require('goog.events');
goog.require('goog.events.EventTarget'); goog.require('goog.events.EventTarget');
goog.require('goog.events.EventType'); goog.require('goog.events.EventType');
goog.require('ol.Attribution');
goog.require('ol.Extent'); goog.require('ol.Extent');
@@ -27,8 +28,15 @@ ol.ImageState = {
* @param {number} resolution Resolution. * @param {number} resolution Resolution.
* @param {string} src Image source URI. * @param {string} src Image source URI.
* @param {?string} crossOrigin Cross origin. * @param {?string} crossOrigin Cross origin.
* @param {Array.<ol.Attribution>} attributions Attributions.
*/ */
ol.Image = function(extent, resolution, src, crossOrigin) { ol.Image = function(extent, resolution, src, crossOrigin, attributions) {
/**
* @private
* @type {Array.<ol.Attribution>}
*/
this.attributions_ = attributions;
/** /**
* @private * @private
@@ -86,6 +94,14 @@ ol.Image.prototype.dispatchChangeEvent = function() {
}; };
/**
* @return {Array.<ol.Attribution>} Attributions.
*/
ol.Image.prototype.getAttributions = function() {
return this.attributions_;
};
/** /**
* @return {ol.Extent} Extent. * @return {ol.Extent} Extent.
*/ */

View File

@@ -664,6 +664,7 @@ ol.Map.prototype.renderFrame_ = function(time) {
var view2DState = view2D.getView2DState(); var view2DState = view2D.getView2DState();
frameState = { frameState = {
animate: false, animate: false,
attributions: {},
backgroundColor: goog.isDef(backgroundColor) ? backgroundColor: goog.isDef(backgroundColor) ?
backgroundColor : new ol.Color(255, 255, 255, 1), backgroundColor : new ol.Color(255, 255, 255, 1),
coordinateToPixelMatrix: this.coordinateToPixelMatrix_, coordinateToPixelMatrix: this.coordinateToPixelMatrix_,

View File

@@ -94,6 +94,7 @@ ol.renderer.canvas.ImageLayer.prototype.renderFrame =
if (!goog.isNull(this.image_)) { if (!goog.isNull(this.image_)) {
image = this.image_; image = this.image_;
var imageExtent = image.getExtent(); var imageExtent = image.getExtent();
var imageResolution = image.getResolution(); var imageResolution = image.getResolution();
var transform = this.transform_; var transform = this.transform_;
@@ -111,5 +112,7 @@ ol.renderer.canvas.ImageLayer.prototype.renderFrame =
(imageExtent.minX - viewCenter.x) / imageResolution, (imageExtent.minX - viewCenter.x) / imageResolution,
(viewCenter.y - imageExtent.maxY) / imageResolution, (viewCenter.y - imageExtent.maxY) / imageResolution,
0); 0);
this.updateAttributions(frameState.attributions, image.getAttributions());
} }
}; };

View File

@@ -106,6 +106,8 @@ ol.renderer.dom.ImageLayer.prototype.renderFrame =
this.image_ = image; this.image_ = image;
} }
this.setTransform(transform); this.setTransform(transform);
this.updateAttributions(frameState.attributions, image.getAttributions());
} }
}; };

View File

@@ -2,6 +2,7 @@ goog.provide('ol.renderer.Layer');
goog.require('goog.events'); goog.require('goog.events');
goog.require('goog.events.EventType'); goog.require('goog.events.EventType');
goog.require('ol.Attribution');
goog.require('ol.FrameState'); goog.require('ol.FrameState');
goog.require('ol.Image'); goog.require('ol.Image');
goog.require('ol.ImageState'); goog.require('ol.ImageState');
@@ -201,6 +202,23 @@ ol.renderer.Layer.prototype.scheduleExpireCache =
}; };
/**
* @protected
* @param {Object.<string, ol.Attribution>} attributionsSet Attributions
* set (target).
* @param {Array.<ol.Attribution>} attributions Attributions (source).
*/
ol.renderer.Layer.prototype.updateAttributions =
function(attributionsSet, attributions) {
var i;
var attribution;
for (i = 0; i < attributions.length; ++i) {
attribution = attributions[i];
attributionsSet[goog.getUid(attribution).toString()] = attribution;
}
};
/** /**
* @protected * @protected
* @param {Object.<string, Object.<string, ol.TileRange>>} usedTiles Used tiles. * @param {Object.<string, Object.<string, ol.TileRange>>} usedTiles Used tiles.

View File

@@ -198,6 +198,8 @@ ol.renderer.webgl.ImageLayer.prototype.renderFrame =
this.image_ = image; this.image_ = image;
this.texture_ = texture; this.texture_ = texture;
this.updateAttributions(frameState.attributions, image.getAttributions());
} }
}; };

View File

@@ -84,7 +84,8 @@ ol.source.ImageSource.prototype.createImage =
var imageUrl = this.imageUrlFunction(extent, size); var imageUrl = this.imageUrlFunction(extent, size);
if (goog.isDef(imageUrl)) { if (goog.isDef(imageUrl)) {
image = new ol.Image( image = new ol.Image(
extent, resolution, imageUrl, this.crossOrigin_); extent, resolution, imageUrl, this.crossOrigin_,
this.getAttributions());
} }
return image; return image;
}; };