ekylibre-cartography 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +3 -0
  3. data/Rakefile +10 -0
  4. data/app/assets/javascripts/cartography.coffee +535 -0
  5. data/app/assets/javascripts/cartography/base.coffee +11 -0
  6. data/app/assets/javascripts/cartography/controls.coffee +463 -0
  7. data/app/assets/javascripts/cartography/events.coffee +36 -0
  8. data/app/assets/javascripts/cartography/layers.coffee +127 -0
  9. data/app/assets/javascripts/cartography/layers/simple.coffee +37 -0
  10. data/app/assets/javascripts/cartography/leaflet/controls.coffee +420 -0
  11. data/app/assets/javascripts/cartography/leaflet/handlers.coffee +461 -0
  12. data/app/assets/javascripts/cartography/leaflet/i18n.coffee +31 -0
  13. data/app/assets/javascripts/cartography/leaflet/layers.coffee +60 -0
  14. data/app/assets/javascripts/cartography/leaflet/toolbars.coffee +450 -0
  15. data/app/assets/javascripts/cartography/patches.js +8 -0
  16. data/app/assets/javascripts/cartography/util.coffee +18 -0
  17. data/app/assets/javascripts/main.js +18 -0
  18. data/app/assets/stylesheets/cartography.css +86 -0
  19. data/app/helpers/cartography_helper.rb +55 -0
  20. data/lib/cartography.rb +1 -0
  21. data/lib/cartography/engine.rb +11 -0
  22. data/lib/cartography/version.rb +3 -0
  23. data/vendor/assets/components/d3-array/dist/d3-array.js +590 -0
  24. data/vendor/assets/components/d3-array/dist/d3-array.min.js +2 -0
  25. data/vendor/assets/components/geojson-equality/dist/geojson-equality.js +295 -0
  26. data/vendor/assets/components/geojson-equality/dist/geojson-equality.js.map +21 -0
  27. data/vendor/assets/components/geojson-equality/dist/geojson-equality.min.js +1 -0
  28. data/vendor/assets/components/leaflet-controlpanel/dist/leaflet.controlpanel.css +29 -0
  29. data/vendor/assets/components/leaflet-controlpanel/dist/leaflet.controlpanel.js +269 -0
  30. data/vendor/assets/components/leaflet-draw-cut/dist/leaflet.draw.cut.css +1 -0
  31. data/vendor/assets/components/leaflet-draw-cut/dist/leaflet.draw.cut.js +8 -0
  32. data/vendor/assets/components/leaflet-draw-merge/dist/leaflet.draw.merge.css +0 -0
  33. data/vendor/assets/components/leaflet-draw-merge/dist/leaflet.draw.merge.js +48026 -0
  34. data/vendor/assets/components/leaflet-draw/dist/leaflet.draw-src.css +326 -0
  35. data/vendor/assets/components/leaflet-draw/dist/leaflet.draw-src.js +4653 -0
  36. data/vendor/assets/components/leaflet-draw/dist/leaflet.draw-src.map +1 -0
  37. data/vendor/assets/components/leaflet-draw/dist/leaflet.draw.css +10 -0
  38. data/vendor/assets/components/leaflet-draw/dist/leaflet.draw.js +10 -0
  39. data/vendor/assets/components/leaflet-geographicutil/dist/leaflet.geographicutil.js +3220 -0
  40. data/vendor/assets/components/leaflet-reactive_measure/dist/reactive_measure.css +30 -0
  41. data/vendor/assets/components/leaflet-reactive_measure/dist/reactive_measure.js +3764 -0
  42. data/vendor/assets/components/leaflet/dist/leaflet-src.js +13609 -0
  43. data/vendor/assets/components/leaflet/dist/leaflet-src.js.map +1 -0
  44. data/vendor/assets/components/leaflet/dist/leaflet-src.map +1 -0
  45. data/vendor/assets/components/leaflet/dist/leaflet.css +632 -0
  46. data/vendor/assets/components/leaflet/dist/leaflet.js +5 -0
  47. data/vendor/assets/components/leaflet/dist/leaflet.js.map +1 -0
  48. data/vendor/assets/components/martinez-polygon-clipping/dist/martinez.min.js +9 -0
  49. data/vendor/assets/components/martinez-polygon-clipping/dist/martinez.umd.js +1716 -0
  50. data/vendor/assets/components/martinez-polygon-clipping/dist/martinez.umd.js.map +1 -0
  51. data/vendor/assets/components/polygon-clipping/dist/polygon-clipping.js +279 -0
  52. data/vendor/assets/components/polygon-clipping/dist/polygon-clipping.min.js +1 -0
  53. data/vendor/assets/components/rtree/dist/rtree.js +911 -0
  54. data/vendor/assets/components/rtree/dist/rtree.min.js +1 -0
  55. data/vendor/assets/components/splaytree/dist/splay.es6.js +765 -0
  56. data/vendor/assets/components/splaytree/dist/splay.es6.js.map +1 -0
  57. data/vendor/assets/components/splaytree/dist/splay.js +797 -0
  58. data/vendor/assets/components/splaytree/dist/splay.js.map +1 -0
  59. metadata +156 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 78e2caf3b8e30c5efa269f552f49ac1c1e255701cee461a657237255ed42f7a5
