@artstesh/maps 5.0.9 → 5.0.10

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 (47) hide show
  1. package/dist/esm2022/map/map-plate/map-plate.component.mjs +4 -1
  2. package/dist/esm2022/map/messages/commands/draw-selection-area.command.mjs +17 -0
  3. package/dist/esm2022/map/messages/index.mjs +2 -1
  4. package/dist/esm2022/map/messages/queries/filter-features-in-area.query.mjs +15 -0
  5. package/dist/esm2022/map/messages/queries/get-features-in-area.query.mjs +15 -0
  6. package/dist/esm2022/map/models/dictionary.mjs +54 -0
  7. package/dist/esm2022/map/models/index.mjs +2 -1
  8. package/dist/esm2022/map/services/drawing/drawing.service.mjs +25 -3
  9. package/dist/esm2022/map/services/feature.service.mjs +30 -0
  10. package/dist/esm2022/map/services/map-management.service.mjs +36 -7
  11. package/dist/esm2022/map/services/message-registrator.service.mjs +12 -5
  12. package/dist/esm2022/src/map/map-plate/map-plate.component.mjs +4 -1
  13. package/dist/esm2022/src/map/messages/commands/draw-selection-area.command.mjs +17 -0
  14. package/dist/esm2022/src/map/messages/index.mjs +2 -1
  15. package/dist/esm2022/src/map/messages/queries/filter-features-in-area.query.mjs +15 -0
  16. package/dist/esm2022/src/map/messages/queries/get-features-in-area.query.mjs +15 -0
  17. package/dist/esm2022/src/map/models/dictionary.mjs +54 -0
  18. package/dist/esm2022/src/map/models/index.mjs +2 -1
  19. package/dist/esm2022/src/map/services/drawing/drawing.service.mjs +25 -3
  20. package/dist/esm2022/src/map/services/feature.service.mjs +30 -0
  21. package/dist/esm2022/src/map/services/map-management.service.mjs +36 -7
  22. package/dist/esm2022/src/map/services/message-registrator.service.mjs +12 -5
  23. package/dist/fesm2022/maps-components-src-map.mjs +186 -14
  24. package/dist/fesm2022/maps-components-src-map.mjs.map +1 -1
  25. package/dist/fesm2022/maps-components.mjs +186 -14
  26. package/dist/fesm2022/maps-components.mjs.map +1 -1
  27. package/dist/map/messages/commands/draw-selection-area.command.d.ts +12 -0
  28. package/dist/map/messages/index.d.ts +1 -0
  29. package/dist/map/messages/queries/filter-features-in-area.query.d.ts +10 -0
  30. package/dist/map/messages/queries/get-features-in-area.query.d.ts +11 -0
  31. package/dist/map/models/dictionary.d.ts +17 -0
  32. package/dist/map/models/index.d.ts +1 -0
  33. package/dist/map/services/drawing/drawing.service.d.ts +2 -0
  34. package/dist/map/services/feature.service.d.ts +11 -0
  35. package/dist/map/services/map-management.service.d.ts +1 -0
  36. package/dist/map/services/message-registrator.service.d.ts +2 -1
  37. package/dist/src/map/messages/commands/draw-selection-area.command.d.ts +12 -0
  38. package/dist/src/map/messages/index.d.ts +1 -0
  39. package/dist/src/map/messages/queries/filter-features-in-area.query.d.ts +10 -0
  40. package/dist/src/map/messages/queries/get-features-in-area.query.d.ts +11 -0
  41. package/dist/src/map/models/dictionary.d.ts +17 -0
  42. package/dist/src/map/models/index.d.ts +1 -0
  43. package/dist/src/map/services/drawing/drawing.service.d.ts +2 -0
  44. package/dist/src/map/services/feature.service.d.ts +11 -0
  45. package/dist/src/map/services/map-management.service.d.ts +1 -0
  46. package/dist/src/map/services/message-registrator.service.d.ts +2 -1
  47. package/package.json +2 -2
@@ -8,7 +8,8 @@ import { GeoJSON, WKT } from 'ol/format';
8
8
  import { getCenter, createEmpty, extend } from 'ol/extent';
9
9
  import { get, useGeographic, transform } from 'ol/proj';
10
10
  import { PostboyGenericMessage, PostboyCallbackMessage, PostboyService, PostboyAbstractRegistrator } from '@artstesh/postboy';
11
- import { first, filter, auditTime } from 'rxjs/operators';
11
+ import { forkJoin, combineLatest } from 'rxjs';
12
+ import { tap, first, filter, auditTime } from 'rxjs/operators';
12
13
  import { Vector, XYZ } from 'ol/source';
