Merge pull request #2164 from oterral/sprite

Allow the use of sprite image in KML
This commit is contained in:
Éric Lemoine
2014-06-05 14:23:56 +02:00
7 changed files with 287 additions and 53 deletions

View File

@@ -27,8 +27,8 @@ goog.require('ol.geom.Polygon');
goog.require('ol.proj');
goog.require('ol.style.Fill');
goog.require('ol.style.Icon');
goog.require('ol.style.IconAnchorOrigin');
goog.require('ol.style.IconAnchorUnits');
goog.require('ol.style.IconOrigin');
goog.require('ol.style.Image');
goog.require('ol.style.Stroke');
goog.require('ol.style.Style');
@@ -413,10 +413,6 @@ ol.format.KML.readStyleMapValue_ = function(node, objectStack) {
ol.format.KML.IconStyleParser_ = function(node, objectStack) {
goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT);
goog.asserts.assert(node.localName == 'IconStyle');
// FIXME gx:x
// FIXME gx:y
// FIXME gx:w
// FIXME gx:h
// FIXME refreshMode
// FIXME refreshInterval
// FIXME viewRefreshTime
@@ -456,6 +452,24 @@ ol.format.KML.IconStyleParser_ = function(node, objectStack) {
anchorYUnits = ol.style.IconAnchorUnits.FRACTION;
}
var offset;
var x = /** @type {number|undefined} */
(goog.object.get(IconObject, 'x'));
var y = /** @type {number|undefined} */
(goog.object.get(IconObject, 'y'));
if (goog.isDef(x) && goog.isDef(y)) {
offset = [x, y];
}
var size;
var w = /** @type {number|undefined} */
(goog.object.get(IconObject, 'w'));
var h = /** @type {number|undefined} */
(goog.object.get(IconObject, 'h'));
if (goog.isDef(w) && goog.isDef(h)) {
size = [w, h];
}
var rotation;
var heading = /** @type {number|undefined} */
(goog.object.get(object, 'heading'));
@@ -465,17 +479,18 @@ ol.format.KML.IconStyleParser_ = function(node, objectStack) {
var scale = /** @type {number|undefined} */
(goog.object.get(object, 'scale'));
var size;
if (src == ol.format.KML.DEFAULT_IMAGE_STYLE_SRC_) {
size = ol.format.KML.DEFAULT_IMAGE_STYLE_SIZE_;
}
var imageStyle = new ol.style.Icon({
anchor: anchor,
anchorOrigin: ol.style.IconAnchorOrigin.BOTTOM_LEFT,
anchorOrigin: ol.style.IconOrigin.BOTTOM_LEFT,
anchorXUnits: anchorXUnits,
anchorYUnits: anchorYUnits,
crossOrigin: 'anonymous', // FIXME should this be configurable?
offset: offset,
offsetOrigin: ol.style.IconOrigin.BOTTOM_LEFT,
rotation: rotation,
scale: scale,
size: size,
@@ -1158,7 +1173,13 @@ ol.format.KML.GEOMETRY_FLAT_COORDINATES_PARSERS_ = ol.xml.makeParsersNS(
ol.format.KML.ICON_PARSERS_ = ol.xml.makeParsersNS(
ol.format.KML.NAMESPACE_URIS_, {
'href': ol.xml.makeObjectPropertySetter(ol.format.KML.readURI_)
});
}, ol.xml.makeParsersNS(
ol.format.KML.GX_NAMESPACE_URIS_, {
'x': ol.xml.makeObjectPropertySetter(ol.format.XSD.readDecimal),
'y': ol.xml.makeObjectPropertySetter(ol.format.XSD.readDecimal),
'w': ol.xml.makeObjectPropertySetter(ol.format.XSD.readDecimal),
'h': ol.xml.makeObjectPropertySetter(ol.format.XSD.readDecimal)
}));
/**

View File

@@ -40,6 +40,12 @@ ol.style.Circle = function(opt_options) {
*/
this.fill_ = goog.isDef(options.fill) ? options.fill : null;
/**
* @private
* @type {Array.<number>}
*/
this.origin_ = [0, 0];
/**
* @private
* @type {number}
@@ -74,7 +80,6 @@ ol.style.Circle = function(opt_options) {
goog.base(this, {
opacity: 1,
origin: [0, 0],
rotateWithView: false,
rotation: 0,
scale: 1,
@@ -128,6 +133,15 @@ ol.style.Circle.prototype.getImageState = function() {
};
/**
* @inheritDoc
* @todo api
*/
ol.style.Circle.prototype.getOrigin = function() {
return this.origin_;
};
/**
* @return {number} Radius.
* @todo api

View File

@@ -1,7 +1,7 @@
goog.provide('ol.style.Icon');
goog.provide('ol.style.IconAnchorOrigin');
goog.provide('ol.style.IconAnchorUnits');
goog.provide('ol.style.IconImageCache');
goog.provide('ol.style.IconOrigin');
goog.require('goog.array');
goog.require('goog.asserts');
@@ -16,20 +16,20 @@ goog.require('ol.style.ImageState');
/**
* @enum {string}
*/
ol.style.IconAnchorOrigin = {
BOTTOM_LEFT: 'bottom-left',
BOTTOM_RIGHT: 'bottom-right',
TOP_LEFT: 'top-left',
TOP_RIGHT: 'top-right'
ol.style.IconAnchorUnits = {
FRACTION: 'fraction',
PIXELS: 'pixels'
};
/**
* @enum {string}
*/
ol.style.IconAnchorUnits = {
FRACTION: 'fraction',
PIXELS: 'pixels'
ol.style.IconOrigin = {
BOTTOM_LEFT: 'bottom-left',
BOTTOM_RIGHT: 'bottom-right',
TOP_LEFT: 'top-left',
TOP_RIGHT: 'top-right'
};
@@ -58,10 +58,10 @@ ol.style.Icon = function(opt_options) {
/**
* @private
* @type {ol.style.IconAnchorOrigin}
* @type {ol.style.IconOrigin}
*/
this.anchorOrigin_ = goog.isDef(options.anchorOrigin) ?
options.anchorOrigin : ol.style.IconAnchorOrigin.TOP_LEFT;
options.anchorOrigin : ol.style.IconOrigin.TOP_LEFT;
/**
* @private
@@ -111,6 +111,25 @@ ol.style.Icon = function(opt_options) {
this.iconImage_ = ol.style.IconImage_.get(
image, src, crossOrigin, imageState);
/**
* @private
* @type {Array.<number>}
*/
this.offset_ = goog.isDef(options.offset) ? options.offset : [0, 0];
/**
* @private
* @type {ol.style.IconOrigin}
*/
this.offsetOrigin_ = goog.isDef(options.offsetOrigin) ?
options.offsetOrigin : ol.style.IconOrigin.TOP_LEFT;
/**
* @private
* @type {Array.<number>}
*/
this.origin_ = null;
/**
* @private
* @type {ol.Size}
@@ -122,12 +141,6 @@ ol.style.Icon = function(opt_options) {
*/
var opacity = goog.isDef(options.opacity) ? options.opacity : 1;
/**
* @private
* @type {Array.<number>}
*/
var origin = goog.isDef(options.origin) ? options.origin : [0, 0];
/**
* @type {boolean}
*/
@@ -152,7 +165,6 @@ ol.style.Icon = function(opt_options) {
goog.base(this, {
opacity: opacity,
origin: origin,
rotation: rotation,
scale: scale,
snapToPixel: snapToPixel,
@@ -187,19 +199,19 @@ ol.style.Icon.prototype.getAnchor = function() {
}
}
if (this.anchorOrigin_ != ol.style.IconAnchorOrigin.TOP_LEFT) {
if (this.anchorOrigin_ != ol.style.IconOrigin.TOP_LEFT) {
if (goog.isNull(size)) {
return null;
}
if (anchor === this.anchor_) {
anchor = this.anchor_.slice();
}
if (this.anchorOrigin_ == ol.style.IconAnchorOrigin.TOP_RIGHT ||
this.anchorOrigin_ == ol.style.IconAnchorOrigin.BOTTOM_RIGHT) {
if (this.anchorOrigin_ == ol.style.IconOrigin.TOP_RIGHT ||
this.anchorOrigin_ == ol.style.IconOrigin.BOTTOM_RIGHT) {
anchor[0] = -anchor[0] + size[0];
}
if (this.anchorOrigin_ == ol.style.IconAnchorOrigin.BOTTOM_LEFT ||
this.anchorOrigin_ == ol.style.IconAnchorOrigin.BOTTOM_RIGHT) {
if (this.anchorOrigin_ == ol.style.IconOrigin.BOTTOM_LEFT ||
this.anchorOrigin_ == ol.style.IconOrigin.BOTTOM_RIGHT) {
anchor[1] = -anchor[1] + size[1];
}
}
@@ -233,6 +245,37 @@ ol.style.Icon.prototype.getHitDetectionImage = function(pixelRatio) {
};
/**
* @inheritDoc
* @todo api
*/
ol.style.Icon.prototype.getOrigin = function() {
if (!goog.isNull(this.origin_)) {
return this.origin_;
}
var offset = this.offset_;
if (this.offsetOrigin_ != ol.style.IconOrigin.TOP_LEFT) {
var size = this.getSize();
var iconImageSize = this.iconImage_.getSize();
if (goog.isNull(size) || goog.isNull(iconImageSize)) {
return null;
}
offset = offset.slice();
if (this.offsetOrigin_ == ol.style.IconOrigin.TOP_RIGHT ||
this.offsetOrigin_ == ol.style.IconOrigin.BOTTOM_RIGHT) {
offset[0] = iconImageSize[0] - size[0] - offset[0];
}
if (this.offsetOrigin_ == ol.style.IconOrigin.BOTTOM_LEFT ||
this.offsetOrigin_ == ol.style.IconOrigin.BOTTOM_RIGHT) {
offset[1] = iconImageSize[1] - size[1] - offset[1];
}
}
this.origin_ = offset;
return this.origin_;
};
/**
* @return {string|undefined} Image src.
* @todo api

View File

@@ -15,7 +15,6 @@ ol.style.ImageState = {
/**
* @typedef {{opacity: number,
* origin: Array.<number>,
* rotateWithView: boolean,
* rotation: number,
* scale: number,
@@ -37,12 +36,6 @@ ol.style.Image = function(options) {
*/
this.opacity_ = options.opacity;
/**
* @private
* @type {Array.<number>}
*/
this.origin_ = options.origin;
/**
* @private
* @type {boolean}
@@ -78,14 +71,6 @@ ol.style.Image.prototype.getOpacity = function() {
};
/**
* @return {Array.<number>} Origin.
*/
ol.style.Image.prototype.getOrigin = function() {
return this.origin_;
};
/**
* @return {boolean} Rotate with map.
*/
@@ -148,6 +133,13 @@ ol.style.Image.prototype.getImageState = goog.abstractMethod;
ol.style.Image.prototype.getHitDetectionImage = goog.abstractMethod;
/**
* @function
* @return {Array.<number>} Origin.
*/
ol.style.Image.prototype.getOrigin = goog.abstractMethod;
/**
* @function
* @return {ol.Size} Size.