UNPKG

ngx-gaia-gis

Version:

GaiaGisService is an Angular library that simplifies the integration of interactive maps using OpenLayers. It allows for visualizing raster maps, adding custom points, and adjusting views easily, making it ideal for developers who need to implement geospa

1 lines β€’ 50 kB
{"version":3,"file":"ngx-gaia-gis.mjs","sources":["../../../projects/gaia-gis/src/lib/interfaces/MapDesignsGaia.model.ts","../../../projects/gaia-gis/src/lib/gaia-gis/gaia-gis.service.ts","../../../projects/gaia-gis/src/lib/gaia-gis/gaia-gis.component.ts","../../../projects/gaia-gis/src/lib/gaia-gis/gaia-gis.component.html","../../../projects/gaia-gis/src/public-api.ts","../../../projects/gaia-gis/src/ngx-gaia-gis.ts"],"sourcesContent":["export enum MapsDesign {\n CARTOCDN = 'https://{1-4}.basemaps.cartocdn.com/dark_nolabels/{z}/{x}/{y}.png',\n GNOSIS_EARTH = 'https://maps.gnosis.earth/ogcapi/collections/NaturalEarth:raster:HYP_HR_SR_OB_DR/map/tiles/WebMercatorQuad',\n OSM = 'OSM',\n}\n","import {\n Injectable,\n signal,\n computed,\n linkedSignal,\n inject,\n PLATFORM_ID,\n} from '@angular/core';\nimport TileLayer from 'ol/layer/Tile';\nimport { XYZ } from 'ol/source';\nimport { transformExtent, fromLonLat, toLonLat } from 'ol/proj';\nimport { Feature, Map, View } from 'ol';\nimport { Style, Icon, Circle as CircleStyle, Fill, Stroke } from 'ol/style';\nimport { Point, Polygon } from 'ol/geom';\nimport VectorLayer from 'ol/layer/Vector';\nimport { FitOptions } from 'ol/View';\nimport 'ol/ol.css';\nimport VectorSource from 'ol/source/Vector';\nimport { MapsDesign, Option, PolygonGaia } from '../interfaces';\nimport OSM from 'ol/source/OSM';\nimport { jsPDF } from 'jspdf';\nimport Overlay from 'ol/Overlay';\nimport { PointGaia } from '../interfaces/PointGaia.model';\nimport Draw from 'ol/interaction/Draw';\nimport { unByKey } from 'ol/Observable';\nimport { isPlatformServer } from '@angular/common';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class GaiaGisService {\n private readonly platform = inject(PLATFORM_ID);\n private map!: Map;\n private labels = new TileLayer({\n source: new XYZ({\n attributions:\n 'Gaia-GIS by Β© <a href=\"https://carto.com/attribution\">Olympus Analytics</a>',\n }),\n });\n private rasterLayers: TileLayer[] = [];\n private pointLayer!: VectorLayer<VectorSource>;\n private popup!: Overlay;\n\n // Polygon drawing properties\n private polygonLayer!: VectorLayer<VectorSource>;\n private drawInteraction: Draw | null = null;\n private keyListener: any = null;\n\n // Highlight layer for the starting point\n private highlightLayer!: VectorLayer<VectorSource>;\n private startPointFeature: Feature | null = null;\n\n // πŸ”₯ Angular 20 Signals for reactive state management\n\n /**\n * Signal to track if polygon drawing is active\n */\n public readonly isDrawingPolygon = signal<boolean>(false);\n\n /**\n * Signal to store the current polygon being drawn\n */\n public readonly currentPolygon = signal<PolygonGaia | null>(null);\n\n /**\n * Signal to store all completed polygons\n */\n public readonly completedPolygons = signal<PolygonGaia[]>([]);\n\n /**\n * Signal to track drawing mode state\n */\n public readonly drawingState = signal<\n 'idle' | 'drawing' | 'completing' | 'cancelled'\n >('idle');\n\n /**\n * Computed signal for drawing status message\n */\n public readonly drawingStatus = computed(() => {\n const state = this.drawingState();\n const isDrawing = this.isDrawingPolygon();\n\n switch (state) {\n case 'idle':\n return 'Ready to draw';\n case 'drawing':\n return 'Click to add vertices. Press Enter or click start point to complete.';\n case 'completing':\n return 'Polygon completed!';\n case 'cancelled':\n return 'Drawing cancelled';\n default:\n return 'Ready to draw';\n }\n });\n\n /**\n * Computed signal for polygon count\n */\n public readonly polygonCount = computed(\n () => this.completedPolygons().length\n );\n\n // πŸ”₯ Linked signal to handle auto-reset of drawing state\n private readonly autoResetState = linkedSignal(() => {\n const state = this.drawingState();\n\n if (state === 'completing' || state === 'cancelled') {\n console.log(`Drawing state changed: ${state}, auto-resetting in 2s`);\n setTimeout(() => {\n this.drawingState.set('idle');\n }, 2000);\n }\n\n return state;\n });\n\n // πŸ”₯ Linked signal to track polygon count changes\n private readonly polygonLogger = linkedSignal(() => {\n const polygons = this.completedPolygons();\n const count = polygons.length;\n\n if (count > 0) {\n console.log(`Total polygons: ${count}`);\n console.log('Latest polygon:', polygons[count - 1]);\n }\n\n return count;\n });\n\n // πŸ”₯ Public computed signals that activate the linkedSignals by consuming them\n public readonly stateStatus = computed(() => {\n // This computed consumes the autoResetState linkedSignal, keeping it active\n const state = this.autoResetState();\n return `Current state: ${state}`;\n });\n\n public readonly polygonLogger$ = computed(() => {\n // This computed consumes the polygonLogger linkedSignal, keeping it active\n return this.polygonLogger();\n });\n\n constructor() {\n if (isPlatformServer(this.platform)) return; // Skip initialization on server side\n this.pointLayer = new VectorLayer({\n source: new VectorSource(),\n });\n\n // πŸ”₯ LinkedSignals will be activated when accessed by computeds\n\n this.polygonLayer = new VectorLayer({\n source: new VectorSource(),\n style: new Style({\n stroke: new Stroke({\n color: '#ff0000',\n width: 2,\n }),\n fill: new Fill({\n color: 'rgba(255, 0, 0, 0.1)',\n }),\n }),\n });\n\n // Layer for highlighting the starting point\n this.highlightLayer = new VectorLayer({\n source: new VectorSource(),\n style: new Style({\n image: new CircleStyle({\n radius: 8,\n fill: new Fill({\n color: 'rgba(0, 255, 0, 0.8)', // Bright green\n }),\n stroke: new Stroke({\n color: '#00ff00',\n width: 3,\n }),\n }),\n }),\n zIndex: 1000, // Ensure it's on top\n });\n }\n\n /**\n * Initializes the map with the specified target, center, zoom level, and design.\n * @param {string} target - The target element ID for the map.\n * @param {Object} options - Options for configuring the map.\n * @param {[number, number]} [options.center=[0, 0]] - The initial center of the map.\n * @param {number} [options.zoom=2] - The initial zoom level of the map.\n * @param {string} [options.design=MapsDesign.CARTOCDN] - The design of the map.\n */\n initializeMap(target: string, options: Option = {}): void {\n if (isPlatformServer(this.platform)) return; // Skip initialization on server side\n const { center = [0, 0], zoom = 2, design = MapsDesign.CARTOCDN } = options;\n\n let baseLayer: TileLayer;\n\n if (\n design.includes('{z}') &&\n design.includes('{x}') &&\n design.includes('{y}')\n ) {\n baseLayer = new TileLayer({\n source: new XYZ({\n url: design,\n crossOrigin: 'anonymous',\n }),\n });\n } else {\n baseLayer = new TileLayer({\n source: new OSM(),\n });\n }\n\n this.labels = new TileLayer({\n source: new XYZ({\n url: 'https://{1-4}.basemaps.cartocdn.com/dark_only_labels/{z}/{x}/{y}.png',\n attributions:\n 'Gaia-GIS by Β© <a href=\"https://carto.com/attribution\">Olympus Analytics</a>',\n crossOrigin: 'anonymous',\n }),\n });\n\n this.map = new Map({\n target: target,\n layers: [\n baseLayer,\n this.pointLayer,\n this.polygonLayer,\n this.highlightLayer, // Add highlight layer on top\n ],\n view: new View({\n center: fromLonLat(center),\n zoom: zoom,\n }),\n });\n\n this.initializePopup();\n }\n\n /**\n * Initializes the popup overlay for the map.\n */\n private initializePopup(): void {\n if (isPlatformServer(this.platform)) return; // Skip initialization on server side\n const container = document.getElementById('popup')!;\n const content = document.getElementById('popup-content')!;\n this.popup = new Overlay({\n element: container,\n autoPan: true,\n });\n this.map.addOverlay(this.popup);\n\n let isPopupVisible = false;\n\n this.map.on('click', (event) => {\n const feature = this.map.forEachFeatureAtPixel(\n event.pixel,\n (feat) => feat\n );\n if (feature && feature.get('info')) {\n const coordinates = (feature.getGeometry() as Point).getCoordinates();\n content.innerHTML = feature.get('info');\n this.popup.setPosition(coordinates);\n\n if (!isPopupVisible) {\n container.classList.remove('hide');\n container.classList.add('show');\n isPopupVisible = true;\n }\n } else {\n if (isPopupVisible) {\n container.classList.remove('show');\n container.classList.add('hide');\n isPopupVisible = false;\n }\n setTimeout(() => {\n this.popup.setPosition(undefined);\n }, 300);\n }\n });\n\n this.map.on('pointermove', (event) => {\n this.map.getTargetElement().style.cursor = this.map.hasFeatureAtPixel(\n event.pixel\n )\n ? 'pointer'\n : '';\n });\n }\n\n /**\n * Highlights the starting point of the polygon being drawn\n * @param {[number, number]} coordinate - The coordinate to highlight\n */\n private highlightStartPoint(coordinate: [number, number]): void {\n if (isPlatformServer(this.platform)) return; // Skip on server side\n this.clearStartPointHighlight();\n\n this.startPointFeature = new Feature({\n geometry: new Point(coordinate),\n });\n\n // Add pulsing animation effect\n const style = new Style({\n image: new CircleStyle({\n radius: 8,\n fill: new Fill({\n color: 'rgba(0, 255, 0, 0.8)',\n }),\n stroke: new Stroke({\n color: '#00ff00',\n width: 3,\n }),\n }),\n });\n\n this.startPointFeature.setStyle(style);\n this.highlightLayer.getSource()!.addFeature(this.startPointFeature);\n\n // Add pulsing effect with CSS-like animation\n this.animateStartPoint();\n }\n\n /**\n * Animates the starting point with a pulsing effect\n */\n private animateStartPoint(): void {\n if (isPlatformServer(this.platform)) return; // Skip on server side\n if (!this.startPointFeature || !this.isDrawingPolygon()) {\n return;\n }\n\n let radius = 8;\n let growing = true;\n const animate = () => {\n if (!this.startPointFeature || !this.isDrawingPolygon()) {\n return;\n }\n\n if (growing) {\n radius += 0.5;\n if (radius >= 12) growing = false;\n } else {\n radius -= 0.5;\n if (radius <= 8) growing = true;\n }\n\n const style = new Style({\n image: new CircleStyle({\n radius: radius,\n fill: new Fill({\n color: 'rgba(0, 255, 0, 0.6)',\n }),\n stroke: new Stroke({\n color: '#00ff00',\n width: 3,\n }),\n }),\n });\n\n this.startPointFeature.setStyle(style);\n\n if (this.isDrawingPolygon()) {\n setTimeout(animate, 100);\n }\n };\n\n animate();\n }\n\n /**\n * Clears the starting point highlight\n */\n private clearStartPointHighlight(): void {\n if (isPlatformServer(this.platform)) return; // Skip on server side\n const source = this.highlightLayer.getSource();\n if (source) {\n source.clear();\n }\n this.startPointFeature = null;\n }\n\n /**\n * πŸ”₯ Starts polygon drawing mode using signals for state management.\n * Users can click to add vertices and complete the polygon by clicking the first point again or pressing Enter.\n */\n startPolygonDraw(): void {\n if (isPlatformServer(this.platform)) return; // Skip on server side\n if (this.isDrawingPolygon()) {\n this.cancelPolygonDraw();\n }\n\n // πŸ”₯ Update signals\n this.isDrawingPolygon.set(true);\n this.drawingState.set('drawing');\n this.currentPolygon.set(null);\n\n this.map.getTargetElement().style.cursor = 'crosshair';\n\n // Create draw interaction for polygons\n this.drawInteraction = new Draw({\n source: this.polygonLayer.getSource()!,\n type: 'Polygon',\n style: new Style({\n stroke: new Stroke({\n color: '#ff0000',\n width: 2,\n }),\n fill: new Fill({\n color: 'rgba(255, 0, 0, 0.1)',\n }),\n }),\n });\n\n // Handle drawing start to highlight the first point\n this.drawInteraction.on('drawstart', (event) => {\n // Listen for the first coordinate\n const geometry = event.feature.getGeometry() as Polygon;\n\n // Use a small delay to ensure the coordinate is set\n setTimeout(() => {\n const coordinates = geometry.getCoordinates()[0];\n if (coordinates && coordinates.length > 0) {\n const firstCoord = coordinates[0] as [number, number];\n this.highlightStartPoint(firstCoord);\n }\n }, 50);\n });\n\n // Handle polygon completion\n this.drawInteraction.on('drawend', (event) => {\n const feature = event.feature;\n const geometry = feature.getGeometry() as Polygon;\n const coordinates = geometry.getCoordinates()[0]; // Get outer ring coordinates\n\n // Convert coordinates from EPSG:3857 to EPSG:4326 (lat/lng)\n const latLngCoordinates: [number, number][] = coordinates.map(\n (coord) => toLonLat(coord) as [number, number]\n );\n\n // Create polygon data with unique ID\n const polygonId = Date.now();\n const polygonData: PolygonGaia = {\n coordinates: latLngCoordinates,\n properties: {\n id: polygonId,\n createdAt: new Date().toISOString(),\n },\n };\n\n // πŸ”₯ Associate the feature with the polygon ID for later removal\n feature.set('polygonId', polygonId);\n feature.set('polygonData', polygonData);\n\n // πŸ”₯ Update signals\n this.currentPolygon.set(polygonData);\n this.completedPolygons.update((polygons) => [...polygons, polygonData]);\n this.drawingState.set('completing');\n\n // Clean up\n this.stopPolygonDraw();\n });\n\n // Add the draw interaction to the map\n this.map.addInteraction(this.drawInteraction);\n\n // Add keyboard listener for Enter key to complete polygon\n this.keyListener = (event: KeyboardEvent) => {\n if (event.key === 'Enter' && this.isDrawingPolygon()) {\n this.drawInteraction?.finishDrawing();\n } else if (event.key === 'Escape' && this.isDrawingPolygon()) {\n this.cancelPolygonDraw();\n }\n };\n\n document.addEventListener('keydown', this.keyListener);\n }\n\n /**\n * πŸ”₯ Cancels the current polygon drawing operation using signals.\n */\n cancelPolygonDraw(): void {\n if (isPlatformServer(this.platform)) return; // Skip on server side\n if (!this.isDrawingPolygon()) {\n return;\n }\n\n // πŸ”₯ Update signals\n this.drawingState.set('cancelled');\n this.currentPolygon.set(null);\n\n this.stopPolygonDraw();\n\n // Clear any incomplete drawing\n const source = this.polygonLayer.getSource();\n if (source) {\n source.clear();\n }\n }\n\n /**\n * Stops polygon drawing mode and cleans up resources.\n */\n private stopPolygonDraw(): void {\n if (isPlatformServer(this.platform)) return; // Skip on server side\n // πŸ”₯ Update signal\n this.isDrawingPolygon.set(false);\n\n this.map.getTargetElement().style.cursor = '';\n\n if (this.drawInteraction) {\n this.map.removeInteraction(this.drawInteraction);\n this.drawInteraction = null;\n }\n\n if (this.keyListener) {\n document.removeEventListener('keydown', this.keyListener);\n this.keyListener = null;\n }\n\n // Clear the starting point highlight\n this.clearStartPointHighlight();\n }\n\n /**\n * πŸ”₯ Clears all drawn polygons from the map using signals.\n */\n clearPolygons(): void {\n if (isPlatformServer(this.platform)) return; // Skip on server side\n console.log(`πŸ—‘οΈ Clearing all polygons...`);\n\n const source = this.polygonLayer.getSource();\n if (source) {\n const featureCount = source.getFeatures().length;\n source.clear();\n console.log(`πŸ—‘οΈ Cleared ${featureCount} features from map`);\n }\n\n // πŸ”₯ Reset signals\n const polygonCount = this.completedPolygons().length;\n this.completedPolygons.set([]);\n this.currentPolygon.set(null);\n console.log(`πŸ“Š Cleared ${polygonCount} polygons from signals`);\n\n // Also clear any highlights\n this.clearStartPointHighlight();\n }\n\n /**\n * πŸ”₯ Get the latest completed polygon using signals\n */\n getLatestPolygon(): PolygonGaia | null {\n const polygons = this.completedPolygons();\n return polygons.length > 0 ? polygons[polygons.length - 1] : null;\n }\n\n /**\n * πŸ”₯ Remove a specific polygon by ID using signals\n */\n removePolygonById(id: number): void {\n console.log(`πŸ—‘οΈ Removing polygon with ID: ${id}`);\n\n // First remove from the map layer\n const source = this.polygonLayer.getSource();\n if (source) {\n const features = source.getFeatures();\n console.log(`πŸ“‹ Total features on map: ${features.length}`);\n\n const featureToRemove = features.find((feature) => {\n const featureId = feature.get('polygonId');\n console.log(`πŸ” Checking feature with ID: ${featureId}`);\n return featureId === id;\n });\n\n if (featureToRemove) {\n console.log(`βœ… Found feature to remove with ID: ${id}`);\n source.removeFeature(featureToRemove);\n console.log(`πŸ—‘οΈ Feature removed from map`);\n } else {\n console.warn(`❌ Feature with ID ${id} not found on map`);\n\n // If we can't find by polygonId, try alternative approach\n const polygonToRemove = this.completedPolygons().find(\n (p) => p.properties?.['id'] === id\n );\n if (polygonToRemove) {\n // Remove all features and re-add the remaining ones\n console.log(`πŸ”„ Rebuilding map features...`);\n source.clear();\n\n const remainingPolygons = this.completedPolygons().filter(\n (p) => p.properties?.['id'] !== id\n );\n this.rebuildMapFeatures(remainingPolygons);\n }\n }\n }\n\n // Then update the signals\n this.completedPolygons.update((polygons) => {\n const filtered = polygons.filter(\n (polygon) => polygon.properties?.['id'] !== id\n );\n console.log(`πŸ“Š Polygons after removal: ${filtered.length}`);\n return filtered;\n });\n }\n\n /**\n * πŸ”₯ Rebuilds map features from polygon data\n */\n private rebuildMapFeatures(polygons: PolygonGaia[]): void {\n const source = this.polygonLayer.getSource();\n if (!source) return;\n\n polygons.forEach((polygonData) => {\n // Convert lat/lng coordinates back to map coordinates\n const mapCoordinates = polygonData.coordinates.map((coord) =>\n fromLonLat(coord)\n );\n\n // Close the polygon if not already closed\n const lastCoord = mapCoordinates[mapCoordinates.length - 1];\n const firstCoord = mapCoordinates[0];\n if (lastCoord[0] !== firstCoord[0] || lastCoord[1] !== firstCoord[1]) {\n mapCoordinates.push(firstCoord);\n }\n\n // Create the feature\n const feature = new Feature({\n geometry: new Polygon([mapCoordinates]),\n });\n\n // Set the polygon ID and data for future removal\n feature.set('polygonId', polygonData.properties?.['id']);\n feature.set('polygonData', polygonData);\n\n // Add to the map\n source.addFeature(feature);\n });\n\n console.log(`βœ… Rebuilt ${polygons.length} features on map`);\n }\n\n /**\n * Adds a raster layer to the map using a given URL.\n * @param {string} url - The URL of the GeoTIFF file.\n * @returns {Promise<void>}\n */\n async addRasterLayer(url: string): Promise<void> {\n try {\n const encodedUrl = encodeURIComponent(url);\n const boundsUrl = `https://tiles.rdnt.io/bounds?url=${encodedUrl}`;\n const response = await fetch(boundsUrl);\n if (!response.ok) {\n throw new Error('Network response was not ok');\n }\n const result = await response.json();\n const extent = transformExtent(result.bounds, 'EPSG:4326', 'EPSG:3857');\n this.map.getView().fit(extent, this.map.getSize() as FitOptions);\n\n const tilesUrl = this.createTilesUrl(encodedUrl);\n const cogLayer = new TileLayer({\n source: new XYZ({\n url: tilesUrl,\n }),\n });\n\n const layers = this.map.getLayers();\n if (layers.getLength() > 2) {\n layers.removeAt(2);\n }\n this.map.addLayer(cogLayer);\n this.rasterLayers.push(cogLayer);\n } catch (error) {\n console.error('Error al cargar el archivo GeoTIFF:', error);\n alert(`Request failed. Are you sure '${url}' is a valid COG?`);\n }\n }\n\n /**\n * Creates a tiles URL for the given encoded URL.\n * @param {string} url - The encoded URL of the GeoTIFF file.\n * @returns {string} - The tiles URL.\n */\n private createTilesUrl(url: string): string {\n return `https://tiles.rdnt.io/tiles/{z}/{x}/{y}?url=${url}`;\n }\n\n /**\n * Removes a raster layer from the map by its index.\n * @param {number} index - The index of the raster layer to remove.\n */\n removeRasterLayer(index: number): void {\n const layer = this.rasterLayers[index];\n if (layer) {\n this.map.removeLayer(layer);\n this.rasterLayers.splice(index, 1);\n }\n }\n\n /**\n * Sets the view of the map to a given center and zoom level.\n * @param {[number, number]} center - The new center of the map.\n * @param {number} zoom - The new zoom level of the map.\n */\n setView(center: [number, number], zoom: number): void {\n this.map.getView().setCenter(fromLonLat(center));\n this.map.getView().setZoom(zoom);\n }\n\n /**\n * Zooms the map to fit a given extent.\n * @param {[number, number, number, number]} extent - The extent to fit the map to.\n */\n zoomToExtent(extent: [number, number, number, number]): void {\n this.map.getView().fit(extent);\n }\n\n /**\n * Adds a list of points to the map with an optional icon.\n * @param {Array<{ coords: [number, number], info?: string }>} points - The list of points to add to the map.\n * @param {string} [iconUrl] - The URL of the icon to use for the points.\n */\n addPoints(points: PointGaia[], iconUrl?: string): void {\n console.log('Adding points to the map...');\n const features = points.map((point) => {\n const feature = new Feature({\n geometry: new Point(fromLonLat(point.coords)),\n });\n if (point.info) {\n feature.set('info', point.info);\n }\n if (iconUrl) {\n feature.setStyle(\n new Style({\n image: new Icon({\n src: iconUrl,\n scale: 0.1,\n }),\n })\n );\n } else {\n feature.setStyle(\n new Style({\n image: new CircleStyle({\n radius: 5,\n fill: new Fill({ color: 'red' }),\n stroke: new Stroke({ color: 'black', width: 1 }),\n }),\n })\n );\n }\n return feature;\n });\n\n const source = this.pointLayer.getSource();\n if (source) {\n source.addFeatures(features);\n } else {\n console.error('La fuente de pointLayer no estΓ‘ disponible.');\n }\n }\n\n /**\n * Exports the current map view to a PDF file.\n */\n exportGaiaMapToPdf(): void {\n this.map.once('rendercomplete', () => {\n const mapCanvas = document.createElement('canvas');\n const size = this.map.getSize()!;\n mapCanvas.width = size[0];\n mapCanvas.height = size[1];\n const mapContext = mapCanvas.getContext('2d')!;\n\n const canvases = document.querySelectorAll(\n '.ol-layer canvas'\n ) as NodeListOf<HTMLCanvasElement>;\n canvases.forEach((canvas) => {\n if (canvas.width > 0) {\n const opacity = canvas.parentElement?.style.opacity || '1';\n mapContext.globalAlpha = parseFloat(opacity);\n\n const transform = canvas.style.transform;\n const matrix = transform\n .match(/^matrix\\(([^)]+)\\)$/)?.[1]\n .split(',')\n .map(Number);\n\n if (matrix) {\n const domMatrix = new DOMMatrix(matrix);\n mapContext.setTransform(domMatrix);\n } else {\n mapContext.setTransform(1, 0, 0, 1, 0, 0);\n }\n\n mapContext.drawImage(canvas, 0, 0);\n }\n });\n\n const dataUrl = mapCanvas.toDataURL('image/png');\n const pdf = new jsPDF('landscape', undefined, 'a4');\n pdf.addImage(dataUrl, 'PNG', 0, 0, 297, 210);\n pdf.save('map.pdf');\n });\n\n this.map.renderSync();\n }\n}\n","import {\n Component,\n inject,\n Input,\n OnInit,\n output,\n computed,\n linkedSignal,\n PLATFORM_ID,\n} from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\nimport { GaiaGisService } from './gaia-gis.service';\nimport { Option, PolygonGaia } from '../interfaces';\n\n@Component({\n selector: 'gaia-gis',\n standalone: true,\n imports: [],\n templateUrl: './gaia-gis.component.html',\n styleUrl: './gaia-gis.component.css',\n})\nexport class GaiaGisComponent implements OnInit {\n @Input() options?: Option;\n\n // πŸ”₯ Output event for polygon drawing (for backward compatibility)\n polygonDrawn = output<PolygonGaia>();\n\n // πŸ”₯ Inject the service with signals\n private readonly gaiaGisService = inject(GaiaGisService);\n private readonly platformId = inject(PLATFORM_ID);\n\n // πŸ”₯ Expose service signals for template usage\n public readonly isDrawingPolygon = this.gaiaGisService.isDrawingPolygon;\n public readonly drawingStatus = this.gaiaGisService.drawingStatus;\n public readonly polygonCount = this.gaiaGisService.polygonCount;\n public readonly completedPolygons = this.gaiaGisService.completedPolygons;\n public readonly currentPolygon = this.gaiaGisService.currentPolygon;\n public readonly drawingState = this.gaiaGisService.drawingState;\n\n // πŸ”₯ Computed signal for UI state\n public readonly canStartDrawing = computed(\n () => !this.isDrawingPolygon() && this.drawingState() !== 'completing'\n );\n\n public readonly showCancelButton = computed(\n () => this.isDrawingPolygon() && this.drawingState() === 'drawing'\n );\n\n // πŸ”₯ Linked signal to emit events for backward compatibility\n private readonly polygonEmitter = linkedSignal(() => {\n const currentPolygon = this.currentPolygon();\n const state = this.drawingState();\n\n if (currentPolygon && state === 'completing') {\n this.polygonDrawn.emit(currentPolygon);\n }\n\n return currentPolygon;\n });\n\n ngOnInit(): void {\n if (isPlatformBrowser(this.platformId)) {\n this.initializeMap();\n }\n }\n\n initializeMap(): void {\n if (isPlatformBrowser(this.platformId)) {\n if (this.options) {\n this.gaiaGisService.initializeMap('map', this.options);\n } else {\n this.gaiaGisService.initializeMap('map');\n }\n }\n }\n\n /**\n * πŸ”₯ Starts polygon drawing mode using the service signals.\n */\n startPolygonDraw(): void {\n if (isPlatformBrowser(this.platformId)) {\n this.gaiaGisService.startPolygonDraw();\n }\n }\n\n /**\n * πŸ”₯ Cancels polygon drawing using the service signals.\n */\n cancelPolygonDraw(): void {\n if (isPlatformBrowser(this.platformId)) {\n this.gaiaGisService.cancelPolygonDraw();\n }\n }\n\n /**\n * πŸ”₯ Clears all drawn polygons using the service signals.\n */\n clearPolygons(): void {\n if (isPlatformBrowser(this.platformId)) {\n this.gaiaGisService.clearPolygons();\n }\n }\n\n /**\n * πŸ”₯ Gets the latest polygon using signals\n */\n getLatestPolygon(): PolygonGaia | null {\n return isPlatformBrowser(this.platformId)\n ? this.gaiaGisService.getLatestPolygon()\n : null;\n }\n\n /**\n * πŸ”₯ Removes a polygon by ID using signals\n */\n removePolygonById(id: number): void {\n if (isPlatformBrowser(this.platformId)) {\n this.gaiaGisService.removePolygonById(id);\n }\n }\n}\n","<div id=\"map\" style=\"width: 100%; height: 100%\"></div>\n<div id=\"popup\" class=\"ol-popup\">\n <div id=\"popup-content\"></div>\n</div>\n","/*\n * Public API Surface of gaia-gis\n */\n\nimport { GaiaGisComponent } from './lib/gaia-gis/gaia-gis.component';\nexport { GaiaGisService } from './lib/gaia-gis/gaia-gis.service';\nexport * from './lib/interfaces';\n\nexport { GaiaGisComponent };\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["CircleStyle"],"mappings":"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"}