13
14
  import { Draw } from 'ol/interaction';
14
15
  import { createRegularPolygon } from 'ol/interaction/Draw';
@@ -18,7 +19,6 @@ import { Vector as Vector$1 } from 'ol/layer';
18
19
  import { bbox } from 'ol/loadingstrategy';
19
20
  import Polygon, { fromExtent } from 'ol/geom/Polygon';
20
21
  import Cluster from 'ol/source/Cluster';
21
- import { combineLatest } from 'rxjs';
22
22
  import Map from 'ol/Map';
23
23
  import View from 'ol/View';
24
24
  import Overlay from 'ol/Overlay';
@@ -194,6 +194,60 @@ var FeatureOutputFormat;
194
194
  FeatureOutputFormat[FeatureOutputFormat["WKT"] = 2] = "WKT";
195
195
  })(FeatureOutputFormat || (FeatureOutputFormat = {}));
196
196
 
197
+ class Dictionary {
198
+ collection = {};
199
+ _keys = new Set();
200
+ get keys() {
201
+ return Array.from(this._keys);
202
+ }
203
+ get size() {
204
+ return this._keys.size;
205
+ }
206
+ static clone(dic, action) {
207
+ return Dictionary.create(dic.collection, action);
208
+ }
209
+ static create(dic, action) {
210
+ let keyList = Object.keys(dic);
211
+ const result = new Dictionary();
212
+ for (let i = 0; i < keyList.length; i++) {
213
+ let key = keyList[i];
214
+ result._keys.add(key);
215
+ result.collection[key] = action ? action(dic[key], key) : dic[key];
216
+ }
217
+ return result;
218
+ }
219
+ find(predicate) {
220
+ let result = null;
221
+ this.forEach((e) => {
222
+ if (result === null && predicate(e))
223
+ result = e;
224
+ });
225
+ return result;
226
+ }
227
+ has = (key) => this._keys.has(key);
228
+ take(key) {
229
+ return this._keys.has(key) ? this.collection[key] : null;
230
+ }
231
+ put(key, value) {
232
+ if (value == null)
233
+ return;
234
+ this.collection[key] = value;
235
+ this._keys.add(key);
236
+ }
237
+ rmv(key) {
238
+ if (!this._keys.has(key))
239
+ return;
240
+ delete this.collection[key];
241
+ this._keys.delete(key);
242
+ }
243
+ forEach(callback) {
244
+ let keys = Object.keys(this.collection);
245
+ for (let i = 0; i < keys.length; i++) {
246
+ callback(this.collection[keys[i]], i);
247
+ }
248
+ }
249
+ }
250
+
197
251
  class MapRenderedEvent extends PostboyGenericMessage {
198
252
  map;
199
253
  static ID = 'b6121807-3b89-4cd3-82cf-089d2cefdc4f';
@@ -271,6 +325,22 @@ class CancelDrawingCommand extends PostboyGenericMessage {
271
325
  }
272
326
  }
273
327
 
328
+ class DrawSelectionAreaCommand extends PostboyCallbackMessage {
329
+ type;
330
+ style;
331
+ ignore;
332
+ static ID = '573d8a0d-f25b-42b7-9ad7-0ac6d86ac362';
333
+ constructor(type, style, ignore = new Set()) {
334
+ super();
335
+ this.type = type;
336
+ this.style = style;
337
+ this.ignore = ignore;
338
+ }
339
+ get id() {
340
+ return DrawSelectionAreaCommand.ID;
341
+ }
342
+ }
343
+
274
344
  class AddLayerCommand extends PostboyGenericMessage {
275
345
  layer;
276
346
  static ID = 'd93e250f-92bc-43ac-9c6a-46c521a1aaa5';
@@ -385,6 +455,34 @@ class GenerateDrawQuery extends PostboyCallbackMessage {
385
455
  }
386
456
  }
387
457
 
