diff --git a/demo/hello.html b/demo/hello-compiled.html
similarity index 100%
rename from demo/hello.html
rename to demo/hello-compiled.html
diff --git a/demo/hello.json b/demo/hello-compiled.json
similarity index 99%
rename from demo/hello.json
rename to demo/hello-compiled.json
index 6578a75419..5cab96f3ea 100644
--- a/demo/hello.json
+++ b/demo/hello-compiled.json
@@ -25,7 +25,6 @@
// "generateExports": true
// },
-
"checks": {
// acceptable values are "ERROR", "WARNING", and "OFF"
"accessControls": "WARNING",
diff --git a/demo/hello-epi.json b/demo/hello-epi-compiled.json
similarity index 95%
rename from demo/hello-epi.json
rename to demo/hello-epi-compiled.json
index 9c4046a0cc..ac42ce4866 100644
--- a/demo/hello-epi.json
+++ b/demo/hello-epi-compiled.json
@@ -4,8 +4,7 @@
"output-file": "hello-epi-compiled.js",
"inputs": [
- "hello-epi.js",
- "../src/ol.js"
+ "hello-epi.js"
],
"paths": [
"../src"
diff --git a/demo/hello-epi.js b/demo/hello-epi.js
index b63eb18fa3..2b6ba9467f 100644
--- a/demo/hello-epi.js
+++ b/demo/hello-epi.js
@@ -1,8 +1,14 @@
/* This is a code which is going to be compiled together with the library */
+goog.require('ol.Map');
+goog.require('ol.layer.OSM');
+goog.require('ol.Loc');
+
+goog.require('goog.dom');
+
function init() {
- var map = new ol.Map()
- // .render('map')
+ var map = new ol.Map();
+ map.setContainer(goog.dom.getElement('map'));
map.setLayers( [ new ol.layer.OSM() ] );
map.setCenter( new ol.Loc(45, 5));
map.setZoom(10);
diff --git a/demo/hello.js b/demo/hello.js
index 08fcfadbed..90cfcae4e1 100644
--- a/demo/hello.js
+++ b/demo/hello.js
@@ -2,9 +2,9 @@
function init() {
var map = ol.map()
- .render('map')
+ .renderTo('map')
.layers([ol.layer.osm()])
.center([45, 5])
.zoom(10);
}
-window['init'] = init;
\ No newline at end of file
+window['init'] = init;
diff --git a/src/api/geom/collection.js b/src/api/geom/collection.js
index c1405e7e78..9a93ead0c4 100644
--- a/src/api/geom/collection.js
+++ b/src/api/geom/collection.js
@@ -1,7 +1,7 @@
-goog.provide('ol.geom.collection');
+goog.provide('ol.geom.collection');
goog.require('ol.geom.Collection');
-goog.require('ol.geom.point');
+goog.require('ol.geom.point');
goog.require('ol.projection');
/**
@@ -10,11 +10,11 @@ goog.require('ol.projection');
* @return {ol.geom.Collection} Collection.
*/
ol.geom.collection = function(opt_arg){
-
+
if (opt_arg instanceof ol.geom.Collection) {
return opt_arg;
}
-
+
var components = [];
if (arguments.length == 1 && goog.isDef(opt_arg)) {
if (goog.isArray(opt_arg)) {
@@ -35,7 +35,7 @@ ol.geom.collection = function(opt_arg){
throw new Error('ol.geom.collection');
}
}
-
+
var c = new ol.geom.Collection(components);
return c;
};
@@ -50,7 +50,7 @@ ol.geom.Collection.prototype.components = function(opt_arg){
if (arguments.length == 1 && goog.isDef(opt_arg)) {
var components = [],
allValid = false;
-
+
allValid = goog.array.every(opt_arg, function(geom){
if (geom instanceof ol.geom.Geometry) {
components.push(geom);
@@ -90,23 +90,23 @@ ol.geom.Collection.prototype.add = function(geom, opt_index){
* @export
* @param {Array.
} components Some point specifications.
* @param {number=} opt_index An optional index to add the components at. If not
- * provided, the components will be added to the end of the list of
+ * provided, the components will be added to the end of the list of
* components.
* @return {ol.geom.Collection} The Collection instance.
*/
ol.geom.Collection.prototype.addAll = function(components, opt_index){
var index = this.components_.length;
-
+
if (arguments.length == 2 && goog.isDef(opt_index)) {
index = opt_index;
}
-
+
goog.array.every(components, function(c){
this.addComponent(c, index);
index++;
return true;
}, this);
-
+
return this;
};
@@ -128,6 +128,6 @@ ol.geom.Collection.prototype.remove = function(components){
this.removeComponent(c);
return true;
}, this);
-
+
return this;
};
diff --git a/src/api/geom/geometry.js b/src/api/geom/geometry.js
index 6a636cc839..5d8b9d09b9 100644
--- a/src/api/geom/geometry.js
+++ b/src/api/geom/geometry.js
@@ -1,4 +1,4 @@
-goog.provide('ol.geom.geometry');
+goog.provide('ol.geom.geometry');
goog.require('ol.geom.Geometry');
@@ -14,7 +14,7 @@ ol.geom.geometry = function(){
/**
* @export
* @param {ol.Bounds=} opt_arg new Bounds.
- * @return {ol.geom.Geometry|ol.Bounds|undefined} either a Geometry (when used as
+ * @return {ol.geom.Geometry|ol.Bounds|undefined} either a Geometry (when used as
* setter) or a Bounds/undefined (if used as getter).
*/
ol.geom.Geometry.prototype.bounds = function(opt_arg) {
@@ -24,3 +24,12 @@ ol.geom.Geometry.prototype.bounds = function(opt_arg) {
return this.getBounds();
}
};
+
+/**
+ * Returns the centroid of the geometry.
+ *
+ * @returns {ol.geom.Point} The centroid of the geometry.
+ */
+ol.geom.Geometry.prototype.centroid = function() {
+ return this.getCentroid();
+};
\ No newline at end of file
diff --git a/src/api/geom/linestring.js b/src/api/geom/linestring.js
index 61c0ee28a6..a3c3bc3431 100644
--- a/src/api/geom/linestring.js
+++ b/src/api/geom/linestring.js
@@ -1,7 +1,7 @@
-goog.provide('ol.geom.linestring');
+goog.provide('ol.geom.linestring');
goog.require('ol.geom.LineString');
-goog.require('ol.geom.point');
+goog.require('ol.geom.point');
goog.require('ol.projection');
/**
@@ -10,11 +10,11 @@ goog.require('ol.projection');
* @return {ol.geom.LineString} LineString.
*/
ol.geom.linestring = function(opt_arg){
-
+
if (opt_arg instanceof ol.geom.LineString) {
return opt_arg;
}
-
+
var vertices = [];
if (arguments.length == 1 && goog.isDef(opt_arg)) {
if (goog.isArray(opt_arg)) {
@@ -36,7 +36,7 @@ ol.geom.linestring = function(opt_arg){
throw new Error('ol.geom.linestring');
}
}
-
+
var ls = new ol.geom.LineString(vertices);
return ls;
};
@@ -99,18 +99,18 @@ ol.geom.LineString.prototype.add = function(vertex, opt_index){
ol.geom.LineString.prototype.addAll = function(vertices, opt_index){
var index = this.vertices_.length,
v;
-
+
if (arguments.length == 2 && goog.isDef(opt_index)) {
index = opt_index;
}
-
+
goog.array.every(vertices, function(vertexSpec){
v = ol.geom.point(vertexSpec);
this.addVertex(v, index);
index++;
return true;
}, this);
-
+
return this;
};
diff --git a/src/api/geom/multipoint.js b/src/api/geom/multipoint.js
index e72af8c3c7..5ca6ec317e 100644
--- a/src/api/geom/multipoint.js
+++ b/src/api/geom/multipoint.js
@@ -1,8 +1,8 @@
-goog.provide('ol.geom.multipoint');
+goog.provide('ol.geom.multipoint');
goog.require('ol.geom.MultiPoint');
-goog.require('ol.geom.point');
-goog.require('ol.geom.collection');
+goog.require('ol.geom.point');
+goog.require('ol.geom.collection');
goog.require('ol.projection');
/**
@@ -11,11 +11,11 @@ goog.require('ol.projection');
* @return {ol.geom.MultiPoint} MultiPoint.
*/
ol.geom.multipoint = function(opt_arg){
-
+
if (opt_arg instanceof ol.geom.MultiPoint) {
return opt_arg;
}
-
+
var points = [];
if (arguments.length == 1 && goog.isDef(opt_arg)) {
if (goog.isArray(opt_arg)) {
@@ -37,7 +37,7 @@ ol.geom.multipoint = function(opt_arg){
throw new Error('ol.geom.multipoint');
}
}
-
+
var mp = new ol.geom.MultiPoint(points);
return mp;
};
@@ -99,18 +99,18 @@ ol.geom.MultiPoint.prototype.add = function(point, opt_index){
ol.geom.MultiPoint.prototype.addAll = function(points, opt_index){
var index = this.getPoints().length,
p;
-
+
if (arguments.length == 2 && goog.isDef(opt_index)) {
index = opt_index;
}
-
+
goog.array.every(points, function(pointSpec){
p = ol.geom.point(pointSpec);
this.addPoint(p, index);
index++;
return true;
}, this);
-
+
return this;
};
@@ -132,6 +132,6 @@ ol.geom.MultiPoint.prototype.remove = function(points){
this.removePoint(p);
return true;
}, this);
-
+
return this;
};
diff --git a/src/api/geom/point.js b/src/api/geom/point.js
index 601ea2e047..bf8434b243 100644
--- a/src/api/geom/point.js
+++ b/src/api/geom/point.js
@@ -1,4 +1,4 @@
-goog.provide('ol.geom.point');
+goog.provide('ol.geom.point');
goog.require('ol.geom.Point');
goog.require('ol.projection');
@@ -14,23 +14,23 @@ ol.PointLike;
* @return {ol.geom.Point} Point.
*/
ol.geom.point = function(opt_arg){
-
+
if (opt_arg instanceof ol.geom.Point) {
return opt_arg;
}
-
+
var x = 0;
var y = 0;
var z;
var projection;
-
+
if (arguments.length == 1 && goog.isDef(opt_arg)) {
if (goog.isArray(opt_arg)) {
x = opt_arg[0];
y = opt_arg[1];
z = opt_arg[2];
projection = opt_arg[3];
-
+
} else if (goog.isObject(opt_arg)) {
x = opt_arg['x'];
y = opt_arg['y'];
@@ -43,7 +43,7 @@ ol.geom.point = function(opt_arg){
if (goog.isDef(projection)) {
projection = ol.projection(projection);
}
-
+
var p = new ol.geom.Point(x,y,z,projection);
return p;
};
@@ -110,4 +110,13 @@ ol.geom.Point.prototype.projection = function(opt_arg){
else {
return this.getProjection();
}
-};
\ No newline at end of file
+};
+
+/**
+ * Returns the centroid of this point; which is a clone of the point itself.
+ *
+ * @return {ol.geom.Point} The centroid.
+ */
+ol.geom.Point.prototype.centroid = function() {
+ return this.getCentroid();
+};
diff --git a/src/ol.export.js b/src/ol.export.js
index 042f8ea6e4..7299dd456a 100644
--- a/src/ol.export.js
+++ b/src/ol.export.js
@@ -59,6 +59,7 @@ goog.exportProperty(ol.Feature.prototype, 'geometry', ol.Feature.prototype.geome
goog.exportSymbol('ol.geom.geometry', ol.geom.geometry);
goog.exportSymbol('ol.geom.Geometry', ol.geom.Geometry);
goog.exportProperty(ol.geom.Geometry.prototype, 'bounds', ol.geom.Geometry.prototype.bounds);
+goog.exportProperty(ol.geom.Geometry.prototype, 'centroid', ol.geom.Geometry.prototype.centroid);
// ol.geom.collection
goog.exportSymbol('ol.geom.collection', ol.geom.collection);
@@ -67,6 +68,7 @@ goog.exportProperty(ol.geom.Collection.prototype, 'components', ol.geom.Collecti
goog.exportProperty(ol.geom.Collection.prototype, 'add', ol.geom.Collection.prototype.add);
goog.exportProperty(ol.geom.Collection.prototype, 'addAll', ol.geom.Collection.prototype.addAll);
goog.exportProperty(ol.geom.Collection.prototype, 'remove', ol.geom.Collection.prototype.remove);
+goog.exportProperty(ol.geom.Collection.prototype, 'centroid', ol.geom.Collection.prototype.centroid);
// ol.geom.point
goog.exportSymbol('ol.geom.point', ol.geom.point);
@@ -75,6 +77,7 @@ goog.exportProperty(ol.geom.Point.prototype, 'x', ol.geom.Point.prototype.x);
goog.exportProperty(ol.geom.Point.prototype, 'y', ol.geom.Point.prototype.y);
goog.exportProperty(ol.geom.Point.prototype, 'z', ol.geom.Point.prototype.z);
goog.exportProperty(ol.geom.Point.prototype, 'projection', ol.geom.Point.prototype.projection);
+goog.exportProperty(ol.geom.Point.prototype, 'centroid', ol.geom.Point.prototype.centroid);
// ol.geom.linestring
goog.exportSymbol('ol.geom.linestring', ol.geom.linestring);
@@ -83,6 +86,7 @@ goog.exportProperty(ol.geom.LineString.prototype, 'vertices', ol.geom.LineString
goog.exportProperty(ol.geom.LineString.prototype, 'add', ol.geom.LineString.prototype.add);
goog.exportProperty(ol.geom.LineString.prototype, 'addAll', ol.geom.LineString.prototype.addAll);
goog.exportProperty(ol.geom.LineString.prototype, 'remove', ol.geom.LineString.prototype.remove);
+goog.exportProperty(ol.geom.LineString.prototype, 'centroid', ol.geom.LineString.prototype.centroid);
// ol.geom.multipoint
goog.exportSymbol('ol.geom.multipoint', ol.geom.multipoint);
@@ -91,6 +95,7 @@ goog.exportProperty(ol.geom.MultiPoint.prototype, 'points', ol.geom.MultiPoint.p
goog.exportProperty(ol.geom.MultiPoint.prototype, 'add', ol.geom.MultiPoint.prototype.add);
goog.exportProperty(ol.geom.MultiPoint.prototype, 'addAll', ol.geom.MultiPoint.prototype.addAll);
goog.exportProperty(ol.geom.MultiPoint.prototype, 'remove', ol.geom.MultiPoint.prototype.remove);
+goog.exportProperty(ol.geom.MultiPoint.prototype, 'centroid', ol.geom.MultiPoint.prototype.centroid);
// LOOKUP FOR DYNMICALLY REGISTERED CONTROLS DOES NOT RUN WELL NOW IN THE ADVANCED MODE
// HACK TO PUSH COMPILER TO NOT STRIP THE NAVIGATION CONTROL. TO BE FIXED.
diff --git a/src/ol/Bounds.js b/src/ol/Bounds.js
index 36b40e3086..3d77562522 100644
--- a/src/ol/Bounds.js
+++ b/src/ol/Bounds.js
@@ -53,7 +53,7 @@ ol.Bounds.prototype.setProjection = function(projection) {
ol.Bounds.prototype.intersects = function(bounds) {
var otherProj = bounds.getProjection();
if (!goog.isNull(otherProj) && !goog.isNull(this.projection_)) {
- bounds = bounds.transform(this.projection_);
+ bounds = bounds.doTransform(this.projection_);
}
return goog.base(this, "intersects", bounds.toUnreferencedBounds());
};
@@ -70,13 +70,13 @@ ol.Bounds.prototype.doTransform = function(proj) {
throw new Error("Bounds must have a projection before transforming.");
}
var tl = new ol.Loc(
- this.minX_, this.maxY_, undefined, this.projection_).transform(proj);
+ this.minX_, this.maxY_, undefined, this.projection_).doTransform(proj);
var tr = new ol.Loc(
- this.maxX_, this.maxY_, undefined, this.projection_).transform(proj);
+ this.maxX_, this.maxY_, undefined, this.projection_).doTransform(proj);
var bl = new ol.Loc(
- this.minX_, this.minY_, undefined, this.projection_).transform(proj);
+ this.minX_, this.minY_, undefined, this.projection_).doTransform(proj);
var br = new ol.Loc(
- this.maxX_, this.minY_, undefined, this.projection_).transform(proj);
+ this.maxX_, this.minY_, undefined, this.projection_).doTransform(proj);
var x = [tl.getX(), tr.getX(), bl.getX(), br.getX()].sort();
var y = [tl.getY(), tr.getY(), bl.getY(), br.getY()].sort();
diff --git a/src/ol/Map.js b/src/ol/Map.js
index 6bc045c1c0..fae064f055 100644
--- a/src/ol/Map.js
+++ b/src/ol/Map.js
@@ -143,7 +143,7 @@ ol.Map.DEFAULT_CONTROLS = ["navigation"];
*/
ol.Map.prototype.getCenter = function() {
var proj = this.getUserProjection();
- return this.center_.transform(proj);
+ return this.center_.doTransform(proj);
};
@@ -271,7 +271,7 @@ ol.Map.prototype.setCenter = function(center) {
proj = this.getUserProjection();
center.setProjection(proj);
}
- this.center_ = center.transform(this.getProjection());
+ this.center_ = center.doTransform(this.getProjection());
};
diff --git a/src/ol/Tile.js b/src/ol/Tile.js
index 838c592c2d..fe3b715d47 100644
--- a/src/ol/Tile.js
+++ b/src/ol/Tile.js
@@ -9,9 +9,9 @@ goog.require('ol.event.Events');
* The Tile class.
* @constructor
* @param {string} url
- * @param {ol.Bounds} bounds
+ * @param {ol.Bounds|undefined} opt_bounds
*/
-ol.Tile = function(url, bounds) {
+ol.Tile = function(url, opt_bounds) {
/**
* @private
@@ -21,9 +21,9 @@ ol.Tile = function(url, bounds) {
/**
* @private
- * @type {ol.Bounds}
+ * @type {ol.Bounds|undefined}
*/
- this.bounds_ = bounds;
+ this.bounds_ = opt_bounds;
/**
* @private
@@ -66,7 +66,7 @@ ol.Tile.prototype.createImage = function() {
* Load the tile. A tile should loaded only once.
*/
ol.Tile.prototype.load = function() {
- goog.asserts.assert(!this.loaded && this.loading_);
+ goog.asserts.assert(!this.loaded && !this.loading_);
this.loading_ = true;
this.img_.src = this.url_;
};
@@ -81,7 +81,7 @@ ol.Tile.prototype.getUrl = function() {
/**
* Get the tile bounds.
- * @return {ol.Bounds}
+ * @return {ol.Bounds|undefined}
*/
ol.Tile.prototype.getBounds = function() {
return this.bounds_;
@@ -155,15 +155,15 @@ ol.Tile.createImage = (function() {
* for the tiles.
* @param {number} width
* @param {number} height
- * @return {function(new:ol.Tile, string, ol.Bounds)}
+ * @return {function(new:ol.Tile, string, ol.Bounds=)}
*/
ol.Tile.createConstructor = function(width, height) {
/**
* @constructor
* @extends {ol.Tile}
*/
- var Tile = function(url, bounds) {
- goog.base(this, url, bounds);
+ var Tile = function(url, opt_bounds) {
+ goog.base(this, url, opt_bounds);
};
goog.inherits(Tile, ol.Tile);
/** @inheritDoc */
diff --git a/src/ol/event/Events.js b/src/ol/event/Events.js
index d333176e1e..ca65cf4438 100644
--- a/src/ol/event/Events.js
+++ b/src/ol/event/Events.js
@@ -219,6 +219,8 @@ ol.event.Events.prototype.unregister = function(type, listener, opt_scope) {
*
* @param {string} type The type of the event to trigger.
* @param {Object=} opt_evt The event object that will be passed to listeners.
+ * This object will always have a 'type' property with the event type and
+ * an 'object' property referencing this Events instance.
*
* @return {boolean} The last listener return. If a listener returns false,
* the chain of listeners will stop getting called.
@@ -228,8 +230,9 @@ ol.event.Events.prototype.triggerEvent = function(type, opt_evt) {
listeners = goog.events.getListeners(this, type, true)
.concat(goog.events.getListeners(this, type, false));
if (arguments.length === 1) {
- opt_evt = {type: type};
+ opt_evt = {'type': type};
}
+ opt_evt['object'] = this.object_;
for (var i=0, ii=listeners.length; i} components An array of components.
- *
+ *
* @constructor
*/
ol.geom.Collection = function(components) {
-
+
/**
* @private
* @type {Array.}
@@ -23,19 +23,19 @@ ol.geom.Collection = function(components) {
this.typeBlacklist_ = [
ol.geom.Collection
];
-
+
/**
* @private
* @type {Array.}
*/
this.typeWhitelist_ = [];
-
+
/**
* @private
* @type {Array.}
*/
this.components_ = [];
-
+
if (arguments.length === 1 && goog.isDef(components)) {
this.setComponents(components);
}
@@ -44,14 +44,14 @@ ol.geom.Collection = function(components) {
goog.inherits(ol.geom.Collection, ol.geom.Geometry);
/**
- * Sets the list of disallowed types for the collection.
+ * Sets the list of disallowed types for the collection.
* @param {Array.} typeBlacklist Array of constructors to disallow.
*/
ol.geom.Collection.prototype.setTypeBlacklist = function(typeBlacklist){
this.typeBlacklist_ = typeBlacklist;
};
/**
- * Gets the list of disallowed types for the collection.
+ * Gets the list of disallowed types for the collection.
* @return {Array.} Array of constructors to disallow.
*/
ol.geom.Collection.prototype.getTypeBlacklist = function(){
@@ -59,14 +59,14 @@ ol.geom.Collection.prototype.getTypeBlacklist = function(){
};
/**
- * Sets the list of always allowed types for the collection.
+ * Sets the list of always allowed types for the collection.
* @param {Array.} typeWhitelist Array of constructors to allow.
*/
ol.geom.Collection.prototype.setTypeWhitelist = function(typeWhitelist){
this.typeWhitelist_ = typeWhitelist;
};
/**
- * Gets the list of always allowed types for the collection.
+ * Gets the list of always allowed types for the collection.
* @return {Array.} Array of constructors to allow.
*/
ol.geom.Collection.prototype.getTypeWhitelist = function(){
@@ -76,7 +76,7 @@ ol.geom.Collection.prototype.getTypeWhitelist = function(){
/**
* Sets the Collection's components.
- *
+ *
* @return {Array.} An array of components.
*/
ol.geom.Collection.prototype.getComponents = function() {
@@ -85,12 +85,12 @@ ol.geom.Collection.prototype.getComponents = function() {
/**
* Gets the Collection's components.
- *
+ *
* @param {Array.} components An array of components.
*/
ol.geom.Collection.prototype.setComponents = function(components) {
var allValidTypes = goog.array.every(
- components,
+ components,
this.isAllowedComponent,
this
);
@@ -105,7 +105,7 @@ ol.geom.Collection.prototype.setComponents = function(components) {
/**
* Adds the given component to the list of components at the specified index.
- *
+ *
* @param {ol.geom.Geometry} component A component to be added.
* @param {number} index The index where to add.
*/
@@ -121,14 +121,14 @@ ol.geom.Collection.prototype.addComponent = function(component, index) {
/**
* Checks whether the passed component is an instance of any of the constructors
* listed in the passed list.
- *
+ *
* @param {ol.geom.Geometry} component The component to check.
- * @param {Array.} list The List of constructors to check the
+ * @param {Array.} list The List of constructors to check the
* component against.
- *
- * @return {boolean} Whether the passed component is an instance of any of the
+ *
+ * @return {boolean} Whether the passed component is an instance of any of the
* constructors listed in the passed list.
- *
+ *
* @private
*/
ol.geom.Collection.prototype.isOnList = function(component, list) {
@@ -143,9 +143,9 @@ ol.geom.Collection.prototype.isOnList = function(component, list) {
};
/**
- * Checks whether the passed component is allowed according to the black and
+ * Checks whether the passed component is allowed according to the black and
* whitelists.
- *
+ *
* @param {ol.geom.Geometry} component The component to check.
* @return {boolean} Whether the passed component is allowed as part of this
* collection according to black- and whitelist.
@@ -160,9 +160,30 @@ ol.geom.Collection.prototype.isAllowedComponent = function(component){
/**
* Removes the given component from the list of components.
- *
+ *
* @param {ol.geom.Geometry} component A component to be removed.
*/
ol.geom.Collection.prototype.removeComponent = function(component) {
goog.array.remove(this.components_, component);
};
+
+/**
+ * Compute the centroid for this geometry collection.
+ *
+ * @returns {ol.geom.Point} The centroid of the collection.
+ */
+ol.geom.Collection.prototype.getCentroid = function() {
+ var components = this.getComponents(),
+ len = components.length,
+ sum_x = 0, sum_y = 0,
+ centroid = null;
+ if (len > 0) {
+ goog.array.forEach(components, function(component){
+ var singleCentroid = component.getCentroid();
+ sum_x += singleCentroid.getX();
+ sum_y += singleCentroid.getX();
+ });
+ centroid = new ol.geom.Point(sum_x / len, sum_y / len);
+ }
+ return centroid;
+};
\ No newline at end of file
diff --git a/src/ol/geom/Geometry.js b/src/ol/geom/Geometry.js
index 9378df6ebc..2ed4420624 100644
--- a/src/ol/geom/Geometry.js
+++ b/src/ol/geom/Geometry.js
@@ -1,15 +1,17 @@
-goog.provide('ol.geom.Geometry');
+goog.provide('ol.geom.Geometry');
+goog.require('ol.geom.IGeometry');
goog.require('ol.Bounds');
/**
* Creates ol.Geometry objects.
- *
+ *
* @export
+ * @implements {ol.geom.IGeometry}
* @constructor
*/
ol.geom.Geometry = function() {
-
+
/**
* @private
* @type {ol.Bounds|undefined}
@@ -34,10 +36,23 @@ ol.geom.Geometry.prototype.setBounds = function(bounds) {
};
/**
- * @returns ol.Loc
+ * Returns the centroid of the geometry.
+ *
+ * @returns {ol.geom.Point} The centroid of the geometry.
*/
ol.geom.Geometry.prototype.getCentroid = function() {
- //FIXME: stub only to get popups working
- return new ol.Loc(-76,45);
+ // throw an error to enforce subclasses to implement it properly
+ ol.error('ol.geom.Geometry: getCentroid must be implemented by subclasses');
+ return null;
};
+/**
+ * Returns the area of the geometry.
+ *
+ * @returns {number} The area of the geometry.
+ */
+ol.geom.Geometry.prototype.getArea = function() {
+ // throw an error to enforce subclasses to implement it properly
+ ol.error('ol.geom.Geometry: getArea must be implemented by subclasses');
+ return 0;
+};
diff --git a/src/ol/geom/IGeometry.js b/src/ol/geom/IGeometry.js
new file mode 100644
index 0000000000..2245be339c
--- /dev/null
+++ b/src/ol/geom/IGeometry.js
@@ -0,0 +1,27 @@
+goog.provide('ol.geom.IGeometry');
+
+//goog.require('ol.geom.Point');
+//goog.require('ol.Bounds');
+
+/**
+ * Interface for geometry classes forcing ol.geom.* classes to implement
+ * expected functionality.
+ *
+ * @interface
+ */
+ol.geom.IGeometry = function(){};
+
+/**
+ * @return {ol.geom.Point} The centroid of the geometry.
+ */
+ol.geom.IGeometry.prototype.getCentroid = function(){};
+
+/**
+ * @return {ol.Bounds|undefined} The centroid of the geometry.
+ */
+ol.geom.IGeometry.prototype.getBounds = function(){};
+
+/**
+ * @return {number} The area of the geometry.
+ */
+ol.geom.IGeometry.prototype.getArea = function(){};
\ No newline at end of file
diff --git a/src/ol/geom/LineString.js b/src/ol/geom/LineString.js
index af8a857659..23f6e8eb0c 100644
--- a/src/ol/geom/LineString.js
+++ b/src/ol/geom/LineString.js
@@ -2,17 +2,18 @@ goog.provide('ol.geom.LineString');
goog.require('goog.array');
goog.require('ol.geom.Geometry');
+goog.require('ol.geom.Collection');
goog.require('ol.geom.Point');
goog.require('ol.Projection');
/**
- * Creates ol.geom.LineString objects.
- *
+ * Creates ol.geom.LineString objects.
+ *
* @export
* @extends {ol.geom.Geometry}
- * @param {Array.} vertices An array of points building the
+ * @param {Array.} vertices An array of points building the
* linestrings vertices.
- *
+ *
* @constructor
*/
ol.geom.LineString = function(vertices) {
@@ -21,14 +22,14 @@ ol.geom.LineString = function(vertices) {
* @type {Array.}
*/
this.vertices_ = vertices;
-
+
};
goog.inherits(ol.geom.LineString, ol.geom.Geometry);
/**
* Sets the LineString's points.
- *
+ *
* @return {Array.} An array of points.
*/
ol.geom.LineString.prototype.getVertices = function() {
@@ -37,7 +38,7 @@ ol.geom.LineString.prototype.getVertices = function() {
/**
* Gets the LineString's points.
- *
+ *
* @param {Array.} vertices An array of points.
*/
ol.geom.LineString.prototype.setVertices = function(vertices) {
@@ -46,7 +47,7 @@ ol.geom.LineString.prototype.setVertices = function(vertices) {
/**
* Adds the given vertex to the list of vertices at the specified index.
- *
+ *
* @param {ol.geom.Point} vertex A point to be added.
* @param {number} index The index where to add.
*/
@@ -56,9 +57,20 @@ ol.geom.LineString.prototype.addVertex = function(vertex, index) {
/**
* Removes the given vertex from the list of vertices.
- *
+ *
* @param {ol.geom.Point} vertex A point to be removed.
*/
ol.geom.LineString.prototype.removeVertex = function(vertex) {
goog.array.remove(this.vertices_, vertex);
};
+
+/**
+ * Compute the centroid for this linestring.
+ *
+ * @returns {ol.geom.Point} The centroid of the linestring.
+ */
+ol.geom.LineString.prototype.getCentroid = function() {
+ var vertices = this.getVertices(),
+ collection = new ol.geom.Collection(vertices);
+ return collection.getCentroid();
+};
\ No newline at end of file
diff --git a/src/ol/geom/MultiPoint.js b/src/ol/geom/MultiPoint.js
index d271c17740..31db595017 100644
--- a/src/ol/geom/MultiPoint.js
+++ b/src/ol/geom/MultiPoint.js
@@ -4,12 +4,12 @@ goog.require('goog.array');
goog.require('ol.geom.Collection');
/**
- * Creates ol.geom.MultiPoint objects.
- *
+ * Creates ol.geom.MultiPoint objects.
+ *
* @export
* @extends {ol.geom.Collection}
* @param {Array.} points An array of points.
- *
+ *
* @constructor
*/
ol.geom.MultiPoint = function(points) {
@@ -18,14 +18,14 @@ ol.geom.MultiPoint = function(points) {
if (arguments.length === 1 && goog.isDef(points)) {
this.setPoints(points);
}
-
+
};
goog.inherits(ol.geom.MultiPoint, ol.geom.Collection);
/**
* Sets the MultiPoint's points.
- *
+ *
* @return {Array.} An array of points.
*/
ol.geom.MultiPoint.prototype.getPoints = function() {
@@ -34,7 +34,7 @@ ol.geom.MultiPoint.prototype.getPoints = function() {
/**
* Gets the MultiPoint's points.
- *
+ *
* @param {Array.} points An array of points.
*/
ol.geom.MultiPoint.prototype.setPoints = function(points) {
@@ -43,7 +43,7 @@ ol.geom.MultiPoint.prototype.setPoints = function(points) {
/**
* Adds the given point to the list of points at the specified index.
- *
+ *
* @param {ol.geom.Point} point A point to be added.
* @param {number} index The index where to add.
*/
@@ -53,7 +53,7 @@ ol.geom.MultiPoint.prototype.addPoint = function(point, index) {
/**
* Removes the given point from the list of points.
- *
+ *
* @param {ol.geom.Point} point A point to be removed.
*/
ol.geom.MultiPoint.prototype.removePoint = function(point) {
diff --git a/src/ol/geom/Point.js b/src/ol/geom/Point.js
index bcc4d07b78..c1471b3809 100644
--- a/src/ol/geom/Point.js
+++ b/src/ol/geom/Point.js
@@ -7,17 +7,17 @@ goog.require('ol.coord.AccessorInterface');
goog.require('ol.base');
/**
- * Creates ol.geom.Point objects.
- *
+ * Creates ol.geom.Point objects.
+ *
* @export
* @extends {ol.geom.Geometry}
* @param {number} x X.
* @param {number} y Y.
* @param {number=} opt_z Z.
* @param {ol.Projection=} opt_projection Projection.
- *
+ *
* @implements {ol.coord.AccessorInterface}
- *
+ *
* @constructor
*/
ol.geom.Point = function(x, y, opt_z, opt_projection) {
@@ -26,19 +26,19 @@ ol.geom.Point = function(x, y, opt_z, opt_projection) {
* @type {number}
*/
this.x_ = x;
-
+
/**
* @private
* @type {number}
*/
this.y_ = y;
-
+
/**
* @private
* @type {number|undefined}
*/
this.z_ = opt_z;
-
+
/**
* @private
* @type {ol.Projection}
@@ -109,12 +109,12 @@ ol.geom.Point.prototype.setZ = function(z) {
};
/**
- * Transform this point to another coordinate reference system. This
+ * Transform this point to another coordinate reference system. This
* requires that this point has a projection set already (if not, an error
* will be thrown). Returns a new point object and does not modify this
* point.
*
- * @param {string|!ol.Projection} proj The destination projection. Can be
+ * @param {string|!ol.Projection} proj The destination projection. Can be
* supplied as a projection instance of a string identifier.
* @returns {!ol.geom.Point} A new location.
*/
@@ -140,7 +140,24 @@ ol.geom.Point.prototype._transform = function(proj) {
ol.error(msg);
}
ol.Projection.transform(point, sourceProj, proj);
-
+
return new ol.geom.Point(point['x'], point['y'], this.z_, proj);
};
+/**
+ * Returns the centroid of the point.
+ *
+ * @returns {ol.geom.Point} The centroid of the point.
+ */
+ol.geom.Point.prototype.getCentroid = function() {
+ return new ol.geom.Point(this.x_, this.y_, this.z_, this.projection_);
+};
+
+/**
+ * Returns the area of the geometry whcih is always 0.
+ *
+ * @returns {number} The area of the point (always 0).
+ */
+ol.geom.Point.prototype.getArea = function() {
+ return 0;
+};
diff --git a/src/ol/layer/TileLayer.js b/src/ol/layer/TileLayer.js
index 29164f7960..19af4a20db 100644
--- a/src/ol/layer/TileLayer.js
+++ b/src/ol/layer/TileLayer.js
@@ -42,7 +42,7 @@ ol.layer.TileLayer = function() {
/**
* @protected
- * @type {function(new:ol.Tile, string, ol.Bounds)}
+ * @type {function(new:ol.Tile, string, ol.Bounds=)}
*/
this.Tile = ol.Tile.createConstructor(this.tileWidth_, this.tileHeight_);
@@ -62,7 +62,7 @@ ol.layer.TileLayer = function() {
* @private
* @type {string}
*/
- this.tileOriginCorner_ = 'bl';
+ this.tileOriginCorner_ = 'tl';
/**
* @private
@@ -70,6 +70,18 @@ ol.layer.TileLayer = function() {
*/
this.maxResolution_ = undefined;
+ /**
+ * @private
+ * @type {boolean}
+ */
+ this.xRight_ = true;
+
+ /**
+ * @private
+ * @type {boolean}
+ */
+ this.yDown_ = true;
+
/**
* @private
* @type {number|undefined}
@@ -92,6 +104,33 @@ ol.layer.TileLayer = function() {
goog.inherits(ol.layer.TileLayer, ol.layer.Layer);
+/**
+ * @return {boolean} The tile index increases from left to right.
+ */
+ol.layer.TileLayer.prototype.getXRight = function() {
+ return this.xRight_;
+};
+
+/**
+ * @return {boolean} The tile index increases from top to bottom.
+ */
+ol.layer.TileLayer.prototype.getYDown = function() {
+ return this.yDown_;
+};
+
+/**
+ * @param {boolean} right The tile index increases from left to right.
+ */
+ol.layer.TileLayer.prototype.setXRight = function(right) {
+ this.xRight_ = right;
+};
+
+/**
+ * @param {boolean} down The tile index increases from top to bottom.
+ */
+ol.layer.TileLayer.prototype.setYDown = function(down) {
+ this.yDown_ = down;
+};
/**
* Get layer extent. Return null if the layer has no extent
@@ -172,7 +211,7 @@ ol.layer.TileLayer.prototype.getMaxResolution = function() {
if (!goog.isNull(extent)) {
this.maxResolution_ = Math.max(
(extent.getMaxX() - extent.getMinX()) / this.tileWidth_,
- (extent.getMaxY() - extent.getMaxX()) / this.tileHeight_);
+ (extent.getMaxY() - extent.getMinY()) / this.tileHeight_);
}
}
return this.maxResolution_;
@@ -285,6 +324,25 @@ ol.layer.TileLayer.prototype.getTile = function(url, bounds) {
return tile;
};
+/**
+ * Get a tile from the cache, or create a tile and add to
+ * the cache.
+ * @param {number} x
+ * @param {number} y
+ * @param {number} z
+ */
+ol.layer.TileLayer.prototype.getTileForXYZ = function(x, y, z) {
+ var url = this.url_.replace('{x}', x + '')
+ .replace('{y}', y + '')
+ .replace('{z}', z + '');
+ var tile = this.cache_.get(url);
+ if (!goog.isDef(tile)) {
+ tile = new this.Tile(url);
+ this.cache_.set(tile.getUrl(), tile);
+ }
+ return tile;
+};
+
/**
* Get data from the layer. This is the layer's main API function.
* @param {ol.Bounds} bounds
diff --git a/src/ol/renderer/TileLayerRenderer.js b/src/ol/renderer/TileLayerRenderer.js
index 0ea501e38b..df7e66098e 100644
--- a/src/ol/renderer/TileLayerRenderer.js
+++ b/src/ol/renderer/TileLayerRenderer.js
@@ -26,6 +26,12 @@ ol.renderer.TileLayerRenderer = function(container, layer) {
* @private
*/
this.rendererdBounds_ = null;
+
+ /**
+ * @type {Array.}
+ */
+ this.layerResolutions_ = layer.getResolutions();
+
/**
* @type {number|undefined}
@@ -43,7 +49,27 @@ ol.renderer.TileLayerRenderer = function(container, layer) {
goog.inherits(ol.renderer.TileLayerRenderer, ol.renderer.LayerRenderer);
-
+/**
+ * @param {number} resolution
+ * @return {Array.}
+ */
+ol.renderer.TileLayerRenderer.prototype.getPreferredResAndZ_ = function(resolution) {
+ var minDiff = Number.POSITIVE_INFINITY;
+ var candidate, diff, z, r;
+ for (var i=0, ii=this.layerResolutions_.length; i