From 1c3b839a6ff188ba6ca62f9be3f70c497b8c438b Mon Sep 17 00:00:00 2001 From: ahocevar Date: Sat, 9 Nov 2013 15:17:10 +0100 Subject: [PATCH] Use new setCoordinates methods --- src/ol/geom/point.js | 8 +++ src/ol/interaction/modifyinteraction.js | 69 +++++++++++++------------ src/ol/layer/vectorlayer.js | 20 ------- 3 files changed, 44 insertions(+), 53 deletions(-) diff --git a/src/ol/geom/point.js b/src/ol/geom/point.js index b11f862858..6e9574b737 100644 --- a/src/ol/geom/point.js +++ b/src/ol/geom/point.js @@ -95,3 +95,11 @@ ol.geom.Point.prototype.transform = function(transform) { transform(coordinates, coordinates, coordinates.length); this.setCoordinates(coordinates); // for change event }; + + +/** + * @inheritDoc + */ +ol.geom.Point.prototype.invalidateBounds = function() { + this.bounds_ = null; +}; diff --git a/src/ol/interaction/modifyinteraction.js b/src/ol/interaction/modifyinteraction.js index 98c1fed05a..ae5a6b65a1 100644 --- a/src/ol/interaction/modifyinteraction.js +++ b/src/ol/interaction/modifyinteraction.js @@ -1,6 +1,7 @@ goog.provide('ol.interaction.Modify'); goog.require('goog.array'); +goog.require('goog.asserts'); goog.require('goog.events'); goog.require('goog.object'); goog.require('ol.Feature'); @@ -15,7 +16,7 @@ goog.require('ol.geom.Point'); goog.require('ol.geom.Polygon'); goog.require('ol.interaction.Drag'); goog.require('ol.layer.Vector'); -goog.require('ol.layer.VectorLayerEventType'); +goog.require('ol.layer.VectorEventType'); goog.require('ol.layer.VectorLayerRenderIntent'); goog.require('ol.structs.RTree'); @@ -91,11 +92,12 @@ ol.interaction.Modify.prototype.addIndex_ = function(layer, features) { /** * Listen for feature additions. - * @param {ol.layer.VectorLayerEventObject} evt Event object. + * @param {ol.layer.VectorEvent} evt Event object. * @private */ ol.interaction.Modify.prototype.handleFeaturesAdded_ = function(evt) { - this.addIndex_(evt.target, evt.features); + goog.asserts.assertInstanceof(evt.target, ol.layer.Vector); + this.addIndex_(/** @type {ol.layer.Vector} */ (evt.target), evt.features); }; @@ -117,10 +119,10 @@ ol.interaction.Modify.prototype.addLayer = function(layer) { this.addIndex_(selectionLayer, goog.object.getValues(selectionData.selectedFeaturesByFeatureUid)); - goog.events.listen(selectionLayer, ol.layer.VectorLayerEventType.ADD, + goog.events.listen(selectionLayer, ol.layer.VectorEventType.ADD, this.handleFeaturesAdded_, false, this); - goog.events.listen(selectionLayer, ol.layer.VectorLayerEventType.REMOVE, - this.removeIndex, false, this); + goog.events.listen(selectionLayer, ol.layer.VectorEventType.REMOVE, + this.handleFeaturesRemoved_, false, this); }; @@ -158,9 +160,10 @@ ol.interaction.Modify.prototype.addSegments_ = rTree.insert(ol.extent.boundingExtent(segment), segmentData, uid); } } else if (geometry instanceof ol.geom.Polygon) { - for (var j = 0, jj = geometry.rings.length; j < jj; ++j) { - this.addSegments_(selectionLayer, feature, geometry.rings[j], - [geometry.rings, j]); + var rings = geometry.getRings(); + for (var j = 0, jj = rings.length; j < jj; ++j) { + this.addSegments_(selectionLayer, feature, rings[j], + [rings, j]); } } }; @@ -226,10 +229,10 @@ ol.interaction.Modify.prototype.handleDrag = function(evt) { var segmentData = dragSegment[1]; var feature = segmentData[1]; var geometry = segmentData[2]; + var coordinates = geometry.getCoordinates(); var index = dragSegment[2]; - geometry.set(segmentData[3] + index, 0, vertex[0]); - geometry.set(segmentData[3] + index, 1, vertex[1]); - feature.getGeometry().invalidateBounds(); + coordinates[segmentData[3] + index] = vertex; + geometry.setCoordinates(coordinates); var editData = selectionLayer.getEditData(); var vertexFeature = editData.vertexFeature; @@ -237,12 +240,9 @@ ol.interaction.Modify.prototype.handleDrag = function(evt) { var segment = segmentData[0]; editData.rTree.remove(ol.extent.boundingExtent(segment), segmentData); segment[index] = vertex; - vertexGeometry.set(0, vertex[0]); - vertexGeometry.set(1, vertex[1]); + vertexGeometry.setCoordinates(vertex); editData.rTree.insert(ol.extent.boundingExtent(segment), segmentData, goog.getUid(feature)); - - selectionLayer.updateFeatures([feature, vertexFeature]); } }; @@ -293,7 +293,7 @@ ol.interaction.Modify.prototype.handleMouseMove_ = function(evt) { var selectionLayer = layer.getSelectionData().layer; if (!goog.isNull(selectionLayer)) { var listener = goog.events.getListener(selectionLayer, - ol.layer.VectorLayerEventType.ADD, + ol.layer.VectorEventType.ADD, this.handleFeaturesAdded_, false, this); if (goog.isNull(listener)) { this.addLayer(layer); @@ -308,21 +308,22 @@ ol.interaction.Modify.prototype.handleMouseMove_ = function(evt) { var geometry = vertexFeature.getGeometry(); var vertex = /** @type {ol.Coordinate} */ (ol.coordinate.closestOnSegment(pixelCoordinate, segment)); - var coordPixel = map.getPixelFromCoordinate(vertex); - var pixel1 = map.getPixelFromCoordinate(segment[0]); - var pixel2 = map.getPixelFromCoordinate(segment[1]); - var squaredDist1 = ol.coordinate.squaredDistance(coordPixel, pixel1); - var squaredDist2 = ol.coordinate.squaredDistance(coordPixel, pixel2); - var dist = Math.sqrt(Math.min(squaredDist1, squaredDist2)); - renderIntent = ol.layer.VectorLayerRenderIntent.FUTURE; - if (dist <= 10) { - vertex = squaredDist1 > squaredDist2 ? segment[1] : segment[0]; - renderIntent = ol.layer.VectorLayerRenderIntent.TEMPORARY; + var vertexPixel = map.getPixelFromCoordinate(vertex); + if (Math.sqrt(ol.coordinate.squaredDistance(pixel, vertexPixel)) <= + this.pixelTolerance_) { + var pixel1 = map.getPixelFromCoordinate(segment[0]); + var pixel2 = map.getPixelFromCoordinate(segment[1]); + var squaredDist1 = ol.coordinate.squaredDistance(vertexPixel, pixel1); + var squaredDist2 = ol.coordinate.squaredDistance(vertexPixel, pixel2); + var dist = Math.sqrt(Math.min(squaredDist1, squaredDist2)); + renderIntent = ol.layer.VectorLayerRenderIntent.FUTURE; + if (dist <= 10) { + vertex = squaredDist1 > squaredDist2 ? segment[1] : segment[0]; + renderIntent = ol.layer.VectorLayerRenderIntent.TEMPORARY; + } + geometry.setCoordinates(vertex); + this.modifiable_ = true; } - geometry.set(0, vertex[0]); - geometry.set(1, vertex[1]); - selectionLayer.updateFeatures([vertexFeature]); - this.modifiable_ = true; } if (vertexFeature.renderIntent != renderIntent) { selectionLayer.setRenderIntent(renderIntent, [vertexFeature]); @@ -397,9 +398,11 @@ ol.interaction.Modify.prototype.insertVertex_ = /** - * @param {ol.layer.VectorLayerEventObject} evt Event object. + * Listen for feature removals. + * @param {ol.layer.VectorEvent} evt Event object. + * @private */ -ol.interaction.Modify.prototype.removeIndex = function(evt) { +ol.interaction.Modify.prototype.handleFeaturesRemoved_ = function(evt) { var layer = evt.target; var rTree = layer.getEditData().rTree; var features = evt.features; diff --git a/src/ol/layer/vectorlayer.js b/src/ol/layer/vectorlayer.js index 4810a77915..28d1df9d60 100644 --- a/src/ol/layer/vectorlayer.js +++ b/src/ol/layer/vectorlayer.js @@ -470,26 +470,6 @@ ol.layer.Vector.prototype.setTemporary = function(temporary) { }; -/** - * TODO: This should go away - features should either fire events when changed, - * or feature changes should be made through the layer. - * - * @param {Array.} features Features. - */ -ol.layer.Vector.prototype.updateFeatures = function(features) { - var extent = ol.extent.createEmpty(); - for (var i = features.length - 1; i >= 0; --i) { - var feature = features[i]; - var geometry = feature.getGeometry(); - this.featureCache_.remove(feature); - this.featureCache_.add(feature); - ol.extent.extend(extent, geometry.getBounds()); - } - this.dispatchEvent(new ol.layer.VectorEvent( - ol.layer.VectorLayerEventType.CHANGE, features, [extent])); -}; - - /** * Sort function for `groupFeaturesBySymbolizerLiteral`. * @private