4
+ data.tar.gz: 3013a1ef5bea6a49c35f57f71b09ebdd50d75a47a38d21e384e275da40205988
5
+ SHA512:
6
+ metadata.gz: 79f304cb9082de0c96e039ecacb74a3bf55f8bbeea52802119e6d70e8924e2aa6f395f22783cae14f62d44552b3c31e7526e847f6502360459cf7b3a4433d33c
7
+ data.tar.gz: 65a544cc1d3a91421149062eae776bf85faf0cf0a4edf54ec4956c35ed60ed7f69cb816d177f4808a65683f0bc7f3a07cb9fc13d06c783afb0d43089e6890df1
data/README.md ADDED
@@ -0,0 +1,3 @@
1
+ # Cartography
2
+
3
+ Leaflet wrapper to easily display maps and draw shapes. It embeds a set of third-party's and Ekylibre's plugins.
data/Rakefile ADDED
@@ -0,0 +1,10 @@
1
+ require "bundler/gem_tasks"
2
+ require "rake/testtask"
3
+
4
+ Rake::TestTask.new(:test) do |t|
5
+ t.libs << "test"
6
+ t.libs << "lib"
7
+ t.test_files = FileList['test/**/*_test.rb']
8
+ end
9
+
10
+ task :default => :test
@@ -0,0 +1,535 @@
1
+ #= require cartography/events
2
+ #= require cartography/util
3
+ #= require cartography/base
4
+ #= require cartography/controls
5
+ #= require cartography/layers
6
+ #= require cartography/layers/simple
7
+
8
+ ((C) ->
9
+ "use strict"
10
+
11
+ class C.Map extends C.BaseClass
12
+ @IDS: 0
13
+ options:
14
+ box:
15
+ height: '85vh'
16
+ width: undefined
17
+ map:
18
+ scrollWheelZoom: true
19
+ zoomControl: false
20
+ attributionControl: true
21
+ setDefaultBackground: false
22
+ setDefaultOverlay: false
23
+ dragging: true
24
+ touchZoom: true
25
+ doubleClickZoom: true
26
+ boxZoom: true
27
+ tap: true
28
+ controls:
29
+ draw: false
30
+ cut: false
31
+ layers: true
32
+ backgrounds: true
33
+ overlays: true
34
+ edit: true
35
+ snap: true
36
+ reactiveMeasure: true
37
+ selection: false
38
+ locking: false
39
+ zoom: true
40
+ home: true
41
+ scale: true
42
+ snap:
43
+ panel:
44
+ surfaceProperty: 'Surface'
45
+ polygon:
46
+ snapDistance: 15
47
+ snapOriginDistance: 15
48
+ cut:
49
+ cycling: 2
50
+ panel:
51
+ title: 'Splitter tool'
52
+ animatedHelper: undefined
53
+ surfacesProperty: 'Surfaces'
54
+ merge:
55
+ panel:
56
+ title: 'Merger tool'
57
+ animatedHelper: undefined
58
+ draw:
59
+ panel:
60
+ title: 'Create plot'
61
+ coordinatesProperty: 'Coordinates'
62
+ animatedHelper: undefined
63
+ ignoreActions: true
64
+ edit:
65
+ selectedPathOptions:
66
+ dashArray: null
67
+ fill: true
68
+ color: '#1195F5'
69
+ fillColor: '#1195F5'
70
+ opacity: 1
71
+ fillOpacity: 0.35
72
+ maintainColor: false
73
+ panel:
74
+ title: 'Edit plot'
75
+ animatedHelper: undefined
76
+ remove: false
77
+ controlLayers:
78
+ position: 'topleft'
79
+ zoom:
80
+ zoomInTitle: 'Zoom in'
81
+ zoomOutTitle: 'Zoom out'
82
+
83
+ constructor: (id, options = {}) ->
84
+ C.Util.setOptions @, options
85
+
86
+ # Merge drawLocal to forward translations through options.
87
+ _.merge @options, L.drawLocal
88
+
89
+ @baseElement = L.DomUtil.get(id)
90
+ @baseElement.setAttribute "data-map-id", @constructor.IDS
91
+ @constructor.IDS++
92
+
93
+ @mapElement = L.DomUtil.create('div', 'map', @baseElement)
94
+
95
+ @map = L.map(@mapElement, @options.map)
96
+
97
+ @setMode @options.mode
98
+
99
+ @resize()
100
+
101
+ @controls()
102
+
103
+ @initHooks()
104
+
105
+ resize: ->
106
+ if @options.box? and @options.box.height?
107
+ @mapElement.style.height = @options.box.height
108
+ if @options.box? and @options.box.width?
109
+ @mapElement.style.width = @options.box.width
110
+
111
+ initHooks: ->
112
+
113
+ @getMap().on L.Draw.Event.CREATED, (e) =>
114
+ return unless e.layerType == "polygon" or e.layerType is undefined
115
+
116
+ feature = if e.layer instanceof L.Layer
117
+ then e.layer.toGeoJSON(17)
118
+ else e.layer
119
+
120
+ @getFeatureGroup(name: "edition").addData(feature)
121
+
122
+ uuid = feature.properties.uuid
123
+ type = feature.properties.type = @getMode()
124
+
125
+ layer = @getFeatureGroup(name: "edition").getLayers()[..].pop()
126
+ centroid = layer.getCenter()
127
+ area = L.GeometryUtil.geodesicArea(layer.getLatLngs()[0])
128
+
129
+ @getMap().fire C.Events.new.complete, data: { uuid: uuid, type: type, shape: feature, area: area, centroid: centroid }
130
+
131
+ @getMap().on L.Selectable.Event.SELECT, (e) =>
132
+ @getMap().fire C.Events.select.select, data: { uuid: e.layer.feature.properties.uuid }
133
+
134
+ @getMap().on L.Selectable.Event.UNSELECT, (e) =>
135
+ @getMap().fire C.Events.select.unselect, data: { uuid: e.layer.feature.properties.uuid }
136
+
137
+ @getMap().on L.Selectable.Event.SELECTED, (e) ->
138
+ console.error 'selected layers', e
139
+
140
+ @getMap().on L.Selectable.Event.START, (e) ->
141
+ console.error "Starting selection mode"
142
+
143
+ @getMap().on L.Selectable.Event.STOP, (e) ->
144
+ console.error "Stopping selection mode"
145
+
146
+ @getMap().on L.Cutting.Polyline.Event.START, =>
147
+ @getMap().fire C.Events.split.start
148
+
149
+ @getMap().on L.Cutting.Polyline.Event.STOP, =>
150
+ @getMap().fire C.Events.split.cancel
151
+
152
+ @getMap().on L.Cutting.Polyline.Event.SELECT, (e) =>
153
+ uuid = e.layer.feature.properties.uuid
154
+ type = e.layer.feature.properties.type || @getMode()
155
+ @getMap().fire C.Events.split.select, data: { uuid: uuid, type: type }
156
+
157
+ onSplitChange = (e) =>
158
+ data = {}
159
+ data['splitter'] = e.splitter
160
+ data['old'] = {uuid: e.parent.feature.properties.uuid, name: e.parent.feature.properties.name}
161
+ data['new'] = e.layers.map (layer) ->
162
+ p = layer.feature.properties
163
+ measure = layer.getMeasure()
164
+
165
+ { num: p.num, area: measure.extrapolatedArea, perimeter: measure.extrapolatedPerimeter, color: p.color, shape: layer.toGeoJSON(17) }
166
+
167
+ @getMap().fire C.Events.split.change, data: data
168
+
169
+ @getMap().on L.Cutting.Polyline.Event.CREATED, onSplitChange, @
170
+ @getMap().on L.Cutting.Polyline.Event.UPDATED, onSplitChange, @
171
+
172
+ @getMap().on L.Cutting.Polyline.Event.CUTTING, (e) =>
173
+ @getMap().fire C.Events.split.cutting, data: perimeter: e.perimeter
174
+
175
+ @getMap().on L.SnapEditing.Event.CHANGE, (e) =>
176
+ if e.layer.getLatLngs().constructor.name is 'Array'
177
+ latlngs = e.layer.getLatLngs()[0]
178
+ else
179
+ latlngs = e.layer.getLatLngs()
180
+
181
+ area = L.GeometryUtil.geodesicArea(latlngs)
182
+ feature = e.layer.toGeoJSON(17)
183
+
184
+ uuid = feature.properties.uuid
185
+ type = feature.properties.type = @getMode()
186
+
187
+ centroid = e.layer.getCenter()
188
+
189
+ @getMap().fire C.Events.edit.change, data: { uuid: uuid, type: type, shape: feature, area: area, centroid: centroid }
190
+
191
+
192
+ controls: ->
193
+ @controls = new C.Controls(@getMap(), @options)
194
+
195
+ @controls.register 'layers', false, =>
196
+ new C.Controls.Layers(undefined, @getMap(), @options)
197
+ , =>
198
+ @controls.register 'backgrounds', false, =>
199
+ new C.Controls.BaseLayers(@controls.get('layers').getControl(), @getMap(), @options)
200
+
201
+ @controls.register 'overlays', false, =>
202
+ new C.Controls.OverlayLayers(@controls.get('layers').getControl(), @getMap(), @options)
203
+ , =>
204
+ return unless @options.controls.snap?
205
+ layers = @controls.get('overlays').getLayers()
206
+ @options.snap.polygon.guideLayers = Object.values(layers)
207
+
208
+ if @options.controls.backgrounds
209
+ @controls.add 'backgrounds'
210
+
211
+ if @options.controls.overlays
212
+ @controls.add 'overlays'
213
+
214
+ @controls.register 'zoom', true, =>
215
+ new C.Controls.Zoom(@getMap(), @options.zoom)
216
+
217
+ @controls.register 'home', true, =>
218
+ new C.Controls.Home(@getMap(), home: { featureGroup: @getFeatureGroup() } )
219
+
220
+ @controls.register 'draw', true, =>
221
+ new C.Controls.Draw(@getMap(), @options)
222
+
223
+ @controls.register 'edit', true, =>
224
+ C.Util.setOptions @, edit: {featureGroup: @getFeatureGroup()}
225
+ new C.Controls.Edit(@getMap(), @options)
226
+ , =>
227
+ return unless @options.controls.reactiveMeasure?
228
+ @controls.register 'measure', true, =>
229
+ new C.Controls.Edit.ReactiveMeasure(@getMap(), @controls.get('edit'), @options)
230
+ @controls.add 'measure'
231
+ @removeControl 'edit'
232
+
233
+ @controls.register 'scale', true, =>
234
+ new C.Controls.Scale(@getMap(), @options)
235
+
236
+ @controls.register 'selection', false, =>
237
+ new C.Controls.LayerSelection(@getMap(), {layerSelection: {featureGroup: @getFeatureGroup()}})
238
+ , =>
239
+ @controls.get('selection').getControl().enable()
240
+
241
+ @controls.register 'locking', false, =>
242
+ new C.Controls.LayerLocking(@getMap(), {layerLocking: {featureGroup: @getFeatureGroup(name: 'crops')}})
243
+ , =>
244
+ @controls.get('locking').getControl().enable()
245
+
246
+ @controls.register 'shape_draw', false, =>
247
+ unless @options.draw.allowOverlap
248
+ layers = @controls.get('overlays').getLayers()
249
+ @options.draw.overlapLayers = Object.values(layers)
250
+ new C.Controls.ShapeDraw(@getMap(), @options)
251
+ , =>
252
+ @controls.get('shape_draw').getControl().enable()
253
+
254
+ @controls.register 'cut', true, =>
255
+ C.Util.setOptions @, cut: {featureGroup: @getFeatureGroup()}
256
+ new C.Controls.Cut(@getMap(), @options)
257
+
258
+ @controls.register 'shape_cut', false, =>
259
+ C.Util.setOptions @, cut: {featureGroup: @getFeatureGroup()}
260
+ new C.Controls.ShapeCut(@getMap(), @options)
261
+ , =>
262
+ @controls.get('shape_cut').getControl().enable()
263
+
264
+ if @options.controls.layers
265
+ @controls.add 'layers'
266
+
267
+ if @options.controls.zoom
268
+ @controls.add 'zoom'
269
+
270
+ if @options.controls.home
271
+ @controls.add 'home'
272
+
273
+ if @options.controls.edit
274
+ @controls.add 'edit'
275
+
276
+ if @options.controls.scale
277
+ @controls.add 'scale'
278
+
279
+ if @options.controls.selection
280
+ @controls.add 'selection'
281
+
282
+ if @options.controls.locking
283
+ @controls.add 'locking'
284
+
285
+ if @options.controls.draw
286
+ @controls.add 'draw'
287
+
288
+ if @options.controls.cut
289
+ @controls.add 'cut'
290
+
291
+ style = (feature) ->
292
+ feature.properties.style ||= {}
293
+ color: feature.properties.style.color || "#1195F5", fillOpacity: feature.properties.style.opacity || 0.35, opacity: 1, fill: true
294
+
295
+ serie = [{edition: []}, [name: 'edition', type: 'simple', index: true, serie: 'edition', style: style]]
296
+ @addOverlay(serie)
297
+ @setView()
298
+
299
+ ##### PUBLIC API ######
300
+ setView: ->
301
+ if @options.bounds
302
+ bounds = @options.bounds.split(',')
303
+ @getMap().fitBounds([[bounds[1], bounds[0]], [bounds[3], bounds[2]]],{ maxZoom: 21 })
304
+ return
305
+
306
+ if @getFeatureGroup().getLayers().length
307
+ @getMap().fitBounds(@getFeatureGroup().getBounds(),{ maxZoom: 21 })
308
+ else
309
+ @center @defaultCenter(), 6
310
+
311
+ setMode: (mode) ->
312
+ @_mode = mode
313
+
314
+ getMode: ->
315
+ @_mode
316
+
317
+ setOffset: (obj) ->
318
+ @_offset = L.point obj
319
+
320
+ resetOffset: ->
321
+ delete @_offset
322
+
323
+ center: (obj, zoom = 18) ->
324
+ return unless obj.lat && obj.lng
325
+
326
+ @getMap().setView L.latLng(obj), zoom
327
+
328
+ _findLayerByUUID: (featureGroup, uuid) ->
329
+ containerLayer = undefined
330
+ featureGroup.eachLayer (layer) ->
331
+ if layer.feature and layer.feature.properties.uuid == uuid
332
+ containerLayer = layer
333
+ return
334
+ containerLayer
335
+
336
+ select: (uuid, center = false, featureGroup = undefined, trigger = true) ->
337
+ name = featureGroup if featureGroup
338
+ featureGroup = @getFeatureGroup(name: name)
339
+ layer = @_findLayerByUUID(featureGroup, uuid)
340
+ if layer && !layer.selected
341
+ if trigger
342
+ layer.fire 'click'
343
+ layer.fire 'select'
344
+ if center
345
+ @getMap().fitBounds layer.getBounds()
346
+
347
+ layer
348
+
349
+ selectMany: (uuids, center = false) ->
350
+ layers = []
351
+ for uuid in uuids
352
+ featureGroup = @getFeatureGroup()
353
+ layer = @_findLayerByUUID(featureGroup, uuid)
354
+ if layer
355
+ layers.push layer
356
+ unless layer.selected
357
+ layer.fire 'click'
358
+ group = L.featureGroup layers
359
+ if center && group
360
+ @getMap().fitBounds group.getBounds()
361
+ group
362
+
363
+ unselectMany: (uuids) ->
364
+ for uuid in uuids
365
+ featureGroup = @getFeatureGroup()
366
+ layer = @_findLayerByUUID(featureGroup, uuid)
367
+ if layer && layer.selected
368
+ layer.fire 'click'
369
+
370
+ centerCollection: (uuids, center = true) ->
371
+ layers = []
372
+ for uuid in uuids
373
+ featureGroup = @getFeatureGroup()
374
+ layer = @_findLayerByUUID(featureGroup, uuid)
375
+ if layer
376
+ layers.push layer
377
+ group = L.featureGroup layers
378
+ if center && group
379
+ @getMap().fitBounds group.getBounds()
380
+ group
381
+
382
+ centerLayer: (uuid, center = true, featureGroup = undefined) ->
383
+ featureGroup = @getFeatureGroup(name: featureGroup)
384
+ layer = @_findLayerByUUID(featureGroup, uuid)
385
+
386
+ if center && layer
387
+ @getMap().fitBounds layer.getBounds()
388
+
389
+ layer
390
+
391
+ unselect: (uuid) ->
392
+ featureGroup = @getFeatureGroup()
393
+ layer = @_findLayerByUUID(featureGroup, uuid)
394
+ if layer && layer.selected
395
+ @unhighlight(uuid)
396
+ layer.fire 'select'
397
+
398
+ highlight: (uuid, featureGroup = undefined) ->
399
+ layer = @select uuid, false, featureGroup, false
400
+ if layer
401
+ layer.options.highlightOriginal = L.extend({}, layer.options)
402
+ layer.setStyle color: "#D84315", fillOpacity: 0.5
403
+
404
+ unhighlight: (uuid, featureGroup = undefined) ->
405
+ layer = @select uuid, false, featureGroup, false
406
+ if layer
407
+ layer.setStyle layer.options.highlightOriginal
408
+ delete layer.options.highlightOriginal
409
+
410
+ destroy: (uuid, featureGroup = undefined) ->
411
+ layer = @select uuid, false, featureGroup, false
412
+ name = featureGroup if featureGroup
413
+ if layer
414
+ @getFeatureGroup(name: name).removeLayer layer
415
+
416
+ buildControls: (name = undefined) ->
417
+ featureGroup = @getFeatureGroup(name: name)
418
+ return unless featureGroup && featureGroup.getLayers()
419
+ featureGroup.eachLayer (layer) ->
420
+ layer.onBuild.call @ if layer.onBuild and layer.onBuild.constructor.name == 'Function'
421
+
422
+ edit: (uuid, featureGroup = undefined, options = {}) ->
423
+ @unhighlight uuid
424
+ layer = @select uuid, false, featureGroup, false
425
+ if layer
426
+ if options.cancel && layer._editToolbar
427
+ layer._editToolbar.disable()
428
+ @unselect layer.feature.properties.uuid
429
+ return
430
+
431
+ snapOptions = {polygon: guideLayers: @getFeatureGroup()}
432
+
433
+ options = C.Util.extend @options, snap: snapOptions
434
+
435
+ layer._editToolbar = new L.EditToolbar.SelectableSnapEdit @getMap(),
436
+ snapOptions: options.snap
437
+ featureGroup: @getFeatureGroup(name: featureGroup)
438
+ selectedPathOptions: options.edit.selectedPathOptions
439
+ disabledPathOptions: options.edit.disabledPathOptions
440
+ poly: options.poly
441
+ layer._editToolbar.enable layer
442
+ layer._editToolbar._activate layer
443
+
444
+ union: (polygons) ->
445
+ L.Calculation.union(polygons)
446
+
447
+ difference: (feature1, feature2) ->
448
+ L.Calculation.difference(feature1, feature2)
449
+
450
+ contains: (feature1, feature2) ->
451
+ L.Calculation.contains feature1, feature2
452
+
453
+ intersect: (feature1, feature2) ->
454
+ L.Calculation.intersect feature1, feature2
455
+
456
+ sync: (data, layerName, options = {}) =>
457
+
458
+ layerGroup = @controls.get('overlays').getLayers()[layerName]
459
+
460
+ newLayers = new L.geoJSON()
461
+
462
+ onAdd = (e) =>
463
+ layerGroup.bindInit 'layeradd', onLayerAdd
464
+ e.target.eachLayer (layer) =>
465
+ if options.onEachFeature && options.onEachFeature.constructor.name is 'Function'
466
+ options.onEachFeature.call @, layer
467
+
468
+ onLayerAdd = (e) =>
469
+ if options.onEachFeature && options.onEachFeature.constructor.name is 'Function'
470
+ options.onEachFeature.call @, e.layer
471
+
472
+ layerGroup.bindInit 'layeradd', onLayerAdd
473
+ layerGroup.bindInit 'add', onAdd
474
+
475
+ layerGroup.on 'remove', =>
476
+ layerGroup.unbind 'layeradd', onLayerAdd
477
+
478
+ for el in data
479
+ if el.shape
480
+ geojson = el.shape
481
+ feature = L.GeoJSON.asFeature(el.shape)
482
+ feature.properties = el
483
+ delete feature.properties.shape
484
+ newLayers.addData(feature)
485
+
486
+ if layerGroup.getLayers().length
487
+ removeList = layerGroup.getLayers().filter (layer) ->
488
+ !newLayers.hasUUIDLayer layer
489
+
490
+ if removeList.length
491
+ for l in removeList
492
+ @getMap().fire L.Selectable.Event.UNSELECT, { layer: l }
493
+ layerGroup.removeLayer l
494
+
495
+ addList = newLayers.getLayers().filter (layer) ->
496
+ !layerGroup.hasUUIDLayer layer
497
+
498
+ else
499
+ addList = newLayers.getLayers()
500
+
501
+ for layer in addList
502
+ geojson = layer.toGeoJSON(17)
503
+ layerGroup.addData(geojson)
504
+ # newLayer = @_findLayerByUUID(layerGroup, geojson.properties.uuid)
505
+
506
+
507
+ defaultCenter: =>
508
+ @options.defaultCenter
509
+
510
+ addOverlay: (serie, type = "series") =>
511
+ @controls.get('overlays').add(serie, type)
512
+
513
+ removeOverlay: (name) =>
514
+ @controls.get('overlays').remove(name)
515
+
516
+ getOverlay: (name) =>
517
+ @controls.get('overlays').getLayer(name)
518
+
519
+ addControl: (name) =>
520
+ @controls.add(name)
521
+
522
+ removeControl: (name) =>
523
+ @controls.remove(name)
524
+
525
+ getFeatureGroup: (options = {}) =>
526
+ options.main ||= true
527
+
528
+ return @controls.get('overlays').getLayers()[options.name] if options.name
529
+
530
+ @controls.get('overlays').getMainLayer()
531
+
532
+ clean: =>
533
+ @getFeatureGroup(name: "edition").clearLayers()
534
+
535
+ )(window.Cartography = window.Cartography || {})