From e62a9bdf6de1b8bade30ccc5299085c114cf5701 Mon Sep 17 00:00:00 2001 From: Matteo Velludini Date: Tue, 8 May 2018 15:34:02 +0200 Subject: [PATCH 1/2] fix #49 maintain great circle in annotations --- .../components/map/leaflet/MeasurementSupport.jsx | 12 ++++++++++-- web/client/components/map/openlayers/DrawSupport.jsx | 6 ++++-- .../components/map/openlayers/MeasurementSupport.jsx | 10 +++++++++- web/client/utils/CoordinatesUtils.js | 6 ++++-- web/client/utils/__tests__/CoordinatesUtils-test.js | 4 ++++ 5 files changed, 31 insertions(+), 7 deletions(-) diff --git a/web/client/components/map/leaflet/MeasurementSupport.jsx b/web/client/components/map/leaflet/MeasurementSupport.jsx index ab836f9a8d..46fb56ab2d 100644 --- a/web/client/components/map/leaflet/MeasurementSupport.jsx +++ b/web/client/components/map/leaflet/MeasurementSupport.jsx @@ -52,13 +52,21 @@ class MeasurementSupport extends React.Component { this.lastLayer = evt.layer; let feature = this.lastLayer && this.lastLayer.toGeoJSON() || {}; + let newFeature = feature; + if (this.props.measurement.geomType === 'LineString') { + newFeature = assign({}, feature, { + geometry: assign({}, feature.geometry, { + coordinates: transformLineToArcs(feature.geometry.coordinates) + }) + }); + } if (this.props.measurement.geomType === 'Point') { let pos = this.drawControl._marker.getLatLng(); let point = {x: pos.lng, y: pos.lat, srs: 'EPSG:4326'}; - let newMeasureState = assign({}, this.props.measurement, {point: point, feature}); + let newMeasureState = assign({}, this.props.measurement, {point: point, feature: newFeature}); this.props.changeMeasurementState(newMeasureState); } else { - let newMeasureState = assign({}, this.props.measurement, {feature}); + let newMeasureState = assign({}, this.props.measurement, {feature: newFeature}); this.props.changeMeasurementState(newMeasureState); } if (this.props.measurement.lineMeasureEnabled && this.lastLayer) { diff --git a/web/client/components/map/openlayers/DrawSupport.jsx b/web/client/components/map/openlayers/DrawSupport.jsx index f0582bf7e5..63d0b7d7f4 100644 --- a/web/client/components/map/openlayers/DrawSupport.jsx +++ b/web/client/components/map/openlayers/DrawSupport.jsx @@ -935,11 +935,12 @@ class DrawSupport extends React.Component { if (g.getType() !== "Circle") { return g; } - if (feature.getProperties().circles.indexOf(i) !== -1) { + if (feature.getProperties() && feature.getProperties().circles && feature.getProperties().circles.indexOf(i) !== -1) { const center = g.getCenter(); const radius = g.getRadius(); return this.polygonFromCircle(center, radius); } + return g; }); } /** @@ -953,12 +954,13 @@ class DrawSupport extends React.Component { if (g.getType() !== "Polygon") { return g; } - if (feature.getProperties().circles.indexOf(i) !== -1) { + if (feature.getProperties() && feature.getProperties().circles && feature.getProperties().circles.indexOf(i) !== -1) { const extent = g.getExtent(); const center = ol.extent.getCenter(extent); const radius = this.calculateRadius(center, g.getCoordinates()); return new ol.geom.Circle(center, radius); } + return g; }); } diff --git a/web/client/components/map/openlayers/MeasurementSupport.jsx b/web/client/components/map/openlayers/MeasurementSupport.jsx index 5a84729767..d06848fb02 100644 --- a/web/client/components/map/openlayers/MeasurementSupport.jsx +++ b/web/client/components/map/openlayers/MeasurementSupport.jsx @@ -273,6 +273,14 @@ class MeasurementSupport extends React.Component { } const geojsonFormat = new ol.format.GeoJSON(); let feature = reprojectGeoJson(geojsonFormat.writeFeatureObject(this.sketchFeature.clone()), this.props.map.getView().getProjection().getCode(), "EPSG:4326"); + let newFeature = feature; + if (this.props.measurement.geomType === 'LineString') { + newFeature = assign({}, feature, { + geometry: assign({}, feature.geometry, { + coordinates: transformLineToArcs(feature.geometry.coordinates) + }) + }); + } let newMeasureState = assign({}, this.props.measurement, { @@ -284,7 +292,7 @@ class MeasurementSupport extends React.Component { bearing: this.props.measurement.geomType === 'Bearing' ? bearing : 0, lenUnit: this.props.measurement.lenUnit, areaUnit: this.props.measurement.areaUnit, - feature + feature: newFeature } ); this.props.changeMeasurementState(newMeasureState); diff --git a/web/client/utils/CoordinatesUtils.js b/web/client/utils/CoordinatesUtils.js index 899527b638..d76eaba41b 100644 --- a/web/client/utils/CoordinatesUtils.js +++ b/web/client/utils/CoordinatesUtils.js @@ -558,8 +558,10 @@ const CoordinatesUtils = { const p2 = coordinates[i + 1]; const start = toPoint(p1); const end = toPoint(p2); - const grCircle = greatCircle(start, end, options); - arcs = [...arcs, ...grCircle.geometry.coordinates]; + if (!(p1[0] === p2[0] && p1[1] === p2[1])) { + let grCircle = greatCircle(start, end, options); + arcs = [...arcs, ...grCircle.geometry.coordinates]; + } } return arcs; }, diff --git a/web/client/utils/__tests__/CoordinatesUtils-test.js b/web/client/utils/__tests__/CoordinatesUtils-test.js index 41b3be4f0a..f4aec87fad 100644 --- a/web/client/utils/__tests__/CoordinatesUtils-test.js +++ b/web/client/utils/__tests__/CoordinatesUtils-test.js @@ -466,4 +466,8 @@ describe('CoordinatesUtils', () => { expect(CoordinatesUtils.transformLineToArcs([[1, 1], [2, 2]] )).toNotBe(null); expect(CoordinatesUtils.transformLineToArcs([[1, 1], [2, 2]] ).length).toBe(100); }); + it('test transformLineToArcs with 2 equal points', () => { + expect(CoordinatesUtils.transformLineToArcs([[1, 1], [1, 1]] )).toNotBe(null); + expect(CoordinatesUtils.transformLineToArcs([[1, 1], [1, 1]] ).length).toBe(0); + }); }); From 69fb5de47c1f7bb95c631c1f8878a64a3e6126a3 Mon Sep 17 00:00:00 2001 From: Matteo Velludini Date: Tue, 15 May 2018 15:03:47 +0200 Subject: [PATCH 2/2] clean up code --- web/client/components/map/leaflet/MeasurementSupport.jsx | 7 +++---- .../components/map/openlayers/MeasurementSupport.jsx | 5 ++--- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/web/client/components/map/leaflet/MeasurementSupport.jsx b/web/client/components/map/leaflet/MeasurementSupport.jsx index 46fb56ab2d..1b56eb7312 100644 --- a/web/client/components/map/leaflet/MeasurementSupport.jsx +++ b/web/client/components/map/leaflet/MeasurementSupport.jsx @@ -52,9 +52,8 @@ class MeasurementSupport extends React.Component { this.lastLayer = evt.layer; let feature = this.lastLayer && this.lastLayer.toGeoJSON() || {}; - let newFeature = feature; if (this.props.measurement.geomType === 'LineString') { - newFeature = assign({}, feature, { + feature = assign({}, feature, { geometry: assign({}, feature.geometry, { coordinates: transformLineToArcs(feature.geometry.coordinates) }) @@ -63,10 +62,10 @@ class MeasurementSupport extends React.Component { if (this.props.measurement.geomType === 'Point') { let pos = this.drawControl._marker.getLatLng(); let point = {x: pos.lng, y: pos.lat, srs: 'EPSG:4326'}; - let newMeasureState = assign({}, this.props.measurement, {point: point, feature: newFeature}); + let newMeasureState = assign({}, this.props.measurement, {point: point, feature}); this.props.changeMeasurementState(newMeasureState); } else { - let newMeasureState = assign({}, this.props.measurement, {feature: newFeature}); + let newMeasureState = assign({}, this.props.measurement, {feature}); this.props.changeMeasurementState(newMeasureState); } if (this.props.measurement.lineMeasureEnabled && this.lastLayer) { diff --git a/web/client/components/map/openlayers/MeasurementSupport.jsx b/web/client/components/map/openlayers/MeasurementSupport.jsx index d06848fb02..1d83897f62 100644 --- a/web/client/components/map/openlayers/MeasurementSupport.jsx +++ b/web/client/components/map/openlayers/MeasurementSupport.jsx @@ -273,9 +273,8 @@ class MeasurementSupport extends React.Component { } const geojsonFormat = new ol.format.GeoJSON(); let feature = reprojectGeoJson(geojsonFormat.writeFeatureObject(this.sketchFeature.clone()), this.props.map.getView().getProjection().getCode(), "EPSG:4326"); - let newFeature = feature; if (this.props.measurement.geomType === 'LineString') { - newFeature = assign({}, feature, { + feature = assign({}, feature, { geometry: assign({}, feature.geometry, { coordinates: transformLineToArcs(feature.geometry.coordinates) }) @@ -292,7 +291,7 @@ class MeasurementSupport extends React.Component { bearing: this.props.measurement.geomType === 'Bearing' ? bearing : 0, lenUnit: this.props.measurement.lenUnit, areaUnit: this.props.measurement.areaUnit, - feature: newFeature + feature } ); this.props.changeMeasurementState(newMeasureState);