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.
This commit is contained in:
Fran Peručić
2015-03-25 10:34:36 +01:00
parent 8beeee8a95
commit 7dff739bce
2 changed files with 33 additions and 7 deletions

View File

@@ -114,7 +114,7 @@ var source = new ol.source.GeoJSON(
'type': 'MultiLineString', 'type': 'MultiLineString',
'coordinates': [ 'coordinates': [
[[-1e6, -7.5e5], [-1e6, 7.5e5]], [[-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]],
[[-7.5e5, 1e6], [7.5e5, 1e6]] [[-7.5e5, 1e6], [7.5e5, 1e6]]
] ]
@@ -127,8 +127,8 @@ var source = new ol.source.GeoJSON(
'coordinates': [ 'coordinates': [
[[[-5e6, 6e6], [-5e6, 8e6], [-3e6, 8e6], [[[-5e6, 6e6], [-5e6, 8e6], [-3e6, 8e6],
[-3e6, 6e6], [-5e6, 6e6]]], [-3e6, 6e6], [-5e6, 6e6]]],
[[[-2e6, 6e6], [-2e6, 8e6], [0, 8e6], [[[-3e6, 6e6], [-2e6, 8e6], [0, 8e6],
[0, 6e6], [-2e6, 6e6]]], [0, 6e6], [-3e6, 6e6] ]],
[[[1e6, 6e6], [1e6, 8e6], [3e6, 8e6], [[[1e6, 6e6], [1e6, 8e6], [3e6, 8e6],
[3e6, 6e6], [1e6, 6e6]]] [3e6, 6e6], [1e6, 6e6]]]
] ]

View File

@@ -398,23 +398,45 @@ ol.interaction.Modify.prototype.createOrUpdateVertexFeature_ =
* @private * @private
*/ */
ol.interaction.Modify.handleDownEvent_ = function(evt) { 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.handlePointerAtPixel_(evt.pixel, evt.map);
this.dragSegments_ = []; this.dragSegments_ = [];
var vertexFeature = this.vertexFeature_; var vertexFeature = this.vertexFeature_;
if (!goog.isNull(vertexFeature)) { if (!goog.isNull(vertexFeature)) {
var insertVertices = []; var insertVertices = [];
var geometry = /** @type {ol.geom.Point} */ (vertexFeature.getGeometry()); var geometry = /** @type {ol.geom.Point} */ (vertexFeature.getGeometry());
var vertex = geometry.getCoordinates(); var vertex = geometry.getCoordinates();
var vertexExtent = ol.extent.boundingExtent([vertex]); var vertexExtent = ol.extent.boundingExtent([vertex]);
var segmentDataMatches = this.rBush_.getInExtent(vertexExtent); var segmentDataMatches = this.rBush_.getInExtent(vertexExtent);
var componentSegments = {};
segmentDataMatches.sort(sorter);
for (var i = 0, ii = segmentDataMatches.length; i < ii; ++i) { for (var i = 0, ii = segmentDataMatches.length; i < ii; ++i) {
var segmentDataMatch = segmentDataMatches[i]; var segmentDataMatch = segmentDataMatches[i];
var segment = segmentDataMatch.segment; 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]); 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]); 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]); insertVertices.push([segmentDataMatch, vertex]);
} }
} }
@@ -683,6 +705,10 @@ ol.interaction.Modify.prototype.removeVertex_ = function() {
geometry = segmentData.geometry; geometry = segmentData.geometry;
coordinates = geometry.getCoordinates(); coordinates = geometry.getCoordinates();
uid = goog.getUid(segmentData.feature); uid = goog.getUid(segmentData.feature);
if (segmentData.depth) {
// separate feature components
uid += '-' + segmentData.depth.join('-');
}
left = right = index = undefined; left = right = index = undefined;
if (dragSegment[1] === 0) { if (dragSegment[1] === 0) {
right = segmentData; right = segmentData;