@@ -43,10 +43,11 @@ import { singleClick } from 'ol/events/condition';
43
43
import { GeoJSON , MVT } from 'ol/format' ;
44
44
import { Geometry , Point } from 'ol/geom' ;
45
45
import { Type } from 'ol/geom/Geometry' ;
46
- import { DragAndDrop , Interaction , Select } from 'ol/interaction' ;
47
- import Draw from 'ol/interaction/Draw.js' ;
48
- import Modify from 'ol/interaction/Modify.js' ;
49
- import Snap from 'ol/interaction/Snap.js' ;
46
+ import DragAndDrop from 'ol/interaction/DragAndDrop' ;
47
+ import Draw from 'ol/interaction/Draw' ;
48
+ import Modify from 'ol/interaction/Modify' ;
49
+ import Select from 'ol/interaction/Select' ;
50
+ import Snap from 'ol/interaction/Snap' ;
50
51
import {
51
52
Heatmap as HeatmapLayer ,
52
53
Image as ImageLayer ,
@@ -96,7 +97,6 @@ import { MainViewModel } from './mainviewmodel';
96
97
//import Modify from 'ol/interaction/Modify.js';
97
98
//import Snap from 'ol/interaction/Snap.js';
98
99
99
-
100
100
const drawGeometries = [ 'Point' , 'LineString' , 'Polygon' ] ;
101
101
102
102
interface IProps {
@@ -250,7 +250,7 @@ export class MainView extends React.Component<IProps, IStates> {
250
250
251
251
this . _model . sharedModel . awareness . off (
252
252
'change' ,
253
- this . _onAwarenessChangeHandler ,
253
+ this . _onSelectedLayerChangeHandler ,
254
254
) ;
255
255
this . _mainViewModel . dispose ( ) ;
256
256
}
@@ -408,22 +408,25 @@ export class MainView extends React.Component<IProps, IStates> {
408
408
} ,
409
409
} ) ) ;
410
410
411
+ /* generate select, modify and snap interactions for features of layers already added to the Map */
412
+ this . _select = new Select ( ) ;
413
+ this . _modify = new Modify ( {
414
+ features : this . _select . getFeatures ( ) ,
415
+ } ) ;
416
+
417
+ this . _Map . addInteraction ( this . _select ) ;
418
+ this . _Map . addInteraction ( this . _modify ) ;
419
+
420
+ this . _select . setActive ( true ) ;
421
+ this . _modify . setActive ( true ) ;
422
+
423
+ /* Track changes of selected layers
424
+ Get the vector source of the selected layer
425
+ Edit the vector layer*/
411
426
this . _model . sharedModel . awareness . on (
412
427
'change' ,
413
- this . _onAwarenessChangeHandler ,
428
+ this . _onSelectedLayerChangeHandler ,
414
429
) ;
415
-
416
- /* Snap and Modify interactions */
417
- //this._snap = new Snap();
418
- //this._modify = new Modify({});
419
- //this._Map.addInteraction(this._snap);
420
- //this._Map.addInteraction(this._modify);
421
-
422
- const drawGeometryLabel = 'Select' ;
423
- this . setState ( old => ( {
424
- ...old ,
425
- drawGeometryLabel,
426
- } ) ) ;
427
430
}
428
431
}
429
432
@@ -2112,12 +2115,12 @@ export class MainView extends React.Component<IProps, IStates> {
2112
2115
} ;
2113
2116
2114
2117
private _handleDrawGeometryTypeChange = (
2115
- /* handle with the change of geometry and instantiate new draw interaction accordingly*/
2118
+ /* handle with the change of geometry and instantiate new draw interaction and other ones accordingly*/
2116
2119
event : React . ChangeEvent < HTMLSelectElement > ,
2117
2120
) => {
2118
2121
const drawGeometryLabel = event . target . value ;
2119
2122
this . _currentDrawGeometry = drawGeometryLabel as Type ;
2120
- this . _updateDrawInteraction ( ) ;
2123
+ this . _updateInteractions ( ) ;
2121
2124
this . _updateDrawSource ( ) ;
2122
2125
this . setState ( old => ( {
2123
2126
...old ,
@@ -2146,31 +2149,32 @@ export class MainView extends React.Component<IProps, IStates> {
2146
2149
const geojsonWriter = new GeoJSON ( {
2147
2150
featureProjection : this . _Map . getView ( ) . getProjection ( ) ,
2148
2151
} ) ;
2152
+ if ( this . _currentVectorSource ) {
2153
+ const features = this . _currentVectorSource
2154
+ ?. getFeatures ( )
2155
+ . map ( feature => geojsonWriter . writeFeatureObject ( feature ) ) ;
2149
2156
2150
- const features = this . _currentVectorSource
2151
- ?. getFeatures ( )
2152
- . map ( feature => geojsonWriter . writeFeatureObject ( feature ) ) ;
2153
-
2154
- const updatedData = {
2155
- type : 'FeatureCollection' ,
2156
- features : features ,
2157
- } ;
2158
-
2159
- if ( this . _currentDrawSource ) {
2160
- const updatedJGISLayerSource : IJGISSource = {
2161
- name : this . _currentDrawSource . name ,
2162
- type : this . _currentDrawSource . type ,
2163
- parameters : {
2164
- data : updatedData ,
2165
- } ,
2157
+ const updatedData = {
2158
+ type : 'FeatureCollection' ,
2159
+ features : features ,
2166
2160
} ;
2167
2161
2168
- this . _currentDrawSource = updatedJGISLayerSource ;
2169
- if ( this . _currentDrawSourceID ) {
2170
- this . _model . sharedModel . updateSource (
2171
- this . _currentDrawSourceID ,
2172
- updatedJGISLayerSource ,
2173
- ) ;
2162
+ if ( this . _currentDrawSource ) {
2163
+ const updatedJGISLayerSource : IJGISSource = {
2164
+ name : this . _currentDrawSource . name ,
2165
+ type : this . _currentDrawSource . type ,
2166
+ parameters : {
2167
+ data : updatedData ,
2168
+ } ,
2169
+ } ;
2170
+
2171
+ this . _currentDrawSource = updatedJGISLayerSource ;
2172
+ if ( this . _currentDrawSourceID ) {
2173
+ this . _model . sharedModel . updateSource (
2174
+ this . _currentDrawSourceID ,
2175
+ updatedJGISLayerSource ,
2176
+ ) ;
2177
+ }
2174
2178
}
2175
2179
}
2176
2180
} ;
@@ -2181,39 +2185,39 @@ export class MainView extends React.Component<IProps, IStates> {
2181
2185
}
2182
2186
} ;
2183
2187
2184
- _updateDrawInteraction = ( ) => {
2188
+ _updateInteractions = ( ) => {
2185
2189
if ( this . _draw ) {
2186
2190
this . _removeDrawInteraction ( ) ;
2187
2191
}
2192
+ if ( this . _select ) {
2193
+ this . _removeSelectInteraction ( ) ;
2194
+ }
2195
+ if ( this . _modify ) {
2196
+ this . _removeModifyInteraction ( ) ;
2197
+ }
2198
+ if ( this . _snap ) {
2199
+ this . _removeSnapInteraction ( ) ;
2200
+ }
2188
2201
this . _draw = new Draw ( {
2189
2202
style : drawInteractionStyle ,
2190
2203
type : this . _currentDrawGeometry ,
2191
2204
source : this . _currentVectorSource ,
2192
2205
} ) ;
2193
- this . _draw . setActive ( true ) ;
2194
- this . _Map . addInteraction ( this . _draw ) ;
2195
- } ;
2196
-
2197
- _updateModifyInteraction = ( ) => {
2198
- if ( this . _modify ) {
2199
- this . _removeModifyInteraction ( ) ;
2200
- }
2206
+ this . _select = new Select ( ) ;
2201
2207
this . _modify = new Modify ( {
2202
- source : this . _currentVectorSource ,
2208
+ features : this . _select . getFeatures ( ) ,
2203
2209
} ) ;
2204
- this . _modify . setActive ( true ) ;
2205
- this . _Map . addInteraction ( this . _modify ) ;
2206
- } ;
2207
-
2208
- _updateSnapInteraction = ( ) => {
2209
- if ( this . _snap ) {
2210
- this . _removeSnapInteraction ( ) ;
2211
- }
2212
2210
this . _snap = new Snap ( {
2213
2211
source : this . _currentVectorSource ,
2214
2212
} ) ;
2215
- this . _snap . setActive ( true ) ;
2213
+ this . _Map . addInteraction ( this . _draw ) ;
2214
+ this . _Map . addInteraction ( this . _select ) ;
2215
+ this . _Map . addInteraction ( this . _modify ) ;
2216
2216
this . _Map . addInteraction ( this . _snap ) ;
2217
+ this . _draw . setActive ( true ) ;
2218
+ this . _select . setActive ( false ) ;
2219
+ this . _modify . setActive ( false ) ;
2220
+ this . _snap . setActive ( true ) ;
2217
2221
} ;
2218
2222
2219
2223
_editVectorLayer = ( ) => {
@@ -2223,51 +2227,45 @@ export class MainView extends React.Component<IProps, IStates> {
2223
2227
this . _currentDrawLayerID ,
2224
2228
) ;
2225
2229
if ( this . _currentVectorSource && this . _currentDrawGeometry ) {
2226
- this . _updateDrawInteraction ( ) ; /* remove previous draw interactions and instantiate a new one */
2227
- this . _updateSnapInteraction ( ) ;
2228
- this . _updateModifyInteraction ( ) ;
2230
+ this . _updateInteractions ( ) ; /* remove previous interactions and instantiate new ones */
2229
2231
this . _updateDrawSource ( ) ; /*add new features, update source and get changes reported to the JGIS Document in geoJSON format */
2230
2232
}
2231
2233
}
2232
2234
} ;
2233
2235
2234
2236
private _removeDrawInteraction = ( ) => {
2237
+ this . _draw . setActive ( false ) ;
2235
2238
this . _Map . removeInteraction ( this . _draw ) ;
2236
2239
} ;
2237
2240
2241
+ private _removeSelectInteraction = ( ) => {
2242
+ this . _select . setActive ( false ) ;
2243
+ this . _Map . removeInteraction ( this . _select ) ;
2244
+ } ;
2245
+
2238
2246
private _removeSnapInteraction = ( ) => {
2247
+ this . _snap . setActive ( false ) ;
2239
2248
this . _Map . removeInteraction ( this . _snap ) ;
2240
2249
} ;
2241
2250
2242
2251
private _removeModifyInteraction = ( ) => {
2252
+ this . _modify . setActive ( false ) ;
2243
2253
this . _Map . removeInteraction ( this . _modify ) ;
2244
2254
} ;
2245
2255
2246
2256
private _onVectorSourceChangeHandler = ( ) => {
2247
2257
this . _onVectorSourceChange ( ) ;
2248
2258
} ;
2249
2259
2250
- private _onAwarenessChangeHandler = ( ) => {
2260
+ private _onSelectedLayerChangeHandler = ( ) => {
2251
2261
const selectedLayers =
2252
2262
this . _model . sharedModel . awareness . getLocalState ( ) ?. selected ?. value ;
2253
2263
const selectedLayerId = selectedLayers
2254
2264
? Object . keys ( selectedLayers ) [ 0 ]
2255
- : null ;
2256
-
2265
+ : undefined ;
2257
2266
if ( selectedLayerId && selectedLayerId !== this . _previousDrawLayerID ) {
2258
2267
this . _previousDrawLayerID = selectedLayerId ;
2259
2268
this . _currentDrawLayerID = selectedLayerId ;
2260
-
2261
- this . _currentVectorSource =
2262
- this . _getVectorSourceFromLayerID ( selectedLayerId ) ;
2263
-
2264
- if ( this . _currentVectorSource ) {
2265
- this . _currentVectorSource . on (
2266
- 'change' ,
2267
- this . _onVectorSourceChangeHandler ,
2268
- ) ;
2269
- }
2270
-
2271
2269
this . _editVectorLayer ( ) ;
2272
2270
}
2273
2271
} ;
@@ -2391,9 +2389,10 @@ export class MainView extends React.Component<IProps, IStates> {
2391
2389
private _loadingLayers : Set < string > ;
2392
2390
private _originalFeatures : IDict < Feature < Geometry > [ ] > = { } ;
2393
2391
private _highlightLayer : VectorLayer < VectorSource > ;
2394
- private _draw : Interaction ;
2395
- private _snap : Interaction ;
2396
- private _modify : Interaction ;
2392
+ private _draw : Draw ;
2393
+ private _snap : Snap ;
2394
+ private _modify : Modify ;
2395
+ private _select : Select ;
2397
2396
private _currentDrawLayerID : string | undefined ;
2398
2397
private _previousDrawLayerID : string | undefined ;
2399
2398
private _currentDrawSource : IJGISSource | undefined ;
0 commit comments