@regionerne/gis-komponent 0.0.21 → 0.0.23

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.
@@ -1 +1 @@
1
- {"version":3,"file":"regionerne-gis-komponent.mjs","sources":["../../../projects/gis-komponent/src/lib/config/config.ts","../../../projects/gis-komponent/src/lib/services/profile.service.ts","../../../projects/gis-komponent/src/lib/controls/LogoControl/logoControl.ts","../../../projects/gis-komponent/src/lib/controls/CopyrightControl/copyRightControl.ts","../../../projects/gis-komponent/src/lib/services/layerHelper.service.ts","../../../projects/gis-komponent/src/lib/components/lib-notification/lib-notification.component.ts","../../../projects/gis-komponent/src/lib/components/lib-notification/lib-notification.component.html","../../../projects/gis-komponent/src/lib/services/libError.service.ts","../../../projects/gis-komponent/src/lib/services/layerError.service.ts","../../../projects/gis-komponent/src/lib/components/layer-selector/layer-selector.component.ts","../../../projects/gis-komponent/src/lib/components/layer-selector/layer-selector.component.html","../../../projects/gis-komponent/src/lib/services/komponentSettingsHelper.service.ts","../../../projects/gis-komponent/src/lib/services/currentItems.service.ts","../../../projects/gis-komponent/src/lib/services/drawLayerSource.service.ts","../../../projects/gis-komponent/src/lib/services/featureHelper.service.ts","../../../projects/gis-komponent/src/lib/services/UndoRedo.service.ts","../../../projects/gis-komponent/src/lib/services/geometri-split.service.ts","../../../projects/gis-komponent/src/lib/services/zoom.service.ts","../../../projects/gis-komponent/src/lib/services/highlight.service.ts","../../../projects/gis-komponent/src/lib/services/interactionHelper.service.ts","../../../projects/gis-komponent/src/lib/services/mergeFeatures.service.ts","../../../projects/gis-komponent/src/lib/models/icons.constants.ts","../../../projects/gis-komponent/src/lib/services/printDrawLayerSource.service.ts","../../../projects/gis-komponent/src/lib/components/toolbox/toolbox.component.ts","../../../projects/gis-komponent/src/lib/components/toolbox/toolbox.component.html","../../../projects/gis-komponent/src/lib/components/active-objects/activeObjects.component.ts","../../../projects/gis-komponent/src/lib/components/active-objects/activeObjects.component.html","../../../projects/gis-komponent/src/lib/components/map-search/map-search.component.ts","../../../projects/gis-komponent/src/lib/components/map-search/map-search.component.html","../../../projects/gis-komponent/src/lib/services/layer.service.ts","../../../projects/gis-komponent/src/lib/components/legends-list/legends-list.component.ts","../../../projects/gis-komponent/src/lib/components/legends-list/legends-list.component.html","../../../projects/gis-komponent/src/lib/services/featureLoader.service.ts","../../../projects/gis-komponent/src/lib/components/gis-komponent/gis-komponent.component.ts","../../../projects/gis-komponent/src/lib/components/gis-komponent/gis-komponent.component.html","../../../projects/gis-komponent/src/lib/services/libError.interceptor.service.ts","../../../projects/gis-komponent/src/lib/config/library-provider.ts","../../../projects/gis-komponent/src/public-api.ts","../../../projects/gis-komponent/src/regionerne-gis-komponent.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\n\nexport interface GISKomponentConfig {\n apiBaseUrl: string;\n}\n\nexport const GISKOMPONENT_CONFIG = new InjectionToken<GISKomponentConfig>('GisKomponentConfig');\n","import { inject, Injectable } from '@angular/core';\nimport { GISKOMPONENT_CONFIG } from '../config/config';\nimport { Observable} from 'rxjs';\nimport { HttpClient } from '@angular/common/http';\nimport { IProfileDetailed } from '../models/IProfile';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class ProfileService {\n\n private config = inject(GISKOMPONENT_CONFIG);\n private _baseUrl = this.config.apiBaseUrl;\n private _http = inject(HttpClient);\n\n getByIdentifier(identifier: string): Observable<IProfileDetailed> {\n const url = `${this._baseUrl}/api/profile/identifier/${identifier}`;\n return this._http.get<IProfileDetailed>(url);\n }\n}","// logo-control.ts\nimport { Control } from 'ol/control';\n\nexport class LogoControl extends Control {\n constructor(url: string) {\n const element = document.createElement('div');\n element.className = 'ol-logo ol-unselectable ol-control';\n\n if (url) {\n const img = document.createElement('img');\n img.src = url;\n img.alt = 'Logo';\n element.appendChild(img);\n } else {\n element.style.display = 'none';\n }\n\n super({ element });\n }\n}\n","import { Control } from 'ol/control';\n\nexport class CopyrightControl extends Control {\n constructor(text: string) {\n const element = document.createElement('div');\n element.className = 'ol-copyright ol-unselectable ol-control';\n element.innerText = text;\n\n super({ element });\n\n if (!text) {\n element.style.display = 'none';\n }\n }\n}\n","import { Injectable } from '@angular/core';\nimport BaseLayer from 'ol/layer/Base';\nimport Map from 'ol/Map';\nimport OLLayerGroup from 'ol/layer/Group';\nimport { ILayer } from '../models/ILayer';\nimport { BehaviorSubject } from 'rxjs';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class LayerHelperService {\n\n activeLayersChanged: BehaviorSubject<boolean> = new BehaviorSubject<boolean>(true);\n private readonly _layerDbIdKey: string = 'layerDbId';\n private readonly _layerGroupDbIdKey: string = 'layerGroupDbId';\n private readonly _layerIdsToDisplayInMapKeyName: string = 'layerIdsToDisplayInMap';\n\n\n setDbId(layer: BaseLayer, id: number): void {\n layer.set(this._layerDbIdKey, id);\n }\n\n getDbId(layer: BaseLayer): number {\n const dbId = layer.get(this._layerDbIdKey) ?? -1;\n return +dbId;\n }\n\n setLayerGroupDbId(layer: BaseLayer, id: number): void {\n layer.set(this._layerGroupDbIdKey, id);\n }\n\n getLayerGroupDbId(layer: BaseLayer): number {\n const dbId = layer.get(this._layerGroupDbIdKey) ?? -1;\n return +dbId;\n }\n\n applyCachedLayersToDisplayInMap(map: Map, profileId: number): void {\n this.activeLayersChanged.next(true);\n const layerIdsCachedToDisplay = localStorage.getItem(`${this._layerIdsToDisplayInMapKeyName}_${profileId}`)?.split(',');\n if (layerIdsCachedToDisplay) {\n //Bottom layers are rendered first, top layers are rendered last (on top)\n layerIdsCachedToDisplay.reverse();\n map.getLayers().getArray().forEach(layergroup => {\n if (layergroup instanceof OLLayerGroup) {\n layergroup.getLayers().getArray().forEach(l => {\n if (!layerIdsCachedToDisplay.some(id => l.get(this._layerDbIdKey) == id)) {\n const current = l.getVisible();\n if (current) {\n l.setVisible(!current);\n }\n } else {\n //Set z index to match the order in cache\n l.setZIndex(layerIdsCachedToDisplay.indexOf(l.get(this._layerDbIdKey).toString()));\n //console.log('layer id '+l.get(this._layerDbIdKey)+' - setZIndex:'+layerIdsCachedToDisplay.indexOf(l.get(this._layerDbIdKey).toString()));\n }\n })\n }\n })\n }\n }\n \n\n updateLayerOpacityInMap(map: Map, layer: ILayer): void {\n map.getLayers().getArray().forEach(layergroup => {\n if (layergroup instanceof OLLayerGroup) {\n layergroup.getLayers().getArray().forEach(l => {\n if (l.get(this._layerDbIdKey) === layer.id && layer.opacity) {\n l.setOpacity(layer.opacity);\n }\n })\n }}\n )\n }\n\n toggleLayerInMap(map: Map, layer: ILayer): void {\n map.getLayers().getArray().forEach(layergroup => {\n if (layergroup instanceof OLLayerGroup) {\n layergroup.getLayers().getArray().forEach(l => {\n if (l.get(this._layerDbIdKey) === layer.id) {\n const current = l.getVisible();\n l.setVisible(!current);\n }\n })}\n }\n );\n }\n}","import { Component, inject } from '@angular/core';\nimport { MAT_SNACK_BAR_DATA, MatSnackBarRef } from '@angular/material/snack-bar';\n\n@Component({\n selector: 'lib-notification',\n templateUrl: './lib-notification.component.html',\n styleUrls: ['./lib-notification.component.scss'],\n standalone: true\n})\nexport class LibNotificationComponent {\n data: { messages: string[] } = inject(MAT_SNACK_BAR_DATA);\n private _snackRef = inject(MatSnackBarRef<LibNotificationComponent>);\n\n dismiss() {\n this._snackRef.dismiss();\n }\n}\n","<div class=\"notification-container\">\n <button mat-icon-button class=\"close-btn\" (click)=\"dismiss()\">&times;</button>\n @for (message of data.messages; track message) {\n <div class=\"lib-notification\">\n <span>{{ message }}</span>\n </div>\n }\n</div>","import { Injectable, inject } from '@angular/core';\nimport { HttpErrorResponse } from '@angular/common/http';\nimport { MatSnackBar } from '@angular/material/snack-bar';\nimport { LibNotificationComponent } from '../components/lib-notification/lib-notification.component';\n\n@Injectable({ providedIn: 'root' })\nexport class LibErrorService {\n private _snackBar = inject(MatSnackBar);\n private _messages: string[] = [];\n\n //Format errors from backend or UI\n format(error: unknown): string {\n if (error instanceof HttpErrorResponse) {\n if (error.error?.message) return error.error.message;\n if (typeof error.error === 'string') return error.error;\n return `Server returned ${error.status}`;\n }\n\n if (error instanceof Error) return error.message;\n return 'An unexpected error occurred.';\n }\n // Log errors (for debugging or telemetry)\n log(error: unknown): void {\n console.error('[Library Error]', error);\n }\n // Show user-friendly message via Material snackbar\n show(error: unknown): void {\n const message = this.format(error);\n // Prevent duplicates\n if (this._messages.includes(message)) return;\n this._messages.push(message);\n const ref = this._snackBar.openFromComponent(LibNotificationComponent, {\n data: { messages: this._messages },\n duration: 5000,\n horizontalPosition: 'right',\n verticalPosition: 'top',\n politeness: 'off',\n panelClass: ['lib-notification-container'],\n });\n // Remove from active stack when it closes\n ref.afterDismissed().subscribe(() => {\n this._messages = this._messages.filter(m => m !== message);\n });\n }\n}\n","import { inject, Injectable } from '@angular/core';\nimport BaseLayer from 'ol/layer/Base';\nimport TileLayer from 'ol/layer/Tile';\nimport ImageLayer from 'ol/layer/Image';\nimport VectorLayer from 'ol/layer/Vector';\nimport TileSource from 'ol/source/Tile';\nimport ImageSource from 'ol/source/Image';\nimport VectorSource from 'ol/source/Vector';\nimport { unByKey } from 'ol/Observable';\nimport { EventsKey } from 'ol/events';\nimport { Subject } from 'rxjs';\nimport { LibErrorService } from './libError.service';\n\nexport interface LayerStatus {\n layerId: number;\n hasError: boolean;\n lastError?: any;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class LayerErrorService {\n public layerStatusChanged: Subject<number> = new Subject<number>();\n private layerStatuses = new Map<number, LayerStatus>();\n private listeners = new Map<number, EventsKey[]>();\n private _errorService: LibErrorService = inject(LibErrorService);\n\n registerLayer(layerId: number, layer: BaseLayer): void {\n // BaseLayer does not guarantee getSource(), so we must narrow type first\n let source: any;\n\n if (layer instanceof TileLayer || layer instanceof ImageLayer || layer instanceof VectorLayer) {\n source = layer.getSource();\n }\n\n if (!source) {\n console.warn(`[Layer ${layerId}] has no source; skipping error tracking.`);\n return;\n }\n\n const markError = (event: any) => {\n this.layerStatuses.set(layerId, { layerId, hasError: true, lastError: event });\n console.error(`[Layer ${layerId}] load error:`, event);\n this._errorService.show(new Error(`Indlæsningsfejl for lag med id ${layerId}.`));\n this.layerStatusChanged.next(layerId);\n };\n\n const clearError = () => {\n this.layerStatuses.set(layerId, { layerId, hasError: false });\n this.layerStatusChanged.next(layerId);\n };\n\n let keys: EventsKey[] = [];\n\n if (source instanceof TileSource) {\n keys.push(source.on('tileloaderror', markError));\n keys.push(source.on('tileloadend', clearError));\n } else if (source instanceof ImageSource) {\n keys.push(source.on('imageloaderror', markError));\n keys.push(source.on('imageloadend', clearError));\n } else if (source instanceof VectorSource) {\n keys.push(source.on('featuresloaderror', markError));\n keys.push(source.on('featuresloadend', clearError));\n } else {\n console.warn(`[Layer ${layerId}] Unknown source type; cannot attach error tracking.`);\n }\n\n if (keys.length) {\n this.listeners.set(layerId, keys);\n }\n this.layerStatusChanged.next(layerId);\n }\n\n unregisterLayer(layerId: number): void {\n const keys = this.listeners.get(layerId);\n if (keys) {\n keys.forEach(k => unByKey(k));\n this.listeners.delete(layerId);\n }\n this.layerStatuses.delete(layerId);\n this.layerStatusChanged.next(layerId);\n }\n\n getLayerStatus(layerId: number): LayerStatus | undefined {\n return this.layerStatuses.get(layerId);\n }\n\n getAllStatuses(): LayerStatus[] {\n return Array.from(this.layerStatuses.values());\n }\n}\n","import { Component, ElementRef, inject, Input, OnChanges, OnInit, SimpleChanges, ViewChild } from '@angular/core';\nimport { CdkDragDrop, DragDropModule, moveItemInArray, transferArrayItem } from '@angular/cdk/drag-drop';\nimport { LayerSelectorGroup, Profile } from '../../models/profile';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { CommonModule } from '@angular/common';\nimport { MatIconModule } from '@angular/material/icon';\nimport { FormsModule } from '@angular/forms';\nimport { MatExpansionModule } from '@angular/material/expansion';\nimport { MatInputModule } from '@angular/material/input';\nimport Map from 'ol/Map';\nimport { LayerHelperService } from '../../services/layerHelper.service';\nimport ol_control_Control from 'ol/control/Control';\nimport { ILayer } from '../../models/ILayer';\nimport { LayerErrorService } from '../../services/layerError.service';\n\nexport interface CachedProfileInfo {\n profile: Profile;\n cachedLayerGroups: LayerSelectorGroup[];\n}\n\n@Component({\n selector: 'lib-layer-selector',\n templateUrl: './layer-selector.component.html',\n styleUrls: ['./layer-selector.component.scss'],\n imports: [ MatFormFieldModule, CommonModule, MatIconModule, FormsModule, DragDropModule, \n MatExpansionModule, MatInputModule ]\n})\nexport class LayerSelectorComponent implements OnInit, OnChanges {\n @ViewChild('layerSelectorIcon', { static: false }) set contentIcon(content: ElementRef) {\n this._layerSelectorIcon = content;\n }\n @ViewChild('layerSelectorBody', { static: false }) set contentBody(content: ElementRef) {\n this._layerSelectorBody = content;\n }\n @Input() map!: Map;\n @Input() profile!: Profile;\n @Input() currentZoomLevel!: number;\n searchText = '';\n allLayerGroups: LayerSelectorGroup[] = [];\n filteredLayerGroups: LayerSelectorGroup[] = [];\n showLegend: boolean = false; // TO DO - this will be added later, as a change (probably as a Profile setting)\n showSelector: boolean = false;\n legendUrl: string = 'https://docs.geoserver.org/main/en/user/_images/samplelegend.png'; // TO DO - remove this (mockup for now, will be done as a change later)\n private _namesToGoLast: string[] = ['Baggrundskort'];\n private _layerSelectorIcon!: ElementRef;\n private _layerSelectorIconControl!: ol_control_Control;\n private _layerSelectorBody!: ElementRef;\n private _layerSelectorBodyControl!: ol_control_Control;\n private readonly _mapFilteredLayerGroupsKeyName: string = 'mapFilteredLayerGroups';\n private readonly _layerIdsToDisplayInMapKeyName: string = 'layerIdsToDisplayInMap';\n private readonly _layerHelper: LayerHelperService = inject(LayerHelperService);\n private readonly _layerErrorService: LayerErrorService = inject(LayerErrorService);\n\n ngOnInit(): void {\n this._layerErrorService.layerStatusChanged\n .subscribe(layerId => {\n const layerHasErrors: boolean | undefined = this._layerErrorService.getLayerStatus(layerId)?.hasError;\n if (layerHasErrors != undefined) this.setLayerErrorStatus(layerId, layerHasErrors);\n })\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['profile'] && this.profile) {\n this.allLayerGroups = this.profile.layerGroups\n .map((lg, idx) => ({... lg, \n noOfVisibleLayers: lg.layers.filter(l => l.visible).length, \n visible: lg.layers.some(l => l.visible),\n expanded: lg.layers.some(l => l.visible),\n layers: lg.layers.filter((l: { activeInSelector: boolean; }) => l.activeInSelector), \n sortOrder: idx}))\n .filter(g => g.layers.length > 0); \n \n const cacheValue = localStorage.getItem(`${this._mapFilteredLayerGroupsKeyName}_${this.profile.id}`);\n if (cacheValue) {\n const cachedProfileInfo: CachedProfileInfo = JSON.parse(cacheValue);\n if (cachedProfileInfo.profile.versionId < this.profile.versionId) {\n //Profile version changed in backend, use that\n this.filteredLayerGroups = this.setfilteredGroups(); \n this._cacheProfileInfo();\n } else {\n this.filteredLayerGroups = cachedProfileInfo.cachedLayerGroups;\n this._setVisibleLayersFromCache(cachedProfileInfo.cachedLayerGroups);\n }\n } else {\n this.filteredLayerGroups = this.setfilteredGroups(); \n this._cacheProfileInfo();\n }\n this._initializeMapIconControl();\n }\n }\n\n toggleLayer(event: MouseEvent, layer: ILayer): void {\n event.stopPropagation(); // Prevent the panel from expanding/collapsing\n this._layerHelper.toggleLayerInMap(this.map, layer);\n // Toggle layer in all groups in the selector UI\n this.filteredLayerGroups.forEach(group => {\n group.layers.forEach(l => {\n if (layer.id === l.id) {\n l.visible = !l.visible;\n }});\n group.noOfVisibleLayers = group.layers.filter(l => l.visible).length;\n group.visible = group.layers.some(l => l.visible);\n group.expanded = group.layers.some(l => l.visible);\n });\n this._cacheProfileInfo();\n }\n\n setLayerErrorStatus(layerId: number, errorStatus: boolean): void {\n this.filteredLayerGroups.forEach(group => {\n group.layers.forEach(l => {\n if (layerId === l.id) {\n l.hasErrors = errorStatus;\n }});\n });\n }\n\n toggleGroup(event: MouseEvent, layerGroup: LayerSelectorGroup): void {\n event.stopPropagation(); // Prevent the panel from expanding/collapsing\n const visible: boolean = !layerGroup.visible;\n layerGroup.layers.forEach(layer => {\n if (layer.visible != visible) {\n //Toggle layer in map\n this._layerHelper.toggleLayerInMap(this.map, layer);\n // Toggle layer in all groups in the selector UI\n this.filteredLayerGroups.forEach(group => {\n group.layers.forEach(l => {\n if (layer.id === l.id) {\n l.visible = !l.visible;\n }});\n group.noOfVisibleLayers = group.layers.filter(l => l.visible).length;\n group.visible = group.layers.some(l => l.visible);\n group.expanded = group.layers.some(l => l.visible);\n });\n }\n })\n layerGroup.visible = visible;\n layerGroup.expanded = layerGroup.layers.some(l => l.visible);\n this._cacheProfileInfo();\n }\n\n toggleLayerSelector(): void {\n this.showSelector = !this.showSelector;\n if (this.showSelector) {\n this._addMapBodyControl();\n } else {\n this._removeMapBodyControl();\n }\n }\n\n updateOpacity(layer: ILayer): void {\n this._layerHelper.updateLayerOpacityInMap(this.map, layer);\n }\n\n stopDrag(event: Event): void {\n event.stopPropagation(); // prevents drag container from activating\n }\n\n setfilteredGroups(): LayerSelectorGroup[] {\n const text = this.searchText.toLowerCase();\n return this.allLayerGroups\n .map((g, idx) => {\n if (!text) {\n return { ...g, expanded: false, sortOrder: idx,\n layers: g.layers.map(layer => ({...layer, opacity: 1}))\n }; // collapsed by default\n }\n const filteredItems = g.layers.filter(l => l.name.toLowerCase().includes(text));\n return {\n ...g,\n expanded: filteredItems.length > 0,\n sortOrder: idx,\n layers: filteredItems.map(layer => ({...layer, opacity: 1}))\n };\n })\n .filter(g => g.layers.length > 0)\n .sort((a, b) => {\n const aIsLast = this._namesToGoLast.includes(a.name) || a.layers.some(layer => layer.background);\n const bIsLast = this._namesToGoLast.includes(b.name) || b.layers.some(layer => layer.background);\n if (aIsLast && !bIsLast) return 1;\n if (!aIsLast && bIsLast) return -1;\n return a.sortOrder - b.sortOrder\n });\n }\n\n dropGroup(event: CdkDragDrop<LayerSelectorGroup[]>) {\n moveItemInArray(this.filteredLayerGroups, event.previousIndex, event.currentIndex);\n this.updateGroupSortOrders();\n this._cacheProfileInfo();\n }\n\n dropLayer(event: CdkDragDrop<ILayer[]>, group: LayerSelectorGroup) {\n if (event.previousContainer === event.container) {\n moveItemInArray(group.layers, event.previousIndex, event.currentIndex);\n } else {\n transferArrayItem(\n event.previousContainer.data,\n event.container.data,\n event.previousIndex,\n event.currentIndex\n );\n }\n this.updateLayerSortOrders(group);\n this._cacheProfileInfo();\n }\n\n clearSearchText(): void {\n this.searchText = '';\n this.filteredLayerGroups = this.setfilteredGroups();\n this._cacheProfileInfo();\n }\n\n updateGroupSortOrders() {\n this.filteredLayerGroups.forEach((g, idx) => (g.sortOrder = idx));\n }\n\n updateLayerSortOrders(group: LayerSelectorGroup) {\n group.layers.forEach((layer, idx) => (layer.sortOrder = idx));\n }\n\n private _cacheProfileInfo(): void {\n const cacheItem: CachedProfileInfo = { profile: this.profile, cachedLayerGroups: this.filteredLayerGroups };\n localStorage.setItem(`${this._mapFilteredLayerGroupsKeyName}_${this.profile.id}`, JSON.stringify(cacheItem));\n localStorage.setItem(`${this._layerIdsToDisplayInMapKeyName}_${this.profile.id}`, this.filteredLayerGroups\n .flatMap(lg => lg.layers)\n .filter(lg => lg.visible)\n .map(lg => lg.id).join(','));\n // Reflect new order in map\n this._layerHelper.applyCachedLayersToDisplayInMap(this.map, this.profile.id);\n }\n\n private _initializeMapIconControl(): void {\n this.map.removeControl(this._layerSelectorIconControl);\n if (this._layerSelectorIcon?.nativeElement) {\n const element = this._layerSelectorIcon.nativeElement;\n this._layerSelectorIconControl = new ol_control_Control({ element: element });\n this.map.addControl(this._layerSelectorIconControl);\n }\n }\n\n private _addMapBodyControl(): void {\n this.map.removeControl(this._layerSelectorBodyControl);\n const element = this._layerSelectorBody.nativeElement;\n this._layerSelectorBodyControl = new ol_control_Control({ element: element });\n this.map.addControl(this._layerSelectorBodyControl);\n }\n\n private _removeMapBodyControl(): void {\n this.map.removeControl(this._layerSelectorBodyControl);\n }\n\n private _setVisibleLayersFromCache(cachedFilteredLayergroups: LayerSelectorGroup[]): void {\n this.allLayerGroups.forEach(group => group.layers.forEach(layer => {\n const cachedLayer = cachedFilteredLayergroups.find(gr => gr.id === group.id)?.layers?.find(l => l.id === layer.id);\n layer.visible = cachedLayer?.visible ?? layer.visible;\n }))\n }\n\n}\n","<div #layerSelectorIcon id=\"layerSelector\" class=\"ol-unselectable ol-control layer-selector-icon\">\n <mat-icon (click)=\"toggleLayerSelector()\">layers</mat-icon>\n</div>\n<div #layerSelectorBody [class.display-none]=\"!showSelector\" class=\"layer-selector-body-wrapper\" cdkDrag cdkDragBoundary=\".map-container\">\n <div class=\"drag-handle-selector\" cdkDragHandle>\n <mat-icon>drag_indicator</mat-icon>\n </div>\n <div class=\"ol-unselectable ol-control layer-selector-body\">\n <div class=\"search-section\">\n <mat-form-field appearance=\"outline\" class=\"w-full\">\n <mat-label>Filtrer</mat-label>\n <input \n matInput \n type=\"text\" \n [(ngModel)]=\"searchText\" \n (ngModelChange)=\"filteredLayerGroups=setfilteredGroups()\"\n placeholder=\"Skriv for at filtrere...\"\n />\n </mat-form-field>\n <mat-icon (click)=\"clearSearchText()\">undo</mat-icon>\n </div>\n \n <div\n cdkDropList\n [cdkDropListData]=\"filteredLayerGroups\"\n (cdkDropListDropped)=\"dropGroup($event)\"\n class=\"item-list\">\n @for (group of filteredLayerGroups; track group.id; let gIndex = $index) {\n <div class=\"group\" cdkDrag cdkDragPreviewDisabled>\n <mat-expansion-panel [(expanded)]=\"group.expanded\">\n <mat-expansion-panel-header>\n <mat-panel-title>\n @if (group.expanded) {\n <mat-icon>arrow_upward</mat-icon>\n }\n @if (!group.expanded) {\n <mat-icon>arrow_downward</mat-icon> \n }\n {{ group.name }} \n <mat-icon class=\"lightbulb\">lightbulb</mat-icon>\n ({{ group.noOfVisibleLayers }}/{{ group.layers.length }})\n @if (group.visible) {\n <mat-icon (click)=\"toggleGroup($event, group)\" class=\"power-on\">power</mat-icon>(tænd)\n }\n @if (!group.visible) {\n <mat-icon (click)=\"toggleGroup($event, group)\" class=\"power-off\">power_off</mat-icon>(sluk)\n }\n </mat-panel-title>\n </mat-expansion-panel-header>\n <!-- This is only shown during drag -->\n <!-- <div *cdkDragPreview class=\"drag-preview\">\n {{ group.name }}\n </div> -->\n\n <!-- Placeholder to avoid jump -->\n <!-- <div *cdkDragPlaceholder class=\"drag-placeholder\"></div> -->\n\n <div\n cdkDropList\n [cdkDropListData]=\"group.layers\"\n (cdkDropListDropped)=\"dropLayer($event, group)\"\n class=\"item-list\">\n @for (layer of group.layers; track layer.id; let iIndex = $index) {\n <mat-expansion-panel expanded=\"false\" [disabled]=\"!layer.description\"> \n <mat-expansion-panel-header>\n <mat-panel-title>\n <div class=\"item\" cdkDrag cdkDragPreviewDisabled>\n <div class=\"item-left\">\n <mat-icon class=\"drag-indicator\">drag_indicator</mat-icon>\n <span>{{ layer.name }}</span>\n </div>\n <div class=\"item-center\">\n @if (layer.maxZoom < currentZoomLevel || layer.minZoom > currentZoomLevel) {\n <mat-icon class=\"zoom-off\">browser_not_supported</mat-icon>\n <span class=\"icon-label\">(zoom)</span>\n }\n @if (layer.hasErrors) {\n <mat-icon class=\"zoom-off\">wifi_off</mat-icon>\n <span class=\"icon-label\">(fejle)</span>\n }\n </div>\n <div class=\"item-right\">\n @if (layer.visible) {\n <mat-icon (click)=\"toggleLayer($event, layer)\" class=\"power-on\">power</mat-icon>\n <span class=\"icon-label\">(tænd)</span>\n }\n @if (!layer.visible) {\n <mat-icon (click)=\"toggleLayer($event, layer)\" class=\"power-off\">power_off</mat-icon>\n <span class=\"icon-label\">(sluk)</span>\n }\n <input \n type=\"range\"\n min=\"0\"\n max=\"1\"\n step=\"0.05\"\n [(ngModel)]=\"layer.opacity\"\n (click)=\"stopDrag($event)\"\n (input)=\"updateOpacity(layer)\"\n (mousedown)=\"stopDrag($event)\"\n (touchstart)=\"stopDrag($event)\"\n (pointerdown)=\"stopDrag($event)\"\n >\n </div>\n </div>\n </mat-panel-title>\n </mat-expansion-panel-header>\n <div class=\"item\">{{ layer.description }}</div>\n @if (showLegend) {\n <img [src]=\"legendUrl\" class=\"legend-thumbnail\"/>\n }\n </mat-expansion-panel>\n }\n </div>\n </mat-expansion-panel>\n </div>\n }\n </div>\n </div>\n</div>","import { HttpClient, HttpHeaders, HttpParams } from '@angular/common/http';\nimport { inject, Injectable } from '@angular/core';\nimport { GisKomponentSettings } from '../models/GisKomponentSettings';\nimport { GeoServer } from '../models/geoserver';\nimport { combineLatest, map, Observable, of, reduce, tap } from 'rxjs';\nimport WKT from 'ol/format/WKT'\n// @ts-ignore\nimport * as SLDReader from '@nieuwlandgeo/sldreader';\n\nimport Map from 'ol/Map';\nimport ol_layer_Vector from 'ol/layer/Vector';\nimport VectorSource from 'ol/source/Vector';\nimport { extend } from 'ol/extent';\nimport { Style } from 'ol/style';\n\n// interface namedStyle {\n// styleName: string;\n// sldFeatureStyle: any;\n// }\n\n@Injectable({\n providedIn: 'root'\n})\nexport class KomponentSettingsHelperService {\n\n private readonly _httpClient = inject(HttpClient);\n\n private styles: Record<string, any> = { }; \n\n // loadNamedStyleObjects(styleNames: string[], workspace: string, geoserver: GeoServer): Observable<namedStyle[]> {\n\n // const headerstring = `${geoserver.userName}:${geoserver.password}`;\n // const encoded = btoa(headerstring); \n // const headers = new HttpHeaders().set('Authorization', `Basic ${encoded}`);\n \n\n // const result$ = styleNames.map(styleName => \n // this._httpClient.get(`${geoserver.url}/rest/workspaces/${workspace}/styles/${styleName}.sld`, { headers, responseType: 'text' })\n // .pipe(map(loadedStyle => { \n // const sldObject = SLDReader.Reader(loadedStyle);\n // const sldLayer = SLDReader.getLayer(sldObject);\n // const sldStyles = SLDReader.getStyle(sldLayer);\n // const sldFeatureStyle = sldStyles.featuretypestyles[0];\n // return { styleName, sldFeatureStyle } as namedStyle\n // })));\n // return combineLatest(result$);\n // }\n\n private _getSldStyleObject$(styleName: string, workspace: string, geoserver: GeoServer): Observable<any> {\n return this.styles[styleName] ? of(this.styles[styleName]) :\n this._loadStyleFromGeoServer$(styleName, workspace, geoserver)\n .pipe(\n tap(loadedStyle => { \n this.styles[styleName] = loadedStyle; } \n ));\n }\n\n private _loadStyleFromGeoServer$(styleName: string, workspace: string, geoserver: GeoServer): Observable<any> {\n const headerstring = `${geoserver.userName}:${geoserver.password}`;\n const encoded = btoa(headerstring); \n const headers = new HttpHeaders().set('Authorization', `Basic ${encoded}`);\n const url = `${geoserver.url}/rest/workspaces/${workspace}/styles/${styleName}.sld`;\n return this._httpClient.get(url, { headers, responseType: 'text' }).pipe(map(loadedStyle => {\n const sldObject = SLDReader.Reader(loadedStyle);\n const sldLayer = SLDReader.getLayer(sldObject);\n const sldStyles = SLDReader.getStyle(sldLayer);\n const sldFeatureStyle = sldStyles.featuretypestyles[0];\n return sldFeatureStyle; \n }));\n\n }\n\n getStyle(styleName: string, workspace: string, geoserver: GeoServer, styleType: string): Observable<Style> {\n\n return this._getSldStyleObject$(styleName, workspace, geoserver)\n .pipe(map(loadedStyle => {\n return SLDReader.createOlStyle(loadedStyle.rules[0], styleType) as Style\n }\n ));\n }\n}","import { Map } from 'ol';\nimport { IProfileDetailed } from '../models/IProfile';\nimport { Injectable } from '@angular/core';\nimport { ReplaySubject } from 'rxjs';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class CurrentItemsService {\n\n private _map: Map | undefined;\n\n get map(): Map | undefined { return this._map; }\n set map(value: Map) {\n this._map = value;\n this._mapSubject.next(value);\n }\n profile: IProfileDetailed | undefined;\n\n private _mapSubject: ReplaySubject<Map> = new ReplaySubject<Map>();\n map$ = this._mapSubject.asObservable();\n\n}","import { inject, Injectable } from '@angular/core';\nimport Feature from 'ol/Feature';\nimport VectorSource from 'ol/source/Vector';\nimport { Subject } from 'rxjs';\nimport { CurrentItemsService } from './currentItems.service';\nimport VectorLayer from 'ol/layer/Vector';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class DrawLayerSourceService {\n\n private _current = inject(CurrentItemsService);\n\n private _features = new Subject<Feature[]>;\n features$ = this._features.asObservable();\n source: VectorSource = new VectorSource();\n layer = new VectorLayer({\n source: this.source\n });\n private _disabled = false;\n\n constructor() { \n this.layer.set('DRAWLAYER', 'true'); \n this._initListener();\n }\n\n private _initListener(): void {\n this._current.map$.subscribe({\n next: map => {\n map.addLayer(this.layer);\n }\n });\n this.source.on(['addfeature', 'changefeature', 'removefeature'], evt => {\n if (this._disabled) { return; }\n const features = this.source.getFeatures();\n this._features.next(features);\n });\n \n }\n\n get allFeatures(): Feature[] {\n return this.source.getFeatures().map(f => { \n // I want a static copy of the features. \n const newFeature = f.clone(); \n // But cloning doesn't include the id and that is used for referencing a few places.\n newFeature.setId(f.getId());\n return newFeature;\n }); \n }\n\n remove(id: string | number): void {\n const feature = this.source.getFeatureById(id);\n if (feature) {\n this.source.removeFeature(feature);\n }\n }\n\n setFeatures(features: Feature[]) {\n this._disabled = true;\n this.source.clear();\n this.source.addFeatures(features.map(f => {\n const newFeature = f.clone();\n newFeature.setId(f.getId())\n return newFeature;\n }));\n this._features.next(features);\n this._disabled = false;\n }\n}","import { Injectable } from '@angular/core';\nimport Feature from 'ol/Feature';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class FeatureHelperService {\n\n private readonly FEATURE_TYPE_ID = 'TypeId';\n private readonly FEATURE_LOCKED = 'LOCKED';\n\n private _idCounter = 0;\n\n isLocked = (feature: Feature) => feature.get(this.FEATURE_LOCKED) === 'true';\n lock(feature: Feature): void { feature.set(this.FEATURE_LOCKED, 'true'); }\n\n constructor() {\n console.log('FeatureHelperService, constructor');\n }\n\n setTypeId(feature: Feature, typeId: string): void {\n feature.set(this.FEATURE_TYPE_ID, typeId); \n }\n\n typeId = (feature: Feature) => feature.get(this.FEATURE_TYPE_ID) as string;\n\n setId(feature: Feature): void {\n feature.setId(this._idCounter++);\n }\n}","import { Injectable } from '@angular/core';\nimport Feature from 'ol/Feature';\nimport { DrawLayerSourceService } from './drawLayerSource.service';\nimport { filter } from 'rxjs';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class UndoRedoService {\n \n constructor(private _drawlayerSourceService: DrawLayerSourceService) {}\n\n\n disable(): void {\n this._enabled = false;\n }\n\n enable(): void {\n this._enabled = true;\n }\n\n private _steps: Feature[][] = [];\n private _currentStep = 0;\n private _changing = false;\n private _enabled = true;\n\n init(): void {\n this._steps[0] = this._drawlayerSourceService.allFeatures;\n // For every change, add the current state\n this._drawlayerSourceService.features$.pipe(filter(() => this._enabled)).subscribe({\n next: () => {\n if (this._changing) {\n this._changing = false;\n return;\n }\n this._steps = [...this._steps.slice(0, this._currentStep + 1), this._drawlayerSourceService.allFeatures]\n this._currentStep++;\n }\n });\n }\n\n get canUndo(): boolean { \n return this._currentStep > 0;\n }\n\n get canRedo(): boolean {\n return this._currentStep < this._steps.length - 1;\n }\n\n undo(): void {\n if (this.canUndo) {\n this._changing = true;\n this._currentStep--;\n const features = this._steps[this._currentStep];\n this._drawlayerSourceService.setFeatures(features);\n }\n }\n\n redo(): void {\n if (this.canRedo) {\n this._changing = true;\n this._currentStep++;\n const features = this._steps[this._currentStep];\n this._drawlayerSourceService.setFeatures(features);\n }\n }\n\n reset(): void {\n this._changing = true;\n if (this._currentStep === 0) { return; }\n const features = this._steps[0];\n this._drawlayerSourceService.setFeatures(features);\n }\n}","import { inject, Injectable } from '@angular/core';\nimport { Feature } from 'ol';\nimport { Vector as VectorSource } from 'ol/source';\nimport GeoJSON from 'ol/format/GeoJSON';\nimport { LineString, Polygon as olPolygon, MultiPolygon as olMultiPolygon } from 'ol/geom';\nimport { buffer, difference, featureCollection } from '@turf/turf';\nimport { Polygon, Feature as TurfFeature, LineString as TurfLineString } from 'geojson';\nimport proj4 from 'proj4';\nimport { FeatureHelperService } from './featureHelper.service';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class GeometrySplitService {\n private geoJsonFormat = new GeoJSON<Feature<olPolygon>>();\n\n private _featureHelper = inject(FeatureHelperService);\n\n /**\n * Split polygons in a vector source using a buffered LineString.\n * @param lineFeature The drawn LineString feature.\n * @param vectorSource The source containing polygons to split.\n * @param bufferMeters Width of the buffer in meters (default: 1).\n */\n splitPolygonsWithBufferedLine(lineFeature: Feature<LineString>, vectorSource: VectorSource, bufferMeters: number = 1): void {\n\n const lineGeoJSON = this.geoJsonFormat.writeFeatureObject(lineFeature) as TurfFeature<TurfLineString>;\n // the buffer functions uses 4326 and makes a mess if you don't convert the projection\n lineGeoJSON.geometry.coordinates = lineGeoJSON.geometry.coordinates.map(c => proj4('EPSG:25832', 'EPSG:4326', c));\n\n // Buffer the line to create a narrow polygon\n const bufferedLine = buffer(lineGeoJSON, bufferMeters, { units: 'meters'}) as TurfFeature<Polygon>;\n // Move back to 25832 \n bufferedLine.geometry.coordinates = bufferedLine.geometry.coordinates.map(a => a.map(c => proj4('EPSG:4326','EPSG:25832', c)));\n const overlappingFeatures = vectorSource.getFeatures().filter(f =>\n f.getGeometry()?.intersectsExtent(lineFeature.getGeometry()?.getExtent()!)\n );\n\n overlappingFeatures.forEach((feature) => {\n const overlappingFeatureGeoJson = this.geoJsonFormat.writeFeatureObject(feature);\n\n const features = featureCollection([overlappingFeatureGeoJson, bufferedLine!]);\n const clipped = difference(features as any);\n\n // If the result is not a MultiPolygon, the polygon was not clipped in two. In that case, I will do nothing.\n if (clipped && clipped.geometry.type === 'MultiPolygon') {\n vectorSource.removeFeature(feature);\n \n const multipolygon = this.geoJsonFormat.readGeometry(clipped.geometry) as olMultiPolygon; \n const polygons = multipolygon.getPolygons();\n\n const newFeatures = polygons.map(p => {\n const newFeature = feature.clone();\n newFeature.setGeometry(p);\n this._featureHelper.setId(newFeature);\n return newFeature;\n });\n vectorSource.addFeatures(newFeatures);\n }\n });\n }\n\n\n}","import { inject, Injectable } from '@angular/core';\n\nimport { Feature } from 'ol';\nimport { extend, createEmpty, buffer } from 'ol/extent'\nimport { CurrentItemsService } from './currentItems.service';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class ZoomService {\n\n private _currentItems = inject(CurrentItemsService);\n\n zoomToFeatures(features: Feature[]): void {\n const extent = features.filter(f => !!f && f.getGeometry()).reduce((acc, feature) => {\n return extend(acc, feature!.getGeometry()!.getExtent());\n }, createEmpty());\n\n const bufferValue = this._currentItems.profile?.highlightBuffer ?? 0;\n const maxZoom = this._currentItems.profile?.highlightMaxZoom ?? 21;\n \n const bufferedExtent = buffer(extent, bufferValue);\n const map = this._currentItems.map!;\n\n map.getView().fit(bufferedExtent, {\n size: map.getSize(),\n maxZoom: maxZoom\n });\n\n }\n\n}","import { inject, Injectable } from '@angular/core';\nimport { Feature } from 'ol';\nimport VectorLayer from 'ol/layer/Vector';\nimport { Vector } from 'ol/source';\nimport { Circle, Fill, Stroke, Style } from 'ol/style';\nimport { ZoomService } from './zoom.service';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class highlightService {\n\n constructor() {\n console.log('highlightservice, constructor');\n }\n\n private _zoomService = inject(ZoomService);\n\n private _style = new Style({\n stroke: new Stroke({\n color: '#0ff',\n width: 3\n }),\n fill: new Fill({\n color: 'rgba(0, 0, 255, 0.3)'\n }),\n image: new Circle({\n fill: new Fill({ color: [175, 202, 10, 1] }),\n stroke: new Stroke({ color: [40, 112, 133, 1], width: 2 }),\n radius: 5\n })\n });\n\n private _highlightSource = new Vector({ wrapX: false });\n highlightLayer = new VectorLayer({ \n source: this._highlightSource,\n style: this._style\n });\n\n clear(): void {\n this._highlightSource.clear();\n }\n\n highlight(feature: Feature | Feature[], zoomToFeatures: boolean = true): void {\n if (!Array.isArray(feature)) { \n this.highlight([feature]); \n return;\n }\n // If the feature has a style, it overwrites the style of the layer, so I create a new feature without properties or style.\n this._highlightSource.addFeatures(feature.map(f => new Feature({ geometry: f.getGeometry()})));\n if (zoomToFeatures) {\n this._zoomService.zoomToFeatures(feature);\n }\n }\n\n}","import { inject, Injectable } from '@angular/core';\nimport { Interaction } from 'ol/interaction';\nimport { CurrentItemsService } from './currentItems.service';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class InteractionHelperService {\n\n private _current = inject(CurrentItemsService);\n setAsTemp(interaction: Interaction): void {\n interaction.set('temp', 'true');\n }\n\n isTemp(interaction: Interaction): boolean {\n return interaction && interaction.get('temp') === 'true';\n }\n\n clearTempFromMap(): void {\n this._current.map!.getTargetElement().style.cursor = '';\n this._current.map!.getInteractions().forEach(i => {\n if (this.isTemp(i)) {\n this._current.map!.removeInteraction(i);\n }\n });\n }\n}","import { inject, Injectable } from '@angular/core';\nimport { CurrentItemsService } from './currentItems.service';\nimport Feature from 'ol/Feature';\nimport Select from 'ol/interaction/Select';\nimport GeoJSON from 'ol/format/GeoJSON';\nimport { Polygon as geoJsonPolygon, Feature as geoJsonFeature } from 'geojson';\nimport { booleanIntersects, featureCollection, buffer as turfBuffer, union } from '@turf/turf';\nimport { FeatureHelperService } from './featureHelper.service';\nimport { InteractionHelperService } from './interactionHelper.service';\nimport { DrawLayerSourceService } from './drawLayerSource.service';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class MergeFeaturesService {\n\n private _current = inject(CurrentItemsService);\n private _featureHelper = inject(FeatureHelperService);\n private _interactionHelper = inject(InteractionHelperService);\n private _drawLayerService = inject(DrawLayerSourceService);\n\n private _selectedMergeFeature: Feature | undefined;\n private formatter = new GeoJSON();\n private _formatterOptions = { dataProjection: 'EPSG:4326', featureProjection: 'EPSG:25832'};\n\n private _selectFilter(f: Feature, typeId: string): boolean { \n if (this._selectedMergeFeature) {\n const previusFeatureObject = this.formatter.writeFeatureObject(this._selectedMergeFeature, this._formatterOptions) as geoJsonFeature<geoJsonPolygon>;\n const bufferedPreviouslySelected = turfBuffer(previusFeatureObject, 5, { units: 'centimeters'});\n const featureObject = this.formatter.writeFeatureObject(f, this._formatterOptions);\n const bufferedFeature = turfBuffer(featureObject, 5, { units: 'centimeters'});\n const areNear = booleanIntersects(bufferedPreviouslySelected!, bufferedFeature!)\n return areNear;\n } \n return this._featureHelper.typeId(f) === typeId;\n }\n\n startMerge(typeId: string, done: () => void): void {\n\n this._selectedMergeFeature = undefined; \n this._current.map$.subscribe({\n next: map => {\n const select = new Select({\n layers: [this._drawLayerService.layer],\n filter: f => this._selectFilter(f, typeId)\n });\n this._interactionHelper.setAsTemp(select);\n \n select.on('select', evt => {\n \n if (this._selectedMergeFeature) {\n if (evt.selected && evt.selected.length > 0 && this._selectedMergeFeature.getId() !== evt.selected[0].getId()) {\n \n const feature1 = this.formatter.writeFeatureObject(this._selectedMergeFeature, this._formatterOptions) as geoJsonFeature<geoJsonPolygon>;\n const feature2 = this.formatter.writeFeatureObject(evt.selected[0], this._formatterOptions) as geoJsonFeature<geoJsonPolygon>;\n const bufferedFeature1 = turfBuffer(feature1, 5, { units: 'centimeters'}) as geoJsonFeature<geoJsonPolygon>;\n const bufferedFeature2 = turfBuffer(feature2, 5, { units: 'centimeters'}) as geoJsonFeature<geoJsonPolygon>;\n \n const newFeatureObject = union(featureCollection([ bufferedFeature1, bufferedFeature2])) as geoJsonFeature<geoJsonPolygon>;\n const newFeature = this.formatter.readFeature(newFeatureObject, this._formatterOptions) as Feature;\n this._selectedMergeFeature.setGeometry(newFeature.getGeometry());\n this._drawLayerService.source.removeFeature(evt.selected[0]);\n }\n this._selectedMergeFeature = undefined;\n map.removeInteraction(select);\n done();\n } else {\n this._selectedMergeFeature = evt.selected[0];\n }\n });\n map.addInteraction(select); \n }\n })\n }\n\n}","export class IconsConstants {\n static undoIconBase64 = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAyZJREFUSEu9VktPE1EUriuCYeHOpb9FF4YoCw2kiArESI0viERBBQ3EBTEE5dHaBy20pUwL5VU6FSqvVp4tBfqgnWlLOwWEYEwM6UII0fg5U5BCFFKgOsnJ5M7ce77znXvPd+4p3s7T3NycHY1GKzY3N89tbW2d/v39KO+UlJSN1NTUpbS0NJFAIBDvrlWpVKaamhpYrVa43W6Ew+FjGbeW8yGTyTjzxwDkcnmeWCw+lsPDAlGr1VAoFHU8iUTyaWxsLOkADocD1dXV6zwW5QdN00kH4NhVVFSAA/gnzk8MwLARMgwTs4P2IiEGNjZ9bZZ5NPS7UG2cx5v3FN6a/RCag2gdD2PUt5o4AM1E4pPZyAiDE+VtDhQRcyjUuiAg3Lijo3CvM4CinhBKSQZlJgaVZi9GXH8y2ceACizgqWoC9cY52D1eSEk77rfMoqDVhUzFDC5JnUiXuHBZQeFKSxD8Ngb5XSt40PcZxX1rKDGwQDZvLMBQaLuO9gH4/QE8Vo7jVtM0nrTYcVc9ixy1B+lSN84LZ3Ghzo7LdaO4KpxAlmQK/EYHspU+XO9YgqD/Kx4NRVFsXIbJFi/SfQA0HcBLrQ0POygUdtDIJWhkKL24KJpBVu0gymUkVHoS3SYzjH3D6CAHoegcwitihA1mDgW9qygc2cAzgxc2bzDOgK3k2MDj86OMmEJuqx83tAu4Riwgs9mD/PoBtBvMoJ1zWGbCWFzcm+sQmACFYYsFr9s/4rY+jBzdIuTkttzEGEil0m0AL4VSlgGfCCGvewUFxjUUmlZQrpuCfXaePY6H61OAovDOYMFzlRUfLNNxAE6YOACfj0aJfBQZYgeyFE7wFS7c1PiQKZrCC+0EIpE9J+wgMQwtwMKyiQT/kqIQ+5MkR6A3DUPfOwCiywRtdz8adSSMg5OIJKiwseLbmZtQoR1Xuk8sFYkA/zcGP4M7m5JIVEeZE2PAtsovNpst6ZLNtc+qqqpvPPaYNmg0mqQDKJVKiEQia6wvC4XCdb1ej2R0Ns4H57y2tnazp6fnzO7NoqmpyVRZWfmdy9tJjPPBXiIm2U55lnP+C/4QIs8xdHrCAAAAAElFTkSuQmCC';\n static redoIconBase64 = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAwVJREFUSEu9VktPE1EUxhXBsHDn0t+iC0OUhQYCogIxUuOrRKKggqaNK2PAUlr7gNIHZVpooS3TQhsKtBKgrX3QltoX7SCKwYVG2dAQjZ8zjbzkVbA6yclM7tzzffc755577rGC349cLq9cWVnhZDKZU2tra8fXxw/zLiwsXC0qKlosLi4Wslgs0YavUqm0tLa2wul0IhQKIZ1OH8kYXwZDKpUyFs8SdHV11YhEoiMB7rcQlUoFmUzWXiAWiz/4/f68E4TDYfD5/G8FNMuPWCyWdwJGHYfDAUPwT8BzIqAoClk7YtIPVDDsTaJ3Kg2BLYmXtjjahqN4Qc6hwxpEn2MOVt/+od2TwOBJgGuLoNlCoclMod6Ywq2BBG5oo2ARIbA1QdQTAbT0eUGYZpHaojC55XtXAq47gkYThYaRZdwZ+YTawSVU9FG40JPEeVkUJeIgzklmUSbzoa43iNs9fkjMHsQSSfDJAB4qpzdyuoPA4k6jgXyPe2MrYFm/4LJ+EZWKt6jo9KJc7MJFwTTOt0/iTLsHpwV+lEhCqFKFcVPlx4MeD651v8F9xdTuBDZfHI9MEbAnVlE39JF2CuAZMQHZwBj0ZjvIkXEYLDYodWa0SM0o59lxVuhDqSKCaiIGtj6Gu/oonmrc2wnoSs4OcMkwqrTvcF2XxvP+1xh3OGD3x+l/qR3beCyQQL/Jhlr+KMrkYVwi5nFFM4/q3jiaCdd2AolEkh0gSRKPlU68MjmQSu0E3XosUFQaoUgMLVoX2JYl1JHLqDHQuSJSaPpTAXMwMc4UvVKNbTNBBx14TzTTKBO6cFVN50gWRLlsFqUiLxq7JncP0cLCQraoDgJe/0/aZ9CpNUNjsIIYtEA3NAqdZRxm88TeuyhX8FznHVjJuQLtNe+/EfxMJpM5x/4wqrIKhELhZ7d7szgOA7DfXKZ9trW1rRbQ27RDrVbnXYFCoQC9eGe2LwsEgq86nQ756GwMBgPO4/EyRqPxxMbNoru728Llcr8zcfsbYzDoS8QM3SlPMuC/ALEMIuD09rJvAAAAAElFTkSuQmCC';\n static trimIconBase64 = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAA0BJREFUSEulVmtIU2EYPv0SdVFqZIhYUBhECwQRIkMY9MPAKEi7QFos+ydC9CMR2spcdVhM2lhNN+ccgi1M05kkistpTibWQJqNNMUupObcTIdEvJ3303PYOe5qg29n5+z7nue9Pu/ZQW1+GhsbL/h8PlkgENi/vr6exD6P55qQkLCWmJg4KxKJNOXl5VrubFNTk1WpVILNZgOXywVTU1PbWngWMXQ6Ha5JQtDQ0FCq1Wq3BfjWNQsVbYsgqV+Gj55pHobJZAK9Xl9HqVSqGbvdHjOBY2IG7r2eh+y6VUij/VBmdEOhYQKqrQs8DKfTCTRNeym5XP7H7XZHJEDrHr35CRK9D9Ie+uCUaRL0g31gc7WRhb+RUBhamUwGFH6Fi/nTgR9wrtkLotolKDROw/2eEQ6UBWevOZrv0DL8jYcVkqDLOQcXW7yQ+mAFTmq+wu3OMegd7wgLzBIgOXoYbCyPQKPRwL7L9ZBZ2Qc3O8bh5Wh3VNBgL9CIPfQKYI5YEh6BVCoFKiMXDh85CCWlZ6KCX7p2luyVK29xezHhWFUhCcRiMVByIJuFB4MtRcCcvKNkBYPjHvR6L73KlSzPg6ysLEKAh5BASILPjxfkQkrqLqisuh7WQ8wbFgd6sSUHVHYRAWFJMjLToaqmgpDh72RREphfqSOGr65/EHK1/q0EyMiGiPWESk4HspjcFF8pAqr4BQHH//s/tEGKYo27x+cF9XPk/pDKB1iNUT1Ay9GD7Lz8jZB1b/RBiflTxOtVowvKWn/xCSQSCecBhgMBhc0Uy33rSA+RjxPPlvkEbBWxyRRWSCRw61gnaUjsZqyiG88XAYVwa4g2+yBWcLp3iEhIas0KkZSoUsEmOZK1zUO9cN78mYhevs5PRFAo1SEbLbiKhATYQCgfWB0HHq9BddcCTxLCiSUJESPXfz0eD6lboQd3ukeJ4KHwoQBi6cUz7QgBMyrnHQ4HR6AdGCB6L7q7AKcNS1xXxgOMe3F8KhSKVYqZnU/MZjMh2Fnrh2Pq32RivXd/ictaoQFGoxEYhbaRuaxWq70WiwWiTbZYvEAMBGdGcaC9vX0392ZhMBisOD4xbv+zEIN5iXjHDPx0BP8HrKKC57UCn9MAAAAASUVORK5CYII=';\n static deleteIconBase64 = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAMAAACelLz8AAAAIGNIUk0AAHomAACAhAAA+gAAAIDoAAB1MAAA6mAAADqYAAAXcJy6UTwAAALHUExURQAAAP//////5gMEAgAAABMWDBESCwAAAA4RCQ0OCQAAABwiEhkcERwiExocEhkeEBcZDwoLBgkJBg8RCw4NCgAAAAAAAAAAAEtiMEVTLgAAAAAAAEVbLUBNKgAAAAAAAD9TKTpGJgAAAAAAAAAAADxPJzdDJAAAADhJJDM+IgAAADNDIS85HwAAAAAAAC8+His0HQAAACs4HCgwGgAAAAAAACczGSQrGAAAACMuFyAnFR8pFB0jEwAAABwlEhofEQAAABYdDhQZDQAAAAQGAxcfDzFAIDNEITNDIQQFAwAAAAsOCgsPCwkLBQAAAAAAAA0PCwoMCgAAAAAAADI3PicyQQAAADQ5QSYwPigsMR8oNCouNB4mMQEBASAlKhwjKwEBAQAAAAEBAiElKxwiKgABASYuGScwGicvGiQqGGqARpGwYJGvX5GvYI2kXmFrQoqmW5q7Zpm6ZZq6ZZm5ZZeyZH6LVoqnW5q6ZpW0YlRlNz5LKUBNKpezZX6MVnmTUJKxYIikWoilWoaiWGl/RV9zP2B0P4aeWW97TC00HmFwQWl5RzM7IjQ7IzQ8IzY+JDM5IisrHUpRMldfO1hgPFNbOVJaOFJZOFRcOVNbOFFVN0RBLyQvGE1lMktjMR4nFDtNJk5mMz9TKRoiEUlgMCs3HElaMCEoFqjdbababGyPRpG/XqnebZfHYmiJQ6PXaqjebX2kUaXZa57EaKbaa6Xaa6TXa5zAZ5u+ZqTWa5m8ZaLVaaTWapi6ZKDTaKTVapa3Y57QZ5S1YpzOZaPUapKyYJrLZKPTapCvX42rXZXDYKPWaqPSaoqoW5K/XqbbbI+8XIekWYy4W6nebqfcbYu2WjdIJJrKZKHTaKXTbIKdVkddLnyjUH2kUH6mUmiIQ3eWTkJPKxoeHBUbHGVvfktfe2NtfExhfoubsXGNs4ycs3CLsf///xdN9pkAAABmdFJOUwAAAABG3d0Js7MTzc3Nzc3Nzc3OzgWOSvv7FFr5+aDA/PyfEEnz8zHv7yzr6ysm5+ch4uIgG93dF9fX0tEPy8sLw8MKg/3r6uqDdejqqHot6ud0HuDjJOPg2Nvb12nt72wBbO/taEwm1kIAAAABYktHRAH/Ai3eAAAAB3RJTUUH5wQFDQcVL482FwAAAfRJREFUKM9jYGBhTUvPQAPpmWwsDAzsHFnZOeggNy+fk52Bi7ugsAgEikvAoBjMLi3j4WLg4i0vLKmoqCisrKquqamuqiwEcWrr+IBS/PXZDY2NjU3NLa1tba0tzU0gTnuHAFBKsLOru6e3t7evHwz6ekHsCROFgFLCkyZPmTpt+rQZ06fPnDl9+gwgc+q0WbNFuBhExebMnTd/wcJFi5csXLp04ZLFixYumD9v2XIxUQYGcYkVK1etXrN23foNGzduWL9u7ZrVqzZtlhRnYJCSltmyaeumTWAMpbZu2y4rLcUgJ6+wCQNs26Eor8SgrKK6HkNq5y41FWUGBnWN3RhSe/ZqqjMwMGhp78OQ2n9ARxcopad/EFPqkIEeUMrQ6PBWdKkjR41NgFKmZse2oEsdP2FuCpSysFy7EsSFyoOp4yetLIBSXNanQFKnD0OkDp8GEmfO2nABpWztzgGlzl+Yuw9o5dZ9cy+c37T1zEV7W6CUg+Oly1euXL567fqNfftuXL929fKVFTdvOTkDpRhdbt+5e/fefVc3dw8PdzfX+/fu3n3w0JMJKMWg7OX96LGPr5+/LhD4+/kGPHocGKTMAAbBIU+ehoYxQzjMYeHPnkcEQzgMppEvXkbBOAzB0a9ex5jCeLFx8QmJME5iUnJKKogBAD25QejRGdLsAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDIzLTA0LTA1VDEzOjA2OjQ1KzAwOjAwXXzH5AAAACV0RVh0ZGF0ZTptb2RpZnkAMjAyMy0wNC0wNVQxMjo1Mzo0NiswMDowMFch20YAAAAodEVYdGRhdGU6dGltZXN0YW1wADIwMjMtMDQtMDVUMTM6MDc6MjErMDA6MDCm1hgtAAAAAElFTkSuQmCC';\n static editIconBase64 = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAC1klEQVRIia2VS2gTURSG/5tMJ02chLxDUtpGBKuRgIuooJv6IhTpQlRcVKqLlqzcuRQLXQmCIPUFsTVdKYKuChat1EUXwWAVFSXUB5K21trmUSfPyWTkxrYkzZikqT/M4t5zz/nOmTl3DsGqRkZGziYSiYF0Ot2ezWY1aEAqlSqlVqu/cxx3s7+//zaNUAQEAoGxpaWlEx6PBwaDARzHNRIfPM8jFoshHA7TZdjn8+0ifr+/VxCEUa/X21DQNWVFApVSWl9PTU1BEIQbDM/zgzTzUj36rMXV1yaomYJsMFEixdIDx36gQ58r7pUGp3K5XJicnDzPJBKJFrPZXGYceGXGpb1RHG9NQQ7x5pcKl4MWnHtux+jRBbiM2YozRqMRyWRSz0iSxLAsW2bMiQQ79Tm0aQXZCuZ4BqZmET0dKzgz7sDT7tl/nlXI7tahVJ7AtyeOC7sTODXuQDjOyjo1BKDZFiSC3gk7vq00IZpRoueZXfYs0wiglcvjgXceL+c0YIiEA7YMBkOm/wegot2z1kG8oMD1t4bGAO+WVQguqKEkUoXN2FxAt5Ov6l8TMMszCC02g1FUAhyaPLraq/vXBOy3ZWBTi1CQShu9iPSC5QsyxnoBE5FtuP9JB1ZZaWvjBFw7tFjVvyaAvmOPNQ25HNWMBA0jgRe2UMHjrxzuftCDLfsGBAUJ2K4TcKdzoap/TcDpHb/R6UiDlCTZpJCKD+2sLVfw5IsW/o/lFRy0p3Fl37Js624a0NWehNuULesivapQV/AigBBSEEVRoVSWt0le+huR/jXpU03S6oyQBXActxyNRi0Wi2V983BLCrfe6/FiVgOpjkTTeQXMG5Kg45POaEar1T6cmZm5WAq4d6R6Z9Sj6elp6HS6ULGuoaGhmM1m07vdbmwcPptVLpdDMBhEPB7POJ1O+/qLGx4eHotEIl464bYCIITkrVZriGXZk319fT//AGJrAtxT4sAGAAAAAElFTkSuQmCC';\n static splitIconBase64 = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAA79JREFUSEulVv1PU2cULtOsopjshxl/MdFk+00TM5P5k38BkqjZFKYEP3Hg2HQzaoyxvUAg0CDdoNTUlpZKGK6AFSmi6GahqDVVoIlZXSN+RuMHSMpsazH6+J63vZd7WyAlNjn9uu/7PPd5znnPuRmqxMtqteaGQiFtNBpdHovFFor/z+VTrVZHMjMzH2VlZRkKCwuN0t6mpiZXTU0N3G43/H4/RkZGUqLl2lNk2yamvSaup72EYTKZKO5yArPZXGA0Gmfc6L3zENmNr/GN4TlUAmYlkN+Y3W6HxWL5XaXX6x96PJ5pNx48N4oVJ8LQdN+EcME7JwKfzwedTjeuEgThXSAQUBCQHStORJDbEoTr1nm4/R0Jgg9YUvUWa40RHOt6hX7/o1kVabVaqOhNlCa34/RALwcWgyvQAuU9dznB4ooY+z2JeaWTM5IqCOR2yIHlBPNLo7g67ET/0FR0+wZQ5BibIhU+IEOI8ZuWCFb98QabrfckO2YiyCyflBQd0RxQKFQoTRSDRPBVbQS/nB1K2SAHEZP8p+skaoylyMnJwZHjB5iiKRunchWvNolgPavvJRUhBcFfPaewfVc+zK21KNMdRfHPezjonqId0FQc5t873Xb8M+RIzVWyAkruPOEtLH1X+OLahgpsK/gBGzdtwP5Dxaiu0+I38xlepqIVW/Pz2N23s98UScWQTEByvm14g9V1z6XFBEx3r/Q2MKuNM1pEBN23HuMzpsLli9f9zsICXPS2ygi6mAJ3CgFZlZYCIllWHUG29UFiQzuuyuTHk3yDXyPvDbYqUBEQAVl6uqNBdiCTkiwetOpLL6Aui+DSoBOaysPoudHKSQiwpNaE1dv1IO8pCJxI5qSAiNTlURS3DfPNW/I247vvN0mAuw2nOJloCSV5a35u+hYRQX7LGBYJ//MKKfl1Lyxn9ArpIvjfg/HypHNAQT2LmmK2PcjaSFh5DuRttnfwMV/wU/swujx2Xvfy6pAnVNc7gG1N/+FrfQhZzFpq62UXXqIv0QRTmp1ItLI+hC+rwjwXyS1gb9sdrDn5jJ+JdaYJHDo3hi7fk2m7Kidg7fp9MBhULKBkL6saxT6mQmwFVEUZrIx/bBuDtf9ZWoOHE7BR+dLr9So2/Bu8j4WaMBaUR9B9+yxXoe30zGng0PisrKwMq9jsrGtublYQ+ANemPsuc0B5fF4Wb8PphM1mg8FgcPO5XF9fP+5wOJA82dIBSl5DGATORnHU6XR+IT1ZNDY2umh8km+fEoTBHiKus4G/lMA/AjvmjLaem6aqAAAAAElFTkSuQmCC';\n static measureDistanceIconBase64 = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAyRJREFUSEulll9IU1Ecx69t/gkMiuoloSAIsr9gRM4yeujJ6q1egoIehDJqD2EQPexOt0nOoA2XEbFJlEqmKVbmXybDNGbTpTQbbNawUNycM50Np9/OOXrXrppzOjj3jnPP+X5+v+859/xuArf4UygUmcnJyZq5ubnD4XB4h9Afz10qlXolEkl/KBQqViqVHyJzNRrNvaKiIr/ZbIbdbofL5Vpz07WOIPVgGCknQ7BY+0E1DAaDn2hWMgCJ/Ixer/fHK5quC2IT70YS70La2Ukkyny4WumPBGY0GicKCwtzOULqslgsMSOmkUaLnnoyDH2bGWZ7DWs5xiHsLpmJ6FitVqjVajfNIOhwOFYExBIVxOm9qus9OIVbpEO0SR+5CPZknQ7ikGxm1UijRZf+T1W5cb9hLKInApSWjkCSNYMEmR/7c72i9FcTjX5GbaM2CgEvy6Cx3YMjN0Yjvq5VWBhH14Qu/IqAKxUT4HhgV/FvGNrb1w2RKl141vGLQUQZyGt9OFE2BfmLXhzQedFke7MuyFHdZxw3TC0HCGk5nAO4XOFA7ivy0ixuwXju+XU92Fyw8D6IMnjdPYyXnT/x1enGl8E+sqcDqPzYuC4I3a7vejxiAH0L6Rq09n5jdF3bJ2RoPXjbWR03ZM9DNy6YAmLAxecBtgbdA98ZwGYbxLb0euzNiA/Al3QjPceLRHI2Ldum0edRL8kkO7sO3L4Wltmam2IenIyMl82LAdR/ug7xHHrCWG3zCK5VjbO5d9RecJeAYzenxYBzpkmkaf8dVrFALTYPE+yw/2DZbVFPsw1C+wSbRRZRwPnyQMwMqEhSwTgTFYQeNI0y0NKgVl2D6MF368eQ+XiKbWPaf7tmnFkiAP6XLQPwPD/rdDrZ5ObFtPscQ5DXevGI1AA6+Xq1j1lAI41lXfRzBiAFx6HROLEz0wUurQH0VM2v8zELBMtiRboSlJZeUtHGOHK5lZfXEeS2l4HjyhmACtJohUWLJ2phrMlkmlWpVE9ZXaZlUy7v/KPWLpyCG2m0OlJxoukkFqVEvixI/eRp+aS+bbAFaeREYysV/wuqNrioSoYgAwAAAABJRU5ErkJggg==';\n static measureAreaIconBase64 = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAnhJREFUSEutlt9r2lAUx92TOHzY2x73Z+1hY4WtMmk7hxta2mGv4g8yjSgmuFp/BllHlSmUOlaGkKmzrtkGloLFImyveyk+bCJjnN17WHywSadmgZPAhfP95HvOzT25Zvp75XK528PhkIxGo1vj8fi6uj7P02w2/7RYLN+sVqtos9mSk9xCoXDA8zzIsgzdbhcGg8FCwXKZRiqVYnGGgHQ6fS+ZTKJgPBNZSFjrhSRJgkwmEzfFYrGvzWYThZfJXXD4H8Hxp4+GQYqiQDgcvjB5vd5fvV4PBR+TFRDKPLiCTlC+HBuGEELAxG6qRQZ4XifAvfT/F8glwAPXEiw574AjaKcQn2GIpoO4zMFG2QHu8hoEpS1DEE0HzMUaeQibZSd499cNQTQdbB/FUHir4gJP5QnGok50HbAerJBlIBU3+GvPMAKSZ+5yaTrIKy8g+i6AW3aVQiKHPuAOCUTrgbkhurtog3+KgEbrPUKC+x6Iy8G5IZoOdk9ykGxEEcC+j0ZbxnLF6xwIdIeJrcjMTv7pQP0A250PCInUvAhIHyXAP0NPNB2UTotQO69MHKgQ1Yko8wjYoaE2Xu/01XWwGXNfAjAR5oT1ZKeVoBAR2Ia4CqLpoHq2B2/Pq+AgdoRohdO3CpKyjVH8nJ6Ua9qJrgMX58DEV7Ths4Wk2XgE0OP6d7/fnxzXb+jbvz7dhb0Taa5gOazxbnrUq04QQEfl906ng4tXlUWvXNPrdnIf+CyHozcUCv0w0dmZKBaLhofLdP3z+TyIoijjXBYE4aJUKoE62RYd+iyPaTBxOopH1Wr1xuTPIpvNHrDxyepmJJgG/Ylo04F/k4n/AeQ5tgsVAwfBAAAAAElFTkSuQmCC';\n static removePointsIconBase64 = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAzJJREFUSEulVltIk2EYXldiLAiNuqyLqLsg6K4iEbpQyJodrIs8oLNERDKiYtBWHtKxmrg1W+7gXIJZpsyZOArnoZxMjIE0GWlKJ1JzbjaHRDzt/egfbf9smw2+vdv//9/zvKfvef8tgj8fg8GQ5/P5pMFgcPf6+vpW7noyNiUlZS01NXVeKBSqxWKxJry3tbXVqlAoYLfb4XK5MDMzs6lFewlDq9XSmmYELS0t+RqNZlOAQ655VHQtIfPRCt55ZiMwTCYTdDpdo0CpVM6NjIwkTOCYmsOdFwvY1xhAutyPAqMbWfopSKyLERhOpxNyudwrkMlkP91u9z8JyLuGgW/I1PmQXu/DcdM0dMMvYXd1sUW/iTA6tVKpFAL62ijnzYNfIWrzQli7jCzjLGr6x8KgHDhnD6q/oP315wismAS9zo843+5F2t1VHFV/wg3LBGyTPRsCcwREThH+7SyPYL8ygL1KH6p6JvF8vC8MqjbUI+/C2dA6x2xDk5RHSE7skK+CasSR8AgEMvA2XrlejpOnclCjkODpgI5ZIiouLeQ9SwWnrkqY4H5zNQOLzjf9Lyy+iJvSqoh7FPVOeSDcsnEjIHAuHeaeByirKAFZItA+ViA7O4tHTnWj5qAo4hJkZBzDM5uOgRSV5CMn5wSzXEQikYhH0PhqGIc0/sQIKPdUYAIkzwmci6Dd0ozc07kx00eNQt0YN4JrksqYxSRCKr74clHs+hhdKOj4Hp+AgKgOl8qLYRkyMTCyXGcNjHfwCDrG+pl8HH64khgBgVZeLQPlm1vkOUdI960TFnYg6TRTF5U+WQIJYdwUxWrPv6/JbaNMQtKqV5mkxJWKWActmqRt1IYz5vdM9I5o/UwEo6U64YPGgdMBIvmg7thzbw2S3sUISdhILFmKQnL9y+PxsL6NjuBW3zgTPBI+EkBqvWSmHSMIjcoFh8MRJtAMDjK9F95eRLZ+OXwqkwGmZ2l81tXVBQSh2dlkNpsZwbZaPw6ofrCJ9db9ISlvox0wGo1Qq9V2NpdVKpW3s7MT8SZbIlEQBoGHRnGwu7t7e/jNQq/XW2l8Ut7+ZxFG6CXiTWjg7yLw3x28rmpAjitLAAAAAElFTkSuQmCC';\n static wktIconBase64 = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAA4xJREFUSEulVltIk2EYXnRhxoTSooNRRsebAsO6sLpZdJEXQpEYBXlRdmd2unBZTSOtxmLRxnK5OXVGJZgrtUgCl3YwjGIiLSQr6URZrVkmEvH0P599P/8/M8sG7/7v//Z9z/Oe300w/PpUVFRkR6NRy+Dg4LyhoaHJcv9fnnFxcd/i4+N7jUajMzc316XeraysbLTZbAgGgwiFQujp6RmX8C4x3G435YkgKC8v3+5yucYFeCvUi7y6DzCd+4zH3c90GFVVVfB4PKcNdrv9RVtb218TtHe9wNFr77H49ACSrP3I8YWxwduFwsY+HUZHRwesVmvEUFRU9D0cDv+RgNqdvPEOJk8USSeiWF/1BJ7WmwiG6oRwTcJY11osFhj4NZrPz7a8xcbqCIwln7DB9wzHrt9TQSW4fKY63+D8ndc6rN8SNHS8xJbzESQe/4K1zlcouPoAzQ8DowJLApLTQq2yKkEgEEBnZyeW2Aew0B7FNlsNPE1+FdR9wSrW/isOIRKUa/mbs8aGKbtbUXmpAcSjmM3mYRelpaUhKysLhiLgYMluKMmFZalLBZDdU4zkubNQd9Mj9uQ+wbkv37lOmDFP3E1JSRFiMpmGCQhOEhJk52SKixQS7Mzbqq61BFzzzLV7NapFl+83YeK0Bcjfu1+4SnWRkkmCkQS8mLFxnar1GtMqVUtJIH+X7tEGfNL0+cjcUaAnoL9ommHXAwEs3cInQWkFQaTWPBurvSSZljwHyZlH9AQ0R1iQfkDnDukuEkkCgtMqEtCS2HTlfmLGYTAbdWkqYpC4aITvZYC1FnCtdaOWhOdXbMpDzsWPegKRRYp2UitqLV0hAbRBZlb9zoqZc2YjddMerC77rCdgoAmYb94pzJYAMg2lBdp3KsM7pWUloiBZzcyilVsKwUY4opIZZK25zBISaQtLW2jW5ttIt1zB1EPDLYWtQhatLk1leTNNY4MW+159uxmb/U9F01vj7hdNMLZVS7yRFoxCwALaF3go2kjKqW8obOgD2/ZYg0kQKL7/0d3dLQ7HWnCk6b5oeGx8bIBMvbFARzQ7ZVS+b29vVwlcLS2i3xuL+5Dh/QS27H8BlWc5PktLSwcMyuw84/f7BUhCST+WO76KifUo/HxcwJLA5/PB6XQGxVx2OByR2tpajDXZ/sYSYhBcGcWD9fX1U9R/Fl6vt5Hjk4H5HyGG8ifirjLwZxD8JzKAKKzuzS8LAAAAAElFTkSuQmCC';\n static pointIconBase64 = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAA0JJREFUSEullmtIU2EYxxdRSSgFi4SCbkTYl8oP4YduQvlhRpaXlILMpStF0jLCwua28rqOm7iba8dtppWiNlnacCleUpcxraikRKgMrPUh6UNliTz5vHQObmd2Nhu8e7edc/6/97m8/3dLBH9fZrM55dvXj7Lp3zMbp38tXcn8HswcsmL2R8jyZR9CV63TSiQSPfus1WJoo6gcePxgD4z2RsDE0/WLGvgsatzS5YDRSL0hAJPJlKqfE1+M6EBPFOTWq+CQrgvGXFu8NOq0GUDT+kqBWql4P9geFTDA3bcLipvyYVvFOKwp90Ca5RWI6GGQNiq8NJ517gClUjolkMulM+MDm/8JwNVRLRfgoKEbhKUeiLE+B7qvE3petJCBnxHomwWZTAYCfFsoPSb7GUikbRBa/BlE5tdQ5HCxoow4M0dqxqDRkeSl5RfgeBQDJ833QFjigf2at3DF7gbnSOuCwgwA4Rjh/MVyABEVY7BVNQl5rSNwf6idFdWayyDlxPG5kUzm8ioZB4iLwJpgjRgIByCQA+fBi/nZcPRYHBRRBdDUQZMZQeln0zj3YsGxqwIGqAw3iJhvvvF7WvopuCrL87qGUa8t+8S2LG8EKM6ko65VB1nnMwBnBBjrKYiNFXHgWDdsDoyCFxAdfQCanTQREWekQlzcETIzEcXHx3MAlV19sLtqODAA5h4LjIK4chRnIrhjN0BCYoLf9GGjYDfyRnC5INdvMRGIxZdkiv0CxJYREFut/AAUwjqcy04He28tEcOZ6ayOoQYOoMHlIPaxV+sODICiuZeyAPPNDFw5A8TrbW472ZC4m8PLJyGz1gBohLwp8tee839TOvuJhQive4il8FqFv43mC7nd74SkulFievu0LmKCvlYd8EZjxHEDoX1gd2y6OQGFjYVelrCQWZIUyeWnZ9892UD61jeCwvYhYnhofGiA2HrBHEwEQJVJv7idkSxA391N/D5MMQmHqx+yuzIYYbwXj8/SkmvfBUajpuquPpUAwoo8sLNylJxYLwe2B7Va3wVYLCLQapQ95FzWqEunmquTge9kCyQK1EBxtUrx02azrWb/WdTU6Nrw+MS8/c9ADb2OGqRpOhzF/wDMPgEKuYUfcgAAAABJRU5ErkJggg==';\n static polygonIconBase64 = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAyRJREFUSEulll9IU1Ecx69t/gkMiuoloSAIsr9gRM4yeujJ6q1egoIehDJqD2EQPexOt0nOoA2XEbFJlEqmKVbmXybDNGbTpTQbbNawUNycM50Np9/OOXrXrppzOjj3jnPP+X5+v+859/xuArf4UygUmcnJyZq5ubnD4XB4h9Afz10qlXolEkl/KBQqViqVHyJzNRrNvaKiIr/ZbIbdbofL5Vpz07WOIPVgGCknQ7BY+0E1DAaDn2hWMgCJ/Ixer/fHK5quC2IT70YS70La2Ukkyny4WumPBGY0GicKCwtzOULqslgsMSOmkUaLnnoyDH2bGWZ7DWs5xiHsLpmJ6FitVqjVajfNIOhwOFYExBIVxOm9qus9OIVbpEO0SR+5CPZknQ7ikGxm1UijRZf+T1W5cb9hLKInApSWjkCSNYMEmR/7c72i9FcTjX5GbaM2CgEvy6Cx3YMjN0Yjvq5VWBhH14Qu/IqAKxUT4HhgV/FvGNrb1w2RKl141vGLQUQZyGt9OFE2BfmLXhzQedFke7MuyFHdZxw3TC0HCGk5nAO4XOFA7ivy0ixuwXju+XU92Fyw8D6IMnjdPYyXnT/x1enGl8E+sqcDqPzYuC4I3a7vejxiAH0L6Rq09n5jdF3bJ2RoPXjbWR03ZM9DNy6YAmLAxecBtgbdA98ZwGYbxLb0euzNiA/Al3QjPceLRHI2Ldum0edRL8kkO7sO3L4Wltmam2IenIyMl82LAdR/ug7xHHrCWG3zCK5VjbO5d9RecJeAYzenxYBzpkmkaf8dVrFALTYPE+yw/2DZbVFPsw1C+wSbRRZRwPnyQMwMqEhSwTgTFYQeNI0y0NKgVl2D6MF368eQ+XiKbWPaf7tmnFkiAP6XLQPwPD/rdDrZ5ObFtPscQ5DXevGI1AA6+Xq1j1lAI41lXfRzBiAFx6HROLEz0wUurQH0VM2v8zELBMtiRboSlJZeUtHGOHK5lZfXEeS2l4HjyhmACtJohUWLJ2phrMlkmlWpVE9ZXaZlUy7v/KPWLpyCG2m0OlJxoukkFqVEvixI/eRp+aS+bbAFaeREYysV/wuqNrioSoYgAwAAAABJRU5ErkJggg==';\n static lineStringIconBase64 = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAA1BJREFUSEutVmtIk2EYXb/EWBDZ7UdQP6L+WZkQEfVDCNR/gWAQqCAKQhJJUSK0KV7nZdbWdLk5pyjeFbcpzsuWSzfRTQfS5ty8X0rNOW0OiTh970cbbqYu5+Dd923wnfOe5znveb5TjL+fysrKWIfDwXK5XFd3d3dPu///n2tQUNBOcHDwHJPJ5CclJQk8z1ZVVcmLioqgVqthNBphs9mOtcizBEMoFJJlpgkqKiriBALBsQA/G+eQ2rKOiE+b+GqZ9sKQSqUQiUSlDC6XO6vRaPwm0E3MIqtzFTdKnQjhbCFeYkKUeAIZ8jUvjJGREXA4HDuDzWb/MplMhxKQ3RV0f0eEyIGQfAceS80QDfRCbWyhF7knhL6lZbFYYJCvg2peplrBk2o7mDkbiJJMI7tL6wF1g7uvd/jLqB1c8sL6J4FsZAFPa+04l7eNh/xFvO0YhdLQfiCwm4CQE4V7N7uP4CbXietcB9LaDWgdVhwJulcF2cR5zjZIj9wk+wgYbPgN2mtsRbWuD2WaAYgGVegZa6MbTlx1IgQyvQzPOhcQLt3E/fJvKJB8RPOQDBc5To9lA1KgMMiQLLPg3vtFhL/WIvHVS/SMNtB9I+YgKgIiICUpUXYjJrsS0WkFyOZloc/QhNK+AYQLtgIn8LXp3t/EKMSNASmQUyWKU8zRPXgknkdJnRD9Y020SRIkRsTX/wiMoMMgR2znMm619CMscwXJ6eno1TegXttFu+lB+ebJEVxhLyIyhY3bpbO0i5Ib1kGCMKASEQWR7esIbVbhMmsJ9xOLIVXPHH6S/Tlo1V+UiKmx4kLhFsLqdhHaogJRkJqeB9/Q9FsBiQ0SH8Qd14p3kCFbQ/f4PBKU21QPjiCg4vq3xWKhpfkqeKcYpg8OCT4SgMR67hjQT874R0CNylWdTuchEKhUdN4zM9cQLd7wnErfSDeYZ5CitONu7QZVIiqD3uR4lYiMz9zcXCeDmp0fampqaIIzOVsI5f2kJ9aYybthvgSTUzbIhifxnNOM2BeFyMkvgtls9iiUSCTg8/lqei7zeDx7Y2PjviYdNfynpqwwGMah1eqg1+thtVppDAJOjWJXW1vbWc+bhVgslpPxSTofyCIY1EvEEDXwLxHwP1I4uvOad9ZNAAAAAElFTkSuQmCC';\n static printBase64 = 'data:image/png;base64,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';\n static drawBase64 = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEwAACxMBAJqcGAAAAilJREFUSImt1UlsTXEUx/FPJyFNTEHQEE2R1FzRRpSILSsrFlaEjSWJhQUrC7GzEjVUY1gQImJadEHEEBIRFWNoqVjowlAxhFqc/0uf29e+tvpLXu5993/u93/O/wyXoWs0ZqT7eSgfBqNfTcUD/MBZ/MHmkYLPwWtcwRP0oBt1OIPa/4EvxAc0Y3aC38Fb/BIRLcKU4cDr0YUjKEUJ1os8vEibPcMB/EbNUOAr8CnBSzJrDSKqDenag1MpkobBwFfhM5oKwPO1JcG70IZvuFwMvhpfcbQInPB2tzi2HlFZa7BXlHRBeDdOiDPP13zsQWOB956jXeTje/rNyhqtTJ6fzsDX4n6eh9MLbLBMlOzzZHcwa1AvEnrev925Du+xXJzt7QLwnLbhC1pTBFW5hXn4iGsYlYmoHQtSROewfYANYGJyojXHmpAg91CZZ1iHV1iS4M24mnEgq3JcEONkbO5hjTjXTXmGC/A0bVKGk2L2DAQvTXZtmJRdPIw3KZrFeCwapkzMmZZ0359KREm/VLgAVOIhbiUPapNHLTiub7lm4U1iEM4cwM5OMVuq86I6VgRemuAdee8V1EaR5Nw03K9vL2RVJqLrVGTAzcYjjE//d4mkH9L/mKgQuekU34kBVYW7IsE7RP0uxTsxLrKfxDG4lOBzi8FzahQVcFFvL1SLnFwXzQPjcGOwng9Gk3FTJHGrqLCOkYLnVIF9+CminDWS8HxN01sIg9Zflop8Ez+7Xi0AAAAASUVORK5CYII=';\n}","import { inject, Injectable } from '@angular/core';\nimport Feature from 'ol/Feature';\nimport VectorSource from 'ol/source/Vector';\nimport { Subject } from 'rxjs';\nimport { CurrentItemsService } from './currentItems.service';\nimport VectorLayer from 'ol/layer/Vector';\nimport { Fill, Stroke, Style, Text } from 'ol/style';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class PrintDrawLayerSourceService {\n\n private _current = inject(CurrentItemsService);\n\n // private _features = new Subject<Feature[]>;\n // features$ = this._features.asObservable();\n source: VectorSource = new VectorSource();\n layer = new VectorLayer({\n source: this.source,\n style: new Style({\n stroke: new Stroke({\n color: 'blue',\n width: 2\n }),\n text: new Text({\n text: 'MySpecialText',\n font: '12px Calibri,sans-serif',\n fill: new Fill({ color: '#000' }),\n stroke: new Stroke({ color: '#fff', width: 3 }),\n placement: 'line'\n })\n })\n\n });\n // private _disabled = false;\n\n constructor() {\n this.layer.set('PRINTDRAWLAYER', 'true'); \n this._initListener();\n }\n\n private _initListener(): void {\n this._current.map$.subscribe({\n next: map => {\n console.log(\"🚀 ~ PrintDrawLayerSourceService ~ _initListener ~ map:\", map)\n \n map.addLayer(this.layer);\n }\n });\n // this.source.on(['addfeature', 'changefeature', 'removefeature'], evt => {\n // if (this._disabled) { return; }\n // const features = this.source.getFeatures();\n // this._features.next(features);\n // });\n \n }\n\n // get allFeatures(): Feature[] {\n // return this.source.getFeatures().map(f => { \n // // I want a static copy of the features. \n // const newFeature = f.clone(); \n // // But cloning doesn't include the id and that is used for referencing a few places.\n // newFeature.setId(f.getId());\n // return newFeature;\n // }); \n // }\n\n // remove(id: string | number): void {\n // const feature = this.source.getFeatureById(id);\n // if (feature) {\n // this.source.removeFeature(feature);\n // }\n // }\n\n // setFeatures(features: Feature[]) {\n // this._disabled = true;\n // this.source.clear();\n // this.source.addFeatures(features.map(f => {\n // const newFeature = f.clone();\n // newFeature.setId(f.getId())\n // return newFeature;\n // }));\n // this._features.next(features);\n // this._disabled = false;\n // }\n}","import { Component, inject, Input, OnInit, Renderer2 } from '@angular/core';\nimport { MatIconModule } from '@angular/material/icon';\nimport { LineString, Point, Polygon } from 'ol/geom';\nimport { getLength, getArea } from 'ol/sphere'\nimport Draw, { DrawEvent } from 'ol/interaction/Draw'\nimport VectorLayer from 'ol/layer/Vector';\nimport { Modify, Select, Snap } from 'ol/interaction'\nimport Map from 'ol/Map';\nimport VectorSource from 'ol/source/Vector';\nimport { Fill, Stroke, Style, Text } from 'ol/style';\nimport { geometryType, GeometryTypeSetting, GisKomponentSettings } from '../../models/GisKomponentSettings';\nimport { MatSelectChange, MatSelectModule } from '@angular/material/select';\nimport { MatOptionModule } from '@angular/material/core';\nimport { FormsModule } from '@angular/forms';\nimport { CommonModule } from '@angular/common';\nimport { KomponentSettingsHelperService } from '../../services/komponentSettingsHelper.service';\nimport WKT from 'ol/format/WKT';\nimport { IProfileDetailed } from '../../models/IProfile';\nimport { MatSnackBar } from '@angular/material/snack-bar';\nimport { buffer } from 'ol/extent';\nimport Feature from 'ol/Feature';\nimport { DrawLayerSourceService } from '../../services/drawLayerSource.service';\nimport { FeatureHelperService } from '../../services/featureHelper.service';\nimport { UndoRedoService } from '../../services/UndoRedo.service';\nimport { always, never } from 'ol/events/condition';\nimport { difference, featureCollection, buffer as turfBuffer, union } from '@turf/turf';\nimport GeoJSON from 'ol/format/GeoJSON';\nimport { DragDropModule } from '@angular/cdk/drag-drop';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { GeometrySplitService } from '../../services/geometri-split.service';\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle';\nimport { highlightService } from '../../services/highlight.service';\nimport { InteractionHelperService } from '../../services/interactionHelper.service';\nimport { CurrentItemsService } from '../../services/currentItems.service';\nimport { MergeFeaturesService } from '../../services/mergeFeatures.service';\nimport { IconsConstants } from '../../models/icons.constants';\nimport html2canvas from 'html2canvas-pro';\nimport { PrintDrawLayerSourceService } from '../../services/printDrawLayerSource.service';\n\n@Component({\n selector: 'map-toolbox',\n styleUrl: './toolbox.component.scss',\n templateUrl: './toolbox.component.html',\n imports: [FormsModule, CommonModule, MatIconModule, MatOptionModule, MatSelectModule, DragDropModule, MatTooltipModule, MatSlideToggleModule] \n})\nexport class ToolboxComponent implements OnInit {\n\n // Inputs\n @Input({ required: true }) map!: Map;\n @Input() showMeasureDistance = true;\n @Input() showMeasureArea = true;\n @Input() collapsed = false;\n @Input({ required: true}) settings!: GisKomponentSettings;\n @Input({ required: true }) profile!: IProfileDetailed;\n @Input() WKTInputEnabled?: boolean = false;\n @Input() deleteEnabled?: boolean = false;\n // Injects\n private _snackbar = inject(MatSnackBar);\n private _settingsHelper = inject(KomponentSettingsHelperService);\n private _drawLayerService = inject(DrawLayerSourceService);\n private _printDrawLayerService = inject(PrintDrawLayerSourceService);\n private _featureHelper = inject(FeatureHelperService);\n private _undoRedo = inject(UndoRedoService);\n private _geomSplitService = inject(GeometrySplitService);\n private _highlight = inject(highlightService);\n private _interactionHelper = inject(InteractionHelperService);\n private _mergeService = inject(MergeFeaturesService);\n private _POSITION_STORAGE_KEY = 'toolbox_position';\n private _current = inject(CurrentItemsService);\n private _originalMapWidth: number = 0;\n private _originalMapHeight: number = 0;\n\n mapWidth: number = 0;\n mapHeight: number = 0;\n format: string = \"image/png\";\n dimId: string = \"99\";\n dims = [\n [1920, 1080],\n [1680, 1050],\n [1280, 800],\n [800, 600]\n ]\n printDrawLabel: string = \"\";\n printDrawTool: 'arrow' | 'point' | 'line' | 'polygon' | 'cirkel' | 'square' | 'rectangle' = \"point\";\n selectedGeometrySetting: GeometryTypeSetting | undefined = undefined;\n undoIconBase64 = IconsConstants.undoIconBase64;\n redoIconBase64 = IconsConstants.redoIconBase64;\n trimIconBase64 = IconsConstants.trimIconBase64;\n deleteIconBase64 = IconsConstants.deleteIconBase64;\n editIconBase64 = IconsConstants.editIconBase64;\n splitIconBase64 = IconsConstants.splitIconBase64;\n measureDistanceIconBase64 = IconsConstants.measureDistanceIconBase64;\n measureAreaIconBase64 = IconsConstants.measureAreaIconBase64;\n removePointsIconBase64 = IconsConstants.removePointsIconBase64;\n wktIconBase64 = IconsConstants.wktIconBase64;\n pointIconBase64 = IconsConstants.pointIconBase64;\n polygonIconBase64 = IconsConstants.polygonIconBase64;\n lineStringIconBase64 = IconsConstants.lineStringIconBase64;\n printBase64 = IconsConstants.printBase64;\n drawBase64 = IconsConstants.drawBase64;\n dragPosition = { x: 0, y: 0 };\n snap: boolean = false;\n showInputWKT: boolean = false;\n WKTString?: string; \n activeMode: 'draw-polygon' | 'draw-linestring' | \n 'draw-point' | 'edit' | 'edit-remove' | \n 'delete' | 'change-type' | 'clip-hole' | \n 'split' | 'measure-area' | 'measure-distance' | 'merge-features' \n | null = null;\n activateShowInputWKT(): void {\n this._clearAllInteractions(); \n this.showInputWKT = true;\n }\n\n cancelWKT(): void {\n this._clearAllInteractions();\n this.showInputWKT = false;\n }\n\n settingsChanged(evt: MatSelectChange): void {\n this._clearAllInteractions();\n }\n\n undo(): void {\n this._undoRedo.undo();\n }\n\n redo(): void {\n this._undoRedo.redo();\n } \n\n onSnapChange(): void {\n if (this.snap) {\n this._addSnap(); \n } else {\n this._removeSnap();\n }\n }\n \n ReadWKT(): void {\n this._clearAllInteractions();\n if (!this.WKTString) { return; }\n const wktFormat = new WKT();\n try {\n\n const feature = wktFormat.readFeature(this.WKTString, { featureProjection: 'EPSG:25832', dataProjection: 'EPSG:25832' });\n const featureType = feature.getGeometry()?.getType();\n if (!this.selectedGeometrySetting?.availableGeometryTypes?.some(g => g === featureType)) {\n this._snackbar.open(`Den WKT du indlæser er af typen ${featureType} og det er ikke tilladt for denne indstilling`, '', { duration: 4000 });\n return;\n }\n this._settingsHelper.getStyle(this.selectedGeometrySetting!.style, this.profile.styleRepositoryWorkspace!, this.profile.styleRepositoryGeoserver!, featureType!).subscribe({\n next: featureStyle => {\n feature.setStyle(featureStyle);\n this._featureHelper.setTypeId(feature, this.selectedGeometrySetting?.typeId || '')\n this._highlight.highlight(feature);\n const extent = buffer(feature.getGeometry()!.getExtent(), 10);\n this.map.getView().fit(extent);\n }\n })\n } catch (ex) {\n this._snackbar.open(`WKT kunne ikke indlæses - den er muligvis ikke formatteret korrekt`, '', { duration: 4000 });\n }\n }\n\n private _drawPolygon = new Draw({\n type: 'Polygon',\n source: this._drawLayerService.source\n });\n \n private _actionSource = new VectorSource();\n clipHole(): void {\n this._clearAllInteractions();\n this.activeMode = 'clip-hole';\n const clipHoleDraw = new Draw({\n source: this._actionSource,\n type: 'Polygon' \n });\n this._interactionHelper.setAsTemp(clipHoleDraw);\n clipHoleDraw.on('drawend', evt => {\n \n const overlappingFeatures = this._drawLayerService.source.getFeatures().filter(f => f.getGeometry()?.intersectsExtent(evt.feature.getGeometry()!.getExtent()));\n const geoJsonFormat = new GeoJSON<Feature<Polygon>>();\n const holeGeoJson = geoJsonFormat.writeFeatureObject(evt.feature);\n overlappingFeatures.forEach(f => {\n const overlappingFeatureGeoJson = geoJsonFormat.writeFeatureObject(f);\n // because the difference function takes featurecollection, I add the two features to a collection\n // I have to cast this as any, because the featurecollection needs to be of Polygon or MultiPoly and it\n // doesnt resolve to that.\n const features = featureCollection([overlappingFeatureGeoJson, holeGeoJson]) as any;\n const clipped = difference(features);\n if (clipped) {\n const geom = geoJsonFormat.readGeometry(clipped.geometry);\n f.setGeometry(geom);\n }\n });\n });\n\n this.map.addInteraction(clipHoleDraw);\n\n // snap should be added last!\n this._addSnap();\n }\n \n private _addSnap(): void {\n if (this.snap) {\n const snap = new Snap({ source: this._drawLayerService.source, intersection: true });\n this._interactionHelper.setAsTemp(snap);\n snap.set('snap', true);\n this.map.addInteraction(snap);\n }\n }\n\n private _removeSnap(): void {\n this.map.getInteractions().forEach(i => {\n if (i.get('snap') === true) {\n this.map.removeInteraction(i);\n }\n })\n \n }\n\n split(): void {\n this._clearAllInteractions();\n this.activeMode = 'split';\n const splitInteraction = new Draw({\n type: 'LineString',\n source: this._actionSource\n });\n this._interactionHelper.setAsTemp(splitInteraction);\n splitInteraction.on('drawend', evt => {\n this._geomSplitService.splitPolygonsWithBufferedLine(evt.feature as Feature<LineString>, this._drawLayerService.source, 0.001);\n });\n this.map.addInteraction(splitInteraction);\n this._addSnap();\n }\n\n startDrawPoint(): void {\n this._startDraw('Point');\n }\n\n startDrawLineString() {\n this._startDraw('LineString');\n }\n\n startDrawPolygon(): void {\n this._startDraw('Polygon');\n }\n\n private _deleteSelect: Select | undefined;\n private get deleteSelect(): Select {\n if (this._deleteSelect) return this._deleteSelect; \n this._deleteSelect = new Select({ \n layers: [this._drawLayerService.layer ],\n style: null, // ABSOLUTELY leave this as null! If not, select fires a change, because it applies a change of styling. LEAVE IT!\n filter: feature => !this._featureHelper.isLocked(feature)\n });\n this._interactionHelper.setAsTemp(this.deleteSelect);\n this.deleteSelect.on('select', evt => {\n this._drawLayerService.source.removeFeatures(evt.selected)\n })\n return this._deleteSelect;\n }\n \n\n private _deleting: boolean = false;\n startDelete(): void {\n this._clearAllInteractions();\n this._deleting = true; \n this.activeMode = 'delete';\n this.map.addInteraction(this.deleteSelect);\n this._addSnap();\n }\n\n startEditRemovePoints(): void {\n this._clearAllInteractions();\n this.activeMode = 'edit-remove';\n const modifyRemove = new Modify({\n source: this._drawLayerService.source,\n // Make sure delete is allowed and other interactions are not.\n deleteCondition: always,\n insertVertexCondition: never,\n snapToPointer: this.snap\n });\n\n this._interactionHelper.setAsTemp(modifyRemove); \n this.map.addInteraction(modifyRemove);\n this._addSnap();\n }\n\n startEdit(): void {\n this._clearAllInteractions();\n this.activeMode = 'edit';\n const modify = new Modify({ \n source: this._drawLayerService.source,\n // No delete\n deleteCondition: () => false,\n // Allow moving existing and add new points\n condition: always, \n insertVertexCondition: always, \n });\n /* Modify fires changes to features a LOT, so to not flood the UndoRedo service, I disable until ending the modify\n and then force an update, to add the updated feature to the undo-service. */\n modify.on('modifystart', () => this._undoRedo.disable());\n modify.on('modifyend', (evt) => { this._undoRedo.enable(); evt.features.forEach(f => f.set('updated', new Date().toISOString() )) });\n \n this._interactionHelper.setAsTemp(modify); \n this.map.addInteraction(modify);\n }\n \n private _startDraw(geomType: geometryType): void {\n this._clearAllInteractions();\n if (!this.selectedGeometrySetting) { return; }\n // Set the active mode after clearing\n if (geomType === 'Polygon') this.activeMode = 'draw-polygon';\n else if (geomType === 'LineString') this.activeMode = 'draw-linestring';\n else if (geomType === 'Point') this.activeMode = 'draw-point';\n this._settingsHelper.getStyle(this.selectedGeometrySetting.style, this.profile.styleRepositoryWorkspace!, this.profile.styleRepositoryGeoserver!, geomType)\n .subscribe({\n next: style => { \n const drawInteraction = new Draw({\n type: geomType, \n source: this._drawLayerService.source,\n style: style \n });\n drawInteraction.on('drawend', evt => {\n this._featureHelper.setTypeId(evt.feature, this.selectedGeometrySetting?.typeId || '');\n this._featureHelper.setId(evt.feature);\n evt.feature.setStyle(style);\n });\n this._interactionHelper.setAsTemp(drawInteraction);\n // this._setDrawLayer()\n this.map.addInteraction(drawInteraction); \n this._addSnap();\n this.map.getTargetElement().style.cursor = 'crosshair'; // Placeholder for now\n }\n })\n }\n\n\n compareGeometrySetting = (g1: GeometryTypeSetting, g2: GeometryTypeSetting) => g1 && g2 && g1.typeId === g2.typeId;\n\n private _areaSource = new VectorSource();\n private _areaLayer = new VectorLayer({\n source: this._areaSource,\n style: (feature) => {\n const geom = feature.getGeometry() as Polygon;\n const area = getArea(geom);\n const formattedArea = area > 1000000 ? `${(area / 1000000).toFixed(2)} km2` : `${area.toFixed(2)} m2`\n return new Style({\n stroke: new Stroke({\n color: 'blue',\n width: 2\n }),\n fill: new Fill({\n color: 'grey'\n }),\n text: new Text({\n text: formattedArea,\n font: '12px Calibri,sans-serif',\n fill: new Fill({ color: '#000' }),\n stroke: new Stroke({ color: '#fff', width: 3 }),\n placement: 'line'\n })\n });\n }\n })\n\n private _distanceLabelSource = new VectorSource();\n private _distanceLabelLayer = new VectorLayer({\n source: this._distanceLabelSource,\n style: (feature) => {\n return new Style({\n text: new Text({\n text: feature.get('label'),\n font: '12px Calibri,sans-serif',\n fill: new Fill({ color: '#000' }),\n stroke: new Stroke({ color: '#fff', width: 3 })\n })\n });\n }\n });\n\n\n private _distanceSource = new VectorSource();\n private _distanceLayer = new VectorLayer({\n source: this._distanceSource,\n style: (feature) => {\n const geom = feature.getGeometry() as LineString;\n const length = getLength(geom);\n const formattedLength = `${length.toFixed(2)} m`\n return new Style({\n stroke: new Stroke({\n color: 'blue',\n width: 2\n }),\n text: new Text({\n text: formattedLength,\n font: '12px Calibri,sans-serif',\n fill: new Fill({ color: '#000' }),\n stroke: new Stroke({ color: '#fff', width: 3 }),\n placement: 'line'\n })\n });\n }\n })\n\n private _distanceMeasureDraw = new Draw({\n type: 'LineString',\n source: this._distanceLayer.getSource()!,\n });\n\n private _areaMeasureDraw = new Draw({\n type: 'Polygon',\n source: this._areaSource\n })\n private _active: 'No' | 'Area' | 'Distance' | 'Print' | 'PrintDraw' = 'No';\n\n get active(): string {\n return this._active;\n }\n\n\n constructor() {\n\n // TODO: Move out from constructor\n // In order to add the distance to each segment of the distance measure feature, we need some extra handling like this.\n this._distanceMeasureDraw.on('drawstart', (evt: DrawEvent) => {\n\n const sketch = evt.feature as Feature;\n\n sketch.getGeometry()!.on('change', (geomEvt) => {\n const geom = geomEvt.target as LineString;\n const coords = geom.getCoordinates();\n\n this._distanceLabelSource.clear(); // Clear existing labels for each change\n\n let totalLength = 0;\n\n for (let i = 0; i < coords.length - 1; i++) {\n const c1 = coords[i];\n const c2 = coords[i + 1];\n const segment = new LineString([c1, c2]);\n const length = getLength(segment);\n totalLength += length;\n\n const mid = [(c1[0] + c2[0]) / 2, (c1[1] + c2[1]) / 2];\n const formatted = `${length.toFixed(2)} m`; \n\n const labelFeature = new Feature({\n geometry: new Point(mid),\n label: formatted\n });\n\n this._distanceLabelSource.addFeature(labelFeature);\n }\n\n // Add total length at the last point\n if (coords.length > 1) {\n const endPoint = coords[coords.length - 1];\n const formattedTotal = `${totalLength.toFixed(2)} m`;\n\n const totalFeature = new Feature({\n geometry: new Point(endPoint),\n label: `Total: ${formattedTotal}`\n });\n\n this._distanceLabelSource.addFeature(totalFeature);\n }\n });\n });\n }\n\n private _clearAllInteractions(): void {\n this._highlight.clear();\n this.stopMeasureArea();\n this.stopMeasureLength();\n this._deleting = false;\n this._interactionHelper.clearTempFromMap();\n this._undoRedo.enable(); \n }\n\n ngOnInit(): void {\n this._originalMapHeight = this.map.getSize()![1];\n this._originalMapWidth = this.map.getSize()![0];\n\n if (this.settings.geometryTypeSettings && this.settings.geometryTypeSettings.length === 1) {\n this.selectedGeometrySetting = this.settings.geometryTypeSettings![0];\n }\n this._drawPolygon.on('drawend', evt => {\n this._featureHelper.setTypeId(evt.feature, this.selectedGeometrySetting?.typeId || '');\n });\n this._loadPosition();\n }\n\n onDragEnded(event: any): void {\n this.dragPosition = {\n x: event.source.getFreeDragPosition().x,\n y: event.source.getFreeDragPosition().y\n };\n this._savePosition();\n }\n \n private _loadPosition(): void {\n try {\n const savedPosition = localStorage.getItem(this._POSITION_STORAGE_KEY);\n if (savedPosition) {\n const position = JSON.parse(savedPosition);\n this.dragPosition = position;\n }\n } catch (error) {\n console.warn('Could not load toolbox position from localStorage:', error);\n }\n }\n\n private _savePosition(): void {\n try {\n localStorage.setItem(this._POSITION_STORAGE_KEY, JSON.stringify(this.dragPosition));\n } catch (error) {\n console.warn('Could not save toolbox position to localStorage:', error);\n }\n }\n\n startMergeFeatures(): void {\n this._clearAllInteractions();\n this.activeMode = 'merge-features'\n this._mergeService.startMerge(this.selectedGeometrySetting!.typeId, () => { this.activeMode = null });\n }\n\n startChangeType(): void {\n this._clearAllInteractions();\n this.activeMode = 'change-type';\n\n const changeTypeSelect = new Select({\n // layers: [this._drawLayer!], \n layers: [this._drawLayerService.layer], \n filter: f => !this._featureHelper.isLocked(f) && this._featureHelper.typeId(f) !== this.selectedGeometrySetting?.typeId // can't changed locked and cant change to same type\n });\n this._interactionHelper.setAsTemp(changeTypeSelect);\n\n changeTypeSelect.on('select', evt => {\n evt.selected.forEach(f => {\n this._settingsHelper.getStyle(this.selectedGeometrySetting!.style, this.profile.styleRepositoryWorkspace!, this.profile.styleRepositoryGeoserver!, f.getGeometry()?.getType()!)\n .subscribe({\n next: style => { \n const feature = this._drawLayerService.source.getFeatureById(f.getId()!);\n if (feature) {\n const newFeature = feature.clone();\n newFeature.setId(f.getId());\n newFeature.setStyle(style);\n this._featureHelper.setTypeId(newFeature, this.selectedGeometrySetting!.typeId);\n this._drawLayerService.source.removeFeature(feature);\n this._drawLayerService.source.addFeature(newFeature);\n }\n }\n })\n })\n });\n \n this.map.addInteraction(changeTypeSelect);\n }\n\n toggleCollapsed(event?: MouseEvent): void {\n if (event) {\n event.stopPropagation();\n }\n this.collapsed = !this.collapsed;\n if (this.collapsed) {\n this.stopMeasureArea();\n this.stopMeasureLength();\n }\n }\n\n startMeasureArea(): void {\n if (this._active === 'Area') {\n this.stopMeasureArea();\n this._active = 'No'\n this.activeMode = null;\n return;\n }\n \n this._clearAllInteractions();\n this.stopMeasureLength();\n this.map.addLayer(this._areaLayer);\n this.map.addInteraction(this._areaMeasureDraw);\n this._active = 'Area';\n this.activeMode = 'measure-area';\n }\n\n stopMeasureArea(): void {\n this.map.getTargetElement().style.cursor = '';\n this._areaSource.clear();\n this.map.removeInteraction(this._areaMeasureDraw);\n this.map.removeLayer(this._areaLayer);\n }\n\n stopMeasureLength(): void {\n this.map.getTargetElement().style.cursor = '';\n this._distanceSource.clear();\n this._distanceLabelSource.clear();\n this.map.removeInteraction(this._distanceMeasureDraw);\n this.map.removeLayer(this._distanceLayer);\n this.map.removeLayer(this._distanceLabelLayer);\n\n }\n\n startMeasureLength(): void { \n if (this._active === 'Distance') {\n this.stopMeasureLength();\n this._active = 'No';\n this.activeMode = null;\n return;\n }\n this._clearAllInteractions();\n this.map.addLayer(this._distanceLayer);\n this.map.addLayer(this._distanceLabelLayer);\n this.map.addInteraction(this._distanceMeasureDraw);\n this._active = 'Distance';\n this.activeMode = 'measure-distance';\n }\n\n startPrintMode(): void {\n if (this._active === 'Print') {\n this._active = 'No';\n\n this.map.getTargetElement().style.width = this._originalMapWidth + 'px';\n this.map.getTargetElement().style.height = this._originalMapHeight + 'px';\n this.map.updateSize();\n this.dimId = \"99\";\n return;\n }\n this.mapWidth = this._originalMapWidth;\n this.mapHeight = this._originalMapHeight;\n this._active = 'Print';\n }\n\n handleDimensionSelected(): void {\n if (this.dimId !== \"99\") {\n let selectedDim = this.dims[parseInt(this.dimId)];\n this.mapWidth = selectedDim[0];\n this.mapHeight = selectedDim[1];\n } else {\n this.mapWidth = this._originalMapWidth;\n this.mapHeight = this._originalMapHeight;\n }\n }\n\n setNewMapDimensions(): void {\n this.map.getTargetElement().style.width = this.mapWidth + 'px';\n this.map.getTargetElement().style.height = this.mapHeight + 'px';\n this.map.updateSize();\n }\n\n doPrint(): void {\n let htmlElement = this.map.getViewport();\n this._setVisibiltyOnDOMElements(htmlElement, false);\n\n html2canvas(htmlElement, { \n useCORS: true,\n }).then(canvas => { \n const imgData = canvas.toDataURL(this.format);\n const link = document.createElement('a');\n link.href = imgData;\n let download = 'map.png';\n if (this.format === 'image/png') {\n download = 'map.png';\n } else if(this.format === 'image/jpeg') {\n download = 'map.jpg';\n }\n link.download = download;\n link.click();\n\n this._setVisibiltyOnDOMElements(htmlElement, true);\n });\n }\n\n private _setVisibiltyOnDOMElements(baseElement: HTMLElement, visible: boolean): void {\n let visibilityValue = 'hidden';\n if (visible) { visibilityValue = 'visible'; }\n\n const activeobjects = baseElement.querySelector('activeobjects') as HTMLElement;\n if (activeobjects) { activeobjects!.style.visibility = visibilityValue; }\n\n const zoom = baseElement.querySelector('.ol-zoom') as HTMLElement;\n if (zoom) { zoom!.style.visibility = visibilityValue; }\n\n const mapToolbox = baseElement.querySelector('map-toolbox') as HTMLElement;\n if (mapToolbox) { mapToolbox!.style.visibility = visibilityValue; }\n\n const mousePosition = baseElement.querySelector('.ol-mouse-position') as HTMLElement;\n if (mousePosition) { mousePosition!.style.visibility = visibilityValue; }\n\n const layerSelector = baseElement.querySelector('.layer-selector-body-wrapper') as HTMLElement;\n if (layerSelector) { layerSelector!.style.visibility = visibilityValue; }\n }\n\n startDrawMode(): void {\n if (this._active === 'PrintDraw') {\n this._active = 'No';\n this._removePrintDrawToolInteraction();\n this.activeMode = null;\n return;\n }\n this._active = 'PrintDraw';\n this._clearAllInteractions();\n this._addPrintDrawToolInteraction();\n this.activeMode = null;\n }\n\n handlePrintDrawToolChanged(): void {\n if (this.active === 'PrintDraw') {\n this.printDrawTool;\n console.log(\"🚀 ~ ToolboxComponent ~ handlePrintDrawToolChanged ~ this.printDrawTool:\", this.printDrawTool)\n \n }\n }\n\n printDraw?: Draw;\n private _addPrintDrawToolInteraction(): void {\n if (this.active === 'PrintDraw') {\n\n const features = this._printDrawLayerService.source.getFeatures();\n console.log(\"🚀 ~ ToolboxComponent ~ _addPrintDrawToolInteraction ~ features:\", features)\n\n \n console.log(\"🚀 ~ ToolboxComponent ~ _addPrintDrawToolInteraction ~ this._current.map:\", this._current.map?.getLayers());\n\n this.printDraw = new Draw({\n source: this._printDrawLayerService.source,\n type: 'LineString',\n style: this._printDrawStyle\n });\n\n this.printDraw.on('drawend', evt => {\n evt.feature.setStyle(this._printDrawStyle);\n\n });\n }\n\n this.map.addInteraction(this.printDraw!);\n this._interactionHelper.setAsTemp(this.printDraw!);\n }\n\n private _removePrintDrawToolInteraction(): void {\n this.map.removeInteraction(this.printDraw!);\n }\n \n private _printDrawStyle: Style = new Style({\n stroke: new Stroke({\n color: 'blue',\n width: 2\n }),\n text: new Text({\n text: 'MySpecialText',\n font: '12px Calibri,sans-serif',\n fill: new Fill({ color: '#000' }),\n stroke: new Stroke({ color: '#fff', width: 3 }),\n placement: 'line'\n })\n });\n\n styles = {\n Point: {\n 'circle-radius': 5,\n 'circle-fill-color': 'red',\n 'stroke-color': 'yellow',\n 'stroke-width': 2,\n 'fill-color': 'blue',\n },\n LineString: {\n 'circle-radius': 5,\n 'circle-fill-color': 'red',\n 'stroke-color': 'yellow',\n 'stroke-width': 2,\n 'fill-color': 'blue',\n },\n Polygon: {\n 'circle-radius': 5,\n 'circle-fill-color': 'red',\n 'stroke-color': 'yellow',\n 'stroke-width': 2,\n 'fill-color': 'blue',\n },\n Circle: {\n 'circle-radius': 5,\n 'circle-fill-color': 'red',\n 'stroke-color': 'blue',\n 'stroke-width': 2,\n 'fill-color': 'yellow',\n },\n };\n}\n","<div class=\"toolbox-wrapper\" \n cdkDrag \n cdkDragBoundary=\".map-container\"\n [cdkDragFreeDragPosition]=\"dragPosition\"\n (cdkDragEnded)=\"onDragEnded($event)\">\n <div class=\"drag-handle-toolbox\" cdkDragHandle>\n <mat-icon>build_circle</mat-icon>\n <mat-icon class=\"toggle-icon\" (click)=\"toggleCollapsed($event)\">{{ collapsed ? 'flip_to_front' : 'remove' }}</mat-icon> </div>\n <div class=\"toolbox-container\" [class.collapsed]=\"collapsed\">\n @if(!collapsed) {\n <div class=\"toolbox-content\">\n @if (settings.geometryTypeSettings && settings.geometryTypeSettings.length) {\n <mat-select class=\"geometry-selector\" (selectionChange)=\"settingsChanged($event)\" [(ngModel)]=\"selectedGeometrySetting\" [compareWith]=\"compareGeometrySetting\">\n @for (setting of settings.geometryTypeSettings; track setting) {\n <mat-option [value]=\"setting\">{{setting.typeName}}</mat-option>\n }\n </mat-select> \n }\n <div class=\"all-tools-container\">\n <div class=\"main-tools\">\n @if(!settings?.undoDisabled) {\n <img \n [src]=\"undoIconBase64\" \n class=\"compact-icon custom-image-icon\"\n (click)=\"undo()\" \n matTooltip=\"Fortryd\" \n [matTooltipShowDelay]=\"200\"\n [matTooltipHideDelay]=\"300\" \n matTooltipClass=\"custom-tooltip\"\n matTooltipPosition=\"below\"\n alt=\"Undo\">\n\n <img \n [src]=\"redoIconBase64\" \n class=\"compact-icon custom-image-icon\"\n (click)=\"redo()\" \n matTooltip=\"Gentag\" \n [matTooltipShowDelay]=\"200\"\n [matTooltipHideDelay]=\"300\" \n matTooltipClass=\"custom-tooltip\"\n matTooltipPosition=\"below\"\n alt=\"Redo\">\n }\n <mat-slide-toggle [(ngModel)]=\"snap\" (change)=\"onSnapChange()\">Snap</mat-slide-toggle>\n @if(settings.editEnabled) {\n <img \n [src]=\"editIconBase64\" \n [class.active]=\"activeMode === 'edit'\" \n class=\"compact-icon custom-image-icon\"\n (click)=\"startEdit()\" \n matTooltip=\"Rediger\" \n [matTooltipShowDelay]=\"200\"\n [matTooltipHideDelay]=\"300\" \n matTooltipClass=\"custom-tooltip\"\n matTooltipPosition=\"below\"\n alt=\"Rediger\">\n\n <img \n [src]=\"removePointsIconBase64\" \n [class.active]=\"activeMode === 'edit-remove'\" \n class=\"compact-icon custom-image-icon\"\n (click)=\"startEditRemovePoints()\" \n matTooltip=\"Fjern punkter\" \n [matTooltipShowDelay]=\"200\"\n [matTooltipHideDelay]=\"300\" \n matTooltipClass=\"custom-tooltip\"\n matTooltipPosition=\"below\"\n alt=\"Fjern punkter\">\n }\n @if(settings.cutHoleEnabled) {\n <img \n [src]=\"trimIconBase64\" \n class=\"compact-icon custom-image-icon\"\n [class.active]=\"activeMode === 'clip-hole'\" \n (click)=\"clipHole()\" \n matTooltip=\"Klip hul\" \n [matTooltipShowDelay]=\"200\"\n [matTooltipHideDelay]=\"300\" \n matTooltipClass=\"custom-tooltip\"\n matTooltipPosition=\"below\"\n alt=\"Klip hul\">\n }\n @if(settings.splitEnabled) {\n <img \n [src]=\"splitIconBase64\" \n class=\"compact-icon custom-image-icon\"\n [class.active]=\"activeMode === 'split'\"\n (click)=\"split()\" \n matTooltip=\"Skær over\" \n [matTooltipShowDelay]=\"200\"\n [matTooltipHideDelay]=\"300\" \n matTooltipClass=\"custom-tooltip\"\n matTooltipPosition=\"below\"\n alt=\"Skær over\">\n }\n @if(settings.changeTypeEnabled) {\n <mat-icon \n class=\"compact-icon\" \n [class.active]=\"activeMode === 'change-type'\" \n (click)=\"startChangeType()\"\n [matTooltipShowDelay]=\"200\"\n matTooltipClass=\"custom-tooltip\"\n [matTooltipHideDelay]=\"300\" \n matTooltip=\"Skift type\" \n matTooltipPosition=\"below\">\n find_replace\n </mat-icon>\n }\n @if(settings.mergeEnabled) {\n <mat-icon \n class=\"compact-icon\" \n (click)=\"startMergeFeatures()\" \n matTooltipPosition=\"below\"\n [matTooltipShowDelay]=\"200\"\n matTooltipClass=\"custom-tooltip\"\n [matTooltipHideDelay]=\"300\" \n matTooltip=\"Saml flader\" \n [class.active]=\"activeMode === 'merge-features'\">\n merge\n </mat-icon>\n }\n </div>\n @if(selectedGeometrySetting && selectedGeometrySetting.availableGeometryTypes?.length) {\n <div class=\"geometry-tools\">\n @for(geomType of selectedGeometrySetting.availableGeometryTypes;track geomType) {\n @if(geomType === 'Polygon') {\n <img \n [src]=\"polygonIconBase64\" \n [class.active]=\"activeMode === 'draw-polygon'\"\n class=\"compact-icon primary custom-image-icon\"\n (click)=\"startDrawPolygon()\" \n matTooltip=\"Polygon\" \n [matTooltipShowDelay]=\"200\"\n [matTooltipHideDelay]=\"300\" \n matTooltipClass=\"custom-tooltip\"\n matTooltipPosition=\"below\"\n alt=\"Polygon\">\n }\n @if(geomType === 'LineString') {\n <img \n [src]=\"lineStringIconBase64\" \n [class.active]=\"activeMode === 'draw-linestring'\"\n class=\"compact-icon primary custom-image-icon\"\n (click)=\"startDrawLineString()\" \n matTooltip=\"LineString\" \n [matTooltipShowDelay]=\"200\"\n [matTooltipHideDelay]=\"300\" \n matTooltipClass=\"custom-tooltip\"\n matTooltipPosition=\"below\"\n alt=\"LineString\">\n }\n @if(geomType === 'Point') {\n <img \n [src]=\"pointIconBase64\" \n [class.active]=\"activeMode === 'draw-point'\"\n class=\"compact-icon primary custom-image-icon\"\n (click)=\"startDrawPoint()\" \n matTooltip=\"Punkter\" \n [matTooltipShowDelay]=\"200\"\n [matTooltipHideDelay]=\"300\" \n matTooltipClass=\"custom-tooltip\"\n matTooltipPosition=\"below\"\n alt=\"Punkter\">\n }\n }\n <img \n [src]=\"wktIconBase64\" \n class=\"compact-icon secondary custom-image-icon\"\n (click)=\"activateShowInputWKT()\" \n matTooltip=\"WKT\" \n [matTooltipShowDelay]=\"200\"\n [matTooltipHideDelay]=\"300\" \n matTooltipClass=\"custom-tooltip\"\n matTooltipPosition=\"below\"\n alt=\"WKT\">\n </div>\n }\n <div class=\"tool-separator\" *ngIf=\"deleteEnabled || showMeasureDistance || showMeasureArea || profile.showPrint\"></div>\n <div class=\"measurement-print-tools\">\n <div class=\"measurement-tools\">\n @if (deleteEnabled) {\n <img \n [src]=\"deleteIconBase64\" \n class=\"compact-icon custom-image-icon\"\n [class.active]=\"activeMode === 'delete'\"\n (click)=\"startDelete()\" \n matTooltip=\"Slet\" \n [matTooltipShowDelay]=\"200\"\n [matTooltipHideDelay]=\"300\" \n matTooltipClass=\"custom-tooltip\"\n matTooltipPosition=\"below\"\n alt=\"Slet\">\n }\n @if (showMeasureDistance) {\n <img \n [src]=\"measureDistanceIconBase64\" \n class=\"compact-icon custom-image-icon\"\n [class.active]=\"activeMode === 'measure-distance'\"\n (click)=\"startMeasureLength()\" \n matTooltip=\"Måle afstand\" \n [matTooltipShowDelay]=\"200\"\n [matTooltipHideDelay]=\"300\" \n matTooltipClass=\"custom-tooltip\"\n matTooltipPosition=\"below\"\n alt=\"Måle afstand\">\n }\n @if(showMeasureArea) {\n <img \n [src]=\"measureAreaIconBase64\" \n class=\"compact-icon custom-image-icon\"\n [class.active]=\"activeMode === 'measure-area'\"\n (click)=\"startMeasureArea()\" \n matTooltip=\"Måle areal\" \n [matTooltipShowDelay]=\"200\"\n [matTooltipHideDelay]=\"300\" \n matTooltipClass=\"custom-tooltip\"\n matTooltipPosition=\"below\"\n alt=\"Måle areal\">\n }\n </div>\n @if(profile.showPrint) {\n <div class=\"tool-separator print-separator\"></div>\n <div class=\"print-tools\">\n <img \n [src]=\"printBase64\" \n class=\"compact-icon custom-image-icon\"\n [class.active]=\"active === 'Print'\"\n (click)=\"startPrintMode()\" \n matTooltip=\"Udskriv\" \n [matTooltipShowDelay]=\"200\"\n [matTooltipHideDelay]=\"300\" \n matTooltipClass=\"custom-tooltip\"\n matTooltipPosition=\"below\"\n alt=\"Udskriv\">\n <!-- <img \n [src]=\"drawBase64\" \n class=\"compact-icon custom-image-icon\"\n [class.active]=\"active === 'Draw'\"\n (click)=\"startDrawMode()\" \n matTooltip=\"Tegn\" \n [matTooltipShowDelay]=\"200\"\n [matTooltipHideDelay]=\"300\" \n matTooltipClass=\"custom-tooltip\"\n matTooltipPosition=\"below\"\n alt=\"Tegn\"> -->\n </div>\n }\n </div>\n </div>\n @if(showInputWKT) {\n <div class=\"wkt-section\">\n <input class=\"compact-input\" [(ngModel)]=\"WKTString\">\n <div class=\"wkt-actions\">\n <button class=\"compact-button primary\" (click)=\"ReadWKT()\">Indlæs WKT</button>\n <button class=\"compact-button\" (click)=\"cancelWKT()\">Annuller</button>\n </div>\n </div>\n }\n @if(profile.showPrint) {\n @if(active === \"Print\") {\n <div class=\"print-config\">\n <img \n [src]=\"printBase64\" \n class=\"compact-icon\"\n (click)=\"doPrint()\" \n alt=\"Udskriv\"> \n <span class=\"icon-separator\">i</span>\n <select id=\"formatSelector\" [(ngModel)]=\"format\">\n <option value=\"image/png\" selected>.PNG</option>\n <option value=\"image/jpeg\">.JPG</option>\n </select>\n <select id=\"dimensionSelector\" [(ngModel)]=\"dimId\" (change)=\"handleDimensionSelected()\">\n <option value=\"99\" selected></option>\n <option value=\"0\">1920 X 1080</option>\n <option value=\"1\">1680 X 1050</option>\n <option value=\"2\">1280 X 800</option>\n <option value=\"3\">800 X 600</option>\n </select>\n <input type=\"text\" [(ngModel)]=\"mapWidth\"/> \n <span class=\"icon-separator\">x</span>\n <input type=\"text\" [(ngModel)]=\"mapHeight\"/>\n <button (click)=\"setNewMapDimensions()\">Vælg</button>\n </div>\n }\n @if(active === \"PrintDraw\") {\n <div class=\"print-draw-config\">\n <span class=\"icon-separator\">Label</span>\n <input type=\"text\" [(ngModel)]=\"printDrawLabel\"/>\n <select id=\"drawToolSelector\" [(ngModel)]=\"printDrawTool\" (change)=\"handlePrintDrawToolChanged()\">\n <option value=\"arrow\" selected>Pil</option>\n <option value=\"point\">Punkt</option>\n <option value=\"line\">Linje</option>\n <option value=\"polygon\">Polygon</option>\n <option value=\"cirkel\">Cirkel</option>\n <option value=\"square\">Kvadrat</option>\n <option value=\"rectangle\">Firkant</option>\n </select>\n <button>Ryd</button>\n </div>\n }\n }\n </div>\n }\n </div>\n</div>\n","import { Component, inject, Input, OnInit } from '@angular/core';\nimport { DrawLayerSourceService } from '../../services/drawLayerSource.service';\nimport { FeatureHelperService } from '../../services/featureHelper.service';\nimport { getArea } from 'ol/sphere';\nimport { MatExpansionModule } from '@angular/material/expansion';\nimport { MatIconModule } from '@angular/material/icon';\nimport { CommonModule } from '@angular/common';\nimport { GisKomponentSettings } from '../../models/GisKomponentSettings';\nimport Feature from 'ol/Feature';\nimport { DragDropModule, CdkDragEnd } from '@angular/cdk/drag-drop';\nimport { highlightService } from '../../services/highlight.service';\nimport { ZoomService } from '../../services/zoom.service';\nimport { FormsModule } from '@angular/forms';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport GeoJSON from 'ol/format/GeoJSON';\ninterface IFeature { \n locked: boolean;\n area: string;\n id: string | number;\n feature: Feature;\n}\n\ninterface IFeatures {\n display: string;\n featureType: string;\n features: IFeature[];\n}\n\n@Component({\n selector: 'activeObjects',\n styleUrl: './activeObjects.component.scss',\n templateUrl: './activeObjects.component.html',\n imports: [CommonModule, FormsModule, MatExpansionModule, MatIconModule, DragDropModule, MatTooltipModule]\n})\nexport class ActiveObjectsComponent implements OnInit {\n\n private _drawLayerService = inject(DrawLayerSourceService);\n \n features$ = this._drawLayerService.features$;\n collapsed = false;\n\n @Input({ required: true}) settings!: GisKomponentSettings;\n\n activeFeatures: IFeatures[] = [];\n private _featureHelper = inject(FeatureHelperService);\n private _highlight = inject(highlightService);\n private _zoomService = inject(ZoomService);\n \n opacity: number = 1;\n dragPosition = { x: 0, y: 0 };\n highlightedId: string | number | null = null;\n private readonly POSITION_STORAGE_KEY = 'activeObjects';\n constructor() {\n this.features$.subscribe({ \n next: features => {\n const featureTypes = [ ... new Set(features.map(f => this._featureHelper.typeId(f)).filter(typeId => !!typeId))];\n const featuresObj: IFeatures[] = featureTypes\n .map(ft => ({ featureType: ft, \n display: this.settings.geometryTypeSettings.find(gts => gts.typeId === ft)!.typeName,\n features: features.filter(f => this._featureHelper.typeId(f) === ft)\n .map(f => ({ id: f.getId()!, feature: f, locked: this._featureHelper.isLocked(f), area: this._getAreaString(f) }))}))\n this.activeFeatures = [...featuresObj];\n }});\n }\n\n ngOnInit(): void {\n this._loadPosition();\n }\n private _getAreaString(feature: Feature): string {\n if (feature.getGeometry()?.getType() !== 'Polygon') { // We only have polygon, linestring and points and only polygons have area\n return ''; \n }\n\n return this.settings.sizeInHa ? `(${(getArea(feature.getGeometry()!) /10000).toFixed(2)} ha)` : `(${getArea(feature.getGeometry()!).toFixed(2)} m2)`;\n }\n\n zoomToAll(): void {\n const formatter = new GeoJSON({dataProjection: 'EPSG:25832', featureProjection: 'EPSG:25832' });\n const allTheFeatures = formatter.writeFeaturesObject(this._drawLayerService.allFeatures);\n \n console.log(\"🚀 ~ ActiveObjectsComponent ~ zoomToAll ~ allTheFeatures:\", JSON.stringify(allTheFeatures));\n this._zoomService.zoomToFeatures(this._drawLayerService.allFeatures) ;\n }\n\n highlight(id: number | string): void {\n if (this.highlightedId === id) {\n this.highlightedId = null;\n this._highlight.clear();\n return;\n }\n this.highlightedId = id;\n this._highlight.clear();\n this._drawLayerService.allFeatures.filter(f => f.getId() === id).forEach(f => this._highlight.highlight(f));\n }\n\n updateOpacity(): void {\n this._drawLayerService.layer.setOpacity(this.opacity)\n }\n\n stopDrag(event: Event): void {\n event.stopPropagation(); // prevents drag container from activating\n }\n\n delete(id: string | number): void {\n this._drawLayerService.remove(id);\n this._highlight.clear();\n }\n togglePanel(): void {\n this.collapsed = !this.collapsed;\n }\n onDragEnded(event: CdkDragEnd): void {\n const position = event.source.getFreeDragPosition();\n this.dragPosition = position;\n this._savePosition(position);\n }\n private _savePosition(position: { x: number; y: number }): void {\n try {\n localStorage.setItem(this.POSITION_STORAGE_KEY, JSON.stringify(position));\n } catch (error) {\n console.error('Error saving position to localStorage:', error);\n }\n }\n private _loadPosition(): void {\n try {\n const savedPosition = localStorage.getItem(this.POSITION_STORAGE_KEY);\n if (savedPosition) {\n this.dragPosition = JSON.parse(savedPosition);\n }\n } catch (error) {\n console.error('Error loading position from localStorage:', error);\n this.dragPosition = { x: 0, y: 0 };\n }\n }\n}","<div class=\"active-objects-wrapper\" \n cdkDrag \n cdkDragBoundary=\".map-container\" \n [cdkDragFreeDragPosition]=\"dragPosition\"\n (cdkDragEnded)=\"onDragEnded($event)\"\n [class.collapsed]=\"collapsed\">\n <div class=\"drag-handle-active-objects\" cdkDragHandle>\n <mat-icon class=\"zoom-icon\" (click)=\"zoomToAll()\">share_reviewsr</mat-icon>\n @if(!collapsed) {\n <h4>Aktive flader</h4>\n }\n <mat-icon class=\"toggle-icon\" (click)=\"togglePanel()\">\n {{ collapsed ? 'flip_to_front' : 'remove' }}\n </mat-icon>\n </div>\n <div class=\"active-objects-container\">\n @if(!collapsed) {\n <input \n type=\"range\"\n min=\"0\"\n max=\"1\"\n step=\"0.05\"\n [(ngModel)]=\"opacity\"\n (input)=\"updateOpacity()\"\n (mousedown)=\"stopDrag($event)\"\n (touchstart)=\"stopDrag($event)\"\n (pointerdown)=\"stopDrag($event)\"\n >\n }\n\n @if(!collapsed) {\n <div class=\"active-objects-content\">\n <mat-icon class=\"zoom-icon\" (click)=\"zoomToAll()\">highlight</mat-icon>\n @for(featureTypeObj of activeFeatures; track featureTypeObj.featureType) {\n <mat-expansion-panel>\n <mat-expansion-panel-header \n [matTooltip]=\"featureTypeObj.display\" \n [matTooltipShowDelay]=\"200\"\n [matTooltipHideDelay]=\"300\" \n matTooltipPosition=\"right\">\n <span class=\"panel-title\">\n {{featureTypeObj.display}} ({{featureTypeObj.features.length}})\n </span>\n </mat-expansion-panel-header>\n <div class=\"item-list\">\n @for(item of featureTypeObj.features; track item.id) {\n <div class=\"item\">\n <div class=\"item-text\">\n <span class=\"item-id\">{{item.id}}</span>\n <span class=\"item-area\">{{item.area}}</span>\n </div>\n <mat-icon *ngIf=\"!item.locked\" (click)=\"delete(item.id)\">delete</mat-icon>\n <mat-icon (click)=\"highlight(item.id)\" [class.highlight-active]=\"highlightedId === item.id\">highlight</mat-icon>\n </div>\n }\n </div>\n </mat-expansion-panel>\n }\n </div>\n }\n </div> \n</div>","import { Component, OnInit } from '@angular/core';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatAutocompleteModule } from '@angular/material/autocomplete';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { MatOptionModule } from '@angular/material/core';\nimport { MatIconModule } from '@angular/material/icon';\nimport { DragDropModule, CdkDragEnd } from '@angular/cdk/drag-drop';\n\n@Component({\n selector: 'lib-map-search',\n templateUrl: './map-search.component.html',\n styleUrls: ['./map-search.component.scss'],\n imports: [\n CommonModule,\n FormsModule,\n MatFormFieldModule,\n MatInputModule,\n MatAutocompleteModule,\n MatOptionModule,\n MatIconModule,\n DragDropModule\n ]\n})\nexport class MapSearchComponent implements OnInit {\n searchAddress: string = '';\n allResults = ['address1', 'address2', 'address3', 'address4'];\n filteredResults: string[] = [];\n collapsed = true;\n dragPosition = { x: 0, y: 0 };\n private readonly POSITION_STORAGE_KEY = 'mapSearchPosition';\n\n ngOnInit(): void {\n this.filterResults();\n this._loadPosition();\n }\n\n filterResults(): void {\n if (!this.searchAddress) {\n this.filteredResults = [];\n return;\n }\n this.filteredResults = this.allResults.filter(r =>\n r.toLowerCase().includes(this.searchAddress.toLowerCase())\n );\n }\n\n toggleSearch(): void {\n this.collapsed = !this.collapsed;\n if (this.collapsed) {\n this.searchAddress = '';\n this.filterResults();\n }\n }\n\n onDragEnded(event: CdkDragEnd): void {\n const position = event.source.getFreeDragPosition();\n this.dragPosition = position;\n this._savePosition(position);\n }\n\n private _savePosition(position: { x: number; y: number }): void {\n try {\n localStorage.setItem(this.POSITION_STORAGE_KEY, JSON.stringify(position));\n } catch (error) {\n console.error('Error saving position to localStorage:', error);\n }\n }\n\n private _loadPosition(): void {\n try {\n const savedPosition = localStorage.getItem(this.POSITION_STORAGE_KEY);\n if (savedPosition) {\n this.dragPosition = JSON.parse(savedPosition);\n }\n } catch (error) {\n console.error('Error loading position from localStorage:', error);\n this.dragPosition = { x: 0, y: 0 };\n }\n }\n}","<div class=\"search-container\" \n cdkDrag \n cdkDragBoundary=\".map-container\" \n [cdkDragFreeDragPosition]=\"dragPosition\"\n (cdkDragEnded)=\"onDragEnded($event)\"\n [class.collapsed]=\"collapsed\">\n <div class=\"drag-handle\" cdkDragHandle>\n <mat-icon>search</mat-icon>\n <mat-icon class=\"toggle-icon\" (click)=\"toggleSearch()\">{{ collapsed ? 'flip_to_front' : 'remove' }}</mat-icon>\n </div>\n <div class=\"search-content\" *ngIf=\"!collapsed\">\n <mat-form-field appearance=\"outline\" class=\"search-field\">\n <mat-label>Søge</mat-label>\n <input\n type=\"text\"\n matInput\n [(ngModel)]=\"searchAddress\"\n [matAutocomplete]=\"auto\"\n (input)=\"filterResults()\"\n />\n <mat-autocomplete #auto=\"matAutocomplete\">\n <mat-option *ngFor=\"let result of filteredResults\" [value]=\"result\">\n {{ result }}\n </mat-option>\n </mat-autocomplete>\n </mat-form-field>\n </div>\n</div>","import { inject, Injectable } from '@angular/core';\nimport { GISKOMPONENT_CONFIG } from '../config/config';\nimport { Observable } from 'rxjs';\nimport { HttpClient } from '@angular/common/http';\nimport { ILayerDetailed } from '../models/ILayer';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class LayerService {\n\n private config = inject(GISKOMPONENT_CONFIG);\n private _baseUrl = this.config.apiBaseUrl;\n private _http = inject(HttpClient);\n\n getByIds(layerIds: number[]): Observable<ILayerDetailed[]> {\n return this._http.put<ILayerDetailed[]>(this._baseUrl + '/api/layer/byIds', { layerIds: layerIds });\n }\n}","import { Component, ElementRef, inject, Input, OnChanges, OnInit, SimpleChanges, ViewChild } from '@angular/core';\nimport { DragDropModule } from '@angular/cdk/drag-drop';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { CommonModule } from '@angular/common';\nimport { MatIconModule } from '@angular/material/icon';\nimport { FormsModule } from '@angular/forms';\nimport { MatExpansionModule } from '@angular/material/expansion';\nimport { MatInputModule } from '@angular/material/input';\nimport Map from 'ol/Map';\nimport ol_control_Control from 'ol/control/Control';\nimport { GISKOMPONENT_CONFIG } from '../../config/config';\nimport { LayerService } from '../../services/layer.service';\nimport { Profile } from '../../models/profile';\nimport { ILayerDetailed } from '../../models/ILayer';\nimport { LayerHelperService } from '../../services/layerHelper.service';\nimport { HttpClient } from '@angular/common/http';\nimport { catchError, forkJoin, map, Observable, of, switchMap } from 'rxjs';\n\ninterface ILayerDetailedWithUrl extends ILayerDetailed {\n imageUrl: string;\n}\n\n@Component({\n selector: 'lib-legends-list',\n templateUrl: './legends-list.component.html',\n styleUrls: ['./legends-list.component.scss'],\n imports: [ MatFormFieldModule, CommonModule, MatIconModule, FormsModule, DragDropModule, \n MatExpansionModule, MatInputModule ]\n})\nexport class LegendsListComponent implements OnInit, OnChanges {\n private readonly _http = inject(HttpClient);\n ngOnInit(): void {\n this._initializeMapIconControl();\n this._layerHelperService.activeLayersChanged.subscribe(() => this._setFilteredLegends().subscribe(result => this.filteredLayersDetailed = result));\n }\n \n ngOnChanges(changes: SimpleChanges): void {\n if (changes['profile'] && this.profile) this._setFilteredLegends().subscribe(result => this.filteredLayersDetailed = result);\n }\n \n @ViewChild('legendsListIcon', { static: false }) set contentIcon(content: ElementRef) {\n this._legendsListIcon = content;\n }\n @ViewChild('legendsListBody', { static: false }) set contentBody(content: ElementRef) {\n this._legendsListBody = content;\n }\n @Input() map!: Map;\n @Input() profile!: Profile;\n searchText = '';\n filteredLayersDetailed: ILayerDetailedWithUrl[] = [];\n showList: boolean = false;\n private config = inject(GISKOMPONENT_CONFIG);\n private _baseUrl = this.config.apiBaseUrl;\n private _legendsListIcon!: ElementRef;\n private _legendsListIconControl!: ol_control_Control;\n private _legendsListBody!: ElementRef;\n private _legendsListBodyControl!: ol_control_Control;\n private readonly _layerIdsToDisplayInMapKeyName: string = 'layerIdsToDisplayInMap';\n private readonly _layerService: LayerService = inject(LayerService);\n private readonly _layerHelperService: LayerHelperService = inject(LayerHelperService);\n\n toggleLegendsList(): void {\n this.showList = !this.showList;\n if (this.showList) {\n this._addMapBodyControl();\n } else {\n this._removeMapBodyControl();\n }\n }\n\n private _initializeMapIconControl(): void {\n this.map.removeControl(this._legendsListIconControl);\n const element = this._legendsListIcon?.nativeElement;\n if (element) {\n this._legendsListIconControl = new ol_control_Control({ element: element });\n this.map.addControl(this._legendsListIconControl);\n }\n }\n\n private _getImageUrl(fileName: string): string {\n return `${this._baseUrl}/api/image/${fileName}`;\n }\n\n private _addMapBodyControl(): void {\n this.map.removeControl(this._legendsListBodyControl);\n const element = this._legendsListBody.nativeElement;\n this._legendsListBodyControl = new ol_control_Control({ element: element });\n this.map.addControl(this._legendsListBodyControl);\n }\n\n private _removeMapBodyControl(): void {\n this.map.removeControl(this._legendsListBodyControl);\n }\n\n private _setFilteredLegends(): Observable<ILayerDetailedWithUrl[]> {\n if (!this.profile?.id) {\n return of([]);\n }\n const layerIdsCachedToDisplay = localStorage.getItem(`${this._layerIdsToDisplayInMapKeyName}_${this.profile?.id}`)?.split(',').map(Number);\n \n if (!layerIdsCachedToDisplay) {\n return of([]);\n }\n return this._layerService.getByIds(layerIdsCachedToDisplay)\n .pipe(switchMap(layers => {\n const enriched$ = layers.map(layer => this.resolveLegendImage(layer));\n return forkJoin(enriched$); // Wait until all items are enriched\n }))\n }\n\n private resolveLegendImage(layer: ILayerDetailed): Observable<ILayerDetailedWithUrl> {\n if (layer.legend?.imageName) {\n return of({\n ...layer,\n imageUrl: this._getImageUrl(layer.legend.imageName)\n });\n }\n\n if (layer.legend?.imageExternalURL) {\n return of({\n ...layer,\n imageUrl: layer.legend.imageExternalURL\n });\n }\n\n // Fallback to Geoserver legend file\n const fallbackUrl = `${layer.baseUrl}?service=WMS&REQUEST=GetLegendGraphic&VERSION=1.0.0&FORMAT=image/png&WIDTH=20&HEIGHT=20&STRICT=false&layer=${layer.layers}`;\n \n return this._http.get(fallbackUrl, { responseType: 'blob' }).pipe(\n map(blob => {\n // Blob returned as an image, so layer has a legend in Geoserver\n const isImage = blob.type.startsWith('image/');\n return {\n ...layer,\n imageUrl: isImage ? fallbackUrl : ''\n };\n }),\n catchError(() =>\n of({\n ...layer,\n imageUrl: '' // fallback failed, layer has no legend on Geoserver\n })\n )\n );\n }\n}\n","<div #legendsListIcon class=\"ol-unselectable ol-control legends-list-icon\">\n <mat-icon (click)=\"toggleLegendsList()\">area_chart</mat-icon>\n</div>\n<div #legendsListBody [class.display-none]=\"!showList\" class=\"legends-list-body-wrapper\" cdkDrag cdkDragBoundary=\".map-container\">\n <div class=\"drag-handle-selector\" cdkDragHandle>\n <mat-icon>drag_indicator</mat-icon>\n </div>\n <div class=\"ol-unselectable ol-control legends-list-body\">\n <div class=\"item-list\">\n @for (layer of filteredLayersDetailed; track layer.id; let iIndex = $index) {\n @if (layer.imageUrl) {\n <mat-expansion-panel expanded=\"true\"> \n <mat-expansion-panel-header>\n <mat-panel-title>\n <div class=\"item\" ><span>{{ layer.name }}</span></div>\n </mat-panel-title>\n </mat-expansion-panel-header>\n <div class=\"legend\">\n <span><img [src]=\"layer.imageUrl\" class=\"legend-thumbnail\"/></span>\n </div>\n </mat-expansion-panel>\n }\n }\n </div>\n </div>\n</div>","import { inject, Injectable } from '@angular/core';\nimport { KomponentSettingsHelperService } from './komponentSettingsHelper.service';\n\nimport GeoJSON from 'ol/format/GeoJSON';\nimport { DrawLayerSourceService } from './drawLayerSource.service';\nimport { CurrentItemsService } from './currentItems.service';\nimport { GisKomponentSettings } from '../models/GisKomponentSettings';\nimport { FeatureHelperService } from './featureHelper.service';\nimport { combineLatest } from 'rxjs';\nimport { ZoomService } from './zoom.service';\nimport { UndoRedoService } from './UndoRedo.service';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class FeatureLoaderService {\n\n private _settingsHelper = inject(KomponentSettingsHelperService);\n private _drawHelperService = inject(DrawLayerSourceService);\n private _current = inject(CurrentItemsService);\n private _zoom = inject(ZoomService);\n private _undoRedo = inject(UndoRedoService);\n\n private _featureHelper = inject(FeatureHelperService);\n\n private fomatter = new GeoJSON({ featureProjection: 'EPSG:25832', dataProjection: 'EPSG:25832'});\n\n loadFeaturesSettings(settings: GisKomponentSettings): void {\n if (!settings || !settings.geometryTypeSettings) { return; }\n const profile = this._current.profile;\n const allTheFeatures = settings.geometryTypeSettings.filter(gt => gt.features).map(gt => { \n const rawFeatures = this.fomatter.readFeatures(gt.features);\n rawFeatures.forEach(f => {\n this._featureHelper.setId(f);\n this._featureHelper.setTypeId(f, gt.typeId);\n f.set('STYLENAME', gt.style);\n }); \n return rawFeatures;\n }).flatMap(f => f);\n\n const getAllStyles$ = allTheFeatures.map(f => this._settingsHelper.getStyle(f.get('STYLENAME'), profile?.styleRepositoryWorkspace!, profile?.styleRepositoryGeoserver!, f.getGeometry()!.getType()!))\n combineLatest(getAllStyles$).subscribe({\n next: styles => {\n styles.forEach((s, i) => allTheFeatures[i].setStyle(s));\n this._drawHelperService.setFeatures(allTheFeatures);\n this._zoom.zoomToFeatures(allTheFeatures);\n this._undoRedo.init();\n }\n })\n }\n\n}","import { CommonModule } from '@angular/common';\nimport { Component, ElementRef, inject, Input, OnInit, ViewChild } from '@angular/core';\nimport { MatIconModule } from '@angular/material/icon';\nimport Map from 'ol/Map';\nimport View from 'ol/View';\nimport TileLayer from 'ol/layer/Tile';\nimport ImageWMS from 'ol/source/ImageWMS';\nimport WMTSCapabilities from 'ol/format/WMTSCapabilities';\nimport ImageLayer from 'ol/layer/Image';\nimport { ProfileService } from '../../services/profile.service';\nimport LayerGroup from 'ol/layer/Group';\nimport { IKeyValue, ILayer } from \"../../models/ILayer\";\nimport { MatSelectModule } from '@angular/material/select';\nimport { MatListModule } from '@angular/material/list';\nimport { HttpClient } from '@angular/common/http';\nimport ol_control_mouse from 'ol/control/MousePosition';\nimport ol_control_scale from 'ol/control/ScaleLine';\nimport BaseLayer from 'ol/layer/Base';\nimport { register } from 'ol/proj/proj4';\nimport proj4 from 'proj4';\nimport { LogoControl } from '../../controls/LogoControl/logoControl';\nimport { CopyrightControl } from '../../controls/CopyrightControl/copyRightControl';\nimport { TileWMS } from 'ol/source';\nimport { combineLatest, map, Observable, of } from 'rxjs';\nimport WMTS, { optionsFromCapabilities } from 'ol/source/WMTS';\nimport { LayerHelperService } from '../../services/layerHelper.service';\nimport { IProfile, IProfileDetailed } from '../../models/IProfile';\nimport { Profile } from '../../models/profile';\nimport { LayerSelectorComponent } from \"../layer-selector/layer-selector.component\";\nimport { GisKomponentSettings } from '../../models/GisKomponentSettings';\nimport 'ol/ol.css';\nimport MapEvent from 'ol/MapEvent';\nimport { Control, Rotate } from 'ol/control';\nimport { ToolboxComponent } from '../toolbox/toolbox.component';\nimport { ActiveObjectsComponent } from '../active-objects/activeObjects.component';\n// import { UndoRedoService } from '../../services/UndoRedo.service';\nimport { LayerErrorService } from '../../services/layerError.service';\nimport { MapSearchComponent } from \"../map-search/map-search.component\";\nimport { highlightService } from '../../services/highlight.service';\nimport { CurrentItemsService } from '../../services/currentItems.service';\nimport { LegendsListComponent } from \"../legends-list/legends-list.component\";\nimport { FeatureLoaderService } from '../../services/featureLoader.service';\n\n@Component({\n selector: 'gis-komponent',\n templateUrl: './gis-komponent.component.html',\n styleUrls: ['./gis-komponent.component.scss'],\n imports: [CommonModule, MatIconModule, MatListModule, MatSelectModule, LayerSelectorComponent, MapSearchComponent, ToolboxComponent, ActiveObjectsComponent, LegendsListComponent],\n providers: [LayerHelperService]\n})\nexport class GisKomponentComponent implements OnInit {\n\n private readonly _profileService = inject(ProfileService);\n // private readonly _undoRedo = inject(UndoRedoService);\n private readonly _http = inject(HttpClient);\n private readonly _layerHelper = inject(LayerHelperService);\n private readonly _layerErrorService = inject(LayerErrorService);\n private readonly _featureLoader = inject(FeatureLoaderService);\n\n\n @Input() showToolbox: boolean = true;\n @Input() showActiveObjects: boolean = true;\n @Input() showLegendList: boolean = true;\n @Input() showMapSearch: boolean = true;\n\n @Input({required: true}) identifier!: string;\n @Input() settings: GisKomponentSettings | undefined;\n @ViewChild('toolbarRef', { static: true }) toolbarRef!: ElementRef;\n @ViewChild('activeObjectsRef', {static: true }) activeObjectsRef!: ElementRef;\n map!: Map;\n toolbarCollapsed = false;\n layerPanelCollapsed = false;\n activeObjectsCollapsed = false;\n conflictsCollapsed = false;\n showConflicts = false;\n showObjects = false;\n activeObjectsReady = false;\n profiles: IProfile[] = [];\n selectedProfile!: IProfileDetailed;\n profileShowToolbox = false;\n private readonly _highlightService = inject(highlightService);\n private _currentItems = inject(CurrentItemsService);\n\n layers: { name: string, visible: boolean, activeInSelector: boolean, legendUrl: string }[] = [];\n\n private mousePositionCtrl = new ol_control_mouse({ projection: 'EPSG:25832' }); \n private onMoveEndCheckZoomFunction: ((event: MapEvent) => void) = () => {};\n currentZoomLevel: number = 0;\n private scaleCtrl = new ol_control_scale({\n units: 'metric',\n bar: true,\n steps: 4,\n text: true,\n minWidth: 120\n });\n \n profileSelected(profileIdentifier: string): void {\n this._profileService.getByIdentifier(profileIdentifier).subscribe({\n next: profile => { \n this._currentItems.profile = profile;\n this.selectedProfile = profile; \n const view: View = new View({\n center: [profile.centerX, profile.centerY],\n extent: [profile.minX, profile.minX, profile.maxX, profile.maxY],\n zoom: profile.zoom ?? 8,\n maxZoom: profile.maxZoom ?? undefined,\n minZoom: profile.minZoom ?? undefined,\n projection: 'EPSG:25832',\n rotation: 0\n });\n\n this.currentZoomLevel = profile.zoom ?? 8;\n\n this._getCapabilitiesObject(profile).subscribe({\n next: capabilityObject => { \n const layers: BaseLayer[] = [...profile.layerGroups.map((lg: { layers: any[]; id: number; }) => \n new LayerGroup({\n layers: lg.layers\n .filter(layer => layer.activeInSelector)\n .sort((a, b) => a.sortOrder - b.sortOrder)\n .map((l, index) => this._mapLayer(l, capabilityObject, 'EPSG:25832', lg.id, index)) // for now, we default to EPSG:25832. \n })\n )\n ];\n this.map.setLayers(layers);\n this.map.addLayer(this._highlightService.highlightLayer);\n if (this.settings) {\n this._featureLoader.loadFeaturesSettings(this.settings)\n }\n \n this._currentItems.map = this.map;\n this._layerHelper.applyCachedLayersToDisplayInMap(this.map, profile.id);\n }\n });\n \n const toolbarControl = new Control({\n element: this.toolbarRef.nativeElement\n });\n \n if (profile.showToolbar) {\n this.profileShowToolbox = true;\n this.map.addControl(toolbarControl);\n }\n\n this.activeObjectsReady = true;\n const activeObjectsControl = new Control({\n element: this.activeObjectsRef.nativeElement\n });\n this.map.addControl(activeObjectsControl);\n\n this._handleShowMouseCoordinates(profile.showCoordinates);\n this._handleShowScale(profile.showScale);\n this._setLogo(profile.logoUrl);\n this._setCopyRight(profile.copyrightMessage);\n this.map.setView(view);\n this.onMoveEndCheckZoomFunction = () => {\n this._checkZoom(this.map);\n };\n this.map.on('moveend', this.onMoveEndCheckZoomFunction);\n this._currentItems.map = this.map;\n }}); \n }\n\n private _checkZoom(map: Map) : void {\n this.currentZoomLevel = map.getView().getZoom() ?? this.currentZoomLevel;\n }\n\n private _getCapabilitiesObject(profile: Profile): Observable<Record<string, any>> {\n // Find all WMTS-layers and get their base url's for retrieving the capabilities. Make sure every url is only called once by removing duplicates\n const layerGroupLayers = [... new Set(profile.layerGroups.flatMap(lg => lg.layers).filter(lg => lg.layerType === 'WMTS'))];\n const parser = new WMTSCapabilities();\n const capabilities$ = layerGroupLayers\n .map(layer => {\n let getCapabilitiesUrl = `${layer.baseUrl}?SERVICE=WMTS&REQUEST=GetCapabilities`\n layer.wmsParameters.forEach((keyValue: IKeyValue) => {\n getCapabilitiesUrl = `${getCapabilitiesUrl}&${keyValue.key}=${keyValue.value}`;\n });\n return this._http.get(getCapabilitiesUrl, {responseType: 'text'})\n .pipe(\n map(result => {\n let item = new CapabilitiesItem();\n item.url = layer.baseUrl;\n item.sourceObject = parser.read(result);\n return item;\n })\n )\n });\n // To make it easier to find the appropriate object, I convert the array to an object of a key/value type.\n return capabilities$.length == 0 ? of({} as Record<string, any>) :\n combineLatest(capabilities$).pipe(map(allCapabilities => \n allCapabilities.reduce((obj, item) => {\n obj[item.url] = item.sourceObject;\n return obj;\n }, {} as Record<string, any>)\n ));\n }\n\n private _mapLayer(layer: ILayer, wmtsOptions: Record<string, any>, projection: string, layerGroupDbId: number, zIndex: number): BaseLayer {\n const params: { [x: string]: any } = {\n layers: layer.layers,\n }\n if (layer.token) {\n params[layer.authKeyName] = layer.token;\n }\n layer.wmsParameters.forEach(param => {\n params[param.key] = param.value\n });\n\n let result: BaseLayer;\n switch (layer.layerType) {\n case 'WMS':\n result = new ImageLayer({ \n source: new ImageWMS({ \n url: layer.baseUrl,\n crossOrigin: 'anonymous',\n params,\n }) \n }); \n break;\n case 'TILEWMS':\n result = new TileLayer({\n source: new TileWMS({\n url: layer.baseUrl,\n crossOrigin: 'anonymous',\n params, \n })\n });\n break;\n case 'WMTS':\n // Create WMST options from the capabilities loaded from the getCapabilities called.\n const options = optionsFromCapabilities(wmtsOptions[layer.baseUrl], {\n layer: layer.layers,\n matrixSet: layer.projection || projection,\n crossOrigin: 'anonymous'\n });\n result = new TileLayer({\n source: new WMTS(options!)\n });\n break;\n }\n \n if (layer.minZoom) {\n result.setMinZoom(layer.minZoom); \n }\n if (layer.maxZoom) {\n result.setMaxZoom(layer.maxZoom);\n } \n if (layer.maxX && layer.minX && layer.maxY && layer.minY) {\n result.setExtent([layer.minX, layer.minX, layer.maxX, layer.maxY]);\n }\n this._layerHelper.setDbId(result, layer.id);\n this._layerHelper.setLayerGroupDbId(result, layerGroupDbId);\n this._layerErrorService.registerLayer(layer.id, result);\n result.setZIndex(zIndex);\n return result;\n }\n\n private _setLogo(url: string): void {\n const logoCtrl = new LogoControl(url);\n this.map.addControl(logoCtrl);\n }\n\n private _setCopyRight(message: string): void {\n const copyrightCtrl = new CopyrightControl(message);\n this.map.addControl(copyrightCtrl);\n }\n\n private _handleShowMouseCoordinates(showCoords: boolean): void {\n if (showCoords) {\n this.map.addControl(this.mousePositionCtrl);\n } else {\n this.map.removeControl(this.mousePositionCtrl);\n }\n }\n\n private _handleShowScale(showScale: boolean): void {\n if (showScale) {\n this.map.addControl(this.scaleCtrl);\n } else {\n this.map.removeControl(this.scaleCtrl);\n }\n }\n\n ngOnInit(): void {\n this.profileSelected(this.identifier);\n proj4.defs('EPSG:25832', '+proj=utm +zone=32 +ellps=GRS80 +units=m +no_defs +type=crs');\n register(proj4);\n \n this.map = new Map({\n target: 'map',\n });\n\n this.map.addControl(new Rotate({autoHide: false}));\n }\n\n\n toggleShowConflicts(): void {\n this.showConflicts = !this.showConflicts;\n }\n\n toggleShowObjects(): void {\n this.showObjects = !this.showObjects;\n }\n\n toggleToolbar(): void {\n this.toolbarCollapsed = !this.toolbarCollapsed;\n }\n\n toggleLayerPanel(): void {\n this.layerPanelCollapsed = !this.layerPanelCollapsed;\n }\n\n toggleActiveObjectsCollapsed(): void { \n this.activeObjectsCollapsed = !this.activeObjectsCollapsed;\n }\n}\nclass CapabilitiesItem {\n url: string = '';\n sourceObject: any = null;\n}","@if (selectedProfile && selectedProfile.showLayerSelector) {\n <lib-layer-selector [map]=\"map\" [profile]=\"selectedProfile\" [currentZoomLevel]=\"currentZoomLevel\"></lib-layer-selector>\n}\n@if (selectedProfile && selectedProfile.showLegends) {\n <lib-legends-list [map]=\"map\" [profile]=\"selectedProfile\"></lib-legends-list>\n}\n\n<!-- <span>Zoom: {{ currentZoomLevel}}</span> -->\n<div #activeObjectsRef>\n @if(showActiveObjects && activeObjectsReady && settings) {\n <activeObjects [settings]=\"settings\"></activeObjects>\n }\n</div>\n<div #toolbarRef class=\"map-toolbar-container\">\n @if(showToolbox && profileShowToolbox && settings) {\n <map-toolbox [map]=\"map\" \n [profile]=\"selectedProfile\"\n [settings]=\"settings\"\n [collapsed]=\"selectedProfile.toolbarCollapsed\" [WKTInputEnabled]=\"settings?.WKTInputEnabled\" [deleteEnabled]=\"settings?.deleteEnabled\" [showMeasureArea]=\"selectedProfile.showAreaMeasurement\" [showMeasureDistance]=\"selectedProfile.showDistanceMeasurement\"></map-toolbox>\n }\n</div>\n\n<div class=\"map-container\">\n <lib-map-search *ngIf=\"showMapSearch\"></lib-map-search>\n\n <!-- Objektvisning -->\n <!-- @if (showObjects) {\n <div class=\"object-panel\" [class.collapsed]=\"activeObjectsCollapsed\">\n <div class=\"header\" (click)=\"toggleActiveObjectsCollapsed()\">\n <span>Aktive objekter ({{activeObjects.length}})</span>\n <mat-icon>{{ activeObjectsCollapsed ? 'expand_more' : 'expand_less' }}</mat-icon>\n </div>\n @if (!activeObjectsCollapsed){\n <ul>\n <li *ngFor=\"let obj of activeObjects\">{{ obj.name }} ({{obj.size}})</li>\n </ul>\n }\n </div>\n } -->\n\n <!-- Konflikter -->\n @if (showConflicts) {\n\n <div class=\"conflict-panel\" [class.collapsed]=\"conflictsCollapsed\">\n <div class=\"header\">\n <span>Konflikter (3)</span>\n <mat-icon>{{ activeObjectsCollapsed ? 'expand_more' : 'expand_less' }}</mat-icon> -->\n </div>\n <mat-list>\n <mat-list-item>\n <span matListItemTitle>Lag #1</span>\n <span matListItemLine><mat-icon>highlight</mat-icon> Objekt #1</span>\n </mat-list-item>\n <mat-list-item>\n <span matListItemTitle>Lag #2 (svarer ikke)</span>\n </mat-list-item>\n <mat-list-item>\n <span matListItemTitle>Lag #3</span>\n <span matListItemLine><mat-icon>highlight</mat-icon> Objekt #1</span>\n <span matListItemLine><mat-icon>highlight</mat-icon> Objekt #2</span>\n </mat-list-item>\n </mat-list>\n </div>\n \n } \n\n <!-- Kort -->\n <div id=\"map\" class=\"map\"></div>\n</div>\n","import { HttpInterceptorFn, HttpErrorResponse } from '@angular/common/http';\nimport { inject } from '@angular/core';\nimport { catchError, throwError } from 'rxjs';\nimport { LibErrorService } from './libError.service';\n\nexport const libErrorInterceptor: HttpInterceptorFn = (req, next) => {\n const errorService = inject(LibErrorService);\n\n return next(req).pipe(\n catchError((error: HttpErrorResponse) => {\n errorService.log(error);\n errorService.show(error);\n return throwError(() => error); // Let the component decide if needed\n })\n );\n};\n","import { Provider } from '@angular/core';\nimport { GISKOMPONENT_CONFIG, GISKomponentConfig } from './config';\nimport { provideHttpClient, withInterceptors } from '@angular/common/http';\nimport { libErrorInterceptor } from '../services/libError.interceptor.service';\n// Call this in the consuming app's app.config.ts file to inject the API URL into the library\n// Example:\n// export const appConfig: ApplicationConfig = { providers: [ provideLibrary( { apiBaseUrl: environment.urlAddress})]}\nexport function provideLibrary(config: GISKomponentConfig): Provider[] {\n return [ \n { provide: GISKOMPONENT_CONFIG, useValue: config }\n ];\n}\n// Call this in the consuming app's app.config.ts file to inject the library's HttpClient with interceptor \n// and custom error handler\n// Example:\n// export const appConfig: ApplicationConfig = { providers: [ provideLibraryHttpClient()]}\nexport function provideLibraryHttpClient(): any {\n return [\n provideHttpClient(withInterceptors([libErrorInterceptor]))\n ]\n};","/*\n * Public API Surface of gis-komponent\n */\n\nexport * from './lib/components/gis-komponent/gis-komponent.component';\nexport * from './lib/config/library-provider';\nexport * from './lib/services/profile.service';\nexport * from './lib/services/layerHelper.service';\nexport * from './lib/models/GisKomponentSettings';\nexport * from './lib/services/libError.service';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i3","i1.DrawLayerSourceService","buffer","turfBuffer","Select","Feature","i1","i2","i6","i4","i5","i8","LayerGroup","Map"],"mappings":"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"}
1
+ {"version":3,"file":"regionerne-gis-komponent.mjs","sources":["../../../projects/gis-komponent/src/lib/config/config.ts","../../../projects/gis-komponent/src/lib/services/profile.service.ts","../../../projects/gis-komponent/src/lib/controls/LogoControl/logoControl.ts","../../../projects/gis-komponent/src/lib/controls/CopyrightControl/copyRightControl.ts","../../../projects/gis-komponent/src/lib/components/lib-notification/lib-notification.component.ts","../../../projects/gis-komponent/src/lib/components/lib-notification/lib-notification.component.html","../../../projects/gis-komponent/src/lib/services/libError.service.ts","../../../projects/gis-komponent/src/lib/services/layerError.service.ts","../../../projects/gis-komponent/src/lib/services/layerHelper.service.ts","../../../projects/gis-komponent/src/lib/components/layer-selector/layer-selector.component.ts","../../../projects/gis-komponent/src/lib/components/layer-selector/layer-selector.component.html","../../../projects/gis-komponent/src/lib/services/komponentSettingsHelper.service.ts","../../../projects/gis-komponent/src/lib/services/currentItems.service.ts","../../../projects/gis-komponent/src/lib/services/drawLayerSource.service.ts","../../../projects/gis-komponent/src/lib/services/featureHelper.service.ts","../../../projects/gis-komponent/src/lib/services/UndoRedo.service.ts","../../../projects/gis-komponent/src/lib/services/geometri-split.service.ts","../../../projects/gis-komponent/src/lib/services/zoom.service.ts","../../../projects/gis-komponent/src/lib/services/highlight.service.ts","../../../projects/gis-komponent/src/lib/services/interactionHelper.service.ts","../../../projects/gis-komponent/src/lib/services/mergeFeatures.service.ts","../../../projects/gis-komponent/src/lib/models/icons.constants.ts","../../../projects/gis-komponent/src/lib/services/printDrawLayerSource.service.ts","../../../projects/gis-komponent/src/lib/services/centerPoint.service.ts","../../../projects/gis-komponent/src/lib/components/confirm-dialog/confirm-dialog.component.ts","../../../projects/gis-komponent/src/lib/components/confirm-dialog/confirm-dialog.component.html","../../../projects/gis-komponent/src/lib/services/confirm-dialog.service.ts","../../../projects/gis-komponent/src/lib/services/overlap.service.ts","../../../projects/gis-komponent/src/lib/components/toolbox/toolbox.component.ts","../../../projects/gis-komponent/src/lib/components/toolbox/toolbox.component.html","../../../projects/gis-komponent/src/lib/components/active-objects/activeObjects.component.ts","../../../projects/gis-komponent/src/lib/components/active-objects/activeObjects.component.html","../../../projects/gis-komponent/src/lib/services/searchProvider.service.ts","../../../projects/gis-komponent/src/lib/services/wfsSearch.service.ts","../../../projects/gis-komponent/src/lib/components/map-search/map-search.component.ts","../../../projects/gis-komponent/src/lib/components/map-search/map-search.component.html","../../../projects/gis-komponent/src/lib/services/layer.service.ts","../../../projects/gis-komponent/src/lib/components/legends-list/legends-list.component.ts","../../../projects/gis-komponent/src/lib/components/legends-list/legends-list.component.html","../../../projects/gis-komponent/src/lib/services/featureLoader.service.ts","../../../projects/gis-komponent/src/lib/components/gis-komponent/gis-komponent.component.ts","../../../projects/gis-komponent/src/lib/components/gis-komponent/gis-komponent.component.html","../../../projects/gis-komponent/src/lib/services/libError.interceptor.service.ts","../../../projects/gis-komponent/src/lib/config/library-provider.ts","../../../projects/gis-komponent/src/public-api.ts","../../../projects/gis-komponent/src/regionerne-gis-komponent.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\n\nexport interface GISKomponentConfig {\n apiBaseUrl: string;\n}\n\nexport const GISKOMPONENT_CONFIG = new InjectionToken<GISKomponentConfig>('GisKomponentConfig');\n","import { inject, Injectable } from '@angular/core';\nimport { GISKOMPONENT_CONFIG } from '../config/config';\nimport { Observable} from 'rxjs';\nimport { HttpClient } from '@angular/common/http';\nimport { IProfileDetailed } from '../models/IProfile';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class ProfileService {\n\n private config = inject(GISKOMPONENT_CONFIG);\n private _baseUrl = this.config.apiBaseUrl;\n private _http = inject(HttpClient);\n\n getByIdentifier(identifier: string): Observable<IProfileDetailed> {\n const url = `${this._baseUrl}/api/profile/identifier/${identifier}`;\n return this._http.get<IProfileDetailed>(url);\n }\n}","// logo-control.ts\nimport { Control } from 'ol/control';\n\nexport class LogoControl extends Control {\n constructor(url: string) {\n const element = document.createElement('div');\n element.className = 'ol-logo ol-unselectable ol-control';\n\n if (url) {\n const img = document.createElement('img');\n img.src = url;\n img.alt = 'Logo';\n element.appendChild(img);\n } else {\n element.style.display = 'none';\n }\n\n super({ element });\n }\n}\n","import { Control } from 'ol/control';\n\nexport class CopyrightControl extends Control {\n constructor(text: string) {\n const element = document.createElement('div');\n element.className = 'ol-copyright ol-unselectable ol-control';\n element.innerText = text;\n\n super({ element });\n\n if (!text) {\n element.style.display = 'none';\n }\n }\n}\n","import { Component, inject } from '@angular/core';\nimport { MAT_SNACK_BAR_DATA, MatSnackBarRef } from '@angular/material/snack-bar';\n\n@Component({\n selector: 'lib-notification',\n templateUrl: './lib-notification.component.html',\n styleUrls: ['./lib-notification.component.scss'],\n standalone: true\n})\nexport class LibNotificationComponent {\n data: { messages: string[] } = inject(MAT_SNACK_BAR_DATA);\n private _snackRef = inject(MatSnackBarRef<LibNotificationComponent>);\n\n dismiss() {\n this._snackRef.dismiss();\n }\n}\n","<div class=\"notification-container\">\n <button mat-icon-button class=\"close-btn\" (click)=\"dismiss()\">&times;</button>\n @for (message of data.messages; track message) {\n <div class=\"lib-notification\">\n <span>{{ message }}</span>\n </div>\n }\n</div>","import { Injectable, inject } from '@angular/core';\nimport { HttpErrorResponse } from '@angular/common/http';\nimport { MatSnackBar } from '@angular/material/snack-bar';\nimport { LibNotificationComponent } from '../components/lib-notification/lib-notification.component';\n\n@Injectable({ providedIn: 'root' })\nexport class LibErrorService {\n private _snackBar = inject(MatSnackBar);\n private _messages: string[] = [];\n\n //Format errors from backend or UI\n format(error: unknown): string {\n if (error instanceof HttpErrorResponse) {\n if (error.error?.message) return error.error.message;\n if (typeof error.error === 'string') return error.error;\n return `Server returned ${error.status}`;\n }\n\n if (error instanceof Error) return error.message;\n return 'An unexpected error occurred.';\n }\n // Log errors (for debugging or telemetry)\n log(error: unknown): void {\n console.error('[Library Error]', error);\n }\n // Show user-friendly message via Material snackbar\n show(error: unknown): void {\n const message = this.format(error);\n // Prevent duplicates\n if (this._messages.includes(message)) return;\n this._messages.push(message);\n const ref = this._snackBar.openFromComponent(LibNotificationComponent, {\n data: { messages: this._messages },\n duration: 5000,\n horizontalPosition: 'right',\n verticalPosition: 'top',\n politeness: 'off',\n panelClass: ['lib-notification-container'],\n });\n // Remove from active stack when it closes\n ref.afterDismissed().subscribe(() => {\n this._messages = this._messages.filter(m => m !== message);\n });\n }\n}\n","import { inject, Injectable } from '@angular/core';\nimport BaseLayer from 'ol/layer/Base';\nimport TileLayer from 'ol/layer/Tile';\nimport ImageLayer from 'ol/layer/Image';\nimport VectorLayer from 'ol/layer/Vector';\nimport TileSource from 'ol/source/Tile';\nimport ImageSource from 'ol/source/Image';\nimport VectorSource from 'ol/source/Vector';\nimport { unByKey } from 'ol/Observable';\nimport { EventsKey } from 'ol/events';\nimport { Subject } from 'rxjs';\nimport { LibErrorService } from './libError.service';\n\nexport interface LayerStatus {\n layerId: number;\n hasError: boolean;\n lastError?: any;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class LayerErrorService {\n layerStatusChanged: Subject<number> = new Subject<number>();\n layerErrored: Subject<number> = new Subject<number>();\n private layerStatuses = new Map<number, LayerStatus>();\n private listeners = new Map<number, EventsKey[]>();\n private _errorService: LibErrorService = inject(LibErrorService);\n\n registerLayer(layerId: number, layer: BaseLayer): void {\n // BaseLayer does not guarantee getSource(), so we must narrow type first\n let source: any;\n\n if (layer instanceof TileLayer || layer instanceof ImageLayer || layer instanceof VectorLayer) {\n source = layer.getSource();\n }\n\n if (!source) {\n console.warn(`[Layer ${layerId}] has no source; skipping error tracking.`);\n return;\n }\n\n const markError = (event: any) => {\n this.layerStatuses.set(layerId, { layerId, hasError: true, lastError: event });\n console.error(`[Layer ${layerId}] load error:`, event);\n this._errorService.show(new Error(`Indlæsningsfejl for lag med id ${layerId}.`));\n this.layerStatusChanged.next(layerId);\n this.layerErrored.next(layerId);\n };\n\n const clearError = () => {\n this.layerStatuses.set(layerId, { layerId, hasError: false });\n this.layerStatusChanged.next(layerId);\n };\n\n let keys: EventsKey[] = [];\n\n if (source instanceof TileSource) {\n keys.push(source.on('tileloaderror', markError));\n keys.push(source.on('tileloadend', clearError));\n } else if (source instanceof ImageSource) {\n keys.push(source.on('imageloaderror', markError));\n keys.push(source.on('imageloadend', clearError));\n } else if (source instanceof VectorSource) {\n keys.push(source.on('featuresloaderror', markError));\n keys.push(source.on('featuresloadend', clearError));\n } else {\n console.warn(`[Layer ${layerId}] Unknown source type; cannot attach error tracking.`);\n }\n\n if (keys.length) {\n this.listeners.set(layerId, keys);\n }\n this.layerStatusChanged.next(layerId);\n }\n\n unregisterLayer(layerId: number): void {\n const keys = this.listeners.get(layerId);\n if (keys) {\n keys.forEach(k => unByKey(k));\n this.listeners.delete(layerId);\n }\n this.layerStatuses.delete(layerId);\n this.layerStatusChanged.next(layerId);\n }\n\n getLayerStatus(layerId: number): LayerStatus | undefined {\n return this.layerStatuses.get(layerId);\n }\n\n getAllStatuses(): LayerStatus[] {\n return Array.from(this.layerStatuses.values());\n }\n}\n","import { inject, Injectable } from '@angular/core';\nimport BaseLayer from 'ol/layer/Base';\nimport Map from 'ol/Map';\nimport OLLayerGroup from 'ol/layer/Group';\nimport { ILayer } from '../models/ILayer';\nimport { BehaviorSubject,switchMap, tap, EMPTY, Subject } from 'rxjs';\nimport { LayerErrorService } from './layerError.service';\nimport { LayerSelectorGroup } from '../models/profile';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class LayerHelperService {\n\n activeLayersChanged: BehaviorSubject<boolean> = new BehaviorSubject<boolean>(true);\n private readonly _layerDbIdKey: string = 'layerDbId';\n private readonly _layerGroupDbIdKey: string = 'layerGroupDbId';\n private readonly _mapFilteredLayerGroupsKeyName: string = 'mapFilteredLayerGroups';\n private _layerErrorService: LayerErrorService = inject(LayerErrorService);\n layerActivatedByBackgroundGroup: Subject<number> = new Subject<number>();\n\n\n setDbId(layer: BaseLayer, id: number): void {\n layer.set(this._layerDbIdKey, id);\n }\n\n getDbId(layer: BaseLayer): number {\n const dbId = layer.get(this._layerDbIdKey) ?? -1;\n return +dbId;\n }\n\n setLayerGroupDbId(layer: BaseLayer, id: number): void {\n layer.set(this._layerGroupDbIdKey, id);\n }\n\n getLayerGroupDbId(layer: BaseLayer): number {\n const dbId = layer.get(this._layerGroupDbIdKey) ?? -1;\n return +dbId;\n }\n\n applyCachedLayersToDisplayInMap(map: Map, profileId: number): void {\n this.activeLayersChanged.next(true);\n const cacheValue = localStorage.getItem(`${this._mapFilteredLayerGroupsKeyName}_${profileId}`);\n if (cacheValue) {\n const layersCachedToDisplay = JSON.parse(cacheValue).cachedLayerGroups\n .flatMap((lg: LayerSelectorGroup) => lg.layers)\n .map((l: ILayer) => ({ id: l.id, visible: l.visible}));\n //Bottom layers are rendered first, top layers are rendered last (on top)\n layersCachedToDisplay.reverse();\n map.getLayers().getArray().forEach(layergroup => {\n if (layergroup instanceof OLLayerGroup) {\n layergroup.getLayers().getArray().forEach(l => {\n const cachedLayer: { id: number; visible: boolean } = layersCachedToDisplay\n .find((layer: { id: number; visible: boolean }) => l.get(this._layerDbIdKey) == layer.id);\n const current = l.getVisible();\n if (cachedLayer != undefined && current != cachedLayer.visible) {\n l.setVisible(cachedLayer.visible);\n }\n //Set z index to match the order in cache\n l.setZIndex(layersCachedToDisplay.indexOf(cachedLayer));\n //console.log('layer id '+l.get(this._layerDbIdKey)+' - setZIndex:'+layerIdsCachedToDisplay.indexOf(l.get(this._layerDbIdKey).toString()))\n })\n }\n })\n }\n }\n\n startFailoverForBackgroundGroup(aMap: Map, groupId: number) {\n const currentIndex$ = new BehaviorSubject(0);\n const layergroup = aMap.getLayers().getArray()\n .find(layergroup => layergroup instanceof OLLayerGroup && layergroup.get('id') === groupId);\n const items = (layergroup as OLLayerGroup).getLayers().getArray().sort((a,b) => (b.getZIndex() ?? 0) - (a.getZIndex() ?? 0));\n // Handles activating the current item\n const activation$ = currentIndex$.pipe(\n tap(index => {\n // deactivate all first\n items.forEach(layer => layer.setVisible(false));\n // if out of range, stop completely\n if (index >= items.length) {\n console.warn('No more items left. Stopping failover.');\n return;\n }\n // activate current\n const layer = items[index];\n console.log('Failover turning layer on:', layer.get(this._layerDbIdKey));\n layer.setVisible(true);\n this.layerActivatedByBackgroundGroup.next(layer.get(this._layerDbIdKey));\n }),\n // Listen for failures only while we have a valid index\n switchMap(index => {\n if (index >= items.length) return EMPTY;\n const currentItem = items[index];\n return this._layerErrorService.layerErrored.pipe(\n tap(failedId => {\n // If the current one failed, move to next\n if (failedId === currentItem.get(this._layerDbIdKey)) {\n console.log('Failover layer failed:', currentItem.get(this._layerDbIdKey));\n currentIndex$.next(index + 1);\n }\n }\n )\n );\n }\n ));\n activation$.subscribe();\n }\n\n updateLayerOpacityInMap(map: Map, layer: ILayer): void {\n map.getLayers().getArray().forEach(layergroup => {\n if (layergroup instanceof OLLayerGroup) {\n layergroup.getLayers().getArray().forEach(l => {\n if (l.get(this._layerDbIdKey) === layer.id && layer.opacity) {\n l.setOpacity(layer.opacity);\n }\n })\n }}\n )\n }\n\n toggleLayerInMap(map: Map, layerId: number): void {\n map.getLayers().getArray().forEach(layergroup => {\n if (layergroup instanceof OLLayerGroup) {\n layergroup.getLayers().getArray().forEach(l => {\n if (l.get(this._layerDbIdKey) === layerId) {\n const current = l.getVisible();\n l.setVisible(!current);\n }\n })}\n }\n );\n }\n}","import { Component, ElementRef, inject, Input, OnChanges, OnInit, SimpleChanges, ViewChild } from '@angular/core';\nimport { CdkDragDrop, DragDropModule, moveItemInArray, transferArrayItem } from '@angular/cdk/drag-drop';\nimport { LayerSelectorGroup, Profile } from '../../models/profile';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { CommonModule } from '@angular/common';\nimport { MatIconModule } from '@angular/material/icon';\nimport { FormsModule } from '@angular/forms';\nimport { MatExpansionModule } from '@angular/material/expansion';\nimport { MatInputModule } from '@angular/material/input';\nimport Map from 'ol/Map';\nimport { LayerHelperService } from '../../services/layerHelper.service';\nimport ol_control_Control from 'ol/control/Control';\nimport { ILayer } from '../../models/ILayer';\nimport { LayerErrorService } from '../../services/layerError.service';\nimport { MatTooltipModule } from '@angular/material/tooltip';\n\nexport interface CachedProfileInfo {\n profile: Profile;\n cachedLayerGroups: LayerSelectorGroup[];\n}\n\n@Component({\n selector: 'lib-layer-selector',\n templateUrl: './layer-selector.component.html',\n styleUrls: ['./layer-selector.component.scss'],\n imports: [ MatFormFieldModule, CommonModule, MatIconModule, FormsModule, DragDropModule, \n MatExpansionModule, MatInputModule, MatTooltipModule ] \n})\nexport class LayerSelectorComponent implements OnInit, OnChanges {\n @ViewChild('layerSelectorIcon', { static: false }) set contentIcon(content: ElementRef) {\n this._layerSelectorIcon = content;\n }\n @ViewChild('layerSelectorBody', { static: false }) set contentBody(content: ElementRef) {\n this._layerSelectorBody = content;\n }\n @Input() map!: Map;\n @Input() profile!: Profile;\n @Input() currentZoomLevel!: number;\n searchText = '';\n allLayerGroups: LayerSelectorGroup[] = [];\n filteredLayerGroups: LayerSelectorGroup[] = [];\n showLegend: boolean = false; // TO DO - this will be added later, as a change (probably as a Profile setting)\n showSelector: boolean = false;\n legendUrl: string = 'https://docs.geoserver.org/main/en/user/_images/samplelegend.png'; // TO DO - remove this (mockup for now, will be done as a change later)\n private _layerSelectorIcon!: ElementRef;\n private _layerSelectorIconControl!: ol_control_Control;\n private _layerSelectorBody!: ElementRef;\n private _layerSelectorBodyControl!: ol_control_Control;\n private readonly _mapFilteredLayerGroupsKeyName: string = 'mapFilteredLayerGroups';\n private readonly _layerHelper: LayerHelperService = inject(LayerHelperService);\n private readonly _layerErrorService: LayerErrorService = inject(LayerErrorService);\n\n ngOnInit(): void {\n this._layerHelper.layerActivatedByBackgroundGroup\n .subscribe(layerId => this.toggleLayer(layerId, undefined, true));\n this._layerErrorService.layerErrored\n .subscribe(layerId => {\n const layerHasErrors: boolean | undefined = this._layerErrorService.getLayerStatus(layerId)?.hasError;\n if (layerHasErrors != undefined) this.setLayerErrorStatus(layerId, layerHasErrors);\n })\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['profile'] && this.profile) {\n this.allLayerGroups = this.profile.layerGroups\n .map((lg, idx) => ({... lg, \n noOfVisibleLayers: lg.layers.filter(l => l.visible).length, \n visible: lg.layers.some(l => l.visible),\n expanded: lg.layers.some(l => l.visible),\n layers: lg.layers.filter((l: { activeInSelector: boolean; }) => l.activeInSelector), \n sortOrder: idx}))\n .filter(g => g.layers.length > 0); \n \n const cacheValue = localStorage.getItem(`${this._mapFilteredLayerGroupsKeyName}_${this.profile.id}`);\n if (cacheValue) {\n const cachedProfileInfo: CachedProfileInfo = JSON.parse(cacheValue);\n if (cachedProfileInfo.profile.versionId < this.profile.versionId) {\n //Profile version changed in backend, use that\n this.filteredLayerGroups = this.setfilteredGroups(); \n this._cacheProfileInfo();\n } else {\n this.filteredLayerGroups = cachedProfileInfo.cachedLayerGroups;\n this._setVisibleLayersFromCache(cachedProfileInfo.cachedLayerGroups);\n }\n } else {\n this.filteredLayerGroups = this.setfilteredGroups(); \n this._cacheProfileInfo();\n }\n // Apply Failover logic to all background groups\n this.filteredLayerGroups.filter(group => group.background)\n .forEach(group => {\n group.layers.forEach(layer => layer.visible = false); //Turn all layers off in selector to begin with\n group.visible = true; // Expand the group (there will be at least one active layer)\n group.expanded = true;\n this._layerHelper.startFailoverForBackgroundGroup(this.map, group.id);\n });\n this._initializeMapIconControl();\n }\n }\n\n toggleLayer(layerId: number, event?: MouseEvent, skipMapToggle: boolean = false): void {\n event?.stopPropagation(); // Prevent the panel from expanding/collapsing\n if (!skipMapToggle) this._layerHelper.toggleLayerInMap(this.map, layerId);\n // Toggle layer in all groups in the selector UI\n this.filteredLayerGroups.forEach(group => {\n group.layers.forEach(l => {\n if (layerId === l.id) {\n l.visible = !l.visible;\n }});\n group.noOfVisibleLayers = group.layers.filter(l => l.visible).length;\n group.visible = group.layers.some(l => l.visible);\n group.expanded = group.layers.some(l => l.visible);\n });\n this._cacheProfileInfo();\n }\n\n setLayerErrorStatus(layerId: number, errorStatus: boolean): void {\n this.filteredLayerGroups.forEach(group => {\n group.layers.forEach(l => {\n if (layerId === l.id) {\n l.hasErrors = errorStatus;\n }});\n });\n }\n\n toggleGroup(event: MouseEvent, layerGroup: LayerSelectorGroup): void {\n event.stopPropagation(); // Prevent the panel from expanding/collapsing\n const visible: boolean = !layerGroup.visible;\n if (visible && layerGroup.background) {\n //Toggle background group on, apply failover logic\n layerGroup.layers.forEach(layer => layer.visible = false); // Turn all off in selector to begin with\n this._layerHelper.startFailoverForBackgroundGroup(this.map, layerGroup.id);\n } else {\n layerGroup.layers.forEach(layer => {\n if (layer.visible != visible) {\n //Toggle layer in map\n this._layerHelper.toggleLayerInMap(this.map, layer.id);\n // Toggle layer in all groups in the selector UI\n this.filteredLayerGroups.forEach(group => {\n group.layers.forEach(l => {\n if (layer.id === l.id) {\n l.visible = !l.visible;\n }});\n group.noOfVisibleLayers = group.layers.filter(l => l.visible).length;\n group.visible = group.layers.some(l => l.visible);\n group.expanded = group.layers.some(l => l.visible);\n });\n }\n })\n }\n layerGroup.visible = visible;\n layerGroup.expanded = layerGroup.layers.some(l => l.visible);\n this._cacheProfileInfo();\n }\n\n toggleLayerSelector(): void {\n this.showSelector = !this.showSelector;\n if (this.showSelector) {\n this._addMapBodyControl();\n } else {\n this._removeMapBodyControl();\n }\n }\n\n updateOpacity(layer: ILayer): void {\n this._layerHelper.updateLayerOpacityInMap(this.map, layer);\n }\n\n stopDrag(event: Event): void {\n event.stopPropagation(); // prevents drag container from activating\n }\n\n setfilteredGroups(): LayerSelectorGroup[] {\n const text = this.searchText.toLowerCase();\n return this.allLayerGroups\n .map((g, idx) => {\n if (!text) {\n return { ...g, expanded: false, sortOrder: idx,\n layers: g.layers.map(layer => ({...layer, opacity: 1}))\n }; // collapsed by default\n }\n const filteredItems = g.layers.filter(l => l.name.toLowerCase().includes(text));\n return {\n ...g,\n expanded: filteredItems.length > 0,\n sortOrder: idx,\n layers: filteredItems.map(layer => ({...layer, opacity: 1}))\n };\n })\n .filter(g => g.layers.length > 0)\n .sort((a, b) => {\n if (a.background && !b.background) return 1;\n if (!a.background && b.background) return -1;\n return a.sortOrder - b.sortOrder\n });\n }\n\n dropGroup(event: CdkDragDrop<LayerSelectorGroup[]>) {\n moveItemInArray(this.filteredLayerGroups, event.previousIndex, event.currentIndex);\n this.updateGroupSortOrders();\n this._cacheProfileInfo();\n }\n\n dropLayer(event: CdkDragDrop<ILayer[]>, group: LayerSelectorGroup) {\n if (event.previousContainer === event.container) {\n moveItemInArray(group.layers, event.previousIndex, event.currentIndex);\n } else {\n transferArrayItem(\n event.previousContainer.data,\n event.container.data,\n event.previousIndex,\n event.currentIndex\n );\n }\n this.updateLayerSortOrders(group);\n this._cacheProfileInfo();\n }\n\n clearSearchText(): void {\n this.searchText = '';\n this.filteredLayerGroups = this.setfilteredGroups();\n this._cacheProfileInfo();\n }\n\n updateGroupSortOrders() {\n this.filteredLayerGroups.forEach((g, idx) => (g.sortOrder = idx));\n }\n\n updateLayerSortOrders(group: LayerSelectorGroup) {\n group.layers.forEach((layer, idx) => (layer.sortOrder = idx));\n }\n\n private _cacheProfileInfo(): void {\n const cacheItem: CachedProfileInfo = { profile: this.profile, cachedLayerGroups: this.filteredLayerGroups };\n localStorage.setItem(`${this._mapFilteredLayerGroupsKeyName}_${this.profile.id}`, JSON.stringify(cacheItem));\n // Reflect new order in map\n this._layerHelper.applyCachedLayersToDisplayInMap(this.map, this.profile.id);\n }\n\n private _initializeMapIconControl(): void {\n this.map.removeControl(this._layerSelectorIconControl);\n if (this._layerSelectorIcon?.nativeElement) {\n const element = this._layerSelectorIcon.nativeElement;\n this._layerSelectorIconControl = new ol_control_Control({ element: element });\n this.map.addControl(this._layerSelectorIconControl);\n }\n }\n\n private _addMapBodyControl(): void {\n this.map.removeControl(this._layerSelectorBodyControl);\n const element = this._layerSelectorBody.nativeElement;\n this._layerSelectorBodyControl = new ol_control_Control({ element: element });\n this.map.addControl(this._layerSelectorBodyControl);\n }\n\n private _removeMapBodyControl(): void {\n this.map.removeControl(this._layerSelectorBodyControl);\n }\n\n private _setVisibleLayersFromCache(cachedFilteredLayergroups: LayerSelectorGroup[]): void {\n this.allLayerGroups.forEach(group => group.layers.forEach(layer => {\n const cachedLayer = cachedFilteredLayergroups.find(gr => gr.id === group.id)?.layers?.find(l => l.id === layer.id);\n layer.visible = cachedLayer?.visible ?? layer.visible;\n }))\n }\n\n}\n","<div #layerSelectorIcon id=\"layerSelector\" class=\"ol-unselectable ol-control layer-selector-icon\">\n <mat-icon (click)=\"toggleLayerSelector()\">layers</mat-icon>\n</div>\n<div #layerSelectorBody [class.display-none]=\"!showSelector\" class=\"layer-selector-body-wrapper\" cdkDrag cdkDragBoundary=\".map-container\">\n <div class=\"drag-handle-selector\" cdkDragHandle>\n <div class=\"drag-handle-content\">\n <div class=\"drag-handle-icons\">\n <mat-icon class=\"drag-indicator-right\">open_with</mat-icon>\n <mat-icon class=\"minimize-button\" (click)=\"toggleLayerSelector()\">minimize</mat-icon>\n </div>\n </div>\n </div>\n <div class=\"ol-unselectable ol-control layer-selector-body\">\n <div class=\"search-section\">\n <mat-form-field appearance=\"outline\" class=\"w-full\">\n <mat-label>Filtrer</mat-label>\n <input \n matInput \n type=\"text\" \n [(ngModel)]=\"searchText\" \n (ngModelChange)=\"filteredLayerGroups=setfilteredGroups()\"\n placeholder=\"Skriv for at filtrere...\"\n />\n </mat-form-field>\n <mat-icon (click)=\"clearSearchText()\">undo</mat-icon>\n </div>\n \n <div\n cdkDropList\n [cdkDropListData]=\"filteredLayerGroups\"\n (cdkDropListDropped)=\"dropGroup($event)\"\n class=\"item-list\">\n @for (group of filteredLayerGroups; track group.id; let gIndex = $index) {\n <div class=\"group\" cdkDrag cdkDragPreviewDisabled>\n <mat-expansion-panel [(expanded)]=\"group.expanded\">\n <mat-expansion-panel-header>\n <mat-panel-title>\n @if (group.expanded) {\n <mat-icon>arrow_upward</mat-icon>\n }\n @if (!group.expanded) {\n <mat-icon>arrow_downward</mat-icon> \n }\n {{ group.name }} \n <mat-icon class=\"lightbulb\">lightbulb</mat-icon>\n ({{ group.noOfVisibleLayers }}/{{ group.layers.length }})\n @if (group.visible) {\n <mat-icon (click)=\"toggleGroup($event, group)\" class=\"power-on\" \n matTooltip=\"Tænd\" \n [matTooltipShowDelay]=\"200\"\n [matTooltipHideDelay]=\"300\" \n matTooltipPosition=\"above\">power_settings_new\n </mat-icon> \n }\n @if (!group.visible) {\n <mat-icon (click)=\"toggleGroup($event, group)\" class=\"power-off\"\n matTooltip=\"Sluk\" \n [matTooltipShowDelay]=\"200\"\n [matTooltipHideDelay]=\"300\" \n matTooltipPosition=\"above\">power_settings_new\n </mat-icon>\n }\n </mat-panel-title>\n </mat-expansion-panel-header>\n <!-- This is only shown during drag -->\n <!-- <div *cdkDragPreview class=\"drag-preview\">\n {{ group.name }}\n </div> -->\n\n <!-- Placeholder to avoid jump -->\n <!-- <div *cdkDragPlaceholder class=\"drag-placeholder\"></div> -->\n\n <div\n cdkDropList\n [cdkDropListData]=\"group.layers\"\n (cdkDropListDropped)=\"dropLayer($event, group)\"\n class=\"item-list\">\n @for (layer of group.layers; track layer.id; let iIndex = $index) {\n <mat-expansion-panel expanded=\"false\" [disabled]=\"!layer.description\"> \n <mat-expansion-panel-header>\n <mat-panel-title>\n <div class=\"item\" cdkDrag cdkDragPreviewDisabled>\n <div class=\"item-left\">\n <mat-icon class=\"drag-indicator\">drag_indicator</mat-icon>\n <span>{{ layer.name }}</span>\n </div>\n <div class=\"item-center\">\n @if (layer.maxZoom < currentZoomLevel || layer.minZoom > currentZoomLevel) {\n <mat-icon class=\"zoom-off\" \n matTooltip=\"Zoom\" \n [matTooltipShowDelay]=\"200\"\n [matTooltipHideDelay]=\"300\" \n matTooltipPosition=\"above\">browser_not_supported\n </mat-icon>\n }\n @if (layer.hasErrors) {\n <mat-icon class=\"zoom-off\" \n matTooltip=\"Fejl\" \n [matTooltipShowDelay]=\"200\"\n [matTooltipHideDelay]=\"300\" \n matTooltipPosition=\"above\">priority_high\n </mat-icon>\n\n }\n </div>\n <div class=\"item-right\">\n @if (layer.visible) {\n <mat-icon (click)=\"toggleLayer(layer.id, $event)\" class=\"power-on\" \n matTooltip=\"Tænd\" \n [matTooltipShowDelay]=\"200\"\n [matTooltipHideDelay]=\"300\" \n matTooltipPosition=\"above\">power_settings_new\n </mat-icon>\n }\n @if (!layer.visible) {\n <mat-icon (click)=\"toggleLayer(layer.id, $event)\" class=\"power-off\"\n matTooltip=\"Sluk\" \n [matTooltipShowDelay]=\"200\"\n [matTooltipHideDelay]=\"300\" \n matTooltipPosition=\"above\">power_settings_new\n </mat-icon>\n }\n <input \n type=\"range\"\n min=\"0\"\n max=\"1\"\n step=\"0.05\"\n [(ngModel)]=\"layer.opacity\"\n (click)=\"stopDrag($event)\"\n (input)=\"updateOpacity(layer)\"\n (mousedown)=\"stopDrag($event)\"\n (touchstart)=\"stopDrag($event)\"\n (pointerdown)=\"stopDrag($event)\"\n >\n </div>\n </div>\n </mat-panel-title>\n </mat-expansion-panel-header>\n <div class=\"layer-description\">{{ layer.description }}</div>\n @if (showLegend) {\n <img [src]=\"legendUrl\" class=\"legend-thumbnail\"/>\n }\n </mat-expansion-panel>\n }\n </div>\n </mat-expansion-panel>\n </div>\n }\n </div>\n </div>\n</div>","import { HttpClient, HttpHeaders, HttpParams } from '@angular/common/http';\nimport { inject, Injectable } from '@angular/core';\nimport { GisKomponentSettings } from '../models/GisKomponentSettings';\nimport { GeoServer } from '../models/geoserver';\nimport { combineLatest, map, Observable, of, reduce, tap } from 'rxjs';\nimport WKT from 'ol/format/WKT'\n// @ts-ignore\nimport * as SLDReader from '@nieuwlandgeo/sldreader';\n\nimport Map from 'ol/Map';\nimport ol_layer_Vector from 'ol/layer/Vector';\nimport VectorSource from 'ol/source/Vector';\nimport { extend } from 'ol/extent';\nimport { Style } from 'ol/style';\n\n// interface namedStyle {\n// styleName: string;\n// sldFeatureStyle: any;\n// }\n\n@Injectable({\n providedIn: 'root'\n})\nexport class KomponentSettingsHelperService {\n\n private readonly _httpClient = inject(HttpClient);\n\n private styles: Record<string, any> = { }; \n\n // loadNamedStyleObjects(styleNames: string[], workspace: string, geoserver: GeoServer): Observable<namedStyle[]> {\n\n // const headerstring = `${geoserver.userName}:${geoserver.password}`;\n // const encoded = btoa(headerstring); \n // const headers = new HttpHeaders().set('Authorization', `Basic ${encoded}`);\n \n\n // const result$ = styleNames.map(styleName => \n // this._httpClient.get(`${geoserver.url}/rest/workspaces/${workspace}/styles/${styleName}.sld`, { headers, responseType: 'text' })\n // .pipe(map(loadedStyle => { \n // const sldObject = SLDReader.Reader(loadedStyle);\n // const sldLayer = SLDReader.getLayer(sldObject);\n // const sldStyles = SLDReader.getStyle(sldLayer);\n // const sldFeatureStyle = sldStyles.featuretypestyles[0];\n // return { styleName, sldFeatureStyle } as namedStyle\n // })));\n // return combineLatest(result$);\n // }\n\n private _getSldStyleObject$(styleName: string, workspace: string, geoserver: GeoServer): Observable<any> {\n return this.styles[styleName] ? of(this.styles[styleName]) :\n this._loadStyleFromGeoServer$(styleName, workspace, geoserver)\n .pipe(\n tap(loadedStyle => { \n this.styles[styleName] = loadedStyle; } \n ));\n }\n\n private _loadStyleFromGeoServer$(styleName: string, workspace: string, geoserver: GeoServer): Observable<any> {\n const headerstring = `${geoserver.userName}:${geoserver.password}`;\n const encoded = btoa(headerstring); \n const headers = new HttpHeaders().set('Authorization', `Basic ${encoded}`);\n const url = `${geoserver.url}/rest/workspaces/${workspace}/styles/${styleName}.sld`;\n return this._httpClient.get(url, { headers, responseType: 'text' }).pipe(map(loadedStyle => {\n const sldObject = SLDReader.Reader(loadedStyle);\n const sldLayer = SLDReader.getLayer(sldObject);\n const sldStyles = SLDReader.getStyle(sldLayer);\n const sldFeatureStyle = sldStyles.featuretypestyles[0];\n return sldFeatureStyle; \n }));\n\n }\n\n getStyle(styleName: string, workspace: string, geoserver: GeoServer, styleType: string): Observable<Style> {\n\n return this._getSldStyleObject$(styleName, workspace, geoserver)\n .pipe(map(loadedStyle => {\n return SLDReader.createOlStyle(loadedStyle.rules[0], styleType) as Style\n }\n ));\n }\n}","import { Map } from 'ol';\nimport { IProfileDetailed } from '../models/IProfile';\nimport { Injectable } from '@angular/core';\nimport { ReplaySubject } from 'rxjs';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class CurrentItemsService {\n\n private _map: Map | undefined;\n\n get map(): Map | undefined { return this._map; }\n set map(value: Map) {\n this._map = value;\n this._mapSubject.next(value);\n }\n profile: IProfileDetailed | undefined;\n\n private _mapSubject: ReplaySubject<Map> = new ReplaySubject<Map>(1); \n map$ = this._mapSubject.asObservable();\n\n}","import { inject, Injectable } from '@angular/core';\nimport Feature from 'ol/Feature';\nimport VectorSource from 'ol/source/Vector';\nimport { Subject } from 'rxjs';\nimport { CurrentItemsService } from './currentItems.service';\nimport VectorLayer from 'ol/layer/Vector';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class DrawLayerSourceService {\n\n private _current = inject(CurrentItemsService);\n\n private _features = new Subject<Feature[]>;\n features$ = this._features.asObservable();\n source: VectorSource = new VectorSource();\n layer = new VectorLayer({\n source: this.source,\n zIndex: 999\n });\n private _disabled = false;\n\n constructor() { \n this.layer.set('DRAWLAYER', 'true'); \n this._initListener();\n }\n\n private _initListener(): void {\n this._current.map$.subscribe({\n next: map => {\n map.addLayer(this.layer);\n }\n });\n this.source.on(['addfeature', 'changefeature', 'removefeature'], evt => {\n if (this._disabled) { return; }\n const features = this.source.getFeatures();\n this._features.next(features);\n });\n \n }\n\n get allFeatures(): Feature[] {\n return this.source.getFeatures().map(f => { \n // I want a static copy of the features. \n const newFeature = f.clone(); \n // But cloning doesn't include the id and that is used for referencing a few places.\n newFeature.setId(f.getId());\n return newFeature;\n }); \n }\n\n remove(id: string | number): void {\n const feature = this.source.getFeatureById(id);\n if (feature) {\n this.source.removeFeature(feature);\n }\n }\n\n setFeatures(features: Feature[]) {\n this._disabled = true;\n this.source.clear();\n this.source.addFeatures(features.map(f => {\n const newFeature = f.clone();\n newFeature.setId(f.getId())\n return newFeature;\n }));\n this._features.next(features);\n this._disabled = false;\n }\n}","import { Injectable } from '@angular/core';\nimport Feature from 'ol/Feature';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class FeatureHelperService {\n\n private readonly FEATURE_TYPE_ID = 'TypeId';\n private readonly FEATURE_LOCKED = 'LOCKED';\n\n private _idCounter = 0;\n\n\n isLocked = (feature: Feature) => feature.get(this.FEATURE_LOCKED) === 'true';\n lock(feature: Feature): void { feature.set(this.FEATURE_LOCKED, 'true'); }\n\n setTypeId(feature: Feature, typeId: string): void {\n feature.set(this.FEATURE_TYPE_ID, typeId); \n }\n\n typeId = (feature: Feature) => feature.get(this.FEATURE_TYPE_ID) as string;\n\n setId(feature: Feature): void {\n feature.setId(this._idCounter++);\n }\n}","import { Injectable } from '@angular/core';\nimport Feature from 'ol/Feature';\nimport { DrawLayerSourceService } from './drawLayerSource.service';\nimport { filter } from 'rxjs';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class UndoRedoService {\n \n constructor(private _drawlayerSourceService: DrawLayerSourceService) {}\n\n\n disable(): void {\n this._enabled = false;\n }\n\n enable(): void {\n this._enabled = true;\n }\n\n private _steps: Feature[][] = [];\n private _currentStep = 0;\n private _changing = false;\n private _enabled = true;\n\n init(): void {\n this._steps[0] = this._drawlayerSourceService.allFeatures;\n // For every change, add the current state\n this._drawlayerSourceService.features$.pipe(filter(() => this._enabled)).subscribe({\n next: () => {\n\n if (this._changing) {\n this._changing = false;\n return;\n }\n this._steps = [...this._steps.slice(0, this._currentStep + 1), this._drawlayerSourceService.allFeatures]\n this._currentStep++;\n }\n });\n }\n\n get canUndo(): boolean { \n return this._currentStep > 0;\n }\n\n get canRedo(): boolean {\n return this._currentStep < this._steps.length - 1;\n }\n\n undo(): void {\n if (this.canUndo) {\n this._changing = true;\n this._currentStep--;\n const features = this._steps[this._currentStep];\n this._drawlayerSourceService.setFeatures(features);\n }\n }\n\n redo(): void {\n if (this.canRedo) {\n this._changing = true;\n this._currentStep++;\n const features = this._steps[this._currentStep];\n this._drawlayerSourceService.setFeatures(features);\n }\n }\n\n reset(): void {\n this._changing = true;\n if (this._currentStep === 0) { return; }\n const features = this._steps[0];\n this._drawlayerSourceService.setFeatures(features);\n }\n}","import { inject, Injectable } from '@angular/core';\nimport { Feature } from 'ol';\nimport { Vector as VectorSource } from 'ol/source';\nimport GeoJSON from 'ol/format/GeoJSON';\nimport { LineString, Polygon as olPolygon, MultiPolygon as olMultiPolygon } from 'ol/geom';\nimport { buffer, difference, featureCollection } from '@turf/turf';\nimport { Polygon, Feature as TurfFeature, LineString as TurfLineString } from 'geojson';\nimport proj4 from 'proj4';\nimport { FeatureHelperService } from './featureHelper.service';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class GeometrySplitService {\n private geoJsonFormat = new GeoJSON<Feature<olPolygon>>();\n\n private _featureHelper = inject(FeatureHelperService);\n\n /**\n * Split polygons in a vector source using a buffered LineString.\n * @param lineFeature The drawn LineString feature.\n * @param vectorSource The source containing polygons to split.\n * @param bufferMeters Width of the buffer in meters (default: 1).\n */\n splitPolygonsWithBufferedLine(lineFeature: Feature<LineString>, vectorSource: VectorSource, bufferMeters: number = 1): void {\n\n const lineGeoJSON = this.geoJsonFormat.writeFeatureObject(lineFeature) as TurfFeature<TurfLineString>;\n // the buffer functions uses 4326 and makes a mess if you don't convert the projection\n lineGeoJSON.geometry.coordinates = lineGeoJSON.geometry.coordinates.map(c => proj4('EPSG:25832', 'EPSG:4326', c));\n\n // Buffer the line to create a narrow polygon\n const bufferedLine = buffer(lineGeoJSON, bufferMeters, { units: 'meters'}) as TurfFeature<Polygon>;\n // Move back to 25832 \n bufferedLine.geometry.coordinates = bufferedLine.geometry.coordinates.map(a => a.map(c => proj4('EPSG:4326','EPSG:25832', c)));\n const overlappingFeatures = vectorSource.getFeatures().filter(f =>\n !this._featureHelper.isLocked(f) && f.getGeometry()?.intersectsExtent(lineFeature.getGeometry()?.getExtent()!)\n );\n\n overlappingFeatures.forEach((feature) => {\n const overlappingFeatureGeoJson = this.geoJsonFormat.writeFeatureObject(feature);\n\n const features = featureCollection([overlappingFeatureGeoJson, bufferedLine!]);\n const clipped = difference(features as any);\n\n // If the result is not a MultiPolygon, the polygon was not clipped in two. In that case, I will do nothing.\n if (clipped && clipped.geometry.type === 'MultiPolygon') {\n vectorSource.removeFeature(feature);\n \n const multipolygon = this.geoJsonFormat.readGeometry(clipped.geometry) as olMultiPolygon; \n const polygons = multipolygon.getPolygons();\n\n const newFeatures = polygons.map(p => {\n const newFeature = feature.clone();\n newFeature.setGeometry(p);\n this._featureHelper.setId(newFeature);\n return newFeature;\n });\n vectorSource.addFeatures(newFeatures);\n }\n });\n }\n\n\n}","import { inject, Injectable } from '@angular/core';\n\nimport { Feature } from 'ol';\nimport { extend, createEmpty, buffer } from 'ol/extent'\nimport { CurrentItemsService } from './currentItems.service';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class ZoomService {\n\n private _currentItems = inject(CurrentItemsService);\n\n zoomToFeatures(features: Feature[]): void {\n const extent = features.filter(f => !!f && f.getGeometry()).reduce((acc, feature) => {\n return extend(acc, feature!.getGeometry()!.getExtent());\n }, createEmpty());\n\n const bufferValue = this._currentItems.profile?.highlightBuffer ?? 0;\n const maxZoom = this._currentItems.profile?.highlightMaxZoom ?? 21;\n \n const bufferedExtent = buffer(extent, bufferValue);\n const map = this._currentItems.map!;\n\n map.getView().fit(bufferedExtent, {\n size: map.getSize(),\n maxZoom: maxZoom\n });\n\n }\n\n}","import { inject, Injectable } from '@angular/core';\nimport { Feature } from 'ol';\nimport VectorLayer from 'ol/layer/Vector';\nimport { Vector } from 'ol/source';\nimport { Circle, Fill, Stroke, Style } from 'ol/style';\nimport { ZoomService } from './zoom.service';\nimport WKT from 'ol/format/WKT';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class HighlightService {\n\n\n private _wktFormat = new WKT();\n private _zoomService = inject(ZoomService);\n\n private _style = new Style({\n stroke: new Stroke({\n color: '#0ff',\n width: 3\n }),\n fill: new Fill({\n color: 'rgba(0, 0, 255, 0.3)'\n }),\n image: new Circle({\n fill: new Fill({ color: [175, 202, 10, 1] }),\n stroke: new Stroke({ color: [40, 112, 133, 1], width: 2 }),\n radius: 5\n })\n });\n\n private _highlightSource = new Vector({ wrapX: false });\n highlightLayer = new VectorLayer({ \n source: this._highlightSource,\n style: this._style\n });\n\n clear(): void {\n this._highlightSource.clear();\n }\n\n highlight(feature: Feature | Feature[] | string, zoomToFeatures: boolean = true): void {\n \n if (!Array.isArray(feature)) { \n\n this.highlight([this._ensureFeature(feature)]); \n return;\n }\n // If the feature has a style, it overwrites the style of the layer, so I create a new feature without properties or style.\n this._highlightSource.addFeatures(feature.map(f => new Feature({ geometry: f.getGeometry()})));\n if (zoomToFeatures) {\n this._zoomService.zoomToFeatures(feature);\n }\n }\n\n private _ensureFeature(feature: Feature | string): Feature {\n if (typeof feature === 'string') {\n const newFeature = this._wktFormat.readFeature(feature, { dataProjection: 'EPSG:25832', featureProjection: 'EPSG:25832'});\n return newFeature;\n } else {\n return feature;\n }\n \n }\n\n}","import { inject, Injectable } from '@angular/core';\nimport { Interaction } from 'ol/interaction';\nimport { CurrentItemsService } from './currentItems.service';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class InteractionHelperService {\n\n private _current = inject(CurrentItemsService);\n setAsTemp(interaction: Interaction): void {\n interaction.set('temp', 'true');\n }\n\n isTemp(interaction: Interaction): boolean {\n return interaction && interaction.get('temp') === 'true';\n }\n\n clearTempFromMap(): void {\n this._current.map!.getTargetElement().style.cursor = '';\n this._current.map!.getInteractions().forEach(i => {\n if (this.isTemp(i)) {\n this._current.map!.removeInteraction(i);\n }\n });\n }\n}","import { inject, Injectable } from '@angular/core';\nimport { CurrentItemsService } from './currentItems.service';\nimport Feature from 'ol/Feature';\nimport Select from 'ol/interaction/Select';\nimport GeoJSON from 'ol/format/GeoJSON';\nimport { Polygon as geoJsonPolygon, Feature as geoJsonFeature } from 'geojson';\nimport { booleanIntersects, featureCollection, buffer as turfBuffer, union } from '@turf/turf';\nimport { FeatureHelperService } from './featureHelper.service';\nimport { InteractionHelperService } from './interactionHelper.service';\nimport { DrawLayerSourceService } from './drawLayerSource.service';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class MergeFeaturesService {\n\n private _current = inject(CurrentItemsService);\n private _featureHelper = inject(FeatureHelperService);\n private _interactionHelper = inject(InteractionHelperService);\n private _drawLayerService = inject(DrawLayerSourceService);\n\n private _selectedMergeFeature: Feature | undefined;\n private formatter = new GeoJSON();\n private _formatterOptions = { dataProjection: 'EPSG:4326', featureProjection: 'EPSG:25832'};\n\n private _selectFilter(f: Feature, typeId: string): boolean { \n if (this._featureHelper.isLocked(f)) { return false; }\n if (this._selectedMergeFeature) { \n const previusFeatureObject = this.formatter.writeFeatureObject(this._selectedMergeFeature, this._formatterOptions) as geoJsonFeature<geoJsonPolygon>;\n const bufferedPreviouslySelected = turfBuffer(previusFeatureObject, 5, { units: 'centimeters'});\n const featureObject = this.formatter.writeFeatureObject(f, this._formatterOptions);\n const bufferedFeature = turfBuffer(featureObject, 5, { units: 'centimeters'});\n const areNear = booleanIntersects(bufferedPreviouslySelected!, bufferedFeature!)\n return areNear;\n } \n return this._featureHelper.typeId(f) === typeId;\n }\n\n startMerge(typeId: string, done: () => void): void {\n\n this._selectedMergeFeature = undefined; \n this._current.map$.subscribe({\n next: map => {\n const select = new Select({\n layers: [this._drawLayerService.layer],\n filter: f => this._selectFilter(f, typeId)\n });\n this._interactionHelper.setAsTemp(select);\n \n select.on('select', evt => {\n \n if (this._selectedMergeFeature) {\n if (evt.selected && evt.selected.length > 0 && this._selectedMergeFeature.getId() !== evt.selected[0].getId()) {\n \n const feature1 = this.formatter.writeFeatureObject(this._selectedMergeFeature, this._formatterOptions) as geoJsonFeature<geoJsonPolygon>;\n const feature2 = this.formatter.writeFeatureObject(evt.selected[0], this._formatterOptions) as geoJsonFeature<geoJsonPolygon>;\n const bufferedFeature1 = turfBuffer(feature1, 5, { units: 'centimeters'}) as geoJsonFeature<geoJsonPolygon>;\n const bufferedFeature2 = turfBuffer(feature2, 5, { units: 'centimeters'}) as geoJsonFeature<geoJsonPolygon>;\n \n const newFeatureObject = union(featureCollection([ bufferedFeature1, bufferedFeature2])) as geoJsonFeature<geoJsonPolygon>;\n const newFeature = this.formatter.readFeature(newFeatureObject, this._formatterOptions) as Feature;\n this._selectedMergeFeature.setGeometry(newFeature.getGeometry());\n this._drawLayerService.source.removeFeature(evt.selected[0]);\n }\n this._selectedMergeFeature = undefined;\n map.removeInteraction(select);\n done();\n } else {\n this._selectedMergeFeature = evt.selected[0];\n }\n });\n map.addInteraction(select); \n }\n })\n }\n\n}","export class IconsConstants {\n static undoIconBase64 = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAyZJREFUSEu9VktPE1EUriuCYeHOpb9FF4YoCw2kiArESI0viERBBQ3EBTEE5dHaBy20pUwL5VU6FSqvVp4tBfqgnWlLOwWEYEwM6UII0fg5U5BCFFKgOsnJ5M7ce77znXvPd+4p3s7T3NycHY1GKzY3N89tbW2d/v39KO+UlJSN1NTUpbS0NJFAIBDvrlWpVKaamhpYrVa43W6Ew+FjGbeW8yGTyTjzxwDkcnmeWCw+lsPDAlGr1VAoFHU8iUTyaWxsLOkADocD1dXV6zwW5QdN00kH4NhVVFSAA/gnzk8MwLARMgwTs4P2IiEGNjZ9bZZ5NPS7UG2cx5v3FN6a/RCag2gdD2PUt5o4AM1E4pPZyAiDE+VtDhQRcyjUuiAg3Lijo3CvM4CinhBKSQZlJgaVZi9GXH8y2ceACizgqWoC9cY52D1eSEk77rfMoqDVhUzFDC5JnUiXuHBZQeFKSxD8Ngb5XSt40PcZxX1rKDGwQDZvLMBQaLuO9gH4/QE8Vo7jVtM0nrTYcVc9ixy1B+lSN84LZ3Ghzo7LdaO4KpxAlmQK/EYHspU+XO9YgqD/Kx4NRVFsXIbJFi/SfQA0HcBLrQ0POygUdtDIJWhkKL24KJpBVu0gymUkVHoS3SYzjH3D6CAHoegcwitihA1mDgW9qygc2cAzgxc2bzDOgK3k2MDj86OMmEJuqx83tAu4Riwgs9mD/PoBtBvMoJ1zWGbCWFzcm+sQmACFYYsFr9s/4rY+jBzdIuTkttzEGEil0m0AL4VSlgGfCCGvewUFxjUUmlZQrpuCfXaePY6H61OAovDOYMFzlRUfLNNxAE6YOACfj0aJfBQZYgeyFE7wFS7c1PiQKZrCC+0EIpE9J+wgMQwtwMKyiQT/kqIQ+5MkR6A3DUPfOwCiywRtdz8adSSMg5OIJKiwseLbmZtQoR1Xuk8sFYkA/zcGP4M7m5JIVEeZE2PAtsovNpst6ZLNtc+qqqpvPPaYNmg0mqQDKJVKiEQia6wvC4XCdb1ej2R0Ns4H57y2tnazp6fnzO7NoqmpyVRZWfmdy9tJjPPBXiIm2U55lnP+C/4QIs8xdHrCAAAAAElFTkSuQmCC';\n static redoIconBase64 = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAwVJREFUSEu9VktPE1EUxhXBsHDn0t+iC0OUhQYCogIxUuOrRKKggqaNK2PAUlr7gNIHZVpooS3TQhsKtBKgrX3QltoX7SCKwYVG2dAQjZ8zjbzkVbA6yclM7tzzffc755577rGC349cLq9cWVnhZDKZU2tra8fXxw/zLiwsXC0qKlosLi4Wslgs0YavUqm0tLa2wul0IhQKIZ1OH8kYXwZDKpUyFs8SdHV11YhEoiMB7rcQlUoFmUzWXiAWiz/4/f68E4TDYfD5/G8FNMuPWCyWdwJGHYfDAUPwT8BzIqAoClk7YtIPVDDsTaJ3Kg2BLYmXtjjahqN4Qc6hwxpEn2MOVt/+od2TwOBJgGuLoNlCoclMod6Ywq2BBG5oo2ARIbA1QdQTAbT0eUGYZpHaojC55XtXAq47gkYThYaRZdwZ+YTawSVU9FG40JPEeVkUJeIgzklmUSbzoa43iNs9fkjMHsQSSfDJAB4qpzdyuoPA4k6jgXyPe2MrYFm/4LJ+EZWKt6jo9KJc7MJFwTTOt0/iTLsHpwV+lEhCqFKFcVPlx4MeD651v8F9xdTuBDZfHI9MEbAnVlE39JF2CuAZMQHZwBj0ZjvIkXEYLDYodWa0SM0o59lxVuhDqSKCaiIGtj6Gu/oonmrc2wnoSs4OcMkwqrTvcF2XxvP+1xh3OGD3x+l/qR3beCyQQL/Jhlr+KMrkYVwi5nFFM4/q3jiaCdd2AolEkh0gSRKPlU68MjmQSu0E3XosUFQaoUgMLVoX2JYl1JHLqDHQuSJSaPpTAXMwMc4UvVKNbTNBBx14TzTTKBO6cFVN50gWRLlsFqUiLxq7JncP0cLCQraoDgJe/0/aZ9CpNUNjsIIYtEA3NAqdZRxm88TeuyhX8FznHVjJuQLtNe+/EfxMJpM5x/4wqrIKhELhZ7d7szgOA7DfXKZ9trW1rRbQ27RDrVbnXYFCoQC9eGe2LwsEgq86nQ756GwMBgPO4/EyRqPxxMbNoru728Llcr8zcfsbYzDoS8QM3SlPMuC/ALEMIuD09rJvAAAAAElFTkSuQmCC';\n static trimIconBase64 = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAA0BJREFUSEulVmtIU2EYPv0SdVFqZIhYUBhECwQRIkMY9MPAKEi7QFos+ydC9CMR2spcdVhM2lhNN+ccgi1M05kkistpTibWQJqNNMUupObcTIdEvJ3303PYOe5qg29n5+z7nue9Pu/ZQW1+GhsbL/h8PlkgENi/vr6exD6P55qQkLCWmJg4KxKJNOXl5VrubFNTk1WpVILNZgOXywVTU1PbWngWMXQ6Ha5JQtDQ0FCq1Wq3BfjWNQsVbYsgqV+Gj55pHobJZAK9Xl9HqVSqGbvdHjOBY2IG7r2eh+y6VUij/VBmdEOhYQKqrQs8DKfTCTRNeym5XP7H7XZHJEDrHr35CRK9D9Ie+uCUaRL0g31gc7WRhb+RUBhamUwGFH6Fi/nTgR9wrtkLotolKDROw/2eEQ6UBWevOZrv0DL8jYcVkqDLOQcXW7yQ+mAFTmq+wu3OMegd7wgLzBIgOXoYbCyPQKPRwL7L9ZBZ2Qc3O8bh5Wh3VNBgL9CIPfQKYI5YEh6BVCoFKiMXDh85CCWlZ6KCX7p2luyVK29xezHhWFUhCcRiMVByIJuFB4MtRcCcvKNkBYPjHvR6L73KlSzPg6ysLEKAh5BASILPjxfkQkrqLqisuh7WQ8wbFgd6sSUHVHYRAWFJMjLToaqmgpDh72RREphfqSOGr65/EHK1/q0EyMiGiPWESk4HspjcFF8pAqr4BQHH//s/tEGKYo27x+cF9XPk/pDKB1iNUT1Ay9GD7Lz8jZB1b/RBiflTxOtVowvKWn/xCSQSCecBhgMBhc0Uy33rSA+RjxPPlvkEbBWxyRRWSCRw61gnaUjsZqyiG88XAYVwa4g2+yBWcLp3iEhIas0KkZSoUsEmOZK1zUO9cN78mYhevs5PRFAo1SEbLbiKhATYQCgfWB0HHq9BddcCTxLCiSUJESPXfz0eD6lboQd3ukeJ4KHwoQBi6cUz7QgBMyrnHQ4HR6AdGCB6L7q7AKcNS1xXxgOMe3F8KhSKVYqZnU/MZjMh2Fnrh2Pq32RivXd/ictaoQFGoxEYhbaRuaxWq70WiwWiTbZYvEAMBGdGcaC9vX0392ZhMBisOD4xbv+zEIN5iXjHDPx0BP8HrKKC57UCn9MAAAAASUVORK5CYII=';\n static deleteIconBase64 = 'data:image/png;base64,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';\n static editIconBase64 = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAC1klEQVRIia2VS2gTURSG/5tMJ02chLxDUtpGBKuRgIuooJv6IhTpQlRcVKqLlqzcuRQLXQmCIPUFsTVdKYKuChat1EUXwWAVFSXUB5K21trmUSfPyWTkxrYkzZikqT/M4t5zz/nOmTl3DsGqRkZGziYSiYF0Ot2ezWY1aEAqlSqlVqu/cxx3s7+//zaNUAQEAoGxpaWlEx6PBwaDARzHNRIfPM8jFoshHA7TZdjn8+0ifr+/VxCEUa/X21DQNWVFApVSWl9PTU1BEIQbDM/zgzTzUj36rMXV1yaomYJsMFEixdIDx36gQ58r7pUGp3K5XJicnDzPJBKJFrPZXGYceGXGpb1RHG9NQQ7x5pcKl4MWnHtux+jRBbiM2YozRqMRyWRSz0iSxLAsW2bMiQQ79Tm0aQXZCuZ4BqZmET0dKzgz7sDT7tl/nlXI7tahVJ7AtyeOC7sTODXuQDjOyjo1BKDZFiSC3gk7vq00IZpRoueZXfYs0wiglcvjgXceL+c0YIiEA7YMBkOm/wegot2z1kG8oMD1t4bGAO+WVQguqKEkUoXN2FxAt5Ov6l8TMMszCC02g1FUAhyaPLraq/vXBOy3ZWBTi1CQShu9iPSC5QsyxnoBE5FtuP9JB1ZZaWvjBFw7tFjVvyaAvmOPNQ25HNWMBA0jgRe2UMHjrxzuftCDLfsGBAUJ2K4TcKdzoap/TcDpHb/R6UiDlCTZpJCKD+2sLVfw5IsW/o/lFRy0p3Fl37Js624a0NWehNuULesivapQV/AigBBSEEVRoVSWt0le+huR/jXpU03S6oyQBXActxyNRi0Wi2V983BLCrfe6/FiVgOpjkTTeQXMG5Kg45POaEar1T6cmZm5WAq4d6R6Z9Sj6elp6HS6ULGuoaGhmM1m07vdbmwcPptVLpdDMBhEPB7POJ1O+/qLGx4eHotEIl464bYCIITkrVZriGXZk319fT//AGJrAtxT4sAGAAAAAElFTkSuQmCC';\n static splitIconBase64 = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAA79JREFUSEulVv1PU2cULtOsopjshxl/MdFk+00TM5P5k38BkqjZFKYEP3Hg2HQzaoyxvUAg0CDdoNTUlpZKGK6AFSmi6GahqDVVoIlZXSN+RuMHSMpsazH6+J63vZd7WyAlNjn9uu/7PPd5znnPuRmqxMtqteaGQiFtNBpdHovFFor/z+VTrVZHMjMzH2VlZRkKCwuN0t6mpiZXTU0N3G43/H4/RkZGUqLl2lNk2yamvSaup72EYTKZKO5yArPZXGA0Gmfc6L3zENmNr/GN4TlUAmYlkN+Y3W6HxWL5XaXX6x96PJ5pNx48N4oVJ8LQdN+EcME7JwKfzwedTjeuEgThXSAQUBCQHStORJDbEoTr1nm4/R0Jgg9YUvUWa40RHOt6hX7/o1kVabVaqOhNlCa34/RALwcWgyvQAuU9dznB4ooY+z2JeaWTM5IqCOR2yIHlBPNLo7g67ET/0FR0+wZQ5BibIhU+IEOI8ZuWCFb98QabrfckO2YiyCyflBQd0RxQKFQoTRSDRPBVbQS/nB1K2SAHEZP8p+skaoylyMnJwZHjB5iiKRunchWvNolgPavvJRUhBcFfPaewfVc+zK21KNMdRfHPezjonqId0FQc5t873Xb8M+RIzVWyAkruPOEtLH1X+OLahgpsK/gBGzdtwP5Dxaiu0+I38xlepqIVW/Pz2N23s98UScWQTEByvm14g9V1z6XFBEx3r/Q2MKuNM1pEBN23HuMzpsLli9f9zsICXPS2ygi6mAJ3CgFZlZYCIllWHUG29UFiQzuuyuTHk3yDXyPvDbYqUBEQAVl6uqNBdiCTkiwetOpLL6Aui+DSoBOaysPoudHKSQiwpNaE1dv1IO8pCJxI5qSAiNTlURS3DfPNW/I247vvN0mAuw2nOJloCSV5a35u+hYRQX7LGBYJ//MKKfl1Lyxn9ArpIvjfg/HypHNAQT2LmmK2PcjaSFh5DuRttnfwMV/wU/swujx2Xvfy6pAnVNc7gG1N/+FrfQhZzFpq62UXXqIv0QRTmp1ItLI+hC+rwjwXyS1gb9sdrDn5jJ+JdaYJHDo3hi7fk2m7Kidg7fp9MBhULKBkL6saxT6mQmwFVEUZrIx/bBuDtf9ZWoOHE7BR+dLr9So2/Bu8j4WaMBaUR9B9+yxXoe30zGng0PisrKwMq9jsrGtublYQ+ANemPsuc0B5fF4Wb8PphM1mg8FgcPO5XF9fP+5wOJA82dIBSl5DGATORnHU6XR+IT1ZNDY2umh8km+fEoTBHiKus4G/lMA/AjvmjLaem6aqAAAAAElFTkSuQmCC';\n static measureDistanceIconBase64 = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAyRJREFUSEulll9IU1Ecx69t/gkMiuoloSAIsr9gRM4yeujJ6q1egoIehDJqD2EQPexOt0nOoA2XEbFJlEqmKVbmXybDNGbTpTQbbNawUNycM50Np9/OOXrXrppzOjj3jnPP+X5+v+859/xuArf4UygUmcnJyZq5ubnD4XB4h9Afz10qlXolEkl/KBQqViqVHyJzNRrNvaKiIr/ZbIbdbofL5Vpz07WOIPVgGCknQ7BY+0E1DAaDn2hWMgCJ/Ixer/fHK5quC2IT70YS70La2Ukkyny4WumPBGY0GicKCwtzOULqslgsMSOmkUaLnnoyDH2bGWZ7DWs5xiHsLpmJ6FitVqjVajfNIOhwOFYExBIVxOm9qus9OIVbpEO0SR+5CPZknQ7ikGxm1UijRZf+T1W5cb9hLKInApSWjkCSNYMEmR/7c72i9FcTjX5GbaM2CgEvy6Cx3YMjN0Yjvq5VWBhH14Qu/IqAKxUT4HhgV/FvGNrb1w2RKl141vGLQUQZyGt9OFE2BfmLXhzQedFke7MuyFHdZxw3TC0HCGk5nAO4XOFA7ivy0ixuwXju+XU92Fyw8D6IMnjdPYyXnT/x1enGl8E+sqcDqPzYuC4I3a7vejxiAH0L6Rq09n5jdF3bJ2RoPXjbWR03ZM9DNy6YAmLAxecBtgbdA98ZwGYbxLb0euzNiA/Al3QjPceLRHI2Ldum0edRL8kkO7sO3L4Wltmam2IenIyMl82LAdR/ug7xHHrCWG3zCK5VjbO5d9RecJeAYzenxYBzpkmkaf8dVrFALTYPE+yw/2DZbVFPsw1C+wSbRRZRwPnyQMwMqEhSwTgTFYQeNI0y0NKgVl2D6MF368eQ+XiKbWPaf7tmnFkiAP6XLQPwPD/rdDrZ5ObFtPscQ5DXevGI1AA6+Xq1j1lAI41lXfRzBiAFx6HROLEz0wUurQH0VM2v8zELBMtiRboSlJZeUtHGOHK5lZfXEeS2l4HjyhmACtJohUWLJ2phrMlkmlWpVE9ZXaZlUy7v/KPWLpyCG2m0OlJxoukkFqVEvixI/eRp+aS+bbAFaeREYysV/wuqNrioSoYgAwAAAABJRU5ErkJggg==';\n static measureAreaIconBase64 = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAnhJREFUSEutlt9r2lAUx92TOHzY2x73Z+1hY4WtMmk7hxta2mGv4g8yjSgmuFp/BllHlSmUOlaGkKmzrtkGloLFImyveyk+bCJjnN17WHywSadmgZPAhfP95HvOzT25Zvp75XK528PhkIxGo1vj8fi6uj7P02w2/7RYLN+sVqtos9mSk9xCoXDA8zzIsgzdbhcGg8FCwXKZRiqVYnGGgHQ6fS+ZTKJgPBNZSFjrhSRJgkwmEzfFYrGvzWYThZfJXXD4H8Hxp4+GQYqiQDgcvjB5vd5fvV4PBR+TFRDKPLiCTlC+HBuGEELAxG6qRQZ4XifAvfT/F8glwAPXEiw574AjaKcQn2GIpoO4zMFG2QHu8hoEpS1DEE0HzMUaeQibZSd499cNQTQdbB/FUHir4gJP5QnGok50HbAerJBlIBU3+GvPMAKSZ+5yaTrIKy8g+i6AW3aVQiKHPuAOCUTrgbkhurtog3+KgEbrPUKC+x6Iy8G5IZoOdk9ykGxEEcC+j0ZbxnLF6xwIdIeJrcjMTv7pQP0A250PCInUvAhIHyXAP0NPNB2UTotQO69MHKgQ1Yko8wjYoaE2Xu/01XWwGXNfAjAR5oT1ZKeVoBAR2Ia4CqLpoHq2B2/Pq+AgdoRohdO3CpKyjVH8nJ6Ua9qJrgMX58DEV7Ths4Wk2XgE0OP6d7/fnxzXb+jbvz7dhb0Taa5gOazxbnrUq04QQEfl906ng4tXlUWvXNPrdnIf+CyHozcUCv0w0dmZKBaLhofLdP3z+TyIoijjXBYE4aJUKoE62RYd+iyPaTBxOopH1Wr1xuTPIpvNHrDxyepmJJgG/Ylo04F/k4n/AeQ5tgsVAwfBAAAAAElFTkSuQmCC';\n static removePointsIconBase64 = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAzJJREFUSEulVltIk2EYXldiLAiNuqyLqLsg6K4iEbpQyJodrIs8oLNERDKiYtBWHtKxmrg1W+7gXIJZpsyZOArnoZxMjIE0GWlKJ1JzbjaHRDzt/egfbf9smw2+vdv//9/zvKfvef8tgj8fg8GQ5/P5pMFgcPf6+vpW7noyNiUlZS01NXVeKBSqxWKxJry3tbXVqlAoYLfb4XK5MDMzs6lFewlDq9XSmmYELS0t+RqNZlOAQ655VHQtIfPRCt55ZiMwTCYTdDpdo0CpVM6NjIwkTOCYmsOdFwvY1xhAutyPAqMbWfopSKyLERhOpxNyudwrkMlkP91u9z8JyLuGgW/I1PmQXu/DcdM0dMMvYXd1sUW/iTA6tVKpFAL62ijnzYNfIWrzQli7jCzjLGr6x8KgHDhnD6q/oP315wismAS9zo843+5F2t1VHFV/wg3LBGyTPRsCcwREThH+7SyPYL8ygL1KH6p6JvF8vC8MqjbUI+/C2dA6x2xDk5RHSE7skK+CasSR8AgEMvA2XrlejpOnclCjkODpgI5ZIiouLeQ9SwWnrkqY4H5zNQOLzjf9Lyy+iJvSqoh7FPVOeSDcsnEjIHAuHeaeByirKAFZItA+ViA7O4tHTnWj5qAo4hJkZBzDM5uOgRSV5CMn5wSzXEQikYhH0PhqGIc0/sQIKPdUYAIkzwmci6Dd0ozc07kx00eNQt0YN4JrksqYxSRCKr74clHs+hhdKOj4Hp+AgKgOl8qLYRkyMTCyXGcNjHfwCDrG+pl8HH64khgBgVZeLQPlm1vkOUdI960TFnYg6TRTF5U+WQIJYdwUxWrPv6/JbaNMQtKqV5mkxJWKWActmqRt1IYz5vdM9I5o/UwEo6U64YPGgdMBIvmg7thzbw2S3sUISdhILFmKQnL9y+PxsL6NjuBW3zgTPBI+EkBqvWSmHSMIjcoFh8MRJtAMDjK9F95eRLZ+OXwqkwGmZ2l81tXVBQSh2dlkNpsZwbZaPw6ofrCJ9db9ISlvox0wGo1Qq9V2NpdVKpW3s7MT8SZbIlEQBoGHRnGwu7t7e/jNQq/XW2l8Ut7+ZxFG6CXiTWjg7yLw3x28rmpAjitLAAAAAElFTkSuQmCC';\n static wktIconBase64 = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAA4xJREFUSEulVltIk2EYXnRhxoTSooNRRsebAsO6sLpZdJEXQpEYBXlRdmd2unBZTSOtxmLRxnK5OXVGJZgrtUgCl3YwjGIiLSQr6URZrVkmEvH0P599P/8/M8sG7/7v//Z9z/Oe300w/PpUVFRkR6NRy+Dg4LyhoaHJcv9fnnFxcd/i4+N7jUajMzc316XeraysbLTZbAgGgwiFQujp6RmX8C4x3G435YkgKC8v3+5yucYFeCvUi7y6DzCd+4zH3c90GFVVVfB4PKcNdrv9RVtb218TtHe9wNFr77H49ACSrP3I8YWxwduFwsY+HUZHRwesVmvEUFRU9D0cDv+RgNqdvPEOJk8USSeiWF/1BJ7WmwiG6oRwTcJY11osFhj4NZrPz7a8xcbqCIwln7DB9wzHrt9TQSW4fKY63+D8ndc6rN8SNHS8xJbzESQe/4K1zlcouPoAzQ8DowJLApLTQq2yKkEgEEBnZyeW2Aew0B7FNlsNPE1+FdR9wSrW/isOIRKUa/mbs8aGKbtbUXmpAcSjmM3mYRelpaUhKysLhiLgYMluKMmFZalLBZDdU4zkubNQd9Mj9uQ+wbkv37lOmDFP3E1JSRFiMpmGCQhOEhJk52SKixQS7Mzbqq61BFzzzLV7NapFl+83YeK0Bcjfu1+4SnWRkkmCkQS8mLFxnar1GtMqVUtJIH+X7tEGfNL0+cjcUaAnoL9ommHXAwEs3cInQWkFQaTWPBurvSSZljwHyZlH9AQ0R1iQfkDnDukuEkkCgtMqEtCS2HTlfmLGYTAbdWkqYpC4aITvZYC1FnCtdaOWhOdXbMpDzsWPegKRRYp2UitqLV0hAbRBZlb9zoqZc2YjddMerC77rCdgoAmYb94pzJYAMg2lBdp3KsM7pWUloiBZzcyilVsKwUY4opIZZK25zBISaQtLW2jW5ttIt1zB1EPDLYWtQhatLk1leTNNY4MW+159uxmb/U9F01vj7hdNMLZVS7yRFoxCwALaF3go2kjKqW8obOgD2/ZYg0kQKL7/0d3dLQ7HWnCk6b5oeGx8bIBMvbFARzQ7ZVS+b29vVwlcLS2i3xuL+5Dh/QS27H8BlWc5PktLSwcMyuw84/f7BUhCST+WO76KifUo/HxcwJLA5/PB6XQGxVx2OByR2tpajDXZ/sYSYhBcGcWD9fX1U9R/Fl6vt5Hjk4H5HyGG8ifirjLwZxD8JzKAKKzuzS8LAAAAAElFTkSuQmCC';\n static pointIconBase64 = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAA0JJREFUSEullmtIU2EYxxdRSSgFi4SCbkTYl8oP4YduQvlhRpaXlILMpStF0jLCwua28rqOm7iba8dtppWiNlnacCleUpcxraikRKgMrPUh6UNliTz5vHQObmd2Nhu8e7edc/6/97m8/3dLBH9fZrM55dvXj7Lp3zMbp38tXcn8HswcsmL2R8jyZR9CV63TSiQSPfus1WJoo6gcePxgD4z2RsDE0/WLGvgsatzS5YDRSL0hAJPJlKqfE1+M6EBPFOTWq+CQrgvGXFu8NOq0GUDT+kqBWql4P9geFTDA3bcLipvyYVvFOKwp90Ca5RWI6GGQNiq8NJ517gClUjolkMulM+MDm/8JwNVRLRfgoKEbhKUeiLE+B7qvE3petJCBnxHomwWZTAYCfFsoPSb7GUikbRBa/BlE5tdQ5HCxoow4M0dqxqDRkeSl5RfgeBQDJ833QFjigf2at3DF7gbnSOuCwgwA4Rjh/MVyABEVY7BVNQl5rSNwf6idFdWayyDlxPG5kUzm8ioZB4iLwJpgjRgIByCQA+fBi/nZcPRYHBRRBdDUQZMZQeln0zj3YsGxqwIGqAw3iJhvvvF7WvopuCrL87qGUa8t+8S2LG8EKM6ko65VB1nnMwBnBBjrKYiNFXHgWDdsDoyCFxAdfQCanTQREWekQlzcETIzEcXHx3MAlV19sLtqODAA5h4LjIK4chRnIrhjN0BCYoLf9GGjYDfyRnC5INdvMRGIxZdkiv0CxJYREFut/AAUwjqcy04He28tEcOZ6ayOoQYOoMHlIPaxV+sODICiuZeyAPPNDFw5A8TrbW472ZC4m8PLJyGz1gBohLwp8tee839TOvuJhQive4il8FqFv43mC7nd74SkulFievu0LmKCvlYd8EZjxHEDoX1gd2y6OQGFjYVelrCQWZIUyeWnZ9892UD61jeCwvYhYnhofGiA2HrBHEwEQJVJv7idkSxA391N/D5MMQmHqx+yuzIYYbwXj8/SkmvfBUajpuquPpUAwoo8sLNylJxYLwe2B7Va3wVYLCLQapQ95FzWqEunmquTge9kCyQK1EBxtUrx02azrWb/WdTU6Nrw+MS8/c9ADb2OGqRpOhzF/wDMPgEKuYUfcgAAAABJRU5ErkJggg==';\n static polygonIconBase64 = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAyRJREFUSEulll9IU1Ecx69t/gkMiuoloSAIsr9gRM4yeujJ6q1egoIehDJqD2EQPexOt0nOoA2XEbFJlEqmKVbmXybDNGbTpTQbbNawUNycM50Np9/OOXrXrppzOjj3jnPP+X5+v+859/xuArf4UygUmcnJyZq5ubnD4XB4h9Afz10qlXolEkl/KBQqViqVHyJzNRrNvaKiIr/ZbIbdbofL5Vpz07WOIPVgGCknQ7BY+0E1DAaDn2hWMgCJ/Ixer/fHK5quC2IT70YS70La2Ukkyny4WumPBGY0GicKCwtzOULqslgsMSOmkUaLnnoyDH2bGWZ7DWs5xiHsLpmJ6FitVqjVajfNIOhwOFYExBIVxOm9qus9OIVbpEO0SR+5CPZknQ7ikGxm1UijRZf+T1W5cb9hLKInApSWjkCSNYMEmR/7c72i9FcTjX5GbaM2CgEvy6Cx3YMjN0Yjvq5VWBhH14Qu/IqAKxUT4HhgV/FvGNrb1w2RKl141vGLQUQZyGt9OFE2BfmLXhzQedFke7MuyFHdZxw3TC0HCGk5nAO4XOFA7ivy0ixuwXju+XU92Fyw8D6IMnjdPYyXnT/x1enGl8E+sqcDqPzYuC4I3a7vejxiAH0L6Rq09n5jdF3bJ2RoPXjbWR03ZM9DNy6YAmLAxecBtgbdA98ZwGYbxLb0euzNiA/Al3QjPceLRHI2Ldum0edRL8kkO7sO3L4Wltmam2IenIyMl82LAdR/ug7xHHrCWG3zCK5VjbO5d9RecJeAYzenxYBzpkmkaf8dVrFALTYPE+yw/2DZbVFPsw1C+wSbRRZRwPnyQMwMqEhSwTgTFYQeNI0y0NKgVl2D6MF368eQ+XiKbWPaf7tmnFkiAP6XLQPwPD/rdDrZ5ObFtPscQ5DXevGI1AA6+Xq1j1lAI41lXfRzBiAFx6HROLEz0wUurQH0VM2v8zELBMtiRboSlJZeUtHGOHK5lZfXEeS2l4HjyhmACtJohUWLJ2phrMlkmlWpVE9ZXaZlUy7v/KPWLpyCG2m0OlJxoukkFqVEvixI/eRp+aS+bbAFaeREYysV/wuqNrioSoYgAwAAAABJRU5ErkJggg==';\n static lineStringIconBase64 = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAA1BJREFUSEutVmtIk2EYXb/EWBDZ7UdQP6L+WZkQEfVDCNR/gWAQqCAKQhJJUSK0KV7nZdbWdLk5pyjeFbcpzsuWSzfRTQfS5ty8X0rNOW0OiTh970cbbqYu5+Dd923wnfOe5znveb5TjL+fysrKWIfDwXK5XFd3d3dPu///n2tQUNBOcHDwHJPJ5CclJQk8z1ZVVcmLioqgVqthNBphs9mOtcizBEMoFJJlpgkqKiriBALBsQA/G+eQ2rKOiE+b+GqZ9sKQSqUQiUSlDC6XO6vRaPwm0E3MIqtzFTdKnQjhbCFeYkKUeAIZ8jUvjJGREXA4HDuDzWb/MplMhxKQ3RV0f0eEyIGQfAceS80QDfRCbWyhF7knhL6lZbFYYJCvg2peplrBk2o7mDkbiJJMI7tL6wF1g7uvd/jLqB1c8sL6J4FsZAFPa+04l7eNh/xFvO0YhdLQfiCwm4CQE4V7N7uP4CbXietcB9LaDWgdVhwJulcF2cR5zjZIj9wk+wgYbPgN2mtsRbWuD2WaAYgGVegZa6MbTlx1IgQyvQzPOhcQLt3E/fJvKJB8RPOQDBc5To9lA1KgMMiQLLPg3vtFhL/WIvHVS/SMNtB9I+YgKgIiICUpUXYjJrsS0WkFyOZloc/QhNK+AYQLtgIn8LXp3t/EKMSNASmQUyWKU8zRPXgknkdJnRD9Y020SRIkRsTX/wiMoMMgR2znMm619CMscwXJ6eno1TegXttFu+lB+ebJEVxhLyIyhY3bpbO0i5Ib1kGCMKASEQWR7esIbVbhMmsJ9xOLIVXPHH6S/Tlo1V+UiKmx4kLhFsLqdhHaogJRkJqeB9/Q9FsBiQ0SH8Qd14p3kCFbQ/f4PBKU21QPjiCg4vq3xWKhpfkqeKcYpg8OCT4SgMR67hjQT874R0CNylWdTuchEKhUdN4zM9cQLd7wnErfSDeYZ5CitONu7QZVIiqD3uR4lYiMz9zcXCeDmp0fampqaIIzOVsI5f2kJ9aYybthvgSTUzbIhifxnNOM2BeFyMkvgtls9iiUSCTg8/lqei7zeDx7Y2PjviYdNfynpqwwGMah1eqg1+thtVppDAJOjWJXW1vbWc+bhVgslpPxSTofyCIY1EvEEDXwLxHwP1I4uvOad9ZNAAAAAElFTkSuQmCC';\n static printBase64 = 'data:image/png;base64,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';\n static drawBase64 = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEwAACxMBAJqcGAAAAilJREFUSImt1UlsTXEUx/FPJyFNTEHQEE2R1FzRRpSILSsrFlaEjSWJhQUrC7GzEjVUY1gQImJadEHEEBIRFWNoqVjowlAxhFqc/0uf29e+tvpLXu5993/u93/O/wyXoWs0ZqT7eSgfBqNfTcUD/MBZ/MHmkYLPwWtcwRP0oBt1OIPa/4EvxAc0Y3aC38Fb/BIRLcKU4cDr0YUjKEUJ1os8vEibPcMB/EbNUOAr8CnBSzJrDSKqDenag1MpkobBwFfhM5oKwPO1JcG70IZvuFwMvhpfcbQInPB2tzi2HlFZa7BXlHRBeDdOiDPP13zsQWOB956jXeTje/rNyhqtTJ6fzsDX4n6eh9MLbLBMlOzzZHcwa1AvEnrev925Du+xXJzt7QLwnLbhC1pTBFW5hXn4iGsYlYmoHQtSROewfYANYGJyojXHmpAg91CZZ1iHV1iS4M24mnEgq3JcEONkbO5hjTjXTXmGC/A0bVKGk2L2DAQvTXZtmJRdPIw3KZrFeCwapkzMmZZ0359KREm/VLgAVOIhbiUPapNHLTiub7lm4U1iEM4cwM5OMVuq86I6VgRemuAdee8V1EaR5Nw03K9vL2RVJqLrVGTAzcYjjE//d4mkH9L/mKgQuekU34kBVYW7IsE7RP0uxTsxLrKfxDG4lOBzi8FzahQVcFFvL1SLnFwXzQPjcGOwng9Gk3FTJHGrqLCOkYLnVIF9+CminDWS8HxN01sIg9Zflop8Ez+7Xi0AAAAASUVORK5CYII=';\n}","import { inject, Injectable } from '@angular/core';\nimport VectorSource from 'ol/source/Vector';\nimport { CurrentItemsService } from './currentItems.service';\nimport VectorLayer from 'ol/layer/Vector';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class PrintDrawLayerSourceService {\n\n private _current = inject(CurrentItemsService);\n\n source: VectorSource = new VectorSource();\n layer = new VectorLayer({\n source: this.source,\n zIndex: 999\n });\n\n constructor() {\n this.layer.set('PRINTDRAWLAYER', 'true'); \n this._initListener();\n }\n\n private _initListener(): void {\n this._current.map$.subscribe({\n next: map => {\n map.addLayer(this.layer);\n }\n });\n }\n}\n","import { inject, Injectable } from '@angular/core';\nimport { CurrentItemsService } from './currentItems.service';\nimport Draw from 'ol/interaction/Draw';\nimport { DrawLayerSourceService } from './drawLayerSource.service';\nimport { InteractionHelperService } from './interactionHelper.service';\nimport { combineLatest } from 'rxjs';\nimport { KomponentSettingsHelperService } from './komponentSettingsHelper.service';\nimport { point as turfPoint, booleanPointInPolygon } from '@turf/turf';\nimport GeoJSON from 'ol/format/GeoJSON';\nimport { Polygon as geoJsonPolygon, FeatureCollection } from 'geojson';\nimport { transform } from 'ol/proj';\nimport { MatSnackBar } from '@angular/material/snack-bar';\nimport { FeatureHelperService } from './featureHelper.service';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class CenterPointService {\n \n private _settingsHelper = inject(KomponentSettingsHelperService);\n private _current = inject(CurrentItemsService);\n private _drawLayerService = inject(DrawLayerSourceService);\n private _interactionHelper = inject(InteractionHelperService);\n private _geoJson = new GeoJSON();\n private _snackbar = inject(MatSnackBar);\n private _featureHelper = inject(FeatureHelperService);\n\n handleFeatureDeleted(featureId: string | number): void {\n const centerFeature = this._drawLayerService.source.getFeatures().find(f => f.get('_parentPolyId') == featureId);\n if (centerFeature) {\n this._drawLayerService.remove(centerFeature.getId()!);\n }\n }\n\n setCenterPoint(style: string, withinPolygon: boolean, callBack: () => void): void {\n\n const style$ = this._settingsHelper.getStyle(style, this._current.profile!.styleRepositoryWorkspace!, this._current.profile!.styleRepositoryGeoserver!, 'Point');\n \n combineLatest([style$, this._current.map$]).subscribe({\n next: ([loadedStyle, map]) => {\n let parentPolyId: number | string | undefined;\n const centerDraw = new Draw({\n type: 'Point',\n source: this._drawLayerService.source,\n condition: evt => { \n if (!withinPolygon) { return true; }\n // The center needs to be inside a feature, so since turf is great for figuring out if something is in something, move the click and features to EPSG:4326\n const lonlat = transform(evt.coordinate, 'EPSG:25832', 'EPSG:4326');\n const pt = turfPoint(lonlat);\n const polygons = this._drawLayerService.source.getFeatures().filter(f => f.getGeometry() && f.getGeometry()!.getType() === 'Polygon'); // No point in checking linestrings and points\n const features = this._geoJson.writeFeaturesObject(polygons, { dataProjection: 'EPSG:4326', featureProjection: 'EPSG:25832' }) as FeatureCollection<geoJsonPolygon> ;\n const parentPoly = features.features.find(f => booleanPointInPolygon(pt, f) );\n\n if (!parentPoly) { \n this._snackbar.open('Centerpunktet skal være inde i en flade', '', { duration: 3000 });\n return false;\n }\n // Save the parent polygon's id on the center. If the parent is deleted, the point will be deleted too \n parentPolyId = parentPoly.id;\n return !!parentPoly;\n },\n style: loadedStyle\n });\n\n this._interactionHelper.setAsTemp(centerDraw);\n map.addInteraction(centerDraw);\n\n centerDraw.on('drawend', evt => {\n const existing = this._drawLayerService.source.getFeatures().filter(f => f.get('centerpoint') === true);\n // There can only be ONE centerpoint, so remove previous if exists\n if (existing) {\n this._drawLayerService.source.removeFeatures(existing);\n }\n // Mark feature as centerpoint - this is to find it again an remove\n evt.feature.set('centerpoint', true); \n evt.feature.set('_parentPolyId', parentPolyId);\n this._featureHelper.setId(evt.feature);\n callBack();\n });\n }\n });\n\n }\n\n}","\nimport { CommonModule } from '@angular/common';\nimport { Component, Inject } from '@angular/core';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatDialogRef, MAT_DIALOG_DATA, MatDialogModule, MatDialogTitle, MatDialogContent, MatDialogActions } from '@angular/material/dialog';\n// Use the confirm-dialog-service for convenience\nexport type ConfirmChoice = 'primary' | 'secondary';\n\nexport interface ConfirmDialogData {\n title?: string;\n message?: string;\n primaryText: string; // Tekst som vises på primær knap\n secondaryText: string; // Vises på sekundær\n disableClose?: boolean; // hvis du vil forhindre luk ved klik udenfor/ESC\n}\n\n@Component({\n selector: 'app-confirm-dialog',\n templateUrl: './confirm-dialog.component.html',\n styleUrls: ['./confirm-dialog.component.scss'],\n imports: [ CommonModule, MatDialogModule, MatButtonModule, MatDialogTitle, MatDialogContent, MatDialogActions ]\n})\nexport class ConfirmDialogComponent {\n constructor(\n private dialogRef: MatDialogRef<ConfirmDialogComponent, ConfirmChoice>,\n @Inject(MAT_DIALOG_DATA) public data: ConfirmDialogData\n ) { \n }\n\n choose(choice: ConfirmChoice) {\n this.dialogRef.close(choice);\n }\n}\n","\n@if(data.title) {\n <h2 mat-dialog-title>{{ data.title }}</h2>\n}\n<mat-dialog-content>\n <p>{{ data.message }}</p>\n</mat-dialog-content>\n\n<mat-dialog-actions align=\"end\">\n <!-- Sekundær handling -->\n <button mat-button (click)=\"choose('secondary')\">\n {{ data.secondaryText }}\n </button>\n\n <!-- Primær handling -->\n <button mat-raised-button color=\"primary\" (click)=\"choose('primary')\">\n {{ data.primaryText }}\n </button>\n</mat-dialog-actions>\n","\nimport { Injectable } from '@angular/core';\nimport { MatDialog } from '@angular/material/dialog';\nimport { ConfirmChoice, ConfirmDialogComponent, ConfirmDialogData } from '../components/confirm-dialog/confirm-dialog.component';\nimport { Observable } from 'rxjs';\n\n\n@Injectable({ providedIn: 'root' })\nexport class ConfirmDialogService {\n constructor(private dialog: MatDialog) {}\n\n open(data: ConfirmDialogData): Observable<ConfirmChoice | undefined> {\n \n const dialogRef = this.dialog.open<ConfirmDialogComponent, ConfirmDialogData, ConfirmChoice>(\n ConfirmDialogComponent,\n {\n width: '400px',\n disableClose: !!data.disableClose, \n data\n }\n );\n\n return dialogRef.afterClosed();\n }\n}\n","import { inject, Injectable } from '@angular/core';\nimport { Feature as olFeature } from 'ol';\nimport { area, difference, featureCollection } from '@turf/turf';\nimport GeoJSON from 'ol/format/GeoJSON';\nimport Polygon from 'ol/geom/Polygon';\nimport { DrawLayerSourceService } from './drawLayerSource.service';\nimport { FeatureHelperService } from './featureHelper.service';\nimport { MatSnackBar } from '@angular/material/snack-bar';\nimport { ConfirmDialogService } from './confirm-dialog.service';\nimport { map, Observable, of } from 'rxjs';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class OverlapService {\n\n private _drawLayerService = inject(DrawLayerSourceService);\n private _featureHelper = inject(FeatureHelperService);\n private _snackbar = inject(MatSnackBar);\n private _confirmService = inject(ConfirmDialogService);\n \n\n handleOverlap(feature: olFeature): Observable<olFeature> {\n\n const geoJsonFormat = new GeoJSON<olFeature<Polygon>>();\n const epsilon = 0.1;\n\n const overlappingLockedFeatures = this._drawLayerService.source.getFeatures().filter(f => this._featureHelper.isLocked(f) && f.getGeometry()?.intersectsExtent(feature.getGeometry()!.getExtent()));\n let newFeatureGeoJson = geoJsonFormat.writeFeatureObject(feature);\n const orgFeatureArea = area(newFeatureGeoJson);\n if (overlappingLockedFeatures.length > 0) {\n const overlappingLockedFeaturesAsGeoJson = overlappingLockedFeatures.map(f => geoJsonFormat.writeFeatureObject(f));\n const features = featureCollection([newFeatureGeoJson, ...overlappingLockedFeaturesAsGeoJson]) as any;\n const clipped = difference(features);\n if (clipped) {\n const clippedArea = area(clipped.geometry);\n // The overlap is done by checking extent. To make sure there's an actual change, I check if the areas are diffent\n // but sometimes, the calculations of the same area can be a bit of. Like 0.01. To make sure that doesn't register as a change\n // I check that there's actually a change.\n const actuallyClipped = Math.abs(orgFeatureArea - clippedArea) > epsilon;\n if (actuallyClipped) {\n const geom = geoJsonFormat.readGeometry(clipped.geometry);\n feature.setGeometry(geom);\n this._snackbar.open(\"Der var overlap med låste flader, så den indtegnede flade er blevet beskåret\", '', { duration: 3000 });\n }\n }\n }\n\n // Handle the unlocked. \n const overlappingUnlockedFeatures = this._drawLayerService.source.getFeatures().filter(f => !this._featureHelper.isLocked(f) && f.getGeometry()?.intersectsExtent(feature.getGeometry()!.getExtent()));\n \n if (overlappingUnlockedFeatures.length === 0) { \n return of(feature);\n } else {\n newFeatureGeoJson = geoJsonFormat.writeFeatureObject(feature);\n const newFeatureArea = area(newFeatureGeoJson);\n const unlockedFeaturesAsGeoJson = overlappingUnlockedFeatures.map(f => geoJsonFormat.writeFeatureObject(f));\n const newClippedFeature = difference(featureCollection([newFeatureGeoJson, ...unlockedFeaturesAsGeoJson as any]));\n\n const areaNewClippedFeature = area(newClippedFeature as any);\n if (Math.abs(newFeatureArea - areaNewClippedFeature) < epsilon) { \n return of(feature);\n }\n else {\n const open$ = this._confirmService.open({\n primaryText: 'Nye',\n secondaryText: 'Eksisterende',\n disableClose: true,\n message: 'Den nye flade overlapper med eksisterende flade. Ønsker du at beskære de nye eller de eksisterende?', \n title: 'Beskæring'\n });\n return open$.pipe(map(msg => {\n if (msg === 'primary') {\n const newGeometry = geoJsonFormat.readGeometry(newClippedFeature!.geometry);\n feature.setGeometry(newGeometry);\n return feature;\n } else {\n unlockedFeaturesAsGeoJson.forEach(f => {\n const featureArea = area(f.geometry);\n const fc = featureCollection([f, newFeatureGeoJson]);\n const featureDiff = difference(fc as any);\n const featureDiffArea = area(featureDiff!.geometry);\n if (Math.abs(featureArea - featureDiffArea) > epsilon) {\n const existingFeature = this._drawLayerService.source.getFeatureById(f.id!);\n if (existingFeature) {\n const newGeometry = geoJsonFormat.readGeometry(featureDiff?.geometry);\n existingFeature.setGeometry(newGeometry);\n }\n }\n });\n return feature;\n }\n\n }));\n }\n }\n }\n\n}","import { Component, inject, Input, OnInit, Renderer2 } from '@angular/core';\nimport { MatIconModule } from '@angular/material/icon';\nimport { Geometry, LineString, Point, Polygon } from 'ol/geom';\nimport { getLength, getArea } from 'ol/sphere'\nimport Draw, { createBox, createRegularPolygon, DrawEvent } from 'ol/interaction/Draw'\nimport VectorLayer from 'ol/layer/Vector';\nimport { Modify, Select, Snap } from 'ol/interaction'\nimport Map from 'ol/Map';\nimport VectorSource from 'ol/source/Vector';\nimport { Fill, RegularShape, Stroke, Style, Text } from 'ol/style';\nimport { geometryType, GeometryTypeSetting, GisKomponentSettings } from '../../models/GisKomponentSettings';\nimport { MatSelectChange, MatSelectModule } from '@angular/material/select';\nimport { MatOptionModule } from '@angular/material/core';\nimport { FormsModule } from '@angular/forms';\nimport { CommonModule } from '@angular/common';\nimport { KomponentSettingsHelperService } from '../../services/komponentSettingsHelper.service';\nimport WKT from 'ol/format/WKT';\nimport { IProfileDetailed } from '../../models/IProfile';\nimport { MatSnackBar } from '@angular/material/snack-bar';\nimport { buffer } from 'ol/extent';\nimport Feature, { FeatureLike } from 'ol/Feature';\nimport { DrawLayerSourceService } from '../../services/drawLayerSource.service';\nimport { FeatureHelperService } from '../../services/featureHelper.service';\nimport { UndoRedoService } from '../../services/UndoRedo.service';\nimport { always, never } from 'ol/events/condition';\nimport { area, difference, featureCollection, buffer as turfBuffer, union } from '@turf/turf';\nimport GeoJSON from 'ol/format/GeoJSON';\nimport { DragDropModule } from '@angular/cdk/drag-drop';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { GeometrySplitService } from '../../services/geometri-split.service';\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle';\nimport { HighlightService } from '../../services/highlight.service';\nimport { InteractionHelperService } from '../../services/interactionHelper.service';\nimport { MergeFeaturesService } from '../../services/mergeFeatures.service';\nimport { IconsConstants } from '../../models/icons.constants';\nimport html2canvas from 'html2canvas-pro';\nimport { PrintDrawLayerSourceService } from '../../services/printDrawLayerSource.service';\nimport CircleStyle from 'ol/style/Circle';\nimport { CurrentItemsService } from '../../services/currentItems.service';\nimport { CenterPointService } from '../../services/centerPoint.service';\nimport { OverlapService } from '../../services/overlap.service';\nimport { ZoomService } from '../../services/zoom.service';\nimport { filter } from 'rxjs';\n\n@Component({\n selector: 'map-toolbox',\n styleUrl: './toolbox.component.scss',\n templateUrl: './toolbox.component.html',\n imports: [FormsModule, CommonModule, MatIconModule, MatOptionModule, MatSelectModule, DragDropModule, MatTooltipModule, MatSlideToggleModule] \n})\nexport class ToolboxComponent implements OnInit {\n\n // Inputs\n @Input({ required: true }) map!: Map;\n @Input() showMeasureDistance = true;\n @Input() showMeasureArea = true;\n @Input() collapsed = false;\n @Input({ required: true}) settings!: GisKomponentSettings;\n @Input({ required: true }) profile!: IProfileDetailed;\n @Input() WKTInputEnabled?: boolean = false;\n @Input() deleteEnabled?: boolean = false;\n // Injects\n private _snackbar = inject(MatSnackBar);\n private _settingsHelper = inject(KomponentSettingsHelperService);\n private _drawLayerService = inject(DrawLayerSourceService);\n private _printDrawLayerService = inject(PrintDrawLayerSourceService);\n private _featureHelper = inject(FeatureHelperService);\n private _undoRedo = inject(UndoRedoService);\n private _geomSplitService = inject(GeometrySplitService);\n private _highlight = inject(HighlightService);\n private _interactionHelper = inject(InteractionHelperService);\n private _mergeService = inject(MergeFeaturesService);\n private _centerPointService = inject(CenterPointService);\n private _overlap = inject(OverlapService);\n private _zoomService = inject(ZoomService);\n\n private _POSITION_STORAGE_KEY = 'toolbox_position';\n private _current = inject(CurrentItemsService);\n private _originalMapWidth: number = 0;\n private _originalMapHeight: number = 0;\n\n mapWidth: number = 0;\n mapHeight: number = 0;\n format: string = \"image/png\";\n dimId: string = \"99\";\n dims = [\n [1920, 1080],\n [1680, 1050],\n [1280, 800],\n [800, 600]\n ]\n printDrawLabel: string = \"\";\n printDrawTool: 'Arrow' | 'Point' | 'LineString' | 'Polygon' | 'Circle' | 'Square' | 'Rectangle' = \"Point\";\n selectedGeometrySetting: GeometryTypeSetting | undefined = undefined;\n undoIconBase64 = IconsConstants.undoIconBase64;\n redoIconBase64 = IconsConstants.redoIconBase64;\n trimIconBase64 = IconsConstants.trimIconBase64;\n deleteIconBase64 = IconsConstants.deleteIconBase64;\n editIconBase64 = IconsConstants.editIconBase64;\n splitIconBase64 = IconsConstants.splitIconBase64;\n measureDistanceIconBase64 = IconsConstants.measureDistanceIconBase64;\n measureAreaIconBase64 = IconsConstants.measureAreaIconBase64;\n removePointsIconBase64 = IconsConstants.removePointsIconBase64;\n wktIconBase64 = IconsConstants.wktIconBase64;\n pointIconBase64 = IconsConstants.pointIconBase64;\n polygonIconBase64 = IconsConstants.polygonIconBase64;\n lineStringIconBase64 = IconsConstants.lineStringIconBase64;\n printBase64 = IconsConstants.printBase64;\n drawBase64 = IconsConstants.drawBase64;\n dragPosition = { x: 0, y: 0 };\n snap: boolean = false;\n showInputWKT: boolean = false;\n WKTString?: string; \n activeMode: 'draw-polygon' | 'draw-linestring' | \n 'draw-point' | 'edit' | 'edit-remove' | \n 'delete' | 'change-type' | 'clip-hole' | \n 'split' | 'measure-area' | 'measure-distance' | 'merge-features' | 'center-point'\n | null = null;\n activateShowInputWKT(): void {\n this._clearAllInteractions(); \n this.showInputWKT = true;\n }\n\n cancelWKT(): void {\n this._clearAllInteractions();\n this.showInputWKT = false;\n }\n\n settingsChanged(evt: MatSelectChange): void {\n this._clearAllInteractions();\n }\n\n undo(): void {\n this._undoRedo.undo();\n }\n\n redo(): void {\n this._undoRedo.redo();\n } \n\n onSnapChange(): void {\n if (this.snap) {\n this._addSnap(); \n } else {\n this._removeSnap();\n }\n }\n \n ReadWKT(): void {\n this._clearAllInteractions();\n if (!this.WKTString) { return; }\n const wktFormat = new WKT();\n try {\n const feature = wktFormat.readFeature(this.WKTString, { featureProjection: 'EPSG:25832', dataProjection: 'EPSG:25832' });\n const featureType = feature.getGeometry()?.getType();\n if (!this.selectedGeometrySetting?.availableGeometryTypes?.some(g => g === featureType)) {\n this._snackbar.open(`Den WKT du indlæser er af typen ${featureType} og det er ikke tilladt for denne indstilling`, '', { duration: 4000 });\n return;\n }\n this._settingsHelper.getStyle(this.selectedGeometrySetting!.style, this.profile.styleRepositoryWorkspace!, this.profile.styleRepositoryGeoserver!, featureType!).subscribe({\n next: featureStyle => {\n feature.setStyle(featureStyle);\n this._featureHelper.setTypeId(feature, this.selectedGeometrySetting?.typeId || '');\n this._featureHelper.setId(feature);\n if (featureType === 'Polygon') {\n this._overlap.handleOverlap(feature).subscribe({\n next: f => {\n if (f) {\n this._zoomService.zoomToFeatures([f]); \n this._drawLayerService.source.addFeature(f);\n }\n\n }\n });\n } else {\n this._zoomService.zoomToFeatures([feature]);\n this._drawLayerService.source.addFeature(feature);\n\n }\n\n }\n })\n } catch (ex) {\n this._snackbar.open(`WKT kunne ikke indlæses - den er muligvis ikke formatteret korrekt`, '', { duration: 4000 });\n }\n }\n\n private _drawPolygon = new Draw({\n type: 'Polygon',\n source: this._drawLayerService.source\n });\n \n setCenterPoint(): void {\n this._clearAllInteractions();\n this.activeMode = 'center-point';\n this._centerPointService.setCenterPoint(this.settings.centerPoint!.style, this.settings.centerPoint!.withinPolygon, () => {\n this.activeMode = null;\n this._clearAllInteractions();\n });\n }\n\n private _actionSource = new VectorSource();\n clipHole(): void {\n this._clearAllInteractions();\n this.activeMode = 'clip-hole';\n const clipHoleDraw = new Draw({\n source: this._actionSource,\n type: 'Polygon' \n });\n this._interactionHelper.setAsTemp(clipHoleDraw);\n clipHoleDraw.on('drawend', evt => {\n \n const overlappingFeatures = this._drawLayerService.source.getFeatures().filter(f => !this._featureHelper.isLocked(f) && f.getGeometry()?.intersectsExtent(evt.feature.getGeometry()!.getExtent()));\n const geoJsonFormat = new GeoJSON<Feature<Polygon>>();\n const holeGeoJson = geoJsonFormat.writeFeatureObject(evt.feature);\n overlappingFeatures.forEach(f => {\n const overlappingFeatureGeoJson = geoJsonFormat.writeFeatureObject(f);\n // because the difference function takes featurecollection, I add the two features to a collection\n // I have to cast this as any, because the featurecollection needs to be of Polygon or MultiPoly and it\n // doesnt resolve to that.\n const features = featureCollection([overlappingFeatureGeoJson, holeGeoJson]) as any;\n const clipped = difference(features);\n if (clipped) {\n const geom = geoJsonFormat.readGeometry(clipped.geometry);\n f.setGeometry(geom);\n }\n });\n });\n\n this.map.addInteraction(clipHoleDraw);\n\n // snap should be added last!\n this._addSnap();\n }\n \n private _addSnap(): void {\n if (this.snap) {\n const snap = new Snap({ source: this._drawLayerService.source, intersection: true });\n this._interactionHelper.setAsTemp(snap);\n snap.set('snap', true);\n this.map.addInteraction(snap);\n }\n }\n\n private _removeSnap(): void {\n this.map.getInteractions().forEach(i => {\n if (i.get('snap') === true) {\n this.map.removeInteraction(i);\n }\n })\n \n }\n\n split(): void {\n this._clearAllInteractions();\n this.activeMode = 'split';\n const splitInteraction = new Draw({\n type: 'LineString',\n source: this._actionSource\n });\n this._interactionHelper.setAsTemp(splitInteraction);\n splitInteraction.on('drawend', evt => {\n this._geomSplitService.splitPolygonsWithBufferedLine(evt.feature as Feature<LineString>, this._drawLayerService.source, 0.001);\n });\n this.map.addInteraction(splitInteraction);\n this._addSnap();\n }\n\n startDrawPoint(): void {\n this._startDraw('Point');\n }\n\n startDrawLineString() {\n this._startDraw('LineString');\n }\n\n startDrawPolygon(): void {\n this._startDraw('Polygon');\n }\n\n private _deleteSelect: Select | undefined;\n private get deleteSelect(): Select {\n if (this._deleteSelect) return this._deleteSelect; \n this._deleteSelect = new Select({ \n layers: [this._drawLayerService.layer ],\n style: null, // ABSOLUTELY leave this as null! If not, select fires a change, because it applies a change of styling. LEAVE IT!\n filter: feature => !this._featureHelper.isLocked(feature)\n });\n this._interactionHelper.setAsTemp(this.deleteSelect);\n this.deleteSelect.on('select', evt => { \n this._drawLayerService.source.removeFeatures(evt.selected);\n evt.selected.forEach(f => this._centerPointService.handleFeatureDeleted(f.getId()!) );\n \n })\n return this._deleteSelect;\n }\n \n\n private _deleting: boolean = false;\n startDelete(): void {\n this._clearAllInteractions();\n this._deleting = true; \n this.activeMode = 'delete';\n this.map.addInteraction(this.deleteSelect);\n this._addSnap();\n }\n\n startEditRemovePoints(): void {\n this._clearAllInteractions();\n this.activeMode = 'edit-remove';\n const modifyRemove = new Modify({\n source: this._drawLayerService.source, \n condition: evt => {\n // first, get all features from the draw-layer\n const feature = this.map.forEachFeatureAtPixel(evt.pixel, f => f, { layerFilter: l => l == this._drawLayerService.layer });\n if (!feature) { return false ;}\n return !this._featureHelper.isLocked(feature as Feature);\n },\n // Make sure delete is allowed and other interactions are not.\n deleteCondition: always, \n insertVertexCondition: never,\n snapToPointer: this.snap,\n\n });\n\n this._interactionHelper.setAsTemp(modifyRemove); \n this.map.addInteraction(modifyRemove);\n this._addSnap();\n }\n\n startEdit(): void {\n this._clearAllInteractions();\n this.activeMode = 'edit';\n const modify = new Modify({ \n source: this._drawLayerService.source,\n condition: evt => {\n // first, get all features from the draw-layer\n const feature = this.map.forEachFeatureAtPixel(evt.pixel, f => f, { layerFilter: l => l == this._drawLayerService.layer });\n if (!feature) { return false ;}\n return !this._featureHelper.isLocked(feature as Feature);\n },\n\n // No delete\n deleteCondition: () => false,\n // Allow moving existing and add new points\n // condition: always, \n insertVertexCondition: always, \n });\n /* Modify fires changes to features a LOT, so to not flood the UndoRedo service, I disable until ending the modify\n and then force an update, to add the updated feature to the undo-service. */\n modify.on('modifystart', () => this._undoRedo.disable());\n modify.on('modifyend', (evt) => { this._undoRedo.enable(); evt.features.forEach(f => f.set('updated', new Date().toISOString() )) });\n \n this._interactionHelper.setAsTemp(modify); \n this.map.addInteraction(modify);\n }\n \n private _startDraw(geomType: geometryType): void {\n this._clearAllInteractions();\n if (!this.selectedGeometrySetting) { return; }\n // Set the active mode after clearing\n if (geomType === 'Polygon') this.activeMode = 'draw-polygon';\n else if (geomType === 'LineString') this.activeMode = 'draw-linestring';\n else if (geomType === 'Point') this.activeMode = 'draw-point';\n this._settingsHelper.getStyle(this.selectedGeometrySetting.style, this.profile.styleRepositoryWorkspace!, this.profile.styleRepositoryGeoserver!, geomType)\n .subscribe({\n next: style => { \n const drawInteraction = new Draw({\n type: geomType, \n source: new VectorSource(), \n style: style \n });\n this._undoRedo.disable();\n drawInteraction.on('drawend', evt => {\n this._featureHelper.setTypeId(evt.feature, this.selectedGeometrySetting?.typeId || '');\n this._featureHelper.setId(evt.feature);\n evt.feature.setStyle(style);\n if (geomType === 'Polygon') {\n this._overlap.handleOverlap(evt.feature).pipe(filter(f => !!f)).subscribe({\n next: f => {\n if (f) {\n this._undoRedo.enable();\n this._drawLayerService.source.addFeature(f);\n }\n }\n });\n } else {\n this._undoRedo.enable();\n this._drawLayerService.source.addFeature(evt.feature);\n }\n });\n this._interactionHelper.setAsTemp(drawInteraction);\n // this._setDrawLayer()\n this.map.addInteraction(drawInteraction); \n this._addSnap();\n this.map.getTargetElement().style.cursor = 'crosshair'; // Placeholder for now\n }\n })\n }\n\n\n compareGeometrySetting = (g1: GeometryTypeSetting, g2: GeometryTypeSetting) => g1 && g2 && g1.typeId === g2.typeId;\n\n private _areaSource = new VectorSource();\n private _areaLayer = new VectorLayer({\n source: this._areaSource,\n zIndex: 999,\n style: (feature) => {\n const geom = feature.getGeometry() as Polygon;\n const area = getArea(geom);\n const formattedArea = area > 1000000 ? `${(area / 1000000).toFixed(2)} km2` : `${area.toFixed(2)} m2`\n return new Style({\n stroke: new Stroke({\n color: 'blue',\n width: 2\n }),\n fill: new Fill({\n color: 'grey'\n }),\n text: new Text({\n text: formattedArea,\n font: '12px Calibri,sans-serif',\n fill: new Fill({ color: '#000' }),\n stroke: new Stroke({ color: '#fff', width: 3 }),\n placement: 'line'\n })\n });\n }\n })\n\n private _distanceLabelSource = new VectorSource();\n private _distanceLabelLayer = new VectorLayer({\n source: this._distanceLabelSource,\n zIndex: 999,\n style: (feature) => {\n return new Style({\n text: new Text({\n text: feature.get('label'),\n font: '12px Calibri,sans-serif',\n fill: new Fill({ color: '#000' }),\n stroke: new Stroke({ color: '#fff', width: 3 })\n })\n });\n }\n });\n\n\n private _distanceSource = new VectorSource();\n private _distanceLayer = new VectorLayer({\n source: this._distanceSource,\n zIndex: 999,\n style: (feature) => {\n const geom = feature.getGeometry() as LineString;\n const length = getLength(geom);\n const formattedLength = `${length.toFixed(2)} m`\n return new Style({\n stroke: new Stroke({\n color: 'blue',\n width: 2\n }),\n text: new Text({\n text: formattedLength,\n font: '12px Calibri,sans-serif',\n fill: new Fill({ color: '#000' }),\n stroke: new Stroke({ color: '#fff', width: 3 }),\n placement: 'line'\n })\n });\n }\n })\n\n private _distanceMeasureDraw = new Draw({\n type: 'LineString',\n source: this._distanceLayer.getSource()!,\n });\n\n private _areaMeasureDraw = new Draw({\n type: 'Polygon',\n source: this._areaSource\n })\n private _active: 'No' | 'Area' | 'Distance' | 'Print' | 'PrintDraw' = 'No';\n\n get active(): string {\n return this._active;\n }\n\n\n constructor() {\n\n // TODO: Move out from constructor\n // In order to add the distance to each segment of the distance measure feature, we need some extra handling like this.\n this._distanceMeasureDraw.on('drawstart', (evt: DrawEvent) => {\n\n const sketch = evt.feature as Feature;\n\n sketch.getGeometry()!.on('change', (geomEvt) => {\n const geom = geomEvt.target as LineString;\n const coords = geom.getCoordinates();\n\n this._distanceLabelSource.clear(); // Clear existing labels for each change\n\n let totalLength = 0;\n\n for (let i = 0; i < coords.length - 1; i++) {\n const c1 = coords[i];\n const c2 = coords[i + 1];\n const segment = new LineString([c1, c2]);\n const length = getLength(segment);\n totalLength += length;\n\n const mid = [(c1[0] + c2[0]) / 2, (c1[1] + c2[1]) / 2];\n const formatted = `${length.toFixed(2)} m`; \n\n const labelFeature = new Feature({\n geometry: new Point(mid),\n label: formatted\n });\n\n this._distanceLabelSource.addFeature(labelFeature);\n }\n\n // Add total length at the last point\n if (coords.length > 1) {\n const endPoint = coords[coords.length - 1];\n const formattedTotal = `${totalLength.toFixed(2)} m`;\n\n const totalFeature = new Feature({\n geometry: new Point(endPoint),\n label: `Total: ${formattedTotal}`\n });\n\n this._distanceLabelSource.addFeature(totalFeature);\n }\n });\n });\n }\n\n private _clearAllInteractions(): void {\n this._highlight.clear();\n this.stopMeasureArea();\n this.stopMeasureLength();\n this._deleting = false;\n this._interactionHelper.clearTempFromMap();\n this._undoRedo.enable(); \n }\n\n ngOnInit(): void {\n this._originalMapHeight = this.map.getSize()![1];\n this._originalMapWidth = this.map.getSize()![0];\n\n if (this.settings.geometryTypeSettings && this.settings.geometryTypeSettings.length === 1) {\n this.selectedGeometrySetting = this.settings.geometryTypeSettings![0];\n }\n this._drawPolygon.on('drawend', evt => {\n this._featureHelper.setTypeId(evt.feature, this.selectedGeometrySetting?.typeId || '');\n });\n this._loadPosition();\n }\n\n onDragEnded(event: any): void {\n this.dragPosition = {\n x: event.source.getFreeDragPosition().x,\n y: event.source.getFreeDragPosition().y\n };\n this._savePosition();\n }\n \n private _loadPosition(): void {\n try {\n const savedPosition = localStorage.getItem(this._POSITION_STORAGE_KEY);\n if (savedPosition) {\n const position = JSON.parse(savedPosition);\n this.dragPosition = position;\n }\n } catch (error) {\n console.warn('Could not load toolbox position from localStorage:', error);\n }\n }\n\n private _savePosition(): void {\n try {\n localStorage.setItem(this._POSITION_STORAGE_KEY, JSON.stringify(this.dragPosition));\n } catch (error) {\n console.warn('Could not save toolbox position to localStorage:', error);\n }\n }\n\n startMergeFeatures(): void {\n this._clearAllInteractions();\n this.activeMode = 'merge-features'\n this._mergeService.startMerge(this.selectedGeometrySetting!.typeId, () => { this.activeMode = null });\n }\n\n startChangeType(): void {\n this._clearAllInteractions();\n this.activeMode = 'change-type';\n\n const changeTypeSelect = new Select({\n // layers: [this._drawLayer!], \n layers: [this._drawLayerService.layer], \n filter: f => !this._featureHelper.isLocked(f) && this._featureHelper.typeId(f) !== this.selectedGeometrySetting?.typeId // can't changed locked and cant change to same type\n });\n this._interactionHelper.setAsTemp(changeTypeSelect);\n\n changeTypeSelect.on('select', evt => {\n evt.selected.forEach(f => {\n this._settingsHelper.getStyle(this.selectedGeometrySetting!.style, this.profile.styleRepositoryWorkspace!, this.profile.styleRepositoryGeoserver!, f.getGeometry()?.getType()!)\n .subscribe({\n next: style => { \n const feature = this._drawLayerService.source.getFeatureById(f.getId()!);\n if (feature) {\n const newFeature = feature.clone();\n newFeature.setId(f.getId());\n newFeature.setStyle(style);\n this._featureHelper.setTypeId(newFeature, this.selectedGeometrySetting!.typeId);\n this._drawLayerService.source.removeFeature(feature);\n this._drawLayerService.source.addFeature(newFeature);\n }\n }\n })\n })\n });\n \n this.map.addInteraction(changeTypeSelect);\n }\n\n toggleCollapsed(event?: MouseEvent): void {\n if (event) {\n event.stopPropagation();\n }\n this.collapsed = !this.collapsed;\n if (this.collapsed) {\n this.stopMeasureArea();\n this.stopMeasureLength();\n }\n }\n\n startMeasureArea(): void {\n if (this._active === 'Area') {\n this.stopMeasureArea();\n this._active = 'No'\n this.activeMode = null;\n return;\n }\n \n this._clearAllInteractions();\n this.stopMeasureLength();\n this.map.addLayer(this._areaLayer);\n this.map.addInteraction(this._areaMeasureDraw);\n this._active = 'Area';\n this.activeMode = 'measure-area';\n }\n\n stopMeasureArea(): void {\n this.map.getTargetElement().style.cursor = '';\n this._areaSource.clear();\n this.map.removeInteraction(this._areaMeasureDraw);\n this.map.removeLayer(this._areaLayer);\n }\n\n stopMeasureLength(): void {\n this.map.getTargetElement().style.cursor = '';\n this._distanceSource.clear();\n this._distanceLabelSource.clear();\n this.map.removeInteraction(this._distanceMeasureDraw);\n this.map.removeLayer(this._distanceLayer);\n this.map.removeLayer(this._distanceLabelLayer);\n\n }\n\n startMeasureLength(): void { \n if (this._active === 'Distance') {\n this.stopMeasureLength();\n this._active = 'No';\n this.activeMode = null;\n return;\n }\n this._clearAllInteractions();\n this.map.addLayer(this._distanceLayer);\n this.map.addLayer(this._distanceLabelLayer);\n this.map.addInteraction(this._distanceMeasureDraw);\n this._active = 'Distance';\n this.activeMode = 'measure-distance';\n }\n\n startPrintMode(): void {\n if (this._active === 'Print') {\n this._active = 'No';\n\n this.map.getTargetElement().style.width = this._originalMapWidth + 'px';\n this.map.getTargetElement().style.height = this._originalMapHeight + 'px';\n this.map.updateSize();\n this.dimId = \"99\";\n return;\n }\n this.mapWidth = this._originalMapWidth;\n this.mapHeight = this._originalMapHeight;\n this._active = 'Print';\n }\n\n handleDimensionSelected(): void {\n if (this.dimId !== \"99\") {\n let selectedDim = this.dims[parseInt(this.dimId)];\n this.mapWidth = selectedDim[0];\n this.mapHeight = selectedDim[1];\n } else {\n this.mapWidth = this._originalMapWidth;\n this.mapHeight = this._originalMapHeight;\n }\n }\n\n setNewMapDimensions(): void {\n this.map.getTargetElement().style.width = this.mapWidth + 'px';\n this.map.getTargetElement().style.height = this.mapHeight + 'px';\n this.map.updateSize();\n }\n\n doPrint(): void {\n let htmlElement = this.map.getViewport();\n this._setVisibiltyOnDOMElements(htmlElement, false);\n\n html2canvas(htmlElement, { \n useCORS: true,\n }).then(canvas => { \n const imgData = canvas.toDataURL(this.format);\n const link = document.createElement('a');\n link.href = imgData;\n let download = 'map.png';\n if (this.format === 'image/png') {\n download = 'map.png';\n } else if(this.format === 'image/jpeg') {\n download = 'map.jpg';\n }\n link.download = download;\n link.click();\n\n this._setVisibiltyOnDOMElements(htmlElement, true);\n });\n }\n\n private _setVisibiltyOnDOMElements(baseElement: HTMLElement, visible: boolean): void {\n let visibilityValue = 'hidden';\n if (visible) { visibilityValue = 'visible'; }\n\n const activeobjects = baseElement.querySelector('activeobjects') as HTMLElement;\n if (activeobjects) { activeobjects!.style.visibility = visibilityValue; }\n\n const zoom = baseElement.querySelector('.ol-zoom') as HTMLElement;\n if (zoom) { zoom!.style.visibility = visibilityValue; }\n\n const mapToolbox = baseElement.querySelector('map-toolbox') as HTMLElement;\n if (mapToolbox) { mapToolbox!.style.visibility = visibilityValue; }\n\n const mousePosition = baseElement.querySelector('.ol-mouse-position') as HTMLElement;\n if (mousePosition) { mousePosition!.style.visibility = visibilityValue; }\n\n const layerSelector = baseElement.querySelector('.layer-selector-body-wrapper') as HTMLElement;\n if (layerSelector) { layerSelector!.style.visibility = visibilityValue; }\n }\n\n startDrawMode(): void {\n if (this._active === 'PrintDraw') {\n this._active = 'No';\n this._removePrintDrawToolInteraction();\n this.activeMode = null;\n this.printDrawTool = 'Point';\n return;\n }\n this._active = 'PrintDraw';\n this._clearAllInteractions();\n this._addPrintDrawToolInteraction();\n this.activeMode = null;\n this.printDrawTool = 'Point';\n }\n\n handlePrintDrawToolChanged(): void {\n if (this.active === 'PrintDraw') {\n this._removePrintDrawToolInteraction();\n this._addPrintDrawToolInteraction();\n }\n }\n\n handleClearPrintDrawFeatures(): void {\n this._printDrawLayerService.source.clear();\n }\n\n printDraw?: Draw;\n private _addPrintDrawToolInteraction(): void {\n if (this.active === 'PrintDraw') {\n switch(this.printDrawTool) {\n case 'Arrow':\n this.printDraw = new Draw({\n source: this._printDrawLayerService.source,\n type: 'LineString',\n });\n break;\n case 'Square':\n this.printDraw = new Draw({\n source: this._printDrawLayerService.source,\n type: 'Circle',\n geometryFunction: createRegularPolygon(4)\n });\n break;\n case 'Rectangle':\n this.printDraw = new Draw({\n source: this._printDrawLayerService.source,\n type: 'Circle',\n geometryFunction: createBox()\n });\n break;\n default:\n this.printDraw = new Draw({\n source: this._printDrawLayerService.source,\n type: this.printDrawTool as 'Point' | 'LineString' | 'Polygon' | 'Circle',\n });\n break;\n }\n\n this.printDraw.on('drawend', evt => {\n const feature = evt.feature;\n feature.set(\"printDrawLabel\", this.printDrawLabel);\n feature.set(\"printDrawTool\", this.printDrawTool);\n\n if (this.printDrawTool === 'Arrow') {\n feature.setStyle((feature) => {\n const styles = this._getDrawToolStyle(feature);\n const geom = feature.getGeometry() as LineString;\n const rot = this._lastSegmentRotation(geom);\n const arrowHead = new RegularShape({\n points: 3,\n radius: 10,\n angle: Math.PI / 2,\n rotation: -rot,\n rotateWithView: true,\n stroke: new Stroke({ color: '#1f6feb', width: 3 })\n });\n\n const endCoord = geom!.getCoordinateAt(1);\n const arrowEndStyle = new Style({\n image: arrowHead,\n geometry: () => new Point(endCoord)\n });\n\n styles.push(arrowEndStyle);\n return styles;\n });\n } else {\n feature.setStyle((feature) => this._getDrawToolStyle(feature));\n }\n });\n }\n\n this.map.addInteraction(this.printDraw!);\n this._interactionHelper.setAsTemp(this.printDraw!);\n }\n\n private _removePrintDrawToolInteraction(): void {\n this.map.removeInteraction(this.printDraw!);\n }\n \n private _lastSegmentRotation(lineString: LineString ) {\n const coords = lineString.getCoordinates();\n if (!coords || coords.length < 2) return 0;\n const [x1, y1] = coords[coords.length - 2];\n const [x2, y2] = coords[coords.length - 1];\n return Math.atan2(y2 - y1, x2 - x1);\n }\n\n private _getDrawToolStyle(feature: FeatureLike): Style[] {\n const textStyle = new Style({\n text: new Text({\n text: feature.get(\"printDrawLabel\"),\n font: '12px Calibri,sans-serif',\n fill: new Fill({ color: '#000' }),\n stroke: new Stroke({ color: '#fff', width: 3 }),\n placement: 'point'\n })\n });\n\n const lineStyle = new Style({\n stroke: new Stroke({\n color: '#1f6feb',\n width: 3\n })\n });\n\n const circleStyle = new Style ({\n image: new CircleStyle({\n radius: 5,\n fill: new Fill({color: '#7da8e9ff'}), // teal fill\n stroke: new Stroke({color: '#1f6feb', width: 2}),\n })\n });\n\n let styles = [textStyle, lineStyle];\n if (feature.get(\"printDrawTool\") === 'Point') {\n styles.push(circleStyle);\n }\n\n return styles;\n }\n}\n","<div class=\"toolbox-wrapper\" \n cdkDrag \n cdkDragBoundary=\".map-container\"\n [cdkDragFreeDragPosition]=\"dragPosition\"\n (cdkDragEnded)=\"onDragEnded($event)\">\n <div class=\"drag-handle-toolbox\" cdkDragHandle>\n <mat-icon>handyman</mat-icon>\n <mat-icon class=\"toggle-icon\" (click)=\"toggleCollapsed($event)\">{{ collapsed ? 'flip_to_front' : 'remove' }}</mat-icon> </div>\n <div class=\"toolbox-container\" [class.collapsed]=\"collapsed\">\n @if(!collapsed) {\n <div class=\"toolbox-content\">\n @if (settings.geometryTypeSettings && settings.geometryTypeSettings.length) {\n <mat-select class=\"geometry-selector\" (selectionChange)=\"settingsChanged($event)\" [(ngModel)]=\"selectedGeometrySetting\" [compareWith]=\"compareGeometrySetting\">\n @for (setting of settings.geometryTypeSettings; track setting) {\n <mat-option [value]=\"setting\">{{setting.typeName}}</mat-option>\n }\n </mat-select> \n }\n <div class=\"all-tools-container\">\n <div class=\"main-tools\">\n @if(!settings?.undoDisabled) {\n <img \n [src]=\"undoIconBase64\" \n class=\"compact-icon custom-image-icon\"\n (click)=\"undo()\" \n matTooltip=\"Fortryd\" \n [matTooltipShowDelay]=\"200\"\n [matTooltipHideDelay]=\"300\" \n matTooltipClass=\"custom-tooltip\"\n matTooltipPosition=\"below\"\n alt=\"Undo\">\n\n <img \n [src]=\"redoIconBase64\" \n class=\"compact-icon custom-image-icon\"\n (click)=\"redo()\" \n matTooltip=\"Gentag\" \n [matTooltipShowDelay]=\"200\"\n [matTooltipHideDelay]=\"300\" \n matTooltipClass=\"custom-tooltip\"\n matTooltipPosition=\"below\"\n alt=\"Redo\">\n }\n <mat-slide-toggle [(ngModel)]=\"snap\" (change)=\"onSnapChange()\">Snap</mat-slide-toggle>\n @if(settings.editEnabled) {\n <img \n [src]=\"editIconBase64\" \n [class.active]=\"activeMode === 'edit'\" \n class=\"compact-icon custom-image-icon\"\n (click)=\"startEdit()\" \n matTooltip=\"Rediger\" \n [matTooltipShowDelay]=\"200\"\n [matTooltipHideDelay]=\"300\" \n matTooltipClass=\"custom-tooltip\"\n matTooltipPosition=\"below\"\n alt=\"Rediger\">\n\n <img \n [src]=\"removePointsIconBase64\" \n [class.active]=\"activeMode === 'edit-remove'\" \n class=\"compact-icon custom-image-icon\"\n (click)=\"startEditRemovePoints()\" \n matTooltip=\"Fjern punkter\" \n [matTooltipShowDelay]=\"200\"\n [matTooltipHideDelay]=\"300\" \n matTooltipClass=\"custom-tooltip\"\n matTooltipPosition=\"below\"\n alt=\"Fjern punkter\">\n }\n @if(settings.cutHoleEnabled) {\n <img \n [src]=\"trimIconBase64\" \n class=\"compact-icon custom-image-icon\"\n [class.active]=\"activeMode === 'clip-hole'\" \n (click)=\"clipHole()\" \n matTooltip=\"Klip hul\" \n [matTooltipShowDelay]=\"200\"\n [matTooltipHideDelay]=\"300\" \n matTooltipClass=\"custom-tooltip\"\n matTooltipPosition=\"below\"\n alt=\"Klip hul\">\n }\n @if(settings.splitEnabled) {\n <img \n [src]=\"splitIconBase64\" \n class=\"compact-icon custom-image-icon\"\n [class.active]=\"activeMode === 'split'\"\n (click)=\"split()\" \n matTooltip=\"Skær over\" \n [matTooltipShowDelay]=\"200\"\n [matTooltipHideDelay]=\"300\" \n matTooltipClass=\"custom-tooltip\"\n matTooltipPosition=\"below\"\n alt=\"Skær over\">\n }\n @if(settings.changeTypeEnabled) {\n <mat-icon \n class=\"compact-icon\" \n [class.active]=\"activeMode === 'change-type'\" \n (click)=\"startChangeType()\"\n [matTooltipShowDelay]=\"200\"\n matTooltipClass=\"custom-tooltip\"\n [matTooltipHideDelay]=\"300\" \n matTooltip=\"Skift type\" \n matTooltipPosition=\"below\">\n find_replace\n </mat-icon>\n }\n @if(settings.mergeEnabled) {\n <mat-icon \n class=\"compact-icon\" \n (click)=\"startMergeFeatures()\" \n matTooltipPosition=\"below\"\n [matTooltipShowDelay]=\"200\"\n matTooltipClass=\"custom-tooltip\"\n [matTooltipHideDelay]=\"300\" \n matTooltip=\"Saml flader\" \n [class.active]=\"activeMode === 'merge-features'\">\n merge\n </mat-icon>\n }\n @if(settings.centerPoint) {\n <mat-icon\n (click)=\"setCenterPoint()\"\n matTooltipPosition=\"below\"\n [matTooltipShowDelay]=\"200\"\n matTooltipClass=\"custom-tooltip\"\n [matTooltipHideDelay]=\"300\" \n matTooltip=\"Sæt centerpunkt\" \n [class.active]=\"activeMode === 'center-point'\"\n >adjust</mat-icon>\n }\n </div>\n @if(selectedGeometrySetting && selectedGeometrySetting.availableGeometryTypes?.length) {\n <div class=\"geometry-tools\">\n @for(geomType of selectedGeometrySetting.availableGeometryTypes;track geomType) {\n @if(geomType === 'Polygon') {\n <img \n [src]=\"polygonIconBase64\" \n [class.active]=\"activeMode === 'draw-polygon'\"\n class=\"compact-icon primary custom-image-icon\"\n (click)=\"startDrawPolygon()\" \n matTooltip=\"Polygon\" \n [matTooltipShowDelay]=\"200\"\n [matTooltipHideDelay]=\"300\" \n matTooltipClass=\"custom-tooltip\"\n matTooltipPosition=\"below\"\n alt=\"Polygon\">\n }\n @if(geomType === 'LineString') {\n <img \n [src]=\"lineStringIconBase64\" \n [class.active]=\"activeMode === 'draw-linestring'\"\n class=\"compact-icon primary custom-image-icon\"\n (click)=\"startDrawLineString()\" \n matTooltip=\"LineString\" \n [matTooltipShowDelay]=\"200\"\n [matTooltipHideDelay]=\"300\" \n matTooltipClass=\"custom-tooltip\"\n matTooltipPosition=\"below\"\n alt=\"LineString\">\n }\n @if(geomType === 'Point') {\n <img \n [src]=\"pointIconBase64\" \n [class.active]=\"activeMode === 'draw-point'\"\n class=\"compact-icon primary custom-image-icon\"\n (click)=\"startDrawPoint()\" \n matTooltip=\"Punkter\" \n [matTooltipShowDelay]=\"200\"\n [matTooltipHideDelay]=\"300\" \n matTooltipClass=\"custom-tooltip\"\n matTooltipPosition=\"below\"\n alt=\"Punkter\">\n }\n }\n <img \n [src]=\"wktIconBase64\" \n class=\"compact-icon secondary custom-image-icon\"\n (click)=\"activateShowInputWKT()\" \n matTooltip=\"WKT\" \n [matTooltipShowDelay]=\"200\"\n [matTooltipHideDelay]=\"300\" \n matTooltipClass=\"custom-tooltip\"\n matTooltipPosition=\"below\"\n alt=\"WKT\">\n </div>\n }\n <div class=\"tool-separator\" *ngIf=\"deleteEnabled || showMeasureDistance || showMeasureArea || profile.showPrint\"></div>\n <div class=\"measurement-print-tools\">\n <div class=\"measurement-tools\">\n @if (deleteEnabled) {\n <img \n [src]=\"deleteIconBase64\" \n class=\"compact-icon custom-image-icon\"\n [class.active]=\"activeMode === 'delete'\"\n (click)=\"startDelete()\" \n matTooltip=\"Slet\" \n [matTooltipShowDelay]=\"200\"\n [matTooltipHideDelay]=\"300\" \n matTooltipClass=\"custom-tooltip\"\n matTooltipPosition=\"below\"\n alt=\"Slet\">\n }\n @if (showMeasureDistance) {\n <img \n [src]=\"measureDistanceIconBase64\" \n class=\"compact-icon custom-image-icon\"\n [class.active]=\"activeMode === 'measure-distance'\"\n (click)=\"startMeasureLength()\" \n matTooltip=\"Måle afstand\" \n [matTooltipShowDelay]=\"200\"\n [matTooltipHideDelay]=\"300\" \n matTooltipClass=\"custom-tooltip\"\n matTooltipPosition=\"below\"\n alt=\"Måle afstand\">\n }\n @if(showMeasureArea) {\n <img \n [src]=\"measureAreaIconBase64\" \n class=\"compact-icon custom-image-icon\"\n [class.active]=\"activeMode === 'measure-area'\"\n (click)=\"startMeasureArea()\" \n matTooltip=\"Måle areal\" \n [matTooltipShowDelay]=\"200\"\n [matTooltipHideDelay]=\"300\" \n matTooltipClass=\"custom-tooltip\"\n matTooltipPosition=\"below\"\n alt=\"Måle areal\">\n }\n </div>\n @if(profile.showPrint) {\n <div class=\"tool-separator print-separator\"></div>\n <div class=\"print-tools\">\n <img \n [src]=\"printBase64\" \n class=\"compact-icon custom-image-icon\"\n [class.active]=\"active === 'Print'\"\n (click)=\"startPrintMode()\" \n matTooltip=\"Udskriv\" \n [matTooltipShowDelay]=\"200\"\n [matTooltipHideDelay]=\"300\" \n matTooltipClass=\"custom-tooltip\"\n matTooltipPosition=\"below\"\n alt=\"Udskriv\">\n <img \n [src]=\"drawBase64\" \n class=\"compact-icon custom-image-icon\"\n [class.active]=\"active === 'Draw'\"\n (click)=\"startDrawMode()\" \n matTooltip=\"Tegn\" \n [matTooltipShowDelay]=\"200\"\n [matTooltipHideDelay]=\"300\" \n matTooltipClass=\"custom-tooltip\"\n matTooltipPosition=\"below\"\n alt=\"Tegn\">\n </div>\n }\n </div>\n </div>\n @if(showInputWKT) {\n <div class=\"wkt-section\">\n <input class=\"compact-input\" [(ngModel)]=\"WKTString\">\n <div class=\"wkt-actions\">\n <button class=\"compact-button primary\" (click)=\"ReadWKT()\">Indlæs WKT</button>\n <button class=\"compact-button\" (click)=\"cancelWKT()\">Annuller</button>\n </div>\n </div>\n }\n @if(profile.showPrint) {\n @if(active === \"Print\") {\n <div class=\"print-config\">\n <img \n [src]=\"printBase64\" \n class=\"compact-icon\"\n (click)=\"doPrint()\" \n alt=\"Udskriv\"> \n <span class=\"icon-separator\">i</span>\n <select id=\"formatSelector\" [(ngModel)]=\"format\">\n <option value=\"image/png\" selected>.PNG</option>\n <option value=\"image/jpeg\">.JPG</option>\n </select>\n <select id=\"dimensionSelector\" [(ngModel)]=\"dimId\" (change)=\"handleDimensionSelected()\">\n <option value=\"99\" selected></option>\n <option value=\"0\">1920 X 1080</option>\n <option value=\"1\">1680 X 1050</option>\n <option value=\"2\">1280 X 800</option>\n <option value=\"3\">800 X 600</option>\n </select>\n <input type=\"text\" [(ngModel)]=\"mapWidth\"/> \n <span class=\"icon-separator\">x</span>\n <input type=\"text\" [(ngModel)]=\"mapHeight\"/>\n <button (click)=\"setNewMapDimensions()\">Vælg</button>\n </div>\n }\n @if(active === \"PrintDraw\") {\n <div class=\"print-draw-config\">\n <span class=\"icon-separator\">Label</span>\n <input type=\"text\" [(ngModel)]=\"printDrawLabel\"/>\n <select id=\"drawToolSelector\" [(ngModel)]=\"printDrawTool\" (change)=\"handlePrintDrawToolChanged()\">\n <option value=\"Arrow\" selected>Pil</option>\n <option value=\"Point\">Punkt</option>\n <option value=\"LineString\">Linje</option>\n <option value=\"Polygon\">Polygon</option>\n <option value=\"Circle\">Cirkel</option>\n <option value=\"Square\">Kvadrat</option>\n <option value=\"Rectangle\">Firkant</option>\n </select>\n <button class=\"compact-button\" (click)=\"handleClearPrintDrawFeatures()\">Ryd</button>\n </div>\n }\n }\n </div>\n }\n </div>\n</div>\n","import { Component, inject, Input, OnInit } from '@angular/core';\nimport { DrawLayerSourceService } from '../../services/drawLayerSource.service';\nimport { FeatureHelperService } from '../../services/featureHelper.service';\nimport { getArea } from 'ol/sphere';\nimport { MatExpansionModule } from '@angular/material/expansion';\nimport { MatIconModule } from '@angular/material/icon';\nimport { CommonModule } from '@angular/common';\nimport { GisKomponentSettings } from '../../models/GisKomponentSettings';\nimport Feature from 'ol/Feature';\nimport { DragDropModule, CdkDragEnd } from '@angular/cdk/drag-drop';\nimport { HighlightService } from '../../services/highlight.service';\nimport { ZoomService } from '../../services/zoom.service';\nimport { FormsModule } from '@angular/forms';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { UndoRedoService } from '../../services/UndoRedo.service';\nimport { CenterPointService } from '../../services/centerPoint.service';\ninterface IFeature { \n locked: boolean;\n area: string;\n id: string | number;\n feature: Feature;\n}\n\ninterface IFeatures {\n display: string;\n featureType: string;\n features: IFeature[];\n}\n\n@Component({\n selector: 'activeObjects',\n styleUrl: './activeObjects.component.scss',\n templateUrl: './activeObjects.component.html',\n imports: [CommonModule, FormsModule, MatExpansionModule, MatIconModule, DragDropModule, MatTooltipModule]\n})\nexport class ActiveObjectsComponent implements OnInit {\n\n private _drawLayerService = inject(DrawLayerSourceService);\n private _centerPointService = inject(CenterPointService);\n private _undoRedo = inject(UndoRedoService);\n \n features$ = this._drawLayerService.features$;\n collapsed = false;\n\n @Input({ required: true}) settings!: GisKomponentSettings;\n\n activeFeatures: IFeatures[] = [];\n private _featureHelper = inject(FeatureHelperService);\n private _highlight = inject(HighlightService);\n private _zoomService = inject(ZoomService);\n\n opacity: number = 1;\n dragPosition = { x: 0, y: 0 };\n highlightedId: string | number | null = null;\n private readonly POSITION_STORAGE_KEY = 'activeObjects';\n constructor() {\n this.features$.subscribe({ \n next: features => {\n const featureTypes = [ ... new Set(features.map(f => this._featureHelper.typeId(f)).filter(typeId => !!typeId))];\n const featuresObj: IFeatures[] = featureTypes\n .map(ft => ({ featureType: ft, \n display: this.settings.geometryTypeSettings.find(gts => gts.typeId === ft)!.typeName,\n features: features.filter(f => this._featureHelper.typeId(f) === ft)\n .map(f => ({ \n id: f.getId()!, \n feature: f, \n locked: this._featureHelper.isLocked(f), \n area: this._getAreaString(f) }))}))\n this.activeFeatures = [...featuresObj];\n }});\n }\n\n ngOnInit(): void {\n this._loadPosition();\n }\n private _getAreaString(feature: Feature): string {\n if (feature.getGeometry()?.getType() !== 'Polygon') { // We only have polygon, linestring and points and only polygons have area\n return ''; \n }\n return this.settings.sizeInHa ? `(${(getArea(feature.getGeometry()!) /10000).toFixed(2)} ha)` : `(${getArea(feature.getGeometry()!).toFixed(2)} m2)`;\n }\n\n reset(): void {\n this._undoRedo.reset();\n this.highlightedId = null;\n this._highlight.clear();\n this.zoomToAll();\n }\n\n zoomToAll(): void {\n this._zoomService.zoomToFeatures(this._drawLayerService.allFeatures);\n }\n\n highlight(id: number | string): void {\n if (this.highlightedId === id) {\n this.highlightedId = null;\n this._highlight.clear();\n return;\n }\n this.highlightedId = id;\n this._highlight.clear();\n this._drawLayerService.allFeatures.filter(f => f.getId() === id).forEach(f => this._highlight.highlight(f));\n }\n\n updateOpacity(): void {\n this._drawLayerService.layer.setOpacity(this.opacity)\n }\n\n stopDrag(event: Event): void {\n event.stopPropagation(); // prevents drag container from activating\n }\n\n delete(id: string | number): void {\n this._drawLayerService.remove(id);\n this._centerPointService.handleFeatureDeleted(id);\n this._highlight.clear();\n }\n \n togglePanel(): void {\n this.collapsed = !this.collapsed;\n }\n onDragEnded(event: CdkDragEnd): void {\n const position = event.source.getFreeDragPosition();\n this.dragPosition = position;\n this._savePosition(position);\n }\n private _savePosition(position: { x: number; y: number }): void {\n try {\n localStorage.setItem(this.POSITION_STORAGE_KEY, JSON.stringify(position));\n } catch (error) {\n console.error('Error saving position to localStorage:', error);\n }\n }\n private _loadPosition(): void {\n try {\n const savedPosition = localStorage.getItem(this.POSITION_STORAGE_KEY);\n if (savedPosition) {\n this.dragPosition = JSON.parse(savedPosition);\n }\n } catch (error) {\n console.error('Error loading position from localStorage:', error);\n this.dragPosition = { x: 0, y: 0 };\n }\n }\n}","<div class=\"active-objects-wrapper\" \n cdkDrag \n cdkDragBoundary=\".map-container\" \n [cdkDragFreeDragPosition]=\"dragPosition\"\n (cdkDragEnded)=\"onDragEnded($event)\"\n [class.collapsed]=\"collapsed\">\n <div class=\"drag-handle-active-objects\" cdkDragHandle>\n <mat-icon class=\"zoom-icon\" (click)=\"zoomToAll()\">dynamic_form</mat-icon>\n <mat-icon class=\"toggle-icon\" (click)=\"togglePanel()\">\n {{ collapsed ? 'flip_to_front' : 'remove' }}\n </mat-icon>\n </div>\n <div class=\"active-objects-container\">\n @if(!collapsed) {\n <input \n type=\"range\"\n min=\"0\"\n max=\"1\"\n step=\"0.05\"\n [(ngModel)]=\"opacity\"\n (input)=\"updateOpacity()\"\n (mousedown)=\"stopDrag($event)\"\n (touchstart)=\"stopDrag($event)\"\n (pointerdown)=\"stopDrag($event)\"\n >\n }\n\n @if(!collapsed) {\n <div class=\"active-objects-content\">\n <mat-icon class=\"zoom-icon\" (click)=\"zoomToAll()\">highlight</mat-icon>\n <mat-icon (click)=\"reset()\">replay</mat-icon>\n @for(featureTypeObj of activeFeatures; track featureTypeObj.featureType) {\n <mat-expansion-panel>\n <mat-expansion-panel-header \n [matTooltip]=\"featureTypeObj.display\" \n [matTooltipShowDelay]=\"200\"\n [matTooltipHideDelay]=\"300\" \n matTooltipPosition=\"right\">\n <span class=\"panel-title\">\n {{featureTypeObj.display}} ({{featureTypeObj.features.length}})\n </span>\n </mat-expansion-panel-header>\n <div class=\"item-list\">\n @for(item of featureTypeObj.features; track item.id) {\n <div class=\"item\">\n <div class=\"item-text\">\n <span class=\"item-id\">{{item.id}}</span>\n <span class=\"item-area\">{{item.area}}</span>\n </div>\n @if(!item.locked) {\n <mat-icon (click)=\"delete(item.id)\">delete</mat-icon>\n }\n <mat-icon (click)=\"highlight(item.id)\" [class.highlight-active]=\"highlightedId === item.id\">highlight</mat-icon>\n </div>\n }\n </div>\n </mat-expansion-panel>\n }\n </div>\n }\n </div> \n</div>","import { Injectable } from '@angular/core';\nimport { mergeWith, Observable, Subject, take, takeUntil } from 'rxjs';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class SearchProviderService {\n private _cancelSearch = new Subject();\n maxSearchResults = 8;\n searchProviders: SearchProvider[] = [];\n\n search(searchString: string): Observable<SearchResponse[]> {\n this._cancelSearch.next('');\n let combinedSearch: Observable<SearchResponse[]> = new Observable<SearchResponse[]>();\n this.searchProviders.forEach(searchProvider => {\n const search = searchProvider\n .search(searchString, this.maxSearchResults) \n .pipe(takeUntil(this._cancelSearch.asObservable()))\n .pipe(take(this.maxSearchResults))\n \n combinedSearch = combinedSearch ? combinedSearch.pipe(mergeWith(search)) : search;\n });\n return combinedSearch;\n }\n}\n\nexport interface SearchProvider {\n name: string;\n search(searchString: string, maxCount?: number): Observable<SearchResponse[]>;\n onSelect(searchResult: SearchResponse, targetSrs?: string): void;\n onClear(): void;\n}\n\nexport interface SearchResponseItem {\n wkt: string;\n header: string;\n}\n\nexport interface SearchResponse {\n total: number;\n title: string;\n items: SearchResponseItem[];\n}","\nimport { HttpClient } from '@angular/common/http';\nimport WFS from 'ol/format/WFS';\nimport WKT from 'ol/format/WKT';\nimport GeoJSON, { GeoJSONFeature } from 'ol/format/GeoJSON';\nimport { like } from 'ol/format/filter';\nimport { map } from 'rxjs/operators';\nimport { FeatureCollection } from 'geojson'\nimport { Feature } from 'ol';\nimport { combineLatest, Observable, of } from 'rxjs';\nimport { SearchProvider, SearchResponse } from './searchProvider.service';\nimport { inject, Injectable } from '@angular/core';\n\nexport interface WfsFeatureCollection extends FeatureCollection {\n numberMatched?: number;\n numberReturned?: number;\n timeStamp?: string;\n next?: string;\n previous?: string;\n}\n\nexport interface SearchableLayer {\n featureType: string;\n baseUrl: string;\n searchField: string;\n headerField: string;\n name: string;\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class WFSSearchService implements SearchProvider {\n\n name: string = 'WFS Search';\n private _http = inject(HttpClient);\n\n private wfsFormat = new WFS();\n private wktFormat = new WKT();\n private _searcheableLayers: SearchableLayer[] = [];\n private geoJsonFormat = new GeoJSON({ dataProjection: 'EPSG:25832', featureProjection: 'EPSG:25832'});\n private _serializer = new XMLSerializer();\n\n search(searchValue: string, maxCount: number = 5): Observable<SearchResponse[]> {\n const wftSearches: Observable<SearchResponse>[] = [];\n this._searcheableLayers.flatMap(layer => {\n const filter = like(layer.searchField, `*${searchValue}*`, '*', '?', '/', false);\n var searchFeature = this.wfsFormat.writeGetFeature({\n featureTypes: [layer.featureType.includes(':') ? layer.featureType.split(':')[1] : ''],\n outputFormat: 'application/json',\n featureNS: '',\n featurePrefix: '',\n srsName: 'EPSG:25832',\n maxFeatures: maxCount,\n filter\n });\n\n wftSearches.push(this._http.post<WfsFeatureCollection>(layer.baseUrl.replace('wms', 'wfs'), this._serializer.serializeToString(searchFeature), { headers: { 'Content-Type': 'text/xml'}, responseType: 'json'}).pipe(map(r => { \n const result: SearchResponse = {\n title: layer.name,\n total: r.numberMatched ?? 0,\n items: r.features.map(f => ({ header: f.properties![layer.headerField], wkt: this._formatWKT(f) }))\n };\n return result;\n })));\n });\n return combineLatest(wftSearches);\n }\n\n onSelect(searchResult: SearchResponse, targetSrs?: string): void {\n // TO DO : add logic for when an item is selected (right now, the map search component does a highlight on it)\n }\n onClear(): void {\n // TO DO : add logic for when the results list is cleared\n }\n\n setSearcheableLayers(layers: SearchableLayer[]) {\n console.log('setSearcheableLayers', layers);\n this._searcheableLayers = layers;\n }\n\n private _formatWKT(feature: GeoJSONFeature): string {\n const olFeature: Feature = this.geoJsonFormat.readFeature(feature) as Feature;\n return this.wktFormat.writeFeature(olFeature);\n }\n\n}","import { Component, inject, Input, OnInit } from '@angular/core';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatAutocompleteModule } from '@angular/material/autocomplete';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { MatOptionModule } from '@angular/material/core';\nimport { MatIconModule } from '@angular/material/icon';\nimport { DragDropModule, CdkDragEnd } from '@angular/cdk/drag-drop';\nimport { HighlightService } from '../../services/highlight.service';\nimport { debounceTime, distinctUntilChanged, Subject, switchMap } from 'rxjs';\nimport { SearchProviderService, SearchResponse } from '../../services/searchProvider.service';\nimport { SearchableLayer, WFSSearchService } from '../../services/wfsSearch.service';\nimport { Profile } from '../../models/profile';\nimport { LayerHelperService } from '../../services/layerHelper.service';\nimport { CachedProfileInfo } from '../layer-selector/layer-selector.component';\n\n@Component({\n selector: 'lib-map-search',\n templateUrl: './map-search.component.html',\n styleUrls: ['./map-search.component.scss'],\n imports: [\n CommonModule,\n FormsModule,\n MatFormFieldModule,\n MatInputModule,\n MatAutocompleteModule,\n MatOptionModule,\n MatIconModule,\n DragDropModule\n ]\n})\nexport class MapSearchComponent implements OnInit {\n searchAddress: string = '';\n @Input() profile!: Profile;\n // allResults = ['address1', 'address2', 'address3', 'address4'];\n filteredResults: SearchResponse[] = [];\n collapsed = true;\n dragPosition = { x: 0, y: 0 };\n private readonly POSITION_STORAGE_KEY = 'mapSearchPosition';\n private readonly _mapFilteredLayerGroupsKeyName: string = 'mapFilteredLayerGroups';\n private _highlight = inject(HighlightService);\n private _searchSubject = new Subject<string>();\n private _searchService = inject(SearchProviderService);\n private _searchProviderService = inject(SearchProviderService);\n private _wfsSearch = inject(WFSSearchService);\n private _layerHelperService: LayerHelperService = inject(LayerHelperService);\n\n ngOnInit(): void {\n this._layerHelperService.activeLayersChanged\n .subscribe(() => this._addWFSSearchLayers());\n this.filterResults();\n this._loadPosition();\n this._addWFSSearch();\n this._searchSubject.pipe(\n debounceTime(200),\n distinctUntilChanged(),\n switchMap(value => this._searchService.search(value))\n ).subscribe({\n next: result => {\n console.log('search results', result);\n this.filteredResults = result; \n }\n });\n }\n\n private _addWFSSearch(): void{\n this._searchProviderService.searchProviders = [];\n this._searchProviderService.searchProviders.push(this._wfsSearch);\n }\n\n private _addWFSSearchLayers(): void {\n if (this.profile) {\n const cacheValue = localStorage.getItem(`${this._mapFilteredLayerGroupsKeyName}_${this.profile.id}`);\n if (cacheValue) {\n const cachedProfileInfo: CachedProfileInfo = JSON.parse(cacheValue);\n const visibleLayerIds = cachedProfileInfo.cachedLayerGroups\n .flatMap(group => group.layers)\n .filter(layer => layer.visible)\n .map(layer => layer.id);\n const searcheableLayers: SearchableLayer[] = cachedProfileInfo.profile\n .layerGroups.flatMap(group => group.layers)\n .filter(layer => layer.wfsSearchable && visibleLayerIds.includes(layer.id))\n .map(layer => ({featureType: layer.layers, baseUrl: layer.baseUrl!, name: layer.name,\n headerField: layer.headerField!, searchField: layer.searchField!\n }));\n this._wfsSearch.setSearcheableLayers(searcheableLayers);\n }\n }\n }\n\n filterResults(): void {\n if (!this.searchAddress) {\n this.filteredResults = [];\n return;\n }\n this._searchSubject.next(this.searchAddress);\n // this._wfsSearch.search(this.searchAddress).subscribe(r => {\n // this.filteredResults = [r]; \n // });\n }\n\n toggleSearch(): void {\n this.collapsed = !this.collapsed;\n if (this.collapsed) {\n this.searchAddress = '';\n this.filterResults();\n }\n }\n\n highlight(wkt: string, event: MouseEvent): void {\n event.stopPropagation();\n this._highlight.highlight(wkt);\n }\n\n onDragEnded(event: CdkDragEnd): void {\n const position = event.source.getFreeDragPosition();\n this.dragPosition = position;\n this._savePosition(position);\n }\n\n private _savePosition(position: { x: number; y: number }): void {\n try {\n localStorage.setItem(this.POSITION_STORAGE_KEY, JSON.stringify(position));\n } catch (error) {\n console.error('Error saving position to localStorage:', error);\n }\n }\n\n private _loadPosition(): void {\n try {\n const savedPosition = localStorage.getItem(this.POSITION_STORAGE_KEY);\n if (savedPosition) {\n this.dragPosition = JSON.parse(savedPosition);\n }\n } catch (error) {\n console.error('Error loading position from localStorage:', error);\n this.dragPosition = { x: 0, y: 0 };\n }\n }\n}","<div class=\"search-container\" \n cdkDrag \n cdkDragBoundary=\".map-container\" \n [cdkDragFreeDragPosition]=\"dragPosition\"\n (cdkDragEnded)=\"onDragEnded($event)\"\n [class.collapsed]=\"collapsed\">\n <div class=\"drag-handle\" cdkDragHandle>\n <mat-icon>search</mat-icon>\n <mat-icon class=\"toggle-icon\" (click)=\"toggleSearch()\">{{ collapsed ? 'flip_to_front' : 'remove' }}</mat-icon>\n </div>\n <div class=\"search-content\" *ngIf=\"!collapsed\">\n <mat-form-field appearance=\"outline\" class=\"search-field\">\n <mat-label>Søge</mat-label>\n <input\n type=\"text\"\n matInput\n [(ngModel)]=\"searchAddress\"\n [matAutocomplete]=\"auto\"\n (input)=\"filterResults()\"\n />\n <mat-autocomplete #auto=\"matAutocomplete\">\n <mat-option *ngFor=\"let result of filteredResults\" [value]=\"result\" class=\"search-result-option\">\n {{ result.title }} ({{result.items.length}} af {{ result.total }})\n <div *ngFor=\"let item of result.items\" class=\"search-result-item\">\n {{item.header}} \n <mat-icon (click)=\"highlight(item.wkt, $event)\">highlight</mat-icon>\n </div>\n </mat-option>\n </mat-autocomplete>\n </mat-form-field>\n </div>\n</div>","import { inject, Injectable } from '@angular/core';\nimport { GISKOMPONENT_CONFIG } from '../config/config';\nimport { Observable } from 'rxjs';\nimport { HttpClient } from '@angular/common/http';\nimport { ILayerDetailed } from '../models/ILayer';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class LayerService {\n\n private config = inject(GISKOMPONENT_CONFIG);\n private _baseUrl = this.config.apiBaseUrl;\n private _http = inject(HttpClient);\n\n getByIds(layerIds: number[]): Observable<ILayerDetailed[]> {\n return this._http.put<ILayerDetailed[]>(this._baseUrl + '/api/layer/byIds', { layerIds: layerIds });\n }\n}","import { Component, ElementRef, inject, Input, OnChanges, OnInit, SimpleChanges, ViewChild } from '@angular/core';\nimport { DragDropModule } from '@angular/cdk/drag-drop';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { CommonModule } from '@angular/common';\nimport { MatIconModule } from '@angular/material/icon';\nimport { FormsModule } from '@angular/forms';\nimport { MatExpansionModule } from '@angular/material/expansion';\nimport { MatInputModule } from '@angular/material/input';\nimport Map from 'ol/Map';\nimport ol_control_Control from 'ol/control/Control';\nimport { GISKOMPONENT_CONFIG } from '../../config/config';\nimport { LayerService } from '../../services/layer.service';\nimport { LayerSelectorGroup, Profile } from '../../models/profile';\nimport { ILayer, ILayerDetailed } from '../../models/ILayer';\nimport { LayerHelperService } from '../../services/layerHelper.service';\nimport { HttpClient } from '@angular/common/http';\nimport { catchError, forkJoin, map, Observable, of, switchMap } from 'rxjs';\n\ninterface ILayerDetailedWithUrl extends ILayerDetailed {\n imageUrl: string;\n}\n\n@Component({\n selector: 'lib-legends-list',\n templateUrl: './legends-list.component.html',\n styleUrls: ['./legends-list.component.scss'],\n imports: [ MatFormFieldModule, CommonModule, MatIconModule, FormsModule, DragDropModule, \n MatExpansionModule, MatInputModule ]\n})\nexport class LegendsListComponent implements OnInit, OnChanges {\n private readonly _http = inject(HttpClient);\n ngOnInit(): void {\n this._initializeMapIconControl();\n this._layerHelperService.activeLayersChanged.subscribe(() => this._setFilteredLegends().subscribe(result => this.filteredLayersDetailed = result));\n }\n \n ngOnChanges(changes: SimpleChanges): void {\n if (changes['profile'] && this.profile) this._setFilteredLegends().subscribe(result => this.filteredLayersDetailed = result);\n }\n \n @ViewChild('legendsListIcon', { static: false }) set contentIcon(content: ElementRef) {\n this._legendsListIcon = content;\n }\n @ViewChild('legendsListBody', { static: false }) set contentBody(content: ElementRef) {\n this._legendsListBody = content;\n }\n @Input() map!: Map;\n @Input() profile!: Profile;\n searchText = '';\n filteredLayersDetailed: ILayerDetailedWithUrl[] = [];\n showList: boolean = false;\n private config = inject(GISKOMPONENT_CONFIG);\n private _baseUrl = this.config.apiBaseUrl;\n private _legendsListIcon!: ElementRef;\n private _legendsListIconControl!: ol_control_Control;\n private _legendsListBody!: ElementRef;\n private _legendsListBodyControl!: ol_control_Control;\n private readonly _mapFilteredLayerGroupsKeyName: string = 'mapFilteredLayerGroups';\n private readonly _layerService: LayerService = inject(LayerService);\n private readonly _layerHelperService: LayerHelperService = inject(LayerHelperService);\n\n toggleLegendsList(): void {\n this.showList = !this.showList;\n if (this.showList) {\n this._addMapBodyControl();\n } else {\n this._removeMapBodyControl();\n }\n }\n\n private _initializeMapIconControl(): void {\n this.map.removeControl(this._legendsListIconControl);\n const element = this._legendsListIcon?.nativeElement;\n if (element) {\n this._legendsListIconControl = new ol_control_Control({ element: element });\n this.map.addControl(this._legendsListIconControl);\n }\n }\n\n private _getImageUrl(fileName: string): string {\n return `${this._baseUrl}/api/image/${fileName}`;\n }\n\n private _addMapBodyControl(): void {\n this.map.removeControl(this._legendsListBodyControl);\n const element = this._legendsListBody.nativeElement;\n this._legendsListBodyControl = new ol_control_Control({ element: element });\n this.map.addControl(this._legendsListBodyControl);\n }\n\n private _removeMapBodyControl(): void {\n this.map.removeControl(this._legendsListBodyControl);\n }\n\n private _setFilteredLegends(): Observable<ILayerDetailedWithUrl[]> {\n if (!this.profile?.id) {\n return of([]);\n }\n const cacheValue = localStorage.getItem(`${this._mapFilteredLayerGroupsKeyName}_${this.profile?.id}`);\n if (!cacheValue) {\n return of([]);\n }\n const layerIdsCachedToDisplay = JSON.parse(cacheValue).cachedLayerGroups\n .flatMap((lg: LayerSelectorGroup) => lg.layers)\n .filter((l: ILayer) => l.visible)\n .map((l: ILayer) => l.id );\n \n if (!layerIdsCachedToDisplay) {\n return of([]);\n }\n return this._layerService.getByIds(layerIdsCachedToDisplay)\n .pipe(switchMap(layers => {\n const enriched$ = layers.map(layer => this.resolveLegendImage(layer));\n return forkJoin(enriched$); // Wait until all items are enriched\n }))\n }\n\n private resolveLegendImage(layer: ILayerDetailed): Observable<ILayerDetailedWithUrl> {\n if (layer.legend?.imageName) {\n return of({\n ...layer,\n imageUrl: this._getImageUrl(layer.legend.imageName)\n });\n }\n\n if (layer.legend?.imageExternalURL) {\n return of({\n ...layer,\n imageUrl: layer.legend.imageExternalURL\n });\n }\n\n // Fallback to Geoserver legend file\n const fallbackUrl = `${layer.baseUrl}?service=WMS&REQUEST=GetLegendGraphic&VERSION=1.0.0&FORMAT=image/png&WIDTH=20&HEIGHT=20&STRICT=false&layer=${layer.layers}`;\n \n return this._http.get(fallbackUrl, { responseType: 'blob' }).pipe(\n map(blob => {\n // Blob returned as an image, so layer has a legend in Geoserver\n const isImage = blob.type.startsWith('image/');\n return {\n ...layer,\n imageUrl: isImage ? fallbackUrl : ''\n };\n }),\n catchError(() =>\n of({\n ...layer,\n imageUrl: '' // fallback failed, layer has no legend on Geoserver\n })\n )\n );\n }\n}\n","<div #legendsListIcon class=\"ol-unselectable ol-control legends-list-icon\">\n <mat-icon (click)=\"toggleLegendsList()\">area_chart</mat-icon>\n</div>\n<div #legendsListBody [class.display-none]=\"!showList\" class=\"legends-list-body-wrapper\" cdkDrag cdkDragBoundary=\".map-container\">\n <div class=\"drag-handle-selector\" cdkDragHandle>\n <div class=\"drag-handle-content\">\n <div class=\"drag-handle-icons\">\n <mat-icon class=\"drag-indicator-right\">open_with</mat-icon>\n <mat-icon class=\"minimize-button\" (click)=\"toggleLegendsList()\">minimize</mat-icon>\n </div>\n </div>\n </div>\n <div class=\"ol-unselectable ol-control legends-list-body\">\n <div class=\"item-list\">\n @for (layer of filteredLayersDetailed; track layer.id; let iIndex = $index) {\n @if (layer.imageUrl) {\n <mat-expansion-panel expanded=\"true\"> \n <mat-expansion-panel-header>\n <mat-panel-title>\n <div class=\"item\" ><span>{{ layer.name }}</span></div>\n </mat-panel-title>\n </mat-expansion-panel-header>\n <div class=\"legend\">\n <span><img [src]=\"layer.imageUrl\" class=\"legend-thumbnail\"/></span>\n </div>\n </mat-expansion-panel>\n }\n }\n </div>\n </div>\n</div>","import { inject, Injectable } from '@angular/core';\nimport { KomponentSettingsHelperService } from './komponentSettingsHelper.service';\n\nimport GeoJSON from 'ol/format/GeoJSON';\nimport { DrawLayerSourceService } from './drawLayerSource.service';\nimport { CurrentItemsService } from './currentItems.service';\nimport { GisKomponentSettings } from '../models/GisKomponentSettings';\nimport { FeatureHelperService } from './featureHelper.service';\nimport { combineLatest } from 'rxjs';\nimport { ZoomService } from './zoom.service';\nimport { UndoRedoService } from './UndoRedo.service';\nimport { Fill, Stroke, Style, Text } from 'ol/style';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class FeatureLoaderService {\n\n private _settingsHelper = inject(KomponentSettingsHelperService);\n private _drawHelperService = inject(DrawLayerSourceService);\n private _current = inject(CurrentItemsService);\n private _zoom = inject(ZoomService);\n private _undoRedo = inject(UndoRedoService);\n\n private _featureHelper = inject(FeatureHelperService);\n\n private fomatter = new GeoJSON({ featureProjection: 'EPSG:25832', dataProjection: 'EPSG:25832'});\n \n loadFeaturesSettings(settings: GisKomponentSettings): void {\n if (!settings || !settings.geometryTypeSettings) { return; }\n const profile = this._current.profile;\n if (!settings || !settings.geometryTypeSettings) return;\n const allTheFeatures = settings.geometryTypeSettings.filter(gt => gt.features).map(gt => { \n const rawFeatures = this.fomatter.readFeatures(gt.features);\n rawFeatures.forEach(f => {\n this._featureHelper.setId(f);\n this._featureHelper.setTypeId(f, gt.typeId);\n if (gt.disableEditFeatures) {\n this._featureHelper.lock(f);\n }\n f.set('STYLENAME', gt.style);\n if (gt.showLabelFromProperty) {\n f.set('showlabelfrom', gt.showLabelFromProperty);\n }\n }); \n return rawFeatures;\n }).flatMap(f => f);\n\n const getAllStyles$ = allTheFeatures.map(f => this._settingsHelper.getStyle(f.get('STYLENAME'), profile?.styleRepositoryWorkspace!, profile?.styleRepositoryGeoserver!, f.getGeometry()!.getType()!))\n combineLatest(getAllStyles$).subscribe({\n next: styles => {\n styles.forEach((s, i) => { \n const feature = allTheFeatures[i];\n if (feature.get('showlabelfrom')) {\n const styles: Style[] = Array.isArray(s) ? s : [s];\n const textStyle = new Text({\n font: '14px Calibri,sans-serif',\n fill: new Fill({ color: '#000' }),\n stroke: new Stroke({ color: '#fff', width: 3 }),\n textAlign: 'center',\n text: feature.get(feature.get('showlabelfrom'))\n });\n const styleText = new Style({ text: textStyle });\n styles.push(styleText);\n feature.setStyle(styles);\n } else {\n feature.setStyle(s) \n }\n });\n this._drawHelperService.setFeatures(allTheFeatures);\n this._zoom.zoomToFeatures(allTheFeatures);\n this._undoRedo.init();\n }\n })\n }\n\n}","import { CommonModule } from '@angular/common';\nimport { Component, ElementRef, inject, Input, OnInit, ViewChild } from '@angular/core';\nimport { MatIconModule } from '@angular/material/icon';\nimport Map from 'ol/Map';\nimport View from 'ol/View';\nimport TileLayer from 'ol/layer/Tile';\nimport ImageWMS from 'ol/source/ImageWMS';\nimport WMTSCapabilities from 'ol/format/WMTSCapabilities';\nimport ImageLayer from 'ol/layer/Image';\nimport { ProfileService } from '../../services/profile.service';\nimport LayerGroup from 'ol/layer/Group';\nimport { IKeyValue, ILayer } from \"../../models/ILayer\";\nimport { MatSelectModule } from '@angular/material/select';\nimport { MatListModule } from '@angular/material/list';\nimport { HttpClient } from '@angular/common/http';\nimport ol_control_mouse from 'ol/control/MousePosition';\nimport ol_control_scale from 'ol/control/ScaleLine';\nimport BaseLayer from 'ol/layer/Base';\nimport { register } from 'ol/proj/proj4';\nimport proj4 from 'proj4';\nimport { LogoControl } from '../../controls/LogoControl/logoControl';\nimport { CopyrightControl } from '../../controls/CopyrightControl/copyRightControl';\nimport { TileWMS } from 'ol/source';\nimport { combineLatest, map, Observable, of } from 'rxjs';\nimport WMTS, { optionsFromCapabilities } from 'ol/source/WMTS';\nimport { LayerHelperService } from '../../services/layerHelper.service';\nimport { IProfile, IProfileDetailed } from '../../models/IProfile';\nimport { Profile } from '../../models/profile';\nimport { LayerSelectorComponent } from \"../layer-selector/layer-selector.component\";\nimport { GisKomponentSettings } from '../../models/GisKomponentSettings';\nimport 'ol/ol.css';\nimport MapEvent from 'ol/MapEvent';\nimport { Control, Rotate } from 'ol/control';\nimport { ToolboxComponent } from '../toolbox/toolbox.component';\nimport { ActiveObjectsComponent } from '../active-objects/activeObjects.component';\n// import { UndoRedoService } from '../../services/UndoRedo.service';\nimport { LayerErrorService } from '../../services/layerError.service';\nimport { MapSearchComponent } from \"../map-search/map-search.component\";\nimport { HighlightService } from '../../services/highlight.service';\nimport { CurrentItemsService } from '../../services/currentItems.service';\nimport { LegendsListComponent } from \"../legends-list/legends-list.component\";\nimport { FeatureLoaderService } from '../../services/featureLoader.service';\nimport { createStringXY } from 'ol/coordinate';\n\n@Component({\n selector: 'gis-komponent',\n templateUrl: './gis-komponent.component.html',\n styleUrls: ['./gis-komponent.component.scss'],\n imports: [CommonModule, MatIconModule, MatListModule, MatSelectModule, LayerSelectorComponent, MapSearchComponent, ToolboxComponent, ActiveObjectsComponent, LegendsListComponent],\n providers: [LayerHelperService]\n})\nexport class GisKomponentComponent implements OnInit {\n\n private readonly _profileService = inject(ProfileService);\n // private readonly _undoRedo = inject(UndoRedoService);\n private readonly _http = inject(HttpClient);\n private readonly _layerHelper = inject(LayerHelperService);\n private readonly _layerErrorService = inject(LayerErrorService);\n private readonly _featureLoader = inject(FeatureLoaderService);\n\n\n @Input() showToolbox: boolean = true;\n @Input() showActiveObjects: boolean = true;\n @Input() showLegendList: boolean = true;\n @Input() showMapSearch: boolean = true;\n\n @Input({required: true}) identifier!: string;\n @Input() settings: GisKomponentSettings | undefined;\n @ViewChild('toolbarRef', { static: true }) toolbarRef!: ElementRef;\n @ViewChild('activeObjectsRef', {static: true }) activeObjectsRef!: ElementRef;\n map!: Map;\n toolbarCollapsed = false;\n layerPanelCollapsed = false;\n activeObjectsCollapsed = false;\n conflictsCollapsed = false;\n showConflicts = false;\n showObjects = false;\n activeObjectsReady = false;\n profiles: IProfile[] = [];\n selectedProfile!: IProfileDetailed;\n profileShowToolbox = false;\n private readonly _highlightService = inject(HighlightService);\n private _currentItems = inject(CurrentItemsService);\n\n layers: { name: string, visible: boolean, activeInSelector: boolean, legendUrl: string }[] = [];\n\n private mousePositionCtrl = new ol_control_mouse({\n projection: 'EPSG:25832',\n coordinateFormat: createStringXY(2)\n });\n private onMoveEndCheckZoomFunction: ((event: MapEvent) => void) = () => {};\n currentZoomLevel: number = 0;\n private scaleCtrl = new ol_control_scale({\n units: 'metric',\n bar: true,\n steps: 4,\n text: true,\n minWidth: 120\n });\n \n profileSelected(profileIdentifier: string): void {\n this._profileService.getByIdentifier(profileIdentifier).subscribe({\n next: profile => { \n this._currentItems.profile = profile;\n this.selectedProfile = profile; \n const view: View = new View({\n center: [profile.centerX, profile.centerY],\n extent: [profile.minX, profile.minX, profile.maxX, profile.maxY],\n zoom: profile.zoom ?? 8,\n maxZoom: profile.maxZoom ?? undefined,\n minZoom: profile.minZoom ?? undefined,\n projection: 'EPSG:25832',\n rotation: 0\n });\n\n this.currentZoomLevel = profile.zoom ?? 8;\n\n this._getCapabilitiesObject(profile).subscribe({\n next: capabilityObject => { \n const layers: BaseLayer[] = [...profile.layerGroups.map((lg: { layers: any[]; id: number; }) => \n new LayerGroup({\n layers: lg.layers\n .filter(layer => layer.activeInSelector)\n .sort((a, b) => a.sortOrder - b.sortOrder)\n .map((l, index) => this._mapLayer(l, capabilityObject, 'EPSG:25832', lg.id, index)), // for now, we default to EPSG:25832.\n properties: { id: lg.id } \n })\n )\n ];\n this.map.setLayers(layers);\n if (this.settings) {\n this._featureLoader.loadFeaturesSettings(this.settings)\n }\n \n this._currentItems.map = this.map;\n\n this._layerHelper.applyCachedLayersToDisplayInMap(this.map, profile.id);\n this.map.addLayer(this._highlightService.highlightLayer);\n }\n });\n \n const toolbarControl = new Control({\n element: this.toolbarRef.nativeElement\n });\n \n if (profile.showToolbar) {\n this.profileShowToolbox = true;\n this.map.addControl(toolbarControl);\n }\n\n this.activeObjectsReady = true;\n const activeObjectsControl = new Control({\n element: this.activeObjectsRef.nativeElement\n });\n this.map.addControl(activeObjectsControl);\n\n this._handleShowMouseCoordinates(profile.showCoordinates);\n this._handleShowScale(profile.showScale);\n this._setLogo(profile.logoUrl);\n this._setCopyRight(profile.copyrightMessage);\n this.map.setView(view);\n this.onMoveEndCheckZoomFunction = () => {\n this._checkZoom(this.map);\n };\n this.map.on('moveend', this.onMoveEndCheckZoomFunction);\n }}); \n }\n\n private _checkZoom(map: Map) : void {\n this.currentZoomLevel = map.getView().getZoom() ?? this.currentZoomLevel;\n }\n\n private _getCapabilitiesObject(profile: Profile): Observable<Record<string, any>> {\n // Find all WMTS-layers and get their base url's for retrieving the capabilities. Make sure every url is only called once by removing duplicates\n const layerGroupLayers = [... new Set(profile.layerGroups.flatMap(lg => lg.layers).filter(lg => lg.layerType === 'WMTS'))];\n const parser = new WMTSCapabilities();\n const capabilities$ = layerGroupLayers\n .map(layer => {\n let getCapabilitiesUrl = `${layer.baseUrl}?SERVICE=WMTS&REQUEST=GetCapabilities`\n layer.wmsParameters.forEach((keyValue: IKeyValue) => {\n getCapabilitiesUrl = `${getCapabilitiesUrl}&${keyValue.key}=${keyValue.value}`;\n });\n return this._http.get(getCapabilitiesUrl, {responseType: 'text'})\n .pipe(\n map(result => {\n let item = new CapabilitiesItem();\n item.url = layer.baseUrl;\n item.sourceObject = parser.read(result);\n return item;\n })\n )\n });\n // To make it easier to find the appropriate object, I convert the array to an object of a key/value type.\n return capabilities$.length == 0 ? of({} as Record<string, any>) :\n combineLatest(capabilities$).pipe(map(allCapabilities => \n allCapabilities.reduce((obj, item) => {\n obj[item.url] = item.sourceObject;\n return obj;\n }, {} as Record<string, any>)\n ));\n }\n\n private _mapLayer(layer: ILayer, wmtsOptions: Record<string, any>, projection: string, layerGroupDbId: number, zIndex: number): BaseLayer {\n const params: { [x: string]: any } = {\n layers: layer.layers,\n }\n if (layer.token) {\n params[layer.authKeyName] = layer.token;\n }\n layer.wmsParameters.forEach(param => {\n params[param.key] = param.value\n });\n\n let result: BaseLayer;\n switch (layer.layerType) {\n case 'WMS':\n result = new ImageLayer({ \n source: new ImageWMS({ \n url: layer.baseUrl,\n crossOrigin: 'anonymous',\n params,\n }) \n }); \n break;\n case 'TILEWMS':\n result = new TileLayer({\n source: new TileWMS({\n url: layer.baseUrl,\n crossOrigin: 'anonymous',\n params, \n })\n });\n break;\n case 'WMTS':\n // Create WMST options from the capabilities loaded from the getCapabilities called.\n const options = optionsFromCapabilities(wmtsOptions[layer.baseUrl], {\n layer: layer.layers,\n matrixSet: layer.projection || projection,\n crossOrigin: 'anonymous'\n });\n result = new TileLayer({\n source: new WMTS(options!)\n });\n break;\n }\n \n if (layer.minZoom) {\n result.setMinZoom(layer.minZoom); \n }\n if (layer.maxZoom) {\n result.setMaxZoom(layer.maxZoom);\n } \n if (layer.maxX && layer.minX && layer.maxY && layer.minY) {\n result.setExtent([layer.minX, layer.minX, layer.maxX, layer.maxY]);\n }\n this._layerHelper.setDbId(result, layer.id);\n this._layerHelper.setLayerGroupDbId(result, layerGroupDbId);\n this._layerErrorService.registerLayer(layer.id, result);\n result.setZIndex(zIndex);\n return result;\n }\n\n private _setLogo(url: string): void {\n const logoCtrl = new LogoControl(url);\n this.map.addControl(logoCtrl);\n }\n\n private _setCopyRight(message: string): void {\n const copyrightCtrl = new CopyrightControl(message);\n this.map.addControl(copyrightCtrl);\n }\n\n private _handleShowMouseCoordinates(showCoords: boolean): void {\n if (showCoords) {\n this.map.addControl(this.mousePositionCtrl);\n } else {\n this.map.removeControl(this.mousePositionCtrl);\n }\n }\n\n private _handleShowScale(showScale: boolean): void {\n if (showScale) {\n this.map.addControl(this.scaleCtrl);\n } else {\n this.map.removeControl(this.scaleCtrl);\n }\n }\n\n ngOnInit(): void {\n this.profileSelected(this.identifier);\n proj4.defs('EPSG:25832', '+proj=utm +zone=32 +ellps=GRS80 +units=m +no_defs +type=crs');\n register(proj4);\n \n this.map = new Map({\n target: 'map',\n });\n\n this.map.addControl(new Rotate({autoHide: false}));\n this._addRotateControl();\n }\n\n // Added custom north-arrow with a compass one\n private _addRotateControl(): void {\n const iconElement = document.createElement('span');\n iconElement.innerHTML = `\n <svg width=\"40\" height=\"40\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M12 3 L16 10 L12 8 L8 10 Z\" fill=\"currentColor\"/>\n <path d=\"M12 21 L8 14 L12 16 L16 14 Z\" fill=\"currentColor\"/>\n <circle cx=\"12\" cy=\"12\" r=\"1.5\" fill=\"currentColor\"/>\n </svg>\n `;\n \n const rotateControl = new Rotate({\n label: iconElement,\n tipLabel: 'Reset to north',\n autoHide: false\n });\n\n this.map.addControl(rotateControl);\n }\n\n\n toggleShowConflicts(): void {\n this.showConflicts = !this.showConflicts;\n }\n\n toggleShowObjects(): void {\n this.showObjects = !this.showObjects;\n }\n\n toggleToolbar(): void {\n this.toolbarCollapsed = !this.toolbarCollapsed;\n }\n\n toggleLayerPanel(): void {\n this.layerPanelCollapsed = !this.layerPanelCollapsed;\n }\n\n toggleActiveObjectsCollapsed(): void { \n this.activeObjectsCollapsed = !this.activeObjectsCollapsed;\n }\n}\nclass CapabilitiesItem {\n url: string = '';\n sourceObject: any = null;\n}","@if (selectedProfile && selectedProfile.showLayerSelector) {\n <lib-layer-selector [map]=\"map\" [profile]=\"selectedProfile\" [currentZoomLevel]=\"currentZoomLevel\"></lib-layer-selector>\n}\n@if (selectedProfile && selectedProfile.showLegends) {\n <lib-legends-list [map]=\"map\" [profile]=\"selectedProfile\"></lib-legends-list>\n}\n\n<!-- <span>Zoom: {{ currentZoomLevel}}</span> -->\n<div #activeObjectsRef>\n @if(showActiveObjects && activeObjectsReady && settings) {\n <activeObjects [settings]=\"settings\"></activeObjects>\n }\n</div>\n<div #toolbarRef class=\"map-toolbar-container\">\n @if(showToolbox && profileShowToolbox && settings) {\n <map-toolbox [map]=\"map\" \n [profile]=\"selectedProfile\"\n [settings]=\"settings\"\n [collapsed]=\"selectedProfile.toolbarCollapsed\" [WKTInputEnabled]=\"settings?.WKTInputEnabled\" [deleteEnabled]=\"settings?.deleteEnabled\" [showMeasureArea]=\"selectedProfile.showAreaMeasurement\" [showMeasureDistance]=\"selectedProfile.showDistanceMeasurement\"></map-toolbox>\n }\n</div>\n\n<div class=\"map-container\">\n <lib-map-search *ngIf=\"showMapSearch\" [profile]=\"selectedProfile\"></lib-map-search>\n\n <!-- Objektvisning -->\n <!-- @if (showObjects) {\n <div class=\"object-panel\" [class.collapsed]=\"activeObjectsCollapsed\">\n <div class=\"header\" (click)=\"toggleActiveObjectsCollapsed()\">\n <span>Aktive objekter ({{activeObjects.length}})</span>\n <mat-icon>{{ activeObjectsCollapsed ? 'expand_more' : 'expand_less' }}</mat-icon>\n </div>\n @if (!activeObjectsCollapsed){\n <ul>\n <li *ngFor=\"let obj of activeObjects\">{{ obj.name }} ({{obj.size}})</li>\n </ul>\n }\n </div>\n } -->\n\n <!-- Konflikter -->\n @if (showConflicts) {\n\n <div class=\"conflict-panel\" [class.collapsed]=\"conflictsCollapsed\">\n <div class=\"header\">\n <span>Konflikter (3)</span>\n <mat-icon>{{ activeObjectsCollapsed ? 'expand_more' : 'expand_less' }}</mat-icon> -->\n </div>\n <mat-list>\n <mat-list-item>\n <span matListItemTitle>Lag #1</span>\n <span matListItemLine><mat-icon>highlight</mat-icon> Objekt #1</span>\n </mat-list-item>\n <mat-list-item>\n <span matListItemTitle>Lag #2 (svarer ikke)</span>\n </mat-list-item>\n <mat-list-item>\n <span matListItemTitle>Lag #3</span>\n <span matListItemLine><mat-icon>highlight</mat-icon> Objekt #1</span>\n <span matListItemLine><mat-icon>highlight</mat-icon> Objekt #2</span>\n </mat-list-item>\n </mat-list>\n </div>\n \n } \n\n <!-- Kort -->\n <div id=\"map\" class=\"map\"></div>\n</div>\n","import { HttpInterceptorFn, HttpErrorResponse } from '@angular/common/http';\nimport { inject } from '@angular/core';\nimport { catchError, throwError } from 'rxjs';\nimport { LibErrorService } from './libError.service';\n\nexport const libErrorInterceptor: HttpInterceptorFn = (req, next) => {\n const errorService = inject(LibErrorService);\n\n return next(req).pipe(\n catchError((error: HttpErrorResponse) => {\n errorService.log(error);\n errorService.show(error);\n return throwError(() => error); // Let the component decide if needed\n })\n );\n};\n","import { Provider } from '@angular/core';\nimport { GISKOMPONENT_CONFIG, GISKomponentConfig } from './config';\nimport { provideHttpClient, withInterceptors } from '@angular/common/http';\nimport { libErrorInterceptor } from '../services/libError.interceptor.service';\n// Call this in the consuming app's app.config.ts file to inject the API URL into the library\n// Example:\n// export const appConfig: ApplicationConfig = { providers: [ provideLibrary( { apiBaseUrl: environment.urlAddress})]}\nexport function provideLibrary(config: GISKomponentConfig): Provider[] {\n return [ \n { provide: GISKOMPONENT_CONFIG, useValue: config }\n ];\n}\n// Call this in the consuming app's app.config.ts file to inject the library's HttpClient with interceptor \n// and custom error handler\n// Example:\n// export const appConfig: ApplicationConfig = { providers: [ provideLibraryHttpClient()]}\nexport function provideLibraryHttpClient(): any {\n return [\n provideHttpClient(withInterceptors([libErrorInterceptor]))\n ]\n};","/*\n * Public API Surface of gis-komponent\n */\n\nexport * from './lib/components/gis-komponent/gis-komponent.component';\nexport * from './lib/config/library-provider';\nexport * from './lib/services/profile.service';\nexport * from './lib/services/layerHelper.service';\nexport * from './lib/models/GisKomponentSettings';\nexport * from './lib/services/libError.service';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i2","i1.DrawLayerSourceService","buffer","turfBuffer","turfPoint","i1","Select","Feature","i5","i6","map","i3","i8","LayerGroup","Map"],"mappings":"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"}