{"version":3,"file":"js/352-06666b54e762ddc5ebdd.js","mappings":"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","sources":["webpack://solvi-web/./node_modules/ol/Feature.js","webpack://solvi-web/./node_modules/ol/geom/flat/center.js","webpack://solvi-web/./node_modules/ol/geom/flat/interpolate.js","webpack://solvi-web/./node_modules/ol/geom/flat/length.js","webpack://solvi-web/./node_modules/ol/render/canvas/Instruction.js","webpack://solvi-web/./node_modules/ol/render/canvas/Builder.js","webpack://solvi-web/./node_modules/ol/render/canvas/ImageBuilder.js","webpack://solvi-web/./node_modules/ol/render/canvas/LineStringBuilder.js","webpack://solvi-web/./node_modules/ol/render/canvas/PolygonBuilder.js","webpack://solvi-web/./node_modules/ol/geom/flat/linechunk.js","webpack://solvi-web/./node_modules/ol/geom/flat/straightchunk.js","webpack://solvi-web/./node_modules/ol/render/canvas/TextBuilder.js","webpack://solvi-web/./node_modules/ol/render/canvas/BuilderGroup.js","webpack://solvi-web/./node_modules/ol/geom/flat/textpath.js","webpack://solvi-web/./node_modules/ol/render/canvas/Executor.js","webpack://solvi-web/./node_modules/ol/render/canvas/ExecutorGroup.js","webpack://solvi-web/./node_modules/ol/render/canvas/hitdetect.js","webpack://solvi-web/./node_modules/ol/renderer/canvas/VectorLayer.js","webpack://solvi-web/./node_modules/ol/layer/Vector.js","webpack://solvi-web/./node_modules/ol/render/Feature.js","webpack://solvi-web/./node_modules/ol/render/VectorContext.js","webpack://solvi-web/./node_modules/ol/render/canvas/Immediate.js","webpack://solvi-web/./node_modules/ol/renderer/vector.js","webpack://solvi-web/./node_modules/ol/loadingstrategy.js","webpack://solvi-web/./node_modules/ol/featureloader.js","webpack://solvi-web/./node_modules/ol/source/Vector.js","webpack://solvi-web/./node_modules/ol/source/VectorEventType.js","webpack://solvi-web/./node_modules/ol/structs/RBush.js"],"sourcesContent":["/**\n * @module ol/Feature\n */\nimport BaseObject from './Object.js';\nimport EventType from './events/EventType.js';\nimport {assert} from './asserts.js';\nimport {listen, unlistenByKey} from './events.js';\n\n/**\n * @typedef {typeof Feature|typeof import(\"./render/Feature.js\").default} FeatureClass\n */\n\n/**\n * @typedef {Feature|import(\"./render/Feature.js\").default} FeatureLike\n */\n\n/***\n * @template Return\n * @typedef {import(\"./Observable\").OnSignature &\n * import(\"./Observable\").OnSignature &\n * import(\"./Observable\").CombinedOnSignature} FeatureOnSignature\n */\n\n/***\n * @template {import(\"./geom/Geometry.js\").default} [Geometry=import(\"./geom/Geometry.js\").default]\n * @typedef {Object & { geometry?: Geometry }} ObjectWithGeometry\n */\n\n/**\n * @classdesc\n * A vector object for geographic features with a geometry and other\n * attribute properties, similar to the features in vector file formats like\n * GeoJSON.\n *\n * Features can be styled individually with `setStyle`; otherwise they use the\n * style of their vector layer.\n *\n * Note that attribute properties are set as {@link module:ol/Object~BaseObject} properties on\n * the feature object, so they are observable, and have get/set accessors.\n *\n * Typically, a feature has a single geometry property. You can set the\n * geometry using the `setGeometry` method and get it with `getGeometry`.\n * It is possible to store more than one geometry on a feature using attribute\n * properties. By default, the geometry used for rendering is identified by\n * the property name `geometry`. If you want to use another geometry property\n * for rendering, use the `setGeometryName` method to change the attribute\n * property associated with the geometry for the feature. For example:\n *\n * ```js\n *\n * import Feature from 'ol/Feature.js';\n * import Polygon from 'ol/geom/Polygon.js';\n * import Point from 'ol/geom/Point.js';\n *\n * const feature = new Feature({\n * geometry: new Polygon(polyCoords),\n * labelPoint: new Point(labelCoords),\n * name: 'My Polygon',\n * });\n *\n * // get the polygon geometry\n * const poly = feature.getGeometry();\n *\n * // Render the feature as a point using the coordinates from labelPoint\n * feature.setGeometryName('labelPoint');\n *\n * // get the point geometry\n * const point = feature.getGeometry();\n * ```\n *\n * @api\n * @template {import(\"./geom/Geometry.js\").default} [Geometry=import(\"./geom/Geometry.js\").default]\n */\nclass Feature extends BaseObject {\n /**\n * @param {Geometry|ObjectWithGeometry} [geometryOrProperties]\n * You may pass a Geometry object directly, or an object literal containing\n * properties. If you pass an object literal, you may include a Geometry\n * associated with a `geometry` key.\n */\n constructor(geometryOrProperties) {\n super();\n\n /***\n * @type {FeatureOnSignature}\n */\n this.on;\n\n /***\n * @type {FeatureOnSignature}\n */\n this.once;\n\n /***\n * @type {FeatureOnSignature}\n */\n this.un;\n\n /**\n * @private\n * @type {number|string|undefined}\n */\n this.id_ = undefined;\n\n /**\n * @type {string}\n * @private\n */\n this.geometryName_ = 'geometry';\n\n /**\n * User provided style.\n * @private\n * @type {import(\"./style/Style.js\").StyleLike}\n */\n this.style_ = null;\n\n /**\n * @private\n * @type {import(\"./style/Style.js\").StyleFunction|undefined}\n */\n this.styleFunction_ = undefined;\n\n /**\n * @private\n * @type {?import(\"./events.js\").EventsKey}\n */\n this.geometryChangeKey_ = null;\n\n this.addChangeListener(this.geometryName_, this.handleGeometryChanged_);\n\n if (geometryOrProperties) {\n if (\n typeof (\n /** @type {?} */ (geometryOrProperties).getSimplifiedGeometry\n ) === 'function'\n ) {\n const geometry = /** @type {Geometry} */ (geometryOrProperties);\n this.setGeometry(geometry);\n } else {\n /** @type {Object} */\n const properties = geometryOrProperties;\n this.setProperties(properties);\n }\n }\n }\n\n /**\n * Clone this feature. If the original feature has a geometry it\n * is also cloned. The feature id is not set in the clone.\n * @return {Feature} The clone.\n * @api\n */\n clone() {\n const clone = /** @type {Feature} */ (\n new Feature(this.hasProperties() ? this.getProperties() : null)\n );\n clone.setGeometryName(this.getGeometryName());\n const geometry = this.getGeometry();\n if (geometry) {\n clone.setGeometry(/** @type {Geometry} */ (geometry.clone()));\n }\n const style = this.getStyle();\n if (style) {\n clone.setStyle(style);\n }\n return clone;\n }\n\n /**\n * Get the feature's default geometry. A feature may have any number of named\n * geometries. The \"default\" geometry (the one that is rendered by default) is\n * set when calling {@link module:ol/Feature~Feature#setGeometry}.\n * @return {Geometry|undefined} The default geometry for the feature.\n * @api\n * @observable\n */\n getGeometry() {\n return /** @type {Geometry|undefined} */ (this.get(this.geometryName_));\n }\n\n /**\n * Get the feature identifier. This is a stable identifier for the feature and\n * is either set when reading data from a remote source or set explicitly by\n * calling {@link module:ol/Feature~Feature#setId}.\n * @return {number|string|undefined} Id.\n * @api\n */\n getId() {\n return this.id_;\n }\n\n /**\n * Get the name of the feature's default geometry. By default, the default\n * geometry is named `geometry`.\n * @return {string} Get the property name associated with the default geometry\n * for this feature.\n * @api\n */\n getGeometryName() {\n return this.geometryName_;\n }\n\n /**\n * Get the feature's style. Will return what was provided to the\n * {@link module:ol/Feature~Feature#setStyle} method.\n * @return {import(\"./style/Style.js\").StyleLike|undefined} The feature style.\n * @api\n */\n getStyle() {\n return this.style_;\n }\n\n /**\n * Get the feature's style function.\n * @return {import(\"./style/Style.js\").StyleFunction|undefined} Return a function\n * representing the current style of this feature.\n * @api\n */\n getStyleFunction() {\n return this.styleFunction_;\n }\n\n /**\n * @private\n */\n handleGeometryChange_() {\n this.changed();\n }\n\n /**\n * @private\n */\n handleGeometryChanged_() {\n if (this.geometryChangeKey_) {\n unlistenByKey(this.geometryChangeKey_);\n this.geometryChangeKey_ = null;\n }\n const geometry = this.getGeometry();\n if (geometry) {\n this.geometryChangeKey_ = listen(\n geometry,\n EventType.CHANGE,\n this.handleGeometryChange_,\n this,\n );\n }\n this.changed();\n }\n\n /**\n * Set the default geometry for the feature. This will update the property\n * with the name returned by {@link module:ol/Feature~Feature#getGeometryName}.\n * @param {Geometry|undefined} geometry The new geometry.\n * @api\n * @observable\n */\n setGeometry(geometry) {\n this.set(this.geometryName_, geometry);\n }\n\n /**\n * Set the style for the feature to override the layer style. This can be a\n * single style object, an array of styles, or a function that takes a\n * resolution and returns an array of styles. To unset the feature style, call\n * `setStyle()` without arguments or a falsey value.\n * @param {import(\"./style/Style.js\").StyleLike} [style] Style for this feature.\n * @api\n * @fires module:ol/events/Event~BaseEvent#event:change\n */\n setStyle(style) {\n this.style_ = style;\n this.styleFunction_ = !style ? undefined : createStyleFunction(style);\n this.changed();\n }\n\n /**\n * Set the feature id. The feature id is considered stable and may be used when\n * requesting features or comparing identifiers returned from a remote source.\n * The feature id can be used with the\n * {@link module:ol/source/Vector~VectorSource#getFeatureById} method.\n * @param {number|string|undefined} id The feature id.\n * @api\n * @fires module:ol/events/Event~BaseEvent#event:change\n */\n setId(id) {\n this.id_ = id;\n this.changed();\n }\n\n /**\n * Set the property name to be used when getting the feature's default geometry.\n * When calling {@link module:ol/Feature~Feature#getGeometry}, the value of the property with\n * this name will be returned.\n * @param {string} name The property name of the default geometry.\n * @api\n */\n setGeometryName(name) {\n this.removeChangeListener(this.geometryName_, this.handleGeometryChanged_);\n this.geometryName_ = name;\n this.addChangeListener(this.geometryName_, this.handleGeometryChanged_);\n this.handleGeometryChanged_();\n }\n}\n\n/**\n * Convert the provided object into a feature style function. Functions passed\n * through unchanged. Arrays of Style or single style objects wrapped\n * in a new feature style function.\n * @param {!import(\"./style/Style.js\").StyleFunction|!Array|!import(\"./style/Style.js\").default} obj\n * A feature style function, a single style, or an array of styles.\n * @return {import(\"./style/Style.js\").StyleFunction} A style function.\n */\nexport function createStyleFunction(obj) {\n if (typeof obj === 'function') {\n return obj;\n }\n /**\n * @type {Array}\n */\n let styles;\n if (Array.isArray(obj)) {\n styles = obj;\n } else {\n assert(\n typeof (/** @type {?} */ (obj).getZIndex) === 'function',\n 'Expected an `ol/style/Style` or an array of `ol/style/Style.js`',\n );\n const style = /** @type {import(\"./style/Style.js\").default} */ (obj);\n styles = [style];\n }\n return function () {\n return styles;\n };\n}\nexport default Feature;\n","/**\n * @module ol/geom/flat/center\n */\nimport {createEmpty, createOrUpdateFromFlatCoordinates} from '../../extent.js';\n\n/**\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {Array>} endss Endss.\n * @param {number} stride Stride.\n * @return {Array} Flat centers.\n */\nexport function linearRingss(flatCoordinates, offset, endss, stride) {\n const flatCenters = [];\n let extent = createEmpty();\n for (let i = 0, ii = endss.length; i < ii; ++i) {\n const ends = endss[i];\n extent = createOrUpdateFromFlatCoordinates(\n flatCoordinates,\n offset,\n ends[0],\n stride,\n );\n flatCenters.push((extent[0] + extent[2]) / 2, (extent[1] + extent[3]) / 2);\n offset = ends[ends.length - 1];\n }\n return flatCenters;\n}\n","/**\n * @module ol/geom/flat/interpolate\n */\nimport {binarySearch} from '../../array.js';\nimport {lerp} from '../../math.js';\n\n/**\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {number} end End.\n * @param {number} stride Stride.\n * @param {number} fraction Fraction.\n * @param {Array} [dest] Destination.\n * @param {number} [dimension] Destination dimension (default is `2`)\n * @return {Array} Destination.\n */\nexport function interpolatePoint(\n flatCoordinates,\n offset,\n end,\n stride,\n fraction,\n dest,\n dimension,\n) {\n let o, t;\n const n = (end - offset) / stride;\n if (n === 1) {\n o = offset;\n } else if (n === 2) {\n o = offset;\n t = fraction;\n } else if (n !== 0) {\n let x1 = flatCoordinates[offset];\n let y1 = flatCoordinates[offset + 1];\n let length = 0;\n const cumulativeLengths = [0];\n for (let i = offset + stride; i < end; i += stride) {\n const x2 = flatCoordinates[i];\n const y2 = flatCoordinates[i + 1];\n length += Math.sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1));\n cumulativeLengths.push(length);\n x1 = x2;\n y1 = y2;\n }\n const target = fraction * length;\n const index = binarySearch(cumulativeLengths, target);\n if (index < 0) {\n t =\n (target - cumulativeLengths[-index - 2]) /\n (cumulativeLengths[-index - 1] - cumulativeLengths[-index - 2]);\n o = offset + (-index - 2) * stride;\n } else {\n o = offset + index * stride;\n }\n }\n dimension = dimension > 1 ? dimension : 2;\n dest = dest ? dest : new Array(dimension);\n for (let i = 0; i < dimension; ++i) {\n dest[i] =\n o === undefined\n ? NaN\n : t === undefined\n ? flatCoordinates[o + i]\n : lerp(flatCoordinates[o + i], flatCoordinates[o + stride + i], t);\n }\n return dest;\n}\n\n/**\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {number} end End.\n * @param {number} stride Stride.\n * @param {number} m M.\n * @param {boolean} extrapolate Extrapolate.\n * @return {import(\"../../coordinate.js\").Coordinate|null} Coordinate.\n */\nexport function lineStringCoordinateAtM(\n flatCoordinates,\n offset,\n end,\n stride,\n m,\n extrapolate,\n) {\n if (end == offset) {\n return null;\n }\n let coordinate;\n if (m < flatCoordinates[offset + stride - 1]) {\n if (extrapolate) {\n coordinate = flatCoordinates.slice(offset, offset + stride);\n coordinate[stride - 1] = m;\n return coordinate;\n }\n return null;\n }\n if (flatCoordinates[end - 1] < m) {\n if (extrapolate) {\n coordinate = flatCoordinates.slice(end - stride, end);\n coordinate[stride - 1] = m;\n return coordinate;\n }\n return null;\n }\n // FIXME use O(1) search\n if (m == flatCoordinates[offset + stride - 1]) {\n return flatCoordinates.slice(offset, offset + stride);\n }\n let lo = offset / stride;\n let hi = end / stride;\n while (lo < hi) {\n const mid = (lo + hi) >> 1;\n if (m < flatCoordinates[(mid + 1) * stride - 1]) {\n hi = mid;\n } else {\n lo = mid + 1;\n }\n }\n const m0 = flatCoordinates[lo * stride - 1];\n if (m == m0) {\n return flatCoordinates.slice((lo - 1) * stride, (lo - 1) * stride + stride);\n }\n const m1 = flatCoordinates[(lo + 1) * stride - 1];\n const t = (m - m0) / (m1 - m0);\n coordinate = [];\n for (let i = 0; i < stride - 1; ++i) {\n coordinate.push(\n lerp(\n flatCoordinates[(lo - 1) * stride + i],\n flatCoordinates[lo * stride + i],\n t,\n ),\n );\n }\n coordinate.push(m);\n return coordinate;\n}\n\n/**\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {Array} ends Ends.\n * @param {number} stride Stride.\n * @param {number} m M.\n * @param {boolean} extrapolate Extrapolate.\n * @param {boolean} interpolate Interpolate.\n * @return {import(\"../../coordinate.js\").Coordinate|null} Coordinate.\n */\nexport function lineStringsCoordinateAtM(\n flatCoordinates,\n offset,\n ends,\n stride,\n m,\n extrapolate,\n interpolate,\n) {\n if (interpolate) {\n return lineStringCoordinateAtM(\n flatCoordinates,\n offset,\n ends[ends.length - 1],\n stride,\n m,\n extrapolate,\n );\n }\n let coordinate;\n if (m < flatCoordinates[stride - 1]) {\n if (extrapolate) {\n coordinate = flatCoordinates.slice(0, stride);\n coordinate[stride - 1] = m;\n return coordinate;\n }\n return null;\n }\n if (flatCoordinates[flatCoordinates.length - 1] < m) {\n if (extrapolate) {\n coordinate = flatCoordinates.slice(flatCoordinates.length - stride);\n coordinate[stride - 1] = m;\n return coordinate;\n }\n return null;\n }\n for (let i = 0, ii = ends.length; i < ii; ++i) {\n const end = ends[i];\n if (offset == end) {\n continue;\n }\n if (m < flatCoordinates[offset + stride - 1]) {\n return null;\n }\n if (m <= flatCoordinates[end - 1]) {\n return lineStringCoordinateAtM(\n flatCoordinates,\n offset,\n end,\n stride,\n m,\n false,\n );\n }\n offset = end;\n }\n return null;\n}\n","/**\n * @module ol/geom/flat/length\n */\n\n/**\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {number} end End.\n * @param {number} stride Stride.\n * @return {number} Length.\n */\nexport function lineStringLength(flatCoordinates, offset, end, stride) {\n let x1 = flatCoordinates[offset];\n let y1 = flatCoordinates[offset + 1];\n let length = 0;\n for (let i = offset + stride; i < end; i += stride) {\n const x2 = flatCoordinates[i];\n const y2 = flatCoordinates[i + 1];\n length += Math.sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1));\n x1 = x2;\n y1 = y2;\n }\n return length;\n}\n\n/**\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {number} end End.\n * @param {number} stride Stride.\n * @return {number} Perimeter.\n */\nexport function linearRingLength(flatCoordinates, offset, end, stride) {\n let perimeter = lineStringLength(flatCoordinates, offset, end, stride);\n const dx = flatCoordinates[end - stride] - flatCoordinates[offset];\n const dy = flatCoordinates[end - stride + 1] - flatCoordinates[offset + 1];\n perimeter += Math.sqrt(dx * dx + dy * dy);\n return perimeter;\n}\n","/**\n * @module ol/render/canvas/Instruction\n */\n\n/**\n * @enum {number}\n */\nconst Instruction = {\n BEGIN_GEOMETRY: 0,\n BEGIN_PATH: 1,\n CIRCLE: 2,\n CLOSE_PATH: 3,\n CUSTOM: 4,\n DRAW_CHARS: 5,\n DRAW_IMAGE: 6,\n END_GEOMETRY: 7,\n FILL: 8,\n MOVE_TO_LINE_TO: 9,\n SET_FILL_STYLE: 10,\n SET_STROKE_STYLE: 11,\n STROKE: 12,\n};\n\n/**\n * @type {Array}\n */\nexport const fillInstruction = [Instruction.FILL];\n\n/**\n * @type {Array}\n */\nexport const strokeInstruction = [Instruction.STROKE];\n\n/**\n * @type {Array}\n */\nexport const beginPathInstruction = [Instruction.BEGIN_PATH];\n\n/**\n * @type {Array}\n */\nexport const closePathInstruction = [Instruction.CLOSE_PATH];\n\nexport default Instruction;\n","/**\n * @module ol/render/canvas/Builder\n */\nimport CanvasInstruction from './Instruction.js';\nimport Relationship from '../../extent/Relationship.js';\nimport VectorContext from '../VectorContext.js';\nimport {asColorLike} from '../../colorlike.js';\nimport {\n buffer,\n clone,\n containsCoordinate,\n coordinateRelationship,\n} from '../../extent.js';\nimport {\n defaultFillStyle,\n defaultLineCap,\n defaultLineDash,\n defaultLineDashOffset,\n defaultLineJoin,\n defaultLineWidth,\n defaultMiterLimit,\n defaultStrokeStyle,\n} from '../canvas.js';\nimport {equals, reverseSubArray} from '../../array.js';\nimport {\n inflateCoordinates,\n inflateCoordinatesArray,\n inflateMultiCoordinatesArray,\n} from '../../geom/flat/inflate.js';\n\nclass CanvasBuilder extends VectorContext {\n /**\n * @param {number} tolerance Tolerance.\n * @param {import(\"../../extent.js\").Extent} maxExtent Maximum extent.\n * @param {number} resolution Resolution.\n * @param {number} pixelRatio Pixel ratio.\n */\n constructor(tolerance, maxExtent, resolution, pixelRatio) {\n super();\n\n /**\n * @protected\n * @type {number}\n */\n this.tolerance = tolerance;\n\n /**\n * @protected\n * @const\n * @type {import(\"../../extent.js\").Extent}\n */\n this.maxExtent = maxExtent;\n\n /**\n * @protected\n * @type {number}\n */\n this.pixelRatio = pixelRatio;\n\n /**\n * @protected\n * @type {number}\n */\n this.maxLineWidth = 0;\n\n /**\n * @protected\n * @const\n * @type {number}\n */\n this.resolution = resolution;\n\n /**\n * @private\n * @type {Array<*>}\n */\n this.beginGeometryInstruction1_ = null;\n\n /**\n * @private\n * @type {Array<*>}\n */\n this.beginGeometryInstruction2_ = null;\n\n /**\n * @private\n * @type {import(\"../../extent.js\").Extent}\n */\n this.bufferedMaxExtent_ = null;\n\n /**\n * @protected\n * @type {Array<*>}\n */\n this.instructions = [];\n\n /**\n * @protected\n * @type {Array}\n */\n this.coordinates = [];\n\n /**\n * @private\n * @type {import(\"../../coordinate.js\").Coordinate}\n */\n this.tmpCoordinate_ = [];\n\n /**\n * @protected\n * @type {Array<*>}\n */\n this.hitDetectionInstructions = [];\n\n /**\n * @protected\n * @type {import(\"../canvas.js\").FillStrokeState}\n */\n this.state = /** @type {import(\"../canvas.js\").FillStrokeState} */ ({});\n }\n\n /**\n * @protected\n * @param {Array} dashArray Dash array.\n * @return {Array} Dash array with pixel ratio applied\n */\n applyPixelRatio(dashArray) {\n const pixelRatio = this.pixelRatio;\n return pixelRatio == 1\n ? dashArray\n : dashArray.map(function (dash) {\n return dash * pixelRatio;\n });\n }\n\n /**\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} stride Stride.\n * @protected\n * @return {number} My end\n */\n appendFlatPointCoordinates(flatCoordinates, stride) {\n const extent = this.getBufferedMaxExtent();\n const tmpCoord = this.tmpCoordinate_;\n const coordinates = this.coordinates;\n let myEnd = coordinates.length;\n for (let i = 0, ii = flatCoordinates.length; i < ii; i += stride) {\n tmpCoord[0] = flatCoordinates[i];\n tmpCoord[1] = flatCoordinates[i + 1];\n if (containsCoordinate(extent, tmpCoord)) {\n coordinates[myEnd++] = tmpCoord[0];\n coordinates[myEnd++] = tmpCoord[1];\n }\n }\n return myEnd;\n }\n\n /**\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {number} end End.\n * @param {number} stride Stride.\n * @param {boolean} closed Last input coordinate equals first.\n * @param {boolean} skipFirst Skip first coordinate.\n * @protected\n * @return {number} My end.\n */\n appendFlatLineCoordinates(\n flatCoordinates,\n offset,\n end,\n stride,\n closed,\n skipFirst,\n ) {\n const coordinates = this.coordinates;\n let myEnd = coordinates.length;\n const extent = this.getBufferedMaxExtent();\n if (skipFirst) {\n offset += stride;\n }\n let lastXCoord = flatCoordinates[offset];\n let lastYCoord = flatCoordinates[offset + 1];\n const nextCoord = this.tmpCoordinate_;\n let skipped = true;\n\n let i, lastRel, nextRel;\n for (i = offset + stride; i < end; i += stride) {\n nextCoord[0] = flatCoordinates[i];\n nextCoord[1] = flatCoordinates[i + 1];\n nextRel = coordinateRelationship(extent, nextCoord);\n if (nextRel !== lastRel) {\n if (skipped) {\n coordinates[myEnd++] = lastXCoord;\n coordinates[myEnd++] = lastYCoord;\n skipped = false;\n }\n coordinates[myEnd++] = nextCoord[0];\n coordinates[myEnd++] = nextCoord[1];\n } else if (nextRel === Relationship.INTERSECTING) {\n coordinates[myEnd++] = nextCoord[0];\n coordinates[myEnd++] = nextCoord[1];\n skipped = false;\n } else {\n skipped = true;\n }\n lastXCoord = nextCoord[0];\n lastYCoord = nextCoord[1];\n lastRel = nextRel;\n }\n\n // Last coordinate equals first or only one point to append:\n if ((closed && skipped) || i === offset + stride) {\n coordinates[myEnd++] = lastXCoord;\n coordinates[myEnd++] = lastYCoord;\n }\n return myEnd;\n }\n\n /**\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {Array} ends Ends.\n * @param {number} stride Stride.\n * @param {Array} builderEnds Builder ends.\n * @return {number} Offset.\n */\n drawCustomCoordinates_(flatCoordinates, offset, ends, stride, builderEnds) {\n for (let i = 0, ii = ends.length; i < ii; ++i) {\n const end = ends[i];\n const builderEnd = this.appendFlatLineCoordinates(\n flatCoordinates,\n offset,\n end,\n stride,\n false,\n false,\n );\n builderEnds.push(builderEnd);\n offset = end;\n }\n return offset;\n }\n\n /**\n * @param {import(\"../../geom/SimpleGeometry.js\").default} geometry Geometry.\n * @param {import(\"../../Feature.js\").FeatureLike} feature Feature.\n * @param {Function} renderer Renderer.\n * @param {Function} hitDetectionRenderer Renderer.\n * @param {number} [index] Render order index.\n * @override\n */\n drawCustom(geometry, feature, renderer, hitDetectionRenderer, index) {\n this.beginGeometry(geometry, feature, index);\n\n const type = geometry.getType();\n const stride = geometry.getStride();\n const builderBegin = this.coordinates.length;\n\n let flatCoordinates, builderEnd, builderEnds, builderEndss;\n let offset;\n\n switch (type) {\n case 'MultiPolygon':\n flatCoordinates =\n /** @type {import(\"../../geom/MultiPolygon.js\").default} */ (\n geometry\n ).getOrientedFlatCoordinates();\n builderEndss = [];\n const endss =\n /** @type {import(\"../../geom/MultiPolygon.js\").default} */ (\n geometry\n ).getEndss();\n offset = 0;\n for (let i = 0, ii = endss.length; i < ii; ++i) {\n const myEnds = [];\n offset = this.drawCustomCoordinates_(\n flatCoordinates,\n offset,\n endss[i],\n stride,\n myEnds,\n );\n builderEndss.push(myEnds);\n }\n this.instructions.push([\n CanvasInstruction.CUSTOM,\n builderBegin,\n builderEndss,\n geometry,\n renderer,\n inflateMultiCoordinatesArray,\n index,\n ]);\n this.hitDetectionInstructions.push([\n CanvasInstruction.CUSTOM,\n builderBegin,\n builderEndss,\n geometry,\n hitDetectionRenderer || renderer,\n inflateMultiCoordinatesArray,\n index,\n ]);\n break;\n case 'Polygon':\n case 'MultiLineString':\n builderEnds = [];\n flatCoordinates =\n type == 'Polygon'\n ? /** @type {import(\"../../geom/Polygon.js\").default} */ (\n geometry\n ).getOrientedFlatCoordinates()\n : geometry.getFlatCoordinates();\n offset = this.drawCustomCoordinates_(\n flatCoordinates,\n 0,\n /** @type {import(\"../../geom/Polygon.js\").default|import(\"../../geom/MultiLineString.js\").default} */ (\n geometry\n ).getEnds(),\n stride,\n builderEnds,\n );\n this.instructions.push([\n CanvasInstruction.CUSTOM,\n builderBegin,\n builderEnds,\n geometry,\n renderer,\n inflateCoordinatesArray,\n index,\n ]);\n this.hitDetectionInstructions.push([\n CanvasInstruction.CUSTOM,\n builderBegin,\n builderEnds,\n geometry,\n hitDetectionRenderer || renderer,\n inflateCoordinatesArray,\n index,\n ]);\n break;\n case 'LineString':\n case 'Circle':\n flatCoordinates = geometry.getFlatCoordinates();\n builderEnd = this.appendFlatLineCoordinates(\n flatCoordinates,\n 0,\n flatCoordinates.length,\n stride,\n false,\n false,\n );\n this.instructions.push([\n CanvasInstruction.CUSTOM,\n builderBegin,\n builderEnd,\n geometry,\n renderer,\n inflateCoordinates,\n index,\n ]);\n this.hitDetectionInstructions.push([\n CanvasInstruction.CUSTOM,\n builderBegin,\n builderEnd,\n geometry,\n hitDetectionRenderer || renderer,\n inflateCoordinates,\n index,\n ]);\n break;\n case 'MultiPoint':\n flatCoordinates = geometry.getFlatCoordinates();\n builderEnd = this.appendFlatPointCoordinates(flatCoordinates, stride);\n\n if (builderEnd > builderBegin) {\n this.instructions.push([\n CanvasInstruction.CUSTOM,\n builderBegin,\n builderEnd,\n geometry,\n renderer,\n inflateCoordinates,\n index,\n ]);\n this.hitDetectionInstructions.push([\n CanvasInstruction.CUSTOM,\n builderBegin,\n builderEnd,\n geometry,\n hitDetectionRenderer || renderer,\n inflateCoordinates,\n index,\n ]);\n }\n break;\n case 'Point':\n flatCoordinates = geometry.getFlatCoordinates();\n this.coordinates.push(flatCoordinates[0], flatCoordinates[1]);\n builderEnd = this.coordinates.length;\n\n this.instructions.push([\n CanvasInstruction.CUSTOM,\n builderBegin,\n builderEnd,\n geometry,\n renderer,\n undefined,\n index,\n ]);\n this.hitDetectionInstructions.push([\n CanvasInstruction.CUSTOM,\n builderBegin,\n builderEnd,\n geometry,\n hitDetectionRenderer || renderer,\n undefined,\n index,\n ]);\n break;\n default:\n }\n this.endGeometry(feature);\n }\n\n /**\n * @protected\n * @param {import(\"../../geom/Geometry\").default|import(\"../Feature.js\").default} geometry The geometry.\n * @param {import(\"../../Feature.js\").FeatureLike} feature Feature.\n * @param {number} index Render order index\n */\n beginGeometry(geometry, feature, index) {\n this.beginGeometryInstruction1_ = [\n CanvasInstruction.BEGIN_GEOMETRY,\n feature,\n 0,\n geometry,\n index,\n ];\n this.instructions.push(this.beginGeometryInstruction1_);\n this.beginGeometryInstruction2_ = [\n CanvasInstruction.BEGIN_GEOMETRY,\n feature,\n 0,\n geometry,\n index,\n ];\n this.hitDetectionInstructions.push(this.beginGeometryInstruction2_);\n }\n\n /**\n * @return {import(\"../canvas.js\").SerializableInstructions} the serializable instructions.\n */\n finish() {\n return {\n instructions: this.instructions,\n hitDetectionInstructions: this.hitDetectionInstructions,\n coordinates: this.coordinates,\n };\n }\n\n /**\n * Reverse the hit detection instructions.\n */\n reverseHitDetectionInstructions() {\n const hitDetectionInstructions = this.hitDetectionInstructions;\n // step 1 - reverse array\n hitDetectionInstructions.reverse();\n // step 2 - reverse instructions within geometry blocks\n let i;\n const n = hitDetectionInstructions.length;\n let instruction;\n let type;\n let begin = -1;\n for (i = 0; i < n; ++i) {\n instruction = hitDetectionInstructions[i];\n type = /** @type {import(\"./Instruction.js\").default} */ (instruction[0]);\n if (type == CanvasInstruction.END_GEOMETRY) {\n begin = i;\n } else if (type == CanvasInstruction.BEGIN_GEOMETRY) {\n instruction[2] = i;\n reverseSubArray(this.hitDetectionInstructions, begin, i);\n begin = -1;\n }\n }\n }\n\n /**\n * @param {import(\"../../style/Fill.js\").default} fillStyle Fill style.\n * @param {import(\"../../style/Stroke.js\").default} strokeStyle Stroke style.\n * @override\n */\n setFillStrokeStyle(fillStyle, strokeStyle) {\n const state = this.state;\n if (fillStyle) {\n const fillStyleColor = fillStyle.getColor();\n state.fillPatternScale =\n fillStyleColor &&\n typeof fillStyleColor === 'object' &&\n 'src' in fillStyleColor\n ? this.pixelRatio\n : 1;\n state.fillStyle = asColorLike(\n fillStyleColor ? fillStyleColor : defaultFillStyle,\n );\n } else {\n state.fillStyle = undefined;\n }\n if (strokeStyle) {\n const strokeStyleColor = strokeStyle.getColor();\n state.strokeStyle = asColorLike(\n strokeStyleColor ? strokeStyleColor : defaultStrokeStyle,\n );\n const strokeStyleLineCap = strokeStyle.getLineCap();\n state.lineCap =\n strokeStyleLineCap !== undefined ? strokeStyleLineCap : defaultLineCap;\n const strokeStyleLineDash = strokeStyle.getLineDash();\n state.lineDash = strokeStyleLineDash\n ? strokeStyleLineDash.slice()\n : defaultLineDash;\n const strokeStyleLineDashOffset = strokeStyle.getLineDashOffset();\n state.lineDashOffset = strokeStyleLineDashOffset\n ? strokeStyleLineDashOffset\n : defaultLineDashOffset;\n const strokeStyleLineJoin = strokeStyle.getLineJoin();\n state.lineJoin =\n strokeStyleLineJoin !== undefined\n ? strokeStyleLineJoin\n : defaultLineJoin;\n const strokeStyleWidth = strokeStyle.getWidth();\n state.lineWidth =\n strokeStyleWidth !== undefined ? strokeStyleWidth : defaultLineWidth;\n const strokeStyleMiterLimit = strokeStyle.getMiterLimit();\n state.miterLimit =\n strokeStyleMiterLimit !== undefined\n ? strokeStyleMiterLimit\n : defaultMiterLimit;\n\n if (state.lineWidth > this.maxLineWidth) {\n this.maxLineWidth = state.lineWidth;\n // invalidate the buffered max extent cache\n this.bufferedMaxExtent_ = null;\n }\n } else {\n state.strokeStyle = undefined;\n state.lineCap = undefined;\n state.lineDash = null;\n state.lineDashOffset = undefined;\n state.lineJoin = undefined;\n state.lineWidth = undefined;\n state.miterLimit = undefined;\n }\n }\n\n /**\n * @param {import(\"../canvas.js\").FillStrokeState} state State.\n * @return {Array<*>} Fill instruction.\n */\n createFill(state) {\n const fillStyle = state.fillStyle;\n /** @type {Array<*>} */\n const fillInstruction = [CanvasInstruction.SET_FILL_STYLE, fillStyle];\n if (typeof fillStyle !== 'string') {\n // Fill is a pattern or gradient - align and scale it!\n fillInstruction.push(state.fillPatternScale);\n }\n return fillInstruction;\n }\n\n /**\n * @param {import(\"../canvas.js\").FillStrokeState} state State.\n */\n applyStroke(state) {\n this.instructions.push(this.createStroke(state));\n }\n\n /**\n * @param {import(\"../canvas.js\").FillStrokeState} state State.\n * @return {Array<*>} Stroke instruction.\n */\n createStroke(state) {\n return [\n CanvasInstruction.SET_STROKE_STYLE,\n state.strokeStyle,\n state.lineWidth * this.pixelRatio,\n state.lineCap,\n state.lineJoin,\n state.miterLimit,\n this.applyPixelRatio(state.lineDash),\n state.lineDashOffset * this.pixelRatio,\n ];\n }\n\n /**\n * @param {import(\"../canvas.js\").FillStrokeState} state State.\n * @param {function(this:CanvasBuilder, import(\"../canvas.js\").FillStrokeState):Array<*>} createFill Create fill.\n */\n updateFillStyle(state, createFill) {\n const fillStyle = state.fillStyle;\n if (typeof fillStyle !== 'string' || state.currentFillStyle != fillStyle) {\n if (fillStyle !== undefined) {\n this.instructions.push(createFill.call(this, state));\n }\n state.currentFillStyle = fillStyle;\n }\n }\n\n /**\n * @param {import(\"../canvas.js\").FillStrokeState} state State.\n * @param {function(this:CanvasBuilder, import(\"../canvas.js\").FillStrokeState): void} applyStroke Apply stroke.\n */\n updateStrokeStyle(state, applyStroke) {\n const strokeStyle = state.strokeStyle;\n const lineCap = state.lineCap;\n const lineDash = state.lineDash;\n const lineDashOffset = state.lineDashOffset;\n const lineJoin = state.lineJoin;\n const lineWidth = state.lineWidth;\n const miterLimit = state.miterLimit;\n if (\n state.currentStrokeStyle != strokeStyle ||\n state.currentLineCap != lineCap ||\n (lineDash != state.currentLineDash &&\n !equals(state.currentLineDash, lineDash)) ||\n state.currentLineDashOffset != lineDashOffset ||\n state.currentLineJoin != lineJoin ||\n state.currentLineWidth != lineWidth ||\n state.currentMiterLimit != miterLimit\n ) {\n if (strokeStyle !== undefined) {\n applyStroke.call(this, state);\n }\n state.currentStrokeStyle = strokeStyle;\n state.currentLineCap = lineCap;\n state.currentLineDash = lineDash;\n state.currentLineDashOffset = lineDashOffset;\n state.currentLineJoin = lineJoin;\n state.currentLineWidth = lineWidth;\n state.currentMiterLimit = miterLimit;\n }\n }\n\n /**\n * @param {import(\"../../Feature.js\").FeatureLike} feature Feature.\n */\n endGeometry(feature) {\n this.beginGeometryInstruction1_[2] = this.instructions.length;\n this.beginGeometryInstruction1_ = null;\n this.beginGeometryInstruction2_[2] = this.hitDetectionInstructions.length;\n this.beginGeometryInstruction2_ = null;\n const endGeometryInstruction = [CanvasInstruction.END_GEOMETRY, feature];\n this.instructions.push(endGeometryInstruction);\n this.hitDetectionInstructions.push(endGeometryInstruction);\n }\n\n /**\n * Get the buffered rendering extent. Rendering will be clipped to the extent\n * provided to the constructor. To account for symbolizers that may intersect\n * this extent, we calculate a buffered extent (e.g. based on stroke width).\n * @return {import(\"../../extent.js\").Extent} The buffered rendering extent.\n * @protected\n */\n getBufferedMaxExtent() {\n if (!this.bufferedMaxExtent_) {\n this.bufferedMaxExtent_ = clone(this.maxExtent);\n if (this.maxLineWidth > 0) {\n const width = (this.resolution * (this.maxLineWidth + 1)) / 2;\n buffer(this.bufferedMaxExtent_, width, this.bufferedMaxExtent_);\n }\n }\n return this.bufferedMaxExtent_;\n }\n}\n\nexport default CanvasBuilder;\n","/**\n * @module ol/render/canvas/ImageBuilder\n */\nimport CanvasBuilder from './Builder.js';\nimport CanvasInstruction from './Instruction.js';\nimport {containsCoordinate} from '../../extent.js';\n\nclass CanvasImageBuilder extends CanvasBuilder {\n /**\n * @param {number} tolerance Tolerance.\n * @param {import(\"../../extent.js\").Extent} maxExtent Maximum extent.\n * @param {number} resolution Resolution.\n * @param {number} pixelRatio Pixel ratio.\n */\n constructor(tolerance, maxExtent, resolution, pixelRatio) {\n super(tolerance, maxExtent, resolution, pixelRatio);\n\n /**\n * @private\n * @type {import('../../DataTile.js').ImageLike}\n */\n this.hitDetectionImage_ = null;\n\n /**\n * @private\n * @type {import('../../DataTile.js').ImageLike}\n */\n this.image_ = null;\n\n /**\n * @private\n * @type {number|undefined}\n */\n this.imagePixelRatio_ = undefined;\n\n /**\n * @private\n * @type {number|undefined}\n */\n this.anchorX_ = undefined;\n\n /**\n * @private\n * @type {number|undefined}\n */\n this.anchorY_ = undefined;\n\n /**\n * @private\n * @type {number|undefined}\n */\n this.height_ = undefined;\n\n /**\n * @private\n * @type {number|undefined}\n */\n this.opacity_ = undefined;\n\n /**\n * @private\n * @type {number|undefined}\n */\n this.originX_ = undefined;\n\n /**\n * @private\n * @type {number|undefined}\n */\n this.originY_ = undefined;\n\n /**\n * @private\n * @type {boolean|undefined}\n */\n this.rotateWithView_ = undefined;\n\n /**\n * @private\n * @type {number|undefined}\n */\n this.rotation_ = undefined;\n\n /**\n * @private\n * @type {import(\"../../size.js\").Size|undefined}\n */\n this.scale_ = undefined;\n\n /**\n * @private\n * @type {number|undefined}\n */\n this.width_ = undefined;\n\n /**\n * @private\n * @type {import('../../style/Style.js').DeclutterMode}\n */\n this.declutterMode_ = undefined;\n\n /**\n * Data shared with a text builder for combined decluttering.\n * @private\n * @type {import(\"../canvas.js\").DeclutterImageWithText}\n */\n this.declutterImageWithText_ = undefined;\n }\n\n /**\n * @param {import(\"../../geom/Point.js\").default|import(\"../Feature.js\").default} pointGeometry Point geometry.\n * @param {import(\"../../Feature.js\").FeatureLike} feature Feature.\n * @param {number} [index] Render order index.\n * @override\n */\n drawPoint(pointGeometry, feature, index) {\n if (\n !this.image_ ||\n (this.maxExtent &&\n !containsCoordinate(this.maxExtent, pointGeometry.getFlatCoordinates()))\n ) {\n return;\n }\n this.beginGeometry(pointGeometry, feature, index);\n const flatCoordinates = pointGeometry.getFlatCoordinates();\n const stride = pointGeometry.getStride();\n const myBegin = this.coordinates.length;\n const myEnd = this.appendFlatPointCoordinates(flatCoordinates, stride);\n this.instructions.push([\n CanvasInstruction.DRAW_IMAGE,\n myBegin,\n myEnd,\n this.image_,\n // Remaining arguments to DRAW_IMAGE are in alphabetical order\n this.anchorX_ * this.imagePixelRatio_,\n this.anchorY_ * this.imagePixelRatio_,\n Math.ceil(this.height_ * this.imagePixelRatio_),\n this.opacity_,\n this.originX_ * this.imagePixelRatio_,\n this.originY_ * this.imagePixelRatio_,\n this.rotateWithView_,\n this.rotation_,\n [\n (this.scale_[0] * this.pixelRatio) / this.imagePixelRatio_,\n (this.scale_[1] * this.pixelRatio) / this.imagePixelRatio_,\n ],\n Math.ceil(this.width_ * this.imagePixelRatio_),\n this.declutterMode_,\n this.declutterImageWithText_,\n ]);\n this.hitDetectionInstructions.push([\n CanvasInstruction.DRAW_IMAGE,\n myBegin,\n myEnd,\n this.hitDetectionImage_,\n // Remaining arguments to DRAW_IMAGE are in alphabetical order\n this.anchorX_,\n this.anchorY_,\n this.height_,\n 1,\n this.originX_,\n this.originY_,\n this.rotateWithView_,\n this.rotation_,\n this.scale_,\n this.width_,\n this.declutterMode_,\n this.declutterImageWithText_,\n ]);\n this.endGeometry(feature);\n }\n\n /**\n * @param {import(\"../../geom/MultiPoint.js\").default|import(\"../Feature.js\").default} multiPointGeometry MultiPoint geometry.\n * @param {import(\"../../Feature.js\").FeatureLike} feature Feature.\n * @param {number} [index] Render order index.\n * @override\n */\n drawMultiPoint(multiPointGeometry, feature, index) {\n if (!this.image_) {\n return;\n }\n this.beginGeometry(multiPointGeometry, feature, index);\n const flatCoordinates = multiPointGeometry.getFlatCoordinates();\n const filteredFlatCoordinates = [];\n for (\n let i = 0, ii = flatCoordinates.length;\n i < ii;\n i += multiPointGeometry.getStride()\n ) {\n if (\n !this.maxExtent ||\n containsCoordinate(this.maxExtent, flatCoordinates.slice(i, i + 2))\n ) {\n filteredFlatCoordinates.push(\n flatCoordinates[i],\n flatCoordinates[i + 1],\n );\n }\n }\n const myBegin = this.coordinates.length;\n const myEnd = this.appendFlatPointCoordinates(filteredFlatCoordinates, 2);\n this.instructions.push([\n CanvasInstruction.DRAW_IMAGE,\n myBegin,\n myEnd,\n this.image_,\n // Remaining arguments to DRAW_IMAGE are in alphabetical order\n this.anchorX_ * this.imagePixelRatio_,\n this.anchorY_ * this.imagePixelRatio_,\n Math.ceil(this.height_ * this.imagePixelRatio_),\n this.opacity_,\n this.originX_ * this.imagePixelRatio_,\n this.originY_ * this.imagePixelRatio_,\n this.rotateWithView_,\n this.rotation_,\n [\n (this.scale_[0] * this.pixelRatio) / this.imagePixelRatio_,\n (this.scale_[1] * this.pixelRatio) / this.imagePixelRatio_,\n ],\n Math.ceil(this.width_ * this.imagePixelRatio_),\n this.declutterMode_,\n this.declutterImageWithText_,\n ]);\n this.hitDetectionInstructions.push([\n CanvasInstruction.DRAW_IMAGE,\n myBegin,\n myEnd,\n this.hitDetectionImage_,\n // Remaining arguments to DRAW_IMAGE are in alphabetical order\n this.anchorX_,\n this.anchorY_,\n this.height_,\n 1,\n this.originX_,\n this.originY_,\n this.rotateWithView_,\n this.rotation_,\n this.scale_,\n this.width_,\n this.declutterMode_,\n this.declutterImageWithText_,\n ]);\n this.endGeometry(feature);\n }\n\n /**\n * @return {import(\"../canvas.js\").SerializableInstructions} the serializable instructions.\n * @override\n */\n finish() {\n this.reverseHitDetectionInstructions();\n // FIXME this doesn't really protect us against further calls to draw*Geometry\n this.anchorX_ = undefined;\n this.anchorY_ = undefined;\n this.hitDetectionImage_ = null;\n this.image_ = null;\n this.imagePixelRatio_ = undefined;\n this.height_ = undefined;\n this.scale_ = undefined;\n this.opacity_ = undefined;\n this.originX_ = undefined;\n this.originY_ = undefined;\n this.rotateWithView_ = undefined;\n this.rotation_ = undefined;\n this.width_ = undefined;\n return super.finish();\n }\n\n /**\n * @param {import(\"../../style/Image.js\").default} imageStyle Image style.\n * @param {Object} [sharedData] Shared data.\n * @override\n */\n setImageStyle(imageStyle, sharedData) {\n const anchor = imageStyle.getAnchor();\n const size = imageStyle.getSize();\n const origin = imageStyle.getOrigin();\n this.imagePixelRatio_ = imageStyle.getPixelRatio(this.pixelRatio);\n this.anchorX_ = anchor[0];\n this.anchorY_ = anchor[1];\n this.hitDetectionImage_ = imageStyle.getHitDetectionImage();\n this.image_ = imageStyle.getImage(this.pixelRatio);\n this.height_ = size[1];\n this.opacity_ = imageStyle.getOpacity();\n this.originX_ = origin[0];\n this.originY_ = origin[1];\n this.rotateWithView_ = imageStyle.getRotateWithView();\n this.rotation_ = imageStyle.getRotation();\n this.scale_ = imageStyle.getScaleArray();\n this.width_ = size[0];\n this.declutterMode_ = imageStyle.getDeclutterMode();\n this.declutterImageWithText_ = sharedData;\n }\n}\n\nexport default CanvasImageBuilder;\n","/**\n * @module ol/render/canvas/LineStringBuilder\n */\nimport CanvasBuilder from './Builder.js';\nimport CanvasInstruction, {\n beginPathInstruction,\n strokeInstruction,\n} from './Instruction.js';\nimport {defaultLineDash, defaultLineDashOffset} from '../canvas.js';\n\nclass CanvasLineStringBuilder extends CanvasBuilder {\n /**\n * @param {number} tolerance Tolerance.\n * @param {import(\"../../extent.js\").Extent} maxExtent Maximum extent.\n * @param {number} resolution Resolution.\n * @param {number} pixelRatio Pixel ratio.\n */\n constructor(tolerance, maxExtent, resolution, pixelRatio) {\n super(tolerance, maxExtent, resolution, pixelRatio);\n }\n\n /**\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {number} end End.\n * @param {number} stride Stride.\n * @private\n * @return {number} end.\n */\n drawFlatCoordinates_(flatCoordinates, offset, end, stride) {\n const myBegin = this.coordinates.length;\n const myEnd = this.appendFlatLineCoordinates(\n flatCoordinates,\n offset,\n end,\n stride,\n false,\n false,\n );\n const moveToLineToInstruction = [\n CanvasInstruction.MOVE_TO_LINE_TO,\n myBegin,\n myEnd,\n ];\n this.instructions.push(moveToLineToInstruction);\n this.hitDetectionInstructions.push(moveToLineToInstruction);\n return end;\n }\n\n /**\n * @param {import(\"../../geom/LineString.js\").default|import(\"../Feature.js\").default} lineStringGeometry Line string geometry.\n * @param {import(\"../../Feature.js\").FeatureLike} feature Feature.\n * @param {number} [index] Render order index.\n * @override\n */\n drawLineString(lineStringGeometry, feature, index) {\n const state = this.state;\n const strokeStyle = state.strokeStyle;\n const lineWidth = state.lineWidth;\n if (strokeStyle === undefined || lineWidth === undefined) {\n return;\n }\n this.updateStrokeStyle(state, this.applyStroke);\n this.beginGeometry(lineStringGeometry, feature, index);\n this.hitDetectionInstructions.push(\n [\n CanvasInstruction.SET_STROKE_STYLE,\n state.strokeStyle,\n state.lineWidth,\n state.lineCap,\n state.lineJoin,\n state.miterLimit,\n defaultLineDash,\n defaultLineDashOffset,\n ],\n beginPathInstruction,\n );\n const flatCoordinates = lineStringGeometry.getFlatCoordinates();\n const stride = lineStringGeometry.getStride();\n this.drawFlatCoordinates_(\n flatCoordinates,\n 0,\n flatCoordinates.length,\n stride,\n );\n this.hitDetectionInstructions.push(strokeInstruction);\n this.endGeometry(feature);\n }\n\n /**\n * @param {import(\"../../geom/MultiLineString.js\").default|import(\"../Feature.js\").default} multiLineStringGeometry MultiLineString geometry.\n * @param {import(\"../../Feature.js\").FeatureLike} feature Feature.\n * @param {number} [index] Render order index.\n * @override\n */\n drawMultiLineString(multiLineStringGeometry, feature, index) {\n const state = this.state;\n const strokeStyle = state.strokeStyle;\n const lineWidth = state.lineWidth;\n if (strokeStyle === undefined || lineWidth === undefined) {\n return;\n }\n this.updateStrokeStyle(state, this.applyStroke);\n this.beginGeometry(multiLineStringGeometry, feature, index);\n this.hitDetectionInstructions.push(\n [\n CanvasInstruction.SET_STROKE_STYLE,\n state.strokeStyle,\n state.lineWidth,\n state.lineCap,\n state.lineJoin,\n state.miterLimit,\n defaultLineDash,\n defaultLineDashOffset,\n ],\n beginPathInstruction,\n );\n const ends = multiLineStringGeometry.getEnds();\n const flatCoordinates = multiLineStringGeometry.getFlatCoordinates();\n const stride = multiLineStringGeometry.getStride();\n let offset = 0;\n for (let i = 0, ii = ends.length; i < ii; ++i) {\n offset = this.drawFlatCoordinates_(\n flatCoordinates,\n offset,\n /** @type {number} */ (ends[i]),\n stride,\n );\n }\n this.hitDetectionInstructions.push(strokeInstruction);\n this.endGeometry(feature);\n }\n\n /**\n * @return {import(\"../canvas.js\").SerializableInstructions} the serializable instructions.\n * @override\n */\n finish() {\n const state = this.state;\n if (\n state.lastStroke != undefined &&\n state.lastStroke != this.coordinates.length\n ) {\n this.instructions.push(strokeInstruction);\n }\n this.reverseHitDetectionInstructions();\n this.state = null;\n return super.finish();\n }\n\n /**\n * @param {import(\"../canvas.js\").FillStrokeState} state State.\n * @override\n */\n applyStroke(state) {\n if (\n state.lastStroke != undefined &&\n state.lastStroke != this.coordinates.length\n ) {\n this.instructions.push(strokeInstruction);\n state.lastStroke = this.coordinates.length;\n }\n state.lastStroke = 0;\n super.applyStroke(state);\n this.instructions.push(beginPathInstruction);\n }\n}\n\nexport default CanvasLineStringBuilder;\n","/**\n * @module ol/render/canvas/PolygonBuilder\n */\nimport CanvasBuilder from './Builder.js';\nimport CanvasInstruction, {\n beginPathInstruction,\n closePathInstruction,\n fillInstruction,\n strokeInstruction,\n} from './Instruction.js';\nimport {\n defaultFillStyle,\n defaultLineDash,\n defaultLineDashOffset,\n} from '../canvas.js';\nimport {snap} from '../../geom/flat/simplify.js';\n\nclass CanvasPolygonBuilder extends CanvasBuilder {\n /**\n * @param {number} tolerance Tolerance.\n * @param {import(\"../../extent.js\").Extent} maxExtent Maximum extent.\n * @param {number} resolution Resolution.\n * @param {number} pixelRatio Pixel ratio.\n */\n constructor(tolerance, maxExtent, resolution, pixelRatio) {\n super(tolerance, maxExtent, resolution, pixelRatio);\n }\n\n /**\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {Array} ends Ends.\n * @param {number} stride Stride.\n * @private\n * @return {number} End.\n */\n drawFlatCoordinatess_(flatCoordinates, offset, ends, stride) {\n const state = this.state;\n const fill = state.fillStyle !== undefined;\n const stroke = state.strokeStyle !== undefined;\n const numEnds = ends.length;\n this.instructions.push(beginPathInstruction);\n this.hitDetectionInstructions.push(beginPathInstruction);\n for (let i = 0; i < numEnds; ++i) {\n const end = ends[i];\n const myBegin = this.coordinates.length;\n const myEnd = this.appendFlatLineCoordinates(\n flatCoordinates,\n offset,\n end,\n stride,\n true,\n !stroke,\n );\n const moveToLineToInstruction = [\n CanvasInstruction.MOVE_TO_LINE_TO,\n myBegin,\n myEnd,\n ];\n this.instructions.push(moveToLineToInstruction);\n this.hitDetectionInstructions.push(moveToLineToInstruction);\n if (stroke) {\n // Performance optimization: only call closePath() when we have a stroke.\n // Otherwise the ring is closed already (see appendFlatLineCoordinates above).\n this.instructions.push(closePathInstruction);\n this.hitDetectionInstructions.push(closePathInstruction);\n }\n offset = end;\n }\n if (fill) {\n this.instructions.push(fillInstruction);\n this.hitDetectionInstructions.push(fillInstruction);\n }\n if (stroke) {\n this.instructions.push(strokeInstruction);\n this.hitDetectionInstructions.push(strokeInstruction);\n }\n return offset;\n }\n\n /**\n * @param {import(\"../../geom/Circle.js\").default} circleGeometry Circle geometry.\n * @param {import(\"../../Feature.js\").default} feature Feature.\n * @param {number} [index] Render order index.\n * @override\n */\n drawCircle(circleGeometry, feature, index) {\n const state = this.state;\n const fillStyle = state.fillStyle;\n const strokeStyle = state.strokeStyle;\n if (fillStyle === undefined && strokeStyle === undefined) {\n return;\n }\n this.setFillStrokeStyles_();\n this.beginGeometry(circleGeometry, feature, index);\n if (state.fillStyle !== undefined) {\n this.hitDetectionInstructions.push([\n CanvasInstruction.SET_FILL_STYLE,\n defaultFillStyle,\n ]);\n }\n if (state.strokeStyle !== undefined) {\n this.hitDetectionInstructions.push([\n CanvasInstruction.SET_STROKE_STYLE,\n state.strokeStyle,\n state.lineWidth,\n state.lineCap,\n state.lineJoin,\n state.miterLimit,\n defaultLineDash,\n defaultLineDashOffset,\n ]);\n }\n const flatCoordinates = circleGeometry.getFlatCoordinates();\n const stride = circleGeometry.getStride();\n const myBegin = this.coordinates.length;\n this.appendFlatLineCoordinates(\n flatCoordinates,\n 0,\n flatCoordinates.length,\n stride,\n false,\n false,\n );\n const circleInstruction = [CanvasInstruction.CIRCLE, myBegin];\n this.instructions.push(beginPathInstruction, circleInstruction);\n this.hitDetectionInstructions.push(beginPathInstruction, circleInstruction);\n if (state.fillStyle !== undefined) {\n this.instructions.push(fillInstruction);\n this.hitDetectionInstructions.push(fillInstruction);\n }\n if (state.strokeStyle !== undefined) {\n this.instructions.push(strokeInstruction);\n this.hitDetectionInstructions.push(strokeInstruction);\n }\n this.endGeometry(feature);\n }\n\n /**\n * @param {import(\"../../geom/Polygon.js\").default|import(\"../Feature.js\").default} polygonGeometry Polygon geometry.\n * @param {import(\"../../Feature.js\").FeatureLike} feature Feature.\n * @param {number} [index] Render order index.\n * @override\n */\n drawPolygon(polygonGeometry, feature, index) {\n const state = this.state;\n const fillStyle = state.fillStyle;\n const strokeStyle = state.strokeStyle;\n if (fillStyle === undefined && strokeStyle === undefined) {\n return;\n }\n this.setFillStrokeStyles_();\n this.beginGeometry(polygonGeometry, feature, index);\n if (state.fillStyle !== undefined) {\n this.hitDetectionInstructions.push([\n CanvasInstruction.SET_FILL_STYLE,\n defaultFillStyle,\n ]);\n }\n if (state.strokeStyle !== undefined) {\n this.hitDetectionInstructions.push([\n CanvasInstruction.SET_STROKE_STYLE,\n state.strokeStyle,\n state.lineWidth,\n state.lineCap,\n state.lineJoin,\n state.miterLimit,\n defaultLineDash,\n defaultLineDashOffset,\n ]);\n }\n const ends = polygonGeometry.getEnds();\n const flatCoordinates = polygonGeometry.getOrientedFlatCoordinates();\n const stride = polygonGeometry.getStride();\n this.drawFlatCoordinatess_(\n flatCoordinates,\n 0,\n /** @type {Array} */ (ends),\n stride,\n );\n this.endGeometry(feature);\n }\n\n /**\n * @param {import(\"../../geom/MultiPolygon.js\").default} multiPolygonGeometry MultiPolygon geometry.\n * @param {import(\"../../Feature.js\").FeatureLike} feature Feature.\n * @param {number} [index] Render order index.\n * @override\n */\n drawMultiPolygon(multiPolygonGeometry, feature, index) {\n const state = this.state;\n const fillStyle = state.fillStyle;\n const strokeStyle = state.strokeStyle;\n if (fillStyle === undefined && strokeStyle === undefined) {\n return;\n }\n this.setFillStrokeStyles_();\n this.beginGeometry(multiPolygonGeometry, feature, index);\n if (state.fillStyle !== undefined) {\n this.hitDetectionInstructions.push([\n CanvasInstruction.SET_FILL_STYLE,\n defaultFillStyle,\n ]);\n }\n if (state.strokeStyle !== undefined) {\n this.hitDetectionInstructions.push([\n CanvasInstruction.SET_STROKE_STYLE,\n state.strokeStyle,\n state.lineWidth,\n state.lineCap,\n state.lineJoin,\n state.miterLimit,\n defaultLineDash,\n defaultLineDashOffset,\n ]);\n }\n const endss = multiPolygonGeometry.getEndss();\n const flatCoordinates = multiPolygonGeometry.getOrientedFlatCoordinates();\n const stride = multiPolygonGeometry.getStride();\n let offset = 0;\n for (let i = 0, ii = endss.length; i < ii; ++i) {\n offset = this.drawFlatCoordinatess_(\n flatCoordinates,\n offset,\n endss[i],\n stride,\n );\n }\n this.endGeometry(feature);\n }\n\n /**\n * @return {import(\"../canvas.js\").SerializableInstructions} the serializable instructions.\n * @override\n */\n finish() {\n this.reverseHitDetectionInstructions();\n this.state = null;\n // We want to preserve topology when drawing polygons. Polygons are\n // simplified using quantization and point elimination. However, we might\n // have received a mix of quantized and non-quantized geometries, so ensure\n // that all are quantized by quantizing all coordinates in the batch.\n const tolerance = this.tolerance;\n if (tolerance !== 0) {\n const coordinates = this.coordinates;\n for (let i = 0, ii = coordinates.length; i < ii; ++i) {\n coordinates[i] = snap(coordinates[i], tolerance);\n }\n }\n return super.finish();\n }\n\n /**\n * @private\n */\n setFillStrokeStyles_() {\n const state = this.state;\n const fillStyle = state.fillStyle;\n if (fillStyle !== undefined) {\n this.updateFillStyle(state, this.createFill);\n }\n if (state.strokeStyle !== undefined) {\n this.updateStrokeStyle(state, this.applyStroke);\n }\n }\n}\n\nexport default CanvasPolygonBuilder;\n","import {lerp} from '../../math.js';\n\n/**\n * Creates chunks of equal length from a linestring\n * @param {number} chunkLength Length of each chunk.\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Start offset of the `flatCoordinates`.\n * @param {number} end End offset of the `flatCoordinates`.\n * @param {number} stride Stride.\n * @return {Array>} Chunks of linestrings with stride 2.\n */\nexport function lineChunk(chunkLength, flatCoordinates, offset, end, stride) {\n const chunks = [];\n let cursor = offset;\n let chunkM = 0;\n let currentChunk = flatCoordinates.slice(offset, 2);\n while (chunkM < chunkLength && cursor + stride < end) {\n const [x1, y1] = currentChunk.slice(-2);\n const x2 = flatCoordinates[cursor + stride];\n const y2 = flatCoordinates[cursor + stride + 1];\n const segmentLength = Math.sqrt(\n (x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1),\n );\n chunkM += segmentLength;\n if (chunkM >= chunkLength) {\n const m = (chunkLength - chunkM + segmentLength) / segmentLength;\n const x = lerp(x1, x2, m);\n const y = lerp(y1, y2, m);\n currentChunk.push(x, y);\n chunks.push(currentChunk);\n currentChunk = [x, y];\n if (chunkM == chunkLength) {\n cursor += stride;\n }\n chunkM = 0;\n } else if (chunkM < chunkLength) {\n currentChunk.push(\n flatCoordinates[cursor + stride],\n flatCoordinates[cursor + stride + 1],\n );\n cursor += stride;\n } else {\n const missing = segmentLength - chunkM;\n const x = lerp(x1, x2, missing / segmentLength);\n const y = lerp(y1, y2, missing / segmentLength);\n currentChunk.push(x, y);\n chunks.push(currentChunk);\n currentChunk = [x, y];\n chunkM = 0;\n cursor += stride;\n }\n }\n if (chunkM > 0) {\n chunks.push(currentChunk);\n }\n return chunks;\n}\n","/**\n * @module ol/geom/flat/straightchunk\n */\n\n/**\n * @param {number} maxAngle Maximum acceptable angle delta between segments.\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {number} end End.\n * @param {number} stride Stride.\n * @return {Array} Start and end of the first suitable chunk of the\n * given `flatCoordinates`.\n */\nexport function matchingChunk(maxAngle, flatCoordinates, offset, end, stride) {\n let chunkStart = offset;\n let chunkEnd = offset;\n let chunkM = 0;\n let m = 0;\n let start = offset;\n let acos, i, m12, m23, x1, y1, x12, y12, x23, y23;\n for (i = offset; i < end; i += stride) {\n const x2 = flatCoordinates[i];\n const y2 = flatCoordinates[i + 1];\n if (x1 !== undefined) {\n x23 = x2 - x1;\n y23 = y2 - y1;\n m23 = Math.sqrt(x23 * x23 + y23 * y23);\n if (x12 !== undefined) {\n m += m12;\n acos = Math.acos((x12 * x23 + y12 * y23) / (m12 * m23));\n if (acos > maxAngle) {\n if (m > chunkM) {\n chunkM = m;\n chunkStart = start;\n chunkEnd = i;\n }\n m = 0;\n start = i - stride;\n }\n }\n m12 = m23;\n x12 = x23;\n y12 = y23;\n }\n x1 = x2;\n y1 = y2;\n }\n m += m23;\n return m > chunkM ? [start, i] : [chunkStart, chunkEnd];\n}\n","/**\n * @module ol/render/canvas/TextBuilder\n */\nimport CanvasBuilder from './Builder.js';\nimport CanvasInstruction from './Instruction.js';\nimport {asColorLike} from '../../colorlike.js';\nimport {\n defaultFillStyle,\n defaultFont,\n defaultLineCap,\n defaultLineDash,\n defaultLineDashOffset,\n defaultLineJoin,\n defaultLineWidth,\n defaultMiterLimit,\n defaultPadding,\n defaultStrokeStyle,\n defaultTextAlign,\n defaultTextBaseline,\n registerFont,\n} from '../canvas.js';\nimport {getUid} from '../../util.js';\nimport {intersects} from '../../extent.js';\nimport {lineChunk} from '../../geom/flat/linechunk.js';\nimport {matchingChunk} from '../../geom/flat/straightchunk.js';\n/**\n * @const\n * @type {{left: 0, center: 0.5, right: 1, top: 0, middle: 0.5, hanging: 0.2, alphabetic: 0.8, ideographic: 0.8, bottom: 1}}\n */\nexport const TEXT_ALIGN = {\n 'left': 0,\n 'center': 0.5,\n 'right': 1,\n 'top': 0,\n 'middle': 0.5,\n 'hanging': 0.2,\n 'alphabetic': 0.8,\n 'ideographic': 0.8,\n 'bottom': 1,\n};\n\nclass CanvasTextBuilder extends CanvasBuilder {\n /**\n * @param {number} tolerance Tolerance.\n * @param {import(\"../../extent.js\").Extent} maxExtent Maximum extent.\n * @param {number} resolution Resolution.\n * @param {number} pixelRatio Pixel ratio.\n */\n constructor(tolerance, maxExtent, resolution, pixelRatio) {\n super(tolerance, maxExtent, resolution, pixelRatio);\n\n /**\n * @private\n * @type {Array}\n */\n this.labels_ = null;\n\n /**\n * @private\n * @type {string|Array}\n */\n this.text_ = '';\n\n /**\n * @private\n * @type {number}\n */\n this.textOffsetX_ = 0;\n\n /**\n * @private\n * @type {number}\n */\n this.textOffsetY_ = 0;\n\n /**\n * @private\n * @type {boolean|undefined}\n */\n this.textRotateWithView_ = undefined;\n\n /**\n * @private\n * @type {number}\n */\n this.textRotation_ = 0;\n\n /**\n * @private\n * @type {?import(\"../canvas.js\").FillState}\n */\n this.textFillState_ = null;\n\n /**\n * @type {!Object}\n */\n this.fillStates = {};\n this.fillStates[defaultFillStyle] = {fillStyle: defaultFillStyle};\n\n /**\n * @private\n * @type {?import(\"../canvas.js\").StrokeState}\n */\n this.textStrokeState_ = null;\n\n /**\n * @type {!Object}\n */\n this.strokeStates = {};\n\n /**\n * @private\n * @type {import(\"../canvas.js\").TextState}\n */\n this.textState_ = /** @type {import(\"../canvas.js\").TextState} */ ({});\n\n /**\n * @type {!Object}\n */\n this.textStates = {};\n\n /**\n * @private\n * @type {string}\n */\n this.textKey_ = '';\n\n /**\n * @private\n * @type {string}\n */\n this.fillKey_ = '';\n\n /**\n * @private\n * @type {string}\n */\n this.strokeKey_ = '';\n\n /**\n * @private\n * @type {import('../../style/Style.js').DeclutterMode}\n */\n this.declutterMode_ = undefined;\n\n /**\n * Data shared with an image builder for combined decluttering.\n * @private\n * @type {import(\"../canvas.js\").DeclutterImageWithText}\n */\n this.declutterImageWithText_ = undefined;\n }\n\n /**\n * @return {import(\"../canvas.js\").SerializableInstructions} the serializable instructions.\n * @override\n */\n finish() {\n const instructions = super.finish();\n instructions.textStates = this.textStates;\n instructions.fillStates = this.fillStates;\n instructions.strokeStates = this.strokeStates;\n return instructions;\n }\n\n /**\n * @param {import(\"../../geom/SimpleGeometry.js\").default|import(\"../Feature.js\").default} geometry Geometry.\n * @param {import(\"../../Feature.js\").FeatureLike} feature Feature.\n * @param {number} [index] Render order index.\n * @override\n */\n drawText(geometry, feature, index) {\n const fillState = this.textFillState_;\n const strokeState = this.textStrokeState_;\n const textState = this.textState_;\n if (this.text_ === '' || !textState || (!fillState && !strokeState)) {\n return;\n }\n\n const coordinates = this.coordinates;\n let begin = coordinates.length;\n\n const geometryType = geometry.getType();\n let flatCoordinates = null;\n let stride = geometry.getStride();\n\n if (\n textState.placement === 'line' &&\n (geometryType == 'LineString' ||\n geometryType == 'MultiLineString' ||\n geometryType == 'Polygon' ||\n geometryType == 'MultiPolygon')\n ) {\n if (!intersects(this.maxExtent, geometry.getExtent())) {\n return;\n }\n let ends;\n flatCoordinates = geometry.getFlatCoordinates();\n if (geometryType == 'LineString') {\n ends = [flatCoordinates.length];\n } else if (geometryType == 'MultiLineString') {\n ends = /** @type {import(\"../../geom/MultiLineString.js\").default} */ (\n geometry\n ).getEnds();\n } else if (geometryType == 'Polygon') {\n ends = /** @type {import(\"../../geom/Polygon.js\").default} */ (geometry)\n .getEnds()\n .slice(0, 1);\n } else if (geometryType == 'MultiPolygon') {\n const endss =\n /** @type {import(\"../../geom/MultiPolygon.js\").default} */ (\n geometry\n ).getEndss();\n ends = [];\n for (let i = 0, ii = endss.length; i < ii; ++i) {\n ends.push(endss[i][0]);\n }\n }\n this.beginGeometry(geometry, feature, index);\n const repeat = textState.repeat;\n const textAlign = repeat ? undefined : textState.textAlign;\n // No `justify` support for line placement.\n let flatOffset = 0;\n for (let o = 0, oo = ends.length; o < oo; ++o) {\n let chunks;\n if (repeat) {\n chunks = lineChunk(\n repeat * this.resolution,\n flatCoordinates,\n flatOffset,\n ends[o],\n stride,\n );\n } else {\n chunks = [flatCoordinates.slice(flatOffset, ends[o])];\n }\n for (let c = 0, cc = chunks.length; c < cc; ++c) {\n const chunk = chunks[c];\n let chunkBegin = 0;\n let chunkEnd = chunk.length;\n if (textAlign == undefined) {\n const range = matchingChunk(\n textState.maxAngle,\n chunk,\n 0,\n chunk.length,\n 2,\n );\n chunkBegin = range[0];\n chunkEnd = range[1];\n }\n for (let i = chunkBegin; i < chunkEnd; i += stride) {\n coordinates.push(chunk[i], chunk[i + 1]);\n }\n const end = coordinates.length;\n flatOffset = ends[o];\n this.drawChars_(begin, end);\n begin = end;\n }\n }\n this.endGeometry(feature);\n } else {\n let geometryWidths = textState.overflow ? null : [];\n switch (geometryType) {\n case 'Point':\n case 'MultiPoint':\n flatCoordinates =\n /** @type {import(\"../../geom/MultiPoint.js\").default} */ (\n geometry\n ).getFlatCoordinates();\n break;\n case 'LineString':\n flatCoordinates =\n /** @type {import(\"../../geom/LineString.js\").default} */ (\n geometry\n ).getFlatMidpoint();\n break;\n case 'Circle':\n flatCoordinates =\n /** @type {import(\"../../geom/Circle.js\").default} */ (\n geometry\n ).getCenter();\n break;\n case 'MultiLineString':\n flatCoordinates =\n /** @type {import(\"../../geom/MultiLineString.js\").default} */ (\n geometry\n ).getFlatMidpoints();\n stride = 2;\n break;\n case 'Polygon':\n flatCoordinates =\n /** @type {import(\"../../geom/Polygon.js\").default} */ (\n geometry\n ).getFlatInteriorPoint();\n if (!textState.overflow) {\n geometryWidths.push(flatCoordinates[2] / this.resolution);\n }\n stride = 3;\n break;\n case 'MultiPolygon':\n const interiorPoints =\n /** @type {import(\"../../geom/MultiPolygon.js\").default} */ (\n geometry\n ).getFlatInteriorPoints();\n flatCoordinates = [];\n for (let i = 0, ii = interiorPoints.length; i < ii; i += 3) {\n if (!textState.overflow) {\n geometryWidths.push(interiorPoints[i + 2] / this.resolution);\n }\n flatCoordinates.push(interiorPoints[i], interiorPoints[i + 1]);\n }\n if (flatCoordinates.length === 0) {\n return;\n }\n stride = 2;\n break;\n default:\n }\n const end = this.appendFlatPointCoordinates(flatCoordinates, stride);\n if (end === begin) {\n return;\n }\n if (\n geometryWidths &&\n (end - begin) / 2 !== flatCoordinates.length / stride\n ) {\n let beg = begin / 2;\n geometryWidths = geometryWidths.filter((w, i) => {\n const keep =\n coordinates[(beg + i) * 2] === flatCoordinates[i * stride] &&\n coordinates[(beg + i) * 2 + 1] === flatCoordinates[i * stride + 1];\n if (!keep) {\n --beg;\n }\n return keep;\n });\n }\n\n this.saveTextStates_();\n\n if (textState.backgroundFill || textState.backgroundStroke) {\n this.setFillStrokeStyle(\n textState.backgroundFill,\n textState.backgroundStroke,\n );\n if (textState.backgroundFill) {\n this.updateFillStyle(this.state, this.createFill);\n }\n if (textState.backgroundStroke) {\n this.updateStrokeStyle(this.state, this.applyStroke);\n this.hitDetectionInstructions.push(this.createStroke(this.state));\n }\n }\n\n this.beginGeometry(geometry, feature, index);\n\n // adjust padding for negative scale\n let padding = textState.padding;\n if (\n padding != defaultPadding &&\n (textState.scale[0] < 0 || textState.scale[1] < 0)\n ) {\n let p0 = textState.padding[0];\n let p1 = textState.padding[1];\n let p2 = textState.padding[2];\n let p3 = textState.padding[3];\n if (textState.scale[0] < 0) {\n p1 = -p1;\n p3 = -p3;\n }\n if (textState.scale[1] < 0) {\n p0 = -p0;\n p2 = -p2;\n }\n padding = [p0, p1, p2, p3];\n }\n\n // The image is unknown at this stage so we pass null; it will be computed at render time.\n // For clarity, we pass NaN for offsetX, offsetY, width and height, which will be computed at\n // render time.\n const pixelRatio = this.pixelRatio;\n this.instructions.push([\n CanvasInstruction.DRAW_IMAGE,\n begin,\n end,\n null,\n NaN,\n NaN,\n NaN,\n 1,\n 0,\n 0,\n this.textRotateWithView_,\n this.textRotation_,\n [1, 1],\n NaN,\n this.declutterMode_,\n this.declutterImageWithText_,\n padding == defaultPadding\n ? defaultPadding\n : padding.map(function (p) {\n return p * pixelRatio;\n }),\n !!textState.backgroundFill,\n !!textState.backgroundStroke,\n this.text_,\n this.textKey_,\n this.strokeKey_,\n this.fillKey_,\n this.textOffsetX_,\n this.textOffsetY_,\n geometryWidths,\n ]);\n const scale = 1 / pixelRatio;\n // Set default fill for hit detection background\n const currentFillStyle = this.state.fillStyle;\n if (textState.backgroundFill) {\n this.state.fillStyle = defaultFillStyle;\n this.hitDetectionInstructions.push(this.createFill(this.state));\n }\n this.hitDetectionInstructions.push([\n CanvasInstruction.DRAW_IMAGE,\n begin,\n end,\n null,\n NaN,\n NaN,\n NaN,\n 1,\n 0,\n 0,\n this.textRotateWithView_,\n this.textRotation_,\n [scale, scale],\n NaN,\n this.declutterMode_,\n this.declutterImageWithText_,\n padding,\n !!textState.backgroundFill,\n !!textState.backgroundStroke,\n this.text_,\n this.textKey_,\n this.strokeKey_,\n this.fillKey_ ? defaultFillStyle : this.fillKey_,\n this.textOffsetX_,\n this.textOffsetY_,\n geometryWidths,\n ]);\n // Reset previous fill\n if (textState.backgroundFill) {\n this.state.fillStyle = currentFillStyle;\n this.hitDetectionInstructions.push(this.createFill(this.state));\n }\n\n this.endGeometry(feature);\n }\n }\n\n /**\n * @private\n */\n saveTextStates_() {\n const strokeState = this.textStrokeState_;\n const textState = this.textState_;\n const fillState = this.textFillState_;\n\n const strokeKey = this.strokeKey_;\n if (strokeState) {\n if (!(strokeKey in this.strokeStates)) {\n this.strokeStates[strokeKey] = {\n strokeStyle: strokeState.strokeStyle,\n lineCap: strokeState.lineCap,\n lineDashOffset: strokeState.lineDashOffset,\n lineWidth: strokeState.lineWidth,\n lineJoin: strokeState.lineJoin,\n miterLimit: strokeState.miterLimit,\n lineDash: strokeState.lineDash,\n };\n }\n }\n const textKey = this.textKey_;\n if (!(textKey in this.textStates)) {\n this.textStates[textKey] = {\n font: textState.font,\n textAlign: textState.textAlign || defaultTextAlign,\n justify: textState.justify,\n textBaseline: textState.textBaseline || defaultTextBaseline,\n scale: textState.scale,\n };\n }\n const fillKey = this.fillKey_;\n if (fillState) {\n if (!(fillKey in this.fillStates)) {\n this.fillStates[fillKey] = {\n fillStyle: fillState.fillStyle,\n };\n }\n }\n }\n\n /**\n * @private\n * @param {number} begin Begin.\n * @param {number} end End.\n */\n drawChars_(begin, end) {\n const strokeState = this.textStrokeState_;\n const textState = this.textState_;\n\n const strokeKey = this.strokeKey_;\n const textKey = this.textKey_;\n const fillKey = this.fillKey_;\n this.saveTextStates_();\n\n const pixelRatio = this.pixelRatio;\n const baseline = TEXT_ALIGN[textState.textBaseline];\n\n const offsetY = this.textOffsetY_ * pixelRatio;\n const text = this.text_;\n const strokeWidth = strokeState\n ? (strokeState.lineWidth * Math.abs(textState.scale[0])) / 2\n : 0;\n\n this.instructions.push([\n CanvasInstruction.DRAW_CHARS,\n begin,\n end,\n baseline,\n textState.overflow,\n fillKey,\n textState.maxAngle,\n pixelRatio,\n offsetY,\n strokeKey,\n strokeWidth * pixelRatio,\n text,\n textKey,\n 1,\n this.declutterMode_,\n ]);\n this.hitDetectionInstructions.push([\n CanvasInstruction.DRAW_CHARS,\n begin,\n end,\n baseline,\n textState.overflow,\n fillKey ? defaultFillStyle : fillKey,\n textState.maxAngle,\n pixelRatio,\n offsetY,\n strokeKey,\n strokeWidth * pixelRatio,\n text,\n textKey,\n 1 / pixelRatio,\n this.declutterMode_,\n ]);\n }\n\n /**\n * @param {import(\"../../style/Text.js\").default} textStyle Text style.\n * @param {Object} [sharedData] Shared data.\n * @override\n */\n setTextStyle(textStyle, sharedData) {\n let textState, fillState, strokeState;\n if (!textStyle) {\n this.text_ = '';\n } else {\n const textFillStyle = textStyle.getFill();\n if (!textFillStyle) {\n fillState = null;\n this.textFillState_ = fillState;\n } else {\n fillState = this.textFillState_;\n if (!fillState) {\n fillState = /** @type {import(\"../canvas.js\").FillState} */ ({});\n this.textFillState_ = fillState;\n }\n fillState.fillStyle = asColorLike(\n textFillStyle.getColor() || defaultFillStyle,\n );\n }\n\n const textStrokeStyle = textStyle.getStroke();\n if (!textStrokeStyle) {\n strokeState = null;\n this.textStrokeState_ = strokeState;\n } else {\n strokeState = this.textStrokeState_;\n if (!strokeState) {\n strokeState = /** @type {import(\"../canvas.js\").StrokeState} */ ({});\n this.textStrokeState_ = strokeState;\n }\n const lineDash = textStrokeStyle.getLineDash();\n const lineDashOffset = textStrokeStyle.getLineDashOffset();\n const lineWidth = textStrokeStyle.getWidth();\n const miterLimit = textStrokeStyle.getMiterLimit();\n strokeState.lineCap = textStrokeStyle.getLineCap() || defaultLineCap;\n strokeState.lineDash = lineDash ? lineDash.slice() : defaultLineDash;\n strokeState.lineDashOffset =\n lineDashOffset === undefined ? defaultLineDashOffset : lineDashOffset;\n strokeState.lineJoin = textStrokeStyle.getLineJoin() || defaultLineJoin;\n strokeState.lineWidth =\n lineWidth === undefined ? defaultLineWidth : lineWidth;\n strokeState.miterLimit =\n miterLimit === undefined ? defaultMiterLimit : miterLimit;\n strokeState.strokeStyle = asColorLike(\n textStrokeStyle.getColor() || defaultStrokeStyle,\n );\n }\n\n textState = this.textState_;\n const font = textStyle.getFont() || defaultFont;\n registerFont(font);\n const textScale = textStyle.getScaleArray();\n textState.overflow = textStyle.getOverflow();\n textState.font = font;\n textState.maxAngle = textStyle.getMaxAngle();\n textState.placement = textStyle.getPlacement();\n textState.textAlign = textStyle.getTextAlign();\n textState.repeat = textStyle.getRepeat();\n textState.justify = textStyle.getJustify();\n textState.textBaseline =\n textStyle.getTextBaseline() || defaultTextBaseline;\n textState.backgroundFill = textStyle.getBackgroundFill();\n textState.backgroundStroke = textStyle.getBackgroundStroke();\n textState.padding = textStyle.getPadding() || defaultPadding;\n textState.scale = textScale === undefined ? [1, 1] : textScale;\n\n const textOffsetX = textStyle.getOffsetX();\n const textOffsetY = textStyle.getOffsetY();\n const textRotateWithView = textStyle.getRotateWithView();\n const textRotation = textStyle.getRotation();\n this.text_ = textStyle.getText() || '';\n this.textOffsetX_ = textOffsetX === undefined ? 0 : textOffsetX;\n this.textOffsetY_ = textOffsetY === undefined ? 0 : textOffsetY;\n this.textRotateWithView_ =\n textRotateWithView === undefined ? false : textRotateWithView;\n this.textRotation_ = textRotation === undefined ? 0 : textRotation;\n\n this.strokeKey_ = strokeState\n ? (typeof strokeState.strokeStyle == 'string'\n ? strokeState.strokeStyle\n : getUid(strokeState.strokeStyle)) +\n strokeState.lineCap +\n strokeState.lineDashOffset +\n '|' +\n strokeState.lineWidth +\n strokeState.lineJoin +\n strokeState.miterLimit +\n '[' +\n strokeState.lineDash.join() +\n ']'\n : '';\n this.textKey_ =\n textState.font +\n textState.scale +\n (textState.textAlign || '?') +\n (textState.repeat || '?') +\n (textState.justify || '?') +\n (textState.textBaseline || '?');\n this.fillKey_ =\n fillState && fillState.fillStyle\n ? typeof fillState.fillStyle == 'string'\n ? fillState.fillStyle\n : '|' + getUid(fillState.fillStyle)\n : '';\n }\n this.declutterMode_ = textStyle.getDeclutterMode();\n this.declutterImageWithText_ = sharedData;\n }\n}\n\nexport default CanvasTextBuilder;\n","/**\n * @module ol/render/canvas/BuilderGroup\n */\n\nimport Builder from './Builder.js';\nimport ImageBuilder from './ImageBuilder.js';\nimport LineStringBuilder from './LineStringBuilder.js';\nimport PolygonBuilder from './PolygonBuilder.js';\nimport TextBuilder from './TextBuilder.js';\n\n/**\n * @type {Object}\n */\nconst BATCH_CONSTRUCTORS = {\n 'Circle': PolygonBuilder,\n 'Default': Builder,\n 'Image': ImageBuilder,\n 'LineString': LineStringBuilder,\n 'Polygon': PolygonBuilder,\n 'Text': TextBuilder,\n};\n\nclass BuilderGroup {\n /**\n * @param {number} tolerance Tolerance.\n * @param {import(\"../../extent.js\").Extent} maxExtent Max extent.\n * @param {number} resolution Resolution.\n * @param {number} pixelRatio Pixel ratio.\n */\n constructor(tolerance, maxExtent, resolution, pixelRatio) {\n /**\n * @private\n * @type {number}\n */\n this.tolerance_ = tolerance;\n\n /**\n * @private\n * @type {import(\"../../extent.js\").Extent}\n */\n this.maxExtent_ = maxExtent;\n\n /**\n * @private\n * @type {number}\n */\n this.pixelRatio_ = pixelRatio;\n\n /**\n * @private\n * @type {number}\n */\n this.resolution_ = resolution;\n\n /**\n * @private\n * @type {!Object>}\n */\n this.buildersByZIndex_ = {};\n }\n\n /**\n * @return {!Object>} The serializable instructions\n */\n finish() {\n const builderInstructions = {};\n for (const zKey in this.buildersByZIndex_) {\n builderInstructions[zKey] = builderInstructions[zKey] || {};\n const builders = this.buildersByZIndex_[zKey];\n for (const builderKey in builders) {\n const builderInstruction = builders[builderKey].finish();\n builderInstructions[zKey][builderKey] = builderInstruction;\n }\n }\n return builderInstructions;\n }\n\n /**\n * @param {number|undefined} zIndex Z index.\n * @param {import(\"../canvas.js\").BuilderType} builderType Replay type.\n * @return {import(\"../VectorContext.js\").default} Replay.\n */\n getBuilder(zIndex, builderType) {\n const zIndexKey = zIndex !== undefined ? zIndex.toString() : '0';\n let replays = this.buildersByZIndex_[zIndexKey];\n if (replays === undefined) {\n replays = {};\n this.buildersByZIndex_[zIndexKey] = replays;\n }\n let replay = replays[builderType];\n if (replay === undefined) {\n const Constructor = BATCH_CONSTRUCTORS[builderType];\n replay = new Constructor(\n this.tolerance_,\n this.maxExtent_,\n this.resolution_,\n this.pixelRatio_,\n );\n replays[builderType] = replay;\n }\n return replay;\n }\n}\n\nexport default BuilderGroup;\n","/**\n * @module ol/geom/flat/textpath\n */\nimport {lerp} from '../../math.js';\nimport {rotate} from './transform.js';\n\n/**\n * @param {Array} flatCoordinates Path to put text on.\n * @param {number} offset Start offset of the `flatCoordinates`.\n * @param {number} end End offset of the `flatCoordinates`.\n * @param {number} stride Stride.\n * @param {string} text Text to place on the path.\n * @param {number} startM m along the path where the text starts.\n * @param {number} maxAngle Max angle between adjacent chars in radians.\n * @param {number} scale The product of the text scale and the device pixel ratio.\n * @param {function(string, string, Object):number} measureAndCacheTextWidth Measure and cache text width.\n * @param {string} font The font.\n * @param {Object} cache A cache of measured widths.\n * @param {number} rotation Rotation to apply to the flatCoordinates to determine whether text needs to be reversed.\n * @return {Array>|null} The result array (or null if `maxAngle` was\n * exceeded). Entries of the array are x, y, anchorX, angle, chunk.\n */\nexport function drawTextOnPath(\n flatCoordinates,\n offset,\n end,\n stride,\n text,\n startM,\n maxAngle,\n scale,\n measureAndCacheTextWidth,\n font,\n cache,\n rotation,\n) {\n let x2 = flatCoordinates[offset];\n let y2 = flatCoordinates[offset + 1];\n let x1 = 0;\n let y1 = 0;\n let segmentLength = 0;\n let segmentM = 0;\n\n function advance() {\n x1 = x2;\n y1 = y2;\n offset += stride;\n x2 = flatCoordinates[offset];\n y2 = flatCoordinates[offset + 1];\n segmentM += segmentLength;\n segmentLength = Math.sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1));\n }\n do {\n advance();\n } while (offset < end - stride && segmentM + segmentLength < startM);\n\n let interpolate =\n segmentLength === 0 ? 0 : (startM - segmentM) / segmentLength;\n const beginX = lerp(x1, x2, interpolate);\n const beginY = lerp(y1, y2, interpolate);\n\n const startOffset = offset - stride;\n const startLength = segmentM;\n const endM = startM + scale * measureAndCacheTextWidth(font, text, cache);\n while (offset < end - stride && segmentM + segmentLength < endM) {\n advance();\n }\n interpolate = segmentLength === 0 ? 0 : (endM - segmentM) / segmentLength;\n const endX = lerp(x1, x2, interpolate);\n const endY = lerp(y1, y2, interpolate);\n\n // Keep text upright\n let reverse;\n if (rotation) {\n const flat = [beginX, beginY, endX, endY];\n rotate(flat, 0, 4, 2, rotation, flat, flat);\n reverse = flat[0] > flat[2];\n } else {\n reverse = beginX > endX;\n }\n\n const PI = Math.PI;\n const result = [];\n const singleSegment = startOffset + stride === offset;\n\n offset = startOffset;\n segmentLength = 0;\n segmentM = startLength;\n x2 = flatCoordinates[offset];\n y2 = flatCoordinates[offset + 1];\n\n let previousAngle;\n // All on the same segment\n if (singleSegment) {\n advance();\n\n previousAngle = Math.atan2(y2 - y1, x2 - x1);\n if (reverse) {\n previousAngle += previousAngle > 0 ? -PI : PI;\n }\n const x = (endX + beginX) / 2;\n const y = (endY + beginY) / 2;\n result[0] = [x, y, (endM - startM) / 2, previousAngle, text];\n return result;\n }\n\n // rendering across line segments\n text = text.replace(/\\n/g, ' '); // ensure rendering in single-line as all calculations below don't handle multi-lines\n\n for (let i = 0, ii = text.length; i < ii; ) {\n advance();\n let angle = Math.atan2(y2 - y1, x2 - x1);\n if (reverse) {\n angle += angle > 0 ? -PI : PI;\n }\n if (previousAngle !== undefined) {\n let delta = angle - previousAngle;\n delta += delta > PI ? -2 * PI : delta < -PI ? 2 * PI : 0;\n if (Math.abs(delta) > maxAngle) {\n return null;\n }\n }\n previousAngle = angle;\n\n const iStart = i;\n let charLength = 0;\n for (; i < ii; ++i) {\n const index = reverse ? ii - i - 1 : i;\n const len = scale * measureAndCacheTextWidth(font, text[index], cache);\n if (\n offset + stride < end &&\n segmentM + segmentLength < startM + charLength + len / 2\n ) {\n break;\n }\n charLength += len;\n }\n if (i === iStart) {\n continue;\n }\n const chars = reverse\n ? text.substring(ii - iStart, ii - i)\n : text.substring(iStart, i);\n interpolate =\n segmentLength === 0\n ? 0\n : (startM + charLength / 2 - segmentM) / segmentLength;\n const x = lerp(x1, x2, interpolate);\n const y = lerp(y1, y2, interpolate);\n result.push([x, y, charLength / 2, angle, chars]);\n startM += charLength;\n }\n return result;\n}\n","/**\n * @module ol/render/canvas/Executor\n */\nimport CanvasInstruction from './Instruction.js';\nimport ZIndexContext from '../canvas/ZIndexContext.js';\nimport {TEXT_ALIGN} from './TextBuilder.js';\nimport {\n apply as applyTransform,\n compose as composeTransform,\n create as createTransform,\n setFromArray as transformSetFromArray,\n} from '../../transform.js';\nimport {createEmpty, createOrUpdate, intersects} from '../../extent.js';\nimport {\n defaultPadding,\n defaultTextAlign,\n defaultTextBaseline,\n drawImageOrLabel,\n getTextDimensions,\n measureAndCacheTextWidth,\n} from '../canvas.js';\nimport {drawTextOnPath} from '../../geom/flat/textpath.js';\nimport {equals} from '../../array.js';\nimport {lineStringLength} from '../../geom/flat/length.js';\nimport {transform2D} from '../../geom/flat/transform.js';\n\n/**\n * @typedef {import('../../structs/RBush.js').Entry} DeclutterEntry\n */\n\n/**\n * @typedef {Object} ImageOrLabelDimensions\n * @property {number} drawImageX DrawImageX.\n * @property {number} drawImageY DrawImageY.\n * @property {number} drawImageW DrawImageW.\n * @property {number} drawImageH DrawImageH.\n * @property {number} originX OriginX.\n * @property {number} originY OriginY.\n * @property {Array} scale Scale.\n * @property {DeclutterEntry} declutterBox DeclutterBox.\n * @property {import(\"../../transform.js\").Transform} canvasTransform CanvasTransform.\n */\n\n/**\n * @typedef {{0: CanvasRenderingContext2D, 1: import('../../size.js').Size, 2: import(\"../canvas.js\").Label|HTMLImageElement|HTMLCanvasElement|HTMLVideoElement, 3: ImageOrLabelDimensions, 4: number, 5: Array<*>, 6: Array<*>}} ReplayImageOrLabelArgs\n */\n\n/**\n * @template T\n * @typedef {function(import(\"../../Feature.js\").FeatureLike, import(\"../../geom/SimpleGeometry.js\").default, import(\"../../style/Style.js\").DeclutterMode): T} FeatureCallback\n */\n\n/**\n * @type {import(\"../../extent.js\").Extent}\n */\nconst tmpExtent = createEmpty();\n\n/** @type {import(\"../../coordinate.js\").Coordinate} */\nconst p1 = [];\n/** @type {import(\"../../coordinate.js\").Coordinate} */\nconst p2 = [];\n/** @type {import(\"../../coordinate.js\").Coordinate} */\nconst p3 = [];\n/** @type {import(\"../../coordinate.js\").Coordinate} */\nconst p4 = [];\n\n/**\n * @param {ReplayImageOrLabelArgs} replayImageOrLabelArgs Arguments to replayImageOrLabel\n * @return {DeclutterEntry} Declutter rbush entry.\n */\nfunction getDeclutterBox(replayImageOrLabelArgs) {\n return replayImageOrLabelArgs[3].declutterBox;\n}\n\nconst rtlRegEx = new RegExp(\n /* eslint-disable prettier/prettier */\n '[' +\n String.fromCharCode(0x00591) + '-' + String.fromCharCode(0x008ff) +\n String.fromCharCode(0x0fb1d) + '-' + String.fromCharCode(0x0fdff) +\n String.fromCharCode(0x0fe70) + '-' + String.fromCharCode(0x0fefc) +\n String.fromCharCode(0x10800) + '-' + String.fromCharCode(0x10fff) +\n String.fromCharCode(0x1e800) + '-' + String.fromCharCode(0x1efff) +\n ']'\n /* eslint-enable prettier/prettier */\n);\n\n/**\n * @param {string} text Text.\n * @param {CanvasTextAlign} align Alignment.\n * @return {number} Text alignment.\n */\nfunction horizontalTextAlign(text, align) {\n if (align === 'start') {\n align = rtlRegEx.test(text) ? 'right' : 'left';\n } else if (align === 'end') {\n align = rtlRegEx.test(text) ? 'left' : 'right';\n }\n return TEXT_ALIGN[align];\n}\n\n/**\n * @param {Array} acc Accumulator.\n * @param {string} line Line of text.\n * @param {number} i Index\n * @return {Array} Accumulator.\n */\nfunction createTextChunks(acc, line, i) {\n if (i > 0) {\n acc.push('\\n', '');\n }\n acc.push(line, '');\n return acc;\n}\n\nclass Executor {\n /**\n * @param {number} resolution Resolution.\n * @param {number} pixelRatio Pixel ratio.\n * @param {boolean} overlaps The replay can have overlapping geometries.\n * @param {import(\"../canvas.js\").SerializableInstructions} instructions The serializable instructions.\n * @param {boolean} [deferredRendering] Enable deferred rendering.\n */\n constructor(\n resolution,\n pixelRatio,\n overlaps,\n instructions,\n deferredRendering,\n ) {\n /**\n * @protected\n * @type {boolean}\n */\n this.overlaps = overlaps;\n\n /**\n * @protected\n * @type {number}\n */\n this.pixelRatio = pixelRatio;\n\n /**\n * @protected\n * @const\n * @type {number}\n */\n this.resolution = resolution;\n\n /**\n * @private\n * @type {number}\n */\n this.alignAndScaleFill_;\n\n /**\n * @protected\n * @type {Array<*>}\n */\n this.instructions = instructions.instructions;\n\n /**\n * @protected\n * @type {Array}\n */\n this.coordinates = instructions.coordinates;\n\n /**\n * @private\n * @type {!Object|Array>>}\n */\n this.coordinateCache_ = {};\n\n /**\n * @private\n * @type {!import(\"../../transform.js\").Transform}\n */\n this.renderedTransform_ = createTransform();\n\n /**\n * @protected\n * @type {Array<*>}\n */\n this.hitDetectionInstructions = instructions.hitDetectionInstructions;\n\n /**\n * @private\n * @type {Array}\n */\n this.pixelCoordinates_ = null;\n\n /**\n * @private\n * @type {number}\n */\n this.viewRotation_ = 0;\n\n /**\n * @type {!Object}\n */\n this.fillStates = instructions.fillStates || {};\n\n /**\n * @type {!Object}\n */\n this.strokeStates = instructions.strokeStates || {};\n\n /**\n * @type {!Object}\n */\n this.textStates = instructions.textStates || {};\n\n /**\n * @private\n * @type {Object>}\n */\n this.widths_ = {};\n\n /**\n * @private\n * @type {Object}\n */\n this.labels_ = {};\n\n /**\n * @private\n * @type {import(\"../canvas/ZIndexContext.js\").default}\n */\n this.zIndexContext_ = deferredRendering ? new ZIndexContext() : null;\n }\n\n /**\n * @return {ZIndexContext} ZIndex context.\n */\n getZIndexContext() {\n return this.zIndexContext_;\n }\n\n /**\n * @param {string|Array} text Text.\n * @param {string} textKey Text style key.\n * @param {string} fillKey Fill style key.\n * @param {string} strokeKey Stroke style key.\n * @return {import(\"../canvas.js\").Label} Label.\n */\n createLabel(text, textKey, fillKey, strokeKey) {\n const key = text + textKey + fillKey + strokeKey;\n if (this.labels_[key]) {\n return this.labels_[key];\n }\n const strokeState = strokeKey ? this.strokeStates[strokeKey] : null;\n const fillState = fillKey ? this.fillStates[fillKey] : null;\n const textState = this.textStates[textKey];\n const pixelRatio = this.pixelRatio;\n const scale = [\n textState.scale[0] * pixelRatio,\n textState.scale[1] * pixelRatio,\n ];\n const align = textState.justify\n ? TEXT_ALIGN[textState.justify]\n : horizontalTextAlign(\n Array.isArray(text) ? text[0] : text,\n textState.textAlign || defaultTextAlign,\n );\n const strokeWidth =\n strokeKey && strokeState.lineWidth ? strokeState.lineWidth : 0;\n\n const chunks = Array.isArray(text)\n ? text\n : String(text).split('\\n').reduce(createTextChunks, []);\n\n const {width, height, widths, heights, lineWidths} = getTextDimensions(\n textState,\n chunks,\n );\n const renderWidth = width + strokeWidth;\n const contextInstructions = [];\n // make canvas 2 pixels wider to account for italic text width measurement errors\n const w = (renderWidth + 2) * scale[0];\n const h = (height + strokeWidth) * scale[1];\n /** @type {import(\"../canvas.js\").Label} */\n const label = {\n width: w < 0 ? Math.floor(w) : Math.ceil(w),\n height: h < 0 ? Math.floor(h) : Math.ceil(h),\n contextInstructions: contextInstructions,\n };\n if (scale[0] != 1 || scale[1] != 1) {\n contextInstructions.push('scale', scale);\n }\n if (strokeKey) {\n contextInstructions.push('strokeStyle', strokeState.strokeStyle);\n contextInstructions.push('lineWidth', strokeWidth);\n contextInstructions.push('lineCap', strokeState.lineCap);\n contextInstructions.push('lineJoin', strokeState.lineJoin);\n contextInstructions.push('miterLimit', strokeState.miterLimit);\n contextInstructions.push('setLineDash', [strokeState.lineDash]);\n contextInstructions.push('lineDashOffset', strokeState.lineDashOffset);\n }\n if (fillKey) {\n contextInstructions.push('fillStyle', fillState.fillStyle);\n }\n contextInstructions.push('textBaseline', 'middle');\n contextInstructions.push('textAlign', 'center');\n const leftRight = 0.5 - align;\n let x = align * renderWidth + leftRight * strokeWidth;\n const strokeInstructions = [];\n const fillInstructions = [];\n let lineHeight = 0;\n let lineOffset = 0;\n let widthHeightIndex = 0;\n let lineWidthIndex = 0;\n let previousFont;\n for (let i = 0, ii = chunks.length; i < ii; i += 2) {\n const text = chunks[i];\n if (text === '\\n') {\n lineOffset += lineHeight;\n lineHeight = 0;\n x = align * renderWidth + leftRight * strokeWidth;\n ++lineWidthIndex;\n continue;\n }\n const font = chunks[i + 1] || textState.font;\n if (font !== previousFont) {\n if (strokeKey) {\n strokeInstructions.push('font', font);\n }\n if (fillKey) {\n fillInstructions.push('font', font);\n }\n previousFont = font;\n }\n lineHeight = Math.max(lineHeight, heights[widthHeightIndex]);\n const fillStrokeArgs = [\n text,\n x +\n leftRight * widths[widthHeightIndex] +\n align * (widths[widthHeightIndex] - lineWidths[lineWidthIndex]),\n 0.5 * (strokeWidth + lineHeight) + lineOffset,\n ];\n x += widths[widthHeightIndex];\n if (strokeKey) {\n strokeInstructions.push('strokeText', fillStrokeArgs);\n }\n if (fillKey) {\n fillInstructions.push('fillText', fillStrokeArgs);\n }\n ++widthHeightIndex;\n }\n Array.prototype.push.apply(contextInstructions, strokeInstructions);\n Array.prototype.push.apply(contextInstructions, fillInstructions);\n this.labels_[key] = label;\n return label;\n }\n\n /**\n * @param {CanvasRenderingContext2D} context Context.\n * @param {import(\"../../coordinate.js\").Coordinate} p1 1st point of the background box.\n * @param {import(\"../../coordinate.js\").Coordinate} p2 2nd point of the background box.\n * @param {import(\"../../coordinate.js\").Coordinate} p3 3rd point of the background box.\n * @param {import(\"../../coordinate.js\").Coordinate} p4 4th point of the background box.\n * @param {Array<*>} fillInstruction Fill instruction.\n * @param {Array<*>} strokeInstruction Stroke instruction.\n */\n replayTextBackground_(\n context,\n p1,\n p2,\n p3,\n p4,\n fillInstruction,\n strokeInstruction,\n ) {\n context.beginPath();\n context.moveTo.apply(context, p1);\n context.lineTo.apply(context, p2);\n context.lineTo.apply(context, p3);\n context.lineTo.apply(context, p4);\n context.lineTo.apply(context, p1);\n if (fillInstruction) {\n this.alignAndScaleFill_ = /** @type {number} */ (fillInstruction[2]);\n this.fill_(context);\n }\n if (strokeInstruction) {\n this.setStrokeStyle_(\n context,\n /** @type {Array<*>} */ (strokeInstruction),\n );\n context.stroke();\n }\n }\n\n /**\n * @private\n * @param {number} sheetWidth Width of the sprite sheet.\n * @param {number} sheetHeight Height of the sprite sheet.\n * @param {number} centerX X.\n * @param {number} centerY Y.\n * @param {number} width Width.\n * @param {number} height Height.\n * @param {number} anchorX Anchor X.\n * @param {number} anchorY Anchor Y.\n * @param {number} originX Origin X.\n * @param {number} originY Origin Y.\n * @param {number} rotation Rotation.\n * @param {import(\"../../size.js\").Size} scale Scale.\n * @param {boolean} snapToPixel Snap to pixel.\n * @param {Array} padding Padding.\n * @param {boolean} fillStroke Background fill or stroke.\n * @param {import(\"../../Feature.js\").FeatureLike} feature Feature.\n * @return {ImageOrLabelDimensions} Dimensions for positioning and decluttering the image or label.\n */\n calculateImageOrLabelDimensions_(\n sheetWidth,\n sheetHeight,\n centerX,\n centerY,\n width,\n height,\n anchorX,\n anchorY,\n originX,\n originY,\n rotation,\n scale,\n snapToPixel,\n padding,\n fillStroke,\n feature,\n ) {\n anchorX *= scale[0];\n anchorY *= scale[1];\n let x = centerX - anchorX;\n let y = centerY - anchorY;\n\n const w = width + originX > sheetWidth ? sheetWidth - originX : width;\n const h = height + originY > sheetHeight ? sheetHeight - originY : height;\n const boxW = padding[3] + w * scale[0] + padding[1];\n const boxH = padding[0] + h * scale[1] + padding[2];\n const boxX = x - padding[3];\n const boxY = y - padding[0];\n\n if (fillStroke || rotation !== 0) {\n p1[0] = boxX;\n p4[0] = boxX;\n p1[1] = boxY;\n p2[1] = boxY;\n p2[0] = boxX + boxW;\n p3[0] = p2[0];\n p3[1] = boxY + boxH;\n p4[1] = p3[1];\n }\n\n let transform;\n if (rotation !== 0) {\n transform = composeTransform(\n createTransform(),\n centerX,\n centerY,\n 1,\n 1,\n rotation,\n -centerX,\n -centerY,\n );\n\n applyTransform(transform, p1);\n applyTransform(transform, p2);\n applyTransform(transform, p3);\n applyTransform(transform, p4);\n createOrUpdate(\n Math.min(p1[0], p2[0], p3[0], p4[0]),\n Math.min(p1[1], p2[1], p3[1], p4[1]),\n Math.max(p1[0], p2[0], p3[0], p4[0]),\n Math.max(p1[1], p2[1], p3[1], p4[1]),\n tmpExtent,\n );\n } else {\n createOrUpdate(\n Math.min(boxX, boxX + boxW),\n Math.min(boxY, boxY + boxH),\n Math.max(boxX, boxX + boxW),\n Math.max(boxY, boxY + boxH),\n tmpExtent,\n );\n }\n if (snapToPixel) {\n x = Math.round(x);\n y = Math.round(y);\n }\n return {\n drawImageX: x,\n drawImageY: y,\n drawImageW: w,\n drawImageH: h,\n originX: originX,\n originY: originY,\n declutterBox: {\n minX: tmpExtent[0],\n minY: tmpExtent[1],\n maxX: tmpExtent[2],\n maxY: tmpExtent[3],\n value: feature,\n },\n canvasTransform: transform,\n scale: scale,\n };\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} context Context.\n * @param {import('../../size.js').Size} scaledCanvasSize Scaled canvas size.\n * @param {import(\"../canvas.js\").Label|HTMLImageElement|HTMLCanvasElement|HTMLVideoElement} imageOrLabel Image.\n * @param {ImageOrLabelDimensions} dimensions Dimensions.\n * @param {number} opacity Opacity.\n * @param {Array<*>} fillInstruction Fill instruction.\n * @param {Array<*>} strokeInstruction Stroke instruction.\n * @return {boolean} The image or label was rendered.\n */\n replayImageOrLabel_(\n context,\n scaledCanvasSize,\n imageOrLabel,\n dimensions,\n opacity,\n fillInstruction,\n strokeInstruction,\n ) {\n const fillStroke = !!(fillInstruction || strokeInstruction);\n\n const box = dimensions.declutterBox;\n const strokePadding = strokeInstruction\n ? (strokeInstruction[2] * dimensions.scale[0]) / 2\n : 0;\n const intersects =\n box.minX - strokePadding <= scaledCanvasSize[0] &&\n box.maxX + strokePadding >= 0 &&\n box.minY - strokePadding <= scaledCanvasSize[1] &&\n box.maxY + strokePadding >= 0;\n\n if (intersects) {\n if (fillStroke) {\n this.replayTextBackground_(\n context,\n p1,\n p2,\n p3,\n p4,\n /** @type {Array<*>} */ (fillInstruction),\n /** @type {Array<*>} */ (strokeInstruction),\n );\n }\n drawImageOrLabel(\n context,\n dimensions.canvasTransform,\n opacity,\n imageOrLabel,\n dimensions.originX,\n dimensions.originY,\n dimensions.drawImageW,\n dimensions.drawImageH,\n dimensions.drawImageX,\n dimensions.drawImageY,\n dimensions.scale,\n );\n }\n return true;\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} context Context.\n */\n fill_(context) {\n const alignAndScale = this.alignAndScaleFill_;\n if (alignAndScale) {\n const origin = applyTransform(this.renderedTransform_, [0, 0]);\n const repeatSize = 512 * this.pixelRatio;\n context.save();\n context.translate(origin[0] % repeatSize, origin[1] % repeatSize);\n if (alignAndScale !== 1) {\n context.scale(alignAndScale, alignAndScale);\n }\n context.rotate(this.viewRotation_);\n }\n context.fill();\n if (alignAndScale) {\n context.restore();\n }\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} context Context.\n * @param {Array<*>} instruction Instruction.\n */\n setStrokeStyle_(context, instruction) {\n context.strokeStyle =\n /** @type {import(\"../../colorlike.js\").ColorLike} */ (instruction[1]);\n context.lineWidth = /** @type {number} */ (instruction[2]);\n context.lineCap = /** @type {CanvasLineCap} */ (instruction[3]);\n context.lineJoin = /** @type {CanvasLineJoin} */ (instruction[4]);\n context.miterLimit = /** @type {number} */ (instruction[5]);\n context.lineDashOffset = /** @type {number} */ (instruction[7]);\n context.setLineDash(/** @type {Array} */ (instruction[6]));\n }\n\n /**\n * @private\n * @param {string|Array} text The text to draw.\n * @param {string} textKey The key of the text state.\n * @param {string} strokeKey The key for the stroke state.\n * @param {string} fillKey The key for the fill state.\n * @return {{label: import(\"../canvas.js\").Label, anchorX: number, anchorY: number}} The text image and its anchor.\n */\n drawLabelWithPointPlacement_(text, textKey, strokeKey, fillKey) {\n const textState = this.textStates[textKey];\n\n const label = this.createLabel(text, textKey, fillKey, strokeKey);\n\n const strokeState = this.strokeStates[strokeKey];\n const pixelRatio = this.pixelRatio;\n const align = horizontalTextAlign(\n Array.isArray(text) ? text[0] : text,\n textState.textAlign || defaultTextAlign,\n );\n const baseline = TEXT_ALIGN[textState.textBaseline || defaultTextBaseline];\n const strokeWidth =\n strokeState && strokeState.lineWidth ? strokeState.lineWidth : 0;\n\n // Remove the 2 pixels we added in createLabel() for the anchor\n const width = label.width / pixelRatio - 2 * textState.scale[0];\n const anchorX = align * width + 2 * (0.5 - align) * strokeWidth;\n const anchorY =\n (baseline * label.height) / pixelRatio +\n 2 * (0.5 - baseline) * strokeWidth;\n\n return {\n label: label,\n anchorX: anchorX,\n anchorY: anchorY,\n };\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} context Context.\n * @param {import('../../size.js').Size} scaledCanvasSize Scaled canvas size\n * @param {import(\"../../transform.js\").Transform} transform Transform.\n * @param {Array<*>} instructions Instructions array.\n * @param {boolean} snapToPixel Snap point symbols and text to integer pixels.\n * @param {FeatureCallback} [featureCallback] Feature callback.\n * @param {import(\"../../extent.js\").Extent} [hitExtent] Only check\n * features that intersect this extent.\n * @param {import(\"rbush\").default} [declutterTree] Declutter tree.\n * @return {T|undefined} Callback result.\n * @template T\n */\n execute_(\n context,\n scaledCanvasSize,\n transform,\n instructions,\n snapToPixel,\n featureCallback,\n hitExtent,\n declutterTree,\n ) {\n const zIndexContext = this.zIndexContext_;\n /** @type {Array} */\n let pixelCoordinates;\n if (this.pixelCoordinates_ && equals(transform, this.renderedTransform_)) {\n pixelCoordinates = this.pixelCoordinates_;\n } else {\n if (!this.pixelCoordinates_) {\n this.pixelCoordinates_ = [];\n }\n pixelCoordinates = transform2D(\n this.coordinates,\n 0,\n this.coordinates.length,\n 2,\n transform,\n this.pixelCoordinates_,\n );\n transformSetFromArray(this.renderedTransform_, transform);\n }\n let i = 0; // instruction index\n const ii = instructions.length; // end of instructions\n let d = 0; // data index\n let dd; // end of per-instruction data\n let anchorX,\n anchorY,\n /** @type {import('../../style/Style.js').DeclutterMode} */\n declutterMode,\n prevX,\n prevY,\n roundX,\n roundY,\n image,\n text,\n textKey,\n strokeKey,\n fillKey;\n let pendingFill = 0;\n let pendingStroke = 0;\n let lastFillInstruction = null;\n let lastStrokeInstruction = null;\n const coordinateCache = this.coordinateCache_;\n const viewRotation = this.viewRotation_;\n const viewRotationFromTransform =\n Math.round(Math.atan2(-transform[1], transform[0]) * 1e12) / 1e12;\n\n const state = /** @type {import(\"../../render.js\").State} */ ({\n context: context,\n pixelRatio: this.pixelRatio,\n resolution: this.resolution,\n rotation: viewRotation,\n });\n\n // When the batch size gets too big, performance decreases. 200 is a good\n // balance between batch size and number of fill/stroke instructions.\n const batchSize =\n this.instructions != instructions || this.overlaps ? 0 : 200;\n let /** @type {import(\"../../Feature.js\").FeatureLike} */ feature;\n let x, y, currentGeometry;\n while (i < ii) {\n const instruction = instructions[i];\n const type = /** @type {import(\"./Instruction.js\").default} */ (\n instruction[0]\n );\n switch (type) {\n case CanvasInstruction.BEGIN_GEOMETRY:\n feature = /** @type {import(\"../../Feature.js\").FeatureLike} */ (\n instruction[1]\n );\n currentGeometry = instruction[3];\n if (!feature.getGeometry()) {\n i = /** @type {number} */ (instruction[2]);\n } else if (\n hitExtent !== undefined &&\n !intersects(hitExtent, currentGeometry.getExtent())\n ) {\n i = /** @type {number} */ (instruction[2]) + 1;\n } else {\n ++i;\n }\n if (zIndexContext) {\n zIndexContext.zIndex = instruction[4];\n }\n break;\n case CanvasInstruction.BEGIN_PATH:\n if (pendingFill > batchSize) {\n this.fill_(context);\n pendingFill = 0;\n }\n if (pendingStroke > batchSize) {\n context.stroke();\n pendingStroke = 0;\n }\n if (!pendingFill && !pendingStroke) {\n context.beginPath();\n prevX = NaN;\n prevY = NaN;\n }\n ++i;\n break;\n case CanvasInstruction.CIRCLE:\n d = /** @type {number} */ (instruction[1]);\n const x1 = pixelCoordinates[d];\n const y1 = pixelCoordinates[d + 1];\n const x2 = pixelCoordinates[d + 2];\n const y2 = pixelCoordinates[d + 3];\n const dx = x2 - x1;\n const dy = y2 - y1;\n const r = Math.sqrt(dx * dx + dy * dy);\n context.moveTo(x1 + r, y1);\n context.arc(x1, y1, r, 0, 2 * Math.PI, true);\n ++i;\n break;\n case CanvasInstruction.CLOSE_PATH:\n context.closePath();\n ++i;\n break;\n case CanvasInstruction.CUSTOM:\n d = /** @type {number} */ (instruction[1]);\n dd = instruction[2];\n const geometry =\n /** @type {import(\"../../geom/SimpleGeometry.js\").default} */ (\n instruction[3]\n );\n const renderer = instruction[4];\n const fn = instruction[5];\n state.geometry = geometry;\n state.feature = feature;\n if (!(i in coordinateCache)) {\n coordinateCache[i] = [];\n }\n const coords = coordinateCache[i];\n if (fn) {\n fn(pixelCoordinates, d, dd, 2, coords);\n } else {\n coords[0] = pixelCoordinates[d];\n coords[1] = pixelCoordinates[d + 1];\n coords.length = 2;\n }\n if (zIndexContext) {\n zIndexContext.zIndex = instruction[6];\n }\n renderer(coords, state);\n ++i;\n break;\n case CanvasInstruction.DRAW_IMAGE:\n d = /** @type {number} */ (instruction[1]);\n dd = /** @type {number} */ (instruction[2]);\n image =\n /** @type {HTMLCanvasElement|HTMLVideoElement|HTMLImageElement} */ (\n instruction[3]\n );\n\n // Remaining arguments in DRAW_IMAGE are in alphabetical order\n anchorX = /** @type {number} */ (instruction[4]);\n anchorY = /** @type {number} */ (instruction[5]);\n let height = /** @type {number} */ (instruction[6]);\n const opacity = /** @type {number} */ (instruction[7]);\n const originX = /** @type {number} */ (instruction[8]);\n const originY = /** @type {number} */ (instruction[9]);\n const rotateWithView = /** @type {boolean} */ (instruction[10]);\n let rotation = /** @type {number} */ (instruction[11]);\n const scale = /** @type {import(\"../../size.js\").Size} */ (\n instruction[12]\n );\n let width = /** @type {number} */ (instruction[13]);\n declutterMode = instruction[14] || 'declutter';\n const declutterImageWithText =\n /** @type {{args: import(\"../canvas.js\").DeclutterImageWithText, declutterMode: import('../../style/Style.js').DeclutterMode}} */ (\n instruction[15]\n );\n\n if (!image && instruction.length >= 20) {\n // create label images\n text = /** @type {string} */ (instruction[19]);\n textKey = /** @type {string} */ (instruction[20]);\n strokeKey = /** @type {string} */ (instruction[21]);\n fillKey = /** @type {string} */ (instruction[22]);\n const labelWithAnchor = this.drawLabelWithPointPlacement_(\n text,\n textKey,\n strokeKey,\n fillKey,\n );\n image = labelWithAnchor.label;\n instruction[3] = image;\n const textOffsetX = /** @type {number} */ (instruction[23]);\n anchorX = (labelWithAnchor.anchorX - textOffsetX) * this.pixelRatio;\n instruction[4] = anchorX;\n const textOffsetY = /** @type {number} */ (instruction[24]);\n anchorY = (labelWithAnchor.anchorY - textOffsetY) * this.pixelRatio;\n instruction[5] = anchorY;\n height = image.height;\n instruction[6] = height;\n width = image.width;\n instruction[13] = width;\n }\n\n let geometryWidths;\n if (instruction.length > 25) {\n geometryWidths = /** @type {number} */ (instruction[25]);\n }\n\n let padding, backgroundFill, backgroundStroke;\n if (instruction.length > 17) {\n padding = /** @type {Array} */ (instruction[16]);\n backgroundFill = /** @type {boolean} */ (instruction[17]);\n backgroundStroke = /** @type {boolean} */ (instruction[18]);\n } else {\n padding = defaultPadding;\n backgroundFill = false;\n backgroundStroke = false;\n }\n\n if (rotateWithView && viewRotationFromTransform) {\n // Canvas is expected to be rotated to reverse view rotation.\n rotation += viewRotation;\n } else if (!rotateWithView && !viewRotationFromTransform) {\n // Canvas is not rotated, images need to be rotated back to be north-up.\n rotation -= viewRotation;\n }\n let widthIndex = 0;\n for (; d < dd; d += 2) {\n if (\n geometryWidths &&\n geometryWidths[widthIndex++] < width / this.pixelRatio\n ) {\n continue;\n }\n const dimensions = this.calculateImageOrLabelDimensions_(\n image.width,\n image.height,\n pixelCoordinates[d],\n pixelCoordinates[d + 1],\n width,\n height,\n anchorX,\n anchorY,\n originX,\n originY,\n rotation,\n scale,\n snapToPixel,\n padding,\n backgroundFill || backgroundStroke,\n feature,\n );\n /** @type {ReplayImageOrLabelArgs} */\n const args = [\n context,\n scaledCanvasSize,\n image,\n dimensions,\n opacity,\n backgroundFill\n ? /** @type {Array<*>} */ (lastFillInstruction)\n : null,\n backgroundStroke\n ? /** @type {Array<*>} */ (lastStrokeInstruction)\n : null,\n ];\n if (declutterTree) {\n let imageArgs, imageDeclutterMode, imageDeclutterBox;\n if (declutterImageWithText) {\n const index = dd - d;\n if (!declutterImageWithText[index]) {\n // We now have the image for an image+text combination.\n declutterImageWithText[index] = {args, declutterMode};\n // Don't render anything for now, wait for the text.\n continue;\n }\n const imageDeclutter = declutterImageWithText[index];\n imageArgs = imageDeclutter.args;\n imageDeclutterMode = imageDeclutter.declutterMode;\n delete declutterImageWithText[index];\n imageDeclutterBox = getDeclutterBox(imageArgs);\n }\n // We now have image and text for an image+text combination.\n let renderImage, renderText;\n if (\n imageArgs &&\n (imageDeclutterMode !== 'declutter' ||\n !declutterTree.collides(imageDeclutterBox))\n ) {\n renderImage = true;\n }\n if (\n declutterMode !== 'declutter' ||\n !declutterTree.collides(dimensions.declutterBox)\n ) {\n renderText = true;\n }\n if (\n imageDeclutterMode === 'declutter' &&\n declutterMode === 'declutter'\n ) {\n const render = renderImage && renderText;\n renderImage = render;\n renderText = render;\n }\n if (renderImage) {\n if (imageDeclutterMode !== 'none') {\n declutterTree.insert(imageDeclutterBox);\n }\n this.replayImageOrLabel_.apply(this, imageArgs);\n }\n if (renderText) {\n if (declutterMode !== 'none') {\n declutterTree.insert(dimensions.declutterBox);\n }\n this.replayImageOrLabel_.apply(this, args);\n }\n } else {\n this.replayImageOrLabel_.apply(this, args);\n }\n }\n ++i;\n break;\n case CanvasInstruction.DRAW_CHARS:\n const begin = /** @type {number} */ (instruction[1]);\n const end = /** @type {number} */ (instruction[2]);\n const baseline = /** @type {number} */ (instruction[3]);\n const overflow = /** @type {number} */ (instruction[4]);\n fillKey = /** @type {string} */ (instruction[5]);\n const maxAngle = /** @type {number} */ (instruction[6]);\n const measurePixelRatio = /** @type {number} */ (instruction[7]);\n const offsetY = /** @type {number} */ (instruction[8]);\n strokeKey = /** @type {string} */ (instruction[9]);\n const strokeWidth = /** @type {number} */ (instruction[10]);\n text = /** @type {string} */ (instruction[11]);\n textKey = /** @type {string} */ (instruction[12]);\n const pixelRatioScale = [\n /** @type {number} */ (instruction[13]),\n /** @type {number} */ (instruction[13]),\n ];\n declutterMode = instruction[14] || 'declutter';\n\n const textState = this.textStates[textKey];\n const font = textState.font;\n const textScale = [\n textState.scale[0] * measurePixelRatio,\n textState.scale[1] * measurePixelRatio,\n ];\n\n let cachedWidths;\n if (font in this.widths_) {\n cachedWidths = this.widths_[font];\n } else {\n cachedWidths = {};\n this.widths_[font] = cachedWidths;\n }\n\n const pathLength = lineStringLength(pixelCoordinates, begin, end, 2);\n const textLength =\n Math.abs(textScale[0]) *\n measureAndCacheTextWidth(font, text, cachedWidths);\n if (overflow || textLength <= pathLength) {\n const textAlign = this.textStates[textKey].textAlign;\n const startM =\n (pathLength - textLength) * horizontalTextAlign(text, textAlign);\n const parts = drawTextOnPath(\n pixelCoordinates,\n begin,\n end,\n 2,\n text,\n startM,\n maxAngle,\n Math.abs(textScale[0]),\n measureAndCacheTextWidth,\n font,\n cachedWidths,\n viewRotationFromTransform ? 0 : this.viewRotation_,\n );\n drawChars: if (parts) {\n /** @type {Array} */\n const replayImageOrLabelArgs = [];\n let c, cc, chars, label, part;\n if (strokeKey) {\n for (c = 0, cc = parts.length; c < cc; ++c) {\n part = parts[c]; // x, y, anchorX, rotation, chunk\n chars = /** @type {string} */ (part[4]);\n label = this.createLabel(chars, textKey, '', strokeKey);\n anchorX =\n /** @type {number} */ (part[2]) +\n (textScale[0] < 0 ? -strokeWidth : strokeWidth);\n anchorY =\n baseline * label.height +\n ((0.5 - baseline) * 2 * strokeWidth * textScale[1]) /\n textScale[0] -\n offsetY;\n const dimensions = this.calculateImageOrLabelDimensions_(\n label.width,\n label.height,\n part[0],\n part[1],\n label.width,\n label.height,\n anchorX,\n anchorY,\n 0,\n 0,\n part[3],\n pixelRatioScale,\n false,\n defaultPadding,\n false,\n feature,\n );\n if (\n declutterTree &&\n declutterMode === 'declutter' &&\n declutterTree.collides(dimensions.declutterBox)\n ) {\n break drawChars;\n }\n replayImageOrLabelArgs.push([\n context,\n scaledCanvasSize,\n label,\n dimensions,\n 1,\n null,\n null,\n ]);\n }\n }\n if (fillKey) {\n for (c = 0, cc = parts.length; c < cc; ++c) {\n part = parts[c]; // x, y, anchorX, rotation, chunk\n chars = /** @type {string} */ (part[4]);\n label = this.createLabel(chars, textKey, fillKey, '');\n anchorX = /** @type {number} */ (part[2]);\n anchorY = baseline * label.height - offsetY;\n const dimensions = this.calculateImageOrLabelDimensions_(\n label.width,\n label.height,\n part[0],\n part[1],\n label.width,\n label.height,\n anchorX,\n anchorY,\n 0,\n 0,\n part[3],\n pixelRatioScale,\n false,\n defaultPadding,\n false,\n feature,\n );\n if (\n declutterTree &&\n declutterMode === 'declutter' &&\n declutterTree.collides(dimensions.declutterBox)\n ) {\n break drawChars;\n }\n replayImageOrLabelArgs.push([\n context,\n scaledCanvasSize,\n label,\n dimensions,\n 1,\n null,\n null,\n ]);\n }\n }\n if (declutterTree && declutterMode !== 'none') {\n declutterTree.load(replayImageOrLabelArgs.map(getDeclutterBox));\n }\n for (let i = 0, ii = replayImageOrLabelArgs.length; i < ii; ++i) {\n this.replayImageOrLabel_.apply(this, replayImageOrLabelArgs[i]);\n }\n }\n }\n ++i;\n break;\n case CanvasInstruction.END_GEOMETRY:\n if (featureCallback !== undefined) {\n feature = /** @type {import(\"../../Feature.js\").FeatureLike} */ (\n instruction[1]\n );\n const result = featureCallback(\n feature,\n currentGeometry,\n declutterMode,\n );\n if (result) {\n return result;\n }\n }\n ++i;\n break;\n case CanvasInstruction.FILL:\n if (batchSize) {\n pendingFill++;\n } else {\n this.fill_(context);\n }\n ++i;\n break;\n case CanvasInstruction.MOVE_TO_LINE_TO:\n d = /** @type {number} */ (instruction[1]);\n dd = /** @type {number} */ (instruction[2]);\n x = pixelCoordinates[d];\n y = pixelCoordinates[d + 1];\n context.moveTo(x, y);\n prevX = (x + 0.5) | 0;\n prevY = (y + 0.5) | 0;\n for (d += 2; d < dd; d += 2) {\n x = pixelCoordinates[d];\n y = pixelCoordinates[d + 1];\n roundX = (x + 0.5) | 0;\n roundY = (y + 0.5) | 0;\n if (d == dd - 2 || roundX !== prevX || roundY !== prevY) {\n context.lineTo(x, y);\n prevX = roundX;\n prevY = roundY;\n }\n }\n ++i;\n break;\n case CanvasInstruction.SET_FILL_STYLE:\n lastFillInstruction = instruction;\n this.alignAndScaleFill_ = instruction[2];\n\n if (pendingFill) {\n this.fill_(context);\n pendingFill = 0;\n if (pendingStroke) {\n context.stroke();\n pendingStroke = 0;\n }\n }\n\n /** @type {import(\"../../colorlike.js\").ColorLike} */\n context.fillStyle = instruction[1];\n ++i;\n break;\n case CanvasInstruction.SET_STROKE_STYLE:\n lastStrokeInstruction = instruction;\n if (pendingStroke) {\n context.stroke();\n pendingStroke = 0;\n }\n this.setStrokeStyle_(context, /** @type {Array<*>} */ (instruction));\n ++i;\n break;\n case CanvasInstruction.STROKE:\n if (batchSize) {\n pendingStroke++;\n } else {\n context.stroke();\n }\n ++i;\n break;\n default: // consume the instruction anyway, to avoid an infinite loop\n ++i;\n break;\n }\n }\n if (pendingFill) {\n this.fill_(context);\n }\n if (pendingStroke) {\n context.stroke();\n }\n return undefined;\n }\n\n /**\n * @param {CanvasRenderingContext2D} context Context.\n * @param {import('../../size.js').Size} scaledCanvasSize Scaled canvas size.\n * @param {import(\"../../transform.js\").Transform} transform Transform.\n * @param {number} viewRotation View rotation.\n * @param {boolean} snapToPixel Snap point symbols and text to integer pixels.\n * @param {import(\"rbush\").default} [declutterTree] Declutter tree.\n */\n execute(\n context,\n scaledCanvasSize,\n transform,\n viewRotation,\n snapToPixel,\n declutterTree,\n ) {\n this.viewRotation_ = viewRotation;\n this.execute_(\n context,\n scaledCanvasSize,\n transform,\n this.instructions,\n snapToPixel,\n undefined,\n undefined,\n declutterTree,\n );\n }\n\n /**\n * @param {CanvasRenderingContext2D} context Context.\n * @param {import(\"../../transform.js\").Transform} transform Transform.\n * @param {number} viewRotation View rotation.\n * @param {FeatureCallback} [featureCallback] Feature callback.\n * @param {import(\"../../extent.js\").Extent} [hitExtent] Only check\n * features that intersect this extent.\n * @return {T|undefined} Callback result.\n * @template T\n */\n executeHitDetection(\n context,\n transform,\n viewRotation,\n featureCallback,\n hitExtent,\n ) {\n this.viewRotation_ = viewRotation;\n return this.execute_(\n context,\n [context.canvas.width, context.canvas.height],\n transform,\n this.hitDetectionInstructions,\n true,\n featureCallback,\n hitExtent,\n );\n }\n}\n\nexport default Executor;\n","/**\n * @module ol/render/canvas/ExecutorGroup\n */\n\nimport Executor from './Executor.js';\nimport {ascending} from '../../array.js';\nimport {buffer, createEmpty, extendCoordinate} from '../../extent.js';\nimport {\n compose as composeTransform,\n create as createTransform,\n} from '../../transform.js';\nimport {createCanvasContext2D} from '../../dom.js';\nimport {isEmpty} from '../../obj.js';\nimport {transform2D} from '../../geom/flat/transform.js';\n\n/**\n * @const\n * @type {Array}\n */\nexport const ALL = [\n 'Polygon',\n 'Circle',\n 'LineString',\n 'Image',\n 'Text',\n 'Default',\n];\n\n/**\n * @const\n * @type {Array}\n */\nexport const DECLUTTER = ['Image', 'Text'];\n\n/**\n * @const\n * @type {Array}\n */\nexport const NON_DECLUTTER = ALL.filter(\n (builderType) => !DECLUTTER.includes(builderType),\n);\n\nclass ExecutorGroup {\n /**\n * @param {import(\"../../extent.js\").Extent} maxExtent Max extent for clipping. When a\n * `maxExtent` was set on the Builder for this executor group, the same `maxExtent`\n * should be set here, unless the target context does not exceed that extent (which\n * can be the case when rendering to tiles).\n * @param {number} resolution Resolution.\n * @param {number} pixelRatio Pixel ratio.\n * @param {boolean} overlaps The executor group can have overlapping geometries.\n * @param {!Object>} allInstructions\n * The serializable instructions.\n * @param {number} [renderBuffer] Optional rendering buffer.\n * @param {boolean} [deferredRendering] Enable deferred rendering with renderDeferred().\n */\n constructor(\n maxExtent,\n resolution,\n pixelRatio,\n overlaps,\n allInstructions,\n renderBuffer,\n deferredRendering,\n ) {\n /**\n * @private\n * @type {import(\"../../extent.js\").Extent}\n */\n this.maxExtent_ = maxExtent;\n\n /**\n * @private\n * @type {boolean}\n */\n this.overlaps_ = overlaps;\n\n /**\n * @private\n * @type {number}\n */\n this.pixelRatio_ = pixelRatio;\n\n /**\n * @private\n * @type {number}\n */\n this.resolution_ = resolution;\n\n /**\n * @private\n * @type {number|undefined}\n */\n this.renderBuffer_ = renderBuffer;\n\n /**\n * @private\n * @type {!Object>}\n */\n this.executorsByZIndex_ = {};\n\n /**\n * @private\n * @type {CanvasRenderingContext2D}\n */\n this.hitDetectionContext_ = null;\n\n /**\n * @private\n * @type {import(\"../../transform.js\").Transform}\n */\n this.hitDetectionTransform_ = createTransform();\n\n /**\n * @private\n * @type {CanvasRenderingContext2D}\n */\n this.renderedContext_ = null;\n\n /**\n * @private\n * @type {Object>}\n */\n this.deferredZIndexContexts_ = {};\n\n this.createExecutors_(allInstructions, deferredRendering);\n }\n\n /**\n * @param {CanvasRenderingContext2D} context Context.\n * @param {import(\"../../transform.js\").Transform} transform Transform.\n */\n clip(context, transform) {\n const flatClipCoords = this.getClipCoords(transform);\n context.beginPath();\n context.moveTo(flatClipCoords[0], flatClipCoords[1]);\n context.lineTo(flatClipCoords[2], flatClipCoords[3]);\n context.lineTo(flatClipCoords[4], flatClipCoords[5]);\n context.lineTo(flatClipCoords[6], flatClipCoords[7]);\n context.clip();\n }\n\n /**\n * Create executors and populate them using the provided instructions.\n * @private\n * @param {!Object>} allInstructions The serializable instructions\n * @param {boolean} deferredRendering Enable deferred rendering.\n */\n createExecutors_(allInstructions, deferredRendering) {\n for (const zIndex in allInstructions) {\n let executors = this.executorsByZIndex_[zIndex];\n if (executors === undefined) {\n executors = {};\n this.executorsByZIndex_[zIndex] = executors;\n }\n const instructionByZindex = allInstructions[zIndex];\n for (const builderType in instructionByZindex) {\n const instructions = instructionByZindex[builderType];\n executors[builderType] = new Executor(\n this.resolution_,\n this.pixelRatio_,\n this.overlaps_,\n instructions,\n deferredRendering,\n );\n }\n }\n }\n\n /**\n * @param {Array} executors Executors.\n * @return {boolean} Has executors of the provided types.\n */\n hasExecutors(executors) {\n for (const zIndex in this.executorsByZIndex_) {\n const candidates = this.executorsByZIndex_[zIndex];\n for (let i = 0, ii = executors.length; i < ii; ++i) {\n if (executors[i] in candidates) {\n return true;\n }\n }\n }\n return false;\n }\n\n /**\n * @param {import(\"../../coordinate.js\").Coordinate} coordinate Coordinate.\n * @param {number} resolution Resolution.\n * @param {number} rotation Rotation.\n * @param {number} hitTolerance Hit tolerance in pixels.\n * @param {function(import(\"../../Feature.js\").FeatureLike, import(\"../../geom/SimpleGeometry.js\").default, number): T} callback Feature callback.\n * @param {Array} declutteredFeatures Decluttered features.\n * @return {T|undefined} Callback result.\n * @template T\n */\n forEachFeatureAtCoordinate(\n coordinate,\n resolution,\n rotation,\n hitTolerance,\n callback,\n declutteredFeatures,\n ) {\n hitTolerance = Math.round(hitTolerance);\n const contextSize = hitTolerance * 2 + 1;\n const transform = composeTransform(\n this.hitDetectionTransform_,\n hitTolerance + 0.5,\n hitTolerance + 0.5,\n 1 / resolution,\n -1 / resolution,\n -rotation,\n -coordinate[0],\n -coordinate[1],\n );\n\n const newContext = !this.hitDetectionContext_;\n if (newContext) {\n this.hitDetectionContext_ = createCanvasContext2D(\n contextSize,\n contextSize,\n undefined,\n {willReadFrequently: true},\n );\n }\n const context = this.hitDetectionContext_;\n\n if (\n context.canvas.width !== contextSize ||\n context.canvas.height !== contextSize\n ) {\n context.canvas.width = contextSize;\n context.canvas.height = contextSize;\n } else if (!newContext) {\n context.clearRect(0, 0, contextSize, contextSize);\n }\n\n /**\n * @type {import(\"../../extent.js\").Extent}\n */\n let hitExtent;\n if (this.renderBuffer_ !== undefined) {\n hitExtent = createEmpty();\n extendCoordinate(hitExtent, coordinate);\n buffer(\n hitExtent,\n resolution * (this.renderBuffer_ + hitTolerance),\n hitExtent,\n );\n }\n\n const indexes = getPixelIndexArray(hitTolerance);\n\n let builderType;\n\n /**\n * @param {import(\"../../Feature.js\").FeatureLike} feature Feature.\n * @param {import(\"../../geom/SimpleGeometry.js\").default} geometry Geometry.\n * @param {import('../../style/Style.js').DeclutterMode} declutterMode Declutter mode.\n * @return {T|undefined} Callback result.\n */\n function featureCallback(feature, geometry, declutterMode) {\n const imageData = context.getImageData(\n 0,\n 0,\n contextSize,\n contextSize,\n ).data;\n for (let i = 0, ii = indexes.length; i < ii; i++) {\n if (imageData[indexes[i]] > 0) {\n if (\n !declutteredFeatures ||\n declutterMode === 'none' ||\n (builderType !== 'Image' && builderType !== 'Text') ||\n declutteredFeatures.includes(feature)\n ) {\n const idx = (indexes[i] - 3) / 4;\n const x = hitTolerance - (idx % contextSize);\n const y = hitTolerance - ((idx / contextSize) | 0);\n const result = callback(feature, geometry, x * x + y * y);\n if (result) {\n return result;\n }\n }\n context.clearRect(0, 0, contextSize, contextSize);\n break;\n }\n }\n return undefined;\n }\n\n /** @type {Array} */\n const zs = Object.keys(this.executorsByZIndex_).map(Number);\n zs.sort(ascending);\n\n let i, j, executors, executor, result;\n for (i = zs.length - 1; i >= 0; --i) {\n const zIndexKey = zs[i].toString();\n executors = this.executorsByZIndex_[zIndexKey];\n for (j = ALL.length - 1; j >= 0; --j) {\n builderType = ALL[j];\n executor = executors[builderType];\n if (executor !== undefined) {\n result = executor.executeHitDetection(\n context,\n transform,\n rotation,\n featureCallback,\n hitExtent,\n );\n if (result) {\n return result;\n }\n }\n }\n }\n return undefined;\n }\n\n /**\n * @param {import(\"../../transform.js\").Transform} transform Transform.\n * @return {Array|null} Clip coordinates.\n */\n getClipCoords(transform) {\n const maxExtent = this.maxExtent_;\n if (!maxExtent) {\n return null;\n }\n const minX = maxExtent[0];\n const minY = maxExtent[1];\n const maxX = maxExtent[2];\n const maxY = maxExtent[3];\n const flatClipCoords = [minX, minY, minX, maxY, maxX, maxY, maxX, minY];\n transform2D(flatClipCoords, 0, 8, 2, transform, flatClipCoords);\n return flatClipCoords;\n }\n\n /**\n * @return {boolean} Is empty.\n */\n isEmpty() {\n return isEmpty(this.executorsByZIndex_);\n }\n\n /**\n * @param {CanvasRenderingContext2D} targetContext Context.\n * @param {import('../../size.js').Size} scaledCanvasSize Scale of the context.\n * @param {import(\"../../transform.js\").Transform} transform Transform.\n * @param {number} viewRotation View rotation.\n * @param {boolean} snapToPixel Snap point symbols and test to integer pixel.\n * @param {Array} [builderTypes] Ordered replay types to replay.\n * Default is {@link module:ol/render/replay~ALL}\n * @param {import(\"rbush\").default|null} [declutterTree] Declutter tree.\n * When set to null, no decluttering is done, even when the executor group has a `ZIndexContext`.\n */\n execute(\n targetContext,\n scaledCanvasSize,\n transform,\n viewRotation,\n snapToPixel,\n builderTypes,\n declutterTree,\n ) {\n /** @type {Array} */\n const zs = Object.keys(this.executorsByZIndex_).map(Number);\n zs.sort(ascending);\n\n builderTypes = builderTypes ? builderTypes : ALL;\n const maxBuilderTypes = ALL.length;\n let i, ii, j, jj, replays;\n if (declutterTree) {\n zs.reverse();\n }\n for (i = 0, ii = zs.length; i < ii; ++i) {\n const zIndexKey = zs[i].toString();\n replays = this.executorsByZIndex_[zIndexKey];\n for (j = 0, jj = builderTypes.length; j < jj; ++j) {\n const builderType = builderTypes[j];\n const replay = replays[builderType];\n if (replay !== undefined) {\n const zIndexContext =\n declutterTree === null ? undefined : replay.getZIndexContext();\n const context = zIndexContext\n ? zIndexContext.getContext()\n : targetContext;\n const requireClip =\n this.maxExtent_ &&\n builderType !== 'Image' &&\n builderType !== 'Text';\n if (requireClip) {\n context.save();\n // setup clipping so that the parts of over-simplified geometries are not\n // visible outside the current extent when panning\n this.clip(context, transform);\n }\n if (\n !zIndexContext ||\n builderType === 'Text' ||\n builderType === 'Image'\n ) {\n replay.execute(\n context,\n scaledCanvasSize,\n transform,\n viewRotation,\n snapToPixel,\n declutterTree,\n );\n } else {\n zIndexContext.pushFunction((context) =>\n replay.execute(\n context,\n scaledCanvasSize,\n transform,\n viewRotation,\n snapToPixel,\n declutterTree,\n ),\n );\n }\n if (requireClip) {\n context.restore();\n }\n if (zIndexContext) {\n zIndexContext.offset();\n const index = zs[i] * maxBuilderTypes + j;\n if (!this.deferredZIndexContexts_[index]) {\n this.deferredZIndexContexts_[index] = [];\n }\n this.deferredZIndexContexts_[index].push(zIndexContext);\n }\n }\n }\n }\n\n this.renderedContext_ = targetContext;\n }\n\n getDeferredZIndexContexts() {\n return this.deferredZIndexContexts_;\n }\n\n getRenderedContext() {\n return this.renderedContext_;\n }\n\n renderDeferred() {\n const deferredZIndexContexts = this.deferredZIndexContexts_;\n const zs = Object.keys(deferredZIndexContexts).map(Number).sort(ascending);\n for (let i = 0, ii = zs.length; i < ii; ++i) {\n deferredZIndexContexts[zs[i]].forEach((zIndexContext) => {\n zIndexContext.draw(this.renderedContext_); // FIXME Pass clip to replay for temporarily enabling clip\n zIndexContext.clear();\n });\n deferredZIndexContexts[zs[i]].length = 0;\n }\n }\n}\n\n/**\n * This cache is used to store arrays of indexes for calculated pixel circles\n * to increase performance.\n * It is a static property to allow each Replaygroup to access it.\n * @type {Object>}\n */\nconst circlePixelIndexArrayCache = {};\n\n/**\n * This methods creates an array with indexes of all pixels within a circle,\n * ordered by how close they are to the center.\n * A cache is used to increase performance.\n * @param {number} radius Radius.\n * @return {Array} An array with indexes within a circle.\n */\nexport function getPixelIndexArray(radius) {\n if (circlePixelIndexArrayCache[radius] !== undefined) {\n return circlePixelIndexArrayCache[radius];\n }\n\n const size = radius * 2 + 1;\n const maxDistanceSq = radius * radius;\n const distances = new Array(maxDistanceSq + 1);\n for (let i = 0; i <= radius; ++i) {\n for (let j = 0; j <= radius; ++j) {\n const distanceSq = i * i + j * j;\n if (distanceSq > maxDistanceSq) {\n break;\n }\n let distance = distances[distanceSq];\n if (!distance) {\n distance = [];\n distances[distanceSq] = distance;\n }\n distance.push(((radius + i) * size + (radius + j)) * 4 + 3);\n if (i > 0) {\n distance.push(((radius - i) * size + (radius + j)) * 4 + 3);\n }\n if (j > 0) {\n distance.push(((radius + i) * size + (radius - j)) * 4 + 3);\n if (i > 0) {\n distance.push(((radius - i) * size + (radius - j)) * 4 + 3);\n }\n }\n }\n }\n\n const pixelIndex = [];\n for (let i = 0, ii = distances.length; i < ii; ++i) {\n if (distances[i]) {\n pixelIndex.push(...distances[i]);\n }\n }\n\n circlePixelIndexArrayCache[radius] = pixelIndex;\n return pixelIndex;\n}\n\nexport default ExecutorGroup;\n","/**\n * @module ol/render/canvas/hitdetect\n */\n\nimport CanvasImmediateRenderer from './Immediate.js';\nimport {Icon} from '../../style.js';\nimport {ascending} from '../../array.js';\nimport {clamp} from '../../math.js';\nimport {createCanvasContext2D} from '../../dom.js';\nimport {\n getTransformFromProjections,\n getUserProjection,\n toUserExtent,\n} from '../../proj.js';\nimport {intersects} from '../../extent.js';\n\nexport const HIT_DETECT_RESOLUTION = 0.5;\n\n/**\n * @param {import(\"../../size.js\").Size} size Canvas size in css pixels.\n * @param {Array} transforms Transforms\n * for rendering features to all worlds of the viewport, from coordinates to css\n * pixels.\n * @param {Array} features\n * Features to consider for hit detection.\n * @param {import(\"../../style/Style.js\").StyleFunction|undefined} styleFunction\n * Layer style function.\n * @param {import(\"../../extent.js\").Extent} extent Extent in render projection.\n * @param {number} resolution Resolution.\n * @param {number} rotation Rotation.\n * @param {number} [squaredTolerance] Squared tolerance.\n * @param {import(\"../../proj/Projection.js\").default} [projection] Render projection.\n * @return {ImageData} Hit detection image data.\n */\nexport function createHitDetectionImageData(\n size,\n transforms,\n features,\n styleFunction,\n extent,\n resolution,\n rotation,\n squaredTolerance,\n projection,\n) {\n const userExtent = projection ? toUserExtent(extent, projection) : extent;\n const width = size[0] * HIT_DETECT_RESOLUTION;\n const height = size[1] * HIT_DETECT_RESOLUTION;\n const context = createCanvasContext2D(width, height);\n context.imageSmoothingEnabled = false;\n const canvas = context.canvas;\n const renderer = new CanvasImmediateRenderer(\n context,\n HIT_DETECT_RESOLUTION,\n extent,\n null,\n rotation,\n squaredTolerance,\n projection\n ? getTransformFromProjections(getUserProjection(), projection)\n : null,\n );\n const featureCount = features.length;\n // Stretch hit detection index to use the whole available color range\n const indexFactor = Math.floor((256 * 256 * 256 - 1) / featureCount);\n const featuresByZIndex = {};\n for (let i = 1; i <= featureCount; ++i) {\n const feature = features[i - 1];\n const featureStyleFunction = feature.getStyleFunction() || styleFunction;\n if (!featureStyleFunction) {\n continue;\n }\n let styles = featureStyleFunction(feature, resolution);\n if (!styles) {\n continue;\n }\n if (!Array.isArray(styles)) {\n styles = [styles];\n }\n const index = i * indexFactor;\n const color = index.toString(16).padStart(7, '#00000');\n for (let j = 0, jj = styles.length; j < jj; ++j) {\n const originalStyle = styles[j];\n const geometry = originalStyle.getGeometryFunction()(feature);\n if (!geometry || !intersects(userExtent, geometry.getExtent())) {\n continue;\n }\n const style = originalStyle.clone();\n const fill = style.getFill();\n if (fill) {\n fill.setColor(color);\n }\n const stroke = style.getStroke();\n if (stroke) {\n stroke.setColor(color);\n stroke.setLineDash(null);\n }\n style.setText(undefined);\n const image = originalStyle.getImage();\n if (image) {\n const imgSize = image.getImageSize();\n if (!imgSize) {\n continue;\n }\n\n const imgContext = createCanvasContext2D(\n imgSize[0],\n imgSize[1],\n undefined,\n {alpha: false},\n );\n const img = imgContext.canvas;\n imgContext.fillStyle = color;\n imgContext.fillRect(0, 0, img.width, img.height);\n style.setImage(\n new Icon({\n img: img,\n anchor: image.getAnchor(),\n anchorXUnits: 'pixels',\n anchorYUnits: 'pixels',\n offset: image.getOrigin(),\n opacity: 1,\n size: image.getSize(),\n scale: image.getScale(),\n rotation: image.getRotation(),\n rotateWithView: image.getRotateWithView(),\n }),\n );\n }\n const zIndex = style.getZIndex() || 0;\n let byGeometryType = featuresByZIndex[zIndex];\n if (!byGeometryType) {\n byGeometryType = {};\n featuresByZIndex[zIndex] = byGeometryType;\n byGeometryType['Polygon'] = [];\n byGeometryType['Circle'] = [];\n byGeometryType['LineString'] = [];\n byGeometryType['Point'] = [];\n }\n const type = geometry.getType();\n if (type === 'GeometryCollection') {\n const geometries =\n /** @type {import(\"../../geom/GeometryCollection.js\").default} */ (\n geometry\n ).getGeometriesArrayRecursive();\n for (let i = 0, ii = geometries.length; i < ii; ++i) {\n const geometry = geometries[i];\n byGeometryType[geometry.getType().replace('Multi', '')].push(\n geometry,\n style,\n );\n }\n } else {\n byGeometryType[type.replace('Multi', '')].push(geometry, style);\n }\n }\n }\n\n const zIndexKeys = Object.keys(featuresByZIndex).map(Number).sort(ascending);\n for (let i = 0, ii = zIndexKeys.length; i < ii; ++i) {\n const byGeometryType = featuresByZIndex[zIndexKeys[i]];\n for (const type in byGeometryType) {\n const geomAndStyle = byGeometryType[type];\n for (let j = 0, jj = geomAndStyle.length; j < jj; j += 2) {\n renderer.setStyle(geomAndStyle[j + 1]);\n for (let k = 0, kk = transforms.length; k < kk; ++k) {\n renderer.setTransform(transforms[k]);\n renderer.drawGeometry(geomAndStyle[j]);\n }\n }\n }\n }\n return context.getImageData(0, 0, canvas.width, canvas.height);\n}\n\n/**\n * @param {import(\"../../pixel\").Pixel} pixel Pixel coordinate on the hit\n * detection canvas in css pixels.\n * @param {Array} features Features. Has to\n * match the `features` array that was passed to `createHitDetectionImageData()`.\n * @param {ImageData} imageData Hit detection image data generated by\n * `createHitDetectionImageData()`.\n * @return {Array} Features.\n * @template {import(\"../../Feature.js\").FeatureLike} F\n */\nexport function hitDetect(pixel, features, imageData) {\n /** @type {Array} */\n const resultFeatures = [];\n if (imageData) {\n const x = Math.floor(Math.round(pixel[0]) * HIT_DETECT_RESOLUTION);\n const y = Math.floor(Math.round(pixel[1]) * HIT_DETECT_RESOLUTION);\n // The pixel coordinate is clamped down to the hit-detect canvas' size to account\n // for browsers returning coordinates slightly larger than the actual canvas size\n // due to a non-integer pixel ratio.\n const index =\n (clamp(x, 0, imageData.width - 1) +\n clamp(y, 0, imageData.height - 1) * imageData.width) *\n 4;\n const r = imageData.data[index];\n const g = imageData.data[index + 1];\n const b = imageData.data[index + 2];\n const i = b + 256 * (g + 256 * r);\n const indexFactor = Math.floor((256 * 256 * 256 - 1) / features.length);\n if (i && i % indexFactor === 0) {\n resultFeatures.push(features[i / indexFactor - 1]);\n }\n }\n return resultFeatures;\n}\n","/**\n * @module ol/renderer/canvas/VectorLayer\n */\nimport CanvasBuilderGroup from '../../render/canvas/BuilderGroup.js';\nimport CanvasLayerRenderer, {canvasPool} from './Layer.js';\nimport ExecutorGroup, {\n ALL,\n DECLUTTER,\n NON_DECLUTTER,\n} from '../../render/canvas/ExecutorGroup.js';\nimport RenderEventType from '../../render/EventType.js';\nimport ViewHint from '../../ViewHint.js';\nimport {\n HIT_DETECT_RESOLUTION,\n createHitDetectionImageData,\n hitDetect,\n} from '../../render/canvas/hitdetect.js';\nimport {\n buffer,\n containsExtent,\n createEmpty,\n getHeight,\n getWidth,\n intersects as intersectsExtent,\n wrapX as wrapExtentX,\n} from '../../extent.js';\nimport {createCanvasContext2D, releaseCanvas} from '../../dom.js';\nimport {\n defaultOrder as defaultRenderOrder,\n getTolerance as getRenderTolerance,\n getSquaredTolerance as getSquaredRenderTolerance,\n renderFeature,\n} from '../vector.js';\nimport {equals} from '../../array.js';\nimport {\n fromUserExtent,\n getTransformFromProjections,\n getUserProjection,\n toUserExtent,\n toUserResolution,\n} from '../../proj.js';\nimport {getUid} from '../../util.js';\nimport {wrapX as wrapCoordinateX} from '../../coordinate.js';\n\n/**\n * @classdesc\n * Canvas renderer for vector layers.\n * @api\n */\nclass CanvasVectorLayerRenderer extends CanvasLayerRenderer {\n /**\n * @param {import(\"../../layer/BaseVector.js\").default} vectorLayer Vector layer.\n */\n constructor(vectorLayer) {\n super(vectorLayer);\n\n /** @private */\n this.boundHandleStyleImageChange_ = this.handleStyleImageChange_.bind(this);\n\n /**\n * @private\n * @type {boolean}\n */\n this.animatingOrInteracting_;\n\n /**\n * @private\n * @type {ImageData|null}\n */\n this.hitDetectionImageData_ = null;\n\n /**\n * @private\n * @type {boolean}\n */\n this.clipped_ = false;\n\n /**\n * @private\n * @type {Array}\n */\n this.renderedFeatures_ = null;\n\n /**\n * @private\n * @type {number}\n */\n this.renderedRevision_ = -1;\n\n /**\n * @private\n * @type {number}\n */\n this.renderedResolution_ = NaN;\n\n /**\n * @private\n * @type {import(\"../../extent.js\").Extent}\n */\n this.renderedExtent_ = createEmpty();\n\n /**\n * @private\n * @type {import(\"../../extent.js\").Extent}\n */\n this.wrappedRenderedExtent_ = createEmpty();\n\n /**\n * @private\n * @type {number}\n */\n this.renderedRotation_;\n\n /**\n * @private\n * @type {import(\"../../coordinate\").Coordinate}\n */\n this.renderedCenter_ = null;\n\n /**\n * @private\n * @type {import(\"../../proj/Projection\").default}\n */\n this.renderedProjection_ = null;\n\n /**\n * @private\n * @type {number}\n */\n this.renderedPixelRatio_ = 1;\n\n /**\n * @private\n * @type {function(import(\"../../Feature.js\").default, import(\"../../Feature.js\").default): number|null}\n */\n this.renderedRenderOrder_ = null;\n\n /**\n * @private\n * @type {boolean}\n */\n this.renderedFrameDeclutter_;\n\n /**\n * @private\n * @type {import(\"../../render/canvas/ExecutorGroup\").default}\n */\n this.replayGroup_ = null;\n\n /**\n * A new replay group had to be created by `prepareFrame()`\n * @type {boolean}\n */\n this.replayGroupChanged = true;\n\n /**\n * Clipping to be performed by `renderFrame()`\n * @type {boolean}\n */\n this.clipping = true;\n\n /**\n * @private\n * @type {CanvasRenderingContext2D}\n */\n this.targetContext_ = null;\n\n /**\n * @private\n * @type {number}\n */\n this.opacity_ = 1;\n }\n\n /**\n * @param {ExecutorGroup} executorGroup Executor group.\n * @param {import(\"../../Map.js\").FrameState} frameState Frame state.\n * @param {boolean} [declutterable] `true` to only render declutterable items,\n * `false` to only render non-declutterable items, `undefined` to render all.\n */\n renderWorlds(executorGroup, frameState, declutterable) {\n const extent = frameState.extent;\n const viewState = frameState.viewState;\n const center = viewState.center;\n const resolution = viewState.resolution;\n const projection = viewState.projection;\n const rotation = viewState.rotation;\n const projectionExtent = projection.getExtent();\n const vectorSource = this.getLayer().getSource();\n const declutter = this.getLayer().getDeclutter();\n const pixelRatio = frameState.pixelRatio;\n const viewHints = frameState.viewHints;\n const snapToPixel = !(\n viewHints[ViewHint.ANIMATING] || viewHints[ViewHint.INTERACTING]\n );\n const context = this.context;\n const width = Math.round((getWidth(extent) / resolution) * pixelRatio);\n const height = Math.round((getHeight(extent) / resolution) * pixelRatio);\n\n const multiWorld = vectorSource.getWrapX() && projection.canWrapX();\n const worldWidth = multiWorld ? getWidth(projectionExtent) : null;\n const endWorld = multiWorld\n ? Math.ceil((extent[2] - projectionExtent[2]) / worldWidth) + 1\n : 1;\n let world = multiWorld\n ? Math.floor((extent[0] - projectionExtent[0]) / worldWidth)\n : 0;\n do {\n let transform = this.getRenderTransform(\n center,\n resolution,\n 0,\n pixelRatio,\n width,\n height,\n world * worldWidth,\n );\n if (frameState.declutter) {\n transform = transform.slice(0);\n }\n executorGroup.execute(\n context,\n [context.canvas.width, context.canvas.height],\n transform,\n rotation,\n snapToPixel,\n declutterable === undefined\n ? ALL\n : declutterable\n ? DECLUTTER\n : NON_DECLUTTER,\n declutterable\n ? declutter && frameState.declutter[declutter]\n : undefined,\n );\n } while (++world < endWorld);\n }\n\n /**\n * @private\n */\n setDrawContext_() {\n if (this.opacity_ !== 1) {\n this.targetContext_ = this.context;\n this.context = createCanvasContext2D(\n this.context.canvas.width,\n this.context.canvas.height,\n canvasPool,\n );\n }\n }\n\n /**\n * @private\n */\n resetDrawContext_() {\n if (this.opacity_ !== 1) {\n const alpha = this.targetContext_.globalAlpha;\n this.targetContext_.globalAlpha = this.opacity_;\n this.targetContext_.drawImage(this.context.canvas, 0, 0);\n this.targetContext_.globalAlpha = alpha;\n releaseCanvas(this.context);\n canvasPool.push(this.context.canvas);\n this.context = this.targetContext_;\n this.targetContext_ = null;\n }\n }\n\n /**\n * Render declutter items for this layer\n * @param {import(\"../../Map.js\").FrameState} frameState Frame state.\n */\n renderDeclutter(frameState) {\n if (!this.replayGroup_ || !this.getLayer().getDeclutter()) {\n return;\n }\n this.renderWorlds(this.replayGroup_, frameState, true);\n }\n\n /**\n * Render deferred instructions.\n * @param {import(\"../../Map.js\").FrameState} frameState Frame state.\n * @override\n */\n renderDeferredInternal(frameState) {\n if (!this.replayGroup_) {\n return;\n }\n this.replayGroup_.renderDeferred();\n if (this.clipped_) {\n this.context.restore();\n }\n this.resetDrawContext_();\n }\n\n /**\n * Render the layer.\n * @param {import(\"../../Map.js\").FrameState} frameState Frame state.\n * @param {HTMLElement|null} target Target that may be used to render content to.\n * @return {HTMLElement|null} The rendered element.\n * @override\n */\n renderFrame(frameState, target) {\n const layerState = frameState.layerStatesArray[frameState.layerIndex];\n this.opacity_ = layerState.opacity;\n const viewState = frameState.viewState;\n\n this.prepareContainer(frameState, target);\n const context = this.context;\n\n const replayGroup = this.replayGroup_;\n let render = replayGroup && !replayGroup.isEmpty();\n if (!render) {\n const hasRenderListeners =\n this.getLayer().hasListener(RenderEventType.PRERENDER) ||\n this.getLayer().hasListener(RenderEventType.POSTRENDER);\n if (!hasRenderListeners) {\n return null;\n }\n }\n\n this.setDrawContext_();\n\n this.preRender(context, frameState);\n\n const projection = viewState.projection;\n\n // clipped rendering if layer extent is set\n this.clipped_ = false;\n if (render && layerState.extent && this.clipping) {\n const layerExtent = fromUserExtent(layerState.extent, projection);\n render = intersectsExtent(layerExtent, frameState.extent);\n this.clipped_ = render && !containsExtent(layerExtent, frameState.extent);\n if (this.clipped_) {\n this.clipUnrotated(context, frameState, layerExtent);\n }\n }\n\n if (render) {\n this.renderWorlds(\n replayGroup,\n frameState,\n this.getLayer().getDeclutter() ? false : undefined,\n );\n }\n\n if (!frameState.declutter && this.clipped_) {\n context.restore();\n }\n\n this.postRender(context, frameState);\n\n if (this.renderedRotation_ !== viewState.rotation) {\n this.renderedRotation_ = viewState.rotation;\n this.hitDetectionImageData_ = null;\n }\n if (!frameState.declutter) {\n this.resetDrawContext_();\n }\n return this.container;\n }\n\n /**\n * Asynchronous layer level hit detection.\n * @param {import(\"../../pixel.js\").Pixel} pixel Pixel.\n * @return {Promise>} Promise\n * that resolves with an array of features.\n * @override\n */\n getFeatures(pixel) {\n return new Promise((resolve) => {\n if (\n this.frameState &&\n !this.hitDetectionImageData_ &&\n !this.animatingOrInteracting_\n ) {\n const size = this.frameState.size.slice();\n const center = this.renderedCenter_;\n const resolution = this.renderedResolution_;\n const rotation = this.renderedRotation_;\n const projection = this.renderedProjection_;\n const extent = this.wrappedRenderedExtent_;\n const layer = this.getLayer();\n const transforms = [];\n const width = size[0] * HIT_DETECT_RESOLUTION;\n const height = size[1] * HIT_DETECT_RESOLUTION;\n transforms.push(\n this.getRenderTransform(\n center,\n resolution,\n rotation,\n HIT_DETECT_RESOLUTION,\n width,\n height,\n 0,\n ).slice(),\n );\n const source = layer.getSource();\n const projectionExtent = projection.getExtent();\n if (\n source.getWrapX() &&\n projection.canWrapX() &&\n !containsExtent(projectionExtent, extent)\n ) {\n let startX = extent[0];\n const worldWidth = getWidth(projectionExtent);\n let world = 0;\n let offsetX;\n while (startX < projectionExtent[0]) {\n --world;\n offsetX = worldWidth * world;\n transforms.push(\n this.getRenderTransform(\n center,\n resolution,\n rotation,\n HIT_DETECT_RESOLUTION,\n width,\n height,\n offsetX,\n ).slice(),\n );\n startX += worldWidth;\n }\n world = 0;\n startX = extent[2];\n while (startX > projectionExtent[2]) {\n ++world;\n offsetX = worldWidth * world;\n transforms.push(\n this.getRenderTransform(\n center,\n resolution,\n rotation,\n HIT_DETECT_RESOLUTION,\n width,\n height,\n offsetX,\n ).slice(),\n );\n startX -= worldWidth;\n }\n }\n const userProjection = getUserProjection();\n this.hitDetectionImageData_ = createHitDetectionImageData(\n size,\n transforms,\n this.renderedFeatures_,\n layer.getStyleFunction(),\n extent,\n resolution,\n rotation,\n getSquaredRenderTolerance(resolution, this.renderedPixelRatio_),\n userProjection ? projection : null,\n );\n }\n resolve(\n hitDetect(pixel, this.renderedFeatures_, this.hitDetectionImageData_),\n );\n });\n }\n\n /**\n * @param {import(\"../../coordinate.js\").Coordinate} coordinate Coordinate.\n * @param {import(\"../../Map.js\").FrameState} frameState Frame state.\n * @param {number} hitTolerance Hit tolerance in pixels.\n * @param {import(\"../vector.js\").FeatureCallback} callback Feature callback.\n * @param {Array>} matches The hit detected matches with tolerance.\n * @return {T|undefined} Callback result.\n * @template T\n * @override\n */\n forEachFeatureAtCoordinate(\n coordinate,\n frameState,\n hitTolerance,\n callback,\n matches,\n ) {\n if (!this.replayGroup_) {\n return undefined;\n }\n const resolution = frameState.viewState.resolution;\n const rotation = frameState.viewState.rotation;\n const layer = this.getLayer();\n\n /** @type {!Object|true>} */\n const features = {};\n\n /**\n * @param {import(\"../../Feature.js\").FeatureLike} feature Feature.\n * @param {import(\"../../geom/SimpleGeometry.js\").default} geometry Geometry.\n * @param {number} distanceSq The squared distance to the click position\n * @return {T|undefined} Callback result.\n */\n const featureCallback = function (feature, geometry, distanceSq) {\n const key = getUid(feature);\n const match = features[key];\n if (!match) {\n if (distanceSq === 0) {\n features[key] = true;\n return callback(feature, layer, geometry);\n }\n matches.push(\n (features[key] = {\n feature: feature,\n layer: layer,\n geometry: geometry,\n distanceSq: distanceSq,\n callback: callback,\n }),\n );\n } else if (match !== true && distanceSq < match.distanceSq) {\n if (distanceSq === 0) {\n features[key] = true;\n matches.splice(matches.lastIndexOf(match), 1);\n return callback(feature, layer, geometry);\n }\n match.geometry = geometry;\n match.distanceSq = distanceSq;\n }\n return undefined;\n };\n\n let result;\n const executorGroups = [this.replayGroup_];\n const declutter = this.getLayer().getDeclutter();\n executorGroups.some((executorGroup) => {\n return (result = executorGroup.forEachFeatureAtCoordinate(\n coordinate,\n resolution,\n rotation,\n hitTolerance,\n featureCallback,\n declutter && frameState.declutter[declutter]\n ? frameState.declutter[declutter].all().map((item) => item.value)\n : null,\n ));\n });\n\n return result;\n }\n\n /**\n * Perform action necessary to get the layer rendered after new fonts have loaded\n * @override\n */\n handleFontsChanged() {\n const layer = this.getLayer();\n if (layer.getVisible() && this.replayGroup_) {\n layer.changed();\n }\n }\n\n /**\n * Handle changes in image style state.\n * @param {import(\"../../events/Event.js\").default} event Image style change event.\n * @private\n */\n handleStyleImageChange_(event) {\n this.renderIfReadyAndVisible();\n }\n\n /**\n * Determine whether render should be called.\n * @param {import(\"../../Map.js\").FrameState} frameState Frame state.\n * @return {boolean} Layer is ready to be rendered.\n * @override\n */\n prepareFrame(frameState) {\n const vectorLayer = this.getLayer();\n const vectorSource = vectorLayer.getSource();\n if (!vectorSource) {\n return false;\n }\n\n const animating = frameState.viewHints[ViewHint.ANIMATING];\n const interacting = frameState.viewHints[ViewHint.INTERACTING];\n const updateWhileAnimating = vectorLayer.getUpdateWhileAnimating();\n const updateWhileInteracting = vectorLayer.getUpdateWhileInteracting();\n\n if (\n (this.ready && !updateWhileAnimating && animating) ||\n (!updateWhileInteracting && interacting)\n ) {\n this.animatingOrInteracting_ = true;\n return true;\n }\n this.animatingOrInteracting_ = false;\n\n const frameStateExtent = frameState.extent;\n const viewState = frameState.viewState;\n const projection = viewState.projection;\n const resolution = viewState.resolution;\n const pixelRatio = frameState.pixelRatio;\n const vectorLayerRevision = vectorLayer.getRevision();\n const vectorLayerRenderBuffer = vectorLayer.getRenderBuffer();\n let vectorLayerRenderOrder = vectorLayer.getRenderOrder();\n\n if (vectorLayerRenderOrder === undefined) {\n vectorLayerRenderOrder = defaultRenderOrder;\n }\n\n const center = viewState.center.slice();\n const extent = buffer(\n frameStateExtent,\n vectorLayerRenderBuffer * resolution,\n );\n const renderedExtent = extent.slice();\n const loadExtents = [extent.slice()];\n const projectionExtent = projection.getExtent();\n\n if (\n vectorSource.getWrapX() &&\n projection.canWrapX() &&\n !containsExtent(projectionExtent, frameState.extent)\n ) {\n // For the replay group, we need an extent that intersects the real world\n // (-180° to +180°). To support geometries in a coordinate range from -540°\n // to +540°, we add at least 1 world width on each side of the projection\n // extent. If the viewport is wider than the world, we need to add half of\n // the viewport width to make sure we cover the whole viewport.\n const worldWidth = getWidth(projectionExtent);\n const gutter = Math.max(getWidth(extent) / 2, worldWidth);\n extent[0] = projectionExtent[0] - gutter;\n extent[2] = projectionExtent[2] + gutter;\n wrapCoordinateX(center, projection);\n const loadExtent = wrapExtentX(loadExtents[0], projection);\n // If the extent crosses the date line, we load data for both edges of the worlds\n if (\n loadExtent[0] < projectionExtent[0] &&\n loadExtent[2] < projectionExtent[2]\n ) {\n loadExtents.push([\n loadExtent[0] + worldWidth,\n loadExtent[1],\n loadExtent[2] + worldWidth,\n loadExtent[3],\n ]);\n } else if (\n loadExtent[0] > projectionExtent[0] &&\n loadExtent[2] > projectionExtent[2]\n ) {\n loadExtents.push([\n loadExtent[0] - worldWidth,\n loadExtent[1],\n loadExtent[2] - worldWidth,\n loadExtent[3],\n ]);\n }\n }\n\n if (\n this.ready &&\n this.renderedResolution_ == resolution &&\n this.renderedRevision_ == vectorLayerRevision &&\n this.renderedRenderOrder_ == vectorLayerRenderOrder &&\n this.renderedFrameDeclutter_ === !!frameState.declutter &&\n containsExtent(this.wrappedRenderedExtent_, extent)\n ) {\n if (!equals(this.renderedExtent_, renderedExtent)) {\n this.hitDetectionImageData_ = null;\n this.renderedExtent_ = renderedExtent;\n }\n this.renderedCenter_ = center;\n this.replayGroupChanged = false;\n return true;\n }\n\n this.replayGroup_ = null;\n\n const replayGroup = new CanvasBuilderGroup(\n getRenderTolerance(resolution, pixelRatio),\n extent,\n resolution,\n pixelRatio,\n );\n\n const userProjection = getUserProjection();\n let userTransform;\n if (userProjection) {\n for (let i = 0, ii = loadExtents.length; i < ii; ++i) {\n const extent = loadExtents[i];\n const userExtent = toUserExtent(extent, projection);\n vectorSource.loadFeatures(\n userExtent,\n toUserResolution(resolution, projection),\n userProjection,\n );\n }\n userTransform = getTransformFromProjections(userProjection, projection);\n } else {\n for (let i = 0, ii = loadExtents.length; i < ii; ++i) {\n vectorSource.loadFeatures(loadExtents[i], resolution, projection);\n }\n }\n\n const squaredTolerance = getSquaredRenderTolerance(resolution, pixelRatio);\n let ready = true;\n const render =\n /**\n * @param {import(\"../../Feature.js\").default} feature Feature.\n * @param {number} index Index.\n */\n (feature, index) => {\n let styles;\n const styleFunction =\n feature.getStyleFunction() || vectorLayer.getStyleFunction();\n if (styleFunction) {\n styles = styleFunction(feature, resolution);\n }\n if (styles) {\n const dirty = this.renderFeature(\n feature,\n squaredTolerance,\n styles,\n replayGroup,\n userTransform,\n this.getLayer().getDeclutter(),\n index,\n );\n ready = ready && !dirty;\n }\n };\n\n const userExtent = toUserExtent(extent, projection);\n /** @type {Array} */\n const features = vectorSource.getFeaturesInExtent(userExtent);\n if (vectorLayerRenderOrder) {\n features.sort(vectorLayerRenderOrder);\n }\n for (let i = 0, ii = features.length; i < ii; ++i) {\n render(features[i], i);\n }\n this.renderedFeatures_ = features;\n this.ready = ready;\n\n const replayGroupInstructions = replayGroup.finish();\n const executorGroup = new ExecutorGroup(\n extent,\n resolution,\n pixelRatio,\n vectorSource.getOverlaps(),\n replayGroupInstructions,\n vectorLayer.getRenderBuffer(),\n !!frameState.declutter,\n );\n\n this.renderedResolution_ = resolution;\n this.renderedRevision_ = vectorLayerRevision;\n this.renderedRenderOrder_ = vectorLayerRenderOrder;\n this.renderedFrameDeclutter_ = !!frameState.declutter;\n this.renderedExtent_ = renderedExtent;\n this.wrappedRenderedExtent_ = extent;\n this.renderedCenter_ = center;\n this.renderedProjection_ = projection;\n this.renderedPixelRatio_ = pixelRatio;\n this.replayGroup_ = executorGroup;\n this.hitDetectionImageData_ = null;\n\n this.replayGroupChanged = true;\n return true;\n }\n\n /**\n * @param {import(\"../../Feature.js\").default} feature Feature.\n * @param {number} squaredTolerance Squared render tolerance.\n * @param {import(\"../../style/Style.js\").default|Array} styles The style or array of styles.\n * @param {import(\"../../render/canvas/BuilderGroup.js\").default} builderGroup Builder group.\n * @param {import(\"../../proj.js\").TransformFunction} [transform] Transform from user to view projection.\n * @param {boolean} [declutter] Enable decluttering.\n * @param {number} [index] Render order index.\n * @return {boolean} `true` if an image is loading.\n */\n renderFeature(\n feature,\n squaredTolerance,\n styles,\n builderGroup,\n transform,\n declutter,\n index,\n ) {\n if (!styles) {\n return false;\n }\n let loading = false;\n if (Array.isArray(styles)) {\n for (let i = 0, ii = styles.length; i < ii; ++i) {\n loading =\n renderFeature(\n builderGroup,\n feature,\n styles[i],\n squaredTolerance,\n this.boundHandleStyleImageChange_,\n transform,\n declutter,\n index,\n ) || loading;\n }\n } else {\n loading = renderFeature(\n builderGroup,\n feature,\n styles,\n squaredTolerance,\n this.boundHandleStyleImageChange_,\n transform,\n declutter,\n index,\n );\n }\n return loading;\n }\n}\n\nexport default CanvasVectorLayerRenderer;\n","/**\n * @module ol/layer/Vector\n */\nimport BaseVectorLayer from './BaseVector.js';\nimport CanvasVectorLayerRenderer from '../renderer/canvas/VectorLayer.js';\n\n/***\n * @template T\n * @typedef {T extends import(\"../source/Vector.js\").default ? U : never} ExtractedFeatureType\n */\n\n/**\n * @template {import(\"../source/Vector.js\").default} [VectorSourceType=import(\"../source/Vector.js\").default<*>]\n * @template {import('../Feature.js').FeatureLike} [FeatureType=ExtractedFeatureType]\n * @typedef {Object} Options\n * @property {string} [className='ol-layer'] A CSS class name to set to the layer element.\n * @property {number} [opacity=1] Opacity (0, 1).\n * @property {boolean} [visible=true] Visibility.\n * @property {import(\"../extent.js\").Extent} [extent] The bounding extent for layer rendering. The layer will not be\n * rendered outside of this extent.\n * @property {number} [zIndex] The z-index for layer rendering. At rendering time, the layers\n * will be ordered, first by Z-index and then by position. When `undefined`, a `zIndex` of 0 is assumed\n * for layers that are added to the map's `layers` collection, or `Infinity` when the layer's `setMap()`\n * method was used.\n * @property {number} [minResolution] The minimum resolution (inclusive) at which this layer will be\n * visible.\n * @property {number} [maxResolution] The maximum resolution (exclusive) below which this layer will\n * be visible.\n * @property {number} [minZoom] The minimum view zoom level (exclusive) above which this layer will be\n * visible.\n * @property {number} [maxZoom] The maximum view zoom level (inclusive) at which this layer will\n * be visible.\n * @property {import(\"../render.js\").OrderFunction} [renderOrder] Render order. Function to be used when sorting\n * features before rendering. By default features are drawn in the order that they are created. Use\n * `null` to avoid the sort, but get an undefined draw order.\n * @property {number} [renderBuffer=100] The buffer in pixels around the viewport extent used by the\n * renderer when getting features from the vector source for the rendering or hit-detection.\n * Recommended value: the size of the largest symbol, line width or label.\n * @property {VectorSourceType} [source] Source.\n * @property {import(\"../Map.js\").default} [map] Sets the layer as overlay on a map. The map will not manage\n * this layer in its layers collection, and the layer will be rendered on top. This is useful for\n * temporary layers. The standard way to add a layer to a map and have it managed by the map is to\n * use [map.addLayer()]{@link import(\"../Map.js\").default#addLayer}.\n * @property {boolean|string|number} [declutter=false] Declutter images and text. Any truthy value will enable\n * decluttering. Within a layer, a feature rendered before another has higher priority. All layers with the\n * same `declutter` value will be decluttered together. The priority is determined by the drawing order of the\n * layers with the same `declutter` value. Higher in the layer stack means higher priority. To declutter distinct\n * layers or groups of layers separately, use different truthy values for `declutter`.\n * @property {import(\"../style/Style.js\").StyleLike|import(\"../style/flat.js\").FlatStyleLike|null} [style] Layer style. When set to `null`, only\n * features that have their own style will be rendered. See {@link module:ol/style/Style~Style} for the default style\n * which will be used if this is not set.\n * @property {import(\"./Base.js\").BackgroundColor} [background] Background color for the layer. If not specified, no background\n * will be rendered.\n * @property {boolean} [updateWhileAnimating=false] When set to `true`, feature batches will\n * be recreated during animations. This means that no vectors will be shown clipped, but the\n * setting will have a performance impact for large amounts of vector data. When set to `false`,\n * batches will be recreated when no animation is active.\n * @property {boolean} [updateWhileInteracting=false] When set to `true`, feature batches will\n * be recreated during interactions. See also `updateWhileAnimating`.\n * @property {Object} [properties] Arbitrary observable properties. Can be accessed with `#get()` and `#set()`.\n */\n\n/**\n * @classdesc\n * Vector data is rendered client-side, as vectors. This layer type provides most accurate rendering\n * even during animations. Points and labels stay upright on rotated views. For very large\n * amounts of vector data, performance may suffer during pan and zoom animations. In this case,\n * try {@link module:ol/layer/VectorImage~VectorImageLayer}.\n *\n * Note that any property set in the options is set as a {@link module:ol/Object~BaseObject}\n * property on the layer object; for example, setting `title: 'My Title'` in the\n * options means that `title` is observable, and has get/set accessors.\n *\n * @template {import(\"../source/Vector.js\").default} [VectorSourceType=import(\"../source/Vector.js\").default<*>]\n * @template {import('../Feature.js').FeatureLike} [FeatureType=ExtractedFeatureType]\n * @extends {BaseVectorLayer}\n * @api\n */\nclass VectorLayer extends BaseVectorLayer {\n /**\n * @param {Options} [options] Options.\n */\n constructor(options) {\n super(options);\n }\n\n /**\n * @override\n */\n createRenderer() {\n return new CanvasVectorLayerRenderer(this);\n }\n}\n\nexport default VectorLayer;\n","/**\n * @module ol/render/Feature\n */\nimport Feature from '../Feature.js';\nimport {\n LineString,\n MultiLineString,\n MultiPoint,\n MultiPolygon,\n Point,\n Polygon,\n} from '../geom.js';\nimport {\n compose as composeTransform,\n create as createTransform,\n} from '../transform.js';\nimport {\n createOrUpdateFromCoordinate,\n createOrUpdateFromFlatCoordinates,\n getCenter,\n getHeight,\n} from '../extent.js';\nimport {\n douglasPeucker,\n douglasPeuckerArray,\n quantizeArray,\n} from '../geom/flat/simplify.js';\nimport {extend} from '../array.js';\nimport {\n getInteriorPointOfArray,\n getInteriorPointsOfMultiArray,\n} from '../geom/flat/interiorpoint.js';\nimport {get as getProjection} from '../proj.js';\nimport {inflateEnds} from '../geom/flat/orient.js';\nimport {interpolatePoint} from '../geom/flat/interpolate.js';\nimport {linearRingss as linearRingssCenter} from '../geom/flat/center.js';\nimport {memoizeOne} from '../functions.js';\nimport {transform2D} from '../geom/flat/transform.js';\n\n/**\n * @typedef {'Point' | 'LineString' | 'LinearRing' | 'Polygon' | 'MultiPoint' | 'MultiLineString'} Type\n * The geometry type. One of `'Point'`, `'LineString'`, `'LinearRing'`,\n * `'Polygon'`, `'MultiPoint'` or 'MultiLineString'`.\n */\n\n/**\n * @type {import(\"../transform.js\").Transform}\n */\nconst tmpTransform = createTransform();\n\n/**\n * Lightweight, read-only, {@link module:ol/Feature~Feature} and {@link module:ol/geom/Geometry~Geometry} like\n * structure, optimized for vector tile rendering and styling. Geometry access\n * through the API is limited to getting the type and extent of the geometry.\n */\nclass RenderFeature {\n /**\n * @param {Type} type Geometry type.\n * @param {Array} flatCoordinates Flat coordinates. These always need\n * to be right-handed for polygons.\n * @param {Array} ends Ends.\n * @param {number} stride Stride.\n * @param {Object} properties Properties.\n * @param {number|string|undefined} id Feature id.\n */\n constructor(type, flatCoordinates, ends, stride, properties, id) {\n /**\n * @type {import(\"../style/Style.js\").StyleFunction|undefined}\n */\n this.styleFunction;\n\n /**\n * @private\n * @type {import(\"../extent.js\").Extent|undefined}\n */\n this.extent_;\n\n /**\n * @private\n * @type {number|string|undefined}\n */\n this.id_ = id;\n\n /**\n * @private\n * @type {Type}\n */\n this.type_ = type;\n\n /**\n * @private\n * @type {Array}\n */\n this.flatCoordinates_ = flatCoordinates;\n\n /**\n * @private\n * @type {Array}\n */\n this.flatInteriorPoints_ = null;\n\n /**\n * @private\n * @type {Array}\n */\n this.flatMidpoints_ = null;\n\n /**\n * @private\n * @type {Array|null}\n */\n this.ends_ = ends || null;\n\n /**\n * @private\n * @type {Object}\n */\n this.properties_ = properties;\n\n /**\n * @private\n * @type {number}\n */\n this.squaredTolerance_;\n\n /**\n * @private\n * @type {number}\n */\n this.stride_ = stride;\n\n /**\n * @private\n * @type {RenderFeature}\n */\n this.simplifiedGeometry_;\n }\n\n /**\n * Get a feature property by its key.\n * @param {string} key Key\n * @return {*} Value for the requested key.\n * @api\n */\n get(key) {\n return this.properties_[key];\n }\n\n /**\n * Get the extent of this feature's geometry.\n * @return {import(\"../extent.js\").Extent} Extent.\n * @api\n */\n getExtent() {\n if (!this.extent_) {\n this.extent_ =\n this.type_ === 'Point'\n ? createOrUpdateFromCoordinate(this.flatCoordinates_)\n : createOrUpdateFromFlatCoordinates(\n this.flatCoordinates_,\n 0,\n this.flatCoordinates_.length,\n 2,\n );\n }\n return this.extent_;\n }\n\n /**\n * @return {Array} Flat interior points.\n */\n getFlatInteriorPoint() {\n if (!this.flatInteriorPoints_) {\n const flatCenter = getCenter(this.getExtent());\n this.flatInteriorPoints_ = getInteriorPointOfArray(\n this.flatCoordinates_,\n 0,\n this.ends_,\n 2,\n flatCenter,\n 0,\n );\n }\n return this.flatInteriorPoints_;\n }\n\n /**\n * @return {Array} Flat interior points.\n */\n getFlatInteriorPoints() {\n if (!this.flatInteriorPoints_) {\n const ends = inflateEnds(this.flatCoordinates_, this.ends_);\n const flatCenters = linearRingssCenter(this.flatCoordinates_, 0, ends, 2);\n this.flatInteriorPoints_ = getInteriorPointsOfMultiArray(\n this.flatCoordinates_,\n 0,\n ends,\n 2,\n flatCenters,\n );\n }\n return this.flatInteriorPoints_;\n }\n\n /**\n * @return {Array} Flat midpoint.\n */\n getFlatMidpoint() {\n if (!this.flatMidpoints_) {\n this.flatMidpoints_ = interpolatePoint(\n this.flatCoordinates_,\n 0,\n this.flatCoordinates_.length,\n 2,\n 0.5,\n );\n }\n return this.flatMidpoints_;\n }\n\n /**\n * @return {Array} Flat midpoints.\n */\n getFlatMidpoints() {\n if (!this.flatMidpoints_) {\n this.flatMidpoints_ = [];\n const flatCoordinates = this.flatCoordinates_;\n let offset = 0;\n const ends = /** @type {Array} */ (this.ends_);\n for (let i = 0, ii = ends.length; i < ii; ++i) {\n const end = ends[i];\n const midpoint = interpolatePoint(flatCoordinates, offset, end, 2, 0.5);\n extend(this.flatMidpoints_, midpoint);\n offset = end;\n }\n }\n return this.flatMidpoints_;\n }\n\n /**\n * Get the feature identifier. This is a stable identifier for the feature and\n * is set when reading data from a remote source.\n * @return {number|string|undefined} Id.\n * @api\n */\n getId() {\n return this.id_;\n }\n\n /**\n * @return {Array} Flat coordinates.\n */\n getOrientedFlatCoordinates() {\n return this.flatCoordinates_;\n }\n\n /**\n * For API compatibility with {@link module:ol/Feature~Feature}, this method is useful when\n * determining the geometry type in style function (see {@link #getType}).\n * @return {RenderFeature} Feature.\n * @api\n */\n getGeometry() {\n return this;\n }\n\n /**\n * @param {number} squaredTolerance Squared tolerance.\n * @return {RenderFeature} Simplified geometry.\n */\n getSimplifiedGeometry(squaredTolerance) {\n return this;\n }\n\n /**\n * Get a transformed and simplified version of the geometry.\n * @param {number} squaredTolerance Squared tolerance.\n * @param {import(\"../proj.js\").TransformFunction} [transform] Optional transform function.\n * @return {RenderFeature} Simplified geometry.\n */\n simplifyTransformed(squaredTolerance, transform) {\n return this;\n }\n\n /**\n * Get the feature properties.\n * @return {Object} Feature properties.\n * @api\n */\n getProperties() {\n return this.properties_;\n }\n\n /**\n * Get an object of all property names and values. This has the same behavior as getProperties,\n * but is here to conform with the {@link module:ol/Feature~Feature} interface.\n * @return {Object?} Object.\n */\n getPropertiesInternal() {\n return this.properties_;\n }\n\n /**\n * @return {number} Stride.\n */\n getStride() {\n return this.stride_;\n }\n\n /**\n * @return {import('../style/Style.js').StyleFunction|undefined} Style\n */\n getStyleFunction() {\n return this.styleFunction;\n }\n\n /**\n * Get the type of this feature's geometry.\n * @return {Type} Geometry type.\n * @api\n */\n getType() {\n return this.type_;\n }\n\n /**\n * Transform geometry coordinates from tile pixel space to projected.\n *\n * @param {import(\"../proj.js\").ProjectionLike} projection The data projection\n */\n transform(projection) {\n projection = getProjection(projection);\n const pixelExtent = projection.getExtent();\n const projectedExtent = projection.getWorldExtent();\n if (pixelExtent && projectedExtent) {\n const scale = getHeight(projectedExtent) / getHeight(pixelExtent);\n composeTransform(\n tmpTransform,\n projectedExtent[0],\n projectedExtent[3],\n scale,\n -scale,\n 0,\n 0,\n 0,\n );\n transform2D(\n this.flatCoordinates_,\n 0,\n this.flatCoordinates_.length,\n 2,\n tmpTransform,\n this.flatCoordinates_,\n );\n }\n }\n\n /**\n * Apply a transform function to the coordinates of the geometry.\n * The geometry is modified in place.\n * If you do not want the geometry modified in place, first `clone()` it and\n * then use this function on the clone.\n * @param {import(\"../proj.js\").TransformFunction} transformFn Transform function.\n */\n applyTransform(transformFn) {\n transformFn(this.flatCoordinates_, this.flatCoordinates_, this.stride_);\n }\n\n /**\n * @return {RenderFeature} A cloned render feature.\n */\n clone() {\n return new RenderFeature(\n this.type_,\n this.flatCoordinates_.slice(),\n this.ends_?.slice(),\n this.stride_,\n Object.assign({}, this.properties_),\n this.id_,\n );\n }\n\n /**\n * @return {Array|null} Ends.\n */\n getEnds() {\n return this.ends_;\n }\n\n /**\n * Add transform and resolution based geometry simplification to this instance.\n * @return {RenderFeature} This render feature.\n */\n enableSimplifyTransformed() {\n this.simplifyTransformed = memoizeOne((squaredTolerance, transform) => {\n if (squaredTolerance === this.squaredTolerance_) {\n return this.simplifiedGeometry_;\n }\n this.simplifiedGeometry_ = this.clone();\n if (transform) {\n this.simplifiedGeometry_.applyTransform(transform);\n }\n const simplifiedFlatCoordinates =\n this.simplifiedGeometry_.getFlatCoordinates();\n let simplifiedEnds;\n switch (this.type_) {\n case 'LineString':\n simplifiedFlatCoordinates.length = douglasPeucker(\n simplifiedFlatCoordinates,\n 0,\n this.simplifiedGeometry_.flatCoordinates_.length,\n this.simplifiedGeometry_.stride_,\n squaredTolerance,\n simplifiedFlatCoordinates,\n 0,\n );\n simplifiedEnds = [simplifiedFlatCoordinates.length];\n break;\n case 'MultiLineString':\n simplifiedEnds = [];\n simplifiedFlatCoordinates.length = douglasPeuckerArray(\n simplifiedFlatCoordinates,\n 0,\n this.simplifiedGeometry_.ends_,\n this.simplifiedGeometry_.stride_,\n squaredTolerance,\n simplifiedFlatCoordinates,\n 0,\n simplifiedEnds,\n );\n break;\n case 'Polygon':\n simplifiedEnds = [];\n simplifiedFlatCoordinates.length = quantizeArray(\n simplifiedFlatCoordinates,\n 0,\n this.simplifiedGeometry_.ends_,\n this.simplifiedGeometry_.stride_,\n Math.sqrt(squaredTolerance),\n simplifiedFlatCoordinates,\n 0,\n simplifiedEnds,\n );\n break;\n default:\n }\n if (simplifiedEnds) {\n this.simplifiedGeometry_ = new RenderFeature(\n this.type_,\n simplifiedFlatCoordinates,\n simplifiedEnds,\n 2,\n this.properties_,\n this.id_,\n );\n }\n this.squaredTolerance_ = squaredTolerance;\n return this.simplifiedGeometry_;\n });\n return this;\n }\n}\n\n/**\n * @return {Array} Flat coordinates.\n */\nRenderFeature.prototype.getFlatCoordinates =\n RenderFeature.prototype.getOrientedFlatCoordinates;\n\n/**\n * Create a geometry from an `ol/render/Feature`\n * @param {RenderFeature} renderFeature\n * Render Feature\n * @return {Point|MultiPoint|LineString|MultiLineString|Polygon|MultiPolygon}\n * New geometry instance.\n * @api\n */\nexport function toGeometry(renderFeature) {\n const geometryType = renderFeature.getType();\n switch (geometryType) {\n case 'Point':\n return new Point(renderFeature.getFlatCoordinates());\n case 'MultiPoint':\n return new MultiPoint(renderFeature.getFlatCoordinates(), 'XY');\n case 'LineString':\n return new LineString(renderFeature.getFlatCoordinates(), 'XY');\n case 'MultiLineString':\n return new MultiLineString(\n renderFeature.getFlatCoordinates(),\n 'XY',\n /** @type {Array} */ (renderFeature.getEnds()),\n );\n case 'Polygon':\n const flatCoordinates = renderFeature.getFlatCoordinates();\n const ends = renderFeature.getEnds();\n const endss = inflateEnds(flatCoordinates, ends);\n return endss.length > 1\n ? new MultiPolygon(flatCoordinates, 'XY', endss)\n : new Polygon(flatCoordinates, 'XY', ends);\n default:\n throw new Error('Invalid geometry type:' + geometryType);\n }\n}\n\n/**\n * Create an `ol/Feature` from an `ol/render/Feature`\n * @param {RenderFeature} renderFeature RenderFeature\n * @param {string} [geometryName='geometry'] Geometry name to use\n * when creating the Feature.\n * @return {Feature} Newly constructed `ol/Feature` with properties,\n * geometry, and id copied over.\n * @api\n */\nexport function toFeature(renderFeature, geometryName) {\n const id = renderFeature.getId();\n const geometry = toGeometry(renderFeature);\n const properties = renderFeature.getProperties();\n const feature = new Feature();\n if (geometryName !== undefined) {\n feature.setGeometryName(geometryName);\n }\n feature.setGeometry(geometry);\n if (id !== undefined) {\n feature.setId(id);\n }\n feature.setProperties(properties, true);\n return feature;\n}\n\nexport default RenderFeature;\n","/**\n * @module ol/render/VectorContext\n */\n\n/**\n * @classdesc\n * Context for drawing geometries. A vector context is available on render\n * events and does not need to be constructed directly.\n * @api\n */\nclass VectorContext {\n /**\n * Render a geometry with a custom renderer.\n *\n * @param {import(\"../geom/SimpleGeometry.js\").default} geometry Geometry.\n * @param {import(\"../Feature.js\").FeatureLike} feature Feature.\n * @param {Function} renderer Renderer.\n * @param {Function} hitDetectionRenderer Renderer.\n * @param {number} [index] Render order index.\n */\n drawCustom(geometry, feature, renderer, hitDetectionRenderer, index) {}\n\n /**\n * Render a geometry.\n *\n * @param {import(\"../geom/Geometry.js\").default} geometry The geometry to render.\n */\n drawGeometry(geometry) {}\n\n /**\n * Set the rendering style.\n *\n * @param {import(\"../style/Style.js\").default} style The rendering style.\n */\n setStyle(style) {}\n\n /**\n * @param {import(\"../geom/Circle.js\").default} circleGeometry Circle geometry.\n * @param {import(\"../Feature.js\").default} feature Feature.\n * @param {number} [index] Render order index.\n */\n drawCircle(circleGeometry, feature, index) {}\n\n /**\n * @param {import(\"../Feature.js\").default} feature Feature.\n * @param {import(\"../style/Style.js\").default} style Style.\n * @param {number} [index] Render order index.\n */\n drawFeature(feature, style, index) {}\n\n /**\n * @param {import(\"../geom/GeometryCollection.js\").default} geometryCollectionGeometry Geometry collection.\n * @param {import(\"../Feature.js\").default} feature Feature.\n * @param {number} [index] Render order index.\n */\n drawGeometryCollection(geometryCollectionGeometry, feature, index) {}\n\n /**\n * @param {import(\"../geom/LineString.js\").default|import(\"./Feature.js\").default} lineStringGeometry Line string geometry.\n * @param {import(\"../Feature.js\").FeatureLike} feature Feature.\n * @param {number} [index] Render order index.\n */\n drawLineString(lineStringGeometry, feature, index) {}\n\n /**\n * @param {import(\"../geom/MultiLineString.js\").default|import(\"./Feature.js\").default} multiLineStringGeometry MultiLineString geometry.\n * @param {import(\"../Feature.js\").FeatureLike} feature Feature.\n * @param {number} [index] Render order index.\n */\n drawMultiLineString(multiLineStringGeometry, feature, index) {}\n\n /**\n * @param {import(\"../geom/MultiPoint.js\").default|import(\"./Feature.js\").default} multiPointGeometry MultiPoint geometry.\n * @param {import(\"../Feature.js\").FeatureLike} feature Feature.\n * @param {number} [index] Render order index.\n */\n drawMultiPoint(multiPointGeometry, feature, index) {}\n\n /**\n * @param {import(\"../geom/MultiPolygon.js\").default} multiPolygonGeometry MultiPolygon geometry.\n * @param {import(\"../Feature.js\").FeatureLike} feature Feature.\n * @param {number} [index] Render order index.\n */\n drawMultiPolygon(multiPolygonGeometry, feature, index) {}\n\n /**\n * @param {import(\"../geom/Point.js\").default|import(\"./Feature.js\").default} pointGeometry Point geometry.\n * @param {import(\"../Feature.js\").FeatureLike} feature Feature.\n * @param {number} [index] Render order index.\n */\n drawPoint(pointGeometry, feature, index) {}\n\n /**\n * @param {import(\"../geom/Polygon.js\").default|import(\"./Feature.js\").default} polygonGeometry Polygon geometry.\n * @param {import(\"../Feature.js\").FeatureLike} feature Feature.\n * @param {number} [index] Render order index.\n */\n drawPolygon(polygonGeometry, feature, index) {}\n\n /**\n * @param {import(\"../geom/SimpleGeometry.js\").default|import(\"./Feature.js\").default} geometry Geometry.\n * @param {import(\"../Feature.js\").FeatureLike} feature Feature.\n * @param {number} [index] Render order index.\n */\n drawText(geometry, feature, index) {}\n\n /**\n * @param {import(\"../style/Fill.js\").default} fillStyle Fill style.\n * @param {import(\"../style/Stroke.js\").default} strokeStyle Stroke style.\n */\n setFillStrokeStyle(fillStyle, strokeStyle) {}\n\n /**\n * @param {import(\"../style/Image.js\").default} imageStyle Image style.\n * @param {import(\"../render/canvas.js\").DeclutterImageWithText} [declutterImageWithText] Shared data for combined decluttering with a text style.\n */\n setImageStyle(imageStyle, declutterImageWithText) {}\n\n /**\n * @param {import(\"../style/Text.js\").default} textStyle Text style.\n * @param {import(\"../render/canvas.js\").DeclutterImageWithText} [declutterImageWithText] Shared data for combined decluttering with an image style.\n */\n setTextStyle(textStyle, declutterImageWithText) {}\n}\n\nexport default VectorContext;\n","/**\n * @module ol/render/canvas/Immediate\n */\n// FIXME test, especially polygons with holes and multipolygons\n// FIXME need to handle large thick features (where pixel size matters)\n// FIXME add offset and end to ol/geom/flat/transform~transform2D?\n\nimport VectorContext from '../VectorContext.js';\nimport {asColorLike} from '../../colorlike.js';\nimport {\n compose as composeTransform,\n create as createTransform,\n} from '../../transform.js';\nimport {\n defaultFillStyle,\n defaultFont,\n defaultLineCap,\n defaultLineDash,\n defaultLineDashOffset,\n defaultLineJoin,\n defaultLineWidth,\n defaultMiterLimit,\n defaultStrokeStyle,\n defaultTextAlign,\n defaultTextBaseline,\n} from '../canvas.js';\nimport {equals} from '../../array.js';\nimport {intersects} from '../../extent.js';\nimport {toFixed} from '../../math.js';\nimport {transform2D} from '../../geom/flat/transform.js';\nimport {transformGeom2D} from '../../geom/SimpleGeometry.js';\n\n/**\n * @classdesc\n * A concrete subclass of {@link module:ol/render/VectorContext~VectorContext} that implements\n * direct rendering of features and geometries to an HTML5 Canvas context.\n * Instances of this class are created internally by the library and\n * provided to application code as vectorContext member of the\n * {@link module:ol/render/Event~RenderEvent} object associated with postcompose, precompose and\n * render events emitted by layers and maps.\n */\nclass CanvasImmediateRenderer extends VectorContext {\n /**\n * @param {CanvasRenderingContext2D} context Context.\n * @param {number} pixelRatio Pixel ratio.\n * @param {import(\"../../extent.js\").Extent} extent Extent.\n * @param {import(\"../../transform.js\").Transform} transform Transform.\n * @param {number} viewRotation View rotation.\n * @param {number} [squaredTolerance] Optional squared tolerance for simplification.\n * @param {import(\"../../proj.js\").TransformFunction} [userTransform] Transform from user to view projection.\n */\n constructor(\n context,\n pixelRatio,\n extent,\n transform,\n viewRotation,\n squaredTolerance,\n userTransform,\n ) {\n super();\n\n /**\n * @private\n * @type {CanvasRenderingContext2D}\n */\n this.context_ = context;\n\n /**\n * @private\n * @type {number}\n */\n this.pixelRatio_ = pixelRatio;\n\n /**\n * @private\n * @type {import(\"../../extent.js\").Extent}\n */\n this.extent_ = extent;\n\n /**\n * @private\n * @type {import(\"../../transform.js\").Transform}\n */\n this.transform_ = transform;\n\n /**\n * @private\n * @type {number}\n */\n this.transformRotation_ = transform\n ? toFixed(Math.atan2(transform[1], transform[0]), 10)\n : 0;\n\n /**\n * @private\n * @type {number}\n */\n this.viewRotation_ = viewRotation;\n\n /**\n * @private\n * @type {number}\n */\n this.squaredTolerance_ = squaredTolerance;\n\n /**\n * @private\n * @type {import(\"../../proj.js\").TransformFunction}\n */\n this.userTransform_ = userTransform;\n\n /**\n * @private\n * @type {?import(\"../canvas.js\").FillState}\n */\n this.contextFillState_ = null;\n\n /**\n * @private\n * @type {?import(\"../canvas.js\").StrokeState}\n */\n this.contextStrokeState_ = null;\n\n /**\n * @private\n * @type {?import(\"../canvas.js\").TextState}\n */\n this.contextTextState_ = null;\n\n /**\n * @private\n * @type {?import(\"../canvas.js\").FillState}\n */\n this.fillState_ = null;\n\n /**\n * @private\n * @type {?import(\"../canvas.js\").StrokeState}\n */\n this.strokeState_ = null;\n\n /**\n * @private\n * @type {import('../../DataTile.js').ImageLike}\n */\n this.image_ = null;\n\n /**\n * @private\n * @type {number}\n */\n this.imageAnchorX_ = 0;\n\n /**\n * @private\n * @type {number}\n */\n this.imageAnchorY_ = 0;\n\n /**\n * @private\n * @type {number}\n */\n this.imageHeight_ = 0;\n\n /**\n * @private\n * @type {number}\n */\n this.imageOpacity_ = 0;\n\n /**\n * @private\n * @type {number}\n */\n this.imageOriginX_ = 0;\n\n /**\n * @private\n * @type {number}\n */\n this.imageOriginY_ = 0;\n\n /**\n * @private\n * @type {boolean}\n */\n this.imageRotateWithView_ = false;\n\n /**\n * @private\n * @type {number}\n */\n this.imageRotation_ = 0;\n\n /**\n * @private\n * @type {import(\"../../size.js\").Size}\n */\n this.imageScale_ = [0, 0];\n\n /**\n * @private\n * @type {number}\n */\n this.imageWidth_ = 0;\n\n /**\n * @private\n * @type {string}\n */\n this.text_ = '';\n\n /**\n * @private\n * @type {number}\n */\n this.textOffsetX_ = 0;\n\n /**\n * @private\n * @type {number}\n */\n this.textOffsetY_ = 0;\n\n /**\n * @private\n * @type {boolean}\n */\n this.textRotateWithView_ = false;\n\n /**\n * @private\n * @type {number}\n */\n this.textRotation_ = 0;\n\n /**\n * @private\n * @type {import(\"../../size.js\").Size}\n */\n this.textScale_ = [0, 0];\n\n /**\n * @private\n * @type {?import(\"../canvas.js\").FillState}\n */\n this.textFillState_ = null;\n\n /**\n * @private\n * @type {?import(\"../canvas.js\").StrokeState}\n */\n this.textStrokeState_ = null;\n\n /**\n * @private\n * @type {?import(\"../canvas.js\").TextState}\n */\n this.textState_ = null;\n\n /**\n * @private\n * @type {Array}\n */\n this.pixelCoordinates_ = [];\n\n /**\n * @private\n * @type {import(\"../../transform.js\").Transform}\n */\n this.tmpLocalTransform_ = createTransform();\n }\n\n /**\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {number} end End.\n * @param {number} stride Stride.\n * @private\n */\n drawImages_(flatCoordinates, offset, end, stride) {\n if (!this.image_) {\n return;\n }\n const pixelCoordinates = transform2D(\n flatCoordinates,\n offset,\n end,\n stride,\n this.transform_,\n this.pixelCoordinates_,\n );\n const context = this.context_;\n const localTransform = this.tmpLocalTransform_;\n const alpha = context.globalAlpha;\n if (this.imageOpacity_ != 1) {\n context.globalAlpha = alpha * this.imageOpacity_;\n }\n let rotation = this.imageRotation_;\n if (this.transformRotation_ === 0) {\n rotation -= this.viewRotation_;\n }\n if (this.imageRotateWithView_) {\n rotation += this.viewRotation_;\n }\n for (let i = 0, ii = pixelCoordinates.length; i < ii; i += 2) {\n const x = pixelCoordinates[i] - this.imageAnchorX_;\n const y = pixelCoordinates[i + 1] - this.imageAnchorY_;\n if (\n rotation !== 0 ||\n this.imageScale_[0] != 1 ||\n this.imageScale_[1] != 1\n ) {\n const centerX = x + this.imageAnchorX_;\n const centerY = y + this.imageAnchorY_;\n composeTransform(\n localTransform,\n centerX,\n centerY,\n 1,\n 1,\n rotation,\n -centerX,\n -centerY,\n );\n context.save();\n context.transform.apply(context, localTransform);\n context.translate(centerX, centerY);\n context.scale(this.imageScale_[0], this.imageScale_[1]);\n context.drawImage(\n this.image_,\n this.imageOriginX_,\n this.imageOriginY_,\n this.imageWidth_,\n this.imageHeight_,\n -this.imageAnchorX_,\n -this.imageAnchorY_,\n this.imageWidth_,\n this.imageHeight_,\n );\n context.restore();\n } else {\n context.drawImage(\n this.image_,\n this.imageOriginX_,\n this.imageOriginY_,\n this.imageWidth_,\n this.imageHeight_,\n x,\n y,\n this.imageWidth_,\n this.imageHeight_,\n );\n }\n }\n if (this.imageOpacity_ != 1) {\n context.globalAlpha = alpha;\n }\n }\n\n /**\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {number} end End.\n * @param {number} stride Stride.\n * @private\n */\n drawText_(flatCoordinates, offset, end, stride) {\n if (!this.textState_ || this.text_ === '') {\n return;\n }\n if (this.textFillState_) {\n this.setContextFillState_(this.textFillState_);\n }\n if (this.textStrokeState_) {\n this.setContextStrokeState_(this.textStrokeState_);\n }\n this.setContextTextState_(this.textState_);\n const pixelCoordinates = transform2D(\n flatCoordinates,\n offset,\n end,\n stride,\n this.transform_,\n this.pixelCoordinates_,\n );\n const context = this.context_;\n let rotation = this.textRotation_;\n if (this.transformRotation_ === 0) {\n rotation -= this.viewRotation_;\n }\n if (this.textRotateWithView_) {\n rotation += this.viewRotation_;\n }\n for (; offset < end; offset += stride) {\n const x = pixelCoordinates[offset] + this.textOffsetX_;\n const y = pixelCoordinates[offset + 1] + this.textOffsetY_;\n if (\n rotation !== 0 ||\n this.textScale_[0] != 1 ||\n this.textScale_[1] != 1\n ) {\n context.save();\n context.translate(x - this.textOffsetX_, y - this.textOffsetY_);\n context.rotate(rotation);\n context.translate(this.textOffsetX_, this.textOffsetY_);\n context.scale(this.textScale_[0], this.textScale_[1]);\n if (this.textStrokeState_) {\n context.strokeText(this.text_, 0, 0);\n }\n if (this.textFillState_) {\n context.fillText(this.text_, 0, 0);\n }\n context.restore();\n } else {\n if (this.textStrokeState_) {\n context.strokeText(this.text_, x, y);\n }\n if (this.textFillState_) {\n context.fillText(this.text_, x, y);\n }\n }\n }\n }\n\n /**\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {number} end End.\n * @param {number} stride Stride.\n * @param {boolean} close Close.\n * @private\n * @return {number} end End.\n */\n moveToLineTo_(flatCoordinates, offset, end, stride, close) {\n const context = this.context_;\n const pixelCoordinates = transform2D(\n flatCoordinates,\n offset,\n end,\n stride,\n this.transform_,\n this.pixelCoordinates_,\n );\n context.moveTo(pixelCoordinates[0], pixelCoordinates[1]);\n let length = pixelCoordinates.length;\n if (close) {\n length -= 2;\n }\n for (let i = 2; i < length; i += 2) {\n context.lineTo(pixelCoordinates[i], pixelCoordinates[i + 1]);\n }\n if (close) {\n context.closePath();\n }\n return end;\n }\n\n /**\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {Array} ends Ends.\n * @param {number} stride Stride.\n * @private\n * @return {number} End.\n */\n drawRings_(flatCoordinates, offset, ends, stride) {\n for (let i = 0, ii = ends.length; i < ii; ++i) {\n offset = this.moveToLineTo_(\n flatCoordinates,\n offset,\n ends[i],\n stride,\n true,\n );\n }\n return offset;\n }\n\n /**\n * Render a circle geometry into the canvas. Rendering is immediate and uses\n * the current fill and stroke styles.\n *\n * @param {import(\"../../geom/Circle.js\").default} geometry Circle geometry.\n * @api\n * @override\n */\n drawCircle(geometry) {\n if (this.squaredTolerance_) {\n geometry = /** @type {import(\"../../geom/Circle.js\").default} */ (\n geometry.simplifyTransformed(\n this.squaredTolerance_,\n this.userTransform_,\n )\n );\n }\n if (!intersects(this.extent_, geometry.getExtent())) {\n return;\n }\n if (this.fillState_ || this.strokeState_) {\n if (this.fillState_) {\n this.setContextFillState_(this.fillState_);\n }\n if (this.strokeState_) {\n this.setContextStrokeState_(this.strokeState_);\n }\n const pixelCoordinates = transformGeom2D(\n geometry,\n this.transform_,\n this.pixelCoordinates_,\n );\n const dx = pixelCoordinates[2] - pixelCoordinates[0];\n const dy = pixelCoordinates[3] - pixelCoordinates[1];\n const radius = Math.sqrt(dx * dx + dy * dy);\n const context = this.context_;\n context.beginPath();\n context.arc(\n pixelCoordinates[0],\n pixelCoordinates[1],\n radius,\n 0,\n 2 * Math.PI,\n );\n if (this.fillState_) {\n context.fill();\n }\n if (this.strokeState_) {\n context.stroke();\n }\n }\n if (this.text_ !== '') {\n this.drawText_(geometry.getCenter(), 0, 2, 2);\n }\n }\n\n /**\n * Set the rendering style. Note that since this is an immediate rendering API,\n * any `zIndex` on the provided style will be ignored.\n *\n * @param {import(\"../../style/Style.js\").default} style The rendering style.\n * @api\n * @override\n */\n setStyle(style) {\n this.setFillStrokeStyle(style.getFill(), style.getStroke());\n this.setImageStyle(style.getImage());\n this.setTextStyle(style.getText());\n }\n\n /**\n * @param {import(\"../../transform.js\").Transform} transform Transform.\n */\n setTransform(transform) {\n this.transform_ = transform;\n }\n\n /**\n * Render a geometry into the canvas. Call\n * {@link module:ol/render/canvas/Immediate~CanvasImmediateRenderer#setStyle renderer.setStyle()} first to set the rendering style.\n *\n * @param {import(\"../../geom/Geometry.js\").default|import(\"../Feature.js\").default} geometry The geometry to render.\n * @api\n * @override\n */\n drawGeometry(geometry) {\n const type = geometry.getType();\n switch (type) {\n case 'Point':\n this.drawPoint(\n /** @type {import(\"../../geom/Point.js\").default} */ (geometry),\n );\n break;\n case 'LineString':\n this.drawLineString(\n /** @type {import(\"../../geom/LineString.js\").default} */ (geometry),\n );\n break;\n case 'Polygon':\n this.drawPolygon(\n /** @type {import(\"../../geom/Polygon.js\").default} */ (geometry),\n );\n break;\n case 'MultiPoint':\n this.drawMultiPoint(\n /** @type {import(\"../../geom/MultiPoint.js\").default} */ (geometry),\n );\n break;\n case 'MultiLineString':\n this.drawMultiLineString(\n /** @type {import(\"../../geom/MultiLineString.js\").default} */ (\n geometry\n ),\n );\n break;\n case 'MultiPolygon':\n this.drawMultiPolygon(\n /** @type {import(\"../../geom/MultiPolygon.js\").default} */ (\n geometry\n ),\n );\n break;\n case 'GeometryCollection':\n this.drawGeometryCollection(\n /** @type {import(\"../../geom/GeometryCollection.js\").default} */ (\n geometry\n ),\n );\n break;\n case 'Circle':\n this.drawCircle(\n /** @type {import(\"../../geom/Circle.js\").default} */ (geometry),\n );\n break;\n default:\n }\n }\n\n /**\n * Render a feature into the canvas. Note that any `zIndex` on the provided\n * style will be ignored - features are rendered immediately in the order that\n * this method is called. If you need `zIndex` support, you should be using an\n * {@link module:ol/layer/Vector~VectorLayer} instead.\n *\n * @param {import(\"../../Feature.js\").default} feature Feature.\n * @param {import(\"../../style/Style.js\").default} style Style.\n * @api\n * @override\n */\n drawFeature(feature, style) {\n const geometry = style.getGeometryFunction()(feature);\n if (!geometry) {\n return;\n }\n this.setStyle(style);\n this.drawGeometry(geometry);\n }\n\n /**\n * Render a GeometryCollection to the canvas. Rendering is immediate and\n * uses the current styles appropriate for each geometry in the collection.\n *\n * @param {import(\"../../geom/GeometryCollection.js\").default} geometry Geometry collection.\n * @override\n */\n drawGeometryCollection(geometry) {\n const geometries = geometry.getGeometriesArray();\n for (let i = 0, ii = geometries.length; i < ii; ++i) {\n this.drawGeometry(geometries[i]);\n }\n }\n\n /**\n * Render a Point geometry into the canvas. Rendering is immediate and uses\n * the current style.\n *\n * @param {import(\"../../geom/Point.js\").default|import(\"../Feature.js\").default} geometry Point geometry.\n * @override\n */\n drawPoint(geometry) {\n if (this.squaredTolerance_) {\n geometry = /** @type {import(\"../../geom/Point.js\").default} */ (\n geometry.simplifyTransformed(\n this.squaredTolerance_,\n this.userTransform_,\n )\n );\n }\n const flatCoordinates = geometry.getFlatCoordinates();\n const stride = geometry.getStride();\n if (this.image_) {\n this.drawImages_(flatCoordinates, 0, flatCoordinates.length, stride);\n }\n if (this.text_ !== '') {\n this.drawText_(flatCoordinates, 0, flatCoordinates.length, stride);\n }\n }\n\n /**\n * Render a MultiPoint geometry into the canvas. Rendering is immediate and\n * uses the current style.\n *\n * @param {import(\"../../geom/MultiPoint.js\").default|import(\"../Feature.js\").default} geometry MultiPoint geometry.\n * @override\n */\n drawMultiPoint(geometry) {\n if (this.squaredTolerance_) {\n geometry = /** @type {import(\"../../geom/MultiPoint.js\").default} */ (\n geometry.simplifyTransformed(\n this.squaredTolerance_,\n this.userTransform_,\n )\n );\n }\n const flatCoordinates = geometry.getFlatCoordinates();\n const stride = geometry.getStride();\n if (this.image_) {\n this.drawImages_(flatCoordinates, 0, flatCoordinates.length, stride);\n }\n if (this.text_ !== '') {\n this.drawText_(flatCoordinates, 0, flatCoordinates.length, stride);\n }\n }\n\n /**\n * Render a LineString into the canvas. Rendering is immediate and uses\n * the current style.\n *\n * @param {import(\"../../geom/LineString.js\").default|import(\"../Feature.js\").default} geometry LineString geometry.\n * @override\n */\n drawLineString(geometry) {\n if (this.squaredTolerance_) {\n geometry = /** @type {import(\"../../geom/LineString.js\").default} */ (\n geometry.simplifyTransformed(\n this.squaredTolerance_,\n this.userTransform_,\n )\n );\n }\n if (!intersects(this.extent_, geometry.getExtent())) {\n return;\n }\n if (this.strokeState_) {\n this.setContextStrokeState_(this.strokeState_);\n const context = this.context_;\n const flatCoordinates = geometry.getFlatCoordinates();\n context.beginPath();\n this.moveToLineTo_(\n flatCoordinates,\n 0,\n flatCoordinates.length,\n geometry.getStride(),\n false,\n );\n context.stroke();\n }\n if (this.text_ !== '') {\n const flatMidpoint = geometry.getFlatMidpoint();\n this.drawText_(flatMidpoint, 0, 2, 2);\n }\n }\n\n /**\n * Render a MultiLineString geometry into the canvas. Rendering is immediate\n * and uses the current style.\n *\n * @param {import(\"../../geom/MultiLineString.js\").default|import(\"../Feature.js\").default} geometry MultiLineString geometry.\n * @override\n */\n drawMultiLineString(geometry) {\n if (this.squaredTolerance_) {\n geometry =\n /** @type {import(\"../../geom/MultiLineString.js\").default} */ (\n geometry.simplifyTransformed(\n this.squaredTolerance_,\n this.userTransform_,\n )\n );\n }\n const geometryExtent = geometry.getExtent();\n if (!intersects(this.extent_, geometryExtent)) {\n return;\n }\n if (this.strokeState_) {\n this.setContextStrokeState_(this.strokeState_);\n const context = this.context_;\n const flatCoordinates = geometry.getFlatCoordinates();\n let offset = 0;\n const ends = /** @type {Array} */ (geometry.getEnds());\n const stride = geometry.getStride();\n context.beginPath();\n for (let i = 0, ii = ends.length; i < ii; ++i) {\n offset = this.moveToLineTo_(\n flatCoordinates,\n offset,\n ends[i],\n stride,\n false,\n );\n }\n context.stroke();\n }\n if (this.text_ !== '') {\n const flatMidpoints = geometry.getFlatMidpoints();\n this.drawText_(flatMidpoints, 0, flatMidpoints.length, 2);\n }\n }\n\n /**\n * Render a Polygon geometry into the canvas. Rendering is immediate and uses\n * the current style.\n *\n * @param {import(\"../../geom/Polygon.js\").default|import(\"../Feature.js\").default} geometry Polygon geometry.\n * @override\n */\n drawPolygon(geometry) {\n if (this.squaredTolerance_) {\n geometry = /** @type {import(\"../../geom/Polygon.js\").default} */ (\n geometry.simplifyTransformed(\n this.squaredTolerance_,\n this.userTransform_,\n )\n );\n }\n if (!intersects(this.extent_, geometry.getExtent())) {\n return;\n }\n if (this.strokeState_ || this.fillState_) {\n if (this.fillState_) {\n this.setContextFillState_(this.fillState_);\n }\n if (this.strokeState_) {\n this.setContextStrokeState_(this.strokeState_);\n }\n const context = this.context_;\n context.beginPath();\n this.drawRings_(\n geometry.getOrientedFlatCoordinates(),\n 0,\n /** @type {Array} */ (geometry.getEnds()),\n geometry.getStride(),\n );\n if (this.fillState_) {\n context.fill();\n }\n if (this.strokeState_) {\n context.stroke();\n }\n }\n if (this.text_ !== '') {\n const flatInteriorPoint = geometry.getFlatInteriorPoint();\n this.drawText_(flatInteriorPoint, 0, 2, 2);\n }\n }\n\n /**\n * Render MultiPolygon geometry into the canvas. Rendering is immediate and\n * uses the current style.\n * @param {import(\"../../geom/MultiPolygon.js\").default} geometry MultiPolygon geometry.\n * @override\n */\n drawMultiPolygon(geometry) {\n if (this.squaredTolerance_) {\n geometry = /** @type {import(\"../../geom/MultiPolygon.js\").default} */ (\n geometry.simplifyTransformed(\n this.squaredTolerance_,\n this.userTransform_,\n )\n );\n }\n if (!intersects(this.extent_, geometry.getExtent())) {\n return;\n }\n if (this.strokeState_ || this.fillState_) {\n if (this.fillState_) {\n this.setContextFillState_(this.fillState_);\n }\n if (this.strokeState_) {\n this.setContextStrokeState_(this.strokeState_);\n }\n const context = this.context_;\n const flatCoordinates = geometry.getOrientedFlatCoordinates();\n let offset = 0;\n const endss = geometry.getEndss();\n const stride = geometry.getStride();\n context.beginPath();\n for (let i = 0, ii = endss.length; i < ii; ++i) {\n const ends = endss[i];\n offset = this.drawRings_(flatCoordinates, offset, ends, stride);\n }\n if (this.fillState_) {\n context.fill();\n }\n if (this.strokeState_) {\n context.stroke();\n }\n }\n if (this.text_ !== '') {\n const flatInteriorPoints = geometry.getFlatInteriorPoints();\n this.drawText_(flatInteriorPoints, 0, flatInteriorPoints.length, 2);\n }\n }\n\n /**\n * @param {import(\"../canvas.js\").FillState} fillState Fill state.\n * @private\n */\n setContextFillState_(fillState) {\n const context = this.context_;\n const contextFillState = this.contextFillState_;\n if (!contextFillState) {\n context.fillStyle = fillState.fillStyle;\n this.contextFillState_ = {\n fillStyle: fillState.fillStyle,\n };\n } else {\n if (contextFillState.fillStyle != fillState.fillStyle) {\n contextFillState.fillStyle = fillState.fillStyle;\n context.fillStyle = fillState.fillStyle;\n }\n }\n }\n\n /**\n * @param {import(\"../canvas.js\").StrokeState} strokeState Stroke state.\n * @private\n */\n setContextStrokeState_(strokeState) {\n const context = this.context_;\n const contextStrokeState = this.contextStrokeState_;\n if (!contextStrokeState) {\n context.lineCap = strokeState.lineCap;\n context.setLineDash(strokeState.lineDash);\n context.lineDashOffset = strokeState.lineDashOffset;\n context.lineJoin = strokeState.lineJoin;\n context.lineWidth = strokeState.lineWidth;\n context.miterLimit = strokeState.miterLimit;\n context.strokeStyle = strokeState.strokeStyle;\n this.contextStrokeState_ = {\n lineCap: strokeState.lineCap,\n lineDash: strokeState.lineDash,\n lineDashOffset: strokeState.lineDashOffset,\n lineJoin: strokeState.lineJoin,\n lineWidth: strokeState.lineWidth,\n miterLimit: strokeState.miterLimit,\n strokeStyle: strokeState.strokeStyle,\n };\n } else {\n if (contextStrokeState.lineCap != strokeState.lineCap) {\n contextStrokeState.lineCap = strokeState.lineCap;\n context.lineCap = strokeState.lineCap;\n }\n if (!equals(contextStrokeState.lineDash, strokeState.lineDash)) {\n context.setLineDash(\n (contextStrokeState.lineDash = strokeState.lineDash),\n );\n }\n if (contextStrokeState.lineDashOffset != strokeState.lineDashOffset) {\n contextStrokeState.lineDashOffset = strokeState.lineDashOffset;\n context.lineDashOffset = strokeState.lineDashOffset;\n }\n if (contextStrokeState.lineJoin != strokeState.lineJoin) {\n contextStrokeState.lineJoin = strokeState.lineJoin;\n context.lineJoin = strokeState.lineJoin;\n }\n if (contextStrokeState.lineWidth != strokeState.lineWidth) {\n contextStrokeState.lineWidth = strokeState.lineWidth;\n context.lineWidth = strokeState.lineWidth;\n }\n if (contextStrokeState.miterLimit != strokeState.miterLimit) {\n contextStrokeState.miterLimit = strokeState.miterLimit;\n context.miterLimit = strokeState.miterLimit;\n }\n if (contextStrokeState.strokeStyle != strokeState.strokeStyle) {\n contextStrokeState.strokeStyle = strokeState.strokeStyle;\n context.strokeStyle = strokeState.strokeStyle;\n }\n }\n }\n\n /**\n * @param {import(\"../canvas.js\").TextState} textState Text state.\n * @private\n */\n setContextTextState_(textState) {\n const context = this.context_;\n const contextTextState = this.contextTextState_;\n const textAlign = textState.textAlign\n ? textState.textAlign\n : defaultTextAlign;\n if (!contextTextState) {\n context.font = textState.font;\n context.textAlign = textAlign;\n context.textBaseline = textState.textBaseline;\n this.contextTextState_ = {\n font: textState.font,\n textAlign: textAlign,\n textBaseline: textState.textBaseline,\n };\n } else {\n if (contextTextState.font != textState.font) {\n contextTextState.font = textState.font;\n context.font = textState.font;\n }\n if (contextTextState.textAlign != textAlign) {\n contextTextState.textAlign = textAlign;\n context.textAlign = textAlign;\n }\n if (contextTextState.textBaseline != textState.textBaseline) {\n contextTextState.textBaseline = textState.textBaseline;\n context.textBaseline = textState.textBaseline;\n }\n }\n }\n\n /**\n * Set the fill and stroke style for subsequent draw operations. To clear\n * either fill or stroke styles, pass null for the appropriate parameter.\n *\n * @param {import(\"../../style/Fill.js\").default} fillStyle Fill style.\n * @param {import(\"../../style/Stroke.js\").default} strokeStyle Stroke style.\n * @override\n */\n setFillStrokeStyle(fillStyle, strokeStyle) {\n if (!fillStyle) {\n this.fillState_ = null;\n } else {\n const fillStyleColor = fillStyle.getColor();\n this.fillState_ = {\n fillStyle: asColorLike(\n fillStyleColor ? fillStyleColor : defaultFillStyle,\n ),\n };\n }\n if (!strokeStyle) {\n this.strokeState_ = null;\n } else {\n const strokeStyleColor = strokeStyle.getColor();\n const strokeStyleLineCap = strokeStyle.getLineCap();\n const strokeStyleLineDash = strokeStyle.getLineDash();\n const strokeStyleLineDashOffset = strokeStyle.getLineDashOffset();\n const strokeStyleLineJoin = strokeStyle.getLineJoin();\n const strokeStyleWidth = strokeStyle.getWidth();\n const strokeStyleMiterLimit = strokeStyle.getMiterLimit();\n const lineDash = strokeStyleLineDash\n ? strokeStyleLineDash\n : defaultLineDash;\n this.strokeState_ = {\n lineCap:\n strokeStyleLineCap !== undefined\n ? strokeStyleLineCap\n : defaultLineCap,\n lineDash:\n this.pixelRatio_ === 1\n ? lineDash\n : lineDash.map((n) => n * this.pixelRatio_),\n lineDashOffset:\n (strokeStyleLineDashOffset\n ? strokeStyleLineDashOffset\n : defaultLineDashOffset) * this.pixelRatio_,\n lineJoin:\n strokeStyleLineJoin !== undefined\n ? strokeStyleLineJoin\n : defaultLineJoin,\n lineWidth:\n (strokeStyleWidth !== undefined\n ? strokeStyleWidth\n : defaultLineWidth) * this.pixelRatio_,\n miterLimit:\n strokeStyleMiterLimit !== undefined\n ? strokeStyleMiterLimit\n : defaultMiterLimit,\n strokeStyle: asColorLike(\n strokeStyleColor ? strokeStyleColor : defaultStrokeStyle,\n ),\n };\n }\n }\n\n /**\n * Set the image style for subsequent draw operations. Pass null to remove\n * the image style.\n *\n * @param {import(\"../../style/Image.js\").default} imageStyle Image style.\n * @override\n */\n setImageStyle(imageStyle) {\n let imageSize;\n if (!imageStyle || !(imageSize = imageStyle.getSize())) {\n this.image_ = null;\n return;\n }\n const imagePixelRatio = imageStyle.getPixelRatio(this.pixelRatio_);\n const imageAnchor = imageStyle.getAnchor();\n const imageOrigin = imageStyle.getOrigin();\n this.image_ = imageStyle.getImage(this.pixelRatio_);\n this.imageAnchorX_ = imageAnchor[0] * imagePixelRatio;\n this.imageAnchorY_ = imageAnchor[1] * imagePixelRatio;\n this.imageHeight_ = imageSize[1] * imagePixelRatio;\n this.imageOpacity_ = imageStyle.getOpacity();\n this.imageOriginX_ = imageOrigin[0];\n this.imageOriginY_ = imageOrigin[1];\n this.imageRotateWithView_ = imageStyle.getRotateWithView();\n this.imageRotation_ = imageStyle.getRotation();\n const imageScale = imageStyle.getScaleArray();\n this.imageScale_ = [\n (imageScale[0] * this.pixelRatio_) / imagePixelRatio,\n (imageScale[1] * this.pixelRatio_) / imagePixelRatio,\n ];\n this.imageWidth_ = imageSize[0] * imagePixelRatio;\n }\n\n /**\n * Set the text style for subsequent draw operations. Pass null to\n * remove the text style.\n *\n * @param {import(\"../../style/Text.js\").default} textStyle Text style.\n * @override\n */\n setTextStyle(textStyle) {\n if (!textStyle) {\n this.text_ = '';\n } else {\n const textFillStyle = textStyle.getFill();\n if (!textFillStyle) {\n this.textFillState_ = null;\n } else {\n const textFillStyleColor = textFillStyle.getColor();\n this.textFillState_ = {\n fillStyle: asColorLike(\n textFillStyleColor ? textFillStyleColor : defaultFillStyle,\n ),\n };\n }\n const textStrokeStyle = textStyle.getStroke();\n if (!textStrokeStyle) {\n this.textStrokeState_ = null;\n } else {\n const textStrokeStyleColor = textStrokeStyle.getColor();\n const textStrokeStyleLineCap = textStrokeStyle.getLineCap();\n const textStrokeStyleLineDash = textStrokeStyle.getLineDash();\n const textStrokeStyleLineDashOffset =\n textStrokeStyle.getLineDashOffset();\n const textStrokeStyleLineJoin = textStrokeStyle.getLineJoin();\n const textStrokeStyleWidth = textStrokeStyle.getWidth();\n const textStrokeStyleMiterLimit = textStrokeStyle.getMiterLimit();\n this.textStrokeState_ = {\n lineCap:\n textStrokeStyleLineCap !== undefined\n ? textStrokeStyleLineCap\n : defaultLineCap,\n lineDash: textStrokeStyleLineDash\n ? textStrokeStyleLineDash\n : defaultLineDash,\n lineDashOffset: textStrokeStyleLineDashOffset\n ? textStrokeStyleLineDashOffset\n : defaultLineDashOffset,\n lineJoin:\n textStrokeStyleLineJoin !== undefined\n ? textStrokeStyleLineJoin\n : defaultLineJoin,\n lineWidth:\n textStrokeStyleWidth !== undefined\n ? textStrokeStyleWidth\n : defaultLineWidth,\n miterLimit:\n textStrokeStyleMiterLimit !== undefined\n ? textStrokeStyleMiterLimit\n : defaultMiterLimit,\n strokeStyle: asColorLike(\n textStrokeStyleColor ? textStrokeStyleColor : defaultStrokeStyle,\n ),\n };\n }\n const textFont = textStyle.getFont();\n const textOffsetX = textStyle.getOffsetX();\n const textOffsetY = textStyle.getOffsetY();\n const textRotateWithView = textStyle.getRotateWithView();\n const textRotation = textStyle.getRotation();\n const textScale = textStyle.getScaleArray();\n const textText = textStyle.getText();\n const textTextAlign = textStyle.getTextAlign();\n const textTextBaseline = textStyle.getTextBaseline();\n this.textState_ = {\n font: textFont !== undefined ? textFont : defaultFont,\n textAlign:\n textTextAlign !== undefined ? textTextAlign : defaultTextAlign,\n textBaseline:\n textTextBaseline !== undefined\n ? textTextBaseline\n : defaultTextBaseline,\n };\n this.text_ =\n textText !== undefined\n ? Array.isArray(textText)\n ? textText.reduce((acc, t, i) => (acc += i % 2 ? ' ' : t), '')\n : textText\n : '';\n this.textOffsetX_ =\n textOffsetX !== undefined ? this.pixelRatio_ * textOffsetX : 0;\n this.textOffsetY_ =\n textOffsetY !== undefined ? this.pixelRatio_ * textOffsetY : 0;\n this.textRotateWithView_ =\n textRotateWithView !== undefined ? textRotateWithView : false;\n this.textRotation_ = textRotation !== undefined ? textRotation : 0;\n this.textScale_ = [\n this.pixelRatio_ * textScale[0],\n this.pixelRatio_ * textScale[1],\n ];\n }\n }\n}\n\nexport default CanvasImmediateRenderer;\n","/**\n * @module ol/renderer/vector\n */\nimport ImageState from '../ImageState.js';\nimport {getUid} from '../util.js';\n\n/**\n * Feature callback. The callback will be called with three arguments. The first\n * argument is one {@link module:ol/Feature~Feature feature} or {@link module:ol/render/Feature~RenderFeature render feature}\n * at the pixel, the second is the {@link module:ol/layer/Layer~Layer layer} of the feature and will be null for\n * unmanaged layers. The third is the {@link module:ol/geom/SimpleGeometry~SimpleGeometry} of the feature. For features\n * with a GeometryCollection geometry, it will be the first detected geometry from the collection.\n * @template T\n * @typedef {function(import(\"../Feature.js\").FeatureLike, import(\"../layer/Layer.js\").default, import(\"../geom/SimpleGeometry.js\").default): T} FeatureCallback\n */\n\n/**\n * Tolerance for geometry simplification in device pixels.\n * @type {number}\n */\nconst SIMPLIFY_TOLERANCE = 0.5;\n\n/**\n * @const\n * @type {Object}\n */\nconst GEOMETRY_RENDERERS = {\n 'Point': renderPointGeometry,\n 'LineString': renderLineStringGeometry,\n 'Polygon': renderPolygonGeometry,\n 'MultiPoint': renderMultiPointGeometry,\n 'MultiLineString': renderMultiLineStringGeometry,\n 'MultiPolygon': renderMultiPolygonGeometry,\n 'GeometryCollection': renderGeometryCollectionGeometry,\n 'Circle': renderCircleGeometry,\n};\n\n/**\n * @param {import(\"../Feature.js\").FeatureLike} feature1 Feature 1.\n * @param {import(\"../Feature.js\").FeatureLike} feature2 Feature 2.\n * @return {number} Order.\n */\nexport function defaultOrder(feature1, feature2) {\n return parseInt(getUid(feature1), 10) - parseInt(getUid(feature2), 10);\n}\n\n/**\n * @param {number} resolution Resolution.\n * @param {number} pixelRatio Pixel ratio.\n * @return {number} Squared pixel tolerance.\n */\nexport function getSquaredTolerance(resolution, pixelRatio) {\n const tolerance = getTolerance(resolution, pixelRatio);\n return tolerance * tolerance;\n}\n\n/**\n * @param {number} resolution Resolution.\n * @param {number} pixelRatio Pixel ratio.\n * @return {number} Pixel tolerance.\n */\nexport function getTolerance(resolution, pixelRatio) {\n return (SIMPLIFY_TOLERANCE * resolution) / pixelRatio;\n}\n\n/**\n * @param {import(\"../render/canvas/BuilderGroup.js\").default} builderGroup Builder group.\n * @param {import(\"../geom/Circle.js\").default} geometry Geometry.\n * @param {import(\"../style/Style.js\").default} style Style.\n * @param {import(\"../Feature.js\").default} feature Feature.\n * @param {number} [index] Render order index.\n */\nfunction renderCircleGeometry(builderGroup, geometry, style, feature, index) {\n const fillStyle = style.getFill();\n const strokeStyle = style.getStroke();\n if (fillStyle || strokeStyle) {\n const circleReplay = builderGroup.getBuilder(style.getZIndex(), 'Circle');\n circleReplay.setFillStrokeStyle(fillStyle, strokeStyle);\n circleReplay.drawCircle(geometry, feature, index);\n }\n const textStyle = style.getText();\n if (textStyle && textStyle.getText()) {\n const textReplay = builderGroup.getBuilder(style.getZIndex(), 'Text');\n textReplay.setTextStyle(textStyle);\n textReplay.drawText(geometry, feature);\n }\n}\n\n/**\n * @param {import(\"../render/canvas/BuilderGroup.js\").default} replayGroup Replay group.\n * @param {import(\"../Feature.js\").FeatureLike} feature Feature.\n * @param {import(\"../style/Style.js\").default} style Style.\n * @param {number} squaredTolerance Squared tolerance.\n * @param {function(import(\"../events/Event.js\").default): void} listener Listener function.\n * @param {import(\"../proj.js\").TransformFunction} [transform] Transform from user to view projection.\n * @param {boolean} [declutter] Enable decluttering.\n * @param {number} [index] Render order index..\n * @return {boolean} `true` if style is loading.\n */\nexport function renderFeature(\n replayGroup,\n feature,\n style,\n squaredTolerance,\n listener,\n transform,\n declutter,\n index,\n) {\n const loadingPromises = [];\n const imageStyle = style.getImage();\n if (imageStyle) {\n let loading = true;\n const imageState = imageStyle.getImageState();\n if (imageState == ImageState.LOADED || imageState == ImageState.ERROR) {\n loading = false;\n } else {\n if (imageState == ImageState.IDLE) {\n imageStyle.load();\n }\n }\n if (loading) {\n loadingPromises.push(imageStyle.ready());\n }\n }\n const fillStyle = style.getFill();\n if (fillStyle && fillStyle.loading()) {\n loadingPromises.push(fillStyle.ready());\n }\n const loading = loadingPromises.length > 0;\n if (loading) {\n Promise.all(loadingPromises).then(() => listener(null));\n }\n renderFeatureInternal(\n replayGroup,\n feature,\n style,\n squaredTolerance,\n transform,\n declutter,\n index,\n );\n\n return loading;\n}\n\n/**\n * @param {import(\"../render/canvas/BuilderGroup.js\").default} replayGroup Replay group.\n * @param {import(\"../Feature.js\").FeatureLike} feature Feature.\n * @param {import(\"../style/Style.js\").default} style Style.\n * @param {number} squaredTolerance Squared tolerance.\n * @param {import(\"../proj.js\").TransformFunction} [transform] Optional transform function.\n * @param {boolean} [declutter] Enable decluttering.\n * @param {number} [index] Render order index..\n */\nfunction renderFeatureInternal(\n replayGroup,\n feature,\n style,\n squaredTolerance,\n transform,\n declutter,\n index,\n) {\n const geometry = style.getGeometryFunction()(feature);\n if (!geometry) {\n return;\n }\n const simplifiedGeometry = geometry.simplifyTransformed(\n squaredTolerance,\n transform,\n );\n const renderer = style.getRenderer();\n if (renderer) {\n renderGeometry(replayGroup, simplifiedGeometry, style, feature, index);\n } else {\n const geometryRenderer = GEOMETRY_RENDERERS[simplifiedGeometry.getType()];\n geometryRenderer(\n replayGroup,\n simplifiedGeometry,\n style,\n feature,\n index,\n declutter,\n );\n }\n}\n\n/**\n * @param {import(\"../render/canvas/BuilderGroup.js\").default} replayGroup Replay group.\n * @param {import(\"../geom/Geometry.js\").default|import(\"../render/Feature.js\").default} geometry Geometry.\n * @param {import(\"../style/Style.js\").default} style Style.\n * @param {import(\"../Feature.js\").FeatureLike} feature Feature.\n * @param {number} [index] Render order index.\n */\nfunction renderGeometry(replayGroup, geometry, style, feature, index) {\n if (geometry.getType() == 'GeometryCollection') {\n const geometries =\n /** @type {import(\"../geom/GeometryCollection.js\").default} */ (\n geometry\n ).getGeometries();\n for (let i = 0, ii = geometries.length; i < ii; ++i) {\n renderGeometry(replayGroup, geometries[i], style, feature, index);\n }\n return;\n }\n const replay = replayGroup.getBuilder(style.getZIndex(), 'Default');\n replay.drawCustom(\n /** @type {import(\"../geom/SimpleGeometry.js\").default} */ (geometry),\n feature,\n style.getRenderer(),\n style.getHitDetectionRenderer(),\n index,\n );\n}\n\n/**\n * @param {import(\"../render/canvas/BuilderGroup.js\").default} replayGroup Replay group.\n * @param {import(\"../geom/GeometryCollection.js\").default} geometry Geometry.\n * @param {import(\"../style/Style.js\").default} style Style.\n * @param {import(\"../Feature.js\").default} feature Feature.\n * @param {import(\"../render/canvas/BuilderGroup.js\").default} [declutterBuilderGroup] Builder for decluttering.\n * @param {number} [index] Render order index.\n */\nfunction renderGeometryCollectionGeometry(\n replayGroup,\n geometry,\n style,\n feature,\n declutterBuilderGroup,\n index,\n) {\n const geometries = geometry.getGeometriesArray();\n let i, ii;\n for (i = 0, ii = geometries.length; i < ii; ++i) {\n const geometryRenderer = GEOMETRY_RENDERERS[geometries[i].getType()];\n geometryRenderer(\n replayGroup,\n geometries[i],\n style,\n feature,\n declutterBuilderGroup,\n index,\n );\n }\n}\n\n/**\n * @param {import(\"../render/canvas/BuilderGroup.js\").default} builderGroup Replay group.\n * @param {import(\"../geom/LineString.js\").default|import(\"../render/Feature.js\").default} geometry Geometry.\n * @param {import(\"../style/Style.js\").default} style Style.\n * @param {import(\"../Feature.js\").FeatureLike} feature Feature.\n * @param {number} [index] Render order index.\n */\nfunction renderLineStringGeometry(\n builderGroup,\n geometry,\n style,\n feature,\n index,\n) {\n const strokeStyle = style.getStroke();\n if (strokeStyle) {\n const lineStringReplay = builderGroup.getBuilder(\n style.getZIndex(),\n 'LineString',\n );\n lineStringReplay.setFillStrokeStyle(null, strokeStyle);\n lineStringReplay.drawLineString(geometry, feature, index);\n }\n const textStyle = style.getText();\n if (textStyle && textStyle.getText()) {\n const textReplay = builderGroup.getBuilder(style.getZIndex(), 'Text');\n textReplay.setTextStyle(textStyle);\n textReplay.drawText(geometry, feature, index);\n }\n}\n\n/**\n * @param {import(\"../render/canvas/BuilderGroup.js\").default} builderGroup Replay group.\n * @param {import(\"../geom/MultiLineString.js\").default|import(\"../render/Feature.js\").default} geometry Geometry.\n * @param {import(\"../style/Style.js\").default} style Style.\n * @param {import(\"../Feature.js\").FeatureLike} feature Feature.\n * @param {number} [index] Render order index.\n */\nfunction renderMultiLineStringGeometry(\n builderGroup,\n geometry,\n style,\n feature,\n index,\n) {\n const strokeStyle = style.getStroke();\n if (strokeStyle) {\n const lineStringReplay = builderGroup.getBuilder(\n style.getZIndex(),\n 'LineString',\n );\n lineStringReplay.setFillStrokeStyle(null, strokeStyle);\n lineStringReplay.drawMultiLineString(geometry, feature, index);\n }\n const textStyle = style.getText();\n if (textStyle && textStyle.getText()) {\n const textReplay = builderGroup.getBuilder(style.getZIndex(), 'Text');\n textReplay.setTextStyle(textStyle);\n textReplay.drawText(geometry, feature, index);\n }\n}\n\n/**\n * @param {import(\"../render/canvas/BuilderGroup.js\").default} builderGroup Replay group.\n * @param {import(\"../geom/MultiPolygon.js\").default} geometry Geometry.\n * @param {import(\"../style/Style.js\").default} style Style.\n * @param {import(\"../Feature.js\").default} feature Feature.\n * @param {number} [index] Render order index.\n */\nfunction renderMultiPolygonGeometry(\n builderGroup,\n geometry,\n style,\n feature,\n index,\n) {\n const fillStyle = style.getFill();\n const strokeStyle = style.getStroke();\n if (strokeStyle || fillStyle) {\n const polygonReplay = builderGroup.getBuilder(style.getZIndex(), 'Polygon');\n polygonReplay.setFillStrokeStyle(fillStyle, strokeStyle);\n polygonReplay.drawMultiPolygon(geometry, feature, index);\n }\n const textStyle = style.getText();\n if (textStyle && textStyle.getText()) {\n const textReplay = builderGroup.getBuilder(style.getZIndex(), 'Text');\n textReplay.setTextStyle(textStyle);\n textReplay.drawText(geometry, feature, index);\n }\n}\n\n/**\n * @param {import(\"../render/canvas/BuilderGroup.js\").default} builderGroup Replay group.\n * @param {import(\"../geom/Point.js\").default|import(\"../render/Feature.js\").default} geometry Geometry.\n * @param {import(\"../style/Style.js\").default} style Style.\n * @param {import(\"../Feature.js\").FeatureLike} feature Feature.\n * @param {number} [index] Render order index.\n * @param {boolean} [declutter] Enable decluttering.\n */\nfunction renderPointGeometry(\n builderGroup,\n geometry,\n style,\n feature,\n index,\n declutter,\n) {\n const imageStyle = style.getImage();\n const textStyle = style.getText();\n const hasText = textStyle && textStyle.getText();\n /** @type {import(\"../render/canvas.js\").DeclutterImageWithText} */\n const declutterImageWithText =\n declutter && imageStyle && hasText ? {} : undefined;\n if (imageStyle) {\n if (imageStyle.getImageState() != ImageState.LOADED) {\n return;\n }\n const imageReplay = builderGroup.getBuilder(style.getZIndex(), 'Image');\n imageReplay.setImageStyle(imageStyle, declutterImageWithText);\n imageReplay.drawPoint(geometry, feature, index);\n }\n if (hasText) {\n const textReplay = builderGroup.getBuilder(style.getZIndex(), 'Text');\n textReplay.setTextStyle(textStyle, declutterImageWithText);\n textReplay.drawText(geometry, feature, index);\n }\n}\n\n/**\n * @param {import(\"../render/canvas/BuilderGroup.js\").default} builderGroup Replay group.\n * @param {import(\"../geom/MultiPoint.js\").default|import(\"../render/Feature.js\").default} geometry Geometry.\n * @param {import(\"../style/Style.js\").default} style Style.\n * @param {import(\"../Feature.js\").FeatureLike} feature Feature.\n * @param {number} [index] Render order index.\n * @param {boolean} [declutter] Enable decluttering.\n */\nfunction renderMultiPointGeometry(\n builderGroup,\n geometry,\n style,\n feature,\n index,\n declutter,\n) {\n const imageStyle = style.getImage();\n const hasImage = imageStyle && imageStyle.getOpacity() !== 0;\n const textStyle = style.getText();\n const hasText = textStyle && textStyle.getText();\n /** @type {import(\"../render/canvas.js\").DeclutterImageWithText} */\n const declutterImageWithText =\n declutter && hasImage && hasText ? {} : undefined;\n if (hasImage) {\n if (imageStyle.getImageState() != ImageState.LOADED) {\n return;\n }\n const imageReplay = builderGroup.getBuilder(style.getZIndex(), 'Image');\n imageReplay.setImageStyle(imageStyle, declutterImageWithText);\n imageReplay.drawMultiPoint(geometry, feature, index);\n }\n if (hasText) {\n const textReplay = builderGroup.getBuilder(style.getZIndex(), 'Text');\n textReplay.setTextStyle(textStyle, declutterImageWithText);\n textReplay.drawText(geometry, feature, index);\n }\n}\n\n/**\n * @param {import(\"../render/canvas/BuilderGroup.js\").default} builderGroup Replay group.\n * @param {import(\"../geom/Polygon.js\").default|import(\"../render/Feature.js\").default} geometry Geometry.\n * @param {import(\"../style/Style.js\").default} style Style.\n * @param {import(\"../Feature.js\").FeatureLike} feature Feature.\n * @param {number} [index] Render order index.\n */\nfunction renderPolygonGeometry(builderGroup, geometry, style, feature, index) {\n const fillStyle = style.getFill();\n const strokeStyle = style.getStroke();\n if (fillStyle || strokeStyle) {\n const polygonReplay = builderGroup.getBuilder(style.getZIndex(), 'Polygon');\n polygonReplay.setFillStrokeStyle(fillStyle, strokeStyle);\n polygonReplay.drawPolygon(geometry, feature, index);\n }\n const textStyle = style.getText();\n if (textStyle && textStyle.getText()) {\n const textReplay = builderGroup.getBuilder(style.getZIndex(), 'Text');\n textReplay.setTextStyle(textStyle);\n textReplay.drawText(geometry, feature, index);\n }\n}\n","/**\n * @module ol/loadingstrategy\n */\n\nimport {fromUserExtent, fromUserResolution, toUserExtent} from './proj.js';\n\n/**\n * Strategy function for loading all features with a single request.\n * @param {import(\"./extent.js\").Extent} extent Extent.\n * @param {number} resolution Resolution.\n * @return {Array} Extents.\n * @api\n */\nexport function all(extent, resolution) {\n return [[-Infinity, -Infinity, Infinity, Infinity]];\n}\n\n/**\n * Strategy function for loading features based on the view's extent and\n * resolution.\n * @param {import(\"./extent.js\").Extent} extent Extent.\n * @param {number} resolution Resolution.\n * @return {Array} Extents.\n * @api\n */\nexport function bbox(extent, resolution) {\n return [extent];\n}\n\n/**\n * Creates a strategy function for loading features based on a tile grid.\n * @param {import(\"./tilegrid/TileGrid.js\").default} tileGrid Tile grid.\n * @return {function(import(\"./extent.js\").Extent, number, import(\"./proj.js\").Projection): Array} Loading strategy.\n * @api\n */\nexport function tile(tileGrid) {\n return (\n /**\n * @param {import(\"./extent.js\").Extent} extent Extent.\n * @param {number} resolution Resolution.\n * @param {import(\"./proj.js\").Projection} projection Projection.\n * @return {Array} Extents.\n */\n function (extent, resolution, projection) {\n const z = tileGrid.getZForResolution(\n fromUserResolution(resolution, projection),\n );\n const tileRange = tileGrid.getTileRangeForExtentAndZ(\n fromUserExtent(extent, projection),\n z,\n );\n /** @type {Array} */\n const extents = [];\n /** @type {import(\"./tilecoord.js\").TileCoord} */\n const tileCoord = [z, 0, 0];\n for (\n tileCoord[1] = tileRange.minX;\n tileCoord[1] <= tileRange.maxX;\n ++tileCoord[1]\n ) {\n for (\n tileCoord[2] = tileRange.minY;\n tileCoord[2] <= tileRange.maxY;\n ++tileCoord[2]\n ) {\n extents.push(\n toUserExtent(tileGrid.getTileCoordExtent(tileCoord), projection),\n );\n }\n }\n return extents;\n }\n );\n}\n","/**\n * @module ol/featureloader\n */\nimport {VOID} from './functions.js';\n\n/**\n *\n * @type {boolean}\n * @private\n */\nlet withCredentials = false;\n\n/**\n * {@link module:ol/source/Vector~VectorSource} sources use a function of this type to\n * load features.\n *\n * This function takes up to 5 arguments. These are an {@link module:ol/extent~Extent} representing\n * the area to be loaded, a `{number}` representing the resolution (map units per pixel), a\n * {@link module:ol/proj/Projection~Projection} for the projection, an optional success callback that should get\n * the loaded features passed as an argument and an optional failure callback with no arguments. If\n * the callbacks are not used, the corresponding vector source will not fire `'featuresloadend'` and\n * `'featuresloaderror'` events. `this` within the function is bound to the\n * {@link module:ol/source/Vector~VectorSource} it's called from.\n *\n * The function is responsible for loading the features and adding them to the\n * source.\n *\n * @template {import(\"./Feature.js\").FeatureLike} [FeatureType=import(\"./Feature.js\").default]\n * @typedef {function(this:(import(\"./source/Vector\").default|import(\"./VectorTile.js\").default),\n * import(\"./extent.js\").Extent,\n * number,\n * import(\"./proj/Projection.js\").default,\n * function(Array): void=,\n * function(): void=): void} FeatureLoader\n * @api\n */\n\n/**\n * {@link module:ol/source/Vector~VectorSource} sources use a function of this type to\n * get the url to load features from.\n *\n * This function takes an {@link module:ol/extent~Extent} representing the area\n * to be loaded, a `{number}` representing the resolution (map units per pixel)\n * and an {@link module:ol/proj/Projection~Projection} for the projection as\n * arguments and returns a `{string}` representing the URL.\n * @typedef {function(import(\"./extent.js\").Extent, number, import(\"./proj/Projection.js\").default): string} FeatureUrlFunction\n * @api\n */\n\n/**\n * @template {import(\"./Feature.js\").FeatureLike} [FeatureType=import(\"./Feature.js\").default]\n * @param {string|FeatureUrlFunction} url Feature URL service.\n * @param {import(\"./format/Feature.js\").default} format Feature format.\n * @param {import(\"./extent.js\").Extent} extent Extent.\n * @param {number} resolution Resolution.\n * @param {import(\"./proj/Projection.js\").default} projection Projection.\n * @param {function(Array, import(\"./proj/Projection.js\").default): void} success Success\n * Function called with the loaded features and optionally with the data projection.\n * @param {function(): void} failure Failure\n * Function called when loading failed.\n */\nexport function loadFeaturesXhr(\n url,\n format,\n extent,\n resolution,\n projection,\n success,\n failure,\n) {\n const xhr = new XMLHttpRequest();\n xhr.open(\n 'GET',\n typeof url === 'function' ? url(extent, resolution, projection) : url,\n true,\n );\n if (format.getType() == 'arraybuffer') {\n xhr.responseType = 'arraybuffer';\n }\n xhr.withCredentials = withCredentials;\n /**\n * @param {Event} event Event.\n * @private\n */\n xhr.onload = function (event) {\n // status will be 0 for file:// urls\n if (!xhr.status || (xhr.status >= 200 && xhr.status < 300)) {\n const type = format.getType();\n try {\n /** @type {Document|Node|Object|string|undefined} */\n let source;\n if (type == 'text' || type == 'json') {\n source = xhr.responseText;\n } else if (type == 'xml') {\n source = xhr.responseXML || xhr.responseText;\n } else if (type == 'arraybuffer') {\n source = /** @type {ArrayBuffer} */ (xhr.response);\n }\n if (source) {\n success(\n /** @type {Array} */\n (\n format.readFeatures(source, {\n extent: extent,\n featureProjection: projection,\n })\n ),\n format.readProjection(source),\n );\n } else {\n failure();\n }\n } catch {\n failure();\n }\n } else {\n failure();\n }\n };\n /**\n * @private\n */\n xhr.onerror = failure;\n xhr.send();\n}\n\n/**\n * Create an XHR feature loader for a `url` and `format`. The feature loader\n * loads features (with XHR), parses the features, and adds them to the\n * vector source.\n * @template {import(\"./Feature.js\").FeatureLike} FeatureType\n * @param {string|FeatureUrlFunction} url Feature URL service.\n * @param {import(\"./format/Feature.js\").default} format Feature format.\n * @return {FeatureLoader} The feature loader.\n * @api\n */\nexport function xhr(url, format) {\n /**\n * @param {import(\"./extent.js\").Extent} extent Extent.\n * @param {number} resolution Resolution.\n * @param {import(\"./proj/Projection.js\").default} projection Projection.\n * @param {function(Array): void} [success] Success\n * Function called when loading succeeded.\n * @param {function(): void} [failure] Failure\n * Function called when loading failed.\n */\n return function (extent, resolution, projection, success, failure) {\n const source =\n /** @type {import(\"./source/Vector\").default} */ (this);\n loadFeaturesXhr(\n url,\n format,\n extent,\n resolution,\n projection,\n /**\n * @param {Array} features The loaded features.\n * @param {import(\"./proj/Projection.js\").default} dataProjection Data\n * projection.\n */\n function (features, dataProjection) {\n source.addFeatures(features);\n if (success !== undefined) {\n success(features);\n }\n },\n /* FIXME handle error */ failure ? failure : VOID,\n );\n };\n}\n\n/**\n * Setter for the withCredentials configuration for the XHR.\n *\n * @param {boolean} xhrWithCredentials The value of withCredentials to set.\n * Compare https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/\n * @api\n */\nexport function setWithCredentials(xhrWithCredentials) {\n withCredentials = xhrWithCredentials;\n}\n","/**\n * @module ol/source/Vector\n */\n\nimport Collection from '../Collection.js';\nimport CollectionEventType from '../CollectionEventType.js';\nimport Event from '../events/Event.js';\nimport EventType from '../events/EventType.js';\nimport ObjectEventType from '../ObjectEventType.js';\nimport RBush from '../structs/RBush.js';\nimport RenderFeature from '../render/Feature.js';\nimport Source from './Source.js';\nimport VectorEventType from './VectorEventType.js';\nimport {TRUE, VOID} from '../functions.js';\nimport {all as allStrategy} from '../loadingstrategy.js';\nimport {assert} from '../asserts.js';\nimport {containsExtent, equals, wrapAndSliceX} from '../extent.js';\nimport {extend} from '../array.js';\nimport {getUid} from '../util.js';\nimport {isEmpty} from '../obj.js';\nimport {listen, unlistenByKey} from '../events.js';\nimport {xhr} from '../featureloader.js';\n\n/**\n * A function that takes an {@link module:ol/extent~Extent} and a resolution as arguments, and\n * returns an array of {@link module:ol/extent~Extent} with the extents to load. Usually this\n * is one of the standard {@link module:ol/loadingstrategy} strategies.\n *\n * @typedef {function(import(\"../extent.js\").Extent, number, import(\"../proj/Projection.js\").default): Array} LoadingStrategy\n * @api\n */\n\n/**\n * @classdesc\n * Events emitted by {@link module:ol/source/Vector~VectorSource} instances are instances of this\n * type.\n * @template {import(\"../Feature.js\").FeatureLike} [FeatureType=import(\"../Feature.js\").default]\n */\nexport class VectorSourceEvent extends Event {\n /**\n * @param {string} type Type.\n * @param {FeatureType} [feature] Feature.\n * @param {Array} [features] Features.\n */\n constructor(type, feature, features) {\n super(type);\n\n /**\n * The added or removed feature for the `ADDFEATURE` and `REMOVEFEATURE` events, `undefined` otherwise.\n * @type {FeatureType|undefined}\n * @api\n */\n this.feature = feature;\n\n /**\n * The loaded features for the `FEATURESLOADED` event, `undefined` otherwise.\n * @type {Array|undefined}\n * @api\n */\n this.features = features;\n }\n}\n\n/***\n * @template {import(\"../Feature.js\").FeatureLike} [T=import(\"../Feature.js\").default]\n * @typedef {T extends RenderFeature ? T|Array : T} FeatureClassOrArrayOfRenderFeatures\n */\n\n/***\n * @template Return\n * @template {import(\"../Feature.js\").FeatureLike} [FeatureType=import(\"../Feature.js\").default]\n * @typedef {import(\"../Observable\").OnSignature &\n * import(\"../Observable\").OnSignature &\n * import(\"../Observable\").OnSignature, Return> &\n * import(\"../Observable\").CombinedOnSignature} VectorSourceOnSignature\n */\n\n/**\n * @template {import(\"../Feature.js\").FeatureLike} [FeatureType=import(\"../Feature.js\").default]\n * @typedef {Object} Options\n * @property {import(\"./Source.js\").AttributionLike} [attributions] Attributions.\n * @property {Array|Collection} [features]\n * Features. If provided as {@link module:ol/Collection~Collection}, the features in the source\n * and the collection will stay in sync.\n * @property {import(\"../format/Feature.js\").default} [format] The feature format used by the XHR\n * feature loader when `url` is set. Required if `url` is set, otherwise ignored.\n * @property {import(\"../featureloader.js\").FeatureLoader} [loader]\n * The loader function used to load features, from a remote source for example.\n * If this is not set and `url` is set, the source will create and use an XHR\n * feature loader. The `'featuresloadend'` and `'featuresloaderror'` events\n * will only fire if the `success` and `failure` callbacks are used.\n *\n * Example:\n *\n * ```js\n * import Vector from 'ol/source/Vector.js';\n * import GeoJSON from 'ol/format/GeoJSON.js';\n * import {bbox} from 'ol/loadingstrategy.js';\n *\n * const vectorSource = new Vector({\n * format: new GeoJSON(),\n * loader: function(extent, resolution, projection, success, failure) {\n * const proj = projection.getCode();\n * const url = 'https://ahocevar.com/geoserver/wfs?service=WFS&' +\n * 'version=1.1.0&request=GetFeature&typename=osm:water_areas&' +\n * 'outputFormat=application/json&srsname=' + proj + '&' +\n * 'bbox=' + extent.join(',') + ',' + proj;\n * const xhr = new XMLHttpRequest();\n * xhr.open('GET', url);\n * const onError = function() {\n * vectorSource.removeLoadedExtent(extent);\n * failure();\n * }\n * xhr.onerror = onError;\n * xhr.onload = function() {\n * if (xhr.status == 200) {\n * const features = vectorSource.getFormat().readFeatures(xhr.responseText);\n * vectorSource.addFeatures(features);\n * success(features);\n * } else {\n * onError();\n * }\n * }\n * xhr.send();\n * },\n * strategy: bbox,\n * });\n * ```\n * @property {boolean} [overlaps=true] This source may have overlapping geometries.\n * Setting this to `false` (e.g. for sources with polygons that represent administrative\n * boundaries or TopoJSON sources) allows the renderer to optimise fill and\n * stroke operations.\n * @property {LoadingStrategy} [strategy] The loading strategy to use.\n * By default an {@link module:ol/loadingstrategy.all}\n * strategy is used, a one-off strategy which loads all features at once.\n * @property {string|import(\"../featureloader.js\").FeatureUrlFunction} [url]\n * Setting this option instructs the source to load features using an XHR loader\n * (see {@link module:ol/featureloader.xhr}). Use a `string` and an\n * {@link module:ol/loadingstrategy.all} for a one-off download of all features from\n * the given URL. Use a {@link module:ol/featureloader~FeatureUrlFunction} to generate the url with\n * other loading strategies.\n * Requires `format` to be set as well.\n * When default XHR feature loader is provided, the features will\n * be transformed from the data projection to the view projection\n * during parsing. If your remote data source does not advertise its projection\n * properly, this transformation will be incorrect. For some formats, the\n * default projection (usually EPSG:4326) can be overridden by setting the\n * dataProjection constructor option on the format.\n * Note that if a source contains non-feature data, such as a GeoJSON geometry\n * or a KML NetworkLink, these will be ignored. Use a custom loader to load these.\n * @property {boolean} [useSpatialIndex=true]\n * By default, an RTree is used as spatial index. When features are removed and\n * added frequently, and the total number of features is low, setting this to\n * `false` may improve performance.\n *\n * Note that\n * {@link module:ol/source/Vector~VectorSource#getFeaturesInExtent},\n * {@link module:ol/source/Vector~VectorSource#getClosestFeatureToCoordinate} and\n * {@link module:ol/source/Vector~VectorSource#getExtent} cannot be used when `useSpatialIndex` is\n * set to `false`, and {@link module:ol/source/Vector~VectorSource#forEachFeatureInExtent} will loop\n * through all features.\n *\n * When set to `false`, the features will be maintained in an\n * {@link module:ol/Collection~Collection}, which can be retrieved through\n * {@link module:ol/source/Vector~VectorSource#getFeaturesCollection}.\n * @property {boolean} [wrapX=true] Wrap the world horizontally. For vector editing across the\n * -180° and 180° meridians to work properly, this should be set to `false`. The\n * resulting geometry coordinates will then exceed the world bounds.\n */\n\n/**\n * @classdesc\n * Provides a source of features for vector layers. Vector features provided\n * by this source are suitable for editing. See {@link module:ol/source/VectorTile~VectorTile} for\n * vector data that is optimized for rendering.\n *\n * @fires VectorSourceEvent\n * @api\n * @template {import(\"../Feature.js\").FeatureLike} [FeatureType=import(\"../Feature.js\").default]\n */\nclass VectorSource extends Source {\n /**\n * @param {Options} [options] Vector source options.\n */\n constructor(options) {\n options = options || {};\n\n super({\n attributions: options.attributions,\n interpolate: true,\n projection: undefined,\n state: 'ready',\n wrapX: options.wrapX !== undefined ? options.wrapX : true,\n });\n\n /***\n * @type {VectorSourceOnSignature}\n */\n this.on;\n\n /***\n * @type {VectorSourceOnSignature}\n */\n this.once;\n\n /***\n * @type {VectorSourceOnSignature}\n */\n this.un;\n\n /**\n * @private\n * @type {import(\"../featureloader.js\").FeatureLoader}\n */\n this.loader_ = VOID;\n\n /**\n * @private\n * @type {import(\"../format/Feature.js\").default|null}\n */\n this.format_ = options.format || null;\n\n /**\n * @private\n * @type {boolean}\n */\n this.overlaps_ = options.overlaps === undefined ? true : options.overlaps;\n\n /**\n * @private\n * @type {string|import(\"../featureloader.js\").FeatureUrlFunction|undefined}\n */\n this.url_ = options.url;\n\n if (options.loader !== undefined) {\n this.loader_ = options.loader;\n } else if (this.url_ !== undefined) {\n assert(this.format_, '`format` must be set when `url` is set');\n // create a XHR feature loader for \"url\" and \"format\"\n this.loader_ = xhr(this.url_, this.format_);\n }\n\n /**\n * @private\n * @type {LoadingStrategy}\n */\n this.strategy_ =\n options.strategy !== undefined ? options.strategy : allStrategy;\n\n const useSpatialIndex =\n options.useSpatialIndex !== undefined ? options.useSpatialIndex : true;\n\n /**\n * @private\n * @type {RBush}\n */\n this.featuresRtree_ = useSpatialIndex ? new RBush() : null;\n\n /**\n * @private\n * @type {RBush<{extent: import(\"../extent.js\").Extent}>}\n */\n this.loadedExtentsRtree_ = new RBush();\n\n /**\n * @type {number}\n * @private\n */\n this.loadingExtentsCount_ = 0;\n\n /**\n * @private\n * @type {!Object}\n */\n this.nullGeometryFeatures_ = {};\n\n /**\n * A lookup of features by id (the return from feature.getId()).\n * @private\n * @type {!Object>}\n */\n this.idIndex_ = {};\n\n /**\n * A lookup of features by uid (using getUid(feature)).\n * @private\n * @type {!Object}\n */\n this.uidIndex_ = {};\n\n /**\n * @private\n * @type {Object>}\n */\n this.featureChangeKeys_ = {};\n\n /**\n * @private\n * @type {Collection|null}\n */\n this.featuresCollection_ = null;\n\n /** @type {Collection} */\n let collection;\n /** @type {Array} */\n let features;\n if (Array.isArray(options.features)) {\n features = options.features;\n } else if (options.features) {\n collection = options.features;\n features = collection.getArray();\n }\n if (!useSpatialIndex && collection === undefined) {\n collection = new Collection(features);\n }\n if (features !== undefined) {\n this.addFeaturesInternal(features);\n }\n if (collection !== undefined) {\n this.bindFeaturesCollection_(collection);\n }\n }\n\n /**\n * Add a single feature to the source. If you want to add a batch of features\n * at once, call {@link module:ol/source/Vector~VectorSource#addFeatures #addFeatures()}\n * instead. A feature will not be added to the source if feature with\n * the same id is already there. The reason for this behavior is to avoid\n * feature duplication when using bbox or tile loading strategies.\n * Note: this also applies if a {@link module:ol/Collection~Collection} is used for features,\n * meaning that if a feature with a duplicate id is added in the collection, it will\n * be removed from it right away.\n * @param {FeatureType} feature Feature to add.\n * @api\n */\n addFeature(feature) {\n this.addFeatureInternal(feature);\n this.changed();\n }\n\n /**\n * Add a feature without firing a `change` event.\n * @param {FeatureType} feature Feature.\n * @protected\n */\n addFeatureInternal(feature) {\n const featureKey = getUid(feature);\n\n if (!this.addToIndex_(featureKey, feature)) {\n if (this.featuresCollection_) {\n this.featuresCollection_.remove(feature);\n }\n return;\n }\n\n this.setupChangeEvents_(featureKey, feature);\n\n const geometry = feature.getGeometry();\n if (geometry) {\n const extent = geometry.getExtent();\n if (this.featuresRtree_) {\n this.featuresRtree_.insert(extent, feature);\n }\n } else {\n this.nullGeometryFeatures_[featureKey] = feature;\n }\n\n this.dispatchEvent(\n new VectorSourceEvent(VectorEventType.ADDFEATURE, feature),\n );\n }\n\n /**\n * @param {string} featureKey Unique identifier for the feature.\n * @param {FeatureType} feature The feature.\n * @private\n */\n setupChangeEvents_(featureKey, feature) {\n if (feature instanceof RenderFeature) {\n return;\n }\n this.featureChangeKeys_[featureKey] = [\n listen(feature, EventType.CHANGE, this.handleFeatureChange_, this),\n listen(\n feature,\n ObjectEventType.PROPERTYCHANGE,\n this.handleFeatureChange_,\n this,\n ),\n ];\n }\n\n /**\n * @param {string} featureKey Unique identifier for the feature.\n * @param {FeatureType} feature The feature.\n * @return {boolean} The feature is \"valid\", in the sense that it is also a\n * candidate for insertion into the Rtree.\n * @private\n */\n addToIndex_(featureKey, feature) {\n let valid = true;\n if (feature.getId() !== undefined) {\n const id = String(feature.getId());\n if (!(id in this.idIndex_)) {\n this.idIndex_[id] = feature;\n } else if (feature instanceof RenderFeature) {\n const indexedFeature = this.idIndex_[id];\n if (!(indexedFeature instanceof RenderFeature)) {\n valid = false;\n } else {\n if (!Array.isArray(indexedFeature)) {\n this.idIndex_[id] = [indexedFeature, feature];\n } else {\n indexedFeature.push(feature);\n }\n }\n } else {\n valid = false;\n }\n }\n if (valid) {\n assert(\n !(featureKey in this.uidIndex_),\n 'The passed `feature` was already added to the source',\n );\n this.uidIndex_[featureKey] = feature;\n }\n return valid;\n }\n\n /**\n * Add a batch of features to the source.\n * @param {Array} features Features to add.\n * @api\n */\n addFeatures(features) {\n this.addFeaturesInternal(features);\n this.changed();\n }\n\n /**\n * Add features without firing a `change` event.\n * @param {Array} features Features.\n * @protected\n */\n addFeaturesInternal(features) {\n const extents = [];\n /** @type {Array} */\n const newFeatures = [];\n /** @type {Array} */\n const geometryFeatures = [];\n\n for (let i = 0, length = features.length; i < length; i++) {\n const feature = features[i];\n const featureKey = getUid(feature);\n if (this.addToIndex_(featureKey, feature)) {\n newFeatures.push(feature);\n }\n }\n\n for (let i = 0, length = newFeatures.length; i < length; i++) {\n const feature = newFeatures[i];\n const featureKey = getUid(feature);\n this.setupChangeEvents_(featureKey, feature);\n\n const geometry = feature.getGeometry();\n if (geometry) {\n const extent = geometry.getExtent();\n extents.push(extent);\n geometryFeatures.push(feature);\n } else {\n this.nullGeometryFeatures_[featureKey] = feature;\n }\n }\n if (this.featuresRtree_) {\n this.featuresRtree_.load(extents, geometryFeatures);\n }\n\n if (this.hasListener(VectorEventType.ADDFEATURE)) {\n for (let i = 0, length = newFeatures.length; i < length; i++) {\n this.dispatchEvent(\n new VectorSourceEvent(VectorEventType.ADDFEATURE, newFeatures[i]),\n );\n }\n }\n }\n\n /**\n * @param {!Collection} collection Collection.\n * @private\n */\n bindFeaturesCollection_(collection) {\n let modifyingCollection = false;\n this.addEventListener(\n VectorEventType.ADDFEATURE,\n /**\n * @param {VectorSourceEvent} evt The vector source event\n */\n function (evt) {\n if (!modifyingCollection) {\n modifyingCollection = true;\n collection.push(evt.feature);\n modifyingCollection = false;\n }\n },\n );\n this.addEventListener(\n VectorEventType.REMOVEFEATURE,\n /**\n * @param {VectorSourceEvent} evt The vector source event\n */\n function (evt) {\n if (!modifyingCollection) {\n modifyingCollection = true;\n collection.remove(evt.feature);\n modifyingCollection = false;\n }\n },\n );\n collection.addEventListener(\n CollectionEventType.ADD,\n /**\n * @param {import(\"../Collection.js\").CollectionEvent} evt The collection event\n */\n (evt) => {\n if (!modifyingCollection) {\n modifyingCollection = true;\n this.addFeature(evt.element);\n modifyingCollection = false;\n }\n },\n );\n collection.addEventListener(\n CollectionEventType.REMOVE,\n /**\n * @param {import(\"../Collection.js\").CollectionEvent} evt The collection event\n */\n (evt) => {\n if (!modifyingCollection) {\n modifyingCollection = true;\n this.removeFeature(evt.element);\n modifyingCollection = false;\n }\n },\n );\n this.featuresCollection_ = collection;\n }\n\n /**\n * Remove all features from the source.\n * @param {boolean} [fast] Skip dispatching of {@link module:ol/source/Vector.VectorSourceEvent#event:removefeature} events.\n * @api\n */\n clear(fast) {\n if (fast) {\n for (const featureId in this.featureChangeKeys_) {\n const keys = this.featureChangeKeys_[featureId];\n keys.forEach(unlistenByKey);\n }\n if (!this.featuresCollection_) {\n this.featureChangeKeys_ = {};\n this.idIndex_ = {};\n this.uidIndex_ = {};\n }\n } else {\n if (this.featuresRtree_) {\n const removeAndIgnoreReturn = (feature) => {\n this.removeFeatureInternal(feature);\n };\n this.featuresRtree_.forEach(removeAndIgnoreReturn);\n for (const id in this.nullGeometryFeatures_) {\n this.removeFeatureInternal(this.nullGeometryFeatures_[id]);\n }\n }\n }\n if (this.featuresCollection_) {\n this.featuresCollection_.clear();\n }\n\n if (this.featuresRtree_) {\n this.featuresRtree_.clear();\n }\n this.nullGeometryFeatures_ = {};\n\n const clearEvent = new VectorSourceEvent(VectorEventType.CLEAR);\n this.dispatchEvent(clearEvent);\n this.changed();\n }\n\n /**\n * Iterate through all features on the source, calling the provided callback\n * with each one. If the callback returns any \"truthy\" value, iteration will\n * stop and the function will return the same value.\n * Note: this function only iterate through the feature that have a defined geometry.\n *\n * @param {function(FeatureType): T} callback Called with each feature\n * on the source. Return a truthy value to stop iteration.\n * @return {T|undefined} The return value from the last call to the callback.\n * @template T\n * @api\n */\n forEachFeature(callback) {\n if (this.featuresRtree_) {\n return this.featuresRtree_.forEach(callback);\n }\n if (this.featuresCollection_) {\n this.featuresCollection_.forEach(callback);\n }\n }\n\n /**\n * Iterate through all features whose geometries contain the provided\n * coordinate, calling the callback with each feature. If the callback returns\n * a \"truthy\" value, iteration will stop and the function will return the same\n * value.\n *\n * For {@link module:ol/render/Feature~RenderFeature} features, the callback will be\n * called for all features.\n *\n * @param {import(\"../coordinate.js\").Coordinate} coordinate Coordinate.\n * @param {function(FeatureType): T} callback Called with each feature\n * whose goemetry contains the provided coordinate.\n * @return {T|undefined} The return value from the last call to the callback.\n * @template T\n */\n forEachFeatureAtCoordinateDirect(coordinate, callback) {\n const extent = [coordinate[0], coordinate[1], coordinate[0], coordinate[1]];\n return this.forEachFeatureInExtent(extent, function (feature) {\n const geometry = feature.getGeometry();\n if (\n geometry instanceof RenderFeature ||\n geometry.intersectsCoordinate(coordinate)\n ) {\n return callback(feature);\n }\n return undefined;\n });\n }\n\n /**\n * Iterate through all features whose bounding box intersects the provided\n * extent (note that the feature's geometry may not intersect the extent),\n * calling the callback with each feature. If the callback returns a \"truthy\"\n * value, iteration will stop and the function will return the same value.\n *\n * If you are interested in features whose geometry intersects an extent, call\n * the {@link module:ol/source/Vector~VectorSource#forEachFeatureIntersectingExtent #forEachFeatureIntersectingExtent()} method instead.\n *\n * When `useSpatialIndex` is set to false, this method will loop through all\n * features, equivalent to {@link module:ol/source/Vector~VectorSource#forEachFeature #forEachFeature()}.\n *\n * @param {import(\"../extent.js\").Extent} extent Extent.\n * @param {function(FeatureType): T} callback Called with each feature\n * whose bounding box intersects the provided extent.\n * @return {T|undefined} The return value from the last call to the callback.\n * @template T\n * @api\n */\n forEachFeatureInExtent(extent, callback) {\n if (this.featuresRtree_) {\n return this.featuresRtree_.forEachInExtent(extent, callback);\n }\n if (this.featuresCollection_) {\n this.featuresCollection_.forEach(callback);\n }\n }\n\n /**\n * Iterate through all features whose geometry intersects the provided extent,\n * calling the callback with each feature. If the callback returns a \"truthy\"\n * value, iteration will stop and the function will return the same value.\n *\n * If you only want to test for bounding box intersection, call the\n * {@link module:ol/source/Vector~VectorSource#forEachFeatureInExtent #forEachFeatureInExtent()} method instead.\n *\n * @param {import(\"../extent.js\").Extent} extent Extent.\n * @param {function(FeatureType): T} callback Called with each feature\n * whose geometry intersects the provided extent.\n * @return {T|undefined} The return value from the last call to the callback.\n * @template T\n * @api\n */\n forEachFeatureIntersectingExtent(extent, callback) {\n return this.forEachFeatureInExtent(\n extent,\n /**\n * @param {FeatureType} feature Feature.\n * @return {T|undefined} The return value from the last call to the callback.\n */\n function (feature) {\n const geometry = feature.getGeometry();\n if (\n geometry instanceof RenderFeature ||\n geometry.intersectsExtent(extent)\n ) {\n const result = callback(feature);\n if (result) {\n return result;\n }\n }\n },\n );\n }\n\n /**\n * Get the features collection associated with this source. Will be `null`\n * unless the source was configured with `useSpatialIndex` set to `false`, or\n * with a {@link module:ol/Collection~Collection} as `features`.\n * @return {Collection|null} The collection of features.\n * @api\n */\n getFeaturesCollection() {\n return this.featuresCollection_;\n }\n\n /**\n * Get a snapshot of the features currently on the source in random order. The returned array\n * is a copy, the features are references to the features in the source.\n * @return {Array} Features.\n * @api\n */\n getFeatures() {\n let features;\n if (this.featuresCollection_) {\n features = this.featuresCollection_.getArray().slice(0);\n } else if (this.featuresRtree_) {\n features = this.featuresRtree_.getAll();\n if (!isEmpty(this.nullGeometryFeatures_)) {\n extend(features, Object.values(this.nullGeometryFeatures_));\n }\n }\n return features;\n }\n\n /**\n * Get all features whose geometry intersects the provided coordinate.\n * @param {import(\"../coordinate.js\").Coordinate} coordinate Coordinate.\n * @return {Array} Features.\n * @api\n */\n getFeaturesAtCoordinate(coordinate) {\n const features = [];\n this.forEachFeatureAtCoordinateDirect(coordinate, function (feature) {\n features.push(feature);\n });\n return features;\n }\n\n /**\n * Get all features whose bounding box intersects the provided extent. Note that this returns an array of\n * all features intersecting the given extent in random order (so it may include\n * features whose geometries do not intersect the extent).\n *\n * When `useSpatialIndex` is set to false, this method will return all\n * features.\n *\n * @param {import(\"../extent.js\").Extent} extent Extent.\n * @param {import(\"../proj/Projection.js\").default} [projection] Include features\n * where `extent` exceeds the x-axis bounds of `projection` and wraps around the world.\n * @return {Array} Features.\n * @api\n */\n getFeaturesInExtent(extent, projection) {\n if (this.featuresRtree_) {\n const multiWorld = projection && projection.canWrapX() && this.getWrapX();\n\n if (!multiWorld) {\n return this.featuresRtree_.getInExtent(extent);\n }\n\n const extents = wrapAndSliceX(extent, projection);\n\n return [].concat(\n ...extents.map((anExtent) => this.featuresRtree_.getInExtent(anExtent)),\n );\n }\n if (this.featuresCollection_) {\n return this.featuresCollection_.getArray().slice(0);\n }\n return [];\n }\n\n /**\n * Get the closest feature to the provided coordinate.\n *\n * This method is not available when the source is configured with\n * `useSpatialIndex` set to `false` and the features in this source are of type\n * {@link module:ol/Feature~Feature}.\n * @param {import(\"../coordinate.js\").Coordinate} coordinate Coordinate.\n * @param {function(FeatureType):boolean} [filter] Feature filter function.\n * The filter function will receive one argument, the {@link module:ol/Feature~Feature feature}\n * and it should return a boolean value. By default, no filtering is made.\n * @return {FeatureType} Closest feature.\n * @api\n */\n getClosestFeatureToCoordinate(coordinate, filter) {\n // Find the closest feature using branch and bound. We start searching an\n // infinite extent, and find the distance from the first feature found. This\n // becomes the closest feature. We then compute a smaller extent which any\n // closer feature must intersect. We continue searching with this smaller\n // extent, trying to find a closer feature. Every time we find a closer\n // feature, we update the extent being searched so that any even closer\n // feature must intersect it. We continue until we run out of features.\n const x = coordinate[0];\n const y = coordinate[1];\n let closestFeature = null;\n const closestPoint = [NaN, NaN];\n let minSquaredDistance = Infinity;\n const extent = [-Infinity, -Infinity, Infinity, Infinity];\n filter = filter ? filter : TRUE;\n this.featuresRtree_.forEachInExtent(\n extent,\n /**\n * @param {FeatureType} feature Feature.\n */\n function (feature) {\n if (filter(feature)) {\n const geometry = feature.getGeometry();\n const previousMinSquaredDistance = minSquaredDistance;\n minSquaredDistance =\n geometry instanceof RenderFeature\n ? 0\n : geometry.closestPointXY(x, y, closestPoint, minSquaredDistance);\n if (minSquaredDistance < previousMinSquaredDistance) {\n closestFeature = feature;\n // This is sneaky. Reduce the extent that it is currently being\n // searched while the R-Tree traversal using this same extent object\n // is still in progress. This is safe because the new extent is\n // strictly contained by the old extent.\n const minDistance = Math.sqrt(minSquaredDistance);\n extent[0] = x - minDistance;\n extent[1] = y - minDistance;\n extent[2] = x + minDistance;\n extent[3] = y + minDistance;\n }\n }\n },\n );\n return closestFeature;\n }\n\n /**\n * Get the extent of the features currently in the source.\n *\n * This method is not available when the source is configured with\n * `useSpatialIndex` set to `false`.\n * @param {import(\"../extent.js\").Extent} [extent] Destination extent. If provided, no new extent\n * will be created. Instead, that extent's coordinates will be overwritten.\n * @return {import(\"../extent.js\").Extent} Extent.\n * @api\n */\n getExtent(extent) {\n return this.featuresRtree_.getExtent(extent);\n }\n\n /**\n * Get a feature by its identifier (the value returned by feature.getId()). When `RenderFeature`s\n * are used, `getFeatureById()` can return an array of `RenderFeature`s. This allows for handling\n * of `GeometryCollection` geometries, where format readers create one `RenderFeature` per\n * `GeometryCollection` member.\n * Note that the index treats string and numeric identifiers as the same. So\n * `source.getFeatureById(2)` will return a feature with id `'2'` or `2`.\n *\n * @param {string|number} id Feature identifier.\n * @return {FeatureClassOrArrayOfRenderFeatures|null} The feature (or `null` if not found).\n * @api\n */\n getFeatureById(id) {\n const feature = this.idIndex_[id.toString()];\n return feature !== undefined\n ? /** @type {FeatureClassOrArrayOfRenderFeatures} */ (\n feature\n )\n : null;\n }\n\n /**\n * Get a feature by its internal unique identifier (using `getUid`).\n *\n * @param {string} uid Feature identifier.\n * @return {FeatureType|null} The feature (or `null` if not found).\n */\n getFeatureByUid(uid) {\n const feature = this.uidIndex_[uid];\n return feature !== undefined ? feature : null;\n }\n\n /**\n * Get the format associated with this source.\n *\n * @return {import(\"../format/Feature.js\").default|null}} The feature format.\n * @api\n */\n getFormat() {\n return this.format_;\n }\n\n /**\n * @return {boolean} The source can have overlapping geometries.\n */\n getOverlaps() {\n return this.overlaps_;\n }\n\n /**\n * Get the url associated with this source.\n *\n * @return {string|import(\"../featureloader.js\").FeatureUrlFunction|undefined} The url.\n * @api\n */\n getUrl() {\n return this.url_;\n }\n\n /**\n * @param {Event} event Event.\n * @private\n */\n handleFeatureChange_(event) {\n const feature = /** @type {FeatureType} */ (event.target);\n const featureKey = getUid(feature);\n const geometry = feature.getGeometry();\n if (!geometry) {\n if (!(featureKey in this.nullGeometryFeatures_)) {\n if (this.featuresRtree_) {\n this.featuresRtree_.remove(feature);\n }\n this.nullGeometryFeatures_[featureKey] = feature;\n }\n } else {\n const extent = geometry.getExtent();\n if (featureKey in this.nullGeometryFeatures_) {\n delete this.nullGeometryFeatures_[featureKey];\n if (this.featuresRtree_) {\n this.featuresRtree_.insert(extent, feature);\n }\n } else {\n if (this.featuresRtree_) {\n this.featuresRtree_.update(extent, feature);\n }\n }\n }\n const id = feature.getId();\n if (id !== undefined) {\n const sid = id.toString();\n if (this.idIndex_[sid] !== feature) {\n this.removeFromIdIndex_(feature);\n this.idIndex_[sid] = feature;\n }\n } else {\n this.removeFromIdIndex_(feature);\n this.uidIndex_[featureKey] = feature;\n }\n this.changed();\n this.dispatchEvent(\n new VectorSourceEvent(VectorEventType.CHANGEFEATURE, feature),\n );\n }\n\n /**\n * Returns true if the feature is contained within the source.\n * @param {FeatureType} feature Feature.\n * @return {boolean} Has feature.\n * @api\n */\n hasFeature(feature) {\n const id = feature.getId();\n if (id !== undefined) {\n return id in this.idIndex_;\n }\n return getUid(feature) in this.uidIndex_;\n }\n\n /**\n * @return {boolean} Is empty.\n */\n isEmpty() {\n if (this.featuresRtree_) {\n return (\n this.featuresRtree_.isEmpty() && isEmpty(this.nullGeometryFeatures_)\n );\n }\n if (this.featuresCollection_) {\n return this.featuresCollection_.getLength() === 0;\n }\n return true;\n }\n\n /**\n * @param {import(\"../extent.js\").Extent} extent Extent.\n * @param {number} resolution Resolution.\n * @param {import(\"../proj/Projection.js\").default} projection Projection.\n */\n loadFeatures(extent, resolution, projection) {\n const loadedExtentsRtree = this.loadedExtentsRtree_;\n const extentsToLoad = this.strategy_(extent, resolution, projection);\n for (let i = 0, ii = extentsToLoad.length; i < ii; ++i) {\n const extentToLoad = extentsToLoad[i];\n const alreadyLoaded = loadedExtentsRtree.forEachInExtent(\n extentToLoad,\n /**\n * @param {{extent: import(\"../extent.js\").Extent}} object Object.\n * @return {boolean} Contains.\n */\n function (object) {\n return containsExtent(object.extent, extentToLoad);\n },\n );\n if (!alreadyLoaded) {\n ++this.loadingExtentsCount_;\n this.dispatchEvent(\n new VectorSourceEvent(VectorEventType.FEATURESLOADSTART),\n );\n this.loader_.call(\n this,\n extentToLoad,\n resolution,\n projection,\n (features) => {\n --this.loadingExtentsCount_;\n this.dispatchEvent(\n new VectorSourceEvent(\n VectorEventType.FEATURESLOADEND,\n undefined,\n features,\n ),\n );\n },\n () => {\n --this.loadingExtentsCount_;\n this.dispatchEvent(\n new VectorSourceEvent(VectorEventType.FEATURESLOADERROR),\n );\n },\n );\n loadedExtentsRtree.insert(extentToLoad, {extent: extentToLoad.slice()});\n }\n }\n this.loading =\n this.loader_.length < 4 ? false : this.loadingExtentsCount_ > 0;\n }\n\n /**\n * @override\n */\n refresh() {\n this.clear(true);\n this.loadedExtentsRtree_.clear();\n super.refresh();\n }\n\n /**\n * Remove an extent from the list of loaded extents.\n * @param {import(\"../extent.js\").Extent} extent Extent.\n * @api\n */\n removeLoadedExtent(extent) {\n const loadedExtentsRtree = this.loadedExtentsRtree_;\n let obj;\n loadedExtentsRtree.forEachInExtent(extent, function (object) {\n if (equals(object.extent, extent)) {\n obj = object;\n return true;\n }\n });\n if (obj) {\n loadedExtentsRtree.remove(obj);\n }\n }\n\n /**\n * Batch remove features from the source. If you want to remove all features\n * at once, use the {@link module:ol/source/Vector~VectorSource#clear #clear()} method\n * instead.\n * @param {Array} features Features to remove.\n * @api\n */\n removeFeatures(features) {\n let removed = false;\n for (let i = 0, ii = features.length; i < ii; ++i) {\n removed = this.removeFeatureInternal(features[i]) || removed;\n }\n if (removed) {\n this.changed();\n }\n }\n\n /**\n * Remove a single feature from the source. If you want to batch remove\n * features, use the {@link module:ol/source/Vector~VectorSource#removeFeatures #removeFeatures()} method\n * instead.\n * @param {FeatureType} feature Feature to remove.\n * @api\n */\n removeFeature(feature) {\n if (!feature) {\n return;\n }\n const removed = this.removeFeatureInternal(feature);\n if (removed) {\n this.changed();\n }\n }\n\n /**\n * Remove feature without firing a `change` event.\n * @param {FeatureType} feature Feature.\n * @return {boolean} True if the feature was removed, false if it was not found.\n * @protected\n */\n removeFeatureInternal(feature) {\n const featureKey = getUid(feature);\n if (!(featureKey in this.uidIndex_)) {\n return false;\n }\n\n if (featureKey in this.nullGeometryFeatures_) {\n delete this.nullGeometryFeatures_[featureKey];\n } else {\n if (this.featuresRtree_) {\n this.featuresRtree_.remove(feature);\n }\n }\n\n const featureChangeKeys = this.featureChangeKeys_[featureKey];\n featureChangeKeys?.forEach(unlistenByKey);\n delete this.featureChangeKeys_[featureKey];\n\n const id = feature.getId();\n if (id !== undefined) {\n const idString = id.toString();\n const indexedFeature = this.idIndex_[idString];\n if (indexedFeature === feature) {\n delete this.idIndex_[idString];\n } else if (Array.isArray(indexedFeature)) {\n indexedFeature.splice(indexedFeature.indexOf(feature), 1);\n if (indexedFeature.length === 1) {\n this.idIndex_[idString] = indexedFeature[0];\n }\n }\n }\n delete this.uidIndex_[featureKey];\n if (this.hasListener(VectorEventType.REMOVEFEATURE)) {\n this.dispatchEvent(\n new VectorSourceEvent(VectorEventType.REMOVEFEATURE, feature),\n );\n }\n return true;\n }\n\n /**\n * Remove a feature from the id index. Called internally when the feature id\n * may have changed.\n * @param {FeatureType} feature The feature.\n * @private\n */\n removeFromIdIndex_(feature) {\n for (const id in this.idIndex_) {\n if (this.idIndex_[id] === feature) {\n delete this.idIndex_[id];\n break;\n }\n }\n }\n\n /**\n * Set the new loader of the source. The next render cycle will use the\n * new loader.\n * @param {import(\"../featureloader.js\").FeatureLoader} loader The loader to set.\n * @api\n */\n setLoader(loader) {\n this.loader_ = loader;\n }\n\n /**\n * Points the source to a new url. The next render cycle will use the new url.\n * @param {string|import(\"../featureloader.js\").FeatureUrlFunction} url Url.\n * @api\n */\n setUrl(url) {\n assert(this.format_, '`format` must be set when `url` is set');\n this.url_ = url;\n this.setLoader(xhr(url, this.format_));\n }\n}\n\nexport default VectorSource;\n","/**\n * @module ol/source/VectorEventType\n */\n\n/**\n * @enum {string}\n */\nexport default {\n /**\n * Triggered when a feature is added to the source.\n * @event module:ol/source/Vector.VectorSourceEvent#addfeature\n * @api\n */\n ADDFEATURE: 'addfeature',\n\n /**\n * Triggered when a feature is updated.\n * @event module:ol/source/Vector.VectorSourceEvent#changefeature\n * @api\n */\n CHANGEFEATURE: 'changefeature',\n\n /**\n * Triggered when the clear method is called on the source.\n * @event module:ol/source/Vector.VectorSourceEvent#clear\n * @api\n */\n CLEAR: 'clear',\n\n /**\n * Triggered when a feature is removed from the source.\n * See {@link module:ol/source/Vector~VectorSource#clear source.clear()} for exceptions.\n * @event module:ol/source/Vector.VectorSourceEvent#removefeature\n * @api\n */\n REMOVEFEATURE: 'removefeature',\n\n /**\n * Triggered when features starts loading.\n * @event module:ol/source/Vector.VectorSourceEvent#featuresloadstart\n * @api\n */\n FEATURESLOADSTART: 'featuresloadstart',\n\n /**\n * Triggered when features finishes loading.\n * @event module:ol/source/Vector.VectorSourceEvent#featuresloadend\n * @api\n */\n FEATURESLOADEND: 'featuresloadend',\n\n /**\n * Triggered if feature loading results in an error.\n * @event module:ol/source/Vector.VectorSourceEvent#featuresloaderror\n * @api\n */\n FEATURESLOADERROR: 'featuresloaderror',\n};\n\n/**\n * @typedef {'addfeature'|'changefeature'|'clear'|'removefeature'|'featuresloadstart'|'featuresloadend'|'featuresloaderror'} VectorSourceEventTypes\n */\n","/**\n * @module ol/structs/RBush\n */\nimport RBush_ from 'rbush';\nimport {createOrUpdate, equals} from '../extent.js';\nimport {getUid} from '../util.js';\nimport {isEmpty} from '../obj.js';\n\n/**\n * @typedef {import(\"rbush\").BBox & {value: T}} Entry\n * @template T\n */\n\n/**\n * @classdesc\n * Wrapper around the RBush by Vladimir Agafonkin.\n * See https://github.com/mourner/rbush.\n *\n * @template {Object} T\n */\nclass RBush {\n /**\n * @param {number} [maxEntries] Max entries.\n */\n constructor(maxEntries) {\n /**\n * @private\n * @type {RBush_>}\n */\n this.rbush_ = new RBush_(maxEntries);\n\n /**\n * A mapping between the objects added to this rbush wrapper\n * and the objects that are actually added to the internal rbush.\n * @private\n * @type {Object>}\n */\n this.items_ = {};\n }\n\n /**\n * Insert a value into the RBush.\n * @param {import(\"../extent.js\").Extent} extent Extent.\n * @param {T} value Value.\n */\n insert(extent, value) {\n /** @type {Entry} */\n const item = {\n minX: extent[0],\n minY: extent[1],\n maxX: extent[2],\n maxY: extent[3],\n value: value,\n };\n\n this.rbush_.insert(item);\n this.items_[getUid(value)] = item;\n }\n\n /**\n * Bulk-insert values into the RBush.\n * @param {Array} extents Extents.\n * @param {Array} values Values.\n */\n load(extents, values) {\n const items = new Array(values.length);\n for (let i = 0, l = values.length; i < l; i++) {\n const extent = extents[i];\n const value = values[i];\n\n /** @type {Entry} */\n const item = {\n minX: extent[0],\n minY: extent[1],\n maxX: extent[2],\n maxY: extent[3],\n value: value,\n };\n items[i] = item;\n this.items_[getUid(value)] = item;\n }\n this.rbush_.load(items);\n }\n\n /**\n * Remove a value from the RBush.\n * @param {T} value Value.\n * @return {boolean} Removed.\n */\n remove(value) {\n const uid = getUid(value);\n\n // get the object in which the value was wrapped when adding to the\n // internal rbush. then use that object to do the removal.\n const item = this.items_[uid];\n delete this.items_[uid];\n return this.rbush_.remove(item) !== null;\n }\n\n /**\n * Update the extent of a value in the RBush.\n * @param {import(\"../extent.js\").Extent} extent Extent.\n * @param {T} value Value.\n */\n update(extent, value) {\n const item = this.items_[getUid(value)];\n const bbox = [item.minX, item.minY, item.maxX, item.maxY];\n if (!equals(bbox, extent)) {\n this.remove(value);\n this.insert(extent, value);\n }\n }\n\n /**\n * Return all values in the RBush.\n * @return {Array} All.\n */\n getAll() {\n const items = this.rbush_.all();\n return items.map(function (item) {\n return item.value;\n });\n }\n\n /**\n * Return all values in the given extent.\n * @param {import(\"../extent.js\").Extent} extent Extent.\n * @return {Array} All in extent.\n */\n getInExtent(extent) {\n /** @type {import(\"rbush\").BBox} */\n const bbox = {\n minX: extent[0],\n minY: extent[1],\n maxX: extent[2],\n maxY: extent[3],\n };\n const items = this.rbush_.search(bbox);\n return items.map(function (item) {\n return item.value;\n });\n }\n\n /**\n * Calls a callback function with each value in the tree.\n * If the callback returns a truthy value, this value is returned without\n * checking the rest of the tree.\n * @param {function(T): *} callback Callback.\n * @return {*} Callback return value.\n */\n forEach(callback) {\n return this.forEach_(this.getAll(), callback);\n }\n\n /**\n * Calls a callback function with each value in the provided extent.\n * @param {import(\"../extent.js\").Extent} extent Extent.\n * @param {function(T): *} callback Callback.\n * @return {*} Callback return value.\n */\n forEachInExtent(extent, callback) {\n return this.forEach_(this.getInExtent(extent), callback);\n }\n\n /**\n * @param {Array} values Values.\n * @param {function(T): *} callback Callback.\n * @private\n * @return {*} Callback return value.\n */\n forEach_(values, callback) {\n let result;\n for (let i = 0, l = values.length; i < l; i++) {\n result = callback(values[i]);\n if (result) {\n return result;\n }\n }\n return result;\n }\n\n /**\n * @return {boolean} Is empty.\n */\n isEmpty() {\n return isEmpty(this.items_);\n }\n\n /**\n * Remove all values from the RBush.\n */\n clear() {\n this.rbush_.clear();\n this.items_ = {};\n }\n\n /**\n * @param {import(\"../extent.js\").Extent} [extent] Extent.\n * @return {import(\"../extent.js\").Extent} Extent.\n */\n getExtent(extent) {\n const data = this.rbush_.toJSON();\n return createOrUpdate(data.minX, data.minY, data.maxX, data.maxY, extent);\n }\n\n /**\n * @param {RBush} rbush R-Tree.\n */\n concat(rbush) {\n this.rbush_.load(rbush.rbush_.all());\n for (const i in rbush.items_) {\n this.items_[i] = rbush.items_[i];\n }\n }\n}\n\nexport default RBush;\n"],"names":["Feature","constructor","geometryOrProperties","super","this","on","once","un","id_","undefined","geometryName_","style_","styleFunction_","geometryChangeKey_","addChangeListener","handleGeometryChanged_","geometry","setGeometry","properties","setProperties","clone","hasProperties","getProperties","setGeometryName","getGeometryName","getGeometry","style","getStyle","setStyle","get","getId","getStyleFunction","handleGeometryChange_","changed","CHANGE","set","obj","styles","Array","isArray","createStyleFunction","setId","id","name","removeChangeListener","linearRingss","flatCoordinates","offset","endss","stride","flatCenters","extent","i","ii","length","ends","push","interpolatePoint","end","fraction","dest","dimension","o","t","n","x1","y1","cumulativeLengths","x2","y2","Math","sqrt","target","index","NaN","lineStringCoordinateAtM","m","extrapolate","coordinate","slice","lo","hi","mid","m0","lineStringsCoordinateAtM","interpolate","lineStringLength","Instruction","BEGIN_GEOMETRY","BEGIN_PATH","CIRCLE","CLOSE_PATH","CUSTOM","DRAW_CHARS","DRAW_IMAGE","END_GEOMETRY","FILL","MOVE_TO_LINE_TO","SET_FILL_STYLE","SET_STROKE_STYLE","STROKE","fillInstruction","strokeInstruction","beginPathInstruction","closePathInstruction","CanvasBuilder","VectorContext","tolerance","maxExtent","resolution","pixelRatio","maxLineWidth","beginGeometryInstruction1_","beginGeometryInstruction2_","bufferedMaxExtent_","instructions","coordinates","tmpCoordinate_","hitDetectionInstructions","state","applyPixelRatio","dashArray","map","dash","appendFlatPointCoordinates","getBufferedMaxExtent","tmpCoord","myEnd","appendFlatLineCoordinates","closed","skipFirst","lastXCoord","lastYCoord","nextCoord","lastRel","nextRel","skipped","Relationship","INTERSECTING","drawCustomCoordinates_","builderEnds","builderEnd","drawCustom","feature","renderer","hitDetectionRenderer","beginGeometry","type","getType","getStride","builderBegin","builderEndss","getOrientedFlatCoordinates","getEndss","myEnds","inflate","getFlatCoordinates","getEnds","endGeometry","finish","reverseHitDetectionInstructions","reverse","instruction","begin","setFillStrokeStyle","fillStyle","strokeStyle","fillStyleColor","getColor","fillPatternScale","strokeStyleColor","strokeStyleLineCap","getLineCap","lineCap","strokeStyleLineDash","getLineDash","lineDash","strokeStyleLineDashOffset","getLineDashOffset","lineDashOffset","strokeStyleLineJoin","getLineJoin","lineJoin","strokeStyleWidth","getWidth","lineWidth","strokeStyleMiterLimit","getMiterLimit","miterLimit","createFill","applyStroke","createStroke","updateFillStyle","currentFillStyle","call","updateStrokeStyle","currentStrokeStyle","currentLineCap","currentLineDash","currentLineDashOffset","currentLineJoin","currentLineWidth","currentMiterLimit","endGeometryInstruction","width","hitDetectionImage_","image_","imagePixelRatio_","anchorX_","anchorY_","height_","opacity_","originX_","originY_","rotateWithView_","rotation_","scale_","width_","declutterMode_","declutterImageWithText_","drawPoint","pointGeometry","myBegin","ceil","drawMultiPoint","multiPointGeometry","filteredFlatCoordinates","setImageStyle","imageStyle","sharedData","anchor","getAnchor","size","getSize","origin","getOrigin","getPixelRatio","getHitDetectionImage","getImage","getOpacity","getRotateWithView","getRotation","getScaleArray","getDeclutterMode","drawFlatCoordinates_","moveToLineToInstruction","drawLineString","lineStringGeometry","drawMultiLineString","multiLineStringGeometry","lastStroke","drawFlatCoordinatess_","fill","stroke","numEnds","drawCircle","circleGeometry","setFillStrokeStyles_","circleInstruction","drawPolygon","polygonGeometry","drawMultiPolygon","multiPolygonGeometry","lineChunk","chunkLength","chunks","cursor","chunkM","currentChunk","segmentLength","x","y","missing","matchingChunk","maxAngle","acos","m12","m23","x12","y12","x23","y23","chunkStart","chunkEnd","start","TEXT_ALIGN","labels_","text_","textOffsetX_","textOffsetY_","textRotateWithView_","textRotation_","textFillState_","fillStates","textStrokeState_","strokeStates","textState_","textStates","textKey_","fillKey_","strokeKey_","drawText","fillState","strokeState","textState","geometryType","placement","geometryWidths","overflow","getFlatMidpoint","getCenter","getFlatMidpoints","getFlatInteriorPoint","interiorPoints","getFlatInteriorPoints","beg","filter","w","keep","saveTextStates_","backgroundFill","backgroundStroke","padding","scale","p0","p1","p2","p3","p","getExtent","repeat","textAlign","flatOffset","oo","c","cc","chunk","chunkBegin","range","drawChars_","strokeKey","textKey","font","justify","textBaseline","fillKey","baseline","offsetY","text","strokeWidth","abs","setTextStyle","textStyle","textFillStyle","getFill","textStrokeStyle","getStroke","getFont","textScale","getOverflow","getMaxAngle","getPlacement","getTextAlign","getRepeat","getJustify","getTextBaseline","getBackgroundFill","getBackgroundStroke","getPadding","textOffsetX","getOffsetX","textOffsetY","getOffsetY","textRotateWithView","textRotation","getText","join","BATCH_CONSTRUCTORS","PolygonBuilder","Builder","ImageBuilder","LineStringBuilder","TextBuilder","tolerance_","maxExtent_","pixelRatio_","resolution_","buildersByZIndex_","builderInstructions","zKey","builders","builderKey","builderInstruction","getBuilder","zIndex","builderType","zIndexKey","toString","replays","replay","Constructor","drawTextOnPath","startM","measureAndCacheTextWidth","cache","rotation","segmentM","advance","beginX","beginY","startOffset","startLength","endM","endX","endY","flat","PI","result","singleSegment","previousAngle","atan2","replace","angle","delta","iStart","charLength","len","chars","substring","tmpExtent","p4","getDeclutterBox","replayImageOrLabelArgs","declutterBox","rtlRegEx","RegExp","String","fromCharCode","horizontalTextAlign","align","test","createTextChunks","acc","line","overlaps","deferredRendering","alignAndScaleFill_","coordinateCache_","renderedTransform_","pixelCoordinates_","viewRotation_","widths_","zIndexContext_","ZIndexContext","getZIndexContext","createLabel","key","split","reduce","height","widths","heights","lineWidths","renderWidth","contextInstructions","h","label","floor","leftRight","strokeInstructions","fillInstructions","previousFont","lineHeight","lineOffset","widthHeightIndex","lineWidthIndex","max","fillStrokeArgs","prototype","apply","replayTextBackground_","context","beginPath","moveTo","lineTo","fill_","setStrokeStyle_","calculateImageOrLabelDimensions_","sheetWidth","sheetHeight","centerX","centerY","anchorX","anchorY","originX","originY","snapToPixel","fillStroke","boxW","boxH","boxX","boxY","transform","min","round","drawImageX","drawImageY","drawImageW","drawImageH","minX","minY","maxX","maxY","value","canvasTransform","replayImageOrLabel_","scaledCanvasSize","imageOrLabel","dimensions","opacity","box","strokePadding","alignAndScale","repeatSize","save","translate","rotate","restore","setLineDash","drawLabelWithPointPlacement_","execute_","featureCallback","hitExtent","declutterTree","zIndexContext","pixelCoordinates","dd","declutterMode","prevX","prevY","roundX","roundY","image","d","pendingFill","pendingStroke","lastFillInstruction","lastStrokeInstruction","coordinateCache","viewRotation","viewRotationFromTransform","batchSize","currentGeometry","dx","dy","r","arc","closePath","fn","coords","rotateWithView","declutterImageWithText","labelWithAnchor","widthIndex","args","imageArgs","imageDeclutterMode","imageDeclutterBox","renderImage","renderText","imageDeclutter","collides","render","insert","measurePixelRatio","pixelRatioScale","cachedWidths","pathLength","textLength","parts","drawChars","part","load","execute","executeHitDetection","canvas","ALL","DECLUTTER","NON_DECLUTTER","includes","circlePixelIndexArrayCache","allInstructions","renderBuffer","overlaps_","renderBuffer_","executorsByZIndex_","hitDetectionContext_","hitDetectionTransform_","renderedContext_","deferredZIndexContexts_","createExecutors_","clip","flatClipCoords","getClipCoords","executors","instructionByZindex","hasExecutors","candidates","forEachFeatureAtCoordinate","hitTolerance","callback","declutteredFeatures","contextSize","newContext","willReadFrequently","clearRect","indexes","radius","maxDistanceSq","distances","j","distanceSq","distance","pixelIndex","getPixelIndexArray","imageData","getImageData","data","idx","zs","Object","keys","Number","executor","sort","isEmpty","targetContext","builderTypes","maxBuilderTypes","jj","getContext","requireClip","pushFunction","getDeferredZIndexContexts","getRenderedContext","renderDeferred","deferredZIndexContexts","forEach","draw","clear","HIT_DETECT_RESOLUTION","CanvasVectorLayerRenderer","vectorLayer","boundHandleStyleImageChange_","handleStyleImageChange_","bind","animatingOrInteracting_","hitDetectionImageData_","clipped_","renderedFeatures_","renderedRevision_","renderedResolution_","renderedExtent_","wrappedRenderedExtent_","renderedRotation_","renderedCenter_","renderedProjection_","renderedPixelRatio_","renderedRenderOrder_","renderedFrameDeclutter_","replayGroup_","replayGroupChanged","clipping","targetContext_","renderWorlds","executorGroup","frameState","declutterable","viewState","center","projection","projectionExtent","vectorSource","getLayer","getSource","declutter","getDeclutter","viewHints","ViewHint","ANIMATING","INTERACTING","multiWorld","getWrapX","canWrapX","worldWidth","endWorld","world","getRenderTransform","setDrawContext_","resetDrawContext_","alpha","globalAlpha","drawImage","renderDeclutter","renderDeferredInternal","renderFrame","layerState","layerStatesArray","layerIndex","prepareContainer","replayGroup","hasListener","PRERENDER","POSTRENDER","preRender","layerExtent","clipUnrotated","postRender","container","getFeatures","pixel","Promise","resolve","layer","transforms","source","startX","offsetX","userProjection","features","styleFunction","squaredTolerance","userExtent","imageSmoothingEnabled","featureCount","indexFactor","featuresByZIndex","featureStyleFunction","color","padStart","originalStyle","getGeometryFunction","setColor","setText","imgSize","getImageSize","imgContext","img","fillRect","setImage","Icon","anchorXUnits","anchorYUnits","getScale","getZIndex","byGeometryType","geometries","getGeometriesArrayRecursive","zIndexKeys","geomAndStyle","k","kk","setTransform","drawGeometry","createHitDetectionImageData","resultFeatures","g","hitDetect","matches","match","splice","lastIndexOf","executorGroups","some","all","item","handleFontsChanged","getVisible","event","renderIfReadyAndVisible","prepareFrame","animating","interacting","updateWhileAnimating","getUpdateWhileAnimating","updateWhileInteracting","getUpdateWhileInteracting","ready","frameStateExtent","vectorLayerRevision","getRevision","vectorLayerRenderBuffer","getRenderBuffer","vectorLayerRenderOrder","getRenderOrder","renderedExtent","loadExtents","gutter","loadExtent","userTransform","loadFeatures","dirty","renderFeature","getFeaturesInExtent","replayGroupInstructions","getOverlaps","builderGroup","loading","VectorLayer","BaseVector","options","createRenderer","tmpTransform","RenderFeature","extent_","type_","flatCoordinates_","flatInteriorPoints_","flatMidpoints_","ends_","properties_","squaredTolerance_","stride_","simplifiedGeometry_","flatCenter","midpoint","getSimplifiedGeometry","simplifyTransformed","getPropertiesInternal","pixelExtent","projectedExtent","getWorldExtent","applyTransform","transformFn","assign","enableSimplifyTransformed","simplifiedFlatCoordinates","simplifiedEnds","drawFeature","drawGeometryCollection","geometryCollectionGeometry","CanvasImmediateRenderer","context_","transform_","transformRotation_","userTransform_","contextFillState_","contextStrokeState_","contextTextState_","fillState_","strokeState_","imageAnchorX_","imageAnchorY_","imageHeight_","imageOpacity_","imageOriginX_","imageOriginY_","imageRotateWithView_","imageRotation_","imageScale_","imageWidth_","textScale_","tmpLocalTransform_","drawImages_","localTransform","drawText_","setContextFillState_","setContextStrokeState_","setContextTextState_","strokeText","fillText","moveToLineTo_","close","drawRings_","getGeometriesArray","flatMidpoint","geometryExtent","flatMidpoints","flatInteriorPoint","flatInteriorPoints","contextFillState","contextStrokeState","contextTextState","imageSize","imagePixelRatio","imageAnchor","imageOrigin","imageScale","textFillStyleColor","textStrokeStyleColor","textStrokeStyleLineCap","textStrokeStyleLineDash","textStrokeStyleLineDashOffset","textStrokeStyleLineJoin","textStrokeStyleWidth","textStrokeStyleMiterLimit","textFont","textText","textTextAlign","textTextBaseline","SIMPLIFY_TOLERANCE","GEOMETRY_RENDERERS","hasText","getImageState","LOADED","imageReplay","textReplay","lineStringReplay","polygonReplay","hasImage","declutterBuilderGroup","geometryRenderer","circleReplay","defaultOrder","feature1","feature2","parseInt","getSquaredTolerance","getTolerance","listener","loadingPromises","imageState","ERROR","IDLE","then","simplifiedGeometry","getRenderer","renderGeometry","renderFeatureInternal","getGeometries","getHitDetectionRenderer","Infinity","withCredentials","xhr","url","format","success","failure","XMLHttpRequest","open","responseType","onload","status","responseText","responseXML","readFeatures","featureProjection","readProjection","onerror","send","loadFeaturesXhr","dataProjection","addFeatures","VectorSourceEvent","Event","VectorSource","Source","attributions","wrapX","loader_","format_","url_","loader","strategy_","strategy","useSpatialIndex","collection","featuresRtree_","RBush","loadedExtentsRtree_","loadingExtentsCount_","nullGeometryFeatures_","idIndex_","uidIndex_","featureChangeKeys_","featuresCollection_","getArray","Collection","addFeaturesInternal","bindFeaturesCollection_","addFeature","addFeatureInternal","featureKey","addToIndex_","remove","setupChangeEvents_","dispatchEvent","VectorEventType","ADDFEATURE","EventType","handleFeatureChange_","ObjectEventType","PROPERTYCHANGE","valid","indexedFeature","extents","newFeatures","geometryFeatures","modifyingCollection","addEventListener","evt","REMOVEFEATURE","CollectionEventType","ADD","element","REMOVE","removeFeature","fast","featureId","removeAndIgnoreReturn","removeFeatureInternal","clearEvent","CLEAR","forEachFeature","forEachFeatureAtCoordinateDirect","forEachFeatureInExtent","intersectsCoordinate","forEachInExtent","forEachFeatureIntersectingExtent","intersectsExtent","getFeaturesCollection","getAll","values","getFeaturesAtCoordinate","getInExtent","concat","anExtent","getClosestFeatureToCoordinate","closestFeature","closestPoint","minSquaredDistance","previousMinSquaredDistance","closestPointXY","minDistance","getFeatureById","getFeatureByUid","uid","getFormat","getUrl","update","sid","removeFromIdIndex_","CHANGEFEATURE","hasFeature","getLength","loadedExtentsRtree","extentsToLoad","extentToLoad","object","FEATURESLOADSTART","FEATURESLOADEND","FEATURESLOADERROR","refresh","removeLoadedExtent","removeFeatures","removed","featureChangeKeys","idString","indexOf","setLoader","setUrl","maxEntries","rbush_","items_","items","l","bbox","search","forEach_","toJSON","rbush"],"sourceRoot":""}