Geometries inherit from ol.Observable

Because ol.Observable is now a struct, we have stricter type checking (hence the extra assertions).
This commit is contained in:
Tim Schaub
2013-12-13 14:18:10 -07:00
parent f1efb502ca
commit 5caa0eb659
5 changed files with 28 additions and 9 deletions

View File

@@ -3,9 +3,9 @@ goog.provide('ol.geom.GeometryEvent');
goog.provide('ol.geom.GeometryType'); goog.provide('ol.geom.GeometryType');
goog.require('goog.events.Event'); goog.require('goog.events.Event');
goog.require('goog.events.EventTarget');
goog.require('goog.object'); goog.require('goog.object');
goog.require('ol.Extent'); goog.require('ol.Extent');
goog.require('ol.Observable');
goog.require('ol.TransformFunction'); goog.require('ol.TransformFunction');
@@ -30,13 +30,13 @@ ol.geom.GeometryType = {
/** /**
* @constructor * @constructor
* @extends {goog.events.EventTarget} * @extends {ol.Observable}
* @todo stability experimental * @todo stability experimental
*/ */
ol.geom.Geometry = function() { ol.geom.Geometry = function() {
goog.base(this); goog.base(this);
}; };
goog.inherits(ol.geom.Geometry, goog.events.EventTarget); goog.inherits(ol.geom.Geometry, ol.Observable);
/** /**

View File

@@ -10,6 +10,7 @@ goog.require('ol.MapBrowserEvent');
goog.require('ol.MapBrowserEvent.EventType'); goog.require('ol.MapBrowserEvent.EventType');
goog.require('ol.geom.GeometryType'); goog.require('ol.geom.GeometryType');
goog.require('ol.geom.LineString'); goog.require('ol.geom.LineString');
goog.require('ol.geom.LinearRing');
goog.require('ol.geom.MultiLineString'); goog.require('ol.geom.MultiLineString');
goog.require('ol.geom.MultiPoint'); goog.require('ol.geom.MultiPoint');
goog.require('ol.geom.MultiPolygon'); goog.require('ol.geom.MultiPolygon');
@@ -209,6 +210,7 @@ ol.interaction.Draw.prototype.atFinish_ = function(event) {
if (this.mode_ === ol.interaction.DrawMode.LINESTRING) { if (this.mode_ === ol.interaction.DrawMode.LINESTRING) {
potentiallyDone = geometry.getCoordinates().length > 2; potentiallyDone = geometry.getCoordinates().length > 2;
} else if (this.mode_ === ol.interaction.DrawMode.POLYGON) { } else if (this.mode_ === ol.interaction.DrawMode.POLYGON) {
goog.asserts.assertInstanceof(geometry, ol.geom.Polygon);
potentiallyDone = geometry.getRings()[0].getCoordinates().length > 3; potentiallyDone = geometry.getRings()[0].getCoordinates().length > 3;
} }
if (potentiallyDone) { if (potentiallyDone) {
@@ -270,22 +272,29 @@ ol.interaction.Draw.prototype.modifyDrawing_ = function(event) {
var geometry = this.sketchFeature_.getGeometry(); var geometry = this.sketchFeature_.getGeometry();
var coordinates, last; var coordinates, last;
if (this.mode_ === ol.interaction.DrawMode.POINT) { if (this.mode_ === ol.interaction.DrawMode.POINT) {
goog.asserts.assertInstanceof(geometry, ol.geom.Point);
last = geometry.getCoordinates(); last = geometry.getCoordinates();
last[0] = coordinate[0]; last[0] = coordinate[0];
last[1] = coordinate[1]; last[1] = coordinate[1];
geometry.setCoordinates(last); geometry.setCoordinates(last);
} else { } else {
if (this.mode_ === ol.interaction.DrawMode.LINESTRING) { if (this.mode_ === ol.interaction.DrawMode.LINESTRING) {
goog.asserts.assertInstanceof(geometry, ol.geom.LineString);
coordinates = geometry.getCoordinates(); coordinates = geometry.getCoordinates();
} else if (this.mode_ === ol.interaction.DrawMode.POLYGON) { } else {
goog.asserts.assert(this.mode_ === ol.interaction.DrawMode.POLYGON);
goog.asserts.assertInstanceof(geometry, ol.geom.Polygon);
geometry = geometry.getRings()[0]; geometry = geometry.getRings()[0];
goog.asserts.assertInstanceof(geometry, ol.geom.LinearRing);
coordinates = geometry.getCoordinates(); coordinates = geometry.getCoordinates();
} }
if (this.atFinish_(event)) { if (this.atFinish_(event)) {
// snap to finish // snap to finish
coordinate = this.finishCoordinate_.slice(); coordinate = this.finishCoordinate_.slice();
} }
this.sketchPoint_.getGeometry().setCoordinates(coordinate); var point = this.sketchPoint_.getGeometry();
goog.asserts.assertInstanceof(point, ol.geom.Point);
point.setCoordinates(coordinate);
last = coordinates[coordinates.length - 1]; last = coordinates[coordinates.length - 1];
last[0] = coordinate[0]; last[0] = coordinate[0];
last[1] = coordinate[1]; last[1] = coordinate[1];
@@ -304,11 +313,13 @@ ol.interaction.Draw.prototype.addToDrawing_ = function(event) {
var geometry = this.sketchFeature_.getGeometry(); var geometry = this.sketchFeature_.getGeometry();
var coordinates, last; var coordinates, last;
if (this.mode_ === ol.interaction.DrawMode.LINESTRING) { if (this.mode_ === ol.interaction.DrawMode.LINESTRING) {
goog.asserts.assertInstanceof(geometry, ol.geom.LineString);
this.finishCoordinate_ = coordinate.slice(); this.finishCoordinate_ = coordinate.slice();
coordinates = geometry.getCoordinates(); coordinates = geometry.getCoordinates();
coordinates.push(coordinate.slice()); coordinates.push(coordinate.slice());
geometry.setCoordinates(coordinates); geometry.setCoordinates(coordinates);
} else if (this.mode_ === ol.interaction.DrawMode.POLYGON) { } else if (this.mode_ === ol.interaction.DrawMode.POLYGON) {
goog.asserts.assertInstanceof(geometry, ol.geom.Polygon);
var ring = geometry.getRings()[0]; var ring = geometry.getRings()[0];
coordinates = ring.getCoordinates(); coordinates = ring.getCoordinates();
coordinates.push(coordinate.slice()); coordinates.push(coordinate.slice());
@@ -329,10 +340,12 @@ ol.interaction.Draw.prototype.finishDrawing_ = function(event) {
var geometry = sketchFeature.getGeometry(); var geometry = sketchFeature.getGeometry();
var coordinates = geometry.getCoordinates(); var coordinates = geometry.getCoordinates();
if (this.mode_ === ol.interaction.DrawMode.LINESTRING) { if (this.mode_ === ol.interaction.DrawMode.LINESTRING) {
goog.asserts.assertInstanceof(geometry, ol.geom.LineString);
// remove the redundant last point // remove the redundant last point
coordinates.pop(); coordinates.pop();
geometry.setCoordinates(coordinates); geometry.setCoordinates(coordinates);
} else if (this.mode_ === ol.interaction.DrawMode.POLYGON) { } else if (this.mode_ === ol.interaction.DrawMode.POLYGON) {
goog.asserts.assertInstanceof(geometry, ol.geom.Polygon);
// force clockwise order for exterior ring // force clockwise order for exterior ring
sketchFeature.setGeometry(new ol.geom.Polygon(coordinates)); sketchFeature.setGeometry(new ol.geom.Polygon(coordinates));
} }

View File

@@ -339,8 +339,9 @@ ol.interaction.Modify.prototype.createOrUpdateVertexFeature_ =
this.vertexFeature_ = vertexFeature; this.vertexFeature_ = vertexFeature;
this.sketchLayer_.getVectorSource().addFeatures([vertexFeature]); this.sketchLayer_.getVectorSource().addFeatures([vertexFeature]);
} else { } else {
var geometry = vertexFeature.getGeometry(); var point = vertexFeature.getGeometry();
geometry.setCoordinates(coordinates); goog.asserts.assertInstanceof(point, ol.geom.Point);
point.setCoordinates(coordinates);
} }
if (this.sketchLayer_.getStyle() !== style) { if (this.sketchLayer_.getStyle() !== style) {
this.sketchLayer_.setStyle(style); this.sketchLayer_.setStyle(style);
@@ -505,6 +506,7 @@ ol.interaction.Modify.prototype.insertVertex_ =
var segment = segmentData.segment; var segment = segmentData.segment;
var feature = segmentData.feature; var feature = segmentData.feature;
var geometry = segmentData.geometry; var geometry = segmentData.geometry;
goog.asserts.assertInstanceof(geometry, ol.geom.LineString);
var index = segmentData.index; var index = segmentData.index;
var coordinates = geometry.getCoordinates(); var coordinates = geometry.getCoordinates();
coordinates.splice(index + 1, 0, vertex); coordinates.splice(index + 1, 0, vertex);

View File

@@ -274,6 +274,7 @@ ol.renderer.canvas.Vector.prototype.renderPointFeatures_ =
} }
for (j = 0, jj = components.length; j < jj; ++j) { for (j = 0, jj = components.length; j < jj; ++j) {
point = components[j]; point = components[j];
goog.asserts.assertInstanceof(point, ol.geom.Point);
vec = [point.get(0), point.get(1), 0]; vec = [point.get(0), point.get(1), 0];
goog.vec.Mat4.multVec3(this.transform_, vec, vec); goog.vec.Mat4.multVec3(this.transform_, vec, vec);
context.drawImage(content, Math.round(vec[0] + xOffset), context.drawImage(content, Math.round(vec[0] + xOffset),
@@ -406,6 +407,7 @@ ol.renderer.canvas.Vector.prototype.renderPolygonFeatures_ =
} }
for (j = 0, jj = components.length; j < jj; ++j) { for (j = 0, jj = components.length; j < jj; ++j) {
poly = components[j]; poly = components[j];
goog.asserts.assertInstanceof(poly, ol.geom.Polygon);
rings = poly.getRings(); rings = poly.getRings();
numRings = rings.length; numRings = rings.length;
if (numRings > 0) { if (numRings > 0) {
@@ -537,9 +539,11 @@ ol.renderer.canvas.Vector.getLabelVectors = function(geometry) {
} }
var type = geometry.getType(); var type = geometry.getType();
if (type == ol.geom.GeometryType.POINT) { if (type == ol.geom.GeometryType.POINT) {
goog.asserts.assertInstanceof(geometry, ol.geom.Point);
return [[geometry.get(0), geometry.get(1), 0]]; return [[geometry.get(0), geometry.get(1), 0]];
} }
if (type == ol.geom.GeometryType.POLYGON) { if (type == ol.geom.GeometryType.POLYGON) {
goog.asserts.assertInstanceof(geometry, ol.geom.Polygon);
var coordinates = geometry.getInteriorPoint(); var coordinates = geometry.getInteriorPoint();
return [[coordinates[0], coordinates[1], 0]]; return [[coordinates[0], coordinates[1], 0]];
} }

View File

@@ -6,7 +6,7 @@ describe('ol.geom.Geometry', function() {
it('creates a new geometry', function() { it('creates a new geometry', function() {
var geom = new ol.geom.Geometry(); var geom = new ol.geom.Geometry();
expect(geom).to.be.a(ol.geom.Geometry); expect(geom).to.be.a(ol.geom.Geometry);
expect(geom).to.be.a(goog.events.EventTarget); expect(geom).to.be.a(ol.Observable);
}); });
}); });
@@ -45,7 +45,7 @@ describe('ol.geom.GeometryEvent', function() {
}); });
goog.require('goog.events.Event'); goog.require('goog.events.Event');
goog.require('goog.events.EventTarget'); goog.require('ol.Observable');
goog.require('ol.geom.Geometry'); goog.require('ol.geom.Geometry');
goog.require('ol.geom.GeometryEvent'); goog.require('ol.geom.GeometryEvent');
goog.require('ol.geom.Point'); goog.require('ol.geom.Point');