Merge pull request #8385 from openlayers/class

Use class syntax
This commit is contained in:
Tim Schaub
2018-07-18 09:16:27 -07:00
committed by GitHub
248 changed files with 42112 additions and 44134 deletions
-2
View File
@@ -2,5 +2,3 @@
/coverage/ /coverage/
/dist/ /dist/
node_modules/ node_modules/
src/index.js
src/ol/package.json
+1 -1
View File
@@ -7,7 +7,7 @@ import buble from 'rollup-plugin-buble';
import sourcemaps from 'rollup-plugin-sourcemaps'; import sourcemaps from 'rollup-plugin-sourcemaps';
export default { export default {
input: 'src/index.js', input: 'build/index.js',
output: [ output: [
{file: 'build/ol.js', format: 'iife', sourcemap: true} {file: 'build/ol.js', format: 'iife', sourcemap: true}
], ],
+9 -16
View File
@@ -1,5 +1,5 @@
{ {
"name": "openlayers", "name": "ol",
"version": "5.0.3", "version": "5.0.3",
"description": "OpenLayers mapping library", "description": "OpenLayers mapping library",
"keywords": [ "keywords": [
@@ -7,6 +7,7 @@
"mapping", "mapping",
"ol" "ol"
], ],
"private": true,
"homepage": "https://openlayers.org/", "homepage": "https://openlayers.org/",
"scripts": { "scripts": {
"lint": "eslint tasks test src/ol examples config", "lint": "eslint tasks test src/ol examples config",
@@ -15,18 +16,13 @@
"karma": "karma start test/karma.config.js", "karma": "karma start test/karma.config.js",
"serve-examples": "webpack-dev-server --config examples/webpack/config.js --mode development --watch", "serve-examples": "webpack-dev-server --config examples/webpack/config.js --mode development --watch",
"build-examples": "webpack --config examples/webpack/config.js --mode production", "build-examples": "webpack --config examples/webpack/config.js --mode production",
"build-index": "node tasks/generate-index", "build-package": "npm run transpile && node tasks/prepare-package",
"prepare-package": "node tasks/prepare-package", "build-index": "npm run build-package && node tasks/generate-index",
"prebuild": "npm run prepare-package && npm run build-index", "build-legacy": "rm -rf build && npm run build-index && rollup --config config/rollup.js && cleancss --source-map src/ol/ol.css -o build/ol.css",
"prepare": "npm run prepare-package", "transpile": "rm -rf build/ol && mkdir -p build && buble --input src/ol --output build/ol --no modules --sourcemap",
"build": "rollup --config config/rollup.js && cleancss --source-map src/ol/ol.css -o build/ol.css",
"presrc-closure": "npm run prebuild",
"src-closure": "node tasks/transform-types",
"pretypecheck": "npm run src-closure",
"typecheck": "node tasks/typecheck",
"apidoc": "jsdoc config/jsdoc/api/index.md -c config/jsdoc/api/conf.json -P package.json -d build/apidoc" "apidoc": "jsdoc config/jsdoc/api/index.md -c config/jsdoc/api/conf.json -P package.json -d build/apidoc"
}, },
"main": "src/ol/index.js", "main": "index.js",
"repository": { "repository": {
"type": "git", "type": "git",
"url": "git://github.com/openlayers/openlayers.git" "url": "git://github.com/openlayers/openlayers.git"
@@ -41,20 +37,18 @@
"rbush": "2.0.2" "rbush": "2.0.2"
}, },
"devDependencies": { "devDependencies": {
"babel-core": "^6.26.3", "buble": "^0.19.3",
"babel-plugin-jsdoc-closure": "1.5.1",
"buble-loader": "^0.5.1", "buble-loader": "^0.5.1",
"chaikin-smooth": "^1.0.4", "chaikin-smooth": "^1.0.4",
"clean-css-cli": "4.1.11", "clean-css-cli": "4.1.11",
"copy-webpack-plugin": "^4.4.1", "copy-webpack-plugin": "^4.4.1",
"coveralls": "3.0.1", "coveralls": "3.0.1",
"eslint": "5.0.1", "eslint": "5.0.1",
"eslint-config-openlayers": "^9.2.0", "eslint-config-openlayers": "^10.0.0",
"expect.js": "0.3.1", "expect.js": "0.3.1",
"front-matter": "^2.1.2", "front-matter": "^2.1.2",
"fs-extra": "^6.0.0", "fs-extra": "^6.0.0",
"glob": "^7.1.2", "glob": "^7.1.2",
"google-closure-compiler": "20180610.0.2",
"handlebars": "4.0.11", "handlebars": "4.0.11",
"istanbul": "0.4.5", "istanbul": "0.4.5",
"jquery": "3.3.1", "jquery": "3.3.1",
@@ -72,7 +66,6 @@
"mustache": "^2.3.0", "mustache": "^2.3.0",
"pixelmatch": "^4.0.2", "pixelmatch": "^4.0.2",
"proj4": "2.4.4", "proj4": "2.4.4",
"recast": "0.15.2",
"rollup": "0.62.0", "rollup": "0.62.0",
"rollup-plugin-buble": "0.19.2", "rollup-plugin-buble": "0.19.2",
"rollup-plugin-commonjs": "9.1.3", "rollup-plugin-commonjs": "9.1.3",
+15 -11
View File
@@ -1,26 +1,25 @@
/** /**
* @module ol/AssertionError * @module ol/AssertionError
*/ */
import {VERSION, inherits} from './util.js'; import {VERSION} from './util.js';
/** /**
* Error object thrown when an assertion failed. This is an ECMA-262 Error, * Error object thrown when an assertion failed. This is an ECMA-262 Error,
* extended with a `code` property. * extended with a `code` property.
* @see {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error} * @see {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error}
* @constructor
* @extends {Error}
* @param {number} code Error code.
*/ */
const AssertionError = function(code) { class AssertionError extends Error {
const path = VERSION.split('-')[0];
/** /**
* @type {string} * @param {number} code Error code.
*/ */
this.message = 'Assertion failed. See https://openlayers.org/en/' + path + constructor(code) {
const path = VERSION.split('-')[0];
const message = 'Assertion failed. See https://openlayers.org/en/' + path +
'/doc/errors/#' + code + ' for details.'; '/doc/errors/#' + code + ' for details.';
super(message);
/** /**
* Error code. The meaning of the code can be found on * Error code. The meaning of the code can be found on
* {@link https://openlayers.org/en/latest/doc/errors/} (replace `latest` with * {@link https://openlayers.org/en/latest/doc/errors/} (replace `latest` with
@@ -31,10 +30,15 @@ const AssertionError = function(code) {
*/ */
this.code = code; this.code = code;
/**
* @type {string}
*/
this.name = 'AssertionError'; this.name = 'AssertionError';
}; // Re-assign message, see https://github.com/Rich-Harris/buble/issues/40
this.message = message;
}
inherits(AssertionError, Error); }
export default AssertionError; export default AssertionError;
+46 -60
View File
@@ -1,7 +1,6 @@
/** /**
* @module ol/Collection * @module ol/Collection
*/ */
import {inherits} from './util.js';
import AssertionError from './AssertionError.js'; import AssertionError from './AssertionError.js';
import CollectionEventType from './CollectionEventType.js'; import CollectionEventType from './CollectionEventType.js';
import BaseObject from './Object.js'; import BaseObject from './Object.js';
@@ -21,15 +20,15 @@ const Property = {
* @classdesc * @classdesc
* Events emitted by {@link module:ol/Collection~Collection} instances are instances of this * Events emitted by {@link module:ol/Collection~Collection} instances are instances of this
* type. * type.
* */
* @constructor export class CollectionEvent extends Event {
* @extends {module:ol/events/Event}
/**
* @param {module:ol/CollectionEventType} type Type. * @param {module:ol/CollectionEventType} type Type.
* @param {*=} opt_element Element. * @param {*=} opt_element Element.
*/ */
export const CollectionEvent = function(type, opt_element) { constructor(type, opt_element) {
super(type);
Event.call(this, type);
/** /**
* The element that is added to or removed from the collection. * The element that is added to or removed from the collection.
@@ -38,9 +37,9 @@ export const CollectionEvent = function(type, opt_element) {
*/ */
this.element = opt_element; this.element = opt_element;
}; }
inherits(CollectionEvent, Event); }
/** /**
@@ -57,17 +56,18 @@ inherits(CollectionEvent, Event);
* Collection; they trigger events on the appropriate object, not on the * Collection; they trigger events on the appropriate object, not on the
* Collection as a whole. * Collection as a whole.
* *
* @constructor * @api
* @extends {module:ol/Object} */
* @fires module:ol/Collection~CollectionEvent class Collection extends BaseObject {
/**
* @param {Array.<T>=} opt_array Array. * @param {Array.<T>=} opt_array Array.
* @param {module:ol/Collection~Options=} opt_options Collection options. * @param {module:ol/Collection~Options=} opt_options Collection options.
* @template T * @template T
* @api
*/ */
const Collection = function(opt_array, opt_options) { constructor(opt_array, opt_options) {
BaseObject.call(this); super();
const options = opt_options || {}; const options = opt_options || {};
@@ -91,21 +91,17 @@ const Collection = function(opt_array, opt_options) {
this.updateLength_(); this.updateLength_();
}; }
inherits(Collection, BaseObject);
/** /**
* Remove all elements from the collection. * Remove all elements from the collection.
* @api * @api
*/ */
Collection.prototype.clear = function() { clear() {
while (this.getLength() > 0) { while (this.getLength() > 0) {
this.pop(); this.pop();
} }
}; }
/** /**
* Add elements to the collection. This pushes each item in the provided array * Add elements to the collection. This pushes each item in the provided array
@@ -114,13 +110,12 @@ Collection.prototype.clear = function() {
* @return {module:ol/Collection.<T>} This collection. * @return {module:ol/Collection.<T>} This collection.
* @api * @api
*/ */
Collection.prototype.extend = function(arr) { extend(arr) {
for (let i = 0, ii = arr.length; i < ii; ++i) { for (let i = 0, ii = arr.length; i < ii; ++i) {
this.push(arr[i]); this.push(arr[i]);
} }
return this; return this;
}; }
/** /**
* Iterate over each element, calling the provided callback. * Iterate over each element, calling the provided callback.
@@ -129,13 +124,12 @@ Collection.prototype.extend = function(arr) {
* index and the array). The return value is ignored. * index and the array). The return value is ignored.
* @api * @api
*/ */
Collection.prototype.forEach = function(f) { forEach(f) {
const array = this.array_; const array = this.array_;
for (let i = 0, ii = array.length; i < ii; ++i) { for (let i = 0, ii = array.length; i < ii; ++i) {
f(array[i], i, array); f(array[i], i, array);
} }
}; }
/** /**
* Get a reference to the underlying Array object. Warning: if the array * Get a reference to the underlying Array object. Warning: if the array
@@ -145,10 +139,9 @@ Collection.prototype.forEach = function(f) {
* @return {!Array.<T>} Array. * @return {!Array.<T>} Array.
* @api * @api
*/ */
Collection.prototype.getArray = function() { getArray() {
return this.array_; return this.array_;
}; }
/** /**
* Get the element at the provided index. * Get the element at the provided index.
@@ -156,10 +149,9 @@ Collection.prototype.getArray = function() {
* @return {T} Element. * @return {T} Element.
* @api * @api
*/ */
Collection.prototype.item = function(index) { item(index) {
return this.array_[index]; return this.array_[index];
}; }
/** /**
* Get the length of this collection. * Get the length of this collection.
@@ -167,10 +159,9 @@ Collection.prototype.item = function(index) {
* @observable * @observable
* @api * @api
*/ */
Collection.prototype.getLength = function() { getLength() {
return /** @type {number} */ (this.get(Property.LENGTH)); return /** @type {number} */ (this.get(Property.LENGTH));
}; }
/** /**
* Insert an element at the provided index. * Insert an element at the provided index.
@@ -178,7 +169,7 @@ Collection.prototype.getLength = function() {
* @param {T} elem Element. * @param {T} elem Element.
* @api * @api
*/ */
Collection.prototype.insertAt = function(index, elem) { insertAt(index, elem) {
if (this.unique_) { if (this.unique_) {
this.assertUnique_(elem); this.assertUnique_(elem);
} }
@@ -186,8 +177,7 @@ Collection.prototype.insertAt = function(index, elem) {
this.updateLength_(); this.updateLength_();
this.dispatchEvent( this.dispatchEvent(
new CollectionEvent(CollectionEventType.ADD, elem)); new CollectionEvent(CollectionEventType.ADD, elem));
}; }
/** /**
* Remove the last element of the collection and return it. * Remove the last element of the collection and return it.
@@ -195,10 +185,9 @@ Collection.prototype.insertAt = function(index, elem) {
* @return {T|undefined} Element. * @return {T|undefined} Element.
* @api * @api
*/ */
Collection.prototype.pop = function() { pop() {
return this.removeAt(this.getLength() - 1); return this.removeAt(this.getLength() - 1);
}; }
/** /**
* Insert the provided element at the end of the collection. * Insert the provided element at the end of the collection.
@@ -206,15 +195,14 @@ Collection.prototype.pop = function() {
* @return {number} New length of the collection. * @return {number} New length of the collection.
* @api * @api
*/ */
Collection.prototype.push = function(elem) { push(elem) {
if (this.unique_) { if (this.unique_) {
this.assertUnique_(elem); this.assertUnique_(elem);
} }
const n = this.getLength(); const n = this.getLength();
this.insertAt(n, elem); this.insertAt(n, elem);
return this.getLength(); return this.getLength();
}; }
/** /**
* Remove the first occurrence of an element from the collection. * Remove the first occurrence of an element from the collection.
@@ -222,7 +210,7 @@ Collection.prototype.push = function(elem) {
* @return {T|undefined} The removed element or undefined if none found. * @return {T|undefined} The removed element or undefined if none found.
* @api * @api
*/ */
Collection.prototype.remove = function(elem) { remove(elem) {
const arr = this.array_; const arr = this.array_;
for (let i = 0, ii = arr.length; i < ii; ++i) { for (let i = 0, ii = arr.length; i < ii; ++i) {
if (arr[i] === elem) { if (arr[i] === elem) {
@@ -230,8 +218,7 @@ Collection.prototype.remove = function(elem) {
} }
} }
return undefined; return undefined;
}; }
/** /**
* Remove the element at the provided index and return it. * Remove the element at the provided index and return it.
@@ -240,14 +227,13 @@ Collection.prototype.remove = function(elem) {
* @return {T|undefined} Value. * @return {T|undefined} Value.
* @api * @api
*/ */
Collection.prototype.removeAt = function(index) { removeAt(index) {
const prev = this.array_[index]; const prev = this.array_[index];
this.array_.splice(index, 1); this.array_.splice(index, 1);
this.updateLength_(); this.updateLength_();
this.dispatchEvent(new CollectionEvent(CollectionEventType.REMOVE, prev)); this.dispatchEvent(new CollectionEvent(CollectionEventType.REMOVE, prev));
return prev; return prev;
}; }
/** /**
* Set the element at the provided index. * Set the element at the provided index.
@@ -255,7 +241,7 @@ Collection.prototype.removeAt = function(index) {
* @param {T} elem Element. * @param {T} elem Element.
* @api * @api
*/ */
Collection.prototype.setAt = function(index, elem) { setAt(index, elem) {
const n = this.getLength(); const n = this.getLength();
if (index < n) { if (index < n) {
if (this.unique_) { if (this.unique_) {
@@ -273,28 +259,28 @@ Collection.prototype.setAt = function(index, elem) {
} }
this.insertAt(index, elem); this.insertAt(index, elem);
} }
}; }
/** /**
* @private * @private
*/ */
Collection.prototype.updateLength_ = function() { updateLength_() {
this.set(Property.LENGTH, this.array_.length); this.set(Property.LENGTH, this.array_.length);
}; }
/** /**
* @private * @private
* @param {T} elem Element. * @param {T} elem Element.
* @param {number=} opt_except Optional index to ignore. * @param {number=} opt_except Optional index to ignore.
*/ */
Collection.prototype.assertUnique_ = function(elem, opt_except) { assertUnique_(elem, opt_except) {
for (let i = 0, ii = this.array_.length; i < ii; ++i) { for (let i = 0, ii = this.array_.length; i < ii; ++i) {
if (this.array_[i] === elem && i !== opt_except) { if (this.array_[i] === elem && i !== opt_except) {
throw new AssertionError(58); throw new AssertionError(58);
} }
} }
}; }
}
export default Collection; export default Collection;
+11 -12
View File
@@ -5,9 +5,18 @@ import {UNDEFINED} from './functions.js';
/** /**
* Objects that need to clean up after themselves. * Objects that need to clean up after themselves.
* @constructor
*/ */
const Disposable = function() {}; class Disposable {
/**
* Clean up.
*/
dispose() {
if (!this.disposed_) {
this.disposed_ = true;
this.disposeInternal();
}
}
}
/** /**
* The object has already been disposed. * The object has already been disposed.
@@ -16,16 +25,6 @@ const Disposable = function() {};
*/ */
Disposable.prototype.disposed_ = false; Disposable.prototype.disposed_ = false;
/**
* Clean up.
*/
Disposable.prototype.dispose = function() {
if (!this.disposed_) {
this.disposed_ = true;
this.disposeInternal();
}
};
/** /**
* Extension point for disposable objects. * Extension point for disposable objects.
* @protected * @protected
+33 -45
View File
@@ -4,7 +4,6 @@
import {assert} from './asserts.js'; import {assert} from './asserts.js';
import {listen, unlisten, unlistenByKey} from './events.js'; import {listen, unlisten, unlistenByKey} from './events.js';
import EventType from './events/EventType.js'; import EventType from './events/EventType.js';
import {inherits} from './util.js';
import BaseObject, {getChangeEventType} from './Object.js'; import BaseObject, {getChangeEventType} from './Object.js';
import Geometry from './geom/Geometry.js'; import Geometry from './geom/Geometry.js';
import Style from './style/Style.js'; import Style from './style/Style.js';
@@ -51,17 +50,19 @@ import Style from './style/Style.js';
* var point = feature.getGeometry(); * var point = feature.getGeometry();
* ``` * ```
* *
* @constructor * @api
* @extends {module:ol/Object} */
class Feature extends BaseObject {
/**
* @param {module:ol/geom/Geometry|Object.<string, *>=} opt_geometryOrProperties * @param {module:ol/geom/Geometry|Object.<string, *>=} opt_geometryOrProperties
* You may pass a Geometry object directly, or an object literal containing * You may pass a Geometry object directly, or an object literal containing
* properties. If you pass an object literal, you may include a Geometry * properties. If you pass an object literal, you may include a Geometry
* associated with a `geometry` key. * associated with a `geometry` key.
* @api
*/ */
const Feature = function(opt_geometryOrProperties) { constructor(opt_geometryOrProperties) {
BaseObject.call(this); super();
/** /**
* @private * @private
@@ -109,10 +110,7 @@ const Feature = function(opt_geometryOrProperties) {
this.setProperties(properties); this.setProperties(properties);
} }
} }
}; }
inherits(Feature, BaseObject);
/** /**
* Clone this feature. If the original feature has a geometry it * Clone this feature. If the original feature has a geometry it
@@ -120,7 +118,7 @@ inherits(Feature, BaseObject);
* @return {module:ol/Feature} The clone. * @return {module:ol/Feature} The clone.
* @api * @api
*/ */
Feature.prototype.clone = function() { clone() {
const clone = new Feature(this.getProperties()); const clone = new Feature(this.getProperties());
clone.setGeometryName(this.getGeometryName()); clone.setGeometryName(this.getGeometryName());
const geometry = this.getGeometry(); const geometry = this.getGeometry();
@@ -132,8 +130,7 @@ Feature.prototype.clone = function() {
clone.setStyle(style); clone.setStyle(style);
} }
return clone; return clone;
}; }
/** /**
* Get the feature's default geometry. A feature may have any number of named * Get the feature's default geometry. A feature may have any number of named
@@ -143,12 +140,11 @@ Feature.prototype.clone = function() {
* @api * @api
* @observable * @observable
*/ */
Feature.prototype.getGeometry = function() { getGeometry() {
return ( return (
/** @type {module:ol/geom/Geometry|undefined} */ (this.get(this.geometryName_)) /** @type {module:ol/geom/Geometry|undefined} */ (this.get(this.geometryName_))
); );
}; }
/** /**
* Get the feature identifier. This is a stable identifier for the feature and * Get the feature identifier. This is a stable identifier for the feature and
@@ -157,10 +153,9 @@ Feature.prototype.getGeometry = function() {
* @return {number|string|undefined} Id. * @return {number|string|undefined} Id.
* @api * @api
*/ */
Feature.prototype.getId = function() { getId() {
return this.id_; return this.id_;
}; }
/** /**
* Get the name of the feature's default geometry. By default, the default * Get the name of the feature's default geometry. By default, the default
@@ -169,10 +164,9 @@ Feature.prototype.getId = function() {
* for this feature. * for this feature.
* @api * @api
*/ */
Feature.prototype.getGeometryName = function() { getGeometryName() {
return this.geometryName_; return this.geometryName_;
}; }
/** /**
* Get the feature's style. Will return what was provided to the * Get the feature's style. Will return what was provided to the
@@ -180,10 +174,9 @@ Feature.prototype.getGeometryName = function() {
* @return {module:ol/style/Style|Array.<module:ol/style/Style>|module:ol/style/Style~StyleFunction} The feature style. * @return {module:ol/style/Style|Array.<module:ol/style/Style>|module:ol/style/Style~StyleFunction} The feature style.
* @api * @api
*/ */
Feature.prototype.getStyle = function() { getStyle() {
return this.style_; return this.style_;
}; }
/** /**
* Get the feature's style function. * Get the feature's style function.
@@ -191,23 +184,21 @@ Feature.prototype.getStyle = function() {
* representing the current style of this feature. * representing the current style of this feature.
* @api * @api
*/ */
Feature.prototype.getStyleFunction = function() { getStyleFunction() {
return this.styleFunction_; return this.styleFunction_;
}; }
/** /**
* @private * @private
*/ */
Feature.prototype.handleGeometryChange_ = function() { handleGeometryChange_() {
this.changed(); this.changed();
}; }
/** /**
* @private * @private
*/ */
Feature.prototype.handleGeometryChanged_ = function() { handleGeometryChanged_() {
if (this.geometryChangeKey_) { if (this.geometryChangeKey_) {
unlistenByKey(this.geometryChangeKey_); unlistenByKey(this.geometryChangeKey_);
this.geometryChangeKey_ = null; this.geometryChangeKey_ = null;
@@ -218,8 +209,7 @@ Feature.prototype.handleGeometryChanged_ = function() {
EventType.CHANGE, this.handleGeometryChange_, this); EventType.CHANGE, this.handleGeometryChange_, this);
} }
this.changed(); this.changed();
}; }
/** /**
* Set the default geometry for the feature. This will update the property * Set the default geometry for the feature. This will update the property
@@ -228,10 +218,9 @@ Feature.prototype.handleGeometryChanged_ = function() {
* @api * @api
* @observable * @observable
*/ */
Feature.prototype.setGeometry = function(geometry) { setGeometry(geometry) {
this.set(this.geometryName_, geometry); this.set(this.geometryName_, geometry);
}; }
/** /**
* Set the style for the feature. This can be a single style object, an array * Set the style for the feature. This can be a single style object, an array
@@ -241,12 +230,11 @@ Feature.prototype.setGeometry = function(geometry) {
* @api * @api
* @fires module:ol/events/Event~Event#event:change * @fires module:ol/events/Event~Event#event:change
*/ */
Feature.prototype.setStyle = function(style) { setStyle(style) {
this.style_ = style; this.style_ = style;
this.styleFunction_ = !style ? undefined : createStyleFunction(style); this.styleFunction_ = !style ? undefined : createStyleFunction(style);
this.changed(); this.changed();
}; }
/** /**
* Set the feature id. The feature id is considered stable and may be used when * Set the feature id. The feature id is considered stable and may be used when
@@ -257,11 +245,10 @@ Feature.prototype.setStyle = function(style) {
* @api * @api
* @fires module:ol/events/Event~Event#event:change * @fires module:ol/events/Event~Event#event:change
*/ */
Feature.prototype.setId = function(id) { setId(id) {
this.id_ = id; this.id_ = id;
this.changed(); this.changed();
}; }
/** /**
* Set the property name to be used when getting the feature's default geometry. * Set the property name to be used when getting the feature's default geometry.
@@ -270,7 +257,7 @@ Feature.prototype.setId = function(id) {
* @param {string} name The property name of the default geometry. * @param {string} name The property name of the default geometry.
* @api * @api
*/ */
Feature.prototype.setGeometryName = function(name) { setGeometryName(name) {
unlisten( unlisten(
this, getChangeEventType(this.geometryName_), this, getChangeEventType(this.geometryName_),
this.handleGeometryChanged_, this); this.handleGeometryChanged_, this);
@@ -279,7 +266,8 @@ Feature.prototype.setGeometryName = function(name) {
this, getChangeEventType(this.geometryName_), this, getChangeEventType(this.geometryName_),
this.handleGeometryChanged_, this); this.handleGeometryChanged_, this);
this.handleGeometryChanged_(); this.handleGeometryChanged_();
}; }
}
/** /**
+48 -63
View File
@@ -1,7 +1,6 @@
/** /**
* @module ol/Geolocation * @module ol/Geolocation
*/ */
import {inherits} from './util.js';
import GeolocationProperty from './GeolocationProperty.js'; import GeolocationProperty from './GeolocationProperty.js';
import BaseObject, {getChangeEventType} from './Object.js'; import BaseObject, {getChangeEventType} from './Object.js';
import {listen} from './events.js'; import {listen} from './events.js';
@@ -44,14 +43,16 @@ import {get as getProjection, getTransformFromProjections, identityTransform} fr
* }); * });
* *
* @fires error * @fires error
* @constructor
* @extends {module:ol/Object}
* @param {module:ol/Geolocation~Options=} opt_options Options.
* @api * @api
*/ */
const Geolocation = function(opt_options) { class Geolocation extends BaseObject {
BaseObject.call(this); /**
* @param {module:ol/Geolocation~Options=} opt_options Options.
*/
constructor(opt_options) {
super();
const options = opt_options || {}; const options = opt_options || {};
@@ -90,24 +91,20 @@ const Geolocation = function(opt_options) {
this.setTracking(options.tracking !== undefined ? options.tracking : false); this.setTracking(options.tracking !== undefined ? options.tracking : false);
}; }
inherits(Geolocation, BaseObject);
/** /**
* @inheritDoc * @inheritDoc
*/ */
Geolocation.prototype.disposeInternal = function() { disposeInternal() {
this.setTracking(false); this.setTracking(false);
BaseObject.prototype.disposeInternal.call(this); super.disposeInternal();
}; }
/** /**
* @private * @private
*/ */
Geolocation.prototype.handleProjectionChanged_ = function() { handleProjectionChanged_() {
const projection = this.getProjection(); const projection = this.getProjection();
if (projection) { if (projection) {
this.transform_ = getTransformFromProjections( this.transform_ = getTransformFromProjections(
@@ -116,13 +113,12 @@ Geolocation.prototype.handleProjectionChanged_ = function() {
this.set(GeolocationProperty.POSITION, this.transform_(this.position_)); this.set(GeolocationProperty.POSITION, this.transform_(this.position_));
} }
} }
}; }
/** /**
* @private * @private
*/ */
Geolocation.prototype.handleTrackingChanged_ = function() { handleTrackingChanged_() {
if (GEOLOCATION) { if (GEOLOCATION) {
const tracking = this.getTracking(); const tracking = this.getTracking();
if (tracking && this.watchId_ === undefined) { if (tracking && this.watchId_ === undefined) {
@@ -135,14 +131,13 @@ Geolocation.prototype.handleTrackingChanged_ = function() {
this.watchId_ = undefined; this.watchId_ = undefined;
} }
} }
}; }
/** /**
* @private * @private
* @param {GeolocationPosition} position position event. * @param {GeolocationPosition} position position event.
*/ */
Geolocation.prototype.positionChange_ = function(position) { positionChange_(position) {
const coords = position.coords; const coords = position.coords;
this.set(GeolocationProperty.ACCURACY, coords.accuracy); this.set(GeolocationProperty.ACCURACY, coords.accuracy);
this.set(GeolocationProperty.ALTITUDE, this.set(GeolocationProperty.ALTITUDE,
@@ -166,7 +161,7 @@ Geolocation.prototype.positionChange_ = function(position) {
geometry.applyTransform(this.transform_); geometry.applyTransform(this.transform_);
this.set(GeolocationProperty.ACCURACY_GEOMETRY, geometry); this.set(GeolocationProperty.ACCURACY_GEOMETRY, geometry);
this.changed(); this.changed();
}; }
/** /**
* Triggered when the Geolocation returns an error. * Triggered when the Geolocation returns an error.
@@ -178,12 +173,11 @@ Geolocation.prototype.positionChange_ = function(position) {
* @private * @private
* @param {GeolocationPositionError} error error object. * @param {GeolocationPositionError} error error object.
*/ */
Geolocation.prototype.positionError_ = function(error) { positionError_(error) {
error.type = EventType.ERROR; error.type = EventType.ERROR;
this.setTracking(false); this.setTracking(false);
this.dispatchEvent(/** @type {{type: string, target: undefined}} */ (error)); this.dispatchEvent(/** @type {{type: string, target: undefined}} */ (error));
}; }
/** /**
* Get the accuracy of the position in meters. * Get the accuracy of the position in meters.
@@ -192,10 +186,9 @@ Geolocation.prototype.positionError_ = function(error) {
* @observable * @observable
* @api * @api
*/ */
Geolocation.prototype.getAccuracy = function() { getAccuracy() {
return /** @type {number|undefined} */ (this.get(GeolocationProperty.ACCURACY)); return /** @type {number|undefined} */ (this.get(GeolocationProperty.ACCURACY));
}; }
/** /**
* Get a geometry of the position accuracy. * Get a geometry of the position accuracy.
@@ -203,12 +196,11 @@ Geolocation.prototype.getAccuracy = function() {
* @observable * @observable
* @api * @api
*/ */
Geolocation.prototype.getAccuracyGeometry = function() { getAccuracyGeometry() {
return ( return (
/** @type {?module:ol/geom/Polygon} */ (this.get(GeolocationProperty.ACCURACY_GEOMETRY) || null) /** @type {?module:ol/geom/Polygon} */ (this.get(GeolocationProperty.ACCURACY_GEOMETRY) || null)
); );
}; }
/** /**
* Get the altitude associated with the position. * Get the altitude associated with the position.
@@ -217,10 +209,9 @@ Geolocation.prototype.getAccuracyGeometry = function() {
* @observable * @observable
* @api * @api
*/ */
Geolocation.prototype.getAltitude = function() { getAltitude() {
return /** @type {number|undefined} */ (this.get(GeolocationProperty.ALTITUDE)); return /** @type {number|undefined} */ (this.get(GeolocationProperty.ALTITUDE));
}; }
/** /**
* Get the altitude accuracy of the position. * Get the altitude accuracy of the position.
@@ -229,10 +220,9 @@ Geolocation.prototype.getAltitude = function() {
* @observable * @observable
* @api * @api
*/ */
Geolocation.prototype.getAltitudeAccuracy = function() { getAltitudeAccuracy() {
return /** @type {number|undefined} */ (this.get(GeolocationProperty.ALTITUDE_ACCURACY)); return /** @type {number|undefined} */ (this.get(GeolocationProperty.ALTITUDE_ACCURACY));
}; }
/** /**
* Get the heading as radians clockwise from North. * Get the heading as radians clockwise from North.
@@ -242,10 +232,9 @@ Geolocation.prototype.getAltitudeAccuracy = function() {
* @observable * @observable
* @api * @api
*/ */
Geolocation.prototype.getHeading = function() { getHeading() {
return /** @type {number|undefined} */ (this.get(GeolocationProperty.HEADING)); return /** @type {number|undefined} */ (this.get(GeolocationProperty.HEADING));
}; }
/** /**
* Get the position of the device. * Get the position of the device.
@@ -254,12 +243,11 @@ Geolocation.prototype.getHeading = function() {
* @observable * @observable
* @api * @api
*/ */
Geolocation.prototype.getPosition = function() { getPosition() {
return ( return (
/** @type {module:ol/coordinate~Coordinate|undefined} */ (this.get(GeolocationProperty.POSITION)) /** @type {module:ol/coordinate~Coordinate|undefined} */ (this.get(GeolocationProperty.POSITION))
); );
}; }
/** /**
* Get the projection associated with the position. * Get the projection associated with the position.
@@ -268,12 +256,11 @@ Geolocation.prototype.getPosition = function() {
* @observable * @observable
* @api * @api
*/ */
Geolocation.prototype.getProjection = function() { getProjection() {
return ( return (
/** @type {module:ol/proj/Projection|undefined} */ (this.get(GeolocationProperty.PROJECTION)) /** @type {module:ol/proj/Projection|undefined} */ (this.get(GeolocationProperty.PROJECTION))
); );
}; }
/** /**
* Get the speed in meters per second. * Get the speed in meters per second.
@@ -282,10 +269,9 @@ Geolocation.prototype.getProjection = function() {
* @observable * @observable
* @api * @api
*/ */
Geolocation.prototype.getSpeed = function() { getSpeed() {
return /** @type {number|undefined} */ (this.get(GeolocationProperty.SPEED)); return /** @type {number|undefined} */ (this.get(GeolocationProperty.SPEED));
}; }
/** /**
* Determine if the device location is being tracked. * Determine if the device location is being tracked.
@@ -293,10 +279,9 @@ Geolocation.prototype.getSpeed = function() {
* @observable * @observable
* @api * @api
*/ */
Geolocation.prototype.getTracking = function() { getTracking() {
return /** @type {boolean} */ (this.get(GeolocationProperty.TRACKING)); return /** @type {boolean} */ (this.get(GeolocationProperty.TRACKING));
}; }
/** /**
* Get the tracking options. * Get the tracking options.
@@ -307,10 +292,9 @@ Geolocation.prototype.getTracking = function() {
* @observable * @observable
* @api * @api
*/ */
Geolocation.prototype.getTrackingOptions = function() { getTrackingOptions() {
return /** @type {GeolocationPositionOptions|undefined} */ (this.get(GeolocationProperty.TRACKING_OPTIONS)); return /** @type {GeolocationPositionOptions|undefined} */ (this.get(GeolocationProperty.TRACKING_OPTIONS));
}; }
/** /**
* Set the projection to use for transforming the coordinates. * Set the projection to use for transforming the coordinates.
@@ -319,10 +303,9 @@ Geolocation.prototype.getTrackingOptions = function() {
* @observable * @observable
* @api * @api
*/ */
Geolocation.prototype.setProjection = function(projection) { setProjection(projection) {
this.set(GeolocationProperty.PROJECTION, getProjection(projection)); this.set(GeolocationProperty.PROJECTION, getProjection(projection));
}; }
/** /**
* Enable or disable tracking. * Enable or disable tracking.
@@ -330,10 +313,9 @@ Geolocation.prototype.setProjection = function(projection) {
* @observable * @observable
* @api * @api
*/ */
Geolocation.prototype.setTracking = function(tracking) { setTracking(tracking) {
this.set(GeolocationProperty.TRACKING, tracking); this.set(GeolocationProperty.TRACKING, tracking);
}; }
/** /**
* Set the tracking options. * Set the tracking options.
@@ -344,7 +326,10 @@ Geolocation.prototype.setTracking = function(tracking) {
* @observable * @observable
* @api * @api
*/ */
Geolocation.prototype.setTrackingOptions = function(options) { setTrackingOptions(options) {
this.set(GeolocationProperty.TRACKING_OPTIONS, options); this.set(GeolocationProperty.TRACKING_OPTIONS, options);
}; }
}
export default Geolocation; export default Geolocation;
+37 -45
View File
@@ -112,11 +112,14 @@ const INTERVALS = [
/** /**
* Render a grid for a coordinate system on a map. * Render a grid for a coordinate system on a map.
* @constructor
* @param {module:ol/Graticule~Options=} opt_options Options.
* @api * @api
*/ */
const Graticule = function(opt_options) { class Graticule {
/**
* @param {module:ol/Graticule~Options=} opt_options Options.
*/
constructor(opt_options) {
const options = opt_options || {}; const options = opt_options || {};
/** /**
@@ -317,8 +320,7 @@ const Graticule = function(opt_options) {
} }
this.setMap(options.map !== undefined ? options.map : null); this.setMap(options.map !== undefined ? options.map : null);
}; }
/** /**
* @param {number} lon Longitude. * @param {number} lon Longitude.
@@ -330,7 +332,7 @@ const Graticule = function(opt_options) {
* @return {number} Index. * @return {number} Index.
* @private * @private
*/ */
Graticule.prototype.addMeridian_ = function(lon, minLat, maxLat, squaredTolerance, extent, index) { addMeridian_(lon, minLat, maxLat, squaredTolerance, extent, index) {
const lineString = this.getMeridian_(lon, minLat, maxLat, squaredTolerance, index); const lineString = this.getMeridian_(lon, minLat, maxLat, squaredTolerance, index);
if (intersects(lineString.getExtent(), extent)) { if (intersects(lineString.getExtent(), extent)) {
if (this.meridiansLabels_) { if (this.meridiansLabels_) {
@@ -343,7 +345,7 @@ Graticule.prototype.addMeridian_ = function(lon, minLat, maxLat, squaredToleranc
this.meridians_[index++] = lineString; this.meridians_[index++] = lineString;
} }
return index; return index;
}; }
/** /**
* @param {module:ol/geom/LineString} lineString Meridian * @param {module:ol/geom/LineString} lineString Meridian
@@ -352,7 +354,7 @@ Graticule.prototype.addMeridian_ = function(lon, minLat, maxLat, squaredToleranc
* @return {module:ol/geom/Point} Meridian point. * @return {module:ol/geom/Point} Meridian point.
* @private * @private
*/ */
Graticule.prototype.getMeridianPoint_ = function(lineString, extent, index) { getMeridianPoint_(lineString, extent, index) {
const flatCoordinates = lineString.getFlatCoordinates(); const flatCoordinates = lineString.getFlatCoordinates();
const clampedBottom = Math.max(extent[1], flatCoordinates[1]); const clampedBottom = Math.max(extent[1], flatCoordinates[1]);
const clampedTop = Math.min(extent[3], flatCoordinates[flatCoordinates.length - 1]); const clampedTop = Math.min(extent[3], flatCoordinates[flatCoordinates.length - 1]);
@@ -368,8 +370,7 @@ Graticule.prototype.getMeridianPoint_ = function(lineString, extent, index) {
point = new Point(coordinate); point = new Point(coordinate);
} }
return point; return point;
}; }
/** /**
* @param {number} lat Latitude. * @param {number} lat Latitude.
@@ -381,7 +382,7 @@ Graticule.prototype.getMeridianPoint_ = function(lineString, extent, index) {
* @return {number} Index. * @return {number} Index.
* @private * @private
*/ */
Graticule.prototype.addParallel_ = function(lat, minLon, maxLon, squaredTolerance, extent, index) { addParallel_(lat, minLon, maxLon, squaredTolerance, extent, index) {
const lineString = this.getParallel_(lat, minLon, maxLon, squaredTolerance, index); const lineString = this.getParallel_(lat, minLon, maxLon, squaredTolerance, index);
if (intersects(lineString.getExtent(), extent)) { if (intersects(lineString.getExtent(), extent)) {
if (this.parallelsLabels_) { if (this.parallelsLabels_) {
@@ -394,8 +395,7 @@ Graticule.prototype.addParallel_ = function(lat, minLon, maxLon, squaredToleranc
this.parallels_[index++] = lineString; this.parallels_[index++] = lineString;
} }
return index; return index;
}; }
/** /**
* @param {module:ol/geom/LineString} lineString Parallels. * @param {module:ol/geom/LineString} lineString Parallels.
@@ -404,7 +404,7 @@ Graticule.prototype.addParallel_ = function(lat, minLon, maxLon, squaredToleranc
* @return {module:ol/geom/Point} Parallel point. * @return {module:ol/geom/Point} Parallel point.
* @private * @private
*/ */
Graticule.prototype.getParallelPoint_ = function(lineString, extent, index) { getParallelPoint_(lineString, extent, index) {
const flatCoordinates = lineString.getFlatCoordinates(); const flatCoordinates = lineString.getFlatCoordinates();
const clampedLeft = Math.max(extent[0], flatCoordinates[0]); const clampedLeft = Math.max(extent[0], flatCoordinates[0]);
const clampedRight = Math.min(extent[2], flatCoordinates[flatCoordinates.length - 2]); const clampedRight = Math.min(extent[2], flatCoordinates[flatCoordinates.length - 2]);
@@ -420,8 +420,7 @@ Graticule.prototype.getParallelPoint_ = function(lineString, extent, index) {
point = new Point(coordinate); point = new Point(coordinate);
} }
return point; return point;
}; }
/** /**
* @param {module:ol/extent~Extent} extent Extent. * @param {module:ol/extent~Extent} extent Extent.
@@ -430,7 +429,7 @@ Graticule.prototype.getParallelPoint_ = function(lineString, extent, index) {
* @param {number} squaredTolerance Squared tolerance. * @param {number} squaredTolerance Squared tolerance.
* @private * @private
*/ */
Graticule.prototype.createGraticule_ = function(extent, center, resolution, squaredTolerance) { createGraticule_(extent, center, resolution, squaredTolerance) {
const interval = this.getInterval_(resolution); const interval = this.getInterval_(resolution);
if (interval == -1) { if (interval == -1) {
@@ -515,15 +514,14 @@ Graticule.prototype.createGraticule_ = function(extent, center, resolution, squa
this.parallelsLabels_.length = idx; this.parallelsLabels_.length = idx;
} }
}; }
/** /**
* @param {number} resolution Resolution. * @param {number} resolution Resolution.
* @return {number} The interval in degrees. * @return {number} The interval in degrees.
* @private * @private
*/ */
Graticule.prototype.getInterval_ = function(resolution) { getInterval_(resolution) {
const centerLon = this.projectionCenterLonLat_[0]; const centerLon = this.projectionCenterLonLat_[0];
const centerLat = this.projectionCenterLonLat_[1]; const centerLat = this.projectionCenterLonLat_[1];
let interval = -1; let interval = -1;
@@ -547,18 +545,16 @@ Graticule.prototype.getInterval_ = function(resolution) {
interval = INTERVALS[i]; interval = INTERVALS[i];
} }
return interval; return interval;
}; }
/** /**
* Get the map associated with this graticule. * Get the map associated with this graticule.
* @return {module:ol/PluggableMap} The map. * @return {module:ol/PluggableMap} The map.
* @api * @api
*/ */
Graticule.prototype.getMap = function() { getMap() {
return this.map_; return this.map_;
}; }
/** /**
* @param {number} lon Longitude. * @param {number} lon Longitude.
@@ -569,7 +565,7 @@ Graticule.prototype.getMap = function() {
* @param {number} index Index. * @param {number} index Index.
* @private * @private
*/ */
Graticule.prototype.getMeridian_ = function(lon, minLat, maxLat, squaredTolerance, index) { getMeridian_(lon, minLat, maxLat, squaredTolerance, index) {
const flatCoordinates = meridian(lon, minLat, maxLat, this.projection_, squaredTolerance); const flatCoordinates = meridian(lon, minLat, maxLat, this.projection_, squaredTolerance);
let lineString = this.meridians_[index]; let lineString = this.meridians_[index];
if (!lineString) { if (!lineString) {
@@ -579,18 +575,16 @@ Graticule.prototype.getMeridian_ = function(lon, minLat, maxLat, squaredToleranc
lineString.changed(); lineString.changed();
} }
return lineString; return lineString;
}; }
/** /**
* Get the list of meridians. Meridians are lines of equal longitude. * Get the list of meridians. Meridians are lines of equal longitude.
* @return {Array.<module:ol/geom/LineString>} The meridians. * @return {Array.<module:ol/geom/LineString>} The meridians.
* @api * @api
*/ */
Graticule.prototype.getMeridians = function() { getMeridians() {
return this.meridians_; return this.meridians_;
}; }
/** /**
* @param {number} lat Latitude. * @param {number} lat Latitude.
@@ -601,7 +595,7 @@ Graticule.prototype.getMeridians = function() {
* @param {number} index Index. * @param {number} index Index.
* @private * @private
*/ */
Graticule.prototype.getParallel_ = function(lat, minLon, maxLon, squaredTolerance, index) { getParallel_(lat, minLon, maxLon, squaredTolerance, index) {
const flatCoordinates = parallel(lat, minLon, maxLon, this.projection_, squaredTolerance); const flatCoordinates = parallel(lat, minLon, maxLon, this.projection_, squaredTolerance);
let lineString = this.parallels_[index]; let lineString = this.parallels_[index];
if (!lineString) { if (!lineString) {
@@ -611,24 +605,22 @@ Graticule.prototype.getParallel_ = function(lat, minLon, maxLon, squaredToleranc
lineString.changed(); lineString.changed();
} }
return lineString; return lineString;
}; }
/** /**
* Get the list of parallels. Parallels are lines of equal latitude. * Get the list of parallels. Parallels are lines of equal latitude.
* @return {Array.<module:ol/geom/LineString>} The parallels. * @return {Array.<module:ol/geom/LineString>} The parallels.
* @api * @api
*/ */
Graticule.prototype.getParallels = function() { getParallels() {
return this.parallels_; return this.parallels_;
}; }
/** /**
* @param {module:ol/render/Event} e Event. * @param {module:ol/render/Event} e Event.
* @private * @private
*/ */
Graticule.prototype.handlePostCompose_ = function(e) { handlePostCompose_(e) {
const vectorContext = e.vectorContext; const vectorContext = e.vectorContext;
const frameState = e.frameState; const frameState = e.frameState;
const extent = frameState.extent; const extent = frameState.extent;
@@ -677,14 +669,13 @@ Graticule.prototype.handlePostCompose_ = function(e) {
vectorContext.drawGeometry(labelData.geom); vectorContext.drawGeometry(labelData.geom);
} }
} }
}; }
/** /**
* @param {module:ol/proj/Projection} projection Projection. * @param {module:ol/proj/Projection} projection Projection.
* @private * @private
*/ */
Graticule.prototype.updateProjectionInfo_ = function(projection) { updateProjectionInfo_(projection) {
const epsg4326Projection = getProjection('EPSG:4326'); const epsg4326Projection = getProjection('EPSG:4326');
const worldExtent = projection.getWorldExtent(); const worldExtent = projection.getWorldExtent();
@@ -707,8 +698,7 @@ Graticule.prototype.updateProjectionInfo_ = function(projection) {
this.projectionCenterLonLat_ = this.toLonLatTransform_(getCenter(projection.getExtent())); this.projectionCenterLonLat_ = this.toLonLatTransform_(getCenter(projection.getExtent()));
this.projection_ = projection; this.projection_ = projection;
}; }
/** /**
* Set the map for this graticule. The graticule will be rendered on the * Set the map for this graticule. The graticule will be rendered on the
@@ -716,7 +706,7 @@ Graticule.prototype.updateProjectionInfo_ = function(projection) {
* @param {module:ol/PluggableMap} map Map. * @param {module:ol/PluggableMap} map Map.
* @api * @api
*/ */
Graticule.prototype.setMap = function(map) { setMap(map) {
if (this.map_) { if (this.map_) {
unlistenByKey(this.postcomposeListenerKey_); unlistenByKey(this.postcomposeListenerKey_);
this.postcomposeListenerKey_ = null; this.postcomposeListenerKey_ = null;
@@ -727,5 +717,7 @@ Graticule.prototype.setMap = function(map) {
map.render(); map.render();
} }
this.map_ = map; this.map_ = map;
}; }
}
export default Graticule; export default Graticule;
+19 -26
View File
@@ -1,7 +1,6 @@
/** /**
* @module ol/Image * @module ol/Image
*/ */
import {inherits} from './util.js';
import ImageBase from './ImageBase.js'; import ImageBase from './ImageBase.js';
import ImageState from './ImageState.js'; import ImageState from './ImageState.js';
import {listenOnce, unlistenByKey} from './events.js'; import {listenOnce, unlistenByKey} from './events.js';
@@ -28,9 +27,9 @@ import {getHeight} from './extent.js';
*/ */
class ImageWrapper extends ImageBase {
/** /**
* @constructor
* @extends {module:ol/ImageBase}
* @param {module:ol/extent~Extent} extent Extent. * @param {module:ol/extent~Extent} extent Extent.
* @param {number|undefined} resolution Resolution. * @param {number|undefined} resolution Resolution.
* @param {number} pixelRatio Pixel ratio. * @param {number} pixelRatio Pixel ratio.
@@ -38,9 +37,9 @@ import {getHeight} from './extent.js';
* @param {?string} crossOrigin Cross origin. * @param {?string} crossOrigin Cross origin.
* @param {module:ol/Image~LoadFunction} imageLoadFunction Image load function. * @param {module:ol/Image~LoadFunction} imageLoadFunction Image load function.
*/ */
const ImageWrapper = function(extent, resolution, pixelRatio, src, crossOrigin, imageLoadFunction) { constructor(extent, resolution, pixelRatio, src, crossOrigin, imageLoadFunction) {
ImageBase.call(this, extent, resolution, pixelRatio, ImageState.IDLE); super(extent, resolution, pixelRatio, ImageState.IDLE);
/** /**
* @private * @private
@@ -75,46 +74,40 @@ const ImageWrapper = function(extent, resolution, pixelRatio, src, crossOrigin,
*/ */
this.imageLoadFunction_ = imageLoadFunction; this.imageLoadFunction_ = imageLoadFunction;
}; }
inherits(ImageWrapper, ImageBase);
/** /**
* @inheritDoc * @inheritDoc
* @api * @api
*/ */
ImageWrapper.prototype.getImage = function() { getImage() {
return this.image_; return this.image_;
}; }
/** /**
* Tracks loading or read errors. * Tracks loading or read errors.
* *
* @private * @private
*/ */
ImageWrapper.prototype.handleImageError_ = function() { handleImageError_() {
this.state = ImageState.ERROR; this.state = ImageState.ERROR;
this.unlistenImage_(); this.unlistenImage_();
this.changed(); this.changed();
}; }
/** /**
* Tracks successful image load. * Tracks successful image load.
* *
* @private * @private
*/ */
ImageWrapper.prototype.handleImageLoad_ = function() { handleImageLoad_() {
if (this.resolution === undefined) { if (this.resolution === undefined) {
this.resolution = getHeight(this.extent) / this.image_.height; this.resolution = getHeight(this.extent) / this.image_.height;
} }
this.state = ImageState.LOADED; this.state = ImageState.LOADED;
this.unlistenImage_(); this.unlistenImage_();
this.changed(); this.changed();
}; }
/** /**
* Load the image or retry if loading previously failed. * Load the image or retry if loading previously failed.
@@ -123,7 +116,7 @@ ImageWrapper.prototype.handleImageLoad_ = function() {
* @override * @override
* @api * @api
*/ */
ImageWrapper.prototype.load = function() { load() {
if (this.state == ImageState.IDLE || this.state == ImageState.ERROR) { if (this.state == ImageState.IDLE || this.state == ImageState.ERROR) {
this.state = ImageState.LOADING; this.state = ImageState.LOADING;
this.changed(); this.changed();
@@ -135,25 +128,25 @@ ImageWrapper.prototype.load = function() {
]; ];
this.imageLoadFunction_(this, this.src_); this.imageLoadFunction_(this, this.src_);
} }
}; }
/** /**
* @param {HTMLCanvasElement|HTMLImageElement|HTMLVideoElement} image Image. * @param {HTMLCanvasElement|HTMLImageElement|HTMLVideoElement} image Image.
*/ */
ImageWrapper.prototype.setImage = function(image) { setImage(image) {
this.image_ = image; this.image_ = image;
}; }
/** /**
* Discards event handlers which listen for load completion or errors. * Discards event handlers which listen for load completion or errors.
* *
* @private * @private
*/ */
ImageWrapper.prototype.unlistenImage_ = function() { unlistenImage_() {
this.imageListenerKeys_.forEach(unlistenByKey); this.imageListenerKeys_.forEach(unlistenByKey);
this.imageListenerKeys_ = null; this.imageListenerKeys_ = null;
}; }
}
export default ImageWrapper; export default ImageWrapper;
+21 -27
View File
@@ -1,22 +1,23 @@
/** /**
* @module ol/ImageBase * @module ol/ImageBase
*/ */
import {inherits} from './util.js';
import EventTarget from './events/EventTarget.js'; import EventTarget from './events/EventTarget.js';
import EventType from './events/EventType.js'; import EventType from './events/EventType.js';
/** /**
* @constructor
* @abstract * @abstract
* @extends {module:ol/events/EventTarget} */
class ImageBase extends EventTarget {
/**
* @param {module:ol/extent~Extent} extent Extent. * @param {module:ol/extent~Extent} extent Extent.
* @param {number|undefined} resolution Resolution. * @param {number|undefined} resolution Resolution.
* @param {number} pixelRatio Pixel ratio. * @param {number} pixelRatio Pixel ratio.
* @param {module:ol/ImageState} state State. * @param {module:ol/ImageState} state State.
*/ */
const ImageBase = function(extent, resolution, pixelRatio, state) { constructor(extent, resolution, pixelRatio, state) {
EventTarget.call(this); super();
/** /**
* @protected * @protected
@@ -42,62 +43,55 @@ const ImageBase = function(extent, resolution, pixelRatio, state) {
*/ */
this.state = state; this.state = state;
}; }
inherits(ImageBase, EventTarget);
/** /**
* @protected * @protected
*/ */
ImageBase.prototype.changed = function() { changed() {
this.dispatchEvent(EventType.CHANGE); this.dispatchEvent(EventType.CHANGE);
}; }
/** /**
* @return {module:ol/extent~Extent} Extent. * @return {module:ol/extent~Extent} Extent.
*/ */
ImageBase.prototype.getExtent = function() { getExtent() {
return this.extent; return this.extent;
}; }
/** /**
* @abstract * @abstract
* @return {HTMLCanvasElement|HTMLImageElement|HTMLVideoElement} Image. * @return {HTMLCanvasElement|HTMLImageElement|HTMLVideoElement} Image.
*/ */
ImageBase.prototype.getImage = function() {}; getImage() {}
/** /**
* @return {number} PixelRatio. * @return {number} PixelRatio.
*/ */
ImageBase.prototype.getPixelRatio = function() { getPixelRatio() {
return this.pixelRatio_; return this.pixelRatio_;
}; }
/** /**
* @return {number} Resolution. * @return {number} Resolution.
*/ */
ImageBase.prototype.getResolution = function() { getResolution() {
return /** @type {number} */ (this.resolution); return /** @type {number} */ (this.resolution);
}; }
/** /**
* @return {module:ol/ImageState} State. * @return {module:ol/ImageState} State.
*/ */
ImageBase.prototype.getState = function() { getState() {
return this.state; return this.state;
}; }
/** /**
* Load not yet loaded URI. * Load not yet loaded URI.
* @abstract * @abstract
*/ */
ImageBase.prototype.load = function() {}; load() {}
}
export default ImageBase; export default ImageBase;
+19 -23
View File
@@ -1,7 +1,6 @@
/** /**
* @module ol/ImageCanvas * @module ol/ImageCanvas
*/ */
import {inherits} from './util.js';
import ImageBase from './ImageBase.js'; import ImageBase from './ImageBase.js';
import ImageState from './ImageState.js'; import ImageState from './ImageState.js';
@@ -16,9 +15,9 @@ import ImageState from './ImageState.js';
*/ */
class ImageCanvas extends ImageBase {
/** /**
* @constructor
* @extends {module:ol/ImageBase}
* @param {module:ol/extent~Extent} extent Extent. * @param {module:ol/extent~Extent} extent Extent.
* @param {number} resolution Resolution. * @param {number} resolution Resolution.
* @param {number} pixelRatio Pixel ratio. * @param {number} pixelRatio Pixel ratio.
@@ -26,7 +25,11 @@ import ImageState from './ImageState.js';
* @param {module:ol/ImageCanvas~Loader=} opt_loader Optional loader function to * @param {module:ol/ImageCanvas~Loader=} opt_loader Optional loader function to
* support asynchronous canvas drawing. * support asynchronous canvas drawing.
*/ */
const ImageCanvas = function(extent, resolution, pixelRatio, canvas, opt_loader) { constructor(extent, resolution, pixelRatio, canvas, opt_loader) {
const state = opt_loader !== undefined ? ImageState.IDLE : ImageState.LOADED;
super(extent, resolution, pixelRatio, state);
/** /**
* Optional canvas loader function. * Optional canvas loader function.
@@ -35,10 +38,6 @@ const ImageCanvas = function(extent, resolution, pixelRatio, canvas, opt_loader)
*/ */
this.loader_ = opt_loader !== undefined ? opt_loader : null; this.loader_ = opt_loader !== undefined ? opt_loader : null;
const state = opt_loader !== undefined ? ImageState.IDLE : ImageState.LOADED;
ImageBase.call(this, extent, resolution, pixelRatio, state);
/** /**
* @private * @private
* @type {HTMLCanvasElement} * @type {HTMLCanvasElement}
@@ -51,26 +50,22 @@ const ImageCanvas = function(extent, resolution, pixelRatio, canvas, opt_loader)
*/ */
this.error_ = null; this.error_ = null;
}; }
inherits(ImageCanvas, ImageBase);
/** /**
* Get any error associated with asynchronous rendering. * Get any error associated with asynchronous rendering.
* @return {Error} Any error that occurred during rendering. * @return {Error} Any error that occurred during rendering.
*/ */
ImageCanvas.prototype.getError = function() { getError() {
return this.error_; return this.error_;
}; }
/** /**
* Handle async drawing complete. * Handle async drawing complete.
* @param {Error} err Any error during drawing. * @param {Error} err Any error during drawing.
* @private * @private
*/ */
ImageCanvas.prototype.handleLoad_ = function(err) { handleLoad_(err) {
if (err) { if (err) {
this.error_ = err; this.error_ = err;
this.state = ImageState.ERROR; this.state = ImageState.ERROR;
@@ -78,25 +73,26 @@ ImageCanvas.prototype.handleLoad_ = function(err) {
this.state = ImageState.LOADED; this.state = ImageState.LOADED;
} }
this.changed(); this.changed();
}; }
/** /**
* @inheritDoc * @inheritDoc
*/ */
ImageCanvas.prototype.load = function() { load() {
if (this.state == ImageState.IDLE) { if (this.state == ImageState.IDLE) {
this.state = ImageState.LOADING; this.state = ImageState.LOADING;
this.changed(); this.changed();
this.loader_(this.handleLoad_.bind(this)); this.loader_(this.handleLoad_.bind(this));
} }
}; }
/** /**
* @return {HTMLCanvasElement} Canvas element. * @return {HTMLCanvasElement} Canvas element.
*/ */
ImageCanvas.prototype.getImage = function() { getImage() {
return this.canvas_; return this.canvas_;
}; }
}
export default ImageCanvas; export default ImageCanvas;
+21 -30
View File
@@ -1,7 +1,6 @@
/** /**
* @module ol/ImageTile * @module ol/ImageTile
*/ */
import {inherits} from './util.js';
import Tile from './Tile.js'; import Tile from './Tile.js';
import TileState from './TileState.js'; import TileState from './TileState.js';
import {createCanvasContext2D} from './dom.js'; import {createCanvasContext2D} from './dom.js';
@@ -14,9 +13,9 @@ import EventType from './events/EventType.js';
* @api * @api
*/ */
class ImageTile extends Tile {
/** /**
* @constructor
* @extends {module:ol/Tile}
* @param {module:ol/tilecoord~TileCoord} tileCoord Tile coordinate. * @param {module:ol/tilecoord~TileCoord} tileCoord Tile coordinate.
* @param {module:ol/TileState} state State. * @param {module:ol/TileState} state State.
* @param {string} src Image source URI. * @param {string} src Image source URI.
@@ -24,9 +23,9 @@ import EventType from './events/EventType.js';
* @param {module:ol/Tile~LoadFunction} tileLoadFunction Tile load function. * @param {module:ol/Tile~LoadFunction} tileLoadFunction Tile load function.
* @param {module:ol/Tile~Options=} opt_options Tile options. * @param {module:ol/Tile~Options=} opt_options Tile options.
*/ */
const ImageTile = function(tileCoord, state, src, crossOrigin, tileLoadFunction, opt_options) { constructor(tileCoord, state, src, crossOrigin, tileLoadFunction, opt_options) {
Tile.call(this, tileCoord, state, opt_options); super(tileCoord, state, opt_options);
/** /**
* @private * @private
@@ -63,15 +62,12 @@ const ImageTile = function(tileCoord, state, src, crossOrigin, tileLoadFunction,
*/ */
this.tileLoadFunction_ = tileLoadFunction; this.tileLoadFunction_ = tileLoadFunction;
}; }
inherits(ImageTile, Tile);
/** /**
* @inheritDoc * @inheritDoc
*/ */
ImageTile.prototype.disposeInternal = function() { disposeInternal() {
if (this.state == TileState.LOADING) { if (this.state == TileState.LOADING) {
this.unlistenImage_(); this.unlistenImage_();
this.image_ = getBlankImage(); this.image_ = getBlankImage();
@@ -81,47 +77,43 @@ ImageTile.prototype.disposeInternal = function() {
} }
this.state = TileState.ABORT; this.state = TileState.ABORT;
this.changed(); this.changed();
Tile.prototype.disposeInternal.call(this); super.disposeInternal();
}; }
/** /**
* Get the HTML image element for this tile (may be a Canvas, Image, or Video). * Get the HTML image element for this tile (may be a Canvas, Image, or Video).
* @return {HTMLCanvasElement|HTMLImageElement|HTMLVideoElement} Image. * @return {HTMLCanvasElement|HTMLImageElement|HTMLVideoElement} Image.
* @api * @api
*/ */
ImageTile.prototype.getImage = function() { getImage() {
return this.image_; return this.image_;
}; }
/** /**
* @inheritDoc * @inheritDoc
*/ */
ImageTile.prototype.getKey = function() { getKey() {
return this.src_; return this.src_;
}; }
/** /**
* Tracks loading or read errors. * Tracks loading or read errors.
* *
* @private * @private
*/ */
ImageTile.prototype.handleImageError_ = function() { handleImageError_() {
this.state = TileState.ERROR; this.state = TileState.ERROR;
this.unlistenImage_(); this.unlistenImage_();
this.image_ = getBlankImage(); this.image_ = getBlankImage();
this.changed(); this.changed();
}; }
/** /**
* Tracks successful image load. * Tracks successful image load.
* *
* @private * @private
*/ */
ImageTile.prototype.handleImageLoad_ = function() { handleImageLoad_() {
if (this.image_.naturalWidth && this.image_.naturalHeight) { if (this.image_.naturalWidth && this.image_.naturalHeight) {
this.state = TileState.LOADED; this.state = TileState.LOADED;
} else { } else {
@@ -129,14 +121,13 @@ ImageTile.prototype.handleImageLoad_ = function() {
} }
this.unlistenImage_(); this.unlistenImage_();
this.changed(); this.changed();
}; }
/** /**
* @inheritDoc * @inheritDoc
* @api * @api
*/ */
ImageTile.prototype.load = function() { load() {
if (this.state == TileState.ERROR) { if (this.state == TileState.ERROR) {
this.state = TileState.IDLE; this.state = TileState.IDLE;
this.image_ = new Image(); this.image_ = new Image();
@@ -155,18 +146,18 @@ ImageTile.prototype.load = function() {
]; ];
this.tileLoadFunction_(this, this.src_); this.tileLoadFunction_(this, this.src_);
} }
}; }
/** /**
* Discards event handlers which listen for load completion or errors. * Discards event handlers which listen for load completion or errors.
* *
* @private * @private
*/ */
ImageTile.prototype.unlistenImage_ = function() { unlistenImage_() {
this.imageListenerKeys_.forEach(unlistenByKey); this.imageListenerKeys_.forEach(unlistenByKey);
this.imageListenerKeys_ = null; this.imageListenerKeys_ = null;
}; }
}
/** /**
+19 -20
View File
@@ -6,15 +6,17 @@
* @classdesc * @classdesc
* Implementation of inertial deceleration for map movement. * Implementation of inertial deceleration for map movement.
* *
* @constructor * @api
*/
class Kinetic {
/**
* @param {number} decay Rate of decay (must be negative). * @param {number} decay Rate of decay (must be negative).
* @param {number} minVelocity Minimum velocity (pixels/millisecond). * @param {number} minVelocity Minimum velocity (pixels/millisecond).
* @param {number} delay Delay to consider to calculate the kinetic * @param {number} delay Delay to consider to calculate the kinetic
* initial values (milliseconds). * initial values (milliseconds).
* @struct
* @api
*/ */
const Kinetic = function(decay, minVelocity, delay) { constructor(decay, minVelocity, delay) {
/** /**
* @private * @private
@@ -51,32 +53,29 @@ const Kinetic = function(decay, minVelocity, delay) {
* @type {number} * @type {number}
*/ */
this.initialVelocity_ = 0; this.initialVelocity_ = 0;
}; }
/** /**
* FIXME empty description for jsdoc * FIXME empty description for jsdoc
*/ */
Kinetic.prototype.begin = function() { begin() {
this.points_.length = 0; this.points_.length = 0;
this.angle_ = 0; this.angle_ = 0;
this.initialVelocity_ = 0; this.initialVelocity_ = 0;
}; }
/** /**
* @param {number} x X. * @param {number} x X.
* @param {number} y Y. * @param {number} y Y.
*/ */
Kinetic.prototype.update = function(x, y) { update(x, y) {
this.points_.push(x, y, Date.now()); this.points_.push(x, y, Date.now());
}; }
/** /**
* @return {boolean} Whether we should do kinetic animation. * @return {boolean} Whether we should do kinetic animation.
*/ */
Kinetic.prototype.end = function() { end() {
if (this.points_.length < 6) { if (this.points_.length < 6) {
// at least 2 points are required (i.e. there must be at least 6 elements // at least 2 points are required (i.e. there must be at least 6 elements
// in the array) // in the array)
@@ -109,21 +108,21 @@ Kinetic.prototype.end = function() {
this.angle_ = Math.atan2(dy, dx); this.angle_ = Math.atan2(dy, dx);
this.initialVelocity_ = Math.sqrt(dx * dx + dy * dy) / duration; this.initialVelocity_ = Math.sqrt(dx * dx + dy * dy) / duration;
return this.initialVelocity_ > this.minVelocity_; return this.initialVelocity_ > this.minVelocity_;
}; }
/** /**
* @return {number} Total distance travelled (pixels). * @return {number} Total distance travelled (pixels).
*/ */
Kinetic.prototype.getDistance = function() { getDistance() {
return (this.minVelocity_ - this.initialVelocity_) / this.decay_; return (this.minVelocity_ - this.initialVelocity_) / this.decay_;
}; }
/** /**
* @return {number} Angle of the kinetic panning animation (radians). * @return {number} Angle of the kinetic panning animation (radians).
*/ */
Kinetic.prototype.getAngle = function() { getAngle() {
return this.angle_; return this.angle_;
}; }
}
export default Kinetic; export default Kinetic;
+12 -11
View File
@@ -1,7 +1,6 @@
/** /**
* @module ol/Map * @module ol/Map
*/ */
import {inherits} from './util.js';
import PluggableMap from './PluggableMap.js'; import PluggableMap from './PluggableMap.js';
import {defaults as defaultControls} from './control/util.js'; import {defaults as defaultControls} from './control/util.js';
import {defaults as defaultInteractions} from './interaction.js'; import {defaults as defaultInteractions} from './interaction.js';
@@ -57,16 +56,18 @@ import CanvasVectorTileLayerRenderer from './renderer/canvas/VectorTileLayer.js'
* options or added with `addLayer` can be groups, which can contain further * options or added with `addLayer` can be groups, which can contain further
* groups, and so on. * groups, and so on.
* *
* @constructor
* @extends {module:ol/PluggableMap}
* @param {module:ol/PluggableMap~MapOptions} options Map options.
* @fires module:ol/MapBrowserEvent~MapBrowserEvent * @fires module:ol/MapBrowserEvent~MapBrowserEvent
* @fires module:ol/MapEvent~MapEvent * @fires module:ol/MapEvent~MapEvent
* @fires module:ol/render/Event~RenderEvent#postcompose * @fires module:ol/render/Event~RenderEvent#postcompose
* @fires module:ol/render/Event~RenderEvent#precompose * @fires module:ol/render/Event~RenderEvent#precompose
* @api * @api
*/ */
const Map = function(options) { class Map extends PluggableMap {
/**
* @param {module:ol/PluggableMap~MapOptions} options Map options.
*/
constructor(options) {
options = assign({}, options); options = assign({}, options);
if (!options.controls) { if (!options.controls) {
options.controls = defaultControls(); options.controls = defaultControls();
@@ -75,12 +76,10 @@ const Map = function(options) {
options.interactions = defaultInteractions(); options.interactions = defaultInteractions();
} }
PluggableMap.call(this, options); super(options);
}; }
inherits(Map, PluggableMap); createRenderer() {
Map.prototype.createRenderer = function() {
const renderer = new CanvasMapRenderer(this); const renderer = new CanvasMapRenderer(this);
renderer.registerLayerRenderers([ renderer.registerLayerRenderers([
CanvasImageLayerRenderer, CanvasImageLayerRenderer,
@@ -89,6 +88,8 @@ Map.prototype.createRenderer = function() {
CanvasVectorTileLayerRenderer CanvasVectorTileLayerRenderer
]); ]);
return renderer; return renderer;
}; }
}
export default Map; export default Map;
+16 -17
View File
@@ -1,25 +1,25 @@
/** /**
* @module ol/MapBrowserEvent * @module ol/MapBrowserEvent
*/ */
import {inherits} from './util.js';
import MapEvent from './MapEvent.js'; import MapEvent from './MapEvent.js';
/** /**
* @classdesc * @classdesc
* Events emitted as map browser events are instances of this type. * Events emitted as map browser events are instances of this type.
* See {@link module:ol/Map~Map} for which events trigger a map browser event. * See {@link module:ol/Map~Map} for which events trigger a map browser event.
* */
* @constructor class MapBrowserEvent extends MapEvent {
* @extends {module:ol/MapEvent}
/**
* @param {string} type Event type. * @param {string} type Event type.
* @param {module:ol/PluggableMap} map Map. * @param {module:ol/PluggableMap} map Map.
* @param {Event} browserEvent Browser event. * @param {Event} browserEvent Browser event.
* @param {boolean=} opt_dragging Is the map currently being dragged? * @param {boolean=} opt_dragging Is the map currently being dragged?
* @param {?module:ol/PluggableMap~FrameState=} opt_frameState Frame state. * @param {?module:ol/PluggableMap~FrameState=} opt_frameState Frame state.
*/ */
const MapBrowserEvent = function(type, map, browserEvent, opt_dragging, opt_frameState) { constructor(type, map, browserEvent, opt_dragging, opt_frameState) {
MapEvent.call(this, type, map, opt_frameState); super(type, map, opt_frameState);
/** /**
* The original browser event. * The original browser event.
@@ -52,10 +52,7 @@ const MapBrowserEvent = function(type, map, browserEvent, opt_dragging, opt_fram
*/ */
this.dragging = opt_dragging !== undefined ? opt_dragging : false; this.dragging = opt_dragging !== undefined ? opt_dragging : false;
}; }
inherits(MapBrowserEvent, MapEvent);
/** /**
* Prevents the default browser action. * Prevents the default browser action.
@@ -63,11 +60,10 @@ inherits(MapBrowserEvent, MapEvent);
* @override * @override
* @api * @api
*/ */
MapBrowserEvent.prototype.preventDefault = function() { preventDefault() {
MapEvent.prototype.preventDefault.call(this); super.preventDefault();
this.originalEvent.preventDefault(); this.originalEvent.preventDefault();
}; }
/** /**
* Prevents further propagation of the current event. * Prevents further propagation of the current event.
@@ -75,8 +71,11 @@ MapBrowserEvent.prototype.preventDefault = function() {
* @override * @override
* @api * @api
*/ */
MapBrowserEvent.prototype.stopPropagation = function() { stopPropagation() {
MapEvent.prototype.stopPropagation.call(this); super.stopPropagation();
this.originalEvent.stopPropagation(); this.originalEvent.stopPropagation();
}; }
}
export default MapBrowserEvent; export default MapBrowserEvent;
+31 -42
View File
@@ -1,7 +1,6 @@
/** /**
* @module ol/MapBrowserEventHandler * @module ol/MapBrowserEventHandler
*/ */
import {inherits} from './util.js';
import {DEVICE_PIXEL_RATIO} from './has.js'; import {DEVICE_PIXEL_RATIO} from './has.js';
import MapBrowserEventType from './MapBrowserEventType.js'; import MapBrowserEventType from './MapBrowserEventType.js';
import MapBrowserPointerEvent from './MapBrowserPointerEvent.js'; import MapBrowserPointerEvent from './MapBrowserPointerEvent.js';
@@ -10,17 +9,15 @@ import EventTarget from './events/EventTarget.js';
import PointerEventType from './pointer/EventType.js'; import PointerEventType from './pointer/EventType.js';
import PointerEventHandler from './pointer/PointerEventHandler.js'; import PointerEventHandler from './pointer/PointerEventHandler.js';
/** class MapBrowserEventHandler extends EventTarget {
* @param {module:ol/PluggableMap} map The map with the viewport to
* listen to events on.
* @param {number=} moveTolerance The minimal distance the pointer must travel
* to trigger a move.
* @constructor
* @extends {module:ol/events/EventTarget}
*/
const MapBrowserEventHandler = function(map, moveTolerance) {
EventTarget.call(this); /**
* @param {module:ol/PluggableMap} map The map with the viewport to listen to events on.
* @param {number=} moveTolerance The minimal distance the pointer must travel to trigger a move.
*/
constructor(map, moveTolerance) {
super();
/** /**
* This is the element that we will listen to the real events on. * This is the element that we will listen to the real events on.
@@ -110,17 +107,14 @@ const MapBrowserEventHandler = function(map, moveTolerance) {
PointerEventType.POINTERMOVE, PointerEventType.POINTERMOVE,
this.relayEvent_, this); this.relayEvent_, this);
}; }
inherits(MapBrowserEventHandler, EventTarget);
/** /**
* @param {module:ol/pointer/PointerEvent} pointerEvent Pointer * @param {module:ol/pointer/PointerEvent} pointerEvent Pointer
* event. * event.
* @private * @private
*/ */
MapBrowserEventHandler.prototype.emulateClick_ = function(pointerEvent) { emulateClick_(pointerEvent) {
let newEvent = new MapBrowserPointerEvent( let newEvent = new MapBrowserPointerEvent(
MapBrowserEventType.CLICK, this.map_, pointerEvent); MapBrowserEventType.CLICK, this.map_, pointerEvent);
this.dispatchEvent(newEvent); this.dispatchEvent(newEvent);
@@ -140,8 +134,7 @@ MapBrowserEventHandler.prototype.emulateClick_ = function(pointerEvent) {
this.dispatchEvent(newEvent); this.dispatchEvent(newEvent);
}.bind(this), 250); }.bind(this), 250);
} }
}; }
/** /**
* Keeps track on how many pointers are currently active. * Keeps track on how many pointers are currently active.
@@ -150,7 +143,7 @@ MapBrowserEventHandler.prototype.emulateClick_ = function(pointerEvent) {
* event. * event.
* @private * @private
*/ */
MapBrowserEventHandler.prototype.updateActivePointers_ = function(pointerEvent) { updateActivePointers_(pointerEvent) {
const event = pointerEvent; const event = pointerEvent;
if (event.type == MapBrowserEventType.POINTERUP || if (event.type == MapBrowserEventType.POINTERUP ||
@@ -160,15 +153,14 @@ MapBrowserEventHandler.prototype.updateActivePointers_ = function(pointerEvent)
this.trackedTouches_[event.pointerId] = true; this.trackedTouches_[event.pointerId] = true;
} }
this.activePointers_ = Object.keys(this.trackedTouches_).length; this.activePointers_ = Object.keys(this.trackedTouches_).length;
}; }
/** /**
* @param {module:ol/pointer/PointerEvent} pointerEvent Pointer * @param {module:ol/pointer/PointerEvent} pointerEvent Pointer
* event. * event.
* @private * @private
*/ */
MapBrowserEventHandler.prototype.handlePointerUp_ = function(pointerEvent) { handlePointerUp_(pointerEvent) {
this.updateActivePointers_(pointerEvent); this.updateActivePointers_(pointerEvent);
const newEvent = new MapBrowserPointerEvent( const newEvent = new MapBrowserPointerEvent(
MapBrowserEventType.POINTERUP, this.map_, pointerEvent); MapBrowserEventType.POINTERUP, this.map_, pointerEvent);
@@ -192,8 +184,7 @@ MapBrowserEventHandler.prototype.handlePointerUp_ = function(pointerEvent) {
this.documentPointerEventHandler_.dispose(); this.documentPointerEventHandler_.dispose();
this.documentPointerEventHandler_ = null; this.documentPointerEventHandler_ = null;
} }
}; }
/** /**
* @param {module:ol/pointer/PointerEvent} pointerEvent Pointer * @param {module:ol/pointer/PointerEvent} pointerEvent Pointer
@@ -201,17 +192,16 @@ MapBrowserEventHandler.prototype.handlePointerUp_ = function(pointerEvent) {
* @return {boolean} If the left mouse button was pressed. * @return {boolean} If the left mouse button was pressed.
* @private * @private
*/ */
MapBrowserEventHandler.prototype.isMouseActionButton_ = function(pointerEvent) { isMouseActionButton_(pointerEvent) {
return pointerEvent.button === 0; return pointerEvent.button === 0;
}; }
/** /**
* @param {module:ol/pointer/PointerEvent} pointerEvent Pointer * @param {module:ol/pointer/PointerEvent} pointerEvent Pointer
* event. * event.
* @private * @private
*/ */
MapBrowserEventHandler.prototype.handlePointerDown_ = function(pointerEvent) { handlePointerDown_(pointerEvent) {
this.updateActivePointers_(pointerEvent); this.updateActivePointers_(pointerEvent);
const newEvent = new MapBrowserPointerEvent( const newEvent = new MapBrowserPointerEvent(
MapBrowserEventType.POINTERDOWN, this.map_, pointerEvent); MapBrowserEventType.POINTERDOWN, this.map_, pointerEvent);
@@ -252,15 +242,14 @@ MapBrowserEventHandler.prototype.handlePointerDown_ = function(pointerEvent) {
this.handlePointerUp_, this) this.handlePointerUp_, this)
); );
} }
}; }
/** /**
* @param {module:ol/pointer/PointerEvent} pointerEvent Pointer * @param {module:ol/pointer/PointerEvent} pointerEvent Pointer
* event. * event.
* @private * @private
*/ */
MapBrowserEventHandler.prototype.handlePointerMove_ = function(pointerEvent) { handlePointerMove_(pointerEvent) {
// Between pointerdown and pointerup, pointermove events are triggered. // Between pointerdown and pointerup, pointermove events are triggered.
// To avoid a 'false' touchmove event to be dispatched, we test if the pointer // To avoid a 'false' touchmove event to be dispatched, we test if the pointer
// moved a significant distance. // moved a significant distance.
@@ -277,8 +266,7 @@ MapBrowserEventHandler.prototype.handlePointerMove_ = function(pointerEvent) {
// https://code.google.com/p/android/issues/detail?id=19827 // https://code.google.com/p/android/issues/detail?id=19827
// ex: Galaxy Tab P3110 + Android 4.1.1 // ex: Galaxy Tab P3110 + Android 4.1.1
pointerEvent.preventDefault(); pointerEvent.preventDefault();
}; }
/** /**
* Wrap and relay a pointer event. Note that this requires that the type * Wrap and relay a pointer event. Note that this requires that the type
@@ -287,12 +275,11 @@ MapBrowserEventHandler.prototype.handlePointerMove_ = function(pointerEvent) {
* event. * event.
* @private * @private
*/ */
MapBrowserEventHandler.prototype.relayEvent_ = function(pointerEvent) { relayEvent_(pointerEvent) {
const dragging = !!(this.down_ && this.isMoving_(pointerEvent)); const dragging = !!(this.down_ && this.isMoving_(pointerEvent));
this.dispatchEvent(new MapBrowserPointerEvent( this.dispatchEvent(new MapBrowserPointerEvent(
pointerEvent.type, this.map_, pointerEvent, dragging)); pointerEvent.type, this.map_, pointerEvent, dragging));
}; }
/** /**
* @param {module:ol/pointer/PointerEvent} pointerEvent Pointer * @param {module:ol/pointer/PointerEvent} pointerEvent Pointer
@@ -300,17 +287,16 @@ MapBrowserEventHandler.prototype.relayEvent_ = function(pointerEvent) {
* @return {boolean} Is moving. * @return {boolean} Is moving.
* @private * @private
*/ */
MapBrowserEventHandler.prototype.isMoving_ = function(pointerEvent) { isMoving_(pointerEvent) {
return this.dragging_ || return this.dragging_ ||
Math.abs(pointerEvent.clientX - this.down_.clientX) > this.moveTolerance_ || Math.abs(pointerEvent.clientX - this.down_.clientX) > this.moveTolerance_ ||
Math.abs(pointerEvent.clientY - this.down_.clientY) > this.moveTolerance_; Math.abs(pointerEvent.clientY - this.down_.clientY) > this.moveTolerance_;
}; }
/** /**
* @inheritDoc * @inheritDoc
*/ */
MapBrowserEventHandler.prototype.disposeInternal = function() { disposeInternal() {
if (this.relayedListenerKey_) { if (this.relayedListenerKey_) {
unlistenByKey(this.relayedListenerKey_); unlistenByKey(this.relayedListenerKey_);
this.relayedListenerKey_ = null; this.relayedListenerKey_ = null;
@@ -331,6 +317,9 @@ MapBrowserEventHandler.prototype.disposeInternal = function() {
this.pointerEventHandler_.dispose(); this.pointerEventHandler_.dispose();
this.pointerEventHandler_ = null; this.pointerEventHandler_ = null;
} }
EventTarget.prototype.disposeInternal.call(this); super.disposeInternal();
}; }
}
export default MapBrowserEventHandler; export default MapBrowserEventHandler;
+8 -11
View File
@@ -1,24 +1,20 @@
/** /**
* @module ol/MapBrowserPointerEvent * @module ol/MapBrowserPointerEvent
*/ */
import {inherits} from './util.js';
import MapBrowserEvent from './MapBrowserEvent.js'; import MapBrowserEvent from './MapBrowserEvent.js';
class MapBrowserPointerEvent extends MapBrowserEvent {
/** /**
* @constructor
* @extends {module:ol/MapBrowserEvent}
* @param {string} type Event type. * @param {string} type Event type.
* @param {module:ol/PluggableMap} map Map. * @param {module:ol/PluggableMap} map Map.
* @param {module:ol/pointer/PointerEvent} pointerEvent Pointer * @param {module:ol/pointer/PointerEvent} pointerEvent Pointer event.
* event.
* @param {boolean=} opt_dragging Is the map currently being dragged? * @param {boolean=} opt_dragging Is the map currently being dragged?
* @param {?module:ol/PluggableMap~FrameState=} opt_frameState Frame state. * @param {?module:ol/PluggableMap~FrameState=} opt_frameState Frame state.
*/ */
const MapBrowserPointerEvent = function(type, map, pointerEvent, opt_dragging, constructor(type, map, pointerEvent, opt_dragging, opt_frameState) {
opt_frameState) {
MapBrowserEvent.call(this, type, map, pointerEvent.originalEvent, opt_dragging, super(type, map, pointerEvent.originalEvent, opt_dragging, opt_frameState);
opt_frameState);
/** /**
* @const * @const
@@ -26,7 +22,8 @@ const MapBrowserPointerEvent = function(type, map, pointerEvent, opt_dragging,
*/ */
this.pointerEvent = pointerEvent; this.pointerEvent = pointerEvent;
}; }
}
inherits(MapBrowserPointerEvent, MapBrowserEvent);
export default MapBrowserPointerEvent; export default MapBrowserPointerEvent;
+9 -8
View File
@@ -1,23 +1,23 @@
/** /**
* @module ol/MapEvent * @module ol/MapEvent
*/ */
import {inherits} from './util.js';
import Event from './events/Event.js'; import Event from './events/Event.js';
/** /**
* @classdesc * @classdesc
* Events emitted as map events are instances of this type. * Events emitted as map events are instances of this type.
* See {@link module:ol/Map~Map} for which events trigger a map event. * See {@link module:ol/Map~Map} for which events trigger a map event.
* */
* @constructor class MapEvent extends Event {
* @extends {module:ol/events/Event}
/**
* @param {string} type Event type. * @param {string} type Event type.
* @param {module:ol/PluggableMap} map Map. * @param {module:ol/PluggableMap} map Map.
* @param {?module:ol/PluggableMap~FrameState=} opt_frameState Frame state. * @param {?module:ol/PluggableMap~FrameState=} opt_frameState Frame state.
*/ */
const MapEvent = function(type, map, opt_frameState) { constructor(type, map, opt_frameState) {
Event.call(this, type); super(type);
/** /**
* The map where the event occurred. * The map where the event occurred.
@@ -33,7 +33,8 @@ const MapEvent = function(type, map, opt_frameState) {
*/ */
this.frameState = opt_frameState !== undefined ? opt_frameState : null; this.frameState = opt_frameState !== undefined ? opt_frameState : null;
}; }
}
inherits(MapEvent, Event);
export default MapEvent; export default MapEvent;
+111 -116
View File
@@ -1,7 +1,7 @@
/** /**
* @module ol/Object * @module ol/Object
*/ */
import {getUid, inherits} from './util.js'; import {getUid} from './util.js';
import ObjectEventType from './ObjectEventType.js'; import ObjectEventType from './ObjectEventType.js';
import Observable from './Observable.js'; import Observable from './Observable.js';
import Event from './events/Event.js'; import Event from './events/Event.js';
@@ -10,17 +10,17 @@ import {assign} from './obj.js';
/** /**
* @classdesc * @classdesc
* Events emitted by {@link module:ol/Object~BaseObject} instances are instances of * Events emitted by {@link module:ol/Object~BaseObject} instances are instances of this type.
* this type. */
* class ObjectEvent extends Event {
/**
* @param {string} type The event type. * @param {string} type The event type.
* @param {string} key The property name. * @param {string} key The property name.
* @param {*} oldValue The old value for `key`. * @param {*} oldValue The old value for `key`.
* @extends {module:ol/events/Event}
* @constructor
*/ */
const ObjectEvent = function(type, key, oldValue) { constructor(type, key, oldValue) {
Event.call(this, type); super(type);
/** /**
* The name of the property whose value is changing. * The name of the property whose value is changing.
@@ -37,8 +37,9 @@ const ObjectEvent = function(type, key, oldValue) {
*/ */
this.oldValue = oldValue; this.oldValue = oldValue;
}; }
inherits(ObjectEvent, Event);
}
/** /**
@@ -81,14 +82,16 @@ inherits(ObjectEvent, Event);
* Properties can be deleted by using the unset method. E.g. * Properties can be deleted by using the unset method. E.g.
* object.unset('foo'). * object.unset('foo').
* *
* @constructor
* @extends {module:ol/Observable}
* @param {Object.<string, *>=} opt_values An object with key-value pairs.
* @fires module:ol/Object~ObjectEvent * @fires module:ol/Object~ObjectEvent
* @api * @api
*/ */
const BaseObject = function(opt_values) { class BaseObject extends Observable {
Observable.call(this);
/**
* @param {Object.<string, *>=} opt_values An object with key-value pairs.
*/
constructor(opt_values) {
super();
// Call {@link module:ol~getUid} to ensure that the order of objects' ids is // Call {@link module:ol~getUid} to ensure that the order of objects' ids is
// the same as the order in which they were created. This also helps to // the same as the order in which they were created. This also helps to
@@ -105,9 +108,100 @@ const BaseObject = function(opt_values) {
if (opt_values !== undefined) { if (opt_values !== undefined) {
this.setProperties(opt_values); this.setProperties(opt_values);
} }
}; }
inherits(BaseObject, Observable); /**
* Gets a value.
* @param {string} key Key name.
* @return {*} Value.
* @api
*/
get(key) {
let value;
if (this.values_.hasOwnProperty(key)) {
value = this.values_[key];
}
return value;
}
/**
* Get a list of object property names.
* @return {Array.<string>} List of property names.
* @api
*/
getKeys() {
return Object.keys(this.values_);
}
/**
* Get an object of all property names and values.
* @return {Object.<string, *>} Object.
* @api
*/
getProperties() {
return assign({}, this.values_);
}
/**
* @param {string} key Key name.
* @param {*} oldValue Old value.
*/
notify(key, oldValue) {
let eventType;
eventType = getChangeEventType(key);
this.dispatchEvent(new ObjectEvent(eventType, key, oldValue));
eventType = ObjectEventType.PROPERTYCHANGE;
this.dispatchEvent(new ObjectEvent(eventType, key, oldValue));
}
/**
* Sets a value.
* @param {string} key Key name.
* @param {*} value Value.
* @param {boolean=} opt_silent Update without triggering an event.
* @api
*/
set(key, value, opt_silent) {
if (opt_silent) {
this.values_[key] = value;
} else {
const oldValue = this.values_[key];
this.values_[key] = value;
if (oldValue !== value) {
this.notify(key, oldValue);
}
}
}
/**
* Sets a collection of key-value pairs. Note that this changes any existing
* properties and adds new ones (it does not remove any existing properties).
* @param {Object.<string, *>} values Values.
* @param {boolean=} opt_silent Update without triggering an event.
* @api
*/
setProperties(values, opt_silent) {
for (const key in values) {
this.set(key, values[key], opt_silent);
}
}
/**
* Unsets a property.
* @param {string} key Key name.
* @param {boolean=} opt_silent Unset without triggering an event.
* @api
*/
unset(key, opt_silent) {
if (key in this.values_) {
const oldValue = this.values_[key];
delete this.values_[key];
if (!opt_silent) {
this.notify(key, oldValue);
}
}
}
}
/** /**
@@ -127,103 +221,4 @@ export function getChangeEventType(key) {
} }
/**
* Gets a value.
* @param {string} key Key name.
* @return {*} Value.
* @api
*/
BaseObject.prototype.get = function(key) {
let value;
if (this.values_.hasOwnProperty(key)) {
value = this.values_[key];
}
return value;
};
/**
* Get a list of object property names.
* @return {Array.<string>} List of property names.
* @api
*/
BaseObject.prototype.getKeys = function() {
return Object.keys(this.values_);
};
/**
* Get an object of all property names and values.
* @return {Object.<string, *>} Object.
* @api
*/
BaseObject.prototype.getProperties = function() {
return assign({}, this.values_);
};
/**
* @param {string} key Key name.
* @param {*} oldValue Old value.
*/
BaseObject.prototype.notify = function(key, oldValue) {
let eventType;
eventType = getChangeEventType(key);
this.dispatchEvent(new ObjectEvent(eventType, key, oldValue));
eventType = ObjectEventType.PROPERTYCHANGE;
this.dispatchEvent(new ObjectEvent(eventType, key, oldValue));
};
/**
* Sets a value.
* @param {string} key Key name.
* @param {*} value Value.
* @param {boolean=} opt_silent Update without triggering an event.
* @api
*/
BaseObject.prototype.set = function(key, value, opt_silent) {
if (opt_silent) {
this.values_[key] = value;
} else {
const oldValue = this.values_[key];
this.values_[key] = value;
if (oldValue !== value) {
this.notify(key, oldValue);
}
}
};
/**
* Sets a collection of key-value pairs. Note that this changes any existing
* properties and adds new ones (it does not remove any existing properties).
* @param {Object.<string, *>} values Values.
* @param {boolean=} opt_silent Update without triggering an event.
* @api
*/
BaseObject.prototype.setProperties = function(values, opt_silent) {
for (const key in values) {
this.set(key, values[key], opt_silent);
}
};
/**
* Unsets a property.
* @param {string} key Key name.
* @param {boolean=} opt_silent Unset without triggering an event.
* @api
*/
BaseObject.prototype.unset = function(key, opt_silent) {
if (key in this.values_) {
const oldValue = this.values_[key];
delete this.values_[key];
if (!opt_silent) {
this.notify(key, oldValue);
}
}
};
export default BaseObject; export default BaseObject;
+84 -105
View File
@@ -1,7 +1,6 @@
/** /**
* @module ol/Observable * @module ol/Observable
*/ */
import {inherits} from './util.js';
import {listen, unlistenByKey, unlisten, listenOnce} from './events.js'; import {listen, unlistenByKey, unlisten, listenOnce} from './events.js';
import EventTarget from './events/EventTarget.js'; import EventTarget from './events/EventTarget.js';
import EventType from './events/EventType.js'; import EventType from './events/EventType.js';
@@ -14,15 +13,13 @@ import EventType from './events/EventType.js';
* and unregistration. A generic `change` event is always available through * and unregistration. A generic `change` event is always available through
* {@link module:ol/Observable~Observable#changed}. * {@link module:ol/Observable~Observable#changed}.
* *
* @constructor
* @extends {module:ol/events/EventTarget}
* @fires module:ol/events/Event~Event * @fires module:ol/events/Event~Event
* @struct
* @api * @api
*/ */
const Observable = function() { class Observable extends EventTarget {
constructor() {
EventTarget.call(this); super();
/** /**
* @private * @private
@@ -30,9 +27,88 @@ const Observable = function() {
*/ */
this.revision_ = 0; this.revision_ = 0;
}; }
inherits(Observable, EventTarget); /**
* Increases the revision counter and dispatches a 'change' event.
* @api
*/
changed() {
++this.revision_;
this.dispatchEvent(EventType.CHANGE);
}
/**
* Get the version number for this object. Each time the object is modified,
* its version number will be incremented.
* @return {number} Revision.
* @api
*/
getRevision() {
return this.revision_;
}
/**
* Listen for a certain type of event.
* @param {string|Array.<string>} type The event type or array of event types.
* @param {function(?): ?} listener The listener function.
* @return {module:ol/events~EventsKey|Array.<module:ol/events~EventsKey>} Unique key for the listener. If
* called with an array of event types as the first argument, the return
* will be an array of keys.
* @api
*/
on(type, listener) {
if (Array.isArray(type)) {
const len = type.length;
const keys = new Array(len);
for (let i = 0; i < len; ++i) {
keys[i] = listen(this, type[i], listener);
}
return keys;
} else {
return listen(this, /** @type {string} */ (type), listener);
}
}
/**
* Listen once for a certain type of event.
* @param {string|Array.<string>} type The event type or array of event types.
* @param {function(?): ?} listener The listener function.
* @return {module:ol/events~EventsKey|Array.<module:ol/events~EventsKey>} Unique key for the listener. If
* called with an array of event types as the first argument, the return
* will be an array of keys.
* @api
*/
once(type, listener) {
if (Array.isArray(type)) {
const len = type.length;
const keys = new Array(len);
for (let i = 0; i < len; ++i) {
keys[i] = listenOnce(this, type[i], listener);
}
return keys;
} else {
return listenOnce(this, /** @type {string} */ (type), listener);
}
}
/**
* Unlisten for a certain type of event.
* @param {string|Array.<string>} type The event type or array of event types.
* @param {function(?): ?} listener The listener function.
* @api
*/
un(type, listener) {
if (Array.isArray(type)) {
for (let i = 0, ii = type.length; i < ii; ++i) {
unlisten(this, type[i], listener);
}
return;
} else {
unlisten(this, /** @type {string} */ (type), listener);
}
}
}
/** /**
@@ -52,101 +128,4 @@ export function unByKey(key) {
} }
/**
* Increases the revision counter and dispatches a 'change' event.
* @api
*/
Observable.prototype.changed = function() {
++this.revision_;
this.dispatchEvent(EventType.CHANGE);
};
/**
* Dispatches an event and calls all listeners listening for events
* of this type. The event parameter can either be a string or an
* Object with a `type` property.
*
* @param {{type: string,
* target: (EventTarget|module:ol/events/EventTarget|undefined)}|
* module:ol/events/Event|string} event Event object.
* @function
* @api
*/
Observable.prototype.dispatchEvent;
/**
* Get the version number for this object. Each time the object is modified,
* its version number will be incremented.
* @return {number} Revision.
* @api
*/
Observable.prototype.getRevision = function() {
return this.revision_;
};
/**
* Listen for a certain type of event.
* @param {string|Array.<string>} type The event type or array of event types.
* @param {function(?): ?} listener The listener function.
* @return {module:ol/events~EventsKey|Array.<module:ol/events~EventsKey>} Unique key for the listener. If
* called with an array of event types as the first argument, the return
* will be an array of keys.
* @api
*/
Observable.prototype.on = function(type, listener) {
if (Array.isArray(type)) {
const len = type.length;
const keys = new Array(len);
for (let i = 0; i < len; ++i) {
keys[i] = listen(this, type[i], listener);
}
return keys;
} else {
return listen(this, /** @type {string} */ (type), listener);
}
};
/**
* Listen once for a certain type of event.
* @param {string|Array.<string>} type The event type or array of event types.
* @param {function(?): ?} listener The listener function.
* @return {module:ol/events~EventsKey|Array.<module:ol/events~EventsKey>} Unique key for the listener. If
* called with an array of event types as the first argument, the return
* will be an array of keys.
* @api
*/
Observable.prototype.once = function(type, listener) {
if (Array.isArray(type)) {
const len = type.length;
const keys = new Array(len);
for (let i = 0; i < len; ++i) {
keys[i] = listenOnce(this, type[i], listener);
}
return keys;
} else {
return listenOnce(this, /** @type {string} */ (type), listener);
}
};
/**
* Unlisten for a certain type of event.
* @param {string|Array.<string>} type The event type or array of event types.
* @param {function(?): ?} listener The listener function.
* @api
*/
Observable.prototype.un = function(type, listener) {
if (Array.isArray(type)) {
for (let i = 0, ii = type.length; i < ii; ++i) {
unlisten(this, type[i], listener);
}
return;
} else {
unlisten(this, /** @type {string} */ (type), listener);
}
};
export default Observable; export default Observable;
+56 -78
View File
@@ -1,7 +1,6 @@
/** /**
* @module ol/Overlay * @module ol/Overlay
*/ */
import {inherits} from './util.js';
import MapEventType from './MapEventType.js'; import MapEventType from './MapEventType.js';
import BaseObject, {getChangeEventType} from './Object.js'; import BaseObject, {getChangeEventType} from './Object.js';
import OverlayPositioning from './OverlayPositioning.js'; import OverlayPositioning from './OverlayPositioning.js';
@@ -93,14 +92,16 @@ const Property = {
* popup.setPosition(coordinate); * popup.setPosition(coordinate);
* map.addOverlay(popup); * map.addOverlay(popup);
* *
* @constructor
* @extends {module:ol/Object}
* @param {module:ol/Overlay~Options} options Overlay options.
* @api * @api
*/ */
const Overlay = function(options) { class Overlay extends BaseObject {
BaseObject.call(this); /**
* @param {module:ol/Overlay~Options} options Overlay options.
*/
constructor(options) {
super();
/** /**
* @protected * @protected
@@ -211,10 +212,7 @@ const Overlay = function(options) {
this.setPosition(options.position); this.setPosition(options.position);
} }
}; }
inherits(Overlay, BaseObject);
/** /**
* Get the DOM element of this overlay. * Get the DOM element of this overlay.
@@ -222,20 +220,18 @@ inherits(Overlay, BaseObject);
* @observable * @observable
* @api * @api
*/ */
Overlay.prototype.getElement = function() { getElement() {
return /** @type {HTMLElement|undefined} */ (this.get(Property.ELEMENT)); return /** @type {HTMLElement|undefined} */ (this.get(Property.ELEMENT));
}; }
/** /**
* Get the overlay identifier which is set on constructor. * Get the overlay identifier which is set on constructor.
* @return {number|string|undefined} Id. * @return {number|string|undefined} Id.
* @api * @api
*/ */
Overlay.prototype.getId = function() { getId() {
return this.id; return this.id;
}; }
/** /**
* Get the map associated with this overlay. * Get the map associated with this overlay.
@@ -244,12 +240,11 @@ Overlay.prototype.getId = function() {
* @observable * @observable
* @api * @api
*/ */
Overlay.prototype.getMap = function() { getMap() {
return ( return (
/** @type {module:ol/PluggableMap|undefined} */ (this.get(Property.MAP)) /** @type {module:ol/PluggableMap|undefined} */ (this.get(Property.MAP))
); );
}; }
/** /**
* Get the offset of this overlay. * Get the offset of this overlay.
@@ -257,10 +252,9 @@ Overlay.prototype.getMap = function() {
* @observable * @observable
* @api * @api
*/ */
Overlay.prototype.getOffset = function() { getOffset() {
return /** @type {Array.<number>} */ (this.get(Property.OFFSET)); return /** @type {Array.<number>} */ (this.get(Property.OFFSET));
}; }
/** /**
* Get the current position of this overlay. * Get the current position of this overlay.
@@ -269,12 +263,11 @@ Overlay.prototype.getOffset = function() {
* @observable * @observable
* @api * @api
*/ */
Overlay.prototype.getPosition = function() { getPosition() {
return ( return (
/** @type {module:ol/coordinate~Coordinate|undefined} */ (this.get(Property.POSITION)) /** @type {module:ol/coordinate~Coordinate|undefined} */ (this.get(Property.POSITION))
); );
}; }
/** /**
* Get the current positioning of this overlay. * Get the current positioning of this overlay.
@@ -283,29 +276,27 @@ Overlay.prototype.getPosition = function() {
* @observable * @observable
* @api * @api
*/ */
Overlay.prototype.getPositioning = function() { getPositioning() {
return ( return (
/** @type {module:ol/OverlayPositioning} */ (this.get(Property.POSITIONING)) /** @type {module:ol/OverlayPositioning} */ (this.get(Property.POSITIONING))
); );
}; }
/** /**
* @protected * @protected
*/ */
Overlay.prototype.handleElementChanged = function() { handleElementChanged() {
removeChildren(this.element); removeChildren(this.element);
const element = this.getElement(); const element = this.getElement();
if (element) { if (element) {
this.element.appendChild(element); this.element.appendChild(element);
} }
}; }
/** /**
* @protected * @protected
*/ */
Overlay.prototype.handleMapChanged = function() { handleMapChanged() {
if (this.mapPostrenderListenerKey) { if (this.mapPostrenderListenerKey) {
removeNode(this.element); removeNode(this.element);
unlistenByKey(this.mapPostrenderListenerKey); unlistenByKey(this.mapPostrenderListenerKey);
@@ -324,43 +315,38 @@ Overlay.prototype.handleMapChanged = function() {
container.appendChild(this.element); container.appendChild(this.element);
} }
} }
}; }
/** /**
* @protected * @protected
*/ */
Overlay.prototype.render = function() { render() {
this.updatePixelPosition(); this.updatePixelPosition();
}; }
/** /**
* @protected * @protected
*/ */
Overlay.prototype.handleOffsetChanged = function() { handleOffsetChanged() {
this.updatePixelPosition(); this.updatePixelPosition();
}; }
/** /**
* @protected * @protected
*/ */
Overlay.prototype.handlePositionChanged = function() { handlePositionChanged() {
this.updatePixelPosition(); this.updatePixelPosition();
if (this.get(Property.POSITION) && this.autoPan) { if (this.get(Property.POSITION) && this.autoPan) {
this.panIntoView(); this.panIntoView();
} }
}; }
/** /**
* @protected * @protected
*/ */
Overlay.prototype.handlePositioningChanged = function() { handlePositioningChanged() {
this.updatePixelPosition(); this.updatePixelPosition();
}; }
/** /**
* Set the DOM element to be associated with this overlay. * Set the DOM element to be associated with this overlay.
@@ -368,10 +354,9 @@ Overlay.prototype.handlePositioningChanged = function() {
* @observable * @observable
* @api * @api
*/ */
Overlay.prototype.setElement = function(element) { setElement(element) {
this.set(Property.ELEMENT, element); this.set(Property.ELEMENT, element);
}; }
/** /**
* Set the map to be associated with this overlay. * Set the map to be associated with this overlay.
@@ -380,10 +365,9 @@ Overlay.prototype.setElement = function(element) {
* @observable * @observable
* @api * @api
*/ */
Overlay.prototype.setMap = function(map) { setMap(map) {
this.set(Property.MAP, map); this.set(Property.MAP, map);
}; }
/** /**
* Set the offset for this overlay. * Set the offset for this overlay.
@@ -391,10 +375,9 @@ Overlay.prototype.setMap = function(map) {
* @observable * @observable
* @api * @api
*/ */
Overlay.prototype.setOffset = function(offset) { setOffset(offset) {
this.set(Property.OFFSET, offset); this.set(Property.OFFSET, offset);
}; }
/** /**
* Set the position for this overlay. If the position is `undefined` the * Set the position for this overlay. If the position is `undefined` the
@@ -404,17 +387,16 @@ Overlay.prototype.setOffset = function(offset) {
* @observable * @observable
* @api * @api
*/ */
Overlay.prototype.setPosition = function(position) { setPosition(position) {
this.set(Property.POSITION, position); this.set(Property.POSITION, position);
}; }
/** /**
* Pan the map so that the overlay is entirely visible in the current viewport * Pan the map so that the overlay is entirely visible in the current viewport
* (if necessary). * (if necessary).
* @protected * @protected
*/ */
Overlay.prototype.panIntoView = function() { panIntoView() {
const map = this.getMap(); const map = this.getMap();
if (!map || !map.getTargetElement()) { if (!map || !map.getTargetElement()) {
@@ -464,8 +446,7 @@ Overlay.prototype.panIntoView = function() {
}); });
} }
} }
}; }
/** /**
* Get the extent of an element relative to the document * Get the extent of an element relative to the document
@@ -474,7 +455,7 @@ Overlay.prototype.panIntoView = function() {
* @return {module:ol/extent~Extent} The extent. * @return {module:ol/extent~Extent} The extent.
* @protected * @protected
*/ */
Overlay.prototype.getRect = function(element, size) { getRect(element, size) {
const box = element.getBoundingClientRect(); const box = element.getBoundingClientRect();
const offsetX = box.left + window.pageXOffset; const offsetX = box.left + window.pageXOffset;
const offsetY = box.top + window.pageYOffset; const offsetY = box.top + window.pageYOffset;
@@ -484,8 +465,7 @@ Overlay.prototype.getRect = function(element, size) {
offsetX + size[0], offsetX + size[0],
offsetY + size[1] offsetY + size[1]
]; ];
}; }
/** /**
* Set the positioning for this overlay. * Set the positioning for this overlay.
@@ -494,29 +474,27 @@ Overlay.prototype.getRect = function(element, size) {
* @observable * @observable
* @api * @api
*/ */
Overlay.prototype.setPositioning = function(positioning) { setPositioning(positioning) {
this.set(Property.POSITIONING, positioning); this.set(Property.POSITIONING, positioning);
}; }
/** /**
* Modify the visibility of the element. * Modify the visibility of the element.
* @param {boolean} visible Element visibility. * @param {boolean} visible Element visibility.
* @protected * @protected
*/ */
Overlay.prototype.setVisible = function(visible) { setVisible(visible) {
if (this.rendered.visible !== visible) { if (this.rendered.visible !== visible) {
this.element.style.display = visible ? '' : 'none'; this.element.style.display = visible ? '' : 'none';
this.rendered.visible = visible; this.rendered.visible = visible;
} }
}; }
/** /**
* Update pixel position. * Update pixel position.
* @protected * @protected
*/ */
Overlay.prototype.updatePixelPosition = function() { updatePixelPosition() {
const map = this.getMap(); const map = this.getMap();
const position = this.getPosition(); const position = this.getPosition();
if (!map || !map.isRendered() || !position) { if (!map || !map.isRendered() || !position) {
@@ -527,15 +505,14 @@ Overlay.prototype.updatePixelPosition = function() {
const pixel = map.getPixelFromCoordinate(position); const pixel = map.getPixelFromCoordinate(position);
const mapSize = map.getSize(); const mapSize = map.getSize();
this.updateRenderedPosition(pixel, mapSize); this.updateRenderedPosition(pixel, mapSize);
}; }
/** /**
* @param {module:ol~Pixel} pixel The pixel location. * @param {module:ol~Pixel} pixel The pixel location.
* @param {module:ol/size~Size|undefined} mapSize The map size. * @param {module:ol/size~Size|undefined} mapSize The map size.
* @protected * @protected
*/ */
Overlay.prototype.updateRenderedPosition = function(pixel, mapSize) { updateRenderedPosition(pixel, mapSize) {
const style = this.element.style; const style = this.element.style;
const offset = this.getOffset(); const offset = this.getOffset();
@@ -593,15 +570,16 @@ Overlay.prototype.updateRenderedPosition = function(pixel, mapSize) {
this.rendered.top_ = style.top = top; this.rendered.top_ = style.top = top;
} }
} }
}; }
/** /**
* returns the options this Overlay has been created with * returns the options this Overlay has been created with
* @return {module:ol/Overlay~Options} overlay options * @return {module:ol/Overlay~Options} overlay options
*/ */
Overlay.prototype.getOptions = function() { getOptions() {
return this.options; return this.options;
}; }
}
export default Overlay; export default Overlay;
+119 -171
View File
@@ -1,7 +1,7 @@
/** /**
* @module ol/PluggableMap * @module ol/PluggableMap
*/ */
import {getUid, inherits} from './util.js'; import {getUid} from './util.js';
import Collection from './Collection.js'; import Collection from './Collection.js';
import CollectionEventType from './CollectionEventType.js'; import CollectionEventType from './CollectionEventType.js';
import MapBrowserEvent from './MapBrowserEvent.js'; import MapBrowserEvent from './MapBrowserEvent.js';
@@ -131,18 +131,20 @@ import {create as createTransform, apply as applyTransform} from './transform.js
/** /**
* @constructor
* @extends {module:ol/Object}
* @param {module:ol/PluggableMap~MapOptions} options Map options.
* @fires module:ol/MapBrowserEvent~MapBrowserEvent * @fires module:ol/MapBrowserEvent~MapBrowserEvent
* @fires module:ol/MapEvent~MapEvent * @fires module:ol/MapEvent~MapEvent
* @fires module:ol/render/Event~RenderEvent#postcompose * @fires module:ol/render/Event~RenderEvent#postcompose
* @fires module:ol/render/Event~RenderEvent#precompose * @fires module:ol/render/Event~RenderEvent#precompose
* @api * @api
*/ */
const PluggableMap = function(options) { class PluggableMap extends BaseObject {
BaseObject.call(this); /**
* @param {module:ol/PluggableMap~MapOptions} options Map options.
*/
constructor(options) {
super();
const optionsInternal = createOptionsInternal(options); const optionsInternal = createOptionsInternal(options);
@@ -458,35 +460,29 @@ const PluggableMap = function(options) {
event.element.setMap(null); event.element.setMap(null);
}, this); }, this);
}; }
inherits(PluggableMap, BaseObject); createRenderer() {
PluggableMap.prototype.createRenderer = function() {
throw new Error('Use a map type that has a createRenderer method'); throw new Error('Use a map type that has a createRenderer method');
}; }
/** /**
* Add the given control to the map. * Add the given control to the map.
* @param {module:ol/control/Control} control Control. * @param {module:ol/control/Control} control Control.
* @api * @api
*/ */
PluggableMap.prototype.addControl = function(control) { addControl(control) {
this.getControls().push(control); this.getControls().push(control);
}; }
/** /**
* Add the given interaction to the map. * Add the given interaction to the map.
* @param {module:ol/interaction/Interaction} interaction Interaction to add. * @param {module:ol/interaction/Interaction} interaction Interaction to add.
* @api * @api
*/ */
PluggableMap.prototype.addInteraction = function(interaction) { addInteraction(interaction) {
this.getInteractions().push(interaction); this.getInteractions().push(interaction);
}; }
/** /**
* Adds the given layer to the top of this map. If you want to add a layer * Adds the given layer to the top of this map. If you want to add a layer
@@ -495,41 +491,38 @@ PluggableMap.prototype.addInteraction = function(interaction) {
* @param {module:ol/layer/Base} layer Layer. * @param {module:ol/layer/Base} layer Layer.
* @api * @api
*/ */
PluggableMap.prototype.addLayer = function(layer) { addLayer(layer) {
const layers = this.getLayerGroup().getLayers(); const layers = this.getLayerGroup().getLayers();
layers.push(layer); layers.push(layer);
}; }
/** /**
* Add the given overlay to the map. * Add the given overlay to the map.
* @param {module:ol/Overlay} overlay Overlay. * @param {module:ol/Overlay} overlay Overlay.
* @api * @api
*/ */
PluggableMap.prototype.addOverlay = function(overlay) { addOverlay(overlay) {
this.getOverlays().push(overlay); this.getOverlays().push(overlay);
}; }
/** /**
* This deals with map's overlay collection changes. * This deals with map's overlay collection changes.
* @param {module:ol/Overlay} overlay Overlay. * @param {module:ol/Overlay} overlay Overlay.
* @private * @private
*/ */
PluggableMap.prototype.addOverlayInternal_ = function(overlay) { addOverlayInternal_(overlay) {
const id = overlay.getId(); const id = overlay.getId();
if (id !== undefined) { if (id !== undefined) {
this.overlayIdIndex_[id.toString()] = overlay; this.overlayIdIndex_[id.toString()] = overlay;
} }
overlay.setMap(this); overlay.setMap(this);
}; }
/** /**
* *
* @inheritDoc * @inheritDoc
*/ */
PluggableMap.prototype.disposeInternal = function() { disposeInternal() {
this.mapBrowserEventHandler_.dispose(); this.mapBrowserEventHandler_.dispose();
unlisten(this.viewport_, EventType.CONTEXTMENU, this.handleBrowserEvent, this); unlisten(this.viewport_, EventType.CONTEXTMENU, this.handleBrowserEvent, this);
unlisten(this.viewport_, EventType.WHEEL, this.handleBrowserEvent, this); unlisten(this.viewport_, EventType.WHEEL, this.handleBrowserEvent, this);
@@ -543,9 +536,8 @@ PluggableMap.prototype.disposeInternal = function() {
this.animationDelayKey_ = undefined; this.animationDelayKey_ = undefined;
} }
this.setTarget(null); this.setTarget(null);
BaseObject.prototype.disposeInternal.call(this); super.disposeInternal();
}; }
/** /**
* Detect features that intersect a pixel on the viewport, and execute a * Detect features that intersect a pixel on the viewport, and execute a
@@ -566,7 +558,7 @@ PluggableMap.prototype.disposeInternal = function() {
* @template S,T * @template S,T
* @api * @api
*/ */
PluggableMap.prototype.forEachFeatureAtPixel = function(pixel, callback, opt_options) { forEachFeatureAtPixel(pixel, callback, opt_options) {
if (!this.frameState_) { if (!this.frameState_) {
return; return;
} }
@@ -579,8 +571,7 @@ PluggableMap.prototype.forEachFeatureAtPixel = function(pixel, callback, opt_opt
return this.renderer_.forEachFeatureAtCoordinate( return this.renderer_.forEachFeatureAtCoordinate(
coordinate, this.frameState_, hitTolerance, callback, null, coordinate, this.frameState_, hitTolerance, callback, null,
layerFilter, null); layerFilter, null);
}; }
/** /**
* Get all features that intersect a pixel on the viewport. * Get all features that intersect a pixel on the viewport.
@@ -590,7 +581,7 @@ PluggableMap.prototype.forEachFeatureAtPixel = function(pixel, callback, opt_opt
* `null` if none were found. * `null` if none were found.
* @api * @api
*/ */
PluggableMap.prototype.getFeaturesAtPixel = function(pixel, opt_options) { getFeaturesAtPixel(pixel, opt_options) {
let features = null; let features = null;
this.forEachFeatureAtPixel(pixel, function(feature) { this.forEachFeatureAtPixel(pixel, function(feature) {
if (!features) { if (!features) {
@@ -599,7 +590,7 @@ PluggableMap.prototype.getFeaturesAtPixel = function(pixel, opt_options) {
features.push(feature); features.push(feature);
}, opt_options); }, opt_options);
return features; return features;
}; }
/** /**
* Detect layers that have a color value at a pixel on the viewport, and * Detect layers that have a color value at a pixel on the viewport, and
@@ -618,7 +609,7 @@ PluggableMap.prototype.getFeaturesAtPixel = function(pixel, opt_options) {
* @template S,T * @template S,T
* @api * @api
*/ */
PluggableMap.prototype.forEachLayerAtPixel = function(pixel, callback, opt_options) { forEachLayerAtPixel(pixel, callback, opt_options) {
if (!this.frameState_) { if (!this.frameState_) {
return; return;
} }
@@ -628,8 +619,7 @@ PluggableMap.prototype.forEachLayerAtPixel = function(pixel, callback, opt_optio
const layerFilter = options.layerFilter || TRUE; const layerFilter = options.layerFilter || TRUE;
return this.renderer_.forEachLayerAtPixel( return this.renderer_.forEachLayerAtPixel(
pixel, this.frameState_, hitTolerance, callback, null, layerFilter, null); pixel, this.frameState_, hitTolerance, callback, null, layerFilter, null);
}; }
/** /**
* Detect if features intersect a pixel on the viewport. Layers included in the * Detect if features intersect a pixel on the viewport. Layers included in the
@@ -640,7 +630,7 @@ PluggableMap.prototype.forEachLayerAtPixel = function(pixel, callback, opt_optio
* @template U * @template U
* @api * @api
*/ */
PluggableMap.prototype.hasFeatureAtPixel = function(pixel, opt_options) { hasFeatureAtPixel(pixel, opt_options) {
if (!this.frameState_) { if (!this.frameState_) {
return false; return false;
} }
@@ -651,8 +641,7 @@ PluggableMap.prototype.hasFeatureAtPixel = function(pixel, opt_options) {
opt_options.hitTolerance * this.frameState_.pixelRatio : 0; opt_options.hitTolerance * this.frameState_.pixelRatio : 0;
return this.renderer_.hasFeatureAtCoordinate( return this.renderer_.hasFeatureAtCoordinate(
coordinate, this.frameState_, hitTolerance, layerFilter, null); coordinate, this.frameState_, hitTolerance, layerFilter, null);
}; }
/** /**
* Returns the coordinate in view projection for a browser event. * Returns the coordinate in view projection for a browser event.
@@ -660,10 +649,9 @@ PluggableMap.prototype.hasFeatureAtPixel = function(pixel, opt_options) {
* @return {module:ol/coordinate~Coordinate} Coordinate. * @return {module:ol/coordinate~Coordinate} Coordinate.
* @api * @api
*/ */
PluggableMap.prototype.getEventCoordinate = function(event) { getEventCoordinate(event) {
return this.getCoordinateFromPixel(this.getEventPixel(event)); return this.getCoordinateFromPixel(this.getEventPixel(event));
}; }
/** /**
* Returns the map pixel position for a browser event relative to the viewport. * Returns the map pixel position for a browser event relative to the viewport.
@@ -671,15 +659,14 @@ PluggableMap.prototype.getEventCoordinate = function(event) {
* @return {module:ol~Pixel} Pixel. * @return {module:ol~Pixel} Pixel.
* @api * @api
*/ */
PluggableMap.prototype.getEventPixel = function(event) { getEventPixel(event) {
const viewportPosition = this.viewport_.getBoundingClientRect(); const viewportPosition = this.viewport_.getBoundingClientRect();
const eventPosition = event.changedTouches ? event.changedTouches[0] : event; const eventPosition = event.changedTouches ? event.changedTouches[0] : event;
return [ return [
eventPosition.clientX - viewportPosition.left, eventPosition.clientX - viewportPosition.left,
eventPosition.clientY - viewportPosition.top eventPosition.clientY - viewportPosition.top
]; ];
}; }
/** /**
* Get the target in which this map is rendered. * Get the target in which this map is rendered.
@@ -690,10 +677,9 @@ PluggableMap.prototype.getEventPixel = function(event) {
* @observable * @observable
* @api * @api
*/ */
PluggableMap.prototype.getTarget = function() { getTarget() {
return /** @type {HTMLElement|string|undefined} */ (this.get(MapProperty.TARGET)); return /** @type {HTMLElement|string|undefined} */ (this.get(MapProperty.TARGET));
}; }
/** /**
* Get the DOM element into which this map is rendered. In contrast to * Get the DOM element into which this map is rendered. In contrast to
@@ -702,15 +688,14 @@ PluggableMap.prototype.getTarget = function() {
* @return {HTMLElement} The element that the map is rendered in. * @return {HTMLElement} The element that the map is rendered in.
* @api * @api
*/ */
PluggableMap.prototype.getTargetElement = function() { getTargetElement() {
const target = this.getTarget(); const target = this.getTarget();
if (target !== undefined) { if (target !== undefined) {
return typeof target === 'string' ? document.getElementById(target) : target; return typeof target === 'string' ? document.getElementById(target) : target;
} else { } else {
return null; return null;
} }
}; }
/** /**
* Get the coordinate for a given pixel. This returns a coordinate in the * Get the coordinate for a given pixel. This returns a coordinate in the
@@ -719,15 +704,14 @@ PluggableMap.prototype.getTargetElement = function() {
* @return {module:ol/coordinate~Coordinate} The coordinate for the pixel position. * @return {module:ol/coordinate~Coordinate} The coordinate for the pixel position.
* @api * @api
*/ */
PluggableMap.prototype.getCoordinateFromPixel = function(pixel) { getCoordinateFromPixel(pixel) {
const frameState = this.frameState_; const frameState = this.frameState_;
if (!frameState) { if (!frameState) {
return null; return null;
} else { } else {
return applyTransform(frameState.pixelToCoordinateTransform, pixel.slice()); return applyTransform(frameState.pixelToCoordinateTransform, pixel.slice());
} }
}; }
/** /**
* Get the map controls. Modifying this collection changes the controls * Get the map controls. Modifying this collection changes the controls
@@ -735,10 +719,9 @@ PluggableMap.prototype.getCoordinateFromPixel = function(pixel) {
* @return {module:ol/Collection.<module:ol/control/Control>} Controls. * @return {module:ol/Collection.<module:ol/control/Control>} Controls.
* @api * @api
*/ */
PluggableMap.prototype.getControls = function() { getControls() {
return this.controls; return this.controls;
}; }
/** /**
* Get the map overlays. Modifying this collection changes the overlays * Get the map overlays. Modifying this collection changes the overlays
@@ -746,10 +729,9 @@ PluggableMap.prototype.getControls = function() {
* @return {module:ol/Collection.<module:ol/Overlay>} Overlays. * @return {module:ol/Collection.<module:ol/Overlay>} Overlays.
* @api * @api
*/ */
PluggableMap.prototype.getOverlays = function() { getOverlays() {
return this.overlays_; return this.overlays_;
}; }
/** /**
* Get an overlay by its identifier (the value returned by overlay.getId()). * Get an overlay by its identifier (the value returned by overlay.getId()).
@@ -759,11 +741,10 @@ PluggableMap.prototype.getOverlays = function() {
* @return {module:ol/Overlay} Overlay. * @return {module:ol/Overlay} Overlay.
* @api * @api
*/ */
PluggableMap.prototype.getOverlayById = function(id) { getOverlayById(id) {
const overlay = this.overlayIdIndex_[id.toString()]; const overlay = this.overlayIdIndex_[id.toString()];
return overlay !== undefined ? overlay : null; return overlay !== undefined ? overlay : null;
}; }
/** /**
* Get the map interactions. Modifying this collection changes the interactions * Get the map interactions. Modifying this collection changes the interactions
@@ -773,10 +754,9 @@ PluggableMap.prototype.getOverlayById = function(id) {
* @return {module:ol/Collection.<module:ol/interaction/Interaction>} Interactions. * @return {module:ol/Collection.<module:ol/interaction/Interaction>} Interactions.
* @api * @api
*/ */
PluggableMap.prototype.getInteractions = function() { getInteractions() {
return this.interactions; return this.interactions;
}; }
/** /**
* Get the layergroup associated with this map. * Get the layergroup associated with this map.
@@ -784,23 +764,21 @@ PluggableMap.prototype.getInteractions = function() {
* @observable * @observable
* @api * @api
*/ */
PluggableMap.prototype.getLayerGroup = function() { getLayerGroup() {
return ( return (
/** @type {module:ol/layer/Group} */ (this.get(MapProperty.LAYERGROUP)) /** @type {module:ol/layer/Group} */ (this.get(MapProperty.LAYERGROUP))
); );
}; }
/** /**
* Get the collection of layers associated with this map. * Get the collection of layers associated with this map.
* @return {!module:ol/Collection.<module:ol/layer/Base>} Layers. * @return {!module:ol/Collection.<module:ol/layer/Base>} Layers.
* @api * @api
*/ */
PluggableMap.prototype.getLayers = function() { getLayers() {
const layers = this.getLayerGroup().getLayers(); const layers = this.getLayerGroup().getLayers();
return layers; return layers;
}; }
/** /**
* Get the pixel for a coordinate. This takes a coordinate in the map view * Get the pixel for a coordinate. This takes a coordinate in the map view
@@ -809,24 +787,22 @@ PluggableMap.prototype.getLayers = function() {
* @return {module:ol~Pixel} A pixel position in the map viewport. * @return {module:ol~Pixel} A pixel position in the map viewport.
* @api * @api
*/ */
PluggableMap.prototype.getPixelFromCoordinate = function(coordinate) { getPixelFromCoordinate(coordinate) {
const frameState = this.frameState_; const frameState = this.frameState_;
if (!frameState) { if (!frameState) {
return null; return null;
} else { } else {
return applyTransform(frameState.coordinateToPixelTransform, coordinate.slice(0, 2)); return applyTransform(frameState.coordinateToPixelTransform, coordinate.slice(0, 2));
} }
}; }
/** /**
* Get the map renderer. * Get the map renderer.
* @return {module:ol/renderer/Map} Renderer * @return {module:ol/renderer/Map} Renderer
*/ */
PluggableMap.prototype.getRenderer = function() { getRenderer() {
return this.renderer_; return this.renderer_;
}; }
/** /**
* Get the size of this map. * Get the size of this map.
@@ -834,12 +810,11 @@ PluggableMap.prototype.getRenderer = function() {
* @observable * @observable
* @api * @api
*/ */
PluggableMap.prototype.getSize = function() { getSize() {
return ( return (
/** @type {module:ol/size~Size|undefined} */ (this.get(MapProperty.SIZE)) /** @type {module:ol/size~Size|undefined} */ (this.get(MapProperty.SIZE))
); );
}; }
/** /**
* Get the view associated with this map. A view manages properties such as * Get the view associated with this map. A view manages properties such as
@@ -848,22 +823,20 @@ PluggableMap.prototype.getSize = function() {
* @observable * @observable
* @api * @api
*/ */
PluggableMap.prototype.getView = function() { getView() {
return ( return (
/** @type {module:ol/View} */ (this.get(MapProperty.VIEW)) /** @type {module:ol/View} */ (this.get(MapProperty.VIEW))
); );
}; }
/** /**
* Get the element that serves as the map viewport. * Get the element that serves as the map viewport.
* @return {HTMLElement} Viewport. * @return {HTMLElement} Viewport.
* @api * @api
*/ */
PluggableMap.prototype.getViewport = function() { getViewport() {
return this.viewport_; return this.viewport_;
}; }
/** /**
* Get the element that serves as the container for overlays. Elements added to * Get the element that serves as the container for overlays. Elements added to
@@ -872,10 +845,9 @@ PluggableMap.prototype.getViewport = function() {
* events. * events.
* @return {!HTMLElement} The map's overlay container. * @return {!HTMLElement} The map's overlay container.
*/ */
PluggableMap.prototype.getOverlayContainer = function() { getOverlayContainer() {
return this.overlayContainer_; return this.overlayContainer_;
}; }
/** /**
* Get the element that serves as a container for overlays that don't allow * Get the element that serves as a container for overlays that don't allow
@@ -884,10 +856,9 @@ PluggableMap.prototype.getOverlayContainer = function() {
* don't trigger any {@link module:ol/MapBrowserEvent~MapBrowserEvent}. * don't trigger any {@link module:ol/MapBrowserEvent~MapBrowserEvent}.
* @return {!HTMLElement} The map's overlay container that stops events. * @return {!HTMLElement} The map's overlay container that stops events.
*/ */
PluggableMap.prototype.getOverlayContainerStopEvent = function() { getOverlayContainerStopEvent() {
return this.overlayContainerStopEvent_; return this.overlayContainerStopEvent_;
}; }
/** /**
* @param {module:ol/Tile} tile Tile. * @param {module:ol/Tile} tile Tile.
@@ -896,7 +867,7 @@ PluggableMap.prototype.getOverlayContainerStopEvent = function() {
* @param {number} tileResolution Tile resolution. * @param {number} tileResolution Tile resolution.
* @return {number} Tile priority. * @return {number} Tile priority.
*/ */
PluggableMap.prototype.getTilePriority = function(tile, tileSourceKey, tileCenter, tileResolution) { getTilePriority(tile, tileSourceKey, tileCenter, tileResolution) {
// Filter out tiles at higher zoom levels than the current zoom level, or that // Filter out tiles at higher zoom levels than the current zoom level, or that
// are outside the visible extent. // are outside the visible extent.
const frameState = this.frameState_; const frameState = this.frameState_;
@@ -916,24 +887,22 @@ PluggableMap.prototype.getTilePriority = function(tile, tileSourceKey, tileCente
const deltaY = tileCenter[1] - frameState.focus[1]; const deltaY = tileCenter[1] - frameState.focus[1];
return 65536 * Math.log(tileResolution) + return 65536 * Math.log(tileResolution) +
Math.sqrt(deltaX * deltaX + deltaY * deltaY) / tileResolution; Math.sqrt(deltaX * deltaX + deltaY * deltaY) / tileResolution;
}; }
/** /**
* @param {Event} browserEvent Browser event. * @param {Event} browserEvent Browser event.
* @param {string=} opt_type Type. * @param {string=} opt_type Type.
*/ */
PluggableMap.prototype.handleBrowserEvent = function(browserEvent, opt_type) { handleBrowserEvent(browserEvent, opt_type) {
const type = opt_type || browserEvent.type; const type = opt_type || browserEvent.type;
const mapBrowserEvent = new MapBrowserEvent(type, this, browserEvent); const mapBrowserEvent = new MapBrowserEvent(type, this, browserEvent);
this.handleMapBrowserEvent(mapBrowserEvent); this.handleMapBrowserEvent(mapBrowserEvent);
}; }
/** /**
* @param {module:ol/MapBrowserEvent} mapBrowserEvent The event to handle. * @param {module:ol/MapBrowserEvent} mapBrowserEvent The event to handle.
*/ */
PluggableMap.prototype.handleMapBrowserEvent = function(mapBrowserEvent) { handleMapBrowserEvent(mapBrowserEvent) {
if (!this.frameState_) { if (!this.frameState_) {
// With no view defined, we cannot translate pixels into geographical // With no view defined, we cannot translate pixels into geographical
// coordinates so interactions cannot be used. // coordinates so interactions cannot be used.
@@ -954,13 +923,12 @@ PluggableMap.prototype.handleMapBrowserEvent = function(mapBrowserEvent) {
} }
} }
} }
}; }
/** /**
* @protected * @protected
*/ */
PluggableMap.prototype.handlePostRender = function() { handlePostRender() {
const frameState = this.frameState_; const frameState = this.frameState_;
@@ -999,21 +967,19 @@ PluggableMap.prototype.handlePostRender = function() {
postRenderFunctions[i](this, frameState); postRenderFunctions[i](this, frameState);
} }
postRenderFunctions.length = 0; postRenderFunctions.length = 0;
}; }
/** /**
* @private * @private
*/ */
PluggableMap.prototype.handleSizeChanged_ = function() { handleSizeChanged_() {
this.render(); this.render();
}; }
/** /**
* @private * @private
*/ */
PluggableMap.prototype.handleTargetChanged_ = function() { handleTargetChanged_() {
// target may be undefined, null, a string or an Element. // target may be undefined, null, a string or an Element.
// If it's a string we convert it to an Element before proceeding. // If it's a string we convert it to an Element before proceeding.
// If it's not now an Element we remove the viewport from the DOM. // If it's not now an Element we remove the viewport from the DOM.
@@ -1057,29 +1023,26 @@ PluggableMap.prototype.handleTargetChanged_ = function() {
this.updateSize(); this.updateSize();
// updateSize calls setSize, so no need to call this.render // updateSize calls setSize, so no need to call this.render
// ourselves here. // ourselves here.
}; }
/** /**
* @private * @private
*/ */
PluggableMap.prototype.handleTileChange_ = function() { handleTileChange_() {
this.render(); this.render();
}; }
/** /**
* @private * @private
*/ */
PluggableMap.prototype.handleViewPropertyChanged_ = function() { handleViewPropertyChanged_() {
this.render(); this.render();
}; }
/** /**
* @private * @private
*/ */
PluggableMap.prototype.handleViewChanged_ = function() { handleViewChanged_() {
if (this.viewPropertyListenerKey_) { if (this.viewPropertyListenerKey_) {
unlistenByKey(this.viewPropertyListenerKey_); unlistenByKey(this.viewPropertyListenerKey_);
this.viewPropertyListenerKey_ = null; this.viewPropertyListenerKey_ = null;
@@ -1099,13 +1062,12 @@ PluggableMap.prototype.handleViewChanged_ = function() {
this.handleViewPropertyChanged_, this); this.handleViewPropertyChanged_, this);
} }
this.render(); this.render();
}; }
/** /**
* @private * @private
*/ */
PluggableMap.prototype.handleLayerGroupChanged_ = function() { handleLayerGroupChanged_() {
if (this.layerGroupPropertyListenerKeys_) { if (this.layerGroupPropertyListenerKeys_) {
this.layerGroupPropertyListenerKeys_.forEach(unlistenByKey); this.layerGroupPropertyListenerKeys_.forEach(unlistenByKey);
this.layerGroupPropertyListenerKeys_ = null; this.layerGroupPropertyListenerKeys_ = null;
@@ -1122,39 +1084,35 @@ PluggableMap.prototype.handleLayerGroupChanged_ = function() {
]; ];
} }
this.render(); this.render();
}; }
/** /**
* @return {boolean} Is rendered. * @return {boolean} Is rendered.
*/ */
PluggableMap.prototype.isRendered = function() { isRendered() {
return !!this.frameState_; return !!this.frameState_;
}; }
/** /**
* Requests an immediate render in a synchronous manner. * Requests an immediate render in a synchronous manner.
* @api * @api
*/ */
PluggableMap.prototype.renderSync = function() { renderSync() {
if (this.animationDelayKey_) { if (this.animationDelayKey_) {
cancelAnimationFrame(this.animationDelayKey_); cancelAnimationFrame(this.animationDelayKey_);
} }
this.animationDelay_(); this.animationDelay_();
}; }
/** /**
* Request a map rendering (at the next animation frame). * Request a map rendering (at the next animation frame).
* @api * @api
*/ */
PluggableMap.prototype.render = function() { render() {
if (this.animationDelayKey_ === undefined) { if (this.animationDelayKey_ === undefined) {
this.animationDelayKey_ = requestAnimationFrame(this.animationDelay_); this.animationDelayKey_ = requestAnimationFrame(this.animationDelay_);
} }
}; }
/** /**
* Remove the given control from the map. * Remove the given control from the map.
@@ -1163,10 +1121,9 @@ PluggableMap.prototype.render = function() {
* if the control was not found). * if the control was not found).
* @api * @api
*/ */
PluggableMap.prototype.removeControl = function(control) { removeControl(control) {
return this.getControls().remove(control); return this.getControls().remove(control);
}; }
/** /**
* Remove the given interaction from the map. * Remove the given interaction from the map.
@@ -1175,10 +1132,9 @@ PluggableMap.prototype.removeControl = function(control) {
* undefined if the interaction was not found). * undefined if the interaction was not found).
* @api * @api
*/ */
PluggableMap.prototype.removeInteraction = function(interaction) { removeInteraction(interaction) {
return this.getInteractions().remove(interaction); return this.getInteractions().remove(interaction);
}; }
/** /**
* Removes the given layer from the map. * Removes the given layer from the map.
@@ -1187,11 +1143,10 @@ PluggableMap.prototype.removeInteraction = function(interaction) {
* layer was not found). * layer was not found).
* @api * @api
*/ */
PluggableMap.prototype.removeLayer = function(layer) { removeLayer(layer) {
const layers = this.getLayerGroup().getLayers(); const layers = this.getLayerGroup().getLayers();
return layers.remove(layer); return layers.remove(layer);
}; }
/** /**
* Remove the given overlay from the map. * Remove the given overlay from the map.
@@ -1200,16 +1155,15 @@ PluggableMap.prototype.removeLayer = function(layer) {
* if the overlay was not found). * if the overlay was not found).
* @api * @api
*/ */
PluggableMap.prototype.removeOverlay = function(overlay) { removeOverlay(overlay) {
return this.getOverlays().remove(overlay); return this.getOverlays().remove(overlay);
}; }
/** /**
* @param {number} time Time. * @param {number} time Time.
* @private * @private
*/ */
PluggableMap.prototype.renderFrame_ = function(time) { renderFrame_(time) {
let viewState; let viewState;
const size = this.getSize(); const size = this.getSize();
@@ -1295,8 +1249,7 @@ PluggableMap.prototype.renderFrame_ = function(time) {
setTimeout(this.handlePostRender.bind(this), 0); setTimeout(this.handlePostRender.bind(this), 0);
}; }
/** /**
* Sets the layergroup of this map. * Sets the layergroup of this map.
@@ -1304,10 +1257,9 @@ PluggableMap.prototype.renderFrame_ = function(time) {
* @observable * @observable
* @api * @api
*/ */
PluggableMap.prototype.setLayerGroup = function(layerGroup) { setLayerGroup(layerGroup) {
this.set(MapProperty.LAYERGROUP, layerGroup); this.set(MapProperty.LAYERGROUP, layerGroup);
}; }
/** /**
* Set the size of this map. * Set the size of this map.
@@ -1315,10 +1267,9 @@ PluggableMap.prototype.setLayerGroup = function(layerGroup) {
* @observable * @observable
* @api * @api
*/ */
PluggableMap.prototype.setSize = function(size) { setSize(size) {
this.set(MapProperty.SIZE, size); this.set(MapProperty.SIZE, size);
}; }
/** /**
* Set the target element to render this map into. * Set the target element to render this map into.
@@ -1327,10 +1278,9 @@ PluggableMap.prototype.setSize = function(size) {
* @observable * @observable
* @api * @api
*/ */
PluggableMap.prototype.setTarget = function(target) { setTarget(target) {
this.set(MapProperty.TARGET, target); this.set(MapProperty.TARGET, target);
}; }
/** /**
* Set the view for this map. * Set the view for this map.
@@ -1338,27 +1288,25 @@ PluggableMap.prototype.setTarget = function(target) {
* @observable * @observable
* @api * @api
*/ */
PluggableMap.prototype.setView = function(view) { setView(view) {
this.set(MapProperty.VIEW, view); this.set(MapProperty.VIEW, view);
}; }
/** /**
* @param {module:ol/Feature} feature Feature. * @param {module:ol/Feature} feature Feature.
*/ */
PluggableMap.prototype.skipFeature = function(feature) { skipFeature(feature) {
const featureUid = getUid(feature).toString(); const featureUid = getUid(feature).toString();
this.skippedFeatureUids_[featureUid] = true; this.skippedFeatureUids_[featureUid] = true;
this.render(); this.render();
}; }
/** /**
* Force a recalculation of the map viewport size. This should be called when * Force a recalculation of the map viewport size. This should be called when
* third-party code changes the size of the map viewport. * third-party code changes the size of the map viewport.
* @api * @api
*/ */
PluggableMap.prototype.updateSize = function() { updateSize() {
const targetElement = this.getTargetElement(); const targetElement = this.getTargetElement();
if (!targetElement) { if (!targetElement) {
@@ -1378,17 +1326,17 @@ PluggableMap.prototype.updateSize = function() {
parseFloat(computedStyle['borderBottomWidth']) parseFloat(computedStyle['borderBottomWidth'])
]); ]);
} }
}; }
/** /**
* @param {module:ol/Feature} feature Feature. * @param {module:ol/Feature} feature Feature.
*/ */
PluggableMap.prototype.unskipFeature = function(feature) { unskipFeature(feature) {
const featureUid = getUid(feature).toString(); const featureUid = getUid(feature).toString();
delete this.skippedFeatureUids_[featureUid]; delete this.skippedFeatureUids_[featureUid];
this.render(); this.render();
}; }
}
/** /**
+31 -32
View File
@@ -1,7 +1,6 @@
/** /**
* @module ol/Tile * @module ol/Tile
*/ */
import {inherits} from './util.js';
import TileState from './TileState.js'; import TileState from './TileState.js';
import {easeIn} from './easing.js'; import {easeIn} from './easing.js';
import EventTarget from './events/EventTarget.js'; import EventTarget from './events/EventTarget.js';
@@ -44,15 +43,17 @@ import EventType from './events/EventType.js';
* @classdesc * @classdesc
* Base class for tiles. * Base class for tiles.
* *
* @constructor
* @abstract * @abstract
* @extends {module:ol/events/EventTarget} */
class Tile extends EventTarget {
/**
* @param {module:ol/tilecoord~TileCoord} tileCoord Tile coordinate. * @param {module:ol/tilecoord~TileCoord} tileCoord Tile coordinate.
* @param {module:ol/TileState} state State. * @param {module:ol/TileState} state State.
* @param {module:ol/Tile~Options=} opt_options Tile options. * @param {module:ol/Tile~Options=} opt_options Tile options.
*/ */
const Tile = function(tileCoord, state, opt_options) { constructor(tileCoord, state, opt_options) {
EventTarget.call(this); super();
const options = opt_options ? opt_options : {}; const options = opt_options ? opt_options : {};
@@ -96,25 +97,21 @@ const Tile = function(tileCoord, state, opt_options) {
*/ */
this.transitionStarts_ = {}; this.transitionStarts_ = {};
}; }
inherits(Tile, EventTarget);
/** /**
* @protected * @protected
*/ */
Tile.prototype.changed = function() { changed() {
this.dispatchEvent(EventType.CHANGE); this.dispatchEvent(EventType.CHANGE);
}; }
/** /**
* @return {string} Key. * @return {string} Key.
*/ */
Tile.prototype.getKey = function() { getKey() {
return this.key + '/' + this.tileCoord; return this.key + '/' + this.tileCoord;
}; }
/** /**
* Get the interim tile most suitable for rendering using the chain of interim * Get the interim tile most suitable for rendering using the chain of interim
@@ -122,7 +119,7 @@ Tile.prototype.getKey = function() {
* such tile exists, the original tile is returned. * such tile exists, the original tile is returned.
* @return {!module:ol/Tile} Best tile for rendering. * @return {!module:ol/Tile} Best tile for rendering.
*/ */
Tile.prototype.getInterimTile = function() { getInterimTile() {
if (!this.interimTile) { if (!this.interimTile) {
//empty chain //empty chain
return this; return this;
@@ -142,13 +139,13 @@ Tile.prototype.getInterimTile = function() {
// we can not find a better tile // we can not find a better tile
return this; return this;
}; }
/** /**
* Goes through the chain of interim tiles and discards sections of the chain * Goes through the chain of interim tiles and discards sections of the chain
* that are no longer relevant. * that are no longer relevant.
*/ */
Tile.prototype.refreshInterimChain = function() { refreshInterimChain() {
if (!this.interimTile) { if (!this.interimTile) {
return; return;
} }
@@ -176,32 +173,31 @@ Tile.prototype.refreshInterimChain = function() {
} }
tile = prev.interimTile; tile = prev.interimTile;
} while (tile); } while (tile);
}; }
/** /**
* Get the tile coordinate for this tile. * Get the tile coordinate for this tile.
* @return {module:ol/tilecoord~TileCoord} The tile coordinate. * @return {module:ol/tilecoord~TileCoord} The tile coordinate.
* @api * @api
*/ */
Tile.prototype.getTileCoord = function() { getTileCoord() {
return this.tileCoord; return this.tileCoord;
}; }
/** /**
* @return {module:ol/TileState} State. * @return {module:ol/TileState} State.
*/ */
Tile.prototype.getState = function() { getState() {
return this.state; return this.state;
}; }
/** /**
* @param {module:ol/TileState} state State. * @param {module:ol/TileState} state State.
*/ */
Tile.prototype.setState = function(state) { setState(state) {
this.state = state; this.state = state;
this.changed(); this.changed();
}; }
/** /**
* Load the image or retry if loading previously failed. * Load the image or retry if loading previously failed.
@@ -210,7 +206,7 @@ Tile.prototype.setState = function(state) {
* @abstract * @abstract
* @api * @api
*/ */
Tile.prototype.load = function() {}; load() {}
/** /**
* Get the alpha value for rendering. * Get the alpha value for rendering.
@@ -218,7 +214,7 @@ Tile.prototype.load = function() {};
* @param {number} time The render frame time. * @param {number} time The render frame time.
* @return {number} A number between 0 and 1. * @return {number} A number between 0 and 1.
*/ */
Tile.prototype.getAlpha = function(id, time) { getAlpha(id, time) {
if (!this.transition_) { if (!this.transition_) {
return 1; return 1;
} }
@@ -236,7 +232,7 @@ Tile.prototype.getAlpha = function(id, time) {
return 1; return 1;
} }
return easeIn(delta / this.transition_); return easeIn(delta / this.transition_);
}; }
/** /**
* Determine if a tile is in an alpha transition. A tile is considered in * Determine if a tile is in an alpha transition. A tile is considered in
@@ -245,20 +241,23 @@ Tile.prototype.getAlpha = function(id, time) {
* @param {number} id An id for the renderer. * @param {number} id An id for the renderer.
* @return {boolean} The tile is in transition. * @return {boolean} The tile is in transition.
*/ */
Tile.prototype.inTransition = function(id) { inTransition(id) {
if (!this.transition_) { if (!this.transition_) {
return false; return false;
} }
return this.transitionStarts_[id] !== -1; return this.transitionStarts_[id] !== -1;
}; }
/** /**
* Mark a transition as complete. * Mark a transition as complete.
* @param {number} id An id for the renderer. * @param {number} id An id for the renderer.
*/ */
Tile.prototype.endTransition = function(id) { endTransition(id) {
if (this.transition_) { if (this.transition_) {
this.transitionStarts_[id] = -1; this.transitionStarts_[id] = -1;
} }
}; }
}
export default Tile; export default Tile;
+12 -15
View File
@@ -1,29 +1,24 @@
/** /**
* @module ol/TileCache * @module ol/TileCache
*/ */
import {inherits} from './util.js';
import LRUCache from './structs/LRUCache.js'; import LRUCache from './structs/LRUCache.js';
import {fromKey, getKey} from './tilecoord.js'; import {fromKey, getKey} from './tilecoord.js';
class TileCache extends LRUCache {
/** /**
* @constructor
* @extends {module:ol/structs/LRUCache.<module:ol/Tile>}
* @param {number=} opt_highWaterMark High water mark. * @param {number=} opt_highWaterMark High water mark.
* @struct
*/ */
const TileCache = function(opt_highWaterMark) { constructor(opt_highWaterMark) {
LRUCache.call(this, opt_highWaterMark); super(opt_highWaterMark);
};
inherits(TileCache, LRUCache);
}
/** /**
* @param {!Object.<string, module:ol/TileRange>} usedTiles Used tiles. * @param {!Object.<string, module:ol/TileRange>} usedTiles Used tiles.
*/ */
TileCache.prototype.expireCache = function(usedTiles) { expireCache(usedTiles) {
while (this.canExpireCache()) { while (this.canExpireCache()) {
const tile = this.peekLast(); const tile = this.peekLast();
const zKey = tile.tileCoord[0].toString(); const zKey = tile.tileCoord[0].toString();
@@ -33,13 +28,12 @@ TileCache.prototype.expireCache = function(usedTiles) {
this.pop().dispose(); this.pop().dispose();
} }
} }
}; }
/** /**
* Prune all tiles from the cache that don't have the same z as the newest tile. * Prune all tiles from the cache that don't have the same z as the newest tile.
*/ */
TileCache.prototype.pruneExceptNewestZ = function() { pruneExceptNewestZ() {
if (this.getCount() === 0) { if (this.getCount() === 0) {
return; return;
} }
@@ -52,5 +46,8 @@ TileCache.prototype.pruneExceptNewestZ = function() {
tile.dispose(); tile.dispose();
} }
}, this); }, this);
}; }
}
export default TileCache; export default TileCache;
+21 -29
View File
@@ -1,7 +1,6 @@
/** /**
* @module ol/TileQueue * @module ol/TileQueue
*/ */
import {inherits} from './util.js';
import TileState from './TileState.js'; import TileState from './TileState.js';
import {listen, unlisten} from './events.js'; import {listen, unlisten} from './events.js';
import EventType from './events/EventType.js'; import EventType from './events/EventType.js';
@@ -13,19 +12,15 @@ import PriorityQueue from './structs/PriorityQueue.js';
*/ */
/** class TileQueue extends PriorityQueue {
* @constructor
* @extends {module:ol/structs/PriorityQueue.<Array>}
* @param {module:ol/TileQueue~PriorityFunction} tilePriorityFunction
* Tile priority function.
* @param {function(): ?} tileChangeCallback
* Function called on each tile change event.
* @struct
*/
const TileQueue = function(tilePriorityFunction, tileChangeCallback) {
PriorityQueue.call( /**
this, * @param {module:ol/TileQueue~PriorityFunction} tilePriorityFunction Tile priority function.
* @param {function(): ?} tileChangeCallback Function called on each tile change event.
*/
constructor(tilePriorityFunction, tileChangeCallback) {
super(
/** /**
* @param {Array} element Element. * @param {Array} element Element.
* @return {number} Priority. * @return {number} Priority.
@@ -59,37 +54,32 @@ const TileQueue = function(tilePriorityFunction, tileChangeCallback) {
*/ */
this.tilesLoadingKeys_ = {}; this.tilesLoadingKeys_ = {};
}; }
inherits(TileQueue, PriorityQueue);
/** /**
* @inheritDoc * @inheritDoc
*/ */
TileQueue.prototype.enqueue = function(element) { enqueue(element) {
const added = PriorityQueue.prototype.enqueue.call(this, element); const added = super.enqueue(element);
if (added) { if (added) {
const tile = element[0]; const tile = element[0];
listen(tile, EventType.CHANGE, this.handleTileChange, this); listen(tile, EventType.CHANGE, this.handleTileChange, this);
} }
return added; return added;
}; }
/** /**
* @return {number} Number of tiles loading. * @return {number} Number of tiles loading.
*/ */
TileQueue.prototype.getTilesLoading = function() { getTilesLoading() {
return this.tilesLoading_; return this.tilesLoading_;
}; }
/** /**
* @param {module:ol/events/Event} event Event. * @param {module:ol/events/Event} event Event.
* @protected * @protected
*/ */
TileQueue.prototype.handleTileChange = function(event) { handleTileChange(event) {
const tile = /** @type {module:ol/Tile} */ (event.target); const tile = /** @type {module:ol/Tile} */ (event.target);
const state = tile.getState(); const state = tile.getState();
if (state === TileState.LOADED || state === TileState.ERROR || if (state === TileState.LOADED || state === TileState.ERROR ||
@@ -102,14 +92,13 @@ TileQueue.prototype.handleTileChange = function(event) {
} }
this.tileChangeCallback_(); this.tileChangeCallback_();
} }
}; }
/** /**
* @param {number} maxTotalLoading Maximum number tiles to load simultaneously. * @param {number} maxTotalLoading Maximum number tiles to load simultaneously.
* @param {number} maxNewLoads Maximum number of new tiles to load. * @param {number} maxNewLoads Maximum number of new tiles to load.
*/ */
TileQueue.prototype.loadMoreTiles = function(maxTotalLoading, maxNewLoads) { loadMoreTiles(maxTotalLoading, maxNewLoads) {
let newLoads = 0; let newLoads = 0;
let abortedTiles = false; let abortedTiles = false;
let state, tile, tileKey; let state, tile, tileKey;
@@ -132,5 +121,8 @@ TileQueue.prototype.loadMoreTiles = function(maxTotalLoading, maxNewLoads) {
// a small, saturated tile cache. // a small, saturated tile cache.
this.tileChangeCallback_(); this.tileChangeCallback_();
} }
}; }
}
export default TileQueue; export default TileQueue;
+93 -97
View File
@@ -1,18 +1,20 @@
/** /**
* @module ol/TileRange * @module ol/TileRange
*/ */
/** /**
* A representation of a contiguous block of tiles. A tile range is specified * A representation of a contiguous block of tiles. A tile range is specified
* by its min/max tile coordinates and is inclusive of coordinates. * by its min/max tile coordinates and is inclusive of coordinates.
* */
* @constructor class TileRange {
/**
* @param {number} minX Minimum X. * @param {number} minX Minimum X.
* @param {number} maxX Maximum X. * @param {number} maxX Maximum X.
* @param {number} minY Minimum Y. * @param {number} minY Minimum Y.
* @param {number} maxY Maximum Y. * @param {number} maxY Maximum Y.
* @struct
*/ */
const TileRange = function(minX, maxX, minY, maxY) { constructor(minX, maxX, minY, maxY) {
/** /**
* @type {number} * @type {number}
@@ -34,7 +36,93 @@ const TileRange = function(minX, maxX, minY, maxY) {
*/ */
this.maxY = maxY; this.maxY = maxY;
}; }
/**
* @param {module:ol/tilecoord~TileCoord} tileCoord Tile coordinate.
* @return {boolean} Contains tile coordinate.
*/
contains(tileCoord) {
return this.containsXY(tileCoord[1], tileCoord[2]);
}
/**
* @param {module:ol/TileRange} tileRange Tile range.
* @return {boolean} Contains.
*/
containsTileRange(tileRange) {
return this.minX <= tileRange.minX && tileRange.maxX <= this.maxX &&
this.minY <= tileRange.minY && tileRange.maxY <= this.maxY;
}
/**
* @param {number} x Tile coordinate x.
* @param {number} y Tile coordinate y.
* @return {boolean} Contains coordinate.
*/
containsXY(x, y) {
return this.minX <= x && x <= this.maxX && this.minY <= y && y <= this.maxY;
}
/**
* @param {module:ol/TileRange} tileRange Tile range.
* @return {boolean} Equals.
*/
equals(tileRange) {
return this.minX == tileRange.minX && this.minY == tileRange.minY &&
this.maxX == tileRange.maxX && this.maxY == tileRange.maxY;
}
/**
* @param {module:ol/TileRange} tileRange Tile range.
*/
extend(tileRange) {
if (tileRange.minX < this.minX) {
this.minX = tileRange.minX;
}
if (tileRange.maxX > this.maxX) {
this.maxX = tileRange.maxX;
}
if (tileRange.minY < this.minY) {
this.minY = tileRange.minY;
}
if (tileRange.maxY > this.maxY) {
this.maxY = tileRange.maxY;
}
}
/**
* @return {number} Height.
*/
getHeight() {
return this.maxY - this.minY + 1;
}
/**
* @return {module:ol/size~Size} Size.
*/
getSize() {
return [this.getWidth(), this.getHeight()];
}
/**
* @return {number} Width.
*/
getWidth() {
return this.maxX - this.minX + 1;
}
/**
* @param {module:ol/TileRange} tileRange Tile range.
* @return {boolean} Intersects.
*/
intersects(tileRange) {
return this.minX <= tileRange.maxX &&
this.maxX >= tileRange.minX &&
this.minY <= tileRange.maxY &&
this.maxY >= tileRange.minY;
}
}
/** /**
@@ -58,96 +146,4 @@ export function createOrUpdate(minX, maxX, minY, maxY, tileRange) {
} }
/**
* @param {module:ol/tilecoord~TileCoord} tileCoord Tile coordinate.
* @return {boolean} Contains tile coordinate.
*/
TileRange.prototype.contains = function(tileCoord) {
return this.containsXY(tileCoord[1], tileCoord[2]);
};
/**
* @param {module:ol/TileRange} tileRange Tile range.
* @return {boolean} Contains.
*/
TileRange.prototype.containsTileRange = function(tileRange) {
return this.minX <= tileRange.minX && tileRange.maxX <= this.maxX &&
this.minY <= tileRange.minY && tileRange.maxY <= this.maxY;
};
/**
* @param {number} x Tile coordinate x.
* @param {number} y Tile coordinate y.
* @return {boolean} Contains coordinate.
*/
TileRange.prototype.containsXY = function(x, y) {
return this.minX <= x && x <= this.maxX && this.minY <= y && y <= this.maxY;
};
/**
* @param {module:ol/TileRange} tileRange Tile range.
* @return {boolean} Equals.
*/
TileRange.prototype.equals = function(tileRange) {
return this.minX == tileRange.minX && this.minY == tileRange.minY &&
this.maxX == tileRange.maxX && this.maxY == tileRange.maxY;
};
/**
* @param {module:ol/TileRange} tileRange Tile range.
*/
TileRange.prototype.extend = function(tileRange) {
if (tileRange.minX < this.minX) {
this.minX = tileRange.minX;
}
if (tileRange.maxX > this.maxX) {
this.maxX = tileRange.maxX;
}
if (tileRange.minY < this.minY) {
this.minY = tileRange.minY;
}
if (tileRange.maxY > this.maxY) {
this.maxY = tileRange.maxY;
}
};
/**
* @return {number} Height.
*/
TileRange.prototype.getHeight = function() {
return this.maxY - this.minY + 1;
};
/**
* @return {module:ol/size~Size} Size.
*/
TileRange.prototype.getSize = function() {
return [this.getWidth(), this.getHeight()];
};
/**
* @return {number} Width.
*/
TileRange.prototype.getWidth = function() {
return this.maxX - this.minX + 1;
};
/**
* @param {module:ol/TileRange} tileRange Tile range.
* @return {boolean} Intersects.
*/
TileRange.prototype.intersects = function(tileRange) {
return this.minX <= tileRange.maxX &&
this.maxX >= tileRange.minX &&
this.minY <= tileRange.maxY &&
this.maxY >= tileRange.minY;
};
export default TileRange; export default TileRange;
+27 -35
View File
@@ -1,7 +1,7 @@
/** /**
* @module ol/VectorImageTile * @module ol/VectorImageTile
*/ */
import {getUid, inherits} from './util.js'; import {getUid} from './util.js';
import Tile from './Tile.js'; import Tile from './Tile.js';
import TileState from './TileState.js'; import TileState from './TileState.js';
import {createCanvasContext2D} from './dom.js'; import {createCanvasContext2D} from './dom.js';
@@ -21,9 +21,9 @@ import {UNDEFINED} from './functions.js';
*/ */
class VectorImageTile extends Tile {
/** /**
* @constructor
* @extends {module:ol/Tile}
* @param {module:ol/tilecoord~TileCoord} tileCoord Tile coordinate. * @param {module:ol/tilecoord~TileCoord} tileCoord Tile coordinate.
* @param {module:ol/TileState} state State. * @param {module:ol/TileState} state State.
* @param {number} sourceRevision Source revision. * @param {number} sourceRevision Source revision.
@@ -43,11 +43,11 @@ import {UNDEFINED} from './functions.js';
* Function to call when a source tile's state changes. * Function to call when a source tile's state changes.
* @param {number} zoom Integer zoom to render the tile for. * @param {number} zoom Integer zoom to render the tile for.
*/ */
const VectorImageTile = function(tileCoord, state, sourceRevision, format, constructor(tileCoord, state, sourceRevision, format, tileLoadFunction,
tileLoadFunction, urlTileCoord, tileUrlFunction, sourceTileGrid, tileGrid, urlTileCoord, tileUrlFunction, sourceTileGrid, tileGrid, sourceTiles,
sourceTiles, pixelRatio, projection, tileClass, handleTileChange, zoom) { pixelRatio, projection, tileClass, handleTileChange, zoom) {
Tile.call(this, tileCoord, state, {transition: 0}); super(tileCoord, state, {transition: 0});
/** /**
* @private * @private
@@ -157,15 +157,12 @@ const VectorImageTile = function(tileCoord, state, sourceRevision, format,
} }
} }
}; }
inherits(VectorImageTile, Tile);
/** /**
* @inheritDoc * @inheritDoc
*/ */
VectorImageTile.prototype.disposeInternal = function() { disposeInternal() {
this.state = TileState.ABORT; this.state = TileState.ABORT;
this.changed(); this.changed();
if (this.interimTile) { if (this.interimTile) {
@@ -187,39 +184,36 @@ VectorImageTile.prototype.disposeInternal = function() {
this.loadListenerKeys_.length = 0; this.loadListenerKeys_.length = 0;
this.sourceTileListenerKeys_.forEach(unlistenByKey); this.sourceTileListenerKeys_.forEach(unlistenByKey);
this.sourceTileListenerKeys_.length = 0; this.sourceTileListenerKeys_.length = 0;
Tile.prototype.disposeInternal.call(this); super.disposeInternal();
}; }
/** /**
* @param {module:ol/layer/Layer} layer Layer. * @param {module:ol/layer/Layer} layer Layer.
* @return {CanvasRenderingContext2D} The rendering context. * @return {CanvasRenderingContext2D} The rendering context.
*/ */
VectorImageTile.prototype.getContext = function(layer) { getContext(layer) {
const key = getUid(layer).toString(); const key = getUid(layer).toString();
if (!(key in this.context_)) { if (!(key in this.context_)) {
this.context_[key] = createCanvasContext2D(); this.context_[key] = createCanvasContext2D();
} }
return this.context_[key]; return this.context_[key];
}; }
/** /**
* Get the Canvas for this tile. * Get the Canvas for this tile.
* @param {module:ol/layer/Layer} layer Layer. * @param {module:ol/layer/Layer} layer Layer.
* @return {HTMLCanvasElement} Canvas. * @return {HTMLCanvasElement} Canvas.
*/ */
VectorImageTile.prototype.getImage = function(layer) { getImage(layer) {
return this.getReplayState(layer).renderedTileRevision == -1 ? return this.getReplayState(layer).renderedTileRevision == -1 ?
null : this.getContext(layer).canvas; null : this.getContext(layer).canvas;
}; }
/** /**
* @param {module:ol/layer/Layer} layer Layer. * @param {module:ol/layer/Layer} layer Layer.
* @return {module:ol/VectorImageTile~ReplayState} The replay state. * @return {module:ol/VectorImageTile~ReplayState} The replay state.
*/ */
VectorImageTile.prototype.getReplayState = function(layer) { getReplayState(layer) {
const key = getUid(layer).toString(); const key = getUid(layer).toString();
if (!(key in this.replayState_)) { if (!(key in this.replayState_)) {
this.replayState_[key] = { this.replayState_[key] = {
@@ -230,30 +224,27 @@ VectorImageTile.prototype.getReplayState = function(layer) {
}; };
} }
return this.replayState_[key]; return this.replayState_[key];
}; }
/** /**
* @inheritDoc * @inheritDoc
*/ */
VectorImageTile.prototype.getKey = function() { getKey() {
return this.tileKeys.join('/') + '-' + this.sourceRevision_; return this.tileKeys.join('/') + '-' + this.sourceRevision_;
}; }
/** /**
* @param {string} tileKey Key (tileCoord) of the source tile. * @param {string} tileKey Key (tileCoord) of the source tile.
* @return {module:ol/VectorTile} Source tile. * @return {module:ol/VectorTile} Source tile.
*/ */
VectorImageTile.prototype.getTile = function(tileKey) { getTile(tileKey) {
return this.sourceTiles_[tileKey]; return this.sourceTiles_[tileKey];
}; }
/** /**
* @inheritDoc * @inheritDoc
*/ */
VectorImageTile.prototype.load = function() { load() {
// Source tiles with LOADED state - we just count them because once they are // Source tiles with LOADED state - we just count them because once they are
// loaded, we're no longer listening to state changes. // loaded, we're no longer listening to state changes.
let leftToLoad = 0; let leftToLoad = 0;
@@ -296,13 +287,12 @@ VectorImageTile.prototype.load = function() {
if (leftToLoad - Object.keys(errorSourceTiles).length == 0) { if (leftToLoad - Object.keys(errorSourceTiles).length == 0) {
setTimeout(this.finishLoading_.bind(this), 0); setTimeout(this.finishLoading_.bind(this), 0);
} }
}; }
/** /**
* @private * @private
*/ */
VectorImageTile.prototype.finishLoading_ = function() { finishLoading_() {
let loaded = this.tileKeys.length; let loaded = this.tileKeys.length;
let empty = 0; let empty = 0;
for (let i = loaded - 1; i >= 0; --i) { for (let i = loaded - 1; i >= 0; --i) {
@@ -321,7 +311,9 @@ VectorImageTile.prototype.finishLoading_ = function() {
} else { } else {
this.setState(empty == this.tileKeys.length ? TileState.EMPTY : TileState.ERROR); this.setState(empty == this.tileKeys.length ? TileState.EMPTY : TileState.ERROR);
} }
}; }
}
export default VectorImageTile; export default VectorImageTile;
+45 -60
View File
@@ -1,19 +1,26 @@
/** /**
* @module ol/VectorTile * @module ol/VectorTile
*/ */
import {getUid, inherits} from './util.js'; import {getUid} from './util.js';
import Tile from './Tile.js'; import Tile from './Tile.js';
import TileState from './TileState.js'; import TileState from './TileState.js';
/**
* @const
* @type {module:ol/extent~Extent}
*/
const DEFAULT_EXTENT = [0, 0, 4096, 4096];
/** /**
* @typedef {function(new: module:ol/VectorTile, module:ol/tilecoord~TileCoord, * @typedef {function(new: module:ol/VectorTile, module:ol/tilecoord~TileCoord,
* module:ol/TileState, string, ?string, module:ol/Tile~LoadFunction)} TileClass * module:ol/TileState, string, ?string, module:ol/Tile~LoadFunction)} TileClass
* @api * @api
*/ */
class VectorTile extends Tile {
/** /**
* @constructor
* @extends {module:ol/Tile}
* @param {module:ol/tilecoord~TileCoord} tileCoord Tile coordinate. * @param {module:ol/tilecoord~TileCoord} tileCoord Tile coordinate.
* @param {module:ol/TileState} state State. * @param {module:ol/TileState} state State.
* @param {string} src Data source url. * @param {string} src Data source url.
@@ -21,9 +28,9 @@ import TileState from './TileState.js';
* @param {module:ol/Tile~LoadFunction} tileLoadFunction Tile load function. * @param {module:ol/Tile~LoadFunction} tileLoadFunction Tile load function.
* @param {module:ol/Tile~Options=} opt_options Tile options. * @param {module:ol/Tile~Options=} opt_options Tile options.
*/ */
const VectorTile = function(tileCoord, state, src, format, tileLoadFunction, opt_options) { constructor(tileCoord, state, src, format, tileLoadFunction, opt_options) {
Tile.call(this, tileCoord, state, opt_options); super(tileCoord, state, opt_options);
/** /**
* @type {number} * @type {number}
@@ -79,48 +86,36 @@ const VectorTile = function(tileCoord, state, src, format, tileLoadFunction, opt
*/ */
this.url_ = src; this.url_ = src;
}; }
inherits(VectorTile, Tile);
/**
* @const
* @type {module:ol/extent~Extent}
*/
const DEFAULT_EXTENT = [0, 0, 4096, 4096];
/** /**
* @inheritDoc * @inheritDoc
*/ */
VectorTile.prototype.disposeInternal = function() { disposeInternal() {
this.features_ = null; this.features_ = null;
this.replayGroups_ = {}; this.replayGroups_ = {};
this.state = TileState.ABORT; this.state = TileState.ABORT;
this.changed(); this.changed();
Tile.prototype.disposeInternal.call(this); super.disposeInternal();
}; }
/** /**
* Gets the extent of the vector tile. * Gets the extent of the vector tile.
* @return {module:ol/extent~Extent} The extent. * @return {module:ol/extent~Extent} The extent.
* @api * @api
*/ */
VectorTile.prototype.getExtent = function() { getExtent() {
return this.extent_ || DEFAULT_EXTENT; return this.extent_ || DEFAULT_EXTENT;
}; }
/** /**
* Get the feature format assigned for reading this tile's features. * Get the feature format assigned for reading this tile's features.
* @return {module:ol/format/Feature} Feature format. * @return {module:ol/format/Feature} Feature format.
* @api * @api
*/ */
VectorTile.prototype.getFormat = function() { getFormat() {
return this.format_; return this.format_;
}; }
/** /**
* Get the features for this tile. Geometries will be in the projection returned * Get the features for this tile. Geometries will be in the projection returned
@@ -128,18 +123,16 @@ VectorTile.prototype.getFormat = function() {
* @return {Array.<module:ol/Feature|module:ol/render/Feature>} Features. * @return {Array.<module:ol/Feature|module:ol/render/Feature>} Features.
* @api * @api
*/ */
VectorTile.prototype.getFeatures = function() { getFeatures() {
return this.features_; return this.features_;
}; }
/** /**
* @inheritDoc * @inheritDoc
*/ */
VectorTile.prototype.getKey = function() { getKey() {
return this.url_; return this.url_;
}; }
/** /**
* Get the feature projection of features returned by * Get the feature projection of features returned by
@@ -147,32 +140,29 @@ VectorTile.prototype.getKey = function() {
* @return {module:ol/proj/Projection} Feature projection. * @return {module:ol/proj/Projection} Feature projection.
* @api * @api
*/ */
VectorTile.prototype.getProjection = function() { getProjection() {
return this.projection_; return this.projection_;
}; }
/** /**
* @param {module:ol/layer/Layer} layer Layer. * @param {module:ol/layer/Layer} layer Layer.
* @param {string} key Key. * @param {string} key Key.
* @return {module:ol/render/ReplayGroup} Replay group. * @return {module:ol/render/ReplayGroup} Replay group.
*/ */
VectorTile.prototype.getReplayGroup = function(layer, key) { getReplayGroup(layer, key) {
return this.replayGroups_[getUid(layer) + ',' + key]; return this.replayGroups_[getUid(layer) + ',' + key];
}; }
/** /**
* @inheritDoc * @inheritDoc
*/ */
VectorTile.prototype.load = function() { load() {
if (this.state == TileState.IDLE) { if (this.state == TileState.IDLE) {
this.setState(TileState.LOADING); this.setState(TileState.LOADING);
this.tileLoadFunction_(this, this.url_); this.tileLoadFunction_(this, this.url_);
this.loader_(null, NaN, null); this.loader_(null, NaN, null);
} }
}; }
/** /**
* Handler for successful tile load. * Handler for successful tile load.
@@ -180,20 +170,18 @@ VectorTile.prototype.load = function() {
* @param {module:ol/proj/Projection} dataProjection Data projection. * @param {module:ol/proj/Projection} dataProjection Data projection.
* @param {module:ol/extent~Extent} extent Extent. * @param {module:ol/extent~Extent} extent Extent.
*/ */
VectorTile.prototype.onLoad = function(features, dataProjection, extent) { onLoad(features, dataProjection, extent) {
this.setProjection(dataProjection); this.setProjection(dataProjection);
this.setFeatures(features); this.setFeatures(features);
this.setExtent(extent); this.setExtent(extent);
}; }
/** /**
* Handler for tile load errors. * Handler for tile load errors.
*/ */
VectorTile.prototype.onError = function() { onError() {
this.setState(TileState.ERROR); this.setState(TileState.ERROR);
}; }
/** /**
* Function for use in an {@link module:ol/source/VectorTile~VectorTile}'s * Function for use in an {@link module:ol/source/VectorTile~VectorTile}'s
@@ -207,10 +195,9 @@ VectorTile.prototype.onError = function() {
* @param {module:ol/extent~Extent} extent The extent. * @param {module:ol/extent~Extent} extent The extent.
* @api * @api
*/ */
VectorTile.prototype.setExtent = function(extent) { setExtent(extent) {
this.extent_ = extent; this.extent_ = extent;
}; }
/** /**
* Function for use in an {@link module:ol/source/VectorTile~VectorTile}'s `tileLoadFunction`. * Function for use in an {@link module:ol/source/VectorTile~VectorTile}'s `tileLoadFunction`.
@@ -218,11 +205,10 @@ VectorTile.prototype.setExtent = function(extent) {
* @param {Array.<module:ol/Feature>} features Features. * @param {Array.<module:ol/Feature>} features Features.
* @api * @api
*/ */
VectorTile.prototype.setFeatures = function(features) { setFeatures(features) {
this.features_ = features; this.features_ = features;
this.setState(TileState.LOADED); this.setState(TileState.LOADED);
}; }
/** /**
* Function for use in an {@link module:ol/source/VectorTile~VectorTile}'s `tileLoadFunction`. * Function for use in an {@link module:ol/source/VectorTile~VectorTile}'s `tileLoadFunction`.
@@ -231,28 +217,27 @@ VectorTile.prototype.setFeatures = function(features) {
* @param {module:ol/proj/Projection} projection Feature projection. * @param {module:ol/proj/Projection} projection Feature projection.
* @api * @api
*/ */
VectorTile.prototype.setProjection = function(projection) { setProjection(projection) {
this.projection_ = projection; this.projection_ = projection;
}; }
/** /**
* @param {module:ol/layer/Layer} layer Layer. * @param {module:ol/layer/Layer} layer Layer.
* @param {string} key Key. * @param {string} key Key.
* @param {module:ol/render/ReplayGroup} replayGroup Replay group. * @param {module:ol/render/ReplayGroup} replayGroup Replay group.
*/ */
VectorTile.prototype.setReplayGroup = function(layer, key, replayGroup) { setReplayGroup(layer, key, replayGroup) {
this.replayGroups_[getUid(layer) + ',' + key] = replayGroup; this.replayGroups_[getUid(layer) + ',' + key] = replayGroup;
}; }
/** /**
* Set the feature loader for reading this tile's features. * Set the feature loader for reading this tile's features.
* @param {module:ol/featureloader~FeatureLoader} loader Feature loader. * @param {module:ol/featureloader~FeatureLoader} loader Feature loader.
* @api * @api
*/ */
VectorTile.prototype.setLoader = function(loader) { setLoader(loader) {
this.loader_ = loader; this.loader_ = loader;
}; }
}
export default VectorTile; export default VectorTile;
+96 -135
View File
@@ -2,7 +2,7 @@
* @module ol/View * @module ol/View
*/ */
import {DEFAULT_TILE_SIZE} from './tilegrid/common.js'; import {DEFAULT_TILE_SIZE} from './tilegrid/common.js';
import {getUid, inherits} from './util.js'; import {getUid} from './util.js';
import {UNDEFINED} from './functions.js'; import {UNDEFINED} from './functions.js';
import {createExtent, none as centerNone} from './centerconstraint.js'; import {createExtent, none as centerNone} from './centerconstraint.js';
import BaseObject from './Object.js'; import BaseObject from './Object.js';
@@ -224,13 +224,15 @@ const DEFAULT_MIN_ZOOM = 0;
* The *center constraint* is determined by the `extent` option. By * The *center constraint* is determined by the `extent` option. By
* default the center is not constrained at all. * default the center is not constrained at all.
* *
* @constructor
* @extends {module:ol/Object}
* @param {module:ol/View~ViewOptions=} opt_options View options.
* @api * @api
*/ */
const View = function(opt_options) { class View extends BaseObject {
BaseObject.call(this);
/**
* @param {module:ol/View~ViewOptions=} opt_options View options.
*/
constructor(opt_options) {
super();
const options = assign({}, opt_options); const options = assign({}, opt_options);
@@ -262,16 +264,13 @@ const View = function(opt_options) {
this.projection_ = createProjection(options.projection, 'EPSG:3857'); this.projection_ = createProjection(options.projection, 'EPSG:3857');
this.applyOptions_(options); this.applyOptions_(options);
}; }
inherits(View, BaseObject);
/** /**
* Set up the view with the given options. * Set up the view with the given options.
* @param {module:ol/View~ViewOptions} options View options. * @param {module:ol/View~ViewOptions} options View options.
*/ */
View.prototype.applyOptions_ = function(options) { applyOptions_(options) {
/** /**
* @type {Object.<string, *>} * @type {Object.<string, *>}
@@ -347,7 +346,7 @@ View.prototype.applyOptions_ = function(options) {
*/ */
this.options_ = options; this.options_ = options;
}; }
/** /**
* Get an updated version of the view options used to construct the view. The * Get an updated version of the view options used to construct the view. The
@@ -357,7 +356,7 @@ View.prototype.applyOptions_ = function(options) {
* @param {module:ol/View~ViewOptions} newOptions New options to be applied. * @param {module:ol/View~ViewOptions} newOptions New options to be applied.
* @return {module:ol/View~ViewOptions} New options updated with the current view state. * @return {module:ol/View~ViewOptions} New options updated with the current view state.
*/ */
View.prototype.getUpdatedOptions_ = function(newOptions) { getUpdatedOptions_(newOptions) {
const options = assign({}, this.options_); const options = assign({}, this.options_);
// preserve resolution (or zoom) // preserve resolution (or zoom)
@@ -374,8 +373,7 @@ View.prototype.getUpdatedOptions_ = function(newOptions) {
options.rotation = this.getRotation(); options.rotation = this.getRotation();
return assign({}, options, newOptions); return assign({}, options, newOptions);
}; }
/** /**
* Animate the view. The view's center, zoom (or resolution), and rotation * Animate the view. The view's center, zoom (or resolution), and rotation
@@ -410,7 +408,7 @@ View.prototype.getUpdatedOptions_ = function(newOptions) {
* the animation completed without being cancelled. * the animation completed without being cancelled.
* @api * @api
*/ */
View.prototype.animate = function(var_args) { animate(var_args) {
let animationCount = arguments.length; let animationCount = arguments.length;
let callback; let callback;
if (animationCount > 1 && typeof arguments[animationCount - 1] === 'function') { if (animationCount > 1 && typeof arguments[animationCount - 1] === 'function') {
@@ -490,34 +488,31 @@ View.prototype.animate = function(var_args) {
this.animations_.push(series); this.animations_.push(series);
this.setHint(ViewHint.ANIMATING, 1); this.setHint(ViewHint.ANIMATING, 1);
this.updateAnimations_(); this.updateAnimations_();
}; }
/** /**
* Determine if the view is being animated. * Determine if the view is being animated.
* @return {boolean} The view is being animated. * @return {boolean} The view is being animated.
* @api * @api
*/ */
View.prototype.getAnimating = function() { getAnimating() {
return this.hints_[ViewHint.ANIMATING] > 0; return this.hints_[ViewHint.ANIMATING] > 0;
}; }
/** /**
* Determine if the user is interacting with the view, such as panning or zooming. * Determine if the user is interacting with the view, such as panning or zooming.
* @return {boolean} The view is being interacted with. * @return {boolean} The view is being interacted with.
* @api * @api
*/ */
View.prototype.getInteracting = function() { getInteracting() {
return this.hints_[ViewHint.INTERACTING] > 0; return this.hints_[ViewHint.INTERACTING] > 0;
}; }
/** /**
* Cancel any ongoing animations. * Cancel any ongoing animations.
* @api * @api
*/ */
View.prototype.cancelAnimations = function() { cancelAnimations() {
this.setHint(ViewHint.ANIMATING, -this.hints_[ViewHint.ANIMATING]); this.setHint(ViewHint.ANIMATING, -this.hints_[ViewHint.ANIMATING]);
for (let i = 0, ii = this.animations_.length; i < ii; ++i) { for (let i = 0, ii = this.animations_.length; i < ii; ++i) {
const series = this.animations_[i]; const series = this.animations_[i];
@@ -526,12 +521,12 @@ View.prototype.cancelAnimations = function() {
} }
} }
this.animations_.length = 0; this.animations_.length = 0;
}; }
/** /**
* Update all animations. * Update all animations.
*/ */
View.prototype.updateAnimations_ = function() { updateAnimations_() {
if (this.updateAnimationKey_ !== undefined) { if (this.updateAnimationKey_ !== undefined) {
cancelAnimationFrame(this.updateAnimationKey_); cancelAnimationFrame(this.updateAnimationKey_);
this.updateAnimationKey_ = undefined; this.updateAnimationKey_ = undefined;
@@ -608,14 +603,14 @@ View.prototype.updateAnimations_ = function() {
if (more && this.updateAnimationKey_ === undefined) { if (more && this.updateAnimationKey_ === undefined) {
this.updateAnimationKey_ = requestAnimationFrame(this.updateAnimations_); this.updateAnimationKey_ = requestAnimationFrame(this.updateAnimations_);
} }
}; }
/** /**
* @param {number} rotation Target rotation. * @param {number} rotation Target rotation.
* @param {module:ol/coordinate~Coordinate} anchor Rotation anchor. * @param {module:ol/coordinate~Coordinate} anchor Rotation anchor.
* @return {module:ol/coordinate~Coordinate|undefined} Center for rotation and anchor. * @return {module:ol/coordinate~Coordinate|undefined} Center for rotation and anchor.
*/ */
View.prototype.calculateCenterRotate = function(rotation, anchor) { calculateCenterRotate(rotation, anchor) {
let center; let center;
const currentCenter = this.getCenter(); const currentCenter = this.getCenter();
if (currentCenter !== undefined) { if (currentCenter !== undefined) {
@@ -624,15 +619,14 @@ View.prototype.calculateCenterRotate = function(rotation, anchor) {
addCoordinate(center, anchor); addCoordinate(center, anchor);
} }
return center; return center;
}; }
/** /**
* @param {number} resolution Target resolution. * @param {number} resolution Target resolution.
* @param {module:ol/coordinate~Coordinate} anchor Zoom anchor. * @param {module:ol/coordinate~Coordinate} anchor Zoom anchor.
* @return {module:ol/coordinate~Coordinate|undefined} Center for resolution and anchor. * @return {module:ol/coordinate~Coordinate|undefined} Center for resolution and anchor.
*/ */
View.prototype.calculateCenterZoom = function(resolution, anchor) { calculateCenterZoom(resolution, anchor) {
let center; let center;
const currentCenter = this.getCenter(); const currentCenter = this.getCenter();
const currentResolution = this.getResolution(); const currentResolution = this.getResolution();
@@ -642,14 +636,13 @@ View.prototype.calculateCenterZoom = function(resolution, anchor) {
center = [x, y]; center = [x, y];
} }
return center; return center;
}; }
/** /**
* @private * @private
* @return {module:ol/size~Size} Viewport size or `[100, 100]` when no viewport is found. * @return {module:ol/size~Size} Viewport size or `[100, 100]` when no viewport is found.
*/ */
View.prototype.getSizeFromViewport_ = function() { getSizeFromViewport_() {
const size = [100, 100]; const size = [100, 100];
const selector = '.ol-viewport[data-view="' + getUid(this) + '"]'; const selector = '.ol-viewport[data-view="' + getUid(this) + '"]';
const element = document.querySelector(selector); const element = document.querySelector(selector);
@@ -659,8 +652,7 @@ View.prototype.getSizeFromViewport_ = function() {
size[1] = parseInt(metrics.height, 10); size[1] = parseInt(metrics.height, 10);
} }
return size; return size;
}; }
/** /**
* Get the constrained center of this view. * Get the constrained center of this view.
@@ -668,10 +660,9 @@ View.prototype.getSizeFromViewport_ = function() {
* @return {module:ol/coordinate~Coordinate|undefined} Constrained center. * @return {module:ol/coordinate~Coordinate|undefined} Constrained center.
* @api * @api
*/ */
View.prototype.constrainCenter = function(center) { constrainCenter(center) {
return this.constraints_.center(center); return this.constraints_.center(center);
}; }
/** /**
* Get the constrained resolution of this view. * Get the constrained resolution of this view.
@@ -681,12 +672,11 @@ View.prototype.constrainCenter = function(center) {
* @return {number|undefined} Constrained resolution. * @return {number|undefined} Constrained resolution.
* @api * @api
*/ */
View.prototype.constrainResolution = function(resolution, opt_delta, opt_direction) { constrainResolution(resolution, opt_delta, opt_direction) {
const delta = opt_delta || 0; const delta = opt_delta || 0;
const direction = opt_direction || 0; const direction = opt_direction || 0;
return this.constraints_.resolution(resolution, delta, direction); return this.constraints_.resolution(resolution, delta, direction);
}; }
/** /**
* Get the constrained rotation of this view. * Get the constrained rotation of this view.
@@ -695,11 +685,10 @@ View.prototype.constrainResolution = function(resolution, opt_delta, opt_directi
* @return {number|undefined} Constrained rotation. * @return {number|undefined} Constrained rotation.
* @api * @api
*/ */
View.prototype.constrainRotation = function(rotation, opt_delta) { constrainRotation(rotation, opt_delta) {
const delta = opt_delta || 0; const delta = opt_delta || 0;
return this.constraints_.rotation(rotation, delta); return this.constraints_.rotation(rotation, delta);
}; }
/** /**
* Get the view center. * Get the view center.
@@ -707,26 +696,24 @@ View.prototype.constrainRotation = function(rotation, opt_delta) {
* @observable * @observable
* @api * @api
*/ */
View.prototype.getCenter = function() { getCenter() {
return ( return (
/** @type {module:ol/coordinate~Coordinate|undefined} */ (this.get(ViewProperty.CENTER)) /** @type {module:ol/coordinate~Coordinate|undefined} */ (this.get(ViewProperty.CENTER))
); );
}; }
/** /**
* @return {module:ol/View~Constraints} Constraints. * @return {module:ol/View~Constraints} Constraints.
*/ */
View.prototype.getConstraints = function() { getConstraints() {
return this.constraints_; return this.constraints_;
}; }
/** /**
* @param {Array.<number>=} opt_hints Destination array. * @param {Array.<number>=} opt_hints Destination array.
* @return {Array.<number>} Hint. * @return {Array.<number>} Hint.
*/ */
View.prototype.getHints = function(opt_hints) { getHints(opt_hints) {
if (opt_hints !== undefined) { if (opt_hints !== undefined) {
opt_hints[0] = this.hints_[0]; opt_hints[0] = this.hints_[0];
opt_hints[1] = this.hints_[1]; opt_hints[1] = this.hints_[1];
@@ -734,8 +721,7 @@ View.prototype.getHints = function(opt_hints) {
} else { } else {
return this.hints_.slice(); return this.hints_.slice();
} }
}; }
/** /**
* Calculate the extent for the current view state and the passed size. * Calculate the extent for the current view state and the passed size.
@@ -747,7 +733,7 @@ View.prototype.getHints = function(opt_hints) {
* @return {module:ol/extent~Extent} Extent. * @return {module:ol/extent~Extent} Extent.
* @api * @api
*/ */
View.prototype.calculateExtent = function(opt_size) { calculateExtent(opt_size) {
const size = opt_size || this.getSizeFromViewport_(); const size = opt_size || this.getSizeFromViewport_();
const center = /** @type {!module:ol/coordinate~Coordinate} */ (this.getCenter()); const center = /** @type {!module:ol/coordinate~Coordinate} */ (this.getCenter());
assert(center, 1); // The view center is not defined assert(center, 1); // The view center is not defined
@@ -757,78 +743,70 @@ View.prototype.calculateExtent = function(opt_size) {
assert(rotation !== undefined, 3); // The view rotation is not defined assert(rotation !== undefined, 3); // The view rotation is not defined
return getForViewAndSize(center, resolution, rotation, size); return getForViewAndSize(center, resolution, rotation, size);
}; }
/** /**
* Get the maximum resolution of the view. * Get the maximum resolution of the view.
* @return {number} The maximum resolution of the view. * @return {number} The maximum resolution of the view.
* @api * @api
*/ */
View.prototype.getMaxResolution = function() { getMaxResolution() {
return this.maxResolution_; return this.maxResolution_;
}; }
/** /**
* Get the minimum resolution of the view. * Get the minimum resolution of the view.
* @return {number} The minimum resolution of the view. * @return {number} The minimum resolution of the view.
* @api * @api
*/ */
View.prototype.getMinResolution = function() { getMinResolution() {
return this.minResolution_; return this.minResolution_;
}; }
/** /**
* Get the maximum zoom level for the view. * Get the maximum zoom level for the view.
* @return {number} The maximum zoom level. * @return {number} The maximum zoom level.
* @api * @api
*/ */
View.prototype.getMaxZoom = function() { getMaxZoom() {
return /** @type {number} */ (this.getZoomForResolution(this.minResolution_)); return /** @type {number} */ (this.getZoomForResolution(this.minResolution_));
}; }
/** /**
* Set a new maximum zoom level for the view. * Set a new maximum zoom level for the view.
* @param {number} zoom The maximum zoom level. * @param {number} zoom The maximum zoom level.
* @api * @api
*/ */
View.prototype.setMaxZoom = function(zoom) { setMaxZoom(zoom) {
this.applyOptions_(this.getUpdatedOptions_({maxZoom: zoom})); this.applyOptions_(this.getUpdatedOptions_({maxZoom: zoom}));
}; }
/** /**
* Get the minimum zoom level for the view. * Get the minimum zoom level for the view.
* @return {number} The minimum zoom level. * @return {number} The minimum zoom level.
* @api * @api
*/ */
View.prototype.getMinZoom = function() { getMinZoom() {
return /** @type {number} */ (this.getZoomForResolution(this.maxResolution_)); return /** @type {number} */ (this.getZoomForResolution(this.maxResolution_));
}; }
/** /**
* Set a new minimum zoom level for the view. * Set a new minimum zoom level for the view.
* @param {number} zoom The minimum zoom level. * @param {number} zoom The minimum zoom level.
* @api * @api
*/ */
View.prototype.setMinZoom = function(zoom) { setMinZoom(zoom) {
this.applyOptions_(this.getUpdatedOptions_({minZoom: zoom})); this.applyOptions_(this.getUpdatedOptions_({minZoom: zoom}));
}; }
/** /**
* Get the view projection. * Get the view projection.
* @return {module:ol/proj/Projection} The projection of the view. * @return {module:ol/proj/Projection} The projection of the view.
* @api * @api
*/ */
View.prototype.getProjection = function() { getProjection() {
return this.projection_; return this.projection_;
}; }
/** /**
* Get the view resolution. * Get the view resolution.
@@ -836,10 +814,9 @@ View.prototype.getProjection = function() {
* @observable * @observable
* @api * @api
*/ */
View.prototype.getResolution = function() { getResolution() {
return /** @type {number|undefined} */ (this.get(ViewProperty.RESOLUTION)); return /** @type {number|undefined} */ (this.get(ViewProperty.RESOLUTION));
}; }
/** /**
* Get the resolutions for the view. This returns the array of resolutions * Get the resolutions for the view. This returns the array of resolutions
@@ -847,10 +824,9 @@ View.prototype.getResolution = function() {
* @return {Array.<number>|undefined} The resolutions of the view. * @return {Array.<number>|undefined} The resolutions of the view.
* @api * @api
*/ */
View.prototype.getResolutions = function() { getResolutions() {
return this.resolutions_; return this.resolutions_;
}; }
/** /**
* Get the resolution for a provided extent (in map units) and size (in pixels). * Get the resolution for a provided extent (in map units) and size (in pixels).
@@ -860,13 +836,12 @@ View.prototype.getResolutions = function() {
* the given size. * the given size.
* @api * @api
*/ */
View.prototype.getResolutionForExtent = function(extent, opt_size) { getResolutionForExtent(extent, opt_size) {
const size = opt_size || this.getSizeFromViewport_(); const size = opt_size || this.getSizeFromViewport_();
const xResolution = getWidth(extent) / size[0]; const xResolution = getWidth(extent) / size[0];
const yResolution = getHeight(extent) / size[1]; const yResolution = getHeight(extent) / size[1];
return Math.max(xResolution, yResolution); return Math.max(xResolution, yResolution);
}; }
/** /**
* Return a function that returns a value between 0 and 1 for a * Return a function that returns a value between 0 and 1 for a
@@ -874,7 +849,7 @@ View.prototype.getResolutionForExtent = function(extent, opt_size) {
* @param {number=} opt_power Power. * @param {number=} opt_power Power.
* @return {function(number): number} Resolution for value function. * @return {function(number): number} Resolution for value function.
*/ */
View.prototype.getResolutionForValueFunction = function(opt_power) { getResolutionForValueFunction(opt_power) {
const power = opt_power || 2; const power = opt_power || 2;
const maxResolution = this.maxResolution_; const maxResolution = this.maxResolution_;
const minResolution = this.minResolution_; const minResolution = this.minResolution_;
@@ -888,8 +863,7 @@ View.prototype.getResolutionForValueFunction = function(opt_power) {
const resolution = maxResolution / Math.pow(power, value * max); const resolution = maxResolution / Math.pow(power, value * max);
return resolution; return resolution;
}); });
}; }
/** /**
* Get the view rotation. * Get the view rotation.
@@ -897,10 +871,9 @@ View.prototype.getResolutionForValueFunction = function(opt_power) {
* @observable * @observable
* @api * @api
*/ */
View.prototype.getRotation = function() { getRotation() {
return /** @type {number} */ (this.get(ViewProperty.ROTATION)); return /** @type {number} */ (this.get(ViewProperty.ROTATION));
}; }
/** /**
* Return a function that returns a resolution for a value between * Return a function that returns a resolution for a value between
@@ -908,7 +881,7 @@ View.prototype.getRotation = function() {
* @param {number=} opt_power Power. * @param {number=} opt_power Power.
* @return {function(number): number} Value for resolution function. * @return {function(number): number} Value for resolution function.
*/ */
View.prototype.getValueForResolutionFunction = function(opt_power) { getValueForResolutionFunction(opt_power) {
const power = opt_power || 2; const power = opt_power || 2;
const maxResolution = this.maxResolution_; const maxResolution = this.maxResolution_;
const minResolution = this.minResolution_; const minResolution = this.minResolution_;
@@ -922,13 +895,12 @@ View.prototype.getValueForResolutionFunction = function(opt_power) {
const value = (Math.log(maxResolution / resolution) / Math.log(power)) / max; const value = (Math.log(maxResolution / resolution) / Math.log(power)) / max;
return value; return value;
}); });
}; }
/** /**
* @return {module:ol/View~State} View state. * @return {module:ol/View~State} View state.
*/ */
View.prototype.getState = function() { getState() {
const center = /** @type {module:ol/coordinate~Coordinate} */ (this.getCenter()); const center = /** @type {module:ol/coordinate~Coordinate} */ (this.getCenter());
const projection = this.getProjection(); const projection = this.getProjection();
const resolution = /** @type {number} */ (this.getResolution()); const resolution = /** @type {number} */ (this.getResolution());
@@ -942,8 +914,7 @@ View.prototype.getState = function() {
zoom: this.getZoom() zoom: this.getZoom()
}) })
); );
}; }
/** /**
* Get the current zoom level. If you configured your view with a resolutions * Get the current zoom level. If you configured your view with a resolutions
@@ -952,15 +923,14 @@ View.prototype.getState = function() {
* @return {number|undefined} Zoom. * @return {number|undefined} Zoom.
* @api * @api
*/ */
View.prototype.getZoom = function() { getZoom() {
let zoom; let zoom;
const resolution = this.getResolution(); const resolution = this.getResolution();
if (resolution !== undefined) { if (resolution !== undefined) {
zoom = this.getZoomForResolution(resolution); zoom = this.getZoomForResolution(resolution);
} }
return zoom; return zoom;
}; }
/** /**
* Get the zoom level for a resolution. * Get the zoom level for a resolution.
@@ -968,7 +938,7 @@ View.prototype.getZoom = function() {
* @return {number|undefined} The zoom level for the provided resolution. * @return {number|undefined} The zoom level for the provided resolution.
* @api * @api
*/ */
View.prototype.getZoomForResolution = function(resolution) { getZoomForResolution(resolution) {
let offset = this.minZoom_ || 0; let offset = this.minZoom_ || 0;
let max, zoomFactor; let max, zoomFactor;
if (this.resolutions_) { if (this.resolutions_) {
@@ -985,8 +955,7 @@ View.prototype.getZoomForResolution = function(resolution) {
zoomFactor = this.zoomFactor_; zoomFactor = this.zoomFactor_;
} }
return offset + Math.log(max / resolution) / Math.log(zoomFactor); return offset + Math.log(max / resolution) / Math.log(zoomFactor);
}; }
/** /**
* Get the resolution for a zoom level. * Get the resolution for a zoom level.
@@ -994,11 +963,10 @@ View.prototype.getZoomForResolution = function(resolution) {
* @return {number} The view resolution for the provided zoom level. * @return {number} The view resolution for the provided zoom level.
* @api * @api
*/ */
View.prototype.getResolutionForZoom = function(zoom) { getResolutionForZoom(zoom) {
return /** @type {number} */ (this.constrainResolution( return /** @type {number} */ (this.constrainResolution(
this.maxResolution_, zoom - this.minZoom_, 0)); this.maxResolution_, zoom - this.minZoom_, 0));
}; }
/** /**
* Fit the given geometry or extent based on the given map size and border. * Fit the given geometry or extent based on the given map size and border.
@@ -1010,7 +978,7 @@ View.prototype.getResolutionForZoom = function(zoom) {
* @param {module:ol/View~FitOptions=} opt_options Options. * @param {module:ol/View~FitOptions=} opt_options Options.
* @api * @api
*/ */
View.prototype.fit = function(geometryOrExtent, opt_options) { fit(geometryOrExtent, opt_options) {
const options = opt_options || {}; const options = opt_options || {};
let size = options.size; let size = options.size;
if (!size) { if (!size) {
@@ -1103,8 +1071,7 @@ View.prototype.fit = function(geometryOrExtent, opt_options) {
this.setCenter(center); this.setCenter(center);
setTimeout(callback.bind(undefined, true), 0); setTimeout(callback.bind(undefined, true), 0);
} }
}; }
/** /**
* Center on coordinate and view position. * Center on coordinate and view position.
@@ -1113,7 +1080,7 @@ View.prototype.fit = function(geometryOrExtent, opt_options) {
* @param {module:ol~Pixel} position Position on the view to center on. * @param {module:ol~Pixel} position Position on the view to center on.
* @api * @api
*/ */
View.prototype.centerOn = function(coordinate, size, position) { centerOn(coordinate, size, position) {
// calculate rotated position // calculate rotated position
const rotation = this.getRotation(); const rotation = this.getRotation();
const cosAngle = Math.cos(-rotation); const cosAngle = Math.cos(-rotation);
@@ -1130,16 +1097,14 @@ View.prototype.centerOn = function(coordinate, size, position) {
const centerY = rotY * cosAngle + rotX * sinAngle; const centerY = rotY * cosAngle + rotX * sinAngle;
this.setCenter([centerX, centerY]); this.setCenter([centerX, centerY]);
}; }
/** /**
* @return {boolean} Is defined. * @return {boolean} Is defined.
*/ */
View.prototype.isDef = function() { isDef() {
return !!this.getCenter() && this.getResolution() !== undefined; return !!this.getCenter() && this.getResolution() !== undefined;
}; }
/** /**
* Rotate the view around a given coordinate. * Rotate the view around a given coordinate.
@@ -1147,14 +1112,13 @@ View.prototype.isDef = function() {
* @param {module:ol/coordinate~Coordinate=} opt_anchor The rotation center. * @param {module:ol/coordinate~Coordinate=} opt_anchor The rotation center.
* @api * @api
*/ */
View.prototype.rotate = function(rotation, opt_anchor) { rotate(rotation, opt_anchor) {
if (opt_anchor !== undefined) { if (opt_anchor !== undefined) {
const center = this.calculateCenterRotate(rotation, opt_anchor); const center = this.calculateCenterRotate(rotation, opt_anchor);
this.setCenter(center); this.setCenter(center);
} }
this.setRotation(rotation); this.setRotation(rotation);
}; }
/** /**
* Set the center of the current view. * Set the center of the current view.
@@ -1162,25 +1126,23 @@ View.prototype.rotate = function(rotation, opt_anchor) {
* @observable * @observable
* @api * @api
*/ */
View.prototype.setCenter = function(center) { setCenter(center) {
this.set(ViewProperty.CENTER, center); this.set(ViewProperty.CENTER, center);
if (this.getAnimating()) { if (this.getAnimating()) {
this.cancelAnimations(); this.cancelAnimations();
} }
}; }
/** /**
* @param {module:ol/ViewHint} hint Hint. * @param {module:ol/ViewHint} hint Hint.
* @param {number} delta Delta. * @param {number} delta Delta.
* @return {number} New value. * @return {number} New value.
*/ */
View.prototype.setHint = function(hint, delta) { setHint(hint, delta) {
this.hints_[hint] += delta; this.hints_[hint] += delta;
this.changed(); this.changed();
return this.hints_[hint]; return this.hints_[hint];
}; }
/** /**
* Set the resolution for this view. * Set the resolution for this view.
@@ -1188,13 +1150,12 @@ View.prototype.setHint = function(hint, delta) {
* @observable * @observable
* @api * @api
*/ */
View.prototype.setResolution = function(resolution) { setResolution(resolution) {
this.set(ViewProperty.RESOLUTION, resolution); this.set(ViewProperty.RESOLUTION, resolution);
if (this.getAnimating()) { if (this.getAnimating()) {
this.cancelAnimations(); this.cancelAnimations();
} }
}; }
/** /**
* Set the rotation for this view. * Set the rotation for this view.
@@ -1202,22 +1163,22 @@ View.prototype.setResolution = function(resolution) {
* @observable * @observable
* @api * @api
*/ */
View.prototype.setRotation = function(rotation) { setRotation(rotation) {
this.set(ViewProperty.ROTATION, rotation); this.set(ViewProperty.ROTATION, rotation);
if (this.getAnimating()) { if (this.getAnimating()) {
this.cancelAnimations(); this.cancelAnimations();
} }
}; }
/** /**
* Zoom to a specific zoom level. * Zoom to a specific zoom level.
* @param {number} zoom Zoom level. * @param {number} zoom Zoom level.
* @api * @api
*/ */
View.prototype.setZoom = function(zoom) { setZoom(zoom) {
this.setResolution(this.getResolutionForZoom(zoom)); this.setResolution(this.getResolutionForZoom(zoom));
}; }
}
/** /**
+12 -12
View File
@@ -1,7 +1,6 @@
/** /**
* @module ol/WebGLMap * @module ol/WebGLMap
*/ */
import {inherits} from './util.js';
import PluggableMap from './PluggableMap.js'; import PluggableMap from './PluggableMap.js';
import {defaults as defaultControls} from './control.js'; import {defaults as defaultControls} from './control.js';
import {defaults as defaultInteractions} from './interaction.js'; import {defaults as defaultInteractions} from './interaction.js';
@@ -57,16 +56,18 @@ import WebGLVectorLayerRenderer from './renderer/webgl/VectorLayer.js';
* {@link module:ol/layer/Base}, so layers entered in the options or added * {@link module:ol/layer/Base}, so layers entered in the options or added
* with `addLayer` can be groups, which can contain further groups, and so on. * with `addLayer` can be groups, which can contain further groups, and so on.
* *
* @constructor
* @extends {module:ol/PluggableMap}
* @param {module:ol/PluggableMap~MapOptions} options Map options.
* @fires module:ol/MapBrowserEvent~MapBrowserEvent * @fires module:ol/MapBrowserEvent~MapBrowserEvent
* @fires module:ol/MapEvent~MapEvent * @fires module:ol/MapEvent~MapEvent
* @fires module:ol/render/Event~RenderEvent#postcompose * @fires module:ol/render/Event~RenderEvent#postcompose
* @fires module:ol/render/Event~RenderEvent#precompose * @fires module:ol/render/Event~RenderEvent#precompose
* @api * @api
*/ */
const WebGLMap = function(options) { class WebGLMap extends PluggableMap {
/**
* @param {module:ol/PluggableMap~MapOptions} options Map options.
*/
constructor(options) {
options = assign({}, options); options = assign({}, options);
if (!options.controls) { if (!options.controls) {
options.controls = defaultControls(); options.controls = defaultControls();
@@ -75,13 +76,10 @@ const WebGLMap = function(options) {
options.interactions = defaultInteractions(); options.interactions = defaultInteractions();
} }
PluggableMap.call(this, options); super(options);
}; }
inherits(WebGLMap, PluggableMap); createRenderer() {
WebGLMap.prototype.createRenderer = function() {
const renderer = new WebGLMapRenderer(this); const renderer = new WebGLMapRenderer(this);
renderer.registerLayerRenderers([ renderer.registerLayerRenderers([
WebGLImageLayerRenderer, WebGLImageLayerRenderer,
@@ -89,6 +87,8 @@ WebGLMap.prototype.createRenderer = function() {
WebGLVectorLayerRenderer WebGLVectorLayerRenderer
]); ]);
return renderer; return renderer;
}; }
}
export default WebGLMap; export default WebGLMap;
+43 -49
View File
@@ -1,7 +1,6 @@
/** /**
* @module ol/control/Attribution * @module ol/control/Attribution
*/ */
import {inherits} from '../util.js';
import {equals} from '../array.js'; import {equals} from '../array.js';
import Control from '../control/Control.js'; import Control from '../control/Control.js';
import {CLASS_CONTROL, CLASS_UNSELECTABLE, CLASS_COLLAPSED} from '../css.js'; import {CLASS_CONTROL, CLASS_UNSELECTABLE, CLASS_COLLAPSED} from '../css.js';
@@ -42,15 +41,23 @@ import {visibleAtResolution} from '../layer/Layer.js';
* By default it will show in the bottom right portion of the map, but this can * By default it will show in the bottom right portion of the map, but this can
* be changed by using a css selector for `.ol-attribution`. * be changed by using a css selector for `.ol-attribution`.
* *
* @constructor
* @extends {module:ol/control/Control}
* @param {module:ol/control/Attribution~Options=} opt_options Attribution options.
* @api * @api
*/ */
const Attribution = function(opt_options) { class Attribution extends Control {
/**
* @param {module:ol/control/Attribution~Options=} opt_options Attribution options.
*/
constructor(opt_options) {
const options = opt_options ? opt_options : {}; const options = opt_options ? opt_options : {};
super({
element: document.createElement('div'),
render: options.render || render,
target: options.target
});
/** /**
* @private * @private
* @type {Element} * @type {Element}
@@ -117,17 +124,11 @@ const Attribution = function(opt_options) {
const cssClasses = className + ' ' + CLASS_UNSELECTABLE + ' ' + CLASS_CONTROL + const cssClasses = className + ' ' + CLASS_UNSELECTABLE + ' ' + CLASS_CONTROL +
(this.collapsed_ && this.collapsible_ ? ' ' + CLASS_COLLAPSED : '') + (this.collapsed_ && this.collapsible_ ? ' ' + CLASS_COLLAPSED : '') +
(this.collapsible_ ? '' : ' ol-uncollapsible'); (this.collapsible_ ? '' : ' ol-uncollapsible');
const element = document.createElement('div'); const element = this.element;
element.className = cssClasses; element.className = cssClasses;
element.appendChild(this.ulElement_); element.appendChild(this.ulElement_);
element.appendChild(button); element.appendChild(button);
Control.call(this, {
element: element,
render: options.render || render,
target: options.target
});
/** /**
* A list of currently rendered resolutions. * A list of currently rendered resolutions.
* @type {Array.<string>} * @type {Array.<string>}
@@ -141,10 +142,7 @@ const Attribution = function(opt_options) {
*/ */
this.renderedVisible_ = true; this.renderedVisible_ = true;
}; }
inherits(Attribution, Control);
/** /**
* Get a list of visible attributions. * Get a list of visible attributions.
@@ -152,7 +150,7 @@ inherits(Attribution, Control);
* @return {Array.<string>} Attributions. * @return {Array.<string>} Attributions.
* @private * @private
*/ */
Attribution.prototype.getSourceAttributions_ = function(frameState) { getSourceAttributions_(frameState) {
/** /**
* Used to determine if an attribution already exists. * Used to determine if an attribution already exists.
* @type {!Object.<string, boolean>} * @type {!Object.<string, boolean>}
@@ -203,25 +201,13 @@ Attribution.prototype.getSourceAttributions_ = function(frameState) {
} }
} }
return visibleAttributions; return visibleAttributions;
};
/**
* Update the attribution element.
* @param {module:ol/MapEvent} mapEvent Map event.
* @this {module:ol/control/Attribution}
* @api
*/
export function render(mapEvent) {
this.updateElement_(mapEvent.frameState);
} }
/** /**
* @private * @private
* @param {?module:ol/PluggableMap~FrameState} frameState Frame state. * @param {?module:ol/PluggableMap~FrameState} frameState Frame state.
*/ */
Attribution.prototype.updateElement_ = function(frameState) { updateElement_(frameState) {
if (!frameState) { if (!frameState) {
if (this.renderedVisible_) { if (this.renderedVisible_) {
this.element.style.display = 'none'; this.element.style.display = 'none';
@@ -252,23 +238,21 @@ Attribution.prototype.updateElement_ = function(frameState) {
} }
this.renderedAttributions_ = attributions; this.renderedAttributions_ = attributions;
}; }
/** /**
* @param {MouseEvent} event The event to handle * @param {MouseEvent} event The event to handle
* @private * @private
*/ */
Attribution.prototype.handleClick_ = function(event) { handleClick_(event) {
event.preventDefault(); event.preventDefault();
this.handleToggle_(); this.handleToggle_();
}; }
/** /**
* @private * @private
*/ */
Attribution.prototype.handleToggle_ = function() { handleToggle_() {
this.element.classList.toggle(CLASS_COLLAPSED); this.element.classList.toggle(CLASS_COLLAPSED);
if (this.collapsed_) { if (this.collapsed_) {
replaceNode(this.collapseLabel_, this.label_); replaceNode(this.collapseLabel_, this.label_);
@@ -276,25 +260,23 @@ Attribution.prototype.handleToggle_ = function() {
replaceNode(this.label_, this.collapseLabel_); replaceNode(this.label_, this.collapseLabel_);
} }
this.collapsed_ = !this.collapsed_; this.collapsed_ = !this.collapsed_;
}; }
/** /**
* Return `true` if the attribution is collapsible, `false` otherwise. * Return `true` if the attribution is collapsible, `false` otherwise.
* @return {boolean} True if the widget is collapsible. * @return {boolean} True if the widget is collapsible.
* @api * @api
*/ */
Attribution.prototype.getCollapsible = function() { getCollapsible() {
return this.collapsible_; return this.collapsible_;
}; }
/** /**
* Set whether the attribution should be collapsible. * Set whether the attribution should be collapsible.
* @param {boolean} collapsible True if the widget is collapsible. * @param {boolean} collapsible True if the widget is collapsible.
* @api * @api
*/ */
Attribution.prototype.setCollapsible = function(collapsible) { setCollapsible(collapsible) {
if (this.collapsible_ === collapsible) { if (this.collapsible_ === collapsible) {
return; return;
} }
@@ -303,8 +285,7 @@ Attribution.prototype.setCollapsible = function(collapsible) {
if (!collapsible && this.collapsed_) { if (!collapsible && this.collapsed_) {
this.handleToggle_(); this.handleToggle_();
} }
}; }
/** /**
* Collapse or expand the attribution according to the passed parameter. Will * Collapse or expand the attribution according to the passed parameter. Will
@@ -313,13 +294,12 @@ Attribution.prototype.setCollapsible = function(collapsible) {
* @param {boolean} collapsed True if the widget is collapsed. * @param {boolean} collapsed True if the widget is collapsed.
* @api * @api
*/ */
Attribution.prototype.setCollapsed = function(collapsed) { setCollapsed(collapsed) {
if (!this.collapsible_ || this.collapsed_ === collapsed) { if (!this.collapsible_ || this.collapsed_ === collapsed) {
return; return;
} }
this.handleToggle_(); this.handleToggle_();
}; }
/** /**
* Return `true` when the attribution is currently collapsed or `false` * Return `true` when the attribution is currently collapsed or `false`
@@ -327,7 +307,21 @@ Attribution.prototype.setCollapsed = function(collapsed) {
* @return {boolean} True if the widget is collapsed. * @return {boolean} True if the widget is collapsed.
* @api * @api
*/ */
Attribution.prototype.getCollapsed = function() { getCollapsed() {
return this.collapsed_; return this.collapsed_;
}; }
}
/**
* Update the attribution element.
* @param {module:ol/MapEvent} mapEvent Map event.
* @this {module:ol/control/Attribution}
* @api
*/
export function render(mapEvent) {
this.updateElement_(mapEvent.frameState);
}
export default Attribution; export default Attribution;
+20 -22
View File
@@ -1,7 +1,6 @@
/** /**
* @module ol/control/Control * @module ol/control/Control
*/ */
import {inherits} from '../util.js';
import {UNDEFINED} from '../functions.js'; import {UNDEFINED} from '../functions.js';
import MapEventType from '../MapEventType.js'; import MapEventType from '../MapEventType.js';
import BaseObject from '../Object.js'; import BaseObject from '../Object.js';
@@ -44,14 +43,16 @@ import {listen, unlistenByKey} from '../events.js';
* You can also extend this base for your own control class. See * You can also extend this base for your own control class. See
* examples/custom-controls for an example of how to do this. * examples/custom-controls for an example of how to do this.
* *
* @constructor
* @extends {module:ol/Object}
* @param {module:ol/control/Control~Options} options Control options.
* @api * @api
*/ */
const Control = function(options) { class Control extends BaseObject {
BaseObject.call(this); /**
* @param {module:ol/control/Control~Options} options Control options.
*/
constructor(options) {
super();
/** /**
* @protected * @protected
@@ -86,29 +87,24 @@ const Control = function(options) {
this.setTarget(options.target); this.setTarget(options.target);
} }
}; }
inherits(Control, BaseObject);
/** /**
* @inheritDoc * @inheritDoc
*/ */
Control.prototype.disposeInternal = function() { disposeInternal() {
removeNode(this.element); removeNode(this.element);
BaseObject.prototype.disposeInternal.call(this); super.disposeInternal();
}; }
/** /**
* Get the map associated with this control. * Get the map associated with this control.
* @return {module:ol/PluggableMap} Map. * @return {module:ol/PluggableMap} Map.
* @api * @api
*/ */
Control.prototype.getMap = function() { getMap() {
return this.map_; return this.map_;
}; }
/** /**
* Remove the control from its current map and attach it to the new map. * Remove the control from its current map and attach it to the new map.
@@ -117,7 +113,7 @@ Control.prototype.getMap = function() {
* @param {module:ol/PluggableMap} map Map. * @param {module:ol/PluggableMap} map Map.
* @api * @api
*/ */
Control.prototype.setMap = function(map) { setMap(map) {
if (this.map_) { if (this.map_) {
removeNode(this.element); removeNode(this.element);
} }
@@ -136,8 +132,7 @@ Control.prototype.setMap = function(map) {
} }
map.render(); map.render();
} }
}; }
/** /**
* This function is used to set a target element for the control. It has no * This function is used to set a target element for the control. It has no
@@ -148,9 +143,12 @@ Control.prototype.setMap = function(map) {
* @param {Element|string} target Target. * @param {Element|string} target Target.
* @api * @api
*/ */
Control.prototype.setTarget = function(target) { setTarget(target) {
this.target_ = typeof target === 'string' ? this.target_ = typeof target === 'string' ?
document.getElementById(target) : document.getElementById(target) :
target; target;
}; }
}
export default Control; export default Control;
+24 -28
View File
@@ -1,7 +1,6 @@
/** /**
* @module ol/control/FullScreen * @module ol/control/FullScreen
*/ */
import {inherits} from '../util.js';
import Control from '../control/Control.js'; import Control from '../control/Control.js';
import {CLASS_CONTROL, CLASS_UNSELECTABLE, CLASS_UNSUPPORTED} from '../css.js'; import {CLASS_CONTROL, CLASS_UNSELECTABLE, CLASS_UNSUPPORTED} from '../css.js';
import {replaceNode} from '../dom.js'; import {replaceNode} from '../dom.js';
@@ -61,16 +60,22 @@ const getChangeType = (function() {
* The [Fullscreen API](http://www.w3.org/TR/fullscreen/) is used to * The [Fullscreen API](http://www.w3.org/TR/fullscreen/) is used to
* toggle the map in full screen mode. * toggle the map in full screen mode.
* *
*
* @constructor
* @extends {module:ol/control/Control}
* @param {module:ol/control/FullScreen~Options=} opt_options Options.
* @api * @api
*/ */
const FullScreen = function(opt_options) { class FullScreen extends Control {
/**
* @param {module:ol/control/FullScreen~Options=} opt_options Options.
*/
constructor(opt_options) {
const options = opt_options ? opt_options : {}; const options = opt_options ? opt_options : {};
super({
element: document.createElement('div'),
target: options.target
});
/** /**
* @private * @private
* @type {string} * @type {string}
@@ -109,15 +114,10 @@ const FullScreen = function(opt_options) {
const cssClasses = this.cssClassName_ + ' ' + CLASS_UNSELECTABLE + const cssClasses = this.cssClassName_ + ' ' + CLASS_UNSELECTABLE +
' ' + CLASS_CONTROL + ' ' + ' ' + CLASS_CONTROL + ' ' +
(!isFullScreenSupported() ? CLASS_UNSUPPORTED : ''); (!isFullScreenSupported() ? CLASS_UNSUPPORTED : '');
const element = document.createElement('div'); const element = this.element;
element.className = cssClasses; element.className = cssClasses;
element.appendChild(button); element.appendChild(button);
Control.call(this, {
element: element,
target: options.target
});
/** /**
* @private * @private
* @type {boolean} * @type {boolean}
@@ -130,25 +130,21 @@ const FullScreen = function(opt_options) {
*/ */
this.source_ = options.source; this.source_ = options.source;
}; }
inherits(FullScreen, Control);
/** /**
* @param {MouseEvent} event The event to handle * @param {MouseEvent} event The event to handle
* @private * @private
*/ */
FullScreen.prototype.handleClick_ = function(event) { handleClick_(event) {
event.preventDefault(); event.preventDefault();
this.handleFullScreen_(); this.handleFullScreen_();
}; }
/** /**
* @private * @private
*/ */
FullScreen.prototype.handleFullScreen_ = function() { handleFullScreen_() {
if (!isFullScreenSupported()) { if (!isFullScreenSupported()) {
return; return;
} }
@@ -174,13 +170,12 @@ FullScreen.prototype.handleFullScreen_ = function() {
requestFullScreen(element); requestFullScreen(element);
} }
} }
}; }
/** /**
* @private * @private
*/ */
FullScreen.prototype.handleFullScreenChange_ = function() { handleFullScreenChange_() {
const button = this.element.firstElementChild; const button = this.element.firstElementChild;
const map = this.getMap(); const map = this.getMap();
if (isFullScreen()) { if (isFullScreen()) {
@@ -193,22 +188,23 @@ FullScreen.prototype.handleFullScreenChange_ = function() {
if (map) { if (map) {
map.updateSize(); map.updateSize();
} }
}; }
/** /**
* @inheritDoc * @inheritDoc
* @api * @api
*/ */
FullScreen.prototype.setMap = function(map) { setMap(map) {
Control.prototype.setMap.call(this, map); super.setMap(map);
if (map) { if (map) {
this.listenerKeys.push(listen(document, this.listenerKeys.push(listen(document,
getChangeType(), getChangeType(),
this.handleFullScreenChange_, this) this.handleFullScreenChange_, this)
); );
} }
}; }
}
/** /**
* @return {boolean} Fullscreen is supported by the current platform. * @return {boolean} Fullscreen is supported by the current platform.
+47 -58
View File
@@ -1,8 +1,6 @@
/** /**
* @module ol/control/MousePosition * @module ol/control/MousePosition
*/ */
import {inherits} from '../util.js';
import {listen} from '../events.js'; import {listen} from '../events.js';
import EventType from '../events/EventType.js'; import EventType from '../events/EventType.js';
import {getChangeEventType} from '../Object.js'; import {getChangeEventType} from '../Object.js';
@@ -46,20 +44,21 @@ const COORDINATE_FORMAT = 'coordinateFormat';
* By default the control is shown in the top right corner of the map, but this * By default the control is shown in the top right corner of the map, but this
* can be changed by using the css selector `.ol-mouse-position`. * can be changed by using the css selector `.ol-mouse-position`.
* *
* @constructor
* @extends {module:ol/control/Control}
* @param {module:ol/control/MousePosition~Options=} opt_options Mouse position
* options.
* @api * @api
*/ */
const MousePosition = function(opt_options) { class MousePosition extends Control {
/**
* @param {module:ol/control/MousePosition~Options=} opt_options Mouse position options.
*/
constructor(opt_options) {
const options = opt_options ? opt_options : {}; const options = opt_options ? opt_options : {};
const element = document.createElement('DIV'); const element = document.createElement('DIV');
element.className = options.className !== undefined ? options.className : 'ol-mouse-position'; element.className = options.className !== undefined ? options.className : 'ol-mouse-position';
Control.call(this, { super({
element: element, element: element,
render: options.render || render, render: options.render || render,
target: options.target target: options.target
@@ -112,38 +111,14 @@ const MousePosition = function(opt_options) {
*/ */
this.lastMouseMovePixel_ = null; this.lastMouseMovePixel_ = null;
};
inherits(MousePosition, Control);
/**
* Update the mouseposition element.
* @param {module:ol/MapEvent} mapEvent Map event.
* @this {module:ol/control/MousePosition}
* @api
*/
export function render(mapEvent) {
const frameState = mapEvent.frameState;
if (!frameState) {
this.mapProjection_ = null;
} else {
if (this.mapProjection_ != frameState.viewState.projection) {
this.mapProjection_ = frameState.viewState.projection;
this.transform_ = null;
} }
}
this.updateHTML_(this.lastMouseMovePixel_);
}
/** /**
* @private * @private
*/ */
MousePosition.prototype.handleProjectionChanged_ = function() { handleProjectionChanged_() {
this.transform_ = null; this.transform_ = null;
}; }
/** /**
* Return the coordinate format type used to render the current position or * Return the coordinate format type used to render the current position or
@@ -153,12 +128,11 @@ MousePosition.prototype.handleProjectionChanged_ = function() {
* @observable * @observable
* @api * @api
*/ */
MousePosition.prototype.getCoordinateFormat = function() { getCoordinateFormat() {
return ( return (
/** @type {module:ol/coordinate~CoordinateFormat|undefined} */ (this.get(COORDINATE_FORMAT)) /** @type {module:ol/coordinate~CoordinateFormat|undefined} */ (this.get(COORDINATE_FORMAT))
); );
}; }
/** /**
* Return the projection that is used to report the mouse position. * Return the projection that is used to report the mouse position.
@@ -167,40 +141,37 @@ MousePosition.prototype.getCoordinateFormat = function() {
* @observable * @observable
* @api * @api
*/ */
MousePosition.prototype.getProjection = function() { getProjection() {
return ( return (
/** @type {module:ol/proj/Projection|undefined} */ (this.get(PROJECTION)) /** @type {module:ol/proj/Projection|undefined} */ (this.get(PROJECTION))
); );
}; }
/** /**
* @param {Event} event Browser event. * @param {Event} event Browser event.
* @protected * @protected
*/ */
MousePosition.prototype.handleMouseMove = function(event) { handleMouseMove(event) {
const map = this.getMap(); const map = this.getMap();
this.lastMouseMovePixel_ = map.getEventPixel(event); this.lastMouseMovePixel_ = map.getEventPixel(event);
this.updateHTML_(this.lastMouseMovePixel_); this.updateHTML_(this.lastMouseMovePixel_);
}; }
/** /**
* @param {Event} event Browser event. * @param {Event} event Browser event.
* @protected * @protected
*/ */
MousePosition.prototype.handleMouseOut = function(event) { handleMouseOut(event) {
this.updateHTML_(null); this.updateHTML_(null);
this.lastMouseMovePixel_ = null; this.lastMouseMovePixel_ = null;
}; }
/** /**
* @inheritDoc * @inheritDoc
* @api * @api
*/ */
MousePosition.prototype.setMap = function(map) { setMap(map) {
Control.prototype.setMap.call(this, map); super.setMap(map);
if (map) { if (map) {
const viewport = map.getViewport(); const viewport = map.getViewport();
this.listenerKeys.push( this.listenerKeys.push(
@@ -212,8 +183,7 @@ MousePosition.prototype.setMap = function(map) {
); );
} }
} }
}; }
/** /**
* Set the coordinate format type used to render the current position. * Set the coordinate format type used to render the current position.
@@ -222,10 +192,9 @@ MousePosition.prototype.setMap = function(map) {
* @observable * @observable
* @api * @api
*/ */
MousePosition.prototype.setCoordinateFormat = function(format) { setCoordinateFormat(format) {
this.set(COORDINATE_FORMAT, format); this.set(COORDINATE_FORMAT, format);
}; }
/** /**
* Set the projection that is used to report the mouse position. * Set the projection that is used to report the mouse position.
@@ -234,16 +203,15 @@ MousePosition.prototype.setCoordinateFormat = function(format) {
* @observable * @observable
* @api * @api
*/ */
MousePosition.prototype.setProjection = function(projection) { setProjection(projection) {
this.set(PROJECTION, getProjection(projection)); this.set(PROJECTION, getProjection(projection));
}; }
/** /**
* @param {?module:ol~Pixel} pixel Pixel. * @param {?module:ol~Pixel} pixel Pixel.
* @private * @private
*/ */
MousePosition.prototype.updateHTML_ = function(pixel) { updateHTML_(pixel) {
let html = this.undefinedHTML_; let html = this.undefinedHTML_;
if (pixel && this.mapProjection_) { if (pixel && this.mapProjection_) {
if (!this.transform_) { if (!this.transform_) {
@@ -271,7 +239,28 @@ MousePosition.prototype.updateHTML_ = function(pixel) {
this.element.innerHTML = html; this.element.innerHTML = html;
this.renderedHTML_ = html; this.renderedHTML_ = html;
} }
}; }
}
/**
* Update the mouseposition element.
* @param {module:ol/MapEvent} mapEvent Map event.
* @this {module:ol/control/MousePosition}
* @api
*/
export function render(mapEvent) {
const frameState = mapEvent.frameState;
if (!frameState) {
this.mapProjection_ = null;
} else {
if (this.mapProjection_ != frameState.viewState.projection) {
this.mapProjection_ = frameState.viewState.projection;
this.transform_ = null;
}
}
this.updateHTML_(this.lastMouseMovePixel_);
}
export default MousePosition; export default MousePosition;
+64 -79
View File
@@ -1,7 +1,6 @@
/** /**
* @module ol/control/OverviewMap * @module ol/control/OverviewMap
*/ */
import {inherits} from '../util.js';
import Collection from '../Collection.js'; import Collection from '../Collection.js';
import Map from '../Map.js'; import Map from '../Map.js';
import MapEventType from '../MapEventType.js'; import MapEventType from '../MapEventType.js';
@@ -61,15 +60,24 @@ const MIN_RATIO = 0.1;
/** /**
* Create a new control with a map acting as an overview map for an other * Create a new control with a map acting as an overview map for an other
* defined map. * defined map.
* @constructor *
* @extends {module:ol/control/Control}
* @param {module:ol/control/OverviewMap~Options=} opt_options OverviewMap options.
* @api * @api
*/ */
const OverviewMap = function(opt_options) { class OverviewMap extends Control {
/**
* @param {module:ol/control/OverviewMap~Options=} opt_options OverviewMap options.
*/
constructor(opt_options) {
const options = opt_options ? opt_options : {}; const options = opt_options ? opt_options : {};
super({
element: document.createElement('div'),
render: options.render || render,
target: options.target
});
/** /**
* @type {boolean} * @type {boolean}
* @private * @private
@@ -174,17 +182,11 @@ const OverviewMap = function(opt_options) {
const cssClasses = className + ' ' + CLASS_UNSELECTABLE + ' ' + CLASS_CONTROL + const cssClasses = className + ' ' + CLASS_UNSELECTABLE + ' ' + CLASS_CONTROL +
(this.collapsed_ && this.collapsible_ ? ' ' + CLASS_COLLAPSED : '') + (this.collapsed_ && this.collapsible_ ? ' ' + CLASS_COLLAPSED : '') +
(this.collapsible_ ? '' : ' ol-uncollapsible'); (this.collapsible_ ? '' : ' ol-uncollapsible');
const element = document.createElement('div'); const element = this.element;
element.className = cssClasses; element.className = cssClasses;
element.appendChild(this.ovmapDiv_); element.appendChild(this.ovmapDiv_);
element.appendChild(button); element.appendChild(button);
Control.call(this, {
element: element,
render: options.render || render,
target: options.target
});
/* Interactive map */ /* Interactive map */
const scope = this; const scope = this;
@@ -222,16 +224,13 @@ const OverviewMap = function(opt_options) {
window.addEventListener('mousemove', move); window.addEventListener('mousemove', move);
window.addEventListener('mouseup', endMoving); window.addEventListener('mouseup', endMoving);
}); });
}; }
inherits(OverviewMap, Control);
/** /**
* @inheritDoc * @inheritDoc
* @api * @api
*/ */
OverviewMap.prototype.setMap = function(map) { setMap(map) {
const oldMap = this.getMap(); const oldMap = this.getMap();
if (map === oldMap) { if (map === oldMap) {
return; return;
@@ -243,7 +242,7 @@ OverviewMap.prototype.setMap = function(map) {
} }
this.ovmap_.setTarget(null); this.ovmap_.setTarget(null);
} }
Control.prototype.setMap.call(this, map); super.setMap(map);
if (map) { if (map) {
this.ovmap_.setTarget(this.ovmapDiv_); this.ovmap_.setTarget(this.ovmapDiv_);
@@ -265,15 +264,14 @@ OverviewMap.prototype.setMap = function(map) {
} }
} }
} }
}; }
/** /**
* Handle map property changes. This only deals with changes to the map's view. * Handle map property changes. This only deals with changes to the map's view.
* @param {module:ol/Object~ObjectEvent} event The propertychange event. * @param {module:ol/Object~ObjectEvent} event The propertychange event.
* @private * @private
*/ */
OverviewMap.prototype.handleMapPropertyChange_ = function(event) { handleMapPropertyChange_(event) {
if (event.key === MapProperty.VIEW) { if (event.key === MapProperty.VIEW) {
const oldView = /** @type {module:ol/View} */ (event.oldValue); const oldView = /** @type {module:ol/View} */ (event.oldValue);
if (oldView) { if (oldView) {
@@ -282,32 +280,29 @@ OverviewMap.prototype.handleMapPropertyChange_ = function(event) {
const newView = this.getMap().getView(); const newView = this.getMap().getView();
this.bindView_(newView); this.bindView_(newView);
} }
}; }
/** /**
* Register listeners for view property changes. * Register listeners for view property changes.
* @param {module:ol/View} view The view. * @param {module:ol/View} view The view.
* @private * @private
*/ */
OverviewMap.prototype.bindView_ = function(view) { bindView_(view) {
listen(view, listen(view,
getChangeEventType(ViewProperty.ROTATION), getChangeEventType(ViewProperty.ROTATION),
this.handleRotationChanged_, this); this.handleRotationChanged_, this);
}; }
/** /**
* Unregister listeners for view property changes. * Unregister listeners for view property changes.
* @param {module:ol/View} view The view. * @param {module:ol/View} view The view.
* @private * @private
*/ */
OverviewMap.prototype.unbindView_ = function(view) { unbindView_(view) {
unlisten(view, unlisten(view,
getChangeEventType(ViewProperty.ROTATION), getChangeEventType(ViewProperty.ROTATION),
this.handleRotationChanged_, this); this.handleRotationChanged_, this);
}; }
/** /**
* Handle rotation changes to the main map. * Handle rotation changes to the main map.
@@ -315,23 +310,10 @@ OverviewMap.prototype.unbindView_ = function(view) {
* overview map's view. * overview map's view.
* @private * @private
*/ */
OverviewMap.prototype.handleRotationChanged_ = function() { handleRotationChanged_() {
this.ovmap_.getView().setRotation(this.getMap().getView().getRotation()); this.ovmap_.getView().setRotation(this.getMap().getView().getRotation());
};
/**
* Update the overview map element.
* @param {module:ol/MapEvent} mapEvent Map event.
* @this {module:ol/control/OverviewMap}
* @api
*/
export function render(mapEvent) {
this.validateExtent_();
this.updateBox_();
} }
/** /**
* Reset the overview map extent if the box size (width or * Reset the overview map extent if the box size (width or
* height) is less than the size of the overview map size times minRatio * height) is less than the size of the overview map size times minRatio
@@ -343,7 +325,7 @@ export function render(mapEvent) {
* main map center location. * main map center location.
* @private * @private
*/ */
OverviewMap.prototype.validateExtent_ = function() { validateExtent_() {
const map = this.getMap(); const map = this.getMap();
const ovmap = this.ovmap_; const ovmap = this.ovmap_;
@@ -380,15 +362,14 @@ OverviewMap.prototype.validateExtent_ = function() {
} else if (!containsExtent(ovextent, extent)) { } else if (!containsExtent(ovextent, extent)) {
this.recenter_(); this.recenter_();
} }
}; }
/** /**
* Reset the overview map extent to half calculated min and max ratio times * Reset the overview map extent to half calculated min and max ratio times
* the extent of the main map. * the extent of the main map.
* @private * @private
*/ */
OverviewMap.prototype.resetExtent_ = function() { resetExtent_() {
if (MAX_RATIO === 0 || MIN_RATIO === 0) { if (MAX_RATIO === 0 || MIN_RATIO === 0) {
return; return;
} }
@@ -411,15 +392,14 @@ OverviewMap.prototype.resetExtent_ = function() {
const ratio = 1 / (Math.pow(2, steps / 2) * MIN_RATIO); const ratio = 1 / (Math.pow(2, steps / 2) * MIN_RATIO);
scaleFromCenter(extent, ratio); scaleFromCenter(extent, ratio);
ovview.fit(extent); ovview.fit(extent);
}; }
/** /**
* Set the center of the overview map to the map center without changing its * Set the center of the overview map to the map center without changing its
* resolution. * resolution.
* @private * @private
*/ */
OverviewMap.prototype.recenter_ = function() { recenter_() {
const map = this.getMap(); const map = this.getMap();
const ovmap = this.ovmap_; const ovmap = this.ovmap_;
@@ -428,14 +408,13 @@ OverviewMap.prototype.recenter_ = function() {
const ovview = ovmap.getView(); const ovview = ovmap.getView();
ovview.setCenter(view.getCenter()); ovview.setCenter(view.getCenter());
}; }
/** /**
* Update the box using the main map extent * Update the box using the main map extent
* @private * @private
*/ */
OverviewMap.prototype.updateBox_ = function() { updateBox_() {
const map = this.getMap(); const map = this.getMap();
const ovmap = this.ovmap_; const ovmap = this.ovmap_;
@@ -467,8 +446,7 @@ OverviewMap.prototype.updateBox_ = function() {
box.style.width = Math.abs((bottomLeft[0] - topRight[0]) / ovresolution) + 'px'; box.style.width = Math.abs((bottomLeft[0] - topRight[0]) / ovresolution) + 'px';
box.style.height = Math.abs((topRight[1] - bottomLeft[1]) / ovresolution) + 'px'; box.style.height = Math.abs((topRight[1] - bottomLeft[1]) / ovresolution) + 'px';
} }
}; }
/** /**
* @param {number} rotation Target rotation. * @param {number} rotation Target rotation.
@@ -476,8 +454,7 @@ OverviewMap.prototype.updateBox_ = function() {
* @return {module:ol/coordinate~Coordinate|undefined} Coordinate for rotation and center anchor. * @return {module:ol/coordinate~Coordinate|undefined} Coordinate for rotation and center anchor.
* @private * @private
*/ */
OverviewMap.prototype.calculateCoordinateRotate_ = function( calculateCoordinateRotate_(rotation, coordinate) {
rotation, coordinate) {
let coordinateRotate; let coordinateRotate;
const map = this.getMap(); const map = this.getMap();
@@ -494,23 +471,21 @@ OverviewMap.prototype.calculateCoordinateRotate_ = function(
addCoordinate(coordinateRotate, currentCenter); addCoordinate(coordinateRotate, currentCenter);
} }
return coordinateRotate; return coordinateRotate;
}; }
/** /**
* @param {MouseEvent} event The event to handle * @param {MouseEvent} event The event to handle
* @private * @private
*/ */
OverviewMap.prototype.handleClick_ = function(event) { handleClick_(event) {
event.preventDefault(); event.preventDefault();
this.handleToggle_(); this.handleToggle_();
}; }
/** /**
* @private * @private
*/ */
OverviewMap.prototype.handleToggle_ = function() { handleToggle_() {
this.element.classList.toggle(CLASS_COLLAPSED); this.element.classList.toggle(CLASS_COLLAPSED);
if (this.collapsed_) { if (this.collapsed_) {
replaceNode(this.collapseLabel_, this.label_); replaceNode(this.collapseLabel_, this.label_);
@@ -531,25 +506,23 @@ OverviewMap.prototype.handleToggle_ = function() {
}, },
this); this);
} }
}; }
/** /**
* Return `true` if the overview map is collapsible, `false` otherwise. * Return `true` if the overview map is collapsible, `false` otherwise.
* @return {boolean} True if the widget is collapsible. * @return {boolean} True if the widget is collapsible.
* @api * @api
*/ */
OverviewMap.prototype.getCollapsible = function() { getCollapsible() {
return this.collapsible_; return this.collapsible_;
}; }
/** /**
* Set whether the overview map should be collapsible. * Set whether the overview map should be collapsible.
* @param {boolean} collapsible True if the widget is collapsible. * @param {boolean} collapsible True if the widget is collapsible.
* @api * @api
*/ */
OverviewMap.prototype.setCollapsible = function(collapsible) { setCollapsible(collapsible) {
if (this.collapsible_ === collapsible) { if (this.collapsible_ === collapsible) {
return; return;
} }
@@ -558,8 +531,7 @@ OverviewMap.prototype.setCollapsible = function(collapsible) {
if (!collapsible && this.collapsed_) { if (!collapsible && this.collapsed_) {
this.handleToggle_(); this.handleToggle_();
} }
}; }
/** /**
* Collapse or expand the overview map according to the passed parameter. Will * Collapse or expand the overview map according to the passed parameter. Will
@@ -568,30 +540,43 @@ OverviewMap.prototype.setCollapsible = function(collapsible) {
* @param {boolean} collapsed True if the widget is collapsed. * @param {boolean} collapsed True if the widget is collapsed.
* @api * @api
*/ */
OverviewMap.prototype.setCollapsed = function(collapsed) { setCollapsed(collapsed) {
if (!this.collapsible_ || this.collapsed_ === collapsed) { if (!this.collapsible_ || this.collapsed_ === collapsed) {
return; return;
} }
this.handleToggle_(); this.handleToggle_();
}; }
/** /**
* Determine if the overview map is collapsed. * Determine if the overview map is collapsed.
* @return {boolean} The overview map is collapsed. * @return {boolean} The overview map is collapsed.
* @api * @api
*/ */
OverviewMap.prototype.getCollapsed = function() { getCollapsed() {
return this.collapsed_; return this.collapsed_;
}; }
/** /**
* Return the overview map. * Return the overview map.
* @return {module:ol/PluggableMap} Overview map. * @return {module:ol/PluggableMap} Overview map.
* @api * @api
*/ */
OverviewMap.prototype.getOverviewMap = function() { getOverviewMap() {
return this.ovmap_; return this.ovmap_;
}; }
}
/**
* Update the overview map element.
* @param {module:ol/MapEvent} mapEvent Map event.
* @this {module:ol/control/OverviewMap}
* @api
*/
export function render(mapEvent) {
this.validateExtent_();
this.updateBox_();
}
export default OverviewMap; export default OverviewMap;
+20 -24
View File
@@ -1,13 +1,11 @@
/** /**
* @module ol/control/Rotate * @module ol/control/Rotate
*/ */
import Control from '../control/Control.js'; import Control from '../control/Control.js';
import {CLASS_CONTROL, CLASS_HIDDEN, CLASS_UNSELECTABLE} from '../css.js'; import {CLASS_CONTROL, CLASS_HIDDEN, CLASS_UNSELECTABLE} from '../css.js';
import {easeOut} from '../easing.js'; import {easeOut} from '../easing.js';
import {listen} from '../events.js'; import {listen} from '../events.js';
import EventType from '../events/EventType.js'; import EventType from '../events/EventType.js';
import {inherits} from '../util.js';
/** /**
@@ -33,15 +31,23 @@ import {inherits} from '../util.js';
* To style this control use css selector `.ol-rotate`. A `.ol-hidden` css * To style this control use css selector `.ol-rotate`. A `.ol-hidden` css
* selector is added to the button when the rotation is 0. * selector is added to the button when the rotation is 0.
* *
* @constructor
* @extends {module:ol/control/Control}
* @param {module:ol/control/Rotate~Options=} opt_options Rotate options.
* @api * @api
*/ */
const Rotate = function(opt_options) { class Rotate extends Control {
/**
* @param {module:ol/control/Rotate~Options=} opt_options Rotate options.
*/
constructor(opt_options) {
const options = opt_options ? opt_options : {}; const options = opt_options ? opt_options : {};
super({
element: document.createElement('div'),
render: options.render || render,
target: options.target
});
const className = options.className !== undefined ? options.className : 'ol-rotate'; const className = options.className !== undefined ? options.className : 'ol-rotate';
const label = options.label !== undefined ? options.label : '\u21E7'; const label = options.label !== undefined ? options.label : '\u21E7';
@@ -69,22 +75,15 @@ const Rotate = function(opt_options) {
button.title = tipLabel; button.title = tipLabel;
button.appendChild(this.label_); button.appendChild(this.label_);
listen(button, EventType.CLICK, listen(button, EventType.CLICK, this.handleClick_, this);
Rotate.prototype.handleClick_, this);
const cssClasses = className + ' ' + CLASS_UNSELECTABLE + ' ' + CLASS_CONTROL; const cssClasses = className + ' ' + CLASS_UNSELECTABLE + ' ' + CLASS_CONTROL;
const element = document.createElement('div'); const element = this.element;
element.className = cssClasses; element.className = cssClasses;
element.appendChild(button); element.appendChild(button);
this.callResetNorth_ = options.resetNorth ? options.resetNorth : undefined; this.callResetNorth_ = options.resetNorth ? options.resetNorth : undefined;
Control.call(this, {
element: element,
render: options.render || render,
target: options.target
});
/** /**
* @type {number} * @type {number}
* @private * @private
@@ -107,29 +106,25 @@ const Rotate = function(opt_options) {
this.element.classList.add(CLASS_HIDDEN); this.element.classList.add(CLASS_HIDDEN);
} }
}; }
inherits(Rotate, Control);
/** /**
* @param {MouseEvent} event The event to handle * @param {MouseEvent} event The event to handle
* @private * @private
*/ */
Rotate.prototype.handleClick_ = function(event) { handleClick_(event) {
event.preventDefault(); event.preventDefault();
if (this.callResetNorth_ !== undefined) { if (this.callResetNorth_ !== undefined) {
this.callResetNorth_(); this.callResetNorth_();
} else { } else {
this.resetNorth_(); this.resetNorth_();
} }
}; }
/** /**
* @private * @private
*/ */
Rotate.prototype.resetNorth_ = function() { resetNorth_() {
const map = this.getMap(); const map = this.getMap();
const view = map.getView(); const view = map.getView();
if (!view) { if (!view) {
@@ -148,7 +143,8 @@ Rotate.prototype.resetNorth_ = function() {
view.setRotation(0); view.setRotation(0);
} }
} }
}; }
}
/** /**
+44 -52
View File
@@ -1,7 +1,6 @@
/** /**
* @module ol/control/ScaleLine * @module ol/control/ScaleLine
*/ */
import {inherits} from '../util.js';
import {getChangeEventType} from '../Object.js'; import {getChangeEventType} from '../Object.js';
import {assert} from '../asserts.js'; import {assert} from '../asserts.js';
import Control from '../control/Control.js'; import Control from '../control/Control.js';
@@ -59,17 +58,25 @@ const LEADING_DIGITS = [1, 2, 5];
* By default the scale line will show in the bottom left portion of the map, * By default the scale line will show in the bottom left portion of the map,
* but this can be changed by using the css selector `.ol-scale-line`. * but this can be changed by using the css selector `.ol-scale-line`.
* *
* @constructor
* @extends {module:ol/control/Control}
* @param {module:ol/control/ScaleLine~Options=} opt_options Scale line options.
* @api * @api
*/ */
const ScaleLine = function(opt_options) { class ScaleLine extends Control {
/**
* @param {module:ol/control/ScaleLine~Options=} opt_options Scale line options.
*/
constructor(opt_options) {
const options = opt_options ? opt_options : {}; const options = opt_options ? opt_options : {};
const className = options.className !== undefined ? options.className : 'ol-scale-line'; const className = options.className !== undefined ? options.className : 'ol-scale-line';
super({
element: document.createElement('DIV'),
render: options.render || render,
target: options.target
});
/** /**
* @private * @private
* @type {HTMLElement} * @type {HTMLElement}
@@ -77,13 +84,8 @@ const ScaleLine = function(opt_options) {
this.innerElement_ = document.createElement('DIV'); this.innerElement_ = document.createElement('DIV');
this.innerElement_.className = className + '-inner'; this.innerElement_.className = className + '-inner';
/** this.element.className = className + ' ' + CLASS_UNSELECTABLE;
* @private this.element.appendChild(this.innerElement_);
* @type {HTMLElement}
*/
this.element_ = document.createElement('DIV');
this.element_.className = className + ' ' + CLASS_UNSELECTABLE;
this.element_.appendChild(this.innerElement_);
/** /**
* @private * @private
@@ -115,12 +117,6 @@ const ScaleLine = function(opt_options) {
*/ */
this.renderedHTML_ = ''; this.renderedHTML_ = '';
Control.call(this, {
element: this.element_,
render: options.render || render,
target: options.target
});
listen( listen(
this, getChangeEventType(UNITS_PROP), this, getChangeEventType(UNITS_PROP),
this.handleUnitsChanged_, this); this.handleUnitsChanged_, this);
@@ -128,10 +124,7 @@ const ScaleLine = function(opt_options) {
this.setUnits(/** @type {module:ol/control/ScaleLine~Units} */ (options.units) || this.setUnits(/** @type {module:ol/control/ScaleLine~Units} */ (options.units) ||
Units.METRIC); Units.METRIC);
}; }
inherits(ScaleLine, Control);
/** /**
* Return the units to use in the scale line. * Return the units to use in the scale line.
@@ -140,37 +133,18 @@ inherits(ScaleLine, Control);
* @observable * @observable
* @api * @api
*/ */
ScaleLine.prototype.getUnits = function() { getUnits() {
return ( return (
/** @type {module:ol/control/ScaleLine~Units|undefined} */ (this.get(UNITS_PROP)) /** @type {module:ol/control/ScaleLine~Units|undefined} */ (this.get(UNITS_PROP))
); );
};
/**
* Update the scale line element.
* @param {module:ol/MapEvent} mapEvent Map event.
* @this {module:ol/control/ScaleLine}
* @api
*/
export function render(mapEvent) {
const frameState = mapEvent.frameState;
if (!frameState) {
this.viewState_ = null;
} else {
this.viewState_ = frameState.viewState;
} }
this.updateElement_();
}
/** /**
* @private * @private
*/ */
ScaleLine.prototype.handleUnitsChanged_ = function() { handleUnitsChanged_() {
this.updateElement_(); this.updateElement_();
}; }
/** /**
* Set the units to use in the scale line. * Set the units to use in the scale line.
@@ -178,20 +152,19 @@ ScaleLine.prototype.handleUnitsChanged_ = function() {
* @observable * @observable
* @api * @api
*/ */
ScaleLine.prototype.setUnits = function(units) { setUnits(units) {
this.set(UNITS_PROP, units); this.set(UNITS_PROP, units);
}; }
/** /**
* @private * @private
*/ */
ScaleLine.prototype.updateElement_ = function() { updateElement_() {
const viewState = this.viewState_; const viewState = this.viewState_;
if (!viewState) { if (!viewState) {
if (this.renderedVisible_) { if (this.renderedVisible_) {
this.element_.style.display = 'none'; this.element.style.display = 'none';
this.renderedVisible_ = false; this.renderedVisible_ = false;
} }
return; return;
@@ -278,7 +251,7 @@ ScaleLine.prototype.updateElement_ = function() {
Math.pow(10, Math.floor(i / 3)); Math.pow(10, Math.floor(i / 3));
width = Math.round(count / pointResolution); width = Math.round(count / pointResolution);
if (isNaN(width)) { if (isNaN(width)) {
this.element_.style.display = 'none'; this.element.style.display = 'none';
this.renderedVisible_ = false; this.renderedVisible_ = false;
return; return;
} else if (width >= this.minWidth_) { } else if (width >= this.minWidth_) {
@@ -299,10 +272,29 @@ ScaleLine.prototype.updateElement_ = function() {
} }
if (!this.renderedVisible_) { if (!this.renderedVisible_) {
this.element_.style.display = ''; this.element.style.display = '';
this.renderedVisible_ = true; this.renderedVisible_ = true;
} }
}; }
}
/**
* Update the scale line element.
* @param {module:ol/MapEvent} mapEvent Map event.
* @this {module:ol/control/ScaleLine}
* @api
*/
export function render(mapEvent) {
const frameState = mapEvent.frameState;
if (!frameState) {
this.viewState_ = null;
} else {
this.viewState_ = frameState.viewState;
}
this.updateElement_();
}
export default ScaleLine; export default ScaleLine;
+22 -24
View File
@@ -1,7 +1,6 @@
/** /**
* @module ol/control/Zoom * @module ol/control/Zoom
*/ */
import {inherits} from '../util.js';
import {listen} from '../events.js'; import {listen} from '../events.js';
import EventType from '../events/EventType.js'; import EventType from '../events/EventType.js';
import Control from '../control/Control.js'; import Control from '../control/Control.js';
@@ -31,15 +30,22 @@ import {easeOut} from '../easing.js';
* This control is one of the default controls of a map. To style this control * This control is one of the default controls of a map. To style this control
* use css selectors `.ol-zoom-in` and `.ol-zoom-out`. * use css selectors `.ol-zoom-in` and `.ol-zoom-out`.
* *
* @constructor
* @extends {module:ol/control/Control}
* @param {module:ol/control/Zoom~Options=} opt_options Zoom options.
* @api * @api
*/ */
const Zoom = function(opt_options) { class Zoom extends Control {
/**
* @param {module:ol/control/Zoom~Options=} opt_options Zoom options.
*/
constructor(opt_options) {
const options = opt_options ? opt_options : {}; const options = opt_options ? opt_options : {};
super({
element: document.createElement('div'),
target: options.target
});
const className = options.className !== undefined ? options.className : 'ol-zoom'; const className = options.className !== undefined ? options.className : 'ol-zoom';
const delta = options.delta !== undefined ? options.delta : 1; const delta = options.delta !== undefined ? options.delta : 1;
@@ -60,8 +66,7 @@ const Zoom = function(opt_options) {
typeof zoomInLabel === 'string' ? document.createTextNode(zoomInLabel) : zoomInLabel typeof zoomInLabel === 'string' ? document.createTextNode(zoomInLabel) : zoomInLabel
); );
listen(inElement, EventType.CLICK, listen(inElement, EventType.CLICK, this.handleClick_.bind(this, delta));
Zoom.prototype.handleClick_.bind(this, delta));
const outElement = document.createElement('button'); const outElement = document.createElement('button');
outElement.className = className + '-out'; outElement.className = className + '-out';
@@ -71,47 +76,37 @@ const Zoom = function(opt_options) {
typeof zoomOutLabel === 'string' ? document.createTextNode(zoomOutLabel) : zoomOutLabel typeof zoomOutLabel === 'string' ? document.createTextNode(zoomOutLabel) : zoomOutLabel
); );
listen(outElement, EventType.CLICK, listen(outElement, EventType.CLICK, this.handleClick_.bind(this, -delta));
Zoom.prototype.handleClick_.bind(this, -delta));
const cssClasses = className + ' ' + CLASS_UNSELECTABLE + ' ' + CLASS_CONTROL; const cssClasses = className + ' ' + CLASS_UNSELECTABLE + ' ' + CLASS_CONTROL;
const element = document.createElement('div'); const element = this.element;
element.className = cssClasses; element.className = cssClasses;
element.appendChild(inElement); element.appendChild(inElement);
element.appendChild(outElement); element.appendChild(outElement);
Control.call(this, {
element: element,
target: options.target
});
/** /**
* @type {number} * @type {number}
* @private * @private
*/ */
this.duration_ = options.duration !== undefined ? options.duration : 250; this.duration_ = options.duration !== undefined ? options.duration : 250;
}; }
inherits(Zoom, Control);
/** /**
* @param {number} delta Zoom delta. * @param {number} delta Zoom delta.
* @param {MouseEvent} event The event to handle * @param {MouseEvent} event The event to handle
* @private * @private
*/ */
Zoom.prototype.handleClick_ = function(delta, event) { handleClick_(delta, event) {
event.preventDefault(); event.preventDefault();
this.zoomByDelta_(delta); this.zoomByDelta_(delta);
}; }
/** /**
* @param {number} delta Zoom delta. * @param {number} delta Zoom delta.
* @private * @private
*/ */
Zoom.prototype.zoomByDelta_ = function(delta) { zoomByDelta_(delta) {
const map = this.getMap(); const map = this.getMap();
const view = map.getView(); const view = map.getView();
if (!view) { if (!view) {
@@ -135,5 +130,8 @@ Zoom.prototype.zoomByDelta_ = function(delta) {
view.setResolution(newResolution); view.setResolution(newResolution);
} }
} }
}; }
}
export default Zoom; export default Zoom;
+162 -172
View File
@@ -1,7 +1,6 @@
/** /**
* @module ol/control/ZoomSlider * @module ol/control/ZoomSlider
*/ */
import {inherits} from '../util.js';
import ViewHint from '../ViewHint.js'; import ViewHint from '../ViewHint.js';
import Control from '../control/Control.js'; import Control from '../control/Control.js';
import {CLASS_CONTROL, CLASS_UNSELECTABLE} from '../css.js'; import {CLASS_CONTROL, CLASS_UNSELECTABLE} from '../css.js';
@@ -42,15 +41,22 @@ const Direction = {
* *
* map.addControl(new ZoomSlider()); * map.addControl(new ZoomSlider());
* *
* @constructor
* @extends {module:ol/control/Control}
* @param {module:ol/control/ZoomSlider~Options=} opt_options Zoom slider options.
* @api * @api
*/ */
const ZoomSlider = function(opt_options) { class ZoomSlider extends Control {
/**
* @param {module:ol/control/ZoomSlider~Options=} opt_options Zoom slider options.
*/
constructor(opt_options) {
const options = opt_options ? opt_options : {}; const options = opt_options ? opt_options : {};
super({
element: document.createElement('div'),
render: options.render || render
});
/** /**
* Will hold the current resolution of the view. * Will hold the current resolution of the view.
* *
@@ -123,7 +129,7 @@ const ZoomSlider = function(opt_options) {
const thumbElement = document.createElement('button'); const thumbElement = document.createElement('button');
thumbElement.setAttribute('type', 'button'); thumbElement.setAttribute('type', 'button');
thumbElement.className = className + '-thumb ' + CLASS_UNSELECTABLE; thumbElement.className = className + '-thumb ' + CLASS_UNSELECTABLE;
const containerElement = document.createElement('div'); const containerElement = this.element;
containerElement.className = className + ' ' + CLASS_UNSELECTABLE + ' ' + CLASS_CONTROL; containerElement.className = className + ' ' + CLASS_UNSELECTABLE + ' ' + CLASS_CONTROL;
containerElement.appendChild(thumbElement); containerElement.appendChild(thumbElement);
/** /**
@@ -141,35 +147,25 @@ const ZoomSlider = function(opt_options) {
listen(containerElement, EventType.CLICK, this.handleContainerClick_, this); listen(containerElement, EventType.CLICK, this.handleContainerClick_, this);
listen(thumbElement, EventType.CLICK, stopPropagation); listen(thumbElement, EventType.CLICK, stopPropagation);
}
Control.call(this, {
element: containerElement,
render: options.render || render
});
};
inherits(ZoomSlider, Control);
/** /**
* @inheritDoc * @inheritDoc
*/ */
ZoomSlider.prototype.disposeInternal = function() { disposeInternal() {
this.dragger_.dispose(); this.dragger_.dispose();
Control.prototype.disposeInternal.call(this); super.disposeInternal();
}; }
/** /**
* @inheritDoc * @inheritDoc
*/ */
ZoomSlider.prototype.setMap = function(map) { setMap(map) {
Control.prototype.setMap.call(this, map); super.setMap(map);
if (map) { if (map) {
map.render(); map.render();
} }
}; }
/** /**
* Initializes the slider element. This will determine and set this controls * Initializes the slider element. This will determine and set this controls
@@ -178,7 +174,7 @@ ZoomSlider.prototype.setMap = function(map) {
* *
* @private * @private
*/ */
ZoomSlider.prototype.initSlider_ = function() { initSlider_() {
const container = this.element; const container = this.element;
const containerSize = { const containerSize = {
width: container.offsetWidth, height: container.offsetHeight width: container.offsetWidth, height: container.offsetHeight
@@ -202,7 +198,148 @@ ZoomSlider.prototype.initSlider_ = function() {
this.heightLimit_ = containerSize.height - thumbHeight; this.heightLimit_ = containerSize.height - thumbHeight;
} }
this.sliderInitialized_ = true; this.sliderInitialized_ = true;
}; }
/**
* @param {MouseEvent} event The browser event to handle.
* @private
*/
handleContainerClick_(event) {
const view = this.getMap().getView();
const relativePosition = this.getRelativePosition_(
event.offsetX - this.thumbSize_[0] / 2,
event.offsetY - this.thumbSize_[1] / 2);
const resolution = this.getResolutionForPosition_(relativePosition);
view.animate({
resolution: view.constrainResolution(resolution),
duration: this.duration_,
easing: easeOut
});
}
/**
* Handle dragger start events.
* @param {module:ol/pointer/PointerEvent} event The drag event.
* @private
*/
handleDraggerStart_(event) {
if (!this.dragging_ && event.originalEvent.target === this.element.firstElementChild) {
this.getMap().getView().setHint(ViewHint.INTERACTING, 1);
this.previousX_ = event.clientX;
this.previousY_ = event.clientY;
this.dragging_ = true;
}
}
/**
* Handle dragger drag events.
*
* @param {module:ol/pointer/PointerEvent|Event} event The drag event.
* @private
*/
handleDraggerDrag_(event) {
if (this.dragging_) {
const element = this.element.firstElementChild;
const deltaX = event.clientX - this.previousX_ + parseInt(element.style.left, 10);
const deltaY = event.clientY - this.previousY_ + parseInt(element.style.top, 10);
const relativePosition = this.getRelativePosition_(deltaX, deltaY);
this.currentResolution_ = this.getResolutionForPosition_(relativePosition);
this.getMap().getView().setResolution(this.currentResolution_);
this.setThumbPosition_(this.currentResolution_);
this.previousX_ = event.clientX;
this.previousY_ = event.clientY;
}
}
/**
* Handle dragger end events.
* @param {module:ol/pointer/PointerEvent|Event} event The drag event.
* @private
*/
handleDraggerEnd_(event) {
if (this.dragging_) {
const view = this.getMap().getView();
view.setHint(ViewHint.INTERACTING, -1);
view.animate({
resolution: view.constrainResolution(this.currentResolution_),
duration: this.duration_,
easing: easeOut
});
this.dragging_ = false;
this.previousX_ = undefined;
this.previousY_ = undefined;
}
}
/**
* Positions the thumb inside its container according to the given resolution.
*
* @param {number} res The res.
* @private
*/
setThumbPosition_(res) {
const position = this.getPositionForResolution_(res);
const thumb = this.element.firstElementChild;
if (this.direction_ == Direction.HORIZONTAL) {
thumb.style.left = this.widthLimit_ * position + 'px';
} else {
thumb.style.top = this.heightLimit_ * position + 'px';
}
}
/**
* Calculates the relative position of the thumb given x and y offsets. The
* relative position scales from 0 to 1. The x and y offsets are assumed to be
* in pixel units within the dragger limits.
*
* @param {number} x Pixel position relative to the left of the slider.
* @param {number} y Pixel position relative to the top of the slider.
* @return {number} The relative position of the thumb.
* @private
*/
getRelativePosition_(x, y) {
let amount;
if (this.direction_ === Direction.HORIZONTAL) {
amount = x / this.widthLimit_;
} else {
amount = y / this.heightLimit_;
}
return clamp(amount, 0, 1);
}
/**
* Calculates the corresponding resolution of the thumb given its relative
* position (where 0 is the minimum and 1 is the maximum).
*
* @param {number} position The relative position of the thumb.
* @return {number} The corresponding resolution.
* @private
*/
getResolutionForPosition_(position) {
const fn = this.getMap().getView().getResolutionForValueFunction();
return fn(1 - position);
}
/**
* Determines the relative position of the slider for the given resolution. A
* relative position of 0 corresponds to the minimum view resolution. A
* relative position of 1 corresponds to the maximum view resolution.
*
* @param {number} res The resolution.
* @return {number} The relative position value (between 0 and 1).
* @private
*/
getPositionForResolution_(res) {
const fn = this.getMap().getView().getValueForResolutionFunction();
return 1 - fn(res);
}
}
/** /**
@@ -226,151 +363,4 @@ export function render(mapEvent) {
} }
/**
* @param {MouseEvent} event The browser event to handle.
* @private
*/
ZoomSlider.prototype.handleContainerClick_ = function(event) {
const view = this.getMap().getView();
const relativePosition = this.getRelativePosition_(
event.offsetX - this.thumbSize_[0] / 2,
event.offsetY - this.thumbSize_[1] / 2);
const resolution = this.getResolutionForPosition_(relativePosition);
view.animate({
resolution: view.constrainResolution(resolution),
duration: this.duration_,
easing: easeOut
});
};
/**
* Handle dragger start events.
* @param {module:ol/pointer/PointerEvent} event The drag event.
* @private
*/
ZoomSlider.prototype.handleDraggerStart_ = function(event) {
if (!this.dragging_ && event.originalEvent.target === this.element.firstElementChild) {
this.getMap().getView().setHint(ViewHint.INTERACTING, 1);
this.previousX_ = event.clientX;
this.previousY_ = event.clientY;
this.dragging_ = true;
}
};
/**
* Handle dragger drag events.
*
* @param {module:ol/pointer/PointerEvent|Event} event The drag event.
* @private
*/
ZoomSlider.prototype.handleDraggerDrag_ = function(event) {
if (this.dragging_) {
const element = this.element.firstElementChild;
const deltaX = event.clientX - this.previousX_ + parseInt(element.style.left, 10);
const deltaY = event.clientY - this.previousY_ + parseInt(element.style.top, 10);
const relativePosition = this.getRelativePosition_(deltaX, deltaY);
this.currentResolution_ = this.getResolutionForPosition_(relativePosition);
this.getMap().getView().setResolution(this.currentResolution_);
this.setThumbPosition_(this.currentResolution_);
this.previousX_ = event.clientX;
this.previousY_ = event.clientY;
}
};
/**
* Handle dragger end events.
* @param {module:ol/pointer/PointerEvent|Event} event The drag event.
* @private
*/
ZoomSlider.prototype.handleDraggerEnd_ = function(event) {
if (this.dragging_) {
const view = this.getMap().getView();
view.setHint(ViewHint.INTERACTING, -1);
view.animate({
resolution: view.constrainResolution(this.currentResolution_),
duration: this.duration_,
easing: easeOut
});
this.dragging_ = false;
this.previousX_ = undefined;
this.previousY_ = undefined;
}
};
/**
* Positions the thumb inside its container according to the given resolution.
*
* @param {number} res The res.
* @private
*/
ZoomSlider.prototype.setThumbPosition_ = function(res) {
const position = this.getPositionForResolution_(res);
const thumb = this.element.firstElementChild;
if (this.direction_ == Direction.HORIZONTAL) {
thumb.style.left = this.widthLimit_ * position + 'px';
} else {
thumb.style.top = this.heightLimit_ * position + 'px';
}
};
/**
* Calculates the relative position of the thumb given x and y offsets. The
* relative position scales from 0 to 1. The x and y offsets are assumed to be
* in pixel units within the dragger limits.
*
* @param {number} x Pixel position relative to the left of the slider.
* @param {number} y Pixel position relative to the top of the slider.
* @return {number} The relative position of the thumb.
* @private
*/
ZoomSlider.prototype.getRelativePosition_ = function(x, y) {
let amount;
if (this.direction_ === Direction.HORIZONTAL) {
amount = x / this.widthLimit_;
} else {
amount = y / this.heightLimit_;
}
return clamp(amount, 0, 1);
};
/**
* Calculates the corresponding resolution of the thumb given its relative
* position (where 0 is the minimum and 1 is the maximum).
*
* @param {number} position The relative position of the thumb.
* @return {number} The corresponding resolution.
* @private
*/
ZoomSlider.prototype.getResolutionForPosition_ = function(position) {
const fn = this.getMap().getView().getResolutionForValueFunction();
return fn(1 - position);
};
/**
* Determines the relative position of the slider for the given resolution. A
* relative position of 0 corresponds to the minimum view resolution. A
* relative position of 1 corresponds to the maximum view resolution.
*
* @param {number} res The resolution.
* @return {number} The relative position value (between 0 and 1).
* @private
*/
ZoomSlider.prototype.getPositionForResolution_ = function(res) {
const fn = this.getMap().getView().getValueForResolutionFunction();
return 1 - fn(res);
};
export default ZoomSlider; export default ZoomSlider;
+19 -20
View File
@@ -1,7 +1,6 @@
/** /**
* @module ol/control/ZoomToExtent * @module ol/control/ZoomToExtent
*/ */
import {inherits} from '../util.js';
import {listen} from '../events.js'; import {listen} from '../events.js';
import EventType from '../events/EventType.js'; import EventType from '../events/EventType.js';
import Control from '../control/Control.js'; import Control from '../control/Control.js';
@@ -26,14 +25,21 @@ import {CLASS_CONTROL, CLASS_UNSELECTABLE} from '../css.js';
* A button control which, when pressed, changes the map view to a specific * A button control which, when pressed, changes the map view to a specific
* extent. To style this control use the css selector `.ol-zoom-extent`. * extent. To style this control use the css selector `.ol-zoom-extent`.
* *
* @constructor
* @extends {module:ol/control/Control}
* @param {module:ol/control/ZoomToExtent~Options=} opt_options Options.
* @api * @api
*/ */
const ZoomToExtent = function(opt_options) { class ZoomToExtent extends Control {
/**
* @param {module:ol/control/ZoomToExtent~Options=} opt_options Options.
*/
constructor(opt_options) {
const options = opt_options ? opt_options : {}; const options = opt_options ? opt_options : {};
super({
element: document.createElement('div'),
target: options.target
});
/** /**
* @type {module:ol/extent~Extent} * @type {module:ol/extent~Extent}
* @protected * @protected
@@ -54,36 +60,29 @@ const ZoomToExtent = function(opt_options) {
listen(button, EventType.CLICK, this.handleClick_, this); listen(button, EventType.CLICK, this.handleClick_, this);
const cssClasses = className + ' ' + CLASS_UNSELECTABLE + ' ' + CLASS_CONTROL; const cssClasses = className + ' ' + CLASS_UNSELECTABLE + ' ' + CLASS_CONTROL;
const element = document.createElement('div'); const element = this.element;
element.className = cssClasses; element.className = cssClasses;
element.appendChild(button); element.appendChild(button);
}
Control.call(this, {
element: element,
target: options.target
});
};
inherits(ZoomToExtent, Control);
/** /**
* @param {MouseEvent} event The event to handle * @param {MouseEvent} event The event to handle
* @private * @private
*/ */
ZoomToExtent.prototype.handleClick_ = function(event) { handleClick_(event) {
event.preventDefault(); event.preventDefault();
this.handleZoomToExtent(); this.handleZoomToExtent();
}; }
/** /**
* @protected * @protected
*/ */
ZoomToExtent.prototype.handleZoomToExtent = function() { handleZoomToExtent() {
const map = this.getMap(); const map = this.getMap();
const view = map.getView(); const view = map.getView();
const extent = !this.extent ? view.getProjection().getExtent() : this.extent; const extent = !this.extent ? view.getProjection().getExtent() : this.extent;
view.fit(extent); view.fit(extent);
}; }
}
export default ZoomToExtent; export default ZoomToExtent;
+20 -15
View File
@@ -1,6 +1,7 @@
/** /**
* @module ol/events/Event * @module ol/events/Event
*/ */
/** /**
* @classdesc * @classdesc
* Stripped down implementation of the W3C DOM Level 2 Event interface. * Stripped down implementation of the W3C DOM Level 2 Event interface.
@@ -10,11 +11,13 @@
* `stopPropagation` and `preventDefault` methods. It is meant as base class * `stopPropagation` and `preventDefault` methods. It is meant as base class
* for higher level events defined in the library, and works with * for higher level events defined in the library, and works with
* {@link module:ol/events/EventTarget~EventTarget}. * {@link module:ol/events/EventTarget~EventTarget}.
* */
* @constructor class Event {
/**
* @param {string} type Type. * @param {string} type Type.
*/ */
const Event = function(type) { constructor(type) {
/** /**
* @type {boolean} * @type {boolean}
@@ -34,25 +37,27 @@ const Event = function(type) {
* @api * @api
*/ */
this.target = null; this.target = null;
}
};
/** /**
* Stop event propagation. * Stop event propagation.
* @function * @function
* @api * @api
*/ */
Event.prototype.preventDefault = preventDefault() {
/**
* Stop event propagation.
* @function
* @api
*/
Event.prototype.stopPropagation = function() {
this.propagationStopped = true; this.propagationStopped = true;
}; }
/**
* Stop event propagation.
* @function
* @api
*/
stopPropagation() {
this.propagationStopped = true;
}
}
/** /**
+27 -29
View File
@@ -1,7 +1,6 @@
/** /**
* @module ol/events/EventTarget * @module ol/events/EventTarget
*/ */
import {inherits} from '../util.js';
import Disposable from '../Disposable.js'; import Disposable from '../Disposable.js';
import {unlistenAll} from '../events.js'; import {unlistenAll} from '../events.js';
import {UNDEFINED} from '../functions.js'; import {UNDEFINED} from '../functions.js';
@@ -27,13 +26,11 @@ import Event from '../events/Event.js';
* `stopPropagation` or `preventDefault` on an event object, it means that no * `stopPropagation` or `preventDefault` on an event object, it means that no
* more listeners after this one will be called. Same as when the listener * more listeners after this one will be called. Same as when the listener
* returns false. * returns false.
*
* @constructor
* @extends {module:ol/Disposable}
*/ */
const EventTarget = function() { class EventTarget extends Disposable {
constructor() {
Disposable.call(this); super();
/** /**
* @private * @private
@@ -53,16 +50,13 @@ const EventTarget = function() {
*/ */
this.listeners_ = {}; this.listeners_ = {};
}; }
inherits(EventTarget, Disposable);
/** /**
* @param {string} type Type. * @param {string} type Type.
* @param {module:ol/events~ListenerFunction} listener Listener. * @param {module:ol/events~ListenerFunction} listener Listener.
*/ */
EventTarget.prototype.addEventListener = function(type, listener) { addEventListener(type, listener) {
let listeners = this.listeners_[type]; let listeners = this.listeners_[type];
if (!listeners) { if (!listeners) {
listeners = this.listeners_[type] = []; listeners = this.listeners_[type] = [];
@@ -70,17 +64,22 @@ EventTarget.prototype.addEventListener = function(type, listener) {
if (listeners.indexOf(listener) === -1) { if (listeners.indexOf(listener) === -1) {
listeners.push(listener); listeners.push(listener);
} }
}; }
/** /**
* Dispatches an event and calls all listeners listening for events
* of this type. The event parameter can either be a string or an
* Object with a `type` property.
*
* @param {{type: string, * @param {{type: string,
* target: (EventTarget|module:ol/events/EventTarget|undefined)}|module:ol/events/Event| * target: (EventTarget|module:ol/events/EventTarget|undefined)}|
* string} event Event or event type. * module:ol/events/Event|string} event Event object.
* @return {boolean|undefined} `false` if anyone called preventDefault on the * @return {boolean|undefined} `false` if anyone called preventDefault on the
* event object or if any of the listeners returned false. * event object or if any of the listeners returned false.
* @function
* @api
*/ */
EventTarget.prototype.dispatchEvent = function(event) { dispatchEvent(event) {
const evt = typeof event === 'string' ? new Event(event) : event; const evt = typeof event === 'string' ? new Event(event) : event;
const type = evt.type; const type = evt.type;
evt.target = this; evt.target = this;
@@ -109,16 +108,14 @@ EventTarget.prototype.dispatchEvent = function(event) {
} }
return propagate; return propagate;
} }
}; }
/** /**
* @inheritDoc * @inheritDoc
*/ */
EventTarget.prototype.disposeInternal = function() { disposeInternal() {
unlistenAll(this); unlistenAll(this);
}; }
/** /**
* Get the listeners for a specified event type. Listeners are returned in the * Get the listeners for a specified event type. Listeners are returned in the
@@ -127,28 +124,26 @@ EventTarget.prototype.disposeInternal = function() {
* @param {string} type Type. * @param {string} type Type.
* @return {Array.<module:ol/events~ListenerFunction>} Listeners. * @return {Array.<module:ol/events~ListenerFunction>} Listeners.
*/ */
EventTarget.prototype.getListeners = function(type) { getListeners(type) {
return this.listeners_[type]; return this.listeners_[type];
}; }
/** /**
* @param {string=} opt_type Type. If not provided, * @param {string=} opt_type Type. If not provided,
* `true` will be returned if this EventTarget has any listeners. * `true` will be returned if this EventTarget has any listeners.
* @return {boolean} Has listeners. * @return {boolean} Has listeners.
*/ */
EventTarget.prototype.hasListener = function(opt_type) { hasListener(opt_type) {
return opt_type ? return opt_type ?
opt_type in this.listeners_ : opt_type in this.listeners_ :
Object.keys(this.listeners_).length > 0; Object.keys(this.listeners_).length > 0;
}; }
/** /**
* @param {string} type Type. * @param {string} type Type.
* @param {module:ol/events~ListenerFunction} listener Listener. * @param {module:ol/events~ListenerFunction} listener Listener.
*/ */
EventTarget.prototype.removeEventListener = function(type, listener) { removeEventListener(type, listener) {
const listeners = this.listeners_[type]; const listeners = this.listeners_[type];
if (listeners) { if (listeners) {
const index = listeners.indexOf(listener); const index = listeners.indexOf(listener);
@@ -163,5 +158,8 @@ EventTarget.prototype.removeEventListener = function(type, listener) {
} }
} }
} }
}; }
}
export default EventTarget; export default EventTarget;
+134 -225
View File
@@ -1,7 +1,6 @@
/** /**
* @module ol/format/EsriJSON * @module ol/format/EsriJSON
*/ */
import {inherits} from '../util.js';
import Feature from '../Feature.js'; import Feature from '../Feature.js';
import {assert} from '../asserts.js'; import {assert} from '../asserts.js';
import {containsExtent} from '../extent.js'; import {containsExtent} from '../extent.js';
@@ -58,16 +57,18 @@ GEOMETRY_WRITERS[GeometryType.MULTI_POLYGON] = writeMultiPolygonGeometry;
* @classdesc * @classdesc
* Feature format for reading and writing data in the EsriJSON format. * Feature format for reading and writing data in the EsriJSON format.
* *
* @constructor
* @extends {module:ol/format/JSONFeature}
* @param {module:ol/format/EsriJSON~Options=} opt_options Options.
* @api * @api
*/ */
const EsriJSON = function(opt_options) { class EsriJSON extends JSONFeature {
/**
* @param {module:ol/format/EsriJSON~Options=} opt_options Options.
*/
constructor(opt_options) {
const options = opt_options ? opt_options : {}; const options = opt_options ? opt_options : {};
JSONFeature.call(this); super();
/** /**
* Name of the geometry attribute for features. * Name of the geometry attribute for features.
@@ -76,9 +77,134 @@ const EsriJSON = function(opt_options) {
*/ */
this.geometryName_ = options.geometryName; this.geometryName_ = options.geometryName;
}; }
inherits(EsriJSON, JSONFeature); /**
* @inheritDoc
*/
readFeatureFromObject(object, opt_options) {
const esriJSONFeature = /** @type {EsriJSONFeature} */ (object);
const geometry = readGeometry(esriJSONFeature.geometry, opt_options);
const feature = new Feature();
if (this.geometryName_) {
feature.setGeometryName(this.geometryName_);
}
feature.setGeometry(geometry);
if (opt_options && opt_options.idField &&
esriJSONFeature.attributes[opt_options.idField]) {
feature.setId(/** @type {number} */(esriJSONFeature.attributes[opt_options.idField]));
}
if (esriJSONFeature.attributes) {
feature.setProperties(esriJSONFeature.attributes);
}
return feature;
}
/**
* @inheritDoc
*/
readFeaturesFromObject(object, opt_options) {
const esriJSONObject = /** @type {EsriJSONObject} */ (object);
const options = opt_options ? opt_options : {};
if (esriJSONObject.features) {
const esriJSONFeatureCollection = /** @type {EsriJSONFeatureCollection} */ (object);
/** @type {Array.<module:ol/Feature>} */
const features = [];
const esriJSONFeatures = esriJSONFeatureCollection.features;
options.idField = object.objectIdFieldName;
for (let i = 0, ii = esriJSONFeatures.length; i < ii; ++i) {
features.push(this.readFeatureFromObject(esriJSONFeatures[i], options));
}
return features;
} else {
return [this.readFeatureFromObject(object, options)];
}
}
/**
* @inheritDoc
*/
readGeometryFromObject(object, opt_options) {
return readGeometry(/** @type {EsriJSONGeometry} */(object), opt_options);
}
/**
* @inheritDoc
*/
readProjectionFromObject(object) {
const esriJSONObject = /** @type {EsriJSONObject} */ (object);
if (esriJSONObject.spatialReference && esriJSONObject.spatialReference.wkid) {
const crs = esriJSONObject.spatialReference.wkid;
return getProjection('EPSG:' + crs);
} else {
return null;
}
}
/**
* Encode a geometry as a EsriJSON object.
*
* @param {module:ol/geom/Geometry} geometry Geometry.
* @param {module:ol/format/Feature~WriteOptions=} opt_options Write options.
* @return {EsriJSONGeometry} Object.
* @override
* @api
*/
writeGeometryObject(geometry, opt_options) {
return writeGeometry(geometry, this.adaptOptions(opt_options));
}
/**
* Encode a feature as a esriJSON Feature object.
*
* @param {module:ol/Feature} feature Feature.
* @param {module:ol/format/Feature~WriteOptions=} opt_options Write options.
* @return {Object} Object.
* @override
* @api
*/
writeFeatureObject(feature, opt_options) {
opt_options = this.adaptOptions(opt_options);
const object = {};
const geometry = feature.getGeometry();
if (geometry) {
object['geometry'] = writeGeometry(geometry, opt_options);
if (opt_options && opt_options.featureProjection) {
object['geometry']['spatialReference'] = /** @type {EsriJSONCRS} */({
wkid: getProjection(opt_options.featureProjection).getCode().split(':').pop()
});
}
}
const properties = feature.getProperties();
delete properties[feature.getGeometryName()];
if (!isEmpty(properties)) {
object['attributes'] = properties;
} else {
object['attributes'] = {};
}
return object;
}
/**
* Encode an array of features as a EsriJSON object.
*
* @param {Array.<module:ol/Feature>} features Features.
* @param {module:ol/format/Feature~WriteOptions=} opt_options Write options.
* @return {Object} EsriJSON Object.
* @override
* @api
*/
writeFeaturesObject(features, opt_options) {
opt_options = this.adaptOptions(opt_options);
const objects = [];
for (let i = 0, ii = features.length; i < ii; ++i) {
objects.push(this.writeFeatureObject(features[i], opt_options));
}
return /** @type {EsriJSONFeatureCollection} */ ({
'features': objects
});
}
}
/** /**
@@ -413,121 +539,6 @@ function writeMultiPolygonGeometry(geometry, opt_options) {
} }
/**
* Read a feature from a EsriJSON Feature source. Only works for Feature,
* use `readFeatures` to read FeatureCollection source.
*
* @function
* @param {ArrayBuffer|Document|Node|Object|string} source Source.
* @param {module:ol/format/Feature~ReadOptions=} opt_options Read options.
* @return {module:ol/Feature} Feature.
* @api
*/
EsriJSON.prototype.readFeature;
/**
* Read all features from a EsriJSON source. Works with both Feature and
* FeatureCollection sources.
*
* @function
* @param {ArrayBuffer|Document|Node|Object|string} source Source.
* @param {module:ol/format/Feature~ReadOptions=} opt_options Read options.
* @return {Array.<module:ol/Feature>} Features.
* @api
*/
EsriJSON.prototype.readFeatures;
/**
* @inheritDoc
*/
EsriJSON.prototype.readFeatureFromObject = function(object, opt_options) {
const esriJSONFeature = /** @type {EsriJSONFeature} */ (object);
const geometry = readGeometry(esriJSONFeature.geometry, opt_options);
const feature = new Feature();
if (this.geometryName_) {
feature.setGeometryName(this.geometryName_);
}
feature.setGeometry(geometry);
if (opt_options && opt_options.idField &&
esriJSONFeature.attributes[opt_options.idField]) {
feature.setId(/** @type {number} */(esriJSONFeature.attributes[opt_options.idField]));
}
if (esriJSONFeature.attributes) {
feature.setProperties(esriJSONFeature.attributes);
}
return feature;
};
/**
* @inheritDoc
*/
EsriJSON.prototype.readFeaturesFromObject = function(object, opt_options) {
const esriJSONObject = /** @type {EsriJSONObject} */ (object);
const options = opt_options ? opt_options : {};
if (esriJSONObject.features) {
const esriJSONFeatureCollection = /** @type {EsriJSONFeatureCollection} */ (object);
/** @type {Array.<module:ol/Feature>} */
const features = [];
const esriJSONFeatures = esriJSONFeatureCollection.features;
options.idField = object.objectIdFieldName;
for (let i = 0, ii = esriJSONFeatures.length; i < ii; ++i) {
features.push(this.readFeatureFromObject(esriJSONFeatures[i], options));
}
return features;
} else {
return [this.readFeatureFromObject(object, options)];
}
};
/**
* Read a geometry from a EsriJSON source.
*
* @function
* @param {ArrayBuffer|Document|Node|Object|string} source Source.
* @param {module:ol/format/Feature~ReadOptions=} opt_options Read options.
* @return {module:ol/geom/Geometry} Geometry.
* @api
*/
EsriJSON.prototype.readGeometry;
/**
* @inheritDoc
*/
EsriJSON.prototype.readGeometryFromObject = function(object, opt_options) {
return readGeometry(/** @type {EsriJSONGeometry} */(object), opt_options);
};
/**
* Read the projection from a EsriJSON source.
*
* @function
* @param {ArrayBuffer|Document|Node|Object|string} source Source.
* @return {module:ol/proj/Projection} Projection.
* @api
*/
EsriJSON.prototype.readProjection;
/**
* @inheritDoc
*/
EsriJSON.prototype.readProjectionFromObject = function(object) {
const esriJSONObject = /** @type {EsriJSONObject} */ (object);
if (esriJSONObject.spatialReference && esriJSONObject.spatialReference.wkid) {
const crs = esriJSONObject.spatialReference.wkid;
return getProjection('EPSG:' + crs);
} else {
return null;
}
};
/** /**
* @param {module:ol/geom/Geometry} geometry Geometry. * @param {module:ol/geom/Geometry} geometry Geometry.
* @param {module:ol/format/Feature~WriteOptions=} opt_options Write options. * @param {module:ol/format/Feature~WriteOptions=} opt_options Write options.
@@ -540,106 +551,4 @@ function writeGeometry(geometry, opt_options) {
} }
/**
* Encode a geometry as a EsriJSON string.
*
* @function
* @param {module:ol/geom/Geometry} geometry Geometry.
* @param {module:ol/format/Feature~WriteOptions=} opt_options Write options.
* @return {string} EsriJSON.
* @api
*/
EsriJSON.prototype.writeGeometry;
/**
* Encode a geometry as a EsriJSON object.
*
* @param {module:ol/geom/Geometry} geometry Geometry.
* @param {module:ol/format/Feature~WriteOptions=} opt_options Write options.
* @return {EsriJSONGeometry} Object.
* @override
* @api
*/
EsriJSON.prototype.writeGeometryObject = function(geometry, opt_options) {
return writeGeometry(geometry, this.adaptOptions(opt_options));
};
/**
* Encode a feature as a EsriJSON Feature string.
*
* @function
* @param {module:ol/Feature} feature Feature.
* @param {module:ol/format/Feature~WriteOptions=} opt_options Write options.
* @return {string} EsriJSON.
* @api
*/
EsriJSON.prototype.writeFeature;
/**
* Encode a feature as a esriJSON Feature object.
*
* @param {module:ol/Feature} feature Feature.
* @param {module:ol/format/Feature~WriteOptions=} opt_options Write options.
* @return {Object} Object.
* @override
* @api
*/
EsriJSON.prototype.writeFeatureObject = function(feature, opt_options) {
opt_options = this.adaptOptions(opt_options);
const object = {};
const geometry = feature.getGeometry();
if (geometry) {
object['geometry'] = writeGeometry(geometry, opt_options);
if (opt_options && opt_options.featureProjection) {
object['geometry']['spatialReference'] = /** @type {EsriJSONCRS} */({
wkid: getProjection(opt_options.featureProjection).getCode().split(':').pop()
});
}
}
const properties = feature.getProperties();
delete properties[feature.getGeometryName()];
if (!isEmpty(properties)) {
object['attributes'] = properties;
} else {
object['attributes'] = {};
}
return object;
};
/**
* Encode an array of features as EsriJSON.
*
* @function
* @param {Array.<module:ol/Feature>} features Features.
* @param {module:ol/format/Feature~WriteOptions=} opt_options Write options.
* @return {string} EsriJSON.
* @api
*/
EsriJSON.prototype.writeFeatures;
/**
* Encode an array of features as a EsriJSON object.
*
* @param {Array.<module:ol/Feature>} features Features.
* @param {module:ol/format/Feature~WriteOptions=} opt_options Write options.
* @return {Object} EsriJSON Object.
* @override
* @api
*/
EsriJSON.prototype.writeFeaturesObject = function(features, opt_options) {
opt_options = this.adaptOptions(opt_options);
const objects = [];
for (let i = 0, ii = features.length; i < ii; ++i) {
objects.push(this.writeFeatureObject(features[i], opt_options));
}
return /** @type {EsriJSONFeatureCollection} */ ({
'features': objects
});
};
export default EsriJSON; export default EsriJSON;
+18 -28
View File
@@ -56,11 +56,11 @@ import {get as getProjection, equivalent as equivalentProjection, transformExten
* {@link module:ol/Feature~Feature} objects from a variety of commonly used geospatial * {@link module:ol/Feature~Feature} objects from a variety of commonly used geospatial
* file formats. See the documentation for each format for more details. * file formats. See the documentation for each format for more details.
* *
* @constructor
* @abstract * @abstract
* @api * @api
*/ */
const FeatureFormat = function() { class FeatureFormat {
constructor() {
/** /**
* @protected * @protected
@@ -74,8 +74,7 @@ const FeatureFormat = function() {
*/ */
this.defaultFeatureProjection = null; this.defaultFeatureProjection = null;
}; }
/** /**
* Adds the data projection to the read options. * Adds the data projection to the read options.
@@ -84,7 +83,7 @@ const FeatureFormat = function() {
* @return {module:ol/format/Feature~ReadOptions|undefined} Options. * @return {module:ol/format/Feature~ReadOptions|undefined} Options.
* @protected * @protected
*/ */
FeatureFormat.prototype.getReadOptions = function(source, opt_options) { getReadOptions(source, opt_options) {
let options; let options;
if (opt_options) { if (opt_options) {
options = { options = {
@@ -94,8 +93,7 @@ FeatureFormat.prototype.getReadOptions = function(source, opt_options) {
}; };
} }
return this.adaptOptions(options); return this.adaptOptions(options);
}; }
/** /**
* Sets the `dataProjection` on the options, if no `dataProjection` * Sets the `dataProjection` on the options, if no `dataProjection`
@@ -106,29 +104,26 @@ FeatureFormat.prototype.getReadOptions = function(source, opt_options) {
* @return {module:ol/format/Feature~WriteOptions|module:ol/format/Feature~ReadOptions|undefined} * @return {module:ol/format/Feature~WriteOptions|module:ol/format/Feature~ReadOptions|undefined}
* Updated options. * Updated options.
*/ */
FeatureFormat.prototype.adaptOptions = function(options) { adaptOptions(options) {
return assign({ return assign({
dataProjection: this.dataProjection, dataProjection: this.dataProjection,
featureProjection: this.defaultFeatureProjection featureProjection: this.defaultFeatureProjection
}, options); }, options);
}; }
/** /**
* Get the extent from the source of the last {@link readFeatures} call. * Get the extent from the source of the last {@link readFeatures} call.
* @return {module:ol/extent~Extent} Tile extent. * @return {module:ol/extent~Extent} Tile extent.
*/ */
FeatureFormat.prototype.getLastExtent = function() { getLastExtent() {
return null; return null;
}; }
/** /**
* @abstract * @abstract
* @return {module:ol/format/FormatType} Format. * @return {module:ol/format/FormatType} Format.
*/ */
FeatureFormat.prototype.getType = function() {}; getType() {}
/** /**
* Read a single feature from a source. * Read a single feature from a source.
@@ -138,8 +133,7 @@ FeatureFormat.prototype.getType = function() {};
* @param {module:ol/format/Feature~ReadOptions=} opt_options Read options. * @param {module:ol/format/Feature~ReadOptions=} opt_options Read options.
* @return {module:ol/Feature} Feature. * @return {module:ol/Feature} Feature.
*/ */
FeatureFormat.prototype.readFeature = function(source, opt_options) {}; readFeature(source, opt_options) {}
/** /**
* Read all features from a source. * Read all features from a source.
@@ -149,8 +143,7 @@ FeatureFormat.prototype.readFeature = function(source, opt_options) {};
* @param {module:ol/format/Feature~ReadOptions=} opt_options Read options. * @param {module:ol/format/Feature~ReadOptions=} opt_options Read options.
* @return {Array.<module:ol/Feature>} Features. * @return {Array.<module:ol/Feature>} Features.
*/ */
FeatureFormat.prototype.readFeatures = function(source, opt_options) {}; readFeatures(source, opt_options) {}
/** /**
* Read a single geometry from a source. * Read a single geometry from a source.
@@ -160,8 +153,7 @@ FeatureFormat.prototype.readFeatures = function(source, opt_options) {};
* @param {module:ol/format/Feature~ReadOptions=} opt_options Read options. * @param {module:ol/format/Feature~ReadOptions=} opt_options Read options.
* @return {module:ol/geom/Geometry} Geometry. * @return {module:ol/geom/Geometry} Geometry.
*/ */
FeatureFormat.prototype.readGeometry = function(source, opt_options) {}; readGeometry(source, opt_options) {}
/** /**
* Read the projection from a source. * Read the projection from a source.
@@ -170,8 +162,7 @@ FeatureFormat.prototype.readGeometry = function(source, opt_options) {};
* @param {Document|Node|Object|string} source Source. * @param {Document|Node|Object|string} source Source.
* @return {module:ol/proj/Projection} Projection. * @return {module:ol/proj/Projection} Projection.
*/ */
FeatureFormat.prototype.readProjection = function(source) {}; readProjection(source) {}
/** /**
* Encode a feature in this format. * Encode a feature in this format.
@@ -181,8 +172,7 @@ FeatureFormat.prototype.readProjection = function(source) {};
* @param {module:ol/format/Feature~WriteOptions=} opt_options Write options. * @param {module:ol/format/Feature~WriteOptions=} opt_options Write options.
* @return {string} Result. * @return {string} Result.
*/ */
FeatureFormat.prototype.writeFeature = function(feature, opt_options) {}; writeFeature(feature, opt_options) {}
/** /**
* Encode an array of features in this format. * Encode an array of features in this format.
@@ -192,8 +182,7 @@ FeatureFormat.prototype.writeFeature = function(feature, opt_options) {};
* @param {module:ol/format/Feature~WriteOptions=} opt_options Write options. * @param {module:ol/format/Feature~WriteOptions=} opt_options Write options.
* @return {string} Result. * @return {string} Result.
*/ */
FeatureFormat.prototype.writeFeatures = function(features, opt_options) {}; writeFeatures(features, opt_options) {}
/** /**
* Write a single geometry in this format. * Write a single geometry in this format.
@@ -203,7 +192,8 @@ FeatureFormat.prototype.writeFeatures = function(features, opt_options) {};
* @param {module:ol/format/Feature~WriteOptions=} opt_options Write options. * @param {module:ol/format/Feature~WriteOptions=} opt_options Write options.
* @return {string} Result. * @return {string} Result.
*/ */
FeatureFormat.prototype.writeGeometry = function(geometry, opt_options) {}; writeGeometry(geometry, opt_options) {}
}
export default FeatureFormat; export default FeatureFormat;
-2
View File
@@ -9,10 +9,8 @@ import GML3 from '../format/GML3.js';
* version 3.1.1. * version 3.1.1.
* Currently only supports GML 3.1.1 Simple Features profile. * Currently only supports GML 3.1.1 Simple Features profile.
* *
* @constructor
* @param {module:ol/format/GMLBase~Options=} opt_options * @param {module:ol/format/GMLBase~Options=} opt_options
* Optional configuration object. * Optional configuration object.
* @extends {module:ol/format/GMLBase}
* @api * @api
*/ */
const GML = GML3; const GML = GML3;
+74 -110
View File
@@ -1,7 +1,6 @@
/** /**
* @module ol/format/GML2 * @module ol/format/GML2
*/ */
import {inherits} from '../util.js';
import {createOrUpdate} from '../extent.js'; import {createOrUpdate} from '../extent.js';
import {transformWithOptions} from '../format/Feature.js'; import {transformWithOptions} from '../format/Feature.js';
import GMLBase, {GMLNS} from '../format/GMLBase.js'; import GMLBase, {GMLNS} from '../format/GMLBase.js';
@@ -20,25 +19,39 @@ import {createElementNS, getAllTextContent, makeArrayPusher, makeChildAppender,
const schemaLocation = GMLNS + ' http://schemas.opengis.net/gml/2.1.2/feature.xsd'; const schemaLocation = GMLNS + ' http://schemas.opengis.net/gml/2.1.2/feature.xsd';
/**
* @const
* @type {Object.<string, string>}
*/
const MULTIGEOMETRY_TO_MEMBER_NODENAME = {
'MultiLineString': 'lineStringMember',
'MultiCurve': 'curveMember',
'MultiPolygon': 'polygonMember',
'MultiSurface': 'surfaceMember'
};
/** /**
* @classdesc * @classdesc
* Feature format for reading and writing data in the GML format, * Feature format for reading and writing data in the GML format,
* version 2.1.2. * version 2.1.2.
* *
* @constructor
* @param {module:ol/format/GMLBase~Options=} opt_options Optional configuration object.
* @extends {module:ol/format/GMLBase}
* @api * @api
*/ */
const GML2 = function(opt_options) { class GML2 extends GMLBase {
/**
* @param {module:ol/format/GMLBase~Options=} opt_options Optional configuration object.
*/
constructor(opt_options) {
const options = /** @type {module:ol/format/GMLBase~Options} */ const options = /** @type {module:ol/format/GMLBase~Options} */
(opt_options ? opt_options : {}); (opt_options ? opt_options : {});
GMLBase.call(this, options); super(options);
this.FEATURE_COLLECTION_PARSERS[GMLNS][ this.FEATURE_COLLECTION_PARSERS[GMLNS][
'featureMember'] = 'featureMember'] =
makeArrayPusher(GMLBase.prototype.readFeaturesInternal); makeArrayPusher(this.readFeaturesInternal);
/** /**
* @inheritDoc * @inheritDoc
@@ -46,10 +59,7 @@ const GML2 = function(opt_options) {
this.schemaLocation = options.schemaLocation ? this.schemaLocation = options.schemaLocation ?
options.schemaLocation : schemaLocation; options.schemaLocation : schemaLocation;
}; }
inherits(GML2, GMLBase);
/** /**
* @param {Node} node Node. * @param {Node} node Node.
@@ -57,7 +67,7 @@ inherits(GML2, GMLBase);
* @private * @private
* @return {Array.<number>|undefined} Flat coordinates. * @return {Array.<number>|undefined} Flat coordinates.
*/ */
GML2.prototype.readFlatCoordinates_ = function(node, objectStack) { readFlatCoordinates_(node, objectStack) {
const s = getAllTextContent(node, false).replace(/^\s*|\s*$/g, ''); const s = getAllTextContent(node, false).replace(/^\s*|\s*$/g, '');
const context = /** @type {module:ol/xml~NodeStackItem} */ (objectStack[0]); const context = /** @type {module:ol/xml~NodeStackItem} */ (objectStack[0]);
const containerSrs = context['srsName']; const containerSrs = context['srsName'];
@@ -82,8 +92,7 @@ GML2.prototype.readFlatCoordinates_ = function(node, objectStack) {
} }
} }
return flatCoordinates; return flatCoordinates;
}; }
/** /**
* @param {Node} node Node. * @param {Node} node Node.
@@ -91,22 +100,21 @@ GML2.prototype.readFlatCoordinates_ = function(node, objectStack) {
* @private * @private
* @return {module:ol/extent~Extent|undefined} Envelope. * @return {module:ol/extent~Extent|undefined} Envelope.
*/ */
GML2.prototype.readBox_ = function(node, objectStack) { readBox_(node, objectStack) {
/** @type {Array.<number>} */ /** @type {Array.<number>} */
const flatCoordinates = pushParseAndPop([null], const flatCoordinates = pushParseAndPop([null],
this.BOX_PARSERS_, node, objectStack, this); this.BOX_PARSERS_, node, objectStack, this);
return createOrUpdate(flatCoordinates[1][0], return createOrUpdate(flatCoordinates[1][0],
flatCoordinates[1][1], flatCoordinates[1][3], flatCoordinates[1][1], flatCoordinates[1][3],
flatCoordinates[1][4]); flatCoordinates[1][4]);
}; }
/** /**
* @param {Node} node Node. * @param {Node} node Node.
* @param {Array.<*>} objectStack Object stack. * @param {Array.<*>} objectStack Object stack.
* @private * @private
*/ */
GML2.prototype.innerBoundaryIsParser_ = function(node, objectStack) { innerBoundaryIsParser_(node, objectStack) {
/** @type {Array.<number>|undefined} */ /** @type {Array.<number>|undefined} */
const flatLinearRing = pushParseAndPop(undefined, const flatLinearRing = pushParseAndPop(undefined,
this.RING_PARSERS, node, objectStack, this); this.RING_PARSERS, node, objectStack, this);
@@ -115,15 +123,14 @@ GML2.prototype.innerBoundaryIsParser_ = function(node, objectStack) {
(objectStack[objectStack.length - 1]); (objectStack[objectStack.length - 1]);
flatLinearRings.push(flatLinearRing); flatLinearRings.push(flatLinearRing);
} }
}; }
/** /**
* @param {Node} node Node. * @param {Node} node Node.
* @param {Array.<*>} objectStack Object stack. * @param {Array.<*>} objectStack Object stack.
* @private * @private
*/ */
GML2.prototype.outerBoundaryIsParser_ = function(node, objectStack) { outerBoundaryIsParser_(node, objectStack) {
/** @type {Array.<number>|undefined} */ /** @type {Array.<number>|undefined} */
const flatLinearRing = pushParseAndPop(undefined, const flatLinearRing = pushParseAndPop(undefined,
this.RING_PARSERS, node, objectStack, this); this.RING_PARSERS, node, objectStack, this);
@@ -132,8 +139,7 @@ GML2.prototype.outerBoundaryIsParser_ = function(node, objectStack) {
(objectStack[objectStack.length - 1]); (objectStack[objectStack.length - 1]);
flatLinearRings[0] = flatLinearRing; flatLinearRings[0] = flatLinearRing;
} }
}; }
/** /**
* @const * @const
@@ -143,7 +149,7 @@ GML2.prototype.outerBoundaryIsParser_ = function(node, objectStack) {
* @return {Node|undefined} Node. * @return {Node|undefined} Node.
* @private * @private
*/ */
GML2.prototype.GEOMETRY_NODE_FACTORY_ = function(value, objectStack, opt_nodeName) { GEOMETRY_NODE_FACTORY_(value, objectStack, opt_nodeName) {
const context = objectStack[objectStack.length - 1]; const context = objectStack[objectStack.length - 1];
const multiSurface = context['multiSurface']; const multiSurface = context['multiSurface'];
const surface = context['surface']; const surface = context['surface'];
@@ -163,15 +169,14 @@ GML2.prototype.GEOMETRY_NODE_FACTORY_ = function(value, objectStack, opt_nodeNam
} }
return createElementNS('http://www.opengis.net/gml', return createElementNS('http://www.opengis.net/gml',
nodeName); nodeName);
}; }
/** /**
* @param {Node} node Node. * @param {Node} node Node.
* @param {module:ol/Feature} feature Feature. * @param {module:ol/Feature} feature Feature.
* @param {Array.<*>} objectStack Node stack. * @param {Array.<*>} objectStack Node stack.
*/ */
GML2.prototype.writeFeatureElement = function(node, feature, objectStack) { writeFeatureElement(node, feature, objectStack) {
const fid = feature.getId(); const fid = feature.getId();
if (fid) { if (fid) {
node.setAttribute('fid', fid); node.setAttribute('fid', fid);
@@ -210,8 +215,7 @@ GML2.prototype.writeFeatureElement = function(node, feature, objectStack) {
makeSimpleNodeFactory(undefined, featureNS), makeSimpleNodeFactory(undefined, featureNS),
values, values,
objectStack, keys); objectStack, keys);
}; }
/** /**
* @param {Node} node Node. * @param {Node} node Node.
@@ -219,7 +223,7 @@ GML2.prototype.writeFeatureElement = function(node, feature, objectStack) {
* @param {Array.<*>} objectStack Node stack. * @param {Array.<*>} objectStack Node stack.
* @private * @private
*/ */
GML2.prototype.writeCurveOrLineString_ = function(node, geometry, objectStack) { writeCurveOrLineString_(node, geometry, objectStack) {
const context = objectStack[objectStack.length - 1]; const context = objectStack[objectStack.length - 1];
const srsName = context['srsName']; const srsName = context['srsName'];
if (node.nodeName !== 'LineStringSegment' && srsName) { if (node.nodeName !== 'LineStringSegment' && srsName) {
@@ -236,8 +240,7 @@ GML2.prototype.writeCurveOrLineString_ = function(node, geometry, objectStack) {
this.writeCurveSegments_(segments, this.writeCurveSegments_(segments,
geometry, objectStack); geometry, objectStack);
} }
}; }
/** /**
* @param {Node} node Node. * @param {Node} node Node.
@@ -245,14 +248,13 @@ GML2.prototype.writeCurveOrLineString_ = function(node, geometry, objectStack) {
* @param {Array.<*>} objectStack Node stack. * @param {Array.<*>} objectStack Node stack.
* @private * @private
*/ */
GML2.prototype.writeLineStringOrCurveMember_ = function(node, line, objectStack) { writeLineStringOrCurveMember_(node, line, objectStack) {
const child = this.GEOMETRY_NODE_FACTORY_(line, objectStack); const child = this.GEOMETRY_NODE_FACTORY_(line, objectStack);
if (child) { if (child) {
node.appendChild(child); node.appendChild(child);
this.writeCurveOrLineString_(child, line, objectStack); this.writeCurveOrLineString_(child, line, objectStack);
} }
}; }
/** /**
* @param {Node} node Node. * @param {Node} node Node.
@@ -260,7 +262,7 @@ GML2.prototype.writeLineStringOrCurveMember_ = function(node, line, objectStack)
* @param {Array.<*>} objectStack Node stack. * @param {Array.<*>} objectStack Node stack.
* @private * @private
*/ */
GML2.prototype.writeMultiCurveOrLineString_ = function(node, geometry, objectStack) { writeMultiCurveOrLineString_(node, geometry, objectStack) {
const context = objectStack[objectStack.length - 1]; const context = objectStack[objectStack.length - 1];
const hasZ = context['hasZ']; const hasZ = context['hasZ'];
const srsName = context['srsName']; const srsName = context['srsName'];
@@ -273,15 +275,14 @@ GML2.prototype.writeMultiCurveOrLineString_ = function(node, geometry, objectSta
this.LINESTRINGORCURVEMEMBER_SERIALIZERS_, this.LINESTRINGORCURVEMEMBER_SERIALIZERS_,
this.MULTIGEOMETRY_MEMBER_NODE_FACTORY_, lines, this.MULTIGEOMETRY_MEMBER_NODE_FACTORY_, lines,
objectStack, undefined, this); objectStack, undefined, this);
}; }
/** /**
* @param {Node} node Node. * @param {Node} node Node.
* @param {module:ol/geom/Geometry|module:ol/extent~Extent} geometry Geometry. * @param {module:ol/geom/Geometry|module:ol/extent~Extent} geometry Geometry.
* @param {Array.<*>} objectStack Node stack. * @param {Array.<*>} objectStack Node stack.
*/ */
GML2.prototype.writeGeometryElement = function(node, geometry, objectStack) { writeGeometryElement(node, geometry, objectStack) {
const context = /** @type {module:ol/format/Feature~WriteOptions} */ (objectStack[objectStack.length - 1]); const context = /** @type {module:ol/format/Feature~WriteOptions} */ (objectStack[objectStack.length - 1]);
const item = assign({}, context); const item = assign({}, context);
item.node = node; item.node = node;
@@ -300,23 +301,21 @@ GML2.prototype.writeGeometryElement = function(node, geometry, objectStack) {
(item), this.GEOMETRY_SERIALIZERS_, (item), this.GEOMETRY_SERIALIZERS_,
this.GEOMETRY_NODE_FACTORY_, [value], this.GEOMETRY_NODE_FACTORY_, [value],
objectStack, undefined, this); objectStack, undefined, this);
}; }
/** /**
* @param {string} namespaceURI XML namespace. * @param {string} namespaceURI XML namespace.
* @returns {Node} coordinates node. * @returns {Node} coordinates node.
* @private * @private
*/ */
GML2.prototype.createCoordinatesNode_ = function(namespaceURI) { createCoordinatesNode_(namespaceURI) {
const coordinates = createElementNS(namespaceURI, 'coordinates'); const coordinates = createElementNS(namespaceURI, 'coordinates');
coordinates.setAttribute('decimal', '.'); coordinates.setAttribute('decimal', '.');
coordinates.setAttribute('cs', ','); coordinates.setAttribute('cs', ',');
coordinates.setAttribute('ts', ' '); coordinates.setAttribute('ts', ' ');
return coordinates; return coordinates;
}; }
/** /**
* @param {Node} node Node. * @param {Node} node Node.
@@ -324,7 +323,7 @@ GML2.prototype.createCoordinatesNode_ = function(namespaceURI) {
* @param {Array.<*>} objectStack Node stack. * @param {Array.<*>} objectStack Node stack.
* @private * @private
*/ */
GML2.prototype.writeCoordinates_ = function(node, value, objectStack) { writeCoordinates_(node, value, objectStack) {
const context = objectStack[objectStack.length - 1]; const context = objectStack[objectStack.length - 1];
const hasZ = context['hasZ']; const hasZ = context['hasZ'];
const srsName = context['srsName']; const srsName = context['srsName'];
@@ -337,8 +336,7 @@ GML2.prototype.writeCoordinates_ = function(node, value, objectStack) {
parts[i] = this.getCoords_(point, srsName, hasZ); parts[i] = this.getCoords_(point, srsName, hasZ);
} }
writeStringTextNode(node, parts.join(' ')); writeStringTextNode(node, parts.join(' '));
}; }
/** /**
* @param {Node} node Node. * @param {Node} node Node.
@@ -346,12 +344,11 @@ GML2.prototype.writeCoordinates_ = function(node, value, objectStack) {
* @param {Array.<*>} objectStack Node stack. * @param {Array.<*>} objectStack Node stack.
* @private * @private
*/ */
GML2.prototype.writeCurveSegments_ = function(node, line, objectStack) { writeCurveSegments_(node, line, objectStack) {
const child = createElementNS(node.namespaceURI, 'LineStringSegment'); const child = createElementNS(node.namespaceURI, 'LineStringSegment');
node.appendChild(child); node.appendChild(child);
this.writeCurveOrLineString_(child, line, objectStack); this.writeCurveOrLineString_(child, line, objectStack);
}; }
/** /**
* @param {Node} node Node. * @param {Node} node Node.
@@ -359,7 +356,7 @@ GML2.prototype.writeCurveSegments_ = function(node, line, objectStack) {
* @param {Array.<*>} objectStack Node stack. * @param {Array.<*>} objectStack Node stack.
* @private * @private
*/ */
GML2.prototype.writeSurfaceOrPolygon_ = function(node, geometry, objectStack) { writeSurfaceOrPolygon_(node, geometry, objectStack) {
const context = objectStack[objectStack.length - 1]; const context = objectStack[objectStack.length - 1];
const hasZ = context['hasZ']; const hasZ = context['hasZ'];
const srsName = context['srsName']; const srsName = context['srsName'];
@@ -379,8 +376,7 @@ GML2.prototype.writeSurfaceOrPolygon_ = function(node, geometry, objectStack) {
this.writeSurfacePatches_( this.writeSurfacePatches_(
patches, geometry, objectStack); patches, geometry, objectStack);
} }
}; }
/** /**
* @param {*} value Value. * @param {*} value Value.
@@ -389,7 +385,7 @@ GML2.prototype.writeSurfaceOrPolygon_ = function(node, geometry, objectStack) {
* @return {Node} Node. * @return {Node} Node.
* @private * @private
*/ */
GML2.prototype.RING_NODE_FACTORY_ = function(value, objectStack, opt_nodeName) { RING_NODE_FACTORY_(value, objectStack, opt_nodeName) {
const context = objectStack[objectStack.length - 1]; const context = objectStack[objectStack.length - 1];
const parentNode = context.node; const parentNode = context.node;
const exteriorWritten = context['exteriorWritten']; const exteriorWritten = context['exteriorWritten'];
@@ -398,8 +394,7 @@ GML2.prototype.RING_NODE_FACTORY_ = function(value, objectStack, opt_nodeName) {
} }
return createElementNS(parentNode.namespaceURI, return createElementNS(parentNode.namespaceURI,
exteriorWritten !== undefined ? 'innerBoundaryIs' : 'outerBoundaryIs'); exteriorWritten !== undefined ? 'innerBoundaryIs' : 'outerBoundaryIs');
}; }
/** /**
* @param {Node} node Node. * @param {Node} node Node.
@@ -407,12 +402,11 @@ GML2.prototype.RING_NODE_FACTORY_ = function(value, objectStack, opt_nodeName) {
* @param {Array.<*>} objectStack Node stack. * @param {Array.<*>} objectStack Node stack.
* @private * @private
*/ */
GML2.prototype.writeSurfacePatches_ = function(node, polygon, objectStack) { writeSurfacePatches_(node, polygon, objectStack) {
const child = createElementNS(node.namespaceURI, 'PolygonPatch'); const child = createElementNS(node.namespaceURI, 'PolygonPatch');
node.appendChild(child); node.appendChild(child);
this.writeSurfaceOrPolygon_(child, polygon, objectStack); this.writeSurfaceOrPolygon_(child, polygon, objectStack);
}; }
/** /**
* @param {Node} node Node. * @param {Node} node Node.
@@ -420,12 +414,11 @@ GML2.prototype.writeSurfacePatches_ = function(node, polygon, objectStack) {
* @param {Array.<*>} objectStack Node stack. * @param {Array.<*>} objectStack Node stack.
* @private * @private
*/ */
GML2.prototype.writeRing_ = function(node, ring, objectStack) { writeRing_(node, ring, objectStack) {
const linearRing = createElementNS(node.namespaceURI, 'LinearRing'); const linearRing = createElementNS(node.namespaceURI, 'LinearRing');
node.appendChild(linearRing); node.appendChild(linearRing);
this.writeLinearRing_(linearRing, ring, objectStack); this.writeLinearRing_(linearRing, ring, objectStack);
}; }
/** /**
* @param {Array.<number>} point Point geometry. * @param {Array.<number>} point Point geometry.
@@ -434,7 +427,7 @@ GML2.prototype.writeRing_ = function(node, ring, objectStack) {
* @return {string} The coords string. * @return {string} The coords string.
* @private * @private
*/ */
GML2.prototype.getCoords_ = function(point, opt_srsName, opt_hasZ) { getCoords_(point, opt_srsName, opt_hasZ) {
let axisOrientation = 'enu'; let axisOrientation = 'enu';
if (opt_srsName) { if (opt_srsName) {
axisOrientation = getProjection(opt_srsName).getAxisOrientation(); axisOrientation = getProjection(opt_srsName).getAxisOrientation();
@@ -449,8 +442,7 @@ GML2.prototype.getCoords_ = function(point, opt_srsName, opt_hasZ) {
} }
return coords; return coords;
}; }
/** /**
* @param {Node} node Node. * @param {Node} node Node.
@@ -458,7 +450,7 @@ GML2.prototype.getCoords_ = function(point, opt_srsName, opt_hasZ) {
* @param {Array.<*>} objectStack Node stack. * @param {Array.<*>} objectStack Node stack.
* @private * @private
*/ */
GML2.prototype.writePoint_ = function(node, geometry, objectStack) { writePoint_(node, geometry, objectStack) {
const context = objectStack[objectStack.length - 1]; const context = objectStack[objectStack.length - 1];
const hasZ = context['hasZ']; const hasZ = context['hasZ'];
const srsName = context['srsName']; const srsName = context['srsName'];
@@ -470,8 +462,7 @@ GML2.prototype.writePoint_ = function(node, geometry, objectStack) {
const point = geometry.getCoordinates(); const point = geometry.getCoordinates();
const coord = this.getCoords_(point, srsName, hasZ); const coord = this.getCoords_(point, srsName, hasZ);
writeStringTextNode(coordinates, coord); writeStringTextNode(coordinates, coord);
}; }
/** /**
* @param {Node} node Node. * @param {Node} node Node.
@@ -479,7 +470,7 @@ GML2.prototype.writePoint_ = function(node, geometry, objectStack) {
* @param {Array.<*>} objectStack Node stack. * @param {Array.<*>} objectStack Node stack.
* @private * @private
*/ */
GML2.prototype.writeMultiPoint_ = function(node, geometry, objectStack) { writeMultiPoint_(node, geometry, objectStack) {
const context = objectStack[objectStack.length - 1]; const context = objectStack[objectStack.length - 1];
const hasZ = context['hasZ']; const hasZ = context['hasZ'];
const srsName = context['srsName']; const srsName = context['srsName'];
@@ -491,8 +482,7 @@ GML2.prototype.writeMultiPoint_ = function(node, geometry, objectStack) {
this.POINTMEMBER_SERIALIZERS_, this.POINTMEMBER_SERIALIZERS_,
makeSimpleNodeFactory('pointMember'), points, makeSimpleNodeFactory('pointMember'), points,
objectStack, undefined, this); objectStack, undefined, this);
}; }
/** /**
* @param {Node} node Node. * @param {Node} node Node.
@@ -500,12 +490,11 @@ GML2.prototype.writeMultiPoint_ = function(node, geometry, objectStack) {
* @param {Array.<*>} objectStack Node stack. * @param {Array.<*>} objectStack Node stack.
* @private * @private
*/ */
GML2.prototype.writePointMember_ = function(node, point, objectStack) { writePointMember_(node, point, objectStack) {
const child = createElementNS(node.namespaceURI, 'Point'); const child = createElementNS(node.namespaceURI, 'Point');
node.appendChild(child); node.appendChild(child);
this.writePoint_(child, point, objectStack); this.writePoint_(child, point, objectStack);
}; }
/** /**
* @param {Node} node Node. * @param {Node} node Node.
@@ -513,7 +502,7 @@ GML2.prototype.writePointMember_ = function(node, point, objectStack) {
* @param {Array.<*>} objectStack Node stack. * @param {Array.<*>} objectStack Node stack.
* @private * @private
*/ */
GML2.prototype.writeLinearRing_ = function(node, geometry, objectStack) { writeLinearRing_(node, geometry, objectStack) {
const context = objectStack[objectStack.length - 1]; const context = objectStack[objectStack.length - 1];
const srsName = context['srsName']; const srsName = context['srsName'];
if (srsName) { if (srsName) {
@@ -522,8 +511,7 @@ GML2.prototype.writeLinearRing_ = function(node, geometry, objectStack) {
const coordinates = this.createCoordinatesNode_(node.namespaceURI); const coordinates = this.createCoordinatesNode_(node.namespaceURI);
node.appendChild(coordinates); node.appendChild(coordinates);
this.writeCoordinates_(coordinates, geometry, objectStack); this.writeCoordinates_(coordinates, geometry, objectStack);
}; }
/** /**
* @param {Node} node Node. * @param {Node} node Node.
@@ -531,7 +519,7 @@ GML2.prototype.writeLinearRing_ = function(node, geometry, objectStack) {
* @param {Array.<*>} objectStack Node stack. * @param {Array.<*>} objectStack Node stack.
* @private * @private
*/ */
GML2.prototype.writeMultiSurfaceOrPolygon_ = function(node, geometry, objectStack) { writeMultiSurfaceOrPolygon_(node, geometry, objectStack) {
const context = objectStack[objectStack.length - 1]; const context = objectStack[objectStack.length - 1];
const hasZ = context['hasZ']; const hasZ = context['hasZ'];
const srsName = context['srsName']; const srsName = context['srsName'];
@@ -544,8 +532,7 @@ GML2.prototype.writeMultiSurfaceOrPolygon_ = function(node, geometry, objectStac
this.SURFACEORPOLYGONMEMBER_SERIALIZERS_, this.SURFACEORPOLYGONMEMBER_SERIALIZERS_,
this.MULTIGEOMETRY_MEMBER_NODE_FACTORY_, polygons, this.MULTIGEOMETRY_MEMBER_NODE_FACTORY_, polygons,
objectStack, undefined, this); objectStack, undefined, this);
}; }
/** /**
* @param {Node} node Node. * @param {Node} node Node.
@@ -553,15 +540,14 @@ GML2.prototype.writeMultiSurfaceOrPolygon_ = function(node, geometry, objectStac
* @param {Array.<*>} objectStack Node stack. * @param {Array.<*>} objectStack Node stack.
* @private * @private
*/ */
GML2.prototype.writeSurfaceOrPolygonMember_ = function(node, polygon, objectStack) { writeSurfaceOrPolygonMember_(node, polygon, objectStack) {
const child = this.GEOMETRY_NODE_FACTORY_( const child = this.GEOMETRY_NODE_FACTORY_(
polygon, objectStack); polygon, objectStack);
if (child) { if (child) {
node.appendChild(child); node.appendChild(child);
this.writeSurfaceOrPolygon_(child, polygon, objectStack); this.writeSurfaceOrPolygon_(child, polygon, objectStack);
} }
}; }
/** /**
* @param {Node} node Node. * @param {Node} node Node.
@@ -569,7 +555,7 @@ GML2.prototype.writeSurfaceOrPolygonMember_ = function(node, polygon, objectStac
* @param {Array.<*>} objectStack Node stack. * @param {Array.<*>} objectStack Node stack.
* @private * @private
*/ */
GML2.prototype.writeEnvelope = function(node, extent, objectStack) { writeEnvelope(node, extent, objectStack) {
const context = objectStack[objectStack.length - 1]; const context = objectStack[objectStack.length - 1];
const srsName = context['srsName']; const srsName = context['srsName'];
if (srsName) { if (srsName) {
@@ -582,20 +568,7 @@ GML2.prototype.writeEnvelope = function(node, extent, objectStack) {
OBJECT_PROPERTY_NODE_FACTORY, OBJECT_PROPERTY_NODE_FACTORY,
values, values,
objectStack, keys, this); objectStack, keys, this);
}; }
/**
* @const
* @type {Object.<string, string>}
*/
const MULTIGEOMETRY_TO_MEMBER_NODENAME = {
'MultiLineString': 'lineStringMember',
'MultiCurve': 'curveMember',
'MultiPolygon': 'polygonMember',
'MultiSurface': 'surfaceMember'
};
/** /**
* @const * @const
@@ -605,12 +578,12 @@ const MULTIGEOMETRY_TO_MEMBER_NODENAME = {
* @return {Node|undefined} Node. * @return {Node|undefined} Node.
* @private * @private
*/ */
GML2.prototype.MULTIGEOMETRY_MEMBER_NODE_FACTORY_ = function(value, objectStack, opt_nodeName) { MULTIGEOMETRY_MEMBER_NODE_FACTORY_(value, objectStack, opt_nodeName) {
const parentNode = objectStack[objectStack.length - 1].node; const parentNode = objectStack[objectStack.length - 1].node;
return createElementNS('http://www.opengis.net/gml', return createElementNS('http://www.opengis.net/gml',
MULTIGEOMETRY_TO_MEMBER_NODENAME[parentNode.nodeName]); MULTIGEOMETRY_TO_MEMBER_NODENAME[parentNode.nodeName]);
}; }
}
/** /**
* @const * @const
@@ -623,7 +596,6 @@ GML2.prototype.GEOMETRY_FLAT_COORDINATES_PARSERS_ = {
} }
}; };
/** /**
* @const * @const
* @type {Object.<string, Object.<string, module:ol/xml~Parser>>} * @type {Object.<string, Object.<string, module:ol/xml~Parser>>}
@@ -636,7 +608,6 @@ GML2.prototype.FLAT_LINEAR_RINGS_PARSERS_ = {
} }
}; };
/** /**
* @const * @const
* @type {Object.<string, Object.<string, module:ol/xml~Parser>>} * @type {Object.<string, Object.<string, module:ol/xml~Parser>>}
@@ -649,7 +620,6 @@ GML2.prototype.BOX_PARSERS_ = {
} }
}; };
/** /**
* @const * @const
* @type {Object.<string, Object.<string, module:ol/xml~Parser>>} * @type {Object.<string, Object.<string, module:ol/xml~Parser>>}
@@ -673,7 +643,6 @@ GML2.prototype.GEOMETRY_PARSERS_ = {
} }
}; };
/** /**
* @const * @const
* @type {Object.<string, Object.<string, module:ol/xml~Serializer>>} * @type {Object.<string, Object.<string, module:ol/xml~Serializer>>}
@@ -707,7 +676,6 @@ GML2.prototype.GEOMETRY_SERIALIZERS_ = {
} }
}; };
/** /**
* @type {Object.<string, Object.<string, module:ol/xml~Serializer>>} * @type {Object.<string, Object.<string, module:ol/xml~Serializer>>}
* @private * @private
@@ -721,7 +689,6 @@ GML2.prototype.LINESTRINGORCURVEMEMBER_SERIALIZERS_ = {
} }
}; };
/** /**
* @type {Object.<string, Object.<string, module:ol/xml~Serializer>>} * @type {Object.<string, Object.<string, module:ol/xml~Serializer>>}
* @private * @private
@@ -733,7 +700,6 @@ GML2.prototype.RING_SERIALIZERS_ = {
} }
}; };
/** /**
* @type {Object.<string, Object.<string, module:ol/xml~Serializer>>} * @type {Object.<string, Object.<string, module:ol/xml~Serializer>>}
* @private * @private
@@ -745,7 +711,6 @@ GML2.prototype.POINTMEMBER_SERIALIZERS_ = {
} }
}; };
/** /**
* @const * @const
* @type {Object.<string, Object.<string, module:ol/xml~Serializer>>} * @type {Object.<string, Object.<string, module:ol/xml~Serializer>>}
@@ -760,7 +725,6 @@ GML2.prototype.SURFACEORPOLYGONMEMBER_SERIALIZERS_ = {
} }
}; };
/** /**
* @type {Object.<string, Object.<string, module:ol/xml~Serializer>>} * @type {Object.<string, Object.<string, module:ol/xml~Serializer>>}
* @private * @private
+589 -632
View File
File diff suppressed because it is too large Load Diff
+86 -116
View File
@@ -4,7 +4,6 @@
// FIXME Envelopes should not be treated as geometries! readEnvelope_ is part // FIXME Envelopes should not be treated as geometries! readEnvelope_ is part
// of GEOMETRY_PARSERS_ and methods using GEOMETRY_PARSERS_ do not expect // of GEOMETRY_PARSERS_ and methods using GEOMETRY_PARSERS_ do not expect
// envelopes/extents, only geometries! // envelopes/extents, only geometries!
import {inherits} from '../util.js';
import {extend} from '../array.js'; import {extend} from '../array.js';
import Feature from '../Feature.js'; import Feature from '../Feature.js';
import {transformWithOptions} from '../format/Feature.js'; import {transformWithOptions} from '../format/Feature.js';
@@ -29,6 +28,20 @@ import {getAllTextContent, getAttributeNS, makeArrayPusher, makeReplacer, parseN
export const GMLNS = 'http://www.opengis.net/gml'; export const GMLNS = 'http://www.opengis.net/gml';
/**
* A regular expression that matches if a string only contains whitespace
* characters. It will e.g. match `''`, `' '`, `'\n'` etc. The non-breaking
* space (0xa0) is explicitly included as IE doesn't include it in its
* definition of `\s`.
*
* Information from `goog.string.isEmptyOrWhitespace`: https://github.com/google/closure-library/blob/e877b1e/closure/goog/string/string.js#L156-L160
*
* @const
* @type {RegExp}
*/
const ONLY_WHITESPACE_RE = /^[\s\xa0]*$/;
/** /**
* @typedef {Object} Options * @typedef {Object} Options
* @property {Object.<string, string>|string} [featureNS] Feature * @property {Object.<string, string>|string} [featureNS] Feature
@@ -69,13 +82,16 @@ export const GMLNS = 'http://www.opengis.net/gml';
* This class cannot be instantiated, it contains only base content that * This class cannot be instantiated, it contains only base content that
* is shared with versioned format classes GML2 and GML3. * is shared with versioned format classes GML2 and GML3.
* *
* @constructor
* @abstract * @abstract
* @param {module:ol/format/GMLBase~Options=} opt_options
* Optional configuration object.
* @extends {module:ol/format/XMLFeature}
*/ */
const GMLBase = function(opt_options) { class GMLBase extends XMLFeature {
/**
* @param {module:ol/format/GMLBase~Options=} opt_options Optional configuration object.
*/
constructor(opt_options) {
super();
const options = /** @type {module:ol/format/GMLBase~Options} */ (opt_options ? opt_options : {}); const options = /** @type {module:ol/format/GMLBase~Options} */ (opt_options ? opt_options : {});
/** /**
@@ -107,36 +123,18 @@ const GMLBase = function(opt_options) {
*/ */
this.FEATURE_COLLECTION_PARSERS = {}; this.FEATURE_COLLECTION_PARSERS = {};
this.FEATURE_COLLECTION_PARSERS[GMLNS] = { this.FEATURE_COLLECTION_PARSERS[GMLNS] = {
'featureMember': makeReplacer(GMLBase.prototype.readFeaturesInternal), 'featureMember': makeReplacer(this.readFeaturesInternal),
'featureMembers': makeReplacer(GMLBase.prototype.readFeaturesInternal) 'featureMembers': makeReplacer(this.readFeaturesInternal)
}; };
XMLFeature.call(this); }
};
inherits(GMLBase, XMLFeature);
/**
* A regular expression that matches if a string only contains whitespace
* characters. It will e.g. match `''`, `' '`, `'\n'` etc. The non-breaking
* space (0xa0) is explicitly included as IE doesn't include it in its
* definition of `\s`.
*
* Information from `goog.string.isEmptyOrWhitespace`: https://github.com/google/closure-library/blob/e877b1e/closure/goog/string/string.js#L156-L160
*
* @const
* @type {RegExp}
*/
const ONLY_WHITESPACE_RE = /^[\s\xa0]*$/;
/** /**
* @param {Node} node Node. * @param {Node} node Node.
* @param {Array.<*>} objectStack Object stack. * @param {Array.<*>} objectStack Object stack.
* @return {Array.<module:ol/Feature> | undefined} Features. * @return {Array.<module:ol/Feature> | undefined} Features.
*/ */
GMLBase.prototype.readFeaturesInternal = function(node, objectStack) { readFeaturesInternal(node, objectStack) {
const localName = node.localName; const localName = node.localName;
let features = null; let features = null;
if (localName == 'FeatureCollection') { if (localName == 'FeatureCollection') {
@@ -217,15 +215,14 @@ GMLBase.prototype.readFeaturesInternal = function(node, objectStack) {
features = []; features = [];
} }
return features; return features;
}; }
/** /**
* @param {Node} node Node. * @param {Node} node Node.
* @param {Array.<*>} objectStack Object stack. * @param {Array.<*>} objectStack Object stack.
* @return {module:ol/geom/Geometry|undefined} Geometry. * @return {module:ol/geom/Geometry|undefined} Geometry.
*/ */
GMLBase.prototype.readGeometryElement = function(node, objectStack) { readGeometryElement(node, objectStack) {
const context = /** @type {Object} */ (objectStack[0]); const context = /** @type {Object} */ (objectStack[0]);
context['srsName'] = node.firstElementChild.getAttribute('srsName'); context['srsName'] = node.firstElementChild.getAttribute('srsName');
context['srsDimension'] = node.firstElementChild.getAttribute('srsDimension'); context['srsDimension'] = node.firstElementChild.getAttribute('srsDimension');
@@ -238,15 +235,14 @@ GMLBase.prototype.readGeometryElement = function(node, objectStack) {
} else { } else {
return undefined; return undefined;
} }
}; }
/** /**
* @param {Node} node Node. * @param {Node} node Node.
* @param {Array.<*>} objectStack Object stack. * @param {Array.<*>} objectStack Object stack.
* @return {module:ol/Feature} Feature. * @return {module:ol/Feature} Feature.
*/ */
GMLBase.prototype.readFeatureElement = function(node, objectStack) { readFeatureElement(node, objectStack) {
let n; let n;
const fid = node.getAttribute('fid') || getAttributeNS(node, GMLNS, 'id'); const fid = node.getAttribute('fid') || getAttributeNS(node, GMLNS, 'id');
const values = {}; const values = {};
@@ -280,28 +276,26 @@ GMLBase.prototype.readFeatureElement = function(node, objectStack) {
feature.setId(fid); feature.setId(fid);
} }
return feature; return feature;
}; }
/** /**
* @param {Node} node Node. * @param {Node} node Node.
* @param {Array.<*>} objectStack Object stack. * @param {Array.<*>} objectStack Object stack.
* @return {module:ol/geom/Point|undefined} Point. * @return {module:ol/geom/Point|undefined} Point.
*/ */
GMLBase.prototype.readPoint = function(node, objectStack) { readPoint(node, objectStack) {
const flatCoordinates = this.readFlatCoordinatesFromNode_(node, objectStack); const flatCoordinates = this.readFlatCoordinatesFromNode_(node, objectStack);
if (flatCoordinates) { if (flatCoordinates) {
return new Point(flatCoordinates, GeometryLayout.XYZ); return new Point(flatCoordinates, GeometryLayout.XYZ);
} }
}; }
/** /**
* @param {Node} node Node. * @param {Node} node Node.
* @param {Array.<*>} objectStack Object stack. * @param {Array.<*>} objectStack Object stack.
* @return {module:ol/geom/MultiPoint|undefined} MultiPoint. * @return {module:ol/geom/MultiPoint|undefined} MultiPoint.
*/ */
GMLBase.prototype.readMultiPoint = function(node, objectStack) { readMultiPoint(node, objectStack) {
/** @type {Array.<Array.<number>>} */ /** @type {Array.<Array.<number>>} */
const coordinates = pushParseAndPop([], const coordinates = pushParseAndPop([],
this.MULTIPOINT_PARSERS_, node, objectStack, this); this.MULTIPOINT_PARSERS_, node, objectStack, this);
@@ -310,74 +304,68 @@ GMLBase.prototype.readMultiPoint = function(node, objectStack) {
} else { } else {
return undefined; return undefined;
} }
}; }
/** /**
* @param {Node} node Node. * @param {Node} node Node.
* @param {Array.<*>} objectStack Object stack. * @param {Array.<*>} objectStack Object stack.
* @return {module:ol/geom/MultiLineString|undefined} MultiLineString. * @return {module:ol/geom/MultiLineString|undefined} MultiLineString.
*/ */
GMLBase.prototype.readMultiLineString = function(node, objectStack) { readMultiLineString(node, objectStack) {
/** @type {Array.<module:ol/geom/LineString>} */ /** @type {Array.<module:ol/geom/LineString>} */
const lineStrings = pushParseAndPop([], const lineStrings = pushParseAndPop([],
this.MULTILINESTRING_PARSERS_, node, objectStack, this); this.MULTILINESTRING_PARSERS_, node, objectStack, this);
if (lineStrings) { if (lineStrings) {
return new MultiLineString(lineStrings); return new MultiLineString(lineStrings);
} }
}; }
/** /**
* @param {Node} node Node. * @param {Node} node Node.
* @param {Array.<*>} objectStack Object stack. * @param {Array.<*>} objectStack Object stack.
* @return {module:ol/geom/MultiPolygon|undefined} MultiPolygon. * @return {module:ol/geom/MultiPolygon|undefined} MultiPolygon.
*/ */
GMLBase.prototype.readMultiPolygon = function(node, objectStack) { readMultiPolygon(node, objectStack) {
/** @type {Array.<module:ol/geom/Polygon>} */ /** @type {Array.<module:ol/geom/Polygon>} */
const polygons = pushParseAndPop([], this.MULTIPOLYGON_PARSERS_, node, objectStack, this); const polygons = pushParseAndPop([], this.MULTIPOLYGON_PARSERS_, node, objectStack, this);
if (polygons) { if (polygons) {
return new MultiPolygon(polygons); return new MultiPolygon(polygons);
} }
}; }
/** /**
* @param {Node} node Node. * @param {Node} node Node.
* @param {Array.<*>} objectStack Object stack. * @param {Array.<*>} objectStack Object stack.
* @private * @private
*/ */
GMLBase.prototype.pointMemberParser_ = function(node, objectStack) { pointMemberParser_(node, objectStack) {
parseNode(this.POINTMEMBER_PARSERS_, node, objectStack, this); parseNode(this.POINTMEMBER_PARSERS_, node, objectStack, this);
}; }
/** /**
* @param {Node} node Node. * @param {Node} node Node.
* @param {Array.<*>} objectStack Object stack. * @param {Array.<*>} objectStack Object stack.
* @private * @private
*/ */
GMLBase.prototype.lineStringMemberParser_ = function(node, objectStack) { lineStringMemberParser_(node, objectStack) {
parseNode(this.LINESTRINGMEMBER_PARSERS_, node, objectStack, this); parseNode(this.LINESTRINGMEMBER_PARSERS_, node, objectStack, this);
}; }
/** /**
* @param {Node} node Node. * @param {Node} node Node.
* @param {Array.<*>} objectStack Object stack. * @param {Array.<*>} objectStack Object stack.
* @private * @private
*/ */
GMLBase.prototype.polygonMemberParser_ = function(node, objectStack) { polygonMemberParser_(node, objectStack) {
parseNode(this.POLYGONMEMBER_PARSERS_, node, objectStack, this); parseNode(this.POLYGONMEMBER_PARSERS_, node, objectStack, this);
}; }
/** /**
* @param {Node} node Node. * @param {Node} node Node.
* @param {Array.<*>} objectStack Object stack. * @param {Array.<*>} objectStack Object stack.
* @return {module:ol/geom/LineString|undefined} LineString. * @return {module:ol/geom/LineString|undefined} LineString.
*/ */
GMLBase.prototype.readLineString = function(node, objectStack) { readLineString(node, objectStack) {
const flatCoordinates = this.readFlatCoordinatesFromNode_(node, objectStack); const flatCoordinates = this.readFlatCoordinatesFromNode_(node, objectStack);
if (flatCoordinates) { if (flatCoordinates) {
const lineString = new LineString(flatCoordinates, GeometryLayout.XYZ); const lineString = new LineString(flatCoordinates, GeometryLayout.XYZ);
@@ -385,8 +373,7 @@ GMLBase.prototype.readLineString = function(node, objectStack) {
} else { } else {
return undefined; return undefined;
} }
}; }
/** /**
* @param {Node} node Node. * @param {Node} node Node.
@@ -394,7 +381,7 @@ GMLBase.prototype.readLineString = function(node, objectStack) {
* @private * @private
* @return {Array.<number>|undefined} LinearRing flat coordinates. * @return {Array.<number>|undefined} LinearRing flat coordinates.
*/ */
GMLBase.prototype.readFlatLinearRing_ = function(node, objectStack) { readFlatLinearRing_(node, objectStack) {
const ring = pushParseAndPop(null, const ring = pushParseAndPop(null,
this.GEOMETRY_FLAT_COORDINATES_PARSERS_, node, this.GEOMETRY_FLAT_COORDINATES_PARSERS_, node,
objectStack, this); objectStack, this);
@@ -403,28 +390,26 @@ GMLBase.prototype.readFlatLinearRing_ = function(node, objectStack) {
} else { } else {
return undefined; return undefined;
} }
}; }
/** /**
* @param {Node} node Node. * @param {Node} node Node.
* @param {Array.<*>} objectStack Object stack. * @param {Array.<*>} objectStack Object stack.
* @return {module:ol/geom/LinearRing|undefined} LinearRing. * @return {module:ol/geom/LinearRing|undefined} LinearRing.
*/ */
GMLBase.prototype.readLinearRing = function(node, objectStack) { readLinearRing(node, objectStack) {
const flatCoordinates = this.readFlatCoordinatesFromNode_(node, objectStack); const flatCoordinates = this.readFlatCoordinatesFromNode_(node, objectStack);
if (flatCoordinates) { if (flatCoordinates) {
return new LinearRing(flatCoordinates, GeometryLayout.XYZ); return new LinearRing(flatCoordinates, GeometryLayout.XYZ);
} }
}; }
/** /**
* @param {Node} node Node. * @param {Node} node Node.
* @param {Array.<*>} objectStack Object stack. * @param {Array.<*>} objectStack Object stack.
* @return {module:ol/geom/Polygon|undefined} Polygon. * @return {module:ol/geom/Polygon|undefined} Polygon.
*/ */
GMLBase.prototype.readPolygon = function(node, objectStack) { readPolygon(node, objectStack) {
/** @type {Array.<Array.<number>>} */ /** @type {Array.<Array.<number>>} */
const flatLinearRings = pushParseAndPop([null], const flatLinearRings = pushParseAndPop([null],
this.FLAT_LINEAR_RINGS_PARSERS_, node, objectStack, this); this.FLAT_LINEAR_RINGS_PARSERS_, node, objectStack, this);
@@ -440,8 +425,7 @@ GMLBase.prototype.readPolygon = function(node, objectStack) {
} else { } else {
return undefined; return undefined;
} }
}; }
/** /**
* @param {Node} node Node. * @param {Node} node Node.
@@ -449,10 +433,41 @@ GMLBase.prototype.readPolygon = function(node, objectStack) {
* @private * @private
* @return {Array.<number>} Flat coordinates. * @return {Array.<number>} Flat coordinates.
*/ */
GMLBase.prototype.readFlatCoordinatesFromNode_ = function(node, objectStack) { readFlatCoordinatesFromNode_(node, objectStack) {
return pushParseAndPop(null, this.GEOMETRY_FLAT_COORDINATES_PARSERS_, node, objectStack, this); return pushParseAndPop(null, this.GEOMETRY_FLAT_COORDINATES_PARSERS_, node, objectStack, this);
}; }
/**
* @inheritDoc
*/
readGeometryFromNode(node, opt_options) {
const geometry = this.readGeometryElement(node,
[this.getReadOptions(node, opt_options ? opt_options : {})]);
return geometry ? geometry : null;
}
/**
* @inheritDoc
*/
readFeaturesFromNode(node, opt_options) {
const options = {
featureType: this.featureType,
featureNS: this.featureNS
};
if (opt_options) {
assign(options, this.getReadOptions(node, opt_options));
}
const features = this.readFeaturesInternal(node, [options]);
return features || [];
}
/**
* @inheritDoc
*/
readProjectionFromNode(node) {
return getProjection(this.srsName ? this.srsName : node.firstElementChild.getAttribute('srsName'));
}
}
/** /**
* @const * @const
@@ -540,49 +555,4 @@ GMLBase.prototype.RING_PARSERS = {
} }
}; };
/**
* @inheritDoc
*/
GMLBase.prototype.readGeometryFromNode = function(node, opt_options) {
const geometry = this.readGeometryElement(node,
[this.getReadOptions(node, opt_options ? opt_options : {})]);
return geometry ? geometry : null;
};
/**
* Read all features from a GML FeatureCollection.
*
* @function
* @param {Document|Node|Object|string} source Source.
* @param {module:ol/format/Feature~ReadOptions=} opt_options Options.
* @return {Array.<module:ol/Feature>} Features.
* @api
*/
GMLBase.prototype.readFeatures;
/**
* @inheritDoc
*/
GMLBase.prototype.readFeaturesFromNode = function(node, opt_options) {
const options = {
featureType: this.featureType,
featureNS: this.featureNS
};
if (opt_options) {
assign(options, this.getReadOptions(node, opt_options));
}
const features = this.readFeaturesInternal(node, [options]);
return features || [];
};
/**
* @inheritDoc
*/
GMLBase.prototype.readProjectionFromNode = function(node) {
return getProjection(this.srsName ? this.srsName : node.firstElementChild.getAttribute('srsName'));
};
export default GMLBase; export default GMLBase;
+153 -198
View File
@@ -1,7 +1,6 @@
/** /**
* @module ol/format/GPX * @module ol/format/GPX
*/ */
import {inherits} from '../util.js';
import Feature from '../Feature.js'; import Feature from '../Feature.js';
import {includes} from '../array.js'; import {includes} from '../array.js';
import {transformWithOptions} from '../format/Feature.js'; import {transformWithOptions} from '../format/Feature.js';
@@ -18,52 +17,6 @@ import {createElementNS, makeArrayPusher, makeArraySerializer, makeChildAppender
XML_SCHEMA_INSTANCE_URI} from '../xml.js'; XML_SCHEMA_INSTANCE_URI} from '../xml.js';
/**
* @typedef {Object} Options
* @property {function(module:ol/Feature, Node)} [readExtensions] Callback function
* to process `extensions` nodes. To prevent memory leaks, this callback function must
* not store any references to the node. Note that the `extensions`
* node is not allowed in GPX 1.0. Moreover, only `extensions`
* nodes from `wpt`, `rte` and `trk` can be processed, as those are
* directly mapped to a feature.
*/
/**
* @typedef {Object} LayoutOptions
* @property {boolean} [hasZ]
* @property {boolean} [hasM]
*/
/**
* @classdesc
* Feature format for reading and writing data in the GPX format.
*
* @constructor
* @extends {module:ol/format/XMLFeature}
* @param {module:ol/format/GPX~Options=} opt_options Options.
* @api
*/
const GPX = function(opt_options) {
const options = opt_options ? opt_options : {};
XMLFeature.call(this);
/**
* @inheritDoc
*/
this.dataProjection = getProjection('EPSG:4326');
/**
* @type {function(module:ol/Feature, Node)|undefined}
* @private
*/
this.readExtensions_ = options.readExtensions;
};
inherits(GPX, XMLFeature);
/** /**
* @const * @const
* @type {Array.<null|string>} * @type {Array.<null|string>}
@@ -117,6 +70,159 @@ const LINK_PARSERS = makeStructureNS(
}); });
/**
* @const
* @type {Object.<string, Object.<string, module:ol/xml~Serializer>>}
*/
const GPX_SERIALIZERS = makeStructureNS(
NAMESPACE_URIS, {
'rte': makeChildAppender(writeRte),
'trk': makeChildAppender(writeTrk),
'wpt': makeChildAppender(writeWpt)
});
/**
* @typedef {Object} Options
* @property {function(module:ol/Feature, Node)} [readExtensions] Callback function
* to process `extensions` nodes. To prevent memory leaks, this callback function must
* not store any references to the node. Note that the `extensions`
* node is not allowed in GPX 1.0. Moreover, only `extensions`
* nodes from `wpt`, `rte` and `trk` can be processed, as those are
* directly mapped to a feature.
*/
/**
* @typedef {Object} LayoutOptions
* @property {boolean} [hasZ]
* @property {boolean} [hasM]
*/
/**
* @classdesc
* Feature format for reading and writing data in the GPX format.
*
* Note that {@link module:ol/format/GPX~GPX#readFeature} only reads the first
* feature of the source.
*
* When reading, routes (`<rte>`) are converted into LineString geometries, and
* tracks (`<trk>`) into MultiLineString. Any properties on route and track
* waypoints are ignored.
*
* When writing, LineString geometries are output as routes (`<rte>`), and
* MultiLineString as tracks (`<trk>`).
*
* @api
*/
class GPX extends XMLFeature {
/**
* @param {module:ol/format/GPX~Options=} opt_options Options.
*/
constructor(opt_options) {
super();
const options = opt_options ? opt_options : {};
/**
* @inheritDoc
*/
this.dataProjection = getProjection('EPSG:4326');
/**
* @type {function(module:ol/Feature, Node)|undefined}
* @private
*/
this.readExtensions_ = options.readExtensions;
}
/**
* @param {Array.<module:ol/Feature>} features List of features.
* @private
*/
handleReadExtensions_(features) {
if (!features) {
features = [];
}
for (let i = 0, ii = features.length; i < ii; ++i) {
const feature = features[i];
if (this.readExtensions_) {
const extensionsNode = feature.get('extensionsNode_') || null;
this.readExtensions_(feature, extensionsNode);
}
feature.set('extensionsNode_', undefined);
}
}
/**
* @inheritDoc
*/
readFeatureFromNode(node, opt_options) {
if (!includes(NAMESPACE_URIS, node.namespaceURI)) {
return null;
}
const featureReader = FEATURE_READER[node.localName];
if (!featureReader) {
return null;
}
const feature = featureReader(node, [this.getReadOptions(node, opt_options)]);
if (!feature) {
return null;
}
this.handleReadExtensions_([feature]);
return feature;
}
/**
* @inheritDoc
*/
readFeaturesFromNode(node, opt_options) {
if (!includes(NAMESPACE_URIS, node.namespaceURI)) {
return [];
}
if (node.localName == 'gpx') {
/** @type {Array.<module:ol/Feature>} */
const features = pushParseAndPop([], GPX_PARSERS,
node, [this.getReadOptions(node, opt_options)]);
if (features) {
this.handleReadExtensions_(features);
return features;
} else {
return [];
}
}
return [];
}
/**
* Encode an array of features in the GPX format as an XML node.
* LineString geometries are output as routes (`<rte>`), and MultiLineString
* as tracks (`<trk>`).
*
* @param {Array.<module:ol/Feature>} features Features.
* @param {module:ol/format/Feature~WriteOptions=} opt_options Options.
* @return {Node} Node.
* @override
* @api
*/
writeFeaturesNode(features, opt_options) {
opt_options = this.adaptOptions(opt_options);
//FIXME Serialize metadata
const gpx = createElementNS('http://www.topografix.com/GPX/1/1', 'gpx');
const xmlnsUri = 'http://www.w3.org/2000/xmlns/';
gpx.setAttributeNS(xmlnsUri, 'xmlns:xsi', XML_SCHEMA_INSTANCE_URI);
gpx.setAttributeNS(XML_SCHEMA_INSTANCE_URI, 'xsi:schemaLocation', SCHEMA_LOCATION);
gpx.setAttribute('version', '1.1');
gpx.setAttribute('creator', 'OpenLayers');
pushSerializeAndPop(/** @type {module:ol/xml~NodeStackItem} */
({node: gpx}), GPX_SERIALIZERS, GPX_NODE_FACTORY, features, [opt_options]);
return gpx;
}
}
/** /**
* @const * @const
* @type {Object.<string, Object.<string, module:ol/xml~Parser>>} * @type {Object.<string, Object.<string, module:ol/xml~Parser>>}
@@ -380,18 +486,6 @@ function GPX_NODE_FACTORY(value, objectStack, opt_nodeName) {
} }
/**
* @const
* @type {Object.<string, Object.<string, module:ol/xml~Serializer>>}
*/
const GPX_SERIALIZERS = makeStructureNS(
NAMESPACE_URIS, {
'rte': makeChildAppender(writeRte),
'trk': makeChildAppender(writeTrk),
'wpt': makeChildAppender(writeWpt)
});
/** /**
* @param {Array.<number>} flatCoordinates Flat coordinates. * @param {Array.<number>} flatCoordinates Flat coordinates.
* @param {module:ol/format/GPX~LayoutOptions} layoutOptions Layout options. * @param {module:ol/format/GPX~LayoutOptions} layoutOptions Layout options.
@@ -614,106 +708,6 @@ function readWpt(node, objectStack) {
} }
/**
* @param {Array.<module:ol/Feature>} features List of features.
* @private
*/
GPX.prototype.handleReadExtensions_ = function(features) {
if (!features) {
features = [];
}
for (let i = 0, ii = features.length; i < ii; ++i) {
const feature = features[i];
if (this.readExtensions_) {
const extensionsNode = feature.get('extensionsNode_') || null;
this.readExtensions_(feature, extensionsNode);
}
feature.set('extensionsNode_', undefined);
}
};
/**
* Read the first feature from a GPX source.
* Routes (`<rte>`) are converted into LineString geometries, and tracks (`<trk>`)
* into MultiLineString. Any properties on route and track waypoints are ignored.
*
* @function
* @param {Document|Node|Object|string} source Source.
* @param {module:ol/format/Feature~ReadOptions=} opt_options Read options.
* @return {module:ol/Feature} Feature.
* @api
*/
GPX.prototype.readFeature;
/**
* @inheritDoc
*/
GPX.prototype.readFeatureFromNode = function(node, opt_options) {
if (!includes(NAMESPACE_URIS, node.namespaceURI)) {
return null;
}
const featureReader = FEATURE_READER[node.localName];
if (!featureReader) {
return null;
}
const feature = featureReader(node, [this.getReadOptions(node, opt_options)]);
if (!feature) {
return null;
}
this.handleReadExtensions_([feature]);
return feature;
};
/**
* Read all features from a GPX source.
* Routes (`<rte>`) are converted into LineString geometries, and tracks (`<trk>`)
* into MultiLineString. Any properties on route and track waypoints are ignored.
*
* @function
* @param {Document|Node|Object|string} source Source.
* @param {module:ol/format/Feature~ReadOptions=} opt_options Read options.
* @return {Array.<module:ol/Feature>} Features.
* @api
*/
GPX.prototype.readFeatures;
/**
* @inheritDoc
*/
GPX.prototype.readFeaturesFromNode = function(node, opt_options) {
if (!includes(NAMESPACE_URIS, node.namespaceURI)) {
return [];
}
if (node.localName == 'gpx') {
/** @type {Array.<module:ol/Feature>} */
const features = pushParseAndPop([], GPX_PARSERS,
node, [this.getReadOptions(node, opt_options)]);
if (features) {
this.handleReadExtensions_(features);
return features;
} else {
return [];
}
}
return [];
};
/**
* Read the projection from a GPX source.
*
* @function
* @param {Document|Node|Object|string} source Source.
* @return {module:ol/proj/Projection} Projection.
* @api
*/
GPX.prototype.readProjection;
/** /**
* @param {Node} node Node. * @param {Node} node Node.
* @param {string} value Value for the link's `href` attribute. * @param {string} value Value for the link's `href` attribute.
@@ -860,43 +854,4 @@ function writeWpt(node, feature, objectStack) {
} }
/**
* Encode an array of features in the GPX format.
* LineString geometries are output as routes (`<rte>`), and MultiLineString
* as tracks (`<trk>`).
*
* @function
* @param {Array.<module:ol/Feature>} features Features.
* @param {module:ol/format/Feature~WriteOptions=} opt_options Write options.
* @return {string} Result.
* @api
*/
GPX.prototype.writeFeatures;
/**
* Encode an array of features in the GPX format as an XML node.
* LineString geometries are output as routes (`<rte>`), and MultiLineString
* as tracks (`<trk>`).
*
* @param {Array.<module:ol/Feature>} features Features.
* @param {module:ol/format/Feature~WriteOptions=} opt_options Options.
* @return {Node} Node.
* @override
* @api
*/
GPX.prototype.writeFeaturesNode = function(features, opt_options) {
opt_options = this.adaptOptions(opt_options);
//FIXME Serialize metadata
const gpx = createElementNS('http://www.topografix.com/GPX/1/1', 'gpx');
const xmlnsUri = 'http://www.w3.org/2000/xmlns/';
gpx.setAttributeNS(xmlnsUri, 'xmlns:xsi', XML_SCHEMA_INSTANCE_URI);
gpx.setAttributeNS(XML_SCHEMA_INSTANCE_URI, 'xsi:schemaLocation', SCHEMA_LOCATION);
gpx.setAttribute('version', '1.1');
gpx.setAttribute('creator', 'OpenLayers');
pushSerializeAndPop(/** @type {module:ol/xml~NodeStackItem} */
({node: gpx}), GPX_SERIALIZERS, GPX_NODE_FACTORY, features, [opt_options]);
return gpx;
};
export default GPX; export default GPX;
+159 -253
View File
@@ -4,7 +4,6 @@
// TODO: serialize dataProjection as crs member when writing // TODO: serialize dataProjection as crs member when writing
// see https://github.com/openlayers/openlayers/issues/2078 // see https://github.com/openlayers/openlayers/issues/2078
import {inherits} from '../util.js';
import {assert} from '../asserts.js'; import {assert} from '../asserts.js';
import Feature from '../Feature.js'; import Feature from '../Feature.js';
import {transformWithOptions} from '../format/Feature.js'; import {transformWithOptions} from '../format/Feature.js';
@@ -37,16 +36,18 @@ import {get as getProjection} from '../proj.js';
* @classdesc * @classdesc
* Feature format for reading and writing data in the GeoJSON format. * Feature format for reading and writing data in the GeoJSON format.
* *
* @constructor
* @extends {module:ol/format/JSONFeature}
* @param {module:ol/format/GeoJSON~Options=} opt_options Options.
* @api * @api
*/ */
const GeoJSON = function(opt_options) { class GeoJSON extends JSONFeature {
/**
* @param {module:ol/format/GeoJSON~Options=} opt_options Options.
*/
constructor(opt_options) {
const options = opt_options ? opt_options : {}; const options = opt_options ? opt_options : {};
JSONFeature.call(this); super();
/** /**
* @inheritDoc * @inheritDoc
@@ -73,9 +74,159 @@ const GeoJSON = function(opt_options) {
*/ */
this.extractGeometryName_ = options.extractGeometryName; this.extractGeometryName_ = options.extractGeometryName;
}; }
inherits(GeoJSON, JSONFeature); /**
* @inheritDoc
*/
readFeatureFromObject(object, opt_options) {
/**
* @type {GeoJSONFeature}
*/
let geoJSONFeature = null;
if (object.type === 'Feature') {
geoJSONFeature = /** @type {GeoJSONFeature} */ (object);
} else {
geoJSONFeature = /** @type {GeoJSONFeature} */ ({
type: 'Feature',
geometry: /** @type {GeoJSONGeometry|GeoJSONGeometryCollection} */ (object)
});
}
const geometry = readGeometry(geoJSONFeature.geometry, opt_options);
const feature = new Feature();
if (this.geometryName_) {
feature.setGeometryName(this.geometryName_);
} else if (this.extractGeometryName_ && geoJSONFeature.geometry_name !== undefined) {
feature.setGeometryName(geoJSONFeature.geometry_name);
}
feature.setGeometry(geometry);
if (geoJSONFeature.id !== undefined) {
feature.setId(geoJSONFeature.id);
}
if (geoJSONFeature.properties) {
feature.setProperties(geoJSONFeature.properties);
}
return feature;
}
/**
* @inheritDoc
*/
readFeaturesFromObject(object, opt_options) {
const geoJSONObject = /** @type {GeoJSONObject} */ (object);
/** @type {Array.<module:ol/Feature>} */
let features = null;
if (geoJSONObject.type === 'FeatureCollection') {
const geoJSONFeatureCollection = /** @type {GeoJSONFeatureCollection} */ (object);
features = [];
const geoJSONFeatures = geoJSONFeatureCollection.features;
for (let i = 0, ii = geoJSONFeatures.length; i < ii; ++i) {
features.push(this.readFeatureFromObject(geoJSONFeatures[i], opt_options));
}
} else {
features = [this.readFeatureFromObject(object, opt_options)];
}
return features;
}
/**
* @inheritDoc
*/
readGeometryFromObject(object, opt_options) {
return readGeometry(/** @type {GeoJSONGeometry} */ (object), opt_options);
}
/**
* @inheritDoc
*/
readProjectionFromObject(object) {
const geoJSONObject = /** @type {GeoJSONObject} */ (object);
const crs = geoJSONObject.crs;
let projection;
if (crs) {
if (crs.type == 'name') {
projection = getProjection(crs.properties.name);
} else {
assert(false, 36); // Unknown SRS type
}
} else {
projection = this.dataProjection;
}
return (
/** @type {module:ol/proj/Projection} */ (projection)
);
}
/**
* Encode a feature as a GeoJSON Feature object.
*
* @param {module:ol/Feature} feature Feature.
* @param {module:ol/format/Feature~WriteOptions=} opt_options Write options.
* @return {GeoJSONFeature} Object.
* @override
* @api
*/
writeFeatureObject(feature, opt_options) {
opt_options = this.adaptOptions(opt_options);
const object = /** @type {GeoJSONFeature} */ ({
'type': 'Feature'
});
const id = feature.getId();
if (id !== undefined) {
object.id = id;
}
const geometry = feature.getGeometry();
if (geometry) {
object.geometry = writeGeometry(geometry, opt_options);
} else {
object.geometry = null;
}
const properties = feature.getProperties();
delete properties[feature.getGeometryName()];
if (!isEmpty(properties)) {
object.properties = properties;
} else {
object.properties = null;
}
return object;
}
/**
* Encode an array of features as a GeoJSON object.
*
* @param {Array.<module:ol/Feature>} features Features.
* @param {module:ol/format/Feature~WriteOptions=} opt_options Write options.
* @return {GeoJSONFeatureCollection} GeoJSON Object.
* @override
* @api
*/
writeFeaturesObject(features, opt_options) {
opt_options = this.adaptOptions(opt_options);
const objects = [];
for (let i = 0, ii = features.length; i < ii; ++i) {
objects.push(this.writeFeatureObject(features[i], opt_options));
}
return /** @type {GeoJSONFeatureCollection} */ ({
type: 'FeatureCollection',
features: objects
});
}
/**
* Encode a geometry as a GeoJSON object.
*
* @param {module:ol/geom/Geometry} geometry Geometry.
* @param {module:ol/format/Feature~WriteOptions=} opt_options Write options.
* @return {GeoJSONGeometry|GeoJSONGeometryCollection} Object.
* @override
* @api
*/
writeGeometryObject(geometry, opt_options) {
return writeGeometry(geometry, this.adaptOptions(opt_options));
}
}
/** /**
@@ -325,249 +476,4 @@ function writePolygonGeometry(geometry, opt_options) {
} }
/**
* Read a feature from a GeoJSON Feature source. Only works for Feature or
* geometry types. Use {@link module:ol/format/GeoJSON#readFeatures} to read
* FeatureCollection source. If feature at source has an id, it will be used
* as Feature id by calling {@link module:ol/Feature#setId} internally.
*
* @function
* @param {Document|Node|Object|string} source Source.
* @param {module:ol/format/Feature~ReadOptions=} opt_options Read options.
* @return {module:ol/Feature} Feature.
* @api
*/
GeoJSON.prototype.readFeature;
/**
* Read all features from a GeoJSON source. Works for all GeoJSON types.
* If the source includes only geometries, features will be created with those
* geometries.
*
* @function
* @param {Document|Node|Object|string} source Source.
* @param {module:ol/format/Feature~ReadOptions=} opt_options Read options.
* @return {Array.<module:ol/Feature>} Features.
* @api
*/
GeoJSON.prototype.readFeatures;
/**
* @inheritDoc
*/
GeoJSON.prototype.readFeatureFromObject = function(object, opt_options) {
/**
* @type {GeoJSONFeature}
*/
let geoJSONFeature = null;
if (object.type === 'Feature') {
geoJSONFeature = /** @type {GeoJSONFeature} */ (object);
} else {
geoJSONFeature = /** @type {GeoJSONFeature} */ ({
type: 'Feature',
geometry: /** @type {GeoJSONGeometry|GeoJSONGeometryCollection} */ (object)
});
}
const geometry = readGeometry(geoJSONFeature.geometry, opt_options);
const feature = new Feature();
if (this.geometryName_) {
feature.setGeometryName(this.geometryName_);
} else if (this.extractGeometryName_ && geoJSONFeature.geometry_name !== undefined) {
feature.setGeometryName(geoJSONFeature.geometry_name);
}
feature.setGeometry(geometry);
if (geoJSONFeature.id !== undefined) {
feature.setId(geoJSONFeature.id);
}
if (geoJSONFeature.properties) {
feature.setProperties(geoJSONFeature.properties);
}
return feature;
};
/**
* @inheritDoc
*/
GeoJSON.prototype.readFeaturesFromObject = function(object, opt_options) {
const geoJSONObject = /** @type {GeoJSONObject} */ (object);
/** @type {Array.<module:ol/Feature>} */
let features = null;
if (geoJSONObject.type === 'FeatureCollection') {
const geoJSONFeatureCollection = /** @type {GeoJSONFeatureCollection} */ (object);
features = [];
const geoJSONFeatures = geoJSONFeatureCollection.features;
for (let i = 0, ii = geoJSONFeatures.length; i < ii; ++i) {
features.push(this.readFeatureFromObject(geoJSONFeatures[i], opt_options));
}
} else {
features = [this.readFeatureFromObject(object, opt_options)];
}
return features;
};
/**
* Read a geometry from a GeoJSON source.
*
* @function
* @param {Document|Node|Object|string} source Source.
* @param {module:ol/format/Feature~ReadOptions=} opt_options Read options.
* @return {module:ol/geom/Geometry} Geometry.
* @api
*/
GeoJSON.prototype.readGeometry;
/**
* @inheritDoc
*/
GeoJSON.prototype.readGeometryFromObject = function(object, opt_options) {
return readGeometry(/** @type {GeoJSONGeometry} */ (object), opt_options);
};
/**
* Read the projection from a GeoJSON source.
*
* @function
* @param {Document|Node|Object|string} source Source.
* @return {module:ol/proj/Projection} Projection.
* @api
*/
GeoJSON.prototype.readProjection;
/**
* @inheritDoc
*/
GeoJSON.prototype.readProjectionFromObject = function(object) {
const geoJSONObject = /** @type {GeoJSONObject} */ (object);
const crs = geoJSONObject.crs;
let projection;
if (crs) {
if (crs.type == 'name') {
projection = getProjection(crs.properties.name);
} else {
assert(false, 36); // Unknown SRS type
}
} else {
projection = this.dataProjection;
}
return (
/** @type {module:ol/proj/Projection} */ (projection)
);
};
/**
* Encode a feature as a GeoJSON Feature string.
*
* @function
* @param {module:ol/Feature} feature Feature.
* @param {module:ol/format/Feature~WriteOptions=} opt_options Write options.
* @return {string} GeoJSON.
* @override
* @api
*/
GeoJSON.prototype.writeFeature;
/**
* Encode a feature as a GeoJSON Feature object.
*
* @param {module:ol/Feature} feature Feature.
* @param {module:ol/format/Feature~WriteOptions=} opt_options Write options.
* @return {GeoJSONFeature} Object.
* @override
* @api
*/
GeoJSON.prototype.writeFeatureObject = function(feature, opt_options) {
opt_options = this.adaptOptions(opt_options);
const object = /** @type {GeoJSONFeature} */ ({
'type': 'Feature'
});
const id = feature.getId();
if (id !== undefined) {
object.id = id;
}
const geometry = feature.getGeometry();
if (geometry) {
object.geometry = writeGeometry(geometry, opt_options);
} else {
object.geometry = null;
}
const properties = feature.getProperties();
delete properties[feature.getGeometryName()];
if (!isEmpty(properties)) {
object.properties = properties;
} else {
object.properties = null;
}
return object;
};
/**
* Encode an array of features as GeoJSON.
*
* @function
* @param {Array.<module:ol/Feature>} features Features.
* @param {module:ol/format/Feature~WriteOptions=} opt_options Write options.
* @return {string} GeoJSON.
* @api
*/
GeoJSON.prototype.writeFeatures;
/**
* Encode an array of features as a GeoJSON object.
*
* @param {Array.<module:ol/Feature>} features Features.
* @param {module:ol/format/Feature~WriteOptions=} opt_options Write options.
* @return {GeoJSONFeatureCollection} GeoJSON Object.
* @override
* @api
*/
GeoJSON.prototype.writeFeaturesObject = function(features, opt_options) {
opt_options = this.adaptOptions(opt_options);
const objects = [];
for (let i = 0, ii = features.length; i < ii; ++i) {
objects.push(this.writeFeatureObject(features[i], opt_options));
}
return /** @type {GeoJSONFeatureCollection} */ ({
type: 'FeatureCollection',
features: objects
});
};
/**
* Encode a geometry as a GeoJSON string.
*
* @function
* @param {module:ol/geom/Geometry} geometry Geometry.
* @param {module:ol/format/Feature~WriteOptions=} opt_options Write options.
* @return {string} GeoJSON.
* @api
*/
GeoJSON.prototype.writeGeometry;
/**
* Encode a geometry as a GeoJSON object.
*
* @param {module:ol/geom/Geometry} geometry Geometry.
* @param {module:ol/format/Feature~WriteOptions=} opt_options Write options.
* @return {GeoJSONGeometry|GeoJSONGeometryCollection} Object.
* @override
* @api
*/
GeoJSON.prototype.writeGeometryObject = function(geometry, opt_options) {
return writeGeometry(geometry, this.adaptOptions(opt_options));
};
export default GeoJSON; export default GeoJSON;
+43 -82
View File
@@ -1,7 +1,6 @@
/** /**
* @module ol/format/IGC * @module ol/format/IGC
*/ */
import {inherits} from '../util.js';
import Feature from '../Feature.js'; import Feature from '../Feature.js';
import {transformWithOptions} from '../format/Feature.js'; import {transformWithOptions} from '../format/Feature.js';
import TextFeature from '../format/TextFeature.js'; import TextFeature from '../format/TextFeature.js';
@@ -19,44 +18,6 @@ const IGCZ = {
NONE: 'none' NONE: 'none'
}; };
/**
* @typedef {Object} Options
* @property {IGCZ|string} [altitudeMode='none'] Altitude mode. Possible
* values are `'barometric'`, `'gps'`, and `'none'`.
*/
/**
* @classdesc
* Feature format for `*.igc` flight recording files.
*
* @constructor
* @extends {module:ol/format/TextFeature}
* @param {module:ol/format/IGC~Options=} opt_options Options.
* @api
*/
const IGC = function(opt_options) {
const options = opt_options ? opt_options : {};
TextFeature.call(this);
/**
* @inheritDoc
*/
this.dataProjection = getProjection('EPSG:4326');
/**
* @private
* @type {IGCZ}
*/
this.altitudeMode_ = options.altitudeMode ? options.altitudeMode : IGCZ.NONE;
};
inherits(IGC, TextFeature);
/** /**
* @const * @const
* @type {RegExp} * @type {RegExp}
@@ -89,21 +50,48 @@ const NEWLINE_RE = /\r\n|\r|\n/;
/** /**
* Read the feature from the IGC source. * @typedef {Object} Options
* @property {IGCZ|string} [altitudeMode='none'] Altitude mode. Possible
* values are `'barometric'`, `'gps'`, and `'none'`.
*/
/**
* @classdesc
* Feature format for `*.igc` flight recording files.
*
* As IGC sources contain a single feature,
* {@link module:ol/format/IGC~IGC#readFeatures} will return the feature in an
* array
* *
* @function
* @param {Document|Node|Object|string} source Source.
* @param {module:ol/format/Feature~ReadOptions=} opt_options Read options.
* @return {module:ol/Feature} Feature.
* @api * @api
*/ */
IGC.prototype.readFeature; class IGC extends TextFeature {
/**
* @param {module:ol/format/IGC~Options=} opt_options Options.
*/
constructor(opt_options) {
super();
const options = opt_options ? opt_options : {};
/** /**
* @inheritDoc * @inheritDoc
*/ */
IGC.prototype.readFeatureFromText = function(text, opt_options) { this.dataProjection = getProjection('EPSG:4326');
/**
* @private
* @type {IGCZ}
*/
this.altitudeMode_ = options.altitudeMode ? options.altitudeMode : IGCZ.NONE;
}
/**
* @inheritDoc
*/
readFeatureFromText(text, opt_options) {
const altitudeMode = this.altitudeMode_; const altitudeMode = this.altitudeMode_;
const lines = text.split(NEWLINE_RE); const lines = text.split(NEWLINE_RE);
/** @type {Object.<string, string>} */ /** @type {Object.<string, string>} */
@@ -173,70 +161,43 @@ IGC.prototype.readFeatureFromText = function(text, opt_options) {
const feature = new Feature(transformWithOptions(lineString, false, opt_options)); const feature = new Feature(transformWithOptions(lineString, false, opt_options));
feature.setProperties(properties); feature.setProperties(properties);
return feature; return feature;
}; }
/**
* Read the feature from the source. As IGC sources contain a single
* feature, this will return the feature in an array.
*
* @function
* @param {Document|Node|Object|string} source Source.
* @param {module:ol/format/Feature~ReadOptions=} opt_options Read options.
* @return {Array.<module:ol/Feature>} Features.
* @api
*/
IGC.prototype.readFeatures;
/** /**
* @inheritDoc * @inheritDoc
*/ */
IGC.prototype.readFeaturesFromText = function(text, opt_options) { readFeaturesFromText(text, opt_options) {
const feature = this.readFeatureFromText(text, opt_options); const feature = this.readFeatureFromText(text, opt_options);
if (feature) { if (feature) {
return [feature]; return [feature];
} else { } else {
return []; return [];
} }
}; }
/**
* Read the projection from the IGC source.
*
* @function
* @param {Document|Node|Object|string} source Source.
* @return {module:ol/proj/Projection} Projection.
* @api
*/
IGC.prototype.readProjection;
/** /**
* Not implemented. * Not implemented.
* @inheritDoc * @inheritDoc
*/ */
IGC.prototype.writeFeatureText = function(feature, opt_options) {}; writeFeatureText(feature, opt_options) {}
/** /**
* Not implemented. * Not implemented.
* @inheritDoc * @inheritDoc
*/ */
IGC.prototype.writeFeaturesText = function(features, opt_options) {}; writeFeaturesText(features, opt_options) {}
/** /**
* Not implemented. * Not implemented.
* @inheritDoc * @inheritDoc
*/ */
IGC.prototype.writeGeometryText = function(geometry, opt_options) {}; writeGeometryText(geometry, opt_options) {}
/** /**
* Not implemented. * Not implemented.
* @inheritDoc * @inheritDoc
*/ */
IGC.prototype.readGeometryFromText = function(text, opt_options) {}; readGeometryFromText(text, opt_options) {}
}
export default IGC; export default IGC;
+158 -138
View File
@@ -1,7 +1,6 @@
/** /**
* @module ol/format/JSONFeature * @module ol/format/JSONFeature
*/ */
import {inherits} from '../util.js';
import FeatureFormat from '../format/Feature.js'; import FeatureFormat from '../format/Feature.js';
import FormatType from '../format/FormatType.js'; import FormatType from '../format/FormatType.js';
@@ -11,15 +10,167 @@ import FormatType from '../format/FormatType.js';
* instantiated in apps. * instantiated in apps.
* Base class for JSON feature formats. * Base class for JSON feature formats.
* *
* @constructor
* @abstract * @abstract
* @extends {module:ol/format/Feature}
*/ */
const JSONFeature = function() { class JSONFeature extends FeatureFormat {
FeatureFormat.call(this); constructor() {
}; super();
}
inherits(JSONFeature, FeatureFormat); /**
* @inheritDoc
*/
getType() {
return FormatType.JSON;
}
/**
* Read a feature. Only works for a single feature. Use `readFeatures` to
* read a feature collection.
*
* @param {ArrayBuffer|Document|Node|Object|string} source Source.
* @param {module:ol/format/Feature~ReadOptions=} opt_options Read options.
* @return {module:ol/Feature} Feature.
* @api
*/
readFeature(source, opt_options) {
return this.readFeatureFromObject(
getObject(source), this.getReadOptions(source, opt_options));
}
/**
* Read all features. Works with both a single feature and a feature
* collection.
*
* @param {ArrayBuffer|Document|Node|Object|string} source Source.
* @param {module:ol/format/Feature~ReadOptions=} opt_options Read options.
* @return {Array.<module:ol/Feature>} Features.
* @api
*/
readFeatures(source, opt_options) {
return this.readFeaturesFromObject(
getObject(source), this.getReadOptions(source, opt_options));
}
/**
* @abstract
* @param {Object} object Object.
* @param {module:ol/format/Feature~ReadOptions=} opt_options Read options.
* @protected
* @return {module:ol/Feature} Feature.
*/
readFeatureFromObject(object, opt_options) {}
/**
* @abstract
* @param {Object} object Object.
* @param {module:ol/format/Feature~ReadOptions=} opt_options Read options.
* @protected
* @return {Array.<module:ol/Feature>} Features.
*/
readFeaturesFromObject(object, opt_options) {}
/**
* Read a geometry.
*
* @param {ArrayBuffer|Document|Node|Object|string} source Source.
* @param {module:ol/format/Feature~ReadOptions=} opt_options Read options.
* @return {module:ol/geom/Geometry} Geometry.
* @api
*/
readGeometry(source, opt_options) {
return this.readGeometryFromObject(
getObject(source), this.getReadOptions(source, opt_options));
}
/**
* @abstract
* @param {Object} object Object.
* @param {module:ol/format/Feature~ReadOptions=} opt_options Read options.
* @protected
* @return {module:ol/geom/Geometry} Geometry.
*/
readGeometryFromObject(object, opt_options) {}
/**
* Read the projection.
*
* @param {ArrayBuffer|Document|Node|Object|string} source Source.
* @return {module:ol/proj/Projection} Projection.
* @api
*/
readProjection(source) {
return this.readProjectionFromObject(getObject(source));
}
/**
* @abstract
* @param {Object} object Object.
* @protected
* @return {module:ol/proj/Projection} Projection.
*/
readProjectionFromObject(object) {}
/**
* Encode a feature as string.
*
* @param {module:ol/Feature} feature Feature.
* @param {module:ol/format/Feature~WriteOptions=} opt_options Write options.
* @return {string} Encoded feature.
* @api
*/
writeFeature(feature, opt_options) {
return JSON.stringify(this.writeFeatureObject(feature, opt_options));
}
/**
* @abstract
* @param {module:ol/Feature} feature Feature.
* @param {module:ol/format/Feature~WriteOptions=} opt_options Write options.
* @return {Object} Object.
*/
writeFeatureObject(feature, opt_options) {}
/**
* Encode an array of features as string.
*
* @param {Array.<module:ol/Feature>} features Features.
* @param {module:ol/format/Feature~WriteOptions=} opt_options Write options.
* @return {string} Encoded features.
* @api
*/
writeFeatures(features, opt_options) {
return JSON.stringify(this.writeFeaturesObject(features, opt_options));
}
/**
* @abstract
* @param {Array.<module:ol/Feature>} features Features.
* @param {module:ol/format/Feature~WriteOptions=} opt_options Write options.
* @return {Object} Object.
*/
writeFeaturesObject(features, opt_options) {}
/**
* Encode a geometry as string.
*
* @param {module:ol/geom/Geometry} geometry Geometry.
* @param {module:ol/format/Feature~WriteOptions=} opt_options Write options.
* @return {string} Encoded geometry.
* @api
*/
writeGeometry(geometry, opt_options) {
return JSON.stringify(this.writeGeometryObject(geometry, opt_options));
}
/**
* @abstract
* @param {module:ol/geom/Geometry} geometry Geometry.
* @param {module:ol/format/Feature~WriteOptions=} opt_options Write options.
* @return {Object} Object.
*/
writeGeometryObject(geometry, opt_options) {}
}
/** /**
@@ -38,135 +189,4 @@ function getObject(source) {
} }
/**
* @inheritDoc
*/
JSONFeature.prototype.getType = function() {
return FormatType.JSON;
};
/**
* @inheritDoc
*/
JSONFeature.prototype.readFeature = function(source, opt_options) {
return this.readFeatureFromObject(
getObject(source), this.getReadOptions(source, opt_options));
};
/**
* @inheritDoc
*/
JSONFeature.prototype.readFeatures = function(source, opt_options) {
return this.readFeaturesFromObject(
getObject(source), this.getReadOptions(source, opt_options));
};
/**
* @abstract
* @param {Object} object Object.
* @param {module:ol/format/Feature~ReadOptions=} opt_options Read options.
* @protected
* @return {module:ol/Feature} Feature.
*/
JSONFeature.prototype.readFeatureFromObject = function(object, opt_options) {};
/**
* @abstract
* @param {Object} object Object.
* @param {module:ol/format/Feature~ReadOptions=} opt_options Read options.
* @protected
* @return {Array.<module:ol/Feature>} Features.
*/
JSONFeature.prototype.readFeaturesFromObject = function(object, opt_options) {};
/**
* @inheritDoc
*/
JSONFeature.prototype.readGeometry = function(source, opt_options) {
return this.readGeometryFromObject(
getObject(source), this.getReadOptions(source, opt_options));
};
/**
* @abstract
* @param {Object} object Object.
* @param {module:ol/format/Feature~ReadOptions=} opt_options Read options.
* @protected
* @return {module:ol/geom/Geometry} Geometry.
*/
JSONFeature.prototype.readGeometryFromObject = function(object, opt_options) {};
/**
* @inheritDoc
*/
JSONFeature.prototype.readProjection = function(source) {
return this.readProjectionFromObject(getObject(source));
};
/**
* @abstract
* @param {Object} object Object.
* @protected
* @return {module:ol/proj/Projection} Projection.
*/
JSONFeature.prototype.readProjectionFromObject = function(object) {};
/**
* @inheritDoc
*/
JSONFeature.prototype.writeFeature = function(feature, opt_options) {
return JSON.stringify(this.writeFeatureObject(feature, opt_options));
};
/**
* @abstract
* @param {module:ol/Feature} feature Feature.
* @param {module:ol/format/Feature~WriteOptions=} opt_options Write options.
* @return {Object} Object.
*/
JSONFeature.prototype.writeFeatureObject = function(feature, opt_options) {};
/**
* @inheritDoc
*/
JSONFeature.prototype.writeFeatures = function(features, opt_options) {
return JSON.stringify(this.writeFeaturesObject(features, opt_options));
};
/**
* @abstract
* @param {Array.<module:ol/Feature>} features Features.
* @param {module:ol/format/Feature~WriteOptions=} opt_options Write options.
* @return {Object} Object.
*/
JSONFeature.prototype.writeFeaturesObject = function(features, opt_options) {};
/**
* @inheritDoc
*/
JSONFeature.prototype.writeGeometry = function(geometry, opt_options) {
return JSON.stringify(this.writeGeometryObject(geometry, opt_options));
};
/**
* @abstract
* @param {module:ol/geom/Geometry} geometry Geometry.
* @param {module:ol/format/Feature~WriteOptions=} opt_options Write options.
* @return {Object} Object.
*/
JSONFeature.prototype.writeGeometryObject = function(geometry, opt_options) {};
export default JSONFeature; export default JSONFeature;
+538 -599
View File
File diff suppressed because it is too large Load Diff
+227 -237
View File
@@ -3,7 +3,6 @@
*/ */
//FIXME Implement projection handling //FIXME Implement projection handling
import {inherits} from '../util.js';
import {assert} from '../asserts.js'; import {assert} from '../asserts.js';
import PBF from 'pbf'; import PBF from 'pbf';
import FeatureFormat, {transformWithOptions} from '../format/Feature.js'; import FeatureFormat, {transformWithOptions} from '../format/Feature.js';
@@ -42,14 +41,16 @@ import RenderFeature from '../render/Feature.js';
* @classdesc * @classdesc
* Feature format for reading data in the Mapbox MVT format. * Feature format for reading data in the Mapbox MVT format.
* *
* @constructor
* @extends {module:ol/format/Feature}
* @param {module:ol/format/MVT~Options=} opt_options Options. * @param {module:ol/format/MVT~Options=} opt_options Options.
* @api * @api
*/ */
const MVT = function(opt_options) { class MVT extends FeatureFormat {
FeatureFormat.call(this); /**
* @param {module:ol/format/MVT~Options=} opt_options Options.
*/
constructor(opt_options) {
super();
const options = opt_options ? opt_options : {}; const options = opt_options ? opt_options : {};
@@ -94,9 +95,228 @@ const MVT = function(opt_options) {
*/ */
this.extent_ = null; this.extent_ = null;
}; }
inherits(MVT, FeatureFormat); /**
* Read the raw geometry from the pbf offset stored in a raw feature's geometry
* property.
* @suppress {missingProperties}
* @param {Object} pbf PBF.
* @param {Object} feature Raw feature.
* @param {Array.<number>} flatCoordinates Array to store flat coordinates in.
* @param {Array.<number>} ends Array to store ends in.
* @private
*/
readRawGeometry_(pbf, feature, flatCoordinates, ends) {
pbf.pos = feature.geometry;
const end = pbf.readVarint() + pbf.pos;
let cmd = 1;
let length = 0;
let x = 0;
let y = 0;
let coordsLen = 0;
let currentEnd = 0;
while (pbf.pos < end) {
if (!length) {
const cmdLen = pbf.readVarint();
cmd = cmdLen & 0x7;
length = cmdLen >> 3;
}
length--;
if (cmd === 1 || cmd === 2) {
x += pbf.readSVarint();
y += pbf.readSVarint();
if (cmd === 1) { // moveTo
if (coordsLen > currentEnd) {
ends.push(coordsLen);
currentEnd = coordsLen;
}
}
flatCoordinates.push(x, y);
coordsLen += 2;
} else if (cmd === 7) {
if (coordsLen > currentEnd) {
// close polygon
flatCoordinates.push(
flatCoordinates[currentEnd], flatCoordinates[currentEnd + 1]);
coordsLen += 2;
}
} else {
assert(false, 59); // Invalid command found in the PBF
}
}
if (coordsLen > currentEnd) {
ends.push(coordsLen);
currentEnd = coordsLen;
}
}
/**
* @private
* @param {Object} pbf PBF
* @param {Object} rawFeature Raw Mapbox feature.
* @param {module:ol/format/Feature~ReadOptions=} opt_options Read options.
* @return {module:ol/Feature|module:ol/render/Feature} Feature.
*/
createFeature_(pbf, rawFeature, opt_options) {
const type = rawFeature.type;
if (type === 0) {
return null;
}
let feature;
const id = rawFeature.id;
const values = rawFeature.properties;
values[this.layerName_] = rawFeature.layer.name;
const flatCoordinates = [];
const ends = [];
this.readRawGeometry_(pbf, rawFeature, flatCoordinates, ends);
const geometryType = getGeometryType(type, ends.length);
if (this.featureClass_ === RenderFeature) {
feature = new this.featureClass_(geometryType, flatCoordinates, ends, values, id);
} else {
let geom;
if (geometryType == GeometryType.POLYGON) {
const endss = [];
let offset = 0;
let prevEndIndex = 0;
for (let i = 0, ii = ends.length; i < ii; ++i) {
const end = ends[i];
if (!linearRingIsClockwise(flatCoordinates, offset, end, 2)) {
endss.push(ends.slice(prevEndIndex, i));
prevEndIndex = i;
}
offset = end;
}
if (endss.length > 1) {
geom = new MultiPolygon(flatCoordinates, GeometryLayout.XY, endss);
} else {
geom = new Polygon(flatCoordinates, GeometryLayout.XY, ends);
}
} else {
geom = geometryType === GeometryType.POINT ? new Point(flatCoordinates, GeometryLayout.XY) :
geometryType === GeometryType.LINE_STRING ? new LineString(flatCoordinates, GeometryLayout.XY) :
geometryType === GeometryType.POLYGON ? new Polygon(flatCoordinates, GeometryLayout.XY, ends) :
geometryType === GeometryType.MULTI_POINT ? new MultiPoint(flatCoordinates, GeometryLayout.XY) :
geometryType === GeometryType.MULTI_LINE_STRING ? new MultiLineString(flatCoordinates, GeometryLayout.XY, ends) :
null;
}
feature = new this.featureClass_();
if (this.geometryName_) {
feature.setGeometryName(this.geometryName_);
}
const geometry = transformWithOptions(geom, false, this.adaptOptions(opt_options));
feature.setGeometry(geometry);
feature.setId(id);
feature.setProperties(values);
}
return feature;
}
/**
* @inheritDoc
* @api
*/
getLastExtent() {
return this.extent_;
}
/**
* @inheritDoc
*/
getType() {
return FormatType.ARRAY_BUFFER;
}
/**
* @inheritDoc
* @api
*/
readFeatures(source, opt_options) {
const layers = this.layers_;
const pbf = new PBF(/** @type {ArrayBuffer} */ (source));
const pbfLayers = pbf.readFields(layersPBFReader, {});
/** @type {Array.<module:ol/Feature|module:ol/render/Feature>} */
const features = [];
for (const name in pbfLayers) {
if (layers && layers.indexOf(name) == -1) {
continue;
}
const pbfLayer = pbfLayers[name];
for (let i = 0, ii = pbfLayer.length; i < ii; ++i) {
const rawFeature = readRawFeature(pbf, pbfLayer, i);
features.push(this.createFeature_(pbf, rawFeature));
}
this.extent_ = pbfLayer ? [0, 0, pbfLayer.extent, pbfLayer.extent] : null;
}
return features;
}
/**
* @inheritDoc
* @api
*/
readProjection(source) {
return this.dataProjection;
}
/**
* Sets the layers that features will be read from.
* @param {Array.<string>} layers Layers.
* @api
*/
setLayers(layers) {
this.layers_ = layers;
}
/**
* Not implemented.
* @override
*/
readFeature() {}
/**
* Not implemented.
* @override
*/
readGeometry() {}
/**
* Not implemented.
* @override
*/
writeFeature() {}
/**
* Not implemented.
* @override
*/
writeGeometry() {}
/**
* Not implemented.
* @override
*/
writeFeatures() {}
}
/** /**
@@ -201,72 +421,6 @@ function readRawFeature(pbf, layer, i) {
} }
/**
* Read the raw geometry from the pbf offset stored in a raw feature's geometry
* property.
* @suppress {missingProperties}
* @param {Object} pbf PBF.
* @param {Object} feature Raw feature.
* @param {Array.<number>} flatCoordinates Array to store flat coordinates in.
* @param {Array.<number>} ends Array to store ends in.
* @private
*/
MVT.prototype.readRawGeometry_ = function(pbf, feature, flatCoordinates, ends) {
pbf.pos = feature.geometry;
const end = pbf.readVarint() + pbf.pos;
let cmd = 1;
let length = 0;
let x = 0;
let y = 0;
let coordsLen = 0;
let currentEnd = 0;
while (pbf.pos < end) {
if (!length) {
const cmdLen = pbf.readVarint();
cmd = cmdLen & 0x7;
length = cmdLen >> 3;
}
length--;
if (cmd === 1 || cmd === 2) {
x += pbf.readSVarint();
y += pbf.readSVarint();
if (cmd === 1) { // moveTo
if (coordsLen > currentEnd) {
ends.push(coordsLen);
currentEnd = coordsLen;
}
}
flatCoordinates.push(x, y);
coordsLen += 2;
} else if (cmd === 7) {
if (coordsLen > currentEnd) {
// close polygon
flatCoordinates.push(
flatCoordinates[currentEnd], flatCoordinates[currentEnd + 1]);
coordsLen += 2;
}
} else {
assert(false, 59); // Invalid command found in the PBF
}
}
if (coordsLen > currentEnd) {
ends.push(coordsLen);
currentEnd = coordsLen;
}
};
/** /**
* @suppress {missingProperties} * @suppress {missingProperties}
* @param {number} type The raw feature's geometry type * @param {number} type The raw feature's geometry type
@@ -292,168 +446,4 @@ function getGeometryType(type, numEnds) {
return geometryType; return geometryType;
} }
/**
* @private
* @param {Object} pbf PBF
* @param {Object} rawFeature Raw Mapbox feature.
* @param {module:ol/format/Feature~ReadOptions=} opt_options Read options.
* @return {module:ol/Feature|module:ol/render/Feature} Feature.
*/
MVT.prototype.createFeature_ = function(pbf, rawFeature, opt_options) {
const type = rawFeature.type;
if (type === 0) {
return null;
}
let feature;
const id = rawFeature.id;
const values = rawFeature.properties;
values[this.layerName_] = rawFeature.layer.name;
const flatCoordinates = [];
const ends = [];
this.readRawGeometry_(pbf, rawFeature, flatCoordinates, ends);
const geometryType = getGeometryType(type, ends.length);
if (this.featureClass_ === RenderFeature) {
feature = new this.featureClass_(geometryType, flatCoordinates, ends, values, id);
} else {
let geom;
if (geometryType == GeometryType.POLYGON) {
const endss = [];
let offset = 0;
let prevEndIndex = 0;
for (let i = 0, ii = ends.length; i < ii; ++i) {
const end = ends[i];
if (!linearRingIsClockwise(flatCoordinates, offset, end, 2)) {
endss.push(ends.slice(prevEndIndex, i));
prevEndIndex = i;
}
offset = end;
}
if (endss.length > 1) {
geom = new MultiPolygon(flatCoordinates, GeometryLayout.XY, endss);
} else {
geom = new Polygon(flatCoordinates, GeometryLayout.XY, ends);
}
} else {
geom = geometryType === GeometryType.POINT ? new Point(flatCoordinates, GeometryLayout.XY) :
geometryType === GeometryType.LINE_STRING ? new LineString(flatCoordinates, GeometryLayout.XY) :
geometryType === GeometryType.POLYGON ? new Polygon(flatCoordinates, GeometryLayout.XY, ends) :
geometryType === GeometryType.MULTI_POINT ? new MultiPoint(flatCoordinates, GeometryLayout.XY) :
geometryType === GeometryType.MULTI_LINE_STRING ? new MultiLineString(flatCoordinates, GeometryLayout.XY, ends) :
null;
}
feature = new this.featureClass_();
if (this.geometryName_) {
feature.setGeometryName(this.geometryName_);
}
const geometry = transformWithOptions(geom, false, this.adaptOptions(opt_options));
feature.setGeometry(geometry);
feature.setId(id);
feature.setProperties(values);
}
return feature;
};
/**
* @inheritDoc
* @api
*/
MVT.prototype.getLastExtent = function() {
return this.extent_;
};
/**
* @inheritDoc
*/
MVT.prototype.getType = function() {
return FormatType.ARRAY_BUFFER;
};
/**
* @inheritDoc
* @api
*/
MVT.prototype.readFeatures = function(source, opt_options) {
const layers = this.layers_;
const pbf = new PBF(/** @type {ArrayBuffer} */ (source));
const pbfLayers = pbf.readFields(layersPBFReader, {});
/** @type {Array.<module:ol/Feature|module:ol/render/Feature>} */
const features = [];
for (const name in pbfLayers) {
if (layers && layers.indexOf(name) == -1) {
continue;
}
const pbfLayer = pbfLayers[name];
for (let i = 0, ii = pbfLayer.length; i < ii; ++i) {
const rawFeature = readRawFeature(pbf, pbfLayer, i);
features.push(this.createFeature_(pbf, rawFeature));
}
this.extent_ = pbfLayer ? [0, 0, pbfLayer.extent, pbfLayer.extent] : null;
}
return features;
};
/**
* @inheritDoc
* @api
*/
MVT.prototype.readProjection = function(source) {
return this.dataProjection;
};
/**
* Sets the layers that features will be read from.
* @param {Array.<string>} layers Layers.
* @api
*/
MVT.prototype.setLayers = function(layers) {
this.layers_ = layers;
};
/**
* Not implemented.
* @override
*/
MVT.prototype.readFeature = function() {};
/**
* Not implemented.
* @override
*/
MVT.prototype.readGeometry = function() {};
/**
* Not implemented.
* @override
*/
MVT.prototype.writeFeature = function() {};
/**
* Not implemented.
* @override
*/
MVT.prototype.writeGeometry = function() {};
/**
* Not implemented.
* @override
*/
MVT.prototype.writeFeatures = function() {};
export default MVT; export default MVT;
+77 -104
View File
@@ -2,7 +2,6 @@
* @module ol/format/OSMXML * @module ol/format/OSMXML
*/ */
// FIXME add typedef for stack state objects // FIXME add typedef for stack state objects
import {inherits} from '../util.js';
import {extend} from '../array.js'; import {extend} from '../array.js';
import Feature from '../Feature.js'; import Feature from '../Feature.js';
import {transformWithOptions} from '../format/Feature.js'; import {transformWithOptions} from '../format/Feature.js';
@@ -15,26 +14,6 @@ import {isEmpty} from '../obj.js';
import {get as getProjection} from '../proj.js'; import {get as getProjection} from '../proj.js';
import {pushParseAndPop, makeStructureNS} from '../xml.js'; import {pushParseAndPop, makeStructureNS} from '../xml.js';
/**
* @classdesc
* Feature format for reading data in the
* [OSMXML format](http://wiki.openstreetmap.org/wiki/OSM_XML).
*
* @constructor
* @extends {module:ol/format/XMLFeature}
* @api
*/
const OSMXML = function() {
XMLFeature.call(this);
/**
* @inheritDoc
*/
this.dataProjection = getProjection('EPSG:4326');
};
inherits(OSMXML, XMLFeature);
/** /**
* @const * @const
@@ -65,6 +44,83 @@ const PARSERS = makeStructureNS(
}); });
/**
* @classdesc
* Feature format for reading data in the
* [OSMXML format](http://wiki.openstreetmap.org/wiki/OSM_XML).
*
* @api
*/
class OSMXML extends XMLFeature {
constructor() {
super();
/**
* @inheritDoc
*/
this.dataProjection = getProjection('EPSG:4326');
}
/**
* @inheritDoc
*/
readFeaturesFromNode(node, opt_options) {
const options = this.getReadOptions(node, opt_options);
if (node.localName == 'osm') {
const state = pushParseAndPop({
nodes: {},
ways: [],
features: []
}, PARSERS, node, [options]);
// parse nodes in ways
for (let j = 0; j < state.ways.length; j++) {
const values = /** @type {Object} */ (state.ways[j]);
/** @type {Array.<number>} */
const flatCoordinates = [];
for (let i = 0, ii = values.ndrefs.length; i < ii; i++) {
const point = state.nodes[values.ndrefs[i]];
extend(flatCoordinates, point);
}
let geometry;
if (values.ndrefs[0] == values.ndrefs[values.ndrefs.length - 1]) {
// closed way
geometry = new Polygon(flatCoordinates, GeometryLayout.XY, [flatCoordinates.length]);
} else {
geometry = new LineString(flatCoordinates, GeometryLayout.XY);
}
transformWithOptions(geometry, false, options);
const feature = new Feature(geometry);
feature.setId(values.id);
feature.setProperties(values.tags);
state.features.push(feature);
}
if (state.features) {
return state.features;
}
}
return [];
}
/**
* Not implemented.
* @inheritDoc
*/
writeFeatureNode(feature, opt_options) {}
/**
* Not implemented.
* @inheritDoc
*/
writeFeaturesNode(features, opt_options) {}
/**
* Not implemented.
* @inheritDoc
*/
writeGeometryNode(geometry, opt_options) {}
}
/** /**
* @const * @const
* @type {Object.<string, Object.<string, module:ol/xml~Parser>>} * @type {Object.<string, Object.<string, module:ol/xml~Parser>>}
@@ -140,87 +196,4 @@ function readTag(node, objectStack) {
} }
/**
* Read all features from an OSM source.
*
* @function
* @param {Document|Node|Object|string} source Source.
* @param {module:ol/format/Feature~ReadOptions=} opt_options Read options.
* @return {Array.<module:ol/Feature>} Features.
* @api
*/
OSMXML.prototype.readFeatures;
/**
* @inheritDoc
*/
OSMXML.prototype.readFeaturesFromNode = function(node, opt_options) {
const options = this.getReadOptions(node, opt_options);
if (node.localName == 'osm') {
const state = pushParseAndPop({
nodes: {},
ways: [],
features: []
}, PARSERS, node, [options]);
// parse nodes in ways
for (let j = 0; j < state.ways.length; j++) {
const values = /** @type {Object} */ (state.ways[j]);
/** @type {Array.<number>} */
const flatCoordinates = [];
for (let i = 0, ii = values.ndrefs.length; i < ii; i++) {
const point = state.nodes[values.ndrefs[i]];
extend(flatCoordinates, point);
}
let geometry;
if (values.ndrefs[0] == values.ndrefs[values.ndrefs.length - 1]) {
// closed way
geometry = new Polygon(flatCoordinates, GeometryLayout.XY, [flatCoordinates.length]);
} else {
geometry = new LineString(flatCoordinates, GeometryLayout.XY);
}
transformWithOptions(geometry, false, options);
const feature = new Feature(geometry);
feature.setId(values.id);
feature.setProperties(values.tags);
state.features.push(feature);
}
if (state.features) {
return state.features;
}
}
return [];
};
/**
* Read the projection from an OSM source.
*
* @function
* @param {Document|Node|Object|string} source Source.
* @return {module:ol/proj/Projection} Projection.
* @api
*/
OSMXML.prototype.readProjection;
/**
* Not implemented.
* @inheritDoc
*/
OSMXML.prototype.writeFeatureNode = function(feature, opt_options) {};
/**
* Not implemented.
* @inheritDoc
*/
OSMXML.prototype.writeFeaturesNode = function(features, opt_options) {};
/**
* Not implemented.
* @inheritDoc
*/
OSMXML.prototype.writeGeometryNode = function(geometry, opt_options) {};
export default OSMXML; export default OSMXML;
+28 -34
View File
@@ -1,22 +1,11 @@
/** /**
* @module ol/format/OWS * @module ol/format/OWS
*/ */
import {inherits} from '../util.js';
import {readHref} from '../format/XLink.js'; import {readHref} from '../format/XLink.js';
import XML from '../format/XML.js'; import XML from '../format/XML.js';
import {readString} from '../format/xsd.js'; import {readString} from '../format/xsd.js';
import {makeObjectPropertyPusher, makeObjectPropertySetter, makeStructureNS, pushParseAndPop} from '../xml.js'; import {makeObjectPropertyPusher, makeObjectPropertySetter, makeStructureNS, pushParseAndPop} from '../xml.js';
/**
* @constructor
* @extends {module:ol/format/XML}
*/
const OWS = function() {
XML.call(this);
};
inherits(OWS, XML);
/** /**
* @const * @const
@@ -37,6 +26,34 @@ const PARSERS = makeStructureNS(
}); });
class OWS extends XML {
constructor() {
super();
}
/**
* @inheritDoc
*/
readFromDocument(doc) {
for (let n = doc.firstChild; n; n = n.nextSibling) {
if (n.nodeType == Node.ELEMENT_NODE) {
return this.readFromNode(n);
}
}
return null;
}
/**
* @inheritDoc
*/
readFromNode(node) {
const owsObject = pushParseAndPop({},
PARSERS, node, []);
return owsObject ? owsObject : null;
}
}
/** /**
* @const * @const
* @type {Object.<string, Object.<string, module:ol/xml~Parser>>} * @type {Object.<string, Object.<string, module:ol/xml~Parser>>}
@@ -187,29 +204,6 @@ const SERVICE_PROVIDER_PARSERS =
}); });
/**
* @inheritDoc
*/
OWS.prototype.readFromDocument = function(doc) {
for (let n = doc.firstChild; n; n = n.nextSibling) {
if (n.nodeType == Node.ELEMENT_NODE) {
return this.readFromNode(n);
}
}
return null;
};
/**
* @inheritDoc
*/
OWS.prototype.readFromNode = function(node) {
const owsObject = pushParseAndPop({},
PARSERS, node, []);
return owsObject ? owsObject : null;
};
/** /**
* @param {Node} node Node. * @param {Node} node Node.
* @param {Array.<*>} objectStack Object stack. * @param {Array.<*>} objectStack Object stack.
+81 -139
View File
@@ -1,7 +1,6 @@
/** /**
* @module ol/format/Polyline * @module ol/format/Polyline
*/ */
import {inherits} from '../util.js';
import {assert} from '../asserts.js'; import {assert} from '../asserts.js';
import Feature from '../Feature.js'; import Feature from '../Feature.js';
import {transformWithOptions} from '../format/Feature.js'; import {transformWithOptions} from '../format/Feature.js';
@@ -27,16 +26,25 @@ import {get as getProjection} from '../proj.js';
* Feature format for reading and writing data in the Encoded * Feature format for reading and writing data in the Encoded
* Polyline Algorithm Format. * Polyline Algorithm Format.
* *
* @constructor * When reading features, the coordinates are assumed to be in two dimensions
* @extends {module:ol/format/TextFeature} * and in [latitude, longitude] order.
* @param {module:ol/format/Polyline~Options=} opt_options Optional configuration object. *
* As Polyline sources contain a single feature,
* {@link module:ol/format/Polyline~Polyline#readFeatures} will return the
* feature in an array.
*
* @api * @api
*/ */
const Polyline = function(opt_options) { class Polyline extends TextFeature {
/**
* @param {module:ol/format/Polyline~Options=} opt_options Optional configuration object.
*/
constructor(opt_options) {
super();
const options = opt_options ? opt_options : {}; const options = opt_options ? opt_options : {};
TextFeature.call(this);
/** /**
* @inheritDoc * @inheritDoc
@@ -55,9 +63,74 @@ const Polyline = function(opt_options) {
*/ */
this.geometryLayout_ = options.geometryLayout ? this.geometryLayout_ = options.geometryLayout ?
options.geometryLayout : GeometryLayout.XY; options.geometryLayout : GeometryLayout.XY;
}; }
inherits(Polyline, TextFeature); /**
* @inheritDoc
*/
readFeatureFromText(text, opt_options) {
const geometry = this.readGeometryFromText(text, opt_options);
return new Feature(geometry);
}
/**
* @inheritDoc
*/
readFeaturesFromText(text, opt_options) {
const feature = this.readFeatureFromText(text, opt_options);
return [feature];
}
/**
* @inheritDoc
*/
readGeometryFromText(text, opt_options) {
const stride = getStrideForLayout(this.geometryLayout_);
const flatCoordinates = decodeDeltas(text, stride, this.factor_);
flipXY(flatCoordinates, 0, flatCoordinates.length, stride, flatCoordinates);
const coordinates = inflateCoordinates(flatCoordinates, 0, flatCoordinates.length, stride);
return (
/** @type {module:ol/geom/Geometry} */ (transformWithOptions(
new LineString(coordinates, this.geometryLayout_),
false,
this.adaptOptions(opt_options)
))
);
}
/**
* @inheritDoc
*/
writeFeatureText(feature, opt_options) {
const geometry = feature.getGeometry();
if (geometry) {
return this.writeGeometryText(geometry, opt_options);
} else {
assert(false, 40); // Expected `feature` to have a geometry
return '';
}
}
/**
* @inheritDoc
*/
writeFeaturesText(features, opt_options) {
return this.writeFeatureText(features[0], opt_options);
}
/**
* @inheritDoc
*/
writeGeometryText(geometry, opt_options) {
geometry = /** @type {module:ol/geom/LineString} */
(transformWithOptions(geometry, true, this.adaptOptions(opt_options)));
const flatCoordinates = geometry.getFlatCoordinates();
const stride = geometry.getStride();
flipXY(flatCoordinates, 0, flatCoordinates.length, stride, flatCoordinates);
return encodeDeltas(flatCoordinates, stride, this.factor_);
}
}
/** /**
@@ -264,135 +337,4 @@ export function encodeUnsignedInteger(num) {
} }
/**
* Read the feature from the Polyline source. The coordinates are assumed to be
* in two dimensions and in latitude, longitude order.
*
* @function
* @param {Document|Node|Object|string} source Source.
* @param {module:ol/format/Feature~ReadOptions=} opt_options Read options.
* @return {module:ol/Feature} Feature.
* @api
*/
Polyline.prototype.readFeature;
/**
* @inheritDoc
*/
Polyline.prototype.readFeatureFromText = function(text, opt_options) {
const geometry = this.readGeometryFromText(text, opt_options);
return new Feature(geometry);
};
/**
* Read the feature from the source. As Polyline sources contain a single
* feature, this will return the feature in an array.
*
* @function
* @param {Document|Node|Object|string} source Source.
* @param {module:ol/format/Feature~ReadOptions=} opt_options Read options.
* @return {Array.<module:ol/Feature>} Features.
* @api
*/
Polyline.prototype.readFeatures;
/**
* @inheritDoc
*/
Polyline.prototype.readFeaturesFromText = function(text, opt_options) {
const feature = this.readFeatureFromText(text, opt_options);
return [feature];
};
/**
* Read the geometry from the source.
*
* @function
* @param {Document|Node|Object|string} source Source.
* @param {module:ol/format/Feature~ReadOptions=} opt_options Read options.
* @return {module:ol/geom/Geometry} Geometry.
* @api
*/
Polyline.prototype.readGeometry;
/**
* @inheritDoc
*/
Polyline.prototype.readGeometryFromText = function(text, opt_options) {
const stride = getStrideForLayout(this.geometryLayout_);
const flatCoordinates = decodeDeltas(text, stride, this.factor_);
flipXY(flatCoordinates, 0, flatCoordinates.length, stride, flatCoordinates);
const coordinates = inflateCoordinates(flatCoordinates, 0, flatCoordinates.length, stride);
return (
/** @type {module:ol/geom/Geometry} */ (transformWithOptions(
new LineString(coordinates, this.geometryLayout_),
false,
this.adaptOptions(opt_options)
))
);
};
/**
* Read the projection from a Polyline source.
*
* @function
* @param {Document|Node|Object|string} source Source.
* @return {module:ol/proj/Projection} Projection.
* @api
*/
Polyline.prototype.readProjection;
/**
* @inheritDoc
*/
Polyline.prototype.writeFeatureText = function(feature, opt_options) {
const geometry = feature.getGeometry();
if (geometry) {
return this.writeGeometryText(geometry, opt_options);
} else {
assert(false, 40); // Expected `feature` to have a geometry
return '';
}
};
/**
* @inheritDoc
*/
Polyline.prototype.writeFeaturesText = function(features, opt_options) {
return this.writeFeatureText(features[0], opt_options);
};
/**
* Write a single geometry in Polyline format.
*
* @function
* @param {module:ol/geom/Geometry} geometry Geometry.
* @param {module:ol/format/Feature~WriteOptions=} opt_options Write options.
* @return {string} Geometry.
* @api
*/
Polyline.prototype.writeGeometry;
/**
* @inheritDoc
*/
Polyline.prototype.writeGeometryText = function(geometry, opt_options) {
geometry = /** @type {module:ol/geom/LineString} */
(transformWithOptions(geometry, true, this.adaptOptions(opt_options)));
const flatCoordinates = geometry.getFlatCoordinates();
const stride = geometry.getStride();
flipXY(flatCoordinates, 0, flatCoordinates.length, stride, flatCoordinates);
return encodeDeltas(flatCoordinates, stride, this.factor_);
};
export default Polyline; export default Polyline;
+160 -139
View File
@@ -1,7 +1,6 @@
/** /**
* @module ol/format/TextFeature * @module ol/format/TextFeature
*/ */
import {inherits} from '../util.js';
import FeatureFormat from '../format/Feature.js'; import FeatureFormat from '../format/Feature.js';
import FormatType from '../format/FormatType.js'; import FormatType from '../format/FormatType.js';
@@ -11,15 +10,169 @@ import FormatType from '../format/FormatType.js';
* instantiated in apps. * instantiated in apps.
* Base class for text feature formats. * Base class for text feature formats.
* *
* @constructor
* @abstract * @abstract
* @extends {module:ol/format/Feature}
*/ */
const TextFeature = function() { class TextFeature extends FeatureFormat {
FeatureFormat.call(this); constructor() {
}; super();
}
inherits(TextFeature, FeatureFormat); /**
* @inheritDoc
*/
getType() {
return FormatType.TEXT;
}
/**
* Read the feature from the source.
*
* @param {Document|Node|Object|string} source Source.
* @param {module:ol/format/Feature~ReadOptions=} opt_options Read options.
* @return {module:ol/Feature} Feature.
* @api
*/
readFeature(source, opt_options) {
return this.readFeatureFromText(getText(source), this.adaptOptions(opt_options));
}
/**
* @abstract
* @param {string} text Text.
* @param {module:ol/format/Feature~ReadOptions=} opt_options Read options.
* @protected
* @return {module:ol/Feature} Feature.
*/
readFeatureFromText(text, opt_options) {}
/**
* Read the features from the source.
*
* @param {Document|Node|Object|string} source Source.
* @param {module:ol/format/Feature~ReadOptions=} opt_options Read options.
* @return {Array.<module:ol/Feature>} Features.
* @api
*/
readFeatures(source, opt_options) {
return this.readFeaturesFromText(getText(source), this.adaptOptions(opt_options));
}
/**
* @abstract
* @param {string} text Text.
* @param {module:ol/format/Feature~ReadOptions=} opt_options Read options.
* @protected
* @return {Array.<module:ol/Feature>} Features.
*/
readFeaturesFromText(text, opt_options) {}
/**
* Read the geometry from the source.
*
* @param {Document|Node|Object|string} source Source.
* @param {module:ol/format/Feature~ReadOptions=} opt_options Read options.
* @return {module:ol/geom/Geometry} Geometry.
* @api
*/
readGeometry(source, opt_options) {
return this.readGeometryFromText(getText(source), this.adaptOptions(opt_options));
}
/**
* @abstract
* @param {string} text Text.
* @param {module:ol/format/Feature~ReadOptions=} opt_options Read options.
* @protected
* @return {module:ol/geom/Geometry} Geometry.
*/
readGeometryFromText(text, opt_options) {}
/**
* Read the projection from the source.
*
* @function
* @param {Document|Node|Object|string} source Source.
* @return {module:ol/proj/Projection} Projection.
* @api
*/
readProjection(source) {
return this.readProjectionFromText(getText(source));
}
/**
* @param {string} text Text.
* @protected
* @return {module:ol/proj/Projection} Projection.
*/
readProjectionFromText(text) {
return this.dataProjection;
}
/**
* Encode a feature as a string.
*
* @function
* @param {module:ol/Feature} feature Feature.
* @param {module:ol/format/Feature~WriteOptions=} opt_options Write options.
* @return {string} Encoded feature.
* @api
*/
writeFeature(feature, opt_options) {
return this.writeFeatureText(feature, this.adaptOptions(opt_options));
}
/**
* @abstract
* @param {module:ol/Feature} feature Features.
* @param {module:ol/format/Feature~WriteOptions=} opt_options Write options.
* @protected
* @return {string} Text.
*/
writeFeatureText(feature, opt_options) {}
/**
* Encode an array of features as string.
*
* @param {Array.<module:ol/Feature>} features Features.
* @param {module:ol/format/Feature~WriteOptions=} opt_options Write options.
* @return {string} Encoded features.
* @api
*/
writeFeatures(features, opt_options) {
return this.writeFeaturesText(features, this.adaptOptions(opt_options));
}
/**
* @abstract
* @param {Array.<module:ol/Feature>} features Features.
* @param {module:ol/format/Feature~WriteOptions=} opt_options Write options.
* @protected
* @return {string} Text.
*/
writeFeaturesText(features, opt_options) {}
/**
* Write a single geometry.
*
* @function
* @param {module:ol/geom/Geometry} geometry Geometry.
* @param {module:ol/format/Feature~WriteOptions=} opt_options Write options.
* @return {string} Geometry.
* @api
*/
writeGeometry(geometry, opt_options) {
return this.writeGeometryText(geometry, this.adaptOptions(opt_options));
}
/**
* @abstract
* @param {module:ol/geom/Geometry} geometry Geometry.
* @param {module:ol/format/Feature~WriteOptions=} opt_options Write options.
* @protected
* @return {string} Text.
*/
writeGeometryText(geometry, opt_options) {}
}
/** /**
@@ -35,136 +188,4 @@ function getText(source) {
} }
/**
* @inheritDoc
*/
TextFeature.prototype.getType = function() {
return FormatType.TEXT;
};
/**
* @inheritDoc
*/
TextFeature.prototype.readFeature = function(source, opt_options) {
return this.readFeatureFromText(getText(source), this.adaptOptions(opt_options));
};
/**
* @abstract
* @param {string} text Text.
* @param {module:ol/format/Feature~ReadOptions=} opt_options Read options.
* @protected
* @return {module:ol/Feature} Feature.
*/
TextFeature.prototype.readFeatureFromText = function(text, opt_options) {};
/**
* @inheritDoc
*/
TextFeature.prototype.readFeatures = function(source, opt_options) {
return this.readFeaturesFromText(getText(source), this.adaptOptions(opt_options));
};
/**
* @abstract
* @param {string} text Text.
* @param {module:ol/format/Feature~ReadOptions=} opt_options Read options.
* @protected
* @return {Array.<module:ol/Feature>} Features.
*/
TextFeature.prototype.readFeaturesFromText = function(text, opt_options) {};
/**
* @inheritDoc
*/
TextFeature.prototype.readGeometry = function(source, opt_options) {
return this.readGeometryFromText(getText(source), this.adaptOptions(opt_options));
};
/**
* @abstract
* @param {string} text Text.
* @param {module:ol/format/Feature~ReadOptions=} opt_options Read options.
* @protected
* @return {module:ol/geom/Geometry} Geometry.
*/
TextFeature.prototype.readGeometryFromText = function(text, opt_options) {};
/**
* @inheritDoc
*/
TextFeature.prototype.readProjection = function(source) {
return this.readProjectionFromText(getText(source));
};
/**
* @param {string} text Text.
* @protected
* @return {module:ol/proj/Projection} Projection.
*/
TextFeature.prototype.readProjectionFromText = function(text) {
return this.dataProjection;
};
/**
* @inheritDoc
*/
TextFeature.prototype.writeFeature = function(feature, opt_options) {
return this.writeFeatureText(feature, this.adaptOptions(opt_options));
};
/**
* @abstract
* @param {module:ol/Feature} feature Features.
* @param {module:ol/format/Feature~WriteOptions=} opt_options Write options.
* @protected
* @return {string} Text.
*/
TextFeature.prototype.writeFeatureText = function(feature, opt_options) {};
/**
* @inheritDoc
*/
TextFeature.prototype.writeFeatures = function(features, opt_options) {
return this.writeFeaturesText(features, this.adaptOptions(opt_options));
};
/**
* @abstract
* @param {Array.<module:ol/Feature>} features Features.
* @param {module:ol/format/Feature~WriteOptions=} opt_options Write options.
* @protected
* @return {string} Text.
*/
TextFeature.prototype.writeFeaturesText = function(features, opt_options) {};
/**
* @inheritDoc
*/
TextFeature.prototype.writeGeometry = function(geometry, opt_options) {
return this.writeGeometryText(geometry, this.adaptOptions(opt_options));
};
/**
* @abstract
* @param {module:ol/geom/Geometry} geometry Geometry.
* @param {module:ol/format/Feature~WriteOptions=} opt_options Write options.
* @protected
* @return {string} Text.
*/
TextFeature.prototype.writeGeometryText = function(geometry, opt_options) {};
export default TextFeature; export default TextFeature;
+86 -114
View File
@@ -1,7 +1,6 @@
/** /**
* @module ol/format/TopoJSON * @module ol/format/TopoJSON
*/ */
import {inherits} from '../util.js';
import Feature from '../Feature.js'; import Feature from '../Feature.js';
import {transformWithOptions} from '../format/Feature.js'; import {transformWithOptions} from '../format/Feature.js';
import JSONFeature from '../format/JSONFeature.js'; import JSONFeature from '../format/JSONFeature.js';
@@ -43,17 +42,18 @@ import {get as getProjection} from '../proj.js';
* @classdesc * @classdesc
* Feature format for reading data in the TopoJSON format. * Feature format for reading data in the TopoJSON format.
* *
* @constructor
* @extends {module:ol/format/JSONFeature}
* @param {module:ol/format/TopoJSON~Options=} opt_options Options.
* @api * @api
*/ */
const TopoJSON = function(opt_options) { class TopoJSON extends JSONFeature {
/**
* @param {module:ol/format/TopoJSON~Options=} opt_options Options.
*/
constructor(opt_options) {
super();
const options = opt_options ? opt_options : {}; const options = opt_options ? opt_options : {};
JSONFeature.call(this);
/** /**
* @private * @private
* @type {string|undefined} * @type {string|undefined}
@@ -73,9 +73,86 @@ const TopoJSON = function(opt_options) {
options.dataProjection ? options.dataProjection ?
options.dataProjection : 'EPSG:4326'); options.dataProjection : 'EPSG:4326');
}; }
inherits(TopoJSON, JSONFeature); /**
* @inheritDoc
*/
readFeaturesFromObject(object, opt_options) {
if (object.type == 'Topology') {
const topoJSONTopology = /** @type {TopoJSONTopology} */ (object);
let transform, scale = null, translate = null;
if (topoJSONTopology.transform) {
transform = topoJSONTopology.transform;
scale = transform.scale;
translate = transform.translate;
}
const arcs = topoJSONTopology.arcs;
if (transform) {
transformArcs(arcs, scale, translate);
}
/** @type {Array.<module:ol/Feature>} */
const features = [];
const topoJSONFeatures = topoJSONTopology.objects;
const property = this.layerName_;
let feature;
for (const objectName in topoJSONFeatures) {
if (this.layers_ && this.layers_.indexOf(objectName) == -1) {
continue;
}
if (topoJSONFeatures[objectName].type === 'GeometryCollection') {
feature = /** @type {TopoJSONGeometryCollection} */ (topoJSONFeatures[objectName]);
features.push.apply(features, readFeaturesFromGeometryCollection(
feature, arcs, scale, translate, property, objectName, opt_options));
} else {
feature = /** @type {TopoJSONGeometry} */ (topoJSONFeatures[objectName]);
features.push(readFeatureFromGeometry(
feature, arcs, scale, translate, property, objectName, opt_options));
}
}
return features;
} else {
return [];
}
}
/**
* @inheritDoc
*/
readProjectionFromObject(object) {
return this.dataProjection;
}
/**
* Not implemented.
* @inheritDoc
*/
writeFeatureObject(feature, opt_options) {}
/**
* Not implemented.
* @inheritDoc
*/
writeFeaturesObject(features, opt_options) {}
/**
* Not implemented.
* @inheritDoc
*/
writeGeometryObject(geometry, opt_options) {}
/**
* Not implemented.
* @override
*/
readGeometryFromObject() {}
/**
* Not implemented.
* @override
*/
readFeatureFromObject() {}
}
/** /**
@@ -298,59 +375,6 @@ function readFeatureFromGeometry(object, arcs, scale, translate, property, name,
} }
/**
* Read all features from a TopoJSON source.
*
* @function
* @param {Document|Node|Object|string} source Source.
* @return {Array.<module:ol/Feature>} Features.
* @api
*/
TopoJSON.prototype.readFeatures;
/**
* @inheritDoc
*/
TopoJSON.prototype.readFeaturesFromObject = function(object, opt_options) {
if (object.type == 'Topology') {
const topoJSONTopology = /** @type {TopoJSONTopology} */ (object);
let transform, scale = null, translate = null;
if (topoJSONTopology.transform) {
transform = topoJSONTopology.transform;
scale = transform.scale;
translate = transform.translate;
}
const arcs = topoJSONTopology.arcs;
if (transform) {
transformArcs(arcs, scale, translate);
}
/** @type {Array.<module:ol/Feature>} */
const features = [];
const topoJSONFeatures = topoJSONTopology.objects;
const property = this.layerName_;
let feature;
for (const objectName in topoJSONFeatures) {
if (this.layers_ && this.layers_.indexOf(objectName) == -1) {
continue;
}
if (topoJSONFeatures[objectName].type === 'GeometryCollection') {
feature = /** @type {TopoJSONGeometryCollection} */ (topoJSONFeatures[objectName]);
features.push.apply(features, readFeaturesFromGeometryCollection(
feature, arcs, scale, translate, property, objectName, opt_options));
} else {
feature = /** @type {TopoJSONGeometry} */ (topoJSONFeatures[objectName]);
features.push(readFeatureFromGeometry(
feature, arcs, scale, translate, property, objectName, opt_options));
}
}
return features;
} else {
return [];
}
};
/** /**
* Apply a linear transform to array of arcs. The provided array of arcs is * Apply a linear transform to array of arcs. The provided array of arcs is
* modified in place. * modified in place.
@@ -401,56 +425,4 @@ function transformVertex(vertex, scale, translate) {
} }
/**
* Read the projection from a TopoJSON source.
*
* @param {Document|Node|Object|string} object Source.
* @return {module:ol/proj/Projection} Projection.
* @override
* @api
*/
TopoJSON.prototype.readProjection;
/**
* @inheritDoc
*/
TopoJSON.prototype.readProjectionFromObject = function(object) {
return this.dataProjection;
};
/**
* Not implemented.
* @inheritDoc
*/
TopoJSON.prototype.writeFeatureObject = function(feature, opt_options) {};
/**
* Not implemented.
* @inheritDoc
*/
TopoJSON.prototype.writeFeaturesObject = function(features, opt_options) {};
/**
* Not implemented.
* @inheritDoc
*/
TopoJSON.prototype.writeGeometryObject = function(geometry, opt_options) {};
/**
* Not implemented.
* @override
*/
TopoJSON.prototype.readGeometryFromObject = function() {};
/**
* Not implemented.
* @override
*/
TopoJSON.prototype.readFeatureFromObject = function() {};
export default TopoJSON; export default TopoJSON;
+267 -301
View File
@@ -1,7 +1,6 @@
/** /**
* @module ol/format/WFS * @module ol/format/WFS
*/ */
import {inherits} from '../util.js';
import {assert} from '../asserts.js'; import {assert} from '../asserts.js';
import GML2 from '../format/GML2.js'; import GML2 from '../format/GML2.js';
import GML3 from '../format/GML3.js'; import GML3 from '../format/GML3.js';
@@ -17,6 +16,69 @@ import {createElementNS, isDocument, isNode, makeArrayPusher, makeChildAppender,
pushParseAndPop, pushSerializeAndPop, XML_SCHEMA_INSTANCE_URI} from '../xml.js'; pushParseAndPop, pushSerializeAndPop, XML_SCHEMA_INSTANCE_URI} from '../xml.js';
/**
* @const
* @type {Object.<string, Object.<string, module:ol/xml~Parser>>}
*/
const FEATURE_COLLECTION_PARSERS = {
'http://www.opengis.net/gml': {
'boundedBy': makeObjectPropertySetter(
GMLBase.prototype.readGeometryElement, 'bounds')
}
};
/**
* @const
* @type {Object.<string, Object.<string, module:ol/xml~Parser>>}
*/
const TRANSACTION_SUMMARY_PARSERS = {
'http://www.opengis.net/wfs': {
'totalInserted': makeObjectPropertySetter(readNonNegativeInteger),
'totalUpdated': makeObjectPropertySetter(readNonNegativeInteger),
'totalDeleted': makeObjectPropertySetter(readNonNegativeInteger)
}
};
/**
* @const
* @type {Object.<string, Object.<string, module:ol/xml~Parser>>}
*/
const TRANSACTION_RESPONSE_PARSERS = {
'http://www.opengis.net/wfs': {
'TransactionSummary': makeObjectPropertySetter(
readTransactionSummary, 'transactionSummary'),
'InsertResults': makeObjectPropertySetter(
readInsertResults, 'insertIds')
}
};
/**
* @type {Object.<string, Object.<string, module:ol/xml~Serializer>>}
*/
const QUERY_SERIALIZERS = {
'http://www.opengis.net/wfs': {
'PropertyName': makeChildAppender(writeStringTextNode)
}
};
/**
* @type {Object.<string, Object.<string, module:ol/xml~Serializer>>}
*/
const TRANSACTION_SERIALIZERS = {
'http://www.opengis.net/wfs': {
'Insert': makeChildAppender(writeFeature),
'Update': makeChildAppender(writeUpdate),
'Delete': makeChildAppender(writeDelete),
'Property': makeChildAppender(writeProperty),
'Native': makeChildAppender(writeNative)
}
};
/** /**
* @typedef {Object} Options * @typedef {Object} Options
* @property {Object.<string, string>|string} [featureNS] The namespace URI used for features. * @property {Object.<string, string>|string} [featureNS] The namespace URI used for features.
@@ -138,12 +200,16 @@ const DEFAULT_VERSION = '1.1.0';
* as option if you want to read a WFS that contains GML2 (WFS 1.0.0). * as option if you want to read a WFS that contains GML2 (WFS 1.0.0).
* Also see {@link module:ol/format/GMLBase~GMLBase} which is used by this format. * Also see {@link module:ol/format/GMLBase~GMLBase} which is used by this format.
* *
* @constructor
* @param {module:ol/format/WFS~Options=} opt_options Optional configuration object.
* @extends {module:ol/format/XMLFeature}
* @api * @api
*/ */
const WFS = function(opt_options) { class WFS extends XMLFeature {
/**
* @param {module:ol/format/WFS~Options=} opt_options Optional configuration object.
*/
constructor(opt_options) {
super();
const options = opt_options ? opt_options : {}; const options = opt_options ? opt_options : {};
/** /**
@@ -171,45 +237,26 @@ const WFS = function(opt_options) {
*/ */
this.schemaLocation_ = options.schemaLocation ? this.schemaLocation_ = options.schemaLocation ?
options.schemaLocation : SCHEMA_LOCATIONS[DEFAULT_VERSION]; options.schemaLocation : SCHEMA_LOCATIONS[DEFAULT_VERSION];
}
XMLFeature.call(this);
};
inherits(WFS, XMLFeature);
/** /**
* @return {Array.<string>|string|undefined} featureType * @return {Array.<string>|string|undefined} featureType
*/ */
WFS.prototype.getFeatureType = function() { getFeatureType() {
return this.featureType_; return this.featureType_;
}; }
/** /**
* @param {Array.<string>|string|undefined} featureType Feature type(s) to parse. * @param {Array.<string>|string|undefined} featureType Feature type(s) to parse.
*/ */
WFS.prototype.setFeatureType = function(featureType) { setFeatureType(featureType) {
this.featureType_ = featureType; this.featureType_ = featureType;
}; }
/**
* Read all features from a WFS FeatureCollection.
*
* @function
* @param {Document|Node|Object|string} source Source.
* @param {module:ol/format/Feature~ReadOptions=} opt_options Read options.
* @return {Array.<module:ol/Feature>} Features.
* @api
*/
WFS.prototype.readFeatures;
/** /**
* @inheritDoc * @inheritDoc
*/ */
WFS.prototype.readFeaturesFromNode = function(node, opt_options) { readFeaturesFromNode(node, opt_options) {
const context = /** @type {module:ol/xml~NodeStackItem} */ ({ const context = /** @type {module:ol/xml~NodeStackItem} */ ({
'featureType': this.featureType_, 'featureType': this.featureType_,
'featureNS': this.featureNS_ 'featureNS': this.featureNS_
@@ -226,8 +273,7 @@ WFS.prototype.readFeaturesFromNode = function(node, opt_options) {
features = []; features = [];
} }
return features; return features;
}; }
/** /**
* Read transaction response of the source. * Read transaction response of the source.
@@ -236,7 +282,7 @@ WFS.prototype.readFeaturesFromNode = function(node, opt_options) {
* @return {module:ol/format/WFS~TransactionResponse|undefined} Transaction response. * @return {module:ol/format/WFS~TransactionResponse|undefined} Transaction response.
* @api * @api
*/ */
WFS.prototype.readTransactionResponse = function(source) { readTransactionResponse(source) {
if (isDocument(source)) { if (isDocument(source)) {
return this.readTransactionResponseFromDocument( return this.readTransactionResponseFromDocument(
/** @type {Document} */ (source)); /** @type {Document} */ (source));
@@ -248,8 +294,7 @@ WFS.prototype.readTransactionResponse = function(source) {
} else { } else {
return undefined; return undefined;
} }
}; }
/** /**
* Read feature collection metadata of the source. * Read feature collection metadata of the source.
@@ -259,7 +304,7 @@ WFS.prototype.readTransactionResponse = function(source) {
* FeatureCollection metadata. * FeatureCollection metadata.
* @api * @api
*/ */
WFS.prototype.readFeatureCollectionMetadata = function(source) { readFeatureCollectionMetadata(source) {
if (isDocument(source)) { if (isDocument(source)) {
return this.readFeatureCollectionMetadataFromDocument( return this.readFeatureCollectionMetadataFromDocument(
/** @type {Document} */ (source)); /** @type {Document} */ (source));
@@ -272,42 +317,28 @@ WFS.prototype.readFeatureCollectionMetadata = function(source) {
} else { } else {
return undefined; return undefined;
} }
}; }
/** /**
* @param {Document} doc Document. * @param {Document} doc Document.
* @return {module:ol/format/WFS~FeatureCollectionMetadata|undefined} * @return {module:ol/format/WFS~FeatureCollectionMetadata|undefined}
* FeatureCollection metadata. * FeatureCollection metadata.
*/ */
WFS.prototype.readFeatureCollectionMetadataFromDocument = function(doc) { readFeatureCollectionMetadataFromDocument(doc) {
for (let n = doc.firstChild; n; n = n.nextSibling) { for (let n = doc.firstChild; n; n = n.nextSibling) {
if (n.nodeType == Node.ELEMENT_NODE) { if (n.nodeType == Node.ELEMENT_NODE) {
return this.readFeatureCollectionMetadataFromNode(n); return this.readFeatureCollectionMetadataFromNode(n);
} }
} }
return undefined; return undefined;
};
/**
* @const
* @type {Object.<string, Object.<string, module:ol/xml~Parser>>}
*/
const FEATURE_COLLECTION_PARSERS = {
'http://www.opengis.net/gml': {
'boundedBy': makeObjectPropertySetter(
GMLBase.prototype.readGeometryElement, 'bounds')
} }
};
/** /**
* @param {Node} node Node. * @param {Node} node Node.
* @return {module:ol/format/WFS~FeatureCollectionMetadata|undefined} * @return {module:ol/format/WFS~FeatureCollectionMetadata|undefined}
* FeatureCollection metadata. * FeatureCollection metadata.
*/ */
WFS.prototype.readFeatureCollectionMetadataFromNode = function(node) { readFeatureCollectionMetadataFromNode(node) {
const result = {}; const result = {};
const value = readNonNegativeIntegerString( const value = readNonNegativeIntegerString(
node.getAttribute('numberOfFeatures')); node.getAttribute('numberOfFeatures'));
@@ -315,20 +346,194 @@ WFS.prototype.readFeatureCollectionMetadataFromNode = function(node) {
return pushParseAndPop( return pushParseAndPop(
/** @type {module:ol/format/WFS~FeatureCollectionMetadata} */ (result), /** @type {module:ol/format/WFS~FeatureCollectionMetadata} */ (result),
FEATURE_COLLECTION_PARSERS, node, [], this.gmlFormat_); FEATURE_COLLECTION_PARSERS, node, [], this.gmlFormat_);
}; }
/** /**
* @const * @param {Document} doc Document.
* @type {Object.<string, Object.<string, module:ol/xml~Parser>>} * @return {module:ol/format/WFS~TransactionResponse|undefined} Transaction response.
*/ */
const TRANSACTION_SUMMARY_PARSERS = { readTransactionResponseFromDocument(doc) {
'http://www.opengis.net/wfs': { for (let n = doc.firstChild; n; n = n.nextSibling) {
'totalInserted': makeObjectPropertySetter(readNonNegativeInteger), if (n.nodeType == Node.ELEMENT_NODE) {
'totalUpdated': makeObjectPropertySetter(readNonNegativeInteger), return this.readTransactionResponseFromNode(n);
'totalDeleted': makeObjectPropertySetter(readNonNegativeInteger)
} }
}
return undefined;
}
/**
* @param {Node} node Node.
* @return {module:ol/format/WFS~TransactionResponse|undefined} Transaction response.
*/
readTransactionResponseFromNode(node) {
return pushParseAndPop(
/** @type {module:ol/format/WFS~TransactionResponse} */({}),
TRANSACTION_RESPONSE_PARSERS, node, []);
}
/**
* Encode format as WFS `GetFeature` and return the Node.
*
* @param {module:ol/format/WFS~WriteGetFeatureOptions} options Options.
* @return {Node} Result.
* @api
*/
writeGetFeature(options) {
const node = createElementNS(WFSNS, 'GetFeature');
node.setAttribute('service', 'WFS');
node.setAttribute('version', '1.1.0');
let filter;
if (options) {
if (options.handle) {
node.setAttribute('handle', options.handle);
}
if (options.outputFormat) {
node.setAttribute('outputFormat', options.outputFormat);
}
if (options.maxFeatures !== undefined) {
node.setAttribute('maxFeatures', options.maxFeatures);
}
if (options.resultType) {
node.setAttribute('resultType', options.resultType);
}
if (options.startIndex !== undefined) {
node.setAttribute('startIndex', options.startIndex);
}
if (options.count !== undefined) {
node.setAttribute('count', options.count);
}
filter = options.filter;
if (options.bbox) {
assert(options.geometryName,
12); // `options.geometryName` must also be provided when `options.bbox` is set
const bbox = bboxFilter(
/** @type {string} */ (options.geometryName), options.bbox, options.srsName);
if (filter) {
// if bbox and filter are both set, combine the two into a single filter
filter = andFilter(filter, bbox);
} else {
filter = bbox;
}
}
}
node.setAttributeNS(XML_SCHEMA_INSTANCE_URI, 'xsi:schemaLocation', this.schemaLocation_);
/** @type {module:ol/xml~NodeStackItem} */
const context = {
node: node,
'srsName': options.srsName,
'featureNS': options.featureNS ? options.featureNS : this.featureNS_,
'featurePrefix': options.featurePrefix,
'geometryName': options.geometryName,
'filter': filter,
'propertyNames': options.propertyNames ? options.propertyNames : []
}; };
assert(Array.isArray(options.featureTypes),
11); // `options.featureTypes` should be an Array
writeGetFeature(node, /** @type {!Array.<string>} */ (options.featureTypes), [context]);
return node;
}
/**
* Encode format as WFS `Transaction` and return the Node.
*
* @param {Array.<module:ol/Feature>} inserts The features to insert.
* @param {Array.<module:ol/Feature>} updates The features to update.
* @param {Array.<module:ol/Feature>} deletes The features to delete.
* @param {module:ol/format/WFS~WriteTransactionOptions} options Write options.
* @return {Node} Result.
* @api
*/
writeTransaction(inserts, updates, deletes, options) {
const objectStack = [];
const node = createElementNS(WFSNS, 'Transaction');
const version = options.version ? options.version : DEFAULT_VERSION;
const gmlVersion = version === '1.0.0' ? 2 : 3;
node.setAttribute('service', 'WFS');
node.setAttribute('version', version);
let baseObj;
/** @type {module:ol/xml~NodeStackItem} */
let obj;
if (options) {
baseObj = options.gmlOptions ? options.gmlOptions : {};
if (options.handle) {
node.setAttribute('handle', options.handle);
}
}
const schemaLocation = SCHEMA_LOCATIONS[version];
node.setAttributeNS(XML_SCHEMA_INSTANCE_URI, 'xsi:schemaLocation', schemaLocation);
const featurePrefix = options.featurePrefix ? options.featurePrefix : FEATURE_PREFIX;
if (inserts) {
obj = {node: node, 'featureNS': options.featureNS,
'featureType': options.featureType, 'featurePrefix': featurePrefix,
'gmlVersion': gmlVersion, 'hasZ': options.hasZ, 'srsName': options.srsName};
assign(obj, baseObj);
pushSerializeAndPop(obj,
TRANSACTION_SERIALIZERS,
makeSimpleNodeFactory('Insert'), inserts,
objectStack);
}
if (updates) {
obj = {node: node, 'featureNS': options.featureNS,
'featureType': options.featureType, 'featurePrefix': featurePrefix,
'gmlVersion': gmlVersion, 'hasZ': options.hasZ, 'srsName': options.srsName};
assign(obj, baseObj);
pushSerializeAndPop(obj,
TRANSACTION_SERIALIZERS,
makeSimpleNodeFactory('Update'), updates,
objectStack);
}
if (deletes) {
pushSerializeAndPop({node: node, 'featureNS': options.featureNS,
'featureType': options.featureType, 'featurePrefix': featurePrefix,
'gmlVersion': gmlVersion, 'srsName': options.srsName},
TRANSACTION_SERIALIZERS,
makeSimpleNodeFactory('Delete'), deletes,
objectStack);
}
if (options.nativeElements) {
pushSerializeAndPop({node: node, 'featureNS': options.featureNS,
'featureType': options.featureType, 'featurePrefix': featurePrefix,
'gmlVersion': gmlVersion, 'srsName': options.srsName},
TRANSACTION_SERIALIZERS,
makeSimpleNodeFactory('Native'), options.nativeElements,
objectStack);
}
return node;
}
/**
* @inheritDoc
*/
readProjectionFromDocument(doc) {
for (let n = doc.firstChild; n; n = n.nextSibling) {
if (n.nodeType == Node.ELEMENT_NODE) {
return this.readProjectionFromNode(n);
}
}
return null;
}
/**
* @inheritDoc
*/
readProjectionFromNode(node) {
if (node.firstElementChild &&
node.firstElementChild.firstElementChild) {
node = node.firstElementChild.firstElementChild;
for (let n = node.firstElementChild; n; n = n.nextElementSibling) {
if (!(n.childNodes.length === 0 ||
(n.childNodes.length === 1 &&
n.firstChild.nodeType === 3))) {
const objectStack = [{}];
this.gmlFormat_.readGeometryElement(n, objectStack);
return getProjection(objectStack.pop().srsName);
}
}
}
return null;
}
}
/** /**
@@ -386,55 +591,6 @@ function readInsertResults(node, objectStack) {
} }
/**
* @const
* @type {Object.<string, Object.<string, module:ol/xml~Parser>>}
*/
const TRANSACTION_RESPONSE_PARSERS = {
'http://www.opengis.net/wfs': {
'TransactionSummary': makeObjectPropertySetter(
readTransactionSummary, 'transactionSummary'),
'InsertResults': makeObjectPropertySetter(
readInsertResults, 'insertIds')
}
};
/**
* @param {Document} doc Document.
* @return {module:ol/format/WFS~TransactionResponse|undefined} Transaction response.
*/
WFS.prototype.readTransactionResponseFromDocument = function(doc) {
for (let n = doc.firstChild; n; n = n.nextSibling) {
if (n.nodeType == Node.ELEMENT_NODE) {
return this.readTransactionResponseFromNode(n);
}
}
return undefined;
};
/**
* @param {Node} node Node.
* @return {module:ol/format/WFS~TransactionResponse|undefined} Transaction response.
*/
WFS.prototype.readTransactionResponseFromNode = function(node) {
return pushParseAndPop(
/** @type {module:ol/format/WFS~TransactionResponse} */({}),
TRANSACTION_RESPONSE_PARSERS, node, []);
};
/**
* @type {Object.<string, Object.<string, module:ol/xml~Serializer>>}
*/
const QUERY_SERIALIZERS = {
'http://www.opengis.net/wfs': {
'PropertyName': makeChildAppender(writeStringTextNode)
}
};
/** /**
* @param {Node} node Node. * @param {Node} node Node.
* @param {module:ol/Feature} feature Feature. * @param {module:ol/Feature} feature Feature.
@@ -507,20 +663,6 @@ function writeDelete(node, feature, objectStack) {
} }
/**
* @type {Object.<string, Object.<string, module:ol/xml~Serializer>>}
*/
const TRANSACTION_SERIALIZERS = {
'http://www.opengis.net/wfs': {
'Insert': makeChildAppender(writeFeature),
'Update': makeChildAppender(writeUpdate),
'Delete': makeChildAppender(writeDelete),
'Property': makeChildAppender(writeProperty),
'Native': makeChildAppender(writeNative)
}
};
/** /**
* @param {Node} node Node. * @param {Node} node Node.
* @param {module:ol/Feature} feature Feature. * @param {module:ol/Feature} feature Feature.
@@ -942,180 +1084,4 @@ function writeGetFeature(node, featureTypes, objectStack) {
} }
/**
* Encode format as WFS `GetFeature` and return the Node.
*
* @param {module:ol/format/WFS~WriteGetFeatureOptions} options Options.
* @return {Node} Result.
* @api
*/
WFS.prototype.writeGetFeature = function(options) {
const node = createElementNS(WFSNS, 'GetFeature');
node.setAttribute('service', 'WFS');
node.setAttribute('version', '1.1.0');
let filter;
if (options) {
if (options.handle) {
node.setAttribute('handle', options.handle);
}
if (options.outputFormat) {
node.setAttribute('outputFormat', options.outputFormat);
}
if (options.maxFeatures !== undefined) {
node.setAttribute('maxFeatures', options.maxFeatures);
}
if (options.resultType) {
node.setAttribute('resultType', options.resultType);
}
if (options.startIndex !== undefined) {
node.setAttribute('startIndex', options.startIndex);
}
if (options.count !== undefined) {
node.setAttribute('count', options.count);
}
filter = options.filter;
if (options.bbox) {
assert(options.geometryName,
12); // `options.geometryName` must also be provided when `options.bbox` is set
const bbox = bboxFilter(
/** @type {string} */ (options.geometryName), options.bbox, options.srsName);
if (filter) {
// if bbox and filter are both set, combine the two into a single filter
filter = andFilter(filter, bbox);
} else {
filter = bbox;
}
}
}
node.setAttributeNS(XML_SCHEMA_INSTANCE_URI, 'xsi:schemaLocation', this.schemaLocation_);
/** @type {module:ol/xml~NodeStackItem} */
const context = {
node: node,
'srsName': options.srsName,
'featureNS': options.featureNS ? options.featureNS : this.featureNS_,
'featurePrefix': options.featurePrefix,
'geometryName': options.geometryName,
'filter': filter,
'propertyNames': options.propertyNames ? options.propertyNames : []
};
assert(Array.isArray(options.featureTypes),
11); // `options.featureTypes` should be an Array
writeGetFeature(node, /** @type {!Array.<string>} */ (options.featureTypes), [context]);
return node;
};
/**
* Encode format as WFS `Transaction` and return the Node.
*
* @param {Array.<module:ol/Feature>} inserts The features to insert.
* @param {Array.<module:ol/Feature>} updates The features to update.
* @param {Array.<module:ol/Feature>} deletes The features to delete.
* @param {module:ol/format/WFS~WriteTransactionOptions} options Write options.
* @return {Node} Result.
* @api
*/
WFS.prototype.writeTransaction = function(inserts, updates, deletes, options) {
const objectStack = [];
const node = createElementNS(WFSNS, 'Transaction');
const version = options.version ? options.version : DEFAULT_VERSION;
const gmlVersion = version === '1.0.0' ? 2 : 3;
node.setAttribute('service', 'WFS');
node.setAttribute('version', version);
let baseObj;
/** @type {module:ol/xml~NodeStackItem} */
let obj;
if (options) {
baseObj = options.gmlOptions ? options.gmlOptions : {};
if (options.handle) {
node.setAttribute('handle', options.handle);
}
}
const schemaLocation = SCHEMA_LOCATIONS[version];
node.setAttributeNS(XML_SCHEMA_INSTANCE_URI, 'xsi:schemaLocation', schemaLocation);
const featurePrefix = options.featurePrefix ? options.featurePrefix : FEATURE_PREFIX;
if (inserts) {
obj = {node: node, 'featureNS': options.featureNS,
'featureType': options.featureType, 'featurePrefix': featurePrefix,
'gmlVersion': gmlVersion, 'hasZ': options.hasZ, 'srsName': options.srsName};
assign(obj, baseObj);
pushSerializeAndPop(obj,
TRANSACTION_SERIALIZERS,
makeSimpleNodeFactory('Insert'), inserts,
objectStack);
}
if (updates) {
obj = {node: node, 'featureNS': options.featureNS,
'featureType': options.featureType, 'featurePrefix': featurePrefix,
'gmlVersion': gmlVersion, 'hasZ': options.hasZ, 'srsName': options.srsName};
assign(obj, baseObj);
pushSerializeAndPop(obj,
TRANSACTION_SERIALIZERS,
makeSimpleNodeFactory('Update'), updates,
objectStack);
}
if (deletes) {
pushSerializeAndPop({node: node, 'featureNS': options.featureNS,
'featureType': options.featureType, 'featurePrefix': featurePrefix,
'gmlVersion': gmlVersion, 'srsName': options.srsName},
TRANSACTION_SERIALIZERS,
makeSimpleNodeFactory('Delete'), deletes,
objectStack);
}
if (options.nativeElements) {
pushSerializeAndPop({node: node, 'featureNS': options.featureNS,
'featureType': options.featureType, 'featurePrefix': featurePrefix,
'gmlVersion': gmlVersion, 'srsName': options.srsName},
TRANSACTION_SERIALIZERS,
makeSimpleNodeFactory('Native'), options.nativeElements,
objectStack);
}
return node;
};
/**
* Read the projection from a WFS source.
*
* @function
* @param {Document|Node|Object|string} source Source.
* @return {?module:ol/proj/Projection} Projection.
* @api
*/
WFS.prototype.readProjection;
/**
* @inheritDoc
*/
WFS.prototype.readProjectionFromDocument = function(doc) {
for (let n = doc.firstChild; n; n = n.nextSibling) {
if (n.nodeType == Node.ELEMENT_NODE) {
return this.readProjectionFromNode(n);
}
}
return null;
};
/**
* @inheritDoc
*/
WFS.prototype.readProjectionFromNode = function(node) {
if (node.firstElementChild &&
node.firstElementChild.firstElementChild) {
node = node.firstElementChild.firstElementChild;
for (let n = node.firstElementChild; n; n = n.nextElementSibling) {
if (!(n.childNodes.length === 0 ||
(n.childNodes.length === 1 &&
n.firstChild.nodeType === 3))) {
const objectStack = [{}];
this.gmlFormat_.readGeometryElement(n, objectStack);
return getProjection(objectStack.pop().srsName);
}
}
}
return null;
};
export default WFS; export default WFS;
+256 -328
View File
@@ -1,7 +1,6 @@
/** /**
* @module ol/format/WKT * @module ol/format/WKT
*/ */
import {inherits} from '../util.js';
import Feature from '../Feature.js'; import Feature from '../Feature.js';
import {transformWithOptions} from '../format/Feature.js'; import {transformWithOptions} from '../format/Feature.js';
import TextFeature from '../format/TextFeature.js'; import TextFeature from '../format/TextFeature.js';
@@ -17,6 +16,19 @@ import Polygon from '../geom/Polygon.js';
import SimpleGeometry from '../geom/SimpleGeometry.js'; import SimpleGeometry from '../geom/SimpleGeometry.js';
/**
* @enum {function (new:module:ol/geom/Geometry, Array, module:ol/geom/GeometryLayout)}
*/
const GeometryConstructor = {
'POINT': Point,
'LINESTRING': LineString,
'POLYGON': Polygon,
'MULTIPOINT': MultiPoint,
'MULTILINESTRING': MultiLineString,
'MULTIPOLYGON': MultiPolygon
};
/** /**
* @typedef {Object} Options * @typedef {Object} Options
* @property {boolean} [splitCollection=false] Whether to split GeometryCollections into * @property {boolean} [splitCollection=false] Whether to split GeometryCollections into
@@ -71,13 +83,25 @@ const TokenType = {
EOF: 6 EOF: 6
}; };
/**
* @const
* @type {Object.<string, string>}
*/
const WKTGeometryType = {};
for (const type in GeometryType) {
WKTGeometryType[type] = GeometryType[type].toUpperCase();
}
/** /**
* Class to tokenize a WKT string. * Class to tokenize a WKT string.
* @param {string} wkt WKT string.
* @constructor
*/ */
const Lexer = function(wkt) { class Lexer {
/**
* @param {string} wkt WKT string.
*/
constructor(wkt) {
/** /**
* @type {string} * @type {string}
@@ -89,18 +113,16 @@ const Lexer = function(wkt) {
* @private * @private
*/ */
this.index_ = -1; this.index_ = -1;
}; }
/** /**
* @param {string} c Character. * @param {string} c Character.
* @return {boolean} Whether the character is alphabetic. * @return {boolean} Whether the character is alphabetic.
* @private * @private
*/ */
Lexer.prototype.isAlpha_ = function(c) { isAlpha_(c) {
return c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z'; return c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z';
}; }
/** /**
* @param {string} c Character. * @param {string} c Character.
@@ -109,36 +131,33 @@ Lexer.prototype.isAlpha_ = function(c) {
* @return {boolean} Whether the character is numeric. * @return {boolean} Whether the character is numeric.
* @private * @private
*/ */
Lexer.prototype.isNumeric_ = function(c, opt_decimal) { isNumeric_(c, opt_decimal) {
const decimal = opt_decimal !== undefined ? opt_decimal : false; const decimal = opt_decimal !== undefined ? opt_decimal : false;
return c >= '0' && c <= '9' || c == '.' && !decimal; return c >= '0' && c <= '9' || c == '.' && !decimal;
}; }
/** /**
* @param {string} c Character. * @param {string} c Character.
* @return {boolean} Whether the character is whitespace. * @return {boolean} Whether the character is whitespace.
* @private * @private
*/ */
Lexer.prototype.isWhiteSpace_ = function(c) { isWhiteSpace_(c) {
return c == ' ' || c == '\t' || c == '\r' || c == '\n'; return c == ' ' || c == '\t' || c == '\r' || c == '\n';
}; }
/** /**
* @return {string} Next string character. * @return {string} Next string character.
* @private * @private
*/ */
Lexer.prototype.nextChar_ = function() { nextChar_() {
return this.wkt.charAt(++this.index_); return this.wkt.charAt(++this.index_);
}; }
/** /**
* Fetch and return the next token. * Fetch and return the next token.
* @return {!module:ol/format/WKT~Token} Next string token. * @return {!module:ol/format/WKT~Token} Next string token.
*/ */
Lexer.prototype.nextToken = function() { nextToken() {
const c = this.nextChar_(); const c = this.nextChar_();
const token = {position: this.index_, value: c}; const token = {position: this.index_, value: c};
@@ -163,14 +182,13 @@ Lexer.prototype.nextToken = function() {
} }
return token; return token;
}; }
/** /**
* @return {number} Numeric token value. * @return {number} Numeric token value.
* @private * @private
*/ */
Lexer.prototype.readNumber_ = function() { readNumber_() {
let c; let c;
const index = this.index_; const index = this.index_;
let decimal = false; let decimal = false;
@@ -192,29 +210,31 @@ Lexer.prototype.readNumber_ = function() {
scientificNotation && (c == '-' || c == '+') scientificNotation && (c == '-' || c == '+')
); );
return parseFloat(this.wkt.substring(index, this.index_--)); return parseFloat(this.wkt.substring(index, this.index_--));
}; }
/** /**
* @return {string} String token value. * @return {string} String token value.
* @private * @private
*/ */
Lexer.prototype.readText_ = function() { readText_() {
let c; let c;
const index = this.index_; const index = this.index_;
do { do {
c = this.nextChar_(); c = this.nextChar_();
} while (this.isAlpha_(c)); } while (this.isAlpha_(c));
return this.wkt.substring(index, this.index_--).toUpperCase(); return this.wkt.substring(index, this.index_--).toUpperCase();
}; }
}
/** /**
* Class to parse the tokens from the WKT string. * Class to parse the tokens from the WKT string.
* @param {module:ol/format/WKT~Lexer} lexer The lexer.
* @constructor
*/ */
const Parser = function(lexer) { class Parser {
/**
* @param {module:ol/format/WKT~Lexer} lexer The lexer.
*/
constructor(lexer) {
/** /**
* @type {module:ol/format/WKT~Lexer} * @type {module:ol/format/WKT~Lexer}
@@ -233,59 +253,55 @@ const Parser = function(lexer) {
* @private * @private
*/ */
this.layout_ = GeometryLayout.XY; this.layout_ = GeometryLayout.XY;
}; }
/** /**
* Fetch the next token form the lexer and replace the active token. * Fetch the next token form the lexer and replace the active token.
* @private * @private
*/ */
Parser.prototype.consume_ = function() { consume_() {
this.token_ = this.lexer_.nextToken(); this.token_ = this.lexer_.nextToken();
}; }
/** /**
* Tests if the given type matches the type of the current token. * Tests if the given type matches the type of the current token.
* @param {module:ol/format/WKT~TokenType} type Token type. * @param {module:ol/format/WKT~TokenType} type Token type.
* @return {boolean} Whether the token matches the given type. * @return {boolean} Whether the token matches the given type.
*/ */
Parser.prototype.isTokenType = function(type) { isTokenType(type) {
const isMatch = this.token_.type == type; const isMatch = this.token_.type == type;
return isMatch; return isMatch;
}; }
/** /**
* If the given type matches the current token, consume it. * If the given type matches the current token, consume it.
* @param {module:ol/format/WKT~TokenType} type Token type. * @param {module:ol/format/WKT~TokenType} type Token type.
* @return {boolean} Whether the token matches the given type. * @return {boolean} Whether the token matches the given type.
*/ */
Parser.prototype.match = function(type) { match(type) {
const isMatch = this.isTokenType(type); const isMatch = this.isTokenType(type);
if (isMatch) { if (isMatch) {
this.consume_(); this.consume_();
} }
return isMatch; return isMatch;
}; }
/** /**
* Try to parse the tokens provided by the lexer. * Try to parse the tokens provided by the lexer.
* @return {module:ol/geom/Geometry} The geometry. * @return {module:ol/geom/Geometry} The geometry.
*/ */
Parser.prototype.parse = function() { parse() {
this.consume_(); this.consume_();
const geometry = this.parseGeometry_(); const geometry = this.parseGeometry_();
return geometry; return geometry;
}; }
/** /**
* Try to parse the dimensional info. * Try to parse the dimensional info.
* @return {module:ol/geom/GeometryLayout} The layout. * @return {module:ol/geom/GeometryLayout} The layout.
* @private * @private
*/ */
Parser.prototype.parseGeometryLayout_ = function() { parseGeometryLayout_() {
let layout = GeometryLayout.XY; let layout = GeometryLayout.XY;
const dimToken = this.token_; const dimToken = this.token_;
if (this.isTokenType(TokenType.TEXT)) { if (this.isTokenType(TokenType.TEXT)) {
@@ -302,14 +318,13 @@ Parser.prototype.parseGeometryLayout_ = function() {
} }
} }
return layout; return layout;
}; }
/** /**
* @return {!Array.<module:ol/geom/Geometry>} A collection of geometries. * @return {!Array.<module:ol/geom/Geometry>} A collection of geometries.
* @private * @private
*/ */
Parser.prototype.parseGeometryCollectionText_ = function() { parseGeometryCollectionText_() {
if (this.match(TokenType.LEFT_PAREN)) { if (this.match(TokenType.LEFT_PAREN)) {
const geometries = []; const geometries = [];
do { do {
@@ -322,14 +337,13 @@ Parser.prototype.parseGeometryCollectionText_ = function() {
return []; return [];
} }
throw new Error(this.formatErrorMessage_()); throw new Error(this.formatErrorMessage_());
}; }
/** /**
* @return {Array.<number>} All values in a point. * @return {Array.<number>} All values in a point.
* @private * @private
*/ */
Parser.prototype.parsePointText_ = function() { parsePointText_() {
if (this.match(TokenType.LEFT_PAREN)) { if (this.match(TokenType.LEFT_PAREN)) {
const coordinates = this.parsePoint_(); const coordinates = this.parsePoint_();
if (this.match(TokenType.RIGHT_PAREN)) { if (this.match(TokenType.RIGHT_PAREN)) {
@@ -339,14 +353,13 @@ Parser.prototype.parsePointText_ = function() {
return null; return null;
} }
throw new Error(this.formatErrorMessage_()); throw new Error(this.formatErrorMessage_());
}; }
/** /**
* @return {!Array.<!Array.<number>>} All points in a linestring. * @return {!Array.<!Array.<number>>} All points in a linestring.
* @private * @private
*/ */
Parser.prototype.parseLineStringText_ = function() { parseLineStringText_() {
if (this.match(TokenType.LEFT_PAREN)) { if (this.match(TokenType.LEFT_PAREN)) {
const coordinates = this.parsePointList_(); const coordinates = this.parsePointList_();
if (this.match(TokenType.RIGHT_PAREN)) { if (this.match(TokenType.RIGHT_PAREN)) {
@@ -356,14 +369,13 @@ Parser.prototype.parseLineStringText_ = function() {
return []; return [];
} }
throw new Error(this.formatErrorMessage_()); throw new Error(this.formatErrorMessage_());
}; }
/** /**
* @return {!Array.<!Array.<number>>} All points in a polygon. * @return {!Array.<!Array.<number>>} All points in a polygon.
* @private * @private
*/ */
Parser.prototype.parsePolygonText_ = function() { parsePolygonText_() {
if (this.match(TokenType.LEFT_PAREN)) { if (this.match(TokenType.LEFT_PAREN)) {
const coordinates = this.parseLineStringTextList_(); const coordinates = this.parseLineStringTextList_();
if (this.match(TokenType.RIGHT_PAREN)) { if (this.match(TokenType.RIGHT_PAREN)) {
@@ -373,14 +385,13 @@ Parser.prototype.parsePolygonText_ = function() {
return []; return [];
} }
throw new Error(this.formatErrorMessage_()); throw new Error(this.formatErrorMessage_());
}; }
/** /**
* @return {!Array.<!Array.<number>>} All points in a multipoint. * @return {!Array.<!Array.<number>>} All points in a multipoint.
* @private * @private
*/ */
Parser.prototype.parseMultiPointText_ = function() { parseMultiPointText_() {
if (this.match(TokenType.LEFT_PAREN)) { if (this.match(TokenType.LEFT_PAREN)) {
let coordinates; let coordinates;
if (this.token_.type == TokenType.LEFT_PAREN) { if (this.token_.type == TokenType.LEFT_PAREN) {
@@ -395,15 +406,14 @@ Parser.prototype.parseMultiPointText_ = function() {
return []; return [];
} }
throw new Error(this.formatErrorMessage_()); throw new Error(this.formatErrorMessage_());
}; }
/** /**
* @return {!Array.<!Array.<number>>} All linestring points * @return {!Array.<!Array.<number>>} All linestring points
* in a multilinestring. * in a multilinestring.
* @private * @private
*/ */
Parser.prototype.parseMultiLineStringText_ = function() { parseMultiLineStringText_() {
if (this.match(TokenType.LEFT_PAREN)) { if (this.match(TokenType.LEFT_PAREN)) {
const coordinates = this.parseLineStringTextList_(); const coordinates = this.parseLineStringTextList_();
if (this.match(TokenType.RIGHT_PAREN)) { if (this.match(TokenType.RIGHT_PAREN)) {
@@ -413,14 +423,13 @@ Parser.prototype.parseMultiLineStringText_ = function() {
return []; return [];
} }
throw new Error(this.formatErrorMessage_()); throw new Error(this.formatErrorMessage_());
}; }
/** /**
* @return {!Array.<!Array.<number>>} All polygon points in a multipolygon. * @return {!Array.<!Array.<number>>} All polygon points in a multipolygon.
* @private * @private
*/ */
Parser.prototype.parseMultiPolygonText_ = function() { parseMultiPolygonText_() {
if (this.match(TokenType.LEFT_PAREN)) { if (this.match(TokenType.LEFT_PAREN)) {
const coordinates = this.parsePolygonTextList_(); const coordinates = this.parsePolygonTextList_();
if (this.match(TokenType.RIGHT_PAREN)) { if (this.match(TokenType.RIGHT_PAREN)) {
@@ -430,14 +439,13 @@ Parser.prototype.parseMultiPolygonText_ = function() {
return []; return [];
} }
throw new Error(this.formatErrorMessage_()); throw new Error(this.formatErrorMessage_());
}; }
/** /**
* @return {!Array.<number>} A point. * @return {!Array.<number>} A point.
* @private * @private
*/ */
Parser.prototype.parsePoint_ = function() { parsePoint_() {
const coordinates = []; const coordinates = [];
const dimensions = this.layout_.length; const dimensions = this.layout_.length;
for (let i = 0; i < dimensions; ++i) { for (let i = 0; i < dimensions; ++i) {
@@ -452,84 +460,141 @@ Parser.prototype.parsePoint_ = function() {
return coordinates; return coordinates;
} }
throw new Error(this.formatErrorMessage_()); throw new Error(this.formatErrorMessage_());
}; }
/** /**
* @return {!Array.<!Array.<number>>} An array of points. * @return {!Array.<!Array.<number>>} An array of points.
* @private * @private
*/ */
Parser.prototype.parsePointList_ = function() { parsePointList_() {
const coordinates = [this.parsePoint_()]; const coordinates = [this.parsePoint_()];
while (this.match(TokenType.COMMA)) { while (this.match(TokenType.COMMA)) {
coordinates.push(this.parsePoint_()); coordinates.push(this.parsePoint_());
} }
return coordinates; return coordinates;
}; }
/** /**
* @return {!Array.<!Array.<number>>} An array of points. * @return {!Array.<!Array.<number>>} An array of points.
* @private * @private
*/ */
Parser.prototype.parsePointTextList_ = function() { parsePointTextList_() {
const coordinates = [this.parsePointText_()]; const coordinates = [this.parsePointText_()];
while (this.match(TokenType.COMMA)) { while (this.match(TokenType.COMMA)) {
coordinates.push(this.parsePointText_()); coordinates.push(this.parsePointText_());
} }
return coordinates; return coordinates;
}; }
/** /**
* @return {!Array.<!Array.<number>>} An array of points. * @return {!Array.<!Array.<number>>} An array of points.
* @private * @private
*/ */
Parser.prototype.parseLineStringTextList_ = function() { parseLineStringTextList_() {
const coordinates = [this.parseLineStringText_()]; const coordinates = [this.parseLineStringText_()];
while (this.match(TokenType.COMMA)) { while (this.match(TokenType.COMMA)) {
coordinates.push(this.parseLineStringText_()); coordinates.push(this.parseLineStringText_());
} }
return coordinates; return coordinates;
}; }
/** /**
* @return {!Array.<!Array.<number>>} An array of points. * @return {!Array.<!Array.<number>>} An array of points.
* @private * @private
*/ */
Parser.prototype.parsePolygonTextList_ = function() { parsePolygonTextList_() {
const coordinates = [this.parsePolygonText_()]; const coordinates = [this.parsePolygonText_()];
while (this.match(TokenType.COMMA)) { while (this.match(TokenType.COMMA)) {
coordinates.push(this.parsePolygonText_()); coordinates.push(this.parsePolygonText_());
} }
return coordinates; return coordinates;
}; }
/** /**
* @return {boolean} Whether the token implies an empty geometry. * @return {boolean} Whether the token implies an empty geometry.
* @private * @private
*/ */
Parser.prototype.isEmptyGeometry_ = function() { isEmptyGeometry_() {
const isEmpty = this.isTokenType(TokenType.TEXT) && const isEmpty = this.isTokenType(TokenType.TEXT) &&
this.token_.value == EMPTY; this.token_.value == EMPTY;
if (isEmpty) { if (isEmpty) {
this.consume_(); this.consume_();
} }
return isEmpty; return isEmpty;
}; }
/** /**
* Create an error message for an unexpected token error. * Create an error message for an unexpected token error.
* @return {string} Error message. * @return {string} Error message.
* @private * @private
*/ */
Parser.prototype.formatErrorMessage_ = function() { formatErrorMessage_() {
return 'Unexpected `' + this.token_.value + '` at position ' + return 'Unexpected `' + this.token_.value + '` at position ' +
this.token_.position + ' in `' + this.lexer_.wkt + '`'; this.token_.position + ' in `' + this.lexer_.wkt + '`';
}; }
/**
* @return {!module:ol/geom/Geometry} The geometry.
* @private
*/
parseGeometry_() {
const token = this.token_;
if (this.match(TokenType.TEXT)) {
const geomType = token.value;
this.layout_ = this.parseGeometryLayout_();
if (geomType == 'GEOMETRYCOLLECTION') {
const geometries = this.parseGeometryCollectionText_();
return new GeometryCollection(geometries);
} else {
const ctor = GeometryConstructor[geomType];
if (!ctor) {
throw new Error('Invalid geometry type: ' + geomType);
}
let coordinates;
switch (geomType) {
case 'POINT': {
coordinates = this.parsePointText_();
break;
}
case 'LINESTRING': {
coordinates = this.parseLineStringText_();
break;
}
case 'POLYGON': {
coordinates = this.parsePolygonText_();
break;
}
case 'MULTIPOINT': {
coordinates = this.parseMultiPointText_();
break;
}
case 'MULTILINESTRING': {
coordinates = this.parseMultiLineStringText_();
break;
}
case 'MULTIPOLYGON': {
coordinates = this.parseMultiPolygonText_();
break;
}
default: {
throw new Error('Invalid geometry type: ' + geomType);
}
}
if (!coordinates) {
if (ctor === GeometryConstructor['POINT']) {
coordinates = [NaN, NaN];
} else {
coordinates = [];
}
}
return new ctor(coordinates, this.layout_);
}
}
throw new Error(this.formatErrorMessage_());
}
}
/** /**
@@ -537,16 +602,18 @@ Parser.prototype.formatErrorMessage_ = function() {
* Geometry format for reading and writing data in the `WellKnownText` (WKT) * Geometry format for reading and writing data in the `WellKnownText` (WKT)
* format. * format.
* *
* @constructor
* @extends {module:ol/format/TextFeature}
* @param {module:ol/format/WKT~Options=} opt_options Options.
* @api * @api
*/ */
const WKT = function(opt_options) { class WKT extends TextFeature {
/**
* @param {module:ol/format/WKT~Options=} opt_options Options.
*/
constructor(opt_options) {
super();
const options = opt_options ? opt_options : {}; const options = opt_options ? opt_options : {};
TextFeature.call(this);
/** /**
* Split GeometryCollection into multiple features. * Split GeometryCollection into multiple features.
@@ -556,9 +623,104 @@ const WKT = function(opt_options) {
this.splitCollection_ = options.splitCollection !== undefined ? this.splitCollection_ = options.splitCollection !== undefined ?
options.splitCollection : false; options.splitCollection : false;
}; }
inherits(WKT, TextFeature); /**
* Parse a WKT string.
* @param {string} wkt WKT string.
* @return {module:ol/geom/Geometry|undefined}
* The geometry created.
* @private
*/
parse_(wkt) {
const lexer = new Lexer(wkt);
const parser = new Parser(lexer);
return parser.parse();
}
/**
* @inheritDoc
*/
readFeatureFromText(text, opt_options) {
const geom = this.readGeometryFromText(text, opt_options);
if (geom) {
const feature = new Feature();
feature.setGeometry(geom);
return feature;
}
return null;
}
/**
* @inheritDoc
*/
readFeaturesFromText(text, opt_options) {
let geometries = [];
const geometry = this.readGeometryFromText(text, opt_options);
if (this.splitCollection_ &&
geometry.getType() == GeometryType.GEOMETRY_COLLECTION) {
geometries = (/** @type {module:ol/geom/GeometryCollection} */ (geometry))
.getGeometriesArray();
} else {
geometries = [geometry];
}
const features = [];
for (let i = 0, ii = geometries.length; i < ii; ++i) {
const feature = new Feature();
feature.setGeometry(geometries[i]);
features.push(feature);
}
return features;
}
/**
* @inheritDoc
*/
readGeometryFromText(text, opt_options) {
const geometry = this.parse_(text);
if (geometry) {
return (
/** @type {module:ol/geom/Geometry} */ (transformWithOptions(geometry, false, opt_options))
);
} else {
return null;
}
}
/**
* @inheritDoc
*/
writeFeatureText(feature, opt_options) {
const geometry = feature.getGeometry();
if (geometry) {
return this.writeGeometryText(geometry, opt_options);
}
return '';
}
/**
* @inheritDoc
*/
writeFeaturesText(features, opt_options) {
if (features.length == 1) {
return this.writeFeatureText(features[0], opt_options);
}
const geometries = [];
for (let i = 0, ii = features.length; i < ii; ++i) {
geometries.push(features[i].getGeometry());
}
const collection = new GeometryCollection(geometries);
return this.writeGeometryText(collection, opt_options);
}
/**
* @inheritDoc
*/
writeGeometryText(geometry, opt_options) {
return encode(/** @type {module:ol/geom/Geometry} */ (
transformWithOptions(geometry, true, opt_options)));
}
}
/** /**
@@ -712,238 +874,4 @@ function encode(geom) {
} }
/**
* Parse a WKT string.
* @param {string} wkt WKT string.
* @return {module:ol/geom/Geometry|undefined}
* The geometry created.
* @private
*/
WKT.prototype.parse_ = function(wkt) {
const lexer = new Lexer(wkt);
const parser = new Parser(lexer);
return parser.parse();
};
/**
* Read a feature from a WKT source.
*
* @function
* @param {Document|Node|Object|string} source Source.
* @param {module:ol/format/Feature~ReadOptions=} opt_options Read options.
* @return {module:ol/Feature} Feature.
* @api
*/
WKT.prototype.readFeature;
/**
* @inheritDoc
*/
WKT.prototype.readFeatureFromText = function(text, opt_options) {
const geom = this.readGeometryFromText(text, opt_options);
if (geom) {
const feature = new Feature();
feature.setGeometry(geom);
return feature;
}
return null;
};
/**
* Read all features from a WKT source.
*
* @function
* @param {Document|Node|Object|string} source Source.
* @param {module:ol/format/Feature~ReadOptions=} opt_options Read options.
* @return {Array.<module:ol/Feature>} Features.
* @api
*/
WKT.prototype.readFeatures;
/**
* @inheritDoc
*/
WKT.prototype.readFeaturesFromText = function(text, opt_options) {
let geometries = [];
const geometry = this.readGeometryFromText(text, opt_options);
if (this.splitCollection_ &&
geometry.getType() == GeometryType.GEOMETRY_COLLECTION) {
geometries = (/** @type {module:ol/geom/GeometryCollection} */ (geometry))
.getGeometriesArray();
} else {
geometries = [geometry];
}
const features = [];
for (let i = 0, ii = geometries.length; i < ii; ++i) {
const feature = new Feature();
feature.setGeometry(geometries[i]);
features.push(feature);
}
return features;
};
/**
* Read a single geometry from a WKT source.
*
* @function
* @param {Document|Node|Object|string} source Source.
* @param {module:ol/format/Feature~ReadOptions=} opt_options Read options.
* @return {module:ol/geom/Geometry} Geometry.
* @api
*/
WKT.prototype.readGeometry;
/**
* @inheritDoc
*/
WKT.prototype.readGeometryFromText = function(text, opt_options) {
const geometry = this.parse_(text);
if (geometry) {
return (
/** @type {module:ol/geom/Geometry} */ (transformWithOptions(geometry, false, opt_options))
);
} else {
return null;
}
};
/**
* @enum {function (new:module:ol/geom/Geometry, Array, module:ol/geom/GeometryLayout)}
*/
const GeometryConstructor = {
'POINT': Point,
'LINESTRING': LineString,
'POLYGON': Polygon,
'MULTIPOINT': MultiPoint,
'MULTILINESTRING': MultiLineString,
'MULTIPOLYGON': MultiPolygon
};
/**
* @enum {(function(): Array)}
*/
const GeometryParser = {
'POINT': Parser.prototype.parsePointText_,
'LINESTRING': Parser.prototype.parseLineStringText_,
'POLYGON': Parser.prototype.parsePolygonText_,
'MULTIPOINT': Parser.prototype.parseMultiPointText_,
'MULTILINESTRING': Parser.prototype.parseMultiLineStringText_,
'MULTIPOLYGON': Parser.prototype.parseMultiPolygonText_
};
/**
* @return {!module:ol/geom/Geometry} The geometry.
* @private
*/
Parser.prototype.parseGeometry_ = function() {
const token = this.token_;
if (this.match(TokenType.TEXT)) {
const geomType = token.value;
this.layout_ = this.parseGeometryLayout_();
if (geomType == GeometryType.GEOMETRY_COLLECTION.toUpperCase()) {
const geometries = this.parseGeometryCollectionText_();
return new GeometryCollection(geometries);
} else {
const parser = GeometryParser[geomType];
const ctor = GeometryConstructor[geomType];
if (!parser || !ctor) {
throw new Error('Invalid geometry type: ' + geomType);
}
let coordinates = parser.call(this);
if (!coordinates) {
if (ctor === GeometryConstructor[GeometryType.POINT]) {
coordinates = [NaN, NaN];
} else {
coordinates = [];
}
}
return new ctor(coordinates, this.layout_);
}
}
throw new Error(this.formatErrorMessage_());
};
/**
* Encode a feature as a WKT string.
*
* @function
* @param {module:ol/Feature} feature Feature.
* @param {module:ol/format/Feature~WriteOptions=} opt_options Write options.
* @return {string} WKT string.
* @api
*/
WKT.prototype.writeFeature;
/**
* @inheritDoc
*/
WKT.prototype.writeFeatureText = function(feature, opt_options) {
const geometry = feature.getGeometry();
if (geometry) {
return this.writeGeometryText(geometry, opt_options);
}
return '';
};
/**
* Encode an array of features as a WKT string.
*
* @function
* @param {Array.<module:ol/Feature>} features Features.
* @param {module:ol/format/Feature~WriteOptions=} opt_options Write options.
* @return {string} WKT string.
* @api
*/
WKT.prototype.writeFeatures;
/**
* @inheritDoc
*/
WKT.prototype.writeFeaturesText = function(features, opt_options) {
if (features.length == 1) {
return this.writeFeatureText(features[0], opt_options);
}
const geometries = [];
for (let i = 0, ii = features.length; i < ii; ++i) {
geometries.push(features[i].getGeometry());
}
const collection = new GeometryCollection(geometries);
return this.writeGeometryText(collection, opt_options);
};
/**
* Write a single geometry as a WKT string.
*
* @function
* @param {module:ol/geom/Geometry} geometry Geometry.
* @param {module:ol/format/Feature~WriteOptions=} opt_options Write options.
* @return {string} WKT string.
* @api
*/
WKT.prototype.writeGeometry;
/**
* @inheritDoc
*/
WKT.prototype.writeGeometryText = function(geometry, opt_options) {
return encode(/** @type {module:ol/geom/Geometry} */ (
transformWithOptions(geometry, true, opt_options)));
};
export default WKT; export default WKT;
+41 -58
View File
@@ -1,7 +1,6 @@
/** /**
* @module ol/format/WMSCapabilities * @module ol/format/WMSCapabilities
*/ */
import {inherits} from '../util.js';
import {readHref} from '../format/XLink.js'; import {readHref} from '../format/XLink.js';
import XML from '../format/XML.js'; import XML from '../format/XML.js';
import {readDecimalString, readString, readNonNegativeInteger, readDecimal, readBooleanString, readNonNegativeIntegerString} from '../format/xsd.js'; import {readDecimalString, readString, readNonNegativeInteger, readDecimal, readBooleanString, readNonNegativeIntegerString} from '../format/xsd.js';
@@ -9,27 +8,6 @@ import {makeArrayPusher, makeObjectPropertyPusher, makeObjectPropertySetter,
makeStructureNS, pushParseAndPop} from '../xml.js'; makeStructureNS, pushParseAndPop} from '../xml.js';
/**
* @classdesc
* Format for reading WMS capabilities data
*
* @constructor
* @extends {module:ol/format/XML}
* @api
*/
const WMSCapabilities = function() {
XML.call(this);
/**
* @type {string|undefined}
*/
this.version = undefined;
};
inherits(WMSCapabilities, XML);
/** /**
* @const * @const
* @type {Array.<null|string>} * @type {Array.<null|string>}
@@ -63,6 +41,47 @@ const CAPABILITY_PARSERS = makeStructureNS(
}); });
/**
* @classdesc
* Format for reading WMS capabilities data
*
* @api
*/
class WMSCapabilities extends XML {
constructor() {
super();
/**
* @type {string|undefined}
*/
this.version = undefined;
}
/**
* @inheritDoc
*/
readFromDocument(doc) {
for (let n = doc.firstChild; n; n = n.nextSibling) {
if (n.nodeType == Node.ELEMENT_NODE) {
return this.readFromNode(n);
}
}
return null;
}
/**
* @inheritDoc
*/
readFromNode(node) {
this.version = node.getAttribute('version').trim();
const wmsCapabilityObject = pushParseAndPop({
'version': this.version
}, PARSERS, node, []);
return wmsCapabilityObject ? wmsCapabilityObject : null;
}
}
/** /**
* @const * @const
* @type {Object.<string, Object.<string, module:ol/xml~Parser>>} * @type {Object.<string, Object.<string, module:ol/xml~Parser>>}
@@ -266,42 +285,6 @@ const KEYWORDLIST_PARSERS = makeStructureNS(
}); });
/**
* Read a WMS capabilities document.
*
* @function
* @param {Document|Node|string} source The XML source.
* @return {Object} An object representing the WMS capabilities.
* @api
*/
WMSCapabilities.prototype.read;
/**
* @inheritDoc
*/
WMSCapabilities.prototype.readFromDocument = function(doc) {
for (let n = doc.firstChild; n; n = n.nextSibling) {
if (n.nodeType == Node.ELEMENT_NODE) {
return this.readFromNode(n);
}
}
return null;
};
/**
* @inheritDoc
*/
WMSCapabilities.prototype.readFromNode = function(node) {
this.version = node.getAttribute('version').trim();
const wmsCapabilityObject = pushParseAndPop({
'version': this.version
}, PARSERS, node, []);
return wmsCapabilityObject ? wmsCapabilityObject : null;
};
/** /**
* @param {Node} node Node. * @param {Node} node Node.
* @param {Array.<*>} objectStack Object stack. * @param {Array.<*>} objectStack Object stack.
+36 -54
View File
@@ -1,7 +1,6 @@
/** /**
* @module ol/format/WMSGetFeatureInfo * @module ol/format/WMSGetFeatureInfo
*/ */
import {inherits} from '../util.js';
import {extend, includes} from '../array.js'; import {extend, includes} from '../array.js';
import GML2 from '../format/GML2.js'; import GML2 from '../format/GML2.js';
import XMLFeature from '../format/XMLFeature.js'; import XMLFeature from '../format/XMLFeature.js';
@@ -15,17 +14,34 @@ import {makeArrayPusher, makeStructureNS, pushParseAndPop} from '../xml.js';
*/ */
/**
* @const
* @type {string}
*/
const featureIdentifier = '_feature';
/**
* @const
* @type {string}
*/
const layerIdentifier = '_layer';
/** /**
* @classdesc * @classdesc
* Format for reading WMSGetFeatureInfo format. It uses * Format for reading WMSGetFeatureInfo format. It uses
* {@link module:ol/format/GML2~GML2} to read features. * {@link module:ol/format/GML2~GML2} to read features.
* *
* @constructor
* @extends {module:ol/format/XMLFeature}
* @param {module:ol/format/WMSGetFeatureInfo~Options=} opt_options Options.
* @api * @api
*/ */
const WMSGetFeatureInfo = function(opt_options) { class WMSGetFeatureInfo extends XMLFeature {
/**
* @param {module:ol/format/WMSGetFeatureInfo~Options=} opt_options Options.
*/
constructor(opt_options) {
super();
const options = opt_options ? opt_options : {}; const options = opt_options ? opt_options : {};
@@ -48,42 +64,21 @@ const WMSGetFeatureInfo = function(opt_options) {
* @type {Array.<string>} * @type {Array.<string>}
*/ */
this.layers_ = options.layers ? options.layers : null; this.layers_ = options.layers ? options.layers : null;
}
XMLFeature.call(this);
};
inherits(WMSGetFeatureInfo, XMLFeature);
/**
* @const
* @type {string}
*/
const featureIdentifier = '_feature';
/**
* @const
* @type {string}
*/
const layerIdentifier = '_layer';
/** /**
* @return {Array.<string>} layers * @return {Array.<string>} layers
*/ */
WMSGetFeatureInfo.prototype.getLayers = function() { getLayers() {
return this.layers_; return this.layers_;
}; }
/** /**
* @param {Array.<string>} layers Layers to parse. * @param {Array.<string>} layers Layers to parse.
*/ */
WMSGetFeatureInfo.prototype.setLayers = function(layers) { setLayers(layers) {
this.layers_ = layers; this.layers_ = layers;
}; }
/** /**
* @param {Node} node Node. * @param {Node} node Node.
@@ -91,7 +86,7 @@ WMSGetFeatureInfo.prototype.setLayers = function(layers) {
* @return {Array.<module:ol/Feature>} Features. * @return {Array.<module:ol/Feature>} Features.
* @private * @private
*/ */
WMSGetFeatureInfo.prototype.readFeatures_ = function(node, objectStack) { readFeatures_(node, objectStack) {
node.setAttribute('namespaceURI', this.featureNS_); node.setAttribute('namespaceURI', this.featureNS_);
const localName = node.localName; const localName = node.localName;
/** @type {Array.<module:ol/Feature>} */ /** @type {Array.<module:ol/Feature>} */
@@ -142,50 +137,37 @@ WMSGetFeatureInfo.prototype.readFeatures_ = function(node, objectStack) {
} }
} }
return features; return features;
}; }
/**
* Read all features from a WMSGetFeatureInfo response.
*
* @function
* @param {Document|Node|Object|string} source Source.
* @param {module:ol/format/Feature~ReadOptions=} opt_options Options.
* @return {Array.<module:ol/Feature>} Features.
* @api
*/
WMSGetFeatureInfo.prototype.readFeatures;
/** /**
* @inheritDoc * @inheritDoc
*/ */
WMSGetFeatureInfo.prototype.readFeaturesFromNode = function(node, opt_options) { readFeaturesFromNode(node, opt_options) {
const options = {}; const options = {};
if (opt_options) { if (opt_options) {
assign(options, this.getReadOptions(node, opt_options)); assign(options, this.getReadOptions(node, opt_options));
} }
return this.readFeatures_(node, [options]); return this.readFeatures_(node, [options]);
}; }
/** /**
* Not implemented. * Not implemented.
* @inheritDoc * @inheritDoc
*/ */
WMSGetFeatureInfo.prototype.writeFeatureNode = function(feature, opt_options) {}; writeFeatureNode(feature, opt_options) {}
/** /**
* Not implemented. * Not implemented.
* @inheritDoc * @inheritDoc
*/ */
WMSGetFeatureInfo.prototype.writeFeaturesNode = function(features, opt_options) {}; writeFeaturesNode(features, opt_options) {}
/** /**
* Not implemented. * Not implemented.
* @inheritDoc * @inheritDoc
*/ */
WMSGetFeatureInfo.prototype.writeGeometryNode = function(geometry, opt_options) {}; writeGeometryNode(geometry, opt_options) {}
}
export default WMSGetFeatureInfo; export default WMSGetFeatureInfo;
+45 -60
View File
@@ -1,7 +1,6 @@
/** /**
* @module ol/format/WMTSCapabilities * @module ol/format/WMTSCapabilities
*/ */
import {inherits} from '../util.js';
import {boundingExtent} from '../extent.js'; import {boundingExtent} from '../extent.js';
import OWS from '../format/OWS.js'; import OWS from '../format/OWS.js';
import {readHref} from '../format/XLink.js'; import {readHref} from '../format/XLink.js';
@@ -10,26 +9,6 @@ import {readString, readNonNegativeInteger, readDecimal} from '../format/xsd.js'
import {pushParseAndPop, makeStructureNS, import {pushParseAndPop, makeStructureNS,
makeObjectPropertySetter, makeObjectPropertyPusher, makeArrayPusher} from '../xml.js'; makeObjectPropertySetter, makeObjectPropertyPusher, makeArrayPusher} from '../xml.js';
/**
* @classdesc
* Format for reading WMTS capabilities data.
*
* @constructor
* @extends {module:ol/format/XML}
* @api
*/
const WMTSCapabilities = function() {
XML.call(this);
/**
* @type {module:ol/format/OWS}
* @private
*/
this.owsParser_ = new OWS();
};
inherits(WMTSCapabilities, XML);
/** /**
* @const * @const
@@ -61,6 +40,51 @@ const PARSERS = makeStructureNS(
}); });
/**
* @classdesc
* Format for reading WMTS capabilities data.
*
* @api
*/
class WMTSCapabilities extends XML {
constructor() {
super();
/**
* @type {module:ol/format/OWS}
* @private
*/
this.owsParser_ = new OWS();
}
/**
* @inheritDoc
*/
readFromDocument(doc) {
for (let n = doc.firstChild; n; n = n.nextSibling) {
if (n.nodeType == Node.ELEMENT_NODE) {
return this.readFromNode(n);
}
}
return null;
}
/**
* @inheritDoc
*/
readFromNode(node) {
const version = node.getAttribute('version').trim();
let WMTSCapabilityObject = this.owsParser_.readFromNode(node);
if (!WMTSCapabilityObject) {
return null;
}
WMTSCapabilityObject['version'] = version;
WMTSCapabilityObject = pushParseAndPop(WMTSCapabilityObject, PARSERS, node, []);
return WMTSCapabilityObject ? WMTSCapabilityObject : null;
}
}
/** /**
* @const * @const
* @type {Object.<string, Object.<string, module:ol/xml~Parser>>} * @type {Object.<string, Object.<string, module:ol/xml~Parser>>}
@@ -193,45 +217,6 @@ const TM_PARSERS = makeStructureNS(
})); }));
/**
* Read a WMTS capabilities document.
*
* @function
* @param {Document|Node|string} source The XML source.
* @return {Object} An object representing the WMTS capabilities.
* @api
*/
WMTSCapabilities.prototype.read;
/**
* @inheritDoc
*/
WMTSCapabilities.prototype.readFromDocument = function(doc) {
for (let n = doc.firstChild; n; n = n.nextSibling) {
if (n.nodeType == Node.ELEMENT_NODE) {
return this.readFromNode(n);
}
}
return null;
};
/**
* @inheritDoc
*/
WMTSCapabilities.prototype.readFromNode = function(node) {
const version = node.getAttribute('version').trim();
let WMTSCapabilityObject = this.owsParser_.readFromNode(node);
if (!WMTSCapabilityObject) {
return null;
}
WMTSCapabilityObject['version'] = version;
WMTSCapabilityObject = pushParseAndPop(WMTSCapabilityObject, PARSERS, node, []);
return WMTSCapabilityObject ? WMTSCapabilityObject : null;
};
/** /**
* @param {Node} node Node. * @param {Node} node Node.
* @param {Array.<*>} objectStack Object stack. * @param {Array.<*>} objectStack Object stack.
+12 -14
View File
@@ -7,19 +7,17 @@ import {isDocument, isNode, parse} from '../xml.js';
* @classdesc * @classdesc
* Generic format for reading non-feature XML data * Generic format for reading non-feature XML data
* *
* @constructor
* @abstract * @abstract
* @struct
*/ */
const XML = function() { class XML {
};
/** /**
* @param {Document|Node|string} source Source. * Read the source document.
* @return {Object} The parsed result. *
* @param {Document|Node|string} source The XML source.
* @return {Object} An object representing the source.
* @api
*/ */
XML.prototype.read = function(source) { read(source) {
if (isDocument(source)) { if (isDocument(source)) {
return this.readFromDocument(/** @type {Document} */ (source)); return this.readFromDocument(/** @type {Document} */ (source));
} else if (isNode(source)) { } else if (isNode(source)) {
@@ -30,21 +28,21 @@ XML.prototype.read = function(source) {
} else { } else {
return null; return null;
} }
}; }
/** /**
* @abstract * @abstract
* @param {Document} doc Document. * @param {Document} doc Document.
* @return {Object} Object * @return {Object} Object
*/ */
XML.prototype.readFromDocument = function(doc) {}; readFromDocument(doc) {}
/** /**
* @abstract * @abstract
* @param {Node} node Node. * @param {Node} node Node.
* @return {Object} Object * @return {Object} Object
*/ */
XML.prototype.readFromNode = function(node) {}; readFromNode(node) {}
}
export default XML; export default XML;
+68 -69
View File
@@ -1,7 +1,6 @@
/** /**
* @module ol/format/XMLFeature * @module ol/format/XMLFeature
*/ */
import {inherits} from '../util.js';
import {extend} from '../array.js'; import {extend} from '../array.js';
import FeatureFormat from '../format/Feature.js'; import FeatureFormat from '../format/Feature.js';
import FormatType from '../format/FormatType.js'; import FormatType from '../format/FormatType.js';
@@ -13,36 +12,35 @@ import {isDocument, isNode, parse} from '../xml.js';
* instantiated in apps. * instantiated in apps.
* Base class for XML feature formats. * Base class for XML feature formats.
* *
* @constructor
* @abstract * @abstract
* @extends {module:ol/format/Feature}
*/ */
const XMLFeature = function() { class XMLFeature extends FeatureFormat {
constructor() {
super();
/** /**
* @type {XMLSerializer} * @type {XMLSerializer}
* @private * @private
*/ */
this.xmlSerializer_ = new XMLSerializer(); this.xmlSerializer_ = new XMLSerializer();
}
FeatureFormat.call(this);
};
inherits(XMLFeature, FeatureFormat);
/** /**
* @inheritDoc * @inheritDoc
*/ */
XMLFeature.prototype.getType = function() { getType() {
return FormatType.XML; return FormatType.XML;
}; }
/** /**
* @inheritDoc * Read a single feature.
*
* @param {Document|Node|Object|string} source Source.
* @param {module:ol/format/Feature~ReadOptions=} opt_options Read options.
* @return {module:ol/Feature} Feature.
* @api
*/ */
XMLFeature.prototype.readFeature = function(source, opt_options) { readFeature(source, opt_options) {
if (isDocument(source)) { if (isDocument(source)) {
return this.readFeatureFromDocument(/** @type {Document} */ (source), opt_options); return this.readFeatureFromDocument(/** @type {Document} */ (source), opt_options);
} else if (isNode(source)) { } else if (isNode(source)) {
@@ -53,38 +51,41 @@ XMLFeature.prototype.readFeature = function(source, opt_options) {
} else { } else {
return null; return null;
} }
}; }
/** /**
* @param {Document} doc Document. * @param {Document} doc Document.
* @param {module:ol/format/Feature~ReadOptions=} opt_options Options. * @param {module:ol/format/Feature~ReadOptions=} opt_options Options.
* @return {module:ol/Feature} Feature. * @return {module:ol/Feature} Feature.
*/ */
XMLFeature.prototype.readFeatureFromDocument = function(doc, opt_options) { readFeatureFromDocument(doc, opt_options) {
const features = this.readFeaturesFromDocument(doc, opt_options); const features = this.readFeaturesFromDocument(doc, opt_options);
if (features.length > 0) { if (features.length > 0) {
return features[0]; return features[0];
} else { } else {
return null; return null;
} }
}; }
/** /**
* @param {Node} node Node. * @param {Node} node Node.
* @param {module:ol/format/Feature~ReadOptions=} opt_options Options. * @param {module:ol/format/Feature~ReadOptions=} opt_options Options.
* @return {module:ol/Feature} Feature. * @return {module:ol/Feature} Feature.
*/ */
XMLFeature.prototype.readFeatureFromNode = function(node, opt_options) { readFeatureFromNode(node, opt_options) {
return null; // not implemented return null; // not implemented
}; }
/** /**
* @inheritDoc * Read all features from a feature collection.
*
* @function
* @param {Document|Node|Object|string} source Source.
* @param {module:ol/format/Feature~ReadOptions=} opt_options Options.
* @return {Array.<module:ol/Feature>} Features.
* @api
*/ */
XMLFeature.prototype.readFeatures = function(source, opt_options) { readFeatures(source, opt_options) {
if (isDocument(source)) { if (isDocument(source)) {
return this.readFeaturesFromDocument( return this.readFeaturesFromDocument(
/** @type {Document} */ (source), opt_options); /** @type {Document} */ (source), opt_options);
@@ -96,8 +97,7 @@ XMLFeature.prototype.readFeatures = function(source, opt_options) {
} else { } else {
return []; return [];
} }
}; }
/** /**
* @param {Document} doc Document. * @param {Document} doc Document.
@@ -105,7 +105,7 @@ XMLFeature.prototype.readFeatures = function(source, opt_options) {
* @protected * @protected
* @return {Array.<module:ol/Feature>} Features. * @return {Array.<module:ol/Feature>} Features.
*/ */
XMLFeature.prototype.readFeaturesFromDocument = function(doc, opt_options) { readFeaturesFromDocument(doc, opt_options) {
/** @type {Array.<module:ol/Feature>} */ /** @type {Array.<module:ol/Feature>} */
const features = []; const features = [];
for (let n = doc.firstChild; n; n = n.nextSibling) { for (let n = doc.firstChild; n; n = n.nextSibling) {
@@ -114,8 +114,7 @@ XMLFeature.prototype.readFeaturesFromDocument = function(doc, opt_options) {
} }
} }
return features; return features;
}; }
/** /**
* @abstract * @abstract
@@ -124,13 +123,12 @@ XMLFeature.prototype.readFeaturesFromDocument = function(doc, opt_options) {
* @protected * @protected
* @return {Array.<module:ol/Feature>} Features. * @return {Array.<module:ol/Feature>} Features.
*/ */
XMLFeature.prototype.readFeaturesFromNode = function(node, opt_options) {}; readFeaturesFromNode(node, opt_options) {}
/** /**
* @inheritDoc * @inheritDoc
*/ */
XMLFeature.prototype.readGeometry = function(source, opt_options) { readGeometry(source, opt_options) {
if (isDocument(source)) { if (isDocument(source)) {
return this.readGeometryFromDocument( return this.readGeometryFromDocument(
/** @type {Document} */ (source), opt_options); /** @type {Document} */ (source), opt_options);
@@ -142,8 +140,7 @@ XMLFeature.prototype.readGeometry = function(source, opt_options) {
} else { } else {
return null; return null;
} }
}; }
/** /**
* @param {Document} doc Document. * @param {Document} doc Document.
@@ -151,10 +148,9 @@ XMLFeature.prototype.readGeometry = function(source, opt_options) {
* @protected * @protected
* @return {module:ol/geom/Geometry} Geometry. * @return {module:ol/geom/Geometry} Geometry.
*/ */
XMLFeature.prototype.readGeometryFromDocument = function(doc, opt_options) { readGeometryFromDocument(doc, opt_options) {
return null; // not implemented return null; // not implemented
}; }
/** /**
* @param {Node} node Node. * @param {Node} node Node.
@@ -162,15 +158,18 @@ XMLFeature.prototype.readGeometryFromDocument = function(doc, opt_options) {
* @protected * @protected
* @return {module:ol/geom/Geometry} Geometry. * @return {module:ol/geom/Geometry} Geometry.
*/ */
XMLFeature.prototype.readGeometryFromNode = function(node, opt_options) { readGeometryFromNode(node, opt_options) {
return null; // not implemented return null; // not implemented
}; }
/** /**
* @inheritDoc * Read the projection from the source.
*
* @param {Document|Node|Object|string} source Source.
* @return {module:ol/proj/Projection} Projection.
* @api
*/ */
XMLFeature.prototype.readProjection = function(source) { readProjection(source) {
if (isDocument(source)) { if (isDocument(source)) {
return this.readProjectionFromDocument(/** @type {Document} */ (source)); return this.readProjectionFromDocument(/** @type {Document} */ (source));
} else if (isNode(source)) { } else if (isNode(source)) {
@@ -181,37 +180,33 @@ XMLFeature.prototype.readProjection = function(source) {
} else { } else {
return null; return null;
} }
}; }
/** /**
* @param {Document} doc Document. * @param {Document} doc Document.
* @protected * @protected
* @return {module:ol/proj/Projection} Projection. * @return {module:ol/proj/Projection} Projection.
*/ */
XMLFeature.prototype.readProjectionFromDocument = function(doc) { readProjectionFromDocument(doc) {
return this.dataProjection; return this.dataProjection;
}; }
/** /**
* @param {Node} node Node. * @param {Node} node Node.
* @protected * @protected
* @return {module:ol/proj/Projection} Projection. * @return {module:ol/proj/Projection} Projection.
*/ */
XMLFeature.prototype.readProjectionFromNode = function(node) { readProjectionFromNode(node) {
return this.dataProjection; return this.dataProjection;
}; }
/** /**
* @inheritDoc * @inheritDoc
*/ */
XMLFeature.prototype.writeFeature = function(feature, opt_options) { writeFeature(feature, opt_options) {
const node = this.writeFeatureNode(feature, opt_options); const node = this.writeFeatureNode(feature, opt_options);
return this.xmlSerializer_.serializeToString(node); return this.xmlSerializer_.serializeToString(node);
}; }
/** /**
* @param {module:ol/Feature} feature Feature. * @param {module:ol/Feature} feature Feature.
@@ -219,45 +214,49 @@ XMLFeature.prototype.writeFeature = function(feature, opt_options) {
* @protected * @protected
* @return {Node} Node. * @return {Node} Node.
*/ */
XMLFeature.prototype.writeFeatureNode = function(feature, opt_options) { writeFeatureNode(feature, opt_options) {
return null; // not implemented return null; // not implemented
}; }
/** /**
* @inheritDoc * Encode an array of features as string.
*
* @param {Array.<module:ol/Feature>} features Features.
* @param {module:ol/format/Feature~WriteOptions=} opt_options Write options.
* @return {string} Result.
* @api
*/ */
XMLFeature.prototype.writeFeatures = function(features, opt_options) { writeFeatures(features, opt_options) {
const node = this.writeFeaturesNode(features, opt_options); const node = this.writeFeaturesNode(features, opt_options);
return this.xmlSerializer_.serializeToString(node); return this.xmlSerializer_.serializeToString(node);
}; }
/** /**
* @param {Array.<module:ol/Feature>} features Features. * @param {Array.<module:ol/Feature>} features Features.
* @param {module:ol/format/Feature~WriteOptions=} opt_options Options. * @param {module:ol/format/Feature~WriteOptions=} opt_options Options.
* @return {Node} Node. * @return {Node} Node.
*/ */
XMLFeature.prototype.writeFeaturesNode = function(features, opt_options) { writeFeaturesNode(features, opt_options) {
return null; // not implemented return null; // not implemented
}; }
/** /**
* @inheritDoc * @inheritDoc
*/ */
XMLFeature.prototype.writeGeometry = function(geometry, opt_options) { writeGeometry(geometry, opt_options) {
const node = this.writeGeometryNode(geometry, opt_options); const node = this.writeGeometryNode(geometry, opt_options);
return this.xmlSerializer_.serializeToString(node); return this.xmlSerializer_.serializeToString(node);
}; }
/** /**
* @param {module:ol/geom/Geometry} geometry Geometry. * @param {module:ol/geom/Geometry} geometry Geometry.
* @param {module:ol/format/Feature~WriteOptions=} opt_options Options. * @param {module:ol/format/Feature~WriteOptions=} opt_options Options.
* @return {Node} Node. * @return {Node} Node.
*/ */
XMLFeature.prototype.writeGeometryNode = function(geometry, opt_options) { writeGeometryNode(geometry, opt_options) {
return null; // not implemented return null; // not implemented
}; }
}
export default XMLFeature; export default XMLFeature;
+10 -9
View File
@@ -1,23 +1,24 @@
/** /**
* @module ol/format/filter/And * @module ol/format/filter/And
*/ */
import {inherits} from '../../util.js';
import LogicalNary from '../filter/LogicalNary.js'; import LogicalNary from '../filter/LogicalNary.js';
/** /**
* @classdesc * @classdesc
* Represents a logical `<And>` operator between two or more filter conditions. * Represents a logical `<And>` operator between two or more filter conditions.
* *
* @constructor
* @abstract * @abstract
* @param {...module:ol/format/filter/Filter} conditions Conditions.
* @extends {module:ol/format/filter/LogicalNary}
*/ */
const And = function(conditions) { class And extends LogicalNary {
const params = ['And'].concat(Array.prototype.slice.call(arguments));
LogicalNary.apply(this, params);
};
inherits(And, LogicalNary); /**
* @param {...module:ol/format/filter/Filter} conditions Conditions.
*/
constructor(conditions) {
const params = ['And'].concat(Array.prototype.slice.call(arguments));
super(...params);
}
}
export default And; export default And;
+12 -11
View File
@@ -1,7 +1,6 @@
/** /**
* @module ol/format/filter/Bbox * @module ol/format/filter/Bbox
*/ */
import {inherits} from '../../util.js';
import Filter from '../filter/Filter.js'; import Filter from '../filter/Filter.js';
/** /**
@@ -9,17 +8,19 @@ import Filter from '../filter/Filter.js';
* Represents a `<BBOX>` operator to test whether a geometry-valued property * Represents a `<BBOX>` operator to test whether a geometry-valued property
* intersects a fixed bounding box * intersects a fixed bounding box
* *
* @constructor
* @param {!string} geometryName Geometry name to use.
* @param {!module:ol/extent~Extent} extent Extent.
* @param {string=} opt_srsName SRS name. No srsName attribute will be
* set on geometries when this is not provided.
* @extends {module:ol/format/filter/Filter}
* @api * @api
*/ */
const Bbox = function(geometryName, extent, opt_srsName) { class Bbox extends Filter {
Filter.call(this, 'BBOX'); /**
* @param {!string} geometryName Geometry name to use.
* @param {!module:ol/extent~Extent} extent Extent.
* @param {string=} opt_srsName SRS name. No srsName attribute will be set
* on geometries when this is not provided.
*/
constructor(geometryName, extent, opt_srsName) {
super('BBOX');
/** /**
* @type {!string} * @type {!string}
@@ -35,8 +36,8 @@ const Bbox = function(geometryName, extent, opt_srsName) {
* @type {string|undefined} * @type {string|undefined}
*/ */
this.srsName = opt_srsName; this.srsName = opt_srsName;
}; }
inherits(Bbox, Filter); }
export default Bbox; export default Bbox;
+8 -7
View File
@@ -1,7 +1,6 @@
/** /**
* @module ol/format/filter/Comparison * @module ol/format/filter/Comparison
*/ */
import {inherits} from '../../util.js';
import Filter from '../filter/Filter.js'; import Filter from '../filter/Filter.js';
/** /**
@@ -9,22 +8,24 @@ import Filter from '../filter/Filter.js';
* Abstract class; normally only used for creating subclasses and not instantiated in apps. * Abstract class; normally only used for creating subclasses and not instantiated in apps.
* Base class for WFS GetFeature property comparison filters. * Base class for WFS GetFeature property comparison filters.
* *
* @constructor
* @abstract * @abstract
*/
class Comparison extends Filter {
/**
* @param {!string} tagName The XML tag name for this filter. * @param {!string} tagName The XML tag name for this filter.
* @param {!string} propertyName Name of the context property to compare. * @param {!string} propertyName Name of the context property to compare.
* @extends {module:ol/format/filter/Filter}
*/ */
const Comparison = function(tagName, propertyName) { constructor(tagName, propertyName) {
Filter.call(this, tagName); super(tagName);
/** /**
* @type {!string} * @type {!string}
*/ */
this.propertyName = propertyName; this.propertyName = propertyName;
}; }
inherits(Comparison, Filter); }
export default Comparison; export default Comparison;
+9 -7
View File
@@ -1,7 +1,6 @@
/** /**
* @module ol/format/filter/ComparisonBinary * @module ol/format/filter/ComparisonBinary
*/ */
import {inherits} from '../../util.js';
import Comparison from '../filter/Comparison.js'; import Comparison from '../filter/Comparison.js';
/** /**
@@ -9,17 +8,19 @@ import Comparison from '../filter/Comparison.js';
* Abstract class; normally only used for creating subclasses and not instantiated in apps. * Abstract class; normally only used for creating subclasses and not instantiated in apps.
* Base class for WFS GetFeature property binary comparison filters. * Base class for WFS GetFeature property binary comparison filters.
* *
* @constructor
* @abstract * @abstract
*/
class ComparisonBinary extends Comparison {
/**
* @param {!string} tagName The XML tag name for this filter. * @param {!string} tagName The XML tag name for this filter.
* @param {!string} propertyName Name of the context property to compare. * @param {!string} propertyName Name of the context property to compare.
* @param {!(string|number)} expression The value to compare. * @param {!(string|number)} expression The value to compare.
* @param {boolean=} opt_matchCase Case-sensitive? * @param {boolean=} opt_matchCase Case-sensitive?
* @extends {module:ol/format/filter/Comparison}
*/ */
const ComparisonBinary = function(tagName, propertyName, expression, opt_matchCase) { constructor(tagName, propertyName, expression, opt_matchCase) {
Comparison.call(this, tagName, propertyName); super(tagName, propertyName);
/** /**
* @type {!(string|number)} * @type {!(string|number)}
@@ -30,7 +31,8 @@ const ComparisonBinary = function(tagName, propertyName, expression, opt_matchCa
* @type {boolean|undefined} * @type {boolean|undefined}
*/ */
this.matchCase = opt_matchCase; this.matchCase = opt_matchCase;
}; }
}
inherits(ComparisonBinary, Comparison);
export default ComparisonBinary; export default ComparisonBinary;
+9 -8
View File
@@ -1,27 +1,28 @@
/** /**
* @module ol/format/filter/Contains * @module ol/format/filter/Contains
*/ */
import {inherits} from '../../util.js';
import Spatial from '../filter/Spatial.js'; import Spatial from '../filter/Spatial.js';
/** /**
* @classdesc * @classdesc
* Represents a `<Contains>` operator to test whether a geometry-valued property * Represents a `<Contains>` operator to test whether a geometry-valued property
* contains a given geometry. * contains a given geometry.
* */
* @constructor class Contains extends Spatial {
/**
* @param {!string} geometryName Geometry name to use. * @param {!string} geometryName Geometry name to use.
* @param {!module:ol/geom/Geometry} geometry Geometry. * @param {!module:ol/geom/Geometry} geometry Geometry.
* @param {string=} opt_srsName SRS name. No srsName attribute will be * @param {string=} opt_srsName SRS name. No srsName attribute will be
* set on geometries when this is not provided. * set on geometries when this is not provided.
* @extends {module:ol/format/filter/Spatial}
* @api * @api
*/ */
const Contains = function(geometryName, geometry, opt_srsName) { constructor(geometryName, geometry, opt_srsName) {
Spatial.call(this, 'Contains', geometryName, geometry, opt_srsName); super('Contains', geometryName, geometry, opt_srsName);
}; }
}
inherits(Contains, Spatial);
export default Contains; export default Contains;
+9 -8
View File
@@ -1,22 +1,22 @@
/** /**
* @module ol/format/filter/During * @module ol/format/filter/During
*/ */
import {inherits} from '../../util.js';
import Comparison from '../filter/Comparison.js'; import Comparison from '../filter/Comparison.js';
/** /**
* @classdesc * @classdesc
* Represents a `<During>` comparison operator. * Represents a `<During>` comparison operator.
* */
* @constructor class During extends Comparison {
/**
* @param {!string} propertyName Name of the context property to compare. * @param {!string} propertyName Name of the context property to compare.
* @param {!string} begin The begin date in ISO-8601 format. * @param {!string} begin The begin date in ISO-8601 format.
* @param {!string} end The end date in ISO-8601 format. * @param {!string} end The end date in ISO-8601 format.
* @extends {module:ol/format/filter/Comparison}
* @api * @api
*/ */
const During = function(propertyName, begin, end) { constructor(propertyName, begin, end) {
Comparison.call(this, 'During', propertyName); super('During', propertyName);
/** /**
* @type {!string} * @type {!string}
@@ -27,7 +27,8 @@ const During = function(propertyName, begin, end) {
* @type {!string} * @type {!string}
*/ */
this.end = end; this.end = end;
}; }
}
inherits(During, Comparison);
export default During; export default During;
+9 -8
View File
@@ -1,23 +1,24 @@
/** /**
* @module ol/format/filter/EqualTo * @module ol/format/filter/EqualTo
*/ */
import {inherits} from '../../util.js';
import ComparisonBinary from '../filter/ComparisonBinary.js'; import ComparisonBinary from '../filter/ComparisonBinary.js';
/** /**
* @classdesc * @classdesc
* Represents a `<PropertyIsEqualTo>` comparison operator. * Represents a `<PropertyIsEqualTo>` comparison operator.
* */
* @constructor class EqualTo extends ComparisonBinary {
/**
* @param {!string} propertyName Name of the context property to compare. * @param {!string} propertyName Name of the context property to compare.
* @param {!(string|number)} expression The value to compare. * @param {!(string|number)} expression The value to compare.
* @param {boolean=} opt_matchCase Case-sensitive? * @param {boolean=} opt_matchCase Case-sensitive?
* @extends {module:ol/format/filter/ComparisonBinary}
* @api * @api
*/ */
const EqualTo = function(propertyName, expression, opt_matchCase) { constructor(propertyName, expression, opt_matchCase) {
ComparisonBinary.call(this, 'PropertyIsEqualTo', propertyName, expression, opt_matchCase); super('PropertyIsEqualTo', propertyName, expression, opt_matchCase);
}; }
}
inherits(EqualTo, ComparisonBinary);
export default EqualTo; export default EqualTo;
+9 -7
View File
@@ -8,26 +8,28 @@
* Abstract class; normally only used for creating subclasses and not instantiated in apps. * Abstract class; normally only used for creating subclasses and not instantiated in apps.
* Base class for WFS GetFeature filters. * Base class for WFS GetFeature filters.
* *
* @constructor
* @abstract * @abstract
* @param {!string} tagName The XML tag name for this filter.
* @struct
*/ */
const Filter = function(tagName) { class Filter {
/**
* @param {!string} tagName The XML tag name for this filter.
*/
constructor(tagName) {
/** /**
* @private * @private
* @type {!string} * @type {!string}
*/ */
this.tagName_ = tagName; this.tagName_ = tagName;
}; }
/** /**
* The XML tag name for a filter. * The XML tag name for a filter.
* @returns {!string} Name. * @returns {!string} Name.
*/ */
Filter.prototype.getTagName = function() { getTagName() {
return this.tagName_; return this.tagName_;
}; }
}
export default Filter; export default Filter;
+9 -8
View File
@@ -1,22 +1,23 @@
/** /**
* @module ol/format/filter/GreaterThan * @module ol/format/filter/GreaterThan
*/ */
import {inherits} from '../../util.js';
import ComparisonBinary from '../filter/ComparisonBinary.js'; import ComparisonBinary from '../filter/ComparisonBinary.js';
/** /**
* @classdesc * @classdesc
* Represents a `<PropertyIsGreaterThan>` comparison operator. * Represents a `<PropertyIsGreaterThan>` comparison operator.
* */
* @constructor class GreaterThan extends ComparisonBinary {
/**
* @param {!string} propertyName Name of the context property to compare. * @param {!string} propertyName Name of the context property to compare.
* @param {!number} expression The value to compare. * @param {!number} expression The value to compare.
* @extends {module:ol/format/filter/ComparisonBinary}
* @api * @api
*/ */
const GreaterThan = function(propertyName, expression) { constructor(propertyName, expression) {
ComparisonBinary.call(this, 'PropertyIsGreaterThan', propertyName, expression); super('PropertyIsGreaterThan', propertyName, expression);
}; }
}
inherits(GreaterThan, ComparisonBinary);
export default GreaterThan; export default GreaterThan;
+9 -8
View File
@@ -1,22 +1,23 @@
/** /**
* @module ol/format/filter/GreaterThanOrEqualTo * @module ol/format/filter/GreaterThanOrEqualTo
*/ */
import {inherits} from '../../util.js';
import ComparisonBinary from '../filter/ComparisonBinary.js'; import ComparisonBinary from '../filter/ComparisonBinary.js';
/** /**
* @classdesc * @classdesc
* Represents a `<PropertyIsGreaterThanOrEqualTo>` comparison operator. * Represents a `<PropertyIsGreaterThanOrEqualTo>` comparison operator.
* */
* @constructor class GreaterThanOrEqualTo extends ComparisonBinary {
/**
* @param {!string} propertyName Name of the context property to compare. * @param {!string} propertyName Name of the context property to compare.
* @param {!number} expression The value to compare. * @param {!number} expression The value to compare.
* @extends {module:ol/format/filter/ComparisonBinary}
* @api * @api
*/ */
const GreaterThanOrEqualTo = function(propertyName, expression) { constructor(propertyName, expression) {
ComparisonBinary.call(this, 'PropertyIsGreaterThanOrEqualTo', propertyName, expression); super('PropertyIsGreaterThanOrEqualTo', propertyName, expression);
}; }
}
inherits(GreaterThanOrEqualTo, ComparisonBinary);
export default GreaterThanOrEqualTo; export default GreaterThanOrEqualTo;
+8 -10
View File
@@ -1,27 +1,25 @@
/** /**
* @module ol/format/filter/Intersects * @module ol/format/filter/Intersects
*/ */
import {inherits} from '../../util.js';
import Spatial from '../filter/Spatial.js'; import Spatial from '../filter/Spatial.js';
/** /**
* @classdesc * @classdesc
* Represents a `<Intersects>` operator to test whether a geometry-valued property * Represents a `<Intersects>` operator to test whether a geometry-valued property
* intersects a given geometry. * intersects a given geometry.
* */
* @constructor class Intersects extends Spatial {
/**
* @param {!string} geometryName Geometry name to use. * @param {!string} geometryName Geometry name to use.
* @param {!module:ol/geom/Geometry} geometry Geometry. * @param {!module:ol/geom/Geometry} geometry Geometry.
* @param {string=} opt_srsName SRS name. No srsName attribute will be * @param {string=} opt_srsName SRS name. No srsName attribute will be
* set on geometries when this is not provided. * set on geometries when this is not provided.
* @extends {module:ol/format/filter/Spatial}
* @api
*/ */
const Intersects = function(geometryName, geometry, opt_srsName) { constructor(geometryName, geometry, opt_srsName) {
super('Intersects', geometryName, geometry, opt_srsName);
}
Spatial.call(this, 'Intersects', geometryName, geometry, opt_srsName); }
};
inherits(Intersects, Spatial);
export default Intersects; export default Intersects;
+9 -8
View File
@@ -1,22 +1,22 @@
/** /**
* @module ol/format/filter/IsBetween * @module ol/format/filter/IsBetween
*/ */
import {inherits} from '../../util.js';
import Comparison from '../filter/Comparison.js'; import Comparison from '../filter/Comparison.js';
/** /**
* @classdesc * @classdesc
* Represents a `<PropertyIsBetween>` comparison operator. * Represents a `<PropertyIsBetween>` comparison operator.
* */
* @constructor class IsBetween extends Comparison {
/**
* @param {!string} propertyName Name of the context property to compare. * @param {!string} propertyName Name of the context property to compare.
* @param {!number} lowerBoundary The lower bound of the range. * @param {!number} lowerBoundary The lower bound of the range.
* @param {!number} upperBoundary The upper bound of the range. * @param {!number} upperBoundary The upper bound of the range.
* @extends {module:ol/format/filter/Comparison}
* @api * @api
*/ */
const IsBetween = function(propertyName, lowerBoundary, upperBoundary) { constructor(propertyName, lowerBoundary, upperBoundary) {
Comparison.call(this, 'PropertyIsBetween', propertyName); super('PropertyIsBetween', propertyName);
/** /**
* @type {!number} * @type {!number}
@@ -27,7 +27,8 @@ const IsBetween = function(propertyName, lowerBoundary, upperBoundary) {
* @type {!number} * @type {!number}
*/ */
this.upperBoundary = upperBoundary; this.upperBoundary = upperBoundary;
};
inherits(IsBetween, Comparison); }
}
export default IsBetween; export default IsBetween;
+10 -8
View File
@@ -1,14 +1,16 @@
/** /**
* @module ol/format/filter/IsLike * @module ol/format/filter/IsLike
*/ */
import {inherits} from '../../util.js';
import Comparison from '../filter/Comparison.js'; import Comparison from '../filter/Comparison.js';
/** /**
* @classdesc * @classdesc
* Represents a `<PropertyIsLike>` comparison operator. * Represents a `<PropertyIsLike>` comparison operator.
* */
* @constructor class IsLike extends Comparison {
/**
* [constructor description]
* @param {!string} propertyName Name of the context property to compare. * @param {!string} propertyName Name of the context property to compare.
* @param {!string} pattern Text pattern. * @param {!string} pattern Text pattern.
* @param {string=} opt_wildCard Pattern character which matches any sequence of * @param {string=} opt_wildCard Pattern character which matches any sequence of
@@ -18,11 +20,10 @@ import Comparison from '../filter/Comparison.js';
* @param {string=} opt_escapeChar Escape character which can be used to escape * @param {string=} opt_escapeChar Escape character which can be used to escape
* the pattern characters. Default is '!'. * the pattern characters. Default is '!'.
* @param {boolean=} opt_matchCase Case-sensitive? * @param {boolean=} opt_matchCase Case-sensitive?
* @extends {module:ol/format/filter/Comparison}
* @api * @api
*/ */
const IsLike = function(propertyName, pattern, opt_wildCard, opt_singleChar, opt_escapeChar, opt_matchCase) { constructor(propertyName, pattern, opt_wildCard, opt_singleChar, opt_escapeChar, opt_matchCase) {
Comparison.call(this, 'PropertyIsLike', propertyName); super('PropertyIsLike', propertyName);
/** /**
* @type {!string} * @type {!string}
@@ -48,7 +49,8 @@ const IsLike = function(propertyName, pattern, opt_wildCard, opt_singleChar, opt
* @type {boolean|undefined} * @type {boolean|undefined}
*/ */
this.matchCase = opt_matchCase; this.matchCase = opt_matchCase;
};
inherits(IsLike, Comparison); }
}
export default IsLike; export default IsLike;
+9 -8
View File
@@ -1,21 +1,22 @@
/** /**
* @module ol/format/filter/IsNull * @module ol/format/filter/IsNull
*/ */
import {inherits} from '../../util.js';
import Comparison from '../filter/Comparison.js'; import Comparison from '../filter/Comparison.js';
/** /**
* @classdesc * @classdesc
* Represents a `<PropertyIsNull>` comparison operator. * Represents a `<PropertyIsNull>` comparison operator.
* */
* @constructor class IsNull extends Comparison {
/**
* @param {!string} propertyName Name of the context property to compare. * @param {!string} propertyName Name of the context property to compare.
* @extends {module:ol/format/filter/Comparison}
* @api * @api
*/ */
const IsNull = function(propertyName) { constructor(propertyName) {
Comparison.call(this, 'PropertyIsNull', propertyName); super('PropertyIsNull', propertyName);
}; }
}
inherits(IsNull, Comparison);
export default IsNull; export default IsNull;
+9 -8
View File
@@ -1,22 +1,23 @@
/** /**
* @module ol/format/filter/LessThan * @module ol/format/filter/LessThan
*/ */
import {inherits} from '../../util.js';
import ComparisonBinary from '../filter/ComparisonBinary.js'; import ComparisonBinary from '../filter/ComparisonBinary.js';
/** /**
* @classdesc * @classdesc
* Represents a `<PropertyIsLessThan>` comparison operator. * Represents a `<PropertyIsLessThan>` comparison operator.
* */
* @constructor class LessThan extends ComparisonBinary {
/**
* @param {!string} propertyName Name of the context property to compare. * @param {!string} propertyName Name of the context property to compare.
* @param {!number} expression The value to compare. * @param {!number} expression The value to compare.
* @extends {module:ol/format/filter/ComparisonBinary}
* @api * @api
*/ */
const LessThan = function(propertyName, expression) { constructor(propertyName, expression) {
ComparisonBinary.call(this, 'PropertyIsLessThan', propertyName, expression); super('PropertyIsLessThan', propertyName, expression);
}; }
}
inherits(LessThan, ComparisonBinary);
export default LessThan; export default LessThan;
+9 -8
View File
@@ -1,22 +1,23 @@
/** /**
* @module ol/format/filter/LessThanOrEqualTo * @module ol/format/filter/LessThanOrEqualTo
*/ */
import {inherits} from '../../util.js';
import ComparisonBinary from '../filter/ComparisonBinary.js'; import ComparisonBinary from '../filter/ComparisonBinary.js';
/** /**
* @classdesc * @classdesc
* Represents a `<PropertyIsLessThanOrEqualTo>` comparison operator. * Represents a `<PropertyIsLessThanOrEqualTo>` comparison operator.
* */
* @constructor class LessThanOrEqualTo extends ComparisonBinary {
/**
* @param {!string} propertyName Name of the context property to compare. * @param {!string} propertyName Name of the context property to compare.
* @param {!number} expression The value to compare. * @param {!number} expression The value to compare.
* @extends {module:ol/format/filter/ComparisonBinary}
* @api * @api
*/ */
const LessThanOrEqualTo = function(propertyName, expression) { constructor(propertyName, expression) {
ComparisonBinary.call(this, 'PropertyIsLessThanOrEqualTo', propertyName, expression); super('PropertyIsLessThanOrEqualTo', propertyName, expression);
}; }
}
inherits(LessThanOrEqualTo, ComparisonBinary);
export default LessThanOrEqualTo; export default LessThanOrEqualTo;
+9 -7
View File
@@ -1,7 +1,6 @@
/** /**
* @module ol/format/filter/LogicalNary * @module ol/format/filter/LogicalNary
*/ */
import {inherits} from '../../util.js';
import {assert} from '../../asserts.js'; import {assert} from '../../asserts.js';
import Filter from '../filter/Filter.js'; import Filter from '../filter/Filter.js';
@@ -10,22 +9,25 @@ import Filter from '../filter/Filter.js';
* Abstract class; normally only used for creating subclasses and not instantiated in apps. * Abstract class; normally only used for creating subclasses and not instantiated in apps.
* Base class for WFS GetFeature n-ary logical filters. * Base class for WFS GetFeature n-ary logical filters.
* *
* @constructor
* @abstract * @abstract
*/
class LogicalNary extends Filter {
/**
* @param {!string} tagName The XML tag name for this filter. * @param {!string} tagName The XML tag name for this filter.
* @param {...module:ol/format/filter/Filter} conditions Conditions. * @param {...module:ol/format/filter/Filter} conditions Conditions.
* @extends {module:ol/format/filter/Filter}
*/ */
const LogicalNary = function(tagName, conditions) { constructor(tagName, conditions) {
Filter.call(this, tagName); super(tagName);
/** /**
* @type {Array.<module:ol/format/filter/Filter>} * @type {Array.<module:ol/format/filter/Filter>}
*/ */
this.conditions = Array.prototype.slice.call(arguments, 1); this.conditions = Array.prototype.slice.call(arguments, 1);
assert(this.conditions.length >= 2, 57); // At least 2 conditions are required. assert(this.conditions.length >= 2, 57); // At least 2 conditions are required.
}; }
}
inherits(LogicalNary, Filter);
export default LogicalNary; export default LogicalNary;
+10 -8
View File
@@ -1,27 +1,29 @@
/** /**
* @module ol/format/filter/Not * @module ol/format/filter/Not
*/ */
import {inherits} from '../../util.js';
import Filter from '../filter/Filter.js'; import Filter from '../filter/Filter.js';
/** /**
* @classdesc * @classdesc
* Represents a logical `<Not>` operator for a filter condition. * Represents a logical `<Not>` operator for a filter condition.
* */
* @constructor class Not extends Filter {
/**
* @param {!module:ol/format/filter/Filter} condition Filter condition. * @param {!module:ol/format/filter/Filter} condition Filter condition.
* @extends {module:ol/format/filter/Filter}
* @api * @api
*/ */
const Not = function(condition) { constructor(condition) {
Filter.call(this, 'Not'); super('Not');
/** /**
* @type {!module:ol/format/filter/Filter} * @type {!module:ol/format/filter/Filter}
*/ */
this.condition = condition; this.condition = condition;
};
inherits(Not, Filter); }
}
export default Not; export default Not;
+9 -8
View File
@@ -1,23 +1,24 @@
/** /**
* @module ol/format/filter/NotEqualTo * @module ol/format/filter/NotEqualTo
*/ */
import {inherits} from '../../util.js';
import ComparisonBinary from '../filter/ComparisonBinary.js'; import ComparisonBinary from '../filter/ComparisonBinary.js';
/** /**
* @classdesc * @classdesc
* Represents a `<PropertyIsNotEqualTo>` comparison operator. * Represents a `<PropertyIsNotEqualTo>` comparison operator.
* */
* @constructor class NotEqualTo extends ComparisonBinary {
/**
* @param {!string} propertyName Name of the context property to compare. * @param {!string} propertyName Name of the context property to compare.
* @param {!(string|number)} expression The value to compare. * @param {!(string|number)} expression The value to compare.
* @param {boolean=} opt_matchCase Case-sensitive? * @param {boolean=} opt_matchCase Case-sensitive?
* @extends {module:ol/format/filter/ComparisonBinary}
* @api * @api
*/ */
const NotEqualTo = function(propertyName, expression, opt_matchCase) { constructor(propertyName, expression, opt_matchCase) {
ComparisonBinary.call(this, 'PropertyIsNotEqualTo', propertyName, expression, opt_matchCase); super('PropertyIsNotEqualTo', propertyName, expression, opt_matchCase);
}; }
}
inherits(NotEqualTo, ComparisonBinary);
export default NotEqualTo; export default NotEqualTo;
+9 -8
View File
@@ -1,22 +1,23 @@
/** /**
* @module ol/format/filter/Or * @module ol/format/filter/Or
*/ */
import {inherits} from '../../util.js';
import LogicalNary from '../filter/LogicalNary.js'; import LogicalNary from '../filter/LogicalNary.js';
/** /**
* @classdesc * @classdesc
* Represents a logical `<Or>` operator between two ore more filter conditions. * Represents a logical `<Or>` operator between two ore more filter conditions.
* */
* @constructor class Or extends LogicalNary {
/**
* @param {...module:ol/format/filter/Filter} conditions Conditions. * @param {...module:ol/format/filter/Filter} conditions Conditions.
* @extends {module:ol/format/filter/LogicalNary}
* @api * @api
*/ */
const Or = function(conditions) { constructor(conditions) {
const params = ['Or'].concat(Array.prototype.slice.call(arguments)); const params = ['Or'].concat(Array.prototype.slice.call(arguments));
LogicalNary.apply(this, params); super(...params);
}; }
}
inherits(Or, LogicalNary);
export default Or; export default Or;
+8 -7
View File
@@ -1,7 +1,6 @@
/** /**
* @module ol/format/filter/Spatial * @module ol/format/filter/Spatial
*/ */
import {inherits} from '../../util.js';
import Filter from '../filter/Filter.js'; import Filter from '../filter/Filter.js';
/** /**
@@ -10,18 +9,20 @@ import Filter from '../filter/Filter.js';
* Represents a spatial operator to test whether a geometry-valued property * Represents a spatial operator to test whether a geometry-valued property
* relates to a given geometry. * relates to a given geometry.
* *
* @constructor
* @abstract * @abstract
*/
class Spatial extends Filter {
/**
* @param {!string} tagName The XML tag name for this filter. * @param {!string} tagName The XML tag name for this filter.
* @param {!string} geometryName Geometry name to use. * @param {!string} geometryName Geometry name to use.
* @param {!module:ol/geom/Geometry} geometry Geometry. * @param {!module:ol/geom/Geometry} geometry Geometry.
* @param {string=} opt_srsName SRS name. No srsName attribute will be * @param {string=} opt_srsName SRS name. No srsName attribute will be
* set on geometries when this is not provided. * set on geometries when this is not provided.
* @extends {module:ol/format/filter/Filter}
*/ */
const Spatial = function(tagName, geometryName, geometry, opt_srsName) { constructor(tagName, geometryName, geometry, opt_srsName) {
Filter.call(this, tagName); super(tagName);
/** /**
* @type {!string} * @type {!string}
@@ -37,8 +38,8 @@ const Spatial = function(tagName, geometryName, geometry, opt_srsName) {
* @type {string|undefined} * @type {string|undefined}
*/ */
this.srsName = opt_srsName; this.srsName = opt_srsName;
}; }
inherits(Spatial, Filter); }
export default Spatial; export default Spatial;
+8 -9
View File
@@ -1,27 +1,26 @@
/** /**
* @module ol/format/filter/Within * @module ol/format/filter/Within
*/ */
import {inherits} from '../../util.js';
import Spatial from '../filter/Spatial.js'; import Spatial from '../filter/Spatial.js';
/** /**
* @classdesc * @classdesc
* Represents a `<Within>` operator to test whether a geometry-valued property * Represents a `<Within>` operator to test whether a geometry-valued property
* is within a given geometry. * is within a given geometry.
* */
* @constructor class Within extends Spatial {
/**
* @param {!string} geometryName Geometry name to use. * @param {!string} geometryName Geometry name to use.
* @param {!module:ol/geom/Geometry} geometry Geometry. * @param {!module:ol/geom/Geometry} geometry Geometry.
* @param {string=} opt_srsName SRS name. No srsName attribute will be * @param {string=} opt_srsName SRS name. No srsName attribute will be
* set on geometries when this is not provided. * set on geometries when this is not provided.
* @extends {module:ol/format/filter/Spatial}
* @api * @api
*/ */
const Within = function(geometryName, geometry, opt_srsName) { constructor(geometryName, geometry, opt_srsName) {
super('Within', geometryName, geometry, opt_srsName);
}
Spatial.call(this, 'Within', geometryName, geometry, opt_srsName); }
};
inherits(Within, Spatial);
export default Within; export default Within;
+39 -53
View File
@@ -1,7 +1,6 @@
/** /**
* @module ol/geom/Circle * @module ol/geom/Circle
*/ */
import {inherits} from '../util.js';
import {createOrUpdate, forEachCorner, intersects} from '../extent.js'; import {createOrUpdate, forEachCorner, intersects} from '../extent.js';
import GeometryType from '../geom/GeometryType.js'; import GeometryType from '../geom/GeometryType.js';
import SimpleGeometry from '../geom/SimpleGeometry.js'; import SimpleGeometry from '../geom/SimpleGeometry.js';
@@ -11,27 +10,26 @@ import {deflateCoordinate} from '../geom/flat/deflate.js';
* @classdesc * @classdesc
* Circle geometry. * Circle geometry.
* *
* @constructor
* @extends {!module:ol/geom/SimpleGeometry}
* @param {!module:ol/coordinate~Coordinate} center Center. (For internal use,
* flat coordinates in combination with `opt_layout` and no `opt_radius` are
* also accepted.)
* @param {number=} opt_radius Radius.
* @param {module:ol/geom/GeometryLayout=} opt_layout Layout.
* @api * @api
*/ */
const Circle = function(center, opt_radius, opt_layout) { class Circle extends SimpleGeometry {
SimpleGeometry.call(this);
/**
* @param {!module:ol/coordinate~Coordinate} center Center.
* For internal use, flat coordinates in combination with `opt_layout` and no
* `opt_radius` are also accepted.
* @param {number=} opt_radius Radius.
* @param {module:ol/geom/GeometryLayout=} opt_layout Layout.
*/
constructor(center, opt_radius, opt_layout) {
super();
if (opt_layout !== undefined && opt_radius === undefined) { if (opt_layout !== undefined && opt_radius === undefined) {
this.setFlatCoordinates(opt_layout, center); this.setFlatCoordinates(opt_layout, center);
} else { } else {
const radius = opt_radius ? opt_radius : 0; const radius = opt_radius ? opt_radius : 0;
this.setCenterAndRadius(center, radius, opt_layout); this.setCenterAndRadius(center, radius, opt_layout);
} }
}; }
inherits(Circle, SimpleGeometry);
/** /**
* Make a complete copy of the geometry. * Make a complete copy of the geometry.
@@ -39,15 +37,14 @@ inherits(Circle, SimpleGeometry);
* @override * @override
* @api * @api
*/ */
Circle.prototype.clone = function() { clone() {
return new Circle(this.flatCoordinates.slice(), undefined, this.layout); return new Circle(this.flatCoordinates.slice(), undefined, this.layout);
}; }
/** /**
* @inheritDoc * @inheritDoc
*/ */
Circle.prototype.closestPointXY = function(x, y, closestPoint, minSquaredDistance) { closestPointXY(x, y, closestPoint, minSquaredDistance) {
const flatCoordinates = this.flatCoordinates; const flatCoordinates = this.flatCoordinates;
const dx = x - flatCoordinates[0]; const dx = x - flatCoordinates[0];
const dy = y - flatCoordinates[1]; const dy = y - flatCoordinates[1];
@@ -70,78 +67,71 @@ Circle.prototype.closestPointXY = function(x, y, closestPoint, minSquaredDistanc
} else { } else {
return minSquaredDistance; return minSquaredDistance;
} }
}; }
/** /**
* @inheritDoc * @inheritDoc
*/ */
Circle.prototype.containsXY = function(x, y) { containsXY(x, y) {
const flatCoordinates = this.flatCoordinates; const flatCoordinates = this.flatCoordinates;
const dx = x - flatCoordinates[0]; const dx = x - flatCoordinates[0];
const dy = y - flatCoordinates[1]; const dy = y - flatCoordinates[1];
return dx * dx + dy * dy <= this.getRadiusSquared_(); return dx * dx + dy * dy <= this.getRadiusSquared_();
}; }
/** /**
* Return the center of the circle as {@link module:ol/coordinate~Coordinate coordinate}. * Return the center of the circle as {@link module:ol/coordinate~Coordinate coordinate}.
* @return {module:ol/coordinate~Coordinate} Center. * @return {module:ol/coordinate~Coordinate} Center.
* @api * @api
*/ */
Circle.prototype.getCenter = function() { getCenter() {
return this.flatCoordinates.slice(0, this.stride); return this.flatCoordinates.slice(0, this.stride);
}; }
/** /**
* @inheritDoc * @inheritDoc
*/ */
Circle.prototype.computeExtent = function(extent) { computeExtent(extent) {
const flatCoordinates = this.flatCoordinates; const flatCoordinates = this.flatCoordinates;
const radius = flatCoordinates[this.stride] - flatCoordinates[0]; const radius = flatCoordinates[this.stride] - flatCoordinates[0];
return createOrUpdate( return createOrUpdate(
flatCoordinates[0] - radius, flatCoordinates[1] - radius, flatCoordinates[0] - radius, flatCoordinates[1] - radius,
flatCoordinates[0] + radius, flatCoordinates[1] + radius, flatCoordinates[0] + radius, flatCoordinates[1] + radius,
extent); extent);
}; }
/** /**
* Return the radius of the circle. * Return the radius of the circle.
* @return {number} Radius. * @return {number} Radius.
* @api * @api
*/ */
Circle.prototype.getRadius = function() { getRadius() {
return Math.sqrt(this.getRadiusSquared_()); return Math.sqrt(this.getRadiusSquared_());
}; }
/** /**
* @private * @private
* @return {number} Radius squared. * @return {number} Radius squared.
*/ */
Circle.prototype.getRadiusSquared_ = function() { getRadiusSquared_() {
const dx = this.flatCoordinates[this.stride] - this.flatCoordinates[0]; const dx = this.flatCoordinates[this.stride] - this.flatCoordinates[0];
const dy = this.flatCoordinates[this.stride + 1] - this.flatCoordinates[1]; const dy = this.flatCoordinates[this.stride + 1] - this.flatCoordinates[1];
return dx * dx + dy * dy; return dx * dx + dy * dy;
}; }
/** /**
* @inheritDoc * @inheritDoc
* @api * @api
*/ */
Circle.prototype.getType = function() { getType() {
return GeometryType.CIRCLE; return GeometryType.CIRCLE;
}; }
/** /**
* @inheritDoc * @inheritDoc
* @api * @api
*/ */
Circle.prototype.intersectsExtent = function(extent) { intersectsExtent(extent) {
const circleExtent = this.getExtent(); const circleExtent = this.getExtent();
if (intersects(extent, circleExtent)) { if (intersects(extent, circleExtent)) {
const center = this.getCenter(); const center = this.getCenter();
@@ -157,15 +147,14 @@ Circle.prototype.intersectsExtent = function(extent) {
} }
return false; return false;
}; }
/** /**
* Set the center of the circle as {@link module:ol/coordinate~Coordinate coordinate}. * Set the center of the circle as {@link module:ol/coordinate~Coordinate coordinate}.
* @param {module:ol/coordinate~Coordinate} center Center. * @param {module:ol/coordinate~Coordinate} center Center.
* @api * @api
*/ */
Circle.prototype.setCenter = function(center) { setCenter(center) {
const stride = this.stride; const stride = this.stride;
const radius = this.flatCoordinates[stride] - this.flatCoordinates[0]; const radius = this.flatCoordinates[stride] - this.flatCoordinates[0];
const flatCoordinates = center.slice(); const flatCoordinates = center.slice();
@@ -175,8 +164,7 @@ Circle.prototype.setCenter = function(center) {
} }
this.setFlatCoordinates(this.layout, flatCoordinates); this.setFlatCoordinates(this.layout, flatCoordinates);
this.changed(); this.changed();
}; }
/** /**
* Set the center (as {@link module:ol/coordinate~Coordinate coordinate}) and the radius (as * Set the center (as {@link module:ol/coordinate~Coordinate coordinate}) and the radius (as
@@ -186,7 +174,7 @@ Circle.prototype.setCenter = function(center) {
* @param {module:ol/geom/GeometryLayout=} opt_layout Layout. * @param {module:ol/geom/GeometryLayout=} opt_layout Layout.
* @api * @api
*/ */
Circle.prototype.setCenterAndRadius = function(center, radius, opt_layout) { setCenterAndRadius(center, radius, opt_layout) {
this.setLayout(opt_layout, center, 0); this.setLayout(opt_layout, center, 0);
if (!this.flatCoordinates) { if (!this.flatCoordinates) {
this.flatCoordinates = []; this.flatCoordinates = [];
@@ -201,30 +189,28 @@ Circle.prototype.setCenterAndRadius = function(center, radius, opt_layout) {
} }
flatCoordinates.length = offset; flatCoordinates.length = offset;
this.changed(); this.changed();
}; }
/** /**
* @inheritDoc * @inheritDoc
*/ */
Circle.prototype.getCoordinates = function() {}; getCoordinates() {}
/** /**
* @inheritDoc * @inheritDoc
*/ */
Circle.prototype.setCoordinates = function(coordinates, opt_layout) {}; setCoordinates(coordinates, opt_layout) {}
/** /**
* Set the radius of the circle. The radius is in the units of the projection. * Set the radius of the circle. The radius is in the units of the projection.
* @param {number} radius Radius. * @param {number} radius Radius.
* @api * @api
*/ */
Circle.prototype.setRadius = function(radius) { setRadius(radius) {
this.flatCoordinates[this.stride] = this.flatCoordinates[0] + radius; this.flatCoordinates[this.stride] = this.flatCoordinates[0] + radius;
this.changed(); this.changed();
}; }
}
/** /**
+41 -57
View File
@@ -1,7 +1,6 @@
/** /**
* @module ol/geom/Geometry * @module ol/geom/Geometry
*/ */
import {inherits} from '../util.js';
import BaseObject from '../Object.js'; import BaseObject from '../Object.js';
import {createEmpty, getHeight, returnOrUpdate} from '../extent.js'; import {createEmpty, getHeight, returnOrUpdate} from '../extent.js';
import {FALSE} from '../functions.js'; import {FALSE} from '../functions.js';
@@ -11,6 +10,12 @@ import Units from '../proj/Units.js';
import {create as createTransform, compose as composeTransform} from '../transform.js'; import {create as createTransform, compose as composeTransform} from '../transform.js';
/**
* @type {module:ol/transform~Transform}
*/
const tmpTransform = createTransform();
/** /**
* @classdesc * @classdesc
* Abstract base class; normally only used for creating subclasses and not * Abstract base class; normally only used for creating subclasses and not
@@ -20,14 +25,13 @@ import {create as createTransform, compose as composeTransform} from '../transfo
* To get notified of changes to the geometry, register a listener for the * To get notified of changes to the geometry, register a listener for the
* generic `change` event on your geometry instance. * generic `change` event on your geometry instance.
* *
* @constructor
* @abstract * @abstract
* @extends {module:ol/Object}
* @api * @api
*/ */
const Geometry = function() { class Geometry extends BaseObject {
constructor() {
BaseObject.call(this); super();
/** /**
* @private * @private
@@ -59,24 +63,14 @@ const Geometry = function() {
*/ */
this.simplifiedGeometryRevision = 0; this.simplifiedGeometryRevision = 0;
}; }
inherits(Geometry, BaseObject);
/**
* @type {module:ol/transform~Transform}
*/
const tmpTransform = createTransform();
/** /**
* Make a complete copy of the geometry. * Make a complete copy of the geometry.
* @abstract * @abstract
* @return {!module:ol/geom/Geometry} Clone. * @return {!module:ol/geom/Geometry} Clone.
*/ */
Geometry.prototype.clone = function() {}; clone() {}
/** /**
* @abstract * @abstract
@@ -86,8 +80,7 @@ Geometry.prototype.clone = function() {};
* @param {number} minSquaredDistance Minimum squared distance. * @param {number} minSquaredDistance Minimum squared distance.
* @return {number} Minimum squared distance. * @return {number} Minimum squared distance.
*/ */
Geometry.prototype.closestPointXY = function(x, y, closestPoint, minSquaredDistance) {}; closestPointXY(x, y, closestPoint, minSquaredDistance) {}
/** /**
* Return the closest point of the geometry to the passed point as * Return the closest point of the geometry to the passed point as
@@ -97,12 +90,11 @@ Geometry.prototype.closestPointXY = function(x, y, closestPoint, minSquaredDista
* @return {module:ol/coordinate~Coordinate} Closest point. * @return {module:ol/coordinate~Coordinate} Closest point.
* @api * @api
*/ */
Geometry.prototype.getClosestPoint = function(point, opt_closestPoint) { getClosestPoint(point, opt_closestPoint) {
const closestPoint = opt_closestPoint ? opt_closestPoint : [NaN, NaN]; const closestPoint = opt_closestPoint ? opt_closestPoint : [NaN, NaN];
this.closestPointXY(point[0], point[1], closestPoint, Infinity); this.closestPointXY(point[0], point[1], closestPoint, Infinity);
return closestPoint; return closestPoint;
}; }
/** /**
* Returns true if this geometry includes the specified coordinate. If the * Returns true if this geometry includes the specified coordinate. If the
@@ -111,10 +103,9 @@ Geometry.prototype.getClosestPoint = function(point, opt_closestPoint) {
* @return {boolean} Contains coordinate. * @return {boolean} Contains coordinate.
* @api * @api
*/ */
Geometry.prototype.intersectsCoordinate = function(coordinate) { intersectsCoordinate(coordinate) {
return this.containsXY(coordinate[0], coordinate[1]); return this.containsXY(coordinate[0], coordinate[1]);
}; }
/** /**
* @abstract * @abstract
@@ -122,16 +113,7 @@ Geometry.prototype.intersectsCoordinate = function(coordinate) {
* @protected * @protected
* @return {module:ol/extent~Extent} extent Extent. * @return {module:ol/extent~Extent} extent Extent.
*/ */
Geometry.prototype.computeExtent = function(extent) {}; computeExtent(extent) {}
/**
* @param {number} x X.
* @param {number} y Y.
* @return {boolean} Contains (x, y).
*/
Geometry.prototype.containsXY = FALSE;
/** /**
* Get the extent of the geometry. * Get the extent of the geometry.
@@ -139,14 +121,13 @@ Geometry.prototype.containsXY = FALSE;
* @return {module:ol/extent~Extent} extent Extent. * @return {module:ol/extent~Extent} extent Extent.
* @api * @api
*/ */
Geometry.prototype.getExtent = function(opt_extent) { getExtent(opt_extent) {
if (this.extentRevision_ != this.getRevision()) { if (this.extentRevision_ != this.getRevision()) {
this.extent_ = this.computeExtent(this.extent_); this.extent_ = this.computeExtent(this.extent_);
this.extentRevision_ = this.getRevision(); this.extentRevision_ = this.getRevision();
} }
return returnOrUpdate(this.extent_, opt_extent); return returnOrUpdate(this.extent_, opt_extent);
}; }
/** /**
* Rotate the geometry around a given coordinate. This modifies the geometry * Rotate the geometry around a given coordinate. This modifies the geometry
@@ -156,8 +137,7 @@ Geometry.prototype.getExtent = function(opt_extent) {
* @param {module:ol/coordinate~Coordinate} anchor The rotation center. * @param {module:ol/coordinate~Coordinate} anchor The rotation center.
* @api * @api
*/ */
Geometry.prototype.rotate = function(angle, anchor) {}; rotate(angle, anchor) {}
/** /**
* Scale the geometry (with an optional origin). This modifies the geometry * Scale the geometry (with an optional origin). This modifies the geometry
@@ -170,8 +150,7 @@ Geometry.prototype.rotate = function(angle, anchor) {};
* of the geometry extent). * of the geometry extent).
* @api * @api
*/ */
Geometry.prototype.scale = function(sx, opt_sy, opt_anchor) {}; scale(sx, opt_sy, opt_anchor) {}
/** /**
* Create a simplified version of this geometry. For linestrings, this uses * Create a simplified version of this geometry. For linestrings, this uses
@@ -185,10 +164,9 @@ Geometry.prototype.scale = function(sx, opt_sy, opt_anchor) {};
* geometry. * geometry.
* @api * @api
*/ */
Geometry.prototype.simplify = function(tolerance) { simplify(tolerance) {
return this.getSimplifiedGeometry(tolerance * tolerance); return this.getSimplifiedGeometry(tolerance * tolerance);
}; }
/** /**
* Create a simplified version of this geometry using the Douglas Peucker * Create a simplified version of this geometry using the Douglas Peucker
@@ -198,16 +176,14 @@ Geometry.prototype.simplify = function(tolerance) {
* @param {number} squaredTolerance Squared tolerance. * @param {number} squaredTolerance Squared tolerance.
* @return {module:ol/geom/Geometry} Simplified geometry. * @return {module:ol/geom/Geometry} Simplified geometry.
*/ */
Geometry.prototype.getSimplifiedGeometry = function(squaredTolerance) {}; getSimplifiedGeometry(squaredTolerance) {}
/** /**
* Get the type of this geometry. * Get the type of this geometry.
* @abstract * @abstract
* @return {module:ol/geom/GeometryType} Geometry type. * @return {module:ol/geom/GeometryType} Geometry type.
*/ */
Geometry.prototype.getType = function() {}; getType() {}
/** /**
* Apply a transform function to each coordinate of the geometry. * Apply a transform function to each coordinate of the geometry.
@@ -217,8 +193,7 @@ Geometry.prototype.getType = function() {};
* @abstract * @abstract
* @param {module:ol/proj~TransformFunction} transformFn Transform. * @param {module:ol/proj~TransformFunction} transformFn Transform.
*/ */
Geometry.prototype.applyTransform = function(transformFn) {}; applyTransform(transformFn) {}
/** /**
* Test if the geometry and the passed extent intersect. * Test if the geometry and the passed extent intersect.
@@ -226,8 +201,7 @@ Geometry.prototype.applyTransform = function(transformFn) {};
* @param {module:ol/extent~Extent} extent Extent. * @param {module:ol/extent~Extent} extent Extent.
* @return {boolean} `true` if the geometry and the extent intersect. * @return {boolean} `true` if the geometry and the extent intersect.
*/ */
Geometry.prototype.intersectsExtent = function(extent) {}; intersectsExtent(extent) {}
/** /**
* Translate the geometry. This modifies the geometry coordinates in place. If * Translate the geometry. This modifies the geometry coordinates in place. If
@@ -236,8 +210,7 @@ Geometry.prototype.intersectsExtent = function(extent) {};
* @param {number} deltaX Delta X. * @param {number} deltaX Delta X.
* @param {number} deltaY Delta Y. * @param {number} deltaY Delta Y.
*/ */
Geometry.prototype.translate = function(deltaX, deltaY) {}; translate(deltaX, deltaY) {}
/** /**
* Transform each coordinate of the geometry from one coordinate reference * Transform each coordinate of the geometry from one coordinate reference
@@ -254,7 +227,7 @@ Geometry.prototype.translate = function(deltaX, deltaY) {};
* modified in place. * modified in place.
* @api * @api
*/ */
Geometry.prototype.transform = function(source, destination) { transform(source, destination) {
source = getProjection(source); source = getProjection(source);
const transformFn = source.getUnits() == Units.TILE_PIXELS ? const transformFn = source.getUnits() == Units.TILE_PIXELS ?
function(inCoordinates, outCoordinates, stride) { function(inCoordinates, outCoordinates, stride) {
@@ -272,5 +245,16 @@ Geometry.prototype.transform = function(source, destination) {
getTransform(source, destination); getTransform(source, destination);
this.applyTransform(transformFn); this.applyTransform(transformFn);
return this; return this;
}; }
}
/**
* @param {number} x X.
* @param {number} y Y.
* @return {boolean} Contains (x, y).
*/
Geometry.prototype.containsXY = FALSE;
export default Geometry; export default Geometry;
+61 -78
View File
@@ -1,7 +1,6 @@
/** /**
* @module ol/geom/GeometryCollection * @module ol/geom/GeometryCollection
*/ */
import {inherits} from '../util.js';
import {listen, unlisten} from '../events.js'; import {listen, unlisten} from '../events.js';
import EventType from '../events/EventType.js'; import EventType from '../events/EventType.js';
import {createOrUpdateEmpty, closestSquaredDistanceXY, extend, getCenter} from '../extent.js'; import {createOrUpdateEmpty, closestSquaredDistanceXY, extend, getCenter} from '../extent.js';
@@ -13,14 +12,16 @@ import {clear} from '../obj.js';
* @classdesc * @classdesc
* An array of {@link module:ol/geom/Geometry} objects. * An array of {@link module:ol/geom/Geometry} objects.
* *
* @constructor
* @extends {module:ol/geom/Geometry}
* @param {Array.<module:ol/geom/Geometry>=} opt_geometries Geometries.
* @api * @api
*/ */
const GeometryCollection = function(opt_geometries) { class GeometryCollection extends Geometry {
Geometry.call(this); /**
* @param {Array.<module:ol/geom/Geometry>=} opt_geometries Geometries.
*/
constructor(opt_geometries) {
super();
/** /**
* @private * @private
@@ -29,28 +30,12 @@ const GeometryCollection = function(opt_geometries) {
this.geometries_ = opt_geometries ? opt_geometries : null; this.geometries_ = opt_geometries ? opt_geometries : null;
this.listenGeometriesChange_(); this.listenGeometriesChange_();
};
inherits(GeometryCollection, Geometry);
/**
* @param {Array.<module:ol/geom/Geometry>} geometries Geometries.
* @return {Array.<module:ol/geom/Geometry>} Cloned geometries.
*/
function cloneGeometries(geometries) {
const clonedGeometries = [];
for (let i = 0, ii = geometries.length; i < ii; ++i) {
clonedGeometries.push(geometries[i].clone());
} }
return clonedGeometries;
}
/** /**
* @private * @private
*/ */
GeometryCollection.prototype.unlistenGeometriesChange_ = function() { unlistenGeometriesChange_() {
if (!this.geometries_) { if (!this.geometries_) {
return; return;
} }
@@ -59,13 +44,12 @@ GeometryCollection.prototype.unlistenGeometriesChange_ = function() {
this.geometries_[i], EventType.CHANGE, this.geometries_[i], EventType.CHANGE,
this.changed, this); this.changed, this);
} }
}; }
/** /**
* @private * @private
*/ */
GeometryCollection.prototype.listenGeometriesChange_ = function() { listenGeometriesChange_() {
if (!this.geometries_) { if (!this.geometries_) {
return; return;
} }
@@ -74,8 +58,7 @@ GeometryCollection.prototype.listenGeometriesChange_ = function() {
this.geometries_[i], EventType.CHANGE, this.geometries_[i], EventType.CHANGE,
this.changed, this); this.changed, this);
} }
}; }
/** /**
* Make a complete copy of the geometry. * Make a complete copy of the geometry.
@@ -83,17 +66,16 @@ GeometryCollection.prototype.listenGeometriesChange_ = function() {
* @override * @override
* @api * @api
*/ */
GeometryCollection.prototype.clone = function() { clone() {
const geometryCollection = new GeometryCollection(null); const geometryCollection = new GeometryCollection(null);
geometryCollection.setGeometries(this.geometries_); geometryCollection.setGeometries(this.geometries_);
return geometryCollection; return geometryCollection;
}; }
/** /**
* @inheritDoc * @inheritDoc
*/ */
GeometryCollection.prototype.closestPointXY = function(x, y, closestPoint, minSquaredDistance) { closestPointXY(x, y, closestPoint, minSquaredDistance) {
if (minSquaredDistance < closestSquaredDistanceXY(this.getExtent(), x, y)) { if (minSquaredDistance < closestSquaredDistanceXY(this.getExtent(), x, y)) {
return minSquaredDistance; return minSquaredDistance;
} }
@@ -103,13 +85,12 @@ GeometryCollection.prototype.closestPointXY = function(x, y, closestPoint, minSq
x, y, closestPoint, minSquaredDistance); x, y, closestPoint, minSquaredDistance);
} }
return minSquaredDistance; return minSquaredDistance;
}; }
/** /**
* @inheritDoc * @inheritDoc
*/ */
GeometryCollection.prototype.containsXY = function(x, y) { containsXY(x, y) {
const geometries = this.geometries_; const geometries = this.geometries_;
for (let i = 0, ii = geometries.length; i < ii; ++i) { for (let i = 0, ii = geometries.length; i < ii; ++i) {
if (geometries[i].containsXY(x, y)) { if (geometries[i].containsXY(x, y)) {
@@ -117,44 +98,40 @@ GeometryCollection.prototype.containsXY = function(x, y) {
} }
} }
return false; return false;
}; }
/** /**
* @inheritDoc * @inheritDoc
*/ */
GeometryCollection.prototype.computeExtent = function(extent) { computeExtent(extent) {
createOrUpdateEmpty(extent); createOrUpdateEmpty(extent);
const geometries = this.geometries_; const geometries = this.geometries_;
for (let i = 0, ii = geometries.length; i < ii; ++i) { for (let i = 0, ii = geometries.length; i < ii; ++i) {
extend(extent, geometries[i].getExtent()); extend(extent, geometries[i].getExtent());
} }
return extent; return extent;
}; }
/** /**
* Return the geometries that make up this geometry collection. * Return the geometries that make up this geometry collection.
* @return {Array.<module:ol/geom/Geometry>} Geometries. * @return {Array.<module:ol/geom/Geometry>} Geometries.
* @api * @api
*/ */
GeometryCollection.prototype.getGeometries = function() { getGeometries() {
return cloneGeometries(this.geometries_); return cloneGeometries(this.geometries_);
}; }
/** /**
* @return {Array.<module:ol/geom/Geometry>} Geometries. * @return {Array.<module:ol/geom/Geometry>} Geometries.
*/ */
GeometryCollection.prototype.getGeometriesArray = function() { getGeometriesArray() {
return this.geometries_; return this.geometries_;
}; }
/** /**
* @inheritDoc * @inheritDoc
*/ */
GeometryCollection.prototype.getSimplifiedGeometry = function(squaredTolerance) { getSimplifiedGeometry(squaredTolerance) {
if (this.simplifiedGeometryRevision != this.getRevision()) { if (this.simplifiedGeometryRevision != this.getRevision()) {
clear(this.simplifiedGeometryCache); clear(this.simplifiedGeometryCache);
this.simplifiedGeometryMaxMinSquaredTolerance = 0; this.simplifiedGeometryMaxMinSquaredTolerance = 0;
@@ -190,23 +167,21 @@ GeometryCollection.prototype.getSimplifiedGeometry = function(squaredTolerance)
return this; return this;
} }
} }
}; }
/** /**
* @inheritDoc * @inheritDoc
* @api * @api
*/ */
GeometryCollection.prototype.getType = function() { getType() {
return GeometryType.GEOMETRY_COLLECTION; return GeometryType.GEOMETRY_COLLECTION;
}; }
/** /**
* @inheritDoc * @inheritDoc
* @api * @api
*/ */
GeometryCollection.prototype.intersectsExtent = function(extent) { intersectsExtent(extent) {
const geometries = this.geometries_; const geometries = this.geometries_;
for (let i = 0, ii = geometries.length; i < ii; ++i) { for (let i = 0, ii = geometries.length; i < ii; ++i) {
if (geometries[i].intersectsExtent(extent)) { if (geometries[i].intersectsExtent(extent)) {
@@ -214,35 +189,32 @@ GeometryCollection.prototype.intersectsExtent = function(extent) {
} }
} }
return false; return false;
}; }
/** /**
* @return {boolean} Is empty. * @return {boolean} Is empty.
*/ */
GeometryCollection.prototype.isEmpty = function() { isEmpty() {
return this.geometries_.length === 0; return this.geometries_.length === 0;
}; }
/** /**
* @inheritDoc * @inheritDoc
* @api * @api
*/ */
GeometryCollection.prototype.rotate = function(angle, anchor) { rotate(angle, anchor) {
const geometries = this.geometries_; const geometries = this.geometries_;
for (let i = 0, ii = geometries.length; i < ii; ++i) { for (let i = 0, ii = geometries.length; i < ii; ++i) {
geometries[i].rotate(angle, anchor); geometries[i].rotate(angle, anchor);
} }
this.changed(); this.changed();
}; }
/** /**
* @inheritDoc * @inheritDoc
* @api * @api
*/ */
GeometryCollection.prototype.scale = function(sx, opt_sy, opt_anchor) { scale(sx, opt_sy, opt_anchor) {
let anchor = opt_anchor; let anchor = opt_anchor;
if (!anchor) { if (!anchor) {
anchor = getCenter(this.getExtent()); anchor = getCenter(this.getExtent());
@@ -252,42 +224,38 @@ GeometryCollection.prototype.scale = function(sx, opt_sy, opt_anchor) {
geometries[i].scale(sx, opt_sy, anchor); geometries[i].scale(sx, opt_sy, anchor);
} }
this.changed(); this.changed();
}; }
/** /**
* Set the geometries that make up this geometry collection. * Set the geometries that make up this geometry collection.
* @param {Array.<module:ol/geom/Geometry>} geometries Geometries. * @param {Array.<module:ol/geom/Geometry>} geometries Geometries.
* @api * @api
*/ */
GeometryCollection.prototype.setGeometries = function(geometries) { setGeometries(geometries) {
this.setGeometriesArray(cloneGeometries(geometries)); this.setGeometriesArray(cloneGeometries(geometries));
}; }
/** /**
* @param {Array.<module:ol/geom/Geometry>} geometries Geometries. * @param {Array.<module:ol/geom/Geometry>} geometries Geometries.
*/ */
GeometryCollection.prototype.setGeometriesArray = function(geometries) { setGeometriesArray(geometries) {
this.unlistenGeometriesChange_(); this.unlistenGeometriesChange_();
this.geometries_ = geometries; this.geometries_ = geometries;
this.listenGeometriesChange_(); this.listenGeometriesChange_();
this.changed(); this.changed();
}; }
/** /**
* @inheritDoc * @inheritDoc
* @api * @api
*/ */
GeometryCollection.prototype.applyTransform = function(transformFn) { applyTransform(transformFn) {
const geometries = this.geometries_; const geometries = this.geometries_;
for (let i = 0, ii = geometries.length; i < ii; ++i) { for (let i = 0, ii = geometries.length; i < ii; ++i) {
geometries[i].applyTransform(transformFn); geometries[i].applyTransform(transformFn);
} }
this.changed(); this.changed();
}; }
/** /**
* Translate the geometry. * Translate the geometry.
@@ -296,20 +264,35 @@ GeometryCollection.prototype.applyTransform = function(transformFn) {
* @override * @override
* @api * @api
*/ */
GeometryCollection.prototype.translate = function(deltaX, deltaY) { translate(deltaX, deltaY) {
const geometries = this.geometries_; const geometries = this.geometries_;
for (let i = 0, ii = geometries.length; i < ii; ++i) { for (let i = 0, ii = geometries.length; i < ii; ++i) {
geometries[i].translate(deltaX, deltaY); geometries[i].translate(deltaX, deltaY);
} }
this.changed(); this.changed();
}; }
/** /**
* @inheritDoc * @inheritDoc
*/ */
GeometryCollection.prototype.disposeInternal = function() { disposeInternal() {
this.unlistenGeometriesChange_(); this.unlistenGeometriesChange_();
Geometry.prototype.disposeInternal.call(this); Geometry.prototype.disposeInternal.call(this);
}; }
}
/**
* @param {Array.<module:ol/geom/Geometry>} geometries Geometries.
* @return {Array.<module:ol/geom/Geometry>} Cloned geometries.
*/
function cloneGeometries(geometries) {
const clonedGeometries = [];
for (let i = 0, ii = geometries.length; i < ii; ++i) {
clonedGeometries.push(geometries[i].clone());
}
return clonedGeometries;
}
export default GeometryCollection; export default GeometryCollection;
+38 -51
View File
@@ -1,7 +1,6 @@
/** /**
* @module ol/geom/LineString * @module ol/geom/LineString
*/ */
import {inherits} from '../util.js';
import {extend} from '../array.js'; import {extend} from '../array.js';
import {closestSquaredDistanceXY} from '../extent.js'; import {closestSquaredDistanceXY} from '../extent.js';
import GeometryLayout from '../geom/GeometryLayout.js'; import GeometryLayout from '../geom/GeometryLayout.js';
@@ -20,17 +19,18 @@ import {douglasPeucker} from '../geom/flat/simplify.js';
* @classdesc * @classdesc
* Linestring geometry. * Linestring geometry.
* *
* @constructor
* @extends {module:ol/geom/SimpleGeometry}
* @param {Array.<module:ol/coordinate~Coordinate>|Array.<number>} coordinates
* Coordinates. (For internal use, flat coordinates in combination with
* `opt_layout` are also accepted).
* @param {module:ol/geom/GeometryLayout=} opt_layout Layout.
* @api * @api
*/ */
const LineString = function(coordinates, opt_layout) { class LineString extends SimpleGeometry {
SimpleGeometry.call(this); /**
* @param {Array.<module:ol/coordinate~Coordinate>|Array.<number>} coordinates Coordinates.
* For internal use, flat coordinates in combination with `opt_layout` are also accepted.
* @param {module:ol/geom/GeometryLayout=} opt_layout Layout.
*/
constructor(coordinates, opt_layout) {
super();
/** /**
* @private * @private
@@ -62,25 +62,21 @@ const LineString = function(coordinates, opt_layout) {
this.setCoordinates(coordinates, opt_layout); this.setCoordinates(coordinates, opt_layout);
} }
}; }
inherits(LineString, SimpleGeometry);
/** /**
* Append the passed coordinate to the coordinates of the linestring. * Append the passed coordinate to the coordinates of the linestring.
* @param {module:ol/coordinate~Coordinate} coordinate Coordinate. * @param {module:ol/coordinate~Coordinate} coordinate Coordinate.
* @api * @api
*/ */
LineString.prototype.appendCoordinate = function(coordinate) { appendCoordinate(coordinate) {
if (!this.flatCoordinates) { if (!this.flatCoordinates) {
this.flatCoordinates = coordinate.slice(); this.flatCoordinates = coordinate.slice();
} else { } else {
extend(this.flatCoordinates, coordinate); extend(this.flatCoordinates, coordinate);
} }
this.changed(); this.changed();
}; }
/** /**
* Make a complete copy of the geometry. * Make a complete copy of the geometry.
@@ -88,15 +84,14 @@ LineString.prototype.appendCoordinate = function(coordinate) {
* @override * @override
* @api * @api
*/ */
LineString.prototype.clone = function() { clone() {
return new LineString(this.flatCoordinates.slice(), this.layout); return new LineString(this.flatCoordinates.slice(), this.layout);
}; }
/** /**
* @inheritDoc * @inheritDoc
*/ */
LineString.prototype.closestPointXY = function(x, y, closestPoint, minSquaredDistance) { closestPointXY(x, y, closestPoint, minSquaredDistance) {
if (minSquaredDistance < closestSquaredDistanceXY(this.getExtent(), x, y)) { if (minSquaredDistance < closestSquaredDistanceXY(this.getExtent(), x, y)) {
return minSquaredDistance; return minSquaredDistance;
} }
@@ -108,8 +103,7 @@ LineString.prototype.closestPointXY = function(x, y, closestPoint, minSquaredDis
return assignClosestPoint( return assignClosestPoint(
this.flatCoordinates, 0, this.flatCoordinates.length, this.stride, this.flatCoordinates, 0, this.flatCoordinates.length, this.stride,
this.maxDelta_, false, x, y, closestPoint, minSquaredDistance); this.maxDelta_, false, x, y, closestPoint, minSquaredDistance);
}; }
/** /**
* Iterate over each segment, calling the provided callback. * Iterate over each segment, calling the provided callback.
@@ -122,10 +116,9 @@ LineString.prototype.closestPointXY = function(x, y, closestPoint, minSquaredDis
* @template T,S * @template T,S
* @api * @api
*/ */
LineString.prototype.forEachSegment = function(callback) { forEachSegment(callback) {
return forEachSegment(this.flatCoordinates, 0, this.flatCoordinates.length, this.stride, callback); return forEachSegment(this.flatCoordinates, 0, this.flatCoordinates.length, this.stride, callback);
}; }
/** /**
* Returns the coordinate at `m` using linear interpolation, or `null` if no * Returns the coordinate at `m` using linear interpolation, or `null` if no
@@ -141,7 +134,7 @@ LineString.prototype.forEachSegment = function(callback) {
* @return {module:ol/coordinate~Coordinate} Coordinate. * @return {module:ol/coordinate~Coordinate} Coordinate.
* @api * @api
*/ */
LineString.prototype.getCoordinateAtM = function(m, opt_extrapolate) { getCoordinateAtM(m, opt_extrapolate) {
if (this.layout != GeometryLayout.XYM && if (this.layout != GeometryLayout.XYM &&
this.layout != GeometryLayout.XYZM) { this.layout != GeometryLayout.XYZM) {
return null; return null;
@@ -149,8 +142,7 @@ LineString.prototype.getCoordinateAtM = function(m, opt_extrapolate) {
const extrapolate = opt_extrapolate !== undefined ? opt_extrapolate : false; const extrapolate = opt_extrapolate !== undefined ? opt_extrapolate : false;
return lineStringCoordinateAtM(this.flatCoordinates, 0, return lineStringCoordinateAtM(this.flatCoordinates, 0,
this.flatCoordinates.length, this.stride, m, extrapolate); this.flatCoordinates.length, this.stride, m, extrapolate);
}; }
/** /**
* Return the coordinates of the linestring. * Return the coordinates of the linestring.
@@ -158,11 +150,10 @@ LineString.prototype.getCoordinateAtM = function(m, opt_extrapolate) {
* @override * @override
* @api * @api
*/ */
LineString.prototype.getCoordinates = function() { getCoordinates() {
return inflateCoordinates( return inflateCoordinates(
this.flatCoordinates, 0, this.flatCoordinates.length, this.stride); this.flatCoordinates, 0, this.flatCoordinates.length, this.stride);
}; }
/** /**
* Return the coordinate at the provided fraction along the linestring. * Return the coordinate at the provided fraction along the linestring.
@@ -174,67 +165,61 @@ LineString.prototype.getCoordinates = function() {
* @return {module:ol/coordinate~Coordinate} Coordinate of the interpolated point. * @return {module:ol/coordinate~Coordinate} Coordinate of the interpolated point.
* @api * @api
*/ */
LineString.prototype.getCoordinateAt = function(fraction, opt_dest) { getCoordinateAt(fraction, opt_dest) {
return interpolatePoint( return interpolatePoint(
this.flatCoordinates, 0, this.flatCoordinates.length, this.stride, this.flatCoordinates, 0, this.flatCoordinates.length, this.stride,
fraction, opt_dest); fraction, opt_dest);
}; }
/** /**
* Return the length of the linestring on projected plane. * Return the length of the linestring on projected plane.
* @return {number} Length (on projected plane). * @return {number} Length (on projected plane).
* @api * @api
*/ */
LineString.prototype.getLength = function() { getLength() {
return lineStringLength( return lineStringLength(
this.flatCoordinates, 0, this.flatCoordinates.length, this.stride); this.flatCoordinates, 0, this.flatCoordinates.length, this.stride);
}; }
/** /**
* @return {Array.<number>} Flat midpoint. * @return {Array.<number>} Flat midpoint.
*/ */
LineString.prototype.getFlatMidpoint = function() { getFlatMidpoint() {
if (this.flatMidpointRevision_ != this.getRevision()) { if (this.flatMidpointRevision_ != this.getRevision()) {
this.flatMidpoint_ = this.getCoordinateAt(0.5, this.flatMidpoint_); this.flatMidpoint_ = this.getCoordinateAt(0.5, this.flatMidpoint_);
this.flatMidpointRevision_ = this.getRevision(); this.flatMidpointRevision_ = this.getRevision();
} }
return this.flatMidpoint_; return this.flatMidpoint_;
}; }
/** /**
* @inheritDoc * @inheritDoc
*/ */
LineString.prototype.getSimplifiedGeometryInternal = function(squaredTolerance) { getSimplifiedGeometryInternal(squaredTolerance) {
const simplifiedFlatCoordinates = []; const simplifiedFlatCoordinates = [];
simplifiedFlatCoordinates.length = douglasPeucker( simplifiedFlatCoordinates.length = douglasPeucker(
this.flatCoordinates, 0, this.flatCoordinates.length, this.stride, this.flatCoordinates, 0, this.flatCoordinates.length, this.stride,
squaredTolerance, simplifiedFlatCoordinates, 0); squaredTolerance, simplifiedFlatCoordinates, 0);
return new LineString(simplifiedFlatCoordinates, GeometryLayout.XY); return new LineString(simplifiedFlatCoordinates, GeometryLayout.XY);
}; }
/** /**
* @inheritDoc * @inheritDoc
* @api * @api
*/ */
LineString.prototype.getType = function() { getType() {
return GeometryType.LINE_STRING; return GeometryType.LINE_STRING;
}; }
/** /**
* @inheritDoc * @inheritDoc
* @api * @api
*/ */
LineString.prototype.intersectsExtent = function(extent) { intersectsExtent(extent) {
return intersectsLineString( return intersectsLineString(
this.flatCoordinates, 0, this.flatCoordinates.length, this.stride, this.flatCoordinates, 0, this.flatCoordinates.length, this.stride,
extent); extent);
}; }
/** /**
* Set the coordinates of the linestring. * Set the coordinates of the linestring.
@@ -243,7 +228,7 @@ LineString.prototype.intersectsExtent = function(extent) {
* @override * @override
* @api * @api
*/ */
LineString.prototype.setCoordinates = function(coordinates, opt_layout) { setCoordinates(coordinates, opt_layout) {
this.setLayout(opt_layout, coordinates, 1); this.setLayout(opt_layout, coordinates, 1);
if (!this.flatCoordinates) { if (!this.flatCoordinates) {
this.flatCoordinates = []; this.flatCoordinates = [];
@@ -251,6 +236,8 @@ LineString.prototype.setCoordinates = function(coordinates, opt_layout) {
this.flatCoordinates.length = deflateCoordinates( this.flatCoordinates.length = deflateCoordinates(
this.flatCoordinates, 0, coordinates, this.stride); this.flatCoordinates, 0, coordinates, this.stride);
this.changed(); this.changed();
}; }
}
export default LineString; export default LineString;
+28 -35
View File
@@ -1,7 +1,6 @@
/** /**
* @module ol/geom/LinearRing * @module ol/geom/LinearRing
*/ */
import {inherits} from '../util.js';
import {closestSquaredDistanceXY} from '../extent.js'; import {closestSquaredDistanceXY} from '../extent.js';
import GeometryLayout from '../geom/GeometryLayout.js'; import GeometryLayout from '../geom/GeometryLayout.js';
import GeometryType from '../geom/GeometryType.js'; import GeometryType from '../geom/GeometryType.js';
@@ -17,17 +16,18 @@ import {douglasPeucker} from '../geom/flat/simplify.js';
* Linear ring geometry. Only used as part of polygon; cannot be rendered * Linear ring geometry. Only used as part of polygon; cannot be rendered
* on its own. * on its own.
* *
* @constructor
* @extends {module:ol/geom/SimpleGeometry}
* @param {Array.<module:ol/coordinate~Coordinate>|Array.<number>} coordinates
* Coordinates. (For internal use, flat coordinates in combination with
* `opt_layout` are also accepted.)
* @param {module:ol/geom/GeometryLayout=} opt_layout Layout.
* @api * @api
*/ */
const LinearRing = function(coordinates, opt_layout) { class LinearRing extends SimpleGeometry {
SimpleGeometry.call(this); /**
* @param {Array.<module:ol/coordinate~Coordinate>|Array.<number>} coordinates Coordinates.
* For internal use, flat coordinates in combination with `opt_layout` are also accepted.
* @param {module:ol/geom/GeometryLayout=} opt_layout Layout.
*/
constructor(coordinates, opt_layout) {
super();
/** /**
* @private * @private
@@ -47,10 +47,7 @@ const LinearRing = function(coordinates, opt_layout) {
this.setCoordinates(coordinates, opt_layout); this.setCoordinates(coordinates, opt_layout);
} }
}; }
inherits(LinearRing, SimpleGeometry);
/** /**
* Make a complete copy of the geometry. * Make a complete copy of the geometry.
@@ -58,15 +55,14 @@ inherits(LinearRing, SimpleGeometry);
* @override * @override
* @api * @api
*/ */
LinearRing.prototype.clone = function() { clone() {
return new LinearRing(this.flatCoordinates.slice(), this.layout); return new LinearRing(this.flatCoordinates.slice(), this.layout);
}; }
/** /**
* @inheritDoc * @inheritDoc
*/ */
LinearRing.prototype.closestPointXY = function(x, y, closestPoint, minSquaredDistance) { closestPointXY(x, y, closestPoint, minSquaredDistance) {
if (minSquaredDistance < closestSquaredDistanceXY(this.getExtent(), x, y)) { if (minSquaredDistance < closestSquaredDistanceXY(this.getExtent(), x, y)) {
return minSquaredDistance; return minSquaredDistance;
} }
@@ -78,18 +74,16 @@ LinearRing.prototype.closestPointXY = function(x, y, closestPoint, minSquaredDis
return assignClosestPoint( return assignClosestPoint(
this.flatCoordinates, 0, this.flatCoordinates.length, this.stride, this.flatCoordinates, 0, this.flatCoordinates.length, this.stride,
this.maxDelta_, true, x, y, closestPoint, minSquaredDistance); this.maxDelta_, true, x, y, closestPoint, minSquaredDistance);
}; }
/** /**
* Return the area of the linear ring on projected plane. * Return the area of the linear ring on projected plane.
* @return {number} Area (on projected plane). * @return {number} Area (on projected plane).
* @api * @api
*/ */
LinearRing.prototype.getArea = function() { getArea() {
return linearRingArea(this.flatCoordinates, 0, this.flatCoordinates.length, this.stride); return linearRingArea(this.flatCoordinates, 0, this.flatCoordinates.length, this.stride);
}; }
/** /**
* Return the coordinates of the linear ring. * Return the coordinates of the linear ring.
@@ -97,38 +91,34 @@ LinearRing.prototype.getArea = function() {
* @override * @override
* @api * @api
*/ */
LinearRing.prototype.getCoordinates = function() { getCoordinates() {
return inflateCoordinates( return inflateCoordinates(
this.flatCoordinates, 0, this.flatCoordinates.length, this.stride); this.flatCoordinates, 0, this.flatCoordinates.length, this.stride);
}; }
/** /**
* @inheritDoc * @inheritDoc
*/ */
LinearRing.prototype.getSimplifiedGeometryInternal = function(squaredTolerance) { getSimplifiedGeometryInternal(squaredTolerance) {
const simplifiedFlatCoordinates = []; const simplifiedFlatCoordinates = [];
simplifiedFlatCoordinates.length = douglasPeucker( simplifiedFlatCoordinates.length = douglasPeucker(
this.flatCoordinates, 0, this.flatCoordinates.length, this.stride, this.flatCoordinates, 0, this.flatCoordinates.length, this.stride,
squaredTolerance, simplifiedFlatCoordinates, 0); squaredTolerance, simplifiedFlatCoordinates, 0);
return new LinearRing(simplifiedFlatCoordinates, GeometryLayout.XY); return new LinearRing(simplifiedFlatCoordinates, GeometryLayout.XY);
}; }
/** /**
* @inheritDoc * @inheritDoc
* @api * @api
*/ */
LinearRing.prototype.getType = function() { getType() {
return GeometryType.LINEAR_RING; return GeometryType.LINEAR_RING;
}; }
/** /**
* @inheritDoc * @inheritDoc
*/ */
LinearRing.prototype.intersectsExtent = function(extent) {}; intersectsExtent(extent) {}
/** /**
* Set the coordinates of the linear ring. * Set the coordinates of the linear ring.
@@ -137,7 +127,7 @@ LinearRing.prototype.intersectsExtent = function(extent) {};
* @override * @override
* @api * @api
*/ */
LinearRing.prototype.setCoordinates = function(coordinates, opt_layout) { setCoordinates(coordinates, opt_layout) {
this.setLayout(opt_layout, coordinates, 1); this.setLayout(opt_layout, coordinates, 1);
if (!this.flatCoordinates) { if (!this.flatCoordinates) {
this.flatCoordinates = []; this.flatCoordinates = [];
@@ -145,5 +135,8 @@ LinearRing.prototype.setCoordinates = function(coordinates, opt_layout) {
this.flatCoordinates.length = deflateCoordinates( this.flatCoordinates.length = deflateCoordinates(
this.flatCoordinates, 0, coordinates, this.stride); this.flatCoordinates, 0, coordinates, this.stride);
this.changed(); this.changed();
}; }
}
export default LinearRing; export default LinearRing;
+37 -48
View File
@@ -1,7 +1,6 @@
/** /**
* @module ol/geom/MultiLineString * @module ol/geom/MultiLineString
*/ */
import {inherits} from '../util.js';
import {extend} from '../array.js'; import {extend} from '../array.js';
import {closestSquaredDistanceXY} from '../extent.js'; import {closestSquaredDistanceXY} from '../extent.js';
import GeometryLayout from '../geom/GeometryLayout.js'; import GeometryLayout from '../geom/GeometryLayout.js';
@@ -19,18 +18,20 @@ import {douglasPeuckerArray} from '../geom/flat/simplify.js';
* @classdesc * @classdesc
* Multi-linestring geometry. * Multi-linestring geometry.
* *
* @constructor * @api
* @extends {module:ol/geom/SimpleGeometry} */
class MultiLineString extends SimpleGeometry {
/**
* @param {Array.<Array.<module:ol/coordinate~Coordinate>|module:ol/geom~MultiLineString>|Array.<number>} coordinates * @param {Array.<Array.<module:ol/coordinate~Coordinate>|module:ol/geom~MultiLineString>|Array.<number>} coordinates
* Coordinates or LineString geometries. (For internal use, flat coordinates in * Coordinates or LineString geometries. (For internal use, flat coordinates in
* combination with `opt_layout` and `opt_ends` are also accepted.) * combination with `opt_layout` and `opt_ends` are also accepted.)
* @param {module:ol/geom/GeometryLayout=} opt_layout Layout. * @param {module:ol/geom/GeometryLayout=} opt_layout Layout.
* @param {Array.<number>} opt_ends Flat coordinate ends for internal use. * @param {Array.<number>} opt_ends Flat coordinate ends for internal use.
* @api
*/ */
const MultiLineString = function(coordinates, opt_layout, opt_ends) { constructor(coordinates, opt_layout, opt_ends) {
SimpleGeometry.call(this); super();
/** /**
* @type {Array.<number>} * @type {Array.<number>}
@@ -71,17 +72,14 @@ const MultiLineString = function(coordinates, opt_layout, opt_ends) {
this.ends_ = ends; this.ends_ = ends;
} }
}; }
inherits(MultiLineString, SimpleGeometry);
/** /**
* Append the passed linestring to the multilinestring. * Append the passed linestring to the multilinestring.
* @param {module:ol/geom/LineString} lineString LineString. * @param {module:ol/geom/LineString} lineString LineString.
* @api * @api
*/ */
MultiLineString.prototype.appendLineString = function(lineString) { appendLineString(lineString) {
if (!this.flatCoordinates) { if (!this.flatCoordinates) {
this.flatCoordinates = lineString.getFlatCoordinates().slice(); this.flatCoordinates = lineString.getFlatCoordinates().slice();
} else { } else {
@@ -89,8 +87,7 @@ MultiLineString.prototype.appendLineString = function(lineString) {
} }
this.ends_.push(this.flatCoordinates.length); this.ends_.push(this.flatCoordinates.length);
this.changed(); this.changed();
}; }
/** /**
* Make a complete copy of the geometry. * Make a complete copy of the geometry.
@@ -98,15 +95,14 @@ MultiLineString.prototype.appendLineString = function(lineString) {
* @override * @override
* @api * @api
*/ */
MultiLineString.prototype.clone = function() { clone() {
return new MultiLineString(this.flatCoordinates.slice(), this.layout, this.ends_.slice()); return new MultiLineString(this.flatCoordinates.slice(), this.layout, this.ends_.slice());
}; }
/** /**
* @inheritDoc * @inheritDoc
*/ */
MultiLineString.prototype.closestPointXY = function(x, y, closestPoint, minSquaredDistance) { closestPointXY(x, y, closestPoint, minSquaredDistance) {
if (minSquaredDistance < closestSquaredDistanceXY(this.getExtent(), x, y)) { if (minSquaredDistance < closestSquaredDistanceXY(this.getExtent(), x, y)) {
return minSquaredDistance; return minSquaredDistance;
} }
@@ -118,8 +114,7 @@ MultiLineString.prototype.closestPointXY = function(x, y, closestPoint, minSquar
return assignClosestArrayPoint( return assignClosestArrayPoint(
this.flatCoordinates, 0, this.ends_, this.stride, this.flatCoordinates, 0, this.ends_, this.stride,
this.maxDelta_, false, x, y, closestPoint, minSquaredDistance); this.maxDelta_, false, x, y, closestPoint, minSquaredDistance);
}; }
/** /**
* Returns the coordinate at `m` using linear interpolation, or `null` if no * Returns the coordinate at `m` using linear interpolation, or `null` if no
@@ -143,7 +138,7 @@ MultiLineString.prototype.closestPointXY = function(x, y, closestPoint, minSquar
* @return {module:ol/coordinate~Coordinate} Coordinate. * @return {module:ol/coordinate~Coordinate} Coordinate.
* @api * @api
*/ */
MultiLineString.prototype.getCoordinateAtM = function(m, opt_extrapolate, opt_interpolate) { getCoordinateAtM(m, opt_extrapolate, opt_interpolate) {
if ((this.layout != GeometryLayout.XYM && if ((this.layout != GeometryLayout.XYM &&
this.layout != GeometryLayout.XYZM) || this.layout != GeometryLayout.XYZM) ||
this.flatCoordinates.length === 0) { this.flatCoordinates.length === 0) {
@@ -153,8 +148,7 @@ MultiLineString.prototype.getCoordinateAtM = function(m, opt_extrapolate, opt_in
const interpolate = opt_interpolate !== undefined ? opt_interpolate : false; const interpolate = opt_interpolate !== undefined ? opt_interpolate : false;
return lineStringsCoordinateAtM(this.flatCoordinates, 0, return lineStringsCoordinateAtM(this.flatCoordinates, 0,
this.ends_, this.stride, m, extrapolate, interpolate); this.ends_, this.stride, m, extrapolate, interpolate);
}; }
/** /**
* Return the coordinates of the multilinestring. * Return the coordinates of the multilinestring.
@@ -162,19 +156,17 @@ MultiLineString.prototype.getCoordinateAtM = function(m, opt_extrapolate, opt_in
* @override * @override
* @api * @api
*/ */
MultiLineString.prototype.getCoordinates = function() { getCoordinates() {
return inflateCoordinatesArray( return inflateCoordinatesArray(
this.flatCoordinates, 0, this.ends_, this.stride); this.flatCoordinates, 0, this.ends_, this.stride);
}; }
/** /**
* @return {Array.<number>} Ends. * @return {Array.<number>} Ends.
*/ */
MultiLineString.prototype.getEnds = function() { getEnds() {
return this.ends_; return this.ends_;
}; }
/** /**
* Return the linestring at the specified index. * Return the linestring at the specified index.
@@ -182,21 +174,20 @@ MultiLineString.prototype.getEnds = function() {
* @return {module:ol/geom/LineString} LineString. * @return {module:ol/geom/LineString} LineString.
* @api * @api
*/ */
MultiLineString.prototype.getLineString = function(index) { getLineString(index) {
if (index < 0 || this.ends_.length <= index) { if (index < 0 || this.ends_.length <= index) {
return null; return null;
} }
return new LineString(this.flatCoordinates.slice( return new LineString(this.flatCoordinates.slice(
index === 0 ? 0 : this.ends_[index - 1], this.ends_[index]), this.layout); index === 0 ? 0 : this.ends_[index - 1], this.ends_[index]), this.layout);
}; }
/** /**
* Return the linestrings of this multilinestring. * Return the linestrings of this multilinestring.
* @return {Array.<module:ol/geom/LineString>} LineStrings. * @return {Array.<module:ol/geom/LineString>} LineStrings.
* @api * @api
*/ */
MultiLineString.prototype.getLineStrings = function() { getLineStrings() {
const flatCoordinates = this.flatCoordinates; const flatCoordinates = this.flatCoordinates;
const ends = this.ends_; const ends = this.ends_;
const layout = this.layout; const layout = this.layout;
@@ -210,13 +201,12 @@ MultiLineString.prototype.getLineStrings = function() {
offset = end; offset = end;
} }
return lineStrings; return lineStrings;
}; }
/** /**
* @return {Array.<number>} Flat midpoints. * @return {Array.<number>} Flat midpoints.
*/ */
MultiLineString.prototype.getFlatMidpoints = function() { getFlatMidpoints() {
const midpoints = []; const midpoints = [];
const flatCoordinates = this.flatCoordinates; const flatCoordinates = this.flatCoordinates;
let offset = 0; let offset = 0;
@@ -230,40 +220,36 @@ MultiLineString.prototype.getFlatMidpoints = function() {
offset = end; offset = end;
} }
return midpoints; return midpoints;
}; }
/** /**
* @inheritDoc * @inheritDoc
*/ */
MultiLineString.prototype.getSimplifiedGeometryInternal = function(squaredTolerance) { getSimplifiedGeometryInternal(squaredTolerance) {
const simplifiedFlatCoordinates = []; const simplifiedFlatCoordinates = [];
const simplifiedEnds = []; const simplifiedEnds = [];
simplifiedFlatCoordinates.length = douglasPeuckerArray( simplifiedFlatCoordinates.length = douglasPeuckerArray(
this.flatCoordinates, 0, this.ends_, this.stride, squaredTolerance, this.flatCoordinates, 0, this.ends_, this.stride, squaredTolerance,
simplifiedFlatCoordinates, 0, simplifiedEnds); simplifiedFlatCoordinates, 0, simplifiedEnds);
return new MultiLineString(simplifiedFlatCoordinates, GeometryLayout.XY, simplifiedEnds); return new MultiLineString(simplifiedFlatCoordinates, GeometryLayout.XY, simplifiedEnds);
}; }
/** /**
* @inheritDoc * @inheritDoc
* @api * @api
*/ */
MultiLineString.prototype.getType = function() { getType() {
return GeometryType.MULTI_LINE_STRING; return GeometryType.MULTI_LINE_STRING;
}; }
/** /**
* @inheritDoc * @inheritDoc
* @api * @api
*/ */
MultiLineString.prototype.intersectsExtent = function(extent) { intersectsExtent(extent) {
return intersectsLineStringArray( return intersectsLineStringArray(
this.flatCoordinates, 0, this.ends_, this.stride, extent); this.flatCoordinates, 0, this.ends_, this.stride, extent);
}; }
/** /**
* Set the coordinates of the multilinestring. * Set the coordinates of the multilinestring.
@@ -272,7 +258,7 @@ MultiLineString.prototype.intersectsExtent = function(extent) {
* @override * @override
* @api * @api
*/ */
MultiLineString.prototype.setCoordinates = function(coordinates, opt_layout) { setCoordinates(coordinates, opt_layout) {
this.setLayout(opt_layout, coordinates, 2); this.setLayout(opt_layout, coordinates, 2);
if (!this.flatCoordinates) { if (!this.flatCoordinates) {
this.flatCoordinates = []; this.flatCoordinates = [];
@@ -281,5 +267,8 @@ MultiLineString.prototype.setCoordinates = function(coordinates, opt_layout) {
this.flatCoordinates, 0, coordinates, this.stride, this.ends_); this.flatCoordinates, 0, coordinates, this.stride, this.ends_);
this.flatCoordinates.length = ends.length === 0 ? 0 : ends[ends.length - 1]; this.flatCoordinates.length = ends.length === 0 ? 0 : ends[ends.length - 1];
this.changed(); this.changed();
}; }
}
export default MultiLineString; export default MultiLineString;
+31 -39
View File
@@ -1,7 +1,6 @@
/** /**
* @module ol/geom/MultiPoint * @module ol/geom/MultiPoint
*/ */
import {inherits} from '../util.js';
import {extend} from '../array.js'; import {extend} from '../array.js';
import {closestSquaredDistanceXY, containsXY} from '../extent.js'; import {closestSquaredDistanceXY, containsXY} from '../extent.js';
import GeometryType from '../geom/GeometryType.js'; import GeometryType from '../geom/GeometryType.js';
@@ -15,40 +14,37 @@ import {squaredDistance as squaredDx} from '../math.js';
* @classdesc * @classdesc
* Multi-point geometry. * Multi-point geometry.
* *
* @constructor
* @extends {module:ol/geom/SimpleGeometry}
* @param {Array.<module:ol/coordinate~Coordinate>|Array.<number>} coordinates
* Coordinates. (For internal use, flat coordinates in combination with
* `opt_layout` are also accepted)
* @param {module:ol/geom/GeometryLayout=} opt_layout Layout.
* @api * @api
*/ */
const MultiPoint = function(coordinates, opt_layout) { class MultiPoint extends SimpleGeometry {
SimpleGeometry.call(this);
/**
* @param {Array.<module:ol/coordinate~Coordinate>|Array.<number>} coordinates Coordinates.
* For internal use, flat coordinates in combination with `opt_layout` are also accepted.
* @param {module:ol/geom/GeometryLayout=} opt_layout Layout.
*/
constructor(coordinates, opt_layout) {
super();
if (opt_layout && !Array.isArray(coordinates[0])) { if (opt_layout && !Array.isArray(coordinates[0])) {
this.setFlatCoordinates(opt_layout, coordinates); this.setFlatCoordinates(opt_layout, coordinates);
} else { } else {
this.setCoordinates(coordinates, opt_layout); this.setCoordinates(coordinates, opt_layout);
} }
}; }
inherits(MultiPoint, SimpleGeometry);
/** /**
* Append the passed point to this multipoint. * Append the passed point to this multipoint.
* @param {module:ol/geom/Point} point Point. * @param {module:ol/geom/Point} point Point.
* @api * @api
*/ */
MultiPoint.prototype.appendPoint = function(point) { appendPoint(point) {
if (!this.flatCoordinates) { if (!this.flatCoordinates) {
this.flatCoordinates = point.getFlatCoordinates().slice(); this.flatCoordinates = point.getFlatCoordinates().slice();
} else { } else {
extend(this.flatCoordinates, point.getFlatCoordinates()); extend(this.flatCoordinates, point.getFlatCoordinates());
} }
this.changed(); this.changed();
}; }
/** /**
* Make a complete copy of the geometry. * Make a complete copy of the geometry.
@@ -56,16 +52,15 @@ MultiPoint.prototype.appendPoint = function(point) {
* @override * @override
* @api * @api
*/ */
MultiPoint.prototype.clone = function() { clone() {
const multiPoint = new MultiPoint(this.flatCoordinates.slice(), this.layout); const multiPoint = new MultiPoint(this.flatCoordinates.slice(), this.layout);
return multiPoint; return multiPoint;
}; }
/** /**
* @inheritDoc * @inheritDoc
*/ */
MultiPoint.prototype.closestPointXY = function(x, y, closestPoint, minSquaredDistance) { closestPointXY(x, y, closestPoint, minSquaredDistance) {
if (minSquaredDistance < closestSquaredDistanceXY(this.getExtent(), x, y)) { if (minSquaredDistance < closestSquaredDistanceXY(this.getExtent(), x, y)) {
return minSquaredDistance; return minSquaredDistance;
} }
@@ -83,8 +78,7 @@ MultiPoint.prototype.closestPointXY = function(x, y, closestPoint, minSquaredDis
} }
} }
return minSquaredDistance; return minSquaredDistance;
}; }
/** /**
* Return the coordinates of the multipoint. * Return the coordinates of the multipoint.
@@ -92,11 +86,10 @@ MultiPoint.prototype.closestPointXY = function(x, y, closestPoint, minSquaredDis
* @override * @override
* @api * @api
*/ */
MultiPoint.prototype.getCoordinates = function() { getCoordinates() {
return inflateCoordinates( return inflateCoordinates(
this.flatCoordinates, 0, this.flatCoordinates.length, this.stride); this.flatCoordinates, 0, this.flatCoordinates.length, this.stride);
}; }
/** /**
* Return the point at the specified index. * Return the point at the specified index.
@@ -104,22 +97,21 @@ MultiPoint.prototype.getCoordinates = function() {
* @return {module:ol/geom/Point} Point. * @return {module:ol/geom/Point} Point.
* @api * @api
*/ */
MultiPoint.prototype.getPoint = function(index) { getPoint(index) {
const n = !this.flatCoordinates ? 0 : this.flatCoordinates.length / this.stride; const n = !this.flatCoordinates ? 0 : this.flatCoordinates.length / this.stride;
if (index < 0 || n <= index) { if (index < 0 || n <= index) {
return null; return null;
} }
return new Point(this.flatCoordinates.slice( return new Point(this.flatCoordinates.slice(
index * this.stride, (index + 1) * this.stride), this.layout); index * this.stride, (index + 1) * this.stride), this.layout);
}; }
/** /**
* Return the points of this multipoint. * Return the points of this multipoint.
* @return {Array.<module:ol/geom/Point>} Points. * @return {Array.<module:ol/geom/Point>} Points.
* @api * @api
*/ */
MultiPoint.prototype.getPoints = function() { getPoints() {
const flatCoordinates = this.flatCoordinates; const flatCoordinates = this.flatCoordinates;
const layout = this.layout; const layout = this.layout;
const stride = this.stride; const stride = this.stride;
@@ -130,23 +122,21 @@ MultiPoint.prototype.getPoints = function() {
points.push(point); points.push(point);
} }
return points; return points;
}; }
/** /**
* @inheritDoc * @inheritDoc
* @api * @api
*/ */
MultiPoint.prototype.getType = function() { getType() {
return GeometryType.MULTI_POINT; return GeometryType.MULTI_POINT;
}; }
/** /**
* @inheritDoc * @inheritDoc
* @api * @api
*/ */
MultiPoint.prototype.intersectsExtent = function(extent) { intersectsExtent(extent) {
const flatCoordinates = this.flatCoordinates; const flatCoordinates = this.flatCoordinates;
const stride = this.stride; const stride = this.stride;
for (let i = 0, ii = flatCoordinates.length; i < ii; i += stride) { for (let i = 0, ii = flatCoordinates.length; i < ii; i += stride) {
@@ -157,8 +147,7 @@ MultiPoint.prototype.intersectsExtent = function(extent) {
} }
} }
return false; return false;
}; }
/** /**
* Set the coordinates of the multipoint. * Set the coordinates of the multipoint.
@@ -167,7 +156,7 @@ MultiPoint.prototype.intersectsExtent = function(extent) {
* @override * @override
* @api * @api
*/ */
MultiPoint.prototype.setCoordinates = function(coordinates, opt_layout) { setCoordinates(coordinates, opt_layout) {
this.setLayout(opt_layout, coordinates, 1); this.setLayout(opt_layout, coordinates, 1);
if (!this.flatCoordinates) { if (!this.flatCoordinates) {
this.flatCoordinates = []; this.flatCoordinates = [];
@@ -175,5 +164,8 @@ MultiPoint.prototype.setCoordinates = function(coordinates, opt_layout) {
this.flatCoordinates.length = deflateCoordinates( this.flatCoordinates.length = deflateCoordinates(
this.flatCoordinates, 0, coordinates, this.stride); this.flatCoordinates, 0, coordinates, this.stride);
this.changed(); this.changed();
}; }
}
export default MultiPoint; export default MultiPoint;
+44 -62
View File
@@ -1,7 +1,6 @@
/** /**
* @module ol/geom/MultiPolygon * @module ol/geom/MultiPolygon
*/ */
import {inherits} from '../util.js';
import {extend} from '../array.js'; import {extend} from '../array.js';
import {closestSquaredDistanceXY} from '../extent.js'; import {closestSquaredDistanceXY} from '../extent.js';
import GeometryLayout from '../geom/GeometryLayout.js'; import GeometryLayout from '../geom/GeometryLayout.js';
@@ -24,19 +23,19 @@ import {quantizeMultiArray} from '../geom/flat/simplify.js';
* @classdesc * @classdesc
* Multi-polygon geometry. * Multi-polygon geometry.
* *
* @constructor
* @extends {module:ol/geom/SimpleGeometry}
* @param {Array.<Array.<Array.<module:ol/coordinate~Coordinate>>>|Array.<number>} coordinates
* Coordinates. (For internal use, flat coordinats in combination with
* `opt_layout` and `opt_endss` are also accepted).
* @param {module:ol/geom/GeometryLayout=} opt_layout Layout.
* @param {Array.<number>} opt_endss Array of ends for internal use with flat
* coordinates.
* @api * @api
*/ */
const MultiPolygon = function(coordinates, opt_layout, opt_endss) { class MultiPolygon extends SimpleGeometry {
SimpleGeometry.call(this); /**
* @param {Array.<Array.<Array.<module:ol/coordinate~Coordinate>>>|Array.<number>} coordinates Coordinates.
* For internal use, flat coordinats in combination with `opt_layout` and `opt_endss` are also accepted.
* @param {module:ol/geom/GeometryLayout=} opt_layout Layout.
* @param {Array.<number>} opt_endss Array of ends for internal use with flat coordinates.
*/
constructor(coordinates, opt_layout, opt_endss) {
super();
/** /**
* @type {Array.<Array.<number>>} * @type {Array.<Array.<number>>}
@@ -108,17 +107,14 @@ const MultiPolygon = function(coordinates, opt_layout, opt_endss) {
this.setCoordinates(coordinates, opt_layout); this.setCoordinates(coordinates, opt_layout);
} }
}; }
inherits(MultiPolygon, SimpleGeometry);
/** /**
* Append the passed polygon to this multipolygon. * Append the passed polygon to this multipolygon.
* @param {module:ol/geom/Polygon} polygon Polygon. * @param {module:ol/geom/Polygon} polygon Polygon.
* @api * @api
*/ */
MultiPolygon.prototype.appendPolygon = function(polygon) { appendPolygon(polygon) {
/** @type {Array.<number>} */ /** @type {Array.<number>} */
let ends; let ends;
if (!this.flatCoordinates) { if (!this.flatCoordinates) {
@@ -135,8 +131,7 @@ MultiPolygon.prototype.appendPolygon = function(polygon) {
} }
this.endss_.push(ends); this.endss_.push(ends);
this.changed(); this.changed();
}; }
/** /**
* Make a complete copy of the geometry. * Make a complete copy of the geometry.
@@ -144,7 +139,7 @@ MultiPolygon.prototype.appendPolygon = function(polygon) {
* @override * @override
* @api * @api
*/ */
MultiPolygon.prototype.clone = function() { clone() {
const len = this.endss_.length; const len = this.endss_.length;
const newEndss = new Array(len); const newEndss = new Array(len);
for (let i = 0; i < len; ++i) { for (let i = 0; i < len; ++i) {
@@ -153,13 +148,12 @@ MultiPolygon.prototype.clone = function() {
return new MultiPolygon( return new MultiPolygon(
this.flatCoordinates.slice(), this.layout, newEndss); this.flatCoordinates.slice(), this.layout, newEndss);
}; }
/** /**
* @inheritDoc * @inheritDoc
*/ */
MultiPolygon.prototype.closestPointXY = function(x, y, closestPoint, minSquaredDistance) { closestPointXY(x, y, closestPoint, minSquaredDistance) {
if (minSquaredDistance < closestSquaredDistanceXY(this.getExtent(), x, y)) { if (minSquaredDistance < closestSquaredDistanceXY(this.getExtent(), x, y)) {
return minSquaredDistance; return minSquaredDistance;
} }
@@ -171,26 +165,23 @@ MultiPolygon.prototype.closestPointXY = function(x, y, closestPoint, minSquaredD
return assignClosestMultiArrayPoint( return assignClosestMultiArrayPoint(
this.getOrientedFlatCoordinates(), 0, this.endss_, this.stride, this.getOrientedFlatCoordinates(), 0, this.endss_, this.stride,
this.maxDelta_, true, x, y, closestPoint, minSquaredDistance); this.maxDelta_, true, x, y, closestPoint, minSquaredDistance);
}; }
/** /**
* @inheritDoc * @inheritDoc
*/ */
MultiPolygon.prototype.containsXY = function(x, y) { containsXY(x, y) {
return linearRingssContainsXY(this.getOrientedFlatCoordinates(), 0, this.endss_, this.stride, x, y); return linearRingssContainsXY(this.getOrientedFlatCoordinates(), 0, this.endss_, this.stride, x, y);
}; }
/** /**
* Return the area of the multipolygon on projected plane. * Return the area of the multipolygon on projected plane.
* @return {number} Area (on projected plane). * @return {number} Area (on projected plane).
* @api * @api
*/ */
MultiPolygon.prototype.getArea = function() { getArea() {
return linearRingssArea(this.getOrientedFlatCoordinates(), 0, this.endss_, this.stride); return linearRingssArea(this.getOrientedFlatCoordinates(), 0, this.endss_, this.stride);
}; }
/** /**
* Get the coordinate array for this geometry. This array has the structure * Get the coordinate array for this geometry. This array has the structure
@@ -206,7 +197,7 @@ MultiPolygon.prototype.getArea = function() {
* @override * @override
* @api * @api
*/ */
MultiPolygon.prototype.getCoordinates = function(opt_right) { getCoordinates(opt_right) {
let flatCoordinates; let flatCoordinates;
if (opt_right !== undefined) { if (opt_right !== undefined) {
flatCoordinates = this.getOrientedFlatCoordinates().slice(); flatCoordinates = this.getOrientedFlatCoordinates().slice();
@@ -218,21 +209,19 @@ MultiPolygon.prototype.getCoordinates = function(opt_right) {
return inflateMultiCoordinatesArray( return inflateMultiCoordinatesArray(
flatCoordinates, 0, this.endss_, this.stride); flatCoordinates, 0, this.endss_, this.stride);
}; }
/** /**
* @return {Array.<Array.<number>>} Endss. * @return {Array.<Array.<number>>} Endss.
*/ */
MultiPolygon.prototype.getEndss = function() { getEndss() {
return this.endss_; return this.endss_;
}; }
/** /**
* @return {Array.<number>} Flat interior points. * @return {Array.<number>} Flat interior points.
*/ */
MultiPolygon.prototype.getFlatInteriorPoints = function() { getFlatInteriorPoints() {
if (this.flatInteriorPointsRevision_ != this.getRevision()) { if (this.flatInteriorPointsRevision_ != this.getRevision()) {
const flatCenters = linearRingssCenter( const flatCenters = linearRingssCenter(
this.flatCoordinates, 0, this.endss_, this.stride); this.flatCoordinates, 0, this.endss_, this.stride);
@@ -242,8 +231,7 @@ MultiPolygon.prototype.getFlatInteriorPoints = function() {
this.flatInteriorPointsRevision_ = this.getRevision(); this.flatInteriorPointsRevision_ = this.getRevision();
} }
return this.flatInteriorPoints_; return this.flatInteriorPoints_;
}; }
/** /**
* Return the interior points as {@link module:ol/geom/MultiPoint multipoint}. * Return the interior points as {@link module:ol/geom/MultiPoint multipoint}.
@@ -251,15 +239,14 @@ MultiPolygon.prototype.getFlatInteriorPoints = function() {
* the length of the horizontal intersection that the point belongs to. * the length of the horizontal intersection that the point belongs to.
* @api * @api
*/ */
MultiPolygon.prototype.getInteriorPoints = function() { getInteriorPoints() {
return new MultiPoint(this.getFlatInteriorPoints().slice(), GeometryLayout.XYM); return new MultiPoint(this.getFlatInteriorPoints().slice(), GeometryLayout.XYM);
}; }
/** /**
* @return {Array.<number>} Oriented flat coordinates. * @return {Array.<number>} Oriented flat coordinates.
*/ */
MultiPolygon.prototype.getOrientedFlatCoordinates = function() { getOrientedFlatCoordinates() {
if (this.orientedRevision_ != this.getRevision()) { if (this.orientedRevision_ != this.getRevision()) {
const flatCoordinates = this.flatCoordinates; const flatCoordinates = this.flatCoordinates;
if (linearRingsAreOriented( if (linearRingsAreOriented(
@@ -274,13 +261,12 @@ MultiPolygon.prototype.getOrientedFlatCoordinates = function() {
this.orientedRevision_ = this.getRevision(); this.orientedRevision_ = this.getRevision();
} }
return this.orientedFlatCoordinates_; return this.orientedFlatCoordinates_;
}; }
/** /**
* @inheritDoc * @inheritDoc
*/ */
MultiPolygon.prototype.getSimplifiedGeometryInternal = function(squaredTolerance) { getSimplifiedGeometryInternal(squaredTolerance) {
const simplifiedFlatCoordinates = []; const simplifiedFlatCoordinates = [];
const simplifiedEndss = []; const simplifiedEndss = [];
simplifiedFlatCoordinates.length = quantizeMultiArray( simplifiedFlatCoordinates.length = quantizeMultiArray(
@@ -288,8 +274,7 @@ MultiPolygon.prototype.getSimplifiedGeometryInternal = function(squaredTolerance
Math.sqrt(squaredTolerance), Math.sqrt(squaredTolerance),
simplifiedFlatCoordinates, 0, simplifiedEndss); simplifiedFlatCoordinates, 0, simplifiedEndss);
return new MultiPolygon(simplifiedFlatCoordinates, GeometryLayout.XY, simplifiedEndss); return new MultiPolygon(simplifiedFlatCoordinates, GeometryLayout.XY, simplifiedEndss);
}; }
/** /**
* Return the polygon at the specified index. * Return the polygon at the specified index.
@@ -297,7 +282,7 @@ MultiPolygon.prototype.getSimplifiedGeometryInternal = function(squaredTolerance
* @return {module:ol/geom/Polygon} Polygon. * @return {module:ol/geom/Polygon} Polygon.
* @api * @api
*/ */
MultiPolygon.prototype.getPolygon = function(index) { getPolygon(index) {
if (index < 0 || this.endss_.length <= index) { if (index < 0 || this.endss_.length <= index) {
return null; return null;
} }
@@ -316,15 +301,14 @@ MultiPolygon.prototype.getPolygon = function(index) {
} }
} }
return new Polygon(this.flatCoordinates.slice(offset, end), this.layout, ends); return new Polygon(this.flatCoordinates.slice(offset, end), this.layout, ends);
}; }
/** /**
* Return the polygons of this multipolygon. * Return the polygons of this multipolygon.
* @return {Array.<module:ol/geom/Polygon>} Polygons. * @return {Array.<module:ol/geom/Polygon>} Polygons.
* @api * @api
*/ */
MultiPolygon.prototype.getPolygons = function() { getPolygons() {
const layout = this.layout; const layout = this.layout;
const flatCoordinates = this.flatCoordinates; const flatCoordinates = this.flatCoordinates;
const endss = this.endss_; const endss = this.endss_;
@@ -343,27 +327,24 @@ MultiPolygon.prototype.getPolygons = function() {
offset = end; offset = end;
} }
return polygons; return polygons;
}; }
/** /**
* @inheritDoc * @inheritDoc
* @api * @api
*/ */
MultiPolygon.prototype.getType = function() { getType() {
return GeometryType.MULTI_POLYGON; return GeometryType.MULTI_POLYGON;
}; }
/** /**
* @inheritDoc * @inheritDoc
* @api * @api
*/ */
MultiPolygon.prototype.intersectsExtent = function(extent) { intersectsExtent(extent) {
return intersectsLinearRingMultiArray( return intersectsLinearRingMultiArray(
this.getOrientedFlatCoordinates(), 0, this.endss_, this.stride, extent); this.getOrientedFlatCoordinates(), 0, this.endss_, this.stride, extent);
}; }
/** /**
* Set the coordinates of the multipolygon. * Set the coordinates of the multipolygon.
@@ -372,7 +353,7 @@ MultiPolygon.prototype.intersectsExtent = function(extent) {
* @override * @override
* @api * @api
*/ */
MultiPolygon.prototype.setCoordinates = function(coordinates, opt_layout) { setCoordinates(coordinates, opt_layout) {
this.setLayout(opt_layout, coordinates, 3); this.setLayout(opt_layout, coordinates, 3);
if (!this.flatCoordinates) { if (!this.flatCoordinates) {
this.flatCoordinates = []; this.flatCoordinates = [];
@@ -387,7 +368,8 @@ MultiPolygon.prototype.setCoordinates = function(coordinates, opt_layout) {
0 : lastEnds[lastEnds.length - 1]; 0 : lastEnds[lastEnds.length - 1];
} }
this.changed(); this.changed();
}; }
}
export default MultiPolygon; export default MultiPolygon;
+25 -31
View File
@@ -1,7 +1,6 @@
/** /**
* @module ol/geom/Point * @module ol/geom/Point
*/ */
import {inherits} from '../util.js';
import {createOrUpdateFromCoordinate, containsXY} from '../extent.js'; import {createOrUpdateFromCoordinate, containsXY} from '../extent.js';
import GeometryType from '../geom/GeometryType.js'; import GeometryType from '../geom/GeometryType.js';
import SimpleGeometry from '../geom/SimpleGeometry.js'; import SimpleGeometry from '../geom/SimpleGeometry.js';
@@ -12,19 +11,18 @@ import {squaredDistance as squaredDx} from '../math.js';
* @classdesc * @classdesc
* Point geometry. * Point geometry.
* *
* @constructor
* @extends {module:ol/geom/SimpleGeometry}
* @param {module:ol/coordinate~Coordinate} coordinates Coordinates.
* @param {module:ol/geom/GeometryLayout=} opt_layout Layout.
* @api * @api
*/ */
const Point = function(coordinates, opt_layout) { class Point extends SimpleGeometry {
SimpleGeometry.call(this);
/**
* @param {module:ol/coordinate~Coordinate} coordinates Coordinates.
* @param {module:ol/geom/GeometryLayout=} opt_layout Layout.
*/
constructor(coordinates, opt_layout) {
super();
this.setCoordinates(coordinates, opt_layout); this.setCoordinates(coordinates, opt_layout);
}; }
inherits(Point, SimpleGeometry);
/** /**
* Make a complete copy of the geometry. * Make a complete copy of the geometry.
@@ -32,16 +30,15 @@ inherits(Point, SimpleGeometry);
* @override * @override
* @api * @api
*/ */
Point.prototype.clone = function() { clone() {
const point = new Point(this.flatCoordinates.slice(), this.layout); const point = new Point(this.flatCoordinates.slice(), this.layout);
return point; return point;
}; }
/** /**
* @inheritDoc * @inheritDoc
*/ */
Point.prototype.closestPointXY = function(x, y, closestPoint, minSquaredDistance) { closestPointXY(x, y, closestPoint, minSquaredDistance) {
const flatCoordinates = this.flatCoordinates; const flatCoordinates = this.flatCoordinates;
const squaredDistance = squaredDx(x, y, flatCoordinates[0], flatCoordinates[1]); const squaredDistance = squaredDx(x, y, flatCoordinates[0], flatCoordinates[1]);
if (squaredDistance < minSquaredDistance) { if (squaredDistance < minSquaredDistance) {
@@ -54,8 +51,7 @@ Point.prototype.closestPointXY = function(x, y, closestPoint, minSquaredDistance
} else { } else {
return minSquaredDistance; return minSquaredDistance;
} }
}; }
/** /**
* Return the coordinate of the point. * Return the coordinate of the point.
@@ -63,42 +59,38 @@ Point.prototype.closestPointXY = function(x, y, closestPoint, minSquaredDistance
* @override * @override
* @api * @api
*/ */
Point.prototype.getCoordinates = function() { getCoordinates() {
return !this.flatCoordinates ? [] : this.flatCoordinates.slice(); return !this.flatCoordinates ? [] : this.flatCoordinates.slice();
}; }
/** /**
* @inheritDoc * @inheritDoc
*/ */
Point.prototype.computeExtent = function(extent) { computeExtent(extent) {
return createOrUpdateFromCoordinate(this.flatCoordinates, extent); return createOrUpdateFromCoordinate(this.flatCoordinates, extent);
}; }
/** /**
* @inheritDoc * @inheritDoc
* @api * @api
*/ */
Point.prototype.getType = function() { getType() {
return GeometryType.POINT; return GeometryType.POINT;
}; }
/** /**
* @inheritDoc * @inheritDoc
* @api * @api
*/ */
Point.prototype.intersectsExtent = function(extent) { intersectsExtent(extent) {
return containsXY(extent, this.flatCoordinates[0], this.flatCoordinates[1]); return containsXY(extent, this.flatCoordinates[0], this.flatCoordinates[1]);
}; }
/** /**
* @inheritDoc * @inheritDoc
* @api * @api
*/ */
Point.prototype.setCoordinates = function(coordinates, opt_layout) { setCoordinates(coordinates, opt_layout) {
this.setLayout(opt_layout, coordinates, 0); this.setLayout(opt_layout, coordinates, 0);
if (!this.flatCoordinates) { if (!this.flatCoordinates) {
this.flatCoordinates = []; this.flatCoordinates = [];
@@ -106,6 +98,8 @@ Point.prototype.setCoordinates = function(coordinates, opt_layout) {
this.flatCoordinates.length = deflateCoordinate( this.flatCoordinates.length = deflateCoordinate(
this.flatCoordinates, 0, coordinates, this.stride); this.flatCoordinates, 0, coordinates, this.stride);
this.changed(); this.changed();
}; }
}
export default Point; export default Point;
+45 -62
View File
@@ -1,7 +1,6 @@
/** /**
* @module ol/geom/Polygon * @module ol/geom/Polygon
*/ */
import {inherits} from '../util.js';
import {extend} from '../array.js'; import {extend} from '../array.js';
import {closestSquaredDistanceXY, getCenter} from '../extent.js'; import {closestSquaredDistanceXY, getCenter} from '../extent.js';
import GeometryLayout from '../geom/GeometryLayout.js'; import GeometryLayout from '../geom/GeometryLayout.js';
@@ -25,8 +24,11 @@ import {modulo} from '../math.js';
* @classdesc * @classdesc
* Polygon geometry. * Polygon geometry.
* *
* @constructor * @api
* @extends {module:ol/geom/SimpleGeometry} */
class Polygon extends SimpleGeometry {
/**
* @param {!Array.<Array.<module:ol/coordinate~Coordinate>>|!Array.<number>} coordinates * @param {!Array.<Array.<module:ol/coordinate~Coordinate>>|!Array.<number>} coordinates
* Array of linear rings that define the polygon. The first linear ring of the * Array of linear rings that define the polygon. The first linear ring of the
* array defines the outer-boundary or surface of the polygon. Each subsequent * array defines the outer-boundary or surface of the polygon. Each subsequent
@@ -35,13 +37,11 @@ import {modulo} from '../math.js';
* equivalent. (For internal use, flat coordinates in combination with * equivalent. (For internal use, flat coordinates in combination with
* `opt_layout` and `opt_ends` are also accepted.) * `opt_layout` and `opt_ends` are also accepted.)
* @param {module:ol/geom/GeometryLayout=} opt_layout Layout. * @param {module:ol/geom/GeometryLayout=} opt_layout Layout.
* @param {Array.<number>=} opt_ends Ends (for internal use with flat * @param {Array.<number>=} opt_ends Ends (for internal use with flat coordinates).
* coordinates).
* @api
*/ */
const Polygon = function(coordinates, opt_layout, opt_ends) { constructor(coordinates, opt_layout, opt_ends) {
SimpleGeometry.call(this); super();
/** /**
* @type {Array.<number>} * @type {Array.<number>}
@@ -92,17 +92,14 @@ const Polygon = function(coordinates, opt_layout, opt_ends) {
this.setCoordinates(coordinates, opt_layout); this.setCoordinates(coordinates, opt_layout);
} }
}; }
inherits(Polygon, SimpleGeometry);
/** /**
* Append the passed linear ring to this polygon. * Append the passed linear ring to this polygon.
* @param {module:ol/geom/LinearRing} linearRing Linear ring. * @param {module:ol/geom/LinearRing} linearRing Linear ring.
* @api * @api
*/ */
Polygon.prototype.appendLinearRing = function(linearRing) { appendLinearRing(linearRing) {
if (!this.flatCoordinates) { if (!this.flatCoordinates) {
this.flatCoordinates = linearRing.getFlatCoordinates().slice(); this.flatCoordinates = linearRing.getFlatCoordinates().slice();
} else { } else {
@@ -110,8 +107,7 @@ Polygon.prototype.appendLinearRing = function(linearRing) {
} }
this.ends_.push(this.flatCoordinates.length); this.ends_.push(this.flatCoordinates.length);
this.changed(); this.changed();
}; }
/** /**
* Make a complete copy of the geometry. * Make a complete copy of the geometry.
@@ -119,15 +115,14 @@ Polygon.prototype.appendLinearRing = function(linearRing) {
* @override * @override
* @api * @api
*/ */
Polygon.prototype.clone = function() { clone() {
return new Polygon(this.flatCoordinates.slice(), this.layout, this.ends_.slice()); return new Polygon(this.flatCoordinates.slice(), this.layout, this.ends_.slice());
}; }
/** /**
* @inheritDoc * @inheritDoc
*/ */
Polygon.prototype.closestPointXY = function(x, y, closestPoint, minSquaredDistance) { closestPointXY(x, y, closestPoint, minSquaredDistance) {
if (minSquaredDistance < closestSquaredDistanceXY(this.getExtent(), x, y)) { if (minSquaredDistance < closestSquaredDistanceXY(this.getExtent(), x, y)) {
return minSquaredDistance; return minSquaredDistance;
} }
@@ -139,26 +134,23 @@ Polygon.prototype.closestPointXY = function(x, y, closestPoint, minSquaredDistan
return assignClosestArrayPoint( return assignClosestArrayPoint(
this.flatCoordinates, 0, this.ends_, this.stride, this.flatCoordinates, 0, this.ends_, this.stride,
this.maxDelta_, true, x, y, closestPoint, minSquaredDistance); this.maxDelta_, true, x, y, closestPoint, minSquaredDistance);
}; }
/** /**
* @inheritDoc * @inheritDoc
*/ */
Polygon.prototype.containsXY = function(x, y) { containsXY(x, y) {
return linearRingsContainsXY(this.getOrientedFlatCoordinates(), 0, this.ends_, this.stride, x, y); return linearRingsContainsXY(this.getOrientedFlatCoordinates(), 0, this.ends_, this.stride, x, y);
}; }
/** /**
* Return the area of the polygon on projected plane. * Return the area of the polygon on projected plane.
* @return {number} Area (on projected plane). * @return {number} Area (on projected plane).
* @api * @api
*/ */
Polygon.prototype.getArea = function() { getArea() {
return linearRingsArea(this.getOrientedFlatCoordinates(), 0, this.ends_, this.stride); return linearRingsArea(this.getOrientedFlatCoordinates(), 0, this.ends_, this.stride);
}; }
/** /**
* Get the coordinate array for this geometry. This array has the structure * Get the coordinate array for this geometry. This array has the structure
@@ -174,7 +166,7 @@ Polygon.prototype.getArea = function() {
* @override * @override
* @api * @api
*/ */
Polygon.prototype.getCoordinates = function(opt_right) { getCoordinates(opt_right) {
let flatCoordinates; let flatCoordinates;
if (opt_right !== undefined) { if (opt_right !== undefined) {
flatCoordinates = this.getOrientedFlatCoordinates().slice(); flatCoordinates = this.getOrientedFlatCoordinates().slice();
@@ -186,21 +178,19 @@ Polygon.prototype.getCoordinates = function(opt_right) {
return inflateCoordinatesArray( return inflateCoordinatesArray(
flatCoordinates, 0, this.ends_, this.stride); flatCoordinates, 0, this.ends_, this.stride);
}; }
/** /**
* @return {Array.<number>} Ends. * @return {Array.<number>} Ends.
*/ */
Polygon.prototype.getEnds = function() { getEnds() {
return this.ends_; return this.ends_;
}; }
/** /**
* @return {Array.<number>} Interior point. * @return {Array.<number>} Interior point.
*/ */
Polygon.prototype.getFlatInteriorPoint = function() { getFlatInteriorPoint() {
if (this.flatInteriorPointRevision_ != this.getRevision()) { if (this.flatInteriorPointRevision_ != this.getRevision()) {
const flatCenter = getCenter(this.getExtent()); const flatCenter = getCenter(this.getExtent());
this.flatInteriorPoint_ = getInteriorPointOfArray( this.flatInteriorPoint_ = getInteriorPointOfArray(
@@ -209,8 +199,7 @@ Polygon.prototype.getFlatInteriorPoint = function() {
this.flatInteriorPointRevision_ = this.getRevision(); this.flatInteriorPointRevision_ = this.getRevision();
} }
return this.flatInteriorPoint_; return this.flatInteriorPoint_;
}; }
/** /**
* Return an interior point of the polygon. * Return an interior point of the polygon.
@@ -218,10 +207,9 @@ Polygon.prototype.getFlatInteriorPoint = function() {
* length of the horizontal intersection that the point belongs to. * length of the horizontal intersection that the point belongs to.
* @api * @api
*/ */
Polygon.prototype.getInteriorPoint = function() { getInteriorPoint() {
return new Point(this.getFlatInteriorPoint(), GeometryLayout.XYM); return new Point(this.getFlatInteriorPoint(), GeometryLayout.XYM);
}; }
/** /**
* Return the number of rings of the polygon, this includes the exterior * Return the number of rings of the polygon, this includes the exterior
@@ -230,10 +218,9 @@ Polygon.prototype.getInteriorPoint = function() {
* @return {number} Number of rings. * @return {number} Number of rings.
* @api * @api
*/ */
Polygon.prototype.getLinearRingCount = function() { getLinearRingCount() {
return this.ends_.length; return this.ends_.length;
}; }
/** /**
* Return the Nth linear ring of the polygon geometry. Return `null` if the * Return the Nth linear ring of the polygon geometry. Return `null` if the
@@ -245,21 +232,20 @@ Polygon.prototype.getLinearRingCount = function() {
* @return {module:ol/geom/LinearRing} Linear ring. * @return {module:ol/geom/LinearRing} Linear ring.
* @api * @api
*/ */
Polygon.prototype.getLinearRing = function(index) { getLinearRing(index) {
if (index < 0 || this.ends_.length <= index) { if (index < 0 || this.ends_.length <= index) {
return null; return null;
} }
return new LinearRing(this.flatCoordinates.slice( return new LinearRing(this.flatCoordinates.slice(
index === 0 ? 0 : this.ends_[index - 1], this.ends_[index]), this.layout); index === 0 ? 0 : this.ends_[index - 1], this.ends_[index]), this.layout);
}; }
/** /**
* Return the linear rings of the polygon. * Return the linear rings of the polygon.
* @return {Array.<module:ol/geom/LinearRing>} Linear rings. * @return {Array.<module:ol/geom/LinearRing>} Linear rings.
* @api * @api
*/ */
Polygon.prototype.getLinearRings = function() { getLinearRings() {
const layout = this.layout; const layout = this.layout;
const flatCoordinates = this.flatCoordinates; const flatCoordinates = this.flatCoordinates;
const ends = this.ends_; const ends = this.ends_;
@@ -272,13 +258,12 @@ Polygon.prototype.getLinearRings = function() {
offset = end; offset = end;
} }
return linearRings; return linearRings;
}; }
/** /**
* @return {Array.<number>} Oriented flat coordinates. * @return {Array.<number>} Oriented flat coordinates.
*/ */
Polygon.prototype.getOrientedFlatCoordinates = function() { getOrientedFlatCoordinates() {
if (this.orientedRevision_ != this.getRevision()) { if (this.orientedRevision_ != this.getRevision()) {
const flatCoordinates = this.flatCoordinates; const flatCoordinates = this.flatCoordinates;
if (linearRingIsOriented( if (linearRingIsOriented(
@@ -293,13 +278,12 @@ Polygon.prototype.getOrientedFlatCoordinates = function() {
this.orientedRevision_ = this.getRevision(); this.orientedRevision_ = this.getRevision();
} }
return this.orientedFlatCoordinates_; return this.orientedFlatCoordinates_;
}; }
/** /**
* @inheritDoc * @inheritDoc
*/ */
Polygon.prototype.getSimplifiedGeometryInternal = function(squaredTolerance) { getSimplifiedGeometryInternal(squaredTolerance) {
const simplifiedFlatCoordinates = []; const simplifiedFlatCoordinates = [];
const simplifiedEnds = []; const simplifiedEnds = [];
simplifiedFlatCoordinates.length = quantizeArray( simplifiedFlatCoordinates.length = quantizeArray(
@@ -307,27 +291,24 @@ Polygon.prototype.getSimplifiedGeometryInternal = function(squaredTolerance) {
Math.sqrt(squaredTolerance), Math.sqrt(squaredTolerance),
simplifiedFlatCoordinates, 0, simplifiedEnds); simplifiedFlatCoordinates, 0, simplifiedEnds);
return new Polygon(simplifiedFlatCoordinates, GeometryLayout.XY, simplifiedEnds); return new Polygon(simplifiedFlatCoordinates, GeometryLayout.XY, simplifiedEnds);
}; }
/** /**
* @inheritDoc * @inheritDoc
* @api * @api
*/ */
Polygon.prototype.getType = function() { getType() {
return GeometryType.POLYGON; return GeometryType.POLYGON;
}; }
/** /**
* @inheritDoc * @inheritDoc
* @api * @api
*/ */
Polygon.prototype.intersectsExtent = function(extent) { intersectsExtent(extent) {
return intersectsLinearRingArray( return intersectsLinearRingArray(
this.getOrientedFlatCoordinates(), 0, this.ends_, this.stride, extent); this.getOrientedFlatCoordinates(), 0, this.ends_, this.stride, extent);
}; }
/** /**
* Set the coordinates of the polygon. * Set the coordinates of the polygon.
@@ -336,7 +317,7 @@ Polygon.prototype.intersectsExtent = function(extent) {
* @override * @override
* @api * @api
*/ */
Polygon.prototype.setCoordinates = function(coordinates, opt_layout) { setCoordinates(coordinates, opt_layout) {
this.setLayout(opt_layout, coordinates, 2); this.setLayout(opt_layout, coordinates, 2);
if (!this.flatCoordinates) { if (!this.flatCoordinates) {
this.flatCoordinates = []; this.flatCoordinates = [];
@@ -345,7 +326,9 @@ Polygon.prototype.setCoordinates = function(coordinates, opt_layout) {
this.flatCoordinates, 0, coordinates, this.stride, this.ends_); this.flatCoordinates, 0, coordinates, this.stride, this.ends_);
this.flatCoordinates.length = ends.length === 0 ? 0 : ends[ends.length - 1]; this.flatCoordinates.length = ends.length === 0 ? 0 : ends[ends.length - 1];
this.changed(); this.changed();
}; }
}
export default Polygon; export default Polygon;
+216 -235
View File
@@ -1,7 +1,6 @@
/** /**
* @module ol/geom/SimpleGeometry * @module ol/geom/SimpleGeometry
*/ */
import {inherits} from '../util.js';
import {FALSE} from '../functions.js'; import {FALSE} from '../functions.js';
import {createOrUpdateFromFlatCoordinates, getCenter} from '../extent.js'; import {createOrUpdateFromFlatCoordinates, getCenter} from '../extent.js';
import Geometry from '../geom/Geometry.js'; import Geometry from '../geom/Geometry.js';
@@ -14,14 +13,13 @@ import {clear} from '../obj.js';
* Abstract base class; only used for creating subclasses; do not instantiate * Abstract base class; only used for creating subclasses; do not instantiate
* in apps, as cannot be rendered. * in apps, as cannot be rendered.
* *
* @constructor
* @abstract * @abstract
* @extends {module:ol/geom/Geometry}
* @api * @api
*/ */
const SimpleGeometry = function() { class SimpleGeometry extends Geometry {
constructor() {
Geometry.call(this); super();
/** /**
* @protected * @protected
@@ -41,9 +39,220 @@ const SimpleGeometry = function() {
*/ */
this.flatCoordinates = null; this.flatCoordinates = null;
}; }
inherits(SimpleGeometry, Geometry); /**
* @inheritDoc
*/
computeExtent(extent) {
return createOrUpdateFromFlatCoordinates(this.flatCoordinates,
0, this.flatCoordinates.length, this.stride, extent);
}
/**
* @abstract
* @return {Array} Coordinates.
*/
getCoordinates() {}
/**
* Return the first coordinate of the geometry.
* @return {module:ol/coordinate~Coordinate} First coordinate.
* @api
*/
getFirstCoordinate() {
return this.flatCoordinates.slice(0, this.stride);
}
/**
* @return {Array.<number>} Flat coordinates.
*/
getFlatCoordinates() {
return this.flatCoordinates;
}
/**
* Return the last coordinate of the geometry.
* @return {module:ol/coordinate~Coordinate} Last point.
* @api
*/
getLastCoordinate() {
return this.flatCoordinates.slice(this.flatCoordinates.length - this.stride);
}
/**
* Return the {@link module:ol/geom/GeometryLayout~GeometryLayout layout} of the geometry.
* @return {module:ol/geom/GeometryLayout} Layout.
* @api
*/
getLayout() {
return this.layout;
}
/**
* @inheritDoc
*/
getSimplifiedGeometry(squaredTolerance) {
if (this.simplifiedGeometryRevision != this.getRevision()) {
clear(this.simplifiedGeometryCache);
this.simplifiedGeometryMaxMinSquaredTolerance = 0;
this.simplifiedGeometryRevision = this.getRevision();
}
// If squaredTolerance is negative or if we know that simplification will not
// have any effect then just return this.
if (squaredTolerance < 0 ||
(this.simplifiedGeometryMaxMinSquaredTolerance !== 0 &&
squaredTolerance <= this.simplifiedGeometryMaxMinSquaredTolerance)) {
return this;
}
const key = squaredTolerance.toString();
if (this.simplifiedGeometryCache.hasOwnProperty(key)) {
return this.simplifiedGeometryCache[key];
} else {
const simplifiedGeometry =
this.getSimplifiedGeometryInternal(squaredTolerance);
const simplifiedFlatCoordinates = simplifiedGeometry.getFlatCoordinates();
if (simplifiedFlatCoordinates.length < this.flatCoordinates.length) {
this.simplifiedGeometryCache[key] = simplifiedGeometry;
return simplifiedGeometry;
} else {
// Simplification did not actually remove any coordinates. We now know
// that any calls to getSimplifiedGeometry with a squaredTolerance less
// than or equal to the current squaredTolerance will also not have any
// effect. This allows us to short circuit simplification (saving CPU
// cycles) and prevents the cache of simplified geometries from filling
// up with useless identical copies of this geometry (saving memory).
this.simplifiedGeometryMaxMinSquaredTolerance = squaredTolerance;
return this;
}
}
}
/**
* @param {number} squaredTolerance Squared tolerance.
* @return {module:ol/geom/SimpleGeometry} Simplified geometry.
* @protected
*/
getSimplifiedGeometryInternal(squaredTolerance) {
return this;
}
/**
* @return {number} Stride.
*/
getStride() {
return this.stride;
}
/**
* @param {module:ol/geom/GeometryLayout} layout Layout.
* @param {Array.<number>} flatCoordinates Flat coordinates.
*/
setFlatCoordinates(layout, flatCoordinates) {
this.stride = getStrideForLayout(layout);
this.layout = layout;
this.flatCoordinates = flatCoordinates;
}
/**
* @abstract
* @param {!Array} coordinates Coordinates.
* @param {module:ol/geom/GeometryLayout=} opt_layout Layout.
*/
setCoordinates(coordinates, opt_layout) {}
/**
* @param {module:ol/geom/GeometryLayout|undefined} layout Layout.
* @param {Array} coordinates Coordinates.
* @param {number} nesting Nesting.
* @protected
*/
setLayout(layout, coordinates, nesting) {
/** @type {number} */
let stride;
if (layout) {
stride = getStrideForLayout(layout);
} else {
for (let i = 0; i < nesting; ++i) {
if (coordinates.length === 0) {
this.layout = GeometryLayout.XY;
this.stride = 2;
return;
} else {
coordinates = /** @type {Array} */ (coordinates[0]);
}
}
stride = coordinates.length;
layout = getLayoutForStride(stride);
}
this.layout = layout;
this.stride = stride;
}
/**
* @inheritDoc
* @api
*/
applyTransform(transformFn) {
if (this.flatCoordinates) {
transformFn(this.flatCoordinates, this.flatCoordinates, this.stride);
this.changed();
}
}
/**
* @inheritDoc
* @api
*/
rotate(angle, anchor) {
const flatCoordinates = this.getFlatCoordinates();
if (flatCoordinates) {
const stride = this.getStride();
rotate(
flatCoordinates, 0, flatCoordinates.length,
stride, angle, anchor, flatCoordinates);
this.changed();
}
}
/**
* @inheritDoc
* @api
*/
scale(sx, opt_sy, opt_anchor) {
let sy = opt_sy;
if (sy === undefined) {
sy = sx;
}
let anchor = opt_anchor;
if (!anchor) {
anchor = getCenter(this.getExtent());
}
const flatCoordinates = this.getFlatCoordinates();
if (flatCoordinates) {
const stride = this.getStride();
scale(
flatCoordinates, 0, flatCoordinates.length,
stride, sx, sy, anchor, flatCoordinates);
this.changed();
}
}
/**
* @inheritDoc
* @api
*/
translate(deltaX, deltaY) {
const flatCoordinates = this.getFlatCoordinates();
if (flatCoordinates) {
const stride = this.getStride();
translate(
flatCoordinates, 0, flatCoordinates.length, stride,
deltaX, deltaY, flatCoordinates);
this.changed();
}
}
}
/** /**
@@ -88,234 +297,6 @@ export function getStrideForLayout(layout) {
SimpleGeometry.prototype.containsXY = FALSE; SimpleGeometry.prototype.containsXY = FALSE;
/**
* @inheritDoc
*/
SimpleGeometry.prototype.computeExtent = function(extent) {
return createOrUpdateFromFlatCoordinates(this.flatCoordinates,
0, this.flatCoordinates.length, this.stride, extent);
};
/**
* @abstract
* @return {Array} Coordinates.
*/
SimpleGeometry.prototype.getCoordinates = function() {};
/**
* Return the first coordinate of the geometry.
* @return {module:ol/coordinate~Coordinate} First coordinate.
* @api
*/
SimpleGeometry.prototype.getFirstCoordinate = function() {
return this.flatCoordinates.slice(0, this.stride);
};
/**
* @return {Array.<number>} Flat coordinates.
*/
SimpleGeometry.prototype.getFlatCoordinates = function() {
return this.flatCoordinates;
};
/**
* Return the last coordinate of the geometry.
* @return {module:ol/coordinate~Coordinate} Last point.
* @api
*/
SimpleGeometry.prototype.getLastCoordinate = function() {
return this.flatCoordinates.slice(this.flatCoordinates.length - this.stride);
};
/**
* Return the {@link module:ol/geom/GeometryLayout~GeometryLayout layout} of the geometry.
* @return {module:ol/geom/GeometryLayout} Layout.
* @api
*/
SimpleGeometry.prototype.getLayout = function() {
return this.layout;
};
/**
* @inheritDoc
*/
SimpleGeometry.prototype.getSimplifiedGeometry = function(squaredTolerance) {
if (this.simplifiedGeometryRevision != this.getRevision()) {
clear(this.simplifiedGeometryCache);
this.simplifiedGeometryMaxMinSquaredTolerance = 0;
this.simplifiedGeometryRevision = this.getRevision();
}
// If squaredTolerance is negative or if we know that simplification will not
// have any effect then just return this.
if (squaredTolerance < 0 ||
(this.simplifiedGeometryMaxMinSquaredTolerance !== 0 &&
squaredTolerance <= this.simplifiedGeometryMaxMinSquaredTolerance)) {
return this;
}
const key = squaredTolerance.toString();
if (this.simplifiedGeometryCache.hasOwnProperty(key)) {
return this.simplifiedGeometryCache[key];
} else {
const simplifiedGeometry =
this.getSimplifiedGeometryInternal(squaredTolerance);
const simplifiedFlatCoordinates = simplifiedGeometry.getFlatCoordinates();
if (simplifiedFlatCoordinates.length < this.flatCoordinates.length) {
this.simplifiedGeometryCache[key] = simplifiedGeometry;
return simplifiedGeometry;
} else {
// Simplification did not actually remove any coordinates. We now know
// that any calls to getSimplifiedGeometry with a squaredTolerance less
// than or equal to the current squaredTolerance will also not have any
// effect. This allows us to short circuit simplification (saving CPU
// cycles) and prevents the cache of simplified geometries from filling
// up with useless identical copies of this geometry (saving memory).
this.simplifiedGeometryMaxMinSquaredTolerance = squaredTolerance;
return this;
}
}
};
/**
* @param {number} squaredTolerance Squared tolerance.
* @return {module:ol/geom/SimpleGeometry} Simplified geometry.
* @protected
*/
SimpleGeometry.prototype.getSimplifiedGeometryInternal = function(squaredTolerance) {
return this;
};
/**
* @return {number} Stride.
*/
SimpleGeometry.prototype.getStride = function() {
return this.stride;
};
/**
* @param {module:ol/geom/GeometryLayout} layout Layout.
* @param {Array.<number>} flatCoordinates Flat coordinates.
*/
SimpleGeometry.prototype.setFlatCoordinates = function(layout, flatCoordinates) {
this.stride = getStrideForLayout(layout);
this.layout = layout;
this.flatCoordinates = flatCoordinates;
};
/**
* @abstract
* @param {!Array} coordinates Coordinates.
* @param {module:ol/geom/GeometryLayout=} opt_layout Layout.
*/
SimpleGeometry.prototype.setCoordinates = function(coordinates, opt_layout) {};
/**
* @param {module:ol/geom/GeometryLayout|undefined} layout Layout.
* @param {Array} coordinates Coordinates.
* @param {number} nesting Nesting.
* @protected
*/
SimpleGeometry.prototype.setLayout = function(layout, coordinates, nesting) {
/** @type {number} */
let stride;
if (layout) {
stride = getStrideForLayout(layout);
} else {
for (let i = 0; i < nesting; ++i) {
if (coordinates.length === 0) {
this.layout = GeometryLayout.XY;
this.stride = 2;
return;
} else {
coordinates = /** @type {Array} */ (coordinates[0]);
}
}
stride = coordinates.length;
layout = getLayoutForStride(stride);
}
this.layout = layout;
this.stride = stride;
};
/**
* @inheritDoc
* @api
*/
SimpleGeometry.prototype.applyTransform = function(transformFn) {
if (this.flatCoordinates) {
transformFn(this.flatCoordinates, this.flatCoordinates, this.stride);
this.changed();
}
};
/**
* @inheritDoc
* @api
*/
SimpleGeometry.prototype.rotate = function(angle, anchor) {
const flatCoordinates = this.getFlatCoordinates();
if (flatCoordinates) {
const stride = this.getStride();
rotate(
flatCoordinates, 0, flatCoordinates.length,
stride, angle, anchor, flatCoordinates);
this.changed();
}
};
/**
* @inheritDoc
* @api
*/
SimpleGeometry.prototype.scale = function(sx, opt_sy, opt_anchor) {
let sy = opt_sy;
if (sy === undefined) {
sy = sx;
}
let anchor = opt_anchor;
if (!anchor) {
anchor = getCenter(this.getExtent());
}
const flatCoordinates = this.getFlatCoordinates();
if (flatCoordinates) {
const stride = this.getStride();
scale(
flatCoordinates, 0, flatCoordinates.length,
stride, sx, sy, anchor, flatCoordinates);
this.changed();
}
};
/**
* @inheritDoc
* @api
*/
SimpleGeometry.prototype.translate = function(deltaX, deltaY) {
const flatCoordinates = this.getFlatCoordinates();
if (flatCoordinates) {
const stride = this.getStride();
translate(
flatCoordinates, 0, flatCoordinates.length, stride,
deltaX, deltaY, flatCoordinates);
this.changed();
}
};
/** /**
* @param {module:ol/geom/SimpleGeometry} simpleGeometry Simple geometry. * @param {module:ol/geom/SimpleGeometry} simpleGeometry Simple geometry.
* @param {module:ol/transform~Transform} transform Transform. * @param {module:ol/transform~Transform} transform Transform.

Some files were not shown because too many files have changed in this diff Show More