Merge pull request #1689 from tonio/fix_modify

Check for geometries type instead of `instanceof`
This commit is contained in:
Antoine Abt
2014-02-12 15:51:32 +01:00
2 changed files with 61 additions and 36 deletions
+7
View File
@@ -86,6 +86,13 @@ var vectorSource = new ol.source.GeoJSON(
'coordinates': [0, 0] 'coordinates': [0, 0]
} }
}, },
{
'type': 'Feature',
'geometry': {
'type': 'MultiPoint',
'coordinates': [[-2e6, 0], [0, -2e6]]
}
},
{ {
'type': 'Feature', 'type': 'Feature',
'geometry': { 'geometry': {
+54 -36
View File
@@ -10,6 +10,7 @@ goog.require('ol.MapBrowserEvent.EventType');
goog.require('ol.ViewHint'); goog.require('ol.ViewHint');
goog.require('ol.coordinate'); goog.require('ol.coordinate');
goog.require('ol.extent'); goog.require('ol.extent');
goog.require('ol.geom.GeometryType');
goog.require('ol.geom.LineString'); goog.require('ol.geom.LineString');
goog.require('ol.geom.MultiLineString'); goog.require('ol.geom.MultiLineString');
goog.require('ol.geom.MultiPoint'); goog.require('ol.geom.MultiPoint');
@@ -173,12 +174,13 @@ ol.interaction.Modify.prototype.writeMultiPointGeometry_ =
function(feature, geometry) { function(feature, geometry) {
var points = geometry.getCoordinates(); var points = geometry.getCoordinates();
var coordinates, i, ii, segmentData; var coordinates, i, ii, segmentData;
for (i = 0, ii = points.length - 1; i < ii; ++i) { for (i = 0, ii = points.length; i < ii; ++i) {
coordinates = points[i]; coordinates = points[i];
segmentData = /** @type {ol.interaction.SegmentDataType} */ ({ segmentData = /** @type {ol.interaction.SegmentDataType} */ ({
feature: feature, feature: feature,
geometry: geometry, geometry: geometry,
depth: [i], depth: [i],
index: i,
segment: [coordinates, coordinates], segment: [coordinates, coordinates],
style: this.overlay_.getStyleFunction() style: this.overlay_.getStyleFunction()
}); });
@@ -406,25 +408,31 @@ ol.interaction.Modify.prototype.handleDrag = function(evt) {
var segment = segmentData.segment; var segment = segmentData.segment;
var index = dragSegment[1]; var index = dragSegment[1];
switch (geometry.getType()) {
if (geometry instanceof ol.geom.Point) { case ol.geom.GeometryType.POINT:
coordinates = vertex; coordinates = vertex;
segment[0] = segment[1] = vertex; segment[0] = segment[1] = vertex;
} else if (geometry instanceof ol.geom.MultiPoint) { break;
coordinates[depth[0]][segmentData.index + index] = vertex; case ol.geom.GeometryType.MULTI_POINT:
segment[0] = segment[1] = vertex; coordinates[segmentData.index] = vertex;
} else if (geometry instanceof ol.geom.LineString) { segment[0] = segment[1] = vertex;
coordinates[segmentData.index + index] = vertex; break;
segment[index] = vertex; case ol.geom.GeometryType.LINE_STRING:
} else if (geometry instanceof ol.geom.MultiLineString) { coordinates[segmentData.index + index] = vertex;
coordinates[depth[0]][segmentData.index + index] = vertex; segment[index] = vertex;
segment[index] = vertex; break;
} else if (geometry instanceof ol.geom.Polygon) { case ol.geom.GeometryType.MULTI_LINE_STRING:
coordinates[0][segmentData.index + index] = vertex; coordinates[depth[0]][segmentData.index + index] = vertex;
segment[index] = vertex; segment[index] = vertex;
} else if (geometry instanceof ol.geom.MultiPolygon) { break;
coordinates[depth[0]][0][segmentData.index + index] = vertex; case ol.geom.GeometryType.POLYGON:
segment[index] = vertex; coordinates[0][segmentData.index + index] = vertex;
segment[index] = vertex;
break;
case ol.geom.GeometryType.MULTI_POLYGON:
coordinates[depth[0]][0][segmentData.index + index] = vertex;
segment[index] = vertex;
break;
} }
geometry.setCoordinates(coordinates); geometry.setCoordinates(coordinates);
@@ -528,29 +536,39 @@ ol.interaction.Modify.prototype.handleMouseAtPixel_ = function(pixel, map) {
* @param {ol.Coordinate} vertex Vertex. * @param {ol.Coordinate} vertex Vertex.
* @private * @private
*/ */
ol.interaction.Modify.prototype.insertVertex_ = ol.interaction.Modify.prototype.insertVertex_ = function(segmentData, vertex) {
function(segmentData, vertex) {
var segment = segmentData.segment; var segment = segmentData.segment;
var feature = segmentData.feature; var feature = segmentData.feature;
var geometry = segmentData.geometry; var geometry = segmentData.geometry;
var depth = segmentData.depth; var depth = segmentData.depth;
var index = segmentData.index; var index = segmentData.index;
geometry = /** @type {ol.geom.Point|ol.geom.LineString|ol.geom.Polygon| var coordinates;
ol.geom.MultiPoint|ol.geom.MultiLineString|ol.geom.MultiPolygon} */
(geometry);
var coordinates = geometry.getCoordinates();
if (geometry instanceof ol.geom.MultiPoint) { switch (geometry.getType()) {
coordinates[depth[0]] = coordinates; case ol.geom.GeometryType.MULTI_LINE_STRING:
} else if (geometry instanceof ol.geom.MultiLineString) { goog.asserts.assertInstanceof(geometry, ol.geom.MultiLineString);
coordinates[depth[0]].splice(index + 1, 0, vertex); coordinates = geometry.getCoordinates();
} else if (geometry instanceof ol.geom.Polygon) { coordinates[depth[0]].splice(index + 1, 0, vertex);
coordinates[0].splice(index + 1, 0, vertex); break;
} else if (geometry instanceof ol.geom.MultiPolygon) { case ol.geom.GeometryType.POLYGON:
coordinates[depth[0]][0].splice(index + 1, 0, vertex); goog.asserts.assertInstanceof(geometry, ol.geom.Polygon);
} else { coordinates = geometry.getCoordinates();
coordinates.splice(index + 1, 0, vertex); coordinates[0].splice(index + 1, 0, vertex);
break;
case ol.geom.GeometryType.MULTI_POLYGON:
goog.asserts.assertInstanceof(geometry, ol.geom.MultiPolygon);
coordinates = geometry.getCoordinates();
coordinates[depth[0]][0].splice(index + 1, 0, vertex);
break;
case ol.geom.GeometryType.LINE_STRING:
goog.asserts.assertInstanceof(geometry, ol.geom.LineString);
coordinates = geometry.getCoordinates();
coordinates.splice(index + 1, 0, vertex);
break;
default:
return;
} }
geometry.setCoordinates(coordinates); geometry.setCoordinates(coordinates);
var rTree = this.rBush_; var rTree = this.rBush_;
goog.asserts.assert(goog.isDef(segment)); goog.asserts.assert(goog.isDef(segment));