From 7dff739bce6d1b8453158299d60a8fd1848bd256 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=20Peru=C4=8Di=C4=87?= Date: Wed, 25 Mar 2015 10:34:36 +0100 Subject: [PATCH] Deleting a duplicate node Fix a bug in ol.interaction.Modify when trying to delete nodes on a geometry that has duplicate nodes. A bug occurs when clicking on the duplicate node. --- examples/modify-test.js | 6 ++--- src/ol/interaction/modifyinteraction.js | 34 ++++++++++++++++++++++--- 2 files changed, 33 insertions(+), 7 deletions(-) diff --git a/examples/modify-test.js b/examples/modify-test.js index d0f46dd0f9..87c9261619 100644 --- a/examples/modify-test.js +++ b/examples/modify-test.js @@ -114,7 +114,7 @@ var source = new ol.source.GeoJSON( 'type': 'MultiLineString', 'coordinates': [ [[-1e6, -7.5e5], [-1e6, 7.5e5]], - [[1e6, -7.5e5], [1e6, 7.5e5]], + [[1e6, -7.5e5], [15e5, 0], [15e5, 0], [1e6, 7.5e5]], [[-7.5e5, -1e6], [7.5e5, -1e6]], [[-7.5e5, 1e6], [7.5e5, 1e6]] ] @@ -127,8 +127,8 @@ var source = new ol.source.GeoJSON( 'coordinates': [ [[[-5e6, 6e6], [-5e6, 8e6], [-3e6, 8e6], [-3e6, 6e6], [-5e6, 6e6]]], - [[[-2e6, 6e6], [-2e6, 8e6], [0, 8e6], - [0, 6e6], [-2e6, 6e6]]], + [[[-3e6, 6e6], [-2e6, 8e6], [0, 8e6], + [0, 6e6], [-3e6, 6e6] ]], [[[1e6, 6e6], [1e6, 8e6], [3e6, 8e6], [3e6, 6e6], [1e6, 6e6]]] ] diff --git a/src/ol/interaction/modifyinteraction.js b/src/ol/interaction/modifyinteraction.js index 8446a7b6ca..d2525f6a15 100644 --- a/src/ol/interaction/modifyinteraction.js +++ b/src/ol/interaction/modifyinteraction.js @@ -398,23 +398,45 @@ ol.interaction.Modify.prototype.createOrUpdateVertexFeature_ = * @private */ ol.interaction.Modify.handleDownEvent_ = function(evt) { + /** + * @param {ol.interaction.SegmentDataType} a + * @param {ol.interaction.SegmentDataType} b + * @return {number} + */ + function sorter(a, b) { return a.index - b.index; } + this.handlePointerAtPixel_(evt.pixel, evt.map); this.dragSegments_ = []; var vertexFeature = this.vertexFeature_; if (!goog.isNull(vertexFeature)) { var insertVertices = []; - var geometry = /** @type {ol.geom.Point} */ (vertexFeature.getGeometry()); + var geometry = /** @type {ol.geom.Point} */ (vertexFeature.getGeometry()); var vertex = geometry.getCoordinates(); var vertexExtent = ol.extent.boundingExtent([vertex]); var segmentDataMatches = this.rBush_.getInExtent(vertexExtent); + var componentSegments = {}; + segmentDataMatches.sort(sorter); for (var i = 0, ii = segmentDataMatches.length; i < ii; ++i) { var segmentDataMatch = segmentDataMatches[i]; var segment = segmentDataMatch.segment; - if (ol.coordinate.equals(segment[0], vertex)) { + var uid = goog.getUid(segmentDataMatch.feature); + var depth = segmentDataMatch.depth; + if (depth) { + uid += '-' + depth.join('-'); // separate feature components + } + if (!componentSegments[uid]) { + componentSegments[uid] = new Array(2); + } + if (ol.coordinate.equals(segment[0], vertex) && + !componentSegments[uid][0]) { this.dragSegments_.push([segmentDataMatch, 0]); - } else if (ol.coordinate.equals(segment[1], vertex)) { + componentSegments[uid][0] = true; + } else if (ol.coordinate.equals(segment[1], vertex) && + !componentSegments[uid][1]) { this.dragSegments_.push([segmentDataMatch, 1]); - } else if (goog.getUid(segment) in this.vertexSegments_) { + componentSegments[uid][1] = true; + } else if (goog.getUid(segment) in this.vertexSegments_ && + (!componentSegments[uid][0] && !componentSegments[uid][1])) { insertVertices.push([segmentDataMatch, vertex]); } } @@ -683,6 +705,10 @@ ol.interaction.Modify.prototype.removeVertex_ = function() { geometry = segmentData.geometry; coordinates = geometry.getCoordinates(); uid = goog.getUid(segmentData.feature); + if (segmentData.depth) { + // separate feature components + uid += '-' + segmentData.depth.join('-'); + } left = right = index = undefined; if (dragSegment[1] === 0) { right = segmentData;