Clean up directory structure

This commit is contained in:
Tom Payne
2012-07-22 01:37:58 +02:00
parent 3eefbaa337
commit 65b7504c9f
38 changed files with 0 additions and 0 deletions
+221
View File
@@ -0,0 +1,221 @@
/**
* @fileoverview An implementation of Google Maps' MVCArray.
* @see https://developers.google.com/maps/documentation/javascript/reference
*/
goog.provide('ol.Array');
goog.provide('ol.ArrayEvent');
goog.provide('ol.ArrayEventType');
goog.require('goog.array');
goog.require('goog.asserts');
goog.require('goog.events.Event');
goog.require('ol.Object');
/**
* @enum {string}
*/
ol.ArrayEventType = {
INSERT_AT: 'insert_at',
REMOVE_AT: 'remove_at',
SET_AT: 'set_at'
};
/**
* @constructor
* @extends {goog.events.Event}
* @param {ol.ArrayEventType} type Type.
* @param {number} index Index.
* @param {*=} opt_prev Value.
* @param {Object=} opt_target Target.
*/
ol.ArrayEvent = function(type, index, opt_prev, opt_target) {
goog.base(this, type, opt_target);
/**
* @type {number}
*/
this.index = index;
/**
* @type {*}
*/
this.prev = opt_prev;
};
goog.inherits(ol.ArrayEvent, goog.events.Event);
/**
* @enum {string}
*/
ol.ArrayProperty = {
LENGTH: 'length'
};
/**
* @constructor
* @extends {ol.Object}
* @param {Array=} opt_array Array.
*/
ol.Array = function(opt_array) {
goog.base(this);
/**
* @private
* @type {Array}
*/
this.array_ = goog.isDefAndNotNull(opt_array) ? opt_array : [];
this.updateLength_();
};
goog.inherits(ol.Array, ol.Object);
/**
* @param {ol.Array|Array} arg Argument.
* @return {ol.Array} Array.
*/
ol.Array.create = function(arg) {
if (arg instanceof ol.Array) {
return arg;
} else {
return new ol.Array(arg);
}
};
/**
*/
ol.Array.prototype.clear = function() {
while (this[ol.ArrayProperty.LENGTH]) {
this.pop();
}
};
/**
* @param {function(this: T, *, number)} f Function.
* @param {T=} opt_obj The object to be used for the value of 'this' within f.
* @template T
*/
ol.Array.prototype.forEach = function(f, opt_obj) {
goog.array.forEach(this.array_, f, opt_obj);
};
/**
* @return {Array} Array.
*/
ol.Array.prototype.getArray = function() {
return this.array_;
};
/**
* @param {number} index Index.
* @return {*} Element.
*/
ol.Array.prototype.getAt = function(index) {
return this.array_[index];
};
/**
* @return {number} Length.
*/
ol.Array.prototype.getLength = function() {
return /** @type {number} */ (this.get(ol.ArrayProperty.LENGTH));
};
/**
* @param {number} index Index.
* @param {*} elem Element.
*/
ol.Array.prototype.insertAt = function(index, elem) {
goog.array.insertAt(this.array_, elem, index);
this.updateLength_();
this.dispatchEvent(new ol.ArrayEvent(
ol.ArrayEventType.INSERT_AT, index, undefined, this));
if (this[ol.ArrayEventType.INSERT_AT]) {
this[ol.ArrayEventType.INSERT_AT](index);
}
};
/**
* @return {*} Element.
*/
ol.Array.prototype.pop = function() {
return this.removeAt(this.getLength() - 1);
};
/**
* @param {*} elem Element.
* @return {number} Length.
*/
ol.Array.prototype.push = function(elem) {
var n = this.array_.length;
this.insertAt(n, elem);
return n;
};
/**
* @param {number} index Index.
* @return {*} Value.
*/
ol.Array.prototype.removeAt = function(index) {
var prev = this.array_[index];
goog.array.removeAt(this.array_, index);
this.updateLength_();
this.dispatchEvent(new ol.ArrayEvent(ol.ArrayEventType.REMOVE_AT,
index, prev, this));
if (this[ol.ArrayEventType.REMOVE_AT]) {
this[ol.ArrayEventType.REMOVE_AT](index);
}
return prev;
};
/**
* @param {number} index Index.
* @param {*} elem Element.
*/
ol.Array.prototype.setAt = function(index, elem) {
var n = this[ol.ArrayProperty.LENGTH];
if (index < n) {
var prev = this.array_[index];
this.array_[index] = elem;
this.dispatchEvent(new ol.ArrayEvent(ol.ArrayEventType.SET_AT,
index, prev, this));
if (this[ol.ArrayEventType.SET_AT]) {
this[ol.ArrayEventType.SET_AT](index, prev);
}
} else {
var j;
for (j = n; j < index; ++j) {
this.insertAt(j, undefined);
}
this.insertAt(index, elem);
}
};
/**
* @private
*/
ol.Array.prototype.updateLength_ = function() {
this.set('length', this.array_.length);
};
+215
View File
@@ -0,0 +1,215 @@
goog.require('goog.array');
goog.require('goog.testing.jsunit');
goog.require('ol.Array');
goog.require('ol.ArrayEventType');
function testEmpty() {
var a = new ol.Array();
assertEquals(0, a.getLength());
assertTrue(goog.array.equals(a.getArray(), []));
assertUndefined(a.getAt(0));
}
function testConstruct() {
var array = [0, 1, 2];
var a = new ol.Array(array);
assertEquals(0, a.getAt(0));
assertEquals(1, a.getAt(1));
assertEquals(2, a.getAt(2));
}
function testPush() {
var a = new ol.Array();
a.push(1);
assertEquals(1, a.getLength());
assertTrue(goog.array.equals(a.getArray(), [1]));
assertEquals(1, a.getAt(0));
}
function testPushPop() {
var a = new ol.Array();
a.push(1);
a.pop();
assertEquals(0, a.getLength());
assertTrue(goog.array.equals(a.getArray(), []));
assertUndefined(a.getAt(0));
}
function testInsertAt() {
var a = new ol.Array([0, 2]);
a.insertAt(1, 1);
assertEquals(0, a.getAt(0));
assertEquals(1, a.getAt(1));
assertEquals(2, a.getAt(2));
}
function testSetAt() {
var a = new ol.Array();
a.setAt(1, 1);
assertEquals(2, a.getLength());
assertUndefined(a.getAt(0));
assertEquals(1, a.getAt(1));
}
function testRemoveAt() {
var a = new ol.Array([0, 1, 2]);
a.removeAt(1);
assertEquals(0, a.getAt(0));
assertEquals(2, a.getAt(1));
}
function testForEachEmpty() {
var a = new ol.Array();
var forEachCalled = false;
a.forEach(function() {
forEachCalled = true;
});
assertFalse(forEachCalled);
}
function testForEachPopulated() {
var a = new ol.Array();
a.push(1);
a.push(2);
var forEachCount = 0;
a.forEach(function() {
++forEachCount;
});
assertEquals(2, forEachCount);
}
function testSetAtEvent() {
var a = new ol.Array(['a', 'b']);
var index, prev;
goog.events.listen(a, ol.ArrayEventType.SET_AT, function(e) {
index = e.index;
prev = e.prev;
});
a.setAt(1, 1);
assertEquals(1, index);
assertEquals('b', prev);
}
function testRemoveAtEvent() {
var a = new ol.Array(['a']);
var index, prev;
goog.events.listen(a, ol.ArrayEventType.REMOVE_AT, function(e) {
index = e.index;
prev = e.prev;
});
a.pop();
assertEquals(0, index);
assertEquals('a', prev);
}
function testInsertAtEvent() {
var a = new ol.Array([0, 2]);
var index;
goog.events.listen(a, ol.ArrayEventType.INSERT_AT, function(e) {
index = e.index;
});
a.insertAt(1, 1);
assertEquals(1, index);
}
function testSetAtBeyondEnd() {
var a = new ol.Array();
var inserts = [];
a.insert_at = function(index) {
inserts.push(index);
};
a.setAt(2, 0);
assertEquals(3, a.getLength());
assertUndefined(a.getAt(0));
assertUndefined(a.getAt(1));
assertEquals(0, a.getAt(2));
assertEquals(3, inserts.length);
assertEquals(0, inserts[0]);
assertEquals(1, inserts[1]);
assertEquals(2, inserts[2]);
}
function testCreateFromArray() {
var a = [0, 1, 2];
var array = ol.Array.create(a);
assertTrue(array instanceof ol.Array);
assertEquals(3, array.getLength());
assertEquals(0, array.getAt(0));
assertEquals(1, array.getAt(1));
assertEquals(2, array.getAt(2));
}
function testCreateFromArray() {
var array1 = new ol.Array();
var array2 = ol.Array.create(array1);
assertTrue(array1 === array2);
}
function testLengthChangeInsertAt() {
var array = ol.Array.create([0, 1, 2]);
var lengthChangedCalled;
array.length_changed = function() {
lengthChangedCalled = true;
};
array.insertAt(2, 3);
assertTrue(lengthChangedCalled);
}
function testLengthChangeRemoveAt() {
var array = ol.Array.create([0, 1, 2]);
var lengthChangedCalled;
array.length_changed = function() {
lengthChangedCalled = true;
};
array.removeAt(0);
assertTrue(lengthChangedCalled);
}
function testLengthChangeSetAt() {
var array = ol.Array.create([0, 1, 2]);
var lengthChangedCalled;
array.length_changed = function() {
lengthChangedCalled = true;
};
array.setAt(1, 1);
assertUndefined(lengthChangedCalled);
}
function testForEach() {
var array = ol.Array.create([1, 2, 4]);
var sum = 0;
array.forEach(function(elem) {
sum += elem;
});
assertEquals(7, sum);
}
function testForEachScope() {
var array = ol.Array.create([0]);
var that;
var uniqueObj = {};
array.forEach(function(elem) {
that = this;
}, uniqueObj);
assertTrue(that === uniqueObj);
}
+56
View File
@@ -0,0 +1,56 @@
goog.provide('ol.Color');
goog.require('goog.color');
/**
* @constructor
* @param {number} r Red.
* @param {number} g Green.
* @param {number} b Blue.
* @param {number} a Alpha.
*/
ol.Color = function(r, g, b, a) {
/**
* @type {number}
*/
this.r = r;
/**
* @type {number}
*/
this.g = g;
/**
* @type {number}
*/
this.b = b;
/**
* @type {number}
*/
this.a = a;
};
/**
* @param {string} str String.
* @param {number=} opt_a Alpha.
* @return {ol.Color} Color.
*/
ol.Color.createFromString = function(str, opt_a) {
var rgb = goog.color.hexToRgb(goog.color.parse(str).hex);
var a = goog.isDef(opt_a) ? opt_a : 255;
return new ol.Color(rgb[0], rgb[1], rgb[2], a);
};
/**
* @return {ol.Color} Clone.
*/
ol.Color.prototype.clone = function() {
return new ol.Color(this.r, this.g, this.b, this.a);
};
+24
View File
@@ -0,0 +1,24 @@
goog.provide('ol.Coordinate');
goog.require('goog.math.Coordinate');
/**
* @constructor
* @extends {goog.math.Coordinate}
* @param {number} x X.
* @param {number} y Y.
*/
ol.Coordinate = function(x, y) {
goog.base(this, x, y);
};
goog.inherits(ol.Coordinate, goog.math.Coordinate);
/**
* @return {ol.Coordinate} Clone.
*/
ol.Coordinate.prototype.clone = function() {
return new ol.Coordinate(this.x, this.y);
};
+128
View File
@@ -0,0 +1,128 @@
goog.provide('ol.RendererHint');
goog.provide('ol.createMap');
goog.require('goog.object');
goog.require('ol.Array');
goog.require('ol.Map');
goog.require('ol.MapProperty');
goog.require('ol.Projection');
goog.require('ol.control.DblClickZoom');
goog.require('ol.control.DragPan');
goog.require('ol.control.DragZoom');
goog.require('ol.control.MouseWheelZoom');
goog.require('ol.dom');
goog.require('ol.dom.Map');
goog.require('ol.webgl');
goog.require('ol.webgl.Map');
/**
* @define {string} Default projection code.
*/
ol.DEFAULT_PROJECTION_CODE = 'EPSG:3857';
/**
* @define {string} Default user projection code.
*/
ol.DEFAULT_USER_PROJECTION_CODE = 'EPSG:4326';
/**
* @define {boolean} Whether to enable DOM.
*/
ol.ENABLE_DOM = true;
/**
* @define {boolean} Whether to enable WebGL.
*/
ol.ENABLE_WEBGL = true;
/**
* @enum {string}
*/
ol.RendererHint = {
DOM: 'dom',
WEBGL: 'webgl'
};
/**
* @type {Array.<ol.RendererHint>}}
*/
ol.DEFAULT_RENDERER_HINT = [
ol.RendererHint.WEBGL,
ol.RendererHint.DOM
];
/**
* @param {!HTMLDivElement} target Target.
* @param {Object.<string, *>=} opt_values Values.
* @param {ol.RendererHint|Array.<ol.RendererHint>=} opt_rendererHints
* Renderer hints.
* @return {ol.Map} Map.
*/
ol.createMap = function(target, opt_values, opt_rendererHints) {
var values = {};
if (goog.isDef(opt_values)) {
goog.object.extend(values, opt_values);
}
if (!goog.object.containsKey(values, ol.MapProperty.CONTROLS)) {
var controls = new ol.Array();
controls.push(new ol.control.DblClickZoom());
controls.push(new ol.control.DragPan());
controls.push(new ol.control.DragZoom());
controls.push(new ol.control.MouseWheelZoom());
values[ol.MapProperty.CONTROLS] = controls;
}
if (!goog.object.containsKey(values, ol.MapProperty.LAYERS)) {
values[ol.MapProperty.LAYERS] = new ol.Array();
}
if (!goog.object.containsKey(values, ol.MapProperty.PROJECTION)) {
values[ol.MapProperty.PROJECTION] =
ol.Projection.getFromCode(ol.DEFAULT_PROJECTION_CODE);
}
if (!goog.object.containsKey(values, ol.MapProperty.USER_PROJECTION)) {
values[ol.MapProperty.USER_PROJECTION] =
ol.Projection.getFromCode(ol.DEFAULT_USER_PROJECTION_CODE);
}
/**
* @type {Array.<ol.RendererHint>}
*/
var rendererHints;
if (goog.isDef(opt_rendererHints)) {
if (goog.isArray(opt_rendererHints)) {
rendererHints = opt_rendererHints;
} else {
rendererHints = [opt_rendererHints];
}
} else {
rendererHints = ol.DEFAULT_RENDERER_HINT;
}
var i, rendererHint;
for (i = 0; i < rendererHints.length; ++i) {
rendererHint = rendererHints[i];
if (rendererHint == ol.RendererHint.DOM) {
if (ol.ENABLE_DOM && ol.dom.isSupported()) {
return new ol.dom.Map(target, values);
}
} else if (rendererHint == ol.RendererHint.WEBGL) {
if (ol.ENABLE_WEBGL && ol.webgl.isSupported()) {
return new ol.webgl.Map(target, values);
}
}
}
return null;
};
+59
View File
@@ -0,0 +1,59 @@
goog.provide('ol.Extent');
goog.require('ol.Coordinate');
goog.require('ol.Rectangle');
goog.require('ol.TransformFunction');
/**
* @constructor
* @extends {ol.Rectangle}
* @param {number} minX Minimum X.
* @param {number} minY Minimum Y.
* @param {number} maxX Maximum X.
* @param {number} maxY Maximum Y.
*/
ol.Extent = function(minX, minY, maxX, maxY) {
goog.base(this, minX, minY, maxX, maxY);
};
goog.inherits(ol.Extent, ol.Rectangle);
/**
* @param {...ol.Coordinate} var_args Coordinates.
* @return {!ol.Extent} Bounding extent.
*/
ol.Extent.boundingExtent = function(var_args) {
var coordinate0 = arguments[0];
var extent = new ol.Extent(coordinate0.x, coordinate0.y,
coordinate0.x, coordinate0.y);
var i;
for (i = 1; i < arguments.length; ++i) {
var coordinate = arguments[i];
extent.minX = Math.min(extent.minX, coordinate.x);
extent.minY = Math.min(extent.minY, coordinate.y);
extent.maxX = Math.max(extent.maxX, coordinate.x);
extent.maxY = Math.max(extent.maxY, coordinate.y);
}
return extent;
};
/**
* @return {ol.Extent} Extent.
*/
ol.Extent.prototype.clone = function() {
return new ol.Extent(this.minX, this.minY, this.maxX, this.maxY);
};
/**
* @param {ol.TransformFunction} transform Transform.
* @return {ol.Extent} Extent.
*/
ol.Extent.prototype.transform = function(transform) {
var min = transform(new ol.Coordinate(this.minX, this.minY));
var max = transform(new ol.Coordinate(this.maxX, this.maxY));
return new ol.Extent(min.x, min.y, max.x, max.y);
};
+28
View File
@@ -0,0 +1,28 @@
goog.require('goog.testing.jsunit');
goog.require('ol.Extent');
goog.require('ol.Projection');
function testClone() {
var extent = new ol.Extent(1, 2, 3, 4);
var clonedExtent = extent.clone();
assertTrue(clonedExtent instanceof ol.Extent);
assertFalse(clonedExtent === extent);
assertEquals(extent.minX, clonedExtent.minX);
assertEquals(extent.minY, clonedExtent.minY);
assertEquals(extent.maxX, clonedExtent.maxX);
assertEquals(extent.maxY, clonedExtent.maxY);
}
function testTransform() {
var transform = ol.Projection.getTransformFromCodes('EPSG:4326', 'EPSG:3857');
var sourceExtent = new ol.Extent(-15, -30, 45, 60);
var destinationExtent = sourceExtent.transform(transform);
assertNotNullNorUndefined(destinationExtent);
// FIXME check values with third-party tool
assertRoughlyEquals(-1669792.3618991037, destinationExtent.minX, 1e-9);
assertRoughlyEquals(-3503549.843504376, destinationExtent.minY, 1e-9);
assertRoughlyEquals(5009377.085697311, destinationExtent.maxX, 1e-9);
assertRoughlyEquals(8399737.889818361, destinationExtent.maxY, 1e-9);
}
+84
View File
@@ -0,0 +1,84 @@
goog.provide('ol.Layer');
goog.provide('ol.LayerProperty');
goog.require('ol.Object');
goog.require('ol.Store');
/**
* @enum {string}
*/
ol.LayerProperty = {
OPACITY: 'opacity',
VISIBLE: 'visible'
};
/**
* @constructor
* @extends {ol.Object}
* @param {ol.Store} store Store.
* @param {Object.<string, *>=} opt_values Values.
*/
ol.Layer = function(store, opt_values) {
goog.base(this);
/**
* @private
* @type {ol.Store}
*/
this.store_ = store;
this.setVisible(true);
this.setOpacity(1);
if (goog.isDef(opt_values)) {
this.setValues(opt_values);
}
};
goog.inherits(ol.Layer, ol.Object);
/**
* @return {number} Opacity.
*/
ol.Layer.prototype.getOpacity = function() {
return /** @type {number} */ (
this.get(ol.LayerProperty.OPACITY));
};
/**
* @return {ol.Store} Store.
*/
ol.Layer.prototype.getStore = function() {
return this.store_;
};
/**
* @return {boolean} Visible.
*/
ol.Layer.prototype.getVisible = function() {
return /** @type {boolean} */ (
this.get(ol.LayerProperty.VISIBLE));
};
/**
* @param {number} opacity Opacity.
*/
ol.Layer.prototype.setOpacity = function(opacity) {
this.set(ol.LayerProperty.OPACITY, opacity);
};
/**
* @param {boolean} visible Visible.
*/
ol.Layer.prototype.setVisible = function(visible) {
this.set(ol.LayerProperty.VISIBLE, visible);
};
+818
View File
@@ -0,0 +1,818 @@
// FIXME rename freeze/thaw to freezeRendering/unfreezeRendering
// FIXME add change resolution by zoom step function
// FIXME recheck layer/map projection compatability when projection changes
// FIXME layer renderers should skip when they can't reproject
goog.provide('ol.Map');
goog.provide('ol.MapProperty');
goog.require('goog.array');
goog.require('goog.dom.ViewportSizeMonitor');
goog.require('goog.events');
goog.require('goog.events.BrowserEvent');
goog.require('goog.events.Event');
goog.require('goog.events.EventType');
goog.require('goog.events.MouseWheelEvent');
goog.require('goog.events.MouseWheelHandler');
goog.require('goog.events.MouseWheelHandler.EventType');
goog.require('goog.fx.anim');
goog.require('goog.fx.anim.Animated');
goog.require('goog.object');
goog.require('ol.Array');
goog.require('ol.Color');
goog.require('ol.Control');
goog.require('ol.Coordinate');
goog.require('ol.Extent');
goog.require('ol.LayerRenderer');
goog.require('ol.Object');
goog.require('ol.Projection');
goog.require('ol.Size');
goog.require('ol.TransformFunction');
/**
* @enum {string}
*/
ol.MapProperty = {
BACKGROUND_COLOR: 'backgroundColor',
CENTER: 'center',
CONTROLS: 'controls',
EXTENT: 'extent',
LAYERS: 'layers',
PROJECTION: 'projection',
RESOLUTION: 'resolution',
SIZE: 'size',
USER_PROJECTION: 'userProjection'
};
/**
* @enum {number}
*/
ol.MapPaneZIndex = {
EVENTS: 1000
};
/**
* @constructor
* @extends {ol.Object}
* @param {HTMLDivElement} target Target.
* @param {Object=} opt_values Values.
* @param {goog.dom.ViewportSizeMonitor=} opt_viewportSizeMonitor
* Viewport size monitor.
*/
ol.Map = function(target, opt_values, opt_viewportSizeMonitor) {
goog.base(this);
/**
* @type {ol.TransformFunction}
* @private
*/
this.userToMapTransform_ = ol.Projection.identityTransform;
/**
* @type {ol.TransformFunction}
* @private
*/
this.mapToUserTransform_ = ol.Projection.cloneTransform;
/**
* @private
* @type {HTMLDivElement}
*/
this.eventsPane_ = /** @type {HTMLDivElement} */ (
goog.dom.createElement(goog.dom.TagName.DIV));
this.eventsPane_.className = 'ol-pane-events';
this.eventsPane_.style.position = 'absolute';
this.eventsPane_.style.width = '100%';
this.eventsPane_.style.height = '100%';
this.eventsPane_.style.zIndex = ol.MapPaneZIndex.EVENTS;
target.appendChild(this.eventsPane_);
goog.events.listen(this.eventsPane_, [
goog.events.EventType.DBLCLICK,
goog.events.EventType.MOUSEDOWN,
goog.events.EventType.MOUSEMOVE,
goog.events.EventType.MOUSEOUT,
goog.events.EventType.MOUSEUP
], this.handleBrowserEvent, false, this);
var mouseWheelHandler = new goog.events.MouseWheelHandler(this.eventsPane_);
goog.events.listen(mouseWheelHandler,
goog.events.MouseWheelHandler.EventType.MOUSEWHEEL,
this.handleBrowserEvent, false, this);
this.registerDisposable(mouseWheelHandler);
/**
* @private
* @type {goog.fx.anim.Animated}
*/
this.animation_ = new ol.MapAnimation(this);
/**
* @private
* @type {boolean}
*/
this.animating_ = false;
/**
* @private
* @type {number}
*/
this.freezeCount_ = 0;
/**
* @private
* @type {HTMLDivElement}
*/
this.target_ = target;
/**
* @private
* @type {Array.<number>}
*/
this.layersListenerKeys_ = null;
/**
* @protected
* @type {Object.<number, ol.LayerRenderer>}
*/
this.layerRenderers = {};
/**
* @private
* @type {goog.dom.ViewportSizeMonitor}
*/
this.viewportSizeMonitor_ = goog.isDef(opt_viewportSizeMonitor) ?
opt_viewportSizeMonitor : new goog.dom.ViewportSizeMonitor();
goog.events.listen(this.viewportSizeMonitor_, goog.events.EventType.RESIZE,
this.handleViewportResize, false, this);
goog.events.listen(this,
ol.Object.getChangedEventType(ol.MapProperty.BACKGROUND_COLOR),
this.handleBackgroundColorChanged, false, this);
goog.events.listen(
this, ol.Object.getChangedEventType(ol.MapProperty.CENTER),
this.handleCenterChanged, false, this);
goog.events.listen(
this, ol.Object.getChangedEventType(ol.MapProperty.LAYERS),
this.handleLayersChanged, false, this);
goog.events.listen(
this, ol.Object.getChangedEventType(ol.MapProperty.PROJECTION),
this.handleProjectionChanged, false, this);
goog.events.listen(
this, ol.Object.getChangedEventType(ol.MapProperty.RESOLUTION),
this.handleResolutionChanged, false, this);
goog.events.listen(
this, ol.Object.getChangedEventType(ol.MapProperty.SIZE),
this.handleSizeChanged, false, this);
goog.events.listen(
this, ol.Object.getChangedEventType(ol.MapProperty.USER_PROJECTION),
this.handleUserProjectionChanged, false, this);
if (goog.isDef(opt_values)) {
this.setValues(opt_values);
}
};
goog.inherits(ol.Map, ol.Object);
/**
* @private
*/
ol.Map.prototype.animate_ = function() {
goog.asserts.assert(!this.animating_);
goog.fx.anim.registerAnimation(this.animation_);
this.animating_ = true;
};
/**
* @param {ol.Layer} layer Layer.
* @protected
* @return {ol.LayerRenderer} layerRenderer Layer renderer.
*/
ol.Map.prototype.createLayerRenderer = goog.abstractMethod;
/**
*/
ol.Map.prototype.freeze = function() {
++this.freezeCount_;
};
/**
* @inheritDoc
*/
ol.Map.prototype.disposeInternal = function() {
goog.object.forEach(this.layerRenderers, function(layerRenderer) {
goog.dispose(layerRenderer);
});
goog.base(this, 'disposeInternal');
};
/**
* @param {ol.Extent} extent Extent.
*/
ol.Map.prototype.fitExtent = function(extent) {
this.whileFrozen(function() {
this.setCenter(extent.getCenter());
this.setResolution(this.getResolutionForExtent(extent));
}, this);
};
/**
* @param {ol.Extent} userExtent Extent in user projection.
*/
ol.Map.prototype.fitUserExtent = function(userExtent) {
this.fitExtent(userExtent.transform(this.userToMapTransform_));
};
/**
* @param {function(this: T, ol.Layer, ol.LayerRenderer, number)} f Function.
* @param {T=} opt_obj Object.
* @template T
*/
ol.Map.prototype.forEachVisibleLayer = function(f, opt_obj) {
var layers = this.getLayers();
layers.forEach(function(layer, index) {
if (layer.getVisible()) {
var layerRenderer = this.getLayerRenderer(layer);
f.call(opt_obj, layer, layerRenderer, index);
}
}, this);
};
/**
* @return {ol.Color|undefined} Background color.
*/
ol.Map.prototype.getBackgroundColor = function() {
return /** @type {ol.Color|undefined} */ (
this.get(ol.MapProperty.BACKGROUND_COLOR));
};
/**
* @return {ol.Coordinate|undefined} Center.
*/
ol.Map.prototype.getCenter = function() {
return /** @type {ol.Coordinate} */ (this.get(ol.MapProperty.CENTER));
};
/**
* @return {ol.Array} Controls.
*/
ol.Map.prototype.getControls = function() {
return /** @type {ol.Array} */ this.get(ol.MapProperty.CONTROLS);
};
/**
* @param {ol.Coordinate} pixel Pixel.
* @return {ol.Coordinate} Coordinate.
*/
ol.Map.prototype.getCoordinateFromPixel = function(pixel) {
var center = this.getCenter();
goog.asserts.assert(goog.isDef(center));
var resolution = this.getResolution();
goog.asserts.assert(goog.isDef(resolution));
var size = this.getSize();
goog.asserts.assert(goog.isDef(size));
var x = center.x + resolution * (pixel.x - size.width / 2);
var y = center.y - resolution * (pixel.y - size.height / 2);
return new ol.Coordinate(x, y);
};
/**
* @return {ol.Extent|undefined} Extent.
*/
ol.Map.prototype.getExtent = function() {
return /** @type {ol.Extent} */ (this.get(ol.MapProperty.EXTENT));
};
/**
* @param {ol.Layer} layer Layer.
* @protected
* @return {ol.LayerRenderer} Layer renderer.
*/
ol.Map.prototype.getLayerRenderer = function(layer) {
var key = goog.getUid(layer);
var layerRenderer = this.layerRenderers[key];
goog.asserts.assert(goog.isDef(layerRenderer));
return layerRenderer;
};
/**
* @return {ol.Array} Layers.
*/
ol.Map.prototype.getLayers = function() {
return /** @type {ol.Array} */ (this.get(ol.MapProperty.LAYERS));
};
/**
* @param {ol.Coordinate} coordinate Coordinate.
* @return {ol.Coordinate} Pixel.
*/
ol.Map.prototype.getPixelFromCoordinate = function(coordinate) {
var center = this.getCenter();
goog.asserts.assert(goog.isDef(center));
var resolution = this.getResolution();
goog.asserts.assert(goog.isDef(resolution));
var size = this.getSize();
goog.asserts.assert(goog.isDef(size));
var x = (coordinate.x - center.x) / resolution + size.width / 2;
var y = (center.y - coordinate.y) / resolution + size.height / 2;
return new ol.Coordinate(x, y);
};
/**
* @return {ol.Projection|undefined} Projection.
*/
ol.Map.prototype.getProjection = function() {
return /** @type {ol.Projection} */ (this.get(ol.MapProperty.PROJECTION));
};
/**
* @return {number|undefined} Resolution.
*/
ol.Map.prototype.getResolution = function() {
return /** @type {number} */ (this.get(ol.MapProperty.RESOLUTION));
};
/**
* @param {ol.Extent} extent Extent.
* @return {number} Resolution.
*/
ol.Map.prototype.getResolutionForExtent = function(extent) {
var size = this.getSize();
goog.asserts.assert(goog.isDef(size));
var xResolution = (extent.maxX - extent.minX) / size.width;
var yResolution = (extent.maxY - extent.minY) / size.height;
return Math.max(xResolution, yResolution);
};
/**
* @return {ol.Size|undefined} Size.
*/
ol.Map.prototype.getSize = function() {
return /** @type {ol.Size|undefined} */ this.get(ol.MapProperty.SIZE);
};
/**
* @return {HTMLDivElement} Target.
*/
ol.Map.prototype.getTarget = function() {
return this.target_;
};
/**
* @return {ol.Coordinate|undefined} Center in user projection.
*/
ol.Map.prototype.getUserCenter = function() {
var center = this.getCenter();
if (goog.isDef(center)) {
return this.mapToUserTransform_(center);
} else {
return undefined;
}
};
/**
* @return {ol.Extent|undefined} Extent in user projection.
*/
ol.Map.prototype.getUserExtent = function() {
var extent = this.getExtent();
if (goog.isDef(extent)) {
return extent.transform(this.mapToUserTransform_);
} else {
return undefined;
}
};
/**
* @return {ol.Projection|undefined} Projection.
*/
ol.Map.prototype.getUserProjection = function() {
return /** @type {ol.Projection} */ this.get(ol.MapProperty.USER_PROJECTION);
};
/**
*/
ol.Map.prototype.handleBackgroundColorChanged = goog.nullFunction;
/**
* @param {goog.events.BrowserEvent} event Event.
*/
ol.Map.prototype.handleBrowserEvent = function(event) {
var mapBrowserEvent = new ol.MapBrowserEvent(event.type, this, event);
var controls = this.getControls();
var controlsArray = /** @type {Array.<ol.Control>} */ controls.getArray();
goog.array.every(controlsArray, function(control) {
control.handleMapBrowserEvent(mapBrowserEvent);
return !mapBrowserEvent.defaultPrevented;
});
};
/**
* @protected
*/
ol.Map.prototype.handleCenterChanged = function() {
this.recalculateExtent_();
};
/**
* @param {ol.Layer} layer Layer.
* @protected
*/
ol.Map.prototype.handleLayerAdd = function(layer) {
var projection = this.getProjection();
var storeProjection = layer.getStore().getProjection();
if (goog.isDef(projection)) {
goog.asserts.assert(ol.Projection.equivalent(projection, storeProjection));
}
var layerRenderer = this.createLayerRenderer(layer);
this.setLayerRenderer(layer, layerRenderer);
};
/**
* @param {ol.Layer} layer Layer.
* @protected
*/
ol.Map.prototype.handleLayerRemove = function(layer) {
this.removeLayerRenderer(layer);
};
/**
* @param {ol.ArrayEvent} event Event.
* @protected
*/
ol.Map.prototype.handleLayersInsertAt = function(event) {
var layers = /** @type {ol.Array} */ (event.target);
var layer = /** @type {ol.Layer} */ layers.getAt(event.index);
this.handleLayerAdd(layer);
};
/**
* @param {ol.ArrayEvent} event Event.
* @protected
*/
ol.Map.prototype.handleLayersRemoveAt = function(event) {
var layer = /** @type {ol.Layer} */ (event.prev);
this.handleLayerRemove(layer);
};
/**
* @param {ol.ArrayEvent} event Event.
* @protected
*/
ol.Map.prototype.handleLayersSetAt = function(event) {
var prevLayer = /** @type {ol.Layer} */ (event.prev);
this.handleLayerRemove(prevLayer);
var layers = /** @type {ol.Array} */ (event.target);
var layer = /** @type {ol.Layer} */ layers.getAt(event.index);
this.handleLayerAdd(layer);
};
/**
*/
ol.Map.prototype.handleLayersChanged = function() {
var layerRenderers = goog.object.getValues(this.layerRenderers);
goog.array.forEach(layerRenderers, function(layerRenderer) {
this.removeLayerRenderer(layerRenderer);
}, this);
this.layerRenderers = {};
if (!goog.isNull(this.layersListenerKeys_)) {
goog.array.forEach(this.layersListenerKeys_, goog.events.unlistenByKey);
this.layersListenerKeys_ = null;
}
var layers = this.getLayers();
if (goog.isDefAndNotNull(layers)) {
goog.array.forEach(layers.getArray(), function(layer) {
var layerRenderer = this.createLayerRenderer(layer);
this.setLayerRenderer(layer, layerRenderer);
}, this);
this.layersListenerKeys_ = [
goog.events.listen(layers, ol.ArrayEventType.INSERT_AT,
this.handleLayersInsertAt, false, this),
goog.events.listen(layers, ol.ArrayEventType.REMOVE_AT,
this.handleLayersRemoveAt, false, this),
goog.events.listen(layers, ol.ArrayEventType.SET_AT,
this.handleLayersSetAt, false, this)
];
}
};
/**
* @protected
*/
ol.Map.prototype.handleProjectionChanged = function() {
this.recalculateTransforms_();
};
/**
* @protected
*/
ol.Map.prototype.handleResolutionChanged = function() {
this.recalculateExtent_();
};
/**
* @protected
*/
ol.Map.prototype.handleSizeChanged = function() {
this.recalculateExtent_();
};
/**
* @protected
*/
ol.Map.prototype.handleUserProjectionChanged = function() {
this.recalculateTransforms_();
};
/**
* @protected
*/
ol.Map.prototype.handleViewportResize = function() {
var size = new ol.Size(this.target_.clientWidth, this.target_.clientHeight);
this.setSize(size);
};
/**
* @private
*/
ol.Map.prototype.recalculateExtent_ = function() {
var size = this.getSize();
var center = this.getCenter();
var resolution = this.getResolution();
if (!goog.isDef(size) || !goog.isDef(center) || !goog.isDef(resolution)) {
if (goog.isDef(this.getExtent())) {
this.set(ol.MapProperty.EXTENT, undefined);
}
} else {
var minX = center.x - resolution * size.width / 2;
var minY = center.y - resolution * size.height / 2;
var maxX = center.x + resolution * size.width / 2;
var maxY = center.y + resolution * size.height / 2;
var extent = new ol.Extent(minX, minY, maxX, maxY);
this.set(ol.MapProperty.EXTENT, extent);
}
};
/**
* @private
*/
ol.Map.prototype.recalculateTransforms_ = function() {
var projection = this.getProjection();
var userProjection = this.getUserProjection();
if (goog.isDefAndNotNull(projection) &&
goog.isDefAndNotNull(userProjection)) {
this.mapToUserTransform_ = ol.Projection.getTransform(
projection, userProjection);
this.userToMapTransform_ = ol.Projection.getTransform(
userProjection, projection);
} else {
this.mapToUserTransform_ = ol.Projection.cloneTransform;
this.userToMapTransform_ = ol.Projection.identityTransform;
}
};
/**
*/
ol.Map.prototype.render = function() {
if (!this.animating_) {
if (this.freezeCount_ === 0) {
if (this.renderInternal()) {
this.animate_();
}
} else {
this.dirty_ = true;
}
}
};
/**
* @protected
* @return {boolean} Animating.
*/
ol.Map.prototype.renderInternal = function() {
this.dirty_ = false;
var animate = false;
this.forEachVisibleLayer(function(layer, layerRenderer) {
if (layerRenderer.render()) {
animate = true;
}
});
return animate;
};
/**
* @param {ol.Layer} layer Layer.
* @return {ol.LayerRenderer} Layer renderer.
* @protected
*/
ol.Map.prototype.removeLayerRenderer = function(layer) {
var key = goog.getUid(layer);
if (key in this.layerRenderers) {
var layerRenderer = this.layerRenderers[key];
delete this.layerRenderers[key];
return layerRenderer;
} else {
return null;
}
};
/**
* @param {ol.Color} backgroundColor Background color.
*/
ol.Map.prototype.setBackgroundColor = function(backgroundColor) {
this.set(ol.MapProperty.BACKGROUND_COLOR, backgroundColor);
};
/**
* @param {ol.Coordinate} center Center.
*/
ol.Map.prototype.setCenter = function(center) {
this.set(ol.MapProperty.CENTER, center);
};
/**
* @param {ol.Array} controls Controls.
*/
ol.Map.prototype.setControls = function(controls) {
this.set(ol.MapProperty.CONTROLS, controls);
};
/**
* @param {ol.Layer} layer Layer.
* @param {ol.LayerRenderer} layerRenderer Layer renderer.
* @protected
*/
ol.Map.prototype.setLayerRenderer = function(layer, layerRenderer) {
var key = goog.getUid(layer);
goog.asserts.assert(!(key in this.layerRenderers));
this.layerRenderers[key] = layerRenderer;
};
/**
* @param {ol.Array} layers Layers.
*/
ol.Map.prototype.setLayers = function(layers) {
this.set(ol.MapProperty.LAYERS, layers);
};
/**
* @param {number} resolution Resolution.
*/
ol.Map.prototype.setResolution = function(resolution) {
this.set(ol.MapProperty.RESOLUTION, resolution);
};
/**
* @param {ol.Size} size Size.
*/
ol.Map.prototype.setSize = function(size) {
var currentSize = this.getSize();
if (!goog.isDef(currentSize) || !currentSize.equals(size)) {
this.set(ol.MapProperty.SIZE, size);
}
};
/**
* @param {ol.Projection} projection Projection.
*/
ol.Map.prototype.setProjection = function(projection) {
this.set(ol.MapProperty.PROJECTION, projection);
};
/**
* @param {ol.Coordinate} userCenter Center in user projection.
*/
ol.Map.prototype.setUserCenter = function(userCenter) {
this.setCenter(this.userToMapTransform_(userCenter));
};
/**
* @param {ol.Projection} userProjection User projection.
*/
ol.Map.prototype.setUserProjection = function(userProjection) {
this.set(ol.MapProperty.USER_PROJECTION, userProjection);
};
/**
* @param {function(this: T)} f Function.
* @param {T=} opt_obj Object.
* @template T
*/
ol.Map.prototype.whileFrozen = function(f, opt_obj) {
this.freeze();
try {
f.call(opt_obj);
} finally {
this.thaw();
}
};
/**
*/
ol.Map.prototype.thaw = function() {
goog.asserts.assert(this.freezeCount_ > 0);
if (--this.freezeCount_ === 0) {
if (!this.animating_ && this.dirty_) {
if (this.renderInternal()) {
this.animate_();
}
}
}
};
/**
* @constructor
* @implements {goog.fx.anim.Animated}
* @param {!ol.Map} map Map.
*/
ol.MapAnimation = function(map) {
/**
* @private
* @type {ol.Map}
*/
this.map_ = map;
};
/**
* @inheritDoc
*/
ol.MapAnimation.prototype.onAnimationFrame = function() {
if (!this.map_.renderInternal()) {
goog.fx.anim.unregisterAnimation(this);
}
};
+59
View File
@@ -0,0 +1,59 @@
goog.provide('ol.MapBrowserEvent');
goog.require('goog.events.BrowserEvent');
goog.require('ol.Coordinate');
goog.require('ol.MapEvent');
/**
* @constructor
* @extends {ol.MapEvent}
* @param {string} type Event type.
* @param {ol.Map} map Map.
* @param {goog.events.BrowserEvent} browserEventObject Browser event object.
*/
ol.MapBrowserEvent = function(type, map, browserEventObject) {
goog.base(this, type, map);
/**
* @private
* @type {goog.events.BrowserEvent}
*/
this.browserEventObject_ = browserEventObject;
};
goog.inherits(ol.MapBrowserEvent, ol.MapEvent);
/**
* @private
* @type {ol.Coordinate}
*/
ol.MapBrowserEvent.prototype.coordinate_;
/**
* @return {ol.Coordinate} Coordinate.
*/
ol.MapBrowserEvent.prototype.getCoordinate = function() {
if (goog.isDef(this.coordinate_)) {
return this.coordinate_;
} else {
var browserEventObject = this.getBrowserEventObject();
var pixel = new ol.Coordinate(
browserEventObject.offsetX, browserEventObject.offsetY);
var coordinate = this.map.getCoordinateFromPixel(pixel);
this.coordinate_ = coordinate;
return coordinate;
}
};
/**
* @return {goog.events.BrowserEvent} Browser event object.
*/
ol.MapBrowserEvent.prototype.getBrowserEventObject = function() {
return this.browserEventObject_;
};
+36
View File
@@ -0,0 +1,36 @@
goog.provide('ol.MapEvent');
goog.require('goog.events.Event');
/**
* @constructor
* @extends {goog.events.Event}
* @param {string} type Event type.
* @param {ol.Map} map Map.
*/
ol.MapEvent = function(type, map) {
goog.base(this, type);
/**
* @type {ol.Map}
*/
this.map = map;
/**
* @type {boolean}
*/
this.defaultPrevented = false;
};
goog.inherits(ol.MapEvent, goog.events.Event);
/**
*/
ol.MapEvent.prototype.preventDefault = function() {
goog.base(this, 'preventDefault');
this.defaultPrevented = true;
};
+306
View File
@@ -0,0 +1,306 @@
/**
* @fileoverview An implementation of Google Maps' MVCObject.
* @see https://developers.google.com/maps/articles/mvcfun
* @see https://developers.google.com/maps/documentation/javascript/reference
*/
goog.provide('ol.Object');
goog.require('goog.array');
goog.require('goog.events');
goog.require('goog.events.EventTarget');
goog.require('goog.object');
/**
* @enum {string}
*/
ol.ObjectProperty = {
ACCESSORS: 'ol_accessors_',
BINDINGS: 'ol_bindings_'
};
/**
* @constructor
* @extends {goog.events.EventTarget}
* @param {Object.<string, *>=} opt_values Values.
*/
ol.Object = function(opt_values) {
goog.base(this);
if (goog.isDef(opt_values)) {
this.setValues(opt_values);
}
};
goog.inherits(ol.Object, goog.events.EventTarget);
/**
* @param {string} str String.
* @return {string} Capitalized string.
*/
ol.Object.capitalize = function(str) {
return str.substr(0, 1).toUpperCase() + str.substr(1);
};
/**
* @param {ol.Object|Object} arg Argument.
* @return {ol.Object} Object.
*/
ol.Object.create = function(arg) {
if (arg instanceof ol.Object) {
return arg;
} else {
var object = new ol.Object();
object.setOptions(arg);
return object;
}
};
/**
* @private
* @type {Object.<string, string>}
*/
ol.Object.changedEventTypeCache_ = {};
/**
* @param {string} key Key.
* @return {string} Changed name.
*/
ol.Object.getChangedEventType = function(key) {
return ol.Object.changedEventTypeCache_[key] ||
(ol.Object.changedEventTypeCache_[key] = key.toLowerCase() + '_changed');
};
/**
* @private
* @type {Object.<string, string>}
*/
ol.Object.getterNameCache_ = {};
/**
* @param {string} key String.
* @return {string} Getter name.
*/
ol.Object.getGetterName = function(key) {
return ol.Object.getterNameCache_[key] ||
(ol.Object.getterNameCache_[key] = 'get' + ol.Object.capitalize(key));
};
/**
* @private
* @type {Object.<string, string>}
*/
ol.Object.changedMethodNameCache_ = {};
/**
* @param {string} key String.
* @return {string} Changed method name.
*/
ol.Object.getChangedMethodName = function(key) {
return ol.Object.changedMethodNameCache_[key] ||
(ol.Object.changedMethodNameCache_[key] = key + '_changed');
};
/**
* @private
* @type {Object.<string, string>}
*/
ol.Object.setterNameCache_ = {};
/**
* @param {string} key String.
* @return {string} Setter name.
*/
ol.Object.getSetterName = function(key) {
return ol.Object.setterNameCache_[key] ||
(ol.Object.setterNameCache_[key] = 'set' + ol.Object.capitalize(key));
};
/**
* @param {ol.Object} obj Object.
* @return {Object.<string, {target: ol.Object, key: string}>} Accessors.
*/
ol.Object.getAccessors = function(obj) {
return obj[ol.ObjectProperty.ACCESSORS] ||
(obj[ol.ObjectProperty.ACCESSORS] = {});
};
/**
* @param {ol.Object} obj Object.
* @return {Object.<string, ?number>} Listeners.
*/
ol.Object.getListeners = function(obj) {
return obj[ol.ObjectProperty.BINDINGS] ||
(obj[ol.ObjectProperty.BINDINGS] = {});
};
/**
* @param {string} key Key.
* @param {ol.Object} target Target.
* @param {string=} opt_targetKey Target key.
* @param {boolean=} opt_noNotify No notify.
*/
ol.Object.prototype.bindTo =
function(key, target, opt_targetKey, opt_noNotify) {
var targetKey = goog.isDef(opt_targetKey) ? opt_targetKey : key;
this.unbind(key);
var eventType = ol.Object.getChangedEventType(targetKey);
var listeners = ol.Object.getListeners(this);
listeners[key] = goog.events.listen(target, eventType, function() {
this.notifyInternal_(key);
}, undefined, this);
var accessors = ol.Object.getAccessors(this);
accessors[key] = {target: target, key: targetKey};
var noNotify = goog.isDef(opt_noNotify) ? opt_noNotify : false;
if (!noNotify) {
this.notifyInternal_(key);
}
};
/**
* @param {string} key Key.
*/
ol.Object.prototype.changed = function(key) {
};
/**
* @param {string} key Key.
* @return {*} Value.
*/
ol.Object.prototype.get = function(key) {
var accessors = ol.Object.getAccessors(this);
if (goog.object.containsKey(accessors, key)) {
var accessor = accessors[key];
var target = accessor.target;
var targetKey = accessor.key;
var getterName = ol.Object.getGetterName(targetKey);
if (target[getterName]) {
return target[getterName]();
} else {
return target.get(targetKey);
}
} else {
return this[key];
}
};
/**
* @param {string} key Key.
*/
ol.Object.prototype.notify = function(key) {
var accessors = ol.Object.getAccessors(this);
if (goog.object.containsKey(accessors, key)) {
var accessor = accessors[key];
var target = accessor.target;
var targetKey = accessor.key;
target.notify(targetKey);
} else {
this.notifyInternal_(key);
}
};
/**
* @param {string} key Key.
* @private
*/
ol.Object.prototype.notifyInternal_ = function(key) {
var changedMethodName = ol.Object.getChangedMethodName(key);
if (this[changedMethodName]) {
this[changedMethodName]();
} else {
this.changed(key);
}
var eventType = ol.Object.getChangedEventType(key);
this.dispatchEvent(eventType);
};
/**
* @param {string} key Key.
* @param {*} value Value.
*/
ol.Object.prototype.set = function(key, value) {
var accessors = ol.Object.getAccessors(this);
if (goog.object.containsKey(accessors, key)) {
var accessor = accessors[key];
var target = accessor.target;
var targetKey = accessor.key;
var setterName = ol.Object.getSetterName(targetKey);
if (target[setterName]) {
target[setterName](value);
} else {
target.set(targetKey, value);
}
} else {
this[key] = value;
this.notifyInternal_(key);
}
};
/**
* @param {Object.<string, *>} options Options.
*/
ol.Object.prototype.setOptions = function(options) {
goog.object.forEach(options, function(value, key) {
var setterName = ol.Object.getSetterName(key);
if (this[setterName]) {
this[setterName](value);
} else {
this.set(key, value);
}
}, this);
};
/**
* @param {Object.<string, *>} values Values.
*/
ol.Object.prototype.setValues = ol.Object.prototype.setOptions;
/**
* @param {string} key Key.
*/
ol.Object.prototype.unbind = function(key) {
var listeners = ol.Object.getListeners(this);
var listener = listeners[key];
if (listener) {
delete listeners[key];
goog.events.unlistenByKey(listener);
var value = this.get(key);
var accessors = ol.Object.getAccessors(this);
delete accessors[key];
this[key] = value;
}
};
/**
*/
ol.Object.prototype.unbindAll = function() {
var listeners = ol.Object.getListeners(this);
var keys = goog.object.getKeys(listeners);
goog.array.forEach(keys, function(key) {
this.unbind(key);
}, this);
};
+482
View File
@@ -0,0 +1,482 @@
goog.require('goog.testing.jsunit');
goog.require('ol.Object');
function testModel() {
var m = new ol.Object();
assertNotNullNorUndefined(m);
}
function testGetUndefined() {
var m = new ol.Object();
assertUndefined(m.get('k'));
}
function testGetSetGet() {
var m = new ol.Object();
assertUndefined(m.get('k'));
m.set('k', 1);
assertEquals(1, m.get('k'));
}
function testSetValues() {
var m = new ol.Object();
m.setValues({
k1: 1,
k2: 2
});
assertEquals(1, m.get('k1'));
assertEquals(2, m.get('k2'));
}
function testNotifyCallback() {
var m = new ol.Object();
var callbackCalled;
m.changed = function() {
callbackCalled = true;
};
m.notify('k');
assertTrue(callbackCalled);
}
function testNotifyKeyCallback() {
var m = new ol.Object();
var callbackCalled = false;
m.k_changed = function() {
callbackCalled = true;
};
m.notify('k');
assertTrue(callbackCalled);
}
function testNotifyKeyEvent() {
var m = new ol.Object();
var eventDispatched = false;
goog.events.listen(m, 'k_changed', function() {
eventDispatched = true;
});
m.notify('k');
assertTrue(eventDispatched);
}
function testSetNotifyCallback() {
var m = new ol.Object();
var callbackCalled;
m.changed = function() {
callbackCalled = true;
};
m.set('k', 1);
assertTrue(callbackCalled);
}
function testSetNotifyKeyCallback() {
var m = new ol.Object();
var callbackCalled = false;
m.k_changed = function(v) {
callbackCalled = true;
};
m.set('k', 1);
assertTrue(callbackCalled);
}
function testBindSetNotifyKeyCallback() {
var m = new ol.Object();
var n = new ol.Object();
var callbackCalled = false;
n.k_changed = function(v) {
callbackCalled = true;
};
n.bindTo('k', m);
m.set('k', 1);
assertTrue(callbackCalled);
}
function testSetNotifyKeyEvent() {
var m = new ol.Object();
var eventDispatched = false;
goog.events.listen(m, 'k_changed', function() {
eventDispatched = true;
});
m.set('k', 1);
assertTrue(eventDispatched);
}
function testSetBind() {
var m = new ol.Object();
var n = new ol.Object();
m.set('k', 1);
assertEquals(1, m.get('k'));
assertUndefined(n.get('k'));
n.bindTo('k', m);
assertEquals(1, m.get('k'));
assertEquals(1, n.get('k'));
}
function testBindSet() {
var m = new ol.Object();
var n = new ol.Object();
n.bindTo('k', m);
m.set('k', 1);
assertEquals(1, m.get('k'));
assertEquals(1, n.get('k'));
}
function testBindSetBackwards() {
var m = new ol.Object();
var n = new ol.Object();
n.bindTo('k', m);
n.set('k', 1);
assertEquals(1, m.get('k'));
assertEquals(1, n.get('k'));
}
function testSetBindBackwards() {
var m = new ol.Object();
var n = new ol.Object();
n.set('k', 1);
n.bindTo('k', m);
assertUndefined(m.get('k'));
assertUndefined(n.get('k'));
}
function testBindSetUnbind() {
var m = new ol.Object();
var n = new ol.Object();
n.bindTo('k', m);
n.set('k', 1);
assertEquals(1, m.get('k'));
assertEquals(1, n.get('k'));
n.unbind('k');
assertEquals(1, m.get('k'));
assertEquals(1, n.get('k'));
n.set('k', 2);
assertEquals(1, m.get('k'));
assertEquals(2, n.get('k'));
}
function testUnbindAll() {
var m = new ol.Object();
var n = new ol.Object();
n.bindTo('k', m);
n.set('k', 1);
assertEquals(m.get('k'), 1);
assertEquals(n.get('k'), 1);
n.unbindAll();
assertEquals(m.get('k'), 1);
assertEquals(n.get('k'), 1);
n.set('k', 2);
assertEquals(m.get('k'), 1);
assertEquals(n.get('k'), 2);
}
function testBindNotify() {
var m = new ol.Object();
var n = new ol.Object();
m.bindTo('k', n);
mCallbackCalled = false;
m.k_changed = function() {
mCallbackCalled = true;
};
nCallbackCalled = false;
n.k_changed = function() {
nCallbackCalled = true;
};
n.set('k', 1);
assertTrue(mCallbackCalled);
assertTrue(nCallbackCalled);
}
function testBindBackwardsNotify() {
var m = new ol.Object();
var n = new ol.Object();
n.bindTo('k', m);
mCallbackCalled = false;
m.k_changed = function() {
mCallbackCalled = true;
};
nCallbackCalled = false;
n.k_changed = function() {
nCallbackCalled = true;
};
n.set('k', 1);
assertTrue(mCallbackCalled);
assertTrue(nCallbackCalled);
}
function testBindRename() {
var m = new ol.Object();
var n = new ol.Object();
n.bindTo('kn', m, 'km');
m.set('km', 1);
assertEquals(m.get('km'), 1);
assertEquals(n.get('kn'), 1);
}
function testBindRenameCallbacks() {
var m = new ol.Object();
var n = new ol.Object();
var kmCallbackCalled = false;
m.km_changed = function() {
kmCallbackCalled = true;
};
var knCallbackCalled = false;
n.kn_changed = function() {
knCallbackCalled = true;
};
n.bindTo('kn', m, 'km');
m.set('km', 1);
assertEquals(m.get('km'), 1);
assertEquals(n.get('kn'), 1);
assertTrue(kmCallbackCalled);
assertTrue(knCallbackCalled);
}
function testTransitiveBindForwards() {
var m = new ol.Object();
var n = new ol.Object();
var o = new ol.Object();
n.bindTo('kn', m, 'km');
o.bindTo('ko', n, 'kn');
m.set('km', 1);
assertEquals(1, m.get('km'));
assertEquals(1, n.get('kn'));
assertEquals(1, o.get('ko'));
}
function testTransitiveBindBackwards() {
var m = new ol.Object();
var n = new ol.Object();
var o = new ol.Object();
n.bindTo('kn', m, 'km');
o.bindTo('ko', n, 'kn');
o.set('ko', 1);
assertEquals(1, m.get('km'));
assertEquals(1, n.get('kn'));
assertEquals(1, o.get('ko'));
}
function testInheritance() {
var C = function() {};
C.prototype = new ol.Object();
var callbackCalled;
C.prototype.k_changed = function() {
callbackCalled = true;
};
var c = new C();
c.set('k', 1);
assertEquals(1, c.get('k'));
assertTrue(callbackCalled);
}
function testMrideyAccessors() {
// http://blog.mridey.com/2010/03/maps-javascript-api-v3-more-about.html
var a = new ol.Object();
a.set('level', 2);
assertEquals(2, a.get('level'));
var b = new ol.Object();
b.setValues({
level: 2,
index: 3,
description: 'Hello world.'
});
assertEquals(3, b.get('index'));
}
function testMrideyBinding() {
// http://blog.mridey.com/2010/03/maps-javascript-api-v3-more-about.html
var a = new ol.Object();
a.set('level', 2);
var b = new ol.Object();
b.bindTo('index', a, 'level');
assertEquals(2, b.get('index'));
a.set('level', 3);
assertEquals(3, b.get('index'));
b.set('index', 4);
assertEquals(4, a.get('level'));
var c = new ol.Object();
c.bindTo('zoom', a, 'level');
assertEquals(4, c.get('zoom'));
b.unbind('index');
assertEquals(4, b.get('index'));
c.set('zoom', 5);
assertEquals(5, a.get('level'));
assertEquals(4, b.get('index'));
}
function testCircularBind() {
var a = new ol.Object();
var b = new ol.Object();
a.bindTo('k', b);
assertThrows(function() {
b.bindTo('k', a);
});
}
function testPriority() {
var a = new ol.Object();
var b = new ol.Object();
a.set('k', 1);
b.set('k', 2);
a.bindTo('k', b);
assertEquals(2, a.get('k'));
assertEquals(2, b.get('k'));
}
function testPriorityUndefined() {
var a = new ol.Object();
var b = new ol.Object();
a.set('k', 1);
a.bindTo('k', b);
assertUndefined(a.get('k'));
assertUndefined(b.get('k'));
}
function testSetter() {
var a = new ol.Object();
var x;
var setterCalled;
a.setX = function(value) {
this.x = value;
setterCalled = true;
};
a.set('x', 1);
assertEquals(1, a.get('x'));
assertUndefined(setterCalled);
}
function testSetterBind() {
var a = new ol.Object();
var x;
var setterCalled;
a.setX = function(value) {
this.x = value;
setterCalled = true;
};
var b = new ol.Object();
b.bindTo('x', a);
b.set('x', 1);
assertEquals(1, a.get('x'));
assertEquals(1, b.get('x'));
assertTrue(setterCalled);
}
function testGetter() {
var a = new ol.Object();
var getterCalled;
a.getX = function() {
getterCalled = true;
return 1;
};
assertUndefined(a.get('x'));
assertUndefined(getterCalled);
}
function testGetterBind() {
var a = new ol.Object();
var getterCalled;
a.getX = function() {
getterCalled = true;
return 1;
};
var b = new ol.Object();
b.bindTo('x', a);
assertEquals(1, b.get('x'));
assertTrue(getterCalled);
}
function testBindSelf() {
var a = new ol.Object();
assertThrows(function() {
a.bindTo('k', a);
});
}
function testChangedKey() {
var a = new ol.Object();
var changedKey;
a.changed = function(key) {
changedKey = key;
};
a.set('k', 1);
assertEquals('k', changedKey);
}
function testCreateFromObject() {
var obj = {k: 1};
var obj = ol.Object.create(obj);
assertTrue(obj instanceof ol.Object);
assertEquals(1, obj.get('k'));
}
function testCreateFromObject() {
var obj1 = new ol.Object();
var obj2 = ol.Object.create(obj1);
assertTrue(obj2 === obj1);
}
function testCreateWithOptions() {
var obj = new ol.Object({k: 1});
assertEquals(1, obj.get('k'));
}
function testEventTypeCaseSensitivity() {
var obj = new ol.Object();
var lowercaseChangedMethodCalled = false;
obj.k_changed = function() {
lowercaseChangedMethodCalled = true;
};
var uppercaseChangedMethodCalled = false;
obj.K_changed = function() {
uppercaseChangedMethodCalled = true;
};
var lowercaseEventDispatched = false;
goog.events.listen(obj, 'k_changed', function() {
lowercaseEventDispatched = true;
});
var uppercaseEventDispatched = false;
goog.events.listen(obj, 'K_changed', function() {
uppercaseEventDispatched = true;
});
obj.set('K', 1);
assertTrue(lowercaseEventDispatched);
assertFalse(uppercaseEventDispatched);
assertFalse(lowercaseChangedMethodCalled);
assertTrue(uppercaseChangedMethodCalled);
}
+19
View File
@@ -0,0 +1,19 @@
goog.provide('ol.PixelBounds');
goog.require('goog.asserts');
goog.require('ol.Rectangle');
/**
* @constructor
* @extends {ol.Rectangle}
* @param {number} minX Minimum X.
* @param {number} minY Minimum Y.
* @param {number} maxX Maximum X.
* @param {number} maxY Maximum Y.
*/
ol.PixelBounds = function(minX, minY, maxX, maxY) {
goog.base(this, minX, minY, maxX, maxY);
};
goog.inherits(ol.PixelBounds, ol.Rectangle);
+374
View File
@@ -0,0 +1,374 @@
goog.provide('ol.Projection');
goog.require('goog.array');
goog.require('goog.asserts');
goog.require('goog.object');
goog.require('ol.Coordinate');
goog.require('ol.Extent');
goog.require('ol.TransformFunction');
/**
* @enum {string}
*/
ol.ProjectionUnits = {
DEGREES: 'degrees',
METERS: 'm'
};
/**
* @constructor
* @param {string} code Code.
* @param {ol.ProjectionUnits} units Units.
* @param {ol.Extent} extent Extent.
*/
ol.Projection = function(code, units, extent) {
/**
* @private
* @type {string}
*/
this.code_ = code;
/**
* @private
* @type {ol.ProjectionUnits}
*/
this.units_ = units;
/**
* @private
* @type {ol.Extent}
*/
this.extent_ = extent;
};
/**
* @return {string} Code.
*/
ol.Projection.prototype.getCode = function() {
return this.code_;
};
/**
* @return {ol.Extent} Extent.
*/
ol.Projection.prototype.getExtent = function() {
return this.extent_;
};
/**
* @return {ol.ProjectionUnits} Units.
*/
ol.Projection.prototype.getUnits = function() {
return this.units_;
};
/**
* @private
* @type {Object.<string, ol.Projection>}
*/
ol.Projection.projections_ = {};
/**
* @private
* @type {Object.<string, Object.<string, ol.TransformFunction>>}
*/
ol.Projection.transforms_ = {};
/**
* @param {Array.<ol.Projection>} projections Projections.
*/
ol.Projection.addEquivalentProjections = function(projections) {
ol.Projection.addProjections(projections);
goog.array.forEach(projections, function(source) {
goog.array.forEach(projections, function(destination) {
ol.Projection.addTransform(
source, destination, ol.Projection.cloneTransform);
});
});
};
/**
* @param {Array.<ol.Projection>} projections1 Projections.
* @param {Array.<ol.Projection>} projections2 Projections.
* @param {ol.TransformFunction} forwardTransform Forward transform.
* @param {ol.TransformFunction} inverseTransform Inverse transform.
*/
ol.Projection.addEquivalentTransforms =
function(projections1, projections2, forwardTransform, inverseTransform) {
goog.array.forEach(projections1, function(projection1) {
goog.array.forEach(projections2, function(projection2) {
ol.Projection.addTransform(projection1, projection2, forwardTransform);
ol.Projection.addTransform(projection2, projection1, inverseTransform);
});
});
};
/**
* @param {ol.Projection} projection Projection.
*/
ol.Projection.addProjection = function(projection) {
var projections = ol.Projection.projections_;
var code = projection.getCode();
goog.asserts.assert(!goog.object.containsKey(projections, code));
projections[code] = projection;
};
/**
* @param {Array.<ol.Projection>} projections Projections.
*/
ol.Projection.addProjections = function(projections) {
goog.array.forEach(projections, function(projection) {
ol.Projection.addProjection(projection);
});
};
/**
* @param {ol.Projection} source Source.
* @param {ol.Projection} destination Destination.
* @param {ol.TransformFunction} transform Transform.
*/
ol.Projection.addTransform = function(source, destination, transform) {
var projections = ol.Projection.projections_;
var sourceCode = source.getCode();
goog.asserts.assert(goog.object.containsKey(projections, sourceCode));
var destinationCode = destination.getCode();
goog.asserts.assert(goog.object.containsKey(projections, destinationCode));
var transforms = ol.Projection.transforms_;
if (!goog.object.containsKey(transforms, sourceCode)) {
transforms[sourceCode] = {};
}
goog.asserts.assert(
!goog.object.containsKey(transforms[sourceCode], destinationCode));
transforms[sourceCode][destinationCode] = transform;
};
/**
* @param {string} code Code.
* @return {ol.Projection} Projection.
*/
ol.Projection.getFromCode = function(code) {
var projections = ol.Projection.projections_;
goog.asserts.assert(goog.object.containsKey(projections, code));
return projections[code];
};
/**
* @param {ol.Projection} projection1 Projection 1.
* @param {ol.Projection} projection2 Projection 2.
* @return {boolean} Equivalent.
*/
ol.Projection.equivalent = function(projection1, projection2) {
if (projection1 === projection2) {
return true;
} else if (projection1.getUnits() != projection2.getUnits()) {
return false;
} else {
var transform = ol.Projection.getTransform(projection1, projection2);
return transform === ol.Projection.cloneTransform;
}
};
/**
* @param {ol.Projection} source Source.
* @param {ol.Projection} destination Destination.
* @return {ol.TransformFunction} Transform.
*/
ol.Projection.getTransform = function(source, destination) {
var transforms = ol.Projection.transforms_;
var sourceCode = source.getCode();
var destinationCode = destination.getCode();
goog.asserts.assert(goog.object.containsKey(transforms, sourceCode));
goog.asserts.assert(
goog.object.containsKey(transforms[sourceCode], destinationCode));
return transforms[sourceCode][destinationCode];
};
/**
* @param {string} sourceCode Source code.
* @param {string} destinationCode Destination code.
* @return {ol.TransformFunction} Transform.
*/
ol.Projection.getTransformFromCodes = function(sourceCode, destinationCode) {
var source = ol.Projection.getFromCode(sourceCode);
var destination = ol.Projection.getFromCode(destinationCode);
return ol.Projection.getTransform(source, destination);
};
/**
* @param {ol.Coordinate} point Point.
* @return {ol.Coordinate} Point.
*/
ol.Projection.identityTransform = function(point) {
return point;
};
/**
* @param {ol.Coordinate} point Point.
* @return {ol.Coordinate} Point.
*/
ol.Projection.cloneTransform = function(point) {
return point.clone();
};
/**
* @param {ol.Coordinate} point Point.
* @param {ol.Projection} source Source.
* @param {ol.Projection} destination Destination.
* @return {ol.Coordinate} Point.
*/
ol.Projection.transform = function(point, source, destination) {
var transform = ol.Projection.getTransform(source, destination);
return transform(point);
};
/**
* @param {ol.Coordinate} point Point.
* @param {string} sourceCode Source code.
* @param {string} destinationCode Destination code.
* @return {ol.Coordinate} Point.
*/
ol.Projection.transformWithCodes =
function(point, sourceCode, destinationCode) {
var transform = ol.Projection.getTransformFromCodes(
sourceCode, destinationCode);
return transform(point);
};
/**
* @const
* @type {number}
*/
ol.Projection.EPSG_3857_RADIUS = 6378137;
/**
* @param {ol.Coordinate} point Point.
* @return {ol.Coordinate} Point.
*/
ol.Projection.forwardSphericalMercator = function(point) {
var x = ol.Projection.EPSG_3857_RADIUS * Math.PI * point.x / 180;
var y = ol.Projection.EPSG_3857_RADIUS *
Math.log(Math.tan(Math.PI * (point.y + 90) / 360));
return new ol.Coordinate(x, y);
};
/**
* @param {ol.Coordinate} point Point.
* @return {ol.Coordinate} Point.
*/
ol.Projection.inverseSphericalMercator = function(point) {
var x = 180 * point.x / (ol.Projection.EPSG_3857_RADIUS * Math.PI);
var y = 360 * Math.atan(
Math.exp(point.y / ol.Projection.EPSG_3857_RADIUS)) / Math.PI - 90;
return new ol.Coordinate(x, y);
};
/**
* @const
* @type {number}
*/
ol.Projection.EPSG_3857_HALF_SIZE = Math.PI * ol.Projection.EPSG_3857_RADIUS;
/**
* @const
* @type {ol.Extent}
*/
ol.Projection.EPSG_3857_EXTENT = new ol.Extent(
-ol.Projection.EPSG_3857_HALF_SIZE,
-ol.Projection.EPSG_3857_HALF_SIZE,
ol.Projection.EPSG_3857_HALF_SIZE,
ol.Projection.EPSG_3857_HALF_SIZE);
/**
* @type {Array.<string>}
*/
ol.Projection.EPSG_3857_LIKE_CODES = [
'EPSG:3857',
'EPSG:102113',
'EPSG:102100',
'EPSG:900913'
];
/**
* @const
* @type {Array.<ol.Projection>}
*/
ol.Projection.EPSG_3857_LIKE_PROJECTIONS = goog.array.map(
ol.Projection.EPSG_3857_LIKE_CODES,
function(code) {
return new ol.Projection(
code,
ol.ProjectionUnits.METERS,
ol.Projection.EPSG_3857_EXTENT);
});
/**
* @const
* @type {ol.Extent}
*/
ol.Projection.EPSG_4326_EXTENT = new ol.Extent(-180, -90, 180, 90);
/**
* @type {Array.<string>}
*/
ol.Projection.EPSG_4326_LIKE_CODES = [
'EPSG:4326',
'CRS:84',
'urn:ogc:def:crs:EPSG:6.6:4326'
];
/**
* @const
* @type {Array.<ol.Projection>}
*/
ol.Projection.EPSG_4326_LIKE_PROJECTIONS = goog.array.map(
ol.Projection.EPSG_4326_LIKE_CODES,
function(code) {
return new ol.Projection(
code,
ol.ProjectionUnits.DEGREES,
ol.Projection.EPSG_4326_EXTENT);
});
ol.Projection.addEquivalentProjections(
ol.Projection.EPSG_3857_LIKE_PROJECTIONS);
ol.Projection.addEquivalentProjections(
ol.Projection.EPSG_4326_LIKE_PROJECTIONS);
ol.Projection.addEquivalentTransforms(
ol.Projection.EPSG_4326_LIKE_PROJECTIONS,
ol.Projection.EPSG_3857_LIKE_PROJECTIONS,
ol.Projection.forwardSphericalMercator,
ol.Projection.inverseSphericalMercator);
+87
View File
@@ -0,0 +1,87 @@
goog.require('goog.array');
goog.require('goog.testing.jsunit');
goog.require('ol.Coordinate');
goog.require('ol.Projection');
function _testAllEquivalent(codes) {
var projections = goog.array.map(codes, ol.Projection.getFromCode);
goog.array.forEach(projections, function(source) {
goog.array.forEach(projections, function(destination) {
assertTrue(ol.Projection.equivalent(source, destination));
});
});
}
function testEpsg3857Equivalence() {
_testAllEquivalent([
'EPSG:3857',
'EPSG:102100',
'EPSG:102113',
'EPSG:900913'
]);
}
function testEpsg4326Equivalence() {
_testAllEquivalent([
'CRS:84',
'urn:ogc:def:crs:EPSG:6.6:4326',
'EPSG:4326'
]);
}
function testIdentityTransform() {
var epsg4326 = ol.Projection.getFromCode('EPSG:4326');
var uniqueObject = {};
var sourcePoint = new ol.Coordinate(uniqueObject, uniqueObject);
var destinationPoint = ol.Projection.transform(
sourcePoint, epsg4326, epsg4326);
assertFalse(sourcePoint === destinationPoint);
assertTrue(destinationPoint.x === sourcePoint.x);
assertTrue(destinationPoint.y === sourcePoint.y);
}
function testForwardSphericalMercatorOrigin() {
var point = ol.Projection.transformWithCodes(
new ol.Coordinate(0, 0), 'EPSG:4326', 'EPSG:3857');
assertNotNullNorUndefined(point);
assertEquals(0, point.x);
assertRoughlyEquals(0, point.y, 1e-9);
}
function testInverseSphericalMercatorOrigin() {
var point = ol.Projection.transformWithCodes(
new ol.Coordinate(0, 0), 'EPSG:3857', 'EPSG:4326');
assertNotNullNorUndefined(point);
assertEquals(0, point.x);
assertEquals(0, point.y);
}
function testForwardSphericalMercatorAlastaira() {
// http://alastaira.wordpress.com/2011/01/23/the-google-maps-bing-maps-spherical-mercator-projection/
var point = ol.Projection.transformWithCodes(
new ol.Coordinate(-5.625, 52.4827802220782),
'EPSG:4326',
'EPSG:900913');
assertNotNullNorUndefined(point);
assertRoughlyEquals(-626172.13571216376, point.x, 1e-9);
assertRoughlyEquals(6887893.4928337997, point.y, 1e-9);
}
function testInverseSphericalMercatorAlastaira() {
// http://alastaira.wordpress.com/2011/01/23/the-google-maps-bing-maps-spherical-mercator-projection/
var point = ol.Projection.transformWithCodes(
new ol.Coordinate(-626172.13571216376, 6887893.4928337997),
'EPSG:900913',
'EPSG:4326');
assertNotNullNorUndefined(point);
assertRoughlyEquals(-5.625, point.x, 1e-9);
assertRoughlyEquals(52.4827802220782, point.y, 1e-9);
}
+124
View File
@@ -0,0 +1,124 @@
goog.provide('ol.Rectangle');
goog.require('goog.asserts');
goog.require('ol.Coordinate');
goog.require('ol.Size');
/**
* @constructor
* @param {number} minX Minimum X.
* @param {number} minY Minimum Y.
* @param {number} maxX Maximum X.
* @param {number} maxY Maximum Y.
*/
ol.Rectangle = function(minX, minY, maxX, maxY) {
goog.asserts.assert(minX <= maxX);
goog.asserts.assert(minY <= maxY);
/**
* @type {number}
*/
this.minX = minX;
/**
* @type {number}
*/
this.minY = minY;
/**
* @type {number}
*/
this.maxX = maxX;
/**
* @type {number}
*/
this.maxY = maxY;
};
/**
* @param {ol.Rectangle} rectangle1 Rectangle.
* @param {ol.Rectangle} rectangle2 Rectangle.
* @return {boolean} Intersects.
*/
ol.Rectangle.intersects = function(rectangle1, rectangle2) {
return rectangle1.minX <= rectangle2.maxX &&
rectangle1.maxX >= rectangle2.minX &&
rectangle1.minY <= rectangle2.maxY &&
rectangle1.maxY >= rectangle2.minY;
};
/**
* @return {ol.Rectangle} Clone.
*/
ol.Rectangle.prototype.clone = function() {
return new ol.Rectangle(this.minX, this.minY, this.maxX, this.maxY);
};
/**
* @param {ol.Coordinate} coordinate Coordinate.
* @return {boolean} Contains.
*/
ol.Rectangle.prototype.contains = function(coordinate) {
return this.minX <= coordinate.x && coordinate.x <= this.maxX &&
this.minY <= coordinate.y && coordinate.y <= this.maxY;
};
/**
* @return {ol.Coordinate} Center.
*/
ol.Rectangle.prototype.getCenter = function() {
return new ol.Coordinate(
(this.minX + this.maxX) / 2, (this.minY + this.maxY) / 2);
};
/**
* @return {number} Height.
*/
ol.Rectangle.prototype.getHeight = function() {
return this.maxY - this.minY;
};
/**
* @return {ol.Size} Size.
*/
ol.Rectangle.prototype.getSize = function() {
return new ol.Size(this.getWidth(), this.getHeight());
};
/**
* @return {number} Width.
*/
ol.Rectangle.prototype.getWidth = function() {
return this.maxX - this.minX;
};
/**
* @param {ol.Coordinate} coordinate Coordinate.
* @return {ol.Coordinate} Coordinate.
*/
ol.Rectangle.prototype.normalize = function(coordinate) {
return new ol.Coordinate(
(coordinate.x - this.minX) / this.getWidth(),
(coordinate.y - this.minY) / this.getHeight());
};
/**
* @return {string} String.
*/
ol.Rectangle.prototype.toString = function() {
return '(' + [this.minX, this.minY, this.maxX, this.maxY].join(', ') + ')';
};
+142
View File
@@ -0,0 +1,142 @@
goog.require('goog.testing.jsunit');
goog.require('ol.Coordinate');
goog.require('ol.Rectangle');
function testCenter() {
var rectangle = new ol.Rectangle(1, 2, 3, 4);
var center = rectangle.getCenter();
assertEquals(2, center.x);
assertEquals(3, center.y);
}
function testClone() {
var rectangle = new ol.Rectangle(1, 2, 3, 4);
var clonedRectangle = rectangle.clone();
assertTrue(clonedRectangle instanceof ol.Rectangle);
assertFalse(clonedRectangle === rectangle);
assertEquals(rectangle.minX, clonedRectangle.minX);
assertEquals(rectangle.minY, clonedRectangle.minY);
assertEquals(rectangle.maxX, clonedRectangle.maxX);
assertEquals(rectangle.maxY, clonedRectangle.maxY);
}
function testContainsPositive() {
var rectangle = new ol.Rectangle(1, 2, 3, 4);
assertTrue(rectangle.contains(new ol.Coordinate(1, 2)));
assertTrue(rectangle.contains(new ol.Coordinate(1, 3)));
assertTrue(rectangle.contains(new ol.Coordinate(1, 4)));
assertTrue(rectangle.contains(new ol.Coordinate(2, 2)));
assertTrue(rectangle.contains(new ol.Coordinate(2, 3)));
assertTrue(rectangle.contains(new ol.Coordinate(2, 4)));
assertTrue(rectangle.contains(new ol.Coordinate(3, 2)));
assertTrue(rectangle.contains(new ol.Coordinate(3, 3)));
assertTrue(rectangle.contains(new ol.Coordinate(3, 4)));
}
function testContainsNegative() {
var rectangle = new ol.Rectangle(1, 2, 3, 4);
assertFalse(rectangle.contains(new ol.Coordinate(0, 1)));
assertFalse(rectangle.contains(new ol.Coordinate(0, 2)));
assertFalse(rectangle.contains(new ol.Coordinate(0, 3)));
assertFalse(rectangle.contains(new ol.Coordinate(0, 4)));
assertFalse(rectangle.contains(new ol.Coordinate(0, 5)));
assertFalse(rectangle.contains(new ol.Coordinate(1, 1)));
assertFalse(rectangle.contains(new ol.Coordinate(1, 5)));
assertFalse(rectangle.contains(new ol.Coordinate(2, 1)));
assertFalse(rectangle.contains(new ol.Coordinate(2, 5)));
assertFalse(rectangle.contains(new ol.Coordinate(3, 1)));
assertFalse(rectangle.contains(new ol.Coordinate(3, 5)));
assertFalse(rectangle.contains(new ol.Coordinate(4, 1)));
assertFalse(rectangle.contains(new ol.Coordinate(4, 2)));
assertFalse(rectangle.contains(new ol.Coordinate(4, 3)));
assertFalse(rectangle.contains(new ol.Coordinate(4, 4)));
assertFalse(rectangle.contains(new ol.Coordinate(4, 5)));
}
function testIntersects() {
var rectangle1 = new ol.Rectangle(50, 50, 100, 100);
function assertIntersects(rectangle2) {
assertTrue(rectangle1 + ' expected to intersect ' + rectangle2,
ol.Rectangle.intersects(rectangle1, rectangle2));
}
function assertNotIntersects(rectangle2) {
assertFalse(rectangle1 + ' expected to not intersect ' + rectangle2,
ol.Rectangle.intersects(rectangle1, rectangle2));
}
assertIntersects(rectangle1);
assertIntersects(new ol.Rectangle(20, 20, 80, 80));
assertIntersects(new ol.Rectangle(20, 50, 80, 100));
assertIntersects(new ol.Rectangle(20, 80, 80, 120));
assertIntersects(new ol.Rectangle(50, 20, 100, 80));
assertIntersects(new ol.Rectangle(50, 80, 100, 120));
assertIntersects(new ol.Rectangle(80, 20, 120, 80));
assertIntersects(new ol.Rectangle(80, 50, 120, 100));
assertIntersects(new ol.Rectangle(80, 80, 120, 120));
assertIntersects(new ol.Rectangle(20, 20, 120, 120));
assertIntersects(new ol.Rectangle(70, 70, 80, 80));
assertNotIntersects(new ol.Rectangle(10, 10, 30, 30));
assertNotIntersects(new ol.Rectangle(30, 10, 70, 30));
assertNotIntersects(new ol.Rectangle(50, 10, 100, 30));
assertNotIntersects(new ol.Rectangle(80, 10, 120, 30));
assertNotIntersects(new ol.Rectangle(120, 10, 140, 30));
assertNotIntersects(new ol.Rectangle(10, 30, 30, 70));
assertNotIntersects(new ol.Rectangle(120, 30, 140, 70));
assertNotIntersects(new ol.Rectangle(10, 50, 30, 100));
assertNotIntersects(new ol.Rectangle(120, 50, 140, 100));
assertNotIntersects(new ol.Rectangle(10, 80, 30, 120));
assertNotIntersects(new ol.Rectangle(120, 80, 140, 120));
assertNotIntersects(new ol.Rectangle(10, 120, 30, 140));
assertNotIntersects(new ol.Rectangle(30, 120, 70, 140));
assertNotIntersects(new ol.Rectangle(50, 120, 100, 140));
assertNotIntersects(new ol.Rectangle(80, 120, 120, 140));
assertNotIntersects(new ol.Rectangle(120, 120, 140, 140));
}
function testSize() {
var rectangle = new ol.Rectangle(0, 1, 2, 4);
var size = rectangle.getSize();
assertEquals(2, size.width);
assertEquals(3, size.height);
}
function testNormalize() {
var rectangle = new ol.Rectangle(0, 1, 2, 3);
var coordinate;
coordinate = rectangle.normalize(new ol.Coordinate(1, 2));
assertEquals(0.5, coordinate.x);
assertEquals(0.5, coordinate.y);
coordinate = rectangle.normalize(new ol.Coordinate(0, 3));
assertEquals(0, coordinate.x);
assertEquals(1, coordinate.y);
coordinate = rectangle.normalize(new ol.Coordinate(2, 1));
assertEquals(1, coordinate.x);
assertEquals(0, coordinate.y);
coordinate = rectangle.normalize(new ol.Coordinate(0, 0));
assertEquals(0, coordinate.x);
assertEquals(-0.5, coordinate.y);
coordinate = rectangle.normalize(new ol.Coordinate(-1, 1));
assertEquals(-0.5, coordinate.x);
assertEquals(0, coordinate.y);
}
function testToString() {
var rectangle = new ol.Rectangle(0, 1, 2, 3);
assertEquals('(0, 1, 2, 3)', rectangle.toString());
}
+25
View File
@@ -0,0 +1,25 @@
goog.provide('ol.Size');
goog.require('goog.math.Size');
/**
* @constructor
* @extends {goog.math.Size}
* @param {number} width Width.
* @param {number} height Height.
*/
ol.Size = function(width, height) {
goog.base(this, width, height);
};
goog.inherits(ol.Size, goog.math.Size);
/**
* @param {ol.Size} size Size.
* @return {boolean} Equals.
*/
ol.Size.prototype.equals = function(size) {
return this.width == size.width && this.height == size.height;
};
+88
View File
@@ -0,0 +1,88 @@
goog.provide('ol.Store');
goog.require('ol.Extent');
goog.require('ol.Projection');
/**
* @constructor
* @param {ol.Projection} projection Projection.
* @param {ol.Extent=} opt_extent Extent.
* @param {string=} opt_attribution Attribution.
*/
ol.Store = function(projection, opt_extent, opt_attribution) {
/**
* @private
* @type {ol.Projection}
*/
this.projection_ = projection;
/**
* @private
* @type {ol.Extent}
*/
this.extent_ = goog.isDef(opt_extent) ? opt_extent : projection.getExtent();
/**
* @private
* @type {string|undefined}
*/
this.attribution_ = opt_attribution;
};
/**
* @return {string|undefined} Attribution.
*/
ol.Store.prototype.getAttribution = function() {
return this.attribution_;
};
/**
* @return {ol.Extent} Extent.
*/
ol.Store.prototype.getExtent = function() {
return this.extent_;
};
/**
* @return {ol.Projection} Projection.
*/
ol.Store.prototype.getProjection = function() {
return this.projection_;
};
/**
* @return {Array.<number>|undefined} Resolutions.
*/
ol.Store.prototype.getResolutions = goog.abstractMethod;
/**
* @param {string|undefined} attribution Attribution.
*/
ol.Store.prototype.setAttribution = function(attribution) {
this.attribution_ = attribution;
};
/**
* @param {ol.Extent} extent Extent.
*/
ol.Store.prototype.setExtent = function(extent) {
this.extent_ = extent;
};
/**
* @param {ol.Projection} projection Projetion.
*/
ol.Store.prototype.setProjection = function(projection) {
this.projection_ = projection;
};
+9
View File
@@ -0,0 +1,9 @@
goog.provide('ol.TransformFunction');
goog.require('ol.Coordinate');
/**
* @typedef {function(ol.Coordinate): ol.Coordinate}
*/
ol.TransformFunction;