{"version":3,"file":"hslayers-ng-common-layers.mjs","sources":["../../../projects/hslayers/common/layers/hs.source.SparqlJson.ts","../../../projects/hslayers/common/layers/hs.source.SPOI.ts","../../../projects/hslayers/common/layers/hs.source.interpolated.ts","../../../projects/hslayers/common/layers/wfs-get-feature.ts","../../../projects/hslayers/common/layers/hs.source.WfsSource.ts","../../../projects/hslayers/common/layers/hslayers-ng-common-layers.ts"],"sourcesContent":["import * as xml2Json from 'xml-js';\nimport {Feature} from 'ol';\nimport {GeoJSON, WKT} from 'ol/format';\nimport {Point} from 'ol/geom';\nimport {Vector} from 'ol/source';\nimport {get as getProjection, transform} from 'ol/proj';\n\nexport type SparqlOptions = {\n  category?: string;\n  category_field?;\n  clear_on_move?: boolean;\n  /**\n   * URL of the SPARQL endpoint\n   * @example https://www.foodie-cloud.org/sparql\n   */\n  endpointUrl?: string;\n  /**\n   * Additional parametres which shall be sent to the SPARQL endpoint along with the query.\n   */\n  endpointOptions?;\n  extend_with_attribs?;\n  /**\n   * Query variable (attribute) holding a unique ID of each feature.\n   * It may include the leading question mark or dollar sign.\n   * @default 's'\n   */\n  idAttribute?: string;\n  /**\n   * Query variable (attribute) holding the geometry of each feature.\n   * It may include the leading question mark or dollar sign.\n   */\n  geomAttribute?: string;\n  /**\n   * URL of hslayers-proxy if used. Left empty if proxy is not necessary.\n   */\n  proxyPrefix?: string;\n  /**\n   * When set to 'virtuoso', the query will use Virtuoso's optimised \"bif\" functions instead of standardised GeoSPARQL functions.\n   * When set to 'wikibase', the query will use Blazegraph & Wikibase SERVICE instead of standardised GeoSPARQL functions.\n   * When unset, the query will use standardised GeoSPARQL functions.\n   * @default undefined\n   */\n  optimization?: 'virtuoso' | 'wikibase';\n  /**\n   * EPSG code of projection\n   */\n  projection: string;\n  /**\n   * Actual SPARQL query.\n   * Must contain magical keyword <extent> somewhere in the WHERE clause, which will be automagically replaced by a current extent filter.\n   */\n  query?: string;\n  strategy?;\n  /**\n   * @deprecated\n   * Shorthand, which usage is discouraged. You should split your 'url' param into\n   * 'endpointUrl','query' and possibly 'endpointOptions', if needed.\n   */\n  url?: string;\n  /**\n   * @deprecated\n   * Was not obvious what it was good for and no use case was found.\n   * If you have some, please file an issue at https://github.com/hslayers/hslayers-ng/issues\n   */\n  updates_url?: string;\n};\n\n/**\n * Provides a source of features from SPARQL endpoint\n */\nexport class SparqlJson extends Vector {\n  category_map = {};\n  category_id = 0;\n  loadCounter: number;\n  occupied_xy: {[coord: string]: boolean} = {};\n  //What is it good for?\n  styleAble: boolean;\n  //What is it good for?\n  hasPoint: boolean;\n  /**\n   * Only either 'url' or 'endpointUrl' + 'query' are mandatory\n   */\n  constructor({\n    category,\n    category_field,\n    clear_on_move,\n    endpointUrl,\n    endpointOptions,\n    extend_with_attribs,\n    idAttribute,\n    geomAttribute,\n    proxyPrefix,\n    optimization,\n    projection,\n    query,\n    strategy,\n    url,\n    updates_url,\n  }: SparqlOptions) {\n    super({\n      format: new GeoJSON(),\n      loader: async (extent, resolution, projection) => {\n        if (updates_url) {\n          throw new Error(\n            'updates_url was removed from the options as we have found no use case for it. If you have some, please file an issue at https://github.com/hslayers/hslayers-ng/issues',\n          );\n        }\n        if (!url && (!endpointUrl || !query)) {\n          throw new Error('URL or query not specified for SPARQL source');\n        }\n        idAttribute ??= 's';\n        idAttribute = idAttribute?.trim();\n        if (idAttribute.startsWith('?') || idAttribute.startsWith('$')) {\n          idAttribute = idAttribute?.slice(1);\n        }\n        geomAttribute ??= 'geom'; //TODO: how to fallback to 'bif:st_point(xsd:decimal(?lon), xsd:decimal(?lat))' ?\n        geomAttribute = geomAttribute.trim();\n        if (geomAttribute.startsWith('?') || geomAttribute.startsWith('$')) {\n          geomAttribute = geomAttribute.slice(1);\n        }\n        this.set('loaded', false);\n        this.loadCounter += 1;\n        // No need to manually dispatch 'featuresloadstart' event as it is casted automatically when the loader is executed\n        if (typeof clear_on_move !== 'undefined' && clear_on_move) {\n          this.clear();\n        }\n        url = this.composeUrl({\n          endpointUrl,\n          query,\n          geomAttribute,\n          extent,\n          optimization,\n          proxyPrefix,\n        });\n        if (console && typeof this.get('geoname') !== 'undefined') {\n          console.log('Get ', this.get('geoname'));\n        }\n        const response = await fetch(url, {\n          headers: {\n            'Accept':\n              'application/sparql-results+json, application/ld+json, application/json, application/xml;q=0.9, */*;q=0.8',\n          },\n          method: 'GET',\n        });\n        let data;\n        try {\n          data = await response.clone().json();\n        } catch (err) {\n          if (console) {\n            console.warn(\n              'SPARQL results response not formatted as valid JSON. Trying to parse XML...',\n              err,\n            );\n          }\n        }\n        if (!data) {\n          try {\n            data = this.xmlJson2sparqlJson(\n              xml2Json.xml2js(await response.text()),\n            );\n          } catch (err) {\n            this.dispatchEvent('featuresloaderror');\n            console.error('Unable to parse SPARQL response XML!', err);\n            this.set('loaded', true);\n            return;\n          }\n        }\n        /*if (console) {\n          console.log(\n            'Finish ',\n            this.get('geoname'),\n            data.results.bindings.length\n          );\n        }*/\n        const objects = {};\n        for (const item of data.results.bindings) {\n          const id = item[idAttribute]?.value;\n          if (objects[id] === undefined) {\n            objects[id] = {\n              'poi_id': id,\n              'geom': item[geomAttribute]?.value,\n            };\n          }\n          objects[id][item.p.value] = item.o.value;\n        }\n        if (typeof category !== 'undefined') {\n          for (const object of Object.keys(objects)) {\n            object['http://www.sdi4apps.eu/poi/#mainCategory'] = category;\n          }\n        }\n        this.extendAttributes(extend_with_attribs, objects);\n        this.addFeatures(\n          this.createFeatures({\n            entities: Object.values(objects),\n            src: this,\n            occupiedXY: this.occupied_xy,\n            categoryField: category_field,\n            categoryMap: this.category_map,\n            categoryId: this.category_id,\n            proj: projection,\n          }),\n        );\n        this.styleAble = true;\n        this.hasPoint = true;\n        this.loadCounter -= 1;\n        this.set('last_feature_count', Object.keys(objects).length);\n        this.dispatchEvent('featuresloadend');\n        if (this.loadCounter == 0) {\n          this.set('loaded', true);\n        }\n      },\n      strategy:\n        strategy ??\n        function (extent, resolution) {\n          const tmp = [extent[0], extent[1], extent[2], extent[3]];\n          if (extent[2] - extent[0] > 65735) {\n            tmp[0] = (extent[2] + extent[0]) / 2.0 - 65735 / 2.0;\n            tmp[2] = (extent[2] + extent[0]) / 2.0 + 65735 / 2.0;\n            tmp[1] = (extent[3] + extent[1]) / 2.0 - 35000 / 2.0;\n            tmp[3] = (extent[3] + extent[1]) / 2.0 + 35000 / 2.0;\n          }\n          return [tmp];\n        },\n    });\n    this.loadCounter = 0;\n    this.set('legendCategories', this.category_map);\n  }\n\n  extendAttributes(extend_with_attribs, objects) {\n    if (typeof extend_with_attribs !== 'undefined') {\n      for (const attr_i in extend_with_attribs) {\n        for (const i in objects) {\n          if (typeof objects[i][extend_with_attribs[attr_i]] === 'undefined') {\n            objects[i][extend_with_attribs[attr_i]] = '';\n          }\n        }\n      }\n    }\n  }\n\n  composeUrl({\n    endpointUrl,\n    query,\n    geomAttribute,\n    extent,\n    optimization,\n    proxyPrefix,\n  }: {\n    endpointUrl: string;\n    query: string;\n    geomAttribute: string;\n    extent: any[];\n    optimization?: string;\n    proxyPrefix?: string;\n  }): string {\n    let url = '';\n    // An attempt to add missing geometry variable\n    let fromIndex = query.toUpperCase().indexOf('FROM');\n    if (fromIndex < 0) {\n      fromIndex = query.toUpperCase().indexOf('WHERE');\n    }\n    const queryHead = query.slice(0, fromIndex);\n    const queryBody = query.slice(fromIndex, query.length);\n    if (!queryHead.includes('*') && !queryHead.includes(geomAttribute)) {\n      query = `${queryHead} ?${geomAttribute} ${queryBody}`;\n    }\n    let queryParts: string[];\n    // An attempt to fix missing filter by extent\n    if (!query.includes('<extent>')) {\n      const lastBraceIndex = query.lastIndexOf('}');\n      queryParts = [\n        query.slice(0, lastBraceIndex - 1),\n        query.slice(lastBraceIndex - 1),\n      ];\n    } else {\n      queryParts = query.split('<extent>');\n    }\n    url =\n      endpointUrl +\n      '?query=' +\n      encodeURIComponent(queryParts[0]) +\n      '<extent>' +\n      encodeURIComponent(queryParts[1]) +\n      '&format=application%2Fsparql-results%2Bjson';\n    let first_pair = [extent[0], extent[1]];\n    let second_pair = [extent[2], extent[3]];\n    if (getProjection('EPSG:3857') && getProjection('EPSG:4326')) {\n      first_pair = transform(first_pair, 'EPSG:3857', 'EPSG:4326');\n      second_pair = transform(second_pair, 'EPSG:3857', 'EPSG:4326');\n    }\n    extent = [...first_pair, ...second_pair];\n    let s_extent;\n    if (optimization === 'wikibase') {\n      s_extent = encodeURIComponent(`SERVICE wikibase:box {\n            ?place wdt:P625 ?loc .\n            bd:serviceParam wikibase:cornerWest \"Point(${extent[0]} ${extent[3]})\"^^geo:wktLiteral .\n            bd:serviceParam wikibase:cornerEast \"Point(${extent[2]} ${extent[1]})\"^^geo:wktLiteral .\n          }`);\n    } else {\n      const geof =\n        optimization === 'virtuoso'\n          ? 'bif:st_may_intersect'\n          : 'geof:sfIntersects';\n      /* Do NOT break lines in the POLYGON() section! */\n      s_extent = encodeURIComponent(\n        `FILTER(${geof}(\n              \"POLYGON((${extent[0]} ${extent[1]}, ${extent[0]} ${extent[3]}, ${extent[2]} ${extent[3]}, ${extent[2]} ${extent[1]}, ${extent[0]} ${extent[1]}))\"^^geo:wktLiteral,\n            ?${geomAttribute}\n            )).`,\n      );\n    }\n    const tmp = url.split('query=');\n    url =\n      tmp[0] +\n      'query=' +\n      encodeURIComponent(\n        'PREFIX geo: <http://www.opengis.net/ont/geosparql#>\\n' +\n          'PREFIX geof: <http://www.opengis.net/def/function/geosparql/>\\n',\n      ) +\n      tmp[1];\n    url = url.replace(/<extent>/g, s_extent);\n    if (proxyPrefix) {\n      url = proxyPrefix + encodeURIComponent(url);\n    }\n    return url;\n  }\n\n  /**\n   * @param src - OL Source\n   */\n  createFeatures({\n    entities,\n    src,\n    occupiedXY,\n    categoryField,\n    categoryMap,\n    categoryId,\n    proj,\n  }: {\n    entities: any[];\n    src: SparqlJson;\n    occupiedXY: {[coord: string]: boolean};\n    categoryField;\n    categoryMap;\n    categoryId;\n    proj;\n  }) {\n    const features = [];\n    for (const entity of entities) {\n      //TODO: is this first option obsolete, when the geometry must be in the geomAttribute?\n      if (\n        entity['http://www.w3.org/2003/01/geo/wgs84_pos#lat'] &&\n        entity['http://www.w3.org/2003/01/geo/wgs84_pos#long'] &&\n        entity['http://www.w3.org/2003/01/geo/wgs84_pos#lat'] != '' &&\n        entity['http://www.w3.org/2003/01/geo/wgs84_pos#long'] != ''\n      ) {\n        const x = parseFloat(\n          entity['http://www.w3.org/2003/01/geo/wgs84_pos#long'],\n        );\n        const y = parseFloat(\n          entity['http://www.w3.org/2003/01/geo/wgs84_pos#lat'],\n        );\n        if (!isNaN(x) && !isNaN(y) && getProjection(proj)) {\n          const coord = transform([x, y], 'EPSG:4326', proj);\n          if (typeof occupiedXY[coord.toString()] !== 'undefined') {\n            continue;\n          }\n          entity.geometry = new Point(coord);\n          const feature = new Feature(entity);\n          this.registerCategoryForStatistics({\n            featureObject: entity,\n            categoryField,\n            feature,\n            categoryMap,\n            categoryId,\n          });\n          occupiedXY[coord.toString()] = true;\n          features.push(feature);\n        }\n      }\n      //'http://www.opengis.net/ont/geosparql#asWKT';\n      if (entity.geom) {\n        const format = new WKT();\n        const g_feature = format.readFeature(entity.geom.toUpperCase());\n        entity.geometry = g_feature.getGeometry();\n        entity.geometry.transform('EPSG:4326', proj);\n        delete entity.geom;\n        const coord = entity.geometry.getCoordinates();\n        if (typeof occupiedXY[coord.toString()] !== 'undefined') {\n          continue;\n        }\n        const feature = new Feature(entity);\n        occupiedXY[coord] = true;\n        features.push(feature);\n        this.registerCategoryForStatistics({\n          featureObject: entity,\n          categoryField,\n          feature,\n          categoryMap,\n          categoryId,\n        });\n      }\n    }\n    for (const category in categoryMap) {\n      categoryMap[category].color = this.rainbow(\n        categoryId,\n        categoryMap[category].id,\n        0.7,\n      );\n    }\n    src.set('legendCategories', categoryMap);\n    for (let i = 0; i < features.length; i++) {\n      if (features[i].category_id) {\n        features[i].color = this.rainbow(\n          categoryId,\n          features[i].category_id,\n          0.7,\n        );\n      }\n    }\n    //console.log(features);\n    return features;\n  }\n\n  /**\n   * This function generates vibrant, \"evenly spaced\" colours (i.e. no clustering). This is ideal for creating easily distinguishable vibrant markers in Google Maps and other apps.\n   * Adam Cole, 2011-Sept-14\n   * HSV to RBG adapted from: http://mjijackson.com/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript\n   * based on http://stackoverflow.com/a/7419630\n   */\n  rainbow(numOfSteps: number, step: number, opacity: number) {\n    let r, g, b;\n    const h = step / (numOfSteps * 1.00000001);\n    const i = ~~(h * 4);\n    const f = h * 4 - i;\n    const q = 1 - f;\n    switch (i % 4) {\n      case 2:\n        r = f;\n        g = 1;\n        b = 0;\n        break;\n      case 0:\n        r = 0;\n        g = f;\n        b = 1;\n        break;\n      case 3:\n        r = 1;\n        g = q;\n        b = 0;\n        break;\n      case 1:\n        r = 0;\n        g = 1;\n        b = q;\n        break;\n      default:\n        r = 0;\n        g = 0;\n        b = 0;\n    }\n    const c =\n      'rgba(' +\n      ~~(r * 235) +\n      ',' +\n      ~~(g * 235) +\n      ',' +\n      ~~(b * 235) +\n      ', ' +\n      opacity +\n      ')';\n    return c;\n  }\n\n  /**\n   * FIXME: What is this?\n   */\n  registerCategoryForStatistics({\n    featureObject,\n    categoryField,\n    feature,\n    categoryMap,\n    categoryId,\n  }) {\n    if (featureObject[categoryField]) {\n      if (typeof categoryMap[featureObject[categoryField]] === 'undefined') {\n        categoryMap[featureObject[categoryField]] = {\n          id: categoryId,\n          name: featureObject[categoryField],\n        };\n        categoryId++;\n      }\n      feature.category_id = categoryMap[featureObject[categoryField]].id;\n    }\n  }\n\n  /**\n   * Converts arbitrary JSON form into a JSON compliant with a SPARQL Results JSON Spec, see https://www.w3.org/TR/sparql11-results-json/\n   * @param json - Output JSON of xml-js library\n   * @returns Standard-compliant SPARQL JSON\n   */\n  xmlJson2sparqlJson(json) {\n    return {\n      head: {\n        vars: json.elements[0].elements\n          .find((el) => el.name == 'head')\n          .elements.map((variable) => variable.attributes.name),\n      },\n      results: {\n        bindings: json.elements[0].elements\n          .find((el) => el.name == 'results')\n          .elements.map((result) => {\n            const res = {};\n            for (const binding of result.elements) {\n              res[binding.attributes.name] = {\n                type: binding.elements[0].name,\n                datatype: binding.elements[0].attributes?.datatype,\n                value: binding.elements[0].elements[0].text,\n                ['xml:lang']: binding.elements[0].attributes?.['xml:lang'],\n              };\n            }\n            return res;\n          }),\n      },\n    };\n  }\n}\n\nexport default SparqlJson;\n","import {SparqlJson, SparqlOptions} from './hs.source.SparqlJson';\n\nexport type SPOIOptions = {\n  /**\n   * One of SPOI categories. Can be ONLY ONE.\n   * @example 'cafe'\n   */\n  category: string;\n  projection: string;\n};\n\n/**\n * Handy shorthand for SparqlJson source with some params pre-filled for SPOI dataset\n */\nexport class SPOI extends SparqlJson {\n  constructor({category, projection}: SPOIOptions) {\n    const options: SparqlOptions = {\n      endpointUrl: 'https://www.foodie-cloud.org/sparql',\n      endpointOptions: {},\n      geomAttribute: '?geom',\n      optimization: 'virtuoso' as const,\n      projection: projection,\n      query: `\n        PREFIX poi: <http://www.openvoc.eu/poi#>\n        PREFIX spoi: <http://gis.zcu.cz/SPOI/Ontology#>\n        SELECT ?s ?p ?o\n        FROM <http://www.sdi4apps.eu/poi.rdf>\n        WHERE {\n          ?s <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> spoi:${category} .\n          ?s <http://www.opengis.net/ont/geosparql#asWKT> ?geom.\n          FILTER(isBlank(?geom) = false).\n          <extent>\n          ?s ?p ?o .\n        } ORDER BY ?s`,\n    };\n    super(options);\n  }\n}\n","import IDW from 'ol-ext/source/IDW';\nimport colormap from 'colormap';\nimport {Feature} from 'ol';\nimport {GeoJSON} from 'ol/format';\nimport {Geometry} from 'ol/geom';\nimport {LoadingStrategy} from 'ol/source/Vector';\nimport {Projection} from 'ol/proj';\nimport {Subject} from 'rxjs';\nimport {Vector as VectorSource} from 'ol/source';\nimport {containsExtent, equals} from 'ol/extent';\n\nexport const NORMALIZED_WEIGHT_PROPERTY_NAME = 'hs_normalized_IDW_value';\n\nexport interface IDWImageData {\n  type: 'image';\n  data: Uint8ClampedArray<ArrayBuffer>;\n  width: number;\n  height: number;\n}\n\nexport interface InterpolatedSourceOptions {\n  min?: number;\n  max?: number;\n  features?: Feature<Geometry>[];\n  weight: string;\n  loader?(params: any): Promise<Feature[]>;\n  colorMap?: ((v: number) => number[]) | string;\n  strategy?: LoadingStrategy;\n  maxFeaturesInExtent?: number;\n  maxFeaturesInCache?: number;\n}\n\nexport class InterpolatedSource extends IDW {\n  featureCache: VectorSource = new VectorSource({});\n  cancelUrlRequest: Subject<void> = new Subject();\n  colorMapChanged: Subject<void> = new Subject();\n  geoJSONFeatures: string[] = [];\n\n  constructor(public options: InterpolatedSourceOptions) {\n    super({\n      // Source that contains the data\n      workers: false,\n      source: new VectorSource({\n        strategy:\n          options.strategy != undefined\n            ? options.strategy\n            : (extent: number[], resolution) => {\n                const extentCache = super\n                  .getSource()\n                  .loadedExtentsRtree_.getAll()\n                  .map((item) => item.extent);\n                const toRemove = extentCache.filter(\n                  //Delete cached extents which contain this extent because they have their feature counts limited\n                  (cachedExt) =>\n                    !equals(cachedExt, extent) &&\n                    containsExtent(cachedExt, extent),\n                );\n                for (const extToRemove of toRemove) {\n                  super.getSource().removeLoadedExtent(extToRemove);\n                }\n                return [extent];\n              },\n        loader: async (extent, resolution, projection, success, failure) => {\n          if (options.loader) {\n            this.fillFeatures(\n              await options.loader({\n                extent,\n                resolution,\n                projection,\n                success,\n                failure,\n              }),\n              extent,\n            );\n          }\n        },\n      }),\n      weight: NORMALIZED_WEIGHT_PROPERTY_NAME,\n      getColor: getColorMapFromOptions(options),\n    });\n\n    if (options.features) {\n      this.fillFeatures(options.features);\n    }\n  }\n\n  /*\n   * Display data when ready\n   */\n  onImageData(imageData: IDWImageData) {\n    // Calculation canvas at small resolution\n    const canvas = <HTMLCanvasElement>document.createElement('CANVAS');\n    (this as any)._internal = canvas;\n\n    canvas.width = imageData.width;\n    canvas.height = imageData.height;\n\n    if (canvas.width < 5 || canvas.height < 5) {\n      return;\n    }\n    const ctx = canvas.getContext('2d');\n\n    if (this.isImageDataMostlyEmpty(imageData)) {\n      this.drawNoData(ctx, canvas);\n    } else {\n      ctx.putImageData(\n        new ImageData(imageData.data, imageData.width, imageData.height),\n        0,\n        0,\n      );\n    }\n\n    // Draw full resolution canvas\n    (this as any)._canvas\n      .getContext('2d')\n      .drawImage(\n        canvas,\n        0,\n        0,\n        (this as any)._canvas.width,\n        (this as any)._canvas.height,\n      );\n  }\n\n  /**\n   * Get Minimum boundary used in normalization. Values under this minimum are set to it (clamped)\n   */\n  get min(): number {\n    return this.options.min;\n  }\n\n  /**\n   * Set Minimum boundary used in normalization. Values under this minimum are set to it (clamped)\n   */\n  set min(value: number) {\n    this.options.min = value;\n    this.normalizeWeight(this.weight);\n    super.changed();\n  }\n\n  /**\n   * Get Maximum boundary used in normalization. Values over this minimum are set to it (clamped)\n   */\n  get max(): number {\n    return this.options.max;\n  }\n\n  /**\n   * Set Maximum boundary used in normalization. Values over this minimum are set to it (clamped)\n   */\n  set max(value: number) {\n    this.options.max = value;\n    this.normalizeWeight(this.weight);\n    super.changed();\n  }\n\n  get colorMap() {\n    return this.options.colorMap;\n  }\n\n  set colorMap(value: ((v: number) => number[]) | string) {\n    this.options.colorMap = value;\n    super.getColor = getColorMapFromOptions(this.options);\n    this.colorMapChanged.next();\n    super.changed();\n  }\n\n  /**\n   * Get the feature attribute used to get the values interpolated\n   */\n  get weight(): string {\n    return this.options.weight;\n  }\n\n  /**\n   * Set the feature attribute used to get the values interpolated\n   */\n  set weight(value: string) {\n    this.options.weight = value;\n    this.normalizeWeight(this.weight);\n    super.changed();\n  }\n\n  /**\n   * Fill Interpolated source features\n   * @param features - Parsed Ol features from get request\n   * @param extent - Current map extent\n   */\n  fillFeatures(features: Feature<Geometry>[], extent?: number[]) {\n    if (!features) {\n      return;\n    }\n    const featsCached = this.featureCache.getFeatures();\n    const cacheLimit = this.options.maxFeaturesInCache;\n    if (cacheLimit < featsCached.length + features.length) {\n      const cntToRemove = featsCached.length - (cacheLimit - features.length);\n      featsCached\n        .slice(0, cntToRemove)\n        .forEach((f) => this.featureCache.removeFeature(f));\n    }\n    const countToAdd = cacheLimit ?? Number.MAX_VALUE;\n    this.featureCache.addFeatures(features.slice(0, countToAdd));\n    this.normalizeWeight(this.options.weight);\n    const src = super.getSource();\n    if (extent) {\n      src.clear();\n      const limitInExt = this.options.maxFeaturesInExtent ?? Number.MAX_VALUE;\n      src.addFeatures(\n        this.featureCache.getFeaturesInExtent(extent).slice(0, limitInExt),\n      );\n    } else {\n      src.addFeatures(features);\n    }\n  }\n\n  /**\n   * Parse features from get request\n   * @param collection - Get request response feature collection\n   * @param mapProjection - Map projection\n   */\n  parseFeatures(collection: any, mapProjection: string | Projection): void {\n    if (collection?.features?.length > 0) {\n      const dataProj = (collection.crs || collection.srs) ?? 'EPSG:4326';\n      collection.features = collection.features.filter(\n        (f) => !this.geoJSONFeatures.includes(f),\n      );\n      this.geoJSONFeatures = this.geoJSONFeatures.concat(collection.features);\n      collection.features = new GeoJSON().readFeatures(collection, {\n        dataProjection: dataProj,\n        featureProjection: mapProjection,\n      });\n      collection.features = collection.features.filter((f) => {\n        const value = f.get(this.options.weight);\n        if (value && !isNaN(parseInt(value))) {\n          return f;\n        }\n      });\n      return collection.features;\n    }\n  }\n\n  /**\n   * Create url for get request including current map extent\n   * @param url - external source URL\n   * @param extent - Current map extent\n   */\n  createIDWSourceUrl(url: string, extent: number[]): string {\n    if (!url) {\n      return;\n    }\n    if (extent) {\n      const extentObj = [\n        {ref: 'minx', value: extent[0].toFixed(1)},\n        {ref: 'miny', value: extent[1].toFixed(1)},\n        {ref: 'maxx', value: extent[2].toFixed(1)},\n        {ref: 'maxy', value: extent[3].toFixed(1)},\n      ];\n      const matches = url.match(/{.+?}/g);\n      if (matches?.length > 0 && matches?.length <= 4) {\n        for (const m of matches) {\n          const ix = matches.indexOf(m);\n          const key = m.replace(/[{}]/g, '').toLowerCase();\n          const coord = extentObj.find((e) => e.ref === key) ?? extentObj[ix];\n          url = url.replace(m, coord.value);\n        }\n      }\n    }\n    return url;\n  }\n  /**\n   * Normalize weight values to be between 0 and 100\n   * //https://www.statology.org/normalize-data-between-0-and-100/\n   * @param weight - Weight property name\n   */\n  normalizeWeight(weight: string): void {\n    const features = this.featureCache.getFeatures();\n    const weightValues = features.map((f) => parseFloat(f.get(weight)));\n    const min = this.options.min ?? Math.min(...weightValues);\n    const max = this.options.max ?? Math.max(...weightValues);\n\n    features.forEach((f) => {\n      const val = Math.min(Math.max(f.get(weight), min), max); //https://www.webtips.dev/webtips/javascript/how-to-clamp-numbers-in-javascript\n      const normalizedWeight = Math.ceil(((val - min) / (max - min)) * 99);\n      f.set(NORMALIZED_WEIGHT_PROPERTY_NAME, normalizedWeight, true);\n    });\n  }\n\n  /**\n   * Determine whether the IDW canvas displays data or not\n   * by checking 4 pixels in predefined image areas\n   */\n  isImageDataMostlyEmpty(imageData: IDWImageData) {\n    const {width, height, data} = imageData;\n    const positions = [\n      // Corners\n      {x: 0, y: 0},\n      {x: width - 2, y: 0},\n      {x: 0, y: height - 2},\n      {x: width - 2, y: height - 2},\n      // Edges\n      {x: Math.floor(width / 2), y: 0},\n      {x: Math.floor(width / 2), y: height - 2},\n      {x: 0, y: Math.floor(height / 2)},\n      {x: width - 2, y: Math.floor(height / 2)},\n      // Center\n      {x: Math.floor(width / 2), y: Math.floor(height / 2)},\n      // Quadrants\n      {x: Math.floor(width / 4), y: Math.floor(height / 4)},\n      {x: Math.floor((3 * width) / 4), y: Math.floor(height / 4)},\n      {x: Math.floor(width / 4), y: Math.floor((3 * height) / 4)},\n      {x: Math.floor((3 * width) / 4), y: Math.floor((3 * height) / 4)},\n    ];\n\n    // Define offsets to check neighboring pixels\n    const offsets = [\n      {dx: 0, dy: 0},\n      {dx: 1, dy: 0},\n      {dx: 0, dy: 1},\n      {dx: 1, dy: 1},\n    ];\n\n    for (const pos of positions) {\n      for (const offset of offsets) {\n        const x = pos.x + offset.dx;\n        const y = pos.y + offset.dy;\n\n        // Ensure x and y are within bounds\n        if (x >= 0 && x < width && y >= 0 && y < height) {\n          const index = (y * width + x) * 4;\n\n          if (\n            data[index] !== 0 || // Red component\n            data[index + 1] !== 0 || // Green component\n            data[index + 2] !== 0 // Blue component\n            //data[index + 3] !== 255 // Alpha component\n          ) {\n            return false; // Found a pixel with data\n          }\n        }\n      }\n    }\n\n    return true;\n  }\n\n  /**\n   * Draw 'NO DATA' label over layers canvas\n   */\n  drawNoData(ctx, canvas) {\n    // Set the desired canvas size\n    const originalWidth = canvas.width;\n    const originalHeight = canvas.height;\n\n    // Get the device pixel ratio\n    const scale = window.devicePixelRatio || 1;\n\n    // Set the canvas width and height for high DPI\n    canvas.width = originalWidth * scale;\n    canvas.height = originalHeight * scale;\n\n    // Scale the context to match the canvas size\n    ctx.scale(scale, scale);\n\n    const text = 'NO DATA';\n    let fontSize = Math.min(30, Math.min(originalWidth, originalHeight) / 4);\n\n    // Set a minimum font size to prevent infinite loop\n    const minFontSize = 8;\n\n    ctx.font = `${fontSize}px Arial`;\n\n    // Measure the text width with padding (10px on each side)\n    let textWidth = ctx.measureText(text).width + 20;\n\n    // Adjust font size to fit within the canvas\n    const MAX_ITERATIONS = 10; // Prevent infinite loop\n    let iterations = 0;\n    while (\n      (textWidth > originalWidth * 0.9 * scale ||\n        fontSize > originalHeight * 0.9 * scale) &&\n      fontSize > minFontSize &&\n      iterations < MAX_ITERATIONS\n    ) {\n      fontSize = Math.max(fontSize - 2, minFontSize);\n      ctx.font = `${fontSize}px Arial`;\n      textWidth = ctx.measureText(text).width + 20;\n      iterations++;\n    }\n\n    ctx.fillStyle = 'white';\n    ctx.textAlign = 'center';\n    ctx.textBaseline = 'middle';\n\n    // Draw the text\n    ctx.fillText(text, originalWidth / 2, originalHeight / 2);\n  }\n}\n/**\n * Gets predefined colorMap array based on name and number of shades.\n * If you want to reverse defined color map add '-reverse' to the map name\n * @param name - Predefined color map name [https://github.com/bpostlethwaite/colormap]\n * @param nshades - Number of shades [default = 100]\n * @returns Array of colors\n */\nfunction generateColormap(name: string, nshades: number = 100): number[] {\n  const reverse = name.includes('-reverse');\n  name = reverse ? name.split('-reverse')[0] : name;\n  const cmap = colormap({\n    colormap: name,\n    nshades,\n    format: 'rgb',\n    alpha: 255,\n  }).map((v) => {\n    v[3] = 255;\n    return v;\n  });\n  return reverse ? cmap.reverse() : cmap;\n}\n\n/**\n * Creates a function to return value from predefined color maps if name of color map is provided\n */\nfunction getColorMap(mapName: string): (v: number) => number | number[] {\n  const clrMap = generateColormap(mapName);\n  return (v) => {\n    const black = [0, 0, 0, 255];\n    if (isNaN(v)) {\n      return black;\n    }\n    if (v > 99) {\n      v = 99;\n    }\n    if (v < 0) {\n      v = 0;\n    }\n    v = Math.floor(v);\n    return clrMap[v];\n  };\n}\n\n/**\n * Assingns colorMap function based on colorMap option used.\n * Predefined color maps if name of color map is provided\n * or uses the passed function directly.\n \n */\nfunction getColorMapFromOptions(\n  options: InterpolatedSourceOptions,\n): (v: number) => number | number[] {\n  let getColor;\n  if (typeof options.colorMap == 'string') {\n    getColor = getColorMap(options.colorMap);\n  } else {\n    getColor = options.colorMap;\n  }\n  return getColor;\n}\n\nexport default InterpolatedSource;\n","import {Extent} from 'ol/extent';\nimport {and, within} from 'ol/format/filter';\nimport {fromExtent} from 'ol/geom/Polygon';\n\n/**\n * Creates a POST feature request\n */\nexport async function createPostFeatureRequest(\n  layer_name: string,\n  data_version: string,\n  responseFeatureCRS: string,\n  featureNS: string,\n  output_format: string,\n  extent: Extent,\n  srs: string,\n  filter: any,\n  geometryName: string,\n): Promise<string> {\n  try {\n    const [prefix, layerName] = layer_name.split(':');\n\n    const {default: WFS} = await import('ol/format/WFS');\n    const wfs = new WFS({version: data_version});\n\n    const getFeatureOptions = {\n      srsName: responseFeatureCRS,\n      featureNS: featureNS,\n      featurePrefix: prefix,\n      featureTypes: [layerName],\n      outputFormat: output_format,\n    };\n\n    if (filter) {\n      getFeatureOptions['filter'] = extent\n        ? and(filter, within(geometryName, fromExtent(extent), srs))\n        : filter;\n    } else {\n      getFeatureOptions['bbox'] = extent.join(',') + ',' + srs;\n    }\n\n    const featureRequest = wfs.writeGetFeature(getFeatureOptions);\n    return new XMLSerializer().serializeToString(featureRequest);\n  } catch (error) {\n    console.error('Error creating POST feature request:', error);\n    throw new Error('Failed to create POST feature request');\n  }\n}\n\n/**\n * Creates parameters for a GET feature request\n */\nexport function createGetFeatureRequest(\n  layer_name: string,\n  data_version: string,\n  responseFeatureCRS: string,\n  output_format: string,\n  extent: Extent,\n  srs: string,\n): string {\n  try {\n    const params = {\n      service: 'wfs',\n      version: data_version,\n      request: 'GetFeature',\n      srsName: responseFeatureCRS,\n      output_format: output_format,\n    };\n    if (extent) {\n      params['BBOX'] = extent.join(',') + ',' + srs;\n    }\n    params[data_version.startsWith('1') ? 'typeName' : 'typeNames'] =\n      layer_name;\n\n    return new URLSearchParams(params).toString();\n  } catch (error) {\n    console.error('Error creating GET feature request:', error);\n    throw new Error('Failed to create GET feature request');\n  }\n}\n","import {Extent} from 'ol/extent';\nimport {Projection, transformExtent} from 'ol/proj';\nimport {Vector as VectorSource} from 'ol/source';\nimport {bbox, tile} from 'ol/loadingstrategy';\nimport {\n  createGetFeatureRequest,\n  createPostFeatureRequest,\n} from './wfs-get-feature';\nimport {createXYZ} from 'ol/tilegrid';\n\nexport type WfsOptions = {\n  /**\n   * If proxy is necessary to use in combination with this WFS layer's server,\n   * specify a path to the running instance of hslayers-server.\n   * This option is independent on HsConfig.proxyPrefix and HsConfig.useProxy.\n   * If left undefined or with an empty string, no proxy is used.\n   */\n  proxyPrefix?: string;\n  data_version?: string;\n  output_format?: string;\n  crs?: string;\n  provided_url?: string;\n  layer_name?: string;\n  featureNS?: string;\n  map_projection?: any;\n  layerExtent?: Extent;\n  withCredentials?: boolean;\n};\n\n/**\n * Provides a source of features from WFS endpoint\n */\nexport class WfsSource extends VectorSource {\n  constructor(private options: WfsOptions) {\n    super({\n      loader: async (extent, resolution, projection) => {\n        const {\n          proxyPrefix = '',\n          data_version = '1.0.0',\n          output_format = data_version === '1.0.0' ? 'GML2' : 'GML3',\n          crs,\n          provided_url,\n          layer_name,\n          featureNS,\n          map_projection,\n          layerExtent,\n          withCredentials = false,\n        } = this.options;\n\n        const srs = crs.toUpperCase();\n        const transformedExtent = transformExtentForWfs(\n          extent,\n          projection,\n          srs,\n          data_version,\n        );\n        /**\n         * Use fallback 3857 instead of 4326 as\n         * transformation from EPSG:4326 (to at least which was tested 3857) is seemingly not working properly.\n         * lat/lon expected while getting lon/lat\n         */\n        const responseFeatureCRS = srs.includes('4326') ? 'EPSG:3857' : srs;\n\n        const isPostRequest = this.get('filter');\n        const url = isPostRequest\n          ? `${proxyPrefix}${provided_url}`\n          : `${proxyPrefix}${provided_url}?${createGetFeatureRequest(\n              layer_name,\n              data_version,\n              responseFeatureCRS,\n              output_format,\n              transformedExtent,\n              srs,\n            )}`;\n\n        try {\n          const response = await getFeatures(\n            isPostRequest,\n            url,\n            isPostRequest\n              ? await createPostFeatureRequest(\n                  layer_name,\n                  data_version,\n                  responseFeatureCRS,\n                  featureNS,\n                  output_format,\n                  transformedExtent,\n                  srs,\n                  this.get('filter'),\n                  this.get('geometryAttribute'),\n                )\n              : null,\n            withCredentials,\n          );\n\n          const features = await readFeatures(\n            response,\n            map_projection,\n            data_version,\n            responseFeatureCRS,\n          );\n          this.addFeatures(features);\n          this.dispatchEvent('featuresloadend');\n        } catch (err) {\n          console.error('Error loading features:', err);\n          this.dispatchEvent('featuresloaderror');\n          this.removeLoadedExtent(extent);\n        }\n      },\n      strategy: options.layerExtent\n        ? tile(createXYZ({extent: options.layerExtent}))\n        : bbox,\n    });\n  }\n}\n\n/**\n * Transforms the extent based on the projection and WFS version\n */\nfunction transformExtentForWfs(\n  extent: Extent,\n  projection: Projection,\n  srs: string,\n  data_version: string,\n): Extent {\n  try {\n    let transformedExtent = transformExtent(extent, projection.getCode(), srs);\n    if (\n      //https://gis.stackexchange.com/questions/30602/openlayers-wfs-flip-coordinates\n      //WFS version 1.x uses lat/lon order while version 2.x uses lon/lat order\n      data_version.startsWith('1') &&\n      (srs.includes('4326') || srs.includes('4258'))\n    ) {\n      transformedExtent = [\n        transformedExtent[1],\n        transformedExtent[0],\n        transformedExtent[3],\n        transformedExtent[2],\n      ];\n    }\n    return transformedExtent;\n  } catch (error) {\n    console.error('Error transforming extent:', error);\n    throw new Error('Failed to transform extent');\n  }\n}\n\n/**\n * Fetches features from the WFS server\n */\nasync function getFeatures(\n  isPost: boolean,\n  url: string,\n  featureRequest: string | null,\n  withCredentials: boolean,\n): Promise<string> {\n  try {\n    const options: RequestInit = {\n      method: isPost ? 'POST' : 'GET',\n      headers: {\n        'Content-Type': 'application/xml',\n      },\n      credentials: withCredentials ? 'include' : 'omit',\n    };\n\n    if (isPost && featureRequest) {\n      options.body = featureRequest;\n    }\n\n    const response = await fetch(url, options);\n\n    if (!response.ok) {\n      throw new Error(`HTTP error ${response.status}: ${response.statusText}`);\n    }\n\n    return await response.text();\n  } catch (error) {\n    console.error('Error fetching features:', error);\n    throw new Error('Failed to fetch features');\n  }\n}\n\n/**\n * Reads features from the WFS response\n */\nasync function readFeatures(doc, map_projection, data_version, srs) {\n  try {\n    const {default: WFS} = await import('ol/format/WFS');\n    const wfs = new WFS({version: data_version});\n    const features = wfs.readFeatures(doc, {\n      dataProjection: srs,\n      featureProjection: map_projection.getCode() == srs ? '' : map_projection,\n    });\n    return features;\n  } catch (error) {\n    console.error('Error reading features:', error);\n    throw new Error('Failed to read features');\n  }\n}\n\nexport default WfsSource;\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["getProjection","VectorSource"],"mappings":"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"}