@igo2/integration 1.14.2 → 1.14.3
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.
- package/esm2020/igo2-integration.mjs +4 -4
- package/esm2020/lib/about/about-tool/about-tool.component.mjs +184 -184
- package/esm2020/lib/about/about-tool/index.mjs +1 -1
- package/esm2020/lib/about/about.module.mjs +54 -54
- package/esm2020/lib/about/index.mjs +1 -1
- package/esm2020/lib/analytics/analytics-listener.service.mjs +71 -71
- package/esm2020/lib/analytics/analytics.module.mjs +15 -15
- package/esm2020/lib/analytics/index.mjs +1 -1
- package/esm2020/lib/catalog/catalog-browser-tool/catalog-browser-tool.component.mjs +112 -112
- package/esm2020/lib/catalog/catalog-browser-tool/catalog-browser-tool.module.mjs +28 -28
- package/esm2020/lib/catalog/catalog-library-tool/catalog-library-tool.component.mjs +88 -88
- package/esm2020/lib/catalog/catalog-library-tool/catalog-library-tool.module.mjs +28 -28
- package/esm2020/lib/catalog/catalog.module.mjs +23 -23
- package/esm2020/lib/catalog/catalog.state.mjs +53 -53
- package/esm2020/lib/catalog/index.mjs +5 -5
- package/esm2020/lib/context/context-editor-tool/context-editor-tool.component.mjs +33 -33
- package/esm2020/lib/context/context-manager-tool/context-manager-tool.component.mjs +43 -43
- package/esm2020/lib/context/context-permission-manager-tool/context-permission-manager-tool.component.mjs +24 -24
- package/esm2020/lib/context/context-share-tool/context-share-tool.component.mjs +33 -33
- package/esm2020/lib/context/context.module.mjs +38 -38
- package/esm2020/lib/context/context.state.mjs +87 -87
- package/esm2020/lib/context/index.mjs +5 -5
- package/esm2020/lib/directions/directions-tool/directions-tool.component.mjs +86 -86
- package/esm2020/lib/directions/directions-tool/index.mjs +1 -1
- package/esm2020/lib/directions/directions.module.mjs +25 -25
- package/esm2020/lib/directions/directions.state.mjs +63 -63
- package/esm2020/lib/directions/index.mjs +2 -2
- package/esm2020/lib/draw/draw.module.mjs +20 -20
- package/esm2020/lib/draw/draw.state.mjs +39 -39
- package/esm2020/lib/draw/drawing-tool/drawing-tool.component.mjs +71 -71
- package/esm2020/lib/draw/index.mjs +2 -2
- package/esm2020/lib/filter/active-ogc-filter-tool/active-ogc-filter-tool.animation.mjs +9 -9
- package/esm2020/lib/filter/active-ogc-filter-tool/active-ogc-filter-tool.component.mjs +43 -43
- package/esm2020/lib/filter/active-ogc-filter-tool/index.mjs +1 -1
- package/esm2020/lib/filter/active-time-filter-tool/active-time-filter-tool.animation.mjs +9 -9
- package/esm2020/lib/filter/active-time-filter-tool/active-time-filter-tool.component.mjs +43 -43
- package/esm2020/lib/filter/active-time-filter-tool/index.mjs +1 -1
- package/esm2020/lib/filter/filter.module.mjs +50 -50
- package/esm2020/lib/filter/index.mjs +5 -5
- package/esm2020/lib/filter/ogc-filter-tool/index.mjs +1 -1
- package/esm2020/lib/filter/ogc-filter-tool/ogc-filter-tool.component.mjs +24 -24
- package/esm2020/lib/filter/spatial-filter-tool/index.mjs +1 -1
- package/esm2020/lib/filter/spatial-filter-tool/spatial-filter-tool.component.mjs +534 -534
- package/esm2020/lib/filter/time-filter-tool/index.mjs +1 -1
- package/esm2020/lib/filter/time-filter-tool/time-filter-tool.component.mjs +24 -24
- package/esm2020/lib/import-export/import-export-tool/import-export-tool.component.mjs +136 -136
- package/esm2020/lib/import-export/import-export-tool/index.mjs +1 -1
- package/esm2020/lib/import-export/import-export.module.mjs +47 -47
- package/esm2020/lib/import-export/import-export.state.mjs +40 -40
- package/esm2020/lib/import-export/index.mjs +2 -2
- package/esm2020/lib/integration.module.mjs +71 -71
- package/esm2020/lib/map/advanced-map-tool/advanced-coordinates/advanced-coordinates.component.mjs +472 -472
- package/esm2020/lib/map/advanced-map-tool/advanced-map-tool.component.mjs +88 -88
- package/esm2020/lib/map/advanced-map-tool/advanced-swipe/advanced-swipe.component.mjs +217 -217
- package/esm2020/lib/map/advanced-map-tool/index.mjs +1 -1
- package/esm2020/lib/map/index.mjs +8 -8
- package/esm2020/lib/map/layer-list-tool.state.mjs +41 -41
- package/esm2020/lib/map/map-details-tool/index.mjs +1 -1
- package/esm2020/lib/map/map-details-tool/map-details-tool.component.mjs +255 -255
- package/esm2020/lib/map/map-legend/index.mjs +1 -1
- package/esm2020/lib/map/map-legend/map-legend-tool.component.mjs +274 -274
- package/esm2020/lib/map/map-proximity-tool/index.mjs +1 -1
- package/esm2020/lib/map/map-proximity-tool/map-proximity-tool.component.mjs +205 -205
- package/esm2020/lib/map/map-proximity.state.mjs +162 -162
- package/esm2020/lib/map/map-tool/index.mjs +1 -1
- package/esm2020/lib/map/map-tool/map-tool.component.mjs +129 -129
- package/esm2020/lib/map/map-tools/index.mjs +1 -1
- package/esm2020/lib/map/map-tools/map-tools.component.mjs +477 -477
- package/esm2020/lib/map/map.module.mjs +140 -140
- package/esm2020/lib/map/map.state.mjs +46 -46
- package/esm2020/lib/measure/index.mjs +3 -3
- package/esm2020/lib/measure/measure.module.mjs +19 -19
- package/esm2020/lib/measure/measure.state.mjs +34 -34
- package/esm2020/lib/measure/measurer-tool/measurer-tool.component.mjs +44 -44
- package/esm2020/lib/measure/measurer-tool/measurer-tool.module.mjs +24 -24
- package/esm2020/lib/print/index.mjs +1 -1
- package/esm2020/lib/print/print-tool/index.mjs +1 -1
- package/esm2020/lib/print/print-tool/print-tool.component.mjs +32 -32
- package/esm2020/lib/print/print.module.mjs +25 -25
- package/esm2020/lib/search/index.mjs +6 -6
- package/esm2020/lib/search/query.state.mjs +33 -33
- package/esm2020/lib/search/search-bar/search-bar-binding.directive.mjs +60 -60
- package/esm2020/lib/search/search-bar/search-bar.module.mjs +21 -21
- package/esm2020/lib/search/search-results-tool/search-results-tool.component.mjs +592 -592
- package/esm2020/lib/search/search-results-tool/search-results-tool.module.mjs +64 -64
- package/esm2020/lib/search/search.module.mjs +23 -23
- package/esm2020/lib/search/search.state.mjs +106 -106
- package/esm2020/lib/storage/index.mjs +1 -1
- package/esm2020/lib/storage/storage.module.mjs +15 -15
- package/esm2020/lib/storage/storage.state.mjs +22 -22
- package/esm2020/lib/tool/index.mjs +1 -1
- package/esm2020/lib/tool/tool.module.mjs +15 -15
- package/esm2020/lib/tool/tool.state.mjs +51 -51
- package/esm2020/lib/workspace/index.mjs +3 -3
- package/esm2020/lib/workspace/shared/edition-actions.service.mjs +155 -155
- package/esm2020/lib/workspace/shared/feature-actions.service.mjs +143 -143
- package/esm2020/lib/workspace/shared/index.mjs +2 -2
- package/esm2020/lib/workspace/shared/wfs-actions.service.mjs +157 -157
- package/esm2020/lib/workspace/shared/workspace.utils.mjs +6 -6
- package/esm2020/lib/workspace/workspace-button/index.mjs +1 -1
- package/esm2020/lib/workspace/workspace-button/workspace-button.component.mjs +68 -68
- package/esm2020/lib/workspace/workspace.module.mjs +36 -36
- package/esm2020/lib/workspace/workspace.state.mjs +187 -187
- package/esm2020/public_api.mjs +34 -34
- package/fesm2015/igo2-integration.mjs +6450 -6450
- package/fesm2020/igo2-integration.mjs +6009 -6009
- package/index.d.ts +5 -5
- package/lib/about/about-tool/about-tool.component.d.ts +34 -34
- package/lib/about/about-tool/index.d.ts +1 -1
- package/lib/about/about.module.d.ts +16 -16
- package/lib/about/index.d.ts +1 -1
- package/lib/analytics/analytics-listener.service.d.ts +27 -27
- package/lib/analytics/analytics.module.d.ts +6 -6
- package/lib/analytics/index.d.ts +1 -1
- package/lib/catalog/catalog-browser-tool/catalog-browser-tool.component.d.ts +57 -57
- package/lib/catalog/catalog-browser-tool/catalog-browser-tool.module.d.ts +12 -12
- package/lib/catalog/catalog-library-tool/catalog-library-tool.component.d.ts +50 -50
- package/lib/catalog/catalog-library-tool/catalog-library-tool.module.d.ts +12 -12
- package/lib/catalog/catalog.module.d.ts +8 -8
- package/lib/catalog/catalog.state.d.ts +37 -37
- package/lib/catalog/index.d.ts +5 -5
- package/lib/context/context-editor-tool/context-editor-tool.component.d.ts +9 -9
- package/lib/context/context-manager-tool/context-manager-tool.component.d.ts +15 -15
- package/lib/context/context-permission-manager-tool/context-permission-manager-tool.component.d.ts +5 -5
- package/lib/context/context-share-tool/context-share-tool.component.d.ts +13 -13
- package/lib/context/context.module.d.ts +11 -11
- package/lib/context/context.state.d.ts +37 -37
- package/lib/context/index.d.ts +5 -5
- package/lib/directions/directions-tool/directions-tool.component.d.ts +54 -54
- package/lib/directions/directions-tool/index.d.ts +1 -1
- package/lib/directions/directions.module.d.ts +10 -10
- package/lib/directions/directions.state.d.ts +28 -28
- package/lib/directions/index.d.ts +2 -2
- package/lib/draw/draw.module.d.ts +8 -8
- package/lib/draw/draw.state.d.ts +17 -17
- package/lib/draw/drawing-tool/drawing-tool.component.d.ts +31 -31
- package/lib/draw/index.d.ts +2 -2
- package/lib/filter/active-ogc-filter-tool/active-ogc-filter-tool.animation.d.ts +2 -2
- package/lib/filter/active-ogc-filter-tool/active-ogc-filter-tool.component.d.ts +12 -12
- package/lib/filter/active-ogc-filter-tool/index.d.ts +1 -1
- package/lib/filter/active-time-filter-tool/active-time-filter-tool.animation.d.ts +2 -2
- package/lib/filter/active-time-filter-tool/active-time-filter-tool.component.d.ts +12 -12
- package/lib/filter/active-time-filter-tool/index.d.ts +1 -1
- package/lib/filter/filter.module.d.ts +15 -15
- package/lib/filter/index.d.ts +5 -5
- package/lib/filter/ogc-filter-tool/index.d.ts +1 -1
- package/lib/filter/ogc-filter-tool/ogc-filter-tool.component.d.ts +6 -6
- package/lib/filter/spatial-filter-tool/index.d.ts +1 -1
- package/lib/filter/spatial-filter-tool/spatial-filter-tool.component.d.ts +82 -82
- package/lib/filter/time-filter-tool/index.d.ts +1 -1
- package/lib/filter/time-filter-tool/time-filter-tool.component.d.ts +6 -6
- package/lib/import-export/import-export-tool/import-export-tool.component.d.ts +31 -31
- package/lib/import-export/import-export-tool/index.d.ts +1 -1
- package/lib/import-export/import-export.module.d.ts +15 -15
- package/lib/import-export/import-export.state.d.ts +24 -24
- package/lib/import-export/index.d.ts +2 -2
- package/lib/integration.module.d.ts +20 -20
- package/lib/map/advanced-map-tool/advanced-coordinates/advanced-coordinates.component.d.ts +97 -97
- package/lib/map/advanced-map-tool/advanced-map-tool.component.d.ts +12 -12
- package/lib/map/advanced-map-tool/advanced-swipe/advanced-swipe.component.d.ts +65 -65
- package/lib/map/advanced-map-tool/index.d.ts +1 -1
- package/lib/map/index.d.ts +8 -8
- package/lib/map/layer-list-tool.state.d.ts +19 -19
- package/lib/map/map-details-tool/index.d.ts +1 -1
- package/lib/map/map-details-tool/map-details-tool.component.d.ts +38 -38
- package/lib/map/map-legend/index.d.ts +1 -1
- package/lib/map/map-legend/map-legend-tool.component.d.ts +40 -40
- package/lib/map/map-proximity-tool/index.d.ts +1 -1
- package/lib/map/map-proximity-tool/map-proximity-tool.component.d.ts +36 -36
- package/lib/map/map-proximity.state.d.ts +28 -28
- package/lib/map/map-tool/index.d.ts +1 -1
- package/lib/map/map-tool/map-tool.component.d.ts +27 -27
- package/lib/map/map-tools/index.d.ts +1 -1
- package/lib/map/map-tools/map-tools.component.d.ts +65 -65
- package/lib/map/map.module.d.ts +38 -38
- package/lib/map/map.state.d.ts +24 -24
- package/lib/measure/index.d.ts +3 -3
- package/lib/measure/measure.module.d.ts +7 -7
- package/lib/measure/measure.state.d.ts +16 -16
- package/lib/measure/measurer-tool/measurer-tool.component.d.ts +24 -24
- package/lib/measure/measurer-tool/measurer-tool.module.d.ts +11 -11
- package/lib/print/index.d.ts +1 -1
- package/lib/print/print-tool/index.d.ts +1 -1
- package/lib/print/print-tool/print-tool.component.d.ts +10 -10
- package/lib/print/print.module.d.ts +10 -10
- package/lib/search/index.d.ts +6 -6
- package/lib/search/query.state.d.ts +20 -20
- package/lib/search/search-bar/search-bar-binding.directive.d.ts +20 -20
- package/lib/search/search-bar/search-bar.module.d.ts +11 -11
- package/lib/search/search-results-tool/search-results-tool.component.d.ts +101 -101
- package/lib/search/search-results-tool/search-results-tool.module.d.ts +18 -18
- package/lib/search/search.module.d.ts +8 -8
- package/lib/search/search.state.d.ts +54 -54
- package/lib/storage/index.d.ts +1 -1
- package/lib/storage/storage.module.d.ts +6 -6
- package/lib/storage/storage.state.d.ts +12 -12
- package/lib/tool/index.d.ts +1 -1
- package/lib/tool/tool.module.d.ts +6 -6
- package/lib/tool/tool.state.d.ts +22 -22
- package/lib/workspace/index.d.ts +3 -3
- package/lib/workspace/shared/edition-actions.service.d.ts +26 -26
- package/lib/workspace/shared/feature-actions.service.d.ts +25 -25
- package/lib/workspace/shared/index.d.ts +2 -2
- package/lib/workspace/shared/wfs-actions.service.d.ts +27 -27
- package/lib/workspace/shared/workspace.utils.d.ts +2 -2
- package/lib/workspace/workspace-button/index.d.ts +1 -1
- package/lib/workspace/workspace-button/workspace-button.component.d.ts +21 -21
- package/lib/workspace/workspace.module.d.ts +12 -12
- package/lib/workspace/workspace.state.d.ts +63 -63
- package/package.json +3 -3
- package/public_api.d.ts +31 -31
|
@@ -1,163 +1,163 @@
|
|
|
1
|
-
import { Injectable } from '@angular/core';
|
|
2
|
-
import { FeatureStore, featureFromOl, measureOlGeometryLength, FEATURE, roundCoordTo } from '@igo2/geo';
|
|
3
|
-
import { BehaviorSubject, combineLatest, interval } from 'rxjs';
|
|
4
|
-
import { debounceTime } from 'rxjs/operators';
|
|
5
|
-
import GeoJSON from 'ol/format/GeoJSON';
|
|
6
|
-
import { uuid } from '@igo2/utils';
|
|
7
|
-
import olLayerVector from 'ol/layer/Vector';
|
|
8
|
-
import olLineString from 'ol/geom/LineString';
|
|
9
|
-
import * as olProj from 'ol/proj';
|
|
10
|
-
import * as i0 from "@angular/core";
|
|
11
|
-
import * as i1 from "../map/map.state";
|
|
12
|
-
/**
|
|
13
|
-
* Service that holds the state of the direction module
|
|
14
|
-
*/
|
|
15
|
-
export class MapProximityState {
|
|
16
|
-
constructor(mapState) {
|
|
17
|
-
this.mapState = mapState;
|
|
18
|
-
this.enabled$ = new BehaviorSubject(false);
|
|
19
|
-
this.proximityRadiusValue$ = new BehaviorSubject(30);
|
|
20
|
-
this.proximitylocationType$ = new BehaviorSubject('geolocation');
|
|
21
|
-
this.proximityFeatureStore = new FeatureStore([], { map: this.mapState.map });
|
|
22
|
-
this.subs$$ = [];
|
|
23
|
-
this.currentPositionCoordinate$ = new BehaviorSubject(undefined);
|
|
24
|
-
this.mapState.map.ol.once('rendercomplete', () => {
|
|
25
|
-
this.subscribeProximityMonitor();
|
|
26
|
-
});
|
|
27
|
-
}
|
|
28
|
-
get map() {
|
|
29
|
-
return this.mapState.map;
|
|
30
|
-
}
|
|
31
|
-
subscribeProximityMonitor() {
|
|
32
|
-
this.subs$$.push(combineLatest([
|
|
33
|
-
this.enabled$,
|
|
34
|
-
this.proximitylocationType$,
|
|
35
|
-
this.proximityRadiusValue$,
|
|
36
|
-
interval(5000),
|
|
37
|
-
this.map.geolocationController.position$
|
|
38
|
-
])
|
|
39
|
-
.pipe(debounceTime(750))
|
|
40
|
-
.subscribe((bunch) => {
|
|
41
|
-
this.proximityFeatureStore.clear();
|
|
42
|
-
const enabled = bunch[0];
|
|
43
|
-
const layers = this.map.layers;
|
|
44
|
-
const currentPos = this.map.geolocationController.position$.value;
|
|
45
|
-
const locationType = bunch[1];
|
|
46
|
-
const proximityRadiusValue = bunch[2];
|
|
47
|
-
if (!enabled) {
|
|
48
|
-
return;
|
|
49
|
-
}
|
|
50
|
-
let coord;
|
|
51
|
-
if (locationType === 'geolocation') {
|
|
52
|
-
if (!currentPos || !currentPos.position) {
|
|
53
|
-
return;
|
|
54
|
-
}
|
|
55
|
-
coord = olProj.transform(currentPos.position, currentPos.projection, this.map.projection);
|
|
56
|
-
this.map.mapCenter$.next(false);
|
|
57
|
-
}
|
|
58
|
-
else {
|
|
59
|
-
coord = this.map.viewController.getCenter();
|
|
60
|
-
;
|
|
61
|
-
this.map.mapCenter$.next(true);
|
|
62
|
-
}
|
|
63
|
-
const coordLonLat = olProj.transform(coord, this.map.projection, 'EPSG:4269');
|
|
64
|
-
const roundedCoordLonLat = roundCoordTo(coordLonLat, 6);
|
|
65
|
-
this.currentPositionCoordinate$.next(roundedCoordLonLat);
|
|
66
|
-
const layersToMonitor = layers
|
|
67
|
-
.filter(layer => layer.ol instanceof olLayerVector &&
|
|
68
|
-
layer.dataSource.options.queryable &&
|
|
69
|
-
layer.visible &&
|
|
70
|
-
layer.isInResolutionsRange);
|
|
71
|
-
layersToMonitor.map(layerToMonitor => {
|
|
72
|
-
const layerSource = layerToMonitor.ol.getSource();
|
|
73
|
-
// Mostly for polygon features.
|
|
74
|
-
const olFeaturesAtCoordinate = layerSource.getFeaturesAtCoordinate(coord);
|
|
75
|
-
if (olFeaturesAtCoordinate && olFeaturesAtCoordinate.length) {
|
|
76
|
-
olFeaturesAtCoordinate.map(olFeatureAtCoordinate => {
|
|
77
|
-
const featureAtThisPosition = featureFromOl(olFeatureAtCoordinate, this.map.projection);
|
|
78
|
-
let title = this.getQueryTitle(featureAtThisPosition, layerToMonitor);
|
|
79
|
-
// todo handle imported layers without querytitle? prompt title or detect first column?
|
|
80
|
-
this.addFeatureToStore(layerToMonitor, coord, featureAtThisPosition, title, 0);
|
|
81
|
-
});
|
|
82
|
-
}
|
|
83
|
-
else {
|
|
84
|
-
// compute proximity for remaining sources
|
|
85
|
-
const closestOlFeature = layerSource.getClosestFeatureToCoordinate(coord);
|
|
86
|
-
if (closestOlFeature) {
|
|
87
|
-
const closestOlGeom = closestOlFeature.getGeometry();
|
|
88
|
-
const closestFeature = featureFromOl(closestOlFeature, this.map.projection);
|
|
89
|
-
const geometryClosestPoint = closestOlGeom.getClosestPoint(coord);
|
|
90
|
-
const linebetween = new olLineString([coord, geometryClosestPoint]);
|
|
91
|
-
const lineLength = measureOlGeometryLength(linebetween, 'EPSG:3857');
|
|
92
|
-
if (lineLength <= proximityRadiusValue) {
|
|
93
|
-
let title = this.getQueryTitle(closestFeature, layerToMonitor);
|
|
94
|
-
// todo handle imported layers without querytitle? prompt title or detect first column?
|
|
95
|
-
this.addFeatureToStore(layerToMonitor, coord, closestFeature, title, lineLength);
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
});
|
|
100
|
-
}));
|
|
101
|
-
}
|
|
102
|
-
/**
|
|
103
|
-
* Add a feature with proximity properties to the store
|
|
104
|
-
* @internal
|
|
105
|
-
*/
|
|
106
|
-
addFeatureToStore(layer, coordFromCalculatedDistance, feature, title, distance) {
|
|
107
|
-
const featureId = uuid();
|
|
108
|
-
const projection = this.map.ol.getView().getProjection();
|
|
109
|
-
const olGeometry = feature.ol.getGeometry();
|
|
110
|
-
const geometry = new GeoJSON().writeGeometryObject(olGeometry, {
|
|
111
|
-
featureProjection: projection,
|
|
112
|
-
dataProjection: projection
|
|
113
|
-
});
|
|
114
|
-
this.proximityFeatureStore.update({
|
|
115
|
-
type: FEATURE,
|
|
116
|
-
geometry,
|
|
117
|
-
projection: projection.getCode(),
|
|
118
|
-
properties: { ...feature.properties, ...{
|
|
119
|
-
id: featureId,
|
|
120
|
-
element: title,
|
|
121
|
-
distance,
|
|
122
|
-
coordFromCalculatedDistance,
|
|
123
|
-
layerSrcId: layer.id,
|
|
124
|
-
layerSrcTitle: layer.title
|
|
125
|
-
} },
|
|
126
|
-
meta: {
|
|
127
|
-
id: featureId
|
|
128
|
-
}
|
|
129
|
-
});
|
|
130
|
-
}
|
|
131
|
-
getQueryTitle(feature, layer) {
|
|
132
|
-
let title;
|
|
133
|
-
if (layer.options?.source?.options) {
|
|
134
|
-
const dataSourceOptions = layer.options.source
|
|
135
|
-
.options;
|
|
136
|
-
if (dataSourceOptions.queryTitle) {
|
|
137
|
-
title = this.getLabelMatch(feature, dataSourceOptions.queryTitle);
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
return title;
|
|
141
|
-
}
|
|
142
|
-
getLabelMatch(feature, labelMatch) {
|
|
143
|
-
let label = labelMatch;
|
|
144
|
-
const labelToGet = Array.from(labelMatch.matchAll(/\$\{([^\{\}]+)\}/g));
|
|
145
|
-
labelToGet.forEach(v => {
|
|
146
|
-
label = label.replace(v[0], feature.properties[v[1]]);
|
|
147
|
-
});
|
|
148
|
-
// Nothing done? check feature's attribute
|
|
149
|
-
if (labelToGet.length === 0 && label === labelMatch) {
|
|
150
|
-
label = feature.properties[labelMatch] || labelMatch;
|
|
151
|
-
}
|
|
152
|
-
return label;
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
MapProximityState.ɵfac = function MapProximityState_Factory(t) { return new (t || MapProximityState)(i0.ɵɵinject(i1.MapState)); };
|
|
156
|
-
MapProximityState.ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: MapProximityState, factory: MapProximityState.ɵfac, providedIn: 'root' });
|
|
157
|
-
(function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(MapProximityState, [{
|
|
158
|
-
type: Injectable,
|
|
159
|
-
args: [{
|
|
160
|
-
providedIn: 'root'
|
|
161
|
-
}]
|
|
162
|
-
}], function () { return [{ type: i1.MapState }]; }, null); })();
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import { FeatureStore, featureFromOl, measureOlGeometryLength, FEATURE, roundCoordTo } from '@igo2/geo';
|
|
3
|
+
import { BehaviorSubject, combineLatest, interval } from 'rxjs';
|
|
4
|
+
import { debounceTime } from 'rxjs/operators';
|
|
5
|
+
import GeoJSON from 'ol/format/GeoJSON';
|
|
6
|
+
import { uuid } from '@igo2/utils';
|
|
7
|
+
import olLayerVector from 'ol/layer/Vector';
|
|
8
|
+
import olLineString from 'ol/geom/LineString';
|
|
9
|
+
import * as olProj from 'ol/proj';
|
|
10
|
+
import * as i0 from "@angular/core";
|
|
11
|
+
import * as i1 from "../map/map.state";
|
|
12
|
+
/**
|
|
13
|
+
* Service that holds the state of the direction module
|
|
14
|
+
*/
|
|
15
|
+
export class MapProximityState {
|
|
16
|
+
constructor(mapState) {
|
|
17
|
+
this.mapState = mapState;
|
|
18
|
+
this.enabled$ = new BehaviorSubject(false);
|
|
19
|
+
this.proximityRadiusValue$ = new BehaviorSubject(30);
|
|
20
|
+
this.proximitylocationType$ = new BehaviorSubject('geolocation');
|
|
21
|
+
this.proximityFeatureStore = new FeatureStore([], { map: this.mapState.map });
|
|
22
|
+
this.subs$$ = [];
|
|
23
|
+
this.currentPositionCoordinate$ = new BehaviorSubject(undefined);
|
|
24
|
+
this.mapState.map.ol.once('rendercomplete', () => {
|
|
25
|
+
this.subscribeProximityMonitor();
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
get map() {
|
|
29
|
+
return this.mapState.map;
|
|
30
|
+
}
|
|
31
|
+
subscribeProximityMonitor() {
|
|
32
|
+
this.subs$$.push(combineLatest([
|
|
33
|
+
this.enabled$,
|
|
34
|
+
this.proximitylocationType$,
|
|
35
|
+
this.proximityRadiusValue$,
|
|
36
|
+
interval(5000),
|
|
37
|
+
this.map.geolocationController.position$
|
|
38
|
+
])
|
|
39
|
+
.pipe(debounceTime(750))
|
|
40
|
+
.subscribe((bunch) => {
|
|
41
|
+
this.proximityFeatureStore.clear();
|
|
42
|
+
const enabled = bunch[0];
|
|
43
|
+
const layers = this.map.layers;
|
|
44
|
+
const currentPos = this.map.geolocationController.position$.value;
|
|
45
|
+
const locationType = bunch[1];
|
|
46
|
+
const proximityRadiusValue = bunch[2];
|
|
47
|
+
if (!enabled) {
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
let coord;
|
|
51
|
+
if (locationType === 'geolocation') {
|
|
52
|
+
if (!currentPos || !currentPos.position) {
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
coord = olProj.transform(currentPos.position, currentPos.projection, this.map.projection);
|
|
56
|
+
this.map.mapCenter$.next(false);
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
coord = this.map.viewController.getCenter();
|
|
60
|
+
;
|
|
61
|
+
this.map.mapCenter$.next(true);
|
|
62
|
+
}
|
|
63
|
+
const coordLonLat = olProj.transform(coord, this.map.projection, 'EPSG:4269');
|
|
64
|
+
const roundedCoordLonLat = roundCoordTo(coordLonLat, 6);
|
|
65
|
+
this.currentPositionCoordinate$.next(roundedCoordLonLat);
|
|
66
|
+
const layersToMonitor = layers
|
|
67
|
+
.filter(layer => layer.ol instanceof olLayerVector &&
|
|
68
|
+
layer.dataSource.options.queryable &&
|
|
69
|
+
layer.visible &&
|
|
70
|
+
layer.isInResolutionsRange);
|
|
71
|
+
layersToMonitor.map(layerToMonitor => {
|
|
72
|
+
const layerSource = layerToMonitor.ol.getSource();
|
|
73
|
+
// Mostly for polygon features.
|
|
74
|
+
const olFeaturesAtCoordinate = layerSource.getFeaturesAtCoordinate(coord);
|
|
75
|
+
if (olFeaturesAtCoordinate && olFeaturesAtCoordinate.length) {
|
|
76
|
+
olFeaturesAtCoordinate.map(olFeatureAtCoordinate => {
|
|
77
|
+
const featureAtThisPosition = featureFromOl(olFeatureAtCoordinate, this.map.projection);
|
|
78
|
+
let title = this.getQueryTitle(featureAtThisPosition, layerToMonitor);
|
|
79
|
+
// todo handle imported layers without querytitle? prompt title or detect first column?
|
|
80
|
+
this.addFeatureToStore(layerToMonitor, coord, featureAtThisPosition, title, 0);
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
// compute proximity for remaining sources
|
|
85
|
+
const closestOlFeature = layerSource.getClosestFeatureToCoordinate(coord);
|
|
86
|
+
if (closestOlFeature) {
|
|
87
|
+
const closestOlGeom = closestOlFeature.getGeometry();
|
|
88
|
+
const closestFeature = featureFromOl(closestOlFeature, this.map.projection);
|
|
89
|
+
const geometryClosestPoint = closestOlGeom.getClosestPoint(coord);
|
|
90
|
+
const linebetween = new olLineString([coord, geometryClosestPoint]);
|
|
91
|
+
const lineLength = measureOlGeometryLength(linebetween, 'EPSG:3857');
|
|
92
|
+
if (lineLength <= proximityRadiusValue) {
|
|
93
|
+
let title = this.getQueryTitle(closestFeature, layerToMonitor);
|
|
94
|
+
// todo handle imported layers without querytitle? prompt title or detect first column?
|
|
95
|
+
this.addFeatureToStore(layerToMonitor, coord, closestFeature, title, lineLength);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
});
|
|
100
|
+
}));
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Add a feature with proximity properties to the store
|
|
104
|
+
* @internal
|
|
105
|
+
*/
|
|
106
|
+
addFeatureToStore(layer, coordFromCalculatedDistance, feature, title, distance) {
|
|
107
|
+
const featureId = uuid();
|
|
108
|
+
const projection = this.map.ol.getView().getProjection();
|
|
109
|
+
const olGeometry = feature.ol.getGeometry();
|
|
110
|
+
const geometry = new GeoJSON().writeGeometryObject(olGeometry, {
|
|
111
|
+
featureProjection: projection,
|
|
112
|
+
dataProjection: projection
|
|
113
|
+
});
|
|
114
|
+
this.proximityFeatureStore.update({
|
|
115
|
+
type: FEATURE,
|
|
116
|
+
geometry,
|
|
117
|
+
projection: projection.getCode(),
|
|
118
|
+
properties: { ...feature.properties, ...{
|
|
119
|
+
id: featureId,
|
|
120
|
+
element: title,
|
|
121
|
+
distance,
|
|
122
|
+
coordFromCalculatedDistance,
|
|
123
|
+
layerSrcId: layer.id,
|
|
124
|
+
layerSrcTitle: layer.title
|
|
125
|
+
} },
|
|
126
|
+
meta: {
|
|
127
|
+
id: featureId
|
|
128
|
+
}
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
getQueryTitle(feature, layer) {
|
|
132
|
+
let title;
|
|
133
|
+
if (layer.options?.source?.options) {
|
|
134
|
+
const dataSourceOptions = layer.options.source
|
|
135
|
+
.options;
|
|
136
|
+
if (dataSourceOptions.queryTitle) {
|
|
137
|
+
title = this.getLabelMatch(feature, dataSourceOptions.queryTitle);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
return title;
|
|
141
|
+
}
|
|
142
|
+
getLabelMatch(feature, labelMatch) {
|
|
143
|
+
let label = labelMatch;
|
|
144
|
+
const labelToGet = Array.from(labelMatch.matchAll(/\$\{([^\{\}]+)\}/g));
|
|
145
|
+
labelToGet.forEach(v => {
|
|
146
|
+
label = label.replace(v[0], feature.properties[v[1]]);
|
|
147
|
+
});
|
|
148
|
+
// Nothing done? check feature's attribute
|
|
149
|
+
if (labelToGet.length === 0 && label === labelMatch) {
|
|
150
|
+
label = feature.properties[labelMatch] || labelMatch;
|
|
151
|
+
}
|
|
152
|
+
return label;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
MapProximityState.ɵfac = function MapProximityState_Factory(t) { return new (t || MapProximityState)(i0.ɵɵinject(i1.MapState)); };
|
|
156
|
+
MapProximityState.ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: MapProximityState, factory: MapProximityState.ɵfac, providedIn: 'root' });
|
|
157
|
+
(function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(MapProximityState, [{
|
|
158
|
+
type: Injectable,
|
|
159
|
+
args: [{
|
|
160
|
+
providedIn: 'root'
|
|
161
|
+
}]
|
|
162
|
+
}], function () { return [{ type: i1.MapState }]; }, null); })();
|
|
163
163
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFwLXByb3hpbWl0eS5zdGF0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2ludGVncmF0aW9uL3NyYy9saWIvbWFwL21hcC1wcm94aW1pdHkuc3RhdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUzQyxPQUFPLEVBQ0wsWUFBWSxFQUNaLGFBQWEsRUFBRSx1QkFBdUIsRUFBcUMsT0FBTyxFQUFFLFlBQVksRUFDakcsTUFBTSxXQUFXLENBQUM7QUFDbkIsT0FBTyxFQUFFLGVBQWUsRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFnQixNQUFNLE1BQU0sQ0FBQztBQUM5RSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFHOUMsT0FBTyxPQUFPLE1BQU0sbUJBQW1CLENBQUM7QUFDeEMsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUVuQyxPQUFPLGFBQWEsTUFBTSxpQkFBaUIsQ0FBQztBQUc1QyxPQUFPLFlBQVksTUFBTSxvQkFBb0IsQ0FBQztBQUM5QyxPQUFPLEtBQUssTUFBTSxNQUFNLFNBQVMsQ0FBQzs7O0FBQ2xDOztHQUVHO0FBSUgsTUFBTSxPQUFPLGlCQUFpQjtJQWE1QixZQUFvQixRQUFrQjtRQUFsQixhQUFRLEdBQVIsUUFBUSxDQUFVO1FBWC9CLGFBQVEsR0FBNkIsSUFBSSxlQUFlLENBQVUsS0FBSyxDQUFDLENBQUM7UUFDekUsMEJBQXFCLEdBQTRCLElBQUksZUFBZSxDQUFTLEVBQUUsQ0FBQyxDQUFDO1FBQ2pGLDJCQUFzQixHQUE0QixJQUFJLGVBQWUsQ0FBUyxhQUFhLENBQUMsQ0FBQztRQUM3RiwwQkFBcUIsR0FBMEIsSUFBSSxZQUFZLENBQVUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztR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QUM7U0FDdEQ7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7O2tGQTNKVSxpQkFBaUI7dUVBQWpCLGlCQUFpQixXQUFqQixpQkFBaUIsbUJBRmhCLE1BQU07dUZBRVAsaUJBQWlCO2NBSDdCLFVBQVU7ZUFBQztnQkFDVixVQUFVLEVBQUUsTUFBTTthQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHtcbiAgRmVhdHVyZVN0b3JlLCBGZWF0dXJlLCBJZ29NYXAsXG4gIGZlYXR1cmVGcm9tT2wsIG1lYXN1cmVPbEdlb21ldHJ5TGVuZ3RoLCBMYXllciwgUXVlcnlhYmxlRGF0YVNvdXJjZU9wdGlvbnMsIEZFQVRVUkUsIHJvdW5kQ29vcmRUbywgUXVlcnlhYmxlRGF0YVNvdXJjZSwgTWFwR2VvbG9jYXRpb25TdGF0ZVxufSBmcm9tICdAaWdvMi9nZW8nO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBjb21iaW5lTGF0ZXN0LCBpbnRlcnZhbCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBNYXBTdGF0ZSB9IGZyb20gJy4uL21hcC9tYXAuc3RhdGUnO1xuXG5pbXBvcnQgR2VvSlNPTiBmcm9tICdvbC9mb3JtYXQvR2VvSlNPTic7XG5pbXBvcnQgeyB1dWlkIH0gZnJvbSAnQGlnbzIvdXRpbHMnO1xuXG5pbXBvcnQgb2xMYXllclZlY3RvciBmcm9tICdvbC9sYXllci9WZWN0b3InO1xuaW1wb3J0IG9sVmVjdG9yU291cmNlIGZyb20gJ29sL3NvdXJjZS9WZWN0b3InO1xuaW1wb3J0IEdlb21ldHJ5IGZyb20gJ29sL2dlb20vR2VvbWV0cnknO1xuaW1wb3J0IG9sTGluZVN0cmluZyBmcm9tICdvbC9nZW9tL0xpbmVTdHJpbmcnO1xuaW1wb3J0ICogYXMgb2xQcm9qIGZyb20gJ29sL3Byb2onO1xuLyoqXG4gKiBTZXJ2aWNlIHRoYXQgaG9sZHMgdGhlIHN0YXRlIG9mIHRoZSBkaXJlY3Rpb24gbW9kdWxlXG4gKi9cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIE1hcFByb3hpbWl0eVN0YXRlIHtcblxuICBwdWJsaWMgZW5hYmxlZCQ6IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICBwdWJsaWMgcHJveGltaXR5UmFkaXVzVmFsdWUkOiBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPigzMCk7XG4gIHB1YmxpYyBwcm94aW1pdHlsb2NhdGlvblR5cGUkOiBCZWhhdmlvclN1YmplY3Q8c3RyaW5nPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8c3RyaW5nPignZ2VvbG9jYXRpb24nKTtcbiAgcHVibGljIHByb3hpbWl0eUZlYXR1cmVTdG9yZTogRmVhdHVyZVN0b3JlPEZlYXR1cmU+ID0gbmV3IEZlYXR1cmVTdG9yZTxGZWF0dXJlPihbXSwgeyBtYXA6IHRoaXMubWFwU3RhdGUubWFwIH0pO1xuICBwcml2YXRlIHN1YnMkJDogU3Vic2NyaXB0aW9uW10gPSBbXTtcbiAgcHVibGljIGN1cnJlbnRQb3NpdGlvbkNvb3JkaW5hdGUkOiBCZWhhdmlvclN1YmplY3Q8W251bWJlciwgbnVtYmVyXT4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0KHVuZGVmaW5lZCk7XG5cbiAgZ2V0IG1hcCgpOiBJZ29NYXAge1xuICAgIHJldHVybiB0aGlzLm1hcFN0YXRlLm1hcDtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgbWFwU3RhdGU6IE1hcFN0YXRlKSB7XG5cbiAgICB0aGlzLm1hcFN0YXRlLm1hcC5vbC5vbmNlKCdyZW5kZXJjb21wbGV0ZScsICgpID0+IHtcbiAgICAgIHRoaXMuc3Vic2NyaWJlUHJveGltaXR5TW9uaXRvcigpO1xuICAgIH0pO1xuICB9XG5cblxuICBzdWJzY3JpYmVQcm94aW1pdHlNb25pdG9yKCkge1xuICAgIHRoaXMuc3VicyQkLnB1c2goY29tYmluZUxhdGVzdChbXG4gICAgICB0aGlzLmVuYWJsZWQkLFxuICAgICAgdGhpcy5wcm94aW1pdHlsb2NhdGlvblR5cGUkLFxuICAgICAgdGhpcy5wcm94aW1pdHlSYWRpdXNWYWx1ZSQsXG4gICAgICBpbnRlcnZhbCg1MDAwKSxcbiAgICAgIHRoaXMubWFwLmdlb2xvY2F0aW9uQ29udHJvbGxlci5wb3NpdGlvbiRcbiAgICBdKVxuICAgICAgLnBpcGUoZGVib3VuY2VUaW1lKDc1MCkpXG4gICAgICAuc3Vic2NyaWJlKChidW5jaDogW2Jvb2xlYW4sIHN0cmluZywgbnVtYmVyLCBudW1iZXIsIE1hcEdlb2xvY2F0aW9uU3RhdGVdKSA9PiB7XG4gICAgICAgIHRoaXMucHJveGltaXR5RmVhdHVyZVN0b3JlLmNsZWFyKCk7XG4gICAgICAgIGNvbnN0IGVuYWJsZWQgPSBidW5jaFswXTtcbiAgICAgICAgY29uc3QgbGF5ZXJzID0gdGhpcy5tYXAubGF5ZXJzO1xuICAgICAgICBjb25zdCBjdXJyZW50UG9zID0gdGhpcy5tYXAuZ2VvbG9jYXRpb25Db250cm9sbGVyLnBvc2l0aW9uJC52YWx1ZTtcbiAgICAgICAgY29uc3QgbG9jYXRpb25UeXBlID0gYnVuY2hbMV07XG4gICAgICAgIGNvbnN0IHByb3hpbWl0eVJhZGl1c1ZhbHVlID0gYnVuY2hbMl07XG5cbiAgICAgICAgaWYgKCFlbmFibGVkKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cblxuICAgICAgICBsZXQgY29vcmQ6IG51bWJlcltdO1xuICAgICAgICBpZiAobG9jYXRpb25UeXBlID09PSAnZ2VvbG9jYXRpb24nKSB7XG4gICAgICAgICAgaWYgKCFjdXJyZW50UG9zIHx8ICFjdXJyZW50UG9zLnBvc2l0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29vcmQgPSBvbFByb2oudHJhbnNmb3JtKGN1cnJlbnRQb3MucG9zaXRpb24sIGN1cnJlbnRQb3MucHJvamVjdGlvbiwgdGhpcy5tYXAucHJvamVjdGlvbik7XG4gICAgICAgICAgdGhpcy5tYXAubWFwQ2VudGVyJC5uZXh0KGZhbHNlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb29yZCA9IHRoaXMubWFwLnZpZXdDb250cm9sbGVyLmdldENlbnRlcigpOztcbiAgICAgICAgICB0aGlzLm1hcC5tYXBDZW50ZXIkLm5leHQodHJ1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjb29yZExvbkxhdCA9IG9sUHJvai50cmFuc2Zvcm0oY29vcmQsIHRoaXMubWFwLnByb2plY3Rpb24sICdFUFNHOjQyNjknKTtcbiAgICAgICAgY29uc3Qgcm91bmRlZENvb3JkTG9uTGF0ID0gcm91bmRDb29yZFRvKGNvb3JkTG9uTGF0IGFzIFtudW1iZXIsIG51bWJlcl0sIDYpO1xuICAgICAgICB0aGlzLmN1cnJlbnRQb3NpdGlvbkNvb3JkaW5hdGUkLm5leHQocm91bmRlZENvb3JkTG9uTGF0KTtcblxuICAgICAgICBjb25zdCBsYXllcnNUb01vbml0b3IgPSBsYXllcnNcbiAgICAgICAgICAuZmlsdGVyKGxheWVyID0+XG4gICAgICAgICAgICBsYXllci5vbCBpbnN0YW5jZW9mIG9sTGF5ZXJWZWN0b3IgJiZcbiAgICAgICAgICAgIChsYXllci5kYXRhU291cmNlIGFzIFF1ZXJ5YWJsZURhdGFTb3VyY2UpLm9wdGlvbnMucXVlcnlhYmxlICYmXG4gICAgICAgICAgICBsYXllci52aXNpYmxlICYmXG4gICAgICAgICAgICBsYXllci5pc0luUmVzb2x1dGlvbnNSYW5nZSk7XG5cbiAgICAgICAgbGF5ZXJzVG9Nb25pdG9yLm1hcChsYXllclRvTW9uaXRvciA9PiB7XG4gICAgICAgICAgY29uc3QgbGF5ZXJTb3VyY2UgPSBsYXllclRvTW9uaXRvci5vbC5nZXRTb3VyY2UoKSBhcyBvbFZlY3RvclNvdXJjZTxHZW9tZXRyeT47XG5cbiAgICAgICAgICAvLyBNb3N0bHkgZm9yIHBvbHlnb24gZmVhdHVyZXMuXG4gICAgICAgICAgY29uc3Qgb2xGZWF0dXJlc0F0Q29vcmRpbmF0ZSA9IGxheWVyU291cmNlLmdldEZlYXR1cmVzQXRDb29yZGluYXRlKGNvb3JkKTtcbiAgICAgICAgICBpZiAob2xGZWF0dXJlc0F0Q29vcmRpbmF0ZSAmJiBvbEZlYXR1cmVzQXRDb29yZGluYXRlLmxlbmd0aCkge1xuICAgICAgICAgICAgb2xGZWF0dXJlc0F0Q29vcmRpbmF0ZS5tYXAob2xGZWF0dXJlQXRDb29yZGluYXRlID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgZmVhdHVyZUF0VGhpc1Bvc2l0aW9uID0gZmVhdHVyZUZyb21PbChvbEZlYXR1cmVBdENvb3JkaW5hdGUsIHRoaXMubWFwLnByb2plY3Rpb24pO1xuICAgICAgICAgICAgICBsZXQgdGl0bGUgPSB0aGlzLmdldFF1ZXJ5VGl0bGUoZmVhdHVyZUF0VGhpc1Bvc2l0aW9uLCBsYXllclRvTW9uaXRvcik7XG4gICAgICAgICAgICAgIC8vIHRvZG8gaGFuZGxlIGltcG9ydGVkIGxheWVycyB3aXRob3V0IHF1ZXJ5dGl0bGU/IHByb21wdCB0aXRsZSBvciBkZXRlY3QgZmlyc3QgY29sdW1uP1xuICAgICAgICAgICAgICB0aGlzLmFkZEZlYXR1cmVUb1N0b3JlKGxheWVyVG9Nb25pdG9yLCBjb29yZCwgZmVhdHVyZUF0VGhpc1Bvc2l0aW9uLCB0aXRsZSwgMCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gY29tcHV0ZSBwcm94aW1pdHkgZm9yIHJlbWFpbmluZyBzb3VyY2VzXG4gICAgICAgICAgICBjb25zdCBjbG9zZXN0T2xGZWF0dXJlID0gbGF5ZXJTb3VyY2UuZ2V0Q2xvc2VzdEZlYXR1cmVUb0Nvb3JkaW5hdGUoY29vcmQpO1xuICAgICAgICAgICAgaWYgKGNsb3Nlc3RPbEZlYXR1cmUpIHtcbiAgICAgICAgICAgICAgY29uc3QgY2xvc2VzdE9sR2VvbSA9IGNsb3Nlc3RPbEZlYXR1cmUuZ2V0R2VvbWV0cnkoKTtcbiAgICAgICAgICAgICAgY29uc3QgY2xvc2VzdEZlYXR1cmUgPSBmZWF0dXJlRnJvbU9sKGNsb3Nlc3RPbEZlYXR1cmUsIHRoaXMubWFwLnByb2plY3Rpb24pO1xuICAgICAgICAgICAgICBjb25zdCBnZW9tZXRyeUNsb3Nlc3RQb2ludCA9IGNsb3Nlc3RPbEdlb20uZ2V0Q2xvc2VzdFBvaW50KGNvb3JkKTtcbiAgICAgICAgICAgICAgY29uc3QgbGluZWJldHdlZW4gPSBuZXcgb2xMaW5lU3RyaW5nKFtjb29yZCwgZ2VvbWV0cnlDbG9zZXN0UG9pbnRdKTtcbiAgICAgICAgICAgICAgY29uc3QgbGluZUxlbmd0aCA9IG1lYXN1cmVPbEdlb21ldHJ5TGVuZ3RoKGxpbmViZXR3ZWVuLCAnRVBTRzozODU3Jyk7XG4gICAgICAgICAgICAgIGlmIChsaW5lTGVuZ3RoIDw9IHByb3hpbWl0eVJhZGl1c1ZhbHVlKSB7XG4gICAgICAgICAgICAgICAgbGV0IHRpdGxlID0gdGhpcy5nZXRRdWVyeVRpdGxlKGNsb3Nlc3RGZWF0dXJlLCBsYXllclRvTW9uaXRvcik7XG4gICAgICAgICAgICAgICAgLy8gdG9kbyBoYW5kbGUgaW1wb3J0ZWQgbGF5ZXJzIHdpdGhvdXQgcXVlcnl0aXRsZT8gcHJvbXB0IHRpdGxlIG9yIGRldGVjdCBmaXJzdCBjb2x1bW4/XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRGZWF0dXJlVG9TdG9yZShsYXllclRvTW9uaXRvciwgY29vcmQsIGNsb3Nlc3RGZWF0dXJlLCB0aXRsZSwgbGluZUxlbmd0aCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICB9KSk7XG4gIH1cblxuICAgIC8qKlxuICAgKiBBZGQgYSBmZWF0dXJlIHdpdGggcHJveGltaXR5IHByb3BlcnRpZXMgdG8gdGhlIHN0b3JlXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgICAgcHJpdmF0ZSBhZGRGZWF0dXJlVG9TdG9yZShsYXllcjogTGF5ZXIsIGNvb3JkRnJvbUNhbGN1bGF0ZWREaXN0YW5jZSwgZmVhdHVyZTogRmVhdHVyZSwgdGl0bGUsIGRpc3RhbmNlKSB7XG4gICAgICBjb25zdCBmZWF0dXJlSWQgPSB1dWlkKCk7XG4gICAgICBjb25zdCBwcm9qZWN0aW9uID0gdGhpcy5tYXAub2wuZ2V0VmlldygpLmdldFByb2plY3Rpb24oKTtcbiAgICAgIGNvbnN0IG9sR2VvbWV0cnkgPSBmZWF0dXJlLm9sLmdldEdlb21ldHJ5KCkgYXMgR2VvbWV0cnk7XG4gICAgICBjb25zdCBnZW9tZXRyeSA9IG5ldyBHZW9KU09OKCkud3JpdGVHZW9tZXRyeU9iamVjdChvbEdlb21ldHJ5LCB7XG4gICAgICAgIGZlYXR1cmVQcm9qZWN0aW9uOiBwcm9qZWN0aW9uLFxuICAgICAgICBkYXRhUHJvamVjdGlvbjogcHJvamVjdGlvblxuICAgICAgfSkgYXMgYW55O1xuICAgICAgdGhpcy5wcm94aW1pdHlGZWF0dXJlU3RvcmUudXBkYXRlKHtcbiAgICAgICAgdHlwZTogRkVBVFVSRSxcbiAgICAgICAgZ2VvbWV0cnksXG4gICAgICAgIHByb2plY3Rpb246IHByb2plY3Rpb24uZ2V0Q29kZSgpLFxuICAgICAgICBwcm9wZXJ0aWVzOiB7Li4uZmVhdHVyZS5wcm9wZXJ0aWVzLC4uLntcbiAgICAgICAgICBpZDogZmVhdHVyZUlkLFxuICAgICAgICAgIGVsZW1lbnQ6IHRpdGxlLFxuICAgICAgICAgIGRpc3RhbmNlLFxuICAgICAgICAgIGNvb3JkRnJvbUNhbGN1bGF0ZWREaXN0YW5jZSxcbiAgICAgICAgICBsYXllclNyY0lkOiBsYXllci5pZCxcbiAgICAgICAgICBsYXllclNyY1RpdGxlOiBsYXllci50aXRsZVxuICAgICAgICB9fSxcbiAgICAgICAgbWV0YToge1xuICAgICAgICAgIGlkOiBmZWF0dXJlSWRcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gIGdldFF1ZXJ5VGl0bGUoZmVhdHVyZTogRmVhdHVyZSwgbGF5ZXI6IExheWVyKTogc3RyaW5nIHtcbiAgICBsZXQgdGl0bGU7XG4gICAgaWYgKGxheWVyLm9wdGlvbnM/LnNvdXJjZT8ub3B0aW9ucykge1xuICAgICAgY29uc3QgZGF0YVNvdXJjZU9wdGlvbnMgPSBsYXllci5vcHRpb25zLnNvdXJjZVxuICAgICAgICAub3B0aW9ucyBhcyBRdWVyeWFibGVEYXRhU291cmNlT3B0aW9ucztcbiAgICAgIGlmIChkYXRhU291cmNlT3B0aW9ucy5xdWVyeVRpdGxlKSB7XG4gICAgICAgIHRpdGxlID0gdGhpcy5nZXRMYWJlbE1hdGNoKGZlYXR1cmUsIGRhdGFTb3VyY2VPcHRpb25zLnF1ZXJ5VGl0bGUpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGl0bGU7XG4gIH1cblxuICBnZXRMYWJlbE1hdGNoKGZlYXR1cmU6IEZlYXR1cmUsIGxhYmVsTWF0Y2gpOiBzdHJpbmcge1xuICAgIGxldCBsYWJlbCA9IGxhYmVsTWF0Y2g7XG4gICAgY29uc3QgbGFiZWxUb0dldCA9IEFycmF5LmZyb20obGFiZWxNYXRjaC5tYXRjaEFsbCgvXFwkXFx7KFteXFx7XFx9XSspXFx9L2cpKTtcblxuICAgIGxhYmVsVG9HZXQuZm9yRWFjaCh2ID0+IHtcbiAgICAgIGxhYmVsID0gbGFiZWwucmVwbGFjZSh2WzBdLCBmZWF0dXJlLnByb3BlcnRpZXNbdlsxXV0pO1xuICAgIH0pO1xuXG4gICAgLy8gTm90aGluZyBkb25lPyBjaGVjayBmZWF0dXJlJ3MgYXR0cmlidXRlXG4gICAgaWYgKGxhYmVsVG9HZXQubGVuZ3RoID09PSAwICYmIGxhYmVsID09PSBsYWJlbE1hdGNoKSB7XG4gICAgICBsYWJlbCA9IGZlYXR1cmUucHJvcGVydGllc1tsYWJlbE1hdGNoXSB8fCBsYWJlbE1hdGNoO1xuICAgIH1cbiAgICByZXR1cm4gbGFiZWw7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export * from './map-tool.component';
|
|
1
|
+
export * from './map-tool.component';
|
|
2
2
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9pbnRlZ3JhdGlvbi9zcmMvbGliL21hcC9tYXAtdG9vbC9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLHNCQUFzQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9tYXAtdG9vbC5jb21wb25lbnQnO1xuIl19
|