Do not create a vertexFeature with [NaN, NaN] coordinates
The RTree cannot work with NaN coordinates. So instead of preparing a vertexFeature before we know a coordinate, we now lazily create the vertexFeature.
This commit is contained in:
@@ -109,11 +109,6 @@ ol.interaction.Modify.prototype.addLayer = function(layer) {
|
|||||||
var editData = selectionLayer.getEditData();
|
var editData = selectionLayer.getEditData();
|
||||||
if (goog.isNull(editData.rTree)) {
|
if (goog.isNull(editData.rTree)) {
|
||||||
editData.rTree = new ol.structs.RTree();
|
editData.rTree = new ol.structs.RTree();
|
||||||
var vertexFeature = new ol.Feature();
|
|
||||||
vertexFeature.renderIntent = ol.layer.VectorLayerRenderIntent.HIDDEN;
|
|
||||||
vertexFeature.setGeometry(new ol.geom.Point([NaN, NaN]));
|
|
||||||
selectionLayer.addFeatures([vertexFeature]);
|
|
||||||
editData.vertexFeature = vertexFeature;
|
|
||||||
}
|
}
|
||||||
this.addIndex_(selectionLayer,
|
this.addIndex_(selectionLayer,
|
||||||
goog.object.getValues(selectionData.selectedFeaturesByFeatureUid));
|
goog.object.getValues(selectionData.selectedFeaturesByFeatureUid));
|
||||||
@@ -157,6 +152,27 @@ ol.interaction.Modify.prototype.addSegments_ =
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {ol.layer.Vector} selectionLayer Selection layer.
|
||||||
|
* @param {ol.Coordinate} coordinates Coordinates.
|
||||||
|
* @return {ol.Feature} Vertex feature.
|
||||||
|
*/
|
||||||
|
ol.interaction.Modify.prototype.createOrUpdateVertexFeature =
|
||||||
|
function(selectionLayer, coordinates) {
|
||||||
|
var editData = selectionLayer.getEditData();
|
||||||
|
var vertexFeature = editData.vertexFeature;
|
||||||
|
if (goog.isNull(vertexFeature)) {
|
||||||
|
vertexFeature = new ol.Feature({g: new ol.geom.Point(coordinates)});
|
||||||
|
selectionLayer.addFeatures([vertexFeature]);
|
||||||
|
editData.vertexFeature = vertexFeature;
|
||||||
|
} else {
|
||||||
|
var geometry = vertexFeature.getGeometry();
|
||||||
|
geometry.setCoordinates(coordinates);
|
||||||
|
}
|
||||||
|
return vertexFeature;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @inheritDoc
|
* @inheritDoc
|
||||||
*/
|
*/
|
||||||
@@ -223,12 +239,10 @@ ol.interaction.Modify.prototype.handleDrag = function(evt) {
|
|||||||
geometry.setCoordinates(coordinates);
|
geometry.setCoordinates(coordinates);
|
||||||
|
|
||||||
var editData = selectionLayer.getEditData();
|
var editData = selectionLayer.getEditData();
|
||||||
var vertexFeature = editData.vertexFeature;
|
|
||||||
var vertexGeometry = vertexFeature.getGeometry();
|
|
||||||
var segment = segmentData[0];
|
var segment = segmentData[0];
|
||||||
editData.rTree.remove(ol.extent.boundingExtent(segment), segmentData);
|
editData.rTree.remove(ol.extent.boundingExtent(segment), segmentData);
|
||||||
segment[index] = vertex;
|
segment[index] = vertex;
|
||||||
vertexGeometry.setCoordinates(vertex);
|
this.createOrUpdateVertexFeature(selectionLayer, vertex);
|
||||||
editData.rTree.insert(ol.extent.boundingExtent(segment), segmentData,
|
editData.rTree.insert(ol.extent.boundingExtent(segment), segmentData,
|
||||||
goog.getUid(feature));
|
goog.getUid(feature));
|
||||||
}
|
}
|
||||||
@@ -293,7 +307,6 @@ ol.interaction.Modify.prototype.handleMouseMove_ = function(evt) {
|
|||||||
if (segments.length > 0) {
|
if (segments.length > 0) {
|
||||||
segments.sort(sortByDistance);
|
segments.sort(sortByDistance);
|
||||||
var segment = segments[0][0]; // the closest segment
|
var segment = segments[0][0]; // the closest segment
|
||||||
var geometry = vertexFeature.getGeometry();
|
|
||||||
var vertex = /** @type {ol.Coordinate} */
|
var vertex = /** @type {ol.Coordinate} */
|
||||||
(ol.coordinate.closestOnSegment(pixelCoordinate, segment));
|
(ol.coordinate.closestOnSegment(pixelCoordinate, segment));
|
||||||
var vertexPixel = map.getPixelFromCoordinate(vertex);
|
var vertexPixel = map.getPixelFromCoordinate(vertex);
|
||||||
@@ -309,11 +322,13 @@ ol.interaction.Modify.prototype.handleMouseMove_ = function(evt) {
|
|||||||
vertex = squaredDist1 > squaredDist2 ? segment[1] : segment[0];
|
vertex = squaredDist1 > squaredDist2 ? segment[1] : segment[0];
|
||||||
renderIntent = ol.layer.VectorLayerRenderIntent.TEMPORARY;
|
renderIntent = ol.layer.VectorLayerRenderIntent.TEMPORARY;
|
||||||
}
|
}
|
||||||
geometry.setCoordinates(vertex);
|
vertexFeature =
|
||||||
|
this.createOrUpdateVertexFeature(selectionLayer, vertex);
|
||||||
this.modifiable_ = true;
|
this.modifiable_ = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (vertexFeature.renderIntent != renderIntent) {
|
if (!goog.isNull(vertexFeature) &&
|
||||||
|
vertexFeature.renderIntent != renderIntent) {
|
||||||
selectionLayer.setRenderIntent(renderIntent, [vertexFeature]);
|
selectionLayer.setRenderIntent(renderIntent, [vertexFeature]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user