458
+ class FilterFeaturesInAreaQuery extends PostboyCallbackMessage {
459
+ area;
460
+ features;
461
+ static ID = '36bb2d94-8028-4512-90dd-2386af3fc67c';
462
+ constructor(area, features) {
463
+ super();
464
+ this.area = area;
465
+ this.features = features;
466
+ }
467
+ get id() {
468
+ return FilterFeaturesInAreaQuery.ID;
469
+ }
470
+ }
471
+
472
+ class GetFeaturesInAreaQuery extends PostboyCallbackMessage {
473
+ area;
474
+ ignore;
475
+ static ID = 'efcf4271-a07a-40e0-9f02-d4dade40b8ac';
476
+ constructor(area, ignore = new Set()) {
477
+ super();
478
+ this.area = area;
479
+ this.ignore = ignore;
480
+ }
481
+ get id() {
482
+ return GetFeaturesInAreaQuery.ID;
483
+ }
484
+ }
485
+
388
486
  class MapPostboyService extends PostboyService {
389
487
  constructor() {
390
488
  super();
@@ -400,7 +498,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
400
498
  class MapManagementService {
401
499
  postboy;
402
500
  map;
403
- layers = {};
501
+ layers = new Dictionary();
404
502
  constructor(postboy) {
405
503
  this.postboy = postboy;
406
504
  }
@@ -412,6 +510,7 @@ class MapManagementService {
412
510
  this.observeAddTile();
413
511
  this.observeRemoveTile();
414
512
  this.observeLayerQuery();
513
+ this.observeFeaturesInArea();
415
514
  }
416
515
  observeRemoveTile() {
417
516
  this.postboy.subscribe(RemoveTileCommand.ID).subscribe((c) => {
@@ -421,7 +520,7 @@ class MapManagementService {
421
520
  });
422
521
  }
423
522
  observeLayerQuery() {
424
- this.postboy.subscribe(GetLayerQuery.ID).subscribe((ev) => ev.finish(this.layers[ev.name] ?? null));
523
+ this.postboy.subscribe(GetLayerQuery.ID).subscribe((ev) => ev.finish(this.layers.take(ev.name)));
425
524
  }
426
525
  observeAddTile() {
427
526
  this.postboy.subscribe(AddTileCommand.ID).subscribe((c) => {
@@ -439,15 +538,15 @@ class MapManagementService {
439
538
  this.postboy.subscribe(AddLayerCommand.ID).subscribe((c) => {
440
539
  if (!this.map)
441
540
  return;
442
- this.layers[c.layer.get('name')] = c.layer;
541
+ this.layers.put(c.layer.get('name'), c.layer);
443
542
  this.map.addLayer(c.layer);
444
543
  });
445
544
  }
446
545
  observePlaceFeatures() {
447
546
  this.postboy.subscribe(PlaceLayerFeaturesCommand.ID).subscribe((c) => {
448
- if (!this.layers[c.layer])
547
+ if (!this.layers.has(c.layer))
449
548
  return;
450
- let source = this.layers[c.layer]?.getSource();
549
+ let source = this.layers.take(c.layer).getSource();
451
550
  if (!!source['getSource'])
452
551
  source = source?.getSource();
453
552
  source?.clear();
@@ -458,10 +557,32 @@ class MapManagementService {
458
557
  this.postboy.subscribe(RemoveLayerCommand.ID).subscribe((c) => {
459
558
  if (!this.map)
460
559
  return;
461
- delete this.layers[c.layer.get('name')];
560
+ this.layers.rmv(c.layer.get('name'));
462
561
  this.map.removeLayer(c.layer);
463
562
  });
464
563
  }
564
+ observeFeaturesInArea() {
565
+ this.postboy.subscribe(GetFeaturesInAreaQuery.ID).subscribe((qr) => {
566
+ let result = new Dictionary();
567
+ const queue = [];
568
+ const queries = [];
569
+ this.layers.forEach((l) => {
570
+ let layerName = l.get('name');
571
+ if (qr.ignore.has(layerName) || layerName === MapConstants.DrawingLayerId)
572
+ return;
573
+ let source = l.getSource();
574
+ if (!!source['getSource'])
575
+ source = source?.getSource();
576
+ const query = new FilterFeaturesInAreaQuery(qr.area, source?.getFeatures() ?? []);
577
+ queue.push(query.result.pipe(tap((r) => {
578
+ result.put(l.get('name'), r.map((e) => ({ id: e.getId(), ...e.get(MapConstants.FeatureInfo) })));
579
+ })));
580
+ queries.push(query);
581
+ });
582
+ forkJoin(queue).subscribe(() => qr.finish(result));
583
+ queries.forEach((q) => this.postboy.fire(q));
584
+ });
585
+ }
465
586
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: MapManagementService, deps: [{ token: MapPostboyService }], target: i0.ɵɵFactoryTarget.Injectable });
466
587
  static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: MapManagementService });
467
588
  }
@@ -584,6 +705,27 @@ class DrawingService {
584
705
  this.postboy = postboy;
585
706
  }
586
707
  up() {
708
+ this.observeDrawing();
709
+ this.observeSelectArea();
710
+ this.observeMapRender();
711
+ }
712
+ observeSelectArea() {
713
+ this.postboy.subscribe(DrawSelectionAreaCommand.ID).subscribe((ev) => {
714
+ const drawingCommand = new StartDrawingCommand(ev.type, ev.style);
715
+ drawingCommand.result.subscribe((r) => {
716
+ if (!r) {
717
+ ev.finish(new Dictionary());
718
+ return;
719
+ }
720
+ const area = PolygonModel.fromGeoJson(1, r).feature.getGeometry();
721
+ const getFeaturesCommand = new GetFeaturesInAreaQuery(area, ev.ignore);
722
+ getFeaturesCommand.result.subscribe((result) => ev.finish(result));
723
+ this.postboy.fire(getFeaturesCommand);
724
+ });
725
+ this.postboy.fire(drawingCommand);
726
+ });
727
+ }
728
+ observeDrawing() {
587
729
  this.postboy.subscribe(StartDrawingCommand.ID).subscribe((ev) => {
588
730
  this.draw((l) => {
589
731
  if (!l || !this.map) {
@@ -603,7 +745,6 @@ class DrawingService {
603
745
  this.postboy.fire(drawQuery);
604
746
  });
605
747
  });
606
- this.observeMapRender();
607
748
  }
608
749
  onEnd(evt, command, layer) {
609
750
  command.finish(command.format === FeatureOutputFormat.GeoJson
@@ -666,10 +807,36 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
666
807
  type: Injectable
667
808
  }], ctorParameters: function () { return [{ type: MapPostboyService }]; } });
668
809
 
810
+ class FeatureService {
811
+ postboy;
812
+ constructor(postboy) {
813
+ this.postboy = postboy;
814
+ }
815
+ up() {
816
+ this.postboy.subscribe(FilterFeaturesInAreaQuery.ID).subscribe((qr) => {
817
+ qr.finish(qr.features.filter((f) => FeatureService.booleanIntersects(qr.area, f.getGeometry())));
818
+ });
819
+ }
820
+ static booleanIntersects(g1, g2) {
821
+ if (g2.getType() === 'Point')
822
+ return g1.intersectsCoordinate(g2.getCoordinates());
823
+ if (g2.getType() === 'Circle')
824
+ return g1.intersectsCoordinate(g2.getCenter());
825
+ if (g2.getType() === 'Polygon')
826
+ return g1.intersectsCoordinate(g2.getInteriorPoint().getCoordinates());
827
+ return false;
828
+ }
829
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: FeatureService, deps: [{ token: MapPostboyService }], target: i0.ɵɵFactoryTarget.Injectable });
830
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: FeatureService });
831
+ }
832
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: FeatureService, decorators: [{
833
+ type: Injectable
834
+ }], ctorParameters: function () { return [{ type: MapPostboyService }]; } });
835
+
669
836
  class MessageRegistratorService extends PostboyAbstractRegistrator {
670
- constructor(service, management, state, feature, interaction, drawing, drawGenerator) {
837
+ constructor(service, management, state, mapFeature, interaction, drawing, drawGenerator, feature) {
671
838
  super(service);
672
- this.registerServices([management, state, interaction, feature, drawing, drawGenerator]);
839
+ this.registerServices([management, state, interaction, mapFeature, drawing, drawGenerator, feature]);
673
840
  }
674
841
  _up() {
675
842
  this.registerReplay(MapRenderedEvent.ID);
@@ -687,13 +854,16 @@ class MessageRegistratorService extends PostboyAbstractRegistrator {
687
854
  this.registerSubject(GetLayerQuery.ID);
688
855
  this.registerSubject(DrawingFinishedEvent.ID);
689
856
  this.registerSubject(GenerateDrawQuery.ID);
857
+ this.registerSubject(FilterFeaturesInAreaQuery.ID);
858
+ this.registerSubject(GetFeaturesInAreaQuery.ID);
859
+ this.registerSubject(DrawSelectionAreaCommand.ID);
690
860
  }
691
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: MessageRegistratorService, deps: [{ token: MapPostboyService }, { token: MapManagementService }, { token: MapStateService }, { token: MapFeatureService }, { token: MapClickService }, { token: DrawingService }, { token: DrawingGenerationService }], target: i0.ɵɵFactoryTarget.Injectable });
861
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: MessageRegistratorService, deps: [{ token: MapPostboyService }, { token: MapManagementService }, { token: MapStateService }, { token: MapFeatureService }, { token: MapClickService }, { token: DrawingService }, { token: DrawingGenerationService }, { token: FeatureService }], target: i0.ɵɵFactoryTarget.Injectable });
692
862
  static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: MessageRegistratorService });
