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 1/4] 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; From eb6d61e6d1a00924ebe36e7cb11429e22d9b70d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=20Peru=C4=8Di=C4=87?= Date: Wed, 25 Mar 2015 10:44:35 +0100 Subject: [PATCH 2/4] fix: modifying the closed LineString This commit fixes the bug that occurs when trying to modify a closed LineString by clicking on the starting/ending node. Such a closed line is added to the modify-test example. --- examples/modify-test.js | 1 + src/ol/interaction/modifyinteraction.js | 15 +++++++++++++-- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/examples/modify-test.js b/examples/modify-test.js index 87c9261619..4db5d02869 100644 --- a/examples/modify-test.js +++ b/examples/modify-test.js @@ -114,6 +114,7 @@ var source = new ol.source.GeoJSON( 'type': 'MultiLineString', 'coordinates': [ [[-1e6, -7.5e5], [-1e6, 7.5e5]], + [[-1e6, -7.5e5], [-1e6, 7.5e5], [-5e5, 0], [-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]] diff --git a/src/ol/interaction/modifyinteraction.js b/src/ol/interaction/modifyinteraction.js index d2525f6a15..d52043b27d 100644 --- a/src/ol/interaction/modifyinteraction.js +++ b/src/ol/interaction/modifyinteraction.js @@ -430,11 +430,22 @@ ol.interaction.Modify.handleDownEvent_ = function(evt) { if (ol.coordinate.equals(segment[0], vertex) && !componentSegments[uid][0]) { this.dragSegments_.push([segmentDataMatch, 0]); - componentSegments[uid][0] = true; + componentSegments[uid][0] = segmentDataMatch; } else if (ol.coordinate.equals(segment[1], vertex) && !componentSegments[uid][1]) { + + // prevent dragging closed linestrings by the connecting node + if ((segmentDataMatch.geometry.getType() === + ol.geom.GeometryType.LINE_STRING || + segmentDataMatch.geometry.getType() === + ol.geom.GeometryType.MULTI_LINE_STRING) && + componentSegments[uid][0] && + componentSegments[uid][0].index === 0) { + continue; + } + this.dragSegments_.push([segmentDataMatch, 1]); - componentSegments[uid][1] = true; + componentSegments[uid][1] = segmentDataMatch; } else if (goog.getUid(segment) in this.vertexSegments_ && (!componentSegments[uid][0] && !componentSegments[uid][1])) { insertVertices.push([segmentDataMatch, vertex]); From 279d1829bb1871894be3b6a79c910b7bfac72337 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=20Peru=C4=8Di=C4=87?= Date: Wed, 25 Mar 2015 10:52:29 +0100 Subject: [PATCH 3/4] fix: ol.interaction.Select conflict Prevent vertexFeature_ from ol.interaction.Modify from being selected by ol.interaction.Select. The bug occurs when an delete attempt fails. ex: clicikng on the first or last node of LineString, or clicking a line segment between two nodes. --- src/ol/interaction/modifyinteraction.js | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/ol/interaction/modifyinteraction.js b/src/ol/interaction/modifyinteraction.js index d52043b27d..49cb4d23a5 100644 --- a/src/ol/interaction/modifyinteraction.js +++ b/src/ol/interaction/modifyinteraction.js @@ -541,7 +541,7 @@ ol.interaction.Modify.handleEvent = function(mapBrowserEvent) { mapBrowserEvent.type == ol.MapBrowserEvent.EventType.POINTERMOVE) { this.handlePointerMove_(mapBrowserEvent); } - if (!goog.isNull(this.vertexFeature_) && this.snappedToVertex_ && + if (!goog.isNull(this.vertexFeature_) && this.deleteCondition_(mapBrowserEvent)) { var geometry = this.vertexFeature_.getGeometry(); goog.asserts.assertInstanceof(geometry, ol.geom.Point); @@ -707,9 +707,8 @@ ol.interaction.Modify.prototype.insertVertex_ = function(segmentData, vertex) { ol.interaction.Modify.prototype.removeVertex_ = function() { var dragSegments = this.dragSegments_; var segmentsByFeature = {}; - var deleted = false; var component, coordinates, dragSegment, geometry, i, index, left; - var newIndex, newSegment, right, segmentData, uid; + var newIndex, newSegment, right, segmentData, uid, deleted; for (i = dragSegments.length - 1; i >= 0; --i) { dragSegment = dragSegments[i]; segmentData = dragSegment[0]; @@ -793,7 +792,7 @@ ol.interaction.Modify.prototype.removeVertex_ = function() { } } } - return deleted; + return true; }; From 56067d1cdaeb1262258bff3a1e08038e11686ef2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=20Peru=C4=8Di=C4=87?= Date: Wed, 25 Mar 2015 11:00:13 +0100 Subject: [PATCH 4/4] Prevent unnecessary function calls handlePointerMove_ doesn't need to be called when dragging. handleDragEvent_ takes care of the event in that case. in handleDragEvent_, createOrUpdateVertexFeature_ doesn't need to be called for each dragged segment. it can be called only once with current vertex. fixes made to pass the build --- examples/modify-test.js | 4 ++-- src/ol/interaction/modifyinteraction.js | 15 ++++++++------- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/examples/modify-test.js b/examples/modify-test.js index 4db5d02869..1d88793c46 100644 --- a/examples/modify-test.js +++ b/examples/modify-test.js @@ -115,7 +115,7 @@ var source = new ol.source.GeoJSON( 'coordinates': [ [[-1e6, -7.5e5], [-1e6, 7.5e5]], [[-1e6, -7.5e5], [-1e6, 7.5e5], [-5e5, 0], [-1e6, -7.5e5]], - [[1e6, -7.5e5], [15e5, 0], [15e5, 0], [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]] ] @@ -129,7 +129,7 @@ var source = new ol.source.GeoJSON( [[[-5e6, 6e6], [-5e6, 8e6], [-3e6, 8e6], [-3e6, 6e6], [-5e6, 6e6]]], [[[-3e6, 6e6], [-2e6, 8e6], [0, 8e6], - [0, 6e6], [-3e6, 6e6] ]], + [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 49cb4d23a5..d37703be56 100644 --- a/src/ol/interaction/modifyinteraction.js +++ b/src/ol/interaction/modifyinteraction.js @@ -436,11 +436,11 @@ ol.interaction.Modify.handleDownEvent_ = function(evt) { // prevent dragging closed linestrings by the connecting node if ((segmentDataMatch.geometry.getType() === - ol.geom.GeometryType.LINE_STRING || - segmentDataMatch.geometry.getType() === - ol.geom.GeometryType.MULTI_LINE_STRING) && - componentSegments[uid][0] && - componentSegments[uid][0].index === 0) { + ol.geom.GeometryType.LINE_STRING || + segmentDataMatch.geometry.getType() === + ol.geom.GeometryType.MULTI_LINE_STRING) && + componentSegments[uid][0] && + componentSegments[uid][0].index === 0) { continue; } @@ -507,8 +507,8 @@ ol.interaction.Modify.handleDragEvent_ = function(evt) { } geometry.setCoordinates(coordinates); - this.createOrUpdateVertexFeature_(vertex); } + this.createOrUpdateVertexFeature_(vertex); }; @@ -538,7 +538,8 @@ ol.interaction.Modify.handleUpEvent_ = function(evt) { ol.interaction.Modify.handleEvent = function(mapBrowserEvent) { var handled; if (!mapBrowserEvent.map.getView().getHints()[ol.ViewHint.INTERACTING] && - mapBrowserEvent.type == ol.MapBrowserEvent.EventType.POINTERMOVE) { + mapBrowserEvent.type == ol.MapBrowserEvent.EventType.POINTERMOVE && + !this.handlingDownUpSequence) { this.handlePointerMove_(mapBrowserEvent); } if (!goog.isNull(this.vertexFeature_) &&