c8y-openlayer
Version:
This module is designed to help integrate Openlayer with Cumulocity IoT
318 lines (280 loc) • 9.13 kB
JavaScript
import _ol_asserts_ from './asserts.js';
import _ol_events_ from './events.js';
import _ol_events_EventType_ from './events/eventtype.js';
import _ol_ from './index.js';
import _ol_Object_ from './object.js';
import _ol_geom_Geometry_ from './geom/geometry.js';
import _ol_style_Style_ from './style/style.js';
/**
* @classdesc
* A vector object for geographic features with a geometry and other
* attribute properties, similar to the features in vector file formats like
* GeoJSON.
*
* Features can be styled individually with `setStyle`; otherwise they use the
* style of their vector layer.
*
* Note that attribute properties are set as {@link ol.Object} properties on
* the feature object, so they are observable, and have get/set accessors.
*
* Typically, a feature has a single geometry property. You can set the
* geometry using the `setGeometry` method and get it with `getGeometry`.
* It is possible to store more than one geometry on a feature using attribute
* properties. By default, the geometry used for rendering is identified by
* the property name `geometry`. If you want to use another geometry property
* for rendering, use the `setGeometryName` method to change the attribute
* property associated with the geometry for the feature. For example:
*
* ```js
* var feature = new ol.Feature({
* geometry: new ol.geom.Polygon(polyCoords),
* labelPoint: new ol.geom.Point(labelCoords),
* name: 'My Polygon'
* });
*
* // get the polygon geometry
* var poly = feature.getGeometry();
*
* // Render the feature as a point using the coordinates from labelPoint
* feature.setGeometryName('labelPoint');
*
* // get the point geometry
* var point = feature.getGeometry();
* ```
*
* @constructor
* @extends {ol.Object}
* @param {ol.geom.Geometry|Object.<string, *>=} opt_geometryOrProperties
* You may pass a Geometry object directly, or an object literal
* containing properties. If you pass an object literal, you may
* include a Geometry associated with a `geometry` key.
* @api
*/
var _ol_Feature_ = function(opt_geometryOrProperties) {
_ol_Object_.call(this);
/**
* @private
* @type {number|string|undefined}
*/
this.id_ = undefined;
/**
* @type {string}
* @private
*/
this.geometryName_ = 'geometry';
/**
* User provided style.
* @private
* @type {ol.style.Style|Array.<ol.style.Style>|
* ol.FeatureStyleFunction}
*/
this.style_ = null;
/**
* @private
* @type {ol.FeatureStyleFunction|undefined}
*/
this.styleFunction_ = undefined;
/**
* @private
* @type {?ol.EventsKey}
*/
this.geometryChangeKey_ = null;
_ol_events_.listen(
this, _ol_Object_.getChangeEventType(this.geometryName_),
this.handleGeometryChanged_, this);
if (opt_geometryOrProperties !== undefined) {
if (opt_geometryOrProperties instanceof _ol_geom_Geometry_ ||
!opt_geometryOrProperties) {
var geometry = opt_geometryOrProperties;
this.setGeometry(geometry);
} else {
/** @type {Object.<string, *>} */
var properties = opt_geometryOrProperties;
this.setProperties(properties);
}
}
};
_ol_.inherits(_ol_Feature_, _ol_Object_);
/**
* Clone this feature. If the original feature has a geometry it
* is also cloned. The feature id is not set in the clone.
* @return {ol.Feature} The clone.
* @api
*/
_ol_Feature_.prototype.clone = function() {
var clone = new _ol_Feature_(this.getProperties());
clone.setGeometryName(this.getGeometryName());
var geometry = this.getGeometry();
if (geometry) {
clone.setGeometry(geometry.clone());
}
var style = this.getStyle();
if (style) {
clone.setStyle(style);
}
return clone;
};
/**
* Get the feature's default geometry. A feature may have any number of named
* geometries. The "default" geometry (the one that is rendered by default) is
* set when calling {@link ol.Feature#setGeometry}.
* @return {ol.geom.Geometry|undefined} The default geometry for the feature.
* @api
* @observable
*/
_ol_Feature_.prototype.getGeometry = function() {
return /** @type {ol.geom.Geometry|undefined} */ (
this.get(this.geometryName_));
};
/**
* Get the feature identifier. This is a stable identifier for the feature and
* is either set when reading data from a remote source or set explicitly by
* calling {@link ol.Feature#setId}.
* @return {number|string|undefined} Id.
* @api
*/
_ol_Feature_.prototype.getId = function() {
return this.id_;
};
/**
* Get the name of the feature's default geometry. By default, the default
* geometry is named `geometry`.
* @return {string} Get the property name associated with the default geometry
* for this feature.
* @api
*/
_ol_Feature_.prototype.getGeometryName = function() {
return this.geometryName_;
};
/**
* Get the feature's style. Will return what was provided to the
* {@link ol.Feature#setStyle} method.
* @return {ol.style.Style|Array.<ol.style.Style>|
* ol.FeatureStyleFunction|ol.StyleFunction} The feature style.
* @api
*/
_ol_Feature_.prototype.getStyle = function() {
return this.style_;
};
/**
* Get the feature's style function.
* @return {ol.FeatureStyleFunction|undefined} Return a function
* representing the current style of this feature.
* @api
*/
_ol_Feature_.prototype.getStyleFunction = function() {
return this.styleFunction_;
};
/**
* @private
*/
_ol_Feature_.prototype.handleGeometryChange_ = function() {
this.changed();
};
/**
* @private
*/
_ol_Feature_.prototype.handleGeometryChanged_ = function() {
if (this.geometryChangeKey_) {
_ol_events_.unlistenByKey(this.geometryChangeKey_);
this.geometryChangeKey_ = null;
}
var geometry = this.getGeometry();
if (geometry) {
this.geometryChangeKey_ = _ol_events_.listen(geometry,
_ol_events_EventType_.CHANGE, this.handleGeometryChange_, this);
}
this.changed();
};
/**
* Set the default geometry for the feature. This will update the property
* with the name returned by {@link ol.Feature#getGeometryName}.
* @param {ol.geom.Geometry|undefined} geometry The new geometry.
* @api
* @observable
*/
_ol_Feature_.prototype.setGeometry = function(geometry) {
this.set(this.geometryName_, geometry);
};
/**
* Set the style for the feature. This can be a single style object, an array
* of styles, or a function that takes a resolution and returns an array of
* styles. If it is `null` the feature has no style (a `null` style).
* @param {ol.style.Style|Array.<ol.style.Style>|
* ol.FeatureStyleFunction|ol.StyleFunction} style Style for this feature.
* @api
* @fires ol.events.Event#event:change
*/
_ol_Feature_.prototype.setStyle = function(style) {
this.style_ = style;
this.styleFunction_ = !style ?
undefined : _ol_Feature_.createStyleFunction(style);
this.changed();
};
/**
* Set the feature id. The feature id is considered stable and may be used when
* requesting features or comparing identifiers returned from a remote source.
* The feature id can be used with the {@link ol.source.Vector#getFeatureById}
* method.
* @param {number|string|undefined} id The feature id.
* @api
* @fires ol.events.Event#event:change
*/
_ol_Feature_.prototype.setId = function(id) {
this.id_ = id;
this.changed();
};
/**
* Set the property name to be used when getting the feature's default geometry.
* When calling {@link ol.Feature#getGeometry}, the value of the property with
* this name will be returned.
* @param {string} name The property name of the default geometry.
* @api
*/
_ol_Feature_.prototype.setGeometryName = function(name) {
_ol_events_.unlisten(
this, _ol_Object_.getChangeEventType(this.geometryName_),
this.handleGeometryChanged_, this);
this.geometryName_ = name;
_ol_events_.listen(
this, _ol_Object_.getChangeEventType(this.geometryName_),
this.handleGeometryChanged_, this);
this.handleGeometryChanged_();
};
/**
* Convert the provided object into a feature style function. Functions passed
* through unchanged. Arrays of ol.style.Style or single style objects wrapped
* in a new feature style function.
* @param {ol.FeatureStyleFunction|!Array.<ol.style.Style>|!ol.style.Style} obj
* A feature style function, a single style, or an array of styles.
* @return {ol.FeatureStyleFunction} A style function.
*/
_ol_Feature_.createStyleFunction = function(obj) {
var styleFunction;
if (typeof obj === 'function') {
if (obj.length == 2) {
styleFunction = function(resolution) {
return /** @type {ol.StyleFunction} */ (obj)(this, resolution);
};
} else {
styleFunction = obj;
}
} else {
/**
* @type {Array.<ol.style.Style>}
*/
var styles;
if (Array.isArray(obj)) {
styles = obj;
} else {
_ol_asserts_.assert(obj instanceof _ol_style_Style_,
41); // Expected an `ol.style.Style` or an array of `ol.style.Style`
styles = [obj];
}
styleFunction = function() {
return styles;
};
}
return styleFunction;
};
export default _ol_Feature_;