693
863
  }
694
864
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: MessageRegistratorService, decorators: [{
695
865
  type: Injectable
696
- }], ctorParameters: function () { return [{ type: MapPostboyService }, { type: MapManagementService }, { type: MapStateService }, { type: MapFeatureService }, { type: MapClickService }, { type: DrawingService }, { type: DrawingGenerationService }]; } });
866
+ }], ctorParameters: function () { return [{ type: MapPostboyService }, { type: MapManagementService }, { type: MapStateService }, { type: MapFeatureService }, { type: MapClickService }, { type: DrawingService }, { type: DrawingGenerationService }, { type: FeatureService }]; } });
697
867
 
698
868
  class TileLayerSettings {
699
869
  maxZoom = 19;
@@ -1259,6 +1429,7 @@ class MapPlateComponent extends DestructibleComponent {
1259
1429
  MapFeatureService,
1260
1430
  DrawingService,
1261
1431
  DrawingGenerationService,
1432
+ FeatureService,
1262
1433
  ], usesInheritance: true, ngImport: i0, template: "<ng-content></ng-content>\r\n<lib-osm-tile-layer *ngIf=\"osmUrl && map\" [map]=\"map\" [url]=\"osmUrl\"></lib-osm-tile-layer>\r\n<lib-feature-layer *ngIf=\"map\" [settings]=\"drawingLayerSettings\"></lib-feature-layer>\r\n", styles: ["lib-map-plate{position:relative;display:flex;flex-direction:column;height:100%}\n"], dependencies: [{ kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: OsmTileLayerComponent, selector: "lib-osm-tile-layer", inputs: ["url", "map"] }, { kind: "component", type: FeatureLayerComponent, selector: "lib-feature-layer", inputs: ["settings"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1263
1434
  }
1264
1435
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: MapPlateComponent, decorators: [{
@@ -1271,6 +1442,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
1271
1442
  MapFeatureService,
1272
1443
  DrawingService,
1273
1444
  DrawingGenerationService,
1445
+ FeatureService,
1274
1446
  ], template: "<ng-content></ng-content>\r\n<lib-osm-tile-layer *ngIf=\"osmUrl && map\" [map]=\"map\" [url]=\"osmUrl\"></lib-osm-tile-layer>\r\n<lib-feature-layer *ngIf=\"map\" [settings]=\"drawingLayerSettings\"></lib-feature-layer>\r\n", styles: ["lib-map-plate{position:relative;display:flex;flex-direction:column;height:100%}\n"] }]
1275
1447
  }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: MapPostboyService }, { type: MapPlateFactory }, { type: MessageRegistratorService }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { settings: [{
1276
1448
  type: Input
@@ -1611,5 +1783,5 @@ class StringifyFeatureHelper {
1611
1783
  * Generated bundle index. Do not edit.
1612
1784
  */
1613
1785
 
1614
- export { CancelDrawingCommand, CloseTooltipCommand, ClusterLayerComponent, ClusterLayerSettings, DrawingType, FeatureLayerComponent, FeatureLayerSettings, FeatureOutputFormat, MapClickEvent, MapLyrs, MapLyrsLabel, MapModule, MapMoveEndEvent, MapPlateComponent, MapPostboyService, MapRenderedEvent, MapSettings, MarkerModel, MarkerStyleHelper, MarkersComponent, MessageRegistratorService, OsmTileLayerComponent, PolygonModel, PolygonStyleHelper, PolygonsComponent, StartDrawingCommand, StringifyFeatureHelper, TextStyleHelper, TileLayerComponent, TileLayerSettings, TooltipComponent, TooltipSettings };
1786
+ export { CancelDrawingCommand, CloseTooltipCommand, ClusterLayerComponent, ClusterLayerSettings, Dictionary, DrawSelectionAreaCommand, DrawingType, FeatureLayerComponent, FeatureLayerSettings, FeatureOutputFormat, MapClickEvent, MapLyrs, MapLyrsLabel, MapModule, MapMoveEndEvent, MapPlateComponent, MapPostboyService, MapRenderedEvent, MapSettings, MarkerModel, MarkerStyleHelper, MarkersComponent, MessageRegistratorService, OsmTileLayerComponent, PolygonModel, PolygonStyleHelper, PolygonsComponent, StartDrawingCommand, StringifyFeatureHelper, TextStyleHelper, TileLayerComponent, TileLayerSettings, TooltipComponent, TooltipSettings };
1615
1787
  //# sourceMappingURL=maps-components.mjs.map