@regionerne/gis-komponent 0.0.76 → 0.0.78
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/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/services/layoutService.ts","../../../projects/gis-komponent/src/lib/services/dmpCatalog.service.ts","../../../projects/gis-komponent/src/lib/services/olCapabilities.service.ts","../../../projects/gis-komponent/src/lib/services/dmpLayer-mapper.service.ts","../../../projects/gis-komponent/src/lib/models/widget.constants.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/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/centerPoint.service.ts","../../../projects/gis-komponent/src/lib/services/overlap.service.ts","../../../projects/gis-komponent/src/lib/services/infoSearch.service.ts","../../../projects/gis-komponent/src/lib/services/documentSearch.service.ts","../../../projects/gis-komponent/src/lib/services/showInfo.service.ts","../../../projects/gis-komponent/src/lib/services/geometry.service.ts","../../../projects/gis-komponent/src/lib/services/printHelper.service.ts","../../../projects/gis-komponent/src/lib/services/searchProvider.service.ts","../../../projects/gis-komponent/src/lib/services/cowi.service.ts","../../../projects/gis-komponent/src/lib/services/addressSearch.service.ts","../../../projects/gis-komponent/src/lib/services/cadastreSearch.service.ts","../../../projects/gis-komponent/src/lib/services/geometrySearch.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/services/conflictAnalysisSearch.service.ts","../../../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/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/selected-feature-info/selected-feature-info.component.ts","../../../projects/gis-komponent/src/lib/components/selected-feature-info/selected-feature-info.component.html","../../../projects/gis-komponent/src/lib/services/hoverInfoSearch.service.ts","../../../projects/gis-komponent/src/lib/services/showInfoHover.service.ts","../../../projects/gis-komponent/src/lib/components/document-search-info/document-search-info.component.ts","../../../projects/gis-komponent/src/lib/components/document-search-info/document-search-info.component.html","../../../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 private _profileVersionChanged: boolean = false;\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\n setProfileVersionChanged(value: boolean): void {\n this._profileVersionChanged = value;\n }\n\n getProfileVersionChanged(): boolean {\n return this._profileVersionChanged;\n }\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()\">×</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|string;\n hasError: boolean;\n lastError?: any;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class LayerErrorService {\n layerStatusChanged: Subject<number|string> = new Subject<number|string>();\n layerErrored: Subject<number|string> = new Subject<number|string>();\n private layerStatuses = new Map<number|string, LayerStatus>();\n private listeners = new Map<number|string, EventsKey[]>();\n private _errorService: LibErrorService = inject(LibErrorService);\n\n registerLayer(layerId: number | string, 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|string): 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';\nimport { DmpLayerResult } from './dmpCatalog.service';\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 _includedInPrint: string = 'includedInPrint';\n private readonly _layerGroupDbIdKey: string = 'layerGroupDbId';\n private readonly _mapFilteredLayerGroupsKeyName: string = 'mapFilteredLayerGroups';\n private readonly _dmpLayersCacheStoragKey = 'dmpLayersCache';\n private _layerErrorService: LayerErrorService = inject(LayerErrorService);\n layerActivatedByBackgroundGroup: Subject<number> = new Subject<number>();\n\n\n setDbId(layer: BaseLayer, id: number | string): 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 setIncludedInPrint(layer: BaseLayer): void {\n layer.set(this._includedInPrint, 'true');\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 let layersCachedToDisplay: { id: number | string, visible: boolean}[] = [];\n const dmpCacheValue = localStorage.getItem(`${this._dmpLayersCacheStoragKey}_${profileId}`);\n if (dmpCacheValue) {\n JSON.parse(dmpCacheValue).map((dmpLayer: DmpLayerResult) => \n ({ id: dmpLayer.datasetId, visible: dmpLayer.visible})).forEach((element: { id: number | string; visible: boolean; }) => {\n layersCachedToDisplay.push(element);\n });\n }\n const cacheValue = localStorage.getItem(`${this._mapFilteredLayerGroupsKeyName}_${profileId}`);\n if (cacheValue) {\n const cachedToDisplay = JSON.parse(cacheValue).cachedLayerGroups\n .flatMap((lg: LayerSelectorGroup) => lg.layers)\n .map((l: ILayer) => ({ id: l.id, visible: l.visible}));\n cachedToDisplay.forEach((element: { id: number | string; visible: boolean; }) => {\n layersCachedToDisplay.push(element);\n });\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 = layersCachedToDisplay\n .find((layer: { id: number | string; 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 if (cachedLayer) {\n //Set z index to match the order in cache\n l.setZIndex(layersCachedToDisplay.indexOf(cachedLayer));\n }\n });\n } else if (layergroup.get('dmp')) {\n const cachedLayer = layersCachedToDisplay\n .find((layer: { id: number | string; visible: boolean }) => layergroup.get(this._layerDbIdKey) == layer.id);\n const current = layergroup.getVisible();\n if (cachedLayer != undefined && current != cachedLayer.visible) {\n layergroup.setVisible(cachedLayer.visible);\n }\n if (cachedLayer) {\n //Set z index to match the order in cache\n layergroup.setZIndex(layersCachedToDisplay.indexOf(cachedLayer));\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 if (!(layergroup as OLLayerGroup)) return;\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 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 currentIndex$.next(index + 1);\n }\n }\n )\n );\n }\n ));\n activation$.subscribe();\n }\n\n updateLayerOpacityInMap(map: Map, layerId: number | string, opacity: number | undefined): 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 && opacity != undefined) {\n l.setOpacity(opacity);\n }\n })\n // DMP layer\n } else if (layergroup.get('dmp') && layergroup.get(this._layerDbIdKey) === layerId && opacity != undefined) {\n layergroup.setOpacity(opacity);\n }\n })\n }\n\n toggleLayerInMap(map: Map, layerId: number | string): 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 // DMP layer\n } else if (layergroup.get('dmp') && layergroup.get(this._layerDbIdKey) === layerId) {\n const current = layergroup.getVisible();\n layergroup.setVisible(!current);\n }\n });\n }\n\n toggleAllPrintLayersInMap(map: Map): void { // For printing\n map.getLayers().getArray().forEach(layergroup => {\n if (layergroup instanceof OLLayerGroup) {\n layergroup.getLayers().getArray().forEach(l =>l.setVisible(l.get(this._includedInPrint) != undefined));\n } else if (layergroup.get('dmp')) {\n //DMP layer, turn off\n layergroup.setVisible(false);\n }\n });\n }\n\n deleteDmpLayerFromMap(map: Map, layerId: string): void {\n map.getLayers().getArray().forEach(layergroup => {\n if (layergroup.get(this._layerDbIdKey) === layerId) {\n layergroup.setVisible(false);\n map.removeLayer(layergroup);\n }\n });\n }\n}","import { Injectable } from '@angular/core';\nimport { Map } from 'ol';\nimport { Subject } from 'rxjs';\n\ntype VerticalPosition = 'top' | 'middle' | 'bottom';\ntype HorizontalPosition = 'left' | 'middle' | 'right';\nexport interface WidgetPositionOptions {\n initialPosition: string;\n widgetName: string;\n widgetWidth: number;\n widgetHeight: number;\n offsetX?: number; // padding from edges\n offsetY?: number; // padding from edges\n currentPosition?: { x: number; y: number} | null;\n resizedContainerHeight?: number | null;\n resizedContainerWidth?: number | null;\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class LayoutService {\n private _map: Map | undefined;\n mapResizedSubject: Subject<boolean> = new Subject(); \n set map(value: Map) {\n this._map = value;\n }\n\n async keepWidgetInViewPort(dragPosition:{ x: number; y: number}, widgetName: string, widgetHeight: number,\n widgetWidth: number, resizedContainerHeight: number | null = null, resizedContainerWidth: number | null = null):Promise<{ x: number; y: number}> {\n //Expanding or changing map size, make sure the widget stays in viewport\n const widgetPositionOptions: WidgetPositionOptions = {\n initialPosition: '',\n widgetName: widgetName,\n widgetHeight: widgetHeight,\n widgetWidth: widgetWidth,\n currentPosition: dragPosition,\n resizedContainerHeight: resizedContainerHeight,\n resizedContainerWidth: resizedContainerWidth\n }\n return this.calculateWidgetPosition(widgetPositionOptions);\n }\n\n async calculateWidgetPosition({\n initialPosition,\n widgetName,\n widgetWidth,\n widgetHeight,\n offsetX = 2,\n offsetY = 9,\n currentPosition = null,\n resizedContainerHeight = null,\n resizedContainerWidth = null\n }: WidgetPositionOptions): Promise<{ x: number; y: number}> {\n let x = 0;\n let y = 0;\n let dragPosition = { x: x, y: y};\n if (!this._map) return dragPosition;\n console.log('calculateWidgetPosition', initialPosition, widgetName);\n const containerRect = await this._getMapRect();\n\n if (currentPosition) {\n // Expanding a widget or viewport changed size, so fit the widget inside view again\n x = currentPosition.x;\n y = currentPosition.y;\n if (resizedContainerHeight && resizedContainerWidth) {\n containerRect.height = resizedContainerHeight;\n containerRect.width = resizedContainerWidth;\n }\n } else {\n let vertical: VerticalPosition = 'top';\n let horizontal: HorizontalPosition = 'left';\n switch (initialPosition) {\n case 'øverst/venstre':\n vertical = 'top';\n horizontal = 'left';\n break;\n\n case 'midt/venstre':\n vertical = 'middle';\n horizontal = 'left';\n break;\n\n case 'nederst/venstre':\n vertical = 'bottom';\n horizontal = 'left';\n break;\n\n case 'øverst/midt':\n vertical = 'top';\n horizontal = 'middle';\n break;\n\n case 'nederst/midt':\n vertical = 'bottom';\n horizontal = 'middle';\n break;\n\n case 'øverst/højre':\n vertical = 'top';\n horizontal = 'right';\n break;\n\n case 'midt/højre':\n vertical = 'middle';\n horizontal = 'right';\n break;\n\n case 'nederst/højre':\n vertical = 'bottom';\n horizontal = 'right';\n break;\n default: break;\n }\n // Vertical positioning\n switch (vertical) {\n case 'top':\n y = offsetY;\n break;\n case 'middle':\n y = (containerRect.height - widgetHeight) / 2;\n break;\n case 'bottom':\n if (horizontal === 'left') offsetY = offsetY + 90; // Move above scalebar in bottom-left corner\n y = containerRect.height - widgetHeight - offsetY;\n break;\n }\n\n // Horizontal positioning\n switch (horizontal) {\n case 'left':\n if (vertical === 'top') offsetX = offsetX + 35; // Move to right of zoom in top-left corner\n x = offsetX;\n break;\n case 'middle':\n x = (containerRect.width - widgetWidth) / 2;\n break;\n case 'right':\n if (vertical === 'top') offsetX = offsetX + 35; // Move to left of compass in top-right corner\n x = containerRect.width - widgetWidth - offsetX;\n break;\n }\n }\n\n // Ensure the widget stays inside the viewport\n x = Math.max(offsetX, Math.min(x, containerRect.width - widgetWidth));\n y = Math.max(offsetY, Math.min(y, containerRect.height - widgetHeight));\n\n dragPosition = { x: x, y: y};\n this._savePosition(widgetName, dragPosition);\n\n console.log('end result', dragPosition);\n return { x, y };\n }\n\n private async _getMapRect(): Promise<DOMRect> {\n\n console.log('_getMapRect', Date.now);\n const element = this._map?.getViewport();\n if (!element || element.getBoundingClientRect()?.height === 0) {\n await new Promise(resolve => this._map?.once('rendercomplete', resolve));\n }\n\n console.log('_getMapRect rendercomplete', element?.getBoundingClientRect(), Date.now);\n return element?.getBoundingClientRect() ?? new DOMRect();\n }\n\n private _savePosition(widgetStorageKey: string, position: { x: number; y: number }): void {\n try {\n localStorage.setItem(widgetStorageKey, JSON.stringify(position));\n } catch (error) {\n console.error('Error saving position to localStorage:', error);\n }\n }\n\n\n}","import { Injectable } from '@angular/core';\nimport { HttpClient, HttpParams } from '@angular/common/http';\nimport { Observable, switchMap, map, combineLatest } from 'rxjs';\n\nexport interface DmpLayerResult {\n datasetId: string;\n title: string;\n description: string;\n serviceType: 'WMS' | 'WMTS' | 'WFS';\n sourceUrl: string;\n layers: string;\n availability?: string;\n license?: {\n title?: string;\n url?: string;\n };\n dataLiabilityAgreement?: {\n title?: string;\n url?: string;\n };\n tags?: string[];\n category?: string;\n metaDataUrl?: string;\n visible: boolean;\n opacity: number;\n hasErrors: boolean;\n}\n\n@Injectable()\nexport class DmpCatalogService {\n private readonly aiSearchUrl = 'https://datakatalog.miljoeportal.dk/api/search/ai-search';\n\n private readonly datasetsUrl = 'https://datakatalog.udv.miljoeportal.dk/api/datasets';\n\n private readonly datasetsStatusUrl = 'https://datakatalog.udv.miljoeportal.dk/api/datasetavailabilities';\n\n constructor(private http: HttpClient) {}\n\n searchLayers(searchText: string): Observable<DmpLayerResult[]> {\n return this._aiSearch(searchText).pipe(\n switchMap(ids => {\n if (!ids.length) {\n return [];\n }\n return this._fetchDatasets(ids);\n })\n );\n }\n\n private _aiSearch(searchText: string): Observable<string[]> {\n return this.http.post<any>(this.aiSearchUrl, {\n searchText: searchText, entityTypes: ['ds']\n }).pipe(\n map(res =>\n (res?.results ?? [])\n .map((r: any) => r.id)\n .filter(Boolean)\n )\n );\n }\n private _fetchDatasets(ids: string[]): Observable<DmpLayerResult[]> {\n const params = new HttpParams()\n .set('filter', `any(id,${ids.map(id => `'${id}'`).join(',')})`)\n .set(\n 'include',\n [\n 'wmsSource',\n 'wfsSource',\n 'wmtsSource',\n 'license',\n 'tags',\n 'category',\n 'dataLiabilityAgreement'\n ].join(','));\n const datasets$ = this.http.get<any>(this.datasetsUrl, { params });\n const availabilityParams = new HttpParams()\n .set('filter', `any(id,${ids.map(id => `'${id}'`).join(',')})`);\n const availability$ = this.http.get<any>(this.datasetsStatusUrl,{ params: availabilityParams });\n return combineLatest([datasets$, availability$]).pipe(\n map(([datasetsRes, availabilityRes]) => this._compileResults(datasetsRes, availabilityRes)));\n }\n\n private _compileResults(\n datasetsResponse: any,\n availabilityResponse: any\n ): DmpLayerResult[] {\n const datasets = datasetsResponse.data ?? [];\n const included = datasetsResponse.included ?? [];\n const availabilityByDatasetId = new Map<string, string>();\n for (const a of availabilityResponse.data ?? []) {\n availabilityByDatasetId.set(\n a.id,\n a.attributes?.status\n );\n }\n const includedByKey = new Map<string, any>();\n for (const inc of included) {\n includedByKey.set(`${inc.type}:${inc.id}`, inc);\n }\n const results: DmpLayerResult[] = [];\n for (const ds of datasets) {\n const title = ds.attributes?.title ?? 'Untitled';\n const description = ds.attributes?.description ?? null;\n const metaDataUrl = ds.attributes?.metadata ?? null;\n const datasetId = ds.id;\n const commonMeta = {\n datasetId,\n title,\n description,\n availability: availabilityByDatasetId.get(datasetId),\n license: this._resolveSingleWithUrl(\n ds.relationships?.license,\n includedByKey\n ),\n dataLiabilityAgreement: this._resolveSingleWithUrl(\n ds.relationships?.dataLiabilityAgreement,\n includedByKey\n ),\n tags: this._resolveMulti(ds.relationships?.tags, includedByKey),\n category: this._resolveSingle(\n ds.relationships?.category,\n includedByKey\n ),\n metaDataUrl,\n visible: true,\n opacity: 1,\n hasErrors: false\n };\n this._extractService(\n ds,\n 'wmsSource',\n 'WMS',\n commonMeta,\n includedByKey,\n results\n );\n this._extractService(\n ds,\n 'wmtsSource',\n 'WMTS',\n commonMeta,\n includedByKey,\n results\n );\n this._extractService(\n ds,\n 'wfsSource',\n 'WFS',\n commonMeta,\n includedByKey,\n results\n );\n }\n return results;\n }\n\n private _extractService(\n dataset: any,\n relationName: string,\n serviceType: 'WMS' | 'WMTS' | 'WFS',\n meta: Partial<DmpLayerResult>,\n includedByKey: Map<string, any>,\n results: DmpLayerResult[]\n ) {\n const rel = dataset.relationships?.[relationName]?.data;\n if (!rel) return;\n const inc = includedByKey.get(`${rel.type}:${rel.id}`);\n if (!inc) return;\n const url = inc.attributes?.url;\n const layer = inc.attributes?.layer;\n if (!url || !layer) return;\n results.push({\n ...meta,\n serviceType,\n sourceUrl: url,\n layers: layer\n } as DmpLayerResult);\n }\n\n private _resolveSingle(rel: any, included: Map<string, any>): string | undefined {\n if (!rel?.data) return undefined;\n const inc = included.get(`${rel.data.type}:${rel.data.id}`);\n return inc?.attributes?.title ?? inc?.attributes?.name;\n }\n\n private _resolveMulti(rel: any, included: Map<string, any>): string[] | undefined {\n if (!Array.isArray(rel?.data)) return undefined;\n return rel.data\n .map((r: any) => {\n const inc = included.get(`${r.type}:${r.id}`);\n return inc?.attributes?.title ?? inc?.attributes?.name;\n })\n .filter(Boolean);\n }\n\n private _resolveSingleWithUrl(\n rel: any,\n included: Map<string, any>\n ): { title?: string; url?: string } | undefined {\n if (!rel?.data) return undefined;\n const inc = included.get(`${rel.data.type}:${rel.data.id}`);\n if (!inc) return undefined;\n return {\n title: inc.attributes?.title ?? inc.attributes?.name,\n url:\n inc.attributes?.url ??\n inc.attributes?.link ??\n inc.attributes?.landingPage\n };\n }\n}\n","import { Injectable } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { map, Observable } from 'rxjs';\nimport WMSCapabilities from 'ol/format/WMSCapabilities';\nimport WMTSCapabilities from 'ol/format/WMTSCapabilities';\n\n@Injectable()\nexport class OlCapabilitiesService {\n constructor(private http: HttpClient) {}\n\n loadWmsCapabilities(url: string): Observable<any> {\n const capUrl = `${url}?service=WMS&request=GetCapabilities`;\n return this.http.get(capUrl, { responseType: 'text' }).pipe(\n map(xml => new WMSCapabilities().read(xml))\n );\n }\n\n loadWmtsCapabilities(url: string): Observable<any> {\n url = url.replace('&service=wmts&request=getcapabilities','');\n const capUrl = `${url}&service=WMTS&request=GetCapabilities`;\n return this.http.get(capUrl, { responseType: 'text' }).pipe(\n map(xml => new WMTSCapabilities().read(xml))\n );\n }\n}\n","import { Injectable } from '@angular/core';\nimport BaseLayer from 'ol/layer/Base';\nimport VectorLayer from 'ol/layer/Vector';\nimport VectorSource from 'ol/source/Vector';\nimport { GeoJSON } from 'ol/format';\nimport { map, Observable } from 'rxjs';\nimport { OlCapabilitiesService } from './olCapabilities.service';\nimport { DmpLayerResult } from './dmpCatalog.service';\nimport TileLayer from 'ol/layer/Tile';\nimport WMTS, { optionsFromCapabilities } from 'ol/source/WMTS';\nimport { TileWMS } from 'ol/source';\n\n@Injectable()\nexport class DmpLayerMapperService {\n constructor(private caps: OlCapabilitiesService) {}\n\n toBaseLayer(result: DmpLayerResult): Observable<BaseLayer> {\n switch (result.serviceType) {\n case 'WMS':\n return this.caps.loadWmsCapabilities(result.sourceUrl).pipe(\n map(cap => {\n const layer = this._createWmsLayerFromCapabilities(\n cap,\n result.layers,\n result.sourceUrl\n );\n this._attachMetadata(layer, result);\n return layer;\n })\n );\n\n case 'WMTS':\n return this.caps.loadWmtsCapabilities(result.sourceUrl).pipe(\n map(cap => {\n const layer = this._createWmtsLayerFromCapabilities(\n cap,\n result.layers,\n result.sourceUrl\n );\n this._attachMetadata(layer, result);\n return layer;\n })\n );\n\n case 'WFS':\n const wfsLayer = new VectorLayer({\n source: new VectorSource({\n format: new GeoJSON(),\n url: `${result.sourceUrl}?service=WFS&request=GetFeature&version=2.0.0&typename=${result.layers}&outputFormat=application/json`\n })\n });\n this._attachMetadata(wfsLayer, result);\n return new Observable(o => {\n o.next(wfsLayer);\n o.complete();\n });\n\n default:\n throw new Error('Unsupported service type');\n }\n }\n\n private _attachMetadata(layer: BaseLayer, r: DmpLayerResult) {\n layer.setProperties({\n id: r.datasetId,\n title: r.title,\n serviceType: r.serviceType,\n dmp: true\n });\n }\n\n private _createWmtsLayerFromCapabilities(\n capabilities: any,\n layerName: string,\n url: string\n ): TileLayer {\n\n const options = optionsFromCapabilities(capabilities, {\n layer: layerName,\n matrixSet: this._findBestMatrixSet(capabilities, layerName),\n requestEncoding: 'KVP'\n });\n\n options!!.urls = [url];\n\n return new TileLayer({\n source: new WMTS(options!!)\n });\n }\n\n private _findBestMatrixSet(cap: any, layerName: string): string {\n const layer = cap.Contents.Layer.find((l: any) => l.Identifier === layerName);\n return layer.TileMatrixSetLink[0].TileMatrixSet;\n }\n\n private _createWmsLayerFromCapabilities(\n capabilities: any,\n layerName: string,\n url: string\n ): TileLayer {\n\n const available = this._findWmsLayer(capabilities.Capability.Layer, layerName);\n if (!available) {\n throw new Error(`WMS layer not found in capabilities: ${layerName}`);\n }\n\n return new TileLayer({\n source: new TileWMS({\n url,\n params: {\n LAYERS: layerName,\n TILED: true\n },\n serverType: 'geoserver',\n crossOrigin: 'anonymous'\n })\n });\n }\n\n private _findWmsLayer(layer: any, name: string): any {\n if (layer.Name === name) return layer;\n if (!layer.Layer) return null;\n\n for (const l of layer.Layer) {\n const found = this._findWmsLayer(l, name);\n if (found) return found;\n }\n return null;\n }\n}\n","export class WidgetConstants {\n static collapsedHeight: number = 24;\n static collapsedWidth: number = 86;\n static toolboxHeight: number = 64;\n static toolboxWidth: number = 729;\n static searchHeight: number = 122;\n static searchWidth: number = 374;\n static activeObjectsHeight: number = 80;\n static activeObjectsWidth: number = 350;\n static layerSelectorHeight: number = 209;\n static layerSelectorWidth: number = 329;\n static legendsHeight: number = 341;\n static legendsWidth: number = 296;\n static toolboxDefaultX: number = 29;\n static toolboxDefaultY: number = 120;\n static searchDefaultX: number = 29;\n static searchDefaultY: number = 5;\n static activeObjectsDefaultX: number = 29;\n static activeObjectsDefaultY: number = 238;\n static layerSelectorDefaultX: number = 29;\n static layerSelectorDefaultY: number = 470;\n static legendsDefaultX: number = 1790;\n static legendsDefaultY: number = 743;\n}","import { Component, ElementRef, inject, Input, OnChanges, OnInit, SimpleChanges, TemplateRef, ViewChild } from '@angular/core';\nimport { CdkDragDrop, CdkDragEnd, 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';\nimport { LayoutService, WidgetPositionOptions } from '../../services/layoutService';\nimport { IProfileDetailed } from '../../models/IProfile';\nimport { DmpCatalogService, DmpLayerResult } from '../../services/dmpCatalog.service';\nimport { MatOptionModule } from '@angular/material/core';\nimport { debounceTime, distinctUntilChanged, Subject, switchMap } from 'rxjs';\nimport { DmpLayerMapperService } from '../../services/dmpLayer-mapper.service';\nimport { MatDialog, MatDialogActions, MatDialogContent, MatDialogModule, MatDialogRef } from '@angular/material/dialog';\nimport { ProfileService } from '../../services/profile.service';\nimport { WidgetConstants } from '../../models/widget.constants';\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, MatOptionModule, MatDialogModule, MatDialogContent, MatDialogActions ]\n})\nexport class LayerSelectorComponent implements OnInit, OnChanges {\n @ViewChild('layerSelectorBody', { static: false }) set contentBody(content: ElementRef) {\n this._layerSelectorBody = content;\n }\n @ViewChild('dmpDialog') dmpDialog!: TemplateRef<any>;\n @Input() map!: Map;\n @Input() profile!: IProfileDetailed;\n @Input() currentZoomLevel!: number;\n searchText = '';\n dmpSearchText: string = '';\n private _dmpSearchTextSubject = new Subject<string>();\n allLayerGroups: LayerSelectorGroup[] = [];\n filteredLayerGroups: LayerSelectorGroup[] = [];\n dmpLayers: DmpLayerResult[] = [];\n filteredDmpLayers: DmpLayerResult[] = [];\n dmpLayerResults: DmpLayerResult[] = [];\n dmpSearchMode: boolean = false;\n filteredBackgroundLayerGroups: LayerSelectorGroup[] = [];\n showLegend: boolean = false;\n collapsed: boolean = true;\n layerSelectorDragPosition : { x: number; y: number} = { x: 0, y: 0 };\n legendUrl: string = 'https://docs.geoserver.org/main/en/user/_images/samplelegend.png';\n private _layerSelectorBody!: ElementRef;\n private _layerSelectorBodyControl!: ol_control_Control;\n private dialogRef?: MatDialogRef<any>;\n private _dialog: MatDialog = inject(MatDialog);\n\n private readonly _mapFilteredLayerGroupsKeyName: string = 'mapFilteredLayerGroups';\n private readonly POSITION_STORAGE_KEY = 'layerSelectorPosition';\n private readonly _dmpLayersCacheStoragKey = 'dmpLayersCache';\n private readonly _layerHelper: LayerHelperService = inject(LayerHelperService);\n private readonly _layerErrorService: LayerErrorService = inject(LayerErrorService);\n private readonly _layoutService: LayoutService = inject(LayoutService);\n private readonly _dmpCatalogService: DmpCatalogService = inject(DmpCatalogService);\n private readonly _dmpMapper: DmpLayerMapperService = inject(DmpLayerMapperService);\n private readonly _profileService: ProfileService = inject(ProfileService);\n\n ngOnInit(): void {\n this._dmpSearchTextSubject.pipe(\n debounceTime(200),\n distinctUntilChanged(),\n switchMap(value => this._dmpCatalogService.searchLayers(value))\n ).subscribe({\n next: result => {\n this.dmpLayerResults = result.map(layer => ({...layer, availability: \n layer.availability?.replace('unavailable', 'Ikke klar til brug').replace('available', 'Klar til brug')\n .replace('partly', 'Delvis klar til brug')}))\n }\n });\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['profile'] && this.profile) {\n this.collapsed = this.profile.layerSelectorFolded;\n this._layerHelper.layerActivatedByBackgroundGroup\n .subscribe(layerId => {\n this.toggleLayer(layerId, undefined, true, true);\n });\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 this.allLayerGroups = this.profile.layerGroups\n .map((lg, idx) => ({... lg, \n noOfVisibleLayers: lg.layers.filter(l => l.activeInSelector && l.visible).length, \n visible: lg.layers.some(l => l.visible),\n expanded: lg.folded === false,\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._profileService.setProfileVersionChanged(true);\n this._loadPosition(this.collapsed);\n this.filterChanged();\n this._cacheProfileInfo();\n } else {\n this._loadPosition(this.collapsed);\n this.filteredLayerGroups = cachedProfileInfo.cachedLayerGroups.filter(gr => !gr.background);;\n this.filteredBackgroundLayerGroups = cachedProfileInfo.cachedLayerGroups.filter(gr => gr.background);\n this._setVisibleLayersFromCache(cachedProfileInfo.cachedLayerGroups);\n }\n } else {\n this._loadPosition(this.collapsed);\n this.filterChanged();\n this._cacheProfileInfo();\n }\n const dmpLayersCacheValue = localStorage.getItem(`${this._dmpLayersCacheStoragKey}_${this.profile.id}`);\n if (dmpLayersCacheValue) {\n this.dmpLayers = JSON.parse(dmpLayersCacheValue);\n this.dmpLayers.forEach(dmpLayer => {\n const dmpLayerId: string = dmpLayer.datasetId;\n this._dmpMapper.toBaseLayer(dmpLayer).subscribe(layer => {\n this._layerHelper.setDbId(layer, dmpLayerId);\n this._layerErrorService.registerLayer(dmpLayerId, layer);\n layer.setVisible(dmpLayer.visible);\n this.map.addLayer(layer);\n });\n });\n this.filteredDmpLayers = this.dmpLayers.filter(dmpLayer => true);\n }\n // Apply Failover logic to all background groups\n this.filteredBackgroundLayerGroups\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._initializeMapControl();\n }\n }\n\n onLayerSelectorDragEnded(event: CdkDragEnd): void {\n const position = event.source.getFreeDragPosition();\n this.layerSelectorDragPosition = position;\n try {\n localStorage.setItem(\n this.POSITION_STORAGE_KEY,\n JSON.stringify(position)\n );\n } catch (error) {\n console.error('Error saving layer selector position to localStorage:', error);\n }\n }\n \n \nopenUrl(url: string | null | undefined): void {\n if (!url) return;\n\n const localUrl = url.startsWith('http:') || url.startsWith('https:') ? url : `https://${url}`;\n window.open(localUrl, '_blank');\n}\n\n\n toggleDmpSearch(value: boolean): void {\n this.dmpSearchMode = value;\n if (!this.dmpSearchMode) {\n this.dmpLayerResults = [];\n this.dmpSearchText = '';\n this.dialogRef?.close();\n } else {\n this.dialogRef = this._dialog.open(this.dmpDialog, {\n disableClose: true,\n hasBackdrop: true,\n autoFocus: true,\n restoreFocus: true,\n width: '700px',\n panelClass: 'dmp-dialog-content'\n });\n }\n }\n\n searchDmp(): void {\n if (!this.dmpSearchText || this.dmpSearchText === '') {\n this.dmpLayerResults = [];\n return;\n }\n this._dmpSearchTextSubject.next(this.dmpSearchText);\n }\n\n addDmpLayer(dmpLayer: DmpLayerResult): void {\n this.dmpLayers.push(dmpLayer);\n this.filteredDmpLayers.push(dmpLayer);\n this._cacheDmpLayers();\n const dmpLayerId: string = dmpLayer.datasetId;\n this._dmpMapper.toBaseLayer(dmpLayer).subscribe(layer => {\n this._layerHelper.setDbId(layer, dmpLayerId);\n this._layerErrorService.registerLayer(dmpLayerId, layer);\n this.map.addLayer(layer);\n });\n }\n\n deleteDmpLayer(dmpLayer: DmpLayerResult, event?: MouseEvent): void {\n event?.stopPropagation();\n this.dmpLayers = this.dmpLayers.filter(layer => layer.datasetId != dmpLayer.datasetId);\n this.filteredDmpLayers = this.filteredDmpLayers.filter(layer => layer.datasetId != dmpLayer.datasetId);\n this._layerHelper.deleteDmpLayerFromMap(this.map, dmpLayer.datasetId);\n this._cacheDmpLayers();\n }\n\n private _cacheDmpLayers(): void {\n localStorage.setItem(`${this._dmpLayersCacheStoragKey}_${this.profile.id}`, JSON.stringify(this.dmpLayers));\n }\n\n toggleLayer(layerId: number | string, event?: MouseEvent, skipMapToggle: boolean = false, value: boolean | undefined = undefined): 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.concat(this.filteredBackgroundLayerGroups).forEach(group => {\n let singleLayerIdToKeepOn = 0;\n group.layers.forEach(l => {\n if (layerId === l.id) {\n l.visible = value != undefined ? value : !l.visible;\n if (l.visible && !group.allowMultiSelect) {\n // Group doesn't allow multi select and we just turned this layer on\n // so turn all others off\n singleLayerIdToKeepOn = l.id;\n }\n }});\n if (singleLayerIdToKeepOn > 0) {\n group.layers.forEach(l => {\n if (singleLayerIdToKeepOn !== l.id) {\n l.visible = false;\n this._layerHelper.toggleLayerInMap(this.map, l.id);\n }});\n }\n group.noOfVisibleLayers = group.layers.filter(l => l.activeInSelector && l.visible).length;\n group.visible = group.layers.some(l => l.visible);\n });\n // DMP Layer\n this.dmpLayers.forEach(dmpLayer => { if (dmpLayer.datasetId === layerId) dmpLayer.visible = !dmpLayer.visible});\n this._cacheProfileInfo();\n }\n\n setLayerErrorStatus(layerId: number|string, errorStatus: boolean): void {\n this.filteredLayerGroups.concat(this.filteredBackgroundLayerGroups).forEach(group => {\n group.layers.forEach(l => {\n if (layerId === l.id) {\n l.hasErrors = errorStatus;\n }});\n });\n //DMP layer\n this.dmpLayers.forEach(dmpLayer => {\n if (dmpLayer.datasetId === layerId) {\n dmpLayer.hasErrors = errorStatus;\n }\n });\n this.filteredDmpLayers.forEach(dmpLayer => {\n if (dmpLayer.datasetId === layerId) {\n dmpLayer.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.concat(this.filteredBackgroundLayerGroups).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.activeInSelector && 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 async toggleLayerSelector(): Promise<void> {\n this.collapsed = !this.collapsed;\n if (this.collapsed) {\n this.searchText = '';\n this.filterChanged();\n }\n if (!this.collapsed) {\n //Expanding, make sure it stays in viewport\n this.layerSelectorDragPosition = await this._layoutService.keepWidgetInViewPort(this.layerSelectorDragPosition, this.POSITION_STORAGE_KEY,\n WidgetConstants.layerSelectorHeight, WidgetConstants.layerSelectorWidth);\n }\n }\n\n updateOpacity(layerId: number | string, opacity: number | undefined): void {\n this._layerHelper.updateLayerOpacityInMap(this.map, layerId, opacity);\n }\n\n stopDrag(event: Event): void {\n event.stopPropagation(); // prevents drag container from activating\n }\n\n filterChanged(): void {\n this.filteredLayerGroups = this.setfilteredGroups().filter(gr => !gr.background); \n this.filteredBackgroundLayerGroups = this.setfilteredGroups().filter(gr => gr.background);\n this.filteredDmpLayers = this.dmpLayers.filter(dmpLayer => this.searchText === '' || \n dmpLayer.title.toLocaleLowerCase().includes(this.searchText.toLocaleLowerCase()));\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: g.folded === 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[]>, groupArray: LayerSelectorGroup[]) {\n moveItemInArray(groupArray, 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 dropDmpLayer(event: CdkDragDrop<DmpLayerResult[]>): void {\n this._dropDmpLayer(event, this.dmpLayers);\n this._dropDmpLayer(event, this.filteredDmpLayers);\n }\n private _dropDmpLayer(event: CdkDragDrop<DmpLayerResult[]>, dmpArray: DmpLayerResult[]) {\n if (event.previousContainer === event.container) {\n moveItemInArray(dmpArray, 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._cacheProfileInfo();\n }\n\n clearSearchText(): void {\n this.searchText = '';\n this.filterChanged();\n this._cacheProfileInfo();\n }\n\n clearDmpSearchText(): void {\n this.dmpSearchText = '';\n this.dmpLayerResults = [];\n }\n\n updateGroupSortOrders() {\n this.filteredLayerGroups.forEach((g, idx) => (g.sortOrder = idx));\n this.filteredBackgroundLayerGroups.forEach((g, idx) => (g.sortOrder = idx));\n }\n\n updateLayerSortOrders(group: LayerSelectorGroup) {\n group.layers.forEach((layer, idx) => (layer.sortOrder = idx));\n }\n\n onDragEnded(event: any): void {\n const position = event.source.getFreeDragPosition();\n this.layerSelectorDragPosition = 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 async _loadPosition(collapsed: boolean): Promise<void> {\n try {\n // Default height and width when collapsed\n let widgetHeight: number = WidgetConstants.collapsedHeight;\n let widgetWidth: number = WidgetConstants.collapsedWidth;\n if (!collapsed) {\n // Custom height and width when expanded\n widgetHeight = WidgetConstants.layerSelectorHeight;\n widgetWidth = WidgetConstants.layerSelectorWidth;\n }\n const widgetPositionOptions: WidgetPositionOptions = {\n initialPosition: this.profile.layerSelectorInitialPosition,\n widgetName: this.POSITION_STORAGE_KEY,\n widgetHeight: widgetHeight,\n widgetWidth: widgetWidth\n }\n const savedPosition = localStorage.getItem(this.POSITION_STORAGE_KEY);\n if (this._profileService.getProfileVersionChanged() &&\n this.profile?.layerSelectorInitialPosition) {\n //Profile version changed in backend, use that\n this.layerSelectorDragPosition = await this._layoutService.calculateWidgetPosition(widgetPositionOptions);\n } else if (savedPosition) {\n this.layerSelectorDragPosition = JSON.parse(savedPosition);\n } else if (this.profile?.layerSelectorInitialPosition) {\n this.layerSelectorDragPosition = await this._layoutService.calculateWidgetPosition(widgetPositionOptions);\n } else {\n // Default position for layer selector\n this.layerSelectorDragPosition = { x: WidgetConstants.layerSelectorDefaultX, y: WidgetConstants.layerSelectorDefaultY };\n this._savePosition(this.layerSelectorDragPosition);\n }\n } catch (error) {\n console.error('Error loading position from localStorage:', error);\n this.layerSelectorDragPosition = { x: 0, y: 0 };\n }\n }\n\n private _cacheProfileInfo(): void {\n const cacheItem: CachedProfileInfo = { profile: this.profile, cachedLayerGroups: this.filteredLayerGroups.concat(this.filteredBackgroundLayerGroups) };\n localStorage.setItem(`${this._mapFilteredLayerGroupsKeyName}_${this.profile.id}`, JSON.stringify(cacheItem));\n this._cacheDmpLayers();\n // Reflect new order in map\n this._layerHelper.applyCachedLayersToDisplayInMap(this.map, this.profile.id);\n }\n\n private _initializeMapControl(): void {\n this.map.removeControl(this._layerSelectorBodyControl);\n if (this._layerSelectorBody?.nativeElement) {\n const element = this._layerSelectorBody.nativeElement;\n this._layerSelectorBodyControl = new ol_control_Control({ element: element });\n this.map.addControl(this._layerSelectorBodyControl);\n }\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\n #layerSelectorBody\n class=\"layer-selector-body-wrapper global-wrapper-container\"\n cdkDrag\n cdkDragBoundary=\".map-container\"\n [cdkDragFreeDragPosition]=\"layerSelectorDragPosition\"\n (cdkDragEnded)=\"onLayerSelectorDragEnded($event)\"\n [class.collapsed]=\"collapsed\">\n\n <div class=\"drag-handle-selector\" cdkDragHandle>\n <div class=\"drag-handle-content\">\n <div class=\"drag-handle-icons\">\n <mat-icon \n class=\"icon-left\" \n matTooltip=\"Lag\" \n [matTooltipShowDelay]=\"500\"\n [matTooltipHideDelay]=\"100\" \n matTooltipPosition=\"above\">\n layers\n </mat-icon>\n <mat-icon class=\"toggle-icon\" (click)=\"toggleLayerSelector()\">\n {{ collapsed ? 'flip_to_front' : 'remove' }}\n </mat-icon>\n </div>\n </div>\n </div>\n\n <div class=\"ol-unselectable ol-control layer-selector-body\" *ngIf=\"!collapsed\">\n <div class=\"search-section\">\n <div class=\"search-field-wrapper\">\n <label class=\"search-label\">Filtrer</label>\n <mat-form-field appearance=\"outline\" class=\"w-full\">\n <mat-icon matPrefix class=\"search-icon\">search</mat-icon>\n <input \n matInput \n type=\"text\" \n [(ngModel)]=\"searchText\" \n (ngModelChange)=\"filterChanged()\"\n />\n </mat-form-field>\n </div>\n <mat-icon matTooltip=\"Nulstil\" \n [matTooltipShowDelay]=\"200\"\n [matTooltipHideDelay]=\"300\" (click)=\"clearSearchText()\">\n replay</mat-icon>\n </div>\n <div\n cdkDropList\n [cdkDropListData]=\"filteredLayerGroups\"\n (cdkDropListDropped)=\"dropGroup($event, filteredLayerGroups)\"\n class=\"item-list\">\n @for (group of filteredLayerGroups; track group.id; let gIndex = $index) {\n <div class=\"group\" cdkDrag>\n <mat-expansion-panel [(expanded)]=\"group.expanded\">\n <mat-expansion-panel-header>\n <mat-panel-title>\n <mat-icon class=\"drag-indicator\">drag_indicator</mat-icon>\n <span class=\"panel-title\">{{ group.name }}</span>\n ({{ group.noOfVisibleLayers }}/{{ group.layers.length }})\n @if (group.visible) {\n <mat-icon (click)=\"toggleGroup($event, group)\" class=\"power-on\" \n matTooltip=\"Sluk\" \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=\"Tænd\" \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\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>\n <div class=\"item-left\">\n <mat-icon class=\"drag-indicator\">drag_indicator</mat-icon>\n <span>{{ layer.name }}</span> \n <mat-icon></mat-icon>\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.infoUrl) {\n <mat-icon \n class=\"layer-info\"\n matTooltip=\"Yderligere laginfo\"\n [matTooltipShowDelay]=\"200\"\n [matTooltipHideDelay]=\"300\" \n (click)=\"openUrl(layer.infoUrl)\"\n matTooltipPosition=\"above\"\n >info</mat-icon>\n }\n @if (layer.visible) {\n <mat-icon (click)=\"toggleLayer(layer.id, $event)\" class=\"power-on\" \n matTooltip=\"Sluk\" \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=\"Tænd\" \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.id, layer.opacity)\"\n (mousedown)=\"stopDrag($event)\"\n (touchstart)=\"stopDrag($event)\"\n (pointerdown)=\"stopDrag($event)\"\n >\n </div>\n <div *cdkDragPreview><span class=\"panel-title\">{{ layer.name }} </span></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 *cdkDragPreview><span class=\"panel-title\">{{ group.name }} </span></div>\n </div>\n }\n </div>\n <div class=\"group-header\">Mine Temaer\n <mat-icon (click)=\"toggleDmpSearch(true)\"\n class=\"power-on\"\n matTooltip=\"Søg\" \n [matTooltipShowDelay]=\"200\"\n [matTooltipHideDelay]=\"300\" \n matTooltipPosition=\"above\">add\n </mat-icon>\n </div>\n @if (filteredDmpLayers.length > 0) {\n <div class=\"dmp-item-list\" cdkDropList\n [cdkDropListData]=\"filteredDmpLayers\"\n (cdkDropListDropped)=\"dropDmpLayer($event)\">\n @for (layer of filteredDmpLayers; track layer.datasetId; let iIndex = $index) {\n <mat-expansion-panel expanded=\"false\" [disabled]=\"true\"> \n <mat-expansion-panel-header>\n <mat-panel-title>\n <div class=\"dmp-item\" cdkDrag>\n <div class=\"dmp-item-container\">\n <div class=\"dmp-item-left\">\n <mat-icon (click)=\"deleteDmpLayer(layer, $event)\" class=\"delete-icon\" \n matTooltip=\"Slet\" \n [matTooltipShowDelay]=\"200\"\n [matTooltipHideDelay]=\"300\" \n matTooltipPosition=\"above\">delete\n </mat-icon>\n <div class=\"dmp-item-title\">\n <span class=\"title-text\">{{ layer.title }}</span>\n </div>\n </div>\n \n <div class=\"dmp-item-center\">\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 @if (layer.visible) {\n <mat-icon (click)=\"toggleLayer(layer.datasetId, $event)\" class=\"power-on\" \n matTooltip=\"Sluk\" \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.datasetId, $event)\" class=\"power-off\"\n matTooltip=\"Tænd\" \n [matTooltipShowDelay]=\"200\"\n [matTooltipHideDelay]=\"300\" \n matTooltipPosition=\"above\">power_settings_new\n </mat-icon>\n }\n </div>\n <div class=\"dmp-item-right\">\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.datasetId, layer.opacity)\"\n (mousedown)=\"stopDrag($event)\"\n (touchstart)=\"stopDrag($event)\"\n (pointerdown)=\"stopDrag($event)\"\n >\n </div>\n </div>\n <div *cdkDragPreview><span class=\"panel-title\">{{ layer.title }} </span></div>\n </div>\n </mat-panel-title>\n </mat-expansion-panel-header>\n </mat-expansion-panel>\n }\n </div>\n }\n <div *ngIf=\"filteredBackgroundLayerGroups && filteredBackgroundLayerGroups.length > 0\" class=\"group-header\">Baggrundskort</div>\n <div\n cdkDropList\n [cdkDropListData]=\"filteredBackgroundLayerGroups\"\n (cdkDropListDropped)=\"dropGroup($event, filteredBackgroundLayerGroups)\"\n class=\"item-list\">\n @for (group of filteredBackgroundLayerGroups; track group.id; let gIndex = $index) {\n <div class=\"group\" cdkDrag>\n <mat-expansion-panel [(expanded)]=\"group.expanded\">\n <mat-expansion-panel-header>\n <mat-panel-title>\n @if (group.expanded) {\n <mat-icon class=\"arrow-up-layer\">arrow_upward</mat-icon>\n }\n @if (!group.expanded) {\n <mat-icon>arrow_downward</mat-icon> \n }\n {{ group.name }}\n ({{ group.noOfVisibleLayers }}/{{ group.layers.length }})\n @if (group.visible) {\n <mat-icon (click)=\"toggleGroup($event, group)\" class=\"power-on\" \n matTooltip=\"Sluk\" \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=\"Tænd\" \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\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>\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=\"Sluk\" \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=\"Tænd\" \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.id, layer.opacity)\"\n (mousedown)=\"stopDrag($event)\"\n (touchstart)=\"stopDrag($event)\"\n (pointerdown)=\"stopDrag($event)\"\n >\n </div>\n <div *cdkDragPreview><span class=\"panel-title\">{{ layer.name }} </span></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 *cdkDragPreview><span class=\"panel-title\">{{ group.name }} </span></div>\n </div>\n }\n </div>\n </div>\n <ng-template #dmpDialog>\n @if (dmpSearchMode) {\n <mat-dialog-content>\n <div class=\"dialog-header\">\n <div class=\"search-section\">\n <div class=\"search-field-wrapper\">\n <label class=\"search-label\">Søg</label>\n <mat-form-field appearance=\"outline\" class=\"w-full\">\n <mat-icon matPrefix class=\"search-icon\">search</mat-icon>\n <input \n matInput \n type=\"text\" \n [(ngModel)]=\"dmpSearchText\" \n (ngModelChange)=\"searchDmp()\"\n />\n </mat-form-field>\n </div>\n <mat-icon (click)=\"clearDmpSearchText()\" class=\"undo-icon\" >undo</mat-icon>\n </div>\n <mat-icon \n class=\"close-button\" \n (click)=\"toggleDmpSearch(false)\"\n matTooltip=\"Luk\" \n [matTooltipShowDelay]=\"200\"\n [matTooltipHideDelay]=\"300\" \n matTooltipPosition=\"left\">\n close\n </mat-icon>\n </div>\n </mat-dialog-content>\n }\n\n @if (dmpLayerResults.length > 0) {\n <div class=\"dmp-search-panel global-wrapper-container\">\n <div *ngFor=\"let result of dmpLayerResults\" [attr.data-value]=\"result\" class=\"search-result-option\">\n <mat-expansion-panel expanded=\"false\"> \n <mat-expansion-panel-header>\n <mat-panel-title>\n <span class=\"result-title\">{{ result.title }}</span>\n </mat-panel-title>\n </mat-expansion-panel-header>\n <div><span class=\"field-label\">Status:</span><span class=\"field-value\"> {{ result.availability }}</span></div>\n <div><span class=\"field-label\">Kategori:</span><span class=\"field-value\"> {{ result.category }}</span></div>\n <div><span class=\"field-label\">Beskrivelse:</span><span class=\"field-value\"> {{ result.description }}</span></div>\n <div><span class=\"field-label\">Tags:</span><span class=\"field-value\"> {{ result.tags?.join(', ') }}</span></div>\n <div *ngIf=\"result.metaDataUrl\">\n <span class=\"field-label\">Metadata:</span>\n <a [href]=\"result.metaDataUrl\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"open-link\">\n Vis metadata\n <mat-icon class=\"link-icon\">open_in_new</mat-icon>\n </a>\n </div>\n <div *ngIf=\"result.license && result.license.url\">\n <span class=\"field-label\">Licens:</span>\n <a [href]=\"result.license.url\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"open-link\">\n {{ result.license.title }}\n <mat-icon class=\"link-icon\">open_in_new</mat-icon>\n </a>\n </div>\n <div *ngIf=\"result.dataLiabilityAgreement && result.dataLiabilityAgreement.url\">\n <span class=\"field-label\">Dataansvarsaftale:</span>\n <a [href]=\"result.dataLiabilityAgreement.url\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"open-link\">\n {{ result.dataLiabilityAgreement.title }}\n <mat-icon class=\"link-icon\">open_in_new</mat-icon>\n </a>\n </div>\n <div class=\"add-layer-section\">\n <span class=\"field-label\">Tilføj {{ result.serviceType }}:</span>\n <mat-icon (click)=\"addDmpLayer(result)\" class=\"add-option\"\n matTooltip=\"Tilføj\" \n [matTooltipShowDelay]=\"200\"\n [matTooltipHideDelay]=\"300\" \n matTooltipPosition=\"above\">add\n </mat-icon>\n </div>\n </mat-expansion-panel>\n </div>\n </div>}\n </ng-template>\n</div>","import { HttpClient, HttpHeaders, HttpParams } from '@angular/common/http';\nimport { inject, Injectable } from '@angular/core';\nimport { GeoServer } from '../models/geoserver';\nimport { map, Observable, of, tap } from 'rxjs';\n\n// @ts-ignore\nimport * as SLDReader from '@nieuwlandgeo/sldreader';\n\nimport { Style } from 'ol/style';\nimport { StyleFunction } from 'ol/style/Style';\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 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<StyleFunction | Style> {\n\n return this._getSldStyleObject$(styleName, workspace, geoserver)\n .pipe(map(loadedStyle => {\n // I always create the style function but only use it if I cant create a style object.\n const func = SLDReader.createOlStyleFunction(loadedStyle);\n try {\n return SLDReader.createOlStyle(loadedStyle.rules[0], styleType) as Style;\n } catch {\n return func;\n }\n }\n ));\n }\n}\n","import { Map } from 'ol';\nimport { IProfileDetailed } from '../models/IProfile';\nimport { Injectable } from '@angular/core';\nimport { ReplaySubject } from 'rxjs';\nimport { GisKomponentSettings } from '../models/GisKomponentSettings';\n\n@Injectable()\nexport class CurrentItemsService {\n\n constructor() {\n const dt = new Date();\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\n gisKomponentSettings!: GisKomponentSettings;\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()\nexport class DrawLayerSourceService {\n\n private _current = inject(CurrentItemsService);\n private _hiddenFeatures: Feature[] = [];\n private _features = new Subject<Feature[]>;\n features$ = this._features.asObservable();\n private _selectedForHighlight = new Subject<Feature[]>();\n selectedForHighlight$ = this._selectedForHighlight.asObservable();\n\n source: VectorSource = new VectorSource();\n layer = new VectorLayer({\n source: this.source,\n zIndex: 999\n });\n\n previewSource: VectorSource = new VectorSource();\n previewLayer = new VectorLayer({\n source: this.previewSource,\n zIndex: 999\n });\n\n private _disabled = false;\n\n constructor() { \n this.layer.set('DRAWLAYER', 'true'); \n this.previewLayer.set('PREVIEWLAYER', 'true'); \n this._initListener();\n }\n\n private _initListener(): void {\n this._current.map$.subscribe({\n next: map => {\n map.addLayer(this.layer);\n map.addLayer(this.previewLayer);\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 \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 get allCleanedFeatures(): Feature[] {\n return this.allFeatures.map(f => {\n f.unset('_centerpoint');\n f.unset('_parentPolyId');\n f.unset('LOCKED');\n f.unset('STYLENAME');\n f.unset('showlabelfrom');\n return f;\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\n hideFeaturesforPreview(featureIds: (string|number|undefined)[]) {\n this._disabled = true;\n this._hiddenFeatures = this.source.getFeatures()\n .filter(feature => featureIds.includes(feature.getId()));\n // Temporarily remove overlapping features from draw layer while previewing\n this.source.removeFeatures(this._hiddenFeatures);\n this._disabled = false;\n }\n\n restoreFeaturesAfterPreview() {\n this._disabled = true;\n this.source.addFeatures(this._hiddenFeatures);\n this._hiddenFeatures = [];\n this._disabled = false;\n }\n\n setFeaturesSelectedForHighlight(features: Feature | Feature[]): void {\n if (!Array.isArray(features)) { this.setFeaturesSelectedForHighlight([features]); return;}\n this._selectedForHighlight.next(features);\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 = 1;\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()\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 \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, lineIntersect, lineSplit } 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.filter(f => f.getGeometry()?.getType() ==='LineString').forEach(feature => {\n const linestringFeatureObject = this.geoJsonFormat.writeFeatureObject(feature, { dataProjection: 'EPSG:4326', featureProjection: 'EPSG:25832' }) as TurfFeature<TurfLineString>;\n const lineFeatureObject = this.geoJsonFormat.writeFeatureObject(lineFeature, { dataProjection: 'EPSG:4326', featureProjection: 'EPSG:25832' }) as TurfFeature<TurfLineString>;\n\n if (lineIntersect(lineFeatureObject, linestringFeatureObject)) {\n const lines = lineSplit(linestringFeatureObject, lineFeatureObject);\n \n const newFeatures = lines.features.map(lineSplitFeature => {\n const newFeature = feature.clone();\n this._featureHelper.setId(newFeature);\n const newGeometry = this.geoJsonFormat.readGeometry(lineSplitFeature.geometry, { dataProjection: 'EPSG:4326', featureProjection: 'EPSG:25832'});\n newFeature.setGeometry(newGeometry);\n return newFeature;\n });\n vectorSource.addFeatures(newFeatures);\n vectorSource.removeFeature(feature);\n }\n });\n\n // Handle polygons\n overlappingFeatures.filter(f => f.getGeometry()?.getType() === 'Polygon').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';\nimport WKT from 'ol/format/WKT';\n\n@Injectable()\nexport class ZoomService {\n\n private _currentItems = inject(CurrentItemsService);\n private _wktFormat = new WKT();\n zoomToFeatures(features: Feature[] | Feature | string): void {\n\n if (!Array.isArray(features)) { \n\n this.zoomToFeatures([this._ensureFeature(features)]); \n return;\n }\n\n const extent = features.filter(f => !!f && f.getGeometry()).reduce((acc, feature) => {\n return extend(acc, feature!.getGeometry()!.getExtent());\n }, createEmpty());\n\n if (extent[0] === Infinity) return; // skip fitting to empty extents\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 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 { 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';\nimport { easeOut } from 'ol/easing';\nimport { interval } from 'rxjs';\nimport { CurrentItemsService } from './currentItems.service';\n\n@Injectable()\nexport class HighlightService {\n\n private _wktFormat = new WKT();\n private _zoomService = inject(ZoomService);\n private _current = inject(CurrentItemsService);\n private readonly fadeStart = '_fadeStart';\n private readonly fadeEnd = '_fadeEnd';\n\n private _highlightSource = new Vector({ wrapX: false });\n private _highlightLayer = new VectorLayer({ \n source: this._highlightSource,\n zIndex: 999\n });\n\n\n constructor() {\n\n this._current.map$.subscribe({\n next: map => {\n map.addLayer(this._highlightLayer)\n }\n });\n // To make the highlight fade out, I reset the style every 20 ms\n interval(20).subscribe({\n next: () => {\n this._highlightSource.getFeatures().forEach(f => {\n const start = f.get(this.fadeStart);\n const end = f.get(this.fadeEnd);\n \n const now = performance.now();\n const t = Math.min(1, (now - start) / (end - start));\n // Adding and removing forces a redraw of the features\n if (t < 1) {\n const progress = 1 - easeOut(t);\n const newStyle = this._getFadedStyle(progress);\n const newFeature = f.clone();\n newFeature.setStyle(newStyle);\n this._highlightSource.addFeature(newFeature);\n }\n queueMicrotask(() => this._highlightSource.removeFeature(f)); \n });\n }\n });\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 \n const newFeatures = feature.map(f => {\n const newFeature = new Feature({ geometry: f.getGeometry(), style: this._getFadedStyle(1) });\n const now = performance.now();\n newFeature.set(this.fadeStart, now);\n const fadeMs = this._current.gisKomponentSettings?.highlightFadeTimerMs ?? 2000;\n newFeature.set(this.fadeEnd, now + fadeMs); // set the style to fade (and be removed) to two seconds\n return newFeature;\n });\n \n \n this._highlightSource.addFeatures(newFeatures);\n if (zoomToFeatures) {\n this._zoomService.zoomToFeatures(feature);\n }\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 private _getFadedStyle(fade: number): Style {\n const newStyle = new Style({\n stroke: new Stroke({\n color: [0,255,255,fade],\n width: 3\n }),\n fill: new Fill({\n //color: 'rgba(0, 0, 255, 0.3)'\n color: [0, 0, 255, fade]\n }),\n image: new Circle({\n fill: new Fill({ color: [175, 202, 10, fade] }),\n stroke: new Stroke({ color: [40, 112, 133, fade], width: 2 }),\n radius: 5\n })\n });\n return newStyle\n }\n\n}","import { inject, Injectable } from '@angular/core';\nimport { Interaction } from 'ol/interaction';\nimport { CurrentItemsService } from './currentItems.service';\n\n@Injectable()\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\n // Find the interactions first. Then remove. Don't do a getInteraction.forEach and check and remove the interaction.\n const interactionsToRemove = this._current.map!.getInteractions().getArray().filter(i => this.isTemp(i));\n interactionsToRemove.forEach(i => this._current.map!.removeInteraction(i));\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()\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._featureHelper.typeId(f) !== typeId) { 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._interactionHelper.clearTempFromMap();\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,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAA45JREFUSEu1VmtIk2EUXr/EWBAV9bM/UX8ikIIoCEIISrpZljNQ87IKaptlV7psRloNY6JzYm7O28gsb6Vppm6m5Ww2XQ4nxswoi7zMpk6bFk/f+XQrLdNNGjz7znde3ud5z/ud95x3EWfql5mZGWy328VjY2OrnU7nYpffk6ePj8+or6/vey6XK+fz+Qr33KysrLLExETodDqYTCZYrVavQHOJIz09ndDBCmRkZIQpFAqvCOtM7yEo7If/3a9o7+yaxpGdnQ2lUpnEkclk3fX19fMW0Ju7cf1JL9YmObBcOoRwtQW7VGZcLuubxmEwGCCVSgc5EolkwmKx/FOAVnf76Rf4K+1YfsuOHdkdUD6vhs5UyIJsEpy5tWKxGBz6m23P07SfEZgzCG68DbvUXbhR0egmdZG7nn7yT9C86JnG9VeBx4YP4GkGsezmMLbJP+Lio2ZUGUtmJXYJkDhF+Pti/xBYJ3NgjcyOMyVGFDWVz0n6exS0iBXSYdA3con8IcCRwCPSmdtEH5yy6r8JUNQrpQ53yi4sAv09aI0PoG3OZ+GKxj/1Ayg5KAqvBIi07qUGjfExsMRGwigKhFHI4EwUDAmXmBOsxibFkPcCdS/y8DomAj1iEfovRKHv+H4WZPdIYtAgCsfucxUo1Xd7FwGtvOfSCQwc24fewM34smcjC7JtjFDbVSFyBOcRnj/ghUBBIizMCm0nD2MgaCv6GdL+A1NgbPLZhCEwCI6Bd6XSMwFt60NUq8QwHtyJYSEP36ofw2loYFA/hQbWNyw6AktoECqUuZ4JVDffR5EsFtagLXAIeBivq8REi34ayEdjb0O2oilP7ZkApWHNfSlaDm3HSPRejPL3wRG9B46oKTA2+WjMzAtAU75m/gJ0gKh8+MW14zZPiDdH12OcomDgPDUJ17s5Yj2ei/h4VVMzKcCU6x+dnZ1s3s4sFdfKm9iCR4WPCiClXqMmC/qwAzDzGZHTofh+NoIF2eSjsVpl2q9zwLTKXr1e7xZQaLVsvefG9SFAZXOfSld9aWttxbN0OXSCSLQHB8Aa5s+CbO2po6hKS2a5qH0mJCQ4OEzvTM7NzWWdS+KHsCFlhO1YLZZ3s/YJs7kNjVVPUZ6ajNI7t1iQXVta4p6jVqshl8t1bF9OSUkZLCgowFydbT6XAeIgcqYVjxUXFy913yxUKlUZtU/6MAsBcTCXiJdMw19F5D8Bm6ShPdSR8VEAAAAASUVORK5CYII=';\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,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAzZJREFUSEutVl9IU2EU/6IHsYR6K6jooYeiXoJSKiqwHsqQqLAkKh8KaUgpguEKc6a5bG1tzrvF2tQ5GYU9GEtmlsXs+mdujlwG1tpMDXroRXyoIRG/vnNtWurVq/nB2Q6/8/vO79xvZ9+5K9ifVVdXlz0+Pq6Jx+ObJyYmViXwxXwnJSX9SE5OHklJSRFyc3OtU3udTmeLXq+Hz+dDOBxGLBZbktFeymGz2cg+SAJ2uz3HarUuKeF8hTQ0NMDhcJiY0WgcFkVx2QWCwSB0Ot0YKysr+zk4OCgrEI0OIUb217ENfx5VVJBGowGjD7lHjXwcgueNG3mOnUi7xbCHrJwhVcNQ4ErF20g3wv0DsvsXFCh1n0CGgcHiy4I4bELo60PJxGGjhGWaGC4b0tHb2zunyLwC9tYSZFlWonvUjCfvz6G0fTVUT5lk5BPW80XAedsa3GzMQiQSmSUiK9DV14FMI4M4UgVd50YUtTJcfcaQWOQTdq9zEy/AgGxhNbziI0Sj0X9EZAUu3N8Ce9dZCP5tUL9gULcx5LdMC5BPGMUs/u1w9lyC6sEuzGwWWYF9FQytn/Kgfskr5YkKebUqz7QA+YRRjDht0XwcucvQ39+v7An232ZwvktDMd+80CKOa2AvjnKBQCCgTOAAFxD61uPGq4UFiGMNbUAGF5jZTbJHdFDLUNnJUCEylLxmKG7nff98Wox8wihGnDtdDMd0ixBQ2XajkHeKzs+g5ZspyXWeLLHIJ4xixCni3IvmHcqPSF11DcfNDPpebgGGqh6GMp4wscgnjGIGzjnJufbHeuU/Ml0dedWHcNrKYAxyC/FKeaLK7kkjnzCKneGcAsthdHR0KG9TEvB4PLhiTsepan48XgYTTyiEJ418wihGHK/XK1Wv+I9GAqFQSNpoqi1HjmErMviPSJ0iGfcJoxhxiCt7VfDr+tdcQcKoKnr05uZmuN1uuFwuycgnjGLEmWs/FSm1KR+V3/x+v6L7fTGjlManVqv9zvjsNDc2Ni67QH19PQRB8ElzuaamZqypqWlWFyym4gSXLjxKzkdxnB/j2qk3i9ra2hYan3Ru/2OUg79EdPOBv46S/wZ3qa2VRKmhvgAAAABJRU5ErkJggg==';\n static measureDistanceIconBase64 = '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 measureAreaIconBase64 = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAA+JJREFUSEulVl1Mm1UYriaTYYjxYm43JrvwZyZqYlz01mSJWzajN8bolYsXkIhOt7rMsFFal0ClbfqV9lsn6S9rxxgCLa6uZLQCa8vXjsSsP9D/rduKF2BEjK5Bszx+72EFm3YUkOTJ9+Y957wP7895Th+TPPyzWq0fLi8vy0ul0t6VlZUny/6tfBsaGu43NjbeaWpq4pubm41rZ+12u0ej0WBychLRaBT5fH5boLMUo7e3l5BiBCaT6WOj0fjIgH6/D3K5nK23nzm94ddsNiGTybA9fX19MJvNOgnHcYVAIFCTwOu9CrvVCq/Xy9b9fn/VN5vNMn8sFsPlS5fgGh5ie2ZmZqBSqZYkCoXin2QyWZPgG4UCiURi0+Wi/14mO8OCEwllLimnv926b3SuLgHVXBCETWdQ7tOWMig3bTsZ1s3AaOQx6nYhl8sglY1XZELNLZPmcrmHzfdBo1FvvgfxeBz9TmfVeEpPHK85rl1dXWyaysQbZtDf3w/75e9x5Ycf2RgmslF4PB52uN63LgFdksIv8+ANekxNle/IahkIsbmf8d3Vr9E28A6kA2/jpPMA2ocOo+8nBZKpWaTSqdpjSveBSuL3jWNxcRGcVoNQcLpqipQjH4gzfgTmyHsw3VgF2Yprr+C04134BbfYt1zlPfCNT0Ct6hYXsigWi7hXnIeqW4lQaJ1gNhnDee9JaN2HwAtvQO5/BsmFawxknwu/iR73EfBXPq/OQK8/jxPHvxAJ8rh79x5y+dvQqLsR+A8BkSuG34Iu9BrafQ04NbYThaUIA9nkM0zvR+fowWoCISzgo6NHcfDQYQy73EhnsmIPdAgGQ2slSmXmIB15GZywD8E7PG4UHVj4M8tANvk44SVI3a8y0evo6KiUCqVSiVwmDYPejJaWFmi5Hly/vi6ERHBscBd6Is+j8HsAv5UK+PvBfQayydcTeQFS5y5QPysILjgcuH3rFrtUJN9anRZyhQwTE1MVGbQOPIXOwA5ohGehmd6H+T9uMpBNvs7gDtCeKrFTcxyiN3Ow2W2k42uynE6tjhwhk83gmPFFyOQSfCtI0BnaieSvowxkk69DXPvK9vo6gSjXD6he3rEx6DidGNyCVCpdU+Bm5xIwjsjQ6twtjqAEqsjjsMf3M5BNvtaLu3FuqG2dQHwqF8Lh8JYUs9vxKb60PodTzicgG5cwkE0+9cXPWCx6PkXp+Esivp16h1j/rarlhWEeZy2foK33fQayyVeOY7PZwPP8JHuXDQbD0uDgIOt8PaKycj5qH8Wg4OJTXHK5XE+v/bKwWCweej5JAf8PKIY4hdPioOyh4P8CJH3KPKVQai4AAAAASUVORK5CYII=';\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,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 printBase64 = 'data:image/png;base64,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';\n static featureSearchIconBase64 = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAA3hJREFUSEu1VmtIU2EYPgVlxozoYn+CfnRRDKKS+lMRdBEsCKIf9aekyCi72U2U0lk0y7U41k5Lc3POaYrpNLPbNFxN3aaSjaLJ0ppdyco5S4dFPJ33qy21smY1eHZensP3PN/7Xd73jOC+/XJyctZ7PB6p1+ud1tfXN9bHB/IMCgrqDQ4ObpdIJEJsbKzKPzY3N7dSoVDAZDLBbrejra1tWKCxpJGVlUVoYQbZ2dmbVCrVsARv29uxu/Qtll3owkPn4wEaOp0OarU6g+N53mU2m//YwPrAhWPXOjArowcT5d2I0ToQrXmAw5VvBmg0NjZCLpe7udTU1E8Oh2NIA5pd+s3XWKb2YOJJD1bqWqC+Uw2TvZSBYjIcvLRSqRQc/f1qzc/XvMLaPDcksk5Eax/j+HWLX9Qn7nvOE16ioO7FAK2fGlxpfIYNBW5MOPEeS4TnSKxogvFu+S+FfQZkThn2n+wPBmF8D2bwHuwvvwuD7epvRftnQZOYJH8P2iOfyQ8GXCoCEh28TLThdKr+mwFlHSrv8R/Zf54BZUT7RoeDshi2gbHpIoTKeCQURmFP4VLs0y9G4qXlyDTGgzdWI1J493cGR0tWi7NbBbVtDbIbvoJiqXE2DulWICLdhIqGp4FnUNVUCMWVLThdHgXBsgDSW5Ph6DAyUHzOuhAZ5dHYmLkNMUXvAjeouXcJKSWLkVE3F0eqg5BwYwxcbhsDxcQp6yNxsCgKizK7Ajeobi7CPkMEeEsYatsFNDzXo+PDIwaKieMt4dhjmAMqhAFvMhnsKp6AM7YZcHWZ0el14ePnXgaKiTtjm4n9+ZOGt8lksL0wBDLzKCgsU6GoD8OL7nsMFBMnqx2FuKJxgRnQBaLyMZPvxNaz4Tgi5XDSwkFWNwaOt5cZKCYuRXx3QDv/u4FYrj87nU5GDC4VKVdt7OJQ4aMCaKh3QmVIRlx+qLi+HOS2kci9H8lAMXFxBaE4V5L03UBslR1Wq9VvoKqpYfVecvQNVmk6/beyf5VM1+/A3pzpSMgfjeQqjoFi4k4V7GRa1D7T0tJ6OLF3ntXr9YwMkXVjjvID61jNjidDNqG8UgHHNJuRlLWOgWLifBPRarUQBMHE+rJSqXQXFxfjd52NBre2tg5pTBokLrZib1lZ2Xj/l4VGo6mk9kln929AGuJHRL3Y8KeQ+BceKZouVHN+8AAAAABJRU5ErkJggg=='\n static zoomIconBase64 = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAO1JREFUeNqsk+ERwiAMhdtOwAiOwAg4gYzACI7gJp4ToBPoBu0GukG7gYZeehcjgZxt7t4fCB8JvLSNHA5kQQY0gQbQo/kjAugJemeU1o9aUKokCiCuO+YXI2YOBWw9CPvFNpfEESHSu44kV2yfvpmrdOLYm/6E1bZB4iwV0LGFixJ4YxV/AelvvZTASdromo2jY+4/KM/RvCFnaGoZoxgAah1T+7W+ADXohCU3am9N/vIsx+NlfAyDBLUMSiuuzXYRWgP0wsUztBXAHn9yxzyaDH1FM+emar/GciFT5WmtjznUbTEcDiubYR8BBgD2fnjD/AKVHwAAAABJRU5ErkJggg=='\n static cutIconBase64 = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3gYDDB8MtOM2YAAAAdBJREFUSMfl1T2MTFEUB/DfjOcjviq7DRsRRCKiY+kVmleKwkchKgmrZWhEVqFhswqVRLIFiShOfBSi0C2xUSgVxGKzIxIJdmVHRnMneXmZtxijcpp33jnn/v/3no97+cdS62VRnuftsi0ian0hKIC/xzRWYGcVSb1H8DFsx14cwFTVyeo9ZGgatzGHDG9xpiq4F4IPeIcF/EAb+/pJsAuBw9iGdRjpSw0KADswiocpRcv6eYKT6bsBQ31t0zzPB9BIKRmMiGae57uxCQOpFpciYvK3CfI8X5XUlQmos3gYe3C1EN5Ohb+GRkR8zRYB3pgKebEiZLKgz+IxnuBKSuMzTGQV4Edws2SeT1MrFbaT/1c4iudo4TXu4SAmaiXg9WmQivIZH3ELZ5OtERGjaXK/YDO+4Xvyz2EGQ/VFwGdxB1sjYktENJL9DR4V4lbjFJZgKcaT/gnLswrwkYgYq7iHXhZbM9kbiaSNtcn9IiLms8L90pFjEXGjBH45qTO4EBFPu5CsSaZmRAx2/OUin+sC/gD70++JIvivhqxMMFxeXLp+D0XE3T8d+6zbDkrATRzH/b9+Mrs8GKdxHa2IaPVCkBXA62m3UzifumDBfy8/ARhwrGEODAGpAAAAAElFTkSuQmCC'\n static copyIconBase64 = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3gYDDCItkmJugAAAAHBJREFUSMftlEEOgDAIBIvp93jtPtCevBhT10m10bjXEmAWSilvV7iBmbk6cZICdeIUOIqppJCk2CfDnQ8lOEuyvWMC2uXlGTg+/wTzCVzV3nfvJXSLYwKXBhO4Wu4+18gi93QPX9MpFj0/A+zvZ9UAaFN03sNpI7gAAAAASUVORK5CYII='\n static copyWithBufferBase64 = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3gYDDCQhzY6FLQAAAIJJREFUSMftVW0KwCAIreH1PK0HrF9BuOVHErIxIQqrl74nVsrbrXIHIjYiqisfIjYL8Dh/A9IuPQVgCVJ8ZPaN9TzPw5OlOQDpDOwASXsafduRujPggnGwVVX9GbgzuE63CogCaBSFNdA4B2vTMovHLF8Db5kea2ppFOVqEPo4PmMdpg1975VbWTEAAAAASUVORK5CYII='\n static fremhaevBase64 = '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 fremhaevSelectedBase64 = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAA2hJREFUSEutlmtIU2EYxxdRSSgFVkaJVkRUkJoZ0s2gErK+lRQVWVZ2+6Am3YR0W3lda1pz0+Vxs4vW8DJxm6O5OdPmtObMTCmx8pY3KutDZYn823toy81ayzV4d3YOnP/v/T/P8z7PpjB+fsRi8d5PH3qYI99HfUe+TZ1pef4vV7cZY1/cpk/rcp+1ICsqKkpofTdfkq3gcqNRK9+AtofL0f144aQWeZdo3BREQyTivqABubm5EUKz+GRE9dXBiLnLwzaBFu2GJTYad7KOgaKEmYwMDruzThnsNMBYE4DkogtYdq0Dc9IHcVjyHGFUIxKkbBuNJo0fOJyEYQaLlTDaoV/sEEB2xy2JxdZsHTxTBxGa/xRUjQbVzSX0Ir8J0D4KTCYTDPL1p/Dklh/BbkoG9+QBhIlbkaQyWEUt4pbran47pKpwG63fAlSVodgvvgfPlEGE8F/iYrkRalPZH4UtAAInDsdvdgJg+bV2LOX1Ia7MhNIG5V9Fx7sgmyA5ITmyQCYAGCw4LappLsXtei2ya2tA6XWobJLRCSdV9V8A8kY5DlT0IOjWR6zLGUC6RIDiOjnmpfVbS9YlB0qTHMfl7Qi+3ougcwYcPXsGlUYpnTdSHMSFSwASEp76AcKTxNgRl44k/mVoTUXI1NZg7Y1G1wH2ZTr+nhQKqUaXHCjMIYpQdtE5CMnrBq9QhKqmIrpIIiUmRObnuwYoNymwt6IP/iVVCGT343h8PDSNUtw3qOhq2phl/H8Ab1Yvtp9iISCjFV7pfTh5KxukEboUIuJge9k7+BXrMJ/5Fusjz6OgfJfjk+zMQbv9SI3wO22YyxlCYMF7+JlD5M3qQkzcZnTobeeI0w5I2yDtg1THoqvdSJQmQlu9BZEKjTkHWscAFuvQ2Jt6H9qavYNEZQN9cEjjIw2QlJ6lDTQb/J0DcNMShozq1VaAUKej+70Huw87cyqsp9K+pbcYVuG0ogRrCgbMDloQE7vJJkRkfKamXPrMEIn4NwqFETTAI2kQ/plt9MRq0a9wOIReN/hCpQ5F9JUT2Hf6INISV+JV3a8cSCRhyOJzqum5zM9IHS7O2WPegePJZu+is94bLVofPKnwwTONN7oaFtAaRDyDx/4qk8lmW/9Z5OUJFGR8ksy7soiGUMCtoyjKi4j/AJuVGiaL/SZsAAAAAElFTkSuQmCC'\n static infoBase64 = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEwAACxMBAJqcGAAAAl1JREFUSInVVc9PE0EYfd9sFyiLYBtDijebeihyIhy8GE8mxIsepEjsxYsRErT/QfUuUZSU6AUPJiKEcBM9eiORqxBpUxNDRCkU2tof2+7OeMDdlm132yZ48J3mm5nvvffNNzsL/O8gp8WrC9+6cqo+TuA3BMQIwAaOV/gugTaI06ridi1/unuh1J6AEDT8Mj4BgRlG5HO0yLFLhMjnyYtLLQmMLQkpeRCPEdE9R2KrJyDm9wYeLIdIr51nVufJdHy+XfK/TqcSB4kXDearGH61fYdxemNH8uF2PwBgdHHPXkhgvPa4zAouz3x3k87n2vNdD02I+cDsdqcRu4xBubsYZiSddUq+8mwdAKD4/LZ7JEZej5tPAHgN1FQg9Mr9Zu4Un9+R3ICu6lPG2KwATAraJYSHFISHFDN26gEACKJLJq0xkJjLbZewsL5jHk8rkBgzuVxOGw3IPR7IPZ6WBUBk3s7aHrRO0ARc10SdQKVcKZyWgNCrXNUvWStsnpZApVz4UifAS4UY53rjjDYguAYtn40ZsdnknMbe9mVSTzo8Pq81yXgirHGj66oepfc1j75oxCfeomB0LdTR1/9O7u49kZT/mWzo1vrRaYUMirn9W1+joysNBQBg8PHHmHzm3KRVpBm0fBZqLj239ejadO08s27cDGamy9lUTD3aQys9EVyDevgLpVzq+dbgYcS6bvvLDEbXQiA8dbl7z0tdCiS5A0THLeNch6io0NQ8ysXfOyARqT2WlgQAIDD7vlNOS2MAbnJgBIQBAGDADwG+IQSt6l6+knh4XW1a6r/CH/oT3HyJavllAAAAAElFTkSuQmCC'\n static downloadFileBase64 = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAn1JREFUSEutVt9rUnEUtycxfOitx/6eHloPUVIwI8I9RTWcVE8KAyOTjDSZ6L3Xm3NDIXS1ftEi06m33XTd20yzhHrtZfhQIhGn7zmmbIOrX3XCUZTv+XzO+XzO/R6PmP6/RFG0tdttd6fTOdHtdo/2fx/n02w2/7ZYLD+sVmvI4XCEB7nxeHzd7/dDLpcDTdOg1WpNFJiLGJFIBKNBBNFo1B4Oh0cCblS/gP+VTpHc/Ayv2fdhhciyDLFY7L4pEAh8LxQKQw870yqcExQKm1BiUQabqBCREYmqquDz+XZNHo/nT71eNzzof6kTsDP7Ca6tNQbhympwVngP4Tc7hrlutxtM+GZUBSafipRgPluDuZUtWHxSpbNzj8pwkxFcTG7D1dTWdAQnH+aJ4KDm11fL1BV2YeQHVwenlzYJ6CDIvefbRDw1wcxSkYBuPa7sk+Lusyr9fj5WnLwDrHqGeYAdXE6qIL/VYDWvw/I7HeZTKlxZUcAuFSf3AA21iyWaHCRBU/vhzO7QdC2u7e9s78CM9AAPv/jQgDOiCgtZnUhcLFCaS8kKXBCMq8dcLgKUaVbqjSrO/g0WLkaG5qIPw55mLgIEwInpd9Ej0OhpThX0wyFAmbBi9GKBSYTaz4rD5eGWqC/BnacVMhh9QILlQm3kBcktEZLENj4SAUpzm5HxXOljESCgnK9R9XLe+BYde0z3JjS+fqNretQu6OdQB+y6/ttsNrla7nXBV/3AZLYqfyqKwk3Aoz2ewfXp9Xp/mdjufJBIJA6dQJIkCIVCOdrLwWBwN51Ow7DNxls5YiA4W8WdTCZzbPDPQhCEdVyfaMw0gRjsT0SJLfzjCP4PSlocJ9PLStIAAAAASUVORK5CYII='\n static openCowiPageBase64 = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAAZCAYAAADE6YVjAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAARyaVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8P3hwYWNrZXQgYmVnaW49J++7vycgaWQ9J1c1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCc/Pgo8eDp4bXBtZXRhIHhtbG5zOng9J2Fkb2JlOm5zOm1ldGEvJz4KPHJkZjpSREYgeG1sbnM6cmRmPSdodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjJz4KCiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0nJwogIHhtbG5zOkF0dHJpYj0naHR0cDovL25zLmF0dHJpYnV0aW9uLmNvbS9hZHMvMS4wLyc+CiAgPEF0dHJpYjpBZHM+CiAgIDxyZGY6U2VxPgogICAgPHJkZjpsaSByZGY6cGFyc2VUeXBlPSdSZXNvdXJjZSc+CiAgICAgPEF0dHJpYjpDcmVhdGVkPjIwMjItMTItMDk8L0F0dHJpYjpDcmVhdGVkPgogICAgIDxBdHRyaWI6RXh0SWQ+MzQzZGQzNWUtMWRiYi00YTg0LTk3NjUtNWE2NTEwNTk1N2NjPC9BdHRyaWI6RXh0SWQ+CiAgICAgPEF0dHJpYjpGYklkPjUyNTI2NTkxNDE3OTU4MDwvQXR0cmliOkZiSWQ+CiAgICAgPEF0dHJpYjpUb3VjaFR5cGU+MjwvQXR0cmliOlRvdWNoVHlwZT4KICAgIDwvcmRmOmxpPgogICA8L3JkZjpTZXE+CiAgPC9BdHRyaWI6QWRzPgogPC9yZGY6RGVzY3JpcHRpb24+CgogPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9JycKICB4bWxuczpkYz0naHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8nPgogIDxkYzp0aXRsZT4KICAgPHJkZjpBbHQ+CiAgICA8cmRmOmxpIHhtbDpsYW5nPSd4LWRlZmF1bHQnPkRlc2lnbiB1ZGVuIG5hdm4gLSAxPC9yZGY6bGk+CiAgIDwvcmRmOkFsdD4KICA8L2RjOnRpdGxlPgogPC9yZGY6RGVzY3JpcHRpb24+CgogPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9JycKICB4bWxuczpwZGY9J2h0dHA6Ly9ucy5hZG9iZS5jb20vcGRmLzEuMy8nPgogIDxwZGY6QXV0aG9yPkVtaWwgU2FoaW48L3BkZjpBdXRob3I+CiA8L3JkZjpEZXNjcmlwdGlvbj4KCiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0nJwogIHhtbG5zOnhtcD0naHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyc+CiAgPHhtcDpDcmVhdG9yVG9vbD5DYW52YTwveG1wOkNyZWF0b3JUb29sPgogPC9yZGY6RGVzY3JpcHRpb24+CjwvcmRmOlJERj4KPC94OnhtcG1ldGE+Cjw/eHBhY2tldCBlbmQ9J3InPz7wO0RJAAAD/ElEQVRIS61WX2xTZRT/3Xv7d3Vdt9bFAGp4gkDodCIZkW1qFNAIHQusjSEKzrFl8dlA9gBKwIT4PGecPhiNJEswhifdHPBA0Jc9sDES1m2ZD8SsS2Rrt66394/nfO3tbmkv8LBf8uVLv++c75zzO39upZ6eHnNychIejxumiU2DJAGqqmLPniiklpYW8+rVX7C6muGrgsQmIRAIIJFIQGprazUHBwexsrJSvKqESSFK5BrvFqzfvDshGAyiv78fsiX4+LKDZR6Xsxu0YL+3y8nFe0f4a/xobGxEJBJBXV0IdaEQQvX14qyedllRhFw1oxZcxb0Mltc+nw+jv/+B8dExPJhJIru2BsMw4fV6EW5owBttBxA71oEQGc7n80XtSlQ1wmADP//4E74fHkZzczNOdHWhJuCHLMnIZrNILS7i12vXcOvGTXz7w7BwygnOdJFSLpeDrmlQXC7s3LkD4XAY42NjeP/IB1AUFxlUsEbRUehPLExHI7n1dZzqPo2LX10SpXhvehoL8wuYm53Dvw8f4v79aZz86CS++W6IeswDk2h0QlUjHLphGKKZDh46hF27d+HW+A2MjIwgncng8qXLJCMj8WGCCuJ5kY8nJb6qEVbgxR5OTEzg6ytX0NTUhM7jnfj49Cm0t7+J2WQSF89/CUl+er9UJN4ywEq1tbW4c/s20fUcPh84Rx6rghaf3w/d0HD9t+tUcVnKjyIidzLmSJfiUrCw8A/GRv+k6noVqdQi5pKzmJ+bR3LmAV7bu1fk5u87fz11GEmtrQfMoaGh0lhhj7gPkskZ9H5yhhouBJOMquu5Mi9lRYbb7Uaa9Nrffgvnv7iAdDoNWd7wm8dKX19fZST8EK+8mofLrYiOVkixJlAjut9aXq9HyDN1KpU6h8N0VUNVuhgsz3wXIEHT8shQZWXSGWSpvPmevdaostScc7czyoxYieOS3PbiVhyJxegRDbquEW0NONrRgVhnDK/v20eRqkLuhS1bcIyqTs2pZVTZUTq1qopzwisYrENP7xkxQtIry3h5+3acpQo7OzCAeCIu+H/06D80vRLF4fcOi+ngRFcp8cvLy+KAvfEQ35QZUZqp1BI1ZU6MFNHZ/BDxv7S4BMM0EAlHRCXyua7pUKnMGcyIlfhSn7CQXKyez3r72Zr47aK5xQr8AD/KYDF2gM81XRe9w5F0xbvwzsF3RfR2lEXCShzJvckp0cnCZdgpKDixgeId6RnkxNaXtiFE3xym2x5JBV0MpkW4+8xgYxwtF4kuTuxGiJGNT6m1c+g8hZ99FeTZgP0tXvy+tH9/4d9KJrMqLjcPpph58Tj9W+nu/tScmrpLHewrebEZ4AjWKbpoNIr/ATlQBdZNXXvBAAAAAElFTkSuQmCC'\n static sogPunktBase64 = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAA5dJREFUSEudll1MUmEYx+nK2Whr1eqym1Z3bbXuXFtza61uygtnF5Vu4fdHZlZWm9KHZCc2nBD5wYfgCrSERlIzKCkpbJpEMfFjWlnZUhKh0Glr/85zCiYiFpzt5Zxx3vf/e5/nfT7OKt7fS6VSZfj9/qq5ubnN8/Pzq0P/x3NPSkqaTU5O/sDn82XZ2dny8Nrm5uYOsVgMm80Gl8uF0dHRhAatJY2GhgYagxygqanpmFwuT0jwqesDitu9SG2cwcDwWISGRqOBQqGo5Ukkkvfd3d3/Dehxv8elB5PYWhvEeiaATLUH+5VuXOiYitDo7e0FwzA+nlAo/OnxeFYE0O6udX5FqsKP9TV+7NUMQvHMCpurnRv0TMClrq2qqgKPfmL5/GbXF6RpfeBXT2O/egxXHjrCoiHx0H2HbAK3nn+O0FoWcL/3Iw7f8mHd1e/YLfuEClMfHvXfiykcAhCcLFy82SjANkkQWyR+lN3rh+GlOUL0ifPOihDaxAbmO+iMQpAoAE+ImCKXxUK0W1Sw9LXGnEMHTlGVECCv5AQqzp9Fk64OT5x3l4WQ1RuZYDhk47KAAEZTB8rPnUfj7dqYEDo3Cg6yIm5AZ2cnjEYjys5WoF4rweP+tihLah8/wy55IDHA0NAQgsEgdDodiooKIdOIl7WEAoWiMW4LCECXPxCASq1G4ckyyJuvw/oq0pIstQuZ+m/xA8bHxznA5NQUZmb80OnvoKC0FHWqa2F36R0PufKRUj+TOIAsWFhYwOzsLBoalchl3ZXHNGKn9BMXRTmtXlAhjNtFIQu8Xi+mp33Q6/VgiyUEeYXIyC2C0jK4ciavlGgUpvbndrDNCAR489aNnIJCpOw7BEFOPmoYBm63OzEAJRABbE/tUGm0yCsqZc/gj4+PsxCz2QyHwwEKgqhaxJbrX8PDw9yLpRZUml9yBY8Kn6DkFPakHsSRo5k4np+PdoMRr1+/4cAqtrmMjIwsX67ZVjnZ09MTBsi7urh6z784hQPK6XBWWiwWiEQ1MBgMkN64gbLTZzAxMYGsrCwUl5dH7Z7ap0gkCvLY3lnX0tLCAdZUB7Bd+oPrWE7Pu4gdDQwMgLoU+dlut0MgKEZ6ejrS0tKh1WqjAGo2T2QymY3ry1Kp1NfW1oZ/dbaQf2me1WoFrTGZTHA6nWEX0TsSZ6Nrji0ra8NfFkqlsoPaJx3c/4zKykqExuL5pMF+RLxgG/4mEv8NDua1LGBTTb0AAAAASUVORK5CYII='\n static sogPolygonBase64 ='data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAA59JREFUSEullm9MU1cYxi+fCNolRhQ+jkSjCRoTk0Y+NDMEMLEmbiMRNXMRTYDSCWE4smCMtPUPuoZYsjbFri0FUYONDqIwIm6jShw0ZULR9rYNLeg2zUTFoigJMc/ue/BWKi0U1+TJbU/vfX7nPe97z3uSuHefxsbGPeFwWDU9Pf2poGXieFJSEgdA/LngNTk5+XVKSsoDiURiKC4uNkZubmpq6qirq4PD4YDb7UYwGPwo0bPkYTKZSD4GMJvN+41G40cZ3nI/QPnVp8j56QW8gVCUR3NzMywWSz2n0+nGent7Ewb03x/D8V+eYF39FFK1kyi08ZBb7+Nox3iUh8vlglarneA0Gs0Mz/MLAmh2P9z4FzmWMFLPhLGt2QfL7V/hcF9lou8E/HBpVSoVOLVaHde8oecx8s9PQHLqOeS2EE529UVMRXPxutnwCBfv/BPlFRNw3fUX9l6cwMrTL/GZ4W9UXxtA9932uMYigOAU4dwo5gHW66awVhfG4fa7+NnZuajp3ChoEqu0L0E5EiHzAJwa80y7B+w4UaeBUqmEorQUikMV76Usg0KhYP+dPHsChY1eVlVRAKKIA7EANMsiRQlCYw+ZgqPRGhXG/hz24OvKKtjvXEOadipSsiyCRAD7lJW40vU7yo4ch+J7dZQqa2rRfvMW8ovL0D1wmeWNioMmnTAg0QgIUP/bbUiNk0sD7D/03aIR0BIRgJaUCoWqMeEICOAPhuD2+DHo4aM07A3AOXiP5UAEHLC5Udj6bAmA8uqYEZRU1UDMwVcVh3HD1YrWvi62fcjOvVgaIFYV5eXlIXt7NnJ25WJjbi4yVQ6sPjOJkstPQRth4ksUJwICpF1Pw4ZjG5D1RRa27v4SnV0d8Pv9S0yyAIgXAQG4cQ7L3cshPSiFLF+GBlMDvF7vbARzN7t4L9qebypi5kCMgAAkgmWqMpEtz4bT6YwA3gYCARbSh4CaTid7cQ4UlcSsormA9PZ0rDm7hi2VWqOGx+OZBQit8kl/f38EYOzpYfu9RDOOHdbn7K3UN5hQVPotisqroiQCMswZ2LJvC6Q7pTCZTcx8aGgItbW1U5zQO39saWlhgE9OTWKT/hXrWIP8KBsbGRkBz/vA++aLALICGbI+z4K8QI4Lly7AJ9wXCoVgs9lgMBgcrC/r9foJu90uGC3c2RY7DFD1UHKFQwSEVvymra1tReRkYbVaO4SEz9C6/R+Rh3CI+ENo+Olk/h8veXXcPn9a8AAAAABJRU5ErkJggg=='\n static skrafotoBase64 = 'data:image/png;base64,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'\n static streetViewBase64 = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAgY0hSTQAAeiUAAICDAAD5/wAAgOkAAHUwAADqYAAAOpgAABdvkl/FRgAAA4tJREFUeNqslV9oW2UYxn8nyU6a5PSQhKZN1rp2TmotZtRShBYvxAq9kOG80MEU7VhLxaKXGyg6nTIQK1g7xFpaqnTgWAWRCV544UIGHZv1z3axOGvTdaF2SZMTcpLm5JzkeLFZ6LakYd1z9XHe9zvP+7zf93yvwG1MTU0dSKfTx9bX15s1TXNyH7Db7TmHw7EkSdLJwcHBLwAEgOnp6bOJROK5rq4uPB4PkiTdz/9RVZVUKkUkEgGIDA0NtQkTExOv6rr+dV9fHw8S4XAYXddHLaqqHg8GgxWTFxYWmBl9hdDMPr46cYB4PL4lQXt7O8lk8jVLOp1urKurK5tomgKXfv6M994epn9fgOGHr/PT7MiWBF6vl2w267aZpmkTRbFsoiCYeGxR+Odd0Ncw0i7ctkTVrbJslZBKpbgSb2dxMcHKeQe/xTV077NVE9gqBUOhEPnoafZKOj+ckshreYq6C6Nmnk/eucDQ0ePIsnz/BPF4nBfbw/iKIq79BgDZWA7XQ2E+fr+IpmnbU+B0lvFbKY+igc/n294ZeL1e/k2a94yl08Jd3wzDQFEUFEWpTgFAvnBHGbfXsuy5yytLS0uY5q2Cent7tyaora2FOKirVkwDRHeJHVIJswQZwU4sFmN1dRVd11FVdWOfw+GoTkFTUxMTs0/SYbvM84/bSC9YKBVBekzjz+srdFy9es99uq5XdwayLPPEUwe5nDGp78zT+HSO2l0G+z8o8ZfLsqnq/xEIBOju7t5aQS6X460jwxT2JNhr1TZqMYtQI4vs6axjbGqUQy8dxu/343a7aW1tvdXWaq7pyKcj+F+2UtvQgnXmxqaYKNmQG124D0p89+O3zHx5uuyVLtuim2oMp8cOQEST+Ogbje/DBn/c0ImKVuSdTho768hYk+X9UknBLv9uIr9c4JFndrL7cAfRQon5aIZUNEPX635El414RMFVdFd2siAIpWKxaLFarZsCg/1DvHHkEvOxa/gedePy1WCXdlDf5mbt7zTJxQwrvyocPXSsMoEkSWvJZNJ3p+09Hg/TJ09xZvYM538/x5Wb1zAEHSNfJOBtoq2piw9P9NPc3Fx2fNrt9pwwPj7+udPpfLOnp+eBjsxQKEQ2mz0nAIyNjaUaGhrcwWCQSsOnGhQKBebm5lAUJd/S0hLYeLEmJyfPLi8v95mmadsOgSAIRn19/UVRFF8YGBhY/W8AwGFevQpqNk0AAAAASUVORK5CYII='\n static downloadMatriklerBase64 = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAAsQAAALEBxi1JjQAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAGoSURBVEiJvVTLTsJAFD0zpUCnBQP4QEyURKOujBsNP8BnuPJH3PEvrlxr4s6g0YVBF5poYmLQ8ihVKC0oVDd0oNEExlDPZm5Oeu+Z29NTIGCQ/cPnZKku39Ysd9F1v8Y2SPH42GcSEbe/PtO73Ez186GSId9Umv3FadzWg9ml0kU1nIPbPaG1lpuZ5vBR3L3Lu3SS1/JXvH9SSgObPkDgAqGd9IdQQ3bOFhPYW34RaljJLIgJeMVaZp6TpmXDaFpIxTUkNMb5h5cqACA9m+ScZTuwbAcaU6AxhfN6veEXYGFpKBtTYTQtJGIqmPzTpnQqMRw0ENGY4ucHAoGbTI5Oz4SCIOpB8J+pV2xlh78j+9PFQ7mCtaUFnwelp1cAwPbGKud0w4RebyA9m/R5cH3/COA/N3B6LiffLJufJMZ+NOmGyWvLdvip/yIQuMl8g9WRoDVabZittlDQVCUKVYlyvtp48wuoI0EjcQ1mqy0UtJjKfLwnQCWJ9gfF5HuPQdvpeGWZHBevirbTzU3aLOQBIQUqd5Q8UyLn3iZTQhmEFMK9zsEUZ/6Obz/toX8kkesVAAAAAElFTkSuQmCC'\n static VaelgLokaliteterBase64 = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAA+JJREFUSEulVl1Mm1UYriaTYYjxYm43JrvwZyZqYlz01mSJWzajN8bolYsXkIhOt7rMsFFal0ClbfqV9lsn6S9rxxgCLa6uZLQCa8vXjsSsP9D/rduKF2BEjK5Bszx+72EFm3YUkOTJ9+Y957wP7895Th+TPPyzWq0fLi8vy0ul0t6VlZUny/6tfBsaGu43NjbeaWpq4pubm41rZ+12u0ej0WBychLRaBT5fH5boLMUo7e3l5BiBCaT6WOj0fjIgH6/D3K5nK23nzm94ddsNiGTybA9fX19MJvNOgnHcYVAIFCTwOu9CrvVCq/Xy9b9fn/VN5vNMn8sFsPlS5fgGh5ie2ZmZqBSqZYkCoXin2QyWZPgG4UCiURi0+Wi/14mO8OCEwllLimnv926b3SuLgHVXBCETWdQ7tOWMig3bTsZ1s3AaOQx6nYhl8sglY1XZELNLZPmcrmHzfdBo1FvvgfxeBz9TmfVeEpPHK85rl1dXWyaysQbZtDf3w/75e9x5Ycf2RgmslF4PB52uN63LgFdksIv8+ANekxNle/IahkIsbmf8d3Vr9E28A6kA2/jpPMA2ocOo+8nBZKpWaTSqdpjSveBSuL3jWNxcRGcVoNQcLpqipQjH4gzfgTmyHsw3VgF2Yprr+C04134BbfYt1zlPfCNT0Ct6hYXsigWi7hXnIeqW4lQaJ1gNhnDee9JaN2HwAtvQO5/BsmFawxknwu/iR73EfBXPq/OQK8/jxPHvxAJ8rh79x5y+dvQqLsR+A8BkSuG34Iu9BrafQ04NbYThaUIA9nkM0zvR+fowWoCISzgo6NHcfDQYQy73EhnsmIPdAgGQ2slSmXmIB15GZywD8E7PG4UHVj4M8tANvk44SVI3a8y0evo6KiUCqVSiVwmDYPejJaWFmi5Hly/vi6ERHBscBd6Is+j8HsAv5UK+PvBfQayydcTeQFS5y5QPysILjgcuH3rFrtUJN9anRZyhQwTE1MVGbQOPIXOwA5ohGehmd6H+T9uMpBNvs7gDtCeKrFTcxyiN3Ow2W2k42uynE6tjhwhk83gmPFFyOQSfCtI0BnaieSvowxkk69DXPvK9vo6gSjXD6he3rEx6DidGNyCVCpdU+Bm5xIwjsjQ6twtjqAEqsjjsMf3M5BNvtaLu3FuqG2dQHwqF8Lh8JYUs9vxKb60PodTzicgG5cwkE0+9cXPWCx6PkXp+Esivp16h1j/rarlhWEeZy2foK33fQayyVeOY7PZwPP8JHuXDQbD0uDgIOt8PaKycj5qH8Wg4OJTXHK5XE+v/bKwWCweej5JAf8PKIY4hdPioOyh4P8CJH3KPKVQai4AAAAASUVORK5CYII='\n static searchDocumentByPolygonBase64 = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAACXBIWXMAAAsTAAALEwEAmpwYAAACcElEQVR4nO3V3W4SQRgGYK7LeOwdeAMm3kBjhLD9sdYT+VuwrYkRZoElqKULlRpJIfiDIKWUApHAyWJiTXtAgiG4xBPd18wYEk+kS7o7XRPeZDIHbMKT75tvxuFYxKK4vGGYtVZEcmwJ0Iy4vGF4nr7QV4JSzbZAbfIDXooUpYYtgTSmI80Gmo60Amgq0iqgaUgrgaYgrQZeGmkm0GVgXRnQSBbAy2YB/C+Buq6j2VVBlDw2tpMQ/ITtkpJHq6ey368MOByNEYxmICZeYb/ex+HXCZqDX2zP1vsQ5X0EYxn2HY03ovADDkdjPHichFLpoT3EP5dS7rLvvo3GyJYafIC6rrPKXYT7GxmK7aH8qc8H2OyqrK1GcNNF271TqPIBkt0DdubmAb48UhGMZ/kAN7aTbBDmAdLv17cSfIDuAGHTOg/wZPATgl+ybwWrpxq/CkpKnt1zc59BmdMZbPVUNpVGca0hEIhlkeI1xTq9B2MZdr8ZAaY+dLAaiiP3sX0FL0l5NjJV6uDepgyy9xZroTju+p5c4wKkoc8XfSFou7N1lQ0CnW660zNH20orF0kX8brWRfKgCiFANJcnfIMLcNruVq/PBodWVAgQtkfTBbR7fZwPhri/JSORqzDk88IRhICkCf7wTS5AIzk9H2B9U8az/CFD7r45hiBGJ4Jfum0LII365Yy1e6dYZ8j0+xOshmKa20+ctgDSKMUalsXoRHnXYMhMqYW1R7Lm8pAlWwArnc9wPiS3loOxCcX9qWSTPp1jWwClTJHdg4KP3KGVozg5V6FDczYTyHM5pv/rIUtuH/lOcU5f5PqFw7KIY3Z+A5DMa52GW2qJAAAAAElFTkSuQmCC'\n static searchDocumentByPointBase64 = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAACXBIWXMAAAsTAAALEwEAmpwYAAACTElEQVR4nO2W7W/SUBTG8Z/UfwVH5gvoTFZHAWVihFJeVhHCcAVNHGrc7DJ5GzAnzbKSGP22BLMsLPOD9jHnJpgNmatbb+0HnuTkfrj98MtzznNuPZ6pOMkrxGFXzYpSkwugHfIKccw/eWbOhpI11wIOj44hEKSYbLkSkGQ7pN2AtkPyALQVkhegbZA8AW2B5A14aUg7Ab0W6r8BWtEU8LKaAo5kmibaPQNScRWBqALfgsTOZHEVHd1g99wB0+ufJ1a8qsP/KA8hVUa50ceHr0do7/9kp9roQ8yUEUqVMDg45As4SYODQ9xZVFDc0NEd4Mwqaj323bcxSK6ApmkiJJfOhTsJGU49P9VuroDtngExW8HNlT6uRppn1klIandH7/MBHJ+9ewkVT7U9XPsL3DjgSt1gwXHEwUBUYUGw0t5R0fc0i44AzgQlltZ/Adza/wFfMOleBze/DPk5+McMSiqUi8zgctUZBzu6wVJpNcUdSnG6jC6vFE/cg6kS229W2ltY34EQLzi3B0+9JOdAEtyNcBq3Ixk0tnfh6FucqOoIxAqYl1WoDYMFgdJNJ80ctZWcuxXJIP1Cg/9hFlpz5/cm4OrgSNQ2eiFoCZOjvqDETnm5ymaO7luf9hic8mqT3a3Vu5DL7931P9jY3oU/uoTc6xrmYjmEsxV3AZK05kfmYP5tEwHmtix6gCuuASRVN1qYe5xDcW0L/qgy9AUl0VWApMq7Gu7Gcsi/qeP6/fix6wBJNINeIfF9ZkEKuhLwwdLLi4XEyfJM5eGjX1+91N9zQgjNAAAAAElFTkSuQmCC'\n static clipHoleBase64= 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAIAAABvFaqvAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAL9SURBVDhPlVVdSJNhFP6giyAUYvbfRV6EEkIQLTXNSrFIg0AoiIysIOkmoSALlGor07aFytxqa2PMIbnhhjhN+phsOtdmM2Xkms22rEwxf7flLrxZz/w+xufc3Ho4g53znvPsvO/5GRFag9frVSqVfD7/cdKAM0KcTifFECYyGAwCgcBkMjkcDk/SgDNCJBKJWq0OE7ndbrFYTB8mQr/jxx3tfJF0+YvbS5s8HuRltVoJuVxuNptpWxzYxia57/5kNK2k8fwVCleJfKyme44+83jsdntzczPB5XJdLhdtWw/87Iv3s0UyX1qD74xyXDZgMDm0EHwBKe20BjwZgQ+tMfDKOFPWupRSt1gsHq/tMFPxTDnSMt1m+U17byTS239dblti1QcKWqYedg3r+juO5giO5fGjWCDPeq3IlA6LIspsXDnY6LvXOaIb6qG89WYNO5dXzLrlqSq39MkiLBBypHMHL4C3o2LXERFPQkxXSibu35i+UDh5syyQtn3mXL5DVNtj0UBwhFdHBanYBERmc6svfX8kF2fD3Ykcdu62q9Rlkfgu3grVBwmIfpafR0ZMy4f6B6dZt3MLBJSKp0RZEhAhkcC+nf0f3zKNC+ysURknojb1DbDF/gREs4XZnxurmRa7WrCcmc60QFAf1DouUcyYqUtnv9ZURhmvKxwV7QuxiVCUyaxDn1T1EW8IqX8ztWd31E3brb2oXf7r5RhE6J3sjFq8KDMAxrwD1Sf3VlFq93AX2hXNjapVqucxybGJTqVWlhJXQgQRkSVia/GWa8dznvPIwRKFl/U0gAGKOyJRj82U1kHyouobRveExI8xZu4QCgmI0HKYGNQl/WWwRj8XGYiNCBNxOBzsNihMokc9Q2g2TC9mGNWlvDdBmEgkEtlsNiggEhuN2DspnLlS+SLVsskAOxf7m7BYLCqVCnpqnf+w8C824ajrO+WRJBQKhU6nCy9/qVSq0Wji7clNgBCwCIXC1dVV+u+IJEnsXFz1v4AQrVYbDAZDodA/IjLEyK0wXBIAAAAASUVORK5CYII='\n static splitBase64 = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAIAAABvFaqvAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAPnSURBVDhPY/z//z8DA8P9+/cPHz786tWrL1++ALnEAB4eHjExMRMTEy0tLSAXZNDevXsvXLgAFBIUFARKQ9QRBEAr379/f/PmTQEBgbCwMMZbt27t2bPH3d0dKo8XPPnCsuYO99W3LFMc3rEzg7wCBEeOHFFTU2M2MDAAuo2XlxciihW8/s684R5P+XGhBbfY5Vle/GT8+OankKHoT4gs0BMnTpxgefr0qZWVFUQIDfz8y7j5PvfOxxwX3zAYST4vM7qkwv8RKH7nI3/XOcUkzU8QZUJCQu/evWP5+/cvGxsbRAgOdj3i2vWYY/fj/7ZSH5yk79WZPoNKgAHQOG6WjydecFhI/IAKMTCwQGkwuPaObektnl2PWLR5P1rL3c3UecLG/BcqhwqClR/Ova6FxaDt27e3HGNjEVUKcxSa4/RciAOhAiswE3854bIOMOxEOaE2MUGo8+fPvzgwi3t3+pN1DbhMmTlhcXpk2YHdx4FsoEu9RZ8svYlIK1CDTp06xZB2eubyrotnrkKUIgOgSGFq/Y2rdyKTAh1cLSGC/lr3Vt7lBEYIhAv12sePoOiAGLF83nogCdEAFNm5+cCNy7fj0kMDIzyBInAAdLg61/uDTznd5L4BucwODg76+vri4uLb5rT8fHYlIMLzyvkbxw+e4eHl7m6YBmQ8uv906qJ2cxsjiH5kIMT9a+ENuVCVbxcvXoR6zdPTkyFqU/ukyoYv3UD3P3vP0N6x6uYHQWtHs6+eC2UVpBzWB/39zxC4FeQoIBtI1p80MxB5/eHnf2BcA7lQg4CxxrDMrzKvvYGnFOg1dXmeyoowNRmOS2evNSTIABWEKd9iZmRwlX0MYQNJcU6Qj2wEHqy5ywVkMNbX18fFxaWmpu6z23sgcF2UdxYvHw8w1IFyBMGLb1zbbyjc+Snp8rwf6qLXr18DSWDQyivLAr0GEcQFvvxm3fFQvvCwZd5hO3Yu0TZLUERBYy09PT2nzXS5wHvkCMYEp16K738qdfKJqL38nxLDbxYSL6AScINAgf0me2bgOggXDTz6zLvpvtL+p6Kagoy+Ct97rV/DyxA4QMlraODdD44jzyU33Vf+8481Wu1rieF7eIbABCxMTEzAAoCZmRkqAAb7nsjsvy999TO/m9yffptPWkK/oBK4AYuIiAiwNBEVFQVyrr0TWv9I8vgDYTsZ5ijtn25yryCK8ANgmQss2xiPHj167949YNlmsEJUkY8pRPmbr+JXPrZ/UFVEgEOHDvHz84MK/9mzZwMLcF1dXcwSDj/49esXsJAFuggY6dDqaPfu3UAhYGBBVBAJgCGrra0NjHFOTk4Ahi6b0E76oikAAAAASUVORK5CYII='\n static changeTypeBase64 = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAIAAABvFaqvAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAOmSURBVDhPjZVbTFN3HMfPzZZTir3QnhZSpOUytB1DGjYnOgmjKaIjpsMQE5+IMyQ+7Glx2cMelsWZuHh56sOQLD6QeNtMZvZgus7IRRs0oToQy6UVKYitnNOWQ1uKh+5Xzl+hjGE/adrz+/V7fuf3+5//+R48nU5jGBYIBPr6+kKhEM/zEOaCXC5nGKaurs5sNkOYKeR2u71eL6RUKhX8LerWU3bqlN/pRMFb4JIcx/l8PqVS2d7eToyPj4+NjTkcjpKSkg1V7t4funPPMxvmUIxhQZ665FWcdBcuCTiI4RSbzZZMJj0eDwETVVdXI+E6/u4fkiuVlRVVvpEJCK8M0y239V/eUcViYSkZ7BkrEGUAjDY4OEjMzMxoNBqUe4u7f0ggKFpCKxQqfZEeMj84O05bH/zW7OqwPm2rnLsxIROVgFqtZlmWEARBIpGg3Cp/9Q2lt0l1jIaS5i3GF6W07IKj42LbVyfO/LwsZAQVimg+FfXM5a3KEQT6XeUpKzl/658VnGJUKqZQW0DnB2dD4Xkuj8TZYGDkeJPtu19EZVv5VPdo1oKuFTr0h/5bV8ogjxsNRTqGEVaEeY5dSiT9L4J8Ir7Axy6PTCEphn2ie/WEJcIJEsXrC/miMudhLy2LLmMUwHJRluVYdj4a4XyT08adyq+L85EUwySkcFgb7PGtNZU1GlBbw0y/ejQ8MRWLxmAJX8+z4QhvKCuo3WNK8ikkWuWI2X9tkoZ9IIYbCwEWi2Yh/iww+xL6CXERvVHe2FACeXJbllidl6yScfdmaDHcpBBQ8xEjUyy8jCV0pQX2RiOOZy5LUhvFbbv83aNo3s0LAR9bi60fyu2flxIEaj7YtFc8eMduTTiylIZ7Dcf/Wwiori0iiTWB7vHwu28RYnl5v/L5zcnM5qTElEjDabRNtmBnz334oADDuo9dmoiQxq072oLRKoO19Vdd0+9SmfanvVHIZHWUC2f2nbyANzeUvvmmPP6pfg5lcy90/rMTZ6nmXSq81ZjoN4EBZOxwPe8Zbbq4sPLgdZP9FlfT+OcX3BVb+GgF/98qAEUQGQMgybWnRuR7u8OZOm7f8ebiBzGzOmtPbwoFZgSPglarFeMf93ecW2k6YCBby5Ye7giJya0BzwW3xAcGBvx+f319/e6rWtN24mh5vNW0uF2yglQ50Nvbq1AoMubf1dUFBg6Gu8Hh3ksqlQK3ho46OzvR68jlckEKFktU5AisrMViaWlpoWn6XwtDaLFzWSTkAAAAAElFTkSuQmCC'\n static setCenterBase64 = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAIAAABvFaqvAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAOsSURBVDhPjZVfTFN3FMdv20v/0Xrb0gsFFayYOlqqpcM/INNJFMIcuAXCki0Z+/NAfPCBhKhPJr74YGL0QV8GRqPRzcSow0UDLRChlbIJg6mwdtArbS+0hbUUarFIraf93RWR0vF5OPf7O+fk3N+/ey4rGo1iGEZRVG9vr9frDQaDMFwPIpEoMzOzuLhYrVbDMFaos7NzaGgIXFKpFMIo73+BV/r9fqvVKpFI6uvrWTabzWg0VlZWMvGUuIL4nbH0F//ilz718TixpQAmk0mlUnF0Oh3MTSwWI29Sphc49+2ik32yazZeHu4OswIzYVkRGUZRWITFYsFpmi4tLUWuDwhHWA+o9HYnf3gG02dPndD/tY0IgH8sQJwbVP5QMIfSZDKZz+fDI5EIl8tFrgQdDmGHk29wRj/JmS3faD+9a5IJxIFy6XjA4ubvVbxmXBiGM884Iz7uTZuow4FrxIF9uePHCl1cToSJraQ2f+LKqDp5oc/aFBFsqUY53lo+JePHMp4P/NNrGICTxbCovkS958AOlAnszvJcfFYIe0cKmDex0QOwBoSt5cYaJYWq/Hqry9D2RPuxqu67CrCDfaM3Lj9AmQDM9AjpumldvivLhd5n8MnIpGO66UxD2WE9qZCCPXbqK9jN9rtmJgPDjqrtt8cFcCBomLxQf88zfUkBCCflvt36CCzokoM7h/8YjcdjwMS3C/2PaQEaJi/kmfLkf7QZRNdv/fSEByzo7Volj8ePxxlqC+xXRtORTl6IkBBu1wyI8s/3ZGRKwYKmJ7wsNrMQhE4+PRuOwlmDTl5IpVH+afkbxGalouH4UbCgn5qfZ5BEPL5MmeTlnXEhiOSFjtTvD86Hfv7p4dxsrBmAhUO0W51136/4JN0hYRTjjs1yQK+4kO8Dx3TvuvHqxftoKM+S/NhUy+OngQ6+STNN5rQ7cugQ8UXewll9oOvu2oWAL789xKj/+N2T1U3n9LvIA3lLzUWhvYrYaSJSFUrgmBe3UVu7abJAyqresnB+33SihyRIVcj3mm+aym6j8pfepn2jetVc5E98EKvB2Ww2XFkOJ7ZhCbpcm7qpjS/miYrcpQtlc2rZIhNYG1wul0M3IUkSBiM+2T1Hdt/LjP2bOF9rwhW5XpSUGui50NtYZrPZbrdDb9P9Qio3sOvyQ9XKVxu4b5msddDT00MQRKz5t7S0QAPXarWrO1xqFhcXocnCjBobG5nfkcFgABdsFspYJ7CzGo2mqqpKIBC8A/jTdMM1f3ILAAAAAElFTkSuQmCC'\n static editBase64 = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAIAAABvFaqvAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAANwSURBVDhPjZVtSFNRGMfvvdvd5rbu3Nzabb1IssKXLFe0sjBCTJAKsTcWUVR+iUiNIggK6kNfMoISCoMQFYoIKSihmkW1VTohWqa9Tke5am665dya2/V2e+7OZQ3N6e/Dvf/znPM855znnvNcnOM4DMM8Ho/NZvN6vaFQCJqzgaIomqbNZrPRaIQmH6izs9PhcJhMJrVarVQq0bjpaHcrTtVpJzLZjkuf2ciIy+XSarWVlZW42+22Wq1lZWXCwGkA/8Y+6lPQK8Y43QudL8LsriXOmAPQBevIz8/HW1pacnJyDAYDcphEqr+Zlu5a4lquHQF7/euVvQH6adUP0IFAoLu7Wzw4OAj7THj9I8U/YqYnLpV8Q/5J9uV9sDzkkwtoNBqfzydmGEYikUB774F5IQZnLVwa/yS0PKoksab31MF84eMQ6PXggcIxgfdh41zvb/C3VjnPFTumi4Io0kruDCiERjJQRUWk/Zy/sCjeeOR5ev8kkC9Yu9BIBjrryKqwLRxeLO8bUSPLjMB8BM499WSgphBII2PX6CM7Da4r75bHWME4IwWZv671UkgLPrUrft0sHzpkJot0/jYXf1JnQ3k21zvCIC0EeuOXdnllHCY/uTL26NuinxE5sqdn8+KvUTb4MUiCFgLdcyv2dBh+RBgFOee46eOFlwXh8B/UlZ5sCmt8pwIhBPrNEJAjJSkFXaJWuZve1NagnnQ865gvf0I9vC4DLUam8+uHkQBwHF+m5ezezI13Z7iAGFSOIA4vkEIgSJBUxJl0MdAUJW5uLkyYBxLPydzpV7wPSE6vDl69pbq4IGvV3CgYha3d/Dynzp6F9HQMjPJJ9YTFJ17p2/qlMRY/bBntOvP19jH+WAqBAJMuLqgpgE/eDfWmewv9UdEC5cT5Yl/7lmHYAXTpMlg0RthawwY/EqnAYbN9z6hZMbqWHj9UgI0xQWTfYQwjkQohEolYloUc9SdWPhYnGt6q7rv52xiKE31BHPYCuq4oCElJzj8VQq/Xt7VhR4+Pl299CzXgxifqck/W48QN2p835rR4/zt/KuFwGOo3AaV6aGjI/8WKfecv/XbjGKSgfh2v08yfitPpzM3N5Yt/a2trT89SDZ1t2cZ/yNkTj8ehyEaj0erqauF3ZLfb4XcE1RKNmCUkScKGSktLZTLZX9Msdr7+YiVbAAAAAElFTkSuQmCC'\n static drawBase64 = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAIAAABvFaqvAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAOUSURBVDhPnVVbTBNpFJ52/l6GFqaMTNEtFrpgjS0NBdkbXrLhgYtmNdl1SfTJGBNC4rO+7cM+bFYTEx982YDGFza7iZvduFkvtKjLRXDXC17AdBba0hZaWyiUtpS5WU+ZichKaPXLSeac83/55sxp5xtFNpvFMMzn8w0ODkaj0VQqBWUh0Ov1RqOxsbHRZrNBmRPq7+8fGxuDVmlpKRxLvLyAWy4sLHg8HoPB0NHRoWAYxu12t7a2yuebIpRCVyd14/Po4pdxDZ57FMDQ0JDVasWdTifMVlxcLHU3RCyD/+HVnxmhrjCaShRhFYk5lqqnWekUHmJ0dBTNzMw0NTVJrf+BFRV/+nS3gtonc1jDtvDphqc1ZAL6kwny3CPLiV1LEo2iqHg8jkRRVKvVUusN+gJFfUGtK5jd99Fis8n73Sez8sEqQE6HEqMR7edbV+QWhiH5uoqJuLqX0fcFkL04scc81VUbUuOifLYe31RPX3ph21jowLWtIiYcskz1NIcp7RpjQ3xa/vLCs1rYHU3Id1JKF4AnUdTT7D5k8eVVAcCkB+lQr2ftv7Im9L44bPP+OkXADyKVHy4Eg+8sWvh7hpDKdcveBBzPMpF/AsmJFYzFBVGj1VSRjq+tZM94fYt5GQiFTjTi7439y1g/1jqqSdtOqsasC2Ou2fCPmfSz8XkVEPIL8Tz3IPCXHvF0WyyYGtlbdQoCEmOJzkSqdpM//+bVAS2/EEJoiWVwOhpJP83wSUJFQkASTj3BjdFyg39yEQdafiExKyaV8awy07bj/JHa7iIVBQEJlIIizakjP3yRe28K2hEvRJRKsYKsq9myz0CYICCBEppoebZCLwCnICFB5FPc9NUXRy8/bo2lGQhIoEzx/hXESZzNhOIr2ms+S9fdFiFmyrh5AQux2eklLheQ5EoXT2RqJDJSwnyiiOO5hb3B7VDFHZ9pPEm2mIWzn8UikW+fUz/hN6O6A9z98PdAUCEufR2bsxrtGtkRUVlZGbgJTdNQTMSp3wPbRvxb9lfgx+xsizm6ysHryo8n783NVvZl/gsmyx9Ci32pZiu3W7C2tvqT4LngbYrh4WGv1wve5vyFtpQoj1Qvf2VJl6hfrUqsw/DYDf/iw4yQ8zMClVQZdu9xtkM+MDBAkmTO/Lu7u8HAHQ7Huw4nATgKhfxyvg2O48BkYaLOzk75c+RyuaAFy5IYBQI2a7fb29vbCYJ4DWjmkeQms4G/AAAAAElFTkSuQmCC'\n static mergeBase64 ='data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAIAAABvFaqvAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAQbSURBVDhPjZVdTFt1FMDvvaUtNyv9klIqo7Ed61gLmyOdICNrsnVpGoFFszUYt/mEaDJ9Ut80yxJf9MHozB4EZzTRZdnQKZ0NgbJJi+ma2oGwFUpp51Zmv2w7+sX6dT239xYoYMIvaXu+/uf+z/9/7ilKEASCID6fz2KxhEKhZDIJ6k7gcDh1dXVqtVqpVIJKJjKbzdPT02ASCATgpuIobIHqH9w1l46GaX0D8MhYLLawsMDn8w0GA+p2u8fHx3U6He0vE84wLt7l/pPJ3ouIl856aet2WK1WhUKBQUWtra20rczlWV7fqEhdv3hS/pA2/T9Qmt1ux5aXl2tra2lbqZbjNyX+VPQrjfnYbn/JRnRcb3h9VHLlAXc5WVWyVCAUCqPRaFWhUGCxWKCv1XKx3SqtSVBBJAT63sGHIz7pl39xP3HwGBgiZBdl3OKJxpROmm7g5Kko+glQy/ASfq55rryLdaqw1S6JS1PvotREXjTi2++M4GTeP59DkZznLLkEg89Jo/hRNL6hlgqYGANFi0WseOvn3+F7FyvYt+/Op0dMI93GCy/ZCYSsBiATZQqYhJ/gMHOUCTANW2iJ9DKfPA45pubuOz2mG5ZS220DmahZkL/qklM6EHzyb8AfWXzw9+SoI2ga6nb0TBjvrsRS4Oo8foggClTYJshEHx2ORnNsT5wHstM6/+vV209jiTnnIruahR/QGtUjZ97pOdbdzuVzuPxdGEYu2QppFeGFNlH+0kwLyG1dzbVi/isGzatntO2aA9yGFxBkvhSJvPXBaRRFTcNWSt0Enf5Ce3Q2yk9mmSCvxFONMgllh66AWmmxBJwULVVCJ2oW5J7Hi5dnyRZ/83wvGyczlhAhCBt+nsaSUCx1CVD+I0+g5F1nveB3X0yY/eJnBWziln01nSMQAhZH5mcO+mxff3b92pDpsS/QKKuHSChf2kQKG1lv+VNNyY/t3JtLMpVk4dsvfirk8+xqdqO8Xn1Y2dui5wnIqQCj4g/zPSp+ExVXcFqe/v7+HtWhpjqJQH/qKJwu3tH3TaSfygIvExx2//sGaKVkjjnh320PC2uYaWptRaJz+1MYE7vhadK9dsR2Z4a2lmEwGPageGi6pf+2tu83rSOwt0PEN3ZHKG/F27yHl5Ny89c8e3vlPugd2oogP7r3OSJCZ1DSJUm8LM59rlpRCrO0rwz0FwZ7pjXYlGK1Gsn84pWtvQoo8gxFJOdVCIy377Tht1vjW7MAGAwjmCa0hiA9slQ0jV9xKdIFFFQiB9fH/rAtrmnIUAFbgZkLAxqdmpryer2dnZ20NRu2hxJwCpQKsLCs641tpsIak5OTPB6PHP6Dg4MwwGHgUhNu52SzWZvNBjsaGBig/47GxsbAtPGwdgLco0ql0uv1OI7/B1EuvKrM1DRLAAAAAElFTkSuQmCC'\n static drawPrintBase64 = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAAaCAYAAABCfffNAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsIAAA7CARUoSoAAAAUQSURBVEhLjZbrM1VvFMfXOUcuyRhySW6FklJCkepFSi7jUpMuIzW55A/oVW/9I2YYipohphqKjCi3ZqSJbjRjXCsqt6Qkv/NZ7Eaifmtmz977PM9e37W+a63vc0yfPn1akH+Y2WyWL1++yIMHD6SxsVEcHR3FwcFBPn/+LElJSXLgwAFZv369/PjxY+mL3+2vICaTSQEmJibkzp07UlVVJd3d3fL9+3e93N3d5cqVK+Lh4SFbtmwRPz8/sbW1lZ8/fy55WDTz0v0PA4Drw4cPUl5eLpWVlbJx40bZtWuXfPv2Tebm5jSA1tZWKSgokM7OTgU2vl1ulqtXr+YvPf8yNlksFnn37p0C3Lp1S3bs2CEXLlxQx9Cyfft26evrk0ePHsnk5KQEBweLlRWllQxtbGxkYWGRpD9AjCiGhoakoqJCbt++LXv27JHs7Gy9u7q6yr59+2TDhg3y9OlTrY2Tk5MCNTU1aXAhISEKQkDYb3QBwMLg4KCUlpYqRREREXL58mWNlPWtW7fqM8Vn7cyZM/p7Q0ODfP36Vevx5MkTefXq1S+fvzLhhfTI4ObNm1JdXa0R5+TkKDWs44BIiXLz5s2ye/dumZqaUqfz8/Nib28vL1++lK6uLnF2dpZt27aJnZ3dYiY4wAYGBqSoqEju3bsn0dHRmsFyABxRdIKhCQICAiQwMFBOnDghFy9e1Oxev36tvqgb2RGE2QCAopKSErl//77SkJubqwAYXfP+/XvlvLm5WUZHR9UJWe3du1cp43l6elrBx8fHlW4ahr02OOnv75fi4mJ5+PChDpZBEVHDLR1Ei/b29srx48dl586dCo5jFxcXpYTWhq4XL17owPJtWFiYNoiZCK9duyY1NTUaFRThhDl49uyZXL9+XXmGBi4yxzF3aINCBhDwY8eO6TNrZMQ6l8XakvnUwKAoNDRUZmdnFYDuwlJTUzVqHMTGxmrUfGwYTlmbmZnRDNatW6czw/3o0aNi+fjxYz4AeXl5CkCB6Q74JJvz588rHR0dHVroI0eOaCYrDSDkhUGEfuoSHx+v9JvRGyYZAIoJp1AHDRQUIACJ8NChQ6pR2MpMmK+RkRHN/vnz5xIXFyenT5/WjjMznd7e3rrpzZs36pChOnfunDpCVuias2fPLkZl3bdcAAGAyrGxMblx44bU19dr+8MAWWlNrLKQzxTjGJUlg7S0NL3zTnbp6ekSGRmpHK8EABQABpijICoqSgEYViNbk7UjFtAf2o+CJiQkaAEBwMmpU6d0sol2tQxQ6bKyMqmrq1M6YcDX11f3GCBmehm19fT0lOTkZM2AmmAnT57UXkdGVgOg/cmgtrZW9u/frzVcrWZmDiSc0b4U+e7du+oQipgbHAK83ABF45gvFCImJkYp8vf3173LATAzIgYlcItuUThqtFYNADBUGoDw8HDJyMjQ9sZWAmBmWo3uoavgl/rQgpwVxulnGM9v376VwsJCFT9qkJWVpTUgmNUAMIu1hfPb29v10ElMTJSgoCBpa2tTKXFzc5NNmzbpMJIF2kW2ABw+fFgBmDNsLQDMYt2UjwOk4+DBgwpCNgDzp4FnLiMDAkBaLl26JD4+PurkbwCYqaenZ4FOQS3RH4wWbmlpUXFEgzgJOc+Hh4clJSVFMjMzxcvLS7P7FwBmstbDum9RTY0iA8oZgoZxzj9+/FjfaRAm/181WGlr/u8CiGmnk5Abio4EkQH2fwFERP4DZxLcmtGNPaEAAAAASUVORK5CYII='\n static documentSearchBase64 = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAIAAABvFaqvAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAKsSURBVDhPlZXda1JxGMfPmx6d56wzPW5pbC6EXIYkZF04E6PCddHV6qoXooL+gS6jboOgiyAWjaiugqC6HeV2MTaWmQilhVALas61TZ35Nl+Op2c7P7d55kH34YHj8zzH7+/5vT0HT6fTGIYlEolQKLS6ulooFMDtBJ1Ox/O8w+GwWq3gbggFg8FYLOZyuXp6ehiGkd5rSz6fz2Qy8XicZdmRkRE8EonMzc35/X6U74yygNOkKP2emZmxWCz4+Pj40NCQ2WyWoq9/sPfDBi1Vl9wtBBHHMezFmaSNq6BQA5jT7OwslUwmPR4PimHYvU/8bWf6bH9RphRZoe98NF7+YHp5esmuL6PoJnq9HuZICIKgVqtRDMMqAn6Iqwyw1cFm69UKBo1w0569OGH+nVOht3dAoGcHFGv4rSNr1w5nRyfM8bXtsSU6FYIa6yJ+NWD69U+VXicvvTehRINOhfqZ2iv/4rCpdMy4fvd4KlMmUaLBHqYG+wVTu2HPjlpzjEq+rYpCX1L00xj37Nu+nfZunq3V4Ri0QFFoIU+FljWfV5osmlLX0DGUQ6HnLk70rfdpBaJ5eDiocKBbFqUoFPije/69W928pgNM9cHwMnKaURQ6P5h39ZZkQ2spsYsS89W9VPRmnnkS5dTE1pLgdRE72F0d8y2hQDOKQhesOZ+5tHFTN1ERIhiJK1akuGtvf7JXAqbrk/slG4tyHF0HQ+ldKAqdsxQenfz70LMsGVxXKAflWkEA0ACQt0lN3Kgc7vpRvuwwIOtnqlIWAD1oT8hpQBkMBuhMRqNR8k8dKD7+yk0udInKw5dqBK/ZHht6LvRvfGpqCjq/2+1G4b0zPT0NQoTT6SwWi+FwuFKR99C2wF9AJZfL+Xw+9DmC/g9assVqC0mSNpvN6/XSNP0f/kMg5XZvKf4AAAAASUVORK5CYII='\n static showInfoObjBase64 ='data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAIAAABvFaqvAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAD6SURBVDhP1ZWxCoMwEIbzBn3kokMXXUQUFETESUEfQBwEEQUnBysE4mM4CCW9NDeVDiYg2I8TzjP/z+nwS/iHdV2TJLEs634YOAySeZ6lgzCq69q27aZppmlih4HDIAmCIMsyYUQp9X0fHx7mSVfsGIO9+r4nURS1bYszLcZxdByHmKa5LAvOdIFPRuDCO8Zuj5dqSeEPI+wU+78wUi0pPHMj7C5kpFpSeOZG2F3ISLWk8NtIG2FkGAZkGw50EUae5w3DgAMtIHMhv0nXdWma4kyLOI7LshThH4ZhnucaOQkScHFdd993/B1VVQWZC6+qBEiKoti2jXP+BtBOC1S23cCGAAAAAElFTkSuQmCC'\n\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()\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","\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';\nimport { Feature as olFeature } from 'ol';\nimport { DrawLayerSourceService } from '../../services/drawLayerSource.service';\nimport Geometry from 'ol/geom/Geometry';\nimport { DragDropModule } from '@angular/cdk/drag-drop';\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 previewEnabled?: boolean;\n featuresForPreview?: olFeature[];\n primaryFeaturesForPreview?: olFeature[];\n secondaryFeaturesForPreview?: olFeature[];\n drawLayerSourceService?: DrawLayerSourceService;\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, DragDropModule ]\n})\nexport class ConfirmDialogComponent {\n\n data: ConfirmDialogData = inject(MAT_DIALOG_DATA);\n private dialogRef: MatDialogRef<ConfirmDialogComponent, ConfirmChoice> = inject(MatDialogRef<ConfirmDialogComponent, ConfirmChoice>);\n\n choose(choice: ConfirmChoice) {\n this.clearPreview();\n this.dialogRef.close(choice);\n }\n\n preview(choice: ConfirmChoice) {\n if (this.data.previewEnabled === true && this.data.drawLayerSourceService) {\n const previewFeatures: olFeature<Geometry>[] = choice === 'primary' ? this.data.primaryFeaturesForPreview! :\n this.data.secondaryFeaturesForPreview!;\n const overlappingFeatureIds = previewFeatures.map(feature => feature.getId());\n this.data.drawLayerSourceService.hideFeaturesforPreview(overlappingFeatureIds);\n this.data.drawLayerSourceService.previewSource.addFeatures(previewFeatures);\n }\n }\n\n clearPreview(): void {\n if (this.data.previewEnabled === true && this.data.drawLayerSourceService) {\n this.data.drawLayerSourceService.previewSource.clear();\n // Restore overlapping features from draw layer after preview\n this.data.drawLayerSourceService.restoreFeaturesAfterPreview();\n }\n }\n}\n","\n@if(data.title) {\n <h2 mat-dialog-title\n cdkDrag\n cdkDragRootElement=\".cdk-overlay-pane\"\n cdkDragHandle>{{ 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 @if(data.secondaryText) {\n <button mat-button (click)=\"choose('secondary')\"\n (mouseenter)=\"preview('secondary')\" (mouseleave)=\"clearPreview()\">\n {{ data.secondaryText }}\n </button>\n }\n\n <!-- Primær handling -->\n <button mat-raised-button color=\"primary\" (click)=\"choose('primary')\" \n (mouseenter)=\"preview('primary')\" (mouseleave)=\"clearPreview()\">\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: true, \n data\n }\n );\n\n return dialogRef.afterClosed();\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 { FeatureHelperService } from './featureHelper.service';\nimport { Feature } from 'ol';\nimport { ConfirmDialogService } from './confirm-dialog.service';\n\n@Injectable()\nexport class CenterPointService {\n private readonly _centerPointProperty = '_centerpoint';\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 _featureHelper = inject(FeatureHelperService);\n private _confirmDialog = inject(ConfirmDialogService);\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 isCenterpoint(feature: Feature): boolean {\n return feature.get(this._centerPointProperty) === true;\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._confirmDialog.open({ message: 'Centerpunktet skal være inde i en flade', primaryText: 'OK', title: 'Advarsel'}).subscribe({\n next: () => { return false; } \n })\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(this._centerPointProperty) === 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(this._centerPointProperty, true);\n evt.feature.set('_parentPolyId', parentPolyId);\n this._featureHelper.setId(evt.feature);\n callBack();\n });\n }\n });\n\n }\n\n}","import { inject, Injectable } from '@angular/core';\nimport { Feature, Feature as olFeature } from 'ol';\nimport { area, difference, featureCollection, feature as turfFeature, booleanIntersects, intersect, booleanWithin } from '@turf/turf';\nimport GeoJSON, { GeoJSONFeature, GeoJSONGeometry } from 'ol/format/GeoJSON';\nimport Polygon from 'ol/geom/Polygon';\nimport { DrawLayerSourceService } from './drawLayerSource.service';\nimport { FeatureHelperService } from './featureHelper.service';\nimport { ConfirmDialogService } from './confirm-dialog.service';\nimport { map, Observable, of } from 'rxjs';\nimport Geometry from 'ol/geom/Geometry';\nimport { CurrentItemsService } from './currentItems.service';\nimport { StyleLike } from 'ol/style/Style';\n\n@Injectable()\nexport class OverlapService {\n\n private _drawLayerService = inject(DrawLayerSourceService);\n private _featureHelper = inject(FeatureHelperService);\n private _confirmService = inject(ConfirmDialogService);\n private _geoJsonFormat = new GeoJSON<olFeature<Polygon>>();\n private _current = inject(CurrentItemsService);\n\n private readonly EPSILON = 0.1;\n\n handleOverlaps(features: olFeature[], excludeIds: string[] = []): Observable<olFeature[]> { \n let newClippedFeature: any = null;\n let unlockedFeaturesAsGeoJson: GeoJSONFeature[] = [];\n let lockedClipped = false;\n let anyOverlappingLockedFeatures: boolean = false;\n\n // If the settings allows overlap, just return the features - no overlap check necessary\n if (!this._current.gisKomponentSettings.disableOverlap) { return of(features); }\n features.forEach(feature => {\n // Handle the locked.\n const overlappingLockedFeatures = this._drawLayerService.source.getFeatures().filter(f => this._featureHelper.isLocked(f) && f.getGeometry()?.intersectsExtent(feature.getGeometry()!.getExtent()));\n const clipped = this._handleLockedFeaturesOverlapping(overlappingLockedFeatures, feature);\n if (!lockedClipped && clipped) { lockedClipped = clipped }\n\n //Handle the unlocked.\n const overlappingUnlockedFeatures = this._drawLayerService.source.getFeatures().filter(f => !excludeIds.some(id => id == f.getId()) && !this._featureHelper.isLocked(f) && f.getGeometry()?.intersectsExtent(feature.getGeometry()!.getExtent()));\n if (overlappingUnlockedFeatures.length > 0) {\n anyOverlappingLockedFeatures = true;\n let newFeatureGeoJson = this._geoJsonFormat.writeFeatureObject(feature);\n const newFeatureArea = area(newFeatureGeoJson);\n unlockedFeaturesAsGeoJson = overlappingUnlockedFeatures.map(f => this._geoJsonFormat.writeFeatureObject(f));\n\n // If null the whole new feature is inside a the existing\n newClippedFeature = difference(featureCollection([newFeatureGeoJson, ...unlockedFeaturesAsGeoJson as any]));\n\n // if the new feature is completely inside one of the existing features, newClippedFeature will be null\n const areaNewClippedFeature = newClippedFeature ? area(newClippedFeature as any) : 1;\n if (Math.abs(newFeatureArea - areaNewClippedFeature) < this.EPSILON) { \n anyOverlappingLockedFeatures = false;\n }\n }\n });\n\n if (lockedClipped) {\n this._confirmService.open({ message: 'Der var overlap med låste flader, så den indtegnede flade er blevet beskåret', primaryText: 'OK', title: 'Advarsel'}).subscribe();\n }\n\n if (anyOverlappingLockedFeatures) {\n const primaryFeatures = features.map(feature => this._cloneFeatureWithId(feature));\n const secondaryFeatures = features.map(feature => this._cloneFeatureWithId(feature));\n const primaryFeaturesForPreview = this._handleUnlockedFeaturesOverlapping(primaryFeatures, 'primary', true);\n const secondaryFeaturesForPreview = this._handleUnlockedFeaturesOverlapping(secondaryFeatures, 'secondary', true);\n return this._confirmService.open({\n primaryText: 'Beskær den aktive',\n secondaryText: 'Bevar den aktive',\n disableClose: false,\n previewEnabled: true,\n primaryFeaturesForPreview: primaryFeaturesForPreview,\n secondaryFeaturesForPreview: secondaryFeaturesForPreview,\n drawLayerSourceService: this._drawLayerService,\n message: 'Fladerne beskæres for at undgå overlap (hold musen over for at se forhåndsvisning)?', \n title: 'Beskæring'\n }).pipe(map(msg => {\n return this._handleUnlockedFeaturesOverlapping(features, msg!) \n }));\n } else {\n return of(features);\n }\n }\n\n private _cloneFeatureWithId(feature: olFeature<Geometry>): olFeature<Geometry> {\n const clonedFeature = feature.clone();\n clonedFeature.setId(feature.getId());\n return clonedFeature;\n }\n\n private _handleUnlockedFeaturesOverlapping(features: olFeature[], msg: string, isPreview?: boolean): olFeature<Geometry>[] {\n const featuresToHideInPreview: Feature[] = []; // Holds features from the map that are completely within the new feature.\n features.forEach(feature => {\n const overlappingUnlockedFeatures = this._drawLayerService.source.getFeatures().filter(f => !this._featureHelper.isLocked(f) && f.getGeometry()?.intersectsExtent(feature.getGeometry()!.getExtent()));\n if (overlappingUnlockedFeatures.length > 0) {\n let newFeatureGeoJson = this._geoJsonFormat.writeFeatureObject(feature);\n const unlockedFeaturesAsGeoJson = overlappingUnlockedFeatures.map(f => this._geoJsonFormat.writeFeatureObject(f));\n const newClippedFeature = difference(featureCollection([newFeatureGeoJson, ...unlockedFeaturesAsGeoJson as any]));\n\n if (isPreview === true) {\n // Push the overlapping feature for this scenario (for preview)\n overlappingUnlockedFeatures.forEach(feature => features.push(this._cloneFeatureWithId(feature)));\n }\n if (msg === 'primary') {\n if (newClippedFeature) {\n const newGeometry = this._geoJsonFormat.readGeometry(newClippedFeature!.geometry);\n feature.setGeometry(newGeometry);\n } else {\n feature.setGeometry(undefined);\n }\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 if (featureDiff !== null) {\n const featureDiffArea = area(featureDiff!.geometry);\n if (Math.abs(featureArea - featureDiffArea) > this.EPSILON) {\n // If preview mode, then modify the geomery of overlapping objects only in the resulting array\n // not in the actual draw layer\n const existingFeature = isPreview === true ? features.find(feature => feature.getId() === f.id!) :\n this._drawLayerService.source.getFeatureById(f.id!);\n if (existingFeature) {\n const newGeometry = this._geoJsonFormat.readGeometry(featureDiff?.geometry);\n existingFeature.setGeometry(newGeometry);\n }\n }\n } else {\n // Check if the existing feature is totally within the new\n const fcReversed = featureCollection([newFeatureGeoJson, f]);\n const featureDiffReversed = difference(fcReversed as any);\n if (featureDiffReversed) {\n const reversedDiffArea = area(featureDiffReversed)\n if (reversedDiffArea) {\n // The only way to get here is that the new feature completely overlaps this one. This one should be removed\n // and added to the output-array, because that is used for hiding features in preview\n if (isPreview) { \n const featureToHide = new Feature(f.geometry);\n featureToHide.setId(f.id);\n featuresToHideInPreview.push(featureToHide)\n const overlappedFeature = features.find(existingFeature => existingFeature.getId() === f.id);\n if (overlappedFeature) { \n overlappedFeature.setGeometry(undefined);\n }\n } else {\n const featureToRemove = this._drawLayerService.source.getFeatureById(f.id!);\n if (featureToRemove) {\n this._drawLayerService.source.removeFeature(featureToRemove);\n }\n }\n }\n }\n }\n });\n }\n }\n });\n\n features = features.filter(feature => feature.getGeometry() !== undefined);\n return [ ...features, ...featuresToHideInPreview];\n }\n\n private _handleLockedFeaturesOverlapping(overlappingFeatures: olFeature[], orgFeature: olFeature): boolean {\n let newFeatureGeoJson = this._geoJsonFormat.writeFeatureObject(orgFeature);\n\n const orgFeatureArea = area(newFeatureGeoJson);\n if (overlappingFeatures.length > 0) {\n const overlappingLockedFeaturesAsGeoJson = overlappingFeatures.map(f => this._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) > this.EPSILON;\n if (actuallyClipped) {\n const geom = this._geoJsonFormat.readGeometry(clipped.geometry);\n orgFeature.setGeometry(geom);\n return true;\n \n }\n }\n }\n return false;\n }\n splitByFeature(cutterFeature: olFeature, remove: boolean = false): Observable<olFeature[]> {\n let result: olFeature[] = [];\n const cutterGeo = this._olToGeoJSON(cutterFeature.getGeometry()!);\n const cutter = turfFeature(cutterGeo);\n const overlappingFeatures = this._drawLayerService.source.getFeatures().filter(f => f.getGeometry()?.intersectsExtent(cutterFeature.getGeometry()!.getExtent()));\n overlappingFeatures.forEach(feature => {\n const style = feature.getStyle();\n const geom = feature.getGeometry();\n if (!geom) return;\n const geo = this._olToGeoJSON(geom);\n const aTurfFeature = turfFeature(geo);\n if (!booleanIntersects(aTurfFeature, cutter)) {\n return;\n }\n // Feature is fully inside the cutter, so remove the whole feature\n if (remove && booleanWithin(aTurfFeature, cutter)) {\n this._drawLayerService.source.removeFeature(feature)\n return;\n }\n // Outside part(s)\n const fc = featureCollection([aTurfFeature, cutter]);\n const diff = difference(fc as any);\n // Inside part(s)\n const inter = intersect(fc as any);\n // Add outside part(s)\n if (diff && area(diff.geometry) > this.EPSILON) result = result.concat(this._addTurfToResult(diff, style));\n // Add inside part(s)\n if (!remove && inter && area(inter.geometry) > this.EPSILON) result = result.concat(this._addTurfToResult(inter, style));\n // Remove the original overlapping feature (it was split into diff + inter)\n if (result.length > 0) this._drawLayerService.source.removeFeature(feature);\n });\n return of(result);\n }\n\n private _addTurfToResult(aTurfFeature: any, style: StyleLike | undefined): olFeature[] {\n const result: olFeature[] = []\n if (aTurfFeature.geometry.type === 'MultiPolygon') {\n aTurfFeature.geometry.coordinates.forEach((coords: any) => {\n const newFeature = new olFeature(\n this._geoJSONToOl({\n type: 'Polygon',\n coordinates: coords,\n style: style\n })\n );\n if (style) newFeature.setStyle(style);\n result.push(newFeature);\n });\n } else {\n const newFeature = new olFeature(this._geoJSONToOl(aTurfFeature.geometry));\n if (style) newFeature.setStyle(style);\n result.push(newFeature);\n }\n return result;\n }\n private _olToGeoJSON(geometry: Geometry): GeoJSONGeometry {\n const geoJson = new GeoJSON();\n return geoJson.writeGeometryObject(geometry.clone().transform('EPSG:25832', 'EPSG:4326'));\n }\n\n private _geoJSONToOl(geo: any): Geometry {\n const geoJson = new GeoJSON();\n return geoJson.readGeometry(geo).transform('EPSG:4326', 'EPSG:25832');\n }\n}","import { HttpClient } from '@angular/common/http';\nimport { inject, Injectable } from '@angular/core';\nimport WFS from 'ol/format/WFS';\nimport WKT from 'ol/format/WKT';\nimport { combineLatest, map, Observable } from 'rxjs';\nimport { WfsFeatureCollection } from './wfsSearch.service';\nimport { ILayer } from '../models/ILayer';\nimport Filter from 'ol/format/filter/Filter';\nimport { Feature, FeatureCollection, GeoJsonProperties } from 'geojson';\nimport { Coordinate } from 'ol/coordinate';\nimport { CurrentItemsService } from './currentItems.service';\nimport Point from 'ol/geom/Point';\nimport { intersects } from 'ol/format/filter';\n\nexport abstract class SearchProviderBase<TResponse, TFilter> {\n\n protected _http = inject(HttpClient);\n private wfsFormat = new WFS();\n private _serializer = new XMLSerializer();\n\n search(searchValue: TFilter, maxCount: number ): Observable<TResponse[]> {\n const wftSearches: Observable<TResponse>[] = [];\n const searchLayers = this.getSearchableLayers();\n searchLayers.forEach(layer => {\n const filter = this.getFilter(searchValue, layer); // like(layer.searchField!, `*${searchValue}*`, '*', '?', '/', false);\n var searchFeature = this.wfsFormat.writeGetFeature({\n featureTypes: [layer.layers.includes(':') ? layer.layers.split(':')[1] : ''],\n outputFormat: 'application/json',\n featureNS: '',\n featurePrefix: '',\n srsName: 'EPSG:25832',\n maxFeatures: maxCount,\n filter\n });\n const body = this._serializer.serializeToString(searchFeature);\n // Call the post without generic <WfsFeatureCollection>, because the GeoServer will return a 200 and an error as xml. Handle the deserialize manually instead.\n const req$ = this._http.post(layer.baseUrl.replace('wms', 'wfs'), body, { headers: { 'Content-Type': 'text/xml' }, responseType: 'text', observe: 'response'}).pipe(map(r => {\n try {\n const result = JSON.parse(r.body ?? '');\n return this.map(layer, result as WfsFeatureCollection);\n } catch(err) {\n // Eat the error and console log to ensure the user isn't bombarded with errors they can't do anything about.\n console.error(`Fejl i læsning af svar for ${layer.name} fra wfs. Dette skyldes oftest fejl i opsætning. Kontroller at geometri-navnet er korrekt. Fejlkode: ${err}`);\n const empty: WfsFeatureCollection = {\n features: [],\n type: 'FeatureCollection'\n };\n return this.map(layer, empty);\n }\n\n }));\n wftSearches.push(req$);\n });\n return combineLatest(wftSearches);\n\n }\n\n abstract getSearchableLayers(): ILayer[];\n abstract getFilter(searchValue: TFilter, layer: ILayer): Filter;\n abstract map(l: ILayer, f: FeatureCollection): TResponse;\n}\n\nexport type ValueKind = 'data' | 'url' | 'img';\n\nexport interface IValue {\n kind: ValueKind;\n name: string;\n data: string; // altid string (vi konverterer alt til string)\n}\n\nexport interface IInfoSearchResult {\n layerName: string;\n values: Record<string, IValue>[];\n}\n\n@Injectable()\nexport class InfoSearchProvider extends SearchProviderBase<IInfoSearchResult, Coordinate> {\n \n private _current = inject(CurrentItemsService);\n override getSearchableLayers(): ILayer[] {\n return this._current.profile!.layerGroups.flatMap(lg => lg.layers).filter(f => f.enableShowInfo);\n }\n\n override getFilter(searchValue: Coordinate, layer: ILayer): Filter {\n const point = new Point(searchValue);\n return intersects(layer.geometryField, point);\n }\n\n override map(layer: ILayer, f: FeatureCollection): IInfoSearchResult { \n const fieldsToExclude = new Set(layer.fieldsToExcludeFromInfoFromInfo.split(',').map(f => f.toLowerCase().trim()));\n return {\n layerName: layer.name,\n values: f.features.map(f => this._mapFeature(f, fieldsToExclude))\n };\n }\n\n private _mapFeature(f: Feature, excludeSet: Set<string>): Record<string, IValue> {\n\n const result: Record<string, IValue> = {};\n \n const props: GeoJsonProperties = f.properties || { };\n for(const [key, value] of Object.entries(props)) {\n if (excludeSet.has(key.toLowerCase())) continue;\n\n const kind = this._getValueKind(value);\n result[key] = { kind, data: value, name: key }\n }\n return result;\n }\n\n private _getValueKind(value: any): ValueKind {\n const imgTypes = ['.png', '.jpg', '.gif', '.jpeg']\n if (typeof value === 'string') {\n if (value.startsWith('http://') || value.startsWith('https://')) {\n if (imgTypes.some(ext => value.endsWith(ext))) {\n return 'img';\n }\n return 'url';\n }\n }\n return 'data';\n }\n}\n","import { Point, Polygon } from 'ol/geom';\nimport { SearchProviderBase } from './infoSearch.service';\nimport { FeatureCollection } from 'geojson';\nimport Filter from 'ol/format/filter/Filter';\nimport { ILayer } from '../models/ILayer';\nimport { inject, Injectable } from '@angular/core';\nimport { CurrentItemsService } from './currentItems.service';\nimport { dwithin, intersects } from 'ol/format/filter';\n\nexport interface IDocumentResponse {\n layer: string;\n propertyName: string;\n propertyHeader: string;\n items: IDocumentSearchItem[];\n}\n\nexport interface IDocumentSearchItem {\n url: string;\n header: string;\n}\n\ninterface pointFilterItem {\n kind: 'point',\n value: Point,\n distance: number \n}\ninterface polygonFilterItem {\n kind: 'polygon',\n value: Polygon\n}\ntype filterItem = pointFilterItem | polygonFilterItem; \n\n@Injectable()\nexport class DocumentSearchService extends SearchProviderBase<IDocumentResponse, filterItem> {\n \n private _current = inject(CurrentItemsService);\n\n override getSearchableLayers(): ILayer[] {\n return this._current.profile!.layerGroups.flatMap(lg => lg.layers).filter(l => l.documentSearch);\n }\n\n override getFilter(searchValue: filterItem, layer: ILayer): Filter {\n\n return searchValue.kind === 'point' ? dwithin(layer.geometryField, searchValue.value, searchValue.distance, 'meters') : \n intersects(layer.geometryField, searchValue.value);\n }\n\n override map(l: ILayer, f: FeatureCollection): IDocumentResponse {\n return {\n layer: l.name,\n propertyName: l.documentSearchDisplayProperty,\n propertyHeader: l.documentSearchDisplayHeader,\n items: f.features.map(f => ({\n url: f.properties![l.documentSearchDisplayProperty],\n header: f.properties![l.documentSearchDisplayHeader] ?? 'Dokument'\n })) \n }\n }\n\n}\n","import { inject, Injectable } from '@angular/core';\nimport { CurrentItemsService } from './currentItems.service';\nimport { unByKey } from 'ol/Observable';\nimport { IInfoSearchResult, InfoSearchProvider } from './infoSearch.service';\nimport { Subject } from 'rxjs';\nimport { DocumentSearchService, IDocumentResponse } from './documentSearch.service';\nimport { Point, Polygon } from 'ol/geom';\nimport { Draw } from 'ol/interaction';\nimport { InteractionHelperService } from './interactionHelper.service';\nimport { Feature } from 'ol';\n\n@Injectable()\nexport class ShowInfoService {\n\n private _current = inject(CurrentItemsService);\n private _listenKey: any | null = null; \n private _active = false;\n private _infoSearchProvider = inject(InfoSearchProvider);\n private _features = new Subject<IInfoSearchResult[] | null>();\n features$ = this._features.asObservable();\n\n stopShowInfo(): void {\n this._features.next(null);\n this.disable();\n }\n\n startShowInfo(): void {\n if (this._active) { return; }\n const maxCount = this._current.profile?.searchResultLimit ?? 5;\n this._active = true;\n this._current.map$.subscribe({\n next: map => {\n this._listenKey = this._listenKey ?? map.on('singleclick', evt => {\n this._infoSearchProvider.search(evt.coordinate, maxCount).subscribe({\n next: r => {\n if (r.flatMap(l => l.values).length > 0) {\n this._features.next(r) \n } else {\n this._features.next(null);\n }\n },\n error: err => {\n this.disable();\n }\n })\n });\n }\n })\n }\n\n disable(): void {\n if (!this._active) { return; }\n if (this._listenKey) {\n unByKey(this._listenKey);\n this._listenKey = null;\n }\n this._active = false;\n }\n}\n\ntype interactionType = 'point' | 'polygon';\n@Injectable()\nexport class ShowDocumentInfoService {\n \n private _documentSearch = inject(DocumentSearchService);\n private _current = inject(CurrentItemsService);\n private _interactionHelper = inject(InteractionHelperService);\n\n private _currentlyActive?: interactionType;\n \n get currentActive(): interactionType | undefined { \n return this._currentlyActive; \n }\n private _listenKey: any | null = null; \n\n private _features = new Subject<IDocumentResponse[] | null>();\n features$ = this._features.asObservable();\n\n\n start(interactionType: 'point' | 'polygon') {\n if (this._currentlyActive) {\n this.stop();\n }\n \n if (interactionType === 'point') { \n this._startByPoint(); \n } else if(interactionType === 'polygon') {\n this._startByPolygon();\n }\n }\n\n stop(): void {\n this._currentlyActive = undefined;\n this._features.next(null);\n if (this._listenKey) {\n unByKey(this._listenKey);\n this._listenKey = null;\n }\n }\n\n private _startByPoint(): void { \n this._currentlyActive = 'point';\n this._listenKey = this._current.map?.on('singleclick', evt => {\n\n const map = this._current.map!; \n\n const pixel = evt.pixel; // CSS-pixels\n const pixelRadius = 8; // hold den fast – ingen DPR\n\n // to koordinater med pixel-afstand = pixelRadius\n const p1 = map.getCoordinateFromPixel([pixel[0], pixel[1]]);\n const p2 = map.getCoordinateFromPixel([pixel[0] + pixelRadius, pixel[1]]);\n\n // i EPSG:25832 er units meter → dx,dy er meter\n const dx = p2[0] - p1[0];\n const dy = p2[1] - p1[1];\n let meterRadius = Math.hypot(dx, dy);\n \n const MIN_M = 0.5;\n const MAX_M = 25;\n meterRadius = Math.max(MIN_M, Math.min(meterRadius, MAX_M));\n\n const point = new Point(evt.coordinate);\n this._documentSearch.search({ kind: 'point', distance: meterRadius, value: point}, 100).subscribe({\n next: result => {\n this._features.next(result);\n }\n })\n });\n }\n\n private _startByPolygon(): void {\n const draw = new Draw({ type: 'Polygon', stopClick: true });\n draw.on('drawend', evt => {\n const geom = evt.feature.getGeometry() as Polygon;\n this._documentSearch.search({ kind: 'polygon', value: geom }, 100).subscribe({\n next: result => {\n this._features.next(result);\n }\n });\n this._current.map!.removeInteraction(draw);\n });\n this._interactionHelper.setAsTemp(draw);\n \n this._current.map!.addInteraction(draw);\n }\n}","import { HttpClient } from '@angular/common/http';\nimport { inject, Injectable } from '@angular/core';\nimport { GISKOMPONENT_CONFIG } from '../config/config';\nimport { Observable } from 'rxjs';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class GeometryService {\n \n private config = inject(GISKOMPONENT_CONFIG);\n private _baseUrl = this.config.apiBaseUrl;\n private _http = inject(HttpClient);\n\n validate(wkt: string): Observable<ValidationResult> {\n const url = `${this._baseUrl}/api/geometry/validate`;\n return this._http.post<ValidationResult>(url, {wkt: wkt});\n }\n\n dmpValidate(wkt: string): Observable<DMPValidationResult> {\n const url = `${this._baseUrl}/api/geometry/dmpvalidate`;\n return this._http.post<DMPValidationResult>(url, {wkt: wkt});\n }\n}\n\nexport interface ValidationResult {\n wasCorrected: boolean;\n correctedGeometries?: string[];\n}\n\nexport interface DMPValidationResult {\n isValid: boolean;\n wasCorrected: boolean;\n correctionAttempts: number;\n error: DMPValidationErrorDto;\n correctedGeometry?: string;\n}\n\nexport interface DMPValidationErrorDto {\n code: number;\n message: string;\n ruleName: string;\n}","import { inject, Injectable } from '@angular/core';\nimport html2canvas from 'html2canvas-pro';\nimport { Map } from 'ol';\nimport { PrintMapSetting } from '../models/GisKomponentSettings';\nimport { LayerHelperService } from './layerHelper.service';\nimport Rotate from 'ol/control/Rotate';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class PrintHelperService {\n private _layerHelper: LayerHelperService = inject(LayerHelperService);\n\n setVisibiltyOnDOMElements(baseElement: HTMLElement, visible: boolean, printSetting?: PrintMapSetting) {\n const elements = ['activeobjects', '.ol-zoom', 'map-toolbox', '.ol-mouse-position', '.layer-selector-body-wrapper'];\n if (printSetting && printSetting.printNorthArrow === false) {\n elements.push('.ol-rotate');\n }\n if (printSetting && printSetting.printScale != undefined && printSetting.printScale === false) {\n elements.push('.ol-scale-bar');\n }\n if (printSetting && printSetting.printLegends != undefined && printSetting.printLegends === false) {\n elements.push('lib-legends-list');\n }\n this._setVisibiltyOnDOMElements(baseElement, elements, visible);\n }\n\n getAllImgData(map: Map, printSettings: PrintMapSetting[], profileId: number): Promise<string[]> {\n const tasks = printSettings.map(item => () => this.getImgData(map, item, profileId));\n const results: string[] = [];\n\n return tasks\n .reduce<Promise<void>>((chain, task) => {\n return chain.then(() =>\n task().then(r => {\n results.push(r);\n })\n );\n }, Promise.resolve())\n .then(() => results);\n }\n\n getImgData(map: Map, printSetting: PrintMapSetting, profileId: number): Promise<string> {\n const htmlElement = map.getViewport();\n this.setVisibiltyOnDOMElements(htmlElement, false, printSetting);\n const rotateControls: Rotate[] = map\n .getControls()\n .getArray()\n .filter(c => c instanceof Rotate);\n // Hide the north arrow if setting is false\n if (rotateControls.length > 0 && !printSetting.printNorthArrow) rotateControls.forEach(rotateC => map.removeControl(rotateC));\n if (printSetting.onlyUseCheckedLayers) {\n this._layerHelper.toggleAllPrintLayersInMap(map);\n } else {\n this._layerHelper.applyCachedLayersToDisplayInMap(map, profileId);\n }\n \n return new Promise((resolve, reject) => {\n //Give time for layers/map controls to be rendered/removed\n setTimeout(() => {\n html2canvas(htmlElement, { \n useCORS: true,\n }).then(originalCanvas => { \n if (printSetting.printDimensions) {\n \n const srcW = originalCanvas.width;\n const srcH = originalCanvas.height;\n \n const scale = Math.min(printSetting.printDimensions[0] / srcW, printSetting.printDimensions[1] / srcH);\n const outW = Math.round(srcW * scale);\n const outH = Math.round(srcH * scale);\n \n // 3) Lav nyt canvas til nedskalering\n const scaledCanvas = document.createElement('canvas');\n scaledCanvas.width = outW;\n scaledCanvas.height = outH;\n \n const ctx = scaledCanvas.getContext('2d')!;\n ctx.imageSmoothingEnabled = true;\n ctx.imageSmoothingQuality = 'high';\n ctx.drawImage(originalCanvas, 0, 0, outW, outH);\n const dataUrl = scaledCanvas.toDataURL(printSetting.printFormat);\n this._restoreDOMElements(htmlElement, printSetting, map, rotateControls);\n resolve(dataUrl);\n } else {\n const imgData = originalCanvas.toDataURL(printSetting.printFormat);\n this._restoreDOMElements(htmlElement, printSetting, map, rotateControls);\n resolve(imgData);\n }\n }\n );\n }, 300);\n })\n }\n\n\n private _restoreDOMElements(htmlElement: HTMLElement, printSetting: PrintMapSetting, map: Map, rotateControls: Rotate[]): void {\n // Restore the north arrow if setting is false\n if (rotateControls.length > 0 && !printSetting.printNorthArrow) rotateControls.forEach(rotateC => map.addControl(rotateC));\n // Restore scale/legends list if they were removed for this print (might be needed for next print)\n this.setVisibiltyOnDOMElements(htmlElement, true, printSetting);\n }\n\n private _setVisibiltyOnDOMElements(baseElement: HTMLElement, elements: string[], visible: boolean): void {\n let visibilityValue = 'hidden';\n if (visible) { visibilityValue = 'visible'; }\n\n elements.forEach(e => {\n const activeobjects = baseElement.querySelector(e) as HTMLElement;\n if (activeobjects) { activeobjects!.style.visibility = visibilityValue; }\n });\n\n }\n\n\n}","import { inject, Injectable } from '@angular/core';\nimport { Geometry } from 'ol/geom';\nimport { forkJoin, Observable, Subject } from 'rxjs';\nimport { IValue } from './infoSearch.service';\nimport { CurrentItemsService } from './currentItems.service';\nimport { ILayer } from '../models/ILayer';\n\n@Injectable()\nexport class SearchProviderService {\n private _cancelSearchSubject = new Subject();\n private _cancelSearch = this._cancelSearchSubject.asObservable();\n\n private _current = inject(CurrentItemsService);\n searchProviders: SearchProvider[] = [];\n\n search(searchString?: string, geometry?: Geometry): Observable<SearchResponse[]> {\n this._cancelSearchSubject.next('');\n const maxSearchResults = this._current.profile?.searchResultLimit ?? 8;\n\n const searches = this.searchProviders.map(sp => sp.search(searchString, geometry, maxSearchResults)).flatMap(sp => sp);\n return forkJoin(searches);\n }\n}\n\nexport interface SearchProvider {\n name: string;\n search(searchValue?: string, geometry?: Geometry, maxCount?: number): Observable<SearchResponse> | Observable<SearchResponse>[];\n}\n\nexport interface SearchResponseItem {\n wkt: string;\n header: string; \n showMetadata: boolean;\n metadata?: Record<string, IValue>[];\n}\n\nexport interface SearchResponse {\n total: number;\n title: string;\n items: SearchResponseItem[];\n}","\nimport { Injectable } from '@angular/core';\nimport { Coordinate } from 'ol/coordinate';\nimport Map from 'ol/Map';\nimport { toLonLat } from 'ol/proj';\n\n@Injectable()\nexport class CowiService {\n\n openCowiPageFromPoint(cowiUrl: string, coordinate: Coordinate): void {\n const regExp: RegExp = /(?:@x.*?@y)/gi;\n const doReplace = (match: string) => {\n if (match.startsWith('@x')) {\n return match.replace('@x', `${coordinate[0]}`).replace('@y', `${coordinate[1]}`);\n }\n return match;\n };\n const convertedUrl: string = cowiUrl.replace(regExp, doReplace);\n window.open(convertedUrl);\n\n }\n \n openCowiPageFromCenterPoint(cowiUrl: string, map: Map): void {\n const centerPoint = map.getView().getCenter();\n if (!centerPoint) return;\n if (!cowiUrl) return;\n const regExp: RegExp = /(?:@x.*?@y)/gi;\n const doReplace = (match: string) => {\n if (match.startsWith('@x')) {\n return match.replace('@x', `${centerPoint[0]}`).replace('@y', `${centerPoint[1]}`);\n }\n return match;\n };\n const convertedUrl: string = cowiUrl.replace(regExp, doReplace);\n window.open(convertedUrl);\n }\n\n openGoogleStreetViewFromCenterPoint(map: Map) {\n const centerPoint = map.getView().getCenter();\n\n if (!centerPoint) {\n return;\n }\n const [lon, lat] = toLonLat(centerPoint, 'EPSG:25832');\n\n const streetViewUrl = `https://www.google.com/maps/@?api=1&map_action=pano&viewpoint=${lat},${lon}`;\n\n window.open(streetViewUrl);\n }\n\n openGoogleStreetViewFromPoint(coordinate: Coordinate) {\n if (!coordinate) {\n return;\n }\n const [lon, lat] = toLonLat(coordinate, 'EPSG:25832');\n\n const streetViewUrl = `https://www.google.com/maps/@?api=1&map_action=pano&viewpoint=${lat},${lon}`;\n\n window.open(streetViewUrl);\n }\n}\n","import { inject, Injectable } from '@angular/core';\nimport { SearchProvider, SearchResponse } from './searchProvider.service';\nimport { map, Observable, of } from 'rxjs';\nimport { Geometry } from 'ol/geom';\nimport { HttpClient, HttpParams } from '@angular/common/http';\nimport { GISKOMPONENT_CONFIG } from '../config/config';\nimport { CurrentItemsService } from './currentItems.service';\nimport { DOCUMENT } from '@angular/common';\n\ninterface IAddressSearchResponse {\n header: string;\n wkt: string;\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class AddressSearchService implements SearchProvider {\n name = 'Adresser';\n private _http = inject(HttpClient);\n\n private _config = inject(GISKOMPONENT_CONFIG);\n private _current = inject(CurrentItemsService);\n private document = inject(DOCUMENT);\n\n private readonly _baseUrl = `${this._config.apiBaseUrl}/api/address/addresses`;\n private readonly _downloadUrl = `${this._config.apiBaseUrl}/api/address/downloadaddresses`;\n\n search(searchValue?: string, geometry?: Geometry, maxCount: number = 5): Observable<SearchResponse> {\n\n const regionskode = this._current.profile?.searchRegionKode ?? '';\n\n const params = new HttpParams().append('search', searchValue ?? '').append('regionskode', regionskode);\n if (!regionskode || regionskode === '' || !searchValue) {\n // No valid filters provided, skip call\n return of({ total: 0, items: [], title: ''});\n }\n return this._http.get<IAddressSearchResponse[]>(this._baseUrl, { params}).pipe(map(r => ( { total: 0, title: this.name, items: r.map(i => ({ ...i, showMetadata: false })) } ) ))\n\n }\n\n download(coordinates: string): void {\n\n const params = new HttpParams().append('coordinates', coordinates);\n this._http.get(this._downloadUrl, { params, responseType: 'blob'}).subscribe(blob => {\n const url = URL.createObjectURL(blob);\n const a = this.document.createElement('a');\n\n a.style.display = 'none';\n a.href = url;\n a.download = 'adresser.csv';\n\n this.document.body.appendChild(a);\n a.click();\n a.remove();\n\n setTimeout(() => URL.revokeObjectURL(url), 0);\n });\n\n }\n}\n\n","import { inject, Injectable } from '@angular/core';\nimport { SearchProvider, SearchResponse } from './searchProvider.service';\nimport { map, Observable, of } from 'rxjs';\nimport { Geometry } from 'ol/geom';\nimport { HttpClient, HttpParams } from '@angular/common/http';\nimport { GISKOMPONENT_CONFIG } from '../config/config';\nimport { CurrentItemsService } from './currentItems.service';\nimport { DOCUMENT } from '@angular/common';\n\ninterface IAddressSearchResponse {\n header: string;\n wkt: string;\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class CadastreSearchService implements SearchProvider {\n name = 'Matrikler';\n private _http = inject(HttpClient);\n\n private _config = inject(GISKOMPONENT_CONFIG);\n private _current = inject(CurrentItemsService);\n private document = inject(DOCUMENT);\n\n private readonly _baseUrl = `${this._config.apiBaseUrl}/api/address/cadastres`;\n private readonly _downloadUrl = `${this._config.apiBaseUrl}/api/address/downloadcadastres`;\n\n search(searchValue?: string, geometry?: Geometry, maxCount: number = 5): Observable<SearchResponse> {\n\n const regionskode = this._current.profile?.searchRegionKode;\n if (!regionskode || regionskode === '' || !searchValue) {\n // No valid filters provided, skip call\n return of({ total: 0, items: [], title: ''});\n }\n const params = new HttpParams().append('search', searchValue ?? '').append('regionskode', regionskode);\n return this._http.get<IAddressSearchResponse[]>(this._baseUrl, { params}).pipe(map(r => ( { total: 0, title: this.name, items: r.map(i => ({ ...i, showMetadata: false })) } ) ))\n }\n\n\n download(coordinates: string): void {\n\n const params = new HttpParams().append('coordinates', coordinates);\n this._http.get(this._downloadUrl, { params, responseType: 'blob'}).subscribe(blob => {\n const url = URL.createObjectURL(blob);\n const a = this.document.createElement('a');\n\n a.style.display = 'none';\n a.href = url;\n a.download = 'matrikler.csv';\n\n this.document.body.appendChild(a);\n a.click();\n a.remove();\n\n setTimeout(() => URL.revokeObjectURL(url), 0);\n });\n }\n\n \n}\n\n","import { Point, Polygon } from 'ol/geom';\nimport { ILayer } from '../models/ILayer';\nimport { SearchProviderBase } from './infoSearch.service';\nimport { FeatureCollection } from 'geojson';\nimport Filter from 'ol/format/filter/Filter';\nimport { inject, Injectable } from '@angular/core';\nimport { CurrentItemsService } from './currentItems.service';\nimport { intersects } from 'ol/format/filter';\nimport { WKT } from 'ol/format';\nimport GeoJSON from 'ol/format/GeoJSON';\nimport { WfsFeatureCollection } from './wfsSearch.service';\n\n\nexport interface GeometrySearchResponseItem {\n header: string;\n id: string;\n wkt: string;\n url?: string;\n}\n\nexport interface GeometrySearchResponse {\n total: number;\n title: string;\n layer: ILayer;\n items: GeometrySearchResponseItem[];\n}\n\n@Injectable()\nexport class GeometrySearchService extends SearchProviderBase<GeometrySearchResponse, Point | Polygon> {\n\n private _current = inject(CurrentItemsService);\n private _wktFormat = new WKT();\n private geoJsonFormat = new GeoJSON({ dataProjection: 'EPSG:25832', featureProjection: 'EPSG:25832'});\n\n override getSearchableLayers(): ILayer[] {\n return this._current.profile!.layerGroups.flatMap(lg => lg.layers).filter(l => l.wfsSearchable);\n }\n\n override getFilter(searchValue: Point | Polygon, layer: ILayer): Filter {\n return intersects(layer.geometryField, searchValue);\n }\n\n override map(l: ILayer, f: FeatureCollection): GeometrySearchResponse {\n const fc = f as WfsFeatureCollection;\n return {\n title: l.name,\n layer: l,\n total: fc.numberMatched ?? fc.features.length,\n items: f.features.map(f => {\n const olFeature = this.geoJsonFormat.readFeature(f);\n const wkt = this._wktFormat.writeFeature(olFeature as any);\n const url = f.properties && l.geometrySearchExternalUrl && f.properties[l.geometrySearchExternalUrl] ? f.properties[l.geometrySearchExternalUrl] : '';\n const item: GeometrySearchResponseItem = {\n header: l.headerField && f.properties? f.properties[l.headerField] : f.id!,\n wkt,\n id: `${f.id!}`,\n url\n };\n return item;\n })\n }\n }\n\n}","import { Component, inject, Input, OnChanges, OnInit, SimpleChanges } 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, Icon, 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 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 { difference, featureCollection } 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 { 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 { CenterPointService } from '../../services/centerPoint.service';\nimport { OverlapService } from '../../services/overlap.service';\nimport { ZoomService } from '../../services/zoom.service';\nimport { filter, map, Observable, combineLatest } from 'rxjs';\nimport { ShowDocumentInfoService, ShowInfoService } from '../../services/showInfo.service';\nimport { GeometryService } from '../../services/geometry.service';\nimport { PrintHelperService } from '../../services/printHelper.service';\nimport { LayoutService, WidgetPositionOptions } from '../../services/layoutService';\nimport { EventsKey } from 'ol/events';\nimport { SearchProviderService, SearchResponse, SearchResponseItem } from '../../services/searchProvider.service';\nimport { unByKey } from 'ol/Observable';\nimport { BufferOp } from 'jsts/org/locationtech/jts/operation/buffer';\nimport { GeoJSONReader, GeoJSONWriter } from 'jsts/org/locationtech/jts/io';\nimport GeometryFactory from 'jsts/org/locationtech/jts/geom/GeometryFactory';\nimport PrecisionModel from 'jsts/org/locationtech/jts/geom/PrecisionModel';\nimport { IInfoSearchResult } from '../../services/infoSearch.service';\nimport { CowiService } from '../../services/cowi.service';\nimport { ProfileService } from '../../services/profile.service';\nimport { ConfirmDialogService } from '../../services/confirm-dialog.service';\nimport { AddressSearchService } from '../../services/addressSearch.service';\nimport { CadastreSearchService } from '../../services/cadastreSearch.service';\nimport { GeometrySearchResponse, GeometrySearchService } from '../../services/geometrySearch.service';\nimport { WidgetConstants } from '../../models/widget.constants';\n\ninterface DrawItem {\n name: string;\n typeId: string;\n geomType: geometryType;\n style?: string;\n iconUrl?: string;\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]\n})\nexport class ToolboxComponent implements OnInit, OnChanges {\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 _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 _cowiService = inject(CowiService);\n private _overlap = inject(OverlapService);\n private _zoomService = inject(ZoomService);\n private _showInfo = inject(ShowInfoService);\n private _geometryService = inject(GeometryService);\n private _printHelper = inject(PrintHelperService);\n private _layoutService: LayoutService = inject(LayoutService);\n private _searchService = inject(SearchProviderService);\n private _POSITION_STORAGE_KEY = 'toolbox_position';\n private _profileService: ProfileService = inject(ProfileService);\n private _confirmService = inject(ConfirmDialogService);\n private _addressService = inject(AddressSearchService);\n private _cadastreService = inject(CadastreSearchService);\n private _documentSearch = inject(ShowDocumentInfoService);\n private _originalMapWidth: number = 0;\n private _originalMapHeight: number = 0;\n private pointClickKey?: EventsKey;\n private _geometrySearchService = inject(GeometrySearchService);\n\n private drawInteraction?: Draw;\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 bufferInMeters: number = 0;\n selectedSearchMode: 'search-point' | 'search-polygon' = 'search-point';\n selectedMeasureMode: 'measure-distance' | 'measure-area' = 'measure-distance';\n printDrawTool: 'Arrow' | 'Point' | 'LineString' | 'Polygon' | 'Circle' | 'Square' | 'Rectangle' = \"Point\";\n filteredResults: SearchResponse[] = [];\n geometrySearchResult: GeometrySearchResponse[] = [];\n filteredResultsMetadata: IInfoSearchResult[] = [];\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 featureSearchIconBase64 = IconsConstants.featureSearchIconBase64;\n objectSearchCopyIconBase64 = IconsConstants.copyIconBase64;\n objectSearchCopyWithBufferIconBase64 = IconsConstants.copyWithBufferBase64;\n objectSearchCutIconBase64 = IconsConstants.cutIconBase64;\n objectSearchZoomIconBase64 = IconsConstants.zoomIconBase64;\n polygonIconBase64 = IconsConstants.polygonIconBase64;\n lineStringIconBase64 = IconsConstants.lineStringIconBase64;\n printBase64 = IconsConstants.printBase64;\n drawBase64 = IconsConstants.drawBase64;\n fremhaevBase64 = IconsConstants.fremhaevBase64;\n fremhaevSelectedBase64 = IconsConstants.fremhaevSelectedBase64;\n infoBase64 = IconsConstants.infoBase64;\n streetViewBase64 = IconsConstants.streetViewBase64;\n openCowiPageBase64 = IconsConstants.openCowiPageBase64;\n sogPunktBase64 = IconsConstants.sogPunktBase64;\n sogPolygonBase64 = IconsConstants.sogPolygonBase64;\n skrafotoBase64 = IconsConstants.skrafotoBase64;\n downloadFileBase64 = IconsConstants.downloadFileBase64;\n downloadMatriklerBase64 = IconsConstants.downloadMatriklerBase64;\n VaelgLokaliteterBase64 = IconsConstants.VaelgLokaliteterBase64;\n searchDocumentByPolygonBase64 = IconsConstants.searchDocumentByPolygonBase64;\n searchDocumentByPointBase64 = IconsConstants.searchDocumentByPointBase64;\n clipHoleBase64 = IconsConstants.clipHoleBase64;\n splitBase64 = IconsConstants.splitBase64;\n changeTypeBase64 = IconsConstants.changeTypeBase64;\n setCenterBase64 = IconsConstants.setCenterBase64;\n editBase64 = IconsConstants.editBase64;\n mergeBase64 = IconsConstants.mergeBase64;\n drawPrintBase64 = IconsConstants.drawPrintBase64;\n documentSearchBase64 = IconsConstants.documentSearchBase64;\n showInfoObjBase64 = IconsConstants.showInfoObjBase64;\n dragPosition : { x: number; y: number} = { x: 0, y: 0 };\n snap: boolean = true;\n showInputWKT: boolean = false;\n showGeometryTypes: boolean = false;\n drawItems: DrawItem[] | undefined;\n selectedDrawItem: DrawItem | undefined;\n WKTString?: string = '';\n activeMode: 'draw' | 'edit' | 'edit-remove' |\n 'delete' | 'change-type' | 'clip-hole' | 'select-highlight' |\n 'split' | 'measure-area' | 'measure-distance' | 'merge-features' | 'center-point'\n | 'search-feature' | 'search-point' | 'search-polygon' | 'document-search-by-point' | 'document-search-by-polygon'\n | 'show-info' | 'cowi' | 'streetview' |'wkt-input' | 'skrafoto' | 'download-addresses' | 'download-cadastres' | null = null;\n\n activateShowInputWKT(): void {\n this._clearAllInteractions();\n this.showInputWKT = true;\n this.activeMode = 'wkt-input';\n this._active = 'No';\n this.selectedDrawItem = this.selectedDrawItem ?? this.drawItems![0];\n }\n\n cancelWKT(): void {\n this._clearAllInteractions();\n this.showInputWKT = false;\n }\n\n togglePointPolygonSearch(): void {\n const isAlreadyActive =\n this.activeMode === 'search-point' ||\n this.activeMode === 'search-polygon';\n\n if (isAlreadyActive) {\n this._clearAllInteractions();\n this._disablePointSearch();\n this._disablePolygonSearch();\n this.activeMode = null;\n return;\n }\n\n this._clearAllInteractions();\n this.selectedSearchMode = 'search-point';\n this.activeMode = 'search-point';\n this._enablePointSearch();\n }\n\n onSearchModeChanged(event: MatSelectChange): void {\n this._disablePointSearch();\n this._disablePolygonSearch();\n this.filteredResults = [];\n\n if (event.value === 'search-point') {\n this.activeMode = 'search-point';\n this._enablePointSearch();\n } else {\n this.activeMode = 'search-polygon';\n this._enablePolygonSearch();\n }\n }\n\n private _enablePolygonSearch(): void {\n this.geometrySearchResult = [];\n this.drawInteraction = new Draw({\n source: new VectorSource(),\n type: 'Polygon'\n });\n this._interactionHelper.setAsTemp(this.drawInteraction);\n this.map.addInteraction(this.drawInteraction);\n this.drawInteraction.on('drawend', (evt) => {\n this._geometrySearchService.search(evt.feature.getGeometry() as Polygon, this.profile.searchResultLimit).subscribe({\n next: result => {\n this.geometrySearchResult = result.filter(result => result.total > 0);\n }\n })\n });\n }\n\n toggleMeasure(): void {\n const isAlreadyActive =\n this.activeMode === 'measure-distance' ||\n this.activeMode === 'measure-area';\n\n if (isAlreadyActive) {\n this.stopMeasureLength();\n this.stopMeasureArea();\n this._active = 'No';\n this.activeMode = null;\n return;\n }\n\n this._clearAllInteractions();\n this.selectedMeasureMode = 'measure-distance';\n this.activeMode = 'measure-distance';\n this._active = 'Distance';\n this.map.addLayer(this._distanceLayer);\n this.map.addLayer(this._distanceLabelLayer);\n this.map.addInteraction(this._distanceMeasureDraw);\n }\n\n onMeasureModeChanged(event: MatSelectChange): void {\n this.stopMeasureLength();\n this.stopMeasureArea();\n\n if (event.value === 'measure-distance') {\n this.activeMode = 'measure-distance';\n this._active = 'Distance';\n this.map.addLayer(this._distanceLayer);\n this.map.addLayer(this._distanceLabelLayer);\n this.map.addInteraction(this._distanceMeasureDraw);\n } else {\n this.activeMode = 'measure-area';\n this._active = 'Area';\n this.map.addLayer(this._areaLayer);\n this.map.addInteraction(this._areaMeasureDraw);\n }\n }\n\n toggleFeatureSearch(): void {\n if (this.activeMode != 'search-feature') {\n this._clearAllInteractions();\n this.activeMode = 'search-feature';\n this.showGeometryTypes = true;\n this._enablePointSearch();\n } else {\n this.activeMode = null;\n this.showGeometryTypes = false;\n this._disablePointSearch();\n this.filteredResults = [];\n }\n }\n\n togglePointSearch(): void {\n if (this.activeMode != 'search-point') {\n this._clearAllInteractions();\n this._disablePolygonSearch();\n this.activeMode = 'search-point';\n this._enablePointSearch();\n } else {\n this.activeMode = null;\n this._disablePointSearch();\n }\n }\n\n toggleCowiPage(): void {\n if (this.activeMode != 'cowi') {\n this._clearAllInteractions();\n this.activeMode = 'cowi';\n this.pointClickKey = this.map.on('click', evt => {\n this._cowiService.openCowiPageFromPoint(this.settings.cowiUrlTemplate, evt.coordinate);\n })\n } else {\n this.activeMode = null;\n this._clearAllInteractions();\n if (this.pointClickKey) {\n unByKey(this.pointClickKey!);\n this.pointClickKey = undefined;\n }\n }\n }\n\n toggleSkraafotoPage(): void {\n if (this.activeMode != 'skrafoto') {\n this._clearAllInteractions();\n this.activeMode = 'skrafoto';\n this.pointClickKey = this.map.on('click', evt => {\n this._cowiService.openCowiPageFromPoint(this.settings.skraaFotoUrlTemplate, evt.coordinate);\n })\n } else {\n this.activeMode = null;\n this._clearAllInteractions();\n if (this.pointClickKey) {\n unByKey(this.pointClickKey!);\n this.pointClickKey = undefined;\n }\n }\n }\n\n toggleGoogleStreetviewPage(): void {\n if (this.activeMode != 'streetview') {\n this._clearAllInteractions();\n this.activeMode = 'streetview';\n this.pointClickKey = this.map.on('click', evt => {\n this._cowiService.openGoogleStreetViewFromPoint(evt.coordinate);\n })\n } else {\n this.activeMode = null;\n this._clearAllInteractions();\n if (this.pointClickKey) {\n unByKey(this.pointClickKey!);\n this.pointClickKey = undefined;\n }\n }\n }\n\n startDocumentPointSearch(): void {\n this._clearAllInteractions();\n this.activeMode = 'document-search-by-point';\n this._documentSearch.start('point');\n }\n\n startDocumentPolygonSearch(): void {\n this._clearAllInteractions();\n this.activeMode = 'document-search-by-polygon';\n this._documentSearch.start('polygon');\n }\n\n togglePolygonSearch(): void {\n this._disablePointSearch();\n if (this.activeMode != 'search-polygon') {\n if (this.drawInteraction) {\n this.map.removeInteraction(this.drawInteraction);\n this.drawInteraction = undefined;\n }\n this.activeMode = 'search-polygon';\n this._enablePolygonSearch(); // ← use shared method\n } else {\n this._disablePolygonSearch();\n this.activeMode = null;\n }\n }\n\n private _disablePolygonSearch(): void {\n if (this.drawInteraction) {\n this.map.removeInteraction(this.drawInteraction);\n this.drawInteraction = undefined;\n }\n this.geometrySearchResult = [];\n }\n\n private _enablePointSearch(): void {\n if (this.activeMode === 'search-point') this.geometrySearchResult = [];\n this._disablePointSearch();\n this.pointClickKey = this.map.on('singleclick', (evt: { coordinate: any; }) => {\n const point = new Point(evt.coordinate);\n if (this.activeMode === 'search-point') {\n this._geometrySearchService.search(point, this.profile.searchResultLimit).subscribe({\n next: result => this.geometrySearchResult = result.filter(result => result.total > 0)\n }) } else if (this.activeMode === 'search-feature') {\n this._searchService.search(undefined, point)\n .subscribe({\n next: result => {\n this.filteredResults = result.filter(result => result.total > 0);\n }\n }\n );\n }\n });\n }\n\n deleteGeometrySearchItem(result: GeometrySearchResponse, itemId: string, event: MouseEvent): void {\n event.stopPropagation();\n result.items = [...result.items.filter(i => i.id !== itemId)];\n }\n\n deleteAllGeometrySearchItem(): void {\n this.geometrySearchResult = [];\n }\n\n private _disablePointSearch(): void {\n if (this.pointClickKey) {\n unByKey(this.pointClickKey);\n this.pointClickKey = undefined;\n }\n this.geometrySearchResult = [];\n }\n\n openUrl(url: string | null | undefined, event: MouseEvent): void {\n event.stopPropagation();\n if (!url) return;\n\n const localUrl = url.startsWith('http:') || url.startsWith('https:') ? url : `https://${url}`;\n window.open(localUrl, '_blank');\n }\n\n splitBySearchedObject(item: SearchResponseItem, event: MouseEvent): void {\n event.stopPropagation();\n if (!item.wkt) { return; }\n if (!this.selectedDrawItem) { return; }\n const wktFormat = new WKT();\n let feature = wktFormat.readFeature(item.wkt, { featureProjection: 'EPSG:25832', dataProjection: 'EPSG:25832' });\n const geomType = feature.getGeometry()?.getType();\n if (!geomType) { return; }\n combineLatest([this._settingsHelper.getStyle(this.selectedDrawItem?.style!, this.profile.styleRepositoryWorkspace!, this.profile.styleRepositoryGeoserver!, geomType),\n this._overlap.splitByFeature(feature)])\n .subscribe({\n next: ([style, features]) => {\n this._undoRedo.enable();\n features.forEach(feature => {\n this._featureHelper.setTypeId(feature, this.selectedDrawItem?.typeId || '');\n this._featureHelper.setId(feature);\n this._drawLayerService.source.addFeature(feature);\n }\n );\n //Clear results and close tool\n this.activeMode = null;\n this.showGeometryTypes = false;\n this._disablePointSearch();\n this.filteredResults = [];\n }\n });\n }\n\n zoomSearchedObject(item: SearchResponseItem, event: MouseEvent): void {\n event.stopPropagation();\n this.highlight(item.wkt, event);\n }\n\n toggleItemInfo(item: SearchResponseItem, event: MouseEvent): void {\n event.stopPropagation();\n item.showMetadata = !item.showMetadata;\n }\n\n cutBySearchedObject(item: SearchResponseItem, event: MouseEvent): void {\n event.stopPropagation();\n if (!item.wkt) { return; }\n if (!this.selectedDrawItem) { return; }\n const wktFormat = new WKT();\n let feature = wktFormat.readFeature(item.wkt, { featureProjection: 'EPSG:25832', dataProjection: 'EPSG:25832' });\n const geomType = feature.getGeometry()?.getType();\n if (!geomType) { return; }\n combineLatest([this._settingsHelper.getStyle(this.selectedDrawItem?.style!, this.profile.styleRepositoryWorkspace!, this.profile.styleRepositoryGeoserver!, geomType),\n this._overlap.splitByFeature(feature, true)])\n .subscribe({\n next: ([style, features]) => {\n this._undoRedo.enable();\n features.forEach(feature => {\n this._featureHelper.setTypeId(feature, this.selectedDrawItem?.typeId || '');\n this._featureHelper.setId(feature);\n this._drawLayerService.source.addFeature(feature);\n }\n );\n //Clear results and close tool\n this.activeMode = null;\n this.showGeometryTypes = false;\n this._disablePointSearch();\n this.filteredResults = [];\n }\n });\n }\n\n private _bufferGeometry(geometry: Geometry,bufferMeters: number): Geometry {\n const format = new GeoJSON();\n const precisionModel = new PrecisionModel(); // floating precision\n const geometryFactory = new GeometryFactory(precisionModel);\n const reader = new GeoJSONReader(geometryFactory);\n const writer = new GeoJSONWriter();\n\n // Convert OL geometry → GeoJSON → JSTS\n const geoJson = format.writeGeometryObject(geometry);\n const jstsGeom = reader.read(geoJson);\n\n // Create buffer\n const bufferedJstsGeom = BufferOp.bufferOp(jstsGeom, bufferMeters);\n\n // Convert back to OL geometry\n const bufferedGeoJson = writer.write(bufferedJstsGeom);\n return format.readGeometry(bufferedGeoJson);\n }\n\n undo(): void {\n this._undoRedo.undo();\n }\n\n redo(): void {\n this._undoRedo.redo();\n }\n\n toggleShowInfo(): void {\n if (this.activeMode != 'show-info') {\n this._clearAllInteractions();\n this.activeMode = 'show-info';\n this._showInfo.startShowInfo();\n } else {\n this.activeMode = null;\n this._showInfo.stopShowInfo();\n }\n }\n\n onSnapChange(event: Event): void {\n this.snap = (event.target as HTMLInputElement).checked;\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 if (!this.selectedDrawItem) { 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 (featureType !== this.selectedDrawItem!.geomType) {\n const message = `WKT´en kan ikke indlæses, da du har valgt typen ${this._translateGeometryType(this.selectedDrawItem!.geomType)}, men prøver at indlæse en ${this._translateGeometryType(featureType)}.`;\n this._confirmService.open({ message , primaryText: 'Ok', title: 'Advarsel'}).subscribe();\n return;\n }\n this._settingsHelper.getStyle(this.selectedDrawItem?.style!, this.profile.styleRepositoryWorkspace!, this.profile.styleRepositoryGeoserver!, featureType!).subscribe({\n next: featureStyle => {\n if (featureType === 'Polygon') {\n this.handleFeatureValidation(feature).subscribe({\n next: (result) => {\n if (result) {\n result.forEach(feature => {\n feature.setStyle(featureStyle);\n this._featureHelper.setTypeId(feature, this.selectedDrawItem?.typeId || '');\n this._featureHelper.setId(feature);\n });\n\n this._overlap.handleOverlaps(result).pipe(filter(f => !!f)).subscribe({\n next: f => {\n if (f) {\n f.forEach(feature => {\n this._drawLayerService.source.addFeature(feature);\n });\n this._zoomService.zoomToFeatures(f);\n if (f.length > 1) {\n this._confirmService.open({ message: `Den indtegnede flade var ikke gyldig, men rettet til ${f.length} nye flader`, primaryText: 'OK', title: 'Advarsel'}).subscribe();\n }\n }\n }\n });\n } else {\n this._confirmService.open({ message: `Validering af de tegnede flader resulterede i ingen flader`, primaryText: 'OK', title: 'Advarsel'}).subscribe();\n }\n }\n });\n } else {\n feature.setStyle(featureStyle);\n this._featureHelper.setTypeId(feature, this.selectedDrawItem?.typeId || '');\n this._featureHelper.setId(feature);\n\n this._zoomService.zoomToFeatures([feature]);\n this._drawLayerService.source.addFeature(feature);\n }\n }\n })\n } catch (ex) {\n this._confirmService.open({ message: `WKT kunne ikke indlæses - den er muligvis ikke formateret korrekt`, primaryText: 'OK', title: 'Advarsel'}).subscribe();\n }\n }\n\n private _translateGeometryType(type: string): string {\n switch (type.toLowerCase()) {\n case \"point\":\n return \"punkt\";\n case \"multipoint\":\n return \"multipunkt\";\n\n case \"linestring\":\n return \"linje\";\n case \"multilinestring\":\n return \"multilinje\";\n\n case \"polygon\":\n return \"polygon\";\n case \"multipolygon\":\n return \"multipolygon\";\n\n case \"geometrycollection\":\n return \"geometrisamling\";\n\n default:\n return type; // fallback: returnér originalen\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 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 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 startDrawPointUrl(url: string, typeId: string): void {\n this._clearAllInteractions();\n const style = new Style({\n image: new Icon({\n src: url,\n scale: 1,\n anchor: [0.5, 1],\n anchorXUnits: 'fraction',\n anchorYUnits: 'fraction'\n })\n })\n const drawInteraction = new Draw({\n type: 'Point',\n source: new VectorSource(),\n style\n });\n this.showGeometryTypes = true;\n drawInteraction.on('drawend', evt => {\n const feature = evt.feature.clone();\n this._featureHelper.setId(feature);\n this._featureHelper.setTypeId(feature, typeId)\n feature.setStyle(style);\n this._drawLayerService.source.addFeature(feature);\n });\n this._interactionHelper.setAsTemp(drawInteraction);\n this.map.addInteraction(drawInteraction);\n\n }\n\n startDraw(): void {\n this.activeMode = 'draw';\n // Set the first item as default\n if (!this.selectedDrawItem && this.drawItems && this.drawItems.length > 0) {\n this.selectedDrawItem = this.drawItems[0];\n }\n // Actually start drawing immediately\n if (this.selectedDrawItem) {\n this._doStartDraw(this.selectedDrawItem!);\n }\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 startDelete(): void {\n this._clearAllInteractions();\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 filter: f => !this._featureHelper.isLocked(f),\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 highlight(wkt: string, event: MouseEvent): void {\n event.stopPropagation();\n this._highlight.highlight(wkt);\n }\n\n addToActiveObjectsList(item: SearchResponseItem, event: MouseEvent, withBuffer: boolean = false): void {\n event.stopPropagation();\n if (!item.wkt) { return; }\n if (!this.selectedDrawItem) { return; }\n const wktFormat = new WKT();\n let feature = wktFormat.readFeature(item.wkt, { featureProjection: 'EPSG:25832', dataProjection: 'EPSG:25832' });\n if (withBuffer) {\n const bufferedGeometry = this._bufferGeometry(\n feature.getGeometry()!,\n this.bufferInMeters\n );\n feature = new Feature({ geometry: bufferedGeometry });\n }\n const geomType = feature.getGeometry()?.getType();\n if (!geomType) { return; }\n combineLatest([this.handleFeatureValidation(feature),this._settingsHelper.getStyle(this.selectedDrawItem.style!, this.profile.styleRepositoryWorkspace!, this.profile.styleRepositoryGeoserver!, geomType)])\n .subscribe({\n next: ([validationResult, featureStyle]) => {\n if (validationResult) {\n validationResult.forEach(feature => {\n feature.setStyle(featureStyle);\n this._featureHelper.setTypeId(feature, this.selectedDrawItem?.typeId! || '');\n this._featureHelper.setId(feature);\n });\n\n this._overlap.handleOverlaps(validationResult).pipe(filter(f => !!f)).subscribe({\n next: f => {\n if (f) {\n f.forEach(feature => {\n this._undoRedo.enable();\n this._drawLayerService.source.addFeature(feature);\n });\n this._zoomService.zoomToFeatures(f);\n if (f.length > 1) {\n this._confirmService.open({ message: `Den indtegnede flade var ikke gyldig, men rettet til ${f.length} nye flader`, primaryText: 'OK', title: 'Advarsel'}).subscribe();\n }\n //Clear results and close tool\n this.activeMode = null;\n this.showGeometryTypes = false;\n this._disablePointSearch();\n this.filteredResults = [];\n }\n }\n });\n } else {\n this._confirmService.open({ message: `Validering af de tegnede flader resulterede i ingen flader`, primaryText: 'OK', title: 'Advarsel'}).subscribe();\n }\n }\n }\n );\n }\n\n startEdit(): void {\n this._clearAllInteractions();\n this.activeMode = 'edit';\n const modify = new Modify({\n source: this._drawLayerService.source, \n filter: (f: Feature) => { \n return !this._featureHelper.isLocked(f); \n },\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) => {\n \n this._undoRedo.enable();\n evt.features.forEach(f => {\n f.set('updated', new Date().toISOString());\n const geom = f.getGeometry();\n if (geom && geom.getType() === 'Polygon') {\n //START VALIDATING\n this.handleFeatureValidation(f).subscribe({\n next: (result) => {\n if (result && result.length > 0) {\n const featureStyle = f.getStyle();\n const featureTypeId = this._featureHelper.typeId(f);\n this._drawLayerService.source.removeFeature(f);\n\n const idsToExcludeFromOverlap: string [] = [];\n result.forEach(feature => {\n feature.setStyle(featureStyle);\n this._featureHelper.setTypeId(feature, featureTypeId || '');\n this._featureHelper.setId(feature);\n idsToExcludeFromOverlap.push(`${feature.getId()}`); // Don't check these for overlap\n this._drawLayerService.source.addFeature(feature);\n });\n\n // Don't check for overlap with the feature being updated.\n this._overlap.handleOverlaps(result, idsToExcludeFromOverlap).pipe(filter(f => !!f)).subscribe({\n next: f => {\n if (f) {\n f.forEach(feature => {\n this._drawLayerService.source.addFeature(feature);\n });\n\n if (f.length > 1) {\n this._confirmService.open({ message: `Den indtegnede flade var ikke gyldig, men rettet til ${f.length} nye flader`, primaryText: 'OK', title: 'Advarsel'}).subscribe();\n }\n }\n }\n });\n } else {\n this._confirmService.open({ message: `Validering af de tegnede flader resulterede i ingen flader`, primaryText: 'OK', title: 'Advarsel'}).subscribe();\n }\n }\n });\n //END VALIDATING\n }\n });\n });\n\n this._interactionHelper.setAsTemp(modify);\n this.map.addInteraction(modify);\n }\n\n private _startDraw(geomType: geometryType, style: string, typeId: string): void {\n this._clearAllInteractions();\n this._settingsHelper.getStyle(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 if (geomType === 'Polygon') {\n // Validate feature\n this.handleFeatureValidation(evt.feature).subscribe({\n next: (result) => {\n if (result) {\n result.forEach(feature => {\n this._featureHelper.setTypeId(feature, typeId);\n this._featureHelper.setId(feature);\n feature.setStyle(style);\n });\n\n this._overlap.handleOverlaps(result).pipe(filter(f => !!f)).subscribe({\n next: f => {\n if (f) {\n f.forEach(feature => {\n this._undoRedo.enable();\n this._drawLayerService.source.addFeature(feature);\n });\n\n if (f.length > 1) {\n this._confirmService.open({ message: `Den indtegnede flade var ikke gyldig, men rettet til ${f.length} nye flader`, primaryText: 'OK', title: 'Advarsel'}).subscribe();\n }\n }\n }\n });\n } else {\n this._confirmService.open({ message: 'Validering af de tegnede flader resulterede i ingen flader', primaryText: 'OK', title: 'Advarsel'}).subscribe();\n }\n }\n });\n } else {\n this._featureHelper.setTypeId(evt.feature, typeId);\n this._featureHelper.setId(evt.feature);\n evt.feature.setStyle(style);\n this._undoRedo.enable();\n this._drawLayerService.source.addFeature(evt.feature);\n }\n });\n this._interactionHelper.setAsTemp(drawInteraction);\n this.map.addInteraction(drawInteraction);\n this._addSnap();\n this.map.getTargetElement().style.cursor = 'crosshair'; // Placeholder for now\n }\n })\n } \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: 'rgba(128, 128, 128, 0.5)' // grey med 50% opacity\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 // 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 positionPoint = coords[0];\n const formattedTotal = `${totalLength.toFixed(2)} m`;\n const totalFeature = new Feature({\n geometry: new Point(positionPoint),\n label: `Total: ${formattedTotal}`\n });\n\n this._distanceLabelSource.addFeature(totalFeature);\n }\n });\n });\n }\n\n private _clearAllInteractions(): void {\n this._interactionHelper.clearTempFromMap(); \n this._highlight.clear();\n this.stopMeasureArea();\n this.stopMeasureLength();\n if (this.pointClickKey) {\n unByKey(this.pointClickKey!);\n }\n this._disablePointSearch()\n this._documentSearch.stop();\n this._showInfo.stopShowInfo();\n }\n\n ngOnInit(): void {\n this._originalMapHeight = this.map.getSize()![1];\n this._originalMapWidth = this.map.getSize()![0];\n this._layoutService.mapResizedSubject.subscribe(async (mapResized) => {\n //Map resized, make sure it stays in viewport\n this.dragPosition = await this._layoutService.keepWidgetInViewPort(this.dragPosition, this._POSITION_STORAGE_KEY,\n WidgetConstants.toolboxHeight, WidgetConstants.toolboxWidth, this.mapHeight, this.mapWidth);\n })\n\n this.drawItems = [];\n (this.settings.geometryTypeSettings ?? []).filter(f => f.availableGeometryTypes).forEach(geomSetting => {\n geomSetting.availableGeometryTypes!.forEach(geomType => {\n if (geomType === 'Point' && geomSetting.icons && geomSetting.icons.length > 0) {\n geomSetting.icons.forEach(i => {\n this.drawItems!.push({ name: geomSetting.typeName, iconUrl: i, style: geomSetting.style, typeId: geomSetting.typeId, geomType });\n })\n } else {\n this.drawItems!.push({\n name: `${geomSetting.typeName}${(geomSetting.availableGeometryTypes!.length > 1 ? `(${geomType})` : '')}` ,\n typeId: geomSetting.typeId,\n style: geomSetting.style,\n geomType })\n }\n });\n });\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 }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['profile'] && this.profile) {\n this.collapsed = this.profile.toolbarCollapsed;\n this._loadPosition(this.collapsed); \n this._loadDefaultToolIfNeeded();\n }\n }\n\n startDownloadCasdatres(): void {\n this._startDownload('cadastre');\n }\n\n startDownloadAddresses(): void {\n this._startDownload('address');\n }\n\n private _loadDefaultToolIfNeeded(): void {\n if (this.profile && this.profile.defaultTool) {\n switch (this.profile.defaultTool) {\n case 'Vælg og vis objektdata i træstruktur': this.toggleShowInfo(); return;\n case 'Download adresser': this.startDownloadAddresses(); return;\n case 'Download matrikler': this.startDownloadCasdatres(); return;\n case 'Vælg Lokaliteter ved udpegning i kortet': this.togglePointPolygonSearch(); return;\n case 'Dokument fra punkt': this.startDocumentPointSearch(); return;\n case 'Dokumenter fra polygon': this.startDocumentPolygonSearch(); return;\n case 'Fremhæv aktivt objekt i listen': this.startSelectFeatureHighlight(); return;\n case 'Indsæt eller flyt punkter i flade/linje': this.startEdit(); return;\n case 'Skift status på element': this.startChangeType(); return;\n case 'Sæt centerpunkt': this.setCenterPoint(); return;\n case 'Vælg og vis emner i listen': this.toggleFeatureSearch(); return;\n case 'Tegn element': this.startDraw(); return;\n case 'Indsæt WKT streng for at importere elementet': this.activateShowInputWKT(); return;\n case 'Mål afstand / areal': this.toggleMeasure(); return;\n default: return; // do nothing\n }\n }\n }\n\n private _startDownload(downloadType: 'address' | 'cadastre'): void {\n this._clearAllInteractions();\n this.activeMode = downloadType === 'address' ? 'download-addresses' : 'download-cadastres';\n\n const drawDownloadArea = new Draw({\n type: 'Polygon',\n stopClick: true\n });\n this._interactionHelper.setAsTemp(drawDownloadArea);\n\n drawDownloadArea.on('drawend', evt => {\n\n const geom = evt.feature.getGeometry() as Polygon;\n if (geom) {\n const coordinates = geom.getCoordinates();\n if (downloadType === 'address') {\n this._addressService.download(JSON.stringify(coordinates));\n } else {\n this._cadastreService.download(JSON.stringify(coordinates));\n }\n }\n this._clearAllInteractions();\n });\n this.map.addInteraction(drawDownloadArea);\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 drawItemChanged(item: MatSelectChange<DrawItem>): void {\n if (this.activeMode === 'merge-features') {\n\n this._mergeService.startMerge(this.selectedDrawItem!.typeId, () => { this.activeMode = null; });\n return;\n }\n if (this.activeMode === 'draw') this._doStartDraw(item.value);\n }\n\n private _doStartDraw(item: DrawItem): void {\n if (item.iconUrl) {\n this.startDrawPointUrl(item.iconUrl, item.typeId);\n } else {\n this._startDraw(item.geomType, item.style!, item.typeId);\n }\n\n }\n\n private async _loadPosition(collapsed: boolean): Promise<void> {\n try {\n // Default height and width when collapsed\n let widgetHeight: number = WidgetConstants.collapsedHeight;\n let widgetWidth: number = WidgetConstants.collapsedWidth;\n if (!collapsed) {\n // Custom height and width when expanded\n widgetHeight = WidgetConstants.toolboxHeight;\n widgetWidth = WidgetConstants.toolboxWidth;\n }\n const container = this.map.getViewport();\n const widgetPositionOptions: WidgetPositionOptions = {\n initialPosition: this.profile.toolboxInitialPosition,\n widgetName: this._POSITION_STORAGE_KEY,\n widgetHeight: widgetHeight,\n widgetWidth: widgetWidth,\n }\n const savedPosition = localStorage.getItem(this._POSITION_STORAGE_KEY);\n if (this._profileService.getProfileVersionChanged() &&\n this.profile?.toolboxInitialPosition) {\n //Profile version changed in backend, use that\n this.dragPosition = await this._layoutService.calculateWidgetPosition(widgetPositionOptions);\n } else if (savedPosition) {\n this.dragPosition = JSON.parse(savedPosition);\n } else if (this.profile?.toolboxInitialPosition) {\n this.dragPosition = await this._layoutService.calculateWidgetPosition(widgetPositionOptions);\n } else {\n // Default position for toolbox\n this.dragPosition = { x: WidgetConstants.toolboxDefaultX, y: WidgetConstants.toolboxDefaultY };\n this._savePosition();\n }\n } catch (error) {\n console.error('Error loading position from localStorage:', error);\n this.dragPosition = { x: 0, y: 0 };\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.error('Error saving position to localStorage:', error);\n }\n }\n\n startMergeFeatures(): void {\n this._clearAllInteractions();\n this.activeMode = 'merge-features'\n this._mergeService.startMerge(this.selectedDrawItem!.typeId, () => { this.activeMode = null });\n }\n\n startChangeType(): void {\n this._clearAllInteractions();\n this.activeMode = 'change-type';\n\n // Make sure the selected draw item is set, if at all possible.\n this.selectedDrawItem = this.selectedDrawItem ?? this.drawItems?.find(d => d.geomType === 'Polygon');\n if (!this.selectedDrawItem) { \n return; \n }\n\n const changeTypeSelect = new Select({ \n layers: [this._drawLayerService.layer],\n filter: f => !this._featureHelper.isLocked(f) && f.getGeometry()?.getType() === this.selectedDrawItem?.geomType && this._featureHelper.typeId(f) !== this.selectedDrawItem?.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.selectedDrawItem?.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.selectedDrawItem?.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 async toggleCollapsed(event?: MouseEvent): Promise<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 if (!this.collapsed) {\n //Expanding, make sure it stays in viewport\n this.dragPosition = await this._layoutService.keepWidgetInViewPort(this.dragPosition, this._POSITION_STORAGE_KEY,\n WidgetConstants.toolboxHeight, WidgetConstants.toolboxWidth);\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 this.showInputWKT = false;\n this.activeMode = null;\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 this._layoutService.map = this.map;\n this._layoutService.mapResizedSubject.next(true);\n }\n\n doPrint(): void {\n let htmlElement = this.map.getViewport();\n this._printHelper.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._printHelper.setVisibiltyOnDOMElements(htmlElement, true);\n });\n }\n\n startSelectFeatureHighlight(): void {\n\n if (this.activeMode === 'select-highlight') { return; }\n this._clearAllInteractions();\n this.activeMode = 'select-highlight';\n const highlightSelect = new Select({\n layers: [this._drawLayerService.layer],\n style: null // Leave this as null. Undefined won't do. If it's anything but null, it will change the style of the selected feature and that will be part of undo/redo.\n });\n this._interactionHelper.setAsTemp(highlightSelect);\n highlightSelect.on('select', evt => {\n this._drawLayerService.setFeaturesSelectedForHighlight(evt.selected);\n });\n this.map.addInteraction(highlightSelect);\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 this._clearAllInteractions();\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 private handleFeatureValidation(feature: Feature<Geometry>): Observable<Feature<Geometry>[] | undefined> {\n const wktFormat = new WKT();\n const wkt = wktFormat.writeFeature(feature);\n return this._geometryService.validate(wkt)\n .pipe(map(result => {\n return result.correctedGeometries?.map(wkt => wktFormat.readFeature(wkt));\n }));\n }\n}","<div class=\"toolbox-wrapper global-wrapper-container\" \n cdkDrag \n cdkDragBoundary=\".map-container\"\n [cdkDragFreeDragPosition]=\"dragPosition\"\n (cdkDragEnded)=\"onDragEnded($event)\"\n [class.collapsed]=\"collapsed\">\n <div class=\"drag-handle-toolbox\" cdkDragHandle>\n <mat-icon \n class=\"icon-left\" \n matTooltip=\"Værktøjskasse\" \n [matTooltipShowDelay]=\"500\"\n [matTooltipHideDelay]=\"100\" \n matTooltipPosition=\"above\">\n handyman\n </mat-icon> \n <div class=\"right-icons\"> \n <mat-icon class=\"toggle-icon\" (click)=\"toggleCollapsed($event)\">\n {{ collapsed ? 'flip_to_front' : 'remove' }}\n </mat-icon>\n </div>\n </div>\n \n <div class=\"toolbox-container\">\n @if(!collapsed) {\n <div class=\"toolbox-content\">\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=\"Gendan\" \n [matTooltipShowDelay]=\"200\"\n [matTooltipHideDelay]=\"300\" \n matTooltipClass=\"custom-tooltip\"\n matTooltipPosition=\"below\"\n alt=\"Redo\">\n }\n @if (settings.externalHelpUrl) {\n <img \n [src]=\"infoBase64\" \n class=\"compact-icon custom-image-icon\"\n (click)=\"openUrl(settings.externalHelpUrl, $event)\"\n matTooltip=\"Vejledning til anvendelse af systemet\" \n [matTooltipShowDelay]=\"200\"\n [matTooltipHideDelay]=\"300\" \n matTooltipClass=\"custom-tooltip\"\n matTooltipPosition=\"below\"\n alt=\"Vejledning til anvendelse af systemet\">\n } \n <img \n [src]=\"showInfoObjBase64\" \n class=\"compact-icon custom-image-icon\"\n (click)=\"toggleShowInfo()\" \n [class.active]=\"activeMode === 'show-info'\"\n matTooltip=\"Vælg og vis objektdata i træstruktur\" \n [matTooltipShowDelay]=\"200\"\n [matTooltipHideDelay]=\"300\" \n matTooltipClass=\"custom-tooltip\"\n matTooltipPosition=\"below\"\n alt=\"Vælg og vis objektdata i træ struktur\">\n <img \n [src]=\"downloadFileBase64\" \n class=\"compact-icon custom-image-icon\"\n (click)=\"startDownloadAddresses()\" \n [class.active]=\"activeMode === 'download-addresses'\"\n matTooltip=\"Download adresser\" \n [matTooltipShowDelay]=\"200\"\n [matTooltipHideDelay]=\"300\" \n matTooltipClass=\"custom-tooltip\"\n matTooltipPosition=\"below\"\n alt=\"Download adresser\">\n <img \n [src]=\"downloadMatriklerBase64\" \n class=\"compact-icon custom-image-icon\"\n (click)=\"startDownloadCasdatres()\" \n [class.active]=\"activeMode === 'download-cadastres'\"\n matTooltip=\"Download matrikler\" \n [matTooltipShowDelay]=\"200\"\n [matTooltipHideDelay]=\"300\" \n matTooltipClass=\"custom-tooltip\"\n matTooltipPosition=\"below\"\n alt=\"Download matrikler\">\n\n <img \n [src]=\"splitIconBase64\" \n class=\"compact-icon custom-image-icon\"\n (click)=\"togglePointPolygonSearch()\"\n [class.active]=\"activeMode === 'search-point' || activeMode === 'search-polygon'\"\n matTooltip=\"Vælg Lokaliteter ved udpegning i kortet\" \n [matTooltipShowDelay]=\"200\"\n [matTooltipHideDelay]=\"300\" \n matTooltipClass=\"custom-tooltip\"\n matTooltipPosition=\"below\"\n alt=\"Vælg Lokaliteter ved udpegning i kortet\">\n @if (settings.showDocumentSearch) {\n\n <img \n [src]=\"documentSearchBase64\" \n class=\"compact-icon custom-image-icon\"\n (click)=\"startDocumentPointSearch()\"\n [class.active]=\"activeMode === 'document-search-by-point'\"\n matTooltip=\"Dokument fra punkt\" \n [matTooltipShowDelay]=\"200\"\n [matTooltipHideDelay]=\"300\" \n matTooltipClass=\"custom-tooltip\"\n matTooltipPosition=\"below\"\n alt=\"Dokument fra punkt\">\n\n <img \n [src]=\"documentSearchBase64\" \n class=\"compact-icon custom-image-icon\"\n (click)=\"startDocumentPolygonSearch()\"\n [class.active]=\"activeMode === 'document-search-by-polygon'\"\n matTooltip=\"Dokumenter fra polygon\" \n [matTooltipShowDelay]=\"200\"\n [matTooltipHideDelay]=\"300\" \n matTooltipClass=\"custom-tooltip\"\n matTooltipPosition=\"below\"\n alt=\"Dokumenter fra polygon\">\n }\n @if (settings.cowiUrlTemplate) {\n <img \n [src]=\"openCowiPageBase64\" \n class=\"compact-icon custom-image-icon\"\n [class.active]=\"activeMode === 'cowi'\"\n (click)=\"toggleCowiPage()\" \n matTooltip=\"COWI´s Gadefoto\" \n [matTooltipShowDelay]=\"200\"\n [matTooltipHideDelay]=\"300\" \n matTooltipClass=\"custom-tooltip\"\n matTooltipPosition=\"below\"\n alt=\"COWI´s Gadefoto\">\n }\n @if (settings.skraaFotoUrlTemplate) {\n <img \n [src]=\"skrafotoBase64\" \n class=\"compact-icon custom-image-icon\"\n [class.active]=\"activeMode === 'skrafoto'\"\n (click)=\"toggleSkraafotoPage()\" \n matTooltip=\"Opslag på Skråfotos\" \n [matTooltipShowDelay]=\"200\"\n [matTooltipHideDelay]=\"300\" \n matTooltipClass=\"custom-tooltip\"\n matTooltipPosition=\"below\"\n alt=\"Skråfoto\">\n }\n <img \n [src]=\"streetViewBase64\" \n class=\"compact-icon custom-image-icon\"\n [class.active]=\"activeMode === 'streetview'\"\n (click)=\"toggleGoogleStreetviewPage()\" \n matTooltip=\"Google Streetview\" \n [matTooltipShowDelay]=\"200\"\n [matTooltipHideDelay]=\"300\" \n matTooltipClass=\"custom-tooltip\"\n matTooltipPosition=\"below\"\n alt=\"Google Streetview\">\n <img \n [src]=\"fremhaevBase64\" \n class=\"compact-icon custom-image-icon\"\n [class.active]=\"activeMode === 'select-highlight'\"\n (click)=\"startSelectFeatureHighlight()\" \n matTooltip=\"Fremhæv aktivt objekt i listen\" \n [matTooltipShowDelay]=\"200\"\n [matTooltipHideDelay]=\"300\" \n matTooltipClass=\"custom-tooltip\"\n matTooltipPosition=\"below\"\n alt=\"Fremhæv\">\n @if (activeMode === 'draw' || activeMode === 'edit' || activeMode === 'edit-remove' || activeMode === 'search-feature' ||\n activeMode === 'clip-hole' || activeMode === 'split' || activeMode === 'merge-features') {\n <label class=\"snap-toggle\">\n <input type=\"checkbox\" [checked]=\"snap\" (change)=\"onSnapChange($event)\">\n Snap\n </label> \n } \n @if(settings.editEnabled) {\n <img \n [src]=\"editBase64\" \n [class.active]=\"activeMode === 'edit'\" \n class=\"compact-icon custom-image-icon\"\n (click)=\"startEdit()\" \n matTooltip=\"Indsæt eller flyt punkter i flade/linje\" \n [matTooltipShowDelay]=\"200\"\n [matTooltipHideDelay]=\"300\" \n matTooltipClass=\"custom-tooltip\"\n matTooltipPosition=\"below\"\n alt=\"Indsæt eller flyt punkter i flade/linje\">\n <img \n [src]=\"deleteIconBase64\" \n [class.active]=\"activeMode === 'edit-remove'\" \n class=\"compact-icon custom-image-icon\"\n (click)=\"startEditRemovePoints()\" \n matTooltip=\"Slet punkter i flade/linje\" \n [matTooltipShowDelay]=\"200\"\n [matTooltipHideDelay]=\"300\" \n matTooltipClass=\"custom-tooltip\"\n matTooltipPosition=\"below\"\n alt=\"Slet punkter i flade/linje\">\n }\n @if(settings.cutHoleEnabled) {\n <img \n [src]=\"clipHoleBase64\" \n class=\"compact-icon custom-image-icon\"\n [class.active]=\"activeMode === 'clip-hole'\" \n (click)=\"clipHole()\" \n matTooltip=\"Klip hul i flade\" \n [matTooltipShowDelay]=\"200\"\n [matTooltipHideDelay]=\"300\" \n matTooltipClass=\"custom-tooltip\"\n matTooltipPosition=\"below\"\n alt=\"Klip hul i flade\">\n }\n @if(settings.splitEnabled) {\n <img \n [src]=\"splitBase64\" \n class=\"compact-icon custom-image-icon\"\n [class.active]=\"activeMode === 'split'\"\n (click)=\"split()\" \n matTooltip=\"Del et element\" \n [matTooltipShowDelay]=\"200\"\n [matTooltipHideDelay]=\"300\" \n matTooltipClass=\"custom-tooltip\"\n matTooltipPosition=\"below\"\n alt=\"Del et element\">\n }\n @if(settings.changeTypeEnabled) {\n <img \n [src]=\"changeTypeBase64\" \n class=\"compact-icon custom-image-icon\" \n [class.active]=\"activeMode === 'change-type'\" \n (click)=\"startChangeType()\"\n [matTooltipShowDelay]=\"200\"\n matTooltipClass=\"custom-tooltip\"\n [matTooltipHideDelay]=\"300\" \n matTooltip=\"Skift status på element\" \n alt=\"Skift status på element\" \n matTooltipPosition=\"below\">\n }\n @if(settings.mergeEnabled) {\n <img \n [src]=\"mergeBase64\"\n class=\"compact-icon custom-image-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 }\n @if(settings.centerPoint) {\n <img \n [src]=\"setCenterBase64\" \n [class.active]=\"activeMode === 'center-point'\" \n class=\"compact-icon custom-image-icon\"\n (click)=\"setCenterPoint()\" \n matTooltip=\"Sæt centerpunkt\" \n [matTooltipShowDelay]=\"200\"\n [matTooltipHideDelay]=\"300\" \n matTooltipClass=\"custom-tooltip\"\n matTooltipPosition=\"below\"\n alt=\"Sæt centerpunkt\">\n }\n </div>\n <div class=\"geometry-tools\">\n <img \n [src]=\"sogPolygonBase64\" \n [class.active]=\"activeMode === 'search-feature'\"\n class=\"compact-icon custom-image-icon\"\n (click)=\"toggleFeatureSearch()\" \n matTooltip=\"Vælg og vis emner i listen\" \n [matTooltipShowDelay]=\"200\"\n [matTooltipHideDelay]=\"300\" \n matTooltipClass=\"custom-tooltip\"\n matTooltipPosition=\"below\"\n alt=\"Vælg og vis emner i listen\">\n\n <img \n [src]=\"drawBase64\" \n [class.active]=\"activeMode === 'draw'\"\n class=\"compact-icon custom-image-icon\"\n (click)=\"startDraw()\"\n matTooltip=\"Tegn element\" \n [matTooltipShowDelay]=\"200\"\n [matTooltipHideDelay]=\"300\" \n matTooltipClass=\"custom-tooltip\"\n matTooltipPosition=\"below\"\n alt=\"Tegn element\">\n @if(settings.WKTInputEnabled) {\n <img \n [src]=\"wktIconBase64\" \n class=\"compact-icon custom-image-icon\"\n [class.active]=\"activeMode === 'wkt-input'\"\n (click)=\"activateShowInputWKT()\" \n matTooltip=\"Indsæt WKT streng for at importere elementet\" \n [matTooltipShowDelay]=\"200\"\n [matTooltipHideDelay]=\"300\" \n matTooltipClass=\"custom-tooltip\"\n matTooltipPosition=\"below\"\n alt=\"Indsæt WKT streng for at importere elementet\">\n }\n </div>\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 element\" \n [matTooltipShowDelay]=\"200\"\n [matTooltipHideDelay]=\"300\" \n matTooltipClass=\"custom-tooltip\"\n matTooltipPosition=\"below\"\n alt=\"Slet element\">\n }\n <img \n [src]=\"measureDistanceIconBase64\" \n class=\"compact-icon custom-image-icon\"\n (click)=\"toggleMeasure()\"\n [class.active]=\"activeMode === 'measure-distance' || activeMode === 'measure-area'\"\n matTooltip=\"Mål afstand / areal\" \n [matTooltipShowDelay]=\"200\"\n [matTooltipHideDelay]=\"300\" \n matTooltipClass=\"custom-tooltip\"\n matTooltipPosition=\"below\"\n alt=\"Mål\">\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=\"Skærmprint af kortet\" \n [matTooltipShowDelay]=\"200\"\n [matTooltipHideDelay]=\"300\" \n matTooltipClass=\"custom-tooltip\"\n matTooltipPosition=\"below\"\n alt=\"Skærmprint af kortet\">\n <img \n [src]=\"drawPrintBase64\" \n class=\"compact-icon custom-image-icon\"\n [class.active]=\"active === 'PrintDraw'\"\n (click)=\"startDrawMode()\" \n matTooltip=\"Tegneværktøj til print\" \n [matTooltipShowDelay]=\"200\"\n [matTooltipHideDelay]=\"300\" \n matTooltipClass=\"custom-tooltip\"\n matTooltipPosition=\"below\"\n alt=\"Tegneværktøj til print\">\n </div>\n }\n </div>\n </div>\n @if (activeMode === 'draw' || activeMode === 'search-feature' || activeMode === 'wkt-input'\n || activeMode === 'change-type' || activeMode === 'merge-features') {\n <mat-select class=\"geometry-selector\" (selectionChange)=\"drawItemChanged($event)\" [(ngModel)]=\"selectedDrawItem\"> \n @for (drawItem of drawItems; track drawItem) {\n @if(activeMode !== 'merge-features' || drawItem.geomType === 'Polygon') {\n <mat-option [value]=\"drawItem\">{{drawItem.name}} <img *ngIf=\"drawItem.iconUrl\" class=\"compact-icon custom-image-icon\" [src]=\"drawItem.iconUrl\"></mat-option>\n }\n }\n </mat-select> \n }\n @if(showInputWKT && activeMode === 'wkt-input') {\n <div class=\"wkt-section\">\n <input matInput class=\"compact-input\" placeholder=\"Indsæt WKT-streng\" [(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 matTooltip=\"Skærmprint af kortet\" \n [matTooltipShowDelay]=\"200\"\n [matTooltipHideDelay]=\"300\" \n [src]=\"printBase64\" \n class=\"compact-icon custom-image-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 @if (activeMode === 'search-point' || activeMode === 'search-polygon') {\n <mat-select \n class=\"search-point-polygon-selector\" \n [(ngModel)]=\"selectedSearchMode\"\n (selectionChange)=\"onSearchModeChanged($event)\">\n <mat-option value=\"search-point\">Søg med punkt</mat-option>\n <mat-option value=\"search-polygon\">Søg med polygon</mat-option>\n </mat-select>\n }\n \n @if (activeMode === 'measure-distance' || activeMode === 'measure-area') {\n <mat-select \n class=\"geometry-selector\"\n [(ngModel)]=\"selectedMeasureMode\"\n (selectionChange)=\"onMeasureModeChanged($event)\">\n <mat-option value=\"measure-distance\">Mål afstand</mat-option>\n <mat-option value=\"measure-area\">Mål areal</mat-option>\n </mat-select>\n }\n }\n </div>\n @if (activeMode === 'search-feature' && filteredResults.length > 0) {\n <div class=\"geometry-search-panel\">\n <div class=\"buffer-item\">\n <mat-label>Buffer</mat-label>\n <input matInput type=\"number\" name=\"buffer\" [(ngModel)]=\"bufferInMeters\">\n <mat-label>m</mat-label>\n </div>\n <mat-option *ngFor=\"let result of filteredResults\" [value]=\"result\" class=\"search-result-option\">\n <span class=\"result-title\">\n {{ result.title }} ({{result.items.length}} af {{ result.total }})\n </span>\n <div (click)=\"highlight(item.wkt, $event)\" *ngFor=\"let item of result.items\" class=\"search-result-item\">\n <div class=\"item-left\">\n <span class=\"item-header\"> {{item.header}} </span> \n </div>\n <div class=\"item-right\">\n <img \n [src]=\"objectSearchCopyIconBase64\" \n class=\"compact-icon custom-image-icon\"\n (click)=\"addToActiveObjectsList(item, $event)\" \n matTooltip=\"Kopier\" \n [matTooltipShowDelay]=\"200\"\n [matTooltipHideDelay]=\"300\" \n matTooltipClass=\"custom-tooltip\"\n matTooltipPosition=\"below\"\n alt=\"Kopier\">\n <img \n [src]=\"objectSearchCutIconBase64\" \n class=\"compact-icon custom-image-icon\"\n (click)=\"cutBySearchedObject(item, $event)\" \n matTooltip=\"Fjern\" \n [matTooltipShowDelay]=\"200\"\n [matTooltipHideDelay]=\"300\" \n matTooltipClass=\"custom-tooltip\"\n matTooltipPosition=\"below\"\n alt=\"Fjern\">\n <img \n [src]=\"objectSearchCutIconBase64\" \n class=\"compact-icon custom-image-icon\"\n (click)=\"splitBySearchedObject(item, $event)\" \n matTooltip=\"Opskær\" \n [matTooltipShowDelay]=\"200\"\n [matTooltipHideDelay]=\"300\" \n matTooltipClass=\"custom-tooltip\"\n matTooltipPosition=\"below\"\n alt=\"Opskær\">\n <img \n [src]=\"objectSearchCopyWithBufferIconBase64\" \n class=\"compact-icon custom-image-icon\"\n (click)=\"addToActiveObjectsList(item, $event, true)\" \n matTooltip=\"Kopier med buffer\" \n [matTooltipShowDelay]=\"200\"\n [matTooltipHideDelay]=\"300\" \n matTooltipClass=\"custom-tooltip\"\n matTooltipPosition=\"below\"\n alt=\"Kopier med buffer\">\n <img \n [src]=\"objectSearchZoomIconBase64\" \n class=\"compact-icon custom-image-icon\"\n (click)=\"zoomSearchedObject(item, $event)\" \n matTooltip=\"Zoom\" \n [matTooltipShowDelay]=\"200\"\n [matTooltipHideDelay]=\"300\" \n matTooltipClass=\"custom-tooltip\"\n matTooltipPosition=\"below\"\n alt=\"Zoom\">\n <img \n [src]=\"infoBase64\" \n class=\"compact-icon custom-image-icon\"\n (click)=\"toggleItemInfo(item, $event)\" \n matTooltip=\"Info\" \n [matTooltipShowDelay]=\"200\"\n [matTooltipHideDelay]=\"300\" \n matTooltipClass=\"custom-tooltip\"\n matTooltipPosition=\"below\"\n alt=\"Info\">\n </div> \n @if (item.showMetadata) {\n <div class=\"metadata-panel\">\n @for(feature of item.metadata; track feature) {\n <div class=\"feature-item\">\n <div *ngFor=\"let kv of (feature | keyvalue)\" class=\"feature-title\">\n {{ kv.value.name }}:\n <ng-container [ngSwitch]=\"kv.value.kind\">\n <img *ngSwitchCase=\"'img'\" [src]=\"kv.value.data\" alt=\"{{ kv.key }}\" style=\"max-width:240px;\" />\n <a *ngSwitchCase=\"'url'\" [href]=\"kv.value.data\" target=\"_blank\" rel=\"noopener noreferrer\">\n {{ kv.key }}\n <mat-icon class=\"link-icon\">open_in_new</mat-icon>\n </a>\n <span *ngSwitchDefault class=\"secondary-item\">{{ kv.value.data }}</span>\n </ng-container>\n </div>\n </div>\n }\n </div>\n }\n </div>\n </mat-option>\n </div>\n }\n @if ((activeMode === \"search-point\" || activeMode === \"search-polygon\") && geometrySearchResult.length > 0) {\n <div class=\"geometry-search-panel\">\n <mat-icon (click)=\"deleteAllGeometrySearchItem()\" class=\"delete-all-icon\" matTooltip=\"Ryd\">delete</mat-icon>\n <mat-option *ngFor=\"let result of geometrySearchResult\" [value]=\"result\" class=\"search-result-option\">\n <span class=\"result-title\">\n {{ result.title }} ({{result.items.length}} af {{ result.total }})\n </span>\n <div (click)=\"highlight(item.wkt, $event)\" *ngFor=\"let item of result.items\" class=\"geometry-search-result-item\">\n <div class=\"item-left\">\n <span class=\"item-header\"> {{item.header}} </span> \n </div>\n <div class=\"item-right\">\n @if (item.url) {\n <mat-icon \n class=\"search-item-external\"\n matTooltip=\"Åbn i ny tab\"\n [matTooltipShowDelay]=\"200\"\n [matTooltipHideDelay]=\"300\" \n (click)=\"openUrl(item.url, $event)\"\n matTooltipPosition=\"above\"\n >info</mat-icon>\n }\n <mat-icon (click)=\"deleteGeometrySearchItem(result, item.id, $event)\" >delete</mat-icon>\n </div>\n </div>\n </mat-option>\n </div>\n }\n</div>\n","import { Geometry } from 'ol/geom';\nimport { SearchProviderBase } from './infoSearch.service';\nimport { FeatureCollection } from 'geojson';\nimport Filter from 'ol/format/filter/Filter';\nimport { ILayer } from '../models/ILayer';\nimport { inject, Injectable } from '@angular/core';\nimport { CurrentItemsService } from './currentItems.service';\nimport { contains } from 'ol/format/filter';\n\ninterface IConflictAnalysisResult {\n layerName: string,\n conflict: boolean\n}\n\n@Injectable()\nexport class ConflictAnalysisSearchProvider extends SearchProviderBase<IConflictAnalysisResult, Geometry> {\n\n private _current = inject(CurrentItemsService);\n override getSearchableLayers(): ILayer[] {\n return this._current.profile ? this._current.profile.layerGroups.flatMap(lg => lg.layers).filter(l => l.useInConflictAnalysis) : [];\n \n }\n override getFilter(searchValue: Geometry, layer: ILayer): Filter {\n return contains(layer.geometryField, searchValue); \n }\n override map(l: ILayer, f: FeatureCollection): IConflictAnalysisResult {\n return {\n conflict: f.features.length > 0,\n layerName: l.name\n }\n }\n\n}","import { Component, EventEmitter, inject, Input, OnInit, Output, OnChanges, SimpleChanges } 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';\nimport { CurrentItemsService } from '../../services/currentItems.service';\nimport { ConflictAnalysisSearchProvider } from '../../services/conflictAnalysisSearch.service';\nimport { combineLatest } from 'rxjs';\nimport { LayoutService, WidgetPositionOptions } from '../../services/layoutService';\nimport { IProfileDetailed } from '../../models/IProfile';\nimport { ProfileService } from '../../services/profile.service';\nimport { WidgetConstants } from '../../models/widget.constants';\nimport WKT from 'ol/format/WKT';\nimport { ConfirmDialogService } from '../../services/confirm-dialog.service';\nimport { IconsConstants } from '../../models/icons.constants';\n\ninterface IFeature { \n locked: boolean;\n area: string;\n id: string | number;\n display: string;\n feature: Feature;\n containedOk: 'unknown' | 'yes' | 'no',\n containedMissingIn?: string[]\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, OnChanges {\n\n private _drawLayerService = inject(DrawLayerSourceService);\n private _centerPointService = inject(CenterPointService);\n private _conflictService = inject(ConflictAnalysisSearchProvider);\n private _undoRedo = inject(UndoRedoService);\n private _dialogService = inject(ConfirmDialogService);\n isZoomedToAll: boolean = false;\n features$ = this._drawLayerService.features$;\n collapsed = true;\n\n wktIconBase64 = IconsConstants.wktIconBase64;\n @Input({ required: true}) settings!: GisKomponentSettings;\n @Output() sessionDone = new EventEmitter();\n @Input({ required: true }) profile!: IProfileDetailed;\n\n activeFeatures: IFeature[] = [];\n private _featureHelper = inject(FeatureHelperService);\n private _highlight = inject(HighlightService);\n private _zoomService = inject(ZoomService);\n private _current = inject(CurrentItemsService);\n private _layoutService: LayoutService = inject(LayoutService);\n private _profileService: ProfileService = inject(ProfileService);\n\n opacity: number = 1;\n endSessionButtonLabel = this._current.gisKomponentSettings.endSessionButtonLabel ?? '';\n dragPosition : { x: number; y: number} = { x: 0, y: 0 };\n highlightedId: string | number | null = null;\n listHighlightedIds: Set<string | number | null> = new Set<string | number | null>();\n private _highlightTimeouts = new Map<string | number, any>();\n private readonly POSITION_STORAGE_KEY = 'activeObjects';\n private _hasCenterpoint = false;\n\n private _featuresForHighlight$ = this._drawLayerService.selectedForHighlight$;\n\n get centerPointOk(): boolean {\n return this._hasCenterpoint || !this._current.gisKomponentSettings.centerPoint || !this._current.gisKomponentSettings.centerPoint.required;\n }\n\n conflictAnalysisAvailable: boolean = false;\n get allFeaturesOk(): boolean {\n return !this._current.gisKomponentSettings.containsCheck || \n !this._current.gisKomponentSettings.containsCheck.requiredForEndSession || \n // this.activeFeatures.flatMap(af => af.features).every(f => f.containedOk === 'yes');\n this.activeFeatures.every(f => f.containedOk === 'yes');\n } \n\n get endSessionEnabled(): boolean {\n return !this._current.gisKomponentSettings.endSessionDisabled && this.allFeaturesOk;\n }\n\n constructor() {\n this.features$.subscribe({ \n next: features => {\n this._hasCenterpoint = features.some(f => this._centerPointService.isCenterpoint(f));\n this.activeFeatures = features.filter(f => !this._centerPointService.isCenterpoint(f))\n .map(f => ({\n locked: this._featureHelper.isLocked(f),\n area: this._getAreaString(f),\n containedOk: this.conflictAnalysisAvailable ? 'unknown' : 'yes',\n display: this.settings.geometryTypeSettings.find(gts => gts.typeId === this._featureHelper.typeId(f))!.typeName,\n feature: f,\n id: f.getId()!\n }))\n this.runConflictAnalysis();\n }});\n this._featuresForHighlight$.subscribe({\n next: features => {\n this._highlightFromMap(features.map(feature => feature.getId()));\n }\n })\n }\n\n private _highlightFromMap(ids: (string | number | undefined)[]) {\n for (const id of ids) {\n this._highlightSingle(id);\n }\n }\n\n private _highlightSingle(id: string | number | undefined) {\n if (!id) return;\n this.listHighlightedIds.add(id);\n\n const element = document.querySelector(\n `[data-id=\"${id}\"]`\n ) as HTMLElement | null;\n\n element?.scrollIntoView({\n behavior: 'smooth',\n block: 'center'\n });\n\n if (this._highlightTimeouts.has(id)) {\n clearTimeout(this._highlightTimeouts.get(id));\n }\n\n const timeout = setTimeout(() => {\n this.listHighlightedIds.delete(id);\n this._highlightTimeouts.delete(id);\n }, this.settings.highlightFadeTimerMs || 2000);\n\n this._highlightTimeouts.set(id, timeout);\n }\n\n\n ngOnInit(): void {\n this.conflictAnalysisAvailable = !!this._current.gisKomponentSettings.containsCheck && this._current.gisKomponentSettings.containsCheck.enabled && \n this._current.profile!.layerGroups.flatMap(lg => lg.layers).some(l => l.useInConflictAnalysis);\n }\n\n endSession(): void {\n this.sessionDone.emit();\n }\n\n runConflictAnalysis(): void {\n const unlockedFeatures = this.activeFeatures.filter(f => !f.locked);\n const conflictSearches$ = unlockedFeatures.map(f => this._conflictService.search(f.feature.getGeometry()!, 1));\n combineLatest(conflictSearches$).subscribe({\n next: result => {\n result.forEach((f,i) => {\n unlockedFeatures[i].containedOk = f.some(fx => fx.conflict) ? 'yes' : 'no';\n unlockedFeatures[i].containedMissingIn = f.filter(fx => !fx.conflict).map(fx => fx.layerName)\n });\n }\n })\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['profile'] && this.profile) {\n this.collapsed = this.profile.activeObjectsFolded;\n this._loadPosition(this.collapsed);\n }\n }\n\n private _getAreaString(feature: Feature): string {\n if (feature.getGeometry()?.getType() !== 'Polygon' && feature.getGeometry()?.getType() !== 'MultiPolygon') { // We only have polygon, linestring and points and only multi/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 this.isZoomedToAll = true;\n }\n onMapInteraction(): void {\n this.isZoomedToAll = false;\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 async togglePanel(): Promise<void> {\n this.collapsed = !this.collapsed;\n if (!this.collapsed) {\n //Expanding, make sure it stays in viewport\n this.dragPosition = await this._layoutService.keepWidgetInViewPort(this.dragPosition, this.POSITION_STORAGE_KEY,\n WidgetConstants.activeObjectsHeight, WidgetConstants.activeObjectsWidth);\n }\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\n showItemWKT(feature: Feature): void {\n const wktFormatter = new WKT();\n const wktString = wktFormatter.writeGeometry(feature.getGeometry()!);\n this._dialogService.open({ primaryText: 'OK', message: wktString, title: 'WKT for objekt' }).subscribe();\n }\n\n private async _loadPosition(collapsed: boolean): Promise<void> {\n try {\n // Default height and width when collapsed\n let widgetHeight: number = WidgetConstants.collapsedHeight;\n let widgetWidth: number = WidgetConstants.collapsedWidth;\n if (!collapsed) {\n // Custom height and width when expanded\n widgetHeight = WidgetConstants.activeObjectsHeight;\n widgetWidth = WidgetConstants.activeObjectsWidth;\n }\n const widgetPositionOptions: WidgetPositionOptions = {\n initialPosition: this.profile.activeObjectsInitialPosition,\n widgetName: this.POSITION_STORAGE_KEY,\n widgetHeight: widgetHeight,\n widgetWidth: widgetWidth\n }\n const savedPosition = localStorage.getItem(this.POSITION_STORAGE_KEY);\n if (this._profileService.getProfileVersionChanged() &&\n this.profile?.activeObjectsInitialPosition) {\n //Profile version changed in backend, use that\n this.dragPosition = await this._layoutService.calculateWidgetPosition(widgetPositionOptions);\n } else if (savedPosition) {\n this.dragPosition = JSON.parse(savedPosition);\n } else if (this.profile?.activeObjectsInitialPosition) {\n this.dragPosition = await this._layoutService.calculateWidgetPosition(widgetPositionOptions);\n } else {\n // Default position for active objects\n this.dragPosition = { x: WidgetConstants.activeObjectsDefaultX, y: WidgetConstants.activeObjectsDefaultY };\n this._savePosition(this.dragPosition);\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 global-wrapper-container\" cdkDrag cdkDragBoundary=\".map-container\"\n [cdkDragFreeDragPosition]=\"dragPosition\" (cdkDragEnded)=\"onDragEnded($event)\" [class.collapsed]=\"collapsed\">\n <div class=\"drag-handle-active-objects\" cdkDragHandle>\n <mat-icon class=\"active-object-icon\" (click)=\"zoomToAll()\" matTooltip=\"Aktive objekter\"\n [matTooltipShowDelay]=\"500\" [matTooltipHideDelay]=\"100\" matTooltipPosition=\"above\">\n format_list_bulleted_add\n </mat-icon>\n\n <div class=\"right-icons\">\n <mat-icon class=\"toggle-icon\" (click)=\"togglePanel()\">\n {{ collapsed ? 'flip_to_front' : 'remove' }}\n </mat-icon>\n </div>\n </div>\n\n <div class=\"active-objects-container\">\n @if(!collapsed) {\n <input type=\"range\" min=\"0\" max=\"1\" step=\"0.05\" [(ngModel)]=\"opacity\" (input)=\"updateOpacity()\"\n (mousedown)=\"stopDrag($event)\" (touchstart)=\"stopDrag($event)\" (pointerdown)=\"stopDrag($event)\">\n <div class=\"header-icons\">\n <div class=\"header-left-controls\">\n <mat-icon class=\"zoom-icon\" [class.zoom-active]=\"isZoomedToAll\" (click)=\"zoomToAll()\"\n matTooltip=\"Zoom til alle\" matTooltipPosition=\"above\">\n fit_screen\n </mat-icon>\n <mat-icon class=\"reset-icon\" (click)=\"reset()\" matTooltip=\"Nulstil\" matTooltipPosition=\"above\">\n replay\n </mat-icon>\n </div>\n\n <div class=\"header-right-controls\">\n @if(!centerPointOk) {\n <mat-icon class=\"warning-icon\" matTooltip=\"Der er ikke noget centerpunkt og det skal der være\"\n [matTooltipShowDelay]=\"500\" [matTooltipHideDelay]=\"100\" matTooltipPosition=\"above\">\n warning\n </mat-icon>\n } @else if (allFeaturesOk) { \n @if (endSessionButtonLabel) {\n <button (click)=\"endSession()\" matTooltip=\"Afslut\" [matTooltipShowDelay]=\"500\" [matTooltipHideDelay]=\"100\" matTooltipPosition=\"above\">\n {{endSessionButtonLabel}}\n </button>\n } @else {\n <mat-icon class=\"end-session-icon\" (click)=\"endSession()\" matTooltip=\"Afslut\"\n [matTooltipShowDelay]=\"500\" [matTooltipHideDelay]=\"100\" matTooltipPosition=\"above\">\n done_all\n </mat-icon>\n }\n }\n </div>\n </div>\n }\n\n @if(!collapsed) {\n <div class=\"active-objects-content\">\n <div class=\"item-list\">\n @for(item of activeFeatures; track item.id) {\n <div class=\"item\" [class.listhighlight]=\"listHighlightedIds.has(item.id)\" [attr.data-id]=\"item.id\">\n <div class=\"item-text\">\n <span (click)=\"highlight(item.id)\" class=\"item-id\">{{item.display}} {{item.area}}</span>\n @if(item.containedMissingIn && item.containedMissingIn.length > 0) {\n <div class=\"item-warning\">\n <mat-icon>error</mat-icon>\n <span>Udenfor {{item.containedMissingIn.join(', ')}}</span>\n </div>\n }\n </div>\n <img \n [src]=\"wktIconBase64\" \n class=\"compact-icon custom-image-icon\"\n (click)=\"showItemWKT(item.feature)\" \n matTooltip=\"Vis WKT\" \n [matTooltipShowDelay]=\"200\"\n [matTooltipHideDelay]=\"300\" \n matTooltipClass=\"custom-tooltip\"\n matTooltipPosition=\"below\"\n alt=\"Vis WKT\">\n \n\n @if(!item.locked) {\n <mat-icon (click)=\"delete(item.id)\" matTooltip=\"Slet\" [matTooltipShowDelay]=\"500\"\n [matTooltipHideDelay]=\"100\" matTooltipPosition=\"above\">\n delete\n </mat-icon>\n }\n </div>\n }\n </div>\n\n </div>\n }\n </div>\n</div>","\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, intersects } from 'ol/format/filter';\nimport { map } from 'rxjs/operators';\nimport { Feature as FeatureGeoJSON, FeatureCollection, GeoJsonProperties } from 'geojson';\n\nimport { combineLatest, Observable, of } from 'rxjs';\nimport { SearchProvider, SearchResponse } from './searchProvider.service';\nimport { inject, Injectable } from '@angular/core';\nimport { Feature } from 'ol';\nimport { Geometry } from 'ol/geom';\nimport { IValue, ValueKind } from './infoSearch.service';\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 geometryField: string;\n name: string;\n fieldsToExcludeFromInfoFromInfo: 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, geometry?: Geometry, maxCount: number = 5): Observable<SearchResponse>[] {\n const wftSearches: Observable<SearchResponse>[] = [];\n this._searcheableLayers.flatMap(layer => {\n const filter = searchValue ? like(layer.searchField, `*${searchValue}*`, '*', '?', '/', false) :\n geometry ? intersects(layer.geometryField, geometry,'EPSG:25832') : undefined;\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 const fieldsToExclude = new Set(layer.fieldsToExcludeFromInfoFromInfo.split(',').map(f => f.toLowerCase().trim()));\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), metadata: this._mapFeatureMetadata(f, fieldsToExclude), showMetadata: false }))\n };\n return result;\n })));\n });\n // Force an empty response if no searchable layers\n return wftSearches.length > 0 ? wftSearches : [of({ title: '', total:0, items: [] })];\n }\n\n \n setSearcheableLayers(layers: SearchableLayer[]) {\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 private _mapFeatureMetadata(f: FeatureGeoJSON, excludeSet: Set<string>): Record<string, IValue>[] {\n\n const result: Record<string, IValue> = {};\n \n const props: GeoJsonProperties = f.properties || { };\n for(const [key, value] of Object.entries(props)) {\n if (excludeSet.has(key.toLowerCase())) continue;\n const kind = this._getValueKind(value);\n result[key] = { kind, data: value, name: key }\n }\n return [result];\n }\n\n private _getValueKind(value: any): ValueKind {\n const imgTypes = ['.png', '.jpg', '.gif', '.jpeg']\n if (typeof value === 'string') {\n if (value.startsWith('http://') || value.startsWith('https://')) {\n if (imgTypes.some(ext => value.endsWith(ext))) {\n return 'img';\n }\n return 'url';\n }\n }\n return 'data';\n }\n\n}","import { Component, inject, Input, OnChanges, OnInit, SimpleChanges } 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, SearchResponseItem } from '../../services/searchProvider.service';\nimport { SearchableLayer, WFSSearchService } from '../../services/wfsSearch.service';\nimport { LayerHelperService } from '../../services/layerHelper.service';\nimport { CachedProfileInfo } from '../layer-selector/layer-selector.component';\nimport { IProfileDetailed } from '../../models/IProfile';\nimport { LayoutService, WidgetPositionOptions } from '../../services/layoutService';\nimport { AddressSearchService } from '../../services/addressSearch.service';\nimport { CadastreSearchService } from '../../services/cadastreSearch.service';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport WKT from 'ol/format/WKT';\nimport { ZoomService } from '../../services/zoom.service';\nimport { ProfileService } from '../../services/profile.service';\nimport { WidgetConstants } from '../../models/widget.constants';\n\nexport type SearchMode = 'none' | 'point' | 'polygon';\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 MatTooltipModule\n ]\n})\nexport class MapSearchComponent implements OnInit, OnChanges {\n searchAddress: string = '';\n @Input() profile!: IProfileDetailed;\n filteredResults: SearchResponse[] = [];\n collapsed = true;\n dragPosition : { x: number; y: number} = { x: 0, y: 0 };\n activeHighlightWkt: string | null = null;\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 _wfsSearch = inject(WFSSearchService);\n private _addressSearch = inject(AddressSearchService);\n private _cadastreSearch = inject(CadastreSearchService);\n private _layerHelperService: LayerHelperService = inject(LayerHelperService);\n private _layoutService: LayoutService = inject(LayoutService);\n private _profileService: ProfileService = inject(ProfileService);\n private _zoomService = inject(ZoomService);\n\n ngOnInit(): void {\n this._layerHelperService.activeLayersChanged\n .subscribe(() => this._addWFSSearchLayers());\n this.filterResults();\n this._addWFSSearch();\n this._searchSubject.pipe(\n debounceTime(200),\n distinctUntilChanged(),\n switchMap(value => this._searchService.search(value, undefined))\n ).subscribe({\n next: result => {\n this.filteredResults = result.filter(result => result.items.length > 0);\n }\n });\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['profile'] && this.profile) { \n this.collapsed = this.profile.searchFolded;\n this._loadPosition(this.collapsed);\n this._addWFSSearchLayers();\n }\n }\n\n\n displaySearchFn = (item?: SearchResponseItem | string): string => {\n\n if (!item) { return ''; }\n if (typeof item === 'string') { return item; }\n return item!.header;\n }\n\n private _addWFSSearch(): void{\n this._searchService.searchProviders = [];\n this._searchService.searchProviders.push(this._addressSearch);\n this._searchService.searchProviders.push(this._cadastreSearch);\n this._searchService.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!, geometryField: layer.geometryField,\n fieldsToExcludeFromInfoFromInfo: layer.fieldsToExcludeFromInfoFromInfo\n }));\n this._wfsSearch.setSearcheableLayers(searcheableLayers);\n }\n }\n }\n\n\n filterResults(): void {\n if (!this.searchAddress) {\n this.filteredResults = [];\n return;\n }\n this._searchSubject.next(this.searchAddress);\n }\n\n async toggleSearch(): Promise<void> {\n this.collapsed = !this.collapsed;\n if (this.collapsed) {\n this.searchAddress = '';\n this.filterResults();\n }\n if (!this.collapsed) {\n //Expanding, make sure it stays in viewport\n this.dragPosition = await this._layoutService.keepWidgetInViewPort(this.dragPosition, this.POSITION_STORAGE_KEY,\n WidgetConstants.searchHeight, WidgetConstants.searchWidth);\n }\n }\n\n highlight(wkt: string, event: MouseEvent): void {\n event.stopPropagation();\n const wktFormatter = new WKT();\n const geom = wktFormatter.readGeometry(wkt);\n if (this.activeHighlightWkt === wkt) {\n this.activeHighlightWkt = null;\n } else {\n this.activeHighlightWkt = wkt;\n if (geom.getType() === 'Point') { \n this._zoomService.zoomToFeatures(wkt);\n } else {\n this._highlight.highlight(wkt);\n }\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 async _loadPosition(collapsed: boolean): Promise<void> {\n try {\n // Default height and width when collapsed\n let widgetHeight: number = WidgetConstants.collapsedHeight;\n let widgetWidth: number = WidgetConstants.collapsedWidth;\n if (!collapsed) {\n // Custom height and width when expanded\n widgetHeight = WidgetConstants.searchHeight;\n widgetWidth = WidgetConstants.searchWidth;\n }\n const widgetPositionOptions: WidgetPositionOptions = {\n initialPosition: this.profile.searchInitialPosition,\n widgetName: this.POSITION_STORAGE_KEY,\n widgetHeight: widgetHeight,\n widgetWidth: widgetWidth\n }\n const savedPosition = localStorage.getItem(this.POSITION_STORAGE_KEY);\n if (this._profileService.getProfileVersionChanged() &&\n this.profile?.searchInitialPosition) {\n //Profile version changed in backend, use that\n this.dragPosition = await this._layoutService.calculateWidgetPosition(widgetPositionOptions);\n } else if (savedPosition) {\n this.dragPosition = JSON.parse(savedPosition);\n } else if (this.profile && this.profile.searchInitialPosition) {\n this.dragPosition = await this._layoutService.calculateWidgetPosition(widgetPositionOptions);\n } else {\n // Default position for search\n this.dragPosition = { x: WidgetConstants.searchDefaultX, y: WidgetConstants.searchDefaultY };\n this._savePosition(this.dragPosition);\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 global-wrapper-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 \n class=\"icon-left\" \n matTooltip=\"Søg\" \n [matTooltipShowDelay]=\"500\"\n [matTooltipHideDelay]=\"100\" \n matTooltipPosition=\"above\">\n manage_search\n </mat-icon>\n <div class=\"right-icons\"> \n <mat-icon class=\"toggle-icon\" (click)=\"toggleSearch()\">\n {{ collapsed ? 'flip_to_front' : 'remove' }}\n </mat-icon>\n </div>\n </div>\n\n <div class=\"search-content\" *ngIf=\"!collapsed\">\n <label class=\"search-label\">Søg</label>\n <mat-form-field appearance=\"outline\" class=\"search-field\">\n <mat-icon matPrefix class=\"search-icon\">search</mat-icon>\n <input\n type=\"text\"\n matInput\n [(ngModel)]=\"searchAddress\"\n [matAutocomplete]=\"auto\"\n (input)=\"filterResults()\"\n />\n <mat-autocomplete #auto=\"matAutocomplete\" [displayWith]=\"displaySearchFn\">\n <ng-container *ngFor=\"let result of filteredResults\" >\n <mat-option disabled class=\"result-title\">\n {{ result.title }} ({{result.items.length}}\n <span *ngIf=\"result.total\"> af {{result.total }}</span>)\n </mat-option>\n <mat-option *ngFor=\"let item of result.items\" [value]=\"item\" class=\"custom-option\"\n (mouseenter)=\"highlight(item.wkt, $event)\">\n <div class=\"item-container\">\n <span class=\"item-header\">{{item.header}}</span>\n </div>\n </mat-option>\n </ng-container>\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, inject, Input, OnChanges, OnInit, OnDestroy, SimpleChanges, ViewChild } from '@angular/core';\nimport { CdkDragEnd, 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 } from '../../models/profile';\nimport { ILayer, ILayerDetailed } from '../../models/ILayer';\nimport { LayerHelperService } from '../../services/layerHelper.service';\nimport { LayoutService, WidgetPositionOptions } from '../../services/layoutService';\nimport { HttpClient } from '@angular/common/http';\nimport { catchError, forkJoin, map, Observable, of, switchMap } from 'rxjs';\nimport { IProfileDetailed } from '../../models/IProfile';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { ProfileService } from '../../services/profile.service';\nimport { WidgetConstants } from '../../models/widget.constants';\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, MatTooltipModule ]\n})\nexport class LegendsListComponent implements OnInit, OnChanges, OnDestroy {\n private readonly _http = inject(HttpClient);\n private readonly _layerService: LayerService = inject(LayerService);\n private readonly _layerHelperService: LayerHelperService = inject(LayerHelperService);\n private readonly _layoutService: LayoutService = inject(LayoutService);\n private readonly _profileService: ProfileService = inject(ProfileService);\n private config = inject(GISKOMPONENT_CONFIG);\n \n @Input() map!: Map;\n @Input() profile!: IProfileDetailed;\n \n filteredLayersDetailed: ILayerDetailedWithUrl[] = [];\n collapsed: boolean = true;\n dragPosition: { x: number; y: number } = { x: 0, y: 0 };\n \n private _baseUrl = this.config.apiBaseUrl;\n private _legendsListBodyControl!: ol_control_Control;\n private readonly _mapFilteredLayerGroupsKeyName: string = 'mapFilteredLayerGroups';\n private readonly POSITION_STORAGE_KEY = 'legendsListPosition';\n\n ngOnInit(): void {\n this._layerHelperService.activeLayersChanged.subscribe(() => this._setFilteredLegends().subscribe(result => this.filteredLayersDetailed = result));\n }\n \n ngOnChanges(changes: SimpleChanges): void {\n this._layoutService.mapResizedSubject.subscribe(async () => {\n this.dragPosition = await this._layoutService.keepWidgetInViewPort(\n this.dragPosition,\n this.POSITION_STORAGE_KEY,\n this.collapsed ? WidgetConstants.collapsedHeight : WidgetConstants.legendsHeight,\n this.collapsed ? WidgetConstants.collapsedWidth : WidgetConstants.legendsWidth\n );\n });\n if (changes['profile'] && this.profile) {\n this.collapsed = this.profile.legendsListFolded;\n this._loadPosition(this.collapsed);\n this._setFilteredLegends().subscribe(result => this.filteredLayersDetailed = result);\n }\n }\n\n ngOnDestroy(): void {\n if (this._legendsListBodyControl) {\n this.map.removeControl(this._legendsListBodyControl);\n }\n }\n\n async toggleLegendsList(): Promise<void> {\n this.collapsed = !this.collapsed;\n if (!this.collapsed) {\n //Expanding, make sure it stays in viewport\n this.dragPosition = await this._layoutService.keepWidgetInViewPort(this.dragPosition, this.POSITION_STORAGE_KEY,\n WidgetConstants.legendsHeight, WidgetConstants.legendsWidth);\n }\n }\n\n onDragEnded(event: CdkDragEnd): void {\n const position = event.source.getFreeDragPosition();\n this.dragPosition = position;\n this._savePosition(position);\n }\n private _getImageUrl(fileName: string): string {\n return `${this._baseUrl}/api/image/${fileName}`;\n }\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 legends list position to localStorage:', error);\n }\n }\n\n private async _loadPosition(collapsed: boolean): Promise<void> {\n try {\n // Default height and width when collapsed\n let widgetHeight: number = WidgetConstants.collapsedHeight;\n let widgetWidth: number = WidgetConstants.collapsedWidth;\n if (!collapsed) {\n // Custom height and width when expanded\n widgetHeight = WidgetConstants.legendsHeight;\n widgetWidth = WidgetConstants.legendsWidth;\n }\n const widgetPositionOptions: WidgetPositionOptions = {\n initialPosition: this.profile.legendsListInitialPosition,\n widgetName: this.POSITION_STORAGE_KEY,\n widgetHeight: widgetHeight,\n widgetWidth: widgetWidth\n }\n const savedPosition = localStorage.getItem(this.POSITION_STORAGE_KEY);\n if (this._profileService.getProfileVersionChanged() &&\n this.profile?.legendsListInitialPosition) {\n //Profile version changed in backend, use that\n this.dragPosition = await this._layoutService.calculateWidgetPosition(widgetPositionOptions);\n } else if (savedPosition) {\n this.dragPosition = JSON.parse(savedPosition);\n } else if (this.profile?.legendsListInitialPosition) {\n this.dragPosition = await this._layoutService.calculateWidgetPosition(widgetPositionOptions);\n } else {\n // Default position for legends list\n this.dragPosition = { x: WidgetConstants.legendsDefaultX, y: WidgetConstants.legendsDefaultY };\n this._savePosition(this.dragPosition);\n }\n } catch (error) {\n console.error('Error loading legends list position from localStorage:', error);\n this.dragPosition = { x: 0, y: 0 };\n }\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 || layerIdsCachedToDisplay.length === 0) {\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}","<div class=\"legends-list-body-wrapper global-wrapper-container\" \n cdkDrag \n cdkDragBoundary=\".map-container\" \n [cdkDragFreeDragPosition]=\"dragPosition\"\n (cdkDragEnded)=\"onDragEnded($event)\"\n [class.collapsed]=\"collapsed\">\n\n <div class=\"drag-handle-legends\" cdkDragHandle>\n <mat-icon \n class=\"legend-icon\" \n matTooltip=\"Signaturforklaring\" \n (click)=\"toggleLegendsList()\"\n [matTooltipShowDelay]=\"500\"\n [matTooltipHideDelay]=\"100\" \n matTooltipPosition=\"above\">\n area_chart\n </mat-icon>\n <div class=\"right-icons\">\n <mat-icon class=\"toggle-icon\" (click)=\"toggleLegendsList()\">\n {{ collapsed ? 'flip_to_front' : 'remove' }}\n </mat-icon>\n </div>\n</div>\n\n<div class=\"legends-list-container\">\n @if(!collapsed) {\n <div class=\"ol-unselectable ol-control legends-list-body\">\n <div class=\"item-list\">\n @for (layer of filteredLayersDetailed; track layer.id; let i = $index) {\n @if (layer.imageUrl) {\n <mat-expansion-panel [expanded]=\"i === 0\"> \n <mat-expansion-panel-header>\n <span class=\"panel-title\">\n {{ layer.name }}\n </span>\n </mat-expansion-panel-header>\n <div class=\"legend\">\n <img [src]=\"layer.imageUrl\" class=\"legend-thumbnail\"/>\n </div>\n </mat-expansion-panel>\n }\n }\n </div>\n </div>\n}\n</div>\n</div>","import { inject, Injectable } from '@angular/core';\nimport { KomponentSettingsHelperService } from './komponentSettingsHelper.service';\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()\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 if (getAllStyles$.length === 0) {\n this._undoRedo.init();\n return;\n }\n combineLatest(getAllStyles$).subscribe({\n next: styles => {\n styles.forEach((s, i) => { \n const feature = allTheFeatures[i];\n if (feature.get('showlabelfrom') && s as Style) {\n const styles: Style[] = [s as Style];\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 { Component, inject, OnInit } from '@angular/core';\nimport { IInfoSearchResult } from '../../services/infoSearch.service';\nimport { ShowInfoService } from '../../services/showInfo.service';\nimport { AsyncPipe, CommonModule, JsonPipe } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatButtonModule } from '@angular/material/button';\n\n@Component({\n selector: 'selected-feature-info',\n styleUrl: './selected-feature-info.component.scss',\n templateUrl: './selected-feature-info.component.html',\n imports: [CommonModule, FormsModule, AsyncPipe, JsonPipe, MatButtonModule, MatIconModule]\n})\nexport class SelectedFeatureInfoComponent implements OnInit {\n\n private _infoService = inject(ShowInfoService);\n features: IInfoSearchResult[] | null = null;\n collapsedStates: { [key: string]: boolean } = {};\n\n ngOnInit(): void {\n this._infoService.features$.subscribe({ \n next: f => { \n this.features = f ? [...f] : null;\n if (this.features) {\n this.features.forEach(item => {\n if (this.collapsedStates[item.layerName] === undefined) {\n this.collapsedStates[item.layerName] = true;\n }\n });\n }\n }\n })\n }\n\n toggleCollapse(layerName: string): void {\n this.collapsedStates[layerName] = !this.collapsedStates[layerName];\n }\n\n isCollapsed(layerName: string): boolean {\n return this.collapsedStates[layerName] || false;\n }\n}","\n@if(features) {\n <div class=\"selected-features-wrapper\"> \n\n @for(item of features; track item.layerName) { \n <div class=\"feature-section\">\n <span (click)=\"toggleCollapse(item.layerName)\" class=\"collapsible-header\">\n <mat-icon class=\"collapse-icon\">\n {{ isCollapsed(item.layerName) ? 'keyboard_arrow_up' : 'expand_more' }}\n </mat-icon>\n {{item.layerName}}\n </span>\n \n <div class=\"feature-content\" [class.collapsed]=\"isCollapsed(item.layerName)\">\n @for(feature of item.values; track feature) {\n <div class=\"feature-item\">\n <div *ngFor=\"let kv of (feature | keyvalue)\" class=\"feature-row\">\n <div class=\"feature-label\">\n {{ kv.value.name }}:\n </div>\n <div class=\"feature-value\">\n <ng-container [ngSwitch]=\"kv.value.kind\">\n <img *ngSwitchCase=\"'img'\" [src]=\"kv.value.data\" alt=\"{{ kv.key }}\" style=\"max-width:240px;\" />\n <a *ngSwitchCase=\"'url'\" [href]=\"kv.value.data\" target=\"_blank\" rel=\"noopener noreferrer\">\n {{ kv.key }}\n <mat-icon class=\"link-icon\">open_in_new</mat-icon>\n </a>\n <span *ngSwitchDefault>{{ kv.value.data }}</span>\n </ng-container>\n </div>\n </div>\n </div>\n }\n </div>\n </div>\n }\n </div>\n}\n","import { Coordinate } from 'ol/coordinate';\nimport { SearchProviderBase } from './infoSearch.service';\nimport { FeatureCollection, Feature, Polygon as GeoJSONPolygon, MultiPolygon as GeoJSONMultiPolygon } from 'geojson';\nimport Filter from 'ol/format/filter/Filter';\nimport { ILayer } from '../models/ILayer';\nimport { inject, Injectable } from '@angular/core';\nimport { CurrentItemsService } from './currentItems.service';\nimport Point from 'ol/geom/Point';\nimport { intersects } from 'ol/format/filter';\nimport { MultiPolygon, Polygon } from 'ol/geom';\nimport GeoJSON from 'ol/format/GeoJSON'\nimport { bboxPolygon, featureCollection, intersect } from '@turf/turf';\n\ninterface IHoverResult {\n values: {\n center: Point;\n showValue: string\n }[];\n}\n\n@Injectable()\nexport class HoverInfoSearchService extends SearchProviderBase<IHoverResult, Coordinate> {\n\n private _current = inject(CurrentItemsService);\n override getSearchableLayers(): ILayer[] {\n return this._current.profile!.layerGroups.flatMap(l => l.layers).filter(l => l.showInfoOnHover);\n }\n\n override getFilter(searchValue: Coordinate, layer: ILayer): Filter {\n const point = new Point(searchValue);\n return intersects(layer.geometryField, point);\n }\n\n override map(l: ILayer, f: FeatureCollection): IHoverResult {\n return {\n values: f.features\n .filter(f => f.geometry.type === 'Polygon' || f.geometry.type === 'MultiPolygon')\n .map(f => ({\n center: this._getVisibleInteriorPoint(f as Feature<GeoJSONPolygon>),\n showValue: f.properties ? `${l.name}:${f.properties[l.propertyToShowOnHover]}` : ''\n }))\n }\n }\n\n // Finds the center point of the part of a feature that is visible on the map\n private _getVisibleInteriorPoint(feature: Feature<GeoJSONPolygon | GeoJSONMultiPolygon>): Point {\n const map = this._current.map!;\n const view = map.getView();\n const proj = view.getProjection();\n const size = map.getSize();\n\n\n const extent = view.calculateExtent(size);\n\n const extentPoly = bboxPolygon(extent as [number, number, number, number]);\n\n const collection = featureCollection([feature, extentPoly]);\n const clipped = intersect(collection as any);\n\n\n const gj = new GeoJSON({ dataProjection: proj, featureProjection: proj });\n const clippedGeom = gj.readGeometry(clipped!.geometry) as Polygon | MultiPolygon;\n\n // For MultiPoly, find largest polygon\n let target: Polygon;\n if (clippedGeom instanceof MultiPolygon) {\n const parts = clippedGeom.getPolygons();\n target = parts.reduce((best, p) => (p.getArea() > best.getArea() ? p : best), parts[0]);\n } else {\n target = clippedGeom as Polygon;\n }\n\n return target.getInteriorPoint();\n }\n\n}","import { inject, Injectable } from '@angular/core';\nimport { CurrentItemsService } from './currentItems.service';\nimport { HoverInfoSearchService } from './hoverInfoSearch.service';\nimport VectorLayer from 'ol/layer/Vector';\nimport VectorSource from 'ol/source/Vector';\nimport { Fill, Stroke, Style, Text } from 'ol/style';\nimport { Feature } from 'ol';\n@Injectable()\nexport class ShowInfoHoverService {\n\n private _current = inject(CurrentItemsService);\n private _search = inject(HoverInfoSearchService);\n\n private source = new VectorSource();\n private _layer = new VectorLayer({\n source: this.source,\n zIndex: 500,\n })\n\n init(): void {\n\n this._current.map$.subscribe({\n\n next: map => {\n let timer: any;\n map.addLayer(this._layer);\n map.on('pointermove', evt => {\n if (evt.dragging) { return; }\n clearTimeout(timer); // for every move, restart the timer\n timer = setTimeout(() => {\n this.source.clear();\n this._search.search(evt.coordinate, 2).subscribe({\n next: features => {\n const newFeatures = features\n .flatMap(f => f.values)\n .map(f => {\n const styleForFeature = this._getStyle(f.showValue);\n const newFeature = new Feature({ geometry: f.center })\n newFeature.setStyle(styleForFeature);\n return newFeature;\n });\n this.source.addFeatures(newFeatures);\n },\n error: err => {\n console.error(`Fejl ved visning af info ved hover: ${err}`);\n }\n })\n }, 300);\n })\n }\n })\n }\n\n private _getStyle(text: string): Style {\n const style = new Style({\n text: new Text({\n text: text,\n font: '12px Calibri,sans-serif',\n fill: new Fill({ color: '#000' }),\n stroke: new Stroke({ color: '#fff', width: 3 }),\n overflow: true,\n placement: 'point'\n })\n });\n return style;\n }\n\n}\n","import { Component, inject } from '@angular/core';\nimport { ShowDocumentInfoService } from '../../services/showInfo.service';\nimport { AsyncPipe, CommonModule, JsonPipe } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\n\n@Component({\n selector: 'document-search-info',\n styleUrl: './document-search-info.component.scss',\n templateUrl: '././document-search-info.component.html',\n imports: [CommonModule, FormsModule, AsyncPipe, JsonPipe, MatButtonModule, MatIconModule]\n})\nexport class DocumentSearchInfoComponent {\n\n private _showDocumentInfoService = inject(ShowDocumentInfoService);\n\n features$ = this._showDocumentInfoService.features$;\n\n getIcon(url: string): string {\n const ext = url.split('.').pop()?.toLowerCase();\n\n switch (ext) {\n case 'pdf':\n return 'picture_as_pdf'; // Material icon\n case 'doc':\n case 'docx':\n return 'description';\n case 'xls':\n case 'xlsx':\n return 'table_chart';\n case 'png':\n case 'jpg':\n case 'jpeg':\n case 'gif':\n return 'image';\n default:\n return 'insert_drive_file';\n }\n }\n\n}","<div *ngIf=\"features$ | async as features\" class=\"doc-info-panel\">\n <div class=\"doc-info-features\">\n <div *ngFor=\"let feature of features\" class=\"doc-info-layer\">\n <h3 class=\"doc-info-layer-title\">{{feature.layer}}</h3>\n <div *ngFor=\"let item of feature.items\" class=\"doc-info-item\">\n <mat-icon class=\"doc-info-item-icon\">{{getIcon(item.url)}}</mat-icon>\n <a [href]=\"item.url\" target=\"_blank\" rel=\"noopener\" class=\"doc-info-item-link\">\n {{ item.header }}\n </a>\n </div>\n </div>\n </div>\n</div>","import { CommonModule } from '@angular/common';\nimport { Component, ElementRef, EventEmitter, inject, Input, OnDestroy, OnInit, Output, 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';\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';\nimport { SelectedFeatureInfoComponent } from '../selected-feature-info/selected-feature-info.component';\nimport { FeatureCollection } from 'geojson'\nimport GeoJSON from 'ol/format/GeoJSON.js';\nimport { DrawLayerSourceService } from '../../services/drawLayerSource.service';\nimport { ShowInfoHoverService } from '../../services/showInfoHover.service';\nimport { PrintHelperService } from '../../services/printHelper.service';\nimport { ZoomService } from '../../services/zoom.service';\nimport { UndoRedoService } from '../../services/UndoRedo.service';\nimport { HoverInfoSearchService } from '../../services/hoverInfoSearch.service';\nimport { ShowDocumentInfoService, ShowInfoService } from '../../services/showInfo.service';\nimport { InfoSearchProvider } from '../../services/infoSearch.service';\nimport { CenterPointService } from '../../services/centerPoint.service';\nimport { PrintDrawLayerSourceService } from '../../services/printDrawLayerSource.service';\nimport { InteractionHelperService } from '../../services/interactionHelper.service';\nimport { ConflictAnalysisSearchProvider } from '../../services/conflictAnalysisSearch.service';\nimport { MergeFeaturesService } from '../../services/mergeFeatures.service';\nimport { OverlapService } from '../../services/overlap.service';\nimport { CowiService } from '../../services/cowi.service';\nimport { SearchProviderService } from '../../services/searchProvider.service';\nimport { AddressSearchService } from '../../services/addressSearch.service';\nimport { CadastreSearchService } from '../../services/cadastreSearch.service';\nimport { DmpCatalogService } from '../../services/dmpCatalog.service';\nimport { OlCapabilitiesService } from '../../services/olCapabilities.service';\nimport { DmpLayerMapperService } from '../../services/dmpLayer-mapper.service';\nimport { DocumentSearchService } from '../../services/documentSearch.service';\nimport { DocumentSearchInfoComponent } from '../document-search-info/document-search-info.component';\nimport { GeometrySearchService } from '../../services/geometrySearch.service';\nimport { LayoutService } from '../../services/layoutService';\n\nexport interface ISessionDone {\n doneFrom: 'activeObjects' | 'selectedObjects';\n features: FeatureCollection;\n imgData?: string[];\n}\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,\n LegendsListComponent, SelectedFeatureInfoComponent, DocumentSearchInfoComponent],\n providers: [CurrentItemsService, FeatureLoaderService, DrawLayerSourceService, ZoomService, UndoRedoService, ShowInfoHoverService, HoverInfoSearchService, CenterPointService, PrintDrawLayerSourceService,\n HighlightService, ShowInfoService, InfoSearchProvider, InteractionHelperService, ConflictAnalysisSearchProvider,\n MergeFeaturesService, OverlapService, CowiService, SearchProviderService, AddressSearchService, CadastreSearchService, ShowDocumentInfoService, DocumentSearchService,\n DmpCatalogService,OlCapabilitiesService, DmpLayerMapperService, GeometrySearchService] \n})\nexport class GisKomponentComponent implements OnInit, OnDestroy {\n\n private readonly _profileService = inject(ProfileService);\n private readonly _http = inject(HttpClient);\n private readonly _layerHelper = inject(LayerHelperService);\n private readonly _layerErrorService = inject(LayerErrorService);\n private readonly _layoutService = inject(LayoutService);\n private readonly _featureLoader = inject(FeatureLoaderService);\n private readonly _drawLayerService = inject(DrawLayerSourceService);\n private readonly _showHoverInfoService = inject(ShowInfoHoverService);\n private readonly _printHelper = inject(PrintHelperService);\n\n\n @Input({required: true}) identifier!: string;\n @Input() settings: GisKomponentSettings | undefined;\n @ViewChild('toolbarRef', { static: true }) toolbarRef!: ElementRef;\n @ViewChild('legendsListRef', { static: true }) legendsListRef!: ElementRef;\n @ViewChild('layerSelectorRef', { static: true }) layerSelectorRef!: ElementRef;\n @ViewChild('activeObjectsRef', {static: true }) activeObjectsRef!: ElementRef;\n @ViewChild('selectedFeatureInfoRef', {static: true }) selectedFeatureInfoRef!: ElementRef\n @ViewChild('documentInfoRef', {static: true }) documentInfoRef!: ElementRef\n\n\n @Output() sessionDone = new EventEmitter<ISessionDone>();\n @Output() featuresChanged = new EventEmitter<FeatureCollection>();\n\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 constructor() {\n this._currentItems.gisKomponentSettings = this.settings!\n }\n\n ngOnDestroy(): void {\n this._profileService.setProfileVersionChanged(false);\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 this._layoutService.map = this.map;\n\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 if (profile.showLegends) {\n const legendsListControl = new Control({\n element: this.legendsListRef?.nativeElement\n });\n this.map.addControl(legendsListControl);\n }\n \n if (profile.showLayerSelector) {\n const layerSelectorControl = new Control({\n element: this.layerSelectorRef?.nativeElement\n });\n this.map.addControl(layerSelectorControl);\n }\n\n this._currentItems.gisKomponentSettings = this.settings!;\n if (this.settings?.showActiveObjects && this.activeObjectsRef) {\n const activeObjectsControl = new Control({\n element: this.activeObjectsRef.nativeElement\n });\n this.map.addControl(activeObjectsControl);\n }\n\n const selectedFeatureInfoRefControl = new Control({\n element: this.selectedFeatureInfoRef.nativeElement\n });\n this.map.addControl(selectedFeatureInfoRefControl);\n\n if (this.settings?.showDocumentSearch) {\n const documentInfoRefControl = new Control({\n element: this.documentInfoRef.nativeElement\n });\n this.map.addControl(documentInfoRefControl);\n }\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._drawLayerService.features$.subscribe({\n next: features => { \n const geojson = new GeoJSON();\n this.featuresChanged.emit(geojson.writeFeaturesObject(features));\n }\n })\n this.map.on('moveend', this.onMoveEndCheckZoomFunction);\n this._showHoverInfoService.init();\n\n }}); \n }\n\n sessionDoneFromActiveObject(): void {\n const formatter = new GeoJSON();\n\n const sessionDone: ISessionDone = {\n doneFrom:'activeObjects',\n features: formatter.writeFeaturesObject(this._drawLayerService.allCleanedFeatures)\n };\n\n if (this._currentItems.gisKomponentSettings.printMapSettings && this._currentItems.gisKomponentSettings.printMapSettings.some(printSetting => printSetting.doPrintWhenSessionIsClosed)) {\n this._printHelper.getAllImgData(this.map, this._currentItems.gisKomponentSettings!.printMapSettings!.filter(printSetting => printSetting.doPrintWhenSessionIsClosed), this.selectedProfile.id).then(dataUrls => {\n sessionDone.imgData = dataUrls;\n this.sessionDone.emit(sessionDone);\n });\n } else {\n this.sessionDone.emit(sessionDone);\n }\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 if (layer.includedInPrint) this._layerHelper.setIncludedInPrint(result);\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 this._addRotateControl();\n\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=\"20\" height=\"20\" 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 const rotateControl = new Rotate({\n label: iconElement,\n tipLabel: 'Nulstil mod Nord',\n autoHide: false\n });\n\n this.map.addControl(rotateControl);\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}","<div #layerSelectorRef class=\"layer-selector-container\">\n @if (selectedProfile && selectedProfile.showLayerSelector) {\n <lib-layer-selector [map]=\"map\" [profile]=\"selectedProfile\" [currentZoomLevel]=\"currentZoomLevel\"></lib-layer-selector>\n }\n</div>\n\n<div #legendsListRef class=\"legends-list-container\">\n @if (selectedProfile && selectedProfile.showLegends) {\n <lib-legends-list [map]=\"map\" [profile]=\"selectedProfile\"></lib-legends-list>\n }\n</div>\n\n<div #selectedFeatureInfoRef class=\"selected-features-wrapper\">\n <selected-feature-info></selected-feature-info>\n</div>\n\n<div #documentInfoRef class=\"selected-features-wrapper\">\n <document-search-info></document-search-info>\n</div>\n\n<div #activeObjectsRef class=\"active-objects-container\">\n @if(settings && settings.showActiveObjects && selectedProfile) {\n <activeObjects [settings]=\"settings\" [profile]=\"selectedProfile\" (sessionDone)=\"sessionDoneFromActiveObject()\"></activeObjects>\n }\n</div>\n\n<div #toolbarRef class=\"map-toolbar-container\">\n @if(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=\"settings?.showMapSearch\" [profile]=\"selectedProfile\"></lib-map-search>\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":["i1.OlCapabilitiesService","i2","i3","i9","i1.DrawLayerSourceService","GeoJSON","buffer","turfBuffer","i1","turfPoint","turfFeature","feature","olFeature","Point","Draw","WKT","Select","Feature","i5","i6","i4","map","i7","LayerGroup","Map","Rotate"],"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/services/layoutService.ts","../../../projects/gis-komponent/src/lib/services/dmpCatalog.service.ts","../../../projects/gis-komponent/src/lib/services/olCapabilities.service.ts","../../../projects/gis-komponent/src/lib/services/dmpLayer-mapper.service.ts","../../../projects/gis-komponent/src/lib/models/widget.constants.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/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/centerPoint.service.ts","../../../projects/gis-komponent/src/lib/services/overlap.service.ts","../../../projects/gis-komponent/src/lib/services/infoSearch.service.ts","../../../projects/gis-komponent/src/lib/services/documentSearch.service.ts","../../../projects/gis-komponent/src/lib/services/showInfo.service.ts","../../../projects/gis-komponent/src/lib/services/geometry.service.ts","../../../projects/gis-komponent/src/lib/services/printHelper.service.ts","../../../projects/gis-komponent/src/lib/services/searchProvider.service.ts","../../../projects/gis-komponent/src/lib/services/cowi.service.ts","../../../projects/gis-komponent/src/lib/services/addressSearch.service.ts","../../../projects/gis-komponent/src/lib/services/cadastreSearch.service.ts","../../../projects/gis-komponent/src/lib/services/geometrySearch.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/services/conflictAnalysisSearch.service.ts","../../../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/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/selected-feature-info/selected-feature-info.component.ts","../../../projects/gis-komponent/src/lib/components/selected-feature-info/selected-feature-info.component.html","../../../projects/gis-komponent/src/lib/services/hoverInfoSearch.service.ts","../../../projects/gis-komponent/src/lib/services/showInfoHover.service.ts","../../../projects/gis-komponent/src/lib/components/document-search-info/document-search-info.component.ts","../../../projects/gis-komponent/src/lib/components/document-search-info/document-search-info.component.html","../../../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 private _profileVersionChanged: boolean = false;\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\n setProfileVersionChanged(value: boolean): void {\n this._profileVersionChanged = value;\n }\n\n getProfileVersionChanged(): boolean {\n return this._profileVersionChanged;\n }\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()\">×</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|string;\n hasError: boolean;\n lastError?: any;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class LayerErrorService {\n layerStatusChanged: Subject<number|string> = new Subject<number|string>();\n layerErrored: Subject<number|string> = new Subject<number|string>();\n private layerStatuses = new Map<number|string, LayerStatus>();\n private listeners = new Map<number|string, EventsKey[]>();\n private _errorService: LibErrorService = inject(LibErrorService);\n\n registerLayer(layerId: number | string, 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|string): 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';\nimport { DmpLayerResult } from './dmpCatalog.service';\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 _includedInPrint: string = 'includedInPrint';\n private readonly _layerGroupDbIdKey: string = 'layerGroupDbId';\n private readonly _mapFilteredLayerGroupsKeyName: string = 'mapFilteredLayerGroups';\n private readonly _dmpLayersCacheStoragKey = 'dmpLayersCache';\n private _layerErrorService: LayerErrorService = inject(LayerErrorService);\n layerActivatedByBackgroundGroup: Subject<number> = new Subject<number>();\n\n\n setDbId(layer: BaseLayer, id: number | string): 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 setIncludedInPrint(layer: BaseLayer): void {\n layer.set(this._includedInPrint, 'true');\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 let layersCachedToDisplay: { id: number | string, visible: boolean}[] = [];\n const dmpCacheValue = localStorage.getItem(`${this._dmpLayersCacheStoragKey}_${profileId}`);\n if (dmpCacheValue) {\n JSON.parse(dmpCacheValue).map((dmpLayer: DmpLayerResult) => \n ({ id: dmpLayer.datasetId, visible: dmpLayer.visible})).forEach((element: { id: number | string; visible: boolean; }) => {\n layersCachedToDisplay.push(element);\n });\n }\n const cacheValue = localStorage.getItem(`${this._mapFilteredLayerGroupsKeyName}_${profileId}`);\n if (cacheValue) {\n const cachedToDisplay = JSON.parse(cacheValue).cachedLayerGroups\n .flatMap((lg: LayerSelectorGroup) => lg.layers)\n .map((l: ILayer) => ({ id: l.id, visible: l.visible}));\n cachedToDisplay.forEach((element: { id: number | string; visible: boolean; }) => {\n layersCachedToDisplay.push(element);\n });\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 = layersCachedToDisplay\n .find((layer: { id: number | string; 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 if (cachedLayer) {\n //Set z index to match the order in cache\n l.setZIndex(layersCachedToDisplay.indexOf(cachedLayer));\n }\n });\n } else if (layergroup.get('dmp')) {\n const cachedLayer = layersCachedToDisplay\n .find((layer: { id: number | string; visible: boolean }) => layergroup.get(this._layerDbIdKey) == layer.id);\n const current = layergroup.getVisible();\n if (cachedLayer != undefined && current != cachedLayer.visible) {\n layergroup.setVisible(cachedLayer.visible);\n }\n if (cachedLayer) {\n //Set z index to match the order in cache\n layergroup.setZIndex(layersCachedToDisplay.indexOf(cachedLayer));\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 if (!(layergroup as OLLayerGroup)) return;\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 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 currentIndex$.next(index + 1);\n }\n }\n )\n );\n }\n ));\n activation$.subscribe();\n }\n\n updateLayerOpacityInMap(map: Map, layerId: number | string, opacity: number | undefined): 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 && opacity != undefined) {\n l.setOpacity(opacity);\n }\n })\n // DMP layer\n } else if (layergroup.get('dmp') && layergroup.get(this._layerDbIdKey) === layerId && opacity != undefined) {\n layergroup.setOpacity(opacity);\n }\n })\n }\n\n toggleLayerInMap(map: Map, layerId: number | string): 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 // DMP layer\n } else if (layergroup.get('dmp') && layergroup.get(this._layerDbIdKey) === layerId) {\n const current = layergroup.getVisible();\n layergroup.setVisible(!current);\n }\n });\n }\n\n toggleAllPrintLayersInMap(map: Map): void { // For printing\n map.getLayers().getArray().forEach(layergroup => {\n if (layergroup instanceof OLLayerGroup) {\n layergroup.getLayers().getArray().forEach(l =>l.setVisible(l.get(this._includedInPrint) != undefined));\n } else if (layergroup.get('dmp')) {\n //DMP layer, turn off\n layergroup.setVisible(false);\n }\n });\n }\n\n deleteDmpLayerFromMap(map: Map, layerId: string): void {\n map.getLayers().getArray().forEach(layergroup => {\n if (layergroup.get(this._layerDbIdKey) === layerId) {\n layergroup.setVisible(false);\n map.removeLayer(layergroup);\n }\n });\n }\n}","import { Injectable } from '@angular/core';\nimport { Map } from 'ol';\nimport { Subject } from 'rxjs';\n\ntype VerticalPosition = 'top' | 'middle' | 'bottom';\ntype HorizontalPosition = 'left' | 'middle' | 'right';\nexport interface WidgetPositionOptions {\n initialPosition: string;\n widgetName: string;\n widgetWidth: number;\n widgetHeight: number;\n offsetX?: number; // padding from edges\n offsetY?: number; // padding from edges\n currentPosition?: { x: number; y: number} | null;\n resizedContainerHeight?: number | null;\n resizedContainerWidth?: number | null;\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class LayoutService {\n private _map: Map | undefined;\n mapResizedSubject: Subject<boolean> = new Subject(); \n set map(value: Map) {\n this._map = value;\n }\n\n async keepWidgetInViewPort(dragPosition:{ x: number; y: number}, widgetName: string, widgetHeight: number,\n widgetWidth: number, resizedContainerHeight: number | null = null, resizedContainerWidth: number | null = null):Promise<{ x: number; y: number}> {\n //Expanding or changing map size, make sure the widget stays in viewport\n const widgetPositionOptions: WidgetPositionOptions = {\n initialPosition: '',\n widgetName: widgetName,\n widgetHeight: widgetHeight,\n widgetWidth: widgetWidth,\n currentPosition: dragPosition,\n resizedContainerHeight: resizedContainerHeight,\n resizedContainerWidth: resizedContainerWidth\n }\n return this.calculateWidgetPosition(widgetPositionOptions);\n }\n\n async calculateWidgetPosition({\n initialPosition,\n widgetName,\n widgetWidth,\n widgetHeight,\n offsetX = 2,\n offsetY = 9,\n currentPosition = null,\n resizedContainerHeight = null,\n resizedContainerWidth = null\n }: WidgetPositionOptions): Promise<{ x: number; y: number}> {\n let x = 0;\n let y = 0;\n let dragPosition = { x: x, y: y};\n if (!this._map) return dragPosition;\n console.log('calculateWidgetPosition', initialPosition, widgetName);\n const containerRect = await this._getMapRect();\n\n if (currentPosition) {\n // Expanding a widget or viewport changed size, so fit the widget inside view again\n x = currentPosition.x;\n y = currentPosition.y;\n if (resizedContainerHeight && resizedContainerWidth) {\n containerRect.height = resizedContainerHeight;\n containerRect.width = resizedContainerWidth;\n }\n } else {\n let vertical: VerticalPosition = 'top';\n let horizontal: HorizontalPosition = 'left';\n switch (initialPosition) {\n case 'øverst/venstre':\n vertical = 'top';\n horizontal = 'left';\n break;\n\n case 'midt/venstre':\n vertical = 'middle';\n horizontal = 'left';\n break;\n\n case 'nederst/venstre':\n vertical = 'bottom';\n horizontal = 'left';\n break;\n\n case 'øverst/midt':\n vertical = 'top';\n horizontal = 'middle';\n break;\n\n case 'nederst/midt':\n vertical = 'bottom';\n horizontal = 'middle';\n break;\n\n case 'øverst/højre':\n vertical = 'top';\n horizontal = 'right';\n break;\n\n case 'midt/højre':\n vertical = 'middle';\n horizontal = 'right';\n break;\n\n case 'nederst/højre':\n vertical = 'bottom';\n horizontal = 'right';\n break;\n default: break;\n }\n // Vertical positioning\n switch (vertical) {\n case 'top':\n y = offsetY;\n break;\n case 'middle':\n y = (containerRect.height - widgetHeight) / 2;\n break;\n case 'bottom':\n if (horizontal === 'left') offsetY = offsetY + 90; // Move above scalebar in bottom-left corner\n y = containerRect.height - widgetHeight - offsetY;\n break;\n }\n\n // Horizontal positioning\n switch (horizontal) {\n case 'left':\n if (vertical === 'top') offsetX = offsetX + 35; // Move to right of zoom in top-left corner\n x = offsetX;\n break;\n case 'middle':\n x = (containerRect.width - widgetWidth) / 2;\n break;\n case 'right':\n if (vertical === 'top') offsetX = offsetX + 35; // Move to left of compass in top-right corner\n x = containerRect.width - widgetWidth - offsetX;\n break;\n }\n }\n\n // Ensure the widget stays inside the viewport\n x = Math.max(offsetX, Math.min(x, containerRect.width - widgetWidth));\n y = Math.max(offsetY, Math.min(y, containerRect.height - widgetHeight));\n\n dragPosition = { x: x, y: y};\n this._savePosition(widgetName, dragPosition);\n\n console.log('end result', dragPosition);\n return { x, y };\n }\n\n private async _getMapRect(): Promise<DOMRect> {\n\n console.log('_getMapRect', Date.now);\n const element = this._map?.getViewport();\n if (!element || element.getBoundingClientRect()?.height === 0) {\n await new Promise(resolve => this._map?.once('rendercomplete', resolve));\n }\n\n console.log('_getMapRect rendercomplete', element?.getBoundingClientRect(), Date.now);\n return element?.getBoundingClientRect() ?? new DOMRect();\n }\n\n private _savePosition(widgetStorageKey: string, position: { x: number; y: number }): void {\n try {\n localStorage.setItem(widgetStorageKey, JSON.stringify(position));\n } catch (error) {\n console.error('Error saving position to localStorage:', error);\n }\n }\n\n\n}","import { Injectable } from '@angular/core';\nimport { HttpClient, HttpParams } from '@angular/common/http';\nimport { Observable, switchMap, map, combineLatest } from 'rxjs';\n\nexport interface DmpLayerResult {\n datasetId: string;\n title: string;\n description: string;\n serviceType: 'WMS' | 'WMTS' | 'WFS';\n sourceUrl: string;\n layers: string;\n availability?: string;\n license?: {\n title?: string;\n url?: string;\n };\n dataLiabilityAgreement?: {\n title?: string;\n url?: string;\n };\n tags?: string[];\n category?: string;\n metaDataUrl?: string;\n visible: boolean;\n opacity: number;\n hasErrors: boolean;\n}\n\n@Injectable()\nexport class DmpCatalogService {\n private readonly aiSearchUrl = 'https://datakatalog.miljoeportal.dk/api/search/ai-search';\n\n private readonly datasetsUrl = 'https://datakatalog.udv.miljoeportal.dk/api/datasets';\n\n private readonly datasetsStatusUrl = 'https://datakatalog.udv.miljoeportal.dk/api/datasetavailabilities';\n\n constructor(private http: HttpClient) {}\n\n searchLayers(searchText: string): Observable<DmpLayerResult[]> {\n return this._aiSearch(searchText).pipe(\n switchMap(ids => {\n if (!ids.length) {\n return [];\n }\n return this._fetchDatasets(ids);\n })\n );\n }\n\n private _aiSearch(searchText: string): Observable<string[]> {\n return this.http.post<any>(this.aiSearchUrl, {\n searchText: searchText, entityTypes: ['ds']\n }).pipe(\n map(res =>\n (res?.results ?? [])\n .map((r: any) => r.id)\n .filter(Boolean)\n )\n );\n }\n private _fetchDatasets(ids: string[]): Observable<DmpLayerResult[]> {\n const params = new HttpParams()\n .set('filter', `any(id,${ids.map(id => `'${id}'`).join(',')})`)\n .set(\n 'include',\n [\n 'wmsSource',\n 'wfsSource',\n 'wmtsSource',\n 'license',\n 'tags',\n 'category',\n 'dataLiabilityAgreement'\n ].join(','));\n const datasets$ = this.http.get<any>(this.datasetsUrl, { params });\n const availabilityParams = new HttpParams()\n .set('filter', `any(id,${ids.map(id => `'${id}'`).join(',')})`);\n const availability$ = this.http.get<any>(this.datasetsStatusUrl,{ params: availabilityParams });\n return combineLatest([datasets$, availability$]).pipe(\n map(([datasetsRes, availabilityRes]) => this._compileResults(datasetsRes, availabilityRes)));\n }\n\n private _compileResults(\n datasetsResponse: any,\n availabilityResponse: any\n ): DmpLayerResult[] {\n const datasets = datasetsResponse.data ?? [];\n const included = datasetsResponse.included ?? [];\n const availabilityByDatasetId = new Map<string, string>();\n for (const a of availabilityResponse.data ?? []) {\n availabilityByDatasetId.set(\n a.id,\n a.attributes?.status\n );\n }\n const includedByKey = new Map<string, any>();\n for (const inc of included) {\n includedByKey.set(`${inc.type}:${inc.id}`, inc);\n }\n const results: DmpLayerResult[] = [];\n for (const ds of datasets) {\n const title = ds.attributes?.title ?? 'Untitled';\n const description = ds.attributes?.description ?? null;\n const metaDataUrl = ds.attributes?.metadata ?? null;\n const datasetId = ds.id;\n const commonMeta = {\n datasetId,\n title,\n description,\n availability: availabilityByDatasetId.get(datasetId),\n license: this._resolveSingleWithUrl(\n ds.relationships?.license,\n includedByKey\n ),\n dataLiabilityAgreement: this._resolveSingleWithUrl(\n ds.relationships?.dataLiabilityAgreement,\n includedByKey\n ),\n tags: this._resolveMulti(ds.relationships?.tags, includedByKey),\n category: this._resolveSingle(\n ds.relationships?.category,\n includedByKey\n ),\n metaDataUrl,\n visible: true,\n opacity: 1,\n hasErrors: false\n };\n this._extractService(\n ds,\n 'wmsSource',\n 'WMS',\n commonMeta,\n includedByKey,\n results\n );\n this._extractService(\n ds,\n 'wmtsSource',\n 'WMTS',\n commonMeta,\n includedByKey,\n results\n );\n this._extractService(\n ds,\n 'wfsSource',\n 'WFS',\n commonMeta,\n includedByKey,\n results\n );\n }\n return results;\n }\n\n private _extractService(\n dataset: any,\n relationName: string,\n serviceType: 'WMS' | 'WMTS' | 'WFS',\n meta: Partial<DmpLayerResult>,\n includedByKey: Map<string, any>,\n results: DmpLayerResult[]\n ) {\n const rel = dataset.relationships?.[relationName]?.data;\n if (!rel) return;\n const inc = includedByKey.get(`${rel.type}:${rel.id}`);\n if (!inc) return;\n const url = inc.attributes?.url;\n const layer = inc.attributes?.layer;\n if (!url || !layer) return;\n results.push({\n ...meta,\n serviceType,\n sourceUrl: url,\n layers: layer\n } as DmpLayerResult);\n }\n\n private _resolveSingle(rel: any, included: Map<string, any>): string | undefined {\n if (!rel?.data) return undefined;\n const inc = included.get(`${rel.data.type}:${rel.data.id}`);\n return inc?.attributes?.title ?? inc?.attributes?.name;\n }\n\n private _resolveMulti(rel: any, included: Map<string, any>): string[] | undefined {\n if (!Array.isArray(rel?.data)) return undefined;\n return rel.data\n .map((r: any) => {\n const inc = included.get(`${r.type}:${r.id}`);\n return inc?.attributes?.title ?? inc?.attributes?.name;\n })\n .filter(Boolean);\n }\n\n private _resolveSingleWithUrl(\n rel: any,\n included: Map<string, any>\n ): { title?: string; url?: string } | undefined {\n if (!rel?.data) return undefined;\n const inc = included.get(`${rel.data.type}:${rel.data.id}`);\n if (!inc) return undefined;\n return {\n title: inc.attributes?.title ?? inc.attributes?.name,\n url:\n inc.attributes?.url ??\n inc.attributes?.link ??\n inc.attributes?.landingPage\n };\n }\n}\n","import { Injectable } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { map, Observable } from 'rxjs';\nimport WMSCapabilities from 'ol/format/WMSCapabilities';\nimport WMTSCapabilities from 'ol/format/WMTSCapabilities';\n\n@Injectable()\nexport class OlCapabilitiesService {\n constructor(private http: HttpClient) {}\n\n loadWmsCapabilities(url: string): Observable<any> {\n const capUrl = `${url}?service=WMS&request=GetCapabilities`;\n return this.http.get(capUrl, { responseType: 'text' }).pipe(\n map(xml => new WMSCapabilities().read(xml))\n );\n }\n\n loadWmtsCapabilities(url: string): Observable<any> {\n url = url.replace('&service=wmts&request=getcapabilities','');\n const capUrl = `${url}&service=WMTS&request=GetCapabilities`;\n return this.http.get(capUrl, { responseType: 'text' }).pipe(\n map(xml => new WMTSCapabilities().read(xml))\n );\n }\n}\n","import { Injectable } from '@angular/core';\nimport BaseLayer from 'ol/layer/Base';\nimport VectorLayer from 'ol/layer/Vector';\nimport VectorSource from 'ol/source/Vector';\nimport { GeoJSON } from 'ol/format';\nimport { map, Observable } from 'rxjs';\nimport { OlCapabilitiesService } from './olCapabilities.service';\nimport { DmpLayerResult } from './dmpCatalog.service';\nimport TileLayer from 'ol/layer/Tile';\nimport WMTS, { optionsFromCapabilities } from 'ol/source/WMTS';\nimport { TileWMS } from 'ol/source';\n\n@Injectable()\nexport class DmpLayerMapperService {\n constructor(private caps: OlCapabilitiesService) {}\n\n toBaseLayer(result: DmpLayerResult): Observable<BaseLayer> {\n switch (result.serviceType) {\n case 'WMS':\n return this.caps.loadWmsCapabilities(result.sourceUrl).pipe(\n map(cap => {\n const layer = this._createWmsLayerFromCapabilities(\n cap,\n result.layers,\n result.sourceUrl\n );\n this._attachMetadata(layer, result);\n return layer;\n })\n );\n\n case 'WMTS':\n return this.caps.loadWmtsCapabilities(result.sourceUrl).pipe(\n map(cap => {\n const layer = this._createWmtsLayerFromCapabilities(\n cap,\n result.layers,\n result.sourceUrl\n );\n this._attachMetadata(layer, result);\n return layer;\n })\n );\n\n case 'WFS':\n const wfsLayer = new VectorLayer({\n source: new VectorSource({\n format: new GeoJSON(),\n url: `${result.sourceUrl}?service=WFS&request=GetFeature&version=2.0.0&typename=${result.layers}&outputFormat=application/json`\n })\n });\n this._attachMetadata(wfsLayer, result);\n return new Observable(o => {\n o.next(wfsLayer);\n o.complete();\n });\n\n default:\n throw new Error('Unsupported service type');\n }\n }\n\n private _attachMetadata(layer: BaseLayer, r: DmpLayerResult) {\n layer.setProperties({\n id: r.datasetId,\n title: r.title,\n serviceType: r.serviceType,\n dmp: true\n });\n }\n\n private _createWmtsLayerFromCapabilities(\n capabilities: any,\n layerName: string,\n url: string\n ): TileLayer {\n\n const options = optionsFromCapabilities(capabilities, {\n layer: layerName,\n matrixSet: this._findBestMatrixSet(capabilities, layerName),\n requestEncoding: 'KVP'\n });\n\n options!!.urls = [url];\n\n return new TileLayer({\n source: new WMTS(options!!)\n });\n }\n\n private _findBestMatrixSet(cap: any, layerName: string): string {\n const layer = cap.Contents.Layer.find((l: any) => l.Identifier === layerName);\n return layer.TileMatrixSetLink[0].TileMatrixSet;\n }\n\n private _createWmsLayerFromCapabilities(\n capabilities: any,\n layerName: string,\n url: string\n ): TileLayer {\n\n const available = this._findWmsLayer(capabilities.Capability.Layer, layerName);\n if (!available) {\n throw new Error(`WMS layer not found in capabilities: ${layerName}`);\n }\n\n return new TileLayer({\n source: new TileWMS({\n url,\n params: {\n LAYERS: layerName,\n TILED: true\n },\n serverType: 'geoserver',\n crossOrigin: 'anonymous'\n })\n });\n }\n\n private _findWmsLayer(layer: any, name: string): any {\n if (layer.Name === name) return layer;\n if (!layer.Layer) return null;\n\n for (const l of layer.Layer) {\n const found = this._findWmsLayer(l, name);\n if (found) return found;\n }\n return null;\n }\n}\n","export class WidgetConstants {\n static collapsedHeight: number = 24;\n static collapsedWidth: number = 86;\n static toolboxHeight: number = 64;\n static toolboxWidth: number = 729;\n static searchHeight: number = 122;\n static searchWidth: number = 374;\n static activeObjectsHeight: number = 80;\n static activeObjectsWidth: number = 350;\n static layerSelectorHeight: number = 209;\n static layerSelectorWidth: number = 329;\n static legendsHeight: number = 341;\n static legendsWidth: number = 296;\n static toolboxDefaultX: number = 29;\n static toolboxDefaultY: number = 120;\n static searchDefaultX: number = 29;\n static searchDefaultY: number = 5;\n static activeObjectsDefaultX: number = 29;\n static activeObjectsDefaultY: number = 238;\n static layerSelectorDefaultX: number = 29;\n static layerSelectorDefaultY: number = 470;\n static legendsDefaultX: number = 1790;\n static legendsDefaultY: number = 743;\n}","import { Component, ElementRef, inject, Input, OnChanges, OnInit, SimpleChanges, TemplateRef, ViewChild } from '@angular/core';\nimport { CdkDragDrop, CdkDragEnd, 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';\nimport { LayoutService, WidgetPositionOptions } from '../../services/layoutService';\nimport { IProfileDetailed } from '../../models/IProfile';\nimport { DmpCatalogService, DmpLayerResult } from '../../services/dmpCatalog.service';\nimport { MatOptionModule } from '@angular/material/core';\nimport { debounceTime, distinctUntilChanged, Subject, switchMap } from 'rxjs';\nimport { DmpLayerMapperService } from '../../services/dmpLayer-mapper.service';\nimport { MatDialog, MatDialogActions, MatDialogContent, MatDialogModule, MatDialogRef } from '@angular/material/dialog';\nimport { ProfileService } from '../../services/profile.service';\nimport { WidgetConstants } from '../../models/widget.constants';\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, MatOptionModule, MatDialogModule, MatDialogContent, MatDialogActions ]\n})\nexport class LayerSelectorComponent implements OnInit, OnChanges {\n @ViewChild('layerSelectorBody', { static: false }) set contentBody(content: ElementRef) {\n this._layerSelectorBody = content;\n }\n @ViewChild('dmpDialog') dmpDialog!: TemplateRef<any>;\n @Input() map!: Map;\n @Input() profile!: IProfileDetailed;\n @Input() currentZoomLevel!: number;\n searchText = '';\n dmpSearchText: string = '';\n private _dmpSearchTextSubject = new Subject<string>();\n allLayerGroups: LayerSelectorGroup[] = [];\n filteredLayerGroups: LayerSelectorGroup[] = [];\n dmpLayers: DmpLayerResult[] = [];\n filteredDmpLayers: DmpLayerResult[] = [];\n dmpLayerResults: DmpLayerResult[] = [];\n dmpSearchMode: boolean = false;\n filteredBackgroundLayerGroups: LayerSelectorGroup[] = [];\n showLegend: boolean = false;\n collapsed: boolean = true;\n layerSelectorDragPosition : { x: number; y: number} = { x: 0, y: 0 };\n legendUrl: string = 'https://docs.geoserver.org/main/en/user/_images/samplelegend.png';\n private _layerSelectorBody!: ElementRef;\n private _layerSelectorBodyControl!: ol_control_Control;\n private dialogRef?: MatDialogRef<any>;\n private _dialog: MatDialog = inject(MatDialog);\n\n private readonly _mapFilteredLayerGroupsKeyName: string = 'mapFilteredLayerGroups';\n private readonly POSITION_STORAGE_KEY = 'layerSelectorPosition';\n private readonly _dmpLayersCacheStoragKey = 'dmpLayersCache';\n private readonly _layerHelper: LayerHelperService = inject(LayerHelperService);\n private readonly _layerErrorService: LayerErrorService = inject(LayerErrorService);\n private readonly _layoutService: LayoutService = inject(LayoutService);\n private readonly _dmpCatalogService: DmpCatalogService = inject(DmpCatalogService);\n private readonly _dmpMapper: DmpLayerMapperService = inject(DmpLayerMapperService);\n private readonly _profileService: ProfileService = inject(ProfileService);\n\n ngOnInit(): void {\n this._dmpSearchTextSubject.pipe(\n debounceTime(200),\n distinctUntilChanged(),\n switchMap(value => this._dmpCatalogService.searchLayers(value))\n ).subscribe({\n next: result => {\n this.dmpLayerResults = result.map(layer => ({...layer, availability: \n layer.availability?.replace('unavailable', 'Ikke klar til brug').replace('available', 'Klar til brug')\n .replace('partly', 'Delvis klar til brug')}))\n }\n });\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['profile'] && this.profile) {\n this.collapsed = this.profile.layerSelectorFolded;\n this._layerHelper.layerActivatedByBackgroundGroup\n .subscribe(layerId => {\n this.toggleLayer(layerId, undefined, true, true);\n });\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 this.allLayerGroups = this.profile.layerGroups\n .map((lg, idx) => ({... lg, \n noOfVisibleLayers: lg.layers.filter(l => l.activeInSelector && l.visible).length, \n visible: lg.layers.some(l => l.visible),\n expanded: lg.folded === false,\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._profileService.setProfileVersionChanged(true);\n this._loadPosition(this.collapsed);\n this.filterChanged();\n this._cacheProfileInfo();\n } else {\n this._loadPosition(this.collapsed);\n this.filteredLayerGroups = cachedProfileInfo.cachedLayerGroups.filter(gr => !gr.background);;\n this.filteredBackgroundLayerGroups = cachedProfileInfo.cachedLayerGroups.filter(gr => gr.background);\n this._setVisibleLayersFromCache(cachedProfileInfo.cachedLayerGroups);\n }\n } else {\n this._loadPosition(this.collapsed);\n this.filterChanged();\n this._cacheProfileInfo();\n }\n const dmpLayersCacheValue = localStorage.getItem(`${this._dmpLayersCacheStoragKey}_${this.profile.id}`);\n if (dmpLayersCacheValue) {\n this.dmpLayers = JSON.parse(dmpLayersCacheValue);\n this.dmpLayers.forEach(dmpLayer => {\n const dmpLayerId: string = dmpLayer.datasetId;\n this._dmpMapper.toBaseLayer(dmpLayer).subscribe(layer => {\n this._layerHelper.setDbId(layer, dmpLayerId);\n this._layerErrorService.registerLayer(dmpLayerId, layer);\n layer.setVisible(dmpLayer.visible);\n this.map.addLayer(layer);\n });\n });\n this.filteredDmpLayers = this.dmpLayers.filter(dmpLayer => true);\n }\n // Apply Failover logic to all background groups\n this.filteredBackgroundLayerGroups\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._initializeMapControl();\n }\n }\n\n onLayerSelectorDragEnded(event: CdkDragEnd): void {\n const position = event.source.getFreeDragPosition();\n this.layerSelectorDragPosition = position;\n try {\n localStorage.setItem(\n this.POSITION_STORAGE_KEY,\n JSON.stringify(position)\n );\n } catch (error) {\n console.error('Error saving layer selector position to localStorage:', error);\n }\n }\n \n \nopenUrl(url: string | null | undefined): void {\n if (!url) return;\n\n const localUrl = url.startsWith('http:') || url.startsWith('https:') ? url : `https://${url}`;\n window.open(localUrl, '_blank');\n}\n\n\n toggleDmpSearch(value: boolean): void {\n this.dmpSearchMode = value;\n if (!this.dmpSearchMode) {\n this.dmpLayerResults = [];\n this.dmpSearchText = '';\n this.dialogRef?.close();\n } else {\n this.dialogRef = this._dialog.open(this.dmpDialog, {\n disableClose: true,\n hasBackdrop: true,\n autoFocus: true,\n restoreFocus: true,\n width: '700px',\n panelClass: 'dmp-dialog-content'\n });\n }\n }\n\n searchDmp(): void {\n if (!this.dmpSearchText || this.dmpSearchText === '') {\n this.dmpLayerResults = [];\n return;\n }\n this._dmpSearchTextSubject.next(this.dmpSearchText);\n }\n\n addDmpLayer(dmpLayer: DmpLayerResult): void {\n this.dmpLayers.push(dmpLayer);\n this.filteredDmpLayers.push(dmpLayer);\n this._cacheDmpLayers();\n const dmpLayerId: string = dmpLayer.datasetId;\n this._dmpMapper.toBaseLayer(dmpLayer).subscribe(layer => {\n this._layerHelper.setDbId(layer, dmpLayerId);\n this._layerErrorService.registerLayer(dmpLayerId, layer);\n this.map.addLayer(layer);\n });\n }\n\n deleteDmpLayer(dmpLayer: DmpLayerResult, event?: MouseEvent): void {\n event?.stopPropagation();\n this.dmpLayers = this.dmpLayers.filter(layer => layer.datasetId != dmpLayer.datasetId);\n this.filteredDmpLayers = this.filteredDmpLayers.filter(layer => layer.datasetId != dmpLayer.datasetId);\n this._layerHelper.deleteDmpLayerFromMap(this.map, dmpLayer.datasetId);\n this._cacheDmpLayers();\n }\n\n private _cacheDmpLayers(): void {\n localStorage.setItem(`${this._dmpLayersCacheStoragKey}_${this.profile.id}`, JSON.stringify(this.dmpLayers));\n }\n\n toggleLayer(layerId: number | string, event?: MouseEvent, skipMapToggle: boolean = false, value: boolean | undefined = undefined): 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.concat(this.filteredBackgroundLayerGroups).forEach(group => {\n let singleLayerIdToKeepOn = 0;\n group.layers.forEach(l => {\n if (layerId === l.id) {\n l.visible = value != undefined ? value : !l.visible;\n if (l.visible && !group.allowMultiSelect) {\n // Group doesn't allow multi select and we just turned this layer on\n // so turn all others off\n singleLayerIdToKeepOn = l.id;\n }\n }});\n if (singleLayerIdToKeepOn > 0) {\n group.layers.forEach(l => {\n if (singleLayerIdToKeepOn !== l.id) {\n l.visible = false;\n this._layerHelper.toggleLayerInMap(this.map, l.id);\n }});\n }\n group.noOfVisibleLayers = group.layers.filter(l => l.activeInSelector && l.visible).length;\n group.visible = group.layers.some(l => l.visible);\n });\n // DMP Layer\n this.dmpLayers.forEach(dmpLayer => { if (dmpLayer.datasetId === layerId) dmpLayer.visible = !dmpLayer.visible});\n this._cacheProfileInfo();\n }\n\n setLayerErrorStatus(layerId: number|string, errorStatus: boolean): void {\n this.filteredLayerGroups.concat(this.filteredBackgroundLayerGroups).forEach(group => {\n group.layers.forEach(l => {\n if (layerId === l.id) {\n l.hasErrors = errorStatus;\n }});\n });\n //DMP layer\n this.dmpLayers.forEach(dmpLayer => {\n if (dmpLayer.datasetId === layerId) {\n dmpLayer.hasErrors = errorStatus;\n }\n });\n this.filteredDmpLayers.forEach(dmpLayer => {\n if (dmpLayer.datasetId === layerId) {\n dmpLayer.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.concat(this.filteredBackgroundLayerGroups).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.activeInSelector && 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 async toggleLayerSelector(): Promise<void> {\n this.collapsed = !this.collapsed;\n if (this.collapsed) {\n this.searchText = '';\n this.filterChanged();\n }\n if (!this.collapsed) {\n //Expanding, make sure it stays in viewport\n this.layerSelectorDragPosition = await this._layoutService.keepWidgetInViewPort(this.layerSelectorDragPosition, this.POSITION_STORAGE_KEY,\n WidgetConstants.layerSelectorHeight, WidgetConstants.layerSelectorWidth);\n }\n }\n\n updateOpacity(layerId: number | string, opacity: number | undefined): void {\n this._layerHelper.updateLayerOpacityInMap(this.map, layerId, opacity);\n }\n\n stopDrag(event: Event): void {\n event.stopPropagation(); // prevents drag container from activating\n }\n\n filterChanged(): void {\n this.filteredLayerGroups = this.setfilteredGroups().filter(gr => !gr.background); \n this.filteredBackgroundLayerGroups = this.setfilteredGroups().filter(gr => gr.background);\n this.filteredDmpLayers = this.dmpLayers.filter(dmpLayer => this.searchText === '' || \n dmpLayer.title.toLocaleLowerCase().includes(this.searchText.toLocaleLowerCase()));\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: g.folded === 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[]>, groupArray: LayerSelectorGroup[]) {\n moveItemInArray(groupArray, 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 dropDmpLayer(event: CdkDragDrop<DmpLayerResult[]>): void {\n this._dropDmpLayer(event, this.dmpLayers);\n this._dropDmpLayer(event, this.filteredDmpLayers);\n }\n private _dropDmpLayer(event: CdkDragDrop<DmpLayerResult[]>, dmpArray: DmpLayerResult[]) {\n if (event.previousContainer === event.container) {\n moveItemInArray(dmpArray, 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._cacheProfileInfo();\n }\n\n clearSearchText(): void {\n this.searchText = '';\n this.filterChanged();\n this._cacheProfileInfo();\n }\n\n clearDmpSearchText(): void {\n this.dmpSearchText = '';\n this.dmpLayerResults = [];\n }\n\n updateGroupSortOrders() {\n this.filteredLayerGroups.forEach((g, idx) => (g.sortOrder = idx));\n this.filteredBackgroundLayerGroups.forEach((g, idx) => (g.sortOrder = idx));\n }\n\n updateLayerSortOrders(group: LayerSelectorGroup) {\n group.layers.forEach((layer, idx) => (layer.sortOrder = idx));\n }\n\n onDragEnded(event: any): void {\n const position = event.source.getFreeDragPosition();\n this.layerSelectorDragPosition = 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 async _loadPosition(collapsed: boolean): Promise<void> {\n try {\n // Default height and width when collapsed\n let widgetHeight: number = WidgetConstants.collapsedHeight;\n let widgetWidth: number = WidgetConstants.collapsedWidth;\n if (!collapsed) {\n // Custom height and width when expanded\n widgetHeight = WidgetConstants.layerSelectorHeight;\n widgetWidth = WidgetConstants.layerSelectorWidth;\n }\n const widgetPositionOptions: WidgetPositionOptions = {\n initialPosition: this.profile.layerSelectorInitialPosition,\n widgetName: this.POSITION_STORAGE_KEY,\n widgetHeight: widgetHeight,\n widgetWidth: widgetWidth\n }\n const savedPosition = localStorage.getItem(this.POSITION_STORAGE_KEY);\n if (this._profileService.getProfileVersionChanged() &&\n this.profile?.layerSelectorInitialPosition) {\n //Profile version changed in backend, use that\n this.layerSelectorDragPosition = await this._layoutService.calculateWidgetPosition(widgetPositionOptions);\n } else if (savedPosition) {\n this.layerSelectorDragPosition = JSON.parse(savedPosition);\n } else if (this.profile?.layerSelectorInitialPosition) {\n this.layerSelectorDragPosition = await this._layoutService.calculateWidgetPosition(widgetPositionOptions);\n } else {\n // Default position for layer selector\n this.layerSelectorDragPosition = { x: WidgetConstants.layerSelectorDefaultX, y: WidgetConstants.layerSelectorDefaultY };\n this._savePosition(this.layerSelectorDragPosition);\n }\n } catch (error) {\n console.error('Error loading position from localStorage:', error);\n this.layerSelectorDragPosition = { x: 0, y: 0 };\n }\n }\n\n private _cacheProfileInfo(): void {\n const cacheItem: CachedProfileInfo = { profile: this.profile, cachedLayerGroups: this.filteredLayerGroups.concat(this.filteredBackgroundLayerGroups) };\n localStorage.setItem(`${this._mapFilteredLayerGroupsKeyName}_${this.profile.id}`, JSON.stringify(cacheItem));\n this._cacheDmpLayers();\n // Reflect new order in map\n this._layerHelper.applyCachedLayersToDisplayInMap(this.map, this.profile.id);\n }\n\n private _initializeMapControl(): void {\n this.map.removeControl(this._layerSelectorBodyControl);\n if (this._layerSelectorBody?.nativeElement) {\n const element = this._layerSelectorBody.nativeElement;\n this._layerSelectorBodyControl = new ol_control_Control({ element: element });\n this.map.addControl(this._layerSelectorBodyControl);\n }\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\n #layerSelectorBody\n class=\"layer-selector-body-wrapper global-wrapper-container\"\n cdkDrag\n cdkDragBoundary=\".map-container\"\n [cdkDragFreeDragPosition]=\"layerSelectorDragPosition\"\n (cdkDragEnded)=\"onLayerSelectorDragEnded($event)\"\n [class.collapsed]=\"collapsed\">\n\n <div class=\"drag-handle-selector\" cdkDragHandle>\n <div class=\"drag-handle-content\">\n <div class=\"drag-handle-icons\">\n <mat-icon \n class=\"icon-left\" \n matTooltip=\"Lag\" \n [matTooltipShowDelay]=\"500\"\n [matTooltipHideDelay]=\"100\" \n matTooltipPosition=\"above\">\n layers\n </mat-icon>\n <mat-icon class=\"toggle-icon\" (click)=\"toggleLayerSelector()\">\n {{ collapsed ? 'flip_to_front' : 'remove' }}\n </mat-icon>\n </div>\n </div>\n </div>\n\n <div class=\"ol-unselectable ol-control layer-selector-body\" *ngIf=\"!collapsed\">\n <div class=\"search-section\">\n <div class=\"search-field-wrapper\">\n <label class=\"search-label\">Filtrer</label>\n <mat-form-field appearance=\"outline\" class=\"w-full\">\n <mat-icon matPrefix class=\"search-icon\">search</mat-icon>\n <input \n matInput \n type=\"text\" \n [(ngModel)]=\"searchText\" \n (ngModelChange)=\"filterChanged()\"\n />\n </mat-form-field>\n </div>\n <mat-icon matTooltip=\"Nulstil\" \n [matTooltipShowDelay]=\"200\"\n [matTooltipHideDelay]=\"300\" (click)=\"clearSearchText()\">\n replay</mat-icon>\n </div>\n <div\n cdkDropList\n [cdkDropListData]=\"filteredLayerGroups\"\n (cdkDropListDropped)=\"dropGroup($event, filteredLayerGroups)\"\n class=\"item-list\">\n @for (group of filteredLayerGroups; track group.id; let gIndex = $index) {\n <div class=\"group\" cdkDrag>\n <mat-expansion-panel [(expanded)]=\"group.expanded\">\n <mat-expansion-panel-header>\n <mat-panel-title>\n <mat-icon class=\"drag-indicator\">drag_indicator</mat-icon>\n <span class=\"panel-title\">{{ group.name }}</span>\n ({{ group.noOfVisibleLayers }}/{{ group.layers.length }})\n @if (group.visible) {\n <mat-icon (click)=\"toggleGroup($event, group)\" class=\"power-on\" \n matTooltip=\"Sluk\" \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=\"Tænd\" \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\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>\n <div class=\"item-left\">\n <mat-icon class=\"drag-indicator\">drag_indicator</mat-icon>\n <span>{{ layer.name }}</span> \n <mat-icon></mat-icon>\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.infoUrl) {\n <mat-icon \n class=\"layer-info\"\n matTooltip=\"Yderligere laginfo\"\n [matTooltipShowDelay]=\"200\"\n [matTooltipHideDelay]=\"300\" \n (click)=\"openUrl(layer.infoUrl)\"\n matTooltipPosition=\"above\"\n >info</mat-icon>\n }\n @if (layer.visible) {\n <mat-icon (click)=\"toggleLayer(layer.id, $event)\" class=\"power-on\" \n matTooltip=\"Sluk\" \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=\"Tænd\" \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.id, layer.opacity)\"\n (mousedown)=\"stopDrag($event)\"\n (touchstart)=\"stopDrag($event)\"\n (pointerdown)=\"stopDrag($event)\"\n >\n </div>\n <div *cdkDragPreview><span class=\"panel-title\">{{ layer.name }} </span></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 *cdkDragPreview><span class=\"panel-title\">{{ group.name }} </span></div>\n </div>\n }\n </div>\n <div class=\"group-header\">Mine Temaer\n <mat-icon (click)=\"toggleDmpSearch(true)\"\n class=\"power-on\"\n matTooltip=\"Søg\" \n [matTooltipShowDelay]=\"200\"\n [matTooltipHideDelay]=\"300\" \n matTooltipPosition=\"above\">add\n </mat-icon>\n </div>\n @if (filteredDmpLayers.length > 0) {\n <div class=\"dmp-item-list\" cdkDropList\n [cdkDropListData]=\"filteredDmpLayers\"\n (cdkDropListDropped)=\"dropDmpLayer($event)\">\n @for (layer of filteredDmpLayers; track layer.datasetId; let iIndex = $index) {\n <mat-expansion-panel expanded=\"false\" [disabled]=\"true\"> \n <mat-expansion-panel-header>\n <mat-panel-title>\n <div class=\"dmp-item\" cdkDrag>\n <div class=\"dmp-item-container\">\n <div class=\"dmp-item-left\">\n <mat-icon (click)=\"deleteDmpLayer(layer, $event)\" class=\"delete-icon\" \n matTooltip=\"Slet\" \n [matTooltipShowDelay]=\"200\"\n [matTooltipHideDelay]=\"300\" \n matTooltipPosition=\"above\">delete\n </mat-icon>\n <div class=\"dmp-item-title\">\n <span class=\"title-text\">{{ layer.title }}</span>\n </div>\n </div>\n \n <div class=\"dmp-item-center\">\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 @if (layer.visible) {\n <mat-icon (click)=\"toggleLayer(layer.datasetId, $event)\" class=\"power-on\" \n matTooltip=\"Sluk\" \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.datasetId, $event)\" class=\"power-off\"\n matTooltip=\"Tænd\" \n [matTooltipShowDelay]=\"200\"\n [matTooltipHideDelay]=\"300\" \n matTooltipPosition=\"above\">power_settings_new\n </mat-icon>\n }\n </div>\n <div class=\"dmp-item-right\">\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.datasetId, layer.opacity)\"\n (mousedown)=\"stopDrag($event)\"\n (touchstart)=\"stopDrag($event)\"\n (pointerdown)=\"stopDrag($event)\"\n >\n </div>\n </div>\n <div *cdkDragPreview><span class=\"panel-title\">{{ layer.title }} </span></div>\n </div>\n </mat-panel-title>\n </mat-expansion-panel-header>\n </mat-expansion-panel>\n }\n </div>\n }\n <div *ngIf=\"filteredBackgroundLayerGroups && filteredBackgroundLayerGroups.length > 0\" class=\"group-header\">Baggrundskort</div>\n <div\n cdkDropList\n [cdkDropListData]=\"filteredBackgroundLayerGroups\"\n (cdkDropListDropped)=\"dropGroup($event, filteredBackgroundLayerGroups)\"\n class=\"item-list\">\n @for (group of filteredBackgroundLayerGroups; track group.id; let gIndex = $index) {\n <div class=\"group\" cdkDrag>\n <mat-expansion-panel [(expanded)]=\"group.expanded\">\n <mat-expansion-panel-header>\n <mat-panel-title>\n @if (group.expanded) {\n <mat-icon class=\"arrow-up-layer\">arrow_upward</mat-icon>\n }\n @if (!group.expanded) {\n <mat-icon>arrow_downward</mat-icon> \n }\n {{ group.name }}\n ({{ group.noOfVisibleLayers }}/{{ group.layers.length }})\n @if (group.visible) {\n <mat-icon (click)=\"toggleGroup($event, group)\" class=\"power-on\" \n matTooltip=\"Sluk\" \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=\"Tænd\" \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\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>\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=\"Sluk\" \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=\"Tænd\" \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.id, layer.opacity)\"\n (mousedown)=\"stopDrag($event)\"\n (touchstart)=\"stopDrag($event)\"\n (pointerdown)=\"stopDrag($event)\"\n >\n </div>\n <div *cdkDragPreview><span class=\"panel-title\">{{ layer.name }} </span></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 *cdkDragPreview><span class=\"panel-title\">{{ group.name }} </span></div>\n </div>\n }\n </div>\n </div>\n <ng-template #dmpDialog>\n @if (dmpSearchMode) {\n <mat-dialog-content>\n <div class=\"dialog-header\">\n <div class=\"search-section\">\n <div class=\"search-field-wrapper\">\n <label class=\"search-label\">Søg</label>\n <mat-form-field appearance=\"outline\" class=\"w-full\">\n <mat-icon matPrefix class=\"search-icon\">search</mat-icon>\n <input \n matInput \n type=\"text\" \n [(ngModel)]=\"dmpSearchText\" \n (ngModelChange)=\"searchDmp()\"\n />\n </mat-form-field>\n </div>\n <mat-icon (click)=\"clearDmpSearchText()\" class=\"undo-icon\" >undo</mat-icon>\n </div>\n <mat-icon \n class=\"close-button\" \n (click)=\"toggleDmpSearch(false)\"\n matTooltip=\"Luk\" \n [matTooltipShowDelay]=\"200\"\n [matTooltipHideDelay]=\"300\" \n matTooltipPosition=\"left\">\n close\n </mat-icon>\n </div>\n </mat-dialog-content>\n }\n\n @if (dmpLayerResults.length > 0) {\n <div class=\"dmp-search-panel global-wrapper-container\">\n <div *ngFor=\"let result of dmpLayerResults\" [attr.data-value]=\"result\" class=\"search-result-option\">\n <mat-expansion-panel expanded=\"false\"> \n <mat-expansion-panel-header>\n <mat-panel-title>\n <span class=\"result-title\">{{ result.title }}</span>\n </mat-panel-title>\n </mat-expansion-panel-header>\n <div><span class=\"field-label\">Status:</span><span class=\"field-value\"> {{ result.availability }}</span></div>\n <div><span class=\"field-label\">Kategori:</span><span class=\"field-value\"> {{ result.category }}</span></div>\n <div><span class=\"field-label\">Beskrivelse:</span><span class=\"field-value\"> {{ result.description }}</span></div>\n <div><span class=\"field-label\">Tags:</span><span class=\"field-value\"> {{ result.tags?.join(', ') }}</span></div>\n <div *ngIf=\"result.metaDataUrl\">\n <span class=\"field-label\">Metadata:</span>\n <a [href]=\"result.metaDataUrl\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"open-link\">\n Vis metadata\n <mat-icon class=\"link-icon\">open_in_new</mat-icon>\n </a>\n </div>\n <div *ngIf=\"result.license && result.license.url\">\n <span class=\"field-label\">Licens:</span>\n <a [href]=\"result.license.url\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"open-link\">\n {{ result.license.title }}\n <mat-icon class=\"link-icon\">open_in_new</mat-icon>\n </a>\n </div>\n <div *ngIf=\"result.dataLiabilityAgreement && result.dataLiabilityAgreement.url\">\n <span class=\"field-label\">Dataansvarsaftale:</span>\n <a [href]=\"result.dataLiabilityAgreement.url\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"open-link\">\n {{ result.dataLiabilityAgreement.title }}\n <mat-icon class=\"link-icon\">open_in_new</mat-icon>\n </a>\n </div>\n <div class=\"add-layer-section\">\n <span class=\"field-label\">Tilføj {{ result.serviceType }}:</span>\n <mat-icon (click)=\"addDmpLayer(result)\" class=\"add-option\"\n matTooltip=\"Tilføj\" \n [matTooltipShowDelay]=\"200\"\n [matTooltipHideDelay]=\"300\" \n matTooltipPosition=\"above\">add\n </mat-icon>\n </div>\n </mat-expansion-panel>\n </div>\n </div>}\n </ng-template>\n</div>","import { HttpClient, HttpHeaders, HttpParams } from '@angular/common/http';\nimport { inject, Injectable } from '@angular/core';\nimport { GeoServer } from '../models/geoserver';\nimport { map, Observable, of, tap } from 'rxjs';\n\n// @ts-ignore\nimport * as SLDReader from '@nieuwlandgeo/sldreader';\n\nimport { Style } from 'ol/style';\nimport { StyleFunction } from 'ol/style/Style';\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 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<StyleFunction | Style> {\n\n return this._getSldStyleObject$(styleName, workspace, geoserver)\n .pipe(map(loadedStyle => {\n // I always create the style function but only use it if I cant create a style object.\n const func = SLDReader.createOlStyleFunction(loadedStyle);\n try {\n return SLDReader.createOlStyle(loadedStyle.rules[0], styleType) as Style;\n } catch {\n return func;\n }\n }\n ));\n }\n}\n","import { Map } from 'ol';\nimport { IProfileDetailed } from '../models/IProfile';\nimport { Injectable } from '@angular/core';\nimport { ReplaySubject } from 'rxjs';\nimport { GisKomponentSettings } from '../models/GisKomponentSettings';\n\n@Injectable()\nexport class CurrentItemsService {\n\n constructor() {\n const dt = new Date();\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\n gisKomponentSettings!: GisKomponentSettings;\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()\nexport class DrawLayerSourceService {\n\n private _current = inject(CurrentItemsService);\n private _hiddenFeatures: Feature[] = [];\n private _features = new Subject<Feature[]>;\n features$ = this._features.asObservable();\n private _selectedForHighlight = new Subject<Feature[]>();\n selectedForHighlight$ = this._selectedForHighlight.asObservable();\n\n source: VectorSource = new VectorSource();\n layer = new VectorLayer({\n source: this.source,\n zIndex: 999\n });\n\n previewSource: VectorSource = new VectorSource();\n previewLayer = new VectorLayer({\n source: this.previewSource,\n zIndex: 999\n });\n\n private _disabled = false;\n\n constructor() { \n this.layer.set('DRAWLAYER', 'true'); \n this.previewLayer.set('PREVIEWLAYER', 'true'); \n this._initListener();\n }\n\n private _initListener(): void {\n this._current.map$.subscribe({\n next: map => {\n map.addLayer(this.layer);\n map.addLayer(this.previewLayer);\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 \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 get allCleanedFeatures(): Feature[] {\n return this.allFeatures.map(f => {\n f.unset('_centerpoint');\n f.unset('_parentPolyId');\n f.unset('LOCKED');\n f.unset('STYLENAME');\n f.unset('showlabelfrom');\n return f;\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\n hideFeaturesforPreview(featureIds: (string|number|undefined)[]) {\n this._disabled = true;\n this._hiddenFeatures = this.source.getFeatures()\n .filter(feature => featureIds.includes(feature.getId()));\n // Temporarily remove overlapping features from draw layer while previewing\n this.source.removeFeatures(this._hiddenFeatures);\n this._disabled = false;\n }\n\n restoreFeaturesAfterPreview() {\n this._disabled = true;\n this.source.addFeatures(this._hiddenFeatures);\n this._hiddenFeatures = [];\n this._disabled = false;\n }\n\n setFeaturesSelectedForHighlight(features: Feature | Feature[]): void {\n if (!Array.isArray(features)) { this.setFeaturesSelectedForHighlight([features]); return;}\n this._selectedForHighlight.next(features);\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 = 1;\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()\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 \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, lineIntersect, lineSplit } 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.filter(f => f.getGeometry()?.getType() ==='LineString').forEach(feature => {\n const linestringFeatureObject = this.geoJsonFormat.writeFeatureObject(feature, { dataProjection: 'EPSG:4326', featureProjection: 'EPSG:25832' }) as TurfFeature<TurfLineString>;\n const lineFeatureObject = this.geoJsonFormat.writeFeatureObject(lineFeature, { dataProjection: 'EPSG:4326', featureProjection: 'EPSG:25832' }) as TurfFeature<TurfLineString>;\n\n if (lineIntersect(lineFeatureObject, linestringFeatureObject)) {\n const lines = lineSplit(linestringFeatureObject, lineFeatureObject);\n \n const newFeatures = lines.features.map(lineSplitFeature => {\n const newFeature = feature.clone();\n this._featureHelper.setId(newFeature);\n const newGeometry = this.geoJsonFormat.readGeometry(lineSplitFeature.geometry, { dataProjection: 'EPSG:4326', featureProjection: 'EPSG:25832'});\n newFeature.setGeometry(newGeometry);\n return newFeature;\n });\n vectorSource.addFeatures(newFeatures);\n vectorSource.removeFeature(feature);\n }\n });\n\n // Handle polygons\n overlappingFeatures.filter(f => f.getGeometry()?.getType() === 'Polygon').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';\nimport WKT from 'ol/format/WKT';\n\n@Injectable()\nexport class ZoomService {\n\n private _currentItems = inject(CurrentItemsService);\n private _wktFormat = new WKT();\n zoomToFeatures(features: Feature[] | Feature | string): void {\n\n if (!Array.isArray(features)) { \n\n this.zoomToFeatures([this._ensureFeature(features)]); \n return;\n }\n\n const extent = features.filter(f => !!f && f.getGeometry()).reduce((acc, feature) => {\n return extend(acc, feature!.getGeometry()!.getExtent());\n }, createEmpty());\n\n if (extent[0] === Infinity) return; // skip fitting to empty extents\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 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 { 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';\nimport { easeOut } from 'ol/easing';\nimport { interval } from 'rxjs';\nimport { CurrentItemsService } from './currentItems.service';\n\n@Injectable()\nexport class HighlightService {\n\n private _wktFormat = new WKT();\n private _zoomService = inject(ZoomService);\n private _current = inject(CurrentItemsService);\n private readonly fadeStart = '_fadeStart';\n private readonly fadeEnd = '_fadeEnd';\n\n private _highlightSource = new Vector({ wrapX: false });\n private _highlightLayer = new VectorLayer({ \n source: this._highlightSource,\n zIndex: 999\n });\n\n\n constructor() {\n\n this._current.map$.subscribe({\n next: map => {\n map.addLayer(this._highlightLayer)\n }\n });\n // To make the highlight fade out, I reset the style every 20 ms\n interval(20).subscribe({\n next: () => {\n this._highlightSource.getFeatures().forEach(f => {\n const start = f.get(this.fadeStart);\n const end = f.get(this.fadeEnd);\n \n const now = performance.now();\n const t = Math.min(1, (now - start) / (end - start));\n // Adding and removing forces a redraw of the features\n if (t < 1) {\n const progress = 1 - easeOut(t);\n const newStyle = this._getFadedStyle(progress);\n const newFeature = f.clone();\n newFeature.setStyle(newStyle);\n this._highlightSource.addFeature(newFeature);\n }\n queueMicrotask(() => this._highlightSource.removeFeature(f)); \n });\n }\n });\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 \n const newFeatures = feature.map(f => {\n const newFeature = new Feature({ geometry: f.getGeometry(), style: this._getFadedStyle(1) });\n const now = performance.now();\n newFeature.set(this.fadeStart, now);\n const fadeMs = this._current.gisKomponentSettings?.highlightFadeTimerMs ?? 2000;\n newFeature.set(this.fadeEnd, now + fadeMs); // set the style to fade (and be removed) to two seconds\n return newFeature;\n });\n \n \n this._highlightSource.addFeatures(newFeatures);\n if (zoomToFeatures) {\n this._zoomService.zoomToFeatures(feature);\n }\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 private _getFadedStyle(fade: number): Style {\n const newStyle = new Style({\n stroke: new Stroke({\n color: [0,255,255,fade],\n width: 3\n }),\n fill: new Fill({\n //color: 'rgba(0, 0, 255, 0.3)'\n color: [0, 0, 255, fade]\n }),\n image: new Circle({\n fill: new Fill({ color: [175, 202, 10, fade] }),\n stroke: new Stroke({ color: [40, 112, 133, fade], width: 2 }),\n radius: 5\n })\n });\n return newStyle\n }\n\n}","import { inject, Injectable } from '@angular/core';\nimport { Interaction } from 'ol/interaction';\nimport { CurrentItemsService } from './currentItems.service';\n\n@Injectable()\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\n // Find the interactions first. Then remove. Don't do a getInteraction.forEach and check and remove the interaction.\n const interactionsToRemove = this._current.map!.getInteractions().getArray().filter(i => this.isTemp(i));\n interactionsToRemove.forEach(i => this._current.map!.removeInteraction(i));\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()\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._featureHelper.typeId(f) !== typeId) { 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._interactionHelper.clearTempFromMap();\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,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAA45JREFUSEu1VmtIk2EUXr/EWBAV9bM/UX8ikIIoCEIISrpZljNQ87IKaptlV7psRloNY6JzYm7O28gsb6Vppm6m5Ww2XQ4nxswoi7zMpk6bFk/f+XQrLdNNGjz7znde3ud5z/ud95x3EWfql5mZGWy328VjY2OrnU7nYpffk6ePj8+or6/vey6XK+fz+Qr33KysrLLExETodDqYTCZYrVavQHOJIz09ndDBCmRkZIQpFAqvCOtM7yEo7If/3a9o7+yaxpGdnQ2lUpnEkclk3fX19fMW0Ju7cf1JL9YmObBcOoRwtQW7VGZcLuubxmEwGCCVSgc5EolkwmKx/FOAVnf76Rf4K+1YfsuOHdkdUD6vhs5UyIJsEpy5tWKxGBz6m23P07SfEZgzCG68DbvUXbhR0egmdZG7nn7yT9C86JnG9VeBx4YP4GkGsezmMLbJP+Lio2ZUGUtmJXYJkDhF+Pti/xBYJ3NgjcyOMyVGFDWVz0n6exS0iBXSYdA3con8IcCRwCPSmdtEH5yy6r8JUNQrpQ53yi4sAv09aI0PoG3OZ+GKxj/1Ayg5KAqvBIi07qUGjfExsMRGwigKhFHI4EwUDAmXmBOsxibFkPcCdS/y8DomAj1iEfovRKHv+H4WZPdIYtAgCsfucxUo1Xd7FwGtvOfSCQwc24fewM34smcjC7JtjFDbVSFyBOcRnj/ghUBBIizMCm0nD2MgaCv6GdL+A1NgbPLZhCEwCI6Bd6XSMwFt60NUq8QwHtyJYSEP36ofw2loYFA/hQbWNyw6AktoECqUuZ4JVDffR5EsFtagLXAIeBivq8REi34ayEdjb0O2oilP7ZkApWHNfSlaDm3HSPRejPL3wRG9B46oKTA2+WjMzAtAU75m/gJ0gKh8+MW14zZPiDdH12OcomDgPDUJ17s5Yj2ei/h4VVMzKcCU6x+dnZ1s3s4sFdfKm9iCR4WPCiClXqMmC/qwAzDzGZHTofh+NoIF2eSjsVpl2q9zwLTKXr1e7xZQaLVsvefG9SFAZXOfSld9aWttxbN0OXSCSLQHB8Aa5s+CbO2po6hKS2a5qH0mJCQ4OEzvTM7NzWWdS+KHsCFlhO1YLZZ3s/YJs7kNjVVPUZ6ajNI7t1iQXVta4p6jVqshl8t1bF9OSUkZLCgowFydbT6XAeIgcqYVjxUXFy913yxUKlUZtU/6MAsBcTCXiJdMw19F5D8Bm6ShPdSR8VEAAAAASUVORK5CYII=';\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,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAzZJREFUSEutVl9IU2EU/6IHsYR6K6jooYeiXoJSKiqwHsqQqLAkKh8KaUgpguEKc6a5bG1tzrvF2tQ5GYU9GEtmlsXs+mdujlwG1tpMDXroRXyoIRG/vnNtWurVq/nB2Q6/8/vO79xvZ9+5K9ifVVdXlz0+Pq6Jx+ObJyYmViXwxXwnJSX9SE5OHklJSRFyc3OtU3udTmeLXq+Hz+dDOBxGLBZbktFeymGz2cg+SAJ2uz3HarUuKeF8hTQ0NMDhcJiY0WgcFkVx2QWCwSB0Ot0YKysr+zk4OCgrEI0OIUb217ENfx5VVJBGowGjD7lHjXwcgueNG3mOnUi7xbCHrJwhVcNQ4ErF20g3wv0DsvsXFCh1n0CGgcHiy4I4bELo60PJxGGjhGWaGC4b0tHb2zunyLwC9tYSZFlWonvUjCfvz6G0fTVUT5lk5BPW80XAedsa3GzMQiQSmSUiK9DV14FMI4M4UgVd50YUtTJcfcaQWOQTdq9zEy/AgGxhNbziI0Sj0X9EZAUu3N8Ce9dZCP5tUL9gULcx5LdMC5BPGMUs/u1w9lyC6sEuzGwWWYF9FQytn/Kgfskr5YkKebUqz7QA+YRRjDht0XwcucvQ39+v7An232ZwvktDMd+80CKOa2AvjnKBQCCgTOAAFxD61uPGq4UFiGMNbUAGF5jZTbJHdFDLUNnJUCEylLxmKG7nff98Wox8wihGnDtdDMd0ixBQ2XajkHeKzs+g5ZspyXWeLLHIJ4xixCni3IvmHcqPSF11DcfNDPpebgGGqh6GMp4wscgnjGIGzjnJufbHeuU/Ml0dedWHcNrKYAxyC/FKeaLK7kkjnzCKneGcAsthdHR0KG9TEvB4PLhiTsepan48XgYTTyiEJ418wihGHK/XK1Wv+I9GAqFQSNpoqi1HjmErMviPSJ0iGfcJoxhxiCt7VfDr+tdcQcKoKnr05uZmuN1uuFwuycgnjGLEmWs/FSm1KR+V3/x+v6L7fTGjlManVqv9zvjsNDc2Ni67QH19PQRB8ElzuaamZqypqWlWFyym4gSXLjxKzkdxnB/j2qk3i9ra2hYan3Ru/2OUg79EdPOBv46S/wZ3qa2VRKmhvgAAAABJRU5ErkJggg==';\n static measureDistanceIconBase64 = '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 measureAreaIconBase64 = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAA+JJREFUSEulVl1Mm1UYriaTYYjxYm43JrvwZyZqYlz01mSJWzajN8bolYsXkIhOt7rMsFFal0ClbfqV9lsn6S9rxxgCLa6uZLQCa8vXjsSsP9D/rduKF2BEjK5Bszx+72EFm3YUkOTJ9+Y957wP7895Th+TPPyzWq0fLi8vy0ul0t6VlZUny/6tfBsaGu43NjbeaWpq4pubm41rZ+12u0ej0WBychLRaBT5fH5boLMUo7e3l5BiBCaT6WOj0fjIgH6/D3K5nK23nzm94ddsNiGTybA9fX19MJvNOgnHcYVAIFCTwOu9CrvVCq/Xy9b9fn/VN5vNMn8sFsPlS5fgGh5ie2ZmZqBSqZYkCoXin2QyWZPgG4UCiURi0+Wi/14mO8OCEwllLimnv926b3SuLgHVXBCETWdQ7tOWMig3bTsZ1s3AaOQx6nYhl8sglY1XZELNLZPmcrmHzfdBo1FvvgfxeBz9TmfVeEpPHK85rl1dXWyaysQbZtDf3w/75e9x5Ycf2RgmslF4PB52uN63LgFdksIv8+ANekxNle/IahkIsbmf8d3Vr9E28A6kA2/jpPMA2ocOo+8nBZKpWaTSqdpjSveBSuL3jWNxcRGcVoNQcLpqipQjH4gzfgTmyHsw3VgF2Yprr+C04134BbfYt1zlPfCNT0Ct6hYXsigWi7hXnIeqW4lQaJ1gNhnDee9JaN2HwAtvQO5/BsmFawxknwu/iR73EfBXPq/OQK8/jxPHvxAJ8rh79x5y+dvQqLsR+A8BkSuG34Iu9BrafQ04NbYThaUIA9nkM0zvR+fowWoCISzgo6NHcfDQYQy73EhnsmIPdAgGQ2slSmXmIB15GZywD8E7PG4UHVj4M8tANvk44SVI3a8y0evo6KiUCqVSiVwmDYPejJaWFmi5Hly/vi6ERHBscBd6Is+j8HsAv5UK+PvBfQayydcTeQFS5y5QPysILjgcuH3rFrtUJN9anRZyhQwTE1MVGbQOPIXOwA5ohGehmd6H+T9uMpBNvs7gDtCeKrFTcxyiN3Ow2W2k42uynE6tjhwhk83gmPFFyOQSfCtI0BnaieSvowxkk69DXPvK9vo6gSjXD6he3rEx6DidGNyCVCpdU+Bm5xIwjsjQ6twtjqAEqsjjsMf3M5BNvtaLu3FuqG2dQHwqF8Lh8JYUs9vxKb60PodTzicgG5cwkE0+9cXPWCx6PkXp+Esivp16h1j/rarlhWEeZy2foK33fQayyVeOY7PZwPP8JHuXDQbD0uDgIOt8PaKycj5qH8Wg4OJTXHK5XE+v/bKwWCweej5JAf8PKIY4hdPioOyh4P8CJH3KPKVQai4AAAAASUVORK5CYII=';\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,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 printBase64 = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAgY0hSTQAAeiUAAICDAAD5/wAAgOkAAHUwAADqYAAAOpgAABdvkl/FRgAAAxBJREFUeNqslctrJFUUxn+3Xv2o6q6uHjs9rWjC6CIiAQMtAV0JYhYuRFy4ExcJwb/CletBMgxITIib+QcmuBhEXEQN6mQhOEPbY3AIjGmTVPUz/arKdZFJd6e7egxtvk3VPbfu99W557vnCp5iY2Pjo0ql8lmz2Zxut9txJkAkEjmJxWKPLcu6tby8fBtAAGxubm4dHR29l8/ncRwHy7Im4ader+N5HoVCAaCwsrIyK9bW1j7udrtfLy4ucpXY3t6m2+1+ofi+//nCwgJXjfn5eRqNxieKruu5eDx+5QKmaeK6rq0BqmEYvQmv1qDkVScivZ5OkrLMCzFtcHBYrvLl3W+RwbOJpJQACCEukgmVpfffJpNKhgv89fchMoBXXnuDROoaJ7UKhd9+6s036zVqZZduuw1INN3AtG3MZBohwJcB+wdH4wUGfhHkKVKe9kLV40Nq1Spy+i1kdg4Ule7xIyp/fke72SR9/XkEAjmcVRj/owe/Xhi3ThrUqmVO8yvIzCxRDVQFGs4NRO51Wj/epO55JJz0CJd2meI1Kh4yl4fMLPNZhRcSClJCpS3ZeZIlePld6n9skXCckbXKZQQ6rRZyavYsGx/u7QV8s+dTakg0RULmVU4DnyAYdYd27ohn4XxbJfDwuF+Xonf23tv1EColTHUYeiSK+Ofh+A8OH6BqGqqmjgoMezn0VNoO4sl9ROn3kA53gFK8h2U7g7n0t0hR/rsM0bhJIuVQ2/0K+eKbPZtyXETsfU8sqmPa6dC12mUyAEimn0OPRKmX7tN5/MPZQTMMLMfBtO1+vYZqesGmM7kMmlDxx/SKmGkRMy2kBIHsV/+cTBVM5zLjBTKpJJ9++A4H7mTNLnfNxjbjIwIyCAKhqmcOSMSipF7qd8QgCFBVtfccFxsHpdVqua7r9gLDC87Hg/GwWNj1mUwmm4qu63eKxeKVXzi7u7tEIpGfBcDq6qqXzWZTc3NzDF4+k6DT6bCzs0O5XG7NzMzkejZYX1/f2t/fX5RSav9HQAjhT01N/WIYxgdLS0ulfwcAKTQlaNRcuW0AAAAASUVORK5CYII=';\n static featureSearchIconBase64 = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAA3hJREFUSEu1VmtIU2EYPgVlxozoYn+CfnRRDKKS+lMRdBEsCKIf9aekyCi72U2U0lk0y7U41k5Lc3POaYrpNLPbNFxN3aaSjaLJ0ppdyco5S4dFPJ33qy21smY1eHZensP3PN/7Xd73jOC+/XJyctZ7PB6p1+ud1tfXN9bHB/IMCgrqDQ4ObpdIJEJsbKzKPzY3N7dSoVDAZDLBbrejra1tWKCxpJGVlUVoYQbZ2dmbVCrVsARv29uxu/Qtll3owkPn4wEaOp0OarU6g+N53mU2m//YwPrAhWPXOjArowcT5d2I0ToQrXmAw5VvBmg0NjZCLpe7udTU1E8Oh2NIA5pd+s3XWKb2YOJJD1bqWqC+Uw2TvZSBYjIcvLRSqRQc/f1qzc/XvMLaPDcksk5Eax/j+HWLX9Qn7nvOE16ioO7FAK2fGlxpfIYNBW5MOPEeS4TnSKxogvFu+S+FfQZkThn2n+wPBmF8D2bwHuwvvwuD7epvRftnQZOYJH8P2iOfyQ8GXCoCEh28TLThdKr+mwFlHSrv8R/Zf54BZUT7RoeDshi2gbHpIoTKeCQURmFP4VLs0y9G4qXlyDTGgzdWI1J493cGR0tWi7NbBbVtDbIbvoJiqXE2DulWICLdhIqGp4FnUNVUCMWVLThdHgXBsgDSW5Ph6DAyUHzOuhAZ5dHYmLkNMUXvAjeouXcJKSWLkVE3F0eqg5BwYwxcbhsDxcQp6yNxsCgKizK7Ajeobi7CPkMEeEsYatsFNDzXo+PDIwaKieMt4dhjmAMqhAFvMhnsKp6AM7YZcHWZ0el14ePnXgaKiTtjm4n9+ZOGt8lksL0wBDLzKCgsU6GoD8OL7nsMFBMnqx2FuKJxgRnQBaLyMZPvxNaz4Tgi5XDSwkFWNwaOt5cZKCYuRXx3QDv/u4FYrj87nU5GDC4VKVdt7OJQ4aMCaKh3QmVIRlx+qLi+HOS2kci9H8lAMXFxBaE4V5L03UBslR1Wq9VvoKqpYfVecvQNVmk6/beyf5VM1+/A3pzpSMgfjeQqjoFi4k4V7GRa1D7T0tJ6OLF3ntXr9YwMkXVjjvID61jNjidDNqG8UgHHNJuRlLWOgWLifBPRarUQBMHE+rJSqXQXFxfjd52NBre2tg5pTBokLrZib1lZ2Xj/l4VGo6mk9kln929AGuJHRL3Y8KeQ+BceKZouVHN+8AAAAABJRU5ErkJggg=='\n static zoomIconBase64 = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAO1JREFUeNqsk+ERwiAMhdtOwAiOwAg4gYzACI7gJp4ToBPoBu0GukG7gYZeehcjgZxt7t4fCB8JvLSNHA5kQQY0gQbQo/kjAugJemeU1o9aUKokCiCuO+YXI2YOBWw9CPvFNpfEESHSu44kV2yfvpmrdOLYm/6E1bZB4iwV0LGFixJ4YxV/AelvvZTASdromo2jY+4/KM/RvCFnaGoZoxgAah1T+7W+ADXohCU3am9N/vIsx+NlfAyDBLUMSiuuzXYRWgP0wsUztBXAHn9yxzyaDH1FM+emar/GciFT5WmtjznUbTEcDiubYR8BBgD2fnjD/AKVHwAAAABJRU5ErkJggg=='\n static cutIconBase64 = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3gYDDB8MtOM2YAAAAdBJREFUSMfl1T2MTFEUB/DfjOcjviq7DRsRRCKiY+kVmleKwkchKgmrZWhEVqFhswqVRLIFiShOfBSi0C2xUSgVxGKzIxIJdmVHRnMneXmZtxijcpp33jnn/v/3no97+cdS62VRnuftsi0ian0hKIC/xzRWYGcVSb1H8DFsx14cwFTVyeo9ZGgatzGHDG9xpiq4F4IPeIcF/EAb+/pJsAuBw9iGdRjpSw0KADswiocpRcv6eYKT6bsBQ31t0zzPB9BIKRmMiGae57uxCQOpFpciYvK3CfI8X5XUlQmos3gYe3C1EN5Ohb+GRkR8zRYB3pgKebEiZLKgz+IxnuBKSuMzTGQV4Edws2SeT1MrFbaT/1c4iudo4TXu4SAmaiXg9WmQivIZH3ELZ5OtERGjaXK/YDO+4Xvyz2EGQ/VFwGdxB1sjYktENJL9DR4V4lbjFJZgKcaT/gnLswrwkYgYq7iHXhZbM9kbiaSNtcn9IiLms8L90pFjEXGjBH45qTO4EBFPu5CsSaZmRAx2/OUin+sC/gD70++JIvivhqxMMFxeXLp+D0XE3T8d+6zbDkrATRzH/b9+Mrs8GKdxHa2IaPVCkBXA62m3UzifumDBfy8/ARhwrGEODAGpAAAAAElFTkSuQmCC'\n static copyIconBase64 = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3gYDDCItkmJugAAAAHBJREFUSMftlEEOgDAIBIvp93jtPtCevBhT10m10bjXEmAWSilvV7iBmbk6cZICdeIUOIqppJCk2CfDnQ8lOEuyvWMC2uXlGTg+/wTzCVzV3nfvJXSLYwKXBhO4Wu4+18gi93QPX9MpFj0/A+zvZ9UAaFN03sNpI7gAAAAASUVORK5CYII='\n static copyWithBufferBase64 = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3gYDDCQhzY6FLQAAAIJJREFUSMftVW0KwCAIreH1PK0HrF9BuOVHErIxIQqrl74nVsrbrXIHIjYiqisfIjYL8Dh/A9IuPQVgCVJ8ZPaN9TzPw5OlOQDpDOwASXsafduRujPggnGwVVX9GbgzuE63CogCaBSFNdA4B2vTMovHLF8Db5kea2ppFOVqEPo4PmMdpg1975VbWTEAAAAASUVORK5CYII='\n static fremhaevBase64 = '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 fremhaevSelectedBase64 = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAA2hJREFUSEutlmtIU2EYxxdRSSgFVkaJVkRUkJoZ0s2gErK+lRQVWVZ2+6Am3YR0W3lda1pz0+Vxs4vW8DJxm6O5OdPmtObMTCmx8pY3KutDZYn823toy81ayzV4d3YOnP/v/T/P8z7PpjB+fsRi8d5PH3qYI99HfUe+TZ1pef4vV7cZY1/cpk/rcp+1ICsqKkpofTdfkq3gcqNRK9+AtofL0f144aQWeZdo3BREQyTivqABubm5EUKz+GRE9dXBiLnLwzaBFu2GJTYad7KOgaKEmYwMDruzThnsNMBYE4DkogtYdq0Dc9IHcVjyHGFUIxKkbBuNJo0fOJyEYQaLlTDaoV/sEEB2xy2JxdZsHTxTBxGa/xRUjQbVzSX0Ir8J0D4KTCYTDPL1p/Dklh/BbkoG9+QBhIlbkaQyWEUt4pbran47pKpwG63fAlSVodgvvgfPlEGE8F/iYrkRalPZH4UtAAInDsdvdgJg+bV2LOX1Ia7MhNIG5V9Fx7sgmyA5ITmyQCYAGCw4LappLsXtei2ya2tA6XWobJLRCSdV9V8A8kY5DlT0IOjWR6zLGUC6RIDiOjnmpfVbS9YlB0qTHMfl7Qi+3ougcwYcPXsGlUYpnTdSHMSFSwASEp76AcKTxNgRl44k/mVoTUXI1NZg7Y1G1wH2ZTr+nhQKqUaXHCjMIYpQdtE5CMnrBq9QhKqmIrpIIiUmRObnuwYoNymwt6IP/iVVCGT343h8PDSNUtw3qOhq2phl/H8Ab1Yvtp9iISCjFV7pfTh5KxukEboUIuJge9k7+BXrMJ/5Fusjz6OgfJfjk+zMQbv9SI3wO22YyxlCYMF7+JlD5M3qQkzcZnTobeeI0w5I2yDtg1THoqvdSJQmQlu9BZEKjTkHWscAFuvQ2Jt6H9qavYNEZQN9cEjjIw2QlJ6lDTQb/J0DcNMShozq1VaAUKej+70Huw87cyqsp9K+pbcYVuG0ogRrCgbMDloQE7vJJkRkfKamXPrMEIn4NwqFETTAI2kQ/plt9MRq0a9wOIReN/hCpQ5F9JUT2Hf6INISV+JV3a8cSCRhyOJzqum5zM9IHS7O2WPegePJZu+is94bLVofPKnwwTONN7oaFtAaRDyDx/4qk8lmW/9Z5OUJFGR8ksy7soiGUMCtoyjKi4j/AJuVGiaL/SZsAAAAAElFTkSuQmCC'\n static infoBase64 = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEwAACxMBAJqcGAAAAl1JREFUSInVVc9PE0EYfd9sFyiLYBtDijebeihyIhy8GE8mxIsepEjsxYsRErT/QfUuUZSU6AUPJiKEcBM9eiORqxBpUxNDRCkU2tof2+7OeMDdlm132yZ48J3mm5nvvffNNzsL/O8gp8WrC9+6cqo+TuA3BMQIwAaOV/gugTaI06ridi1/unuh1J6AEDT8Mj4BgRlG5HO0yLFLhMjnyYtLLQmMLQkpeRCPEdE9R2KrJyDm9wYeLIdIr51nVufJdHy+XfK/TqcSB4kXDearGH61fYdxemNH8uF2PwBgdHHPXkhgvPa4zAouz3x3k87n2vNdD02I+cDsdqcRu4xBubsYZiSddUq+8mwdAKD4/LZ7JEZej5tPAHgN1FQg9Mr9Zu4Un9+R3ICu6lPG2KwATAraJYSHFISHFDN26gEACKJLJq0xkJjLbZewsL5jHk8rkBgzuVxOGw3IPR7IPZ6WBUBk3s7aHrRO0ARc10SdQKVcKZyWgNCrXNUvWStsnpZApVz4UifAS4UY53rjjDYguAYtn40ZsdnknMbe9mVSTzo8Pq81yXgirHGj66oepfc1j75oxCfeomB0LdTR1/9O7u49kZT/mWzo1vrRaYUMirn9W1+joysNBQBg8PHHmHzm3KRVpBm0fBZqLj239ejadO08s27cDGamy9lUTD3aQys9EVyDevgLpVzq+dbgYcS6bvvLDEbXQiA8dbl7z0tdCiS5A0THLeNch6io0NQ8ysXfOyARqT2WlgQAIDD7vlNOS2MAbnJgBIQBAGDADwG+IQSt6l6+knh4XW1a6r/CH/oT3HyJavllAAAAAElFTkSuQmCC'\n static downloadFileBase64 = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAn1JREFUSEutVt9rUnEUtycxfOitx/6eHloPUVIwI8I9RTWcVE8KAyOTjDSZ6L3Xm3NDIXS1ftEi06m33XTd20yzhHrtZfhQIhGn7zmmbIOrX3XCUZTv+XzO+XzO/R6PmP6/RFG0tdttd6fTOdHtdo/2fx/n02w2/7ZYLD+sVmvI4XCEB7nxeHzd7/dDLpcDTdOg1WpNFJiLGJFIBKNBBNFo1B4Oh0cCblS/gP+VTpHc/Ayv2fdhhciyDLFY7L4pEAh8LxQKQw870yqcExQKm1BiUQabqBCREYmqquDz+XZNHo/nT71eNzzof6kTsDP7Ca6tNQbhympwVngP4Tc7hrlutxtM+GZUBSafipRgPluDuZUtWHxSpbNzj8pwkxFcTG7D1dTWdAQnH+aJ4KDm11fL1BV2YeQHVwenlzYJ6CDIvefbRDw1wcxSkYBuPa7sk+Lusyr9fj5WnLwDrHqGeYAdXE6qIL/VYDWvw/I7HeZTKlxZUcAuFSf3AA21iyWaHCRBU/vhzO7QdC2u7e9s78CM9AAPv/jQgDOiCgtZnUhcLFCaS8kKXBCMq8dcLgKUaVbqjSrO/g0WLkaG5qIPw55mLgIEwInpd9Ej0OhpThX0wyFAmbBi9GKBSYTaz4rD5eGWqC/BnacVMhh9QILlQm3kBcktEZLENj4SAUpzm5HxXOljESCgnK9R9XLe+BYde0z3JjS+fqNretQu6OdQB+y6/ttsNrla7nXBV/3AZLYqfyqKwk3Aoz2ewfXp9Xp/mdjufJBIJA6dQJIkCIVCOdrLwWBwN51Ow7DNxls5YiA4W8WdTCZzbPDPQhCEdVyfaMw0gRjsT0SJLfzjCP4PSlocJ9PLStIAAAAASUVORK5CYII='\n static openCowiPageBase64 = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAAZCAYAAADE6YVjAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAARyaVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8P3hwYWNrZXQgYmVnaW49J++7vycgaWQ9J1c1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCc/Pgo8eDp4bXBtZXRhIHhtbG5zOng9J2Fkb2JlOm5zOm1ldGEvJz4KPHJkZjpSREYgeG1sbnM6cmRmPSdodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjJz4KCiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0nJwogIHhtbG5zOkF0dHJpYj0naHR0cDovL25zLmF0dHJpYnV0aW9uLmNvbS9hZHMvMS4wLyc+CiAgPEF0dHJpYjpBZHM+CiAgIDxyZGY6U2VxPgogICAgPHJkZjpsaSByZGY6cGFyc2VUeXBlPSdSZXNvdXJjZSc+CiAgICAgPEF0dHJpYjpDcmVhdGVkPjIwMjItMTItMDk8L0F0dHJpYjpDcmVhdGVkPgogICAgIDxBdHRyaWI6RXh0SWQ+MzQzZGQzNWUtMWRiYi00YTg0LTk3NjUtNWE2NTEwNTk1N2NjPC9BdHRyaWI6RXh0SWQ+CiAgICAgPEF0dHJpYjpGYklkPjUyNTI2NTkxNDE3OTU4MDwvQXR0cmliOkZiSWQ+CiAgICAgPEF0dHJpYjpUb3VjaFR5cGU+MjwvQXR0cmliOlRvdWNoVHlwZT4KICAgIDwvcmRmOmxpPgogICA8L3JkZjpTZXE+CiAgPC9BdHRyaWI6QWRzPgogPC9yZGY6RGVzY3JpcHRpb24+CgogPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9JycKICB4bWxuczpkYz0naHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8nPgogIDxkYzp0aXRsZT4KICAgPHJkZjpBbHQ+CiAgICA8cmRmOmxpIHhtbDpsYW5nPSd4LWRlZmF1bHQnPkRlc2lnbiB1ZGVuIG5hdm4gLSAxPC9yZGY6bGk+CiAgIDwvcmRmOkFsdD4KICA8L2RjOnRpdGxlPgogPC9yZGY6RGVzY3JpcHRpb24+CgogPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9JycKICB4bWxuczpwZGY9J2h0dHA6Ly9ucy5hZG9iZS5jb20vcGRmLzEuMy8nPgogIDxwZGY6QXV0aG9yPkVtaWwgU2FoaW48L3BkZjpBdXRob3I+CiA8L3JkZjpEZXNjcmlwdGlvbj4KCiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0nJwogIHhtbG5zOnhtcD0naHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyc+CiAgPHhtcDpDcmVhdG9yVG9vbD5DYW52YTwveG1wOkNyZWF0b3JUb29sPgogPC9yZGY6RGVzY3JpcHRpb24+CjwvcmRmOlJERj4KPC94OnhtcG1ldGE+Cjw/eHBhY2tldCBlbmQ9J3InPz7wO0RJAAAD/ElEQVRIS61WX2xTZRT/3Xv7d3Vdt9bFAGp4gkDodCIZkW1qFNAIHQusjSEKzrFl8dlA9gBKwIT4PGecPhiNJEswhifdHPBA0Jc9sDES1m2ZD8SsS2Rrt66394/nfO3tbmkv8LBf8uVLv++c75zzO39upZ6eHnNychIejxumiU2DJAGqqmLPniiklpYW8+rVX7C6muGrgsQmIRAIIJFIQGprazUHBwexsrJSvKqESSFK5BrvFqzfvDshGAyiv78fsiX4+LKDZR6Xsxu0YL+3y8nFe0f4a/xobGxEJBJBXV0IdaEQQvX14qyedllRhFw1oxZcxb0Mltc+nw+jv/+B8dExPJhJIru2BsMw4fV6EW5owBttBxA71oEQGc7n80XtSlQ1wmADP//4E74fHkZzczNOdHWhJuCHLMnIZrNILS7i12vXcOvGTXz7w7BwygnOdJFSLpeDrmlQXC7s3LkD4XAY42NjeP/IB1AUFxlUsEbRUehPLExHI7n1dZzqPo2LX10SpXhvehoL8wuYm53Dvw8f4v79aZz86CS++W6IeswDk2h0QlUjHLphGKKZDh46hF27d+HW+A2MjIwgncng8qXLJCMj8WGCCuJ5kY8nJb6qEVbgxR5OTEzg6ytX0NTUhM7jnfj49Cm0t7+J2WQSF89/CUl+er9UJN4ywEq1tbW4c/s20fUcPh84Rx6rghaf3w/d0HD9t+tUcVnKjyIidzLmSJfiUrCw8A/GRv+k6noVqdQi5pKzmJ+bR3LmAV7bu1fk5u87fz11GEmtrQfMoaGh0lhhj7gPkskZ9H5yhhouBJOMquu5Mi9lRYbb7Uaa9Nrffgvnv7iAdDoNWd7wm8dKX19fZST8EK+8mofLrYiOVkixJlAjut9aXq9HyDN1KpU6h8N0VUNVuhgsz3wXIEHT8shQZWXSGWSpvPmevdaostScc7czyoxYieOS3PbiVhyJxegRDbquEW0NONrRgVhnDK/v20eRqkLuhS1bcIyqTs2pZVTZUTq1qopzwisYrENP7xkxQtIry3h5+3acpQo7OzCAeCIu+H/06D80vRLF4fcOi+ngRFcp8cvLy+KAvfEQ35QZUZqp1BI1ZU6MFNHZ/BDxv7S4BMM0EAlHRCXyua7pUKnMGcyIlfhSn7CQXKyez3r72Zr47aK5xQr8AD/KYDF2gM81XRe9w5F0xbvwzsF3RfR2lEXCShzJvckp0cnCZdgpKDixgeId6RnkxNaXtiFE3xym2x5JBV0MpkW4+8xgYxwtF4kuTuxGiJGNT6m1c+g8hZ99FeTZgP0tXvy+tH9/4d9KJrMqLjcPpph58Tj9W+nu/tScmrpLHewrebEZ4AjWKbpoNIr/ATlQBdZNXXvBAAAAAElFTkSuQmCC'\n static sogPunktBase64 = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAA5dJREFUSEudll1MUmEYx+nK2Whr1eqym1Z3bbXuXFtza61uygtnF5Vu4fdHZlZWm9KHZCc2nBD5wYfgCrSERlIzKCkpbJpEMfFjWlnZUhKh0Glr/85zCiYiFpzt5Zxx3vf/e5/nfT7OKt7fS6VSZfj9/qq5ubnN8/Pzq0P/x3NPSkqaTU5O/sDn82XZ2dny8Nrm5uYOsVgMm80Gl8uF0dHRhAatJY2GhgYagxygqanpmFwuT0jwqesDitu9SG2cwcDwWISGRqOBQqGo5Ukkkvfd3d3/Dehxv8elB5PYWhvEeiaATLUH+5VuXOiYitDo7e0FwzA+nlAo/OnxeFYE0O6udX5FqsKP9TV+7NUMQvHMCpurnRv0TMClrq2qqgKPfmL5/GbXF6RpfeBXT2O/egxXHjrCoiHx0H2HbAK3nn+O0FoWcL/3Iw7f8mHd1e/YLfuEClMfHvXfiykcAhCcLFy82SjANkkQWyR+lN3rh+GlOUL0ifPOihDaxAbmO+iMQpAoAE+ImCKXxUK0W1Sw9LXGnEMHTlGVECCv5AQqzp9Fk64OT5x3l4WQ1RuZYDhk47KAAEZTB8rPnUfj7dqYEDo3Cg6yIm5AZ2cnjEYjys5WoF4rweP+tihLah8/wy55IDHA0NAQgsEgdDodiooKIdOIl7WEAoWiMW4LCECXPxCASq1G4ckyyJuvw/oq0pIstQuZ+m/xA8bHxznA5NQUZmb80OnvoKC0FHWqa2F36R0PufKRUj+TOIAsWFhYwOzsLBoalchl3ZXHNGKn9BMXRTmtXlAhjNtFIQu8Xi+mp33Q6/VgiyUEeYXIyC2C0jK4ciavlGgUpvbndrDNCAR489aNnIJCpOw7BEFOPmoYBm63OzEAJRABbE/tUGm0yCsqZc/gj4+PsxCz2QyHwwEKgqhaxJbrX8PDw9yLpRZUml9yBY8Kn6DkFPakHsSRo5k4np+PdoMRr1+/4cAqtrmMjIwsX67ZVjnZ09MTBsi7urh6z784hQPK6XBWWiwWiEQ1MBgMkN64gbLTZzAxMYGsrCwUl5dH7Z7ap0gkCvLY3lnX0tLCAdZUB7Bd+oPrWE7Pu4gdDQwMgLoU+dlut0MgKEZ6ejrS0tKh1WqjAGo2T2QymY3ry1Kp1NfW1oZ/dbaQf2me1WoFrTGZTHA6nWEX0TsSZ6Nrji0ra8NfFkqlsoPaJx3c/4zKykqExuL5pMF+RLxgG/4mEv8NDua1LGBTTb0AAAAASUVORK5CYII='\n static sogPolygonBase64 ='data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAA59JREFUSEullm9MU1cYxi+fCNolRhQ+jkSjCRoTk0Y+NDMEMLEmbiMRNXMRTYDSCWE4smCMtPUPuoZYsjbFri0FUYONDqIwIm6jShw0ZULR9rYNLeg2zUTFoigJMc/ue/BWKi0U1+TJbU/vfX7nPe97z3uSuHefxsbGPeFwWDU9Pf2poGXieFJSEgdA/LngNTk5+XVKSsoDiURiKC4uNkZubmpq6qirq4PD4YDb7UYwGPwo0bPkYTKZSD4GMJvN+41G40cZ3nI/QPnVp8j56QW8gVCUR3NzMywWSz2n0+nGent7Ewb03x/D8V+eYF39FFK1kyi08ZBb7+Nox3iUh8vlglarneA0Gs0Mz/MLAmh2P9z4FzmWMFLPhLGt2QfL7V/hcF9lou8E/HBpVSoVOLVaHde8oecx8s9PQHLqOeS2EE529UVMRXPxutnwCBfv/BPlFRNw3fUX9l6cwMrTL/GZ4W9UXxtA9932uMYigOAU4dwo5gHW66awVhfG4fa7+NnZuajp3ChoEqu0L0E5EiHzAJwa80y7B+w4UaeBUqmEorQUikMV76Usg0KhYP+dPHsChY1eVlVRAKKIA7EANMsiRQlCYw+ZgqPRGhXG/hz24OvKKtjvXEOadipSsiyCRAD7lJW40vU7yo4ch+J7dZQqa2rRfvMW8ovL0D1wmeWNioMmnTAg0QgIUP/bbUiNk0sD7D/03aIR0BIRgJaUCoWqMeEICOAPhuD2+DHo4aM07A3AOXiP5UAEHLC5Udj6bAmA8uqYEZRU1UDMwVcVh3HD1YrWvi62fcjOvVgaIFYV5eXlIXt7NnJ25WJjbi4yVQ6sPjOJkstPQRth4ksUJwICpF1Pw4ZjG5D1RRa27v4SnV0d8Pv9S0yyAIgXAQG4cQ7L3cshPSiFLF+GBlMDvF7vbARzN7t4L9qebypi5kCMgAAkgmWqMpEtz4bT6YwA3gYCARbSh4CaTid7cQ4UlcSsormA9PZ0rDm7hi2VWqOGx+OZBQit8kl/f38EYOzpYfu9RDOOHdbn7K3UN5hQVPotisqroiQCMswZ2LJvC6Q7pTCZTcx8aGgItbW1U5zQO39saWlhgE9OTWKT/hXrWIP8KBsbGRkBz/vA++aLALICGbI+z4K8QI4Lly7AJ9wXCoVgs9lgMBgcrC/r9foJu90uGC3c2RY7DFD1UHKFQwSEVvymra1tReRkYbVaO4SEz9C6/R+Rh3CI+ENo+Olk/h8veXXcPn9a8AAAAABJRU5ErkJggg=='\n static skrafotoBase64 = 'data:image/png;base64,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'\n static streetViewBase64 = 'data:image/png;base64,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'\n static downloadMatriklerBase64 = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAAsQAAALEBxi1JjQAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAGoSURBVEiJvVTLTsJAFD0zpUCnBQP4QEyURKOujBsNP8BnuPJH3PEvrlxr4s6g0YVBF5poYmLQ8ihVKC0oVDd0oNEExlDPZm5Oeu+Z29NTIGCQ/cPnZKku39Ysd9F1v8Y2SPH42GcSEbe/PtO73Ez186GSId9Umv3FadzWg9ml0kU1nIPbPaG1lpuZ5vBR3L3Lu3SS1/JXvH9SSgObPkDgAqGd9IdQQ3bOFhPYW34RaljJLIgJeMVaZp6TpmXDaFpIxTUkNMb5h5cqACA9m+ScZTuwbAcaU6AxhfN6veEXYGFpKBtTYTQtJGIqmPzTpnQqMRw0ENGY4ucHAoGbTI5Oz4SCIOpB8J+pV2xlh78j+9PFQ7mCtaUFnwelp1cAwPbGKud0w4RebyA9m/R5cH3/COA/N3B6LiffLJufJMZ+NOmGyWvLdvip/yIQuMl8g9WRoDVabZittlDQVCUKVYlyvtp48wuoI0EjcQ1mqy0UtJjKfLwnQCWJ9gfF5HuPQdvpeGWZHBevirbTzU3aLOQBIQUqd5Q8UyLn3iZTQhmEFMK9zsEUZ/6Obz/toX8kkesVAAAAAElFTkSuQmCC'\n static VaelgLokaliteterBase64 = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAA+JJREFUSEulVl1Mm1UYriaTYYjxYm43JrvwZyZqYlz01mSJWzajN8bolYsXkIhOt7rMsFFal0ClbfqV9lsn6S9rxxgCLa6uZLQCa8vXjsSsP9D/rduKF2BEjK5Bszx+72EFm3YUkOTJ9+Y957wP7895Th+TPPyzWq0fLi8vy0ul0t6VlZUny/6tfBsaGu43NjbeaWpq4pubm41rZ+12u0ej0WBychLRaBT5fH5boLMUo7e3l5BiBCaT6WOj0fjIgH6/D3K5nK23nzm94ddsNiGTybA9fX19MJvNOgnHcYVAIFCTwOu9CrvVCq/Xy9b9fn/VN5vNMn8sFsPlS5fgGh5ie2ZmZqBSqZYkCoXin2QyWZPgG4UCiURi0+Wi/14mO8OCEwllLimnv926b3SuLgHVXBCETWdQ7tOWMig3bTsZ1s3AaOQx6nYhl8sglY1XZELNLZPmcrmHzfdBo1FvvgfxeBz9TmfVeEpPHK85rl1dXWyaysQbZtDf3w/75e9x5Ycf2RgmslF4PB52uN63LgFdksIv8+ANekxNle/IahkIsbmf8d3Vr9E28A6kA2/jpPMA2ocOo+8nBZKpWaTSqdpjSveBSuL3jWNxcRGcVoNQcLpqipQjH4gzfgTmyHsw3VgF2Yprr+C04134BbfYt1zlPfCNT0Ct6hYXsigWi7hXnIeqW4lQaJ1gNhnDee9JaN2HwAtvQO5/BsmFawxknwu/iR73EfBXPq/OQK8/jxPHvxAJ8rh79x5y+dvQqLsR+A8BkSuG34Iu9BrafQ04NbYThaUIA9nkM0zvR+fowWoCISzgo6NHcfDQYQy73EhnsmIPdAgGQ2slSmXmIB15GZywD8E7PG4UHVj4M8tANvk44SVI3a8y0evo6KiUCqVSiVwmDYPejJaWFmi5Hly/vi6ERHBscBd6Is+j8HsAv5UK+PvBfQayydcTeQFS5y5QPysILjgcuH3rFrtUJN9anRZyhQwTE1MVGbQOPIXOwA5ohGehmd6H+T9uMpBNvs7gDtCeKrFTcxyiN3Ow2W2k42uynE6tjhwhk83gmPFFyOQSfCtI0BnaieSvowxkk69DXPvK9vo6gSjXD6he3rEx6DidGNyCVCpdU+Bm5xIwjsjQ6twtjqAEqsjjsMf3M5BNvtaLu3FuqG2dQHwqF8Lh8JYUs9vxKb60PodTzicgG5cwkE0+9cXPWCx6PkXp+Esivp16h1j/rarlhWEeZy2foK33fQayyVeOY7PZwPP8JHuXDQbD0uDgIOt8PaKycj5qH8Wg4OJTXHK5XE+v/bKwWCweej5JAf8PKIY4hdPioOyh4P8CJH3KPKVQai4AAAAASUVORK5CYII='\n static searchDocumentByPolygonBase64 = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAACXBIWXMAAAsTAAALEwEAmpwYAAACcElEQVR4nO3V3W4SQRgGYK7LeOwdeAMm3kBjhLD9sdYT+VuwrYkRZoElqKULlRpJIfiDIKWUApHAyWJiTXtAgiG4xBPd18wYEk+kS7o7XRPeZDIHbMKT75tvxuFYxKK4vGGYtVZEcmwJ0Iy4vGF4nr7QV4JSzbZAbfIDXooUpYYtgTSmI80Gmo60Amgq0iqgaUgrgaYgrQZeGmkm0GVgXRnQSBbAy2YB/C+Buq6j2VVBlDw2tpMQ/ITtkpJHq6ey368MOByNEYxmICZeYb/ex+HXCZqDX2zP1vsQ5X0EYxn2HY03ovADDkdjPHichFLpoT3EP5dS7rLvvo3GyJYafIC6rrPKXYT7GxmK7aH8qc8H2OyqrK1GcNNF271TqPIBkt0DdubmAb48UhGMZ/kAN7aTbBDmAdLv17cSfIDuAGHTOg/wZPATgl+ybwWrpxq/CkpKnt1zc59BmdMZbPVUNpVGca0hEIhlkeI1xTq9B2MZdr8ZAaY+dLAaiiP3sX0FL0l5NjJV6uDepgyy9xZroTju+p5c4wKkoc8XfSFou7N1lQ0CnW660zNH20orF0kX8brWRfKgCiFANJcnfIMLcNruVq/PBodWVAgQtkfTBbR7fZwPhri/JSORqzDk88IRhICkCf7wTS5AIzk9H2B9U8az/CFD7r45hiBGJ4Jfum0LII365Yy1e6dYZ8j0+xOshmKa20+ctgDSKMUalsXoRHnXYMhMqYW1R7Lm8pAlWwArnc9wPiS3loOxCcX9qWSTPp1jWwClTJHdg4KP3KGVozg5V6FDczYTyHM5pv/rIUtuH/lOcU5f5PqFw7KIY3Z+A5DMa52GW2qJAAAAAElFTkSuQmCC'\n static searchDocumentByPointBase64 = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAACXBIWXMAAAsTAAALEwEAmpwYAAACTElEQVR4nO2W7W/SUBTG8Z/UfwVH5gvoTFZHAWVihFJeVhHCcAVNHGrc7DJ5GzAnzbKSGP22BLMsLPOD9jHnJpgNmatbb+0HnuTkfrj98MtzznNuPZ6pOMkrxGFXzYpSkwugHfIKccw/eWbOhpI11wIOj44hEKSYbLkSkGQ7pN2AtkPyALQVkhegbZA8AW2B5A14aUg7Ab0W6r8BWtEU8LKaAo5kmibaPQNScRWBqALfgsTOZHEVHd1g99wB0+ufJ1a8qsP/KA8hVUa50ceHr0do7/9kp9roQ8yUEUqVMDg45As4SYODQ9xZVFDc0NEd4Mwqaj323bcxSK6ApmkiJJfOhTsJGU49P9VuroDtngExW8HNlT6uRppn1klIandH7/MBHJ+9ewkVT7U9XPsL3DjgSt1gwXHEwUBUYUGw0t5R0fc0i44AzgQlltZ/Adza/wFfMOleBze/DPk5+McMSiqUi8zgctUZBzu6wVJpNcUdSnG6jC6vFE/cg6kS229W2ltY34EQLzi3B0+9JOdAEtyNcBq3Ixk0tnfh6FucqOoIxAqYl1WoDYMFgdJNJ80ctZWcuxXJIP1Cg/9hFlpz5/cm4OrgSNQ2eiFoCZOjvqDETnm5ymaO7luf9hic8mqT3a3Vu5DL7931P9jY3oU/uoTc6xrmYjmEsxV3AZK05kfmYP5tEwHmtix6gCuuASRVN1qYe5xDcW0L/qgy9AUl0VWApMq7Gu7Gcsi/qeP6/fix6wBJNINeIfF9ZkEKuhLwwdLLi4XEyfJM5eGjX1+91N9zQgjNAAAAAElFTkSuQmCC'\n static clipHoleBase64= 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAIAAABvFaqvAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAL9SURBVDhPlVVdSJNhFP6giyAUYvbfRV6EEkIQLTXNSrFIg0AoiIysIOkmoSALlGor07aFytxqa2PMIbnhhjhN+phsOtdmM2Xkms22rEwxf7flLrxZz/w+xufc3Ho4g53znvPsvO/5GRFag9frVSqVfD7/cdKAM0KcTifFECYyGAwCgcBkMjkcDk/SgDNCJBKJWq0OE7ndbrFYTB8mQr/jxx3tfJF0+YvbS5s8HuRltVoJuVxuNptpWxzYxia57/5kNK2k8fwVCleJfKyme44+83jsdntzczPB5XJdLhdtWw/87Iv3s0UyX1qD74xyXDZgMDm0EHwBKe20BjwZgQ+tMfDKOFPWupRSt1gsHq/tMFPxTDnSMt1m+U17byTS239dblti1QcKWqYedg3r+juO5giO5fGjWCDPeq3IlA6LIspsXDnY6LvXOaIb6qG89WYNO5dXzLrlqSq39MkiLBBypHMHL4C3o2LXERFPQkxXSibu35i+UDh5syyQtn3mXL5DVNtj0UBwhFdHBanYBERmc6svfX8kF2fD3Ykcdu62q9Rlkfgu3grVBwmIfpafR0ZMy4f6B6dZt3MLBJSKp0RZEhAhkcC+nf0f3zKNC+ysURknojb1DbDF/gREs4XZnxurmRa7WrCcmc60QFAf1DouUcyYqUtnv9ZURhmvKxwV7QuxiVCUyaxDn1T1EW8IqX8ztWd31E3brb2oXf7r5RhE6J3sjFq8KDMAxrwD1Sf3VlFq93AX2hXNjapVqucxybGJTqVWlhJXQgQRkSVia/GWa8dznvPIwRKFl/U0gAGKOyJRj82U1kHyouobRveExI8xZu4QCgmI0HKYGNQl/WWwRj8XGYiNCBNxOBzsNihMokc9Q2g2TC9mGNWlvDdBmEgkEtlsNiggEhuN2DspnLlS+SLVsskAOxf7m7BYLCqVCnpqnf+w8C824ajrO+WRJBQKhU6nCy9/qVSq0Wji7clNgBCwCIXC1dVV+u+IJEnsXFz1v4AQrVYbDAZDodA/IjLEyK0wXBIAAAAASUVORK5CYII='\n static splitBase64 = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAIAAABvFaqvAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAPnSURBVDhPY/z//z8DA8P9+/cPHz786tWrL1++ALnEAB4eHjExMRMTEy0tLSAXZNDevXsvXLgAFBIUFARKQ9QRBEAr379/f/PmTQEBgbCwMMZbt27t2bPH3d0dKo8XPPnCsuYO99W3LFMc3rEzg7wCBEeOHFFTU2M2MDAAuo2XlxciihW8/s684R5P+XGhBbfY5Vle/GT8+OankKHoT4gs0BMnTpxgefr0qZWVFUQIDfz8y7j5PvfOxxwX3zAYST4vM7qkwv8RKH7nI3/XOcUkzU8QZUJCQu/evWP5+/cvGxsbRAgOdj3i2vWYY/fj/7ZSH5yk79WZPoNKgAHQOG6WjydecFhI/IAKMTCwQGkwuPaObektnl2PWLR5P1rL3c3UecLG/BcqhwqClR/Ova6FxaDt27e3HGNjEVUKcxSa4/RciAOhAiswE3854bIOMOxEOaE2MUGo8+fPvzgwi3t3+pN1DbhMmTlhcXpk2YHdx4FsoEu9RZ8svYlIK1CDTp06xZB2eubyrotnrkKUIgOgSGFq/Y2rdyKTAh1cLSGC/lr3Vt7lBEYIhAv12sePoOiAGLF83nogCdEAFNm5+cCNy7fj0kMDIzyBInAAdLg61/uDTznd5L4BucwODg76+vri4uLb5rT8fHYlIMLzyvkbxw+e4eHl7m6YBmQ8uv906qJ2cxsjiH5kIMT9a+ENuVCVbxcvXoR6zdPTkyFqU/ukyoYv3UD3P3vP0N6x6uYHQWtHs6+eC2UVpBzWB/39zxC4FeQoIBtI1p80MxB5/eHnf2BcA7lQg4CxxrDMrzKvvYGnFOg1dXmeyoowNRmOS2evNSTIABWEKd9iZmRwlX0MYQNJcU6Qj2wEHqy5ywVkMNbX18fFxaWmpu6z23sgcF2UdxYvHw8w1IFyBMGLb1zbbyjc+Snp8rwf6qLXr18DSWDQyivLAr0GEcQFvvxm3fFQvvCwZd5hO3Yu0TZLUERBYy09PT2nzXS5wHvkCMYEp16K738qdfKJqL38nxLDbxYSL6AScINAgf0me2bgOggXDTz6zLvpvtL+p6Kagoy+Ct97rV/DyxA4QMlraODdD44jzyU33Vf+8481Wu1rieF7eIbABCxMTEzAAoCZmRkqAAb7nsjsvy999TO/m9yffptPWkK/oBK4AYuIiAiwNBEVFQVyrr0TWv9I8vgDYTsZ5ijtn25yryCK8ANgmQss2xiPHj167949YNlmsEJUkY8pRPmbr+JXPrZ/UFVEgEOHDvHz84MK/9mzZwMLcF1dXcwSDj/49esXsJAFuggY6dDqaPfu3UAhYGBBVBAJgCGrra0NjHFOTk4Ahi6b0E76oikAAAAASUVORK5CYII='\n static changeTypeBase64 = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAIAAABvFaqvAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAOmSURBVDhPjZVbTFN3HMfPzZZTir3QnhZSpOUytB1DGjYnOgmjKaIjpsMQE5+IMyQ+7Glx2cMelsWZuHh56sOQLD6QeNtMZvZgus7IRRs0oToQy6UVKYitnNOWQ1uKh+5Xzl+hjGE/adrz+/V7fuf3+5//+R48nU5jGBYIBPr6+kKhEM/zEOaCXC5nGKaurs5sNkOYKeR2u71eL6RUKhX8LerWU3bqlN/pRMFb4JIcx/l8PqVS2d7eToyPj4+NjTkcjpKSkg1V7t4funPPMxvmUIxhQZ665FWcdBcuCTiI4RSbzZZMJj0eDwETVVdXI+E6/u4fkiuVlRVVvpEJCK8M0y239V/eUcViYSkZ7BkrEGUAjDY4OEjMzMxoNBqUe4u7f0ggKFpCKxQqfZEeMj84O05bH/zW7OqwPm2rnLsxIROVgFqtZlmWEARBIpGg3Cp/9Q2lt0l1jIaS5i3GF6W07IKj42LbVyfO/LwsZAQVimg+FfXM5a3KEQT6XeUpKzl/658VnGJUKqZQW0DnB2dD4Xkuj8TZYGDkeJPtu19EZVv5VPdo1oKuFTr0h/5bV8ogjxsNRTqGEVaEeY5dSiT9L4J8Ir7Axy6PTCEphn2ie/WEJcIJEsXrC/miMudhLy2LLmMUwHJRluVYdj4a4XyT08adyq+L85EUwySkcFgb7PGtNZU1GlBbw0y/ejQ8MRWLxmAJX8+z4QhvKCuo3WNK8ikkWuWI2X9tkoZ9IIYbCwEWi2Yh/iww+xL6CXERvVHe2FACeXJbllidl6yScfdmaDHcpBBQ8xEjUyy8jCV0pQX2RiOOZy5LUhvFbbv83aNo3s0LAR9bi60fyu2flxIEaj7YtFc8eMduTTiylIZ7Dcf/Wwiori0iiTWB7vHwu28RYnl5v/L5zcnM5qTElEjDabRNtmBnz334oADDuo9dmoiQxq072oLRKoO19Vdd0+9SmfanvVHIZHWUC2f2nbyANzeUvvmmPP6pfg5lcy90/rMTZ6nmXSq81ZjoN4EBZOxwPe8Zbbq4sPLgdZP9FlfT+OcX3BVb+GgF/98qAEUQGQMgybWnRuR7u8OZOm7f8ebiBzGzOmtPbwoFZgSPglarFeMf93ecW2k6YCBby5Ye7giJya0BzwW3xAcGBvx+f319/e6rWtN24mh5vNW0uF2yglQ50Nvbq1AoMubf1dUFBg6Gu8Hh3ksqlQK3ho46OzvR68jlckEKFktU5AisrMViaWlpoWn6XwtDaLFzWSTkAAAAAElFTkSuQmCC'\n static setCenterBase64 = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAIAAABvFaqvAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAOsSURBVDhPjZVfTFN3FMdv20v/0Xrb0gsFFayYOlqqpcM/INNJFMIcuAXCki0Z+/NAfPCBhKhPJr74YGL0QV8GRqPRzcSow0UDLRChlbIJg6mwdtArbS+0hbUUarFIraf93RWR0vF5OPf7O+fk3N+/ey4rGo1iGEZRVG9vr9frDQaDMFwPIpEoMzOzuLhYrVbDMFaos7NzaGgIXFKpFMIo73+BV/r9fqvVKpFI6uvrWTabzWg0VlZWMvGUuIL4nbH0F//ilz718TixpQAmk0mlUnF0Oh3MTSwWI29Sphc49+2ik32yazZeHu4OswIzYVkRGUZRWITFYsFpmi4tLUWuDwhHWA+o9HYnf3gG02dPndD/tY0IgH8sQJwbVP5QMIfSZDKZz+fDI5EIl8tFrgQdDmGHk29wRj/JmS3faD+9a5IJxIFy6XjA4ubvVbxmXBiGM884Iz7uTZuow4FrxIF9uePHCl1cToSJraQ2f+LKqDp5oc/aFBFsqUY53lo+JePHMp4P/NNrGICTxbCovkS958AOlAnszvJcfFYIe0cKmDex0QOwBoSt5cYaJYWq/Hqry9D2RPuxqu67CrCDfaM3Lj9AmQDM9AjpumldvivLhd5n8MnIpGO66UxD2WE9qZCCPXbqK9jN9rtmJgPDjqrtt8cFcCBomLxQf88zfUkBCCflvt36CCzokoM7h/8YjcdjwMS3C/2PaQEaJi/kmfLkf7QZRNdv/fSEByzo7Volj8ePxxlqC+xXRtORTl6IkBBu1wyI8s/3ZGRKwYKmJ7wsNrMQhE4+PRuOwlmDTl5IpVH+afkbxGalouH4UbCgn5qfZ5BEPL5MmeTlnXEhiOSFjtTvD86Hfv7p4dxsrBmAhUO0W51136/4JN0hYRTjjs1yQK+4kO8Dx3TvuvHqxftoKM+S/NhUy+OngQ6+STNN5rQ7cugQ8UXewll9oOvu2oWAL789xKj/+N2T1U3n9LvIA3lLzUWhvYrYaSJSFUrgmBe3UVu7abJAyqresnB+33SihyRIVcj3mm+aym6j8pfepn2jetVc5E98EKvB2Ww2XFkOJ7ZhCbpcm7qpjS/miYrcpQtlc2rZIhNYG1wul0M3IUkSBiM+2T1Hdt/LjP2bOF9rwhW5XpSUGui50NtYZrPZbrdDb9P9Qio3sOvyQ9XKVxu4b5msddDT00MQRKz5t7S0QAPXarWrO1xqFhcXocnCjBobG5nfkcFgABdsFspYJ7CzGo2mqqpKIBC8A/jTdMM1f3ILAAAAAElFTkSuQmCC'\n static editBase64 = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAIAAABvFaqvAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAANwSURBVDhPjZVtSFNRGMfvvdvd5rbu3Nzabb1IssKXLFe0sjBCTJAKsTcWUVR+iUiNIggK6kNfMoISCoMQFYoIKSihmkW1VTohWqa9Tke5am665dya2/V2e+7OZQ3N6e/Dvf/znPM855znnvNcnOM4DMM8Ho/NZvN6vaFQCJqzgaIomqbNZrPRaIQmH6izs9PhcJhMJrVarVQq0bjpaHcrTtVpJzLZjkuf2ciIy+XSarWVlZW42+22Wq1lZWXCwGkA/8Y+6lPQK8Y43QudL8LsriXOmAPQBevIz8/HW1pacnJyDAYDcphEqr+Zlu5a4lquHQF7/euVvQH6adUP0IFAoLu7Wzw4OAj7THj9I8U/YqYnLpV8Q/5J9uV9sDzkkwtoNBqfzydmGEYikUB774F5IQZnLVwa/yS0PKoksab31MF84eMQ6PXggcIxgfdh41zvb/C3VjnPFTumi4Io0kruDCiERjJQRUWk/Zy/sCjeeOR5ev8kkC9Yu9BIBjrryKqwLRxeLO8bUSPLjMB8BM499WSgphBII2PX6CM7Da4r75bHWME4IwWZv671UkgLPrUrft0sHzpkJot0/jYXf1JnQ3k21zvCIC0EeuOXdnllHCY/uTL26NuinxE5sqdn8+KvUTb4MUiCFgLdcyv2dBh+RBgFOee46eOFlwXh8B/UlZ5sCmt8pwIhBPrNEJAjJSkFXaJWuZve1NagnnQ865gvf0I9vC4DLUam8+uHkQBwHF+m5ezezI13Z7iAGFSOIA4vkEIgSJBUxJl0MdAUJW5uLkyYBxLPydzpV7wPSE6vDl69pbq4IGvV3CgYha3d/Dynzp6F9HQMjPJJ9YTFJ17p2/qlMRY/bBntOvP19jH+WAqBAJMuLqgpgE/eDfWmewv9UdEC5cT5Yl/7lmHYAXTpMlg0RthawwY/EqnAYbN9z6hZMbqWHj9UgI0xQWTfYQwjkQohEolYloUc9SdWPhYnGt6q7rv52xiKE31BHPYCuq4oCElJzj8VQq/Xt7VhR4+Pl299CzXgxifqck/W48QN2p835rR4/zt/KuFwGOo3AaV6aGjI/8WKfecv/XbjGKSgfh2v08yfitPpzM3N5Yt/a2trT89SDZ1t2cZ/yNkTj8ehyEaj0erqauF3ZLfb4XcE1RKNmCUkScKGSktLZTLZX9Msdr7+YiVbAAAAAElFTkSuQmCC'\n static drawBase64 = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAIAAABvFaqvAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAOUSURBVDhPnVVbTBNpFJ52/l6GFqaMTNEtFrpgjS0NBdkbXrLhgYtmNdl1SfTJGBNC4rO+7cM+bFYTEx982YDGFza7iZvduFkvtKjLRXDXC17AdBba0hZaWyiUtpS5WU+ZichKaPXLSeac83/55sxp5xtFNpvFMMzn8w0ODkaj0VQqBWUh0Ov1RqOxsbHRZrNBmRPq7+8fGxuDVmlpKRxLvLyAWy4sLHg8HoPB0NHRoWAYxu12t7a2yuebIpRCVyd14/Po4pdxDZ57FMDQ0JDVasWdTifMVlxcLHU3RCyD/+HVnxmhrjCaShRhFYk5lqqnWekUHmJ0dBTNzMw0NTVJrf+BFRV/+nS3gtonc1jDtvDphqc1ZAL6kwny3CPLiV1LEo2iqHg8jkRRVKvVUusN+gJFfUGtK5jd99Fis8n73Sez8sEqQE6HEqMR7edbV+QWhiH5uoqJuLqX0fcFkL04scc81VUbUuOifLYe31RPX3ph21jowLWtIiYcskz1NIcp7RpjQ3xa/vLCs1rYHU3Id1JKF4AnUdTT7D5k8eVVAcCkB+lQr2ftv7Im9L44bPP+OkXADyKVHy4Eg+8sWvh7hpDKdcveBBzPMpF/AsmJFYzFBVGj1VSRjq+tZM94fYt5GQiFTjTi7439y1g/1jqqSdtOqsasC2Ou2fCPmfSz8XkVEPIL8Tz3IPCXHvF0WyyYGtlbdQoCEmOJzkSqdpM//+bVAS2/EEJoiWVwOhpJP83wSUJFQkASTj3BjdFyg39yEQdafiExKyaV8awy07bj/JHa7iIVBQEJlIIizakjP3yRe28K2hEvRJRKsYKsq9myz0CYICCBEppoebZCLwCnICFB5FPc9NUXRy8/bo2lGQhIoEzx/hXESZzNhOIr2ms+S9fdFiFmyrh5AQux2eklLheQ5EoXT2RqJDJSwnyiiOO5hb3B7VDFHZ9pPEm2mIWzn8UikW+fUz/hN6O6A9z98PdAUCEufR2bsxrtGtkRUVlZGbgJTdNQTMSp3wPbRvxb9lfgx+xsizm6ysHryo8n783NVvZl/gsmyx9Ci32pZiu3W7C2tvqT4LngbYrh4WGv1wve5vyFtpQoj1Qvf2VJl6hfrUqsw/DYDf/iw4yQ8zMClVQZdu9xtkM+MDBAkmTO/Lu7u8HAHQ7Huw4nATgKhfxyvg2O48BkYaLOzk75c+RyuaAFy5IYBQI2a7fb29vbCYJ4DWjmkeQms4G/AAAAAElFTkSuQmCC'\n static mergeBase64 ='data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAIAAABvFaqvAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAQbSURBVDhPjZVdTFt1FMDvvaUtNyv9klIqo7Ed61gLmyOdICNrsnVpGoFFszUYt/mEaDJ9Ut80yxJf9MHozB4EZzTRZdnQKZ0NgbJJi+ma2oGwFUpp51Zmv2w7+sX6dT239xYoYMIvaXu+/uf+z/9/7ilKEASCID6fz2KxhEKhZDIJ6k7gcDh1dXVqtVqpVIJKJjKbzdPT02ASCATgpuIobIHqH9w1l46GaX0D8MhYLLawsMDn8w0GA+p2u8fHx3U6He0vE84wLt7l/pPJ3ouIl856aet2WK1WhUKBQUWtra20rczlWV7fqEhdv3hS/pA2/T9Qmt1ux5aXl2tra2lbqZbjNyX+VPQrjfnYbn/JRnRcb3h9VHLlAXc5WVWyVCAUCqPRaFWhUGCxWKCv1XKx3SqtSVBBJAT63sGHIz7pl39xP3HwGBgiZBdl3OKJxpROmm7g5Kko+glQy/ASfq55rryLdaqw1S6JS1PvotREXjTi2++M4GTeP59DkZznLLkEg89Jo/hRNL6hlgqYGANFi0WseOvn3+F7FyvYt+/Op0dMI93GCy/ZCYSsBiATZQqYhJ/gMHOUCTANW2iJ9DKfPA45pubuOz2mG5ZS220DmahZkL/qklM6EHzyb8AfWXzw9+SoI2ga6nb0TBjvrsRS4Oo8foggClTYJshEHx2ORnNsT5wHstM6/+vV209jiTnnIruahR/QGtUjZ97pOdbdzuVzuPxdGEYu2QppFeGFNlH+0kwLyG1dzbVi/isGzatntO2aA9yGFxBkvhSJvPXBaRRFTcNWSt0Enf5Ce3Q2yk9mmSCvxFONMgllh66AWmmxBJwULVVCJ2oW5J7Hi5dnyRZ/83wvGyczlhAhCBt+nsaSUCx1CVD+I0+g5F1nveB3X0yY/eJnBWziln01nSMQAhZH5mcO+mxff3b92pDpsS/QKKuHSChf2kQKG1lv+VNNyY/t3JtLMpVk4dsvfirk8+xqdqO8Xn1Y2dui5wnIqQCj4g/zPSp+ExVXcFqe/v7+HtWhpjqJQH/qKJwu3tH3TaSfygIvExx2//sGaKVkjjnh320PC2uYaWptRaJz+1MYE7vhadK9dsR2Z4a2lmEwGPageGi6pf+2tu83rSOwt0PEN3ZHKG/F27yHl5Ny89c8e3vlPugd2oogP7r3OSJCZ1DSJUm8LM59rlpRCrO0rwz0FwZ7pjXYlGK1Gsn84pWtvQoo8gxFJOdVCIy377Tht1vjW7MAGAwjmCa0hiA9slQ0jV9xKdIFFFQiB9fH/rAtrmnIUAFbgZkLAxqdmpryer2dnZ20NRu2hxJwCpQKsLCs641tpsIak5OTPB6PHP6Dg4MwwGHgUhNu52SzWZvNBjsaGBig/47GxsbAtPGwdgLco0ql0uv1OI7/B1EuvKrM1DRLAAAAAElFTkSuQmCC'\n static drawPrintBase64 = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAAaCAYAAABCfffNAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsIAAA7CARUoSoAAAAUQSURBVEhLjZbrM1VvFMfXOUcuyRhySW6FklJCkepFSi7jUpMuIzW55A/oVW/9I2YYipohphqKjCi3ZqSJbjRjXCsqt6Qkv/NZ7Eaifmtmz977PM9e37W+a63vc0yfPn1akH+Y2WyWL1++yIMHD6SxsVEcHR3FwcFBPn/+LElJSXLgwAFZv369/PjxY+mL3+2vICaTSQEmJibkzp07UlVVJd3d3fL9+3e93N3d5cqVK+Lh4SFbtmwRPz8/sbW1lZ8/fy55WDTz0v0PA4Drw4cPUl5eLpWVlbJx40bZtWuXfPv2Tebm5jSA1tZWKSgokM7OTgU2vl1ulqtXr+YvPf8yNlksFnn37p0C3Lp1S3bs2CEXLlxQx9Cyfft26evrk0ePHsnk5KQEBweLlRWllQxtbGxkYWGRpD9AjCiGhoakoqJCbt++LXv27JHs7Gy9u7q6yr59+2TDhg3y9OlTrY2Tk5MCNTU1aXAhISEKQkDYb3QBwMLg4KCUlpYqRREREXL58mWNlPWtW7fqM8Vn7cyZM/p7Q0ODfP36Vevx5MkTefXq1S+fvzLhhfTI4ObNm1JdXa0R5+TkKDWs44BIiXLz5s2ye/dumZqaUqfz8/Nib28vL1++lK6uLnF2dpZt27aJnZ3dYiY4wAYGBqSoqEju3bsn0dHRmsFyABxRdIKhCQICAiQwMFBOnDghFy9e1Oxev36tvqgb2RGE2QCAopKSErl//77SkJubqwAYXfP+/XvlvLm5WUZHR9UJWe3du1cp43l6elrBx8fHlW4ahr02OOnv75fi4mJ5+PChDpZBEVHDLR1Ei/b29srx48dl586dCo5jFxcXpYTWhq4XL17owPJtWFiYNoiZCK9duyY1NTUaFRThhDl49uyZXL9+XXmGBi4yxzF3aINCBhDwY8eO6TNrZMQ6l8XakvnUwKAoNDRUZmdnFYDuwlJTUzVqHMTGxmrUfGwYTlmbmZnRDNatW6czw/3o0aNi+fjxYz4AeXl5CkCB6Q74JJvz588rHR0dHVroI0eOaCYrDSDkhUGEfuoSHx+v9JvRGyYZAIoJp1AHDRQUIACJ8NChQ6pR2MpMmK+RkRHN/vnz5xIXFyenT5/WjjMznd7e3rrpzZs36pChOnfunDpCVuias2fPLkZl3bdcAAGAyrGxMblx44bU19dr+8MAWWlNrLKQzxTjGJUlg7S0NL3zTnbp6ekSGRmpHK8EABQABpijICoqSgEYViNbk7UjFtAf2o+CJiQkaAEBwMmpU6d0sol2tQxQ6bKyMqmrq1M6YcDX11f3GCBmehm19fT0lOTkZM2AmmAnT57UXkdGVgOg/cmgtrZW9u/frzVcrWZmDiSc0b4U+e7du+oQipgbHAK83ABF45gvFCImJkYp8vf3173LATAzIgYlcItuUThqtFYNADBUGoDw8HDJyMjQ9sZWAmBmWo3uoavgl/rQgpwVxulnGM9v376VwsJCFT9qkJWVpTUgmNUAMIu1hfPb29v10ElMTJSgoCBpa2tTKXFzc5NNmzbpMJIF2kW2ABw+fFgBmDNsLQDMYt2UjwOk4+DBgwpCNgDzp4FnLiMDAkBaLl26JD4+PurkbwCYqaenZ4FOQS3RH4wWbmlpUXFEgzgJOc+Hh4clJSVFMjMzxcvLS7P7FwBmstbDum9RTY0iA8oZgoZxzj9+/FjfaRAm/181WGlr/u8CiGmnk5Abio4EkQH2fwFERP4DZxLcmtGNPaEAAAAASUVORK5CYII='\n static documentSearchBase64 = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAIAAABvFaqvAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAKsSURBVDhPlZXda1JxGMfPmx6d56wzPW5pbC6EXIYkZF04E6PCddHV6qoXooL+gS6jboOgiyAWjaiugqC6HeV2MTaWmQilhVALas61TZ35Nl+Op2c7P7d55kH34YHj8zzH7+/5vT0HT6fTGIYlEolQKLS6ulooFMDtBJ1Ox/O8w+GwWq3gbggFg8FYLOZyuXp6ehiGkd5rSz6fz2Qy8XicZdmRkRE8EonMzc35/X6U74yygNOkKP2emZmxWCz4+Pj40NCQ2WyWoq9/sPfDBi1Vl9wtBBHHMezFmaSNq6BQA5jT7OwslUwmPR4PimHYvU/8bWf6bH9RphRZoe98NF7+YHp5esmuL6PoJnq9HuZICIKgVqtRDMMqAn6Iqwyw1cFm69UKBo1w0569OGH+nVOht3dAoGcHFGv4rSNr1w5nRyfM8bXtsSU6FYIa6yJ+NWD69U+VXicvvTehRINOhfqZ2iv/4rCpdMy4fvd4KlMmUaLBHqYG+wVTu2HPjlpzjEq+rYpCX1L00xj37Nu+nfZunq3V4Ri0QFFoIU+FljWfV5osmlLX0DGUQ6HnLk70rfdpBaJ5eDiocKBbFqUoFPije/69W928pgNM9cHwMnKaURQ6P5h39ZZkQ2spsYsS89W9VPRmnnkS5dTE1pLgdRE72F0d8y2hQDOKQhesOZ+5tHFTN1ERIhiJK1akuGtvf7JXAqbrk/slG4tyHF0HQ+ldKAqdsxQenfz70LMsGVxXKAflWkEA0ACQt0lN3Kgc7vpRvuwwIOtnqlIWAD1oT8hpQBkMBuhMRqNR8k8dKD7+yk0udInKw5dqBK/ZHht6LvRvfGpqCjq/2+1G4b0zPT0NQoTT6SwWi+FwuFKR99C2wF9AJZfL+Xw+9DmC/g9assVqC0mSNpvN6/XSNP0f/kMg5XZvKf4AAAAASUVORK5CYII='\n static showInfoObjBase64 ='data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAIAAABvFaqvAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAD6SURBVDhP1ZWxCoMwEIbzBn3kokMXXUQUFETESUEfQBwEEQUnBysE4mM4CCW9NDeVDiYg2I8TzjP/z+nwS/iHdV2TJLEs634YOAySeZ6lgzCq69q27aZppmlih4HDIAmCIMsyYUQp9X0fHx7mSVfsGIO9+r4nURS1bYszLcZxdByHmKa5LAvOdIFPRuDCO8Zuj5dqSeEPI+wU+78wUi0pPHMj7C5kpFpSeOZG2F3ISLWk8NtIG2FkGAZkGw50EUae5w3DgAMtIHMhv0nXdWma4kyLOI7LshThH4ZhnucaOQkScHFdd993/B1VVQWZC6+qBEiKoti2jXP+BtBOC1S23cCGAAAAAElFTkSuQmCC'\n\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()\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","\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';\nimport { Feature as olFeature } from 'ol';\nimport { DrawLayerSourceService } from '../../services/drawLayerSource.service';\nimport Geometry from 'ol/geom/Geometry';\nimport { DragDropModule } from '@angular/cdk/drag-drop';\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 previewEnabled?: boolean;\n featuresForPreview?: olFeature[];\n primaryFeaturesForPreview?: olFeature[];\n secondaryFeaturesForPreview?: olFeature[];\n drawLayerSourceService?: DrawLayerSourceService;\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, DragDropModule ]\n})\nexport class ConfirmDialogComponent {\n\n data: ConfirmDialogData = inject(MAT_DIALOG_DATA);\n private dialogRef: MatDialogRef<ConfirmDialogComponent, ConfirmChoice> = inject(MatDialogRef<ConfirmDialogComponent, ConfirmChoice>);\n\n choose(choice: ConfirmChoice) {\n this.clearPreview();\n this.dialogRef.close(choice);\n }\n\n preview(choice: ConfirmChoice) {\n if (this.data.previewEnabled === true && this.data.drawLayerSourceService) {\n const previewFeatures: olFeature<Geometry>[] = choice === 'primary' ? this.data.primaryFeaturesForPreview! :\n this.data.secondaryFeaturesForPreview!;\n const overlappingFeatureIds = previewFeatures.map(feature => feature.getId());\n this.data.drawLayerSourceService.hideFeaturesforPreview(overlappingFeatureIds);\n this.data.drawLayerSourceService.previewSource.addFeatures(previewFeatures);\n }\n }\n\n clearPreview(): void {\n if (this.data.previewEnabled === true && this.data.drawLayerSourceService) {\n this.data.drawLayerSourceService.previewSource.clear();\n // Restore overlapping features from draw layer after preview\n this.data.drawLayerSourceService.restoreFeaturesAfterPreview();\n }\n }\n}\n","\n@if(data.title) {\n <h2 mat-dialog-title\n cdkDrag\n cdkDragRootElement=\".cdk-overlay-pane\"\n cdkDragHandle>{{ 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 @if(data.secondaryText) {\n <button mat-button (click)=\"choose('secondary')\"\n (mouseenter)=\"preview('secondary')\" (mouseleave)=\"clearPreview()\">\n {{ data.secondaryText }}\n </button>\n }\n\n <!-- Primær handling -->\n <button mat-raised-button color=\"primary\" (click)=\"choose('primary')\" \n (mouseenter)=\"preview('primary')\" (mouseleave)=\"clearPreview()\">\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: true, \n data\n }\n );\n\n return dialogRef.afterClosed();\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 { FeatureHelperService } from './featureHelper.service';\nimport { Feature } from 'ol';\nimport { ConfirmDialogService } from './confirm-dialog.service';\n\n@Injectable()\nexport class CenterPointService {\n private readonly _centerPointProperty = '_centerpoint';\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 _featureHelper = inject(FeatureHelperService);\n private _confirmDialog = inject(ConfirmDialogService);\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 isCenterpoint(feature: Feature): boolean {\n return feature.get(this._centerPointProperty) === true;\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._confirmDialog.open({ message: 'Centerpunktet skal være inde i en flade', primaryText: 'OK', title: 'Advarsel'}).subscribe({\n next: () => { return false; } \n })\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(this._centerPointProperty) === 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(this._centerPointProperty, true);\n evt.feature.set('_parentPolyId', parentPolyId);\n this._featureHelper.setId(evt.feature);\n callBack();\n });\n }\n });\n\n }\n\n}","import { inject, Injectable } from '@angular/core';\nimport { Feature, Feature as olFeature } from 'ol';\nimport { area, difference, featureCollection, feature as turfFeature, booleanIntersects, intersect, booleanWithin } from '@turf/turf';\nimport GeoJSON, { GeoJSONFeature, GeoJSONGeometry } from 'ol/format/GeoJSON';\nimport Polygon from 'ol/geom/Polygon';\nimport { DrawLayerSourceService } from './drawLayerSource.service';\nimport { FeatureHelperService } from './featureHelper.service';\nimport { ConfirmDialogService } from './confirm-dialog.service';\nimport { map, Observable, of } from 'rxjs';\nimport Geometry from 'ol/geom/Geometry';\nimport { CurrentItemsService } from './currentItems.service';\nimport { StyleLike } from 'ol/style/Style';\n\n@Injectable()\nexport class OverlapService {\n\n private _drawLayerService = inject(DrawLayerSourceService);\n private _featureHelper = inject(FeatureHelperService);\n private _confirmService = inject(ConfirmDialogService);\n private _geoJsonFormat = new GeoJSON<olFeature<Polygon>>();\n private _current = inject(CurrentItemsService);\n\n private readonly EPSILON = 0.1;\n\n handleOverlaps(features: olFeature[], excludeIds: string[] = []): Observable<olFeature[]> { \n let newClippedFeature: any = null;\n let unlockedFeaturesAsGeoJson: GeoJSONFeature[] = [];\n let lockedClipped = false;\n let anyOverlappingLockedFeatures: boolean = false;\n\n // If the settings allows overlap, just return the features - no overlap check necessary\n if (!this._current.gisKomponentSettings.disableOverlap) { return of(features); }\n features.forEach(feature => {\n // Handle the locked.\n const overlappingLockedFeatures = this._drawLayerService.source.getFeatures().filter(f => this._featureHelper.isLocked(f) && f.getGeometry()?.intersectsExtent(feature.getGeometry()!.getExtent()));\n const clipped = this._handleLockedFeaturesOverlapping(overlappingLockedFeatures, feature);\n if (!lockedClipped && clipped) { lockedClipped = clipped }\n\n //Handle the unlocked.\n const overlappingUnlockedFeatures = this._drawLayerService.source.getFeatures().filter(f => !excludeIds.some(id => id == f.getId()) && !this._featureHelper.isLocked(f) && f.getGeometry()?.intersectsExtent(feature.getGeometry()!.getExtent()));\n if (overlappingUnlockedFeatures.length > 0) {\n anyOverlappingLockedFeatures = true;\n let newFeatureGeoJson = this._geoJsonFormat.writeFeatureObject(feature);\n const newFeatureArea = area(newFeatureGeoJson);\n unlockedFeaturesAsGeoJson = overlappingUnlockedFeatures.map(f => this._geoJsonFormat.writeFeatureObject(f));\n\n // If null the whole new feature is inside a the existing\n newClippedFeature = difference(featureCollection([newFeatureGeoJson, ...unlockedFeaturesAsGeoJson as any]));\n\n // if the new feature is completely inside one of the existing features, newClippedFeature will be null\n const areaNewClippedFeature = newClippedFeature ? area(newClippedFeature as any) : 1;\n if (Math.abs(newFeatureArea - areaNewClippedFeature) < this.EPSILON) { \n anyOverlappingLockedFeatures = false;\n }\n }\n });\n\n if (lockedClipped) {\n this._confirmService.open({ message: 'Der var overlap med låste flader, så den indtegnede flade er blevet beskåret', primaryText: 'OK', title: 'Advarsel'}).subscribe();\n }\n\n if (anyOverlappingLockedFeatures) {\n const primaryFeatures = features.map(feature => this._cloneFeatureWithId(feature));\n const secondaryFeatures = features.map(feature => this._cloneFeatureWithId(feature));\n const primaryFeaturesForPreview = this._handleUnlockedFeaturesOverlapping(primaryFeatures, 'primary', true);\n const secondaryFeaturesForPreview = this._handleUnlockedFeaturesOverlapping(secondaryFeatures, 'secondary', true);\n return this._confirmService.open({\n primaryText: 'Beskær den aktive',\n secondaryText: 'Bevar den aktive',\n disableClose: false,\n previewEnabled: true,\n primaryFeaturesForPreview: primaryFeaturesForPreview,\n secondaryFeaturesForPreview: secondaryFeaturesForPreview,\n drawLayerSourceService: this._drawLayerService,\n message: 'Fladerne beskæres for at undgå overlap (hold musen over for at se forhåndsvisning)?', \n title: 'Beskæring'\n }).pipe(map(msg => {\n return this._handleUnlockedFeaturesOverlapping(features, msg!) \n }));\n } else {\n return of(features);\n }\n }\n\n private _cloneFeatureWithId(feature: olFeature<Geometry>): olFeature<Geometry> {\n const clonedFeature = feature.clone();\n clonedFeature.setId(feature.getId());\n return clonedFeature;\n }\n\n private _handleUnlockedFeaturesOverlapping(features: olFeature[], msg: string, isPreview?: boolean): olFeature<Geometry>[] {\n const featuresToHideInPreview: Feature[] = []; // Holds features from the map that are completely within the new feature.\n features.forEach(feature => {\n const overlappingUnlockedFeatures = this._drawLayerService.source.getFeatures().filter(f => !this._featureHelper.isLocked(f) && f.getGeometry()?.intersectsExtent(feature.getGeometry()!.getExtent()));\n if (overlappingUnlockedFeatures.length > 0) {\n let newFeatureGeoJson = this._geoJsonFormat.writeFeatureObject(feature);\n const unlockedFeaturesAsGeoJson = overlappingUnlockedFeatures.map(f => this._geoJsonFormat.writeFeatureObject(f));\n const newClippedFeature = difference(featureCollection([newFeatureGeoJson, ...unlockedFeaturesAsGeoJson as any]));\n\n if (isPreview === true) {\n // Push the overlapping feature for this scenario (for preview)\n overlappingUnlockedFeatures.forEach(feature => features.push(this._cloneFeatureWithId(feature)));\n }\n if (msg === 'primary') {\n if (newClippedFeature) {\n const newGeometry = this._geoJsonFormat.readGeometry(newClippedFeature!.geometry);\n feature.setGeometry(newGeometry);\n } else {\n feature.setGeometry(undefined);\n }\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 if (featureDiff !== null) {\n const featureDiffArea = area(featureDiff!.geometry);\n if (Math.abs(featureArea - featureDiffArea) > this.EPSILON) {\n // If preview mode, then modify the geomery of overlapping objects only in the resulting array\n // not in the actual draw layer\n const existingFeature = isPreview === true ? features.find(feature => feature.getId() === f.id!) :\n this._drawLayerService.source.getFeatureById(f.id!);\n if (existingFeature) {\n const newGeometry = this._geoJsonFormat.readGeometry(featureDiff?.geometry);\n existingFeature.setGeometry(newGeometry);\n }\n }\n } else {\n // Check if the existing feature is totally within the new\n const fcReversed = featureCollection([newFeatureGeoJson, f]);\n const featureDiffReversed = difference(fcReversed as any);\n if (featureDiffReversed) {\n const reversedDiffArea = area(featureDiffReversed)\n if (reversedDiffArea) {\n // The only way to get here is that the new feature completely overlaps this one. This one should be removed\n // and added to the output-array, because that is used for hiding features in preview\n if (isPreview) { \n const featureToHide = new Feature(f.geometry);\n featureToHide.setId(f.id);\n featuresToHideInPreview.push(featureToHide)\n const overlappedFeature = features.find(existingFeature => existingFeature.getId() === f.id);\n if (overlappedFeature) { \n overlappedFeature.setGeometry(undefined);\n }\n } else {\n const featureToRemove = this._drawLayerService.source.getFeatureById(f.id!);\n if (featureToRemove) {\n this._drawLayerService.source.removeFeature(featureToRemove);\n }\n }\n }\n }\n }\n });\n }\n }\n });\n\n features = features.filter(feature => feature.getGeometry() !== undefined);\n return [ ...features, ...featuresToHideInPreview];\n }\n\n private _handleLockedFeaturesOverlapping(overlappingFeatures: olFeature[], orgFeature: olFeature): boolean {\n let newFeatureGeoJson = this._geoJsonFormat.writeFeatureObject(orgFeature);\n\n const orgFeatureArea = area(newFeatureGeoJson);\n if (overlappingFeatures.length > 0) {\n const overlappingLockedFeaturesAsGeoJson = overlappingFeatures.map(f => this._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) > this.EPSILON;\n if (actuallyClipped) {\n const geom = this._geoJsonFormat.readGeometry(clipped.geometry);\n orgFeature.setGeometry(geom);\n return true;\n \n }\n }\n }\n return false;\n }\n splitByFeature(cutterFeature: olFeature, remove: boolean = false): Observable<olFeature[]> {\n let result: olFeature[] = [];\n const cutterGeo = this._olToGeoJSON(cutterFeature.getGeometry()!);\n const cutter = turfFeature(cutterGeo);\n const overlappingFeatures = this._drawLayerService.source.getFeatures().filter(f => f.getGeometry()?.intersectsExtent(cutterFeature.getGeometry()!.getExtent()));\n overlappingFeatures.forEach(feature => {\n const style = feature.getStyle();\n const geom = feature.getGeometry();\n if (!geom) return;\n const geo = this._olToGeoJSON(geom);\n const aTurfFeature = turfFeature(geo);\n if (!booleanIntersects(aTurfFeature, cutter)) {\n return;\n }\n // Feature is fully inside the cutter, so remove the whole feature\n if (remove && booleanWithin(aTurfFeature, cutter)) {\n this._drawLayerService.source.removeFeature(feature)\n return;\n }\n // Outside part(s)\n const fc = featureCollection([aTurfFeature, cutter]);\n const diff = difference(fc as any);\n // Inside part(s)\n const inter = intersect(fc as any);\n // Add outside part(s)\n if (diff && area(diff.geometry) > this.EPSILON) result = result.concat(this._addTurfToResult(diff, style));\n // Add inside part(s)\n if (!remove && inter && area(inter.geometry) > this.EPSILON) result = result.concat(this._addTurfToResult(inter, style));\n // Remove the original overlapping feature (it was split into diff + inter)\n if (result.length > 0) this._drawLayerService.source.removeFeature(feature);\n });\n return of(result);\n }\n\n private _addTurfToResult(aTurfFeature: any, style: StyleLike | undefined): olFeature[] {\n const result: olFeature[] = []\n if (aTurfFeature.geometry.type === 'MultiPolygon') {\n aTurfFeature.geometry.coordinates.forEach((coords: any) => {\n const newFeature = new olFeature(\n this._geoJSONToOl({\n type: 'Polygon',\n coordinates: coords,\n style: style\n })\n );\n if (style) newFeature.setStyle(style);\n result.push(newFeature);\n });\n } else {\n const newFeature = new olFeature(this._geoJSONToOl(aTurfFeature.geometry));\n if (style) newFeature.setStyle(style);\n result.push(newFeature);\n }\n return result;\n }\n private _olToGeoJSON(geometry: Geometry): GeoJSONGeometry {\n const geoJson = new GeoJSON();\n return geoJson.writeGeometryObject(geometry.clone().transform('EPSG:25832', 'EPSG:4326'));\n }\n\n private _geoJSONToOl(geo: any): Geometry {\n const geoJson = new GeoJSON();\n return geoJson.readGeometry(geo).transform('EPSG:4326', 'EPSG:25832');\n }\n}","import { HttpClient } from '@angular/common/http';\nimport { inject, Injectable } from '@angular/core';\nimport WFS from 'ol/format/WFS';\nimport WKT from 'ol/format/WKT';\nimport { combineLatest, map, Observable } from 'rxjs';\nimport { WfsFeatureCollection } from './wfsSearch.service';\nimport { ILayer } from '../models/ILayer';\nimport Filter from 'ol/format/filter/Filter';\nimport { Feature, FeatureCollection, GeoJsonProperties } from 'geojson';\nimport { Coordinate } from 'ol/coordinate';\nimport { CurrentItemsService } from './currentItems.service';\nimport Point from 'ol/geom/Point';\nimport { intersects } from 'ol/format/filter';\n\nexport abstract class SearchProviderBase<TResponse, TFilter> {\n\n protected _http = inject(HttpClient);\n private wfsFormat = new WFS();\n private _serializer = new XMLSerializer();\n\n search(searchValue: TFilter, maxCount: number ): Observable<TResponse[]> {\n const wftSearches: Observable<TResponse>[] = [];\n const searchLayers = this.getSearchableLayers();\n searchLayers.forEach(layer => {\n const filter = this.getFilter(searchValue, layer); // like(layer.searchField!, `*${searchValue}*`, '*', '?', '/', false);\n var searchFeature = this.wfsFormat.writeGetFeature({\n featureTypes: [layer.layers.includes(':') ? layer.layers.split(':')[1] : ''],\n outputFormat: 'application/json',\n featureNS: '',\n featurePrefix: '',\n srsName: 'EPSG:25832',\n maxFeatures: maxCount,\n filter\n });\n const body = this._serializer.serializeToString(searchFeature);\n // Call the post without generic <WfsFeatureCollection>, because the GeoServer will return a 200 and an error as xml. Handle the deserialize manually instead.\n const req$ = this._http.post(layer.baseUrl.replace('wms', 'wfs'), body, { headers: { 'Content-Type': 'text/xml' }, responseType: 'text', observe: 'response'}).pipe(map(r => {\n try {\n const result = JSON.parse(r.body ?? '');\n return this.map(layer, result as WfsFeatureCollection);\n } catch(err) {\n // Eat the error and console log to ensure the user isn't bombarded with errors they can't do anything about.\n console.error(`Fejl i læsning af svar for ${layer.name} fra wfs. Dette skyldes oftest fejl i opsætning. Kontroller at geometri-navnet er korrekt. Fejlkode: ${err}`);\n const empty: WfsFeatureCollection = {\n features: [],\n type: 'FeatureCollection'\n };\n return this.map(layer, empty);\n }\n\n }));\n wftSearches.push(req$);\n });\n return combineLatest(wftSearches);\n\n }\n\n abstract getSearchableLayers(): ILayer[];\n abstract getFilter(searchValue: TFilter, layer: ILayer): Filter;\n abstract map(l: ILayer, f: FeatureCollection): TResponse;\n}\n\nexport type ValueKind = 'data' | 'url' | 'img';\n\nexport interface IValue {\n kind: ValueKind;\n name: string;\n data: string; // altid string (vi konverterer alt til string)\n}\n\nexport interface IInfoSearchResult {\n layerName: string;\n values: Record<string, IValue>[];\n}\n\n@Injectable()\nexport class InfoSearchProvider extends SearchProviderBase<IInfoSearchResult, Coordinate> {\n \n private _current = inject(CurrentItemsService);\n override getSearchableLayers(): ILayer[] {\n return this._current.profile!.layerGroups.flatMap(lg => lg.layers).filter(f => f.enableShowInfo);\n }\n\n override getFilter(searchValue: Coordinate, layer: ILayer): Filter {\n const point = new Point(searchValue);\n return intersects(layer.geometryField, point);\n }\n\n override map(layer: ILayer, f: FeatureCollection): IInfoSearchResult { \n const fieldsToExclude = new Set(layer.fieldsToExcludeFromInfoFromInfo.split(',').map(f => f.toLowerCase().trim()));\n return {\n layerName: layer.name,\n values: f.features.map(f => this._mapFeature(f, fieldsToExclude))\n };\n }\n\n private _mapFeature(f: Feature, excludeSet: Set<string>): Record<string, IValue> {\n\n const result: Record<string, IValue> = {};\n \n const props: GeoJsonProperties = f.properties || { };\n for(const [key, value] of Object.entries(props)) {\n if (excludeSet.has(key.toLowerCase())) continue;\n\n const kind = this._getValueKind(value);\n result[key] = { kind, data: value, name: key }\n }\n return result;\n }\n\n private _getValueKind(value: any): ValueKind {\n const imgTypes = ['.png', '.jpg', '.gif', '.jpeg']\n if (typeof value === 'string') {\n if (value.startsWith('http://') || value.startsWith('https://')) {\n if (imgTypes.some(ext => value.endsWith(ext))) {\n return 'img';\n }\n return 'url';\n }\n }\n return 'data';\n }\n}\n","import { Point, Polygon } from 'ol/geom';\nimport { SearchProviderBase } from './infoSearch.service';\nimport { FeatureCollection } from 'geojson';\nimport Filter from 'ol/format/filter/Filter';\nimport { ILayer } from '../models/ILayer';\nimport { inject, Injectable } from '@angular/core';\nimport { CurrentItemsService } from './currentItems.service';\nimport { dwithin, intersects } from 'ol/format/filter';\n\nexport interface IDocumentResponse {\n layer: string;\n propertyName: string;\n propertyHeader: string;\n items: IDocumentSearchItem[];\n}\n\nexport interface IDocumentSearchItem {\n url: string;\n header: string;\n}\n\ninterface pointFilterItem {\n kind: 'point',\n value: Point,\n distance: number \n}\ninterface polygonFilterItem {\n kind: 'polygon',\n value: Polygon\n}\ntype filterItem = pointFilterItem | polygonFilterItem; \n\n@Injectable()\nexport class DocumentSearchService extends SearchProviderBase<IDocumentResponse, filterItem> {\n \n private _current = inject(CurrentItemsService);\n\n override getSearchableLayers(): ILayer[] {\n return this._current.profile!.layerGroups.flatMap(lg => lg.layers).filter(l => l.documentSearch);\n }\n\n override getFilter(searchValue: filterItem, layer: ILayer): Filter {\n\n return searchValue.kind === 'point' ? dwithin(layer.geometryField, searchValue.value, searchValue.distance, 'meters') : \n intersects(layer.geometryField, searchValue.value);\n }\n\n override map(l: ILayer, f: FeatureCollection): IDocumentResponse {\n return {\n layer: l.name,\n propertyName: l.documentSearchDisplayProperty,\n propertyHeader: l.documentSearchDisplayHeader,\n items: f.features.map(f => ({\n url: f.properties![l.documentSearchDisplayProperty],\n header: f.properties![l.documentSearchDisplayHeader] ?? 'Dokument'\n })) \n }\n }\n\n}\n","import { inject, Injectable } from '@angular/core';\nimport { CurrentItemsService } from './currentItems.service';\nimport { unByKey } from 'ol/Observable';\nimport { IInfoSearchResult, InfoSearchProvider } from './infoSearch.service';\nimport { Subject } from 'rxjs';\nimport { DocumentSearchService, IDocumentResponse } from './documentSearch.service';\nimport { Point, Polygon } from 'ol/geom';\nimport { Draw } from 'ol/interaction';\nimport { InteractionHelperService } from './interactionHelper.service';\nimport { Feature } from 'ol';\n\n@Injectable()\nexport class ShowInfoService {\n\n private _current = inject(CurrentItemsService);\n private _listenKey: any | null = null; \n private _active = false;\n private _infoSearchProvider = inject(InfoSearchProvider);\n private _features = new Subject<IInfoSearchResult[] | null>();\n features$ = this._features.asObservable();\n\n stopShowInfo(): void {\n this._features.next(null);\n this.disable();\n }\n\n startShowInfo(): void {\n if (this._active) { return; }\n const maxCount = this._current.profile?.searchResultLimit ?? 5;\n this._active = true;\n this._current.map$.subscribe({\n next: map => {\n this._listenKey = this._listenKey ?? map.on('singleclick', evt => {\n this._infoSearchProvider.search(evt.coordinate, maxCount).subscribe({\n next: r => {\n if (r.flatMap(l => l.values).length > 0) {\n this._features.next(r) \n } else {\n this._features.next(null);\n }\n },\n error: err => {\n this.disable();\n }\n })\n });\n }\n })\n }\n\n disable(): void {\n if (!this._active) { return; }\n if (this._listenKey) {\n unByKey(this._listenKey);\n this._listenKey = null;\n }\n this._active = false;\n }\n}\n\ntype interactionType = 'point' | 'polygon';\n@Injectable()\nexport class ShowDocumentInfoService {\n \n private _documentSearch = inject(DocumentSearchService);\n private _current = inject(CurrentItemsService);\n private _interactionHelper = inject(InteractionHelperService);\n\n private _currentlyActive?: interactionType;\n \n get currentActive(): interactionType | undefined { \n return this._currentlyActive; \n }\n private _listenKey: any | null = null; \n\n private _features = new Subject<IDocumentResponse[] | null>();\n features$ = this._features.asObservable();\n\n\n start(interactionType: 'point' | 'polygon') {\n if (this._currentlyActive) {\n this.stop();\n }\n \n if (interactionType === 'point') { \n this._startByPoint(); \n } else if(interactionType === 'polygon') {\n this._startByPolygon();\n }\n }\n\n stop(): void {\n this._currentlyActive = undefined;\n this._features.next(null);\n if (this._listenKey) {\n unByKey(this._listenKey);\n this._listenKey = null;\n }\n }\n\n private _startByPoint(): void { \n this._currentlyActive = 'point';\n this._listenKey = this._current.map?.on('singleclick', evt => {\n\n const map = this._current.map!; \n\n const pixel = evt.pixel; // CSS-pixels\n const pixelRadius = 8; // hold den fast – ingen DPR\n\n // to koordinater med pixel-afstand = pixelRadius\n const p1 = map.getCoordinateFromPixel([pixel[0], pixel[1]]);\n const p2 = map.getCoordinateFromPixel([pixel[0] + pixelRadius, pixel[1]]);\n\n // i EPSG:25832 er units meter → dx,dy er meter\n const dx = p2[0] - p1[0];\n const dy = p2[1] - p1[1];\n let meterRadius = Math.hypot(dx, dy);\n \n const MIN_M = 0.5;\n const MAX_M = 25;\n meterRadius = Math.max(MIN_M, Math.min(meterRadius, MAX_M));\n\n const point = new Point(evt.coordinate);\n this._documentSearch.search({ kind: 'point', distance: meterRadius, value: point}, 100).subscribe({\n next: result => {\n this._features.next(result);\n }\n })\n });\n }\n\n private _startByPolygon(): void {\n const draw = new Draw({ type: 'Polygon', stopClick: true });\n draw.on('drawend', evt => {\n const geom = evt.feature.getGeometry() as Polygon;\n this._documentSearch.search({ kind: 'polygon', value: geom }, 100).subscribe({\n next: result => {\n this._features.next(result);\n }\n });\n this._current.map!.removeInteraction(draw);\n });\n this._interactionHelper.setAsTemp(draw);\n \n this._current.map!.addInteraction(draw);\n }\n}","import { HttpClient } from '@angular/common/http';\nimport { inject, Injectable } from '@angular/core';\nimport { GISKOMPONENT_CONFIG } from '../config/config';\nimport { Observable } from 'rxjs';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class GeometryService {\n \n private config = inject(GISKOMPONENT_CONFIG);\n private _baseUrl = this.config.apiBaseUrl;\n private _http = inject(HttpClient);\n\n validate(wkt: string): Observable<ValidationResult> {\n const url = `${this._baseUrl}/api/geometry/validate`;\n return this._http.post<ValidationResult>(url, {wkt: wkt});\n }\n\n dmpValidate(wkt: string): Observable<DMPValidationResult> {\n const url = `${this._baseUrl}/api/geometry/dmpvalidate`;\n return this._http.post<DMPValidationResult>(url, {wkt: wkt});\n }\n}\n\nexport interface ValidationResult {\n wasCorrected: boolean;\n correctedGeometries?: string[];\n}\n\nexport interface DMPValidationResult {\n isValid: boolean;\n wasCorrected: boolean;\n correctionAttempts: number;\n error: DMPValidationErrorDto;\n correctedGeometry?: string;\n}\n\nexport interface DMPValidationErrorDto {\n code: number;\n message: string;\n ruleName: string;\n}","import { inject, Injectable } from '@angular/core';\nimport html2canvas from 'html2canvas-pro';\nimport { Map } from 'ol';\nimport { PrintMapSetting } from '../models/GisKomponentSettings';\nimport { LayerHelperService } from './layerHelper.service';\nimport Rotate from 'ol/control/Rotate';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class PrintHelperService {\n private _layerHelper: LayerHelperService = inject(LayerHelperService);\n\n setVisibiltyOnDOMElements(baseElement: HTMLElement, visible: boolean, printSetting?: PrintMapSetting) {\n const elements = ['activeobjects', '.ol-zoom', 'map-toolbox', '.ol-mouse-position', '.layer-selector-body-wrapper'];\n if (printSetting && printSetting.printNorthArrow === false) {\n elements.push('.ol-rotate');\n }\n if (printSetting && printSetting.printScale != undefined && printSetting.printScale === false) {\n elements.push('.ol-scale-bar');\n }\n if (printSetting && printSetting.printLegends != undefined && printSetting.printLegends === false) {\n elements.push('lib-legends-list');\n }\n this._setVisibiltyOnDOMElements(baseElement, elements, visible);\n }\n\n getAllImgData(map: Map, printSettings: PrintMapSetting[], profileId: number): Promise<string[]> {\n const tasks = printSettings.map(item => () => this.getImgData(map, item, profileId));\n const results: string[] = [];\n\n return tasks\n .reduce<Promise<void>>((chain, task) => {\n return chain.then(() =>\n task().then(r => {\n results.push(r);\n })\n );\n }, Promise.resolve())\n .then(() => results);\n }\n\n getImgData(map: Map, printSetting: PrintMapSetting, profileId: number): Promise<string> {\n const htmlElement = map.getViewport();\n this.setVisibiltyOnDOMElements(htmlElement, false, printSetting);\n const rotateControls: Rotate[] = map\n .getControls()\n .getArray()\n .filter(c => c instanceof Rotate);\n // Hide the north arrow if setting is false\n if (rotateControls.length > 0 && !printSetting.printNorthArrow) rotateControls.forEach(rotateC => map.removeControl(rotateC));\n if (printSetting.onlyUseCheckedLayers) {\n this._layerHelper.toggleAllPrintLayersInMap(map);\n } else {\n this._layerHelper.applyCachedLayersToDisplayInMap(map, profileId);\n }\n \n return new Promise((resolve, reject) => {\n //Give time for layers/map controls to be rendered/removed\n setTimeout(() => {\n html2canvas(htmlElement, { \n useCORS: true,\n }).then(originalCanvas => { \n if (printSetting.printDimensions) {\n \n const srcW = originalCanvas.width;\n const srcH = originalCanvas.height;\n \n const scale = Math.min(printSetting.printDimensions[0] / srcW, printSetting.printDimensions[1] / srcH);\n const outW = Math.round(srcW * scale);\n const outH = Math.round(srcH * scale);\n \n // 3) Lav nyt canvas til nedskalering\n const scaledCanvas = document.createElement('canvas');\n scaledCanvas.width = outW;\n scaledCanvas.height = outH;\n \n const ctx = scaledCanvas.getContext('2d')!;\n ctx.imageSmoothingEnabled = true;\n ctx.imageSmoothingQuality = 'high';\n ctx.drawImage(originalCanvas, 0, 0, outW, outH);\n const dataUrl = scaledCanvas.toDataURL(printSetting.printFormat);\n this._restoreDOMElements(htmlElement, printSetting, map, rotateControls);\n resolve(dataUrl);\n } else {\n const imgData = originalCanvas.toDataURL(printSetting.printFormat);\n this._restoreDOMElements(htmlElement, printSetting, map, rotateControls);\n resolve(imgData);\n }\n }\n );\n }, 300);\n })\n }\n\n\n private _restoreDOMElements(htmlElement: HTMLElement, printSetting: PrintMapSetting, map: Map, rotateControls: Rotate[]): void {\n // Restore the north arrow if setting is false\n if (rotateControls.length > 0 && !printSetting.printNorthArrow) rotateControls.forEach(rotateC => map.addControl(rotateC));\n // Restore scale/legends list if they were removed for this print (might be needed for next print)\n this.setVisibiltyOnDOMElements(htmlElement, true, printSetting);\n }\n\n private _setVisibiltyOnDOMElements(baseElement: HTMLElement, elements: string[], visible: boolean): void {\n let visibilityValue = 'hidden';\n if (visible) { visibilityValue = 'visible'; }\n\n elements.forEach(e => {\n const activeobjects = baseElement.querySelector(e) as HTMLElement;\n if (activeobjects) { activeobjects!.style.visibility = visibilityValue; }\n });\n\n }\n\n\n}","import { inject, Injectable } from '@angular/core';\nimport { Geometry } from 'ol/geom';\nimport { forkJoin, Observable, Subject } from 'rxjs';\nimport { IValue } from './infoSearch.service';\nimport { CurrentItemsService } from './currentItems.service';\nimport { ILayer } from '../models/ILayer';\n\n@Injectable()\nexport class SearchProviderService {\n private _cancelSearchSubject = new Subject();\n private _cancelSearch = this._cancelSearchSubject.asObservable();\n\n private _current = inject(CurrentItemsService);\n searchProviders: SearchProvider[] = [];\n\n search(searchString?: string, geometry?: Geometry): Observable<SearchResponse[]> {\n this._cancelSearchSubject.next('');\n const maxSearchResults = this._current.profile?.searchResultLimit ?? 8;\n\n const searches = this.searchProviders.map(sp => sp.search(searchString, geometry, maxSearchResults)).flatMap(sp => sp);\n return forkJoin(searches);\n }\n}\n\nexport interface SearchProvider {\n name: string;\n search(searchValue?: string, geometry?: Geometry, maxCount?: number): Observable<SearchResponse> | Observable<SearchResponse>[];\n}\n\nexport interface SearchResponseItem {\n wkt: string;\n header: string; \n showMetadata: boolean;\n metadata?: Record<string, IValue>[];\n}\n\nexport interface SearchResponse {\n total: number;\n title: string;\n items: SearchResponseItem[];\n}","\nimport { Injectable } from '@angular/core';\nimport { Coordinate } from 'ol/coordinate';\nimport Map from 'ol/Map';\nimport { toLonLat } from 'ol/proj';\n\n@Injectable()\nexport class CowiService {\n\n openCowiPageFromPoint(cowiUrl: string, coordinate: Coordinate): void {\n const regExp: RegExp = /(?:@x.*?@y)/gi;\n const doReplace = (match: string) => {\n if (match.startsWith('@x')) {\n return match.replace('@x', `${coordinate[0]}`).replace('@y', `${coordinate[1]}`);\n }\n return match;\n };\n const convertedUrl: string = cowiUrl.replace(regExp, doReplace);\n window.open(convertedUrl);\n\n }\n \n openCowiPageFromCenterPoint(cowiUrl: string, map: Map): void {\n const centerPoint = map.getView().getCenter();\n if (!centerPoint) return;\n if (!cowiUrl) return;\n const regExp: RegExp = /(?:@x.*?@y)/gi;\n const doReplace = (match: string) => {\n if (match.startsWith('@x')) {\n return match.replace('@x', `${centerPoint[0]}`).replace('@y', `${centerPoint[1]}`);\n }\n return match;\n };\n const convertedUrl: string = cowiUrl.replace(regExp, doReplace);\n window.open(convertedUrl);\n }\n\n openGoogleStreetViewFromCenterPoint(map: Map) {\n const centerPoint = map.getView().getCenter();\n\n if (!centerPoint) {\n return;\n }\n const [lon, lat] = toLonLat(centerPoint, 'EPSG:25832');\n\n const streetViewUrl = `https://www.google.com/maps/@?api=1&map_action=pano&viewpoint=${lat},${lon}`;\n\n window.open(streetViewUrl);\n }\n\n openGoogleStreetViewFromPoint(coordinate: Coordinate) {\n if (!coordinate) {\n return;\n }\n const [lon, lat] = toLonLat(coordinate, 'EPSG:25832');\n\n const streetViewUrl = `https://www.google.com/maps/@?api=1&map_action=pano&viewpoint=${lat},${lon}`;\n\n window.open(streetViewUrl);\n }\n}\n","import { inject, Injectable } from '@angular/core';\nimport { SearchProvider, SearchResponse } from './searchProvider.service';\nimport { map, Observable, of } from 'rxjs';\nimport { Geometry } from 'ol/geom';\nimport { HttpClient, HttpParams } from '@angular/common/http';\nimport { GISKOMPONENT_CONFIG } from '../config/config';\nimport { CurrentItemsService } from './currentItems.service';\nimport { DOCUMENT } from '@angular/common';\n\ninterface IAddressSearchResponse {\n header: string;\n wkt: string;\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class AddressSearchService implements SearchProvider {\n name = 'Adresser';\n private _http = inject(HttpClient);\n\n private _config = inject(GISKOMPONENT_CONFIG);\n private _current = inject(CurrentItemsService);\n private document = inject(DOCUMENT);\n\n private readonly _baseUrl = `${this._config.apiBaseUrl}/api/address/addresses`;\n private readonly _downloadUrl = `${this._config.apiBaseUrl}/api/address/downloadaddresses`;\n\n search(searchValue?: string, geometry?: Geometry, maxCount: number = 5): Observable<SearchResponse> {\n\n const regionskode = this._current.profile?.searchRegionKode ?? '';\n\n const params = new HttpParams().append('search', searchValue ?? '').append('regionskode', regionskode);\n if (!regionskode || regionskode === '' || !searchValue) {\n // No valid filters provided, skip call\n return of({ total: 0, items: [], title: ''});\n }\n return this._http.get<IAddressSearchResponse[]>(this._baseUrl, { params}).pipe(map(r => ( { total: 0, title: this.name, items: r.map(i => ({ ...i, showMetadata: false })) } ) ))\n\n }\n\n download(coordinates: string): void {\n\n const params = new HttpParams().append('coordinates', coordinates);\n this._http.get(this._downloadUrl, { params, responseType: 'blob'}).subscribe(blob => {\n const url = URL.createObjectURL(blob);\n const a = this.document.createElement('a');\n\n a.style.display = 'none';\n a.href = url;\n a.download = 'adresser.csv';\n\n this.document.body.appendChild(a);\n a.click();\n a.remove();\n\n setTimeout(() => URL.revokeObjectURL(url), 0);\n });\n\n }\n}\n\n","import { inject, Injectable } from '@angular/core';\nimport { SearchProvider, SearchResponse } from './searchProvider.service';\nimport { map, Observable, of } from 'rxjs';\nimport { Geometry } from 'ol/geom';\nimport { HttpClient, HttpParams } from '@angular/common/http';\nimport { GISKOMPONENT_CONFIG } from '../config/config';\nimport { CurrentItemsService } from './currentItems.service';\nimport { DOCUMENT } from '@angular/common';\n\ninterface IAddressSearchResponse {\n header: string;\n wkt: string;\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class CadastreSearchService implements SearchProvider {\n name = 'Matrikler';\n private _http = inject(HttpClient);\n\n private _config = inject(GISKOMPONENT_CONFIG);\n private _current = inject(CurrentItemsService);\n private document = inject(DOCUMENT);\n\n private readonly _baseUrl = `${this._config.apiBaseUrl}/api/address/cadastres`;\n private readonly _downloadUrl = `${this._config.apiBaseUrl}/api/address/downloadcadastres`;\n\n search(searchValue?: string, geometry?: Geometry, maxCount: number = 5): Observable<SearchResponse> {\n\n const regionskode = this._current.profile?.searchRegionKode;\n if (!regionskode || regionskode === '' || !searchValue) {\n // No valid filters provided, skip call\n return of({ total: 0, items: [], title: ''});\n }\n const params = new HttpParams().append('search', searchValue ?? '').append('regionskode', regionskode);\n return this._http.get<IAddressSearchResponse[]>(this._baseUrl, { params}).pipe(map(r => ( { total: 0, title: this.name, items: r.map(i => ({ ...i, showMetadata: false })) } ) ))\n }\n\n\n download(coordinates: string): void {\n\n const params = new HttpParams().append('coordinates', coordinates);\n this._http.get(this._downloadUrl, { params, responseType: 'blob'}).subscribe(blob => {\n const url = URL.createObjectURL(blob);\n const a = this.document.createElement('a');\n\n a.style.display = 'none';\n a.href = url;\n a.download = 'matrikler.csv';\n\n this.document.body.appendChild(a);\n a.click();\n a.remove();\n\n setTimeout(() => URL.revokeObjectURL(url), 0);\n });\n }\n\n \n}\n\n","import { Point, Polygon } from 'ol/geom';\nimport { ILayer } from '../models/ILayer';\nimport { SearchProviderBase } from './infoSearch.service';\nimport { FeatureCollection } from 'geojson';\nimport Filter from 'ol/format/filter/Filter';\nimport { inject, Injectable } from '@angular/core';\nimport { CurrentItemsService } from './currentItems.service';\nimport { intersects } from 'ol/format/filter';\nimport { WKT } from 'ol/format';\nimport GeoJSON from 'ol/format/GeoJSON';\nimport { WfsFeatureCollection } from './wfsSearch.service';\n\n\nexport interface GeometrySearchResponseItem {\n header: string;\n id: string;\n wkt: string;\n url?: string;\n}\n\nexport interface GeometrySearchResponse {\n total: number;\n title: string;\n layer: ILayer;\n items: GeometrySearchResponseItem[];\n}\n\n@Injectable()\nexport class GeometrySearchService extends SearchProviderBase<GeometrySearchResponse, Point | Polygon> {\n\n private _current = inject(CurrentItemsService);\n private _wktFormat = new WKT();\n private geoJsonFormat = new GeoJSON({ dataProjection: 'EPSG:25832', featureProjection: 'EPSG:25832'});\n\n override getSearchableLayers(): ILayer[] {\n return this._current.profile!.layerGroups.flatMap(lg => lg.layers).filter(l => l.wfsSearchable);\n }\n\n override getFilter(searchValue: Point | Polygon, layer: ILayer): Filter {\n return intersects(layer.geometryField, searchValue);\n }\n\n override map(l: ILayer, f: FeatureCollection): GeometrySearchResponse {\n const fc = f as WfsFeatureCollection;\n return {\n title: l.name,\n layer: l,\n total: fc.numberMatched ?? fc.features.length,\n items: f.features.map(f => {\n const olFeature = this.geoJsonFormat.readFeature(f);\n const wkt = this._wktFormat.writeFeature(olFeature as any);\n const url = f.properties && l.geometrySearchExternalUrl && f.properties[l.geometrySearchExternalUrl] ? f.properties[l.geometrySearchExternalUrl] : '';\n const item: GeometrySearchResponseItem = {\n header: l.headerField && f.properties? f.properties[l.headerField] : f.id!,\n wkt,\n id: `${f.id!}`,\n url\n };\n return item;\n })\n }\n }\n\n}","import { Component, inject, Input, OnChanges, OnInit, SimpleChanges } 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, Icon, 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 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 { difference, featureCollection } 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 { 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 { CenterPointService } from '../../services/centerPoint.service';\nimport { OverlapService } from '../../services/overlap.service';\nimport { ZoomService } from '../../services/zoom.service';\nimport { filter, map, Observable, combineLatest } from 'rxjs';\nimport { ShowDocumentInfoService, ShowInfoService } from '../../services/showInfo.service';\nimport { GeometryService } from '../../services/geometry.service';\nimport { PrintHelperService } from '../../services/printHelper.service';\nimport { LayoutService, WidgetPositionOptions } from '../../services/layoutService';\nimport { EventsKey } from 'ol/events';\nimport { SearchProviderService, SearchResponse, SearchResponseItem } from '../../services/searchProvider.service';\nimport { unByKey } from 'ol/Observable';\nimport { BufferOp } from 'jsts/org/locationtech/jts/operation/buffer';\nimport { GeoJSONReader, GeoJSONWriter } from 'jsts/org/locationtech/jts/io';\nimport GeometryFactory from 'jsts/org/locationtech/jts/geom/GeometryFactory';\nimport PrecisionModel from 'jsts/org/locationtech/jts/geom/PrecisionModel';\nimport { IInfoSearchResult } from '../../services/infoSearch.service';\nimport { CowiService } from '../../services/cowi.service';\nimport { ProfileService } from '../../services/profile.service';\nimport { ConfirmDialogService } from '../../services/confirm-dialog.service';\nimport { AddressSearchService } from '../../services/addressSearch.service';\nimport { CadastreSearchService } from '../../services/cadastreSearch.service';\nimport { GeometrySearchResponse, GeometrySearchService } from '../../services/geometrySearch.service';\nimport { WidgetConstants } from '../../models/widget.constants';\n\ninterface DrawItem {\n name: string;\n typeId: string;\n geomType: geometryType;\n style?: string;\n iconUrl?: string;\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]\n})\nexport class ToolboxComponent implements OnInit, OnChanges {\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 _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 _cowiService = inject(CowiService);\n private _overlap = inject(OverlapService);\n private _zoomService = inject(ZoomService);\n private _showInfo = inject(ShowInfoService);\n private _geometryService = inject(GeometryService);\n private _printHelper = inject(PrintHelperService);\n private _layoutService: LayoutService = inject(LayoutService);\n private _searchService = inject(SearchProviderService);\n private _POSITION_STORAGE_KEY = 'toolbox_position';\n private _profileService: ProfileService = inject(ProfileService);\n private _confirmService = inject(ConfirmDialogService);\n private _addressService = inject(AddressSearchService);\n private _cadastreService = inject(CadastreSearchService);\n private _documentSearch = inject(ShowDocumentInfoService);\n private _originalMapWidth: number = 0;\n private _originalMapHeight: number = 0;\n private pointClickKey?: EventsKey;\n private _geometrySearchService = inject(GeometrySearchService);\n\n private drawInteraction?: Draw;\n\n get showDocumentSearch(): boolean {\n return this.settings?.showDocumentSearch !== false;\n }\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 bufferInMeters: number = 0;\n selectedSearchMode: 'search-point' | 'search-polygon' = 'search-point';\n selectedMeasureMode: 'measure-distance' | 'measure-area' = 'measure-distance';\n printDrawTool: 'Arrow' | 'Point' | 'LineString' | 'Polygon' | 'Circle' | 'Square' | 'Rectangle' = \"Point\";\n filteredResults: SearchResponse[] = [];\n geometrySearchResult: GeometrySearchResponse[] = [];\n filteredResultsMetadata: IInfoSearchResult[] = [];\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 featureSearchIconBase64 = IconsConstants.featureSearchIconBase64;\n objectSearchCopyIconBase64 = IconsConstants.copyIconBase64;\n objectSearchCopyWithBufferIconBase64 = IconsConstants.copyWithBufferBase64;\n objectSearchCutIconBase64 = IconsConstants.cutIconBase64;\n objectSearchZoomIconBase64 = IconsConstants.zoomIconBase64;\n polygonIconBase64 = IconsConstants.polygonIconBase64;\n lineStringIconBase64 = IconsConstants.lineStringIconBase64;\n printBase64 = IconsConstants.printBase64;\n drawBase64 = IconsConstants.drawBase64;\n fremhaevBase64 = IconsConstants.fremhaevBase64;\n fremhaevSelectedBase64 = IconsConstants.fremhaevSelectedBase64;\n infoBase64 = IconsConstants.infoBase64;\n streetViewBase64 = IconsConstants.streetViewBase64;\n openCowiPageBase64 = IconsConstants.openCowiPageBase64;\n sogPunktBase64 = IconsConstants.sogPunktBase64;\n sogPolygonBase64 = IconsConstants.sogPolygonBase64;\n skrafotoBase64 = IconsConstants.skrafotoBase64;\n downloadFileBase64 = IconsConstants.downloadFileBase64;\n downloadMatriklerBase64 = IconsConstants.downloadMatriklerBase64;\n VaelgLokaliteterBase64 = IconsConstants.VaelgLokaliteterBase64;\n searchDocumentByPolygonBase64 = IconsConstants.searchDocumentByPolygonBase64;\n searchDocumentByPointBase64 = IconsConstants.searchDocumentByPointBase64;\n clipHoleBase64 = IconsConstants.clipHoleBase64;\n splitBase64 = IconsConstants.splitBase64;\n changeTypeBase64 = IconsConstants.changeTypeBase64;\n setCenterBase64 = IconsConstants.setCenterBase64;\n editBase64 = IconsConstants.editBase64;\n mergeBase64 = IconsConstants.mergeBase64;\n drawPrintBase64 = IconsConstants.drawPrintBase64;\n documentSearchBase64 = IconsConstants.documentSearchBase64;\n showInfoObjBase64 = IconsConstants.showInfoObjBase64;\n dragPosition : { x: number; y: number} = { x: 0, y: 0 };\n snap: boolean = true;\n showInputWKT: boolean = false;\n showGeometryTypes: boolean = false;\n drawItems: DrawItem[] | undefined;\n selectedDrawItem: DrawItem | undefined;\n WKTString?: string = '';\n activeMode: 'draw' | 'edit' | 'edit-remove' |\n 'delete' | 'change-type' | 'clip-hole' | 'select-highlight' |\n 'split' | 'measure-area' | 'measure-distance' | 'merge-features' | 'center-point'\n | 'search-feature' | 'search-point' | 'search-polygon' | 'document-search-by-point' | 'document-search-by-polygon'\n | 'show-info' | 'cowi' | 'streetview' |'wkt-input' | 'skrafoto' | 'download-addresses' | 'download-cadastres' | null = null;\n\n activateShowInputWKT(): void {\n this._clearAllInteractions();\n this.showInputWKT = true;\n this.activeMode = 'wkt-input';\n this._active = 'No';\n this.selectedDrawItem = this.selectedDrawItem ?? this.drawItems![0];\n }\n\n cancelWKT(): void {\n this._clearAllInteractions();\n this.showInputWKT = false;\n }\n\n togglePointPolygonSearch(): void {\n const isAlreadyActive =\n this.activeMode === 'search-point' ||\n this.activeMode === 'search-polygon';\n\n if (isAlreadyActive) {\n this._clearAllInteractions();\n this._disablePointSearch();\n this._disablePolygonSearch();\n this.activeMode = null;\n return;\n }\n\n this._clearAllInteractions();\n this.selectedSearchMode = 'search-point';\n this.activeMode = 'search-point';\n this._enablePointSearch();\n }\n\n onSearchModeChanged(event: MatSelectChange): void {\n this._disablePointSearch();\n this._disablePolygonSearch();\n this.filteredResults = [];\n\n if (event.value === 'search-point') {\n this.activeMode = 'search-point';\n this._enablePointSearch();\n } else {\n this.activeMode = 'search-polygon';\n this._enablePolygonSearch();\n }\n }\n\n private _enablePolygonSearch(): void {\n this.geometrySearchResult = [];\n this.drawInteraction = new Draw({\n source: new VectorSource(),\n type: 'Polygon'\n });\n this._interactionHelper.setAsTemp(this.drawInteraction);\n this.map.addInteraction(this.drawInteraction);\n this.drawInteraction.on('drawend', (evt) => {\n this._geometrySearchService.search(evt.feature.getGeometry() as Polygon, this.profile.searchResultLimit).subscribe({\n next: result => {\n this.geometrySearchResult = result.filter(result => result.total > 0);\n }\n })\n });\n }\n\n toggleMeasure(): void {\n const isAlreadyActive =\n this.activeMode === 'measure-distance' ||\n this.activeMode === 'measure-area';\n\n if (isAlreadyActive) {\n this.stopMeasureLength();\n this.stopMeasureArea();\n this._active = 'No';\n this.activeMode = null;\n return;\n }\n\n this._clearAllInteractions();\n this.selectedMeasureMode = 'measure-distance';\n this.activeMode = 'measure-distance';\n this._active = 'Distance';\n this.map.addLayer(this._distanceLayer);\n this.map.addLayer(this._distanceLabelLayer);\n this.map.addInteraction(this._distanceMeasureDraw);\n }\n\n onMeasureModeChanged(event: MatSelectChange): void {\n this.stopMeasureLength();\n this.stopMeasureArea();\n\n if (event.value === 'measure-distance') {\n this.activeMode = 'measure-distance';\n this._active = 'Distance';\n this.map.addLayer(this._distanceLayer);\n this.map.addLayer(this._distanceLabelLayer);\n this.map.addInteraction(this._distanceMeasureDraw);\n } else {\n this.activeMode = 'measure-area';\n this._active = 'Area';\n this.map.addLayer(this._areaLayer);\n this.map.addInteraction(this._areaMeasureDraw);\n }\n }\n\n toggleFeatureSearch(): void {\n if (this.activeMode != 'search-feature') {\n this._clearAllInteractions();\n this.activeMode = 'search-feature';\n this.showGeometryTypes = true;\n this._enablePointSearch();\n } else {\n this.activeMode = null;\n this.showGeometryTypes = false;\n this._disablePointSearch();\n this.filteredResults = [];\n }\n }\n\n togglePointSearch(): void {\n if (this.activeMode != 'search-point') {\n this._clearAllInteractions();\n this._disablePolygonSearch();\n this.activeMode = 'search-point';\n this._enablePointSearch();\n } else {\n this.activeMode = null;\n this._disablePointSearch();\n }\n }\n\n toggleCowiPage(): void {\n if (this.activeMode != 'cowi') {\n this._clearAllInteractions();\n this.activeMode = 'cowi';\n this.pointClickKey = this.map.on('click', evt => {\n this._cowiService.openCowiPageFromPoint(this.settings.cowiUrlTemplate, evt.coordinate);\n })\n } else {\n this.activeMode = null;\n this._clearAllInteractions();\n if (this.pointClickKey) {\n unByKey(this.pointClickKey!);\n this.pointClickKey = undefined;\n }\n }\n }\n\n toggleSkraafotoPage(): void {\n if (this.activeMode != 'skrafoto') {\n this._clearAllInteractions();\n this.activeMode = 'skrafoto';\n this.pointClickKey = this.map.on('click', evt => {\n this._cowiService.openCowiPageFromPoint(this.settings.skraaFotoUrlTemplate, evt.coordinate);\n })\n } else {\n this.activeMode = null;\n this._clearAllInteractions();\n if (this.pointClickKey) {\n unByKey(this.pointClickKey!);\n this.pointClickKey = undefined;\n }\n }\n }\n\n toggleGoogleStreetviewPage(): void {\n if (this.activeMode != 'streetview') {\n this._clearAllInteractions();\n this.activeMode = 'streetview';\n this.pointClickKey = this.map.on('click', evt => {\n this._cowiService.openGoogleStreetViewFromPoint(evt.coordinate);\n })\n } else {\n this.activeMode = null;\n this._clearAllInteractions();\n if (this.pointClickKey) {\n unByKey(this.pointClickKey!);\n this.pointClickKey = undefined;\n }\n }\n }\n\n startDocumentPointSearch(): void {\n this._clearAllInteractions();\n this.activeMode = 'document-search-by-point';\n this._documentSearch.start('point');\n }\n\n startDocumentPolygonSearch(): void {\n this._clearAllInteractions();\n this.activeMode = 'document-search-by-polygon';\n this._documentSearch.start('polygon');\n }\n\n togglePolygonSearch(): void {\n this._disablePointSearch();\n if (this.activeMode != 'search-polygon') {\n if (this.drawInteraction) {\n this.map.removeInteraction(this.drawInteraction);\n this.drawInteraction = undefined;\n }\n this.activeMode = 'search-polygon';\n this._enablePolygonSearch(); // ← use shared method\n } else {\n this._disablePolygonSearch();\n this.activeMode = null;\n }\n }\n\n private _disablePolygonSearch(): void {\n if (this.drawInteraction) {\n this.map.removeInteraction(this.drawInteraction);\n this.drawInteraction = undefined;\n }\n this.geometrySearchResult = [];\n }\n\n private _enablePointSearch(): void {\n if (this.activeMode === 'search-point') this.geometrySearchResult = [];\n this._disablePointSearch();\n this.pointClickKey = this.map.on('singleclick', (evt: { coordinate: any; }) => {\n const point = new Point(evt.coordinate);\n if (this.activeMode === 'search-point') {\n this._geometrySearchService.search(point, this.profile.searchResultLimit).subscribe({\n next: result => this.geometrySearchResult = result.filter(result => result.total > 0)\n }) } else if (this.activeMode === 'search-feature') {\n this._searchService.search(undefined, point)\n .subscribe({\n next: result => {\n this.filteredResults = result.filter(result => result.total > 0);\n }\n }\n );\n }\n });\n }\n\n deleteGeometrySearchItem(result: GeometrySearchResponse, itemId: string, event: MouseEvent): void {\n event.stopPropagation();\n result.items = [...result.items.filter(i => i.id !== itemId)];\n }\n\n deleteAllGeometrySearchItem(): void {\n this.geometrySearchResult = [];\n }\n\n private _disablePointSearch(): void {\n if (this.pointClickKey) {\n unByKey(this.pointClickKey);\n this.pointClickKey = undefined;\n }\n this.geometrySearchResult = [];\n }\n\n openUrl(url: string | null | undefined, event: MouseEvent): void {\n event.stopPropagation();\n if (!url) return;\n\n const localUrl = url.startsWith('http:') || url.startsWith('https:') ? url : `https://${url}`;\n window.open(localUrl, '_blank');\n }\n\n splitBySearchedObject(item: SearchResponseItem, event: MouseEvent): void {\n event.stopPropagation();\n if (!item.wkt) { return; }\n if (!this.selectedDrawItem) { return; }\n const wktFormat = new WKT();\n let feature = wktFormat.readFeature(item.wkt, { featureProjection: 'EPSG:25832', dataProjection: 'EPSG:25832' });\n const geomType = feature.getGeometry()?.getType();\n if (!geomType) { return; }\n combineLatest([this._settingsHelper.getStyle(this.selectedDrawItem?.style!, this.profile.styleRepositoryWorkspace!, this.profile.styleRepositoryGeoserver!, geomType),\n this._overlap.splitByFeature(feature)])\n .subscribe({\n next: ([style, features]) => {\n this._undoRedo.enable();\n features.forEach(feature => {\n this._featureHelper.setTypeId(feature, this.selectedDrawItem?.typeId || '');\n this._featureHelper.setId(feature);\n this._drawLayerService.source.addFeature(feature);\n }\n );\n //Clear results and close tool\n this.activeMode = null;\n this.showGeometryTypes = false;\n this._disablePointSearch();\n this.filteredResults = [];\n }\n });\n }\n\n zoomSearchedObject(item: SearchResponseItem, event: MouseEvent): void {\n event.stopPropagation();\n this.highlight(item.wkt, event);\n }\n\n toggleItemInfo(item: SearchResponseItem, event: MouseEvent): void {\n event.stopPropagation();\n item.showMetadata = !item.showMetadata;\n }\n\n cutBySearchedObject(item: SearchResponseItem, event: MouseEvent): void {\n event.stopPropagation();\n if (!item.wkt) { return; }\n if (!this.selectedDrawItem) { return; }\n const wktFormat = new WKT();\n let feature = wktFormat.readFeature(item.wkt, { featureProjection: 'EPSG:25832', dataProjection: 'EPSG:25832' });\n const geomType = feature.getGeometry()?.getType();\n if (!geomType) { return; }\n combineLatest([this._settingsHelper.getStyle(this.selectedDrawItem?.style!, this.profile.styleRepositoryWorkspace!, this.profile.styleRepositoryGeoserver!, geomType),\n this._overlap.splitByFeature(feature, true)])\n .subscribe({\n next: ([style, features]) => {\n this._undoRedo.enable();\n features.forEach(feature => {\n this._featureHelper.setTypeId(feature, this.selectedDrawItem?.typeId || '');\n this._featureHelper.setId(feature);\n this._drawLayerService.source.addFeature(feature);\n }\n );\n //Clear results and close tool\n this.activeMode = null;\n this.showGeometryTypes = false;\n this._disablePointSearch();\n this.filteredResults = [];\n }\n });\n }\n\n private _bufferGeometry(geometry: Geometry,bufferMeters: number): Geometry {\n const format = new GeoJSON();\n const precisionModel = new PrecisionModel(); // floating precision\n const geometryFactory = new GeometryFactory(precisionModel);\n const reader = new GeoJSONReader(geometryFactory);\n const writer = new GeoJSONWriter();\n\n // Convert OL geometry → GeoJSON → JSTS\n const geoJson = format.writeGeometryObject(geometry);\n const jstsGeom = reader.read(geoJson);\n\n // Create buffer\n const bufferedJstsGeom = BufferOp.bufferOp(jstsGeom, bufferMeters);\n\n // Convert back to OL geometry\n const bufferedGeoJson = writer.write(bufferedJstsGeom);\n return format.readGeometry(bufferedGeoJson);\n }\n\n undo(): void {\n this._undoRedo.undo();\n }\n\n redo(): void {\n this._undoRedo.redo();\n }\n\n toggleShowInfo(): void {\n if (this.activeMode != 'show-info') {\n this._clearAllInteractions();\n this.activeMode = 'show-info';\n this._showInfo.startShowInfo();\n } else {\n this.activeMode = null;\n this._showInfo.stopShowInfo();\n }\n }\n\n onSnapChange(event: Event): void {\n this.snap = (event.target as HTMLInputElement).checked;\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 if (!this.selectedDrawItem) { 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 (featureType !== this.selectedDrawItem!.geomType) {\n const message = `WKT´en kan ikke indlæses, da du har valgt typen ${this._translateGeometryType(this.selectedDrawItem!.geomType)}, men prøver at indlæse en ${this._translateGeometryType(featureType)}.`;\n this._confirmService.open({ message , primaryText: 'Ok', title: 'Advarsel'}).subscribe();\n return;\n }\n this._settingsHelper.getStyle(this.selectedDrawItem?.style!, this.profile.styleRepositoryWorkspace!, this.profile.styleRepositoryGeoserver!, featureType!).subscribe({\n next: featureStyle => {\n if (featureType === 'Polygon') {\n this.handleFeatureValidation(feature).subscribe({\n next: (result) => {\n if (result) {\n result.forEach(feature => {\n feature.setStyle(featureStyle);\n this._featureHelper.setTypeId(feature, this.selectedDrawItem?.typeId || '');\n this._featureHelper.setId(feature);\n });\n\n this._overlap.handleOverlaps(result).pipe(filter(f => !!f)).subscribe({\n next: f => {\n if (f) {\n f.forEach(feature => {\n this._drawLayerService.source.addFeature(feature);\n });\n this._zoomService.zoomToFeatures(f);\n if (f.length > 1) {\n this._confirmService.open({ message: `Den indtegnede flade var ikke gyldig, men rettet til ${f.length} nye flader`, primaryText: 'OK', title: 'Advarsel'}).subscribe();\n }\n }\n }\n });\n } else {\n this._confirmService.open({ message: `Validering af de tegnede flader resulterede i ingen flader`, primaryText: 'OK', title: 'Advarsel'}).subscribe();\n }\n }\n });\n } else {\n feature.setStyle(featureStyle);\n this._featureHelper.setTypeId(feature, this.selectedDrawItem?.typeId || '');\n this._featureHelper.setId(feature);\n\n this._zoomService.zoomToFeatures([feature]);\n this._drawLayerService.source.addFeature(feature);\n }\n }\n })\n } catch (ex) {\n this._confirmService.open({ message: `WKT kunne ikke indlæses - den er muligvis ikke formateret korrekt`, primaryText: 'OK', title: 'Advarsel'}).subscribe();\n }\n }\n\n private _translateGeometryType(type: string): string {\n switch (type.toLowerCase()) {\n case \"point\":\n return \"punkt\";\n case \"multipoint\":\n return \"multipunkt\";\n\n case \"linestring\":\n return \"linje\";\n case \"multilinestring\":\n return \"multilinje\";\n\n case \"polygon\":\n return \"polygon\";\n case \"multipolygon\":\n return \"multipolygon\";\n\n case \"geometrycollection\":\n return \"geometrisamling\";\n\n default:\n return type; // fallback: returnér originalen\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 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 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 startDrawPointUrl(url: string, typeId: string): void {\n this._clearAllInteractions();\n const style = new Style({\n image: new Icon({\n src: url,\n scale: 1,\n anchor: [0.5, 1],\n anchorXUnits: 'fraction',\n anchorYUnits: 'fraction'\n })\n })\n const drawInteraction = new Draw({\n type: 'Point',\n source: new VectorSource(),\n style\n });\n this.showGeometryTypes = true;\n drawInteraction.on('drawend', evt => {\n const feature = evt.feature.clone();\n this._featureHelper.setId(feature);\n this._featureHelper.setTypeId(feature, typeId)\n feature.setStyle(style);\n this._drawLayerService.source.addFeature(feature);\n });\n this._interactionHelper.setAsTemp(drawInteraction);\n this.map.addInteraction(drawInteraction);\n\n }\n\n startDraw(): void {\n this.activeMode = 'draw';\n // Set the first item as default\n if (!this.selectedDrawItem && this.drawItems && this.drawItems.length > 0) {\n this.selectedDrawItem = this.drawItems[0];\n }\n // Actually start drawing immediately\n if (this.selectedDrawItem) {\n this._doStartDraw(this.selectedDrawItem!);\n }\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 startDelete(): void {\n this._clearAllInteractions();\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 filter: f => !this._featureHelper.isLocked(f),\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 highlight(wkt: string, event: MouseEvent): void {\n event.stopPropagation();\n this._highlight.highlight(wkt);\n }\n\n addToActiveObjectsList(item: SearchResponseItem, event: MouseEvent, withBuffer: boolean = false): void {\n event.stopPropagation();\n if (!item.wkt) { return; }\n if (!this.selectedDrawItem) { return; }\n const wktFormat = new WKT();\n let feature = wktFormat.readFeature(item.wkt, { featureProjection: 'EPSG:25832', dataProjection: 'EPSG:25832' });\n if (withBuffer) {\n const bufferedGeometry = this._bufferGeometry(\n feature.getGeometry()!,\n this.bufferInMeters\n );\n feature = new Feature({ geometry: bufferedGeometry });\n }\n const geomType = feature.getGeometry()?.getType();\n if (!geomType) { return; }\n combineLatest([this.handleFeatureValidation(feature),this._settingsHelper.getStyle(this.selectedDrawItem.style!, this.profile.styleRepositoryWorkspace!, this.profile.styleRepositoryGeoserver!, geomType)])\n .subscribe({\n next: ([validationResult, featureStyle]) => {\n if (validationResult) {\n validationResult.forEach(feature => {\n feature.setStyle(featureStyle);\n this._featureHelper.setTypeId(feature, this.selectedDrawItem?.typeId! || '');\n this._featureHelper.setId(feature);\n });\n\n this._overlap.handleOverlaps(validationResult).pipe(filter(f => !!f)).subscribe({\n next: f => {\n if (f) {\n f.forEach(feature => {\n this._undoRedo.enable();\n this._drawLayerService.source.addFeature(feature);\n });\n this._zoomService.zoomToFeatures(f);\n if (f.length > 1) {\n this._confirmService.open({ message: `Den indtegnede flade var ikke gyldig, men rettet til ${f.length} nye flader`, primaryText: 'OK', title: 'Advarsel'}).subscribe();\n }\n //Clear results and close tool\n this.activeMode = null;\n this.showGeometryTypes = false;\n this._disablePointSearch();\n this.filteredResults = [];\n }\n }\n });\n } else {\n this._confirmService.open({ message: `Validering af de tegnede flader resulterede i ingen flader`, primaryText: 'OK', title: 'Advarsel'}).subscribe();\n }\n }\n }\n );\n }\n\n startEdit(): void {\n this._clearAllInteractions();\n this.activeMode = 'edit';\n const modify = new Modify({\n source: this._drawLayerService.source, \n filter: (f: Feature) => { \n return !this._featureHelper.isLocked(f); \n },\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) => {\n \n this._undoRedo.enable();\n evt.features.forEach(f => {\n f.set('updated', new Date().toISOString());\n const geom = f.getGeometry();\n if (geom && geom.getType() === 'Polygon') {\n //START VALIDATING\n this.handleFeatureValidation(f).subscribe({\n next: (result) => {\n if (result && result.length > 0) {\n const featureStyle = f.getStyle();\n const featureTypeId = this._featureHelper.typeId(f);\n this._drawLayerService.source.removeFeature(f);\n\n const idsToExcludeFromOverlap: string [] = [];\n result.forEach(feature => {\n feature.setStyle(featureStyle);\n this._featureHelper.setTypeId(feature, featureTypeId || '');\n this._featureHelper.setId(feature);\n idsToExcludeFromOverlap.push(`${feature.getId()}`); // Don't check these for overlap\n this._drawLayerService.source.addFeature(feature);\n });\n\n // Don't check for overlap with the feature being updated.\n this._overlap.handleOverlaps(result, idsToExcludeFromOverlap).pipe(filter(f => !!f)).subscribe({\n next: f => {\n if (f) {\n f.forEach(feature => {\n this._drawLayerService.source.addFeature(feature);\n });\n\n if (f.length > 1) {\n this._confirmService.open({ message: `Den indtegnede flade var ikke gyldig, men rettet til ${f.length} nye flader`, primaryText: 'OK', title: 'Advarsel'}).subscribe();\n }\n }\n }\n });\n } else {\n this._confirmService.open({ message: `Validering af de tegnede flader resulterede i ingen flader`, primaryText: 'OK', title: 'Advarsel'}).subscribe();\n }\n }\n });\n //END VALIDATING\n }\n });\n });\n\n this._interactionHelper.setAsTemp(modify);\n this.map.addInteraction(modify);\n }\n\n private _startDraw(geomType: geometryType, style: string, typeId: string): void {\n this._clearAllInteractions();\n this._settingsHelper.getStyle(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 if (geomType === 'Polygon') {\n // Validate feature\n this.handleFeatureValidation(evt.feature).subscribe({\n next: (result) => {\n if (result) {\n result.forEach(feature => {\n this._featureHelper.setTypeId(feature, typeId);\n this._featureHelper.setId(feature);\n feature.setStyle(style);\n });\n\n this._overlap.handleOverlaps(result).pipe(filter(f => !!f)).subscribe({\n next: f => {\n if (f) {\n f.forEach(feature => {\n this._undoRedo.enable();\n this._drawLayerService.source.addFeature(feature);\n });\n\n if (f.length > 1) {\n this._confirmService.open({ message: `Den indtegnede flade var ikke gyldig, men rettet til ${f.length} nye flader`, primaryText: 'OK', title: 'Advarsel'}).subscribe();\n }\n }\n }\n });\n } else {\n this._confirmService.open({ message: 'Validering af de tegnede flader resulterede i ingen flader', primaryText: 'OK', title: 'Advarsel'}).subscribe();\n }\n }\n });\n } else {\n this._featureHelper.setTypeId(evt.feature, typeId);\n this._featureHelper.setId(evt.feature);\n evt.feature.setStyle(style);\n this._undoRedo.enable();\n this._drawLayerService.source.addFeature(evt.feature);\n }\n });\n this._interactionHelper.setAsTemp(drawInteraction);\n this.map.addInteraction(drawInteraction);\n this._addSnap();\n this.map.getTargetElement().style.cursor = 'crosshair'; // Placeholder for now\n }\n })\n } \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: 'rgba(128, 128, 128, 0.5)' // grey med 50% opacity\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 // 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 positionPoint = coords[0];\n const formattedTotal = `${totalLength.toFixed(2)} m`;\n const totalFeature = new Feature({\n geometry: new Point(positionPoint),\n label: `Total: ${formattedTotal}`\n });\n\n this._distanceLabelSource.addFeature(totalFeature);\n }\n });\n });\n }\n\n private _clearAllInteractions(): void {\n this._interactionHelper.clearTempFromMap(); \n this._highlight.clear();\n this.stopMeasureArea();\n this.stopMeasureLength();\n if (this.pointClickKey) {\n unByKey(this.pointClickKey!);\n }\n this._disablePointSearch()\n this._documentSearch.stop();\n this._showInfo.stopShowInfo();\n }\n\n ngOnInit(): void {\n this._originalMapHeight = this.map.getSize()![1];\n this._originalMapWidth = this.map.getSize()![0];\n this._layoutService.mapResizedSubject.subscribe(async (mapResized) => {\n //Map resized, make sure it stays in viewport\n this.dragPosition = await this._layoutService.keepWidgetInViewPort(this.dragPosition, this._POSITION_STORAGE_KEY,\n WidgetConstants.toolboxHeight, WidgetConstants.toolboxWidth, this.mapHeight, this.mapWidth);\n })\n\n this.drawItems = [];\n (this.settings.geometryTypeSettings ?? []).filter(f => f.availableGeometryTypes).forEach(geomSetting => {\n geomSetting.availableGeometryTypes!.forEach(geomType => {\n if (geomType === 'Point' && geomSetting.icons && geomSetting.icons.length > 0) {\n geomSetting.icons.forEach(i => {\n this.drawItems!.push({ name: geomSetting.typeName, iconUrl: i, style: geomSetting.style, typeId: geomSetting.typeId, geomType });\n })\n } else {\n this.drawItems!.push({\n name: `${geomSetting.typeName}${(geomSetting.availableGeometryTypes!.length > 1 ? `(${geomType})` : '')}` ,\n typeId: geomSetting.typeId,\n style: geomSetting.style,\n geomType })\n }\n });\n });\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 }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['profile'] && this.profile) {\n this.collapsed = this.profile.toolbarCollapsed;\n this._loadPosition(this.collapsed); \n this._loadDefaultToolIfNeeded();\n }\n }\n\n startDownloadCasdatres(): void {\n this._startDownload('cadastre');\n }\n\n startDownloadAddresses(): void {\n this._startDownload('address');\n }\n\n private _loadDefaultToolIfNeeded(): void {\n if (this.profile && this.profile.defaultTool) {\n switch (this.profile.defaultTool) {\n case 'Vælg og vis objektdata i træstruktur': this.toggleShowInfo(); return;\n case 'Download adresser': this.startDownloadAddresses(); return;\n case 'Download matrikler': this.startDownloadCasdatres(); return;\n case 'Vælg Lokaliteter ved udpegning i kortet': this.togglePointPolygonSearch(); return;\n case 'Dokument fra punkt': this.startDocumentPointSearch(); return;\n case 'Dokumenter fra polygon': this.startDocumentPolygonSearch(); return;\n case 'Fremhæv aktivt objekt i listen': this.startSelectFeatureHighlight(); return;\n case 'Indsæt eller flyt punkter i flade/linje': this.startEdit(); return;\n case 'Skift status på element': this.startChangeType(); return;\n case 'Sæt centerpunkt': this.setCenterPoint(); return;\n case 'Vælg og vis emner i listen': this.toggleFeatureSearch(); return;\n case 'Tegn element': this.startDraw(); return;\n case 'Indsæt WKT streng for at importere elementet': this.activateShowInputWKT(); return;\n case 'Mål afstand / areal': this.toggleMeasure(); return;\n default: return; // do nothing\n }\n }\n }\n\n private _startDownload(downloadType: 'address' | 'cadastre'): void {\n this._clearAllInteractions();\n this.activeMode = downloadType === 'address' ? 'download-addresses' : 'download-cadastres';\n\n const drawDownloadArea = new Draw({\n type: 'Polygon',\n stopClick: true\n });\n this._interactionHelper.setAsTemp(drawDownloadArea);\n\n drawDownloadArea.on('drawend', evt => {\n\n const geom = evt.feature.getGeometry() as Polygon;\n if (geom) {\n const coordinates = geom.getCoordinates();\n if (downloadType === 'address') {\n this._addressService.download(JSON.stringify(coordinates));\n } else {\n this._cadastreService.download(JSON.stringify(coordinates));\n }\n }\n this._clearAllInteractions();\n });\n this.map.addInteraction(drawDownloadArea);\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 drawItemChanged(item: MatSelectChange<DrawItem>): void {\n if (this.activeMode === 'merge-features') {\n\n this._mergeService.startMerge(this.selectedDrawItem!.typeId, () => { this.activeMode = null; });\n return;\n }\n if (this.activeMode === 'draw') this._doStartDraw(item.value);\n }\n\n private _doStartDraw(item: DrawItem): void {\n if (item.iconUrl) {\n this.startDrawPointUrl(item.iconUrl, item.typeId);\n } else {\n this._startDraw(item.geomType, item.style!, item.typeId);\n }\n\n }\n\n private async _loadPosition(collapsed: boolean): Promise<void> {\n try {\n // Default height and width when collapsed\n let widgetHeight: number = WidgetConstants.collapsedHeight;\n let widgetWidth: number = WidgetConstants.collapsedWidth;\n if (!collapsed) {\n // Custom height and width when expanded\n widgetHeight = WidgetConstants.toolboxHeight;\n widgetWidth = WidgetConstants.toolboxWidth;\n }\n const container = this.map.getViewport();\n const widgetPositionOptions: WidgetPositionOptions = {\n initialPosition: this.profile.toolboxInitialPosition,\n widgetName: this._POSITION_STORAGE_KEY,\n widgetHeight: widgetHeight,\n widgetWidth: widgetWidth,\n }\n const savedPosition = localStorage.getItem(this._POSITION_STORAGE_KEY);\n if (this._profileService.getProfileVersionChanged() &&\n this.profile?.toolboxInitialPosition) {\n //Profile version changed in backend, use that\n this.dragPosition = await this._layoutService.calculateWidgetPosition(widgetPositionOptions);\n } else if (savedPosition) {\n this.dragPosition = JSON.parse(savedPosition);\n } else if (this.profile?.toolboxInitialPosition) {\n this.dragPosition = await this._layoutService.calculateWidgetPosition(widgetPositionOptions);\n } else {\n // Default position for toolbox\n this.dragPosition = { x: WidgetConstants.toolboxDefaultX, y: WidgetConstants.toolboxDefaultY };\n this._savePosition();\n }\n } catch (error) {\n console.error('Error loading position from localStorage:', error);\n this.dragPosition = { x: 0, y: 0 };\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.error('Error saving position to localStorage:', error);\n }\n }\n\n startMergeFeatures(): void {\n this._clearAllInteractions();\n this.activeMode = 'merge-features'\n this._mergeService.startMerge(this.selectedDrawItem!.typeId, () => { this.activeMode = null });\n }\n\n startChangeType(): void {\n this._clearAllInteractions();\n this.activeMode = 'change-type';\n\n // Make sure the selected draw item is set, if at all possible.\n this.selectedDrawItem = this.selectedDrawItem ?? this.drawItems?.find(d => d.geomType === 'Polygon');\n if (!this.selectedDrawItem) { \n return; \n }\n\n const changeTypeSelect = new Select({ \n layers: [this._drawLayerService.layer],\n filter: f => !this._featureHelper.isLocked(f) && f.getGeometry()?.getType() === this.selectedDrawItem?.geomType && this._featureHelper.typeId(f) !== this.selectedDrawItem?.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.selectedDrawItem?.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.selectedDrawItem?.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 async toggleCollapsed(event?: MouseEvent): Promise<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 if (!this.collapsed) {\n //Expanding, make sure it stays in viewport\n this.dragPosition = await this._layoutService.keepWidgetInViewPort(this.dragPosition, this._POSITION_STORAGE_KEY,\n WidgetConstants.toolboxHeight, WidgetConstants.toolboxWidth);\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 this.showInputWKT = false;\n this.activeMode = null;\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 this._layoutService.map = this.map;\n this._layoutService.mapResizedSubject.next(true);\n }\n\n doPrint(): void {\n let htmlElement = this.map.getViewport();\n this._printHelper.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._printHelper.setVisibiltyOnDOMElements(htmlElement, true);\n });\n }\n\n startSelectFeatureHighlight(): void {\n\n if (this.activeMode === 'select-highlight') { return; }\n this._clearAllInteractions();\n this.activeMode = 'select-highlight';\n const highlightSelect = new Select({\n layers: [this._drawLayerService.layer],\n style: null // Leave this as null. Undefined won't do. If it's anything but null, it will change the style of the selected feature and that will be part of undo/redo.\n });\n this._interactionHelper.setAsTemp(highlightSelect);\n highlightSelect.on('select', evt => {\n this._drawLayerService.setFeaturesSelectedForHighlight(evt.selected);\n });\n this.map.addInteraction(highlightSelect);\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 this._clearAllInteractions();\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 private handleFeatureValidation(feature: Feature<Geometry>): Observable<Feature<Geometry>[] | undefined> {\n const wktFormat = new WKT();\n const wkt = wktFormat.writeFeature(feature);\n return this._geometryService.validate(wkt)\n .pipe(map(result => {\n return result.correctedGeometries?.map(wkt => wktFormat.readFeature(wkt));\n }));\n }\n}","<div class=\"toolbox-wrapper global-wrapper-container\" \n cdkDrag \n cdkDragBoundary=\".map-container\"\n [cdkDragFreeDragPosition]=\"dragPosition\"\n (cdkDragEnded)=\"onDragEnded($event)\"\n [class.collapsed]=\"collapsed\">\n <div class=\"drag-handle-toolbox\" cdkDragHandle>\n <mat-icon \n class=\"icon-left\" \n matTooltip=\"Værktøjskasse\" \n [matTooltipShowDelay]=\"500\"\n [matTooltipHideDelay]=\"100\" \n matTooltipPosition=\"above\">\n handyman\n </mat-icon> \n <div class=\"right-icons\"> \n <mat-icon class=\"toggle-icon\" (click)=\"toggleCollapsed($event)\">\n {{ collapsed ? 'flip_to_front' : 'remove' }}\n </mat-icon>\n </div>\n </div>\n \n <div class=\"toolbox-container\">\n @if(!collapsed) {\n <div class=\"toolbox-content\">\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=\"Gendan\" \n [matTooltipShowDelay]=\"200\"\n [matTooltipHideDelay]=\"300\" \n matTooltipClass=\"custom-tooltip\"\n matTooltipPosition=\"below\"\n alt=\"Redo\">\n }\n @if (settings.externalHelpUrl) {\n <img \n [src]=\"infoBase64\" \n class=\"compact-icon custom-image-icon\"\n (click)=\"openUrl(settings.externalHelpUrl, $event)\"\n matTooltip=\"Vejledning til anvendelse af systemet\" \n [matTooltipShowDelay]=\"200\"\n [matTooltipHideDelay]=\"300\" \n matTooltipClass=\"custom-tooltip\"\n matTooltipPosition=\"below\"\n alt=\"Vejledning til anvendelse af systemet\">\n } \n <img \n [src]=\"showInfoObjBase64\" \n class=\"compact-icon custom-image-icon\"\n (click)=\"toggleShowInfo()\" \n [class.active]=\"activeMode === 'show-info'\"\n matTooltip=\"Vælg og vis objektdata i træstruktur\" \n [matTooltipShowDelay]=\"200\"\n [matTooltipHideDelay]=\"300\" \n matTooltipClass=\"custom-tooltip\"\n matTooltipPosition=\"below\"\n alt=\"Vælg og vis objektdata i træ struktur\">\n <img \n [src]=\"downloadFileBase64\" \n class=\"compact-icon custom-image-icon\"\n (click)=\"startDownloadAddresses()\" \n [class.active]=\"activeMode === 'download-addresses'\"\n matTooltip=\"Download adresser\" \n [matTooltipShowDelay]=\"200\"\n [matTooltipHideDelay]=\"300\" \n matTooltipClass=\"custom-tooltip\"\n matTooltipPosition=\"below\"\n alt=\"Download adresser\">\n <img \n [src]=\"downloadMatriklerBase64\" \n class=\"compact-icon custom-image-icon\"\n (click)=\"startDownloadCasdatres()\" \n [class.active]=\"activeMode === 'download-cadastres'\"\n matTooltip=\"Download matrikler\" \n [matTooltipShowDelay]=\"200\"\n [matTooltipHideDelay]=\"300\" \n matTooltipClass=\"custom-tooltip\"\n matTooltipPosition=\"below\"\n alt=\"Download matrikler\">\n\n <img \n [src]=\"splitIconBase64\" \n class=\"compact-icon custom-image-icon\"\n (click)=\"togglePointPolygonSearch()\"\n [class.active]=\"activeMode === 'search-point' || activeMode === 'search-polygon'\"\n matTooltip=\"Vælg Lokaliteter ved udpegning i kortet\" \n [matTooltipShowDelay]=\"200\"\n [matTooltipHideDelay]=\"300\" \n matTooltipClass=\"custom-tooltip\"\n matTooltipPosition=\"below\"\n alt=\"Vælg Lokaliteter ved udpegning i kortet\">\n @if (showDocumentSearch) {\n\n <img \n [src]=\"documentSearchBase64\" \n class=\"compact-icon custom-image-icon\"\n (click)=\"startDocumentPointSearch()\"\n [class.active]=\"activeMode === 'document-search-by-point'\"\n matTooltip=\"Dokument fra punkt\" \n [matTooltipShowDelay]=\"200\"\n [matTooltipHideDelay]=\"300\" \n matTooltipClass=\"custom-tooltip\"\n matTooltipPosition=\"below\"\n alt=\"Dokument fra punkt\">\n\n <img \n [src]=\"documentSearchBase64\" \n class=\"compact-icon custom-image-icon\"\n (click)=\"startDocumentPolygonSearch()\"\n [class.active]=\"activeMode === 'document-search-by-polygon'\"\n matTooltip=\"Dokumenter fra polygon\" \n [matTooltipShowDelay]=\"200\"\n [matTooltipHideDelay]=\"300\" \n matTooltipClass=\"custom-tooltip\"\n matTooltipPosition=\"below\"\n alt=\"Dokumenter fra polygon\">\n }\n @if (settings.cowiUrlTemplate) {\n <img \n [src]=\"openCowiPageBase64\" \n class=\"compact-icon custom-image-icon\"\n [class.active]=\"activeMode === 'cowi'\"\n (click)=\"toggleCowiPage()\" \n matTooltip=\"COWI´s Gadefoto\" \n [matTooltipShowDelay]=\"200\"\n [matTooltipHideDelay]=\"300\" \n matTooltipClass=\"custom-tooltip\"\n matTooltipPosition=\"below\"\n alt=\"COWI´s Gadefoto\">\n }\n @if (settings.skraaFotoUrlTemplate) {\n <img \n [src]=\"skrafotoBase64\" \n class=\"compact-icon custom-image-icon\"\n [class.active]=\"activeMode === 'skrafoto'\"\n (click)=\"toggleSkraafotoPage()\" \n matTooltip=\"Opslag på Skråfotos\" \n [matTooltipShowDelay]=\"200\"\n [matTooltipHideDelay]=\"300\" \n matTooltipClass=\"custom-tooltip\"\n matTooltipPosition=\"below\"\n alt=\"Skråfoto\">\n }\n <img \n [src]=\"streetViewBase64\" \n class=\"compact-icon custom-image-icon\"\n [class.active]=\"activeMode === 'streetview'\"\n (click)=\"toggleGoogleStreetviewPage()\" \n matTooltip=\"Google Streetview\" \n [matTooltipShowDelay]=\"200\"\n [matTooltipHideDelay]=\"300\" \n matTooltipClass=\"custom-tooltip\"\n matTooltipPosition=\"below\"\n alt=\"Google Streetview\">\n <img \n [src]=\"fremhaevBase64\" \n class=\"compact-icon custom-image-icon\"\n [class.active]=\"activeMode === 'select-highlight'\"\n (click)=\"startSelectFeatureHighlight()\" \n matTooltip=\"Fremhæv aktivt objekt i listen\" \n [matTooltipShowDelay]=\"200\"\n [matTooltipHideDelay]=\"300\" \n matTooltipClass=\"custom-tooltip\"\n matTooltipPosition=\"below\"\n alt=\"Fremhæv\">\n @if (activeMode === 'draw' || activeMode === 'edit' || activeMode === 'edit-remove' || activeMode === 'search-feature' ||\n activeMode === 'clip-hole' || activeMode === 'split' || activeMode === 'merge-features') {\n <label class=\"snap-toggle\">\n <input type=\"checkbox\" [checked]=\"snap\" (change)=\"onSnapChange($event)\">\n Snap\n </label> \n } \n @if(settings.editEnabled) {\n <img \n [src]=\"editBase64\" \n [class.active]=\"activeMode === 'edit'\" \n class=\"compact-icon custom-image-icon\"\n (click)=\"startEdit()\" \n matTooltip=\"Indsæt eller flyt punkter i flade/linje\" \n [matTooltipShowDelay]=\"200\"\n [matTooltipHideDelay]=\"300\" \n matTooltipClass=\"custom-tooltip\"\n matTooltipPosition=\"below\"\n alt=\"Indsæt eller flyt punkter i flade/linje\">\n <img \n [src]=\"deleteIconBase64\" \n [class.active]=\"activeMode === 'edit-remove'\" \n class=\"compact-icon custom-image-icon\"\n (click)=\"startEditRemovePoints()\" \n matTooltip=\"Slet punkter i flade/linje\" \n [matTooltipShowDelay]=\"200\"\n [matTooltipHideDelay]=\"300\" \n matTooltipClass=\"custom-tooltip\"\n matTooltipPosition=\"below\"\n alt=\"Slet punkter i flade/linje\">\n }\n @if(settings.cutHoleEnabled) {\n <img \n [src]=\"clipHoleBase64\" \n class=\"compact-icon custom-image-icon\"\n [class.active]=\"activeMode === 'clip-hole'\" \n (click)=\"clipHole()\" \n matTooltip=\"Klip hul i flade\" \n [matTooltipShowDelay]=\"200\"\n [matTooltipHideDelay]=\"300\" \n matTooltipClass=\"custom-tooltip\"\n matTooltipPosition=\"below\"\n alt=\"Klip hul i flade\">\n }\n @if(settings.splitEnabled) {\n <img \n [src]=\"splitBase64\" \n class=\"compact-icon custom-image-icon\"\n [class.active]=\"activeMode === 'split'\"\n (click)=\"split()\" \n matTooltip=\"Del et element\" \n [matTooltipShowDelay]=\"200\"\n [matTooltipHideDelay]=\"300\" \n matTooltipClass=\"custom-tooltip\"\n matTooltipPosition=\"below\"\n alt=\"Del et element\">\n }\n @if(settings.changeTypeEnabled) {\n <img \n [src]=\"changeTypeBase64\" \n class=\"compact-icon custom-image-icon\" \n [class.active]=\"activeMode === 'change-type'\" \n (click)=\"startChangeType()\"\n [matTooltipShowDelay]=\"200\"\n matTooltipClass=\"custom-tooltip\"\n [matTooltipHideDelay]=\"300\" \n matTooltip=\"Skift status på element\" \n alt=\"Skift status på element\" \n matTooltipPosition=\"below\">\n }\n @if(settings.mergeEnabled) {\n <img \n [src]=\"mergeBase64\"\n class=\"compact-icon custom-image-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 }\n @if(settings.centerPoint) {\n <img \n [src]=\"setCenterBase64\" \n [class.active]=\"activeMode === 'center-point'\" \n class=\"compact-icon custom-image-icon\"\n (click)=\"setCenterPoint()\" \n matTooltip=\"Sæt centerpunkt\" \n [matTooltipShowDelay]=\"200\"\n [matTooltipHideDelay]=\"300\" \n matTooltipClass=\"custom-tooltip\"\n matTooltipPosition=\"below\"\n alt=\"Sæt centerpunkt\">\n }\n </div>\n <div class=\"geometry-tools\">\n <img \n [src]=\"sogPolygonBase64\" \n [class.active]=\"activeMode === 'search-feature'\"\n class=\"compact-icon custom-image-icon\"\n (click)=\"toggleFeatureSearch()\" \n matTooltip=\"Vælg og vis emner i listen\" \n [matTooltipShowDelay]=\"200\"\n [matTooltipHideDelay]=\"300\" \n matTooltipClass=\"custom-tooltip\"\n matTooltipPosition=\"below\"\n alt=\"Vælg og vis emner i listen\">\n\n <img \n [src]=\"drawBase64\" \n [class.active]=\"activeMode === 'draw'\"\n class=\"compact-icon custom-image-icon\"\n (click)=\"startDraw()\"\n matTooltip=\"Tegn element\" \n [matTooltipShowDelay]=\"200\"\n [matTooltipHideDelay]=\"300\" \n matTooltipClass=\"custom-tooltip\"\n matTooltipPosition=\"below\"\n alt=\"Tegn element\">\n @if(settings.WKTInputEnabled) {\n <img \n [src]=\"wktIconBase64\" \n class=\"compact-icon custom-image-icon\"\n [class.active]=\"activeMode === 'wkt-input'\"\n (click)=\"activateShowInputWKT()\" \n matTooltip=\"Indsæt WKT streng for at importere elementet\" \n [matTooltipShowDelay]=\"200\"\n [matTooltipHideDelay]=\"300\" \n matTooltipClass=\"custom-tooltip\"\n matTooltipPosition=\"below\"\n alt=\"Indsæt WKT streng for at importere elementet\">\n }\n </div>\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 element\" \n [matTooltipShowDelay]=\"200\"\n [matTooltipHideDelay]=\"300\" \n matTooltipClass=\"custom-tooltip\"\n matTooltipPosition=\"below\"\n alt=\"Slet element\">\n }\n <img \n [src]=\"measureDistanceIconBase64\" \n class=\"compact-icon custom-image-icon\"\n (click)=\"toggleMeasure()\"\n [class.active]=\"activeMode === 'measure-distance' || activeMode === 'measure-area'\"\n matTooltip=\"Mål afstand / areal\" \n [matTooltipShowDelay]=\"200\"\n [matTooltipHideDelay]=\"300\" \n matTooltipClass=\"custom-tooltip\"\n matTooltipPosition=\"below\"\n alt=\"Mål\">\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=\"Skærmprint af kortet\" \n [matTooltipShowDelay]=\"200\"\n [matTooltipHideDelay]=\"300\" \n matTooltipClass=\"custom-tooltip\"\n matTooltipPosition=\"below\"\n alt=\"Skærmprint af kortet\">\n <img \n [src]=\"drawPrintBase64\" \n class=\"compact-icon custom-image-icon\"\n [class.active]=\"active === 'PrintDraw'\"\n (click)=\"startDrawMode()\" \n matTooltip=\"Tegneværktøj til print\" \n [matTooltipShowDelay]=\"200\"\n [matTooltipHideDelay]=\"300\" \n matTooltipClass=\"custom-tooltip\"\n matTooltipPosition=\"below\"\n alt=\"Tegneværktøj til print\">\n </div>\n }\n </div>\n </div>\n @if (activeMode === 'draw' || activeMode === 'search-feature' || activeMode === 'wkt-input'\n || activeMode === 'change-type' || activeMode === 'merge-features') {\n <mat-select class=\"geometry-selector\" (selectionChange)=\"drawItemChanged($event)\" [(ngModel)]=\"selectedDrawItem\"> \n @for (drawItem of drawItems; track drawItem) {\n @if(activeMode !== 'merge-features' || drawItem.geomType === 'Polygon') {\n <mat-option [value]=\"drawItem\">{{drawItem.name}} <img *ngIf=\"drawItem.iconUrl\" class=\"compact-icon custom-image-icon\" [src]=\"drawItem.iconUrl\"></mat-option>\n }\n }\n </mat-select> \n }\n @if(showInputWKT && activeMode === 'wkt-input') {\n <div class=\"wkt-section\">\n <input matInput class=\"compact-input\" placeholder=\"Indsæt WKT-streng\" [(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 matTooltip=\"Skærmprint af kortet\" \n [matTooltipShowDelay]=\"200\"\n [matTooltipHideDelay]=\"300\" \n [src]=\"printBase64\" \n class=\"compact-icon custom-image-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 @if (activeMode === 'search-point' || activeMode === 'search-polygon') {\n <mat-select \n class=\"search-point-polygon-selector\" \n [(ngModel)]=\"selectedSearchMode\"\n (selectionChange)=\"onSearchModeChanged($event)\">\n <mat-option value=\"search-point\">Søg med punkt</mat-option>\n <mat-option value=\"search-polygon\">Søg med polygon</mat-option>\n </mat-select>\n }\n \n @if (activeMode === 'measure-distance' || activeMode === 'measure-area') {\n <mat-select \n class=\"geometry-selector\"\n [(ngModel)]=\"selectedMeasureMode\"\n (selectionChange)=\"onMeasureModeChanged($event)\">\n <mat-option value=\"measure-distance\">Mål afstand</mat-option>\n <mat-option value=\"measure-area\">Mål areal</mat-option>\n </mat-select>\n }\n }\n </div>\n @if (activeMode === 'search-feature' && filteredResults.length > 0) {\n <div class=\"geometry-search-panel\">\n <div class=\"buffer-item\">\n <mat-label>Buffer</mat-label>\n <input matInput type=\"number\" name=\"buffer\" [(ngModel)]=\"bufferInMeters\">\n <mat-label>m</mat-label>\n </div>\n <mat-option *ngFor=\"let result of filteredResults\" [value]=\"result\" class=\"search-result-option\">\n <span class=\"result-title\">\n {{ result.title }} ({{result.items.length}} af {{ result.total }})\n </span>\n <div (click)=\"highlight(item.wkt, $event)\" *ngFor=\"let item of result.items\" class=\"search-result-item\">\n <div class=\"item-left\">\n <span class=\"item-header\"> {{item.header}} </span> \n </div>\n <div class=\"item-right\">\n <img \n [src]=\"objectSearchCopyIconBase64\" \n class=\"compact-icon custom-image-icon\"\n (click)=\"addToActiveObjectsList(item, $event)\" \n matTooltip=\"Kopier\" \n [matTooltipShowDelay]=\"200\"\n [matTooltipHideDelay]=\"300\" \n matTooltipClass=\"custom-tooltip\"\n matTooltipPosition=\"below\"\n alt=\"Kopier\">\n <img \n [src]=\"objectSearchCutIconBase64\" \n class=\"compact-icon custom-image-icon\"\n (click)=\"cutBySearchedObject(item, $event)\" \n matTooltip=\"Fjern\" \n [matTooltipShowDelay]=\"200\"\n [matTooltipHideDelay]=\"300\" \n matTooltipClass=\"custom-tooltip\"\n matTooltipPosition=\"below\"\n alt=\"Fjern\">\n <img \n [src]=\"objectSearchCutIconBase64\" \n class=\"compact-icon custom-image-icon\"\n (click)=\"splitBySearchedObject(item, $event)\" \n matTooltip=\"Opskær\" \n [matTooltipShowDelay]=\"200\"\n [matTooltipHideDelay]=\"300\" \n matTooltipClass=\"custom-tooltip\"\n matTooltipPosition=\"below\"\n alt=\"Opskær\">\n <img \n [src]=\"objectSearchCopyWithBufferIconBase64\" \n class=\"compact-icon custom-image-icon\"\n (click)=\"addToActiveObjectsList(item, $event, true)\" \n matTooltip=\"Kopier med buffer\" \n [matTooltipShowDelay]=\"200\"\n [matTooltipHideDelay]=\"300\" \n matTooltipClass=\"custom-tooltip\"\n matTooltipPosition=\"below\"\n alt=\"Kopier med buffer\">\n <img \n [src]=\"objectSearchZoomIconBase64\" \n class=\"compact-icon custom-image-icon\"\n (click)=\"zoomSearchedObject(item, $event)\" \n matTooltip=\"Zoom\" \n [matTooltipShowDelay]=\"200\"\n [matTooltipHideDelay]=\"300\" \n matTooltipClass=\"custom-tooltip\"\n matTooltipPosition=\"below\"\n alt=\"Zoom\">\n <img \n [src]=\"infoBase64\" \n class=\"compact-icon custom-image-icon\"\n (click)=\"toggleItemInfo(item, $event)\" \n matTooltip=\"Info\" \n [matTooltipShowDelay]=\"200\"\n [matTooltipHideDelay]=\"300\" \n matTooltipClass=\"custom-tooltip\"\n matTooltipPosition=\"below\"\n alt=\"Info\">\n </div> \n @if (item.showMetadata) {\n <div class=\"metadata-panel\">\n @for(feature of item.metadata; track feature) {\n <div class=\"feature-item\">\n <div *ngFor=\"let kv of (feature | keyvalue)\" class=\"feature-title\">\n {{ kv.value.name }}:\n <ng-container [ngSwitch]=\"kv.value.kind\">\n <img *ngSwitchCase=\"'img'\" [src]=\"kv.value.data\" alt=\"{{ kv.key }}\" style=\"max-width:240px;\" />\n <a *ngSwitchCase=\"'url'\" [href]=\"kv.value.data\" target=\"_blank\" rel=\"noopener noreferrer\">\n {{ kv.key }}\n <mat-icon class=\"link-icon\">open_in_new</mat-icon>\n </a>\n <span *ngSwitchDefault class=\"secondary-item\">{{ kv.value.data }}</span>\n </ng-container>\n </div>\n </div>\n }\n </div>\n }\n </div>\n </mat-option>\n </div>\n }\n @if ((activeMode === \"search-point\" || activeMode === \"search-polygon\") && geometrySearchResult.length > 0) {\n <div class=\"geometry-search-panel\">\n <mat-icon (click)=\"deleteAllGeometrySearchItem()\" class=\"delete-all-icon\" matTooltip=\"Ryd\">delete</mat-icon>\n <mat-option *ngFor=\"let result of geometrySearchResult\" [value]=\"result\" class=\"search-result-option\">\n <span class=\"result-title\">\n {{ result.title }} ({{result.items.length}} af {{ result.total }})\n </span>\n <div (click)=\"highlight(item.wkt, $event)\" *ngFor=\"let item of result.items\" class=\"geometry-search-result-item\">\n <div class=\"item-left\">\n <span class=\"item-header\"> {{item.header}} </span> \n </div>\n <div class=\"item-right\">\n @if (item.url) {\n <mat-icon \n class=\"search-item-external\"\n matTooltip=\"Åbn i ny tab\"\n [matTooltipShowDelay]=\"200\"\n [matTooltipHideDelay]=\"300\" \n (click)=\"openUrl(item.url, $event)\"\n matTooltipPosition=\"above\"\n >info</mat-icon>\n }\n <mat-icon (click)=\"deleteGeometrySearchItem(result, item.id, $event)\" >delete</mat-icon>\n </div>\n </div>\n </mat-option>\n </div>\n }\n</div>\n","import { Geometry } from 'ol/geom';\nimport { SearchProviderBase } from './infoSearch.service';\nimport { FeatureCollection } from 'geojson';\nimport Filter from 'ol/format/filter/Filter';\nimport { ILayer } from '../models/ILayer';\nimport { inject, Injectable } from '@angular/core';\nimport { CurrentItemsService } from './currentItems.service';\nimport { contains } from 'ol/format/filter';\n\ninterface IConflictAnalysisResult {\n layerName: string,\n conflict: boolean\n}\n\n@Injectable()\nexport class ConflictAnalysisSearchProvider extends SearchProviderBase<IConflictAnalysisResult, Geometry> {\n\n private _current = inject(CurrentItemsService);\n override getSearchableLayers(): ILayer[] {\n return this._current.profile ? this._current.profile.layerGroups.flatMap(lg => lg.layers).filter(l => l.useInConflictAnalysis) : [];\n \n }\n override getFilter(searchValue: Geometry, layer: ILayer): Filter {\n return contains(layer.geometryField, searchValue); \n }\n override map(l: ILayer, f: FeatureCollection): IConflictAnalysisResult {\n return {\n conflict: f.features.length > 0,\n layerName: l.name\n }\n }\n\n}","import { Component, EventEmitter, inject, Input, OnInit, Output, OnChanges, SimpleChanges } 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';\nimport { CurrentItemsService } from '../../services/currentItems.service';\nimport { ConflictAnalysisSearchProvider } from '../../services/conflictAnalysisSearch.service';\nimport { combineLatest } from 'rxjs';\nimport { LayoutService, WidgetPositionOptions } from '../../services/layoutService';\nimport { IProfileDetailed } from '../../models/IProfile';\nimport { ProfileService } from '../../services/profile.service';\nimport { WidgetConstants } from '../../models/widget.constants';\nimport WKT from 'ol/format/WKT';\nimport { ConfirmDialogService } from '../../services/confirm-dialog.service';\nimport { IconsConstants } from '../../models/icons.constants';\n\ninterface IFeature { \n locked: boolean;\n area: string;\n id: string | number;\n display: string;\n feature: Feature;\n containedOk: 'unknown' | 'yes' | 'no',\n containedMissingIn?: string[]\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, OnChanges {\n\n private _drawLayerService = inject(DrawLayerSourceService);\n private _centerPointService = inject(CenterPointService);\n private _conflictService = inject(ConflictAnalysisSearchProvider);\n private _undoRedo = inject(UndoRedoService);\n private _dialogService = inject(ConfirmDialogService);\n isZoomedToAll: boolean = false;\n features$ = this._drawLayerService.features$;\n collapsed = true;\n\n wktIconBase64 = IconsConstants.wktIconBase64;\n @Input({ required: true}) settings!: GisKomponentSettings;\n @Output() sessionDone = new EventEmitter();\n @Input({ required: true }) profile!: IProfileDetailed;\n\n activeFeatures: IFeature[] = [];\n private _featureHelper = inject(FeatureHelperService);\n private _highlight = inject(HighlightService);\n private _zoomService = inject(ZoomService);\n private _current = inject(CurrentItemsService);\n private _layoutService: LayoutService = inject(LayoutService);\n private _profileService: ProfileService = inject(ProfileService);\n\n opacity: number = 1;\n endSessionButtonLabel = this._current.gisKomponentSettings.endSessionButtonLabel ?? '';\n dragPosition : { x: number; y: number} = { x: 0, y: 0 };\n highlightedId: string | number | null = null;\n listHighlightedIds: Set<string | number | null> = new Set<string | number | null>();\n private _highlightTimeouts = new Map<string | number, any>();\n private readonly POSITION_STORAGE_KEY = 'activeObjects';\n private _hasCenterpoint = false;\n\n private _featuresForHighlight$ = this._drawLayerService.selectedForHighlight$;\n\n get centerPointOk(): boolean {\n return this._hasCenterpoint || !this._current.gisKomponentSettings.centerPoint || !this._current.gisKomponentSettings.centerPoint.required;\n }\n\n conflictAnalysisAvailable: boolean = false;\n get allFeaturesOk(): boolean {\n return !this._current.gisKomponentSettings.containsCheck || \n !this._current.gisKomponentSettings.containsCheck.requiredForEndSession || \n // this.activeFeatures.flatMap(af => af.features).every(f => f.containedOk === 'yes');\n this.activeFeatures.every(f => f.containedOk === 'yes');\n } \n\n get endSessionEnabled(): boolean {\n return !this._current.gisKomponentSettings.endSessionDisabled && this.allFeaturesOk;\n }\n\n constructor() {\n this.features$.subscribe({ \n next: features => {\n this._hasCenterpoint = features.some(f => this._centerPointService.isCenterpoint(f));\n this.activeFeatures = features.filter(f => !this._centerPointService.isCenterpoint(f))\n .map(f => ({\n locked: this._featureHelper.isLocked(f),\n area: this._getAreaString(f),\n containedOk: this.conflictAnalysisAvailable ? 'unknown' : 'yes',\n display: this.settings.geometryTypeSettings.find(gts => gts.typeId === this._featureHelper.typeId(f))!.typeName,\n feature: f,\n id: f.getId()!\n }))\n this.runConflictAnalysis();\n }});\n this._featuresForHighlight$.subscribe({\n next: features => {\n this._highlightFromMap(features.map(feature => feature.getId()));\n }\n })\n }\n\n private _highlightFromMap(ids: (string | number | undefined)[]) {\n for (const id of ids) {\n this._highlightSingle(id);\n }\n }\n\n private _highlightSingle(id: string | number | undefined) {\n if (!id) return;\n this.listHighlightedIds.add(id);\n\n const element = document.querySelector(\n `[data-id=\"${id}\"]`\n ) as HTMLElement | null;\n\n element?.scrollIntoView({\n behavior: 'smooth',\n block: 'center'\n });\n\n if (this._highlightTimeouts.has(id)) {\n clearTimeout(this._highlightTimeouts.get(id));\n }\n\n const timeout = setTimeout(() => {\n this.listHighlightedIds.delete(id);\n this._highlightTimeouts.delete(id);\n }, this.settings.highlightFadeTimerMs || 2000);\n\n this._highlightTimeouts.set(id, timeout);\n }\n\n\n ngOnInit(): void {\n this.conflictAnalysisAvailable = !!this._current.gisKomponentSettings.containsCheck && this._current.gisKomponentSettings.containsCheck.enabled && \n this._current.profile!.layerGroups.flatMap(lg => lg.layers).some(l => l.useInConflictAnalysis);\n }\n\n endSession(): void {\n this.sessionDone.emit();\n }\n\n runConflictAnalysis(): void {\n const unlockedFeatures = this.activeFeatures.filter(f => !f.locked);\n const conflictSearches$ = unlockedFeatures.map(f => this._conflictService.search(f.feature.getGeometry()!, 1));\n combineLatest(conflictSearches$).subscribe({\n next: result => {\n result.forEach((f,i) => {\n unlockedFeatures[i].containedOk = f.some(fx => fx.conflict) ? 'yes' : 'no';\n unlockedFeatures[i].containedMissingIn = f.filter(fx => !fx.conflict).map(fx => fx.layerName)\n });\n }\n })\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['profile'] && this.profile) {\n this.collapsed = this.profile.activeObjectsFolded;\n this._loadPosition(this.collapsed);\n }\n }\n\n private _getAreaString(feature: Feature): string {\n if (feature.getGeometry()?.getType() !== 'Polygon' && feature.getGeometry()?.getType() !== 'MultiPolygon') { // We only have polygon, linestring and points and only multi/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 this.isZoomedToAll = true;\n }\n onMapInteraction(): void {\n this.isZoomedToAll = false;\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 async togglePanel(): Promise<void> {\n this.collapsed = !this.collapsed;\n if (!this.collapsed) {\n //Expanding, make sure it stays in viewport\n this.dragPosition = await this._layoutService.keepWidgetInViewPort(this.dragPosition, this.POSITION_STORAGE_KEY,\n WidgetConstants.activeObjectsHeight, WidgetConstants.activeObjectsWidth);\n }\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\n showItemWKT(feature: Feature): void {\n const wktFormatter = new WKT();\n const wktString = wktFormatter.writeGeometry(feature.getGeometry()!);\n this._dialogService.open({ primaryText: 'OK', message: wktString, title: 'WKT for objekt' }).subscribe();\n }\n\n private async _loadPosition(collapsed: boolean): Promise<void> {\n try {\n // Default height and width when collapsed\n let widgetHeight: number = WidgetConstants.collapsedHeight;\n let widgetWidth: number = WidgetConstants.collapsedWidth;\n if (!collapsed) {\n // Custom height and width when expanded\n widgetHeight = WidgetConstants.activeObjectsHeight;\n widgetWidth = WidgetConstants.activeObjectsWidth;\n }\n const widgetPositionOptions: WidgetPositionOptions = {\n initialPosition: this.profile.activeObjectsInitialPosition,\n widgetName: this.POSITION_STORAGE_KEY,\n widgetHeight: widgetHeight,\n widgetWidth: widgetWidth\n }\n const savedPosition = localStorage.getItem(this.POSITION_STORAGE_KEY);\n if (this._profileService.getProfileVersionChanged() &&\n this.profile?.activeObjectsInitialPosition) {\n //Profile version changed in backend, use that\n this.dragPosition = await this._layoutService.calculateWidgetPosition(widgetPositionOptions);\n } else if (savedPosition) {\n this.dragPosition = JSON.parse(savedPosition);\n } else if (this.profile?.activeObjectsInitialPosition) {\n this.dragPosition = await this._layoutService.calculateWidgetPosition(widgetPositionOptions);\n } else {\n // Default position for active objects\n this.dragPosition = { x: WidgetConstants.activeObjectsDefaultX, y: WidgetConstants.activeObjectsDefaultY };\n this._savePosition(this.dragPosition);\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 global-wrapper-container\" cdkDrag cdkDragBoundary=\".map-container\"\n [cdkDragFreeDragPosition]=\"dragPosition\" (cdkDragEnded)=\"onDragEnded($event)\" [class.collapsed]=\"collapsed\">\n <div class=\"drag-handle-active-objects\" cdkDragHandle>\n <mat-icon class=\"active-object-icon\" (click)=\"zoomToAll()\" matTooltip=\"Aktive objekter\"\n [matTooltipShowDelay]=\"500\" [matTooltipHideDelay]=\"100\" matTooltipPosition=\"above\">\n format_list_bulleted_add\n </mat-icon>\n\n <div class=\"right-icons\">\n <mat-icon class=\"toggle-icon\" (click)=\"togglePanel()\">\n {{ collapsed ? 'flip_to_front' : 'remove' }}\n </mat-icon>\n </div>\n </div>\n\n <div class=\"active-objects-container\">\n @if(!collapsed) {\n <input type=\"range\" min=\"0\" max=\"1\" step=\"0.05\" [(ngModel)]=\"opacity\" (input)=\"updateOpacity()\"\n (mousedown)=\"stopDrag($event)\" (touchstart)=\"stopDrag($event)\" (pointerdown)=\"stopDrag($event)\">\n <div class=\"header-icons\">\n <div class=\"header-left-controls\">\n <mat-icon class=\"zoom-icon\" [class.zoom-active]=\"isZoomedToAll\" (click)=\"zoomToAll()\"\n matTooltip=\"Zoom til alle\" matTooltipPosition=\"above\">\n fit_screen\n </mat-icon>\n <mat-icon class=\"reset-icon\" (click)=\"reset()\" matTooltip=\"Nulstil\" matTooltipPosition=\"above\">\n replay\n </mat-icon>\n </div>\n\n <div class=\"header-right-controls\">\n @if(!centerPointOk) {\n <mat-icon class=\"warning-icon\" matTooltip=\"Der er ikke noget centerpunkt og det skal der være\"\n [matTooltipShowDelay]=\"500\" [matTooltipHideDelay]=\"100\" matTooltipPosition=\"above\">\n warning\n </mat-icon>\n } @else if (allFeaturesOk) { \n @if (endSessionButtonLabel) {\n <button (click)=\"endSession()\" matTooltip=\"Afslut\" [matTooltipShowDelay]=\"500\" [matTooltipHideDelay]=\"100\" matTooltipPosition=\"above\">\n {{endSessionButtonLabel}}\n </button>\n } @else {\n <mat-icon class=\"end-session-icon\" (click)=\"endSession()\" matTooltip=\"Afslut\"\n [matTooltipShowDelay]=\"500\" [matTooltipHideDelay]=\"100\" matTooltipPosition=\"above\">\n done_all\n </mat-icon>\n }\n }\n </div>\n </div>\n }\n\n @if(!collapsed) {\n <div class=\"active-objects-content\">\n <div class=\"item-list\">\n @for(item of activeFeatures; track item.id) {\n <div class=\"item\" [class.listhighlight]=\"listHighlightedIds.has(item.id)\" [attr.data-id]=\"item.id\">\n <div class=\"item-text\">\n <span (click)=\"highlight(item.id)\" class=\"item-id\">{{item.display}} {{item.area}}</span>\n @if(item.containedMissingIn && item.containedMissingIn.length > 0) {\n <div class=\"item-warning\">\n <mat-icon>error</mat-icon>\n <span>Udenfor {{item.containedMissingIn.join(', ')}}</span>\n </div>\n }\n </div>\n <img \n [src]=\"wktIconBase64\" \n class=\"compact-icon custom-image-icon\"\n (click)=\"showItemWKT(item.feature)\" \n matTooltip=\"Vis WKT\" \n [matTooltipShowDelay]=\"200\"\n [matTooltipHideDelay]=\"300\" \n matTooltipClass=\"custom-tooltip\"\n matTooltipPosition=\"below\"\n alt=\"Vis WKT\">\n \n\n @if(!item.locked) {\n <mat-icon (click)=\"delete(item.id)\" matTooltip=\"Slet\" [matTooltipShowDelay]=\"500\"\n [matTooltipHideDelay]=\"100\" matTooltipPosition=\"above\">\n delete\n </mat-icon>\n }\n </div>\n }\n </div>\n\n </div>\n }\n </div>\n</div>","\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, intersects } from 'ol/format/filter';\nimport { map } from 'rxjs/operators';\nimport { Feature as FeatureGeoJSON, FeatureCollection, GeoJsonProperties } from 'geojson';\n\nimport { combineLatest, Observable, of } from 'rxjs';\nimport { SearchProvider, SearchResponse } from './searchProvider.service';\nimport { inject, Injectable } from '@angular/core';\nimport { Feature } from 'ol';\nimport { Geometry } from 'ol/geom';\nimport { IValue, ValueKind } from './infoSearch.service';\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 geometryField: string;\n name: string;\n fieldsToExcludeFromInfoFromInfo: 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, geometry?: Geometry, maxCount: number = 5): Observable<SearchResponse>[] {\n const wftSearches: Observable<SearchResponse>[] = [];\n this._searcheableLayers.flatMap(layer => {\n const filter = searchValue ? like(layer.searchField, `*${searchValue}*`, '*', '?', '/', false) :\n geometry ? intersects(layer.geometryField, geometry,'EPSG:25832') : undefined;\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 const fieldsToExclude = new Set(layer.fieldsToExcludeFromInfoFromInfo.split(',').map(f => f.toLowerCase().trim()));\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), metadata: this._mapFeatureMetadata(f, fieldsToExclude), showMetadata: false }))\n };\n return result;\n })));\n });\n // Force an empty response if no searchable layers\n return wftSearches.length > 0 ? wftSearches : [of({ title: '', total:0, items: [] })];\n }\n\n \n setSearcheableLayers(layers: SearchableLayer[]) {\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 private _mapFeatureMetadata(f: FeatureGeoJSON, excludeSet: Set<string>): Record<string, IValue>[] {\n\n const result: Record<string, IValue> = {};\n \n const props: GeoJsonProperties = f.properties || { };\n for(const [key, value] of Object.entries(props)) {\n if (excludeSet.has(key.toLowerCase())) continue;\n const kind = this._getValueKind(value);\n result[key] = { kind, data: value, name: key }\n }\n return [result];\n }\n\n private _getValueKind(value: any): ValueKind {\n const imgTypes = ['.png', '.jpg', '.gif', '.jpeg']\n if (typeof value === 'string') {\n if (value.startsWith('http://') || value.startsWith('https://')) {\n if (imgTypes.some(ext => value.endsWith(ext))) {\n return 'img';\n }\n return 'url';\n }\n }\n return 'data';\n }\n\n}","import { Component, inject, Input, OnChanges, OnInit, SimpleChanges } 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, SearchResponseItem } from '../../services/searchProvider.service';\nimport { SearchableLayer, WFSSearchService } from '../../services/wfsSearch.service';\nimport { LayerHelperService } from '../../services/layerHelper.service';\nimport { CachedProfileInfo } from '../layer-selector/layer-selector.component';\nimport { IProfileDetailed } from '../../models/IProfile';\nimport { LayoutService, WidgetPositionOptions } from '../../services/layoutService';\nimport { AddressSearchService } from '../../services/addressSearch.service';\nimport { CadastreSearchService } from '../../services/cadastreSearch.service';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport WKT from 'ol/format/WKT';\nimport { ZoomService } from '../../services/zoom.service';\nimport { ProfileService } from '../../services/profile.service';\nimport { WidgetConstants } from '../../models/widget.constants';\n\nexport type SearchMode = 'none' | 'point' | 'polygon';\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 MatTooltipModule\n ]\n})\nexport class MapSearchComponent implements OnInit, OnChanges {\n searchAddress: string = '';\n @Input() profile!: IProfileDetailed;\n filteredResults: SearchResponse[] = [];\n collapsed = true;\n dragPosition : { x: number; y: number} = { x: 0, y: 0 };\n activeHighlightWkt: string | null = null;\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 _wfsSearch = inject(WFSSearchService);\n private _addressSearch = inject(AddressSearchService);\n private _cadastreSearch = inject(CadastreSearchService);\n private _layerHelperService: LayerHelperService = inject(LayerHelperService);\n private _layoutService: LayoutService = inject(LayoutService);\n private _profileService: ProfileService = inject(ProfileService);\n private _zoomService = inject(ZoomService);\n\n ngOnInit(): void {\n this._layerHelperService.activeLayersChanged\n .subscribe(() => this._addWFSSearchLayers());\n this.filterResults();\n this._addWFSSearch();\n this._searchSubject.pipe(\n debounceTime(200),\n distinctUntilChanged(),\n switchMap(value => this._searchService.search(value, undefined))\n ).subscribe({\n next: result => {\n this.filteredResults = result.filter(result => result.items.length > 0);\n }\n });\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['profile'] && this.profile) { \n this.collapsed = this.profile.searchFolded;\n this._loadPosition(this.collapsed);\n this._addWFSSearchLayers();\n }\n }\n\n\n displaySearchFn = (item?: SearchResponseItem | string): string => {\n\n if (!item) { return ''; }\n if (typeof item === 'string') { return item; }\n return item!.header;\n }\n\n private _addWFSSearch(): void{\n this._searchService.searchProviders = [];\n this._searchService.searchProviders.push(this._addressSearch);\n this._searchService.searchProviders.push(this._cadastreSearch);\n this._searchService.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!, geometryField: layer.geometryField,\n fieldsToExcludeFromInfoFromInfo: layer.fieldsToExcludeFromInfoFromInfo\n }));\n this._wfsSearch.setSearcheableLayers(searcheableLayers);\n }\n }\n }\n\n\n filterResults(): void {\n if (!this.searchAddress) {\n this.filteredResults = [];\n return;\n }\n this._searchSubject.next(this.searchAddress);\n }\n\n async toggleSearch(): Promise<void> {\n this.collapsed = !this.collapsed;\n if (this.collapsed) {\n this.searchAddress = '';\n this.filterResults();\n }\n if (!this.collapsed) {\n //Expanding, make sure it stays in viewport\n this.dragPosition = await this._layoutService.keepWidgetInViewPort(this.dragPosition, this.POSITION_STORAGE_KEY,\n WidgetConstants.searchHeight, WidgetConstants.searchWidth);\n }\n }\n\n highlight(wkt: string, event: MouseEvent): void {\n event.stopPropagation();\n const wktFormatter = new WKT();\n const geom = wktFormatter.readGeometry(wkt);\n if (this.activeHighlightWkt === wkt) {\n this.activeHighlightWkt = null;\n } else {\n this.activeHighlightWkt = wkt;\n if (geom.getType() === 'Point') { \n this._zoomService.zoomToFeatures(wkt);\n } else {\n this._highlight.highlight(wkt);\n }\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 async _loadPosition(collapsed: boolean): Promise<void> {\n try {\n // Default height and width when collapsed\n let widgetHeight: number = WidgetConstants.collapsedHeight;\n let widgetWidth: number = WidgetConstants.collapsedWidth;\n if (!collapsed) {\n // Custom height and width when expanded\n widgetHeight = WidgetConstants.searchHeight;\n widgetWidth = WidgetConstants.searchWidth;\n }\n const widgetPositionOptions: WidgetPositionOptions = {\n initialPosition: this.profile.searchInitialPosition,\n widgetName: this.POSITION_STORAGE_KEY,\n widgetHeight: widgetHeight,\n widgetWidth: widgetWidth\n }\n const savedPosition = localStorage.getItem(this.POSITION_STORAGE_KEY);\n if (this._profileService.getProfileVersionChanged() &&\n this.profile?.searchInitialPosition) {\n //Profile version changed in backend, use that\n this.dragPosition = await this._layoutService.calculateWidgetPosition(widgetPositionOptions);\n } else if (savedPosition) {\n this.dragPosition = JSON.parse(savedPosition);\n } else if (this.profile && this.profile.searchInitialPosition) {\n this.dragPosition = await this._layoutService.calculateWidgetPosition(widgetPositionOptions);\n } else {\n // Default position for search\n this.dragPosition = { x: WidgetConstants.searchDefaultX, y: WidgetConstants.searchDefaultY };\n this._savePosition(this.dragPosition);\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 global-wrapper-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 \n class=\"icon-left\" \n matTooltip=\"Søg\" \n [matTooltipShowDelay]=\"500\"\n [matTooltipHideDelay]=\"100\" \n matTooltipPosition=\"above\">\n manage_search\n </mat-icon>\n <div class=\"right-icons\"> \n <mat-icon class=\"toggle-icon\" (click)=\"toggleSearch()\">\n {{ collapsed ? 'flip_to_front' : 'remove' }}\n </mat-icon>\n </div>\n </div>\n\n <div class=\"search-content\" *ngIf=\"!collapsed\">\n <label class=\"search-label\">Søg</label>\n <mat-form-field appearance=\"outline\" class=\"search-field\">\n <mat-icon matPrefix class=\"search-icon\">search</mat-icon>\n <input\n type=\"text\"\n matInput\n [(ngModel)]=\"searchAddress\"\n [matAutocomplete]=\"auto\"\n (input)=\"filterResults()\"\n />\n <mat-autocomplete #auto=\"matAutocomplete\" [displayWith]=\"displaySearchFn\">\n <ng-container *ngFor=\"let result of filteredResults\" >\n <mat-option disabled class=\"result-title\">\n {{ result.title }} ({{result.items.length}}\n <span *ngIf=\"result.total\"> af {{result.total }}</span>)\n </mat-option>\n <mat-option *ngFor=\"let item of result.items\" [value]=\"item\" class=\"custom-option\"\n (mouseenter)=\"highlight(item.wkt, $event)\">\n <div class=\"item-container\">\n <span class=\"item-header\">{{item.header}}</span>\n </div>\n </mat-option>\n </ng-container>\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, inject, Input, OnChanges, OnInit, OnDestroy, SimpleChanges, ViewChild } from '@angular/core';\nimport { CdkDragEnd, 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 } from '../../models/profile';\nimport { ILayer, ILayerDetailed } from '../../models/ILayer';\nimport { LayerHelperService } from '../../services/layerHelper.service';\nimport { LayoutService, WidgetPositionOptions } from '../../services/layoutService';\nimport { HttpClient } from '@angular/common/http';\nimport { catchError, forkJoin, map, Observable, of, switchMap } from 'rxjs';\nimport { IProfileDetailed } from '../../models/IProfile';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { ProfileService } from '../../services/profile.service';\nimport { WidgetConstants } from '../../models/widget.constants';\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, MatTooltipModule ]\n})\nexport class LegendsListComponent implements OnInit, OnChanges, OnDestroy {\n private readonly _http = inject(HttpClient);\n private readonly _layerService: LayerService = inject(LayerService);\n private readonly _layerHelperService: LayerHelperService = inject(LayerHelperService);\n private readonly _layoutService: LayoutService = inject(LayoutService);\n private readonly _profileService: ProfileService = inject(ProfileService);\n private config = inject(GISKOMPONENT_CONFIG);\n \n @Input() map!: Map;\n @Input() profile!: IProfileDetailed;\n \n filteredLayersDetailed: ILayerDetailedWithUrl[] = [];\n collapsed: boolean = true;\n dragPosition: { x: number; y: number } = { x: 0, y: 0 };\n \n private _baseUrl = this.config.apiBaseUrl;\n private _legendsListBodyControl!: ol_control_Control;\n private readonly _mapFilteredLayerGroupsKeyName: string = 'mapFilteredLayerGroups';\n private readonly POSITION_STORAGE_KEY = 'legendsListPosition';\n\n ngOnInit(): void {\n this._layerHelperService.activeLayersChanged.subscribe(() => this._setFilteredLegends().subscribe(result => this.filteredLayersDetailed = result));\n }\n \n ngOnChanges(changes: SimpleChanges): void {\n this._layoutService.mapResizedSubject.subscribe(async () => {\n this.dragPosition = await this._layoutService.keepWidgetInViewPort(\n this.dragPosition,\n this.POSITION_STORAGE_KEY,\n this.collapsed ? WidgetConstants.collapsedHeight : WidgetConstants.legendsHeight,\n this.collapsed ? WidgetConstants.collapsedWidth : WidgetConstants.legendsWidth\n );\n });\n if (changes['profile'] && this.profile) {\n this.collapsed = this.profile.legendsListFolded;\n this._loadPosition(this.collapsed);\n this._setFilteredLegends().subscribe(result => this.filteredLayersDetailed = result);\n }\n }\n\n ngOnDestroy(): void {\n if (this._legendsListBodyControl) {\n this.map.removeControl(this._legendsListBodyControl);\n }\n }\n\n async toggleLegendsList(): Promise<void> {\n this.collapsed = !this.collapsed;\n if (!this.collapsed) {\n //Expanding, make sure it stays in viewport\n this.dragPosition = await this._layoutService.keepWidgetInViewPort(this.dragPosition, this.POSITION_STORAGE_KEY,\n WidgetConstants.legendsHeight, WidgetConstants.legendsWidth);\n }\n }\n\n onDragEnded(event: CdkDragEnd): void {\n const position = event.source.getFreeDragPosition();\n this.dragPosition = position;\n this._savePosition(position);\n }\n private _getImageUrl(fileName: string): string {\n return `${this._baseUrl}/api/image/${fileName}`;\n }\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 legends list position to localStorage:', error);\n }\n }\n\n private async _loadPosition(collapsed: boolean): Promise<void> {\n try {\n // Default height and width when collapsed\n let widgetHeight: number = WidgetConstants.collapsedHeight;\n let widgetWidth: number = WidgetConstants.collapsedWidth;\n if (!collapsed) {\n // Custom height and width when expanded\n widgetHeight = WidgetConstants.legendsHeight;\n widgetWidth = WidgetConstants.legendsWidth;\n }\n const widgetPositionOptions: WidgetPositionOptions = {\n initialPosition: this.profile.legendsListInitialPosition,\n widgetName: this.POSITION_STORAGE_KEY,\n widgetHeight: widgetHeight,\n widgetWidth: widgetWidth\n }\n const savedPosition = localStorage.getItem(this.POSITION_STORAGE_KEY);\n if (this._profileService.getProfileVersionChanged() &&\n this.profile?.legendsListInitialPosition) {\n //Profile version changed in backend, use that\n this.dragPosition = await this._layoutService.calculateWidgetPosition(widgetPositionOptions);\n } else if (savedPosition) {\n this.dragPosition = JSON.parse(savedPosition);\n } else if (this.profile?.legendsListInitialPosition) {\n this.dragPosition = await this._layoutService.calculateWidgetPosition(widgetPositionOptions);\n } else {\n // Default position for legends list\n this.dragPosition = { x: WidgetConstants.legendsDefaultX, y: WidgetConstants.legendsDefaultY };\n this._savePosition(this.dragPosition);\n }\n } catch (error) {\n console.error('Error loading legends list position from localStorage:', error);\n this.dragPosition = { x: 0, y: 0 };\n }\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 || layerIdsCachedToDisplay.length === 0) {\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}","<div class=\"legends-list-body-wrapper global-wrapper-container\" \n cdkDrag \n cdkDragBoundary=\".map-container\" \n [cdkDragFreeDragPosition]=\"dragPosition\"\n (cdkDragEnded)=\"onDragEnded($event)\"\n [class.collapsed]=\"collapsed\">\n\n <div class=\"drag-handle-legends\" cdkDragHandle>\n <mat-icon \n class=\"legend-icon\" \n matTooltip=\"Signaturforklaring\" \n (click)=\"toggleLegendsList()\"\n [matTooltipShowDelay]=\"500\"\n [matTooltipHideDelay]=\"100\" \n matTooltipPosition=\"above\">\n area_chart\n </mat-icon>\n <div class=\"right-icons\">\n <mat-icon class=\"toggle-icon\" (click)=\"toggleLegendsList()\">\n {{ collapsed ? 'flip_to_front' : 'remove' }}\n </mat-icon>\n </div>\n</div>\n\n<div class=\"legends-list-container\">\n @if(!collapsed) {\n <div class=\"ol-unselectable ol-control legends-list-body\">\n <div class=\"item-list\">\n @for (layer of filteredLayersDetailed; track layer.id; let i = $index) {\n @if (layer.imageUrl) {\n <mat-expansion-panel [expanded]=\"i === 0\"> \n <mat-expansion-panel-header>\n <span class=\"panel-title\">\n {{ layer.name }}\n </span>\n </mat-expansion-panel-header>\n <div class=\"legend\">\n <img [src]=\"layer.imageUrl\" class=\"legend-thumbnail\"/>\n </div>\n </mat-expansion-panel>\n }\n }\n </div>\n </div>\n}\n</div>\n</div>","import { inject, Injectable } from '@angular/core';\nimport { KomponentSettingsHelperService } from './komponentSettingsHelper.service';\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()\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 if (getAllStyles$.length === 0) {\n this._undoRedo.init();\n return;\n }\n combineLatest(getAllStyles$).subscribe({\n next: styles => {\n styles.forEach((s, i) => { \n const feature = allTheFeatures[i];\n if (feature.get('showlabelfrom') && s as Style) {\n const styles: Style[] = [s as Style];\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 { Component, inject, OnInit } from '@angular/core';\nimport { IInfoSearchResult } from '../../services/infoSearch.service';\nimport { ShowInfoService } from '../../services/showInfo.service';\nimport { AsyncPipe, CommonModule, JsonPipe } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatButtonModule } from '@angular/material/button';\n\n@Component({\n selector: 'selected-feature-info',\n styleUrl: './selected-feature-info.component.scss',\n templateUrl: './selected-feature-info.component.html',\n imports: [CommonModule, FormsModule, AsyncPipe, JsonPipe, MatButtonModule, MatIconModule]\n})\nexport class SelectedFeatureInfoComponent implements OnInit {\n\n private _infoService = inject(ShowInfoService);\n features: IInfoSearchResult[] | null = null;\n collapsedStates: { [key: string]: boolean } = {};\n\n ngOnInit(): void {\n this._infoService.features$.subscribe({ \n next: f => { \n this.features = f ? [...f] : null;\n if (this.features) {\n this.features.forEach(item => {\n if (this.collapsedStates[item.layerName] === undefined) {\n this.collapsedStates[item.layerName] = true;\n }\n });\n }\n }\n })\n }\n\n toggleCollapse(layerName: string): void {\n this.collapsedStates[layerName] = !this.collapsedStates[layerName];\n }\n\n isCollapsed(layerName: string): boolean {\n return this.collapsedStates[layerName] || false;\n }\n}","\n@if(features) {\n <div class=\"selected-features-wrapper\"> \n\n @for(item of features; track item.layerName) { \n <div class=\"feature-section\">\n <span (click)=\"toggleCollapse(item.layerName)\" class=\"collapsible-header\">\n <mat-icon class=\"collapse-icon\">\n {{ isCollapsed(item.layerName) ? 'keyboard_arrow_up' : 'expand_more' }}\n </mat-icon>\n {{item.layerName}}\n </span>\n \n <div class=\"feature-content\" [class.collapsed]=\"isCollapsed(item.layerName)\">\n @for(feature of item.values; track feature) {\n <div class=\"feature-item\">\n <div *ngFor=\"let kv of (feature | keyvalue)\" class=\"feature-row\">\n <div class=\"feature-label\">\n {{ kv.value.name }}:\n </div>\n <div class=\"feature-value\">\n <ng-container [ngSwitch]=\"kv.value.kind\">\n <img *ngSwitchCase=\"'img'\" [src]=\"kv.value.data\" alt=\"{{ kv.key }}\" style=\"max-width:240px;\" />\n <a *ngSwitchCase=\"'url'\" [href]=\"kv.value.data\" target=\"_blank\" rel=\"noopener noreferrer\">\n {{ kv.key }}\n <mat-icon class=\"link-icon\">open_in_new</mat-icon>\n </a>\n <span *ngSwitchDefault>{{ kv.value.data }}</span>\n </ng-container>\n </div>\n </div>\n </div>\n }\n </div>\n </div>\n }\n </div>\n}\n","import { Coordinate } from 'ol/coordinate';\nimport { SearchProviderBase } from './infoSearch.service';\nimport { FeatureCollection, Feature, Polygon as GeoJSONPolygon, MultiPolygon as GeoJSONMultiPolygon } from 'geojson';\nimport Filter from 'ol/format/filter/Filter';\nimport { ILayer } from '../models/ILayer';\nimport { inject, Injectable } from '@angular/core';\nimport { CurrentItemsService } from './currentItems.service';\nimport Point from 'ol/geom/Point';\nimport { intersects } from 'ol/format/filter';\nimport { MultiPolygon, Polygon } from 'ol/geom';\nimport GeoJSON from 'ol/format/GeoJSON'\nimport { bboxPolygon, featureCollection, intersect } from '@turf/turf';\n\ninterface IHoverResult {\n values: {\n center: Point;\n showValue: string\n }[];\n}\n\n@Injectable()\nexport class HoverInfoSearchService extends SearchProviderBase<IHoverResult, Coordinate> {\n\n private _current = inject(CurrentItemsService);\n override getSearchableLayers(): ILayer[] {\n return this._current.profile!.layerGroups.flatMap(l => l.layers).filter(l => l.showInfoOnHover);\n }\n\n override getFilter(searchValue: Coordinate, layer: ILayer): Filter {\n const point = new Point(searchValue);\n return intersects(layer.geometryField, point);\n }\n\n override map(l: ILayer, f: FeatureCollection): IHoverResult {\n return {\n values: f.features\n .filter(f => f.geometry.type === 'Polygon' || f.geometry.type === 'MultiPolygon')\n .map(f => ({\n center: this._getVisibleInteriorPoint(f as Feature<GeoJSONPolygon>),\n showValue: f.properties ? `${l.name}:${f.properties[l.propertyToShowOnHover]}` : ''\n }))\n }\n }\n\n // Finds the center point of the part of a feature that is visible on the map\n private _getVisibleInteriorPoint(feature: Feature<GeoJSONPolygon | GeoJSONMultiPolygon>): Point {\n const map = this._current.map!;\n const view = map.getView();\n const proj = view.getProjection();\n const size = map.getSize();\n\n\n const extent = view.calculateExtent(size);\n\n const extentPoly = bboxPolygon(extent as [number, number, number, number]);\n\n const collection = featureCollection([feature, extentPoly]);\n const clipped = intersect(collection as any);\n\n\n const gj = new GeoJSON({ dataProjection: proj, featureProjection: proj });\n const clippedGeom = gj.readGeometry(clipped!.geometry) as Polygon | MultiPolygon;\n\n // For MultiPoly, find largest polygon\n let target: Polygon;\n if (clippedGeom instanceof MultiPolygon) {\n const parts = clippedGeom.getPolygons();\n target = parts.reduce((best, p) => (p.getArea() > best.getArea() ? p : best), parts[0]);\n } else {\n target = clippedGeom as Polygon;\n }\n\n return target.getInteriorPoint();\n }\n\n}","import { inject, Injectable } from '@angular/core';\nimport { CurrentItemsService } from './currentItems.service';\nimport { HoverInfoSearchService } from './hoverInfoSearch.service';\nimport VectorLayer from 'ol/layer/Vector';\nimport VectorSource from 'ol/source/Vector';\nimport { Fill, Stroke, Style, Text } from 'ol/style';\nimport { Feature } from 'ol';\n@Injectable()\nexport class ShowInfoHoverService {\n\n private _current = inject(CurrentItemsService);\n private _search = inject(HoverInfoSearchService);\n\n private source = new VectorSource();\n private _layer = new VectorLayer({\n source: this.source,\n zIndex: 500,\n })\n\n init(): void {\n\n this._current.map$.subscribe({\n\n next: map => {\n let timer: any;\n map.addLayer(this._layer);\n map.on('pointermove', evt => {\n if (evt.dragging) { return; }\n clearTimeout(timer); // for every move, restart the timer\n timer = setTimeout(() => {\n this.source.clear();\n this._search.search(evt.coordinate, 2).subscribe({\n next: features => {\n const newFeatures = features\n .flatMap(f => f.values)\n .map(f => {\n const styleForFeature = this._getStyle(f.showValue);\n const newFeature = new Feature({ geometry: f.center })\n newFeature.setStyle(styleForFeature);\n return newFeature;\n });\n this.source.addFeatures(newFeatures);\n },\n error: err => {\n console.error(`Fejl ved visning af info ved hover: ${err}`);\n }\n })\n }, 300);\n })\n }\n })\n }\n\n private _getStyle(text: string): Style {\n const style = new Style({\n text: new Text({\n text: text,\n font: '12px Calibri,sans-serif',\n fill: new Fill({ color: '#000' }),\n stroke: new Stroke({ color: '#fff', width: 3 }),\n overflow: true,\n placement: 'point'\n })\n });\n return style;\n }\n\n}\n","import { Component, inject } from '@angular/core';\nimport { ShowDocumentInfoService } from '../../services/showInfo.service';\nimport { AsyncPipe, CommonModule, JsonPipe } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\n\n@Component({\n selector: 'document-search-info',\n styleUrl: './document-search-info.component.scss',\n templateUrl: '././document-search-info.component.html',\n imports: [CommonModule, FormsModule, AsyncPipe, JsonPipe, MatButtonModule, MatIconModule]\n})\nexport class DocumentSearchInfoComponent {\n\n private _showDocumentInfoService = inject(ShowDocumentInfoService);\n\n features$ = this._showDocumentInfoService.features$;\n\n getIcon(url: string): string {\n const ext = url.split('.').pop()?.toLowerCase();\n\n switch (ext) {\n case 'pdf':\n return 'picture_as_pdf'; // Material icon\n case 'doc':\n case 'docx':\n return 'description';\n case 'xls':\n case 'xlsx':\n return 'table_chart';\n case 'png':\n case 'jpg':\n case 'jpeg':\n case 'gif':\n return 'image';\n default:\n return 'insert_drive_file';\n }\n }\n\n}","<div *ngIf=\"features$ | async as features\" class=\"doc-info-panel\">\n <div class=\"doc-info-features\">\n <div *ngFor=\"let feature of features\" class=\"doc-info-layer\">\n <h3 class=\"doc-info-layer-title\">{{feature.layer}}</h3>\n <div *ngFor=\"let item of feature.items\" class=\"doc-info-item\">\n <mat-icon class=\"doc-info-item-icon\">{{getIcon(item.url)}}</mat-icon>\n <a [href]=\"item.url\" target=\"_blank\" rel=\"noopener\" class=\"doc-info-item-link\">\n {{ item.header }}\n </a>\n </div>\n </div>\n </div>\n</div>","import { CommonModule } from '@angular/common';\nimport { Component, ElementRef, EventEmitter, inject, Input, OnDestroy, OnInit, Output, 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';\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';\nimport { SelectedFeatureInfoComponent } from '../selected-feature-info/selected-feature-info.component';\nimport { FeatureCollection } from 'geojson'\nimport GeoJSON from 'ol/format/GeoJSON.js';\nimport { DrawLayerSourceService } from '../../services/drawLayerSource.service';\nimport { ShowInfoHoverService } from '../../services/showInfoHover.service';\nimport { PrintHelperService } from '../../services/printHelper.service';\nimport { ZoomService } from '../../services/zoom.service';\nimport { UndoRedoService } from '../../services/UndoRedo.service';\nimport { HoverInfoSearchService } from '../../services/hoverInfoSearch.service';\nimport { ShowDocumentInfoService, ShowInfoService } from '../../services/showInfo.service';\nimport { InfoSearchProvider } from '../../services/infoSearch.service';\nimport { CenterPointService } from '../../services/centerPoint.service';\nimport { PrintDrawLayerSourceService } from '../../services/printDrawLayerSource.service';\nimport { InteractionHelperService } from '../../services/interactionHelper.service';\nimport { ConflictAnalysisSearchProvider } from '../../services/conflictAnalysisSearch.service';\nimport { MergeFeaturesService } from '../../services/mergeFeatures.service';\nimport { OverlapService } from '../../services/overlap.service';\nimport { CowiService } from '../../services/cowi.service';\nimport { SearchProviderService } from '../../services/searchProvider.service';\nimport { AddressSearchService } from '../../services/addressSearch.service';\nimport { CadastreSearchService } from '../../services/cadastreSearch.service';\nimport { DmpCatalogService } from '../../services/dmpCatalog.service';\nimport { OlCapabilitiesService } from '../../services/olCapabilities.service';\nimport { DmpLayerMapperService } from '../../services/dmpLayer-mapper.service';\nimport { DocumentSearchService } from '../../services/documentSearch.service';\nimport { DocumentSearchInfoComponent } from '../document-search-info/document-search-info.component';\nimport { GeometrySearchService } from '../../services/geometrySearch.service';\nimport { LayoutService } from '../../services/layoutService';\n\nexport interface ISessionDone {\n doneFrom: 'activeObjects' | 'selectedObjects';\n features: FeatureCollection;\n imgData?: string[];\n}\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,\n LegendsListComponent, SelectedFeatureInfoComponent, DocumentSearchInfoComponent],\n providers: [CurrentItemsService, FeatureLoaderService, DrawLayerSourceService, ZoomService, UndoRedoService, ShowInfoHoverService, HoverInfoSearchService, CenterPointService, PrintDrawLayerSourceService,\n HighlightService, ShowInfoService, InfoSearchProvider, InteractionHelperService, ConflictAnalysisSearchProvider,\n MergeFeaturesService, OverlapService, CowiService, SearchProviderService, AddressSearchService, CadastreSearchService, ShowDocumentInfoService, DocumentSearchService,\n DmpCatalogService,OlCapabilitiesService, DmpLayerMapperService, GeometrySearchService] \n})\nexport class GisKomponentComponent implements OnInit, OnDestroy {\n\n private readonly _profileService = inject(ProfileService);\n private readonly _http = inject(HttpClient);\n private readonly _layerHelper = inject(LayerHelperService);\n private readonly _layerErrorService = inject(LayerErrorService);\n private readonly _layoutService = inject(LayoutService);\n private readonly _featureLoader = inject(FeatureLoaderService);\n private readonly _drawLayerService = inject(DrawLayerSourceService);\n private readonly _showHoverInfoService = inject(ShowInfoHoverService);\n private readonly _printHelper = inject(PrintHelperService);\n\n\n @Input({required: true}) identifier!: string;\n @Input() settings: GisKomponentSettings | undefined;\n @ViewChild('toolbarRef', { static: true }) toolbarRef!: ElementRef;\n @ViewChild('legendsListRef', { static: true }) legendsListRef!: ElementRef;\n @ViewChild('layerSelectorRef', { static: true }) layerSelectorRef!: ElementRef;\n @ViewChild('activeObjectsRef', {static: true }) activeObjectsRef!: ElementRef;\n @ViewChild('selectedFeatureInfoRef', {static: true }) selectedFeatureInfoRef!: ElementRef\n @ViewChild('documentInfoRef', {static: true }) documentInfoRef!: ElementRef\n\n\n @Output() sessionDone = new EventEmitter<ISessionDone>();\n @Output() featuresChanged = new EventEmitter<FeatureCollection>();\n\n map!: Map;\n toolbarCollapsed = false;\n layerPanelCollapsed = false;\n activeObjectsCollapsed = false;\n conflictsCollapsed = false;\n\n get showSearch(): boolean {\n return this.settings?.showMapSearch !== false;\n }\n \n get showDocumentSearch(): boolean {\n return this.settings?.showDocumentSearch !== false;\n }\n\n get showActiveObjects(): boolean {\n return this.settings?.showActiveObjects !== false;\n }\n\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 constructor() {\n this._currentItems.gisKomponentSettings = this.settings!\n }\n\n ngOnDestroy(): void {\n this._profileService.setProfileVersionChanged(false);\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 this._layoutService.map = this.map;\n\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 if (profile.showLegends) {\n const legendsListControl = new Control({\n element: this.legendsListRef?.nativeElement\n });\n this.map.addControl(legendsListControl);\n }\n \n if (profile.showLayerSelector) {\n const layerSelectorControl = new Control({\n element: this.layerSelectorRef?.nativeElement\n });\n this.map.addControl(layerSelectorControl);\n }\n\n this._currentItems.gisKomponentSettings = this.settings!;\n if (this.showActiveObjects && this.activeObjectsRef) {\n const activeObjectsControl = new Control({\n element: this.activeObjectsRef.nativeElement\n });\n this.map.addControl(activeObjectsControl);\n }\n\n const selectedFeatureInfoRefControl = new Control({\n element: this.selectedFeatureInfoRef.nativeElement\n });\n this.map.addControl(selectedFeatureInfoRefControl);\n\n if (this.showDocumentSearch) {\n const documentInfoRefControl = new Control({\n element: this.documentInfoRef.nativeElement\n });\n this.map.addControl(documentInfoRefControl);\n }\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._drawLayerService.features$.subscribe({\n next: features => { \n const geojson = new GeoJSON();\n this.featuresChanged.emit(geojson.writeFeaturesObject(features));\n }\n })\n this.map.on('moveend', this.onMoveEndCheckZoomFunction);\n this._showHoverInfoService.init();\n\n }}); \n }\n\n sessionDoneFromActiveObject(): void {\n const formatter = new GeoJSON();\n\n const sessionDone: ISessionDone = {\n doneFrom:'activeObjects',\n features: formatter.writeFeaturesObject(this._drawLayerService.allCleanedFeatures)\n };\n\n if (this._currentItems.gisKomponentSettings.printMapSettings && this._currentItems.gisKomponentSettings.printMapSettings.some(printSetting => printSetting.doPrintWhenSessionIsClosed)) {\n this._printHelper.getAllImgData(this.map, this._currentItems.gisKomponentSettings!.printMapSettings!.filter(printSetting => printSetting.doPrintWhenSessionIsClosed), this.selectedProfile.id).then(dataUrls => {\n sessionDone.imgData = dataUrls;\n this.sessionDone.emit(sessionDone);\n });\n } else {\n this.sessionDone.emit(sessionDone);\n }\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 if (layer.includedInPrint) this._layerHelper.setIncludedInPrint(result);\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 this._addRotateControl();\n\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=\"20\" height=\"20\" 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 const rotateControl = new Rotate({\n label: iconElement,\n tipLabel: 'Nulstil mod Nord',\n autoHide: false\n });\n\n this.map.addControl(rotateControl);\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}","<div #layerSelectorRef class=\"layer-selector-container\">\n @if (selectedProfile && selectedProfile.showLayerSelector) {\n <lib-layer-selector [map]=\"map\" [profile]=\"selectedProfile\" [currentZoomLevel]=\"currentZoomLevel\"></lib-layer-selector>\n }\n</div>\n\n<div #legendsListRef class=\"legends-list-container\">\n @if (selectedProfile && selectedProfile.showLegends) {\n <lib-legends-list [map]=\"map\" [profile]=\"selectedProfile\"></lib-legends-list>\n }\n</div>\n\n<div #selectedFeatureInfoRef class=\"selected-features-wrapper\">\n <selected-feature-info></selected-feature-info>\n</div>\n\n<div #documentInfoRef class=\"selected-features-wrapper\">\n <document-search-info></document-search-info>\n</div>\n\n<div #activeObjectsRef class=\"active-objects-container\">\n @if(showActiveObjects && settings && selectedProfile) {\n <activeObjects [settings]=\"settings\" [profile]=\"selectedProfile\" (sessionDone)=\"sessionDoneFromActiveObject()\"></activeObjects>\n }\n</div>\n\n<div #toolbarRef class=\"map-toolbar-container\">\n @if(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=\"showSearch\" [profile]=\"selectedProfile\"></lib-map-search>\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":["i1.OlCapabilitiesService","i2","i3","i9","i1.DrawLayerSourceService","GeoJSON","buffer","turfBuffer","i1","turfPoint","turfFeature","feature","olFeature","Point","Draw","WKT","Select","Feature","i5","i6","i4","map","i7","LayerGroup","Map","Rotate"],"mappings":"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"}
|