Fire change events for multi-part geometries

This commit is contained in:
ahocevar
2013-10-04 23:36:16 -06:00
parent 703564fcbb
commit 52552c9b18
19 changed files with 253 additions and 114 deletions

View File

@@ -1,7 +1,9 @@
goog.provide('ol.geom.AbstractCollection');
goog.require('goog.events.EventType');
goog.require('ol.extent');
goog.require('ol.geom.Geometry');
goog.require('ol.geom.GeometryEvent');
@@ -16,6 +18,7 @@ ol.geom.AbstractCollection = function() {
/**
* @type {Array.<ol.geom.Geometry>}
* @protected
*/
this.components = null;
@@ -45,6 +48,14 @@ ol.geom.AbstractCollection.prototype.getBounds = function() {
};
/**
* @return {Array.<ol.geom.Geometry>} Components.
*/
ol.geom.AbstractCollection.prototype.getComponents = function() {
return this.components;
};
/**
* @inheritDoc
*/
@@ -64,6 +75,26 @@ ol.geom.AbstractCollection.prototype.getCoordinates = function() {
ol.geom.AbstractCollection.prototype.getType = goog.abstractMethod;
/**
* Listener for ring change events.
* @param {ol.geom.GeometryEvent} evt Geometry event.
* @protected
*/
ol.geom.AbstractCollection.prototype.handleComponentChange = function(evt) {
this.bounds = null;
var oldExtent = ol.extent.createEmpty();
var components = this.components;
for (var i = components.length - 1; i >= 0; --i) {
var component = components[i];
ol.extent.extend(oldExtent,
component === evt.target && !goog.isNull(evt.oldExtent) ?
evt.oldExtent : component.getBounds());
}
this.dispatchEvent(new ol.geom.GeometryEvent(goog.events.EventType.CHANGE,
this, oldExtent));
};
/**
* @inheritDoc
*/

View File

@@ -1,6 +1,8 @@
goog.provide('ol.geom.GeometryCollection');
goog.require('goog.asserts');
goog.require('goog.events');
goog.require('goog.events.EventType');
goog.require('ol.geom.AbstractCollection');
goog.require('ol.geom.Geometry');
goog.require('ol.geom.GeometryType');
@@ -18,8 +20,14 @@ goog.require('ol.geom.GeometryType');
ol.geom.GeometryCollection = function(geometries) {
goog.base(this);
for (var i = geometries.length - 1; i >= 0; --i) {
goog.events.listen(geometries[i], goog.events.EventType.CHANGE,
this.handleComponentChange, false, this);
}
/**
* @type {Array.<ol.geom.Geometry>}
* @protected
*/
this.components = geometries;
@@ -27,6 +35,19 @@ ol.geom.GeometryCollection = function(geometries) {
goog.inherits(ol.geom.GeometryCollection, ol.geom.AbstractCollection);
/**
* @inheritDoc
*/
ol.geom.GeometryCollection.prototype.clone = function() {
var numComponents = this.components.length;
var components = new Array(numComponents);
for (var i = 0; i < numComponents; ++i) {
components[i] = this.components[i];
}
return new ol.geom.GeometryCollection(components);
};
/**
* @inheritDoc
*/

View File

@@ -1,6 +1,8 @@
goog.provide('ol.geom.MultiLineString');
goog.require('goog.asserts');
goog.require('goog.events');
goog.require('goog.events.EventType');
goog.require('ol.CoordinateArray');
goog.require('ol.geom.AbstractCollection');
goog.require('ol.geom.GeometryType');
@@ -21,10 +23,14 @@ ol.geom.MultiLineString = function(coordinates) {
/**
* @type {Array.<ol.geom.LineString>}
* @protected
*/
this.components = new Array(numParts);
for (var i = 0; i < numParts; ++i) {
this.components[i] = new ol.geom.LineString(coordinates[i]);
var component = new ol.geom.LineString(coordinates[i]);
this.components[i] = component;
goog.events.listen(component, goog.events.EventType.CHANGE,
this.handleComponentChange, false, this);
}
};

View File

@@ -1,6 +1,8 @@
goog.provide('ol.geom.MultiPoint');
goog.require('goog.asserts');
goog.require('goog.events');
goog.require('goog.events.EventType');
goog.require('ol.CoordinateArray');
goog.require('ol.geom.AbstractCollection');
goog.require('ol.geom.GeometryType');
@@ -21,10 +23,14 @@ ol.geom.MultiPoint = function(coordinates) {
/**
* @type {Array.<ol.geom.Point>}
* @protected
*/
this.components = new Array(numParts);
for (var i = 0; i < numParts; ++i) {
this.components[i] = new ol.geom.Point(coordinates[i]);
var component = new ol.geom.Point(coordinates[i]);
this.components[i] = component;
goog.events.listen(component, goog.events.EventType.CHANGE,
this.handleComponentChange, false, this);
}
};

View File

@@ -1,6 +1,8 @@
goog.provide('ol.geom.MultiPolygon');
goog.require('goog.asserts');
goog.require('goog.events');
goog.require('goog.events.EventType');
goog.require('ol.CoordinateArray');
goog.require('ol.geom.AbstractCollection');
goog.require('ol.geom.GeometryType');
@@ -22,10 +24,14 @@ ol.geom.MultiPolygon = function(coordinates) {
/**
* @type {Array.<ol.geom.Polygon>}
* @protected
*/
this.components = new Array(numParts);
for (var i = 0; i < numParts; ++i) {
this.components[i] = new ol.geom.Polygon(coordinates[i]);
var component = new ol.geom.Polygon(coordinates[i]);
this.components[i] = component;
goog.events.listen(component, goog.events.EventType.CHANGE,
this.handleComponentChange, false, this);
}
};

View File

@@ -315,8 +315,9 @@ ol.parser.GeoJSON.prototype.encodeGeometry_ = function(geometry) {
*/
ol.parser.GeoJSON.prototype.encodeGeometryCollection_ = function(collection) {
var geometries = [];
for (var i = 0, ii = collection.components.length; i < ii; ++i) {
geometries.push(this.encodeGeometry_(collection.components[i]));
var components = collection.getComponents();
for (var i = 0, ii = components.length; i < ii; ++i) {
geometries.push(this.encodeGeometry_(components[i]));
}
return /** @type {GeoJSONGeometryCollection} */({
type: 'GeometryCollection',

View File

@@ -159,8 +159,9 @@ ol.parser.GPX = function(opt_options) {
if (geom instanceof ol.geom.LineString) {
this.writeNode('trkseg', feature.getGeometry(), undefined, node);
} else if (geom instanceof ol.geom.MultiLineString) {
for (i = 0, ii = geom.components.length; i < ii; ++i) {
this.writeNode('trkseg', geom.components[i], undefined, node);
var components = geom.getComponents();
for (i = 0, ii = components.length; i < ii; ++i) {
this.writeNode('trkseg', components[i], undefined, node);
}
} else if (geom instanceof ol.geom.Polygon) {
rings = geom.getRings();

View File

@@ -823,8 +823,9 @@ ol.parser.KML = function(opt_options) {
},
'MultiGeometry': function(geometry) {
var node = this.createElementNS('MultiGeometry');
for (var i = 0, ii = geometry.components.length; i < ii; ++i) {
this.writeNode('_geometry', geometry.components[i], null, node);
var components = geometry.getComponents();
for (var i = 0, ii = components.length; i < ii; ++i) {
this.writeNode('_geometry', components[i], null, node);
}
return node;
},

View File

@@ -340,8 +340,9 @@ ol.parser.ogc.GML = function(opt_options) {
},
'MultiPoint': function(geometry) {
var node = this.createElementNS('gml:MultiPoint');
for (var i = 0, ii = geometry.components.length; i < ii; ++i) {
this.writeNode('pointMember', geometry.components[i], null, node);
var components = geometry.getComponents();
for (var i = 0, ii = components.length; i < ii; ++i) {
this.writeNode('pointMember', components[i], null, node);
}
return node;
},
@@ -352,9 +353,9 @@ ol.parser.ogc.GML = function(opt_options) {
},
'MultiLineString': function(geometry) {
var node = this.createElementNS('gml:MultiLineString');
for (var i = 0, ii = geometry.components.length; i < ii; ++i) {
this.writeNode('lineStringMember', geometry.components[i], null,
node);
var components = geometry.getComponents();
for (var i = 0, ii = components.length; i < ii; ++i) {
this.writeNode('lineStringMember', components[i], null, node);
}
return node;
},
@@ -365,8 +366,9 @@ ol.parser.ogc.GML = function(opt_options) {
},
'MultiPolygon': function(geometry) {
var node = this.createElementNS('gml:MultiPolygon');
for (var i = 0, ii = geometry.components.length; i < ii; ++i) {
this.writeNode('polygonMember', geometry.components[i], null, node);
var components = geometry.getComponents();
for (var i = 0, ii = components.length; i < ii; ++i) {
this.writeNode('polygonMember', components[i], null, node);
}
return node;
},
@@ -377,8 +379,9 @@ ol.parser.ogc.GML = function(opt_options) {
},
'GeometryCollection': function(geometry) {
var node = this.createElementNS('gml:GeometryCollection');
for (var i = 0, ii = geometry.components.length; i < ii; ++i) {
this.writeNode('geometryMember', geometry.components[i], null, node);
var components = geometry.getComponents();
for (var i = 0, ii = components.length; i < ii; ++i) {
this.writeNode('geometryMember', components[i], null, node);
}
return node;
},

View File

@@ -349,8 +349,9 @@ ol.parser.ogc.GML_v3 = function(opt_options) {
},
'MultiCurve': function(geometry) {
var node = this.createElementNS('gml:MultiCurve');
for (var i = 0, len = geometry.components.length; i < len; ++i) {
this.writeNode('curveMember', geometry.components[i], null, node);
var components = geometry.getComponents();
for (var i = 0, len = components.length; i < len; ++i) {
this.writeNode('curveMember', components[i], null, node);
}
return node;
},
@@ -365,8 +366,9 @@ ol.parser.ogc.GML_v3 = function(opt_options) {
},
'MultiSurface': function(geometry) {
var node = this.createElementNS('gml:MultiSurface');
for (var i = 0, len = geometry.components.length; i < len; ++i) {
this.writeNode('surfaceMember', geometry.components[i], null, node);
var components = geometry.getComponents();
for (var i = 0, len = components.length; i < len; ++i) {
this.writeNode('surfaceMember', components[i], null, node);
}
return node;
},

View File

@@ -171,8 +171,9 @@ ol.parser.WKT.prototype.encodePoint_ = function(geom) {
*/
ol.parser.WKT.prototype.encodeMultiPoint_ = function(geom) {
var array = [];
for (var i = 0, ii = geom.components.length; i < ii; ++i) {
array.push('(' + this.encodePoint_.apply(this, [geom.components[i]]) + ')');
var components = geom.getComponents();
for (var i = 0, ii = components.length; i < ii; ++i) {
array.push('(' + this.encodePoint_.apply(this, [components[i]]) + ')');
}
return array.join(',');
};
@@ -185,8 +186,9 @@ ol.parser.WKT.prototype.encodeMultiPoint_ = function(geom) {
*/
ol.parser.WKT.prototype.encodeGeometryCollection_ = function(geom) {
var array = [];
for (var i = 0, ii = geom.components.length; i < ii; ++i) {
array.push(this.encode_.apply(this, [geom.components[i]]));
var components = geom.getComponents();
for (var i = 0, ii = components.length; i < ii; ++i) {
array.push(this.encode_.apply(this, [components[i]]));
}
return array.join(',');
};
@@ -214,9 +216,10 @@ ol.parser.WKT.prototype.encodeLineString_ = function(geom) {
*/
ol.parser.WKT.prototype.encodeMultiLineString_ = function(geom) {
var array = [];
for (var i = 0, ii = geom.components.length; i < ii; ++i) {
var components = geom.getComponents();
for (var i = 0, ii = components.length; i < ii; ++i) {
array.push('(' + this.encodeLineString_.apply(this,
[geom.components[i]]) + ')');
[components[i]]) + ')');
}
return array.join(',');
};
@@ -245,9 +248,9 @@ ol.parser.WKT.prototype.encodePolygon_ = function(geom) {
*/
ol.parser.WKT.prototype.encodeMultiPolygon_ = function(geom) {
var array = [];
for (var i = 0, ii = geom.components.length; i < ii; ++i) {
array.push('(' + this.encodePolygon_.apply(this,
[geom.components[i]]) + ')');
var components = geom.getComponents();
for (var i = 0, ii = components.length; i < ii; ++i) {
array.push('(' + this.encodePolygon_.apply(this, [components[i]]) + ')');
}
return array.join(',');
};

View File

@@ -172,7 +172,7 @@ ol.renderer.canvas.Vector.prototype.renderLineStringFeatures_ =
} else {
goog.asserts.assert(geometry instanceof ol.geom.MultiLineString,
'Expected MultiLineString');
components = geometry.components;
components = geometry.getComponents();
}
for (j = 0, jj = components.length; j < jj; ++j) {
line = components[j];
@@ -256,7 +256,7 @@ ol.renderer.canvas.Vector.prototype.renderPointFeatures_ =
} else {
goog.asserts.assert(geometry instanceof ol.geom.MultiPoint,
'Expected MultiPoint');
components = geometry.components;
components = geometry.getComponents();
}
for (j = 0, jj = components.length; j < jj; ++j) {
point = components[j];
@@ -358,7 +358,7 @@ ol.renderer.canvas.Vector.prototype.renderPolygonFeatures_ =
} else {
goog.asserts.assert(geometry instanceof ol.geom.MultiPolygon,
'Expected MultiPolygon');
components = geometry.components;
components = geometry.getComponents();
}
for (j = 0, jj = components.length; j < jj; ++j) {
poly = components[j];
@@ -472,7 +472,7 @@ ol.renderer.canvas.Vector.renderCircle_ = function(circle) {
*/
ol.renderer.canvas.Vector.getLabelVectors = function(geometry) {
if (geometry instanceof ol.geom.AbstractCollection) {
var components = geometry.components;
var components = geometry.getComponents();
var numComponents = components.length;
var result = [];
for (var i = 0; i < numComponents; ++i) {