Submit
Path:
~
/
/
usr
/
share
/
grafana
/
public
/
build
/
File Content:
9320.c403e78b78aa6df1d0bd.js.map
{"version":3,"file":"9320.c403e78b78aa6df1d0bd.js","mappings":"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","sources":["webpack://grafana/./node_modules/css-loader/dist/runtime/getUrl.js","webpack://grafana/./node_modules/earcut/src/earcut.js","webpack://grafana/./public/app/core/components/ColorScale/ColorScale.tsx","webpack://grafana/./public/app/core/components/Layers/AddLayerButton.tsx","webpack://grafana/./node_modules/ol/control/ScaleLine.js","webpack://grafana/./public/app/plugins/panel/geomap/GeomapOverlay.tsx","webpack://grafana/./public/app/features/visualization/data-hover/DataHoverRow.tsx","webpack://grafana/./public/app/features/visualization/data-hover/DataHoverRows.tsx","webpack://grafana/./public/app/features/visualization/data-hover/DataHoverTabs.tsx","webpack://grafana/./public/app/features/visualization/data-hover/ComplexDataHoverView.tsx","webpack://grafana/./public/app/plugins/panel/geomap/GeomapTooltip.tsx","webpack://grafana/./public/app/plugins/panel/geomap/components/DebugOverlay.tsx","webpack://grafana/./public/app/plugins/panel/geomap/utils/measure.ts","webpack://grafana/./node_modules/ol/structs/RBush.js","webpack://grafana/./node_modules/ol/source/VectorEventType.js","webpack://grafana/./node_modules/ol/ImageState.js","webpack://grafana/./node_modules/ol/style/Image.js","webpack://grafana/./node_modules/ol/colorlike.js","webpack://grafana/./node_modules/ol/style/RegularShape.js","webpack://grafana/./node_modules/ol/style/Circle.js","webpack://grafana/./node_modules/ol/style/Fill.js","webpack://grafana/./node_modules/ol/style/Stroke.js","webpack://grafana/./node_modules/ol/style/Style.js","webpack://grafana/./node_modules/ol/ImageBase.js","webpack://grafana/./node_modules/ol/Image.js","webpack://grafana/./node_modules/ol/style/IconImage.js","webpack://grafana/./node_modules/ol/style/Icon.js","webpack://grafana/./node_modules/ol/style/Text.js","webpack://grafana/./node_modules/ol/style/flat.js","webpack://grafana/./node_modules/ol/layer/BaseVector.js","webpack://grafana/./node_modules/ol/render/canvas/Instruction.js","webpack://grafana/./node_modules/ol/render/VectorContext.js","webpack://grafana/./node_modules/ol/render/canvas/Builder.js","webpack://grafana/./node_modules/ol/render/canvas/ImageBuilder.js","webpack://grafana/./node_modules/ol/render/canvas/LineStringBuilder.js","webpack://grafana/./node_modules/ol/render/canvas/PolygonBuilder.js","webpack://grafana/./node_modules/ol/geom/flat/linechunk.js","webpack://grafana/./node_modules/ol/geom/flat/straightchunk.js","webpack://grafana/./node_modules/ol/render/canvas/TextBuilder.js","webpack://grafana/./node_modules/ol/render/canvas/BuilderGroup.js","webpack://grafana/./node_modules/ol/renderer/Layer.js","webpack://grafana/./node_modules/ol/renderer/canvas/Layer.js","webpack://grafana/./node_modules/ol/geom/flat/textpath.js","webpack://grafana/./node_modules/ol/render/canvas/Executor.js","webpack://grafana/./node_modules/ol/render/canvas/ExecutorGroup.js","webpack://grafana/./node_modules/ol/render/canvas/Immediate.js","webpack://grafana/./node_modules/ol/render/canvas/hitdetect.js","webpack://grafana/./node_modules/ol/renderer/vector.js","webpack://grafana/./node_modules/ol/renderer/canvas/VectorLayer.js","webpack://grafana/./node_modules/ol/layer/Vector.js","webpack://grafana/./node_modules/ol/source/Source.js","webpack://grafana/./node_modules/ol/loadingstrategy.js","webpack://grafana/./node_modules/ol/featureloader.js","webpack://grafana/./node_modules/ol/source/Vector.js","webpack://grafana/./node_modules/ol/interaction/Modify.js","webpack://grafana/./node_modules/ol/geom/Circle.js","webpack://grafana/./node_modules/ol/interaction/Draw.js","webpack://grafana/./public/app/plugins/panel/geomap/components/MeasureVectorLayer.ts","webpack://grafana/./public/app/plugins/panel/geomap/components/MeasureOverlay.tsx","webpack://grafana/./public/app/plugins/panel/geomap/globalStyles.ts","webpack://grafana/./public/app/features/geo/utils/frameVectorSource.ts","webpack://grafana/./public/app/plugins/panel/geomap/components/MarkersLegend.tsx","webpack://grafana/./public/app/plugins/panel/geomap/components/ObservablePropsWrapper.tsx","webpack://grafana/./public/app/plugins/panel/geomap/style/markers.ts","webpack://grafana/./public/app/plugins/panel/geomap/style/utils.ts","webpack://grafana/./public/app/plugins/panel/geomap/editor/StyleEditor.tsx","webpack://grafana/./public/app/plugins/panel/geomap/layers/data/markersLayer.tsx","webpack://grafana/./node_modules/ol/layer/TileProperty.js","webpack://grafana/./node_modules/ol/layer/BaseTile.js","webpack://grafana/./node_modules/ol/Tile.js","webpack://grafana/./node_modules/ol/ImageTile.js","webpack://grafana/./node_modules/ol/reproj/common.js","webpack://grafana/./node_modules/ol/reproj/Triangulation.js","webpack://grafana/./node_modules/ol/reproj.js","webpack://grafana/./node_modules/ol/reproj/Tile.js","webpack://grafana/./node_modules/ol/TileRange.js","webpack://grafana/./node_modules/ol/renderer/canvas/TileLayer.js","webpack://grafana/./node_modules/ol/layer/Tile.js","webpack://grafana/./node_modules/ol/structs/LRUCache.js","webpack://grafana/./node_modules/ol/tilecoord.js","webpack://grafana/./node_modules/ol/TileCache.js","webpack://grafana/./node_modules/ol/source/TileEventType.js","webpack://grafana/./node_modules/ol/tilegrid/TileGrid.js","webpack://grafana/./node_modules/ol/tilegrid.js","webpack://grafana/./node_modules/ol/source/Tile.js","webpack://grafana/./node_modules/ol/tileurlfunction.js","webpack://grafana/./node_modules/ol/source/UrlTile.js","webpack://grafana/./node_modules/ol/source/TileImage.js","webpack://grafana/./node_modules/ol/source/XYZ.js","webpack://grafana/./public/app/plugins/panel/geomap/layers/basemaps/carto.ts","webpack://grafana/./public/app/plugins/panel/geomap/layers/basemaps/generic.ts","webpack://grafana/./public/app/plugins/panel/geomap/layers/basemaps/esri.ts","webpack://grafana/./node_modules/ol/source/OSM.js","webpack://grafana/./public/app/plugins/panel/geomap/layers/basemaps/index.ts","webpack://grafana/./public/app/plugins/panel/geomap/layers/basemaps/osm.ts","webpack://grafana/./node_modules/ol-ext/source/DayNight.js","webpack://grafana/./public/app/plugins/panel/geomap/layers/data/dayNightLayer.tsx","webpack://grafana/./public/app/plugins/panel/geomap/utils/checkFeatureMatchesStyleRule.ts","webpack://grafana/./public/app/plugins/panel/geomap/utils/getFeatures.ts","webpack://grafana/./public/app/plugins/panel/geomap/layers/data/geojsonDynamic.ts","webpack://grafana/./public/app/plugins/panel/geomap/utils/selection.ts","webpack://grafana/./public/app/plugins/panel/geomap/editor/StyleRuleEditor.tsx","webpack://grafana/./public/app/plugins/panel/geomap/editor/GeomapStyleRulesEditor.tsx","webpack://grafana/./public/app/plugins/panel/geomap/layers/data/geojsonLayer.ts","webpack://grafana/./node_modules/ol/webgl.js","webpack://grafana/./node_modules/ol/webgl/Buffer.js","webpack://grafana/./node_modules/ol/webgl/ContextEventType.js","webpack://grafana/./node_modules/ol/webgl/PostProcessingPass.js","webpack://grafana/./node_modules/ol/vec/mat4.js","webpack://grafana/./node_modules/ol/webgl/Helper.js","webpack://grafana/./node_modules/ol/renderer/webgl/Layer.js","webpack://grafana/./node_modules/ol/webgl/RenderTarget.js","webpack://grafana/./node_modules/ol/render/webgl/constants.js","webpack://grafana/./node_modules/ol/render/webgl/utils.js","webpack://grafana/./node_modules/ol/worker/webgl.js","webpack://grafana/./node_modules/ol/renderer/webgl/PointsLayer.js","webpack://grafana/./node_modules/ol/layer/Heatmap.js","webpack://grafana/./public/app/plugins/panel/geomap/layers/data/heatMap.tsx","webpack://grafana/./public/app/plugins/panel/geomap/layers/data/lastPointTracker.ts","webpack://grafana/./node_modules/ol-ext/geom/GeomUtils.js","webpack://grafana/./node_modules/ol-ext/geom/LineStringSplitAt.js","webpack://grafana/./node_modules/ol-ext/style/FlowLine.js","webpack://grafana/./public/app/plugins/panel/geomap/layers/data/networkLayer.tsx","webpack://grafana/./node_modules/ol-ext/style/Photo.js","webpack://grafana/./public/app/plugins/panel/geomap/layers/data/photosLayer.tsx","webpack://grafana/./public/app/plugins/panel/geomap/layers/data/routeLayer.tsx","webpack://grafana/./public/app/plugins/panel/geomap/layers/data/index.ts","webpack://grafana/./public/app/plugins/panel/geomap/layers/registry.ts","webpack://grafana/./public/app/plugins/panel/geomap/panelcfg.gen.ts","webpack://grafana/./public/app/plugins/panel/geomap/utils/layers.ts","webpack://grafana/./public/app/plugins/panel/geomap/utils/actions.ts","webpack://grafana/./public/app/plugins/panel/geomap/utils/getLayersExtent.ts","webpack://grafana/./public/app/plugins/panel/geomap/utils/tooltip.ts","webpack://grafana/./public/app/plugins/panel/geomap/view.ts","webpack://grafana/./public/app/plugins/panel/geomap/GeomapPanel.tsx","webpack://grafana/./public/app/core/components/Layers/LayerDragDropList.tsx","webpack://grafana/./public/app/plugins/panel/geomap/editor/LayersEditor.tsx","webpack://grafana/./public/app/plugins/panel/geomap/editor/CoordinatesMapViewEditor.tsx","webpack://grafana/./public/app/plugins/panel/geomap/editor/FitMapViewEditor.tsx","webpack://grafana/./public/app/plugins/panel/geomap/editor/MapViewEditor.tsx","webpack://grafana/./public/app/plugins/panel/geomap/editor/layerEditor.tsx","webpack://grafana/./public/app/plugins/panel/geomap/migrations.ts","webpack://grafana/./public/app/plugins/panel/geomap/module.tsx","webpack://grafana/./node_modules/rbush/rbush.min.js"],"sourcesContent":["\"use strict\";\n\nmodule.exports = function (url, options) {\n if (!options) {\n options = {};\n }\n if (!url) {\n return url;\n }\n url = String(url.__esModule ? url.default : url);\n\n // If url is already wrapped in quotes, remove them\n if (/^['\"].*['\"]$/.test(url)) {\n url = url.slice(1, -1);\n }\n if (options.hash) {\n url += options.hash;\n }\n\n // Should url be wrapped?\n // See https://drafts.csswg.org/css-values-3/#urls\n if (/[\"'() \\t\\n]|(%20)/.test(url) || options.needQuotes) {\n return \"\\\"\".concat(url.replace(/\"/g, '\\\\\"').replace(/\\n/g, \"\\\\n\"), \"\\\"\");\n }\n return url;\n};","'use strict';\n\nmodule.exports = earcut;\nmodule.exports.default = earcut;\n\nfunction earcut(data, holeIndices, dim) {\n\n dim = dim || 2;\n\n var hasHoles = holeIndices && holeIndices.length,\n outerLen = hasHoles ? holeIndices[0] * dim : data.length,\n outerNode = linkedList(data, 0, outerLen, dim, true),\n triangles = [];\n\n if (!outerNode || outerNode.next === outerNode.prev) return triangles;\n\n var minX, minY, maxX, maxY, x, y, invSize;\n\n if (hasHoles) outerNode = eliminateHoles(data, holeIndices, outerNode, dim);\n\n // if the shape is not too simple, we'll use z-order curve hash later; calculate polygon bbox\n if (data.length > 80 * dim) {\n minX = maxX = data[0];\n minY = maxY = data[1];\n\n for (var i = dim; i < outerLen; i += dim) {\n x = data[i];\n y = data[i + 1];\n if (x < minX) minX = x;\n if (y < minY) minY = y;\n if (x > maxX) maxX = x;\n if (y > maxY) maxY = y;\n }\n\n // minX, minY and invSize are later used to transform coords into integers for z-order calculation\n invSize = Math.max(maxX - minX, maxY - minY);\n invSize = invSize !== 0 ? 32767 / invSize : 0;\n }\n\n earcutLinked(outerNode, triangles, dim, minX, minY, invSize, 0);\n\n return triangles;\n}\n\n// create a circular doubly linked list from polygon points in the specified winding order\nfunction linkedList(data, start, end, dim, clockwise) {\n var i, last;\n\n if (clockwise === (signedArea(data, start, end, dim) > 0)) {\n for (i = start; i < end; i += dim) last = insertNode(i, data[i], data[i + 1], last);\n } else {\n for (i = end - dim; i >= start; i -= dim) last = insertNode(i, data[i], data[i + 1], last);\n }\n\n if (last && equals(last, last.next)) {\n removeNode(last);\n last = last.next;\n }\n\n return last;\n}\n\n// eliminate colinear or duplicate points\nfunction filterPoints(start, end) {\n if (!start) return start;\n if (!end) end = start;\n\n var p = start,\n again;\n do {\n again = false;\n\n if (!p.steiner && (equals(p, p.next) || area(p.prev, p, p.next) === 0)) {\n removeNode(p);\n p = end = p.prev;\n if (p === p.next) break;\n again = true;\n\n } else {\n p = p.next;\n }\n } while (again || p !== end);\n\n return end;\n}\n\n// main ear slicing loop which triangulates a polygon (given as a linked list)\nfunction earcutLinked(ear, triangles, dim, minX, minY, invSize, pass) {\n if (!ear) return;\n\n // interlink polygon nodes in z-order\n if (!pass && invSize) indexCurve(ear, minX, minY, invSize);\n\n var stop = ear,\n prev, next;\n\n // iterate through ears, slicing them one by one\n while (ear.prev !== ear.next) {\n prev = ear.prev;\n next = ear.next;\n\n if (invSize ? isEarHashed(ear, minX, minY, invSize) : isEar(ear)) {\n // cut off the triangle\n triangles.push(prev.i / dim | 0);\n triangles.push(ear.i / dim | 0);\n triangles.push(next.i / dim | 0);\n\n removeNode(ear);\n\n // skipping the next vertex leads to less sliver triangles\n ear = next.next;\n stop = next.next;\n\n continue;\n }\n\n ear = next;\n\n // if we looped through the whole remaining polygon and can't find any more ears\n if (ear === stop) {\n // try filtering points and slicing again\n if (!pass) {\n earcutLinked(filterPoints(ear), triangles, dim, minX, minY, invSize, 1);\n\n // if this didn't work, try curing all small self-intersections locally\n } else if (pass === 1) {\n ear = cureLocalIntersections(filterPoints(ear), triangles, dim);\n earcutLinked(ear, triangles, dim, minX, minY, invSize, 2);\n\n // as a last resort, try splitting the remaining polygon into two\n } else if (pass === 2) {\n splitEarcut(ear, triangles, dim, minX, minY, invSize);\n }\n\n break;\n }\n }\n}\n\n// check whether a polygon node forms a valid ear with adjacent nodes\nfunction isEar(ear) {\n var a = ear.prev,\n b = ear,\n c = ear.next;\n\n if (area(a, b, c) >= 0) return false; // reflex, can't be an ear\n\n // now make sure we don't have other points inside the potential ear\n var ax = a.x, bx = b.x, cx = c.x, ay = a.y, by = b.y, cy = c.y;\n\n // triangle bbox; min & max are calculated like this for speed\n var x0 = ax < bx ? (ax < cx ? ax : cx) : (bx < cx ? bx : cx),\n y0 = ay < by ? (ay < cy ? ay : cy) : (by < cy ? by : cy),\n x1 = ax > bx ? (ax > cx ? ax : cx) : (bx > cx ? bx : cx),\n y1 = ay > by ? (ay > cy ? ay : cy) : (by > cy ? by : cy);\n\n var p = c.next;\n while (p !== a) {\n if (p.x >= x0 && p.x <= x1 && p.y >= y0 && p.y <= y1 &&\n pointInTriangle(ax, ay, bx, by, cx, cy, p.x, p.y) &&\n area(p.prev, p, p.next) >= 0) return false;\n p = p.next;\n }\n\n return true;\n}\n\nfunction isEarHashed(ear, minX, minY, invSize) {\n var a = ear.prev,\n b = ear,\n c = ear.next;\n\n if (area(a, b, c) >= 0) return false; // reflex, can't be an ear\n\n var ax = a.x, bx = b.x, cx = c.x, ay = a.y, by = b.y, cy = c.y;\n\n // triangle bbox; min & max are calculated like this for speed\n var x0 = ax < bx ? (ax < cx ? ax : cx) : (bx < cx ? bx : cx),\n y0 = ay < by ? (ay < cy ? ay : cy) : (by < cy ? by : cy),\n x1 = ax > bx ? (ax > cx ? ax : cx) : (bx > cx ? bx : cx),\n y1 = ay > by ? (ay > cy ? ay : cy) : (by > cy ? by : cy);\n\n // z-order range for the current triangle bbox;\n var minZ = zOrder(x0, y0, minX, minY, invSize),\n maxZ = zOrder(x1, y1, minX, minY, invSize);\n\n var p = ear.prevZ,\n n = ear.nextZ;\n\n // look for points inside the triangle in both directions\n while (p && p.z >= minZ && n && n.z <= maxZ) {\n if (p.x >= x0 && p.x <= x1 && p.y >= y0 && p.y <= y1 && p !== a && p !== c &&\n pointInTriangle(ax, ay, bx, by, cx, cy, p.x, p.y) && area(p.prev, p, p.next) >= 0) return false;\n p = p.prevZ;\n\n if (n.x >= x0 && n.x <= x1 && n.y >= y0 && n.y <= y1 && n !== a && n !== c &&\n pointInTriangle(ax, ay, bx, by, cx, cy, n.x, n.y) && area(n.prev, n, n.next) >= 0) return false;\n n = n.nextZ;\n }\n\n // look for remaining points in decreasing z-order\n while (p && p.z >= minZ) {\n if (p.x >= x0 && p.x <= x1 && p.y >= y0 && p.y <= y1 && p !== a && p !== c &&\n pointInTriangle(ax, ay, bx, by, cx, cy, p.x, p.y) && area(p.prev, p, p.next) >= 0) return false;\n p = p.prevZ;\n }\n\n // look for remaining points in increasing z-order\n while (n && n.z <= maxZ) {\n if (n.x >= x0 && n.x <= x1 && n.y >= y0 && n.y <= y1 && n !== a && n !== c &&\n pointInTriangle(ax, ay, bx, by, cx, cy, n.x, n.y) && area(n.prev, n, n.next) >= 0) return false;\n n = n.nextZ;\n }\n\n return true;\n}\n\n// go through all polygon nodes and cure small local self-intersections\nfunction cureLocalIntersections(start, triangles, dim) {\n var p = start;\n do {\n var a = p.prev,\n b = p.next.next;\n\n if (!equals(a, b) && intersects(a, p, p.next, b) && locallyInside(a, b) && locallyInside(b, a)) {\n\n triangles.push(a.i / dim | 0);\n triangles.push(p.i / dim | 0);\n triangles.push(b.i / dim | 0);\n\n // remove two nodes involved\n removeNode(p);\n removeNode(p.next);\n\n p = start = b;\n }\n p = p.next;\n } while (p !== start);\n\n return filterPoints(p);\n}\n\n// try splitting polygon into two and triangulate them independently\nfunction splitEarcut(start, triangles, dim, minX, minY, invSize) {\n // look for a valid diagonal that divides the polygon into two\n var a = start;\n do {\n var b = a.next.next;\n while (b !== a.prev) {\n if (a.i !== b.i && isValidDiagonal(a, b)) {\n // split the polygon in two by the diagonal\n var c = splitPolygon(a, b);\n\n // filter colinear points around the cuts\n a = filterPoints(a, a.next);\n c = filterPoints(c, c.next);\n\n // run earcut on each half\n earcutLinked(a, triangles, dim, minX, minY, invSize, 0);\n earcutLinked(c, triangles, dim, minX, minY, invSize, 0);\n return;\n }\n b = b.next;\n }\n a = a.next;\n } while (a !== start);\n}\n\n// link every hole into the outer loop, producing a single-ring polygon without holes\nfunction eliminateHoles(data, holeIndices, outerNode, dim) {\n var queue = [],\n i, len, start, end, list;\n\n for (i = 0, len = holeIndices.length; i < len; i++) {\n start = holeIndices[i] * dim;\n end = i < len - 1 ? holeIndices[i + 1] * dim : data.length;\n list = linkedList(data, start, end, dim, false);\n if (list === list.next) list.steiner = true;\n queue.push(getLeftmost(list));\n }\n\n queue.sort(compareX);\n\n // process holes from left to right\n for (i = 0; i < queue.length; i++) {\n outerNode = eliminateHole(queue[i], outerNode);\n }\n\n return outerNode;\n}\n\nfunction compareX(a, b) {\n return a.x - b.x;\n}\n\n// find a bridge between vertices that connects hole with an outer ring and and link it\nfunction eliminateHole(hole, outerNode) {\n var bridge = findHoleBridge(hole, outerNode);\n if (!bridge) {\n return outerNode;\n }\n\n var bridgeReverse = splitPolygon(bridge, hole);\n\n // filter collinear points around the cuts\n filterPoints(bridgeReverse, bridgeReverse.next);\n return filterPoints(bridge, bridge.next);\n}\n\n// David Eberly's algorithm for finding a bridge between hole and outer polygon\nfunction findHoleBridge(hole, outerNode) {\n var p = outerNode,\n hx = hole.x,\n hy = hole.y,\n qx = -Infinity,\n m;\n\n // find a segment intersected by a ray from the hole's leftmost point to the left;\n // segment's endpoint with lesser x will be potential connection point\n do {\n if (hy <= p.y && hy >= p.next.y && p.next.y !== p.y) {\n var x = p.x + (hy - p.y) * (p.next.x - p.x) / (p.next.y - p.y);\n if (x <= hx && x > qx) {\n qx = x;\n m = p.x < p.next.x ? p : p.next;\n if (x === hx) return m; // hole touches outer segment; pick leftmost endpoint\n }\n }\n p = p.next;\n } while (p !== outerNode);\n\n if (!m) return null;\n\n // look for points inside the triangle of hole point, segment intersection and endpoint;\n // if there are no points found, we have a valid connection;\n // otherwise choose the point of the minimum angle with the ray as connection point\n\n var stop = m,\n mx = m.x,\n my = m.y,\n tanMin = Infinity,\n tan;\n\n p = m;\n\n do {\n if (hx >= p.x && p.x >= mx && hx !== p.x &&\n pointInTriangle(hy < my ? hx : qx, hy, mx, my, hy < my ? qx : hx, hy, p.x, p.y)) {\n\n tan = Math.abs(hy - p.y) / (hx - p.x); // tangential\n\n if (locallyInside(p, hole) &&\n (tan < tanMin || (tan === tanMin && (p.x > m.x || (p.x === m.x && sectorContainsSector(m, p)))))) {\n m = p;\n tanMin = tan;\n }\n }\n\n p = p.next;\n } while (p !== stop);\n\n return m;\n}\n\n// whether sector in vertex m contains sector in vertex p in the same coordinates\nfunction sectorContainsSector(m, p) {\n return area(m.prev, m, p.prev) < 0 && area(p.next, m, m.next) < 0;\n}\n\n// interlink polygon nodes in z-order\nfunction indexCurve(start, minX, minY, invSize) {\n var p = start;\n do {\n if (p.z === 0) p.z = zOrder(p.x, p.y, minX, minY, invSize);\n p.prevZ = p.prev;\n p.nextZ = p.next;\n p = p.next;\n } while (p !== start);\n\n p.prevZ.nextZ = null;\n p.prevZ = null;\n\n sortLinked(p);\n}\n\n// Simon Tatham's linked list merge sort algorithm\n// http://www.chiark.greenend.org.uk/~sgtatham/algorithms/listsort.html\nfunction sortLinked(list) {\n var i, p, q, e, tail, numMerges, pSize, qSize,\n inSize = 1;\n\n do {\n p = list;\n list = null;\n tail = null;\n numMerges = 0;\n\n while (p) {\n numMerges++;\n q = p;\n pSize = 0;\n for (i = 0; i < inSize; i++) {\n pSize++;\n q = q.nextZ;\n if (!q) break;\n }\n qSize = inSize;\n\n while (pSize > 0 || (qSize > 0 && q)) {\n\n if (pSize !== 0 && (qSize === 0 || !q || p.z <= q.z)) {\n e = p;\n p = p.nextZ;\n pSize--;\n } else {\n e = q;\n q = q.nextZ;\n qSize--;\n }\n\n if (tail) tail.nextZ = e;\n else list = e;\n\n e.prevZ = tail;\n tail = e;\n }\n\n p = q;\n }\n\n tail.nextZ = null;\n inSize *= 2;\n\n } while (numMerges > 1);\n\n return list;\n}\n\n// z-order of a point given coords and inverse of the longer side of data bbox\nfunction zOrder(x, y, minX, minY, invSize) {\n // coords are transformed into non-negative 15-bit integer range\n x = (x - minX) * invSize | 0;\n y = (y - minY) * invSize | 0;\n\n x = (x | (x << 8)) & 0x00FF00FF;\n x = (x | (x << 4)) & 0x0F0F0F0F;\n x = (x | (x << 2)) & 0x33333333;\n x = (x | (x << 1)) & 0x55555555;\n\n y = (y | (y << 8)) & 0x00FF00FF;\n y = (y | (y << 4)) & 0x0F0F0F0F;\n y = (y | (y << 2)) & 0x33333333;\n y = (y | (y << 1)) & 0x55555555;\n\n return x | (y << 1);\n}\n\n// find the leftmost node of a polygon ring\nfunction getLeftmost(start) {\n var p = start,\n leftmost = start;\n do {\n if (p.x < leftmost.x || (p.x === leftmost.x && p.y < leftmost.y)) leftmost = p;\n p = p.next;\n } while (p !== start);\n\n return leftmost;\n}\n\n// check if a point lies within a convex triangle\nfunction pointInTriangle(ax, ay, bx, by, cx, cy, px, py) {\n return (cx - px) * (ay - py) >= (ax - px) * (cy - py) &&\n (ax - px) * (by - py) >= (bx - px) * (ay - py) &&\n (bx - px) * (cy - py) >= (cx - px) * (by - py);\n}\n\n// check if a diagonal between two polygon nodes is valid (lies in polygon interior)\nfunction isValidDiagonal(a, b) {\n return a.next.i !== b.i && a.prev.i !== b.i && !intersectsPolygon(a, b) && // dones't intersect other edges\n (locallyInside(a, b) && locallyInside(b, a) && middleInside(a, b) && // locally visible\n (area(a.prev, a, b.prev) || area(a, b.prev, b)) || // does not create opposite-facing sectors\n equals(a, b) && area(a.prev, a, a.next) > 0 && area(b.prev, b, b.next) > 0); // special zero-length case\n}\n\n// signed area of a triangle\nfunction area(p, q, r) {\n return (q.y - p.y) * (r.x - q.x) - (q.x - p.x) * (r.y - q.y);\n}\n\n// check if two points are equal\nfunction equals(p1, p2) {\n return p1.x === p2.x && p1.y === p2.y;\n}\n\n// check if two segments intersect\nfunction intersects(p1, q1, p2, q2) {\n var o1 = sign(area(p1, q1, p2));\n var o2 = sign(area(p1, q1, q2));\n var o3 = sign(area(p2, q2, p1));\n var o4 = sign(area(p2, q2, q1));\n\n if (o1 !== o2 && o3 !== o4) return true; // general case\n\n if (o1 === 0 && onSegment(p1, p2, q1)) return true; // p1, q1 and p2 are collinear and p2 lies on p1q1\n if (o2 === 0 && onSegment(p1, q2, q1)) return true; // p1, q1 and q2 are collinear and q2 lies on p1q1\n if (o3 === 0 && onSegment(p2, p1, q2)) return true; // p2, q2 and p1 are collinear and p1 lies on p2q2\n if (o4 === 0 && onSegment(p2, q1, q2)) return true; // p2, q2 and q1 are collinear and q1 lies on p2q2\n\n return false;\n}\n\n// for collinear points p, q, r, check if point q lies on segment pr\nfunction onSegment(p, q, r) {\n return q.x <= Math.max(p.x, r.x) && q.x >= Math.min(p.x, r.x) && q.y <= Math.max(p.y, r.y) && q.y >= Math.min(p.y, r.y);\n}\n\nfunction sign(num) {\n return num > 0 ? 1 : num < 0 ? -1 : 0;\n}\n\n// check if a polygon diagonal intersects any polygon segments\nfunction intersectsPolygon(a, b) {\n var p = a;\n do {\n if (p.i !== a.i && p.next.i !== a.i && p.i !== b.i && p.next.i !== b.i &&\n intersects(p, p.next, a, b)) return true;\n p = p.next;\n } while (p !== a);\n\n return false;\n}\n\n// check if a polygon diagonal is locally inside the polygon\nfunction locallyInside(a, b) {\n return area(a.prev, a, a.next) < 0 ?\n area(a, b, a.next) >= 0 && area(a, a.prev, b) >= 0 :\n area(a, b, a.prev) < 0 || area(a, a.next, b) < 0;\n}\n\n// check if the middle point of a polygon diagonal is inside the polygon\nfunction middleInside(a, b) {\n var p = a,\n inside = false,\n px = (a.x + b.x) / 2,\n py = (a.y + b.y) / 2;\n do {\n if (((p.y > py) !== (p.next.y > py)) && p.next.y !== p.y &&\n (px < (p.next.x - p.x) * (py - p.y) / (p.next.y - p.y) + p.x))\n inside = !inside;\n p = p.next;\n } while (p !== a);\n\n return inside;\n}\n\n// link two polygon vertices with a bridge; if the vertices belong to the same ring, it splits polygon into two;\n// if one belongs to the outer ring and another to a hole, it merges it into a single ring\nfunction splitPolygon(a, b) {\n var a2 = new Node(a.i, a.x, a.y),\n b2 = new Node(b.i, b.x, b.y),\n an = a.next,\n bp = b.prev;\n\n a.next = b;\n b.prev = a;\n\n a2.next = an;\n an.prev = a2;\n\n b2.next = a2;\n a2.prev = b2;\n\n bp.next = b2;\n b2.prev = bp;\n\n return b2;\n}\n\n// create a node and optionally link it with previous one (in a circular doubly linked list)\nfunction insertNode(i, x, y, last) {\n var p = new Node(i, x, y);\n\n if (!last) {\n p.prev = p;\n p.next = p;\n\n } else {\n p.next = last.next;\n p.prev = last;\n last.next.prev = p;\n last.next = p;\n }\n return p;\n}\n\nfunction removeNode(p) {\n p.next.prev = p.prev;\n p.prev.next = p.next;\n\n if (p.prevZ) p.prevZ.nextZ = p.nextZ;\n if (p.nextZ) p.nextZ.prevZ = p.prevZ;\n}\n\nfunction Node(i, x, y) {\n // vertex index in coordinates array\n this.i = i;\n\n // vertex coordinates\n this.x = x;\n this.y = y;\n\n // previous and next vertex nodes in a polygon ring\n this.prev = null;\n this.next = null;\n\n // z-order curve value\n this.z = 0;\n\n // previous and next nodes in z-order\n this.prevZ = null;\n this.nextZ = null;\n\n // indicates whether this is a steiner point\n this.steiner = false;\n}\n\n// return a percentage difference between the polygon area and its triangulation area;\n// used to verify correctness of triangulation\nearcut.deviation = function (data, holeIndices, dim, triangles) {\n var hasHoles = holeIndices && holeIndices.length;\n var outerLen = hasHoles ? holeIndices[0] * dim : data.length;\n\n var polygonArea = Math.abs(signedArea(data, 0, outerLen, dim));\n if (hasHoles) {\n for (var i = 0, len = holeIndices.length; i < len; i++) {\n var start = holeIndices[i] * dim;\n var end = i < len - 1 ? holeIndices[i + 1] * dim : data.length;\n polygonArea -= Math.abs(signedArea(data, start, end, dim));\n }\n }\n\n var trianglesArea = 0;\n for (i = 0; i < triangles.length; i += 3) {\n var a = triangles[i] * dim;\n var b = triangles[i + 1] * dim;\n var c = triangles[i + 2] * dim;\n trianglesArea += Math.abs(\n (data[a] - data[c]) * (data[b + 1] - data[a + 1]) -\n (data[a] - data[b]) * (data[c + 1] - data[a + 1]));\n }\n\n return polygonArea === 0 && trianglesArea === 0 ? 0 :\n Math.abs((trianglesArea - polygonArea) / polygonArea);\n};\n\nfunction signedArea(data, start, end, dim) {\n var sum = 0;\n for (var i = start, j = end - dim; i < end; i += dim) {\n sum += (data[j] - data[i]) * (data[i + 1] + data[j + 1]);\n j = i;\n }\n return sum;\n}\n\n// turn a polygon in a multi-dimensional array form (e.g. as in GeoJSON) into a form Earcut accepts\nearcut.flatten = function (data) {\n var dim = data[0][0].length,\n result = {vertices: [], holes: [], dimensions: dim},\n holeIndex = 0;\n\n for (var i = 0; i < data.length; i++) {\n for (var j = 0; j < data[i].length; j++) {\n for (var d = 0; d < dim; d++) result.vertices.push(data[i][j][d]);\n }\n if (i > 0) {\n holeIndex += data[i - 1].length;\n result.holes.push(holeIndex);\n }\n }\n return result;\n};\n","import { css } from '@emotion/css';\nimport React, { useState, useEffect } from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { useTheme2 } from '@grafana/ui';\n\ntype Props = {\n colorPalette: string[];\n min: number;\n max: number;\n\n // Show a value as string -- when not defined, the raw values will not be shown\n display?: (v: number) => string;\n hoverValue?: number;\n useStopsPercentage?: boolean;\n};\n\ntype HoverState = {\n isShown: boolean;\n value: number;\n};\n\nconst GRADIENT_STOPS = 10;\n\nexport const ColorScale = ({ colorPalette, min, max, display, hoverValue, useStopsPercentage }: Props) => {\n const [colors, setColors] = useState<string[]>([]);\n const [scaleHover, setScaleHover] = useState<HoverState>({ isShown: false, value: 0 });\n const [percent, setPercent] = useState<number | null>(null); // 0-100 for CSS percentage\n\n const theme = useTheme2();\n const styles = getStyles(theme, colors);\n\n useEffect(() => {\n setColors(getGradientStops({ colorArray: colorPalette, stops: GRADIENT_STOPS, useStopsPercentage }));\n }, [colorPalette, useStopsPercentage]);\n\n const onScaleMouseMove = (event: React.MouseEvent<HTMLDivElement>) => {\n const divOffset = event.nativeEvent.offsetX;\n const offsetWidth = event.currentTarget.offsetWidth;\n const normPercentage = Math.floor((divOffset * 100) / offsetWidth + 1);\n const scaleValue = Math.floor(((max - min) * normPercentage) / 100 + min);\n\n setScaleHover({ isShown: true, value: scaleValue });\n setPercent(normPercentage);\n };\n\n const onScaleMouseLeave = () => {\n setScaleHover({ isShown: false, value: 0 });\n };\n\n useEffect(() => {\n setPercent(hoverValue == null ? null : clampPercent100((hoverValue - min) / (max - min)));\n }, [hoverValue, min, max]);\n\n return (\n <div className={styles.scaleWrapper} onMouseMove={onScaleMouseMove} onMouseLeave={onScaleMouseLeave}>\n <div className={styles.scaleGradient}>\n {display && (scaleHover.isShown || hoverValue !== undefined) && (\n <div className={styles.followerContainer}>\n <div className={styles.follower} style={{ left: `${percent}%` }} />\n </div>\n )}\n </div>\n {display && (\n <div className={styles.followerContainer}>\n <div className={styles.legendValues}>\n <span className={styles.disabled}>{display(min)}</span>\n <span className={styles.disabled}>{display(max)}</span>\n </div>\n {percent != null && (scaleHover.isShown || hoverValue !== undefined) && (\n <span className={styles.hoverValue} style={{ left: `${percent}%` }}>\n {display(hoverValue ?? scaleHover.value)}\n </span>\n )}\n </div>\n )}\n </div>\n );\n};\n\nconst getGradientStops = ({\n colorArray,\n stops,\n useStopsPercentage = true,\n}: {\n colorArray: string[];\n stops: number;\n useStopsPercentage?: boolean;\n}): string[] => {\n const colorCount = colorArray.length;\n if (useStopsPercentage && colorCount <= 20) {\n const incr = (1 / colorCount) * 100;\n let per = 0;\n const stops: string[] = [];\n for (const color of colorArray) {\n if (per > 0) {\n stops.push(`${color} ${per}%`);\n } else {\n stops.push(color);\n }\n per += incr;\n stops.push(`${color} ${per}%`);\n }\n return stops;\n }\n\n const gradientEnd = colorArray[colorCount - 1];\n const skip = Math.ceil(colorCount / stops);\n const gradientStops = new Set<string>();\n\n for (let i = 0; i < colorCount; i += skip) {\n gradientStops.add(colorArray[i]);\n }\n\n gradientStops.add(gradientEnd);\n\n return [...gradientStops];\n};\n\nfunction clampPercent100(v: number) {\n if (v > 1) {\n return 100;\n }\n if (v < 0) {\n return 0;\n }\n return v * 100;\n}\n\nconst getStyles = (theme: GrafanaTheme2, colors: string[]) => ({\n scaleWrapper: css({\n width: '100%',\n fontSize: '11px',\n opacity: 1,\n }),\n scaleGradient: css({\n background: `linear-gradient(90deg, ${colors.join()})`,\n height: '9px',\n pointerEvents: 'none',\n borderRadius: theme.shape.radius.default,\n }),\n legendValues: css({\n display: 'flex',\n justifyContent: 'space-between',\n pointerEvents: 'none',\n }),\n hoverValue: css({\n position: 'absolute',\n marginTop: '-14px',\n padding: '3px 15px',\n transform: 'translateX(-50%)',\n }),\n followerContainer: css({\n position: 'relative',\n pointerEvents: 'none',\n whiteSpace: 'nowrap',\n }),\n follower: css({\n position: 'absolute',\n height: '13px',\n width: '13px',\n borderRadius: theme.shape.radius.default,\n transform: 'translateX(-50%) translateY(-50%)',\n border: `2px solid ${theme.colors.text.primary}`,\n top: '5px',\n }),\n disabled: css({\n color: theme.colors.text.disabled,\n }),\n});\n","import React from 'react';\n\nimport { SelectableValue } from '@grafana/data';\nimport { ValuePicker } from '@grafana/ui';\n\nexport type AddLayerButtonProps = {\n onChange: (sel: SelectableValue<string>) => void;\n options: Array<SelectableValue<string>>;\n label: string;\n};\n\nexport const AddLayerButton = ({ onChange, options, label }: AddLayerButtonProps) => {\n return (\n <ValuePicker\n icon=\"plus\"\n label={label}\n variant=\"secondary\"\n options={options}\n onChange={onChange}\n isFullWidth={true}\n />\n );\n};\n","/**\n * @module ol/control/ScaleLine\n */\nimport Control from './Control.js';\nimport {CLASS_UNSELECTABLE} from '../css.js';\nimport {METERS_PER_UNIT, getPointResolution} from '../proj.js';\nimport {assert} from '../asserts.js';\n\n/**\n * @type {string}\n */\nconst UNITS_PROP = 'units';\n\n/**\n * @typedef {'degrees' | 'imperial' | 'nautical' | 'metric' | 'us'} Units\n * Units for the scale line.\n */\n\n/**\n * @const\n * @type {Array<number>}\n */\nconst LEADING_DIGITS = [1, 2, 5];\n\n/**\n * @const\n * @type {number}\n */\nconst DEFAULT_DPI = 25.4 / 0.28;\n\n/***\n * @template Return\n * @typedef {import(\"../Observable\").OnSignature<import(\"../Observable\").EventTypes, import(\"../events/Event.js\").default, Return> &\n * import(\"../Observable\").OnSignature<import(\"../ObjectEventType\").Types|\n * 'change:units', import(\"../Object\").ObjectEvent, Return> &\n * import(\"../Observable\").CombinedOnSignature<import(\"../Observable\").EventTypes|import(\"../ObjectEventType\").Types\n * |'change:units', Return>} ScaleLineOnSignature\n */\n\n/**\n * @typedef {Object} Options\n * @property {string} [className] CSS class name. The default is `ol-scale-bar` when configured with\n * `bar: true`. Otherwise the default is `ol-scale-line`.\n * @property {number} [minWidth=64] Minimum width in pixels at the OGC default dpi. The width will be\n * adjusted to match the dpi used.\n * @property {number} [maxWidth] Maximum width in pixels at the OGC default dpi. The width will be\n * adjusted to match the dpi used.\n * @property {function(import(\"../MapEvent.js\").default):void} [render] Function called when the control\n * should be re-rendered. This is called in a `requestAnimationFrame` callback.\n * @property {HTMLElement|string} [target] Specify a target if you want the control\n * to be rendered outside of the map's viewport.\n * @property {Units} [units='metric'] Units.\n * @property {boolean} [bar=false] Render scalebars instead of a line.\n * @property {number} [steps=4] Number of steps the scalebar should use. Use even numbers\n * for best results. Only applies when `bar` is `true`.\n * @property {boolean} [text=false] Render the text scale above of the scalebar. Only applies\n * when `bar` is `true`.\n * @property {number|undefined} [dpi=undefined] dpi of output device such as printer. Only applies\n * when `bar` is `true`. If undefined the OGC default screen pixel size of 0.28mm will be assumed.\n */\n\n/**\n * @classdesc\n * A control displaying rough y-axis distances, calculated for the center of the\n * viewport. For conformal projections (e.g. EPSG:3857, the default view\n * projection in OpenLayers), the scale is valid for all directions.\n * No scale line will be shown when the y-axis distance of a pixel at the\n * viewport center cannot be calculated in the view projection.\n * By default the scale line will show in the bottom left portion of the map,\n * but this can be changed by using the css selector `.ol-scale-line`.\n * When specifying `bar` as `true`, a scalebar will be rendered instead\n * of a scaleline.\n *\n * @api\n */\nclass ScaleLine extends Control {\n /**\n * @param {Options} [options] Scale line options.\n */\n constructor(options) {\n options = options ? options : {};\n\n const element = document.createElement('div');\n element.style.pointerEvents = 'none';\n\n super({\n element: element,\n render: options.render,\n target: options.target,\n });\n\n /***\n * @type {ScaleLineOnSignature<import(\"../events\").EventsKey>}\n */\n this.on;\n\n /***\n * @type {ScaleLineOnSignature<import(\"../events\").EventsKey>}\n */\n this.once;\n\n /***\n * @type {ScaleLineOnSignature<void>}\n */\n this.un;\n\n const className =\n options.className !== undefined\n ? options.className\n : options.bar\n ? 'ol-scale-bar'\n : 'ol-scale-line';\n\n /**\n * @private\n * @type {HTMLElement}\n */\n this.innerElement_ = document.createElement('div');\n this.innerElement_.className = className + '-inner';\n\n this.element.className = className + ' ' + CLASS_UNSELECTABLE;\n this.element.appendChild(this.innerElement_);\n\n /**\n * @private\n * @type {?import(\"../View.js\").State}\n */\n this.viewState_ = null;\n\n /**\n * @private\n * @type {number}\n */\n this.minWidth_ = options.minWidth !== undefined ? options.minWidth : 64;\n\n /**\n * @private\n * @type {number|undefined}\n */\n this.maxWidth_ = options.maxWidth;\n\n /**\n * @private\n * @type {boolean}\n */\n this.renderedVisible_ = false;\n\n /**\n * @private\n * @type {number|undefined}\n */\n this.renderedWidth_ = undefined;\n\n /**\n * @private\n * @type {string}\n */\n this.renderedHTML_ = '';\n\n this.addChangeListener(UNITS_PROP, this.handleUnitsChanged_);\n\n this.setUnits(options.units || 'metric');\n\n /**\n * @private\n * @type {boolean}\n */\n this.scaleBar_ = options.bar || false;\n\n /**\n * @private\n * @type {number}\n */\n this.scaleBarSteps_ = options.steps || 4;\n\n /**\n * @private\n * @type {boolean}\n */\n this.scaleBarText_ = options.text || false;\n\n /**\n * @private\n * @type {number|undefined}\n */\n this.dpi_ = options.dpi || undefined;\n }\n\n /**\n * Return the units to use in the scale line.\n * @return {Units} The units\n * to use in the scale line.\n * @observable\n * @api\n */\n getUnits() {\n return this.get(UNITS_PROP);\n }\n\n /**\n * @private\n */\n handleUnitsChanged_() {\n this.updateElement_();\n }\n\n /**\n * Set the units to use in the scale line.\n * @param {Units} units The units to use in the scale line.\n * @observable\n * @api\n */\n setUnits(units) {\n this.set(UNITS_PROP, units);\n }\n\n /**\n * Specify the dpi of output device such as printer.\n * @param {number|undefined} dpi The dpi of output device.\n * @api\n */\n setDpi(dpi) {\n this.dpi_ = dpi;\n }\n\n /**\n * @private\n */\n updateElement_() {\n const viewState = this.viewState_;\n\n if (!viewState) {\n if (this.renderedVisible_) {\n this.element.style.display = 'none';\n this.renderedVisible_ = false;\n }\n return;\n }\n\n const center = viewState.center;\n const projection = viewState.projection;\n const units = this.getUnits();\n const pointResolutionUnits = units == 'degrees' ? 'degrees' : 'm';\n let pointResolution = getPointResolution(\n projection,\n viewState.resolution,\n center,\n pointResolutionUnits\n );\n\n const minWidth =\n (this.minWidth_ * (this.dpi_ || DEFAULT_DPI)) / DEFAULT_DPI;\n\n const maxWidth =\n this.maxWidth_ !== undefined\n ? (this.maxWidth_ * (this.dpi_ || DEFAULT_DPI)) / DEFAULT_DPI\n : undefined;\n\n let nominalCount = minWidth * pointResolution;\n let suffix = '';\n if (units == 'degrees') {\n const metersPerDegree = METERS_PER_UNIT.degrees;\n nominalCount *= metersPerDegree;\n if (nominalCount < metersPerDegree / 60) {\n suffix = '\\u2033'; // seconds\n pointResolution *= 3600;\n } else if (nominalCount < metersPerDegree) {\n suffix = '\\u2032'; // minutes\n pointResolution *= 60;\n } else {\n suffix = '\\u00b0'; // degrees\n }\n } else if (units == 'imperial') {\n if (nominalCount < 0.9144) {\n suffix = 'in';\n pointResolution /= 0.0254;\n } else if (nominalCount < 1609.344) {\n suffix = 'ft';\n pointResolution /= 0.3048;\n } else {\n suffix = 'mi';\n pointResolution /= 1609.344;\n }\n } else if (units == 'nautical') {\n pointResolution /= 1852;\n suffix = 'NM';\n } else if (units == 'metric') {\n if (nominalCount < 0.001) {\n suffix = 'μm';\n pointResolution *= 1000000;\n } else if (nominalCount < 1) {\n suffix = 'mm';\n pointResolution *= 1000;\n } else if (nominalCount < 1000) {\n suffix = 'm';\n } else {\n suffix = 'km';\n pointResolution /= 1000;\n }\n } else if (units == 'us') {\n if (nominalCount < 0.9144) {\n suffix = 'in';\n pointResolution *= 39.37;\n } else if (nominalCount < 1609.344) {\n suffix = 'ft';\n pointResolution /= 0.30480061;\n } else {\n suffix = 'mi';\n pointResolution /= 1609.3472;\n }\n } else {\n assert(false, 33); // Invalid units\n }\n\n let i = 3 * Math.floor(Math.log(minWidth * pointResolution) / Math.log(10));\n let count, width, decimalCount;\n let previousCount, previousWidth, previousDecimalCount;\n while (true) {\n decimalCount = Math.floor(i / 3);\n const decimal = Math.pow(10, decimalCount);\n count = LEADING_DIGITS[((i % 3) + 3) % 3] * decimal;\n width = Math.round(count / pointResolution);\n if (isNaN(width)) {\n this.element.style.display = 'none';\n this.renderedVisible_ = false;\n return;\n }\n if (maxWidth !== undefined && width >= maxWidth) {\n count = previousCount;\n width = previousWidth;\n decimalCount = previousDecimalCount;\n break;\n } else if (width >= minWidth) {\n break;\n }\n previousCount = count;\n previousWidth = width;\n previousDecimalCount = decimalCount;\n ++i;\n }\n const html = this.scaleBar_\n ? this.createScaleBar(width, count, suffix)\n : count.toFixed(decimalCount < 0 ? -decimalCount : 0) + ' ' + suffix;\n\n if (this.renderedHTML_ != html) {\n this.innerElement_.innerHTML = html;\n this.renderedHTML_ = html;\n }\n\n if (this.renderedWidth_ != width) {\n this.innerElement_.style.width = width + 'px';\n this.renderedWidth_ = width;\n }\n\n if (!this.renderedVisible_) {\n this.element.style.display = '';\n this.renderedVisible_ = true;\n }\n }\n\n /**\n * @private\n * @param {number} width The current width of the scalebar.\n * @param {number} scale The current scale.\n * @param {string} suffix The suffix to append to the scale text.\n * @return {string} The stringified HTML of the scalebar.\n */\n createScaleBar(width, scale, suffix) {\n const resolutionScale = this.getScaleForResolution();\n const mapScale =\n resolutionScale < 1\n ? Math.round(1 / resolutionScale).toLocaleString() + ' : 1'\n : '1 : ' + Math.round(resolutionScale).toLocaleString();\n const steps = this.scaleBarSteps_;\n const stepWidth = width / steps;\n const scaleSteps = [this.createMarker('absolute')];\n for (let i = 0; i < steps; ++i) {\n const cls =\n i % 2 === 0 ? 'ol-scale-singlebar-odd' : 'ol-scale-singlebar-even';\n scaleSteps.push(\n '<div>' +\n '<div ' +\n `class=\"ol-scale-singlebar ${cls}\" ` +\n `style=\"width: ${stepWidth}px;\"` +\n '>' +\n '</div>' +\n this.createMarker('relative') +\n // render text every second step, except when only 2 steps\n (i % 2 === 0 || steps === 2\n ? this.createStepText(i, width, false, scale, suffix)\n : '') +\n '</div>'\n );\n }\n // render text at the end\n scaleSteps.push(this.createStepText(steps, width, true, scale, suffix));\n\n const scaleBarText = this.scaleBarText_\n ? `<div class=\"ol-scale-text\" style=\"width: ${width}px;\">` +\n mapScale +\n '</div>'\n : '';\n return scaleBarText + scaleSteps.join('');\n }\n\n /**\n * Creates a marker at given position\n * @param {'absolute'|'relative'} position The position, absolute or relative\n * @return {string} The stringified div containing the marker\n */\n createMarker(position) {\n const top = position === 'absolute' ? 3 : -10;\n return (\n '<div ' +\n 'class=\"ol-scale-step-marker\" ' +\n `style=\"position: ${position}; top: ${top}px;\"` +\n '></div>'\n );\n }\n\n /**\n * Creates the label for a marker marker at given position\n * @param {number} i The iterator\n * @param {number} width The width the scalebar will currently use\n * @param {boolean} isLast Flag indicating if we add the last step text\n * @param {number} scale The current scale for the whole scalebar\n * @param {string} suffix The suffix for the scale\n * @return {string} The stringified div containing the step text\n */\n createStepText(i, width, isLast, scale, suffix) {\n const length =\n i === 0 ? 0 : Math.round((scale / this.scaleBarSteps_) * i * 100) / 100;\n const lengthString = length + (i === 0 ? '' : ' ' + suffix);\n const margin = i === 0 ? -3 : (width / this.scaleBarSteps_) * -1;\n const minWidth = i === 0 ? 0 : (width / this.scaleBarSteps_) * 2;\n return (\n '<div ' +\n 'class=\"ol-scale-step-text\" ' +\n 'style=\"' +\n `margin-left: ${margin}px;` +\n `text-align: ${i === 0 ? 'left' : 'center'};` +\n `min-width: ${minWidth}px;` +\n `left: ${isLast ? width + 'px' : 'unset'};` +\n '\">' +\n lengthString +\n '</div>'\n );\n }\n\n /**\n * Returns the appropriate scale for the given resolution and units.\n * @return {number} The appropriate scale.\n */\n getScaleForResolution() {\n const resolution = getPointResolution(\n this.viewState_.projection,\n this.viewState_.resolution,\n this.viewState_.center,\n 'm'\n );\n const dpi = this.dpi_ || DEFAULT_DPI;\n const inchesPerMeter = 1000 / 25.4;\n return resolution * inchesPerMeter * dpi;\n }\n\n /**\n * Update the scale line element.\n * @param {import(\"../MapEvent.js\").default} mapEvent Map event.\n * @override\n */\n render(mapEvent) {\n const frameState = mapEvent.frameState;\n if (!frameState) {\n this.viewState_ = null;\n } else {\n this.viewState_ = frameState.viewState;\n }\n this.updateElement_();\n }\n}\n\nexport default ScaleLine;\n","import { css } from '@emotion/css';\nimport React, { CSSProperties } from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { useStyles2 } from '@grafana/ui';\n\nexport interface OverlayProps {\n topRight1?: React.ReactNode[];\n topRight2?: React.ReactNode[];\n bottomLeft?: React.ReactNode[];\n blStyle?: CSSProperties;\n}\n\nexport const GeomapOverlay = ({ topRight1, topRight2, bottomLeft, blStyle }: OverlayProps) => {\n const topRight1Exists = (topRight1 && topRight1.length > 0) ?? false;\n const styles = useStyles2(getStyles(topRight1Exists));\n return (\n <div className={styles.overlay}>\n {Boolean(topRight1?.length) && <div className={styles.TR1}>{topRight1}</div>}\n {Boolean(topRight2?.length) && <div className={styles.TR2}>{topRight2}</div>}\n {Boolean(bottomLeft?.length) && (\n <div className={styles.BL} style={blStyle}>\n {bottomLeft}\n </div>\n )}\n </div>\n );\n};\n\nconst getStyles = (topRight1Exists: boolean) => (theme: GrafanaTheme2) => ({\n overlay: css({\n position: 'absolute',\n width: '100%',\n height: '100%',\n zIndex: 500,\n pointerEvents: 'none',\n }),\n TR1: css({\n right: '0.5em',\n pointerEvents: 'auto',\n position: 'absolute',\n top: '0.5em',\n }),\n TR2: css({\n position: 'absolute',\n top: topRight1Exists ? '80px' : '8px',\n right: '8px',\n pointerEvents: 'auto',\n }),\n BL: css({\n position: 'absolute',\n bottom: '8px',\n left: '8px',\n pointerEvents: 'auto',\n }),\n});\n","import { FeatureLike } from 'ol/Feature';\nimport React from 'react';\n\nimport { ArrayDataFrame, DataFrame } from '@grafana/data';\n\nimport { DataHoverView } from './DataHoverView';\n\ntype Props = {\n feature?: FeatureLike;\n};\n\nexport const DataHoverRow = ({ feature }: Props) => {\n let data: DataFrame;\n let rowIndex = 0;\n if (!feature) {\n return null;\n }\n\n data = feature.get('frame');\n if (data) {\n rowIndex = feature.get('rowIndex');\n } else {\n const { geometry, ...properties } = feature.getProperties();\n data = new ArrayDataFrame([properties]);\n }\n\n return <DataHoverView data={data} rowIndex={rowIndex} />;\n};\n","import { css } from '@emotion/css';\nimport { isString } from 'lodash';\nimport { FeatureLike } from 'ol/Feature';\nimport React, { useState } from 'react';\n\nimport { DataFrame, FieldType, getFieldDisplayName, GrafanaTheme2 } from '@grafana/data';\nimport { Collapse, TabContent, useStyles2 } from '@grafana/ui';\nimport { GeomapLayerHover } from 'app/plugins/panel/geomap/event';\nimport { renderValue } from 'app/plugins/panel/geomap/utils/uiUtils';\n\nimport { DataHoverRow } from './DataHoverRow';\n\ntype Props = {\n layers: GeomapLayerHover[];\n activeTabIndex: number;\n};\n\nexport const DataHoverRows = ({ layers, activeTabIndex }: Props) => {\n const styles = useStyles2(getStyles);\n const [rowMap, setRowMap] = useState(new Map<string | number, boolean>());\n\n const updateRowMap = (key: string | number, value: boolean) => {\n setRowMap(new Map(rowMap.set(key, value)));\n };\n\n return (\n <TabContent>\n {layers.map(\n (geomapLayer, index) =>\n index === activeTabIndex && (\n <div key={geomapLayer.layer.getName()}>\n <div>\n {geomapLayer.features.map((feature, idx) => {\n const key = feature.getId() ?? idx;\n const shouldDisplayCollapse = geomapLayer.features.length > 1;\n\n return shouldDisplayCollapse ? (\n <Collapse\n key={key}\n collapsible\n label={generateLabel(feature, idx)}\n isOpen={rowMap.get(key)}\n onToggle={() => {\n updateRowMap(key, !rowMap.get(key));\n }}\n className={styles.collapsibleRow}\n >\n <DataHoverRow feature={feature} />\n </Collapse>\n ) : (\n <DataHoverRow key={key} feature={feature} />\n );\n })}\n </div>\n </div>\n )\n )}\n </TabContent>\n );\n};\n\nexport const generateLabel = (feature: FeatureLike, idx: number): string | React.ReactNode => {\n const names = ['Name', 'name', 'Title', 'ID', 'id'];\n let props = feature.getProperties();\n let first = '';\n const frame = feature.get('frame') as DataFrame; // eslint-disable-line\n if (frame) {\n const rowIndex = feature.get('rowIndex');\n for (const f of frame.fields) {\n if (f.type === FieldType.string) {\n const k = getFieldDisplayName(f, frame);\n if (!first) {\n first = k;\n }\n props[k] = f.values[rowIndex];\n }\n }\n }\n\n for (let k of names) {\n const v = props[k];\n if (v) {\n return v;\n }\n }\n\n if (first) {\n return (\n <span>\n {first}: {renderValue(props[first])}\n </span>\n );\n }\n\n for (let k of Object.keys(props)) {\n const v = props[k];\n if (isString(v)) {\n return (\n <span>\n {k}: {renderValue(v)}\n </span>\n );\n }\n }\n\n return `Match: ${idx + 1}`;\n};\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n collapsibleRow: css`\n margin-bottom: 0;\n `,\n});\n","import React, { Dispatch, SetStateAction } from 'react';\n\nimport { Tab, TabsBar } from '@grafana/ui';\nimport { GeomapLayerHover } from 'app/plugins/panel/geomap/event';\n\ntype Props = {\n layers?: GeomapLayerHover[];\n setActiveTabIndex: Dispatch<SetStateAction<number>>;\n activeTabIndex: number;\n};\n\nexport const DataHoverTabs = ({ layers, setActiveTabIndex, activeTabIndex }: Props) => {\n return (\n <TabsBar>\n {layers &&\n layers.map((g, index) => (\n <Tab\n key={index}\n label={g.layer.getName()}\n active={index === activeTabIndex}\n counter={g.features.length > 1 ? g.features.length : null}\n onChangeTab={() => {\n setActiveTabIndex(index);\n }}\n />\n ))}\n </TabsBar>\n );\n};\n","import React, { useState } from 'react';\n\nimport { CloseButton } from 'app/core/components/CloseButton/CloseButton';\nimport { GeomapLayerHover } from 'app/plugins/panel/geomap/event';\n\nimport { DataHoverRows } from './DataHoverRows';\nimport { DataHoverTabs } from './DataHoverTabs';\n\nexport interface Props {\n layers?: GeomapLayerHover[];\n isOpen: boolean;\n onClose: () => void;\n}\n\nexport const ComplexDataHoverView = ({ layers, onClose, isOpen }: Props) => {\n const [activeTabIndex, setActiveTabIndex] = useState<number>(0);\n\n if (!layers) {\n return null;\n }\n\n return (\n <>\n {isOpen && <CloseButton style={{ zIndex: 1 }} onClick={onClose} />}\n <DataHoverTabs layers={layers} setActiveTabIndex={setActiveTabIndex} activeTabIndex={activeTabIndex} />\n <DataHoverRows layers={layers} activeTabIndex={activeTabIndex} />\n </>\n );\n};\n","import { useDialog } from '@react-aria/dialog';\nimport { useOverlay } from '@react-aria/overlays';\nimport React, { createRef } from 'react';\n\nimport { Portal, VizTooltipContainer } from '@grafana/ui';\nimport { ComplexDataHoverView } from 'app/features/visualization/data-hover/ComplexDataHoverView';\n\nimport { GeomapHoverPayload } from './event';\n\ninterface Props {\n ttip?: GeomapHoverPayload;\n isOpen: boolean;\n onClose: () => void;\n}\n\nexport const GeomapTooltip = ({ ttip, onClose, isOpen }: Props) => {\n const ref = createRef<HTMLElement>();\n const { overlayProps } = useOverlay({ onClose, isDismissable: true, isOpen }, ref);\n const { dialogProps } = useDialog({}, ref);\n\n return (\n <>\n {ttip && ttip.layers && (\n <Portal>\n <VizTooltipContainer position={{ x: ttip.pageX, y: ttip.pageY }} offset={{ x: 10, y: 10 }} allowPointerEvents>\n <section ref={ref} {...overlayProps} {...dialogProps}>\n <ComplexDataHoverView layers={ttip.layers} isOpen={isOpen} onClose={onClose} />\n </section>\n </VizTooltipContainer>\n </Portal>\n )}\n </>\n );\n};\n","import { css } from '@emotion/css';\nimport { Map } from 'ol';\nimport { Coordinate } from 'ol/coordinate';\nimport { transform } from 'ol/proj';\nimport React, { PureComponent } from 'react';\nimport tinycolor from 'tinycolor2';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors/src';\nimport { config } from 'app/core/config';\n\ninterface Props {\n map: Map;\n}\n\ninterface State {\n zoom?: number;\n center: Coordinate;\n}\n\nexport class DebugOverlay extends PureComponent<Props, State> {\n style = getStyles(config.theme2);\n\n constructor(props: Props) {\n super(props);\n this.state = { zoom: 0, center: [0, 0] };\n }\n\n updateViewState = () => {\n const view = this.props.map.getView();\n this.setState({\n zoom: view.getZoom(),\n center: transform(view.getCenter()!, view.getProjection(), 'EPSG:4326'),\n });\n };\n\n componentDidMount() {\n this.props.map.on('moveend', this.updateViewState);\n this.updateViewState();\n }\n\n render() {\n const { zoom, center } = this.state;\n\n return (\n <div className={this.style.infoWrap} aria-label={selectors.components.DebugOverlay.wrapper}>\n <table>\n <tbody>\n <tr>\n <th>Zoom:</th>\n <td>{zoom?.toFixed(1)}</td>\n </tr>\n <tr>\n <th>Center: </th>\n <td>\n {center[0].toFixed(5)}, {center[1].toFixed(5)}\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n );\n }\n}\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n infoWrap: css({\n color: theme.colors.text.primary,\n background: tinycolor(theme.components.panel.background).setAlpha(0.7).toString(),\n borderRadius: theme.shape.radius.default,\n padding: theme.spacing(1),\n }),\n});\n","import { FormattedValue, getValueFormat, SelectableValue, toFixedUnit } from '@grafana/data';\n\ntype MeasureAction = 'area' | 'length';\n\nexport interface MapMeasureOptions {\n action: MeasureAction;\n unit: string;\n color?: string;\n}\n\nexport interface MapMeasure extends SelectableValue<MeasureAction> {\n geometry: 'Polygon' | 'LineString';\n units: MapUnit[];\n\n /**\n * This will get the best unit for the selected string or a default\n * This is helpful when converting from area<>length, we should try to stay\n * in the same category of unit if possible\n */\n getUnit: (v?: string) => MapUnit;\n}\n\nexport interface MapUnit extends SelectableValue<string> {\n format: (si: number) => FormattedValue;\n}\n\nexport const measures: MapMeasure[] = [\n {\n value: 'length',\n label: 'Length',\n geometry: 'LineString',\n units: [\n {\n label: 'Metric (m/km)',\n value: 'm',\n format: (m: number) => getValueFormat('lengthm')(m),\n },\n {\n label: 'Feet (ft)',\n value: 'ft',\n format: (m: number) => getValueFormat('lengthft')(m * 3.28084),\n },\n {\n label: 'Miles (mi)',\n value: 'mi',\n format: (m: number) => getValueFormat('lengthmi')(m / 1609.0),\n },\n {\n label: 'Nautical miles (nmi)',\n value: 'nmi',\n format: (m: number) => getValueFormat('nmi')(m / 1852.0),\n },\n ],\n getUnit: (v?: string) => {\n const units = measures[0].units;\n if (v?.endsWith('2')) {\n v = v.substring(0, v.length - 1);\n }\n return units.find((u) => u.value === v) ?? units[0];\n },\n },\n {\n value: 'area',\n label: 'Area',\n geometry: 'Polygon',\n units: [\n {\n label: 'Square Meters (m²)',\n value: 'm2',\n format: (m2: number) => getValueFormat('areaM2')(m2),\n },\n {\n label: 'Square Kilometers (km²)',\n value: 'km2',\n format: (m2: number) => toFixedUnit('km²')(m2 * 1e-6),\n },\n {\n label: 'Square Feet (ft²)',\n value: 'ft2',\n format: (m2: number) => getValueFormat('areaF2')(m2 * 10.76391),\n },\n {\n label: 'Square Miles (mi²)',\n value: 'mi2',\n format: (m2: number) => getValueFormat('areaMI2')(m2 * 3.861e-7),\n },\n {\n label: 'Acres',\n value: 'acre2',\n format: (m2: number) => toFixedUnit('acre')(m2 * 2.47105e-4),\n },\n {\n label: 'Hectare',\n value: 'hectare2',\n format: (m2: number) => toFixedUnit('ha')(m2 * 1e-4),\n },\n ],\n getUnit: (v?: string) => {\n const units = measures[1].units;\n if (!v?.endsWith('2')) {\n v += '2';\n }\n return units.find((u) => u.value === v) ?? units[0];\n },\n },\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 {Object} Entry\n * @property {number} minX MinX.\n * @property {number} minY MinY.\n * @property {number} maxX MaxX.\n * @property {number} maxY MaxY.\n * @property {Object} [value] Value.\n */\n\n/**\n * @classdesc\n * Wrapper around the RBush by Vladimir Agafonkin.\n * See https://github.com/mourner/rbush.\n *\n * @template T\n */\nclass RBush {\n /**\n * @param {number} [maxEntries] Max entries.\n */\n constructor(maxEntries) {\n /**\n * @private\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<string, Entry>}\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<import(\"../extent.js\").Extent>} extents Extents.\n * @param {Array<T>} 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<T>} 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<T>} All in extent.\n */\n getInExtent(extent) {\n /** @type {Entry} */\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<T>} 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","/**\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/ImageState\n */\n\n/**\n * @enum {number}\n */\nexport default {\n IDLE: 0,\n LOADING: 1,\n LOADED: 2,\n ERROR: 3,\n EMPTY: 4,\n};\n","/**\n * @module ol/style/Image\n */\nimport {abstract} from '../util.js';\nimport {toSize} from '../size.js';\n\n/**\n * @typedef {Object} Options\n * @property {number} opacity Opacity.\n * @property {boolean} rotateWithView If the image should get rotated with the view.\n * @property {number} rotation Rotation.\n * @property {number|import(\"../size.js\").Size} scale Scale.\n * @property {Array<number>} displacement Displacement.\n * @property {\"declutter\"|\"obstacle\"|\"none\"|undefined} declutterMode Declutter mode: `declutter`, `obstacle`, 'none */\n\n/**\n * @classdesc\n * A base class used for creating subclasses and not instantiated in\n * apps. Base class for {@link module:ol/style/Icon~Icon}, {@link module:ol/style/Circle~CircleStyle} and\n * {@link module:ol/style/RegularShape~RegularShape}.\n * @abstract\n * @api\n */\nclass ImageStyle {\n /**\n * @param {Options} options Options.\n */\n constructor(options) {\n /**\n * @private\n * @type {number}\n */\n this.opacity_ = options.opacity;\n\n /**\n * @private\n * @type {boolean}\n */\n this.rotateWithView_ = options.rotateWithView;\n\n /**\n * @private\n * @type {number}\n */\n this.rotation_ = options.rotation;\n\n /**\n * @private\n * @type {number|import(\"../size.js\").Size}\n */\n this.scale_ = options.scale;\n\n /**\n * @private\n * @type {import(\"../size.js\").Size}\n */\n this.scaleArray_ = toSize(options.scale);\n\n /**\n * @private\n * @type {Array<number>}\n */\n this.displacement_ = options.displacement;\n\n /**\n * @private\n * @type {\"declutter\"|\"obstacle\"|\"none\"|undefined}\n */\n this.declutterMode_ = options.declutterMode;\n }\n\n /**\n * Clones the style.\n * @return {ImageStyle} The cloned style.\n * @api\n */\n clone() {\n const scale = this.getScale();\n return new ImageStyle({\n opacity: this.getOpacity(),\n scale: Array.isArray(scale) ? scale.slice() : scale,\n rotation: this.getRotation(),\n rotateWithView: this.getRotateWithView(),\n displacement: this.getDisplacement().slice(),\n declutterMode: this.getDeclutterMode(),\n });\n }\n\n /**\n * Get the symbolizer opacity.\n * @return {number} Opacity.\n * @api\n */\n getOpacity() {\n return this.opacity_;\n }\n\n /**\n * Determine whether the symbolizer rotates with the map.\n * @return {boolean} Rotate with map.\n * @api\n */\n getRotateWithView() {\n return this.rotateWithView_;\n }\n\n /**\n * Get the symoblizer rotation.\n * @return {number} Rotation.\n * @api\n */\n getRotation() {\n return this.rotation_;\n }\n\n /**\n * Get the symbolizer scale.\n * @return {number|import(\"../size.js\").Size} Scale.\n * @api\n */\n getScale() {\n return this.scale_;\n }\n\n /**\n * Get the symbolizer scale array.\n * @return {import(\"../size.js\").Size} Scale array.\n */\n getScaleArray() {\n return this.scaleArray_;\n }\n\n /**\n * Get the displacement of the shape\n * @return {Array<number>} Shape's center displacement\n * @api\n */\n getDisplacement() {\n return this.displacement_;\n }\n\n /**\n * Get the declutter mode of the shape\n * @return {\"declutter\"|\"obstacle\"|\"none\"|undefined} Shape's declutter mode\n * @api\n */\n getDeclutterMode() {\n return this.declutterMode_;\n }\n\n /**\n * Get the anchor point in pixels. The anchor determines the center point for the\n * symbolizer.\n * @abstract\n * @return {Array<number>} Anchor.\n */\n getAnchor() {\n return abstract();\n }\n\n /**\n * Get the image element for the symbolizer.\n * @abstract\n * @param {number} pixelRatio Pixel ratio.\n * @return {HTMLCanvasElement|HTMLVideoElement|HTMLImageElement} Image element.\n */\n getImage(pixelRatio) {\n return abstract();\n }\n\n /**\n * @abstract\n * @return {HTMLCanvasElement|HTMLVideoElement|HTMLImageElement} Image element.\n */\n getHitDetectionImage() {\n return abstract();\n }\n\n /**\n * Get the image pixel ratio.\n * @param {number} pixelRatio Pixel ratio.\n * @return {number} Pixel ratio.\n */\n getPixelRatio(pixelRatio) {\n return 1;\n }\n\n /**\n * @abstract\n * @return {import(\"../ImageState.js\").default} Image state.\n */\n getImageState() {\n return abstract();\n }\n\n /**\n * @abstract\n * @return {import(\"../size.js\").Size} Image size.\n */\n getImageSize() {\n return abstract();\n }\n\n /**\n * Get the origin of the symbolizer.\n * @abstract\n * @return {Array<number>} Origin.\n */\n getOrigin() {\n return abstract();\n }\n\n /**\n * Get the size of the symbolizer (in pixels).\n * @abstract\n * @return {import(\"../size.js\").Size} Size.\n */\n getSize() {\n return abstract();\n }\n\n /**\n * Set the displacement.\n *\n * @param {Array<number>} displacement Displacement.\n * @api\n */\n setDisplacement(displacement) {\n this.displacement_ = displacement;\n }\n\n /**\n * Set the opacity.\n *\n * @param {number} opacity Opacity.\n * @api\n */\n setOpacity(opacity) {\n this.opacity_ = opacity;\n }\n\n /**\n * Set whether to rotate the style with the view.\n *\n * @param {boolean} rotateWithView Rotate with map.\n * @api\n */\n setRotateWithView(rotateWithView) {\n this.rotateWithView_ = rotateWithView;\n }\n\n /**\n * Set the rotation.\n *\n * @param {number} rotation Rotation.\n * @api\n */\n setRotation(rotation) {\n this.rotation_ = rotation;\n }\n\n /**\n * Set the scale.\n *\n * @param {number|import(\"../size.js\").Size} scale Scale.\n * @api\n */\n setScale(scale) {\n this.scale_ = scale;\n this.scaleArray_ = toSize(scale);\n }\n\n /**\n * @abstract\n * @param {function(import(\"../events/Event.js\").default): void} listener Listener function.\n */\n listenImageChange(listener) {\n abstract();\n }\n\n /**\n * Load not yet loaded URI.\n * @abstract\n */\n load() {\n abstract();\n }\n\n /**\n * @abstract\n * @param {function(import(\"../events/Event.js\").default): void} listener Listener function.\n */\n unlistenImageChange(listener) {\n abstract();\n }\n}\n\nexport default ImageStyle;\n","/**\n * @module ol/colorlike\n */\nimport {toString} from './color.js';\n\n/**\n * A type accepted by CanvasRenderingContext2D.fillStyle\n * or CanvasRenderingContext2D.strokeStyle.\n * Represents a color, pattern, or gradient. The origin for patterns and\n * gradients as fill style is an increment of 512 css pixels from map coordinate\n * `[0, 0]`. For seamless repeat patterns, width and height of the pattern image\n * must be a factor of two (2, 4, 8, ..., 512).\n *\n * @typedef {string|CanvasPattern|CanvasGradient} ColorLike\n * @api\n */\n\n/**\n * @param {import(\"./color.js\").Color|ColorLike} color Color.\n * @return {ColorLike} The color as an {@link ol/colorlike~ColorLike}.\n * @api\n */\nexport function asColorLike(color) {\n if (Array.isArray(color)) {\n return toString(color);\n }\n return color;\n}\n","/**\n * @module ol/style/RegularShape\n */\n\nimport ImageState from '../ImageState.js';\nimport ImageStyle from './Image.js';\nimport {asArray} from '../color.js';\nimport {asColorLike} from '../colorlike.js';\nimport {createCanvasContext2D} from '../dom.js';\nimport {\n defaultFillStyle,\n defaultLineJoin,\n defaultLineWidth,\n defaultMiterLimit,\n defaultStrokeStyle,\n} from '../render/canvas.js';\n\n/**\n * Specify radius for regular polygons, or radius1 and radius2 for stars.\n * @typedef {Object} Options\n * @property {import(\"./Fill.js\").default} [fill] Fill style.\n * @property {number} points Number of points for stars and regular polygons. In case of a polygon, the number of points\n * is the number of sides.\n * @property {number} [radius] Radius of a regular polygon.\n * @property {number} [radius1] First radius of a star. Ignored if radius is set.\n * @property {number} [radius2] Second radius of a star.\n * @property {number} [angle=0] Shape's angle in radians. A value of 0 will have one of the shape's points facing up.\n * @property {Array<number>} [displacement=[0, 0]] Displacement of the shape in pixels.\n * Positive values will shift the shape right and up.\n * @property {import(\"./Stroke.js\").default} [stroke] Stroke style.\n * @property {number} [rotation=0] Rotation in radians (positive rotation clockwise).\n * @property {boolean} [rotateWithView=false] Whether to rotate the shape with the view.\n * @property {number|import(\"../size.js\").Size} [scale=1] Scale. Unless two dimensional scaling is required a better\n * result may be obtained with appropriate settings for `radius`, `radius1` and `radius2`.\n * @property {\"declutter\"|\"obstacle\"|\"none\"|undefined} [declutterMode] Declutter mode.\n */\n\n/**\n * @typedef {Object} RenderOptions\n * @property {import(\"../colorlike.js\").ColorLike} [strokeStyle] StrokeStyle.\n * @property {number} strokeWidth StrokeWidth.\n * @property {number} size Size.\n * @property {Array<number>|null} lineDash LineDash.\n * @property {number} lineDashOffset LineDashOffset.\n * @property {CanvasLineJoin} lineJoin LineJoin.\n * @property {number} miterLimit MiterLimit.\n */\n\n/**\n * @classdesc\n * Set regular shape style for vector features. The resulting shape will be\n * a regular polygon when `radius` is provided, or a star when `radius1` and\n * `radius2` are provided.\n * @api\n */\nclass RegularShape extends ImageStyle {\n /**\n * @param {Options} options Options.\n */\n constructor(options) {\n /**\n * @type {boolean}\n */\n const rotateWithView =\n options.rotateWithView !== undefined ? options.rotateWithView : false;\n\n super({\n opacity: 1,\n rotateWithView: rotateWithView,\n rotation: options.rotation !== undefined ? options.rotation : 0,\n scale: options.scale !== undefined ? options.scale : 1,\n displacement:\n options.displacement !== undefined ? options.displacement : [0, 0],\n declutterMode: options.declutterMode,\n });\n\n /**\n * @private\n * @type {Object<number, HTMLCanvasElement>}\n */\n this.canvas_ = undefined;\n\n /**\n * @private\n * @type {HTMLCanvasElement}\n */\n this.hitDetectionCanvas_ = null;\n\n /**\n * @private\n * @type {import(\"./Fill.js\").default}\n */\n this.fill_ = options.fill !== undefined ? options.fill : null;\n\n /**\n * @private\n * @type {Array<number>}\n */\n this.origin_ = [0, 0];\n\n /**\n * @private\n * @type {number}\n */\n this.points_ = options.points;\n\n /**\n * @protected\n * @type {number}\n */\n this.radius_ =\n options.radius !== undefined ? options.radius : options.radius1;\n\n /**\n * @private\n * @type {number|undefined}\n */\n this.radius2_ = options.radius2;\n\n /**\n * @private\n * @type {number}\n */\n this.angle_ = options.angle !== undefined ? options.angle : 0;\n\n /**\n * @private\n * @type {import(\"./Stroke.js\").default}\n */\n this.stroke_ = options.stroke !== undefined ? options.stroke : null;\n\n /**\n * @private\n * @type {import(\"../size.js\").Size}\n */\n this.size_ = null;\n\n /**\n * @private\n * @type {RenderOptions}\n */\n this.renderOptions_ = null;\n\n this.render();\n }\n\n /**\n * Clones the style.\n * @return {RegularShape} The cloned style.\n * @api\n */\n clone() {\n const scale = this.getScale();\n const style = new RegularShape({\n fill: this.getFill() ? this.getFill().clone() : undefined,\n points: this.getPoints(),\n radius: this.getRadius(),\n radius2: this.getRadius2(),\n angle: this.getAngle(),\n stroke: this.getStroke() ? this.getStroke().clone() : undefined,\n rotation: this.getRotation(),\n rotateWithView: this.getRotateWithView(),\n scale: Array.isArray(scale) ? scale.slice() : scale,\n displacement: this.getDisplacement().slice(),\n declutterMode: this.getDeclutterMode(),\n });\n style.setOpacity(this.getOpacity());\n return style;\n }\n\n /**\n * Get the anchor point in pixels. The anchor determines the center point for the\n * symbolizer.\n * @return {Array<number>} Anchor.\n * @api\n */\n getAnchor() {\n const size = this.size_;\n if (!size) {\n return null;\n }\n const displacement = this.getDisplacement();\n const scale = this.getScaleArray();\n // anchor is scaled by renderer but displacement should not be scaled\n // so divide by scale here\n return [\n size[0] / 2 - displacement[0] / scale[0],\n size[1] / 2 + displacement[1] / scale[1],\n ];\n }\n\n /**\n * Get the angle used in generating the shape.\n * @return {number} Shape's rotation in radians.\n * @api\n */\n getAngle() {\n return this.angle_;\n }\n\n /**\n * Get the fill style for the shape.\n * @return {import(\"./Fill.js\").default} Fill style.\n * @api\n */\n getFill() {\n return this.fill_;\n }\n\n /**\n * Set the fill style.\n * @param {import(\"./Fill.js\").default} fill Fill style.\n * @api\n */\n setFill(fill) {\n this.fill_ = fill;\n this.render();\n }\n\n /**\n * @return {HTMLCanvasElement} Image element.\n */\n getHitDetectionImage() {\n if (!this.hitDetectionCanvas_) {\n this.createHitDetectionCanvas_(this.renderOptions_);\n }\n return this.hitDetectionCanvas_;\n }\n\n /**\n * Get the image icon.\n * @param {number} pixelRatio Pixel ratio.\n * @return {HTMLCanvasElement} Image or Canvas element.\n * @api\n */\n getImage(pixelRatio) {\n let image = this.canvas_[pixelRatio];\n if (!image) {\n const renderOptions = this.renderOptions_;\n const context = createCanvasContext2D(\n renderOptions.size * pixelRatio,\n renderOptions.size * pixelRatio\n );\n this.draw_(renderOptions, context, pixelRatio);\n\n image = context.canvas;\n this.canvas_[pixelRatio] = image;\n }\n return image;\n }\n\n /**\n * Get the image pixel ratio.\n * @param {number} pixelRatio Pixel ratio.\n * @return {number} Pixel ratio.\n */\n getPixelRatio(pixelRatio) {\n return pixelRatio;\n }\n\n /**\n * @return {import(\"../size.js\").Size} Image size.\n */\n getImageSize() {\n return this.size_;\n }\n\n /**\n * @return {import(\"../ImageState.js\").default} Image state.\n */\n getImageState() {\n return ImageState.LOADED;\n }\n\n /**\n * Get the origin of the symbolizer.\n * @return {Array<number>} Origin.\n * @api\n */\n getOrigin() {\n return this.origin_;\n }\n\n /**\n * Get the number of points for generating the shape.\n * @return {number} Number of points for stars and regular polygons.\n * @api\n */\n getPoints() {\n return this.points_;\n }\n\n /**\n * Get the (primary) radius for the shape.\n * @return {number} Radius.\n * @api\n */\n getRadius() {\n return this.radius_;\n }\n\n /**\n * Get the secondary radius for the shape.\n * @return {number|undefined} Radius2.\n * @api\n */\n getRadius2() {\n return this.radius2_;\n }\n\n /**\n * Get the size of the symbolizer (in pixels).\n * @return {import(\"../size.js\").Size} Size.\n * @api\n */\n getSize() {\n return this.size_;\n }\n\n /**\n * Get the stroke style for the shape.\n * @return {import(\"./Stroke.js\").default} Stroke style.\n * @api\n */\n getStroke() {\n return this.stroke_;\n }\n\n /**\n * Set the stroke style.\n * @param {import(\"./Stroke.js\").default} stroke Stroke style.\n * @api\n */\n setStroke(stroke) {\n this.stroke_ = stroke;\n this.render();\n }\n\n /**\n * @param {function(import(\"../events/Event.js\").default): void} listener Listener function.\n */\n listenImageChange(listener) {}\n\n /**\n * Load not yet loaded URI.\n */\n load() {}\n\n /**\n * @param {function(import(\"../events/Event.js\").default): void} listener Listener function.\n */\n unlistenImageChange(listener) {}\n\n /**\n * Calculate additional canvas size needed for the miter.\n * @param {string} lineJoin Line join\n * @param {number} strokeWidth Stroke width\n * @param {number} miterLimit Miter limit\n * @return {number} Additional canvas size needed\n * @private\n */\n calculateLineJoinSize_(lineJoin, strokeWidth, miterLimit) {\n if (\n strokeWidth === 0 ||\n this.points_ === Infinity ||\n (lineJoin !== 'bevel' && lineJoin !== 'miter')\n ) {\n return strokeWidth;\n }\n // m | ^\n // i | |\\ .\n // t >| #\\\n // e | |\\ \\ .\n // r \\s\\\n // | \\t\\ . .\n // \\r\\ . .\n // | \\o\\ . . . . .\n // e \\k\\ . . . .\n // | \\e\\ . . . . .\n // d \\ \\ . . . .\n // | _ _a_ _\\# . . .\n // r1 / ` . .\n // | . .\n // b / . .\n // | . .\n // / r2 . .\n // | . .\n // / . .\n // |α . .\n // / . .\n // ° center\n let r1 = this.radius_;\n let r2 = this.radius2_ === undefined ? r1 : this.radius2_;\n if (r1 < r2) {\n const tmp = r1;\n r1 = r2;\n r2 = tmp;\n }\n const points =\n this.radius2_ === undefined ? this.points_ : this.points_ * 2;\n const alpha = (2 * Math.PI) / points;\n const a = r2 * Math.sin(alpha);\n const b = Math.sqrt(r2 * r2 - a * a);\n const d = r1 - b;\n const e = Math.sqrt(a * a + d * d);\n const miterRatio = e / a;\n if (lineJoin === 'miter' && miterRatio <= miterLimit) {\n return miterRatio * strokeWidth;\n }\n // Calculate the distance from center to the stroke corner where\n // it was cut short because of the miter limit.\n // l\n // ----+---- <= distance from center to here is maxr\n // /####|k ##\\\n // /#####^#####\\\n // /#### /+\\# s #\\\n // /### h/+++\\# t #\\\n // /### t/+++++\\# r #\\\n // /### a/+++++++\\# o #\\\n // /### p/++ fill +\\# k #\\\n ///#### /+++++^+++++\\# e #\\\n //#####/+++++/+\\+++++\\#####\\\n const k = strokeWidth / 2 / miterRatio;\n const l = (strokeWidth / 2) * (d / e);\n const maxr = Math.sqrt((r1 + k) * (r1 + k) + l * l);\n const bevelAdd = maxr - r1;\n if (this.radius2_ === undefined || lineJoin === 'bevel') {\n return bevelAdd * 2;\n }\n // If outer miter is over the miter limit the inner miter may reach through the\n // center and be longer than the bevel, same calculation as above but swap r1 / r2.\n const aa = r1 * Math.sin(alpha);\n const bb = Math.sqrt(r1 * r1 - aa * aa);\n const dd = r2 - bb;\n const ee = Math.sqrt(aa * aa + dd * dd);\n const innerMiterRatio = ee / aa;\n if (innerMiterRatio <= miterLimit) {\n const innerLength = (innerMiterRatio * strokeWidth) / 2 - r2 - r1;\n return 2 * Math.max(bevelAdd, innerLength);\n }\n return bevelAdd * 2;\n }\n\n /**\n * @return {RenderOptions} The render options\n * @protected\n */\n createRenderOptions() {\n let lineJoin = defaultLineJoin;\n let miterLimit = 0;\n let lineDash = null;\n let lineDashOffset = 0;\n let strokeStyle;\n let strokeWidth = 0;\n\n if (this.stroke_) {\n strokeStyle = this.stroke_.getColor();\n if (strokeStyle === null) {\n strokeStyle = defaultStrokeStyle;\n }\n strokeStyle = asColorLike(strokeStyle);\n strokeWidth = this.stroke_.getWidth();\n if (strokeWidth === undefined) {\n strokeWidth = defaultLineWidth;\n }\n lineDash = this.stroke_.getLineDash();\n lineDashOffset = this.stroke_.getLineDashOffset();\n lineJoin = this.stroke_.getLineJoin();\n if (lineJoin === undefined) {\n lineJoin = defaultLineJoin;\n }\n miterLimit = this.stroke_.getMiterLimit();\n if (miterLimit === undefined) {\n miterLimit = defaultMiterLimit;\n }\n }\n\n const add = this.calculateLineJoinSize_(lineJoin, strokeWidth, miterLimit);\n const maxRadius = Math.max(this.radius_, this.radius2_ || 0);\n const size = Math.ceil(2 * maxRadius + add);\n\n return {\n strokeStyle: strokeStyle,\n strokeWidth: strokeWidth,\n size: size,\n lineDash: lineDash,\n lineDashOffset: lineDashOffset,\n lineJoin: lineJoin,\n miterLimit: miterLimit,\n };\n }\n\n /**\n * @protected\n */\n render() {\n this.renderOptions_ = this.createRenderOptions();\n const size = this.renderOptions_.size;\n this.canvas_ = {};\n this.size_ = [size, size];\n }\n\n /**\n * @private\n * @param {RenderOptions} renderOptions Render options.\n * @param {CanvasRenderingContext2D} context The rendering context.\n * @param {number} pixelRatio The pixel ratio.\n */\n draw_(renderOptions, context, pixelRatio) {\n context.scale(pixelRatio, pixelRatio);\n // set origin to canvas center\n context.translate(renderOptions.size / 2, renderOptions.size / 2);\n\n this.createPath_(context);\n\n if (this.fill_) {\n let color = this.fill_.getColor();\n if (color === null) {\n color = defaultFillStyle;\n }\n context.fillStyle = asColorLike(color);\n context.fill();\n }\n if (this.stroke_) {\n context.strokeStyle = renderOptions.strokeStyle;\n context.lineWidth = renderOptions.strokeWidth;\n if (renderOptions.lineDash) {\n context.setLineDash(renderOptions.lineDash);\n context.lineDashOffset = renderOptions.lineDashOffset;\n }\n context.lineJoin = renderOptions.lineJoin;\n context.miterLimit = renderOptions.miterLimit;\n context.stroke();\n }\n }\n\n /**\n * @private\n * @param {RenderOptions} renderOptions Render options.\n */\n createHitDetectionCanvas_(renderOptions) {\n if (this.fill_) {\n let color = this.fill_.getColor();\n\n // determine if fill is transparent (or pattern or gradient)\n let opacity = 0;\n if (typeof color === 'string') {\n color = asArray(color);\n }\n if (color === null) {\n opacity = 1;\n } else if (Array.isArray(color)) {\n opacity = color.length === 4 ? color[3] : 1;\n }\n if (opacity === 0) {\n // if a transparent fill style is set, create an extra hit-detection image\n // with a default fill style\n const context = createCanvasContext2D(\n renderOptions.size,\n renderOptions.size\n );\n this.hitDetectionCanvas_ = context.canvas;\n\n this.drawHitDetectionCanvas_(renderOptions, context);\n }\n }\n if (!this.hitDetectionCanvas_) {\n this.hitDetectionCanvas_ = this.getImage(1);\n }\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} context The context to draw in.\n */\n createPath_(context) {\n let points = this.points_;\n const radius = this.radius_;\n if (points === Infinity) {\n context.arc(0, 0, radius, 0, 2 * Math.PI);\n } else {\n const radius2 = this.radius2_ === undefined ? radius : this.radius2_;\n if (this.radius2_ !== undefined) {\n points *= 2;\n }\n const startAngle = this.angle_ - Math.PI / 2;\n const step = (2 * Math.PI) / points;\n for (let i = 0; i < points; i++) {\n const angle0 = startAngle + i * step;\n const radiusC = i % 2 === 0 ? radius : radius2;\n context.lineTo(radiusC * Math.cos(angle0), radiusC * Math.sin(angle0));\n }\n context.closePath();\n }\n }\n\n /**\n * @private\n * @param {RenderOptions} renderOptions Render options.\n * @param {CanvasRenderingContext2D} context The context.\n */\n drawHitDetectionCanvas_(renderOptions, context) {\n // set origin to canvas center\n context.translate(renderOptions.size / 2, renderOptions.size / 2);\n\n this.createPath_(context);\n\n context.fillStyle = defaultFillStyle;\n context.fill();\n if (this.stroke_) {\n context.strokeStyle = renderOptions.strokeStyle;\n context.lineWidth = renderOptions.strokeWidth;\n if (renderOptions.lineDash) {\n context.setLineDash(renderOptions.lineDash);\n context.lineDashOffset = renderOptions.lineDashOffset;\n }\n context.lineJoin = renderOptions.lineJoin;\n context.miterLimit = renderOptions.miterLimit;\n context.stroke();\n }\n }\n}\n\nexport default RegularShape;\n","/**\n * @module ol/style/Circle\n */\n\nimport RegularShape from './RegularShape.js';\n\n/**\n * @typedef {Object} Options\n * @property {import(\"./Fill.js\").default} [fill] Fill style.\n * @property {number} radius Circle radius.\n * @property {import(\"./Stroke.js\").default} [stroke] Stroke style.\n * @property {Array<number>} [displacement=[0,0]] displacement\n * @property {number|import(\"../size.js\").Size} [scale=1] Scale. A two dimensional scale will produce an ellipse.\n * Unless two dimensional scaling is required a better result may be obtained with an appropriate setting for `radius`.\n * @property {number} [rotation=0] Rotation in radians\n * (positive rotation clockwise, meaningful only when used in conjunction with a two dimensional scale).\n * @property {boolean} [rotateWithView=false] Whether to rotate the shape with the view\n * (meaningful only when used in conjunction with a two dimensional scale).\n * @property {\"declutter\"|\"obstacle\"|\"none\"|undefined} [declutterMode] Declutter mode\n */\n\n/**\n * @classdesc\n * Set circle style for vector features.\n * @api\n */\nclass CircleStyle extends RegularShape {\n /**\n * @param {Options} [options] Options.\n */\n constructor(options) {\n options = options ? options : {radius: 5};\n\n super({\n points: Infinity,\n fill: options.fill,\n radius: options.radius,\n stroke: options.stroke,\n scale: options.scale !== undefined ? options.scale : 1,\n rotation: options.rotation !== undefined ? options.rotation : 0,\n rotateWithView:\n options.rotateWithView !== undefined ? options.rotateWithView : false,\n displacement:\n options.displacement !== undefined ? options.displacement : [0, 0],\n declutterMode: options.declutterMode,\n });\n }\n\n /**\n * Clones the style.\n * @return {CircleStyle} The cloned style.\n * @api\n */\n clone() {\n const scale = this.getScale();\n const style = new CircleStyle({\n fill: this.getFill() ? this.getFill().clone() : undefined,\n stroke: this.getStroke() ? this.getStroke().clone() : undefined,\n radius: this.getRadius(),\n scale: Array.isArray(scale) ? scale.slice() : scale,\n rotation: this.getRotation(),\n rotateWithView: this.getRotateWithView(),\n displacement: this.getDisplacement().slice(),\n declutterMode: this.getDeclutterMode(),\n });\n style.setOpacity(this.getOpacity());\n return style;\n }\n\n /**\n * Set the circle radius.\n *\n * @param {number} radius Circle radius.\n * @api\n */\n setRadius(radius) {\n this.radius_ = radius;\n this.render();\n }\n}\n\nexport default CircleStyle;\n","/**\n * @module ol/style/Fill\n */\n\n/**\n * @typedef {Object} Options\n * @property {import(\"../color.js\").Color|import(\"../colorlike.js\").ColorLike|null} [color=null] A color, gradient or pattern.\n * See {@link module:ol/color~Color} and {@link module:ol/colorlike~ColorLike} for possible formats.\n * Default null; if null, the Canvas/renderer default black will be used.\n */\n\n/**\n * @classdesc\n * Set fill style for vector features.\n * @api\n */\nclass Fill {\n /**\n * @param {Options} [options] Options.\n */\n constructor(options) {\n options = options || {};\n\n /**\n * @private\n * @type {import(\"../color.js\").Color|import(\"../colorlike.js\").ColorLike|null}\n */\n this.color_ = options.color !== undefined ? options.color : null;\n }\n\n /**\n * Clones the style. The color is not cloned if it is an {@link module:ol/colorlike~ColorLike}.\n * @return {Fill} The cloned style.\n * @api\n */\n clone() {\n const color = this.getColor();\n return new Fill({\n color: Array.isArray(color) ? color.slice() : color || undefined,\n });\n }\n\n /**\n * Get the fill color.\n * @return {import(\"../color.js\").Color|import(\"../colorlike.js\").ColorLike|null} Color.\n * @api\n */\n getColor() {\n return this.color_;\n }\n\n /**\n * Set the color.\n *\n * @param {import(\"../color.js\").Color|import(\"../colorlike.js\").ColorLike|null} color Color.\n * @api\n */\n setColor(color) {\n this.color_ = color;\n }\n}\n\nexport default Fill;\n","/**\n * @module ol/style/Stroke\n */\n\n/**\n * @typedef {Object} Options\n * @property {import(\"../color.js\").Color|import(\"../colorlike.js\").ColorLike} [color] A color, gradient or pattern.\n * See {@link module:ol/color~Color} and {@link module:ol/colorlike~ColorLike} for possible formats.\n * Default null; if null, the Canvas/renderer default black will be used.\n * @property {CanvasLineCap} [lineCap='round'] Line cap style: `butt`, `round`, or `square`.\n * @property {CanvasLineJoin} [lineJoin='round'] Line join style: `bevel`, `round`, or `miter`.\n * @property {Array<number>} [lineDash] Line dash pattern. Default is `null` (no dash).\n * @property {number} [lineDashOffset=0] Line dash offset.\n * @property {number} [miterLimit=10] Miter limit.\n * @property {number} [width] Width.\n */\n\n/**\n * @classdesc\n * Set stroke style for vector features.\n * Note that the defaults given are the Canvas defaults, which will be used if\n * option is not defined. The `get` functions return whatever was entered in\n * the options; they will not return the default.\n * @api\n */\nclass Stroke {\n /**\n * @param {Options} [options] Options.\n */\n constructor(options) {\n options = options || {};\n\n /**\n * @private\n * @type {import(\"../color.js\").Color|import(\"../colorlike.js\").ColorLike}\n */\n this.color_ = options.color !== undefined ? options.color : null;\n\n /**\n * @private\n * @type {CanvasLineCap|undefined}\n */\n this.lineCap_ = options.lineCap;\n\n /**\n * @private\n * @type {Array<number>|null}\n */\n this.lineDash_ = options.lineDash !== undefined ? options.lineDash : null;\n\n /**\n * @private\n * @type {number|undefined}\n */\n this.lineDashOffset_ = options.lineDashOffset;\n\n /**\n * @private\n * @type {CanvasLineJoin|undefined}\n */\n this.lineJoin_ = options.lineJoin;\n\n /**\n * @private\n * @type {number|undefined}\n */\n this.miterLimit_ = options.miterLimit;\n\n /**\n * @private\n * @type {number|undefined}\n */\n this.width_ = options.width;\n }\n\n /**\n * Clones the style.\n * @return {Stroke} The cloned style.\n * @api\n */\n clone() {\n const color = this.getColor();\n return new Stroke({\n color: Array.isArray(color) ? color.slice() : color || undefined,\n lineCap: this.getLineCap(),\n lineDash: this.getLineDash() ? this.getLineDash().slice() : undefined,\n lineDashOffset: this.getLineDashOffset(),\n lineJoin: this.getLineJoin(),\n miterLimit: this.getMiterLimit(),\n width: this.getWidth(),\n });\n }\n\n /**\n * Get the stroke color.\n * @return {import(\"../color.js\").Color|import(\"../colorlike.js\").ColorLike} Color.\n * @api\n */\n getColor() {\n return this.color_;\n }\n\n /**\n * Get the line cap type for the stroke.\n * @return {CanvasLineCap|undefined} Line cap.\n * @api\n */\n getLineCap() {\n return this.lineCap_;\n }\n\n /**\n * Get the line dash style for the stroke.\n * @return {Array<number>|null} Line dash.\n * @api\n */\n getLineDash() {\n return this.lineDash_;\n }\n\n /**\n * Get the line dash offset for the stroke.\n * @return {number|undefined} Line dash offset.\n * @api\n */\n getLineDashOffset() {\n return this.lineDashOffset_;\n }\n\n /**\n * Get the line join type for the stroke.\n * @return {CanvasLineJoin|undefined} Line join.\n * @api\n */\n getLineJoin() {\n return this.lineJoin_;\n }\n\n /**\n * Get the miter limit for the stroke.\n * @return {number|undefined} Miter limit.\n * @api\n */\n getMiterLimit() {\n return this.miterLimit_;\n }\n\n /**\n * Get the stroke width.\n * @return {number|undefined} Width.\n * @api\n */\n getWidth() {\n return this.width_;\n }\n\n /**\n * Set the color.\n *\n * @param {import(\"../color.js\").Color|import(\"../colorlike.js\").ColorLike} color Color.\n * @api\n */\n setColor(color) {\n this.color_ = color;\n }\n\n /**\n * Set the line cap.\n *\n * @param {CanvasLineCap|undefined} lineCap Line cap.\n * @api\n */\n setLineCap(lineCap) {\n this.lineCap_ = lineCap;\n }\n\n /**\n * Set the line dash.\n *\n * @param {Array<number>|null} lineDash Line dash.\n * @api\n */\n setLineDash(lineDash) {\n this.lineDash_ = lineDash;\n }\n\n /**\n * Set the line dash offset.\n *\n * @param {number|undefined} lineDashOffset Line dash offset.\n * @api\n */\n setLineDashOffset(lineDashOffset) {\n this.lineDashOffset_ = lineDashOffset;\n }\n\n /**\n * Set the line join.\n *\n * @param {CanvasLineJoin|undefined} lineJoin Line join.\n * @api\n */\n setLineJoin(lineJoin) {\n this.lineJoin_ = lineJoin;\n }\n\n /**\n * Set the miter limit.\n *\n * @param {number|undefined} miterLimit Miter limit.\n * @api\n */\n setMiterLimit(miterLimit) {\n this.miterLimit_ = miterLimit;\n }\n\n /**\n * Set the width.\n *\n * @param {number|undefined} width Width.\n * @api\n */\n setWidth(width) {\n this.width_ = width;\n }\n}\n\nexport default Stroke;\n","/**\n * @module ol/style/Style\n */\n\nimport CircleStyle from './Circle.js';\nimport Fill from './Fill.js';\nimport Stroke from './Stroke.js';\nimport {assert} from '../asserts.js';\n\n/**\n * A function that takes an {@link module:ol/Feature~Feature} and a `{number}`\n * representing the view's resolution. The function should return a\n * {@link module:ol/style/Style~Style} or an array of them. This way e.g. a\n * vector layer can be styled. If the function returns `undefined`, the\n * feature will not be rendered.\n *\n * @typedef {function(import(\"../Feature.js\").FeatureLike, number):(Style|Array<Style>|void)} StyleFunction\n */\n\n/**\n * A {@link Style}, an array of {@link Style}, or a {@link StyleFunction}.\n * @typedef {Style|Array<Style>|StyleFunction} StyleLike\n */\n\n/**\n * A function that takes an {@link module:ol/Feature~Feature} as argument and returns an\n * {@link module:ol/geom/Geometry~Geometry} that will be rendered and styled for the feature.\n *\n * @typedef {function(import(\"../Feature.js\").FeatureLike):\n * (import(\"../geom/Geometry.js\").default|import(\"../render/Feature.js\").default|undefined)} GeometryFunction\n */\n\n/**\n * Custom renderer function. Takes two arguments:\n *\n * 1. The pixel coordinates of the geometry in GeoJSON notation.\n * 2. The {@link module:ol/render~State} of the layer renderer.\n *\n * @typedef {function((import(\"../coordinate.js\").Coordinate|Array<import(\"../coordinate.js\").Coordinate>|Array<Array<import(\"../coordinate.js\").Coordinate>>),import(\"../render.js\").State): void} RenderFunction\n */\n\n/**\n * @typedef {Object} Options\n * @property {string|import(\"../geom/Geometry.js\").default|GeometryFunction} [geometry] Feature property or geometry\n * or function returning a geometry to render for this style.\n * @property {import(\"./Fill.js\").default} [fill] Fill style.\n * @property {import(\"./Image.js\").default} [image] Image style.\n * @property {RenderFunction} [renderer] Custom renderer. When configured, `fill`, `stroke` and `image` will be\n * ignored, and the provided function will be called with each render frame for each geometry.\n * @property {RenderFunction} [hitDetectionRenderer] Custom renderer for hit detection. If provided will be used\n * in hit detection rendering.\n * @property {import(\"./Stroke.js\").default} [stroke] Stroke style.\n * @property {import(\"./Text.js\").default} [text] Text style.\n * @property {number} [zIndex] Z index.\n */\n\n/**\n * @classdesc\n * Container for vector feature rendering styles. Any changes made to the style\n * or its children through `set*()` methods will not take effect until the\n * feature or layer that uses the style is re-rendered.\n *\n * ## Feature styles\n *\n * If no style is defined, the following default style is used:\n * ```js\n * import {Circle, Fill, Stroke, Style} from 'ol/style.js';\n *\n * const fill = new Fill({\n * color: 'rgba(255,255,255,0.4)',\n * });\n * const stroke = new Stroke({\n * color: '#3399CC',\n * width: 1.25,\n * });\n * const styles = [\n * new Style({\n * image: new Circle({\n * fill: fill,\n * stroke: stroke,\n * radius: 5,\n * }),\n * fill: fill,\n * stroke: stroke,\n * }),\n * ];\n * ```\n *\n * A separate editing style has the following defaults:\n * ```js\n * import {Circle, Fill, Stroke, Style} from 'ol/style.js';\n *\n * const styles = {};\n * const white = [255, 255, 255, 1];\n * const blue = [0, 153, 255, 1];\n * const width = 3;\n * styles['Polygon'] = [\n * new Style({\n * fill: new Fill({\n * color: [255, 255, 255, 0.5],\n * }),\n * }),\n * ];\n * styles['MultiPolygon'] =\n * styles['Polygon'];\n * styles['LineString'] = [\n * new Style({\n * stroke: new Stroke({\n * color: white,\n * width: width + 2,\n * }),\n * }),\n * new Style({\n * stroke: new Stroke({\n * color: blue,\n * width: width,\n * }),\n * }),\n * ];\n * styles['MultiLineString'] = styles['LineString'];\n *\n * styles['Circle'] = styles['Polygon'].concat(\n * styles['LineString']\n * );\n *\n * styles['Point'] = [\n * new Style({\n * image: new Circle({\n * radius: width * 2,\n * fill: new Fill({\n * color: blue,\n * }),\n * stroke: new Stroke({\n * color: white,\n * width: width / 2,\n * }),\n * }),\n * zIndex: Infinity,\n * }),\n * ];\n * styles['MultiPoint'] =\n * styles['Point'];\n * styles['GeometryCollection'] =\n * styles['Polygon'].concat(\n * styles['LineString'],\n * styles['Point']\n * );\n * ```\n *\n * @api\n */\nclass Style {\n /**\n * @param {Options} [options] Style options.\n */\n constructor(options) {\n options = options || {};\n\n /**\n * @private\n * @type {string|import(\"../geom/Geometry.js\").default|GeometryFunction}\n */\n this.geometry_ = null;\n\n /**\n * @private\n * @type {!GeometryFunction}\n */\n this.geometryFunction_ = defaultGeometryFunction;\n\n if (options.geometry !== undefined) {\n this.setGeometry(options.geometry);\n }\n\n /**\n * @private\n * @type {import(\"./Fill.js\").default}\n */\n this.fill_ = options.fill !== undefined ? options.fill : null;\n\n /**\n * @private\n * @type {import(\"./Image.js\").default}\n */\n this.image_ = options.image !== undefined ? options.image : null;\n\n /**\n * @private\n * @type {RenderFunction|null}\n */\n this.renderer_ = options.renderer !== undefined ? options.renderer : null;\n\n /**\n * @private\n * @type {RenderFunction|null}\n */\n this.hitDetectionRenderer_ =\n options.hitDetectionRenderer !== undefined\n ? options.hitDetectionRenderer\n : null;\n\n /**\n * @private\n * @type {import(\"./Stroke.js\").default}\n */\n this.stroke_ = options.stroke !== undefined ? options.stroke : null;\n\n /**\n * @private\n * @type {import(\"./Text.js\").default}\n */\n this.text_ = options.text !== undefined ? options.text : null;\n\n /**\n * @private\n * @type {number|undefined}\n */\n this.zIndex_ = options.zIndex;\n }\n\n /**\n * Clones the style.\n * @return {Style} The cloned style.\n * @api\n */\n clone() {\n let geometry = this.getGeometry();\n if (geometry && typeof geometry === 'object') {\n geometry = /** @type {import(\"../geom/Geometry.js\").default} */ (\n geometry\n ).clone();\n }\n return new Style({\n geometry: geometry,\n fill: this.getFill() ? this.getFill().clone() : undefined,\n image: this.getImage() ? this.getImage().clone() : undefined,\n renderer: this.getRenderer(),\n stroke: this.getStroke() ? this.getStroke().clone() : undefined,\n text: this.getText() ? this.getText().clone() : undefined,\n zIndex: this.getZIndex(),\n });\n }\n\n /**\n * Get the custom renderer function that was configured with\n * {@link #setRenderer} or the `renderer` constructor option.\n * @return {RenderFunction|null} Custom renderer function.\n * @api\n */\n getRenderer() {\n return this.renderer_;\n }\n\n /**\n * Sets a custom renderer function for this style. When set, `fill`, `stroke`\n * and `image` options of the style will be ignored.\n * @param {RenderFunction|null} renderer Custom renderer function.\n * @api\n */\n setRenderer(renderer) {\n this.renderer_ = renderer;\n }\n\n /**\n * Sets a custom renderer function for this style used\n * in hit detection.\n * @param {RenderFunction|null} renderer Custom renderer function.\n * @api\n */\n setHitDetectionRenderer(renderer) {\n this.hitDetectionRenderer_ = renderer;\n }\n\n /**\n * Get the custom renderer function that was configured with\n * {@link #setHitDetectionRenderer} or the `hitDetectionRenderer` constructor option.\n * @return {RenderFunction|null} Custom renderer function.\n * @api\n */\n getHitDetectionRenderer() {\n return this.hitDetectionRenderer_;\n }\n\n /**\n * Get the geometry to be rendered.\n * @return {string|import(\"../geom/Geometry.js\").default|GeometryFunction}\n * Feature property or geometry or function that returns the geometry that will\n * be rendered with this style.\n * @api\n */\n getGeometry() {\n return this.geometry_;\n }\n\n /**\n * Get the function used to generate a geometry for rendering.\n * @return {!GeometryFunction} Function that is called with a feature\n * and returns the geometry to render instead of the feature's geometry.\n * @api\n */\n getGeometryFunction() {\n return this.geometryFunction_;\n }\n\n /**\n * Get the fill style.\n * @return {import(\"./Fill.js\").default} Fill style.\n * @api\n */\n getFill() {\n return this.fill_;\n }\n\n /**\n * Set the fill style.\n * @param {import(\"./Fill.js\").default} fill Fill style.\n * @api\n */\n setFill(fill) {\n this.fill_ = fill;\n }\n\n /**\n * Get the image style.\n * @return {import(\"./Image.js\").default} Image style.\n * @api\n */\n getImage() {\n return this.image_;\n }\n\n /**\n * Set the image style.\n * @param {import(\"./Image.js\").default} image Image style.\n * @api\n */\n setImage(image) {\n this.image_ = image;\n }\n\n /**\n * Get the stroke style.\n * @return {import(\"./Stroke.js\").default} Stroke style.\n * @api\n */\n getStroke() {\n return this.stroke_;\n }\n\n /**\n * Set the stroke style.\n * @param {import(\"./Stroke.js\").default} stroke Stroke style.\n * @api\n */\n setStroke(stroke) {\n this.stroke_ = stroke;\n }\n\n /**\n * Get the text style.\n * @return {import(\"./Text.js\").default} Text style.\n * @api\n */\n getText() {\n return this.text_;\n }\n\n /**\n * Set the text style.\n * @param {import(\"./Text.js\").default} text Text style.\n * @api\n */\n setText(text) {\n this.text_ = text;\n }\n\n /**\n * Get the z-index for the style.\n * @return {number|undefined} ZIndex.\n * @api\n */\n getZIndex() {\n return this.zIndex_;\n }\n\n /**\n * Set a geometry that is rendered instead of the feature's geometry.\n *\n * @param {string|import(\"../geom/Geometry.js\").default|GeometryFunction} geometry\n * Feature property or geometry or function returning a geometry to render\n * for this style.\n * @api\n */\n setGeometry(geometry) {\n if (typeof geometry === 'function') {\n this.geometryFunction_ = geometry;\n } else if (typeof geometry === 'string') {\n this.geometryFunction_ = function (feature) {\n return /** @type {import(\"../geom/Geometry.js\").default} */ (\n feature.get(geometry)\n );\n };\n } else if (!geometry) {\n this.geometryFunction_ = defaultGeometryFunction;\n } else if (geometry !== undefined) {\n this.geometryFunction_ = function () {\n return /** @type {import(\"../geom/Geometry.js\").default} */ (geometry);\n };\n }\n this.geometry_ = geometry;\n }\n\n /**\n * Set the z-index.\n *\n * @param {number|undefined} zIndex ZIndex.\n * @api\n */\n setZIndex(zIndex) {\n this.zIndex_ = zIndex;\n }\n}\n\n/**\n * Convert the provided object into a style function. Functions passed through\n * unchanged. Arrays of Style or single style objects wrapped in a\n * new style function.\n * @param {StyleFunction|Array<Style>|Style} obj\n * A style function, a single style, or an array of styles.\n * @return {StyleFunction} A style function.\n */\nexport function toFunction(obj) {\n let styleFunction;\n\n if (typeof obj === 'function') {\n styleFunction = obj;\n } else {\n /**\n * @type {Array<Style>}\n */\n let styles;\n if (Array.isArray(obj)) {\n styles = obj;\n } else {\n assert(typeof (/** @type {?} */ (obj).getZIndex) === 'function', 41); // Expected an `Style` or an array of `Style`\n const style = /** @type {Style} */ (obj);\n styles = [style];\n }\n styleFunction = function () {\n return styles;\n };\n }\n return styleFunction;\n}\n\n/**\n * @type {Array<Style>|null}\n */\nlet defaultStyles = null;\n\n/**\n * @param {import(\"../Feature.js\").FeatureLike} feature Feature.\n * @param {number} resolution Resolution.\n * @return {Array<Style>} Style.\n */\nexport function createDefaultStyle(feature, resolution) {\n // We don't use an immediately-invoked function\n // and a closure so we don't get an error at script evaluation time in\n // browsers that do not support Canvas. (import(\"./Circle.js\").CircleStyle does\n // canvas.getContext('2d') at construction time, which will cause an.error\n // in such browsers.)\n if (!defaultStyles) {\n const fill = new Fill({\n color: 'rgba(255,255,255,0.4)',\n });\n const stroke = new Stroke({\n color: '#3399CC',\n width: 1.25,\n });\n defaultStyles = [\n new Style({\n image: new CircleStyle({\n fill: fill,\n stroke: stroke,\n radius: 5,\n }),\n fill: fill,\n stroke: stroke,\n }),\n ];\n }\n return defaultStyles;\n}\n\n/**\n * Default styles for editing features.\n * @return {Object<import(\"../geom/Geometry.js\").Type, Array<Style>>} Styles\n */\nexport function createEditingStyle() {\n /** @type {Object<import(\"../geom/Geometry.js\").Type, Array<Style>>} */\n const styles = {};\n const white = [255, 255, 255, 1];\n const blue = [0, 153, 255, 1];\n const width = 3;\n styles['Polygon'] = [\n new Style({\n fill: new Fill({\n color: [255, 255, 255, 0.5],\n }),\n }),\n ];\n styles['MultiPolygon'] = styles['Polygon'];\n\n styles['LineString'] = [\n new Style({\n stroke: new Stroke({\n color: white,\n width: width + 2,\n }),\n }),\n new Style({\n stroke: new Stroke({\n color: blue,\n width: width,\n }),\n }),\n ];\n styles['MultiLineString'] = styles['LineString'];\n\n styles['Circle'] = styles['Polygon'].concat(styles['LineString']);\n\n styles['Point'] = [\n new Style({\n image: new CircleStyle({\n radius: width * 2,\n fill: new Fill({\n color: blue,\n }),\n stroke: new Stroke({\n color: white,\n width: width / 2,\n }),\n }),\n zIndex: Infinity,\n }),\n ];\n styles['MultiPoint'] = styles['Point'];\n\n styles['GeometryCollection'] = styles['Polygon'].concat(\n styles['LineString'],\n styles['Point']\n );\n\n return styles;\n}\n\n/**\n * Function that is called with a feature and returns its default geometry.\n * @param {import(\"../Feature.js\").FeatureLike} feature Feature to get the geometry for.\n * @return {import(\"../geom/Geometry.js\").default|import(\"../render/Feature.js\").default|undefined} Geometry to render.\n */\nfunction defaultGeometryFunction(feature) {\n return feature.getGeometry();\n}\n\nexport default Style;\n","/**\n * @module ol/ImageBase\n */\nimport EventTarget from './events/Target.js';\nimport EventType from './events/EventType.js';\nimport {abstract} from './util.js';\n\n/**\n * @abstract\n */\nclass ImageBase extends EventTarget {\n /**\n * @param {import(\"./extent.js\").Extent} extent Extent.\n * @param {number|undefined} resolution Resolution.\n * @param {number} pixelRatio Pixel ratio.\n * @param {import(\"./ImageState.js\").default} state State.\n */\n constructor(extent, resolution, pixelRatio, state) {\n super();\n\n /**\n * @protected\n * @type {import(\"./extent.js\").Extent}\n */\n this.extent = extent;\n\n /**\n * @private\n * @type {number}\n */\n this.pixelRatio_ = pixelRatio;\n\n /**\n * @protected\n * @type {number|undefined}\n */\n this.resolution = resolution;\n\n /**\n * @protected\n * @type {import(\"./ImageState.js\").default}\n */\n this.state = state;\n }\n\n /**\n * @protected\n */\n changed() {\n this.dispatchEvent(EventType.CHANGE);\n }\n\n /**\n * @return {import(\"./extent.js\").Extent} Extent.\n */\n getExtent() {\n return this.extent;\n }\n\n /**\n * @abstract\n * @return {HTMLCanvasElement|HTMLImageElement|HTMLVideoElement} Image.\n */\n getImage() {\n return abstract();\n }\n\n /**\n * @return {number} PixelRatio.\n */\n getPixelRatio() {\n return this.pixelRatio_;\n }\n\n /**\n * @return {number} Resolution.\n */\n getResolution() {\n return /** @type {number} */ (this.resolution);\n }\n\n /**\n * @return {import(\"./ImageState.js\").default} State.\n */\n getState() {\n return this.state;\n }\n\n /**\n * Load not yet loaded URI.\n * @abstract\n */\n load() {\n abstract();\n }\n}\n\nexport default ImageBase;\n","/**\n * @module ol/Image\n */\nimport EventType from './events/EventType.js';\nimport ImageBase from './ImageBase.js';\nimport ImageState from './ImageState.js';\nimport {IMAGE_DECODE} from './has.js';\nimport {getHeight} from './extent.js';\nimport {listenOnce, unlistenByKey} from './events.js';\n\n/**\n * A function that takes an {@link module:ol/Image~ImageWrapper} for the image and a\n * `{string}` for the src as arguments. It is supposed to make it so the\n * underlying image {@link module:ol/Image~ImageWrapper#getImage} is assigned the\n * content specified by the src. If not specified, the default is\n *\n * function(image, src) {\n * image.getImage().src = src;\n * }\n *\n * Providing a custom `imageLoadFunction` can be useful to load images with\n * post requests or - in general - through XHR requests, where the src of the\n * image element would be set to a data URI when the content is loaded.\n *\n * @typedef {function(ImageWrapper, string): void} LoadFunction\n * @api\n */\n\nclass ImageWrapper extends ImageBase {\n /**\n * @param {import(\"./extent.js\").Extent} extent Extent.\n * @param {number|undefined} resolution Resolution.\n * @param {number} pixelRatio Pixel ratio.\n * @param {string} src Image source URI.\n * @param {?string} crossOrigin Cross origin.\n * @param {LoadFunction} imageLoadFunction Image load function.\n * @param {CanvasRenderingContext2D} [context] Canvas context. When provided, the image will be\n * drawn into the context's canvas, and `getImage()` will return the canvas once the image\n * has finished loading.\n */\n constructor(\n extent,\n resolution,\n pixelRatio,\n src,\n crossOrigin,\n imageLoadFunction,\n context\n ) {\n super(extent, resolution, pixelRatio, ImageState.IDLE);\n\n /**\n * @private\n * @type {string}\n */\n this.src_ = src;\n\n /**\n * @private\n * @type {HTMLCanvasElement|HTMLImageElement|HTMLVideoElement}\n */\n this.image_ = new Image();\n if (crossOrigin !== null) {\n this.image_.crossOrigin = crossOrigin;\n }\n\n /**\n * @private\n * @type {CanvasRenderingContext2D}\n */\n this.context_ = context;\n\n /**\n * @private\n * @type {?function():void}\n */\n this.unlisten_ = null;\n\n /**\n * @protected\n * @type {import(\"./ImageState.js\").default}\n */\n this.state = ImageState.IDLE;\n\n /**\n * @private\n * @type {LoadFunction}\n */\n this.imageLoadFunction_ = imageLoadFunction;\n }\n\n /**\n * @return {HTMLCanvasElement|HTMLImageElement|HTMLVideoElement} Image.\n * @api\n */\n getImage() {\n if (\n this.state == ImageState.LOADED &&\n this.context_ &&\n !(this.image_ instanceof HTMLCanvasElement)\n ) {\n const canvas = this.context_.canvas;\n canvas.width = this.image_.width;\n canvas.height = this.image_.height;\n this.context_.drawImage(this.image_, 0, 0);\n this.image_ = this.context_.canvas;\n }\n return this.image_;\n }\n\n /**\n * Tracks loading or read errors.\n *\n * @private\n */\n handleImageError_() {\n this.state = ImageState.ERROR;\n this.unlistenImage_();\n this.changed();\n }\n\n /**\n * Tracks successful image load.\n *\n * @private\n */\n handleImageLoad_() {\n if (this.resolution === undefined) {\n this.resolution = getHeight(this.extent) / this.image_.height;\n }\n this.state = ImageState.LOADED;\n this.unlistenImage_();\n this.changed();\n }\n\n /**\n * Load the image or retry if loading previously failed.\n * Loading is taken care of by the tile queue, and calling this method is\n * only needed for preloading or for reloading in case of an error.\n * @api\n */\n load() {\n if (this.state == ImageState.IDLE || this.state == ImageState.ERROR) {\n this.state = ImageState.LOADING;\n this.changed();\n this.imageLoadFunction_(this, this.src_);\n this.unlisten_ = listenImage(\n this.image_,\n this.handleImageLoad_.bind(this),\n this.handleImageError_.bind(this)\n );\n }\n }\n\n /**\n * @param {HTMLCanvasElement|HTMLImageElement|HTMLVideoElement} image Image.\n */\n setImage(image) {\n this.image_ = image;\n this.resolution = getHeight(this.extent) / this.image_.height;\n }\n\n /**\n * Discards event handlers which listen for load completion or errors.\n *\n * @private\n */\n unlistenImage_() {\n if (this.unlisten_) {\n this.unlisten_();\n this.unlisten_ = null;\n }\n }\n}\n\n/**\n * @param {HTMLCanvasElement|HTMLImageElement|HTMLVideoElement} image Image element.\n * @param {function():any} loadHandler Load callback function.\n * @param {function():any} errorHandler Error callback function.\n * @return {function():void} Callback to stop listening.\n */\nexport function listenImage(image, loadHandler, errorHandler) {\n const img = /** @type {HTMLImageElement} */ (image);\n let listening = true;\n let decoding = false;\n let loaded = false;\n\n const listenerKeys = [\n listenOnce(img, EventType.LOAD, function () {\n loaded = true;\n if (!decoding) {\n loadHandler();\n }\n }),\n ];\n\n if (img.src && IMAGE_DECODE) {\n decoding = true;\n img\n .decode()\n .then(function () {\n if (listening) {\n loadHandler();\n }\n })\n .catch(function (error) {\n if (listening) {\n if (loaded) {\n loadHandler();\n } else {\n errorHandler();\n }\n }\n });\n } else {\n listenerKeys.push(listenOnce(img, EventType.ERROR, errorHandler));\n }\n\n return function unlisten() {\n listening = false;\n listenerKeys.forEach(unlistenByKey);\n };\n}\n\nexport default ImageWrapper;\n","/**\n * @module ol/style/IconImage\n */\n\nimport EventTarget from '../events/Target.js';\nimport EventType from '../events/EventType.js';\nimport ImageState from '../ImageState.js';\nimport {asString} from '../color.js';\nimport {createCanvasContext2D} from '../dom.js';\nimport {shared as iconImageCache} from './IconImageCache.js';\nimport {listenImage} from '../Image.js';\n\n/**\n * @type {CanvasRenderingContext2D}\n */\nlet taintedTestContext = null;\n\nclass IconImage extends EventTarget {\n /**\n * @param {HTMLImageElement|HTMLCanvasElement} image Image.\n * @param {string|undefined} src Src.\n * @param {import(\"../size.js\").Size} size Size.\n * @param {?string} crossOrigin Cross origin.\n * @param {import(\"../ImageState.js\").default} imageState Image state.\n * @param {import(\"../color.js\").Color} color Color.\n */\n constructor(image, src, size, crossOrigin, imageState, color) {\n super();\n\n /**\n * @private\n * @type {HTMLImageElement|HTMLCanvasElement}\n */\n this.hitDetectionImage_ = null;\n\n /**\n * @private\n * @type {HTMLImageElement|HTMLCanvasElement}\n */\n this.image_ = image;\n\n /**\n * @private\n * @type {string|null}\n */\n this.crossOrigin_ = crossOrigin;\n\n /**\n * @private\n * @type {Object<number, HTMLCanvasElement>}\n */\n this.canvas_ = {};\n\n /**\n * @private\n * @type {import(\"../color.js\").Color}\n */\n this.color_ = color;\n\n /**\n * @private\n * @type {?function():void}\n */\n this.unlisten_ = null;\n\n /**\n * @private\n * @type {import(\"../ImageState.js\").default}\n */\n this.imageState_ = imageState;\n\n /**\n * @private\n * @type {import(\"../size.js\").Size}\n */\n this.size_ = size;\n\n /**\n * @private\n * @type {string|undefined}\n */\n this.src_ = src;\n\n /**\n * @private\n */\n this.tainted_;\n }\n\n /**\n * @private\n */\n initializeImage_() {\n this.image_ = new Image();\n if (this.crossOrigin_ !== null) {\n this.image_.crossOrigin = this.crossOrigin_;\n }\n }\n\n /**\n * @private\n * @return {boolean} The image canvas is tainted.\n */\n isTainted_() {\n if (this.tainted_ === undefined && this.imageState_ === ImageState.LOADED) {\n if (!taintedTestContext) {\n taintedTestContext = createCanvasContext2D(1, 1, undefined, {\n willReadFrequently: true,\n });\n }\n taintedTestContext.drawImage(this.image_, 0, 0);\n try {\n taintedTestContext.getImageData(0, 0, 1, 1);\n this.tainted_ = false;\n } catch (e) {\n taintedTestContext = null;\n this.tainted_ = true;\n }\n }\n return this.tainted_ === true;\n }\n\n /**\n * @private\n */\n dispatchChangeEvent_() {\n this.dispatchEvent(EventType.CHANGE);\n }\n\n /**\n * @private\n */\n handleImageError_() {\n this.imageState_ = ImageState.ERROR;\n this.unlistenImage_();\n this.dispatchChangeEvent_();\n }\n\n /**\n * @private\n */\n handleImageLoad_() {\n this.imageState_ = ImageState.LOADED;\n if (this.size_) {\n this.image_.width = this.size_[0];\n this.image_.height = this.size_[1];\n } else {\n this.size_ = [this.image_.width, this.image_.height];\n }\n this.unlistenImage_();\n this.dispatchChangeEvent_();\n }\n\n /**\n * @param {number} pixelRatio Pixel ratio.\n * @return {HTMLImageElement|HTMLCanvasElement} Image or Canvas element.\n */\n getImage(pixelRatio) {\n if (!this.image_) {\n this.initializeImage_();\n }\n this.replaceColor_(pixelRatio);\n return this.canvas_[pixelRatio] ? this.canvas_[pixelRatio] : this.image_;\n }\n\n /**\n * @param {number} pixelRatio Pixel ratio.\n * @return {number} Image or Canvas element.\n */\n getPixelRatio(pixelRatio) {\n this.replaceColor_(pixelRatio);\n return this.canvas_[pixelRatio] ? pixelRatio : 1;\n }\n\n /**\n * @return {import(\"../ImageState.js\").default} Image state.\n */\n getImageState() {\n return this.imageState_;\n }\n\n /**\n * @return {HTMLImageElement|HTMLCanvasElement} Image element.\n */\n getHitDetectionImage() {\n if (!this.image_) {\n this.initializeImage_();\n }\n if (!this.hitDetectionImage_) {\n if (this.isTainted_()) {\n const width = this.size_[0];\n const height = this.size_[1];\n const context = createCanvasContext2D(width, height);\n context.fillRect(0, 0, width, height);\n this.hitDetectionImage_ = context.canvas;\n } else {\n this.hitDetectionImage_ = this.image_;\n }\n }\n return this.hitDetectionImage_;\n }\n\n /**\n * Get the size of the icon (in pixels).\n * @return {import(\"../size.js\").Size} Image size.\n */\n getSize() {\n return this.size_;\n }\n\n /**\n * @return {string|undefined} Image src.\n */\n getSrc() {\n return this.src_;\n }\n\n /**\n * Load not yet loaded URI.\n */\n load() {\n if (this.imageState_ !== ImageState.IDLE) {\n return;\n }\n if (!this.image_) {\n this.initializeImage_();\n }\n\n this.imageState_ = ImageState.LOADING;\n try {\n /** @type {HTMLImageElement} */ (this.image_).src = this.src_;\n } catch (e) {\n this.handleImageError_();\n }\n this.unlisten_ = listenImage(\n this.image_,\n this.handleImageLoad_.bind(this),\n this.handleImageError_.bind(this)\n );\n }\n\n /**\n * @param {number} pixelRatio Pixel ratio.\n * @private\n */\n replaceColor_(pixelRatio) {\n if (\n !this.color_ ||\n this.canvas_[pixelRatio] ||\n this.imageState_ !== ImageState.LOADED\n ) {\n return;\n }\n\n const image = this.image_;\n const canvas = document.createElement('canvas');\n canvas.width = Math.ceil(image.width * pixelRatio);\n canvas.height = Math.ceil(image.height * pixelRatio);\n\n const ctx = canvas.getContext('2d');\n ctx.scale(pixelRatio, pixelRatio);\n ctx.drawImage(image, 0, 0);\n\n ctx.globalCompositeOperation = 'multiply';\n ctx.fillStyle = asString(this.color_);\n ctx.fillRect(0, 0, canvas.width / pixelRatio, canvas.height / pixelRatio);\n\n ctx.globalCompositeOperation = 'destination-in';\n ctx.drawImage(image, 0, 0);\n\n this.canvas_[pixelRatio] = canvas;\n }\n\n /**\n * Discards event handlers which listen for load completion or errors.\n *\n * @private\n */\n unlistenImage_() {\n if (this.unlisten_) {\n this.unlisten_();\n this.unlisten_ = null;\n }\n }\n}\n\n/**\n * @param {HTMLImageElement|HTMLCanvasElement} image Image.\n * @param {string} src Src.\n * @param {import(\"../size.js\").Size} size Size.\n * @param {?string} crossOrigin Cross origin.\n * @param {import(\"../ImageState.js\").default} imageState Image state.\n * @param {import(\"../color.js\").Color} color Color.\n * @return {IconImage} Icon image.\n */\nexport function get(image, src, size, crossOrigin, imageState, color) {\n let iconImage = iconImageCache.get(src, crossOrigin, color);\n if (!iconImage) {\n iconImage = new IconImage(image, src, size, crossOrigin, imageState, color);\n iconImageCache.set(src, crossOrigin, color, iconImage);\n }\n return iconImage;\n}\n\nexport default IconImage;\n","/**\n * @module ol/style/Icon\n */\nimport EventType from '../events/EventType.js';\nimport ImageState from '../ImageState.js';\nimport ImageStyle from './Image.js';\nimport {asArray} from '../color.js';\nimport {assert} from '../asserts.js';\nimport {get as getIconImage} from './IconImage.js';\nimport {getUid} from '../util.js';\n\n/**\n * @typedef {'fraction' | 'pixels'} IconAnchorUnits\n * Anchor unit can be either a fraction of the icon size or in pixels.\n */\n\n/**\n * @typedef {'bottom-left' | 'bottom-right' | 'top-left' | 'top-right'} IconOrigin\n * Icon origin. One of 'bottom-left', 'bottom-right', 'top-left', 'top-right'.\n */\n\n/**\n * @typedef {Object} Options\n * @property {Array<number>} [anchor=[0.5, 0.5]] Anchor. Default value is the icon center.\n * @property {IconOrigin} [anchorOrigin='top-left'] Origin of the anchor: `bottom-left`, `bottom-right`,\n * `top-left` or `top-right`.\n * @property {IconAnchorUnits} [anchorXUnits='fraction'] Units in which the anchor x value is\n * specified. A value of `'fraction'` indicates the x value is a fraction of the icon. A value of `'pixels'` indicates\n * the x value in pixels.\n * @property {IconAnchorUnits} [anchorYUnits='fraction'] Units in which the anchor y value is\n * specified. A value of `'fraction'` indicates the y value is a fraction of the icon. A value of `'pixels'` indicates\n * the y value in pixels.\n * @property {import(\"../color.js\").Color|string} [color] Color to tint the icon. If not specified,\n * the icon will be left as is.\n * @property {null|string} [crossOrigin] The `crossOrigin` attribute for loaded images. Note that you must provide a\n * `crossOrigin` value if you want to access pixel data with the Canvas renderer.\n * See https://developer.mozilla.org/en-US/docs/Web/HTML/CORS_enabled_image for more detail.\n * @property {HTMLImageElement|HTMLCanvasElement} [img] Image object for the icon. If the `src` option is not provided then the\n * provided image must already be loaded. And in that case, it is required\n * to provide the size of the image, with the `imgSize` option.\n * @property {import(\"../size.js\").Size} [imgSize] Image size in pixels. Only required if `img` is set and `src` is not.\n * The provided `imgSize` needs to match the actual size of the image.\n * @property {Array<number>} [displacement=[0, 0]] Displacement of the icon in pixels.\n * Positive values will shift the icon right and up.\n * @property {number} [opacity=1] Opacity of the icon.\n * @property {number} [width] The width of the icon in pixels. This can't be used together with `scale`.\n * @property {number} [height] The height of the icon in pixels. This can't be used together with `scale`.\n * @property {number|import(\"../size.js\").Size} [scale=1] Scale.\n * @property {boolean} [rotateWithView=false] Whether to rotate the icon with the view.\n * @property {number} [rotation=0] Rotation in radians (positive rotation clockwise).\n * @property {Array<number>} [offset=[0, 0]] Offset which, together with `size` and `offsetOrigin`, defines the\n * sub-rectangle to use from the original (sprite) image.\n * @property {IconOrigin} [offsetOrigin='top-left'] Origin of the offset: `bottom-left`, `bottom-right`,\n * `top-left` or `top-right`.\n * @property {import(\"../size.js\").Size} [size] Icon size in pixels. Used together with `offset` to define the\n * sub-rectangle to use from the original (sprite) image.\n * @property {string} [src] Image source URI.\n * @property {\"declutter\"|\"obstacle\"|\"none\"|undefined} [declutterMode] Declutter mode.\n */\n\n/**\n * @param {number} width The width.\n * @param {number} height The height.\n * @param {number|undefined} wantedWidth The wanted width.\n * @param {number|undefined} wantedHeight The wanted height.\n * @return {number|Array<number>} The scale.\n */\nfunction calculateScale(width, height, wantedWidth, wantedHeight) {\n if (wantedWidth !== undefined && wantedHeight !== undefined) {\n return [wantedWidth / width, wantedHeight / height];\n }\n if (wantedWidth !== undefined) {\n return wantedWidth / width;\n }\n if (wantedHeight !== undefined) {\n return wantedHeight / height;\n }\n return 1;\n}\n\n/**\n * @classdesc\n * Set icon style for vector features.\n * @api\n */\nclass Icon extends ImageStyle {\n /**\n * @param {Options} [options] Options.\n */\n constructor(options) {\n options = options || {};\n\n /**\n * @type {number}\n */\n const opacity = options.opacity !== undefined ? options.opacity : 1;\n\n /**\n * @type {number}\n */\n const rotation = options.rotation !== undefined ? options.rotation : 0;\n\n /**\n * @type {number|import(\"../size.js\").Size}\n */\n const scale = options.scale !== undefined ? options.scale : 1;\n\n /**\n * @type {boolean}\n */\n const rotateWithView =\n options.rotateWithView !== undefined ? options.rotateWithView : false;\n\n super({\n opacity: opacity,\n rotation: rotation,\n scale: scale,\n displacement:\n options.displacement !== undefined ? options.displacement : [0, 0],\n rotateWithView: rotateWithView,\n declutterMode: options.declutterMode,\n });\n\n /**\n * @private\n * @type {Array<number>}\n */\n this.anchor_ = options.anchor !== undefined ? options.anchor : [0.5, 0.5];\n\n /**\n * @private\n * @type {Array<number>}\n */\n this.normalizedAnchor_ = null;\n\n /**\n * @private\n * @type {IconOrigin}\n */\n this.anchorOrigin_ =\n options.anchorOrigin !== undefined ? options.anchorOrigin : 'top-left';\n\n /**\n * @private\n * @type {IconAnchorUnits}\n */\n this.anchorXUnits_ =\n options.anchorXUnits !== undefined ? options.anchorXUnits : 'fraction';\n\n /**\n * @private\n * @type {IconAnchorUnits}\n */\n this.anchorYUnits_ =\n options.anchorYUnits !== undefined ? options.anchorYUnits : 'fraction';\n\n /**\n * @private\n * @type {?string}\n */\n this.crossOrigin_ =\n options.crossOrigin !== undefined ? options.crossOrigin : null;\n\n /**\n * @type {HTMLImageElement|HTMLCanvasElement}\n */\n const image = options.img !== undefined ? options.img : null;\n\n /**\n * @private\n * @type {import(\"../size.js\").Size|undefined}\n */\n this.imgSize_ = options.imgSize;\n\n /**\n * @type {string|undefined}\n */\n let src = options.src;\n\n assert(!(src !== undefined && image), 4); // `image` and `src` cannot be provided at the same time\n assert(!image || (image && this.imgSize_), 5); // `imgSize` must be set when `image` is provided\n\n if ((src === undefined || src.length === 0) && image) {\n src = /** @type {HTMLImageElement} */ (image).src || getUid(image);\n }\n assert(src !== undefined && src.length > 0, 6); // A defined and non-empty `src` or `image` must be provided\n\n // `width` or `height` cannot be provided together with `scale`\n assert(\n !(\n (options.width !== undefined || options.height !== undefined) &&\n options.scale !== undefined\n ),\n 69\n );\n\n /**\n * @type {import(\"../ImageState.js\").default}\n */\n const imageState =\n options.src !== undefined ? ImageState.IDLE : ImageState.LOADED;\n\n /**\n * @private\n * @type {import(\"../color.js\").Color}\n */\n this.color_ = options.color !== undefined ? asArray(options.color) : null;\n\n /**\n * @private\n * @type {import(\"./IconImage.js\").default}\n */\n this.iconImage_ = getIconImage(\n image,\n /** @type {string} */ (src),\n this.imgSize_ !== undefined ? this.imgSize_ : null,\n this.crossOrigin_,\n imageState,\n this.color_\n );\n\n /**\n * @private\n * @type {Array<number>}\n */\n this.offset_ = options.offset !== undefined ? options.offset : [0, 0];\n /**\n * @private\n * @type {IconOrigin}\n */\n this.offsetOrigin_ =\n options.offsetOrigin !== undefined ? options.offsetOrigin : 'top-left';\n\n /**\n * @private\n * @type {Array<number>}\n */\n this.origin_ = null;\n\n /**\n * @private\n * @type {import(\"../size.js\").Size}\n */\n this.size_ = options.size !== undefined ? options.size : null;\n\n /**\n * Calculate the scale if width or height were given.\n */\n if (options.width !== undefined || options.height !== undefined) {\n let width, height;\n if (options.size) {\n [width, height] = options.size;\n } else {\n const image = this.getImage(1);\n if (\n image instanceof HTMLCanvasElement ||\n (image.src && image.complete)\n ) {\n width = image.width;\n height = image.height;\n } else {\n this.initialOptions_ = options;\n const onload = () => {\n this.unlistenImageChange(onload);\n if (!this.initialOptions_) {\n return;\n }\n const imageSize = this.iconImage_.getSize();\n this.setScale(\n calculateScale(\n imageSize[0],\n imageSize[1],\n options.width,\n options.height\n )\n );\n };\n this.listenImageChange(onload);\n return;\n }\n }\n if (width !== undefined) {\n this.setScale(\n calculateScale(width, height, options.width, options.height)\n );\n }\n }\n }\n\n /**\n * Clones the style. The underlying Image/HTMLCanvasElement is not cloned.\n * @return {Icon} The cloned style.\n * @api\n */\n clone() {\n let scale, width, height;\n if (this.initialOptions_) {\n width = this.initialOptions_.width;\n height = this.initialOptions_.height;\n } else {\n scale = this.getScale();\n scale = Array.isArray(scale) ? scale.slice() : scale;\n }\n const clone = new Icon({\n anchor: this.anchor_.slice(),\n anchorOrigin: this.anchorOrigin_,\n anchorXUnits: this.anchorXUnits_,\n anchorYUnits: this.anchorYUnits_,\n color:\n this.color_ && this.color_.slice\n ? this.color_.slice()\n : this.color_ || undefined,\n crossOrigin: this.crossOrigin_,\n imgSize: this.imgSize_,\n offset: this.offset_.slice(),\n offsetOrigin: this.offsetOrigin_,\n opacity: this.getOpacity(),\n rotateWithView: this.getRotateWithView(),\n rotation: this.getRotation(),\n scale,\n width,\n height,\n size: this.size_ !== null ? this.size_.slice() : undefined,\n src: this.getSrc(),\n displacement: this.getDisplacement().slice(),\n declutterMode: this.getDeclutterMode(),\n });\n return clone;\n }\n\n /**\n * Get the anchor point in pixels. The anchor determines the center point for the\n * symbolizer.\n * @return {Array<number>} Anchor.\n * @api\n */\n getAnchor() {\n let anchor = this.normalizedAnchor_;\n if (!anchor) {\n anchor = this.anchor_;\n const size = this.getSize();\n if (\n this.anchorXUnits_ == 'fraction' ||\n this.anchorYUnits_ == 'fraction'\n ) {\n if (!size) {\n return null;\n }\n anchor = this.anchor_.slice();\n if (this.anchorXUnits_ == 'fraction') {\n anchor[0] *= size[0];\n }\n if (this.anchorYUnits_ == 'fraction') {\n anchor[1] *= size[1];\n }\n }\n\n if (this.anchorOrigin_ != 'top-left') {\n if (!size) {\n return null;\n }\n if (anchor === this.anchor_) {\n anchor = this.anchor_.slice();\n }\n if (\n this.anchorOrigin_ == 'top-right' ||\n this.anchorOrigin_ == 'bottom-right'\n ) {\n anchor[0] = -anchor[0] + size[0];\n }\n if (\n this.anchorOrigin_ == 'bottom-left' ||\n this.anchorOrigin_ == 'bottom-right'\n ) {\n anchor[1] = -anchor[1] + size[1];\n }\n }\n this.normalizedAnchor_ = anchor;\n }\n const displacement = this.getDisplacement();\n const scale = this.getScaleArray();\n // anchor is scaled by renderer but displacement should not be scaled\n // so divide by scale here\n return [\n anchor[0] - displacement[0] / scale[0],\n anchor[1] + displacement[1] / scale[1],\n ];\n }\n\n /**\n * Set the anchor point. The anchor determines the center point for the\n * symbolizer.\n *\n * @param {Array<number>} anchor Anchor.\n * @api\n */\n setAnchor(anchor) {\n this.anchor_ = anchor;\n this.normalizedAnchor_ = null;\n }\n\n /**\n * Get the icon color.\n * @return {import(\"../color.js\").Color} Color.\n * @api\n */\n getColor() {\n return this.color_;\n }\n\n /**\n * Get the image icon.\n * @param {number} pixelRatio Pixel ratio.\n * @return {HTMLImageElement|HTMLCanvasElement} Image or Canvas element.\n * @api\n */\n getImage(pixelRatio) {\n return this.iconImage_.getImage(pixelRatio);\n }\n\n /**\n * Get the pixel ratio.\n * @param {number} pixelRatio Pixel ratio.\n * @return {number} The pixel ratio of the image.\n * @api\n */\n getPixelRatio(pixelRatio) {\n return this.iconImage_.getPixelRatio(pixelRatio);\n }\n\n /**\n * @return {import(\"../size.js\").Size} Image size.\n */\n getImageSize() {\n return this.iconImage_.getSize();\n }\n\n /**\n * @return {import(\"../ImageState.js\").default} Image state.\n */\n getImageState() {\n return this.iconImage_.getImageState();\n }\n\n /**\n * @return {HTMLImageElement|HTMLCanvasElement} Image element.\n */\n getHitDetectionImage() {\n return this.iconImage_.getHitDetectionImage();\n }\n\n /**\n * Get the origin of the symbolizer.\n * @return {Array<number>} Origin.\n * @api\n */\n getOrigin() {\n if (this.origin_) {\n return this.origin_;\n }\n let offset = this.offset_;\n\n if (this.offsetOrigin_ != 'top-left') {\n const size = this.getSize();\n const iconImageSize = this.iconImage_.getSize();\n if (!size || !iconImageSize) {\n return null;\n }\n offset = offset.slice();\n if (\n this.offsetOrigin_ == 'top-right' ||\n this.offsetOrigin_ == 'bottom-right'\n ) {\n offset[0] = iconImageSize[0] - size[0] - offset[0];\n }\n if (\n this.offsetOrigin_ == 'bottom-left' ||\n this.offsetOrigin_ == 'bottom-right'\n ) {\n offset[1] = iconImageSize[1] - size[1] - offset[1];\n }\n }\n this.origin_ = offset;\n return this.origin_;\n }\n\n /**\n * Get the image URL.\n * @return {string|undefined} Image src.\n * @api\n */\n getSrc() {\n return this.iconImage_.getSrc();\n }\n\n /**\n * Get the size of the icon (in pixels).\n * @return {import(\"../size.js\").Size} Image size.\n * @api\n */\n getSize() {\n return !this.size_ ? this.iconImage_.getSize() : this.size_;\n }\n\n /**\n * Get the width of the icon (in pixels). Will return undefined when the icon image is not yet loaded.\n * @return {number} Icon width (in pixels).\n * @api\n */\n getWidth() {\n const scale = this.getScaleArray();\n if (this.size_) {\n return this.size_[0] * scale[0];\n }\n if (this.iconImage_.getImageState() == ImageState.LOADED) {\n return this.iconImage_.getSize()[0] * scale[0];\n }\n return undefined;\n }\n\n /**\n * Get the height of the icon (in pixels). Will return undefined when the icon image is not yet loaded.\n * @return {number} Icon height (in pixels).\n * @api\n */\n getHeight() {\n const scale = this.getScaleArray();\n if (this.size_) {\n return this.size_[1] * scale[1];\n }\n if (this.iconImage_.getImageState() == ImageState.LOADED) {\n return this.iconImage_.getSize()[1] * scale[1];\n }\n return undefined;\n }\n\n /**\n * Set the scale.\n *\n * @param {number|import(\"../size.js\").Size} scale Scale.\n * @api\n */\n setScale(scale) {\n delete this.initialOptions_;\n super.setScale(scale);\n }\n\n /**\n * @param {function(import(\"../events/Event.js\").default): void} listener Listener function.\n */\n listenImageChange(listener) {\n this.iconImage_.addEventListener(EventType.CHANGE, listener);\n }\n\n /**\n * Load not yet loaded URI.\n * When rendering a feature with an icon style, the vector renderer will\n * automatically call this method. However, you might want to call this\n * method yourself for preloading or other purposes.\n * @api\n */\n load() {\n this.iconImage_.load();\n }\n\n /**\n * @param {function(import(\"../events/Event.js\").default): void} listener Listener function.\n */\n unlistenImageChange(listener) {\n this.iconImage_.removeEventListener(EventType.CHANGE, listener);\n }\n}\n\nexport default Icon;\n","/**\n * @module ol/style/Text\n */\nimport Fill from './Fill.js';\nimport {toSize} from '../size.js';\n\n/**\n * @typedef {'point' | 'line'} TextPlacement\n * Default text placement is `'point'`. Note that\n * `'line'` requires the underlying geometry to be a {@link module:ol/geom/LineString~LineString},\n * {@link module:ol/geom/Polygon~Polygon}, {@link module:ol/geom/MultiLineString~MultiLineString} or\n * {@link module:ol/geom/MultiPolygon~MultiPolygon}.\n */\n\n/**\n * @typedef {'left' | 'center' | 'right'} TextJustify\n */\n\n/**\n * The default fill color to use if no fill was set at construction time; a\n * blackish `#333`.\n *\n * @const {string}\n */\nconst DEFAULT_FILL_COLOR = '#333';\n\n/**\n * @typedef {Object} Options\n * @property {string} [font] Font style as CSS `font` value, see:\n * https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/font. Default is `'10px sans-serif'`\n * @property {number} [maxAngle=Math.PI/4] When `placement` is set to `'line'`, allow a maximum angle between adjacent characters.\n * The expected value is in radians, and the default is 45° (`Math.PI / 4`).\n * @property {number} [offsetX=0] Horizontal text offset in pixels. A positive will shift the text right.\n * @property {number} [offsetY=0] Vertical text offset in pixels. A positive will shift the text down.\n * @property {boolean} [overflow=false] For polygon labels or when `placement` is set to `'line'`, allow text to exceed\n * the width of the polygon at the label position or the length of the path that it follows.\n * @property {TextPlacement} [placement='point'] Text placement.\n * @property {number} [repeat] Repeat interval. When set, the text will be repeated at this interval, which specifies\n * the distance between two text anchors in pixels. Only available when `placement` is set to `'line'`. Overrides 'textAlign'.\n * @property {number|import(\"../size.js\").Size} [scale] Scale.\n * @property {boolean} [rotateWithView=false] Whether to rotate the text with the view.\n * @property {number} [rotation=0] Rotation in radians (positive rotation clockwise).\n * @property {string|Array<string>} [text] Text content or rich text content. For plain text provide a string, which can\n * contain line breaks (`\\n`). For rich text provide an array of text/font tuples. A tuple consists of the text to\n * render and the font to use (or `''` to use the text style's font). A line break has to be a separate tuple (i.e. `'\\n', ''`).\n * **Example:** `['foo', 'bold 10px sans-serif', ' bar', 'italic 10px sans-serif', ' baz', '']` will yield \"**foo** *bar* baz\".\n * **Note:** Rich text is not supported for the immediate rendering API.\n * @property {CanvasTextAlign} [textAlign] Text alignment. Possible values: `'left'`, `'right'`, `'center'`, `'end'` or `'start'`.\n * Default is `'center'` for `placement: 'point'`. For `placement: 'line'`, the default is to let the renderer choose a\n * placement where `maxAngle` is not exceeded.\n * @property {TextJustify} [justify] Text justification within the text box.\n * If not set, text is justified towards the `textAlign` anchor.\n * Otherwise, use options `'left'`, `'center'`, or `'right'` to justify the text within the text box.\n * **Note:** `justify` is ignored for immediate rendering and also for `placement: 'line'`.\n * @property {CanvasTextBaseline} [textBaseline='middle'] Text base line. Possible values: `'bottom'`, `'top'`, `'middle'`, `'alphabetic'`,\n * `'hanging'`, `'ideographic'`.\n * @property {import(\"./Fill.js\").default} [fill] Fill style. If none is provided, we'll use a dark fill-style (#333).\n * @property {import(\"./Stroke.js\").default} [stroke] Stroke style.\n * @property {import(\"./Fill.js\").default} [backgroundFill] Fill style for the text background when `placement` is\n * `'point'`. Default is no fill.\n * @property {import(\"./Stroke.js\").default} [backgroundStroke] Stroke style for the text background when `placement`\n * is `'point'`. Default is no stroke.\n * @property {Array<number>} [padding=[0, 0, 0, 0]] Padding in pixels around the text for decluttering and background. The order of\n * values in the array is `[top, right, bottom, left]`.\n */\n\n/**\n * @classdesc\n * Set text style for vector features.\n * @api\n */\nclass Text {\n /**\n * @param {Options} [options] Options.\n */\n constructor(options) {\n options = options || {};\n\n /**\n * @private\n * @type {string|undefined}\n */\n this.font_ = options.font;\n\n /**\n * @private\n * @type {number|undefined}\n */\n this.rotation_ = options.rotation;\n\n /**\n * @private\n * @type {boolean|undefined}\n */\n this.rotateWithView_ = options.rotateWithView;\n\n /**\n * @private\n * @type {number|import(\"../size.js\").Size|undefined}\n */\n this.scale_ = options.scale;\n\n /**\n * @private\n * @type {import(\"../size.js\").Size}\n */\n this.scaleArray_ = toSize(options.scale !== undefined ? options.scale : 1);\n\n /**\n * @private\n * @type {string|Array<string>|undefined}\n */\n this.text_ = options.text;\n\n /**\n * @private\n * @type {CanvasTextAlign|undefined}\n */\n this.textAlign_ = options.textAlign;\n\n /**\n * @private\n * @type {TextJustify|undefined}\n */\n this.justify_ = options.justify;\n\n /**\n * @private\n * @type {number|undefined}\n */\n this.repeat_ = options.repeat;\n\n /**\n * @private\n * @type {CanvasTextBaseline|undefined}\n */\n this.textBaseline_ = options.textBaseline;\n\n /**\n * @private\n * @type {import(\"./Fill.js\").default}\n */\n this.fill_ =\n options.fill !== undefined\n ? options.fill\n : new Fill({color: DEFAULT_FILL_COLOR});\n\n /**\n * @private\n * @type {number}\n */\n this.maxAngle_ =\n options.maxAngle !== undefined ? options.maxAngle : Math.PI / 4;\n\n /**\n * @private\n * @type {TextPlacement}\n */\n this.placement_ =\n options.placement !== undefined ? options.placement : 'point';\n\n /**\n * @private\n * @type {boolean}\n */\n this.overflow_ = !!options.overflow;\n\n /**\n * @private\n * @type {import(\"./Stroke.js\").default}\n */\n this.stroke_ = options.stroke !== undefined ? options.stroke : null;\n\n /**\n * @private\n * @type {number}\n */\n this.offsetX_ = options.offsetX !== undefined ? options.offsetX : 0;\n\n /**\n * @private\n * @type {number}\n */\n this.offsetY_ = options.offsetY !== undefined ? options.offsetY : 0;\n\n /**\n * @private\n * @type {import(\"./Fill.js\").default}\n */\n this.backgroundFill_ = options.backgroundFill\n ? options.backgroundFill\n : null;\n\n /**\n * @private\n * @type {import(\"./Stroke.js\").default}\n */\n this.backgroundStroke_ = options.backgroundStroke\n ? options.backgroundStroke\n : null;\n\n /**\n * @private\n * @type {Array<number>|null}\n */\n this.padding_ = options.padding === undefined ? null : options.padding;\n }\n\n /**\n * Clones the style.\n * @return {Text} The cloned style.\n * @api\n */\n clone() {\n const scale = this.getScale();\n return new Text({\n font: this.getFont(),\n placement: this.getPlacement(),\n repeat: this.getRepeat(),\n maxAngle: this.getMaxAngle(),\n overflow: this.getOverflow(),\n rotation: this.getRotation(),\n rotateWithView: this.getRotateWithView(),\n scale: Array.isArray(scale) ? scale.slice() : scale,\n text: this.getText(),\n textAlign: this.getTextAlign(),\n justify: this.getJustify(),\n textBaseline: this.getTextBaseline(),\n fill: this.getFill() ? this.getFill().clone() : undefined,\n stroke: this.getStroke() ? this.getStroke().clone() : undefined,\n offsetX: this.getOffsetX(),\n offsetY: this.getOffsetY(),\n backgroundFill: this.getBackgroundFill()\n ? this.getBackgroundFill().clone()\n : undefined,\n backgroundStroke: this.getBackgroundStroke()\n ? this.getBackgroundStroke().clone()\n : undefined,\n padding: this.getPadding() || undefined,\n });\n }\n\n /**\n * Get the `overflow` configuration.\n * @return {boolean} Let text overflow the length of the path they follow.\n * @api\n */\n getOverflow() {\n return this.overflow_;\n }\n\n /**\n * Get the font name.\n * @return {string|undefined} Font.\n * @api\n */\n getFont() {\n return this.font_;\n }\n\n /**\n * Get the maximum angle between adjacent characters.\n * @return {number} Angle in radians.\n * @api\n */\n getMaxAngle() {\n return this.maxAngle_;\n }\n\n /**\n * Get the label placement.\n * @return {TextPlacement} Text placement.\n * @api\n */\n getPlacement() {\n return this.placement_;\n }\n\n /**\n * Get the repeat interval of the text.\n * @return {number|undefined} Repeat interval in pixels.\n * @api\n */\n getRepeat() {\n return this.repeat_;\n }\n\n /**\n * Get the x-offset for the text.\n * @return {number} Horizontal text offset.\n * @api\n */\n getOffsetX() {\n return this.offsetX_;\n }\n\n /**\n * Get the y-offset for the text.\n * @return {number} Vertical text offset.\n * @api\n */\n getOffsetY() {\n return this.offsetY_;\n }\n\n /**\n * Get the fill style for the text.\n * @return {import(\"./Fill.js\").default} Fill style.\n * @api\n */\n getFill() {\n return this.fill_;\n }\n\n /**\n * Determine whether the text rotates with the map.\n * @return {boolean|undefined} Rotate with map.\n * @api\n */\n getRotateWithView() {\n return this.rotateWithView_;\n }\n\n /**\n * Get the text rotation.\n * @return {number|undefined} Rotation.\n * @api\n */\n getRotation() {\n return this.rotation_;\n }\n\n /**\n * Get the text scale.\n * @return {number|import(\"../size.js\").Size|undefined} Scale.\n * @api\n */\n getScale() {\n return this.scale_;\n }\n\n /**\n * Get the symbolizer scale array.\n * @return {import(\"../size.js\").Size} Scale array.\n */\n getScaleArray() {\n return this.scaleArray_;\n }\n\n /**\n * Get the stroke style for the text.\n * @return {import(\"./Stroke.js\").default} Stroke style.\n * @api\n */\n getStroke() {\n return this.stroke_;\n }\n\n /**\n * Get the text to be rendered.\n * @return {string|Array<string>|undefined} Text.\n * @api\n */\n getText() {\n return this.text_;\n }\n\n /**\n * Get the text alignment.\n * @return {CanvasTextAlign|undefined} Text align.\n * @api\n */\n getTextAlign() {\n return this.textAlign_;\n }\n\n /**\n * Get the justification.\n * @return {TextJustify|undefined} Justification.\n * @api\n */\n getJustify() {\n return this.justify_;\n }\n\n /**\n * Get the text baseline.\n * @return {CanvasTextBaseline|undefined} Text baseline.\n * @api\n */\n getTextBaseline() {\n return this.textBaseline_;\n }\n\n /**\n * Get the background fill style for the text.\n * @return {import(\"./Fill.js\").default} Fill style.\n * @api\n */\n getBackgroundFill() {\n return this.backgroundFill_;\n }\n\n /**\n * Get the background stroke style for the text.\n * @return {import(\"./Stroke.js\").default} Stroke style.\n * @api\n */\n getBackgroundStroke() {\n return this.backgroundStroke_;\n }\n\n /**\n * Get the padding for the text.\n * @return {Array<number>|null} Padding.\n * @api\n */\n getPadding() {\n return this.padding_;\n }\n\n /**\n * Set the `overflow` property.\n *\n * @param {boolean} overflow Let text overflow the path that it follows.\n * @api\n */\n setOverflow(overflow) {\n this.overflow_ = overflow;\n }\n\n /**\n * Set the font.\n *\n * @param {string|undefined} font Font.\n * @api\n */\n setFont(font) {\n this.font_ = font;\n }\n\n /**\n * Set the maximum angle between adjacent characters.\n *\n * @param {number} maxAngle Angle in radians.\n * @api\n */\n setMaxAngle(maxAngle) {\n this.maxAngle_ = maxAngle;\n }\n\n /**\n * Set the x offset.\n *\n * @param {number} offsetX Horizontal text offset.\n * @api\n */\n setOffsetX(offsetX) {\n this.offsetX_ = offsetX;\n }\n\n /**\n * Set the y offset.\n *\n * @param {number} offsetY Vertical text offset.\n * @api\n */\n setOffsetY(offsetY) {\n this.offsetY_ = offsetY;\n }\n\n /**\n * Set the text placement.\n *\n * @param {TextPlacement} placement Placement.\n * @api\n */\n setPlacement(placement) {\n this.placement_ = placement;\n }\n\n /**\n * Set the repeat interval of the text.\n * @param {number|undefined} [repeat] Repeat interval in pixels.\n * @api\n */\n setRepeat(repeat) {\n this.repeat_ = repeat;\n }\n\n /**\n * Set whether to rotate the text with the view.\n *\n * @param {boolean} rotateWithView Rotate with map.\n * @api\n */\n setRotateWithView(rotateWithView) {\n this.rotateWithView_ = rotateWithView;\n }\n\n /**\n * Set the fill.\n *\n * @param {import(\"./Fill.js\").default} fill Fill style.\n * @api\n */\n setFill(fill) {\n this.fill_ = fill;\n }\n\n /**\n * Set the rotation.\n *\n * @param {number|undefined} rotation Rotation.\n * @api\n */\n setRotation(rotation) {\n this.rotation_ = rotation;\n }\n\n /**\n * Set the scale.\n *\n * @param {number|import(\"../size.js\").Size|undefined} scale Scale.\n * @api\n */\n setScale(scale) {\n this.scale_ = scale;\n this.scaleArray_ = toSize(scale !== undefined ? scale : 1);\n }\n\n /**\n * Set the stroke.\n *\n * @param {import(\"./Stroke.js\").default} stroke Stroke style.\n * @api\n */\n setStroke(stroke) {\n this.stroke_ = stroke;\n }\n\n /**\n * Set the text.\n *\n * @param {string|Array<string>|undefined} text Text.\n * @api\n */\n setText(text) {\n this.text_ = text;\n }\n\n /**\n * Set the text alignment.\n *\n * @param {CanvasTextAlign|undefined} textAlign Text align.\n * @api\n */\n setTextAlign(textAlign) {\n this.textAlign_ = textAlign;\n }\n\n /**\n * Set the justification.\n *\n * @param {TextJustify|undefined} justify Justification.\n * @api\n */\n setJustify(justify) {\n this.justify_ = justify;\n }\n\n /**\n * Set the text baseline.\n *\n * @param {CanvasTextBaseline|undefined} textBaseline Text baseline.\n * @api\n */\n setTextBaseline(textBaseline) {\n this.textBaseline_ = textBaseline;\n }\n\n /**\n * Set the background fill.\n *\n * @param {import(\"./Fill.js\").default} fill Fill style.\n * @api\n */\n setBackgroundFill(fill) {\n this.backgroundFill_ = fill;\n }\n\n /**\n * Set the background stroke.\n *\n * @param {import(\"./Stroke.js\").default} stroke Stroke style.\n * @api\n */\n setBackgroundStroke(stroke) {\n this.backgroundStroke_ = stroke;\n }\n\n /**\n * Set the padding (`[top, right, bottom, left]`).\n *\n * @param {Array<number>|null} padding Padding.\n * @api\n */\n setPadding(padding) {\n this.padding_ = padding;\n }\n}\n\nexport default Text;\n","/**\n * @module ol/style/flat\n */\n\nimport Circle from '../style/Circle.js';\nimport Fill from './Fill.js';\nimport Icon from './Icon.js';\nimport RegularShape from './RegularShape.js';\nimport Stroke from './Stroke.js';\nimport Style from './Style.js';\nimport Text from './Text.js';\n\n/**\n * For static styling, the [layer.setStyle()]{@link module:ol/layer/Vector~VectorLayer#setStyle} method\n * can be called with an object literal that has fill, stroke, text, icon, regular shape, and/or circle properties.\n * @api\n *\n * @typedef {FlatFill & FlatStroke & FlatText & FlatIcon & FlatShape & FlatCircle} FlatStyle\n */\n\n/**\n * A flat style literal or an array of the same.\n *\n * @typedef {FlatStyle|Array<FlatStyle>} FlatStyleLike\n */\n\n/**\n * Fill style properties applied to polygon features.\n *\n * @typedef {Object} FlatFill\n * @property {import(\"../color.js\").Color|import(\"../colorlike.js\").ColorLike} [fill-color] The fill color.\n */\n\n/**\n * Stroke style properties applied to line strings and polygon boundaries. To apply a stroke, at least one of\n * `stroke-color` or `stroke-width` must be provided.\n *\n * @typedef {Object} FlatStroke\n * @property {import(\"../color.js\").Color|import(\"../colorlike.js\").ColorLike} [stroke-color] The stroke color.\n * @property {number} [stroke-width] Stroke pixel width.\n * @property {CanvasLineCap} [stroke-line-cap='round'] Line cap style: `butt`, `round`, or `square`.\n * @property {CanvasLineJoin} [stroke-line-join='round'] Line join style: `bevel`, `round`, or `miter`.\n * @property {Array<number>} [stroke-line-dash] Line dash pattern.\n * @property {number} [stroke-line-dash-offset=0] Line dash offset.\n * @property {number} [stroke-miter-limit=10] Miter limit.\n */\n\n/**\n * Label style properties applied to all features. At a minimum, a `text-value` must be provided.\n *\n * @typedef {Object} FlatText\n * @property {string|Array<string>} [text-value] Text content or rich text content. For plain text provide a string, which can\n * contain line breaks (`\\n`). For rich text provide an array of text/font tuples. A tuple consists of the text to\n * render and the font to use (or `''` to use the text style's font). A line break has to be a separate tuple (i.e. `'\\n', ''`).\n * **Example:** `['foo', 'bold 10px sans-serif', ' bar', 'italic 10px sans-serif', ' baz', '']` will yield \"**foo** *bar* baz\".\n * **Note:** Rich text is not supported for the immediate rendering API.\n * @property {string} [text-font] Font style as CSS `font` value, see:\n * https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/font. Default is `'10px sans-serif'`\n * @property {number} [text-max-angle=Math.PI/4] When `text-placement` is set to `'line'`, allow a maximum angle between adjacent characters.\n * The expected value is in radians, and the default is 45° (`Math.PI / 4`).\n * @property {number} [text-offset-x=0] Horizontal text offset in pixels. A positive will shift the text right.\n * @property {number} [text-offset-y=0] Vertical text offset in pixels. A positive will shift the text down.\n * @property {boolean} [text-overflow=false] For polygon labels or when `placement` is set to `'line'`, allow text to exceed\n * the width of the polygon at the label position or the length of the path that it follows.\n * @property {import(\"./Text.js\").TextPlacement} [text-placement='point'] Text placement.\n * @property {number} [text-repeat] Repeat interval in pixels. When set, the text will be repeated at this interval. Only available when\n * `text-placement` is set to `'line'`. Overrides `text-align`.\n * @property {number|import(\"../size.js\").Size} [text-scale] Scale.\n * @property {boolean} [text-rotate-with-view=false] Whether to rotate the text with the view.\n * @property {number} [text-rotation=0] Rotation in radians (positive rotation clockwise).\n * @property {CanvasTextAlign} [text-align] Text alignment. Possible values: `'left'`, `'right'`, `'center'`, `'end'` or `'start'`.\n * Default is `'center'` for `text-placement: 'point'`. For `text-placement: 'line'`, the default is to let the renderer choose a\n * placement where `text-max-angle` is not exceeded.\n * @property {import('./Text.js').TextJustify} [text-justify] Text justification within the text box.\n * If not set, text is justified towards the `textAlign` anchor.\n * Otherwise, use options `'left'`, `'center'`, or `'right'` to justify the text within the text box.\n * **Note:** `text-justify` is ignored for immediate rendering and also for `text-placement: 'line'`.\n * @property {CanvasTextBaseline} [text-baseline='middle'] Text base line. Possible values: `'bottom'`, `'top'`, `'middle'`, `'alphabetic'`,\n * `'hanging'`, `'ideographic'`.\n * @property {Array<number>} [text-padding=[0, 0, 0, 0]] Padding in pixels around the text for decluttering and background. The order of\n * values in the array is `[top, right, bottom, left]`.\n * @property {import(\"../color.js\").Color|import(\"../colorlike.js\").ColorLike} [text-fill-color] The fill color.\n * @property {import(\"../color.js\").Color|import(\"../colorlike.js\").ColorLike} [text-background-fill-color] The fill color.\n * @property {import(\"../color.js\").Color|import(\"../colorlike.js\").ColorLike} [text-stroke-color] The stroke color.\n * @property {CanvasLineCap} [text-stroke-line-cap='round'] Line cap style: `butt`, `round`, or `square`.\n * @property {CanvasLineJoin} [text-stroke-line-join='round'] Line join style: `bevel`, `round`, or `miter`.\n * @property {Array<number>} [text-stroke-line-dash] Line dash pattern.\n * @property {number} [text-stroke-line-dash-offset=0] Line dash offset.\n * @property {number} [text-stroke-miter-limit=10] Miter limit.\n * @property {number} [text-stroke-width] Stroke pixel width.\n * @property {import(\"../color.js\").Color|import(\"../colorlike.js\").ColorLike} [text-background-stroke-color] The stroke color.\n * @property {CanvasLineCap} [text-background-stroke-line-cap='round'] Line cap style: `butt`, `round`, or `square`.\n * @property {CanvasLineJoin} [text-background-stroke-line-join='round'] Line join style: `bevel`, `round`, or `miter`.\n * @property {Array<number>} [text-background-stroke-line-dash] Line dash pattern.\n * @property {number} [text-background-stroke-line-dash-offset=0] Line dash offset.\n * @property {number} [text-background-stroke-miter-limit=10] Miter limit.\n * @property {number} [text-background-stroke-width] Stroke pixel width.\n */\n\n/**\n * Icon style properties applied to point features. One of `icon-src` or `icon-img` must be provided to render\n * points with an icon.\n *\n * @typedef {Object} FlatIcon\n * @property {string} [icon-src] Image source URI.\n * @property {HTMLImageElement|HTMLCanvasElement} [icon-img] Image object for the icon. If the `icon-src` option is not provided then the\n * provided image must already be loaded. And in that case, it is required\n * to provide the size of the image, with the `icon-img-size` option.\n * @property {import(\"../size.js\").Size} [icon-img-size] Image size in pixels. Only required if `icon-img` is set and `icon-src` is not.\n * The provided size needs to match the actual size of the image.\n * @property {Array<number>} [icon-anchor=[0.5, 0.5]] Anchor. Default value is the icon center.\n * @property {import(\"./Icon.js\").IconOrigin} [icon-anchor-origin='top-left'] Origin of the anchor: `bottom-left`, `bottom-right`,\n * `top-left` or `top-right`.\n * @property {import(\"./Icon.js\").IconAnchorUnits} [icon-anchor-x-units='fraction'] Units in which the anchor x value is\n * specified. A value of `'fraction'` indicates the x value is a fraction of the icon. A value of `'pixels'` indicates\n * the x value in pixels.\n * @property {import(\"./Icon.js\").IconAnchorUnits} [icon-anchor-y-units='fraction'] Units in which the anchor y value is\n * specified. A value of `'fraction'` indicates the y value is a fraction of the icon. A value of `'pixels'` indicates\n * the y value in pixels.\n * @property {import(\"../color.js\").Color|string} [icon-color] Color to tint the icon. If not specified,\n * the icon will be left as is.\n * @property {null|string} [icon-cross-origin] The `crossOrigin` attribute for loaded images. Note that you must provide a\n * `icon-cross-origin` value if you want to access pixel data with the Canvas renderer.\n * See https://developer.mozilla.org/en-US/docs/Web/HTML/CORS_enabled_image for more detail.\n * @property {Array<number>} [icon-offset=[0, 0]] Offset, which, together with the size and the offset origin, define the\n * sub-rectangle to use from the original icon image.\n * @property {Array<number>} [icon-displacement=[0,0]] Displacement of the icon.\n * @property {import(\"./Icon.js\").IconOrigin} [icon-offset-origin='top-left'] Origin of the offset: `bottom-left`, `bottom-right`,\n * `top-left` or `top-right`.\n * @property {number} [icon-opacity=1] Opacity of the icon.\n * @property {number|import(\"../size.js\").Size} [icon-scale=1] Scale.\n * @property {number} [icon-width] Width of the icon. If not specified, the actual image width will be used. Cannot be combined\n * with `scale`.\n * @property {number} [icon-height] Height of the icon. If not specified, the actual image height will be used. Cannot be combined\n * with `scale`.\n * @property {number} [icon-rotation=0] Rotation in radians (positive rotation clockwise).\n * @property {boolean} [icon-rotate-with-view=false] Whether to rotate the icon with the view.\n * @property {import(\"../size.js\").Size} [icon-size] Icon size in pixel. Can be used together with `icon-offset` to define the\n * sub-rectangle to use from the origin (sprite) icon image.\n * @property {\"declutter\"|\"obstacle\"|\"none\"|undefined} [icon-declutter-mode] Declutter mode\n */\n\n/**\n * Regular shape style properties for rendering point features. At least `shape-points` must be provided.\n *\n * @typedef {Object} FlatShape\n * @property {number} [shape-points] Number of points for stars and regular polygons. In case of a polygon, the number of points\n * is the number of sides.\n * @property {import(\"../color.js\").Color|import(\"../colorlike.js\").ColorLike} [shape-fill-color] The fill color.\n * @property {import(\"../color.js\").Color|import(\"../colorlike.js\").ColorLike} [shape-stroke-color] The stroke color.\n * @property {number} [shape-stroke-width] Stroke pixel width.\n * @property {CanvasLineCap} [shape-stroke-line-cap='round'] Line cap style: `butt`, `round`, or `square`.\n * @property {CanvasLineJoin} [shape-stroke-line-join='round'] Line join style: `bevel`, `round`, or `miter`.\n * @property {Array<number>} [shape-stroke-line-dash] Line dash pattern.\n * @property {number} [shape-stroke-line-dash-offset=0] Line dash offset.\n * @property {number} [shape-stroke-miter-limit=10] Miter limit.\n * @property {number} [shape-radius] Radius of a regular polygon.\n * @property {number} [shape-radius1] First radius of a star. Ignored if radius is set.\n * @property {number} [shape-radius2] Second radius of a star.\n * @property {number} [shape-angle=0] Shape's angle in radians. A value of 0 will have one of the shape's point facing up.\n * @property {Array<number>} [shape-displacement=[0,0]] Displacement of the shape\n * @property {number} [shape-rotation=0] Rotation in radians (positive rotation clockwise).\n * @property {boolean} [shape-rotate-with-view=false] Whether to rotate the shape with the view.\n * @property {number|import(\"../size.js\").Size} [shape-scale=1] Scale. Unless two dimensional scaling is required a better\n * result may be obtained with appropriate settings for `shape-radius`, `shape-radius1` and `shape-radius2`.\n * @property {\"declutter\"|\"obstacle\"|\"none\"|undefined} [shape-declutter-mode] Declutter mode.\n */\n\n/**\n * Circle style properties for rendering point features. At least `circle-radius` must be provided.\n *\n * @typedef {Object} FlatCircle\n * @property {number} [circle-radius] Circle radius.\n * @property {import(\"../color.js\").Color|import(\"../colorlike.js\").ColorLike} [circle-fill-color] The fill color.\n * @property {import(\"../color.js\").Color|import(\"../colorlike.js\").ColorLike} [circle-stroke-color] The stroke color.\n * @property {number} [circle-stroke-width] Stroke pixel width.\n * @property {CanvasLineCap} [circle-stroke-line-cap='round'] Line cap style: `butt`, `round`, or `square`.\n * @property {CanvasLineJoin} [circle-stroke-line-join='round'] Line join style: `bevel`, `round`, or `miter`.\n * @property {Array<number>} [circle-stroke-line-dash] Line dash pattern.\n * @property {number} [circle-stroke-line-dash-offset=0] Line dash offset.\n * @property {number} [circle-stroke-miter-limit=10] Miter limit.\n * @property {Array<number>} [circle-displacement=[0,0]] displacement\n * @property {number|import(\"../size.js\").Size} [circle-scale=1] Scale. A two dimensional scale will produce an ellipse.\n * Unless two dimensional scaling is required a better result may be obtained with an appropriate setting for `circle-radius`.\n * @property {number} [circle-rotation=0] Rotation in radians\n * (positive rotation clockwise, meaningful only when used in conjunction with a two dimensional scale).\n * @property {boolean} [circle-rotate-with-view=false] Whether to rotate the shape with the view\n * (meaningful only when used in conjunction with a two dimensional scale).\n * @property {\"declutter\"|\"obstacle\"|\"none\"|undefined} [circle-declutter-mode] Declutter mode\n */\n\n/**\n * @param {FlatStyle} flatStyle A flat style literal.\n * @return {import(\"./Style.js\").default} A style instance.\n */\nexport function toStyle(flatStyle) {\n const style = new Style({\n fill: getFill(flatStyle, ''),\n stroke: getStroke(flatStyle, ''),\n text: getText(flatStyle),\n image: getImage(flatStyle),\n });\n\n return style;\n}\n\n/**\n * @param {FlatStyle} flatStyle The flat style.\n * @param {string} prefix The property prefix.\n * @return {Fill|undefined} The fill (if any).\n */\nfunction getFill(flatStyle, prefix) {\n const color = flatStyle[prefix + 'fill-color'];\n if (!color) {\n return;\n }\n\n return new Fill({color: color});\n}\n\n/**\n * @param {FlatStyle} flatStyle The flat style.\n * @param {string} prefix The property prefix.\n * @return {Stroke|undefined} The stroke (if any).\n */\nfunction getStroke(flatStyle, prefix) {\n const width = flatStyle[prefix + 'stroke-width'];\n const color = flatStyle[prefix + 'stroke-color'];\n if (!width && !color) {\n return;\n }\n\n return new Stroke({\n width: width,\n color: color,\n lineCap: flatStyle[prefix + 'stroke-line-cap'],\n lineJoin: flatStyle[prefix + 'stroke-line-join'],\n lineDash: flatStyle[prefix + 'stroke-line-dash'],\n lineDashOffset: flatStyle[prefix + 'stroke-line-dash-offset'],\n miterLimit: flatStyle[prefix + 'stroke-miter-limit'],\n });\n}\n\n/**\n * @param {FlatStyle} flatStyle The flat style.\n * @return {Text|undefined} The text (if any).\n */\nfunction getText(flatStyle) {\n const value = flatStyle['text-value'];\n if (!value) {\n return;\n }\n\n const text = new Text({\n text: value,\n font: flatStyle['text-font'],\n maxAngle: flatStyle['text-max-angle'],\n offsetX: flatStyle['text-offset-x'],\n offsetY: flatStyle['text-offset-y'],\n overflow: flatStyle['text-overflow'],\n placement: flatStyle['text-placement'],\n repeat: flatStyle['text-repeat'],\n scale: flatStyle['text-scale'],\n rotateWithView: flatStyle['text-rotate-with-view'],\n rotation: flatStyle['text-rotation'],\n textAlign: flatStyle['text-align'],\n justify: flatStyle['text-justify'],\n textBaseline: flatStyle['text-baseline'],\n padding: flatStyle['text-padding'],\n fill: getFill(flatStyle, 'text-'),\n backgroundFill: getFill(flatStyle, 'text-background-'),\n stroke: getStroke(flatStyle, 'text-'),\n backgroundStroke: getStroke(flatStyle, 'text-background-'),\n });\n\n return text;\n}\n\n/**\n * @param {FlatStyle} flatStyle The flat style.\n * @return {import(\"./Image.js\").default|undefined} The image (if any).\n */\nfunction getImage(flatStyle) {\n const iconSrc = flatStyle['icon-src'];\n const iconImg = flatStyle['icon-img'];\n if (iconSrc || iconImg) {\n const icon = new Icon({\n src: iconSrc,\n img: iconImg,\n imgSize: flatStyle['icon-img-size'],\n anchor: flatStyle['icon-anchor'],\n anchorOrigin: flatStyle['icon-anchor-origin'],\n anchorXUnits: flatStyle['icon-anchor-x-units'],\n anchorYUnits: flatStyle['icon-anchor-y-units'],\n color: flatStyle['icon-color'],\n crossOrigin: flatStyle['icon-cross-origin'],\n offset: flatStyle['icon-offset'],\n displacement: flatStyle['icon-displacement'],\n opacity: flatStyle['icon-opacity'],\n scale: flatStyle['icon-scale'],\n width: flatStyle['icon-width'],\n height: flatStyle['icon-height'],\n rotation: flatStyle['icon-rotation'],\n rotateWithView: flatStyle['icon-rotate-with-view'],\n size: flatStyle['icon-size'],\n declutterMode: flatStyle['icon-declutter-mode'],\n });\n return icon;\n }\n\n const shapePoints = flatStyle['shape-points'];\n if (shapePoints) {\n const prefix = 'shape-';\n const shape = new RegularShape({\n points: shapePoints,\n fill: getFill(flatStyle, prefix),\n stroke: getStroke(flatStyle, prefix),\n radius: flatStyle['shape-radius'],\n radius1: flatStyle['shape-radius1'],\n radius2: flatStyle['shape-radius2'],\n angle: flatStyle['shape-angle'],\n displacement: flatStyle['shape-displacement'],\n rotation: flatStyle['shape-rotation'],\n rotateWithView: flatStyle['shape-rotate-with-view'],\n scale: flatStyle['shape-scale'],\n declutterMode: flatStyle['shape-declutter-mode'],\n });\n\n return shape;\n }\n\n const circleRadius = flatStyle['circle-radius'];\n if (circleRadius) {\n const prefix = 'circle-';\n const circle = new Circle({\n radius: circleRadius,\n fill: getFill(flatStyle, prefix),\n stroke: getStroke(flatStyle, prefix),\n displacement: flatStyle['circle-displacement'],\n scale: flatStyle['circle-scale'],\n rotation: flatStyle['circle-rotation'],\n rotateWithView: flatStyle['circle-rotate-with-view'],\n declutterMode: flatStyle['circle-declutter-mode'],\n });\n\n return circle;\n }\n\n return;\n}\n","/**\n * @module ol/layer/BaseVector\n */\nimport Layer from './Layer.js';\nimport RBush from 'rbush';\nimport Style, {\n createDefaultStyle,\n toFunction as toStyleFunction,\n} from '../style/Style.js';\nimport {toStyle} from '../style/flat.js';\n\n/**\n * @template {import(\"../source/Vector.js\").default|import(\"../source/VectorTile.js\").default} VectorSourceType\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} [declutter=false] Declutter images and text. Decluttering is applied to all\n * image and text styles of all Vector and VectorTile layers that have set this to `true`. The priority\n * is defined by the z-index of the layer, the `zIndex` of the style and the render order of features.\n * Higher z-index means higher priority. Within the same z-index, a feature rendered before another has\n * higher priority.\n *\n * As an optimization decluttered features from layers with the same `className` are rendered above\n * the fill and stroke styles of all of those layers regardless of z-index. To opt out of this\n * behavior and place declutterd features with their own layer configure the layer with a `className`\n * other than `ol-layer`.\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<string, *>} [properties] Arbitrary observable properties. Can be accessed with `#get()` and `#set()`.\n */\n\n/**\n * @enum {string}\n * @private\n */\nconst Property = {\n RENDER_ORDER: 'renderOrder',\n};\n\n/**\n * @classdesc\n * Vector data that is rendered client-side.\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|import(\"../source/VectorTile.js\").default} VectorSourceType\n * @template {import(\"../renderer/canvas/VectorLayer.js\").default|import(\"../renderer/canvas/VectorTileLayer.js\").default|import(\"../renderer/canvas/VectorImageLayer.js\").default|import(\"../renderer/webgl/PointsLayer.js\").default} RendererType\n * @extends {Layer<VectorSourceType, RendererType>}\n * @api\n */\nclass BaseVectorLayer extends Layer {\n /**\n * @param {Options<VectorSourceType>} [options] Options.\n */\n constructor(options) {\n options = options ? options : {};\n\n const baseOptions = Object.assign({}, options);\n\n delete baseOptions.style;\n delete baseOptions.renderBuffer;\n delete baseOptions.updateWhileAnimating;\n delete baseOptions.updateWhileInteracting;\n super(baseOptions);\n\n /**\n * @private\n * @type {boolean}\n */\n this.declutter_ =\n options.declutter !== undefined ? options.declutter : false;\n\n /**\n * @type {number}\n * @private\n */\n this.renderBuffer_ =\n options.renderBuffer !== undefined ? options.renderBuffer : 100;\n\n /**\n * User provided style.\n * @type {import(\"../style/Style.js\").StyleLike}\n * @private\n */\n this.style_ = null;\n\n /**\n * Style function for use within the library.\n * @type {import(\"../style/Style.js\").StyleFunction|undefined}\n * @private\n */\n this.styleFunction_ = undefined;\n\n this.setStyle(options.style);\n\n /**\n * @type {boolean}\n * @private\n */\n this.updateWhileAnimating_ =\n options.updateWhileAnimating !== undefined\n ? options.updateWhileAnimating\n : false;\n\n /**\n * @type {boolean}\n * @private\n */\n this.updateWhileInteracting_ =\n options.updateWhileInteracting !== undefined\n ? options.updateWhileInteracting\n : false;\n }\n\n /**\n * @return {boolean} Declutter.\n */\n getDeclutter() {\n return this.declutter_;\n }\n\n /**\n * Get the topmost feature that intersects the given pixel on the viewport. Returns a promise\n * that resolves with an array of features. The array will either contain the topmost feature\n * when a hit was detected, or it will be empty.\n *\n * The hit detection algorithm used for this method is optimized for performance, but is less\n * accurate than the one used in [map.getFeaturesAtPixel()]{@link import(\"../Map.js\").default#getFeaturesAtPixel}.\n * Text is not considered, and icons are only represented by their bounding box instead of the exact\n * image.\n *\n * @param {import(\"../pixel.js\").Pixel} pixel Pixel.\n * @return {Promise<Array<import(\"../Feature\").FeatureLike>>} Promise that resolves with an array of features.\n * @api\n */\n getFeatures(pixel) {\n return super.getFeatures(pixel);\n }\n\n /**\n * @return {number|undefined} Render buffer.\n */\n getRenderBuffer() {\n return this.renderBuffer_;\n }\n\n /**\n * @return {function(import(\"../Feature.js\").default, import(\"../Feature.js\").default): number|null|undefined} Render\n * order.\n */\n getRenderOrder() {\n return /** @type {import(\"../render.js\").OrderFunction|null|undefined} */ (\n this.get(Property.RENDER_ORDER)\n );\n }\n\n /**\n * Get the style for features. This returns whatever was passed to the `style`\n * option at construction or to the `setStyle` method.\n * @return {import(\"../style/Style.js\").StyleLike|null|undefined} Layer style.\n * @api\n */\n getStyle() {\n return this.style_;\n }\n\n /**\n * Get the style function.\n * @return {import(\"../style/Style.js\").StyleFunction|undefined} Layer style function.\n * @api\n */\n getStyleFunction() {\n return this.styleFunction_;\n }\n\n /**\n * @return {boolean} Whether the rendered layer should be updated while\n * animating.\n */\n getUpdateWhileAnimating() {\n return this.updateWhileAnimating_;\n }\n\n /**\n * @return {boolean} Whether the rendered layer should be updated while\n * interacting.\n */\n getUpdateWhileInteracting() {\n return this.updateWhileInteracting_;\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 (!frameState.declutterTree) {\n frameState.declutterTree = new RBush(9);\n }\n /** @type {*} */ (this.getRenderer()).renderDeclutter(frameState);\n }\n\n /**\n * @param {import(\"../render.js\").OrderFunction|null|undefined} renderOrder\n * Render order.\n */\n setRenderOrder(renderOrder) {\n this.set(Property.RENDER_ORDER, renderOrder);\n }\n\n /**\n * Set the style for features. This can be a single style object, an array\n * of styles, or a function that takes a feature and resolution and returns\n * an array of styles. If set to `null`, the layer has no style (a `null` style),\n * so only features that have their own styles will be rendered in the layer. Call\n * `setStyle()` without arguments to reset to the default style. See\n * [the ol/style/Style module]{@link module:ol/style/Style~Style} for information on the default style.\n *\n * If your layer has a static style, you can use [flat style]{@link module:ol/style/flat~FlatStyle} object\n * literals instead of using the `Style` and symbolizer constructors (`Fill`, `Stroke`, etc.):\n * ```js\n * vectorLayer.setStyle({\n * \"fill-color\": \"yellow\",\n * \"stroke-color\": \"black\",\n * \"stroke-width\": 4\n * })\n * ```\n *\n * @param {import(\"../style/Style.js\").StyleLike|import(\"../style/flat.js\").FlatStyleLike|null} [style] Layer style.\n * @api\n */\n setStyle(style) {\n /**\n * @type {import(\"../style/Style.js\").StyleLike|null}\n */\n let styleLike;\n\n if (style === undefined) {\n styleLike = createDefaultStyle;\n } else if (style === null) {\n styleLike = null;\n } else if (typeof style === 'function') {\n styleLike = style;\n } else if (style instanceof Style) {\n styleLike = style;\n } else if (Array.isArray(style)) {\n const len = style.length;\n\n /**\n * @type {Array<Style>}\n */\n const styles = new Array(len);\n\n for (let i = 0; i < len; ++i) {\n const s = style[i];\n if (s instanceof Style) {\n styles[i] = s;\n } else {\n styles[i] = toStyle(s);\n }\n }\n styleLike = styles;\n } else {\n styleLike = toStyle(style);\n }\n\n this.style_ = styleLike;\n this.styleFunction_ =\n style === null ? undefined : toStyleFunction(this.style_);\n this.changed();\n }\n}\n\nexport default BaseVectorLayer;\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<Instruction>}\n */\nexport const fillInstruction = [Instruction.FILL];\n\n/**\n * @type {Array<Instruction>}\n */\nexport const strokeInstruction = [Instruction.STROKE];\n\n/**\n * @type {Array<Instruction>}\n */\nexport const beginPathInstruction = [Instruction.BEGIN_PATH];\n\n/**\n * @type {Array<Instruction>}\n */\nexport const closePathInstruction = [Instruction.CLOSE_PATH];\n\nexport default Instruction;\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 */\n drawCustom(geometry, feature, renderer, hitDetectionRenderer) {}\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 */\n drawCircle(circleGeometry, feature) {}\n\n /**\n * @param {import(\"../Feature.js\").default} feature Feature.\n * @param {import(\"../style/Style.js\").default} style Style.\n */\n drawFeature(feature, style) {}\n\n /**\n * @param {import(\"../geom/GeometryCollection.js\").default} geometryCollectionGeometry Geometry collection.\n * @param {import(\"../Feature.js\").default} feature Feature.\n */\n drawGeometryCollection(geometryCollectionGeometry, feature) {}\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 */\n drawLineString(lineStringGeometry, feature) {}\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 */\n drawMultiLineString(multiLineStringGeometry, feature) {}\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 */\n drawMultiPoint(multiPointGeometry, feature) {}\n\n /**\n * @param {import(\"../geom/MultiPolygon.js\").default} multiPolygonGeometry MultiPolygon geometry.\n * @param {import(\"../Feature.js\").FeatureLike} feature Feature.\n */\n drawMultiPolygon(multiPolygonGeometry, feature) {}\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 */\n drawPoint(pointGeometry, feature) {}\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 */\n drawPolygon(polygonGeometry, feature) {}\n\n /**\n * @param {import(\"../geom/SimpleGeometry.js\").default|import(\"./Feature.js\").default} geometry Geometry.\n * @param {import(\"../Feature.js\").FeatureLike} feature Feature.\n */\n drawText(geometry, feature) {}\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/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<number>}\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<number>} dashArray Dash array.\n * @return {Array<number>} 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<number>} 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<number>} 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<number>} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {Array<number>} ends Ends.\n * @param {number} stride Stride.\n * @param {Array<number>} 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 */\n drawCustom(geometry, feature, renderer, hitDetectionRenderer) {\n this.beginGeometry(geometry, feature);\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 ]);\n this.hitDetectionInstructions.push([\n CanvasInstruction.CUSTOM,\n builderBegin,\n builderEndss,\n geometry,\n hitDetectionRenderer || renderer,\n inflateMultiCoordinatesArray,\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 ]);\n this.hitDetectionInstructions.push([\n CanvasInstruction.CUSTOM,\n builderBegin,\n builderEnds,\n geometry,\n hitDetectionRenderer || renderer,\n inflateCoordinatesArray,\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 ]);\n this.hitDetectionInstructions.push([\n CanvasInstruction.CUSTOM,\n builderBegin,\n builderEnd,\n geometry,\n hitDetectionRenderer || renderer,\n inflateCoordinates,\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 ]);\n this.hitDetectionInstructions.push([\n CanvasInstruction.CUSTOM,\n builderBegin,\n builderEnd,\n geometry,\n hitDetectionRenderer || renderer,\n inflateCoordinates,\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 ]);\n this.hitDetectionInstructions.push([\n CanvasInstruction.CUSTOM,\n builderBegin,\n builderEnd,\n geometry,\n hitDetectionRenderer || renderer,\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 */\n beginGeometry(geometry, feature) {\n this.beginGeometryInstruction1_ = [\n CanvasInstruction.BEGIN_GEOMETRY,\n feature,\n 0,\n geometry,\n ];\n this.instructions.push(this.beginGeometryInstruction1_);\n this.beginGeometryInstruction2_ = [\n CanvasInstruction.BEGIN_GEOMETRY,\n feature,\n 0,\n geometry,\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 */\n setFillStrokeStyle(fillStyle, strokeStyle) {\n const state = this.state;\n if (fillStyle) {\n const fillStyleColor = fillStyle.getColor();\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 it!\n fillInstruction.push(true);\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';\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 {HTMLCanvasElement|HTMLVideoElement|HTMLImageElement}\n */\n this.hitDetectionImage_ = null;\n\n /**\n * @private\n * @type {HTMLCanvasElement|HTMLVideoElement|HTMLImageElement}\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 {\"declutter\"|\"obstacle\"|\"none\"|undefined}\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 */\n drawPoint(pointGeometry, feature) {\n if (!this.image_) {\n return;\n }\n this.beginGeometry(pointGeometry, feature);\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 this.opacity_,\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 */\n drawMultiPoint(multiPointGeometry, feature) {\n if (!this.image_) {\n return;\n }\n this.beginGeometry(multiPointGeometry, feature);\n const flatCoordinates = multiPointGeometry.getFlatCoordinates();\n const stride = multiPointGeometry.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 this.opacity_,\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 */\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 */\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<number>} 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 */\n drawLineString(lineStringGeometry, feature) {\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);\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 */\n drawMultiLineString(multiLineStringGeometry, feature) {\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);\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 state.lineDash,\n state.lineDashOffset,\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 */\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 */\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 {defaultFillStyle} 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<number>} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {Array<number>} 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 */\n drawCircle(circleGeometry, feature) {\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);\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 state.lineDash,\n state.lineDashOffset,\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 */\n drawPolygon(polygonGeometry, feature) {\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);\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 state.lineDash,\n state.lineDashOffset,\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<number>} */ (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 */\n drawMultiPolygon(multiPolygonGeometry, feature) {\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);\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 state.lineDash,\n state.lineDashOffset,\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 */\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<number>} 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<Array<number>>} 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<number>} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {number} end End.\n * @param {number} stride Stride.\n * @return {Array<number>} 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 * @enum {number}\n */\nexport const TEXT_ALIGN = {\n 'left': 0,\n 'end': 0,\n 'center': 0.5,\n 'right': 1,\n 'start': 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<HTMLCanvasElement>}\n */\n this.labels_ = null;\n\n /**\n * @private\n * @type {string|Array<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|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<string, import(\"../canvas.js\").FillState>}\n */\n this.fillStates = {};\n\n /**\n * @private\n * @type {?import(\"../canvas.js\").StrokeState}\n */\n this.textStrokeState_ = null;\n\n /**\n * @type {!Object<string, import(\"../canvas.js\").StrokeState>}\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<string, import(\"../canvas.js\").TextState>}\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 * 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 */\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 */\n drawText(geometry, feature) {\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.getBufferedMaxExtent(), 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);\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 this.hitDetectionInstructions.push(this.createFill(this.state));\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);\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 undefined,\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 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 undefined,\n this.declutterImageWithText_,\n padding,\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\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 ]);\n this.hitDetectionInstructions.push([\n CanvasInstruction.DRAW_CHARS,\n begin,\n end,\n baseline,\n textState.overflow,\n fillKey,\n textState.maxAngle,\n 1,\n offsetY,\n strokeKey,\n strokeWidth,\n text,\n textKey,\n 1 / pixelRatio,\n ]);\n }\n\n /**\n * @param {import(\"../../style/Text.js\").default} textStyle Text style.\n * @param {Object} [sharedData] Shared data.\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_ = fillState\n ? typeof fillState.fillStyle == 'string'\n ? fillState.fillStyle\n : '|' + getUid(fillState.fillStyle)\n : '';\n }\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<import(\"../canvas.js\").BuilderType, typeof Builder>}\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<string, !Object<import(\"../canvas.js\").BuilderType, Builder>>}\n */\n this.buildersByZIndex_ = {};\n }\n\n /**\n * @return {!Object<string, !Object<import(\"../canvas.js\").BuilderType, import(\"./Builder.js\").SerializableInstructions>>} 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/renderer/Layer\n */\nimport EventType from '../events/EventType.js';\nimport ImageState from '../ImageState.js';\nimport Observable from '../Observable.js';\nimport {abstract} from '../util.js';\n\n/**\n * @template {import(\"../layer/Layer.js\").default} LayerType\n */\nclass LayerRenderer extends Observable {\n /**\n * @param {LayerType} layer Layer.\n */\n constructor(layer) {\n super();\n\n /**\n * The renderer is initialized and ready to render.\n * @type {boolean}\n */\n this.ready = true;\n\n /** @private */\n this.boundHandleImageChange_ = this.handleImageChange_.bind(this);\n\n /**\n * @protected\n * @type {LayerType}\n */\n this.layer_ = layer;\n\n /**\n * @type {import(\"../render/canvas/ExecutorGroup\").default}\n */\n this.declutterExecutorGroup = null;\n }\n\n /**\n * Asynchronous layer level hit detection.\n * @param {import(\"../pixel.js\").Pixel} pixel Pixel.\n * @return {Promise<Array<import(\"../Feature\").FeatureLike>>} Promise that resolves with\n * an array of features.\n */\n getFeatures(pixel) {\n return abstract();\n }\n\n /**\n * @param {import(\"../pixel.js\").Pixel} pixel Pixel.\n * @return {Uint8ClampedArray|Uint8Array|Float32Array|DataView|null} Pixel data.\n */\n getData(pixel) {\n return null;\n }\n\n /**\n * Determine whether render should be called.\n * @abstract\n * @param {import(\"../Map.js\").FrameState} frameState Frame state.\n * @return {boolean} Layer is ready to be rendered.\n */\n prepareFrame(frameState) {\n return abstract();\n }\n\n /**\n * Render the layer.\n * @abstract\n * @param {import(\"../Map.js\").FrameState} frameState Frame state.\n * @param {HTMLElement} target Target that may be used to render content to.\n * @return {HTMLElement} The rendered element.\n */\n renderFrame(frameState, target) {\n return abstract();\n }\n\n /**\n * @param {Object<number, Object<string, import(\"../Tile.js\").default>>} tiles Lookup of loaded tiles by zoom level.\n * @param {number} zoom Zoom level.\n * @param {import(\"../Tile.js\").default} tile Tile.\n * @return {boolean|void} If `false`, the tile will not be considered loaded.\n */\n loadedTileCallback(tiles, zoom, tile) {\n if (!tiles[zoom]) {\n tiles[zoom] = {};\n }\n tiles[zoom][tile.tileCoord.toString()] = tile;\n return undefined;\n }\n\n /**\n * Create a function that adds loaded tiles to the tile lookup.\n * @param {import(\"../source/Tile.js\").default} source Tile source.\n * @param {import(\"../proj/Projection.js\").default} projection Projection of the tiles.\n * @param {Object<number, Object<string, import(\"../Tile.js\").default>>} tiles Lookup of loaded tiles by zoom level.\n * @return {function(number, import(\"../TileRange.js\").default):boolean} A function that can be\n * called with a zoom level and a tile range to add loaded tiles to the lookup.\n * @protected\n */\n createLoadedTileFinder(source, projection, tiles) {\n return (\n /**\n * @param {number} zoom Zoom level.\n * @param {import(\"../TileRange.js\").default} tileRange Tile range.\n * @return {boolean} The tile range is fully loaded.\n */\n (zoom, tileRange) => {\n const callback = this.loadedTileCallback.bind(this, tiles, zoom);\n return source.forEachLoadedTile(projection, zoom, tileRange, callback);\n }\n );\n }\n /**\n * @abstract\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<T>} callback Feature callback.\n * @param {Array<import(\"./Map.js\").HitMatch<T>>} matches The hit detected matches with tolerance.\n * @return {T|undefined} Callback result.\n * @template T\n */\n forEachFeatureAtCoordinate(\n coordinate,\n frameState,\n hitTolerance,\n callback,\n matches\n ) {\n return undefined;\n }\n\n /**\n * @return {LayerType} Layer.\n */\n getLayer() {\n return this.layer_;\n }\n\n /**\n * Perform action necessary to get the layer rendered after new fonts have loaded\n * @abstract\n */\n handleFontsChanged() {}\n\n /**\n * Handle changes in image state.\n * @param {import(\"../events/Event.js\").default} event Image change event.\n * @private\n */\n handleImageChange_(event) {\n const image = /** @type {import(\"../Image.js\").default} */ (event.target);\n if (image.getState() === ImageState.LOADED) {\n this.renderIfReadyAndVisible();\n }\n }\n\n /**\n * Load the image if not already loaded, and register the image change\n * listener if needed.\n * @param {import(\"../ImageBase.js\").default} image Image.\n * @return {boolean} `true` if the image is already loaded, `false` otherwise.\n * @protected\n */\n loadImage(image) {\n let imageState = image.getState();\n if (imageState != ImageState.LOADED && imageState != ImageState.ERROR) {\n image.addEventListener(EventType.CHANGE, this.boundHandleImageChange_);\n }\n if (imageState == ImageState.IDLE) {\n image.load();\n imageState = image.getState();\n }\n return imageState == ImageState.LOADED;\n }\n\n /**\n * @protected\n */\n renderIfReadyAndVisible() {\n const layer = this.getLayer();\n if (layer && layer.getVisible() && layer.getSourceState() === 'ready') {\n layer.changed();\n }\n }\n\n /**\n * Clean up.\n */\n disposeInternal() {\n delete this.layer_;\n super.disposeInternal();\n }\n}\n\nexport default LayerRenderer;\n","/**\n * @module ol/renderer/canvas/Layer\n */\nimport LayerRenderer from '../Layer.js';\nimport RenderEvent from '../../render/Event.js';\nimport RenderEventType from '../../render/EventType.js';\nimport {\n apply as applyTransform,\n compose as composeTransform,\n create as createTransform,\n} from '../../transform.js';\nimport {asArray} from '../../color.js';\nimport {createCanvasContext2D} from '../../dom.js';\nimport {equals} from '../../array.js';\nimport {\n getBottomLeft,\n getBottomRight,\n getTopLeft,\n getTopRight,\n} from '../../extent.js';\n\n/**\n * @type {Array<HTMLCanvasElement>}\n */\nexport const canvasPool = [];\n\n/**\n * @type {CanvasRenderingContext2D}\n */\nlet pixelContext = null;\n\nfunction createPixelContext() {\n pixelContext = createCanvasContext2D(1, 1, undefined, {\n willReadFrequently: true,\n });\n}\n\n/**\n * @abstract\n * @template {import(\"../../layer/Layer.js\").default} LayerType\n * @extends {LayerRenderer<LayerType>}\n */\nclass CanvasLayerRenderer extends LayerRenderer {\n /**\n * @param {LayerType} layer Layer.\n */\n constructor(layer) {\n super(layer);\n\n /**\n * @protected\n * @type {HTMLElement}\n */\n this.container = null;\n\n /**\n * @protected\n * @type {number}\n */\n this.renderedResolution;\n\n /**\n * A temporary transform. The values in this transform should only be used in a\n * function that sets the values.\n * @protected\n * @type {import(\"../../transform.js\").Transform}\n */\n this.tempTransform = createTransform();\n\n /**\n * The transform for rendered pixels to viewport CSS pixels. This transform must\n * be set when rendering a frame and may be used by other functions after rendering.\n * @protected\n * @type {import(\"../../transform.js\").Transform}\n */\n this.pixelTransform = createTransform();\n\n /**\n * The transform for viewport CSS pixels to rendered pixels. This transform must\n * be set when rendering a frame and may be used by other functions after rendering.\n * @protected\n * @type {import(\"../../transform.js\").Transform}\n */\n this.inversePixelTransform = createTransform();\n\n /**\n * @type {CanvasRenderingContext2D}\n */\n this.context = null;\n\n /**\n * @type {boolean}\n */\n this.containerReused = false;\n\n /**\n * @private\n * @type {CanvasRenderingContext2D}\n */\n this.pixelContext_ = null;\n\n /**\n * @protected\n * @type {import(\"../../Map.js\").FrameState|null}\n */\n this.frameState = null;\n }\n\n /**\n * @param {HTMLCanvasElement|HTMLImageElement|HTMLVideoElement} image Image.\n * @param {number} col The column index.\n * @param {number} row The row index.\n * @return {Uint8ClampedArray|null} The image data.\n */\n getImageData(image, col, row) {\n if (!pixelContext) {\n createPixelContext();\n }\n pixelContext.clearRect(0, 0, 1, 1);\n\n let data;\n try {\n pixelContext.drawImage(image, col, row, 1, 1, 0, 0, 1, 1);\n data = pixelContext.getImageData(0, 0, 1, 1).data;\n } catch (err) {\n pixelContext = null;\n return null;\n }\n return data;\n }\n\n /**\n * @param {import('../../Map.js').FrameState} frameState Frame state.\n * @return {string} Background color.\n */\n getBackground(frameState) {\n const layer = this.getLayer();\n let background = layer.getBackground();\n if (typeof background === 'function') {\n background = background(frameState.viewState.resolution);\n }\n return background || undefined;\n }\n\n /**\n * Get a rendering container from an existing target, if compatible.\n * @param {HTMLElement} target Potential render target.\n * @param {string} transform CSS Transform.\n * @param {string} [backgroundColor] Background color.\n */\n useContainer(target, transform, backgroundColor) {\n const layerClassName = this.getLayer().getClassName();\n let container, context;\n if (\n target &&\n target.className === layerClassName &&\n (!backgroundColor ||\n (target &&\n target.style.backgroundColor &&\n equals(\n asArray(target.style.backgroundColor),\n asArray(backgroundColor)\n )))\n ) {\n const canvas = target.firstElementChild;\n if (canvas instanceof HTMLCanvasElement) {\n context = canvas.getContext('2d');\n }\n }\n if (context && context.canvas.style.transform === transform) {\n // Container of the previous layer renderer can be used.\n this.container = target;\n this.context = context;\n this.containerReused = true;\n } else if (this.containerReused) {\n // Previously reused container cannot be used any more.\n this.container = null;\n this.context = null;\n this.containerReused = false;\n }\n if (!this.container) {\n container = document.createElement('div');\n container.className = layerClassName;\n let style = container.style;\n style.position = 'absolute';\n style.width = '100%';\n style.height = '100%';\n context = createCanvasContext2D();\n const canvas = context.canvas;\n container.appendChild(canvas);\n style = canvas.style;\n style.position = 'absolute';\n style.left = '0';\n style.transformOrigin = 'top left';\n this.container = container;\n this.context = context;\n }\n if (\n !this.containerReused &&\n backgroundColor &&\n !this.container.style.backgroundColor\n ) {\n this.container.style.backgroundColor = backgroundColor;\n }\n }\n\n /**\n * @param {CanvasRenderingContext2D} context Context.\n * @param {import(\"../../Map.js\").FrameState} frameState Frame state.\n * @param {import(\"../../extent.js\").Extent} extent Clip extent.\n * @protected\n */\n clipUnrotated(context, frameState, extent) {\n const topLeft = getTopLeft(extent);\n const topRight = getTopRight(extent);\n const bottomRight = getBottomRight(extent);\n const bottomLeft = getBottomLeft(extent);\n\n applyTransform(frameState.coordinateToPixelTransform, topLeft);\n applyTransform(frameState.coordinateToPixelTransform, topRight);\n applyTransform(frameState.coordinateToPixelTransform, bottomRight);\n applyTransform(frameState.coordinateToPixelTransform, bottomLeft);\n\n const inverted = this.inversePixelTransform;\n applyTransform(inverted, topLeft);\n applyTransform(inverted, topRight);\n applyTransform(inverted, bottomRight);\n applyTransform(inverted, bottomLeft);\n\n context.save();\n context.beginPath();\n context.moveTo(Math.round(topLeft[0]), Math.round(topLeft[1]));\n context.lineTo(Math.round(topRight[0]), Math.round(topRight[1]));\n context.lineTo(Math.round(bottomRight[0]), Math.round(bottomRight[1]));\n context.lineTo(Math.round(bottomLeft[0]), Math.round(bottomLeft[1]));\n context.clip();\n }\n\n /**\n * @param {import(\"../../render/EventType.js\").default} type Event type.\n * @param {CanvasRenderingContext2D} context Context.\n * @param {import(\"../../Map.js\").FrameState} frameState Frame state.\n * @private\n */\n dispatchRenderEvent_(type, context, frameState) {\n const layer = this.getLayer();\n if (layer.hasListener(type)) {\n const event = new RenderEvent(\n type,\n this.inversePixelTransform,\n frameState,\n context\n );\n layer.dispatchEvent(event);\n }\n }\n\n /**\n * @param {CanvasRenderingContext2D} context Context.\n * @param {import(\"../../Map.js\").FrameState} frameState Frame state.\n * @protected\n */\n preRender(context, frameState) {\n this.frameState = frameState;\n this.dispatchRenderEvent_(RenderEventType.PRERENDER, context, frameState);\n }\n\n /**\n * @param {CanvasRenderingContext2D} context Context.\n * @param {import(\"../../Map.js\").FrameState} frameState Frame state.\n * @protected\n */\n postRender(context, frameState) {\n this.dispatchRenderEvent_(RenderEventType.POSTRENDER, context, frameState);\n }\n\n /**\n * Creates a transform for rendering to an element that will be rotated after rendering.\n * @param {import(\"../../coordinate.js\").Coordinate} center Center.\n * @param {number} resolution Resolution.\n * @param {number} rotation Rotation.\n * @param {number} pixelRatio Pixel ratio.\n * @param {number} width Width of the rendered element (in pixels).\n * @param {number} height Height of the rendered element (in pixels).\n * @param {number} offsetX Offset on the x-axis in view coordinates.\n * @protected\n * @return {!import(\"../../transform.js\").Transform} Transform.\n */\n getRenderTransform(\n center,\n resolution,\n rotation,\n pixelRatio,\n width,\n height,\n offsetX\n ) {\n const dx1 = width / 2;\n const dy1 = height / 2;\n const sx = pixelRatio / resolution;\n const sy = -sx;\n const dx2 = -center[0] + offsetX;\n const dy2 = -center[1];\n return composeTransform(\n this.tempTransform,\n dx1,\n dy1,\n sx,\n sy,\n -rotation,\n dx2,\n dy2\n );\n }\n\n /**\n * Clean up.\n */\n disposeInternal() {\n delete this.frameState;\n super.disposeInternal();\n }\n}\n\nexport default CanvasLayerRenderer;\n","/**\n * @module ol/geom/flat/textpath\n */\nimport {lerp} from '../../math.js';\nimport {rotate} from './transform.js';\n\n/**\n * @param {Array<number>} 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<string, number>):number} measureAndCacheTextWidth Measure and cache text width.\n * @param {string} font The font.\n * @param {Object<string, number>} 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<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 {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 {Object} BBox\n * @property {number} minX Minimal x.\n * @property {number} minY Minimal y.\n * @property {number} maxX Maximal x.\n * @property {number} maxY Maximal y\n * @property {*} value Value.\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<number>} scale Scale.\n * @property {BBox} declutterBox DeclutterBox.\n * @property {import(\"../../transform.js\").Transform} canvasTransform CanvasTransform.\n */\n\n/**\n * @typedef {{0: CanvasRenderingContext2D, 1: number, 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): 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 {BBox} Declutter bbox.\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' || align === 'end') && !rtlRegEx.test(text)) {\n align = align === 'start' ? 'left' : 'right';\n }\n return TEXT_ALIGN[align];\n}\n\n/**\n * @param {Array<string>} acc Accumulator.\n * @param {string} line Line of text.\n * @param {number} i Index\n * @return {Array<string>} 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 */\n constructor(resolution, pixelRatio, overlaps, instructions) {\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 {boolean}\n */\n this.alignFill_;\n\n /**\n * @protected\n * @type {Array<*>}\n */\n this.instructions = instructions.instructions;\n\n /**\n * @protected\n * @type {Array<number>}\n */\n this.coordinates = instructions.coordinates;\n\n /**\n * @private\n * @type {!Object<number,import(\"../../coordinate.js\").Coordinate|Array<import(\"../../coordinate.js\").Coordinate>|Array<Array<import(\"../../coordinate.js\").Coordinate>>>}\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<number>}\n */\n this.pixelCoordinates_ = null;\n\n /**\n * @private\n * @type {number}\n */\n this.viewRotation_ = 0;\n\n /**\n * @type {!Object<string, import(\"../canvas.js\").FillState>}\n */\n this.fillStates = instructions.fillStates || {};\n\n /**\n * @type {!Object<string, import(\"../canvas.js\").StrokeState>}\n */\n this.strokeStates = instructions.strokeStates || {};\n\n /**\n * @type {!Object<string, import(\"../canvas.js\").TextState>}\n */\n this.textStates = instructions.textStates || {};\n\n /**\n * @private\n * @type {Object<string, Object<string, number>>}\n */\n this.widths_ = {};\n\n /**\n * @private\n * @type {Object<string, import(\"../canvas.js\").Label>}\n */\n this.labels_ = {};\n }\n\n /**\n * @param {string|Array<string>} 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 textIsArray = Array.isArray(text);\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 = textIsArray\n ? text\n : 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.alignFill_ = /** @type {boolean} */ (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<number>} 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 {number} contextScale Scale of the context.\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 contextScale,\n imageOrLabel,\n dimensions,\n opacity,\n fillInstruction,\n strokeInstruction\n ) {\n const fillStroke = !!(fillInstruction || strokeInstruction);\n\n const box = dimensions.declutterBox;\n const canvas = context.canvas;\n const strokePadding = strokeInstruction\n ? (strokeInstruction[2] * dimensions.scale[0]) / 2\n : 0;\n const intersects =\n box.minX - strokePadding <= canvas.width / contextScale &&\n box.maxX + strokePadding >= 0 &&\n box.minY - strokePadding <= canvas.height / contextScale &&\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 if (this.alignFill_) {\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 context.rotate(this.viewRotation_);\n }\n context.fill();\n if (this.alignFill_) {\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<number>} */ (instruction[6]));\n }\n\n /**\n * @private\n * @param {string|Array<string>} 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 {number} contextScale Scale of the context.\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<T>} [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 contextScale,\n transform,\n instructions,\n snapToPixel,\n featureCallback,\n hitExtent,\n declutterTree\n ) {\n /** @type {Array<number>} */\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 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 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.length == 6 ? instruction[5] : undefined;\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 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 const declutterMode =\n /** @type {\"declutter\"|\"obstacle\"|\"none\"|undefined} */ (\n instruction[14]\n );\n const declutterImageWithText =\n /** @type {import(\"../canvas.js\").DeclutterImageWithText} */ (\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<number>} */ (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 contextScale,\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 if (declutterMode === 'none') {\n // not rendered in declutter group\n continue;\n } else if (declutterMode === 'obstacle') {\n // will always be drawn, thus no collision detection, but insert as obstacle\n declutterTree.insert(dimensions.declutterBox);\n continue;\n } else {\n let imageArgs;\n let 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;\n // Don't render anything for now, wait for the text.\n continue;\n }\n imageArgs = declutterImageWithText[index];\n delete declutterImageWithText[index];\n imageDeclutterBox = getDeclutterBox(imageArgs);\n if (declutterTree.collides(imageDeclutterBox)) {\n continue;\n }\n }\n if (declutterTree.collides(dimensions.declutterBox)) {\n continue;\n }\n if (imageArgs) {\n // We now have image and text for an image+text combination.\n declutterTree.insert(imageDeclutterBox);\n // Render the image before we render the text.\n this.replayImageOrLabel_.apply(this, imageArgs);\n }\n declutterTree.insert(dimensions.declutterBox);\n }\n }\n this.replayImageOrLabel_.apply(this, args);\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\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 = (pathLength - textLength) * TEXT_ALIGN[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<ReplayImageOrLabelArgs>} */\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 declutterTree.collides(dimensions.declutterBox)\n ) {\n break drawChars;\n }\n replayImageOrLabelArgs.push([\n context,\n contextScale,\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 declutterTree.collides(dimensions.declutterBox)\n ) {\n break drawChars;\n }\n replayImageOrLabelArgs.push([\n context,\n contextScale,\n label,\n dimensions,\n 1,\n null,\n null,\n ]);\n }\n }\n if (declutterTree) {\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(feature, currentGeometry);\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 roundX = (x + 0.5) | 0;\n roundY = (y + 0.5) | 0;\n if (roundX !== prevX || roundY !== prevY) {\n context.moveTo(x, y);\n prevX = roundX;\n prevY = roundY;\n }\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.alignFill_ = 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 context.fillStyle =\n /** @type {import(\"../../colorlike.js\").ColorLike} */ (\n instruction[1]\n );\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 {number} contextScale 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 text to integer pixels.\n * @param {import(\"rbush\").default} [declutterTree] Declutter tree.\n */\n execute(\n context,\n contextScale,\n transform,\n viewRotation,\n snapToPixel,\n declutterTree\n ) {\n this.viewRotation_ = viewRotation;\n this.execute_(\n context,\n contextScale,\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<T>} [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 1,\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<import(\"../canvas.js\").BuilderType>}\n */\nconst ORDER = ['Polygon', 'Circle', 'LineString', 'Image', 'Text', 'Default'];\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<string, !Object<import(\"../canvas.js\").BuilderType, import(\"../canvas.js\").SerializableInstructions>>} allInstructions\n * The serializable instructions.\n * @param {number} [renderBuffer] Optional rendering buffer.\n */\n constructor(\n maxExtent,\n resolution,\n pixelRatio,\n overlaps,\n allInstructions,\n renderBuffer\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<string, !Object<import(\"../canvas.js\").BuilderType, import(\"./Executor\").default>>}\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 this.createExecutors_(allInstructions);\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<string, !Object<import(\"../canvas.js\").BuilderType, import(\"../canvas.js\").SerializableInstructions>>} allInstructions The serializable instructions\n */\n createExecutors_(allInstructions) {\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 );\n }\n }\n }\n\n /**\n * @param {Array<import(\"../canvas.js\").BuilderType>} 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<import(\"../../Feature.js\").FeatureLike>} 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 * @return {T|undefined} Callback result.\n */\n function featureCallback(feature, geometry) {\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 (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<number>} */\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 = ORDER.length - 1; j >= 0; --j) {\n builderType = ORDER[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<number>|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} context Context.\n * @param {number} contextScale 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<import(\"../canvas.js\").BuilderType>} [builderTypes] Ordered replay types to replay.\n * Default is {@link module:ol/render/replay~ORDER}\n * @param {import(\"rbush\").default} [declutterTree] Declutter tree.\n */\n execute(\n context,\n contextScale,\n transform,\n viewRotation,\n snapToPixel,\n builderTypes,\n declutterTree\n ) {\n /** @type {Array<number>} */\n const zs = Object.keys(this.executorsByZIndex_).map(Number);\n zs.sort(ascending);\n\n // setup clipping so that the parts of over-simplified geometries are not\n // visible outside the current extent when panning\n if (this.maxExtent_) {\n context.save();\n this.clip(context, transform);\n }\n\n builderTypes = builderTypes ? builderTypes : ORDER;\n let i, ii, j, jj, replays, replay;\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 replay = replays[builderType];\n if (replay !== undefined) {\n replay.execute(\n context,\n contextScale,\n transform,\n viewRotation,\n snapToPixel,\n declutterTree\n );\n }\n }\n }\n\n if (this.maxExtent_) {\n context.restore();\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<number, Array<number>>}\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<number>} 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/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 {HTMLCanvasElement|HTMLVideoElement|HTMLImageElement}\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<number>}\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<number>} 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.setTransform.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.setTransform(1, 0, 0, 1, 0, 0);\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<number>} 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.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.setTransform(1, 0, 0, 1, 0, 0);\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<number>} 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<number>} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {Array<number>} 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 */\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 */\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 */\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} */ (geometry)\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 */\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 */\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 */\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 */\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 */\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 */\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<number>} */ (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 */\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<number>} */ (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 */\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 */\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 */\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 */\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/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 {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<import(\"../../transform.js\").Transform>} transforms Transforms\n * for rendering features to all worlds of the viewport, from coordinates to css\n * pixels.\n * @param {Array<import(\"../../Feature.js\").FeatureLike>} 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.\n * @param {number} resolution Resolution.\n * @param {number} rotation Rotation.\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) {\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 );\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 (!styleFunction) {\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(extent, 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 && image.getOpacity() !== 0) {\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 imgSize: imgSize,\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<F>} 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<F>} Features.\n * @template {import(\"../../Feature.js\").FeatureLike} F\n */\nexport function hitDetect(pixel, features, imageData) {\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 // @ts-ignore Features are copied from `features` to `resultFeatures` so the type should be the same\n return resultFeatures;\n}\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(\"../source/Source\").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<import(\"../geom/Geometry.js\").Type,\n * function(import(\"../render/canvas/BuilderGroup.js\").default, import(\"../geom/Geometry.js\").default,\n * import(\"../style/Style.js\").default, Object): void>}\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 {import(\"../render/canvas/BuilderGroup.js\").default} [declutterBuilderGroup] Builder for decluttering.\n */\nfunction renderCircleGeometry(\n builderGroup,\n geometry,\n style,\n feature,\n declutterBuilderGroup\n) {\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);\n }\n const textStyle = style.getText();\n if (textStyle && textStyle.getText()) {\n const textReplay = (declutterBuilderGroup || builderGroup).getBuilder(\n style.getZIndex(),\n 'Text'\n );\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 {import(\"../render/canvas/BuilderGroup.js\").default} [declutterBuilderGroup] Builder for decluttering.\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 declutterBuilderGroup\n) {\n let loading = false;\n const imageStyle = style.getImage();\n if (imageStyle) {\n const imageState = imageStyle.getImageState();\n if (imageState == ImageState.LOADED || imageState == ImageState.ERROR) {\n imageStyle.unlistenImageChange(listener);\n } else {\n if (imageState == ImageState.IDLE) {\n imageStyle.load();\n }\n imageStyle.listenImageChange(listener);\n loading = true;\n }\n }\n renderFeatureInternal(\n replayGroup,\n feature,\n style,\n squaredTolerance,\n transform,\n declutterBuilderGroup\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 {import(\"../render/canvas/BuilderGroup.js\").default} [declutterBuilderGroup] Builder for decluttering.\n */\nfunction renderFeatureInternal(\n replayGroup,\n feature,\n style,\n squaredTolerance,\n transform,\n declutterBuilderGroup\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);\n } else {\n const geometryRenderer = GEOMETRY_RENDERERS[simplifiedGeometry.getType()];\n geometryRenderer(\n replayGroup,\n simplifiedGeometry,\n style,\n feature,\n declutterBuilderGroup\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 */\nfunction renderGeometry(replayGroup, geometry, style, feature) {\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);\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 );\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 */\nfunction renderGeometryCollectionGeometry(\n replayGroup,\n geometry,\n style,\n feature,\n declutterBuilderGroup\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 );\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 {import(\"../render/canvas/BuilderGroup.js\").default} [declutterBuilderGroup] Builder for decluttering.\n */\nfunction renderLineStringGeometry(\n builderGroup,\n geometry,\n style,\n feature,\n declutterBuilderGroup\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);\n }\n const textStyle = style.getText();\n if (textStyle && textStyle.getText()) {\n const textReplay = (declutterBuilderGroup || builderGroup).getBuilder(\n style.getZIndex(),\n 'Text'\n );\n textReplay.setTextStyle(textStyle);\n textReplay.drawText(geometry, feature);\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 {import(\"../render/canvas/BuilderGroup.js\").default} [declutterBuilderGroup] Builder for decluttering.\n */\nfunction renderMultiLineStringGeometry(\n builderGroup,\n geometry,\n style,\n feature,\n declutterBuilderGroup\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);\n }\n const textStyle = style.getText();\n if (textStyle && textStyle.getText()) {\n const textReplay = (declutterBuilderGroup || builderGroup).getBuilder(\n style.getZIndex(),\n 'Text'\n );\n textReplay.setTextStyle(textStyle);\n textReplay.drawText(geometry, feature);\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 {import(\"../render/canvas/BuilderGroup.js\").default} [declutterBuilderGroup] Builder for decluttering.\n */\nfunction renderMultiPolygonGeometry(\n builderGroup,\n geometry,\n style,\n feature,\n declutterBuilderGroup\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);\n }\n const textStyle = style.getText();\n if (textStyle && textStyle.getText()) {\n const textReplay = (declutterBuilderGroup || builderGroup).getBuilder(\n style.getZIndex(),\n 'Text'\n );\n textReplay.setTextStyle(textStyle);\n textReplay.drawText(geometry, feature);\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 {import(\"../render/canvas/BuilderGroup.js\").default} [declutterBuilderGroup] Builder for decluttering.\n */\nfunction renderPointGeometry(\n builderGroup,\n geometry,\n style,\n feature,\n declutterBuilderGroup\n) {\n const imageStyle = style.getImage();\n const textStyle = style.getText();\n /** @type {import(\"../render/canvas.js\").DeclutterImageWithText} */\n let declutterImageWithText;\n if (imageStyle) {\n if (imageStyle.getImageState() != ImageState.LOADED) {\n return;\n }\n let imageBuilderGroup = builderGroup;\n if (declutterBuilderGroup) {\n const declutterMode = imageStyle.getDeclutterMode();\n if (declutterMode !== 'none') {\n imageBuilderGroup = declutterBuilderGroup;\n if (declutterMode === 'obstacle') {\n // draw in non-declutter group:\n const imageReplay = builderGroup.getBuilder(\n style.getZIndex(),\n 'Image'\n );\n imageReplay.setImageStyle(imageStyle, declutterImageWithText);\n imageReplay.drawPoint(geometry, feature);\n } else if (textStyle && textStyle.getText()) {\n declutterImageWithText = {};\n }\n }\n }\n const imageReplay = imageBuilderGroup.getBuilder(\n style.getZIndex(),\n 'Image'\n );\n imageReplay.setImageStyle(imageStyle, declutterImageWithText);\n imageReplay.drawPoint(geometry, feature);\n }\n if (textStyle && textStyle.getText()) {\n let textBuilderGroup = builderGroup;\n if (declutterBuilderGroup) {\n textBuilderGroup = declutterBuilderGroup;\n }\n const textReplay = textBuilderGroup.getBuilder(style.getZIndex(), 'Text');\n textReplay.setTextStyle(textStyle, declutterImageWithText);\n textReplay.drawText(geometry, feature);\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 {import(\"../render/canvas/BuilderGroup.js\").default} [declutterBuilderGroup] Builder for decluttering.\n */\nfunction renderMultiPointGeometry(\n builderGroup,\n geometry,\n style,\n feature,\n declutterBuilderGroup\n) {\n const imageStyle = style.getImage();\n const textStyle = style.getText();\n /** @type {import(\"../render/canvas.js\").DeclutterImageWithText} */\n let declutterImageWithText;\n if (imageStyle) {\n if (imageStyle.getImageState() != ImageState.LOADED) {\n return;\n }\n let imageBuilderGroup = builderGroup;\n if (declutterBuilderGroup) {\n const declutterMode = imageStyle.getDeclutterMode();\n if (declutterMode !== 'none') {\n imageBuilderGroup = declutterBuilderGroup;\n if (declutterMode === 'obstacle') {\n // draw in non-declutter group:\n const imageReplay = builderGroup.getBuilder(\n style.getZIndex(),\n 'Image'\n );\n imageReplay.setImageStyle(imageStyle, declutterImageWithText);\n imageReplay.drawMultiPoint(geometry, feature);\n } else if (textStyle && textStyle.getText()) {\n declutterImageWithText = {};\n }\n }\n }\n const imageReplay = imageBuilderGroup.getBuilder(\n style.getZIndex(),\n 'Image'\n );\n imageReplay.setImageStyle(imageStyle, declutterImageWithText);\n imageReplay.drawMultiPoint(geometry, feature);\n }\n if (textStyle && textStyle.getText()) {\n let textBuilderGroup = builderGroup;\n if (declutterBuilderGroup) {\n textBuilderGroup = declutterBuilderGroup;\n }\n const textReplay = textBuilderGroup.getBuilder(style.getZIndex(), 'Text');\n textReplay.setTextStyle(textStyle, declutterImageWithText);\n textReplay.drawText(geometry, feature);\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 {import(\"../render/canvas/BuilderGroup.js\").default} [declutterBuilderGroup] Builder for decluttering.\n */\nfunction renderPolygonGeometry(\n builderGroup,\n geometry,\n style,\n feature,\n declutterBuilderGroup\n) {\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);\n }\n const textStyle = style.getText();\n if (textStyle && textStyle.getText()) {\n const textReplay = (declutterBuilderGroup || builderGroup).getBuilder(\n style.getZIndex(),\n 'Text'\n );\n textReplay.setTextStyle(textStyle);\n textReplay.drawText(geometry, feature);\n }\n}\n","/**\n * @module ol/renderer/canvas/VectorLayer\n */\nimport CanvasBuilderGroup from '../../render/canvas/BuilderGroup.js';\nimport CanvasLayerRenderer, {canvasPool} from './Layer.js';\nimport ExecutorGroup from '../../render/canvas/ExecutorGroup.js';\nimport ViewHint from '../../ViewHint.js';\nimport {\n HIT_DETECT_RESOLUTION,\n createHitDetectionImageData,\n hitDetect,\n} from '../../render/canvas/hitdetect.js';\nimport {\n apply,\n makeInverse,\n makeScale,\n toString as transformToString,\n} from '../../transform.js';\nimport {\n buffer,\n containsExtent,\n createEmpty,\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 * @type {boolean}\n */\n this.animatingOrInteracting_;\n\n /**\n * @type {ImageData|null}\n */\n this.hitDetectionImageData_ = null;\n\n /**\n * @type {Array<import(\"../../Feature.js\").default>}\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 {function(import(\"../../Feature.js\").default, import(\"../../Feature.js\").default): number|null}\n */\n this.renderedRenderOrder_ = null;\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 * @type {import(\"../../render/canvas/ExecutorGroup\").default}\n */\n this.declutterExecutorGroup = null;\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.compositionContext_ = 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 {import(\"rbush\").default} [declutterTree] Declutter tree.\n */\n renderWorlds(executorGroup, frameState, declutterTree) {\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 pixelRatio = frameState.pixelRatio;\n const viewHints = frameState.viewHints;\n const snapToPixel = !(\n viewHints[ViewHint.ANIMATING] || viewHints[ViewHint.INTERACTING]\n );\n const context = this.compositionContext_;\n const width = Math.round(frameState.size[0] * pixelRatio);\n const height = Math.round(frameState.size[1] * 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 const transform = this.getRenderTransform(\n center,\n resolution,\n rotation,\n pixelRatio,\n width,\n height,\n world * worldWidth\n );\n executorGroup.execute(\n context,\n 1,\n transform,\n rotation,\n snapToPixel,\n undefined,\n declutterTree\n );\n } while (++world < endWorld);\n }\n\n setupCompositionContext_() {\n if (this.opacity_ !== 1) {\n const compositionContext = createCanvasContext2D(\n this.context.canvas.width,\n this.context.canvas.height,\n canvasPool\n );\n this.compositionContext_ = compositionContext;\n } else {\n this.compositionContext_ = this.context;\n }\n }\n\n releaseCompositionContext_() {\n if (this.opacity_ !== 1) {\n const alpha = this.context.globalAlpha;\n this.context.globalAlpha = this.opacity_;\n this.context.drawImage(this.compositionContext_.canvas, 0, 0);\n this.context.globalAlpha = alpha;\n releaseCanvas(this.compositionContext_);\n canvasPool.push(this.compositionContext_.canvas);\n this.compositionContext_ = 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.declutterExecutorGroup) {\n this.setupCompositionContext_();\n this.renderWorlds(\n this.declutterExecutorGroup,\n frameState,\n frameState.declutterTree\n );\n this.releaseCompositionContext_();\n }\n }\n\n /**\n * Render the layer.\n * @param {import(\"../../Map.js\").FrameState} frameState Frame state.\n * @param {HTMLElement} target Target that may be used to render content to.\n * @return {HTMLElement} The rendered element.\n */\n renderFrame(frameState, target) {\n const pixelRatio = frameState.pixelRatio;\n const layerState = frameState.layerStatesArray[frameState.layerIndex];\n\n // set forward and inverse pixel transforms\n makeScale(this.pixelTransform, 1 / pixelRatio, 1 / pixelRatio);\n makeInverse(this.inversePixelTransform, this.pixelTransform);\n\n const canvasTransform = transformToString(this.pixelTransform);\n\n this.useContainer(target, canvasTransform, this.getBackground(frameState));\n const context = this.context;\n const canvas = context.canvas;\n\n const replayGroup = this.replayGroup_;\n const declutterExecutorGroup = this.declutterExecutorGroup;\n if (\n (!replayGroup || replayGroup.isEmpty()) &&\n (!declutterExecutorGroup || declutterExecutorGroup.isEmpty())\n ) {\n return null;\n }\n\n // resize and clear\n const width = Math.round(frameState.size[0] * pixelRatio);\n const height = Math.round(frameState.size[1] * pixelRatio);\n if (canvas.width != width || canvas.height != height) {\n canvas.width = width;\n canvas.height = height;\n if (canvas.style.transform !== canvasTransform) {\n canvas.style.transform = canvasTransform;\n }\n } else if (!this.containerReused) {\n context.clearRect(0, 0, width, height);\n }\n\n this.preRender(context, frameState);\n\n const viewState = frameState.viewState;\n const projection = viewState.projection;\n\n this.opacity_ = layerState.opacity;\n this.setupCompositionContext_();\n\n // clipped rendering if layer extent is set\n let clipped = false;\n let render = true;\n if (layerState.extent && this.clipping) {\n const layerExtent = fromUserExtent(layerState.extent, projection);\n render = intersectsExtent(layerExtent, frameState.extent);\n clipped = render && !containsExtent(layerExtent, frameState.extent);\n if (clipped) {\n this.clipUnrotated(this.compositionContext_, frameState, layerExtent);\n }\n }\n\n if (render) {\n this.renderWorlds(replayGroup, frameState);\n }\n\n if (clipped) {\n this.compositionContext_.restore();\n }\n\n this.releaseCompositionContext_();\n\n this.postRender(context, frameState);\n\n if (this.renderedRotation_ !== viewState.rotation) {\n this.renderedRotation_ = viewState.rotation;\n this.hitDetectionImageData_ = null;\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<Array<import(\"../../Feature\").default>>} Promise\n * that resolves with an array of features.\n */\n getFeatures(pixel) {\n return new Promise((resolve) => {\n if (!this.hitDetectionImageData_ && !this.animatingOrInteracting_) {\n const size = [this.context.canvas.width, this.context.canvas.height];\n apply(this.pixelTransform, size);\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\n this.hitDetectionImageData_ = createHitDetectionImageData(\n size,\n transforms,\n this.renderedFeatures_,\n layer.getStyleFunction(),\n extent,\n resolution,\n rotation\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<T>} callback Feature callback.\n * @param {Array<import(\"../Map.js\").HitMatch<T>>} matches The hit detected matches with tolerance.\n * @return {T|undefined} Callback result.\n * @template T\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<string, import(\"../Map.js\").HitMatch<T>|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 if (this.declutterExecutorGroup) {\n executorGroups.push(this.declutterExecutorGroup);\n }\n executorGroups.some((executorGroup) => {\n return (result = executorGroup.forEachFeatureAtCoordinate(\n coordinate,\n resolution,\n rotation,\n hitTolerance,\n featureCallback,\n executorGroup === this.declutterExecutorGroup &&\n frameState.declutterTree\n ? frameState.declutterTree.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 */\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 */\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 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 let declutterBuilderGroup;\n if (this.getLayer().getDeclutter()) {\n declutterBuilderGroup = new CanvasBuilderGroup(\n getRenderTolerance(resolution, pixelRatio),\n extent,\n resolution,\n pixelRatio\n );\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 */\n (feature) => {\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 declutterBuilderGroup\n );\n ready = ready && !dirty;\n }\n };\n\n const userExtent = toUserExtent(extent, projection);\n /** @type {Array<import(\"../../Feature.js\").default>} */\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]);\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 );\n\n if (declutterBuilderGroup) {\n this.declutterExecutorGroup = new ExecutorGroup(\n extent,\n resolution,\n pixelRatio,\n vectorSource.getOverlaps(),\n declutterBuilderGroup.finish(),\n vectorLayer.getRenderBuffer()\n );\n }\n\n this.renderedResolution_ = resolution;\n this.renderedRevision_ = vectorLayerRevision;\n this.renderedRenderOrder_ = vectorLayerRenderOrder;\n this.renderedExtent_ = renderedExtent;\n this.wrappedRenderedExtent_ = extent;\n this.renderedCenter_ = center;\n this.renderedProjection_ = projection;\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<import(\"../../style/Style.js\").default>} 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 {import(\"../../render/canvas/BuilderGroup.js\").default} [declutterBuilderGroup] Builder for decluttering.\n * @return {boolean} `true` if an image is loading.\n */\n renderFeature(\n feature,\n squaredTolerance,\n styles,\n builderGroup,\n transform,\n declutterBuilderGroup\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 declutterBuilderGroup\n ) || loading;\n }\n } else {\n loading = renderFeature(\n builderGroup,\n feature,\n styles,\n squaredTolerance,\n this.boundHandleStyleImageChange_,\n transform,\n declutterBuilderGroup\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 * @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\n * @extends {BaseVectorLayer<VectorSourceType, CanvasVectorLayerRenderer>}\n * @api\n */\nclass VectorLayer extends BaseVectorLayer {\n /**\n * @param {import(\"./BaseVector.js\").Options<VectorSourceType>} [options] Options.\n */\n constructor(options) {\n super(options);\n }\n\n createRenderer() {\n return new CanvasVectorLayerRenderer(this);\n }\n}\n\nexport default VectorLayer;\n","/**\n * @module ol/source/Source\n */\nimport BaseObject from '../Object.js';\nimport {get as getProjection} from '../proj.js';\n\n/**\n * @typedef {'undefined' | 'loading' | 'ready' | 'error'} State\n * State of the source, one of 'undefined', 'loading', 'ready' or 'error'.\n */\n\n/**\n * A function that takes a {@link import(\"../View.js\").ViewStateLayerStateExtent} and returns a string or\n * an array of strings representing source attributions.\n *\n * @typedef {function(import(\"../View.js\").ViewStateLayerStateExtent): (string|Array<string>)} Attribution\n */\n\n/**\n * A type that can be used to provide attribution information for data sources.\n *\n * It represents either\n * * a simple string (e.g. `'© Acme Inc.'`)\n * * an array of simple strings (e.g. `['© Acme Inc.', '© Bacme Inc.']`)\n * * a function that returns a string or array of strings ({@link module:ol/source/Source~Attribution})\n *\n * @typedef {string|Array<string>|Attribution} AttributionLike\n */\n\n/**\n * @typedef {Object} Options\n * @property {AttributionLike} [attributions] Attributions.\n * @property {boolean} [attributionsCollapsible=true] Attributions are collapsible.\n * @property {import(\"../proj.js\").ProjectionLike} [projection] Projection. Default is the view projection.\n * @property {import(\"./Source.js\").State} [state='ready'] State.\n * @property {boolean} [wrapX=false] WrapX.\n * @property {boolean} [interpolate=false] Use interpolated values when resampling. By default,\n * the nearest neighbor is used when resampling.\n */\n\n/**\n * @classdesc\n * Abstract base class; normally only used for creating subclasses and not\n * instantiated in apps.\n * Base class for {@link module:ol/layer/Layer~Layer} sources.\n *\n * A generic `change` event is triggered when the state of the source changes.\n * @abstract\n * @api\n */\nclass Source extends BaseObject {\n /**\n * @param {Options} options Source options.\n */\n constructor(options) {\n super();\n\n /**\n * @protected\n * @type {import(\"../proj/Projection.js\").default|null}\n */\n this.projection = getProjection(options.projection);\n\n /**\n * @private\n * @type {?Attribution}\n */\n this.attributions_ = adaptAttributions(options.attributions);\n\n /**\n * @private\n * @type {boolean}\n */\n this.attributionsCollapsible_ =\n options.attributionsCollapsible !== undefined\n ? options.attributionsCollapsible\n : true;\n\n /**\n * This source is currently loading data. Sources that defer loading to the\n * map's tile queue never set this to `true`.\n * @type {boolean}\n */\n this.loading = false;\n\n /**\n * @private\n * @type {import(\"./Source.js\").State}\n */\n this.state_ = options.state !== undefined ? options.state : 'ready';\n\n /**\n * @private\n * @type {boolean}\n */\n this.wrapX_ = options.wrapX !== undefined ? options.wrapX : false;\n\n /**\n * @private\n * @type {boolean}\n */\n this.interpolate_ = !!options.interpolate;\n\n /**\n * @protected\n * @type {function(import(\"../View.js\").ViewOptions):void}\n */\n this.viewResolver = null;\n\n /**\n * @protected\n * @type {function(Error):void}\n */\n this.viewRejector = null;\n\n const self = this;\n /**\n * @private\n * @type {Promise<import(\"../View.js\").ViewOptions>}\n */\n this.viewPromise_ = new Promise(function (resolve, reject) {\n self.viewResolver = resolve;\n self.viewRejector = reject;\n });\n }\n\n /**\n * Get the attribution function for the source.\n * @return {?Attribution} Attribution function.\n * @api\n */\n getAttributions() {\n return this.attributions_;\n }\n\n /**\n * @return {boolean} Attributions are collapsible.\n * @api\n */\n getAttributionsCollapsible() {\n return this.attributionsCollapsible_;\n }\n\n /**\n * Get the projection of the source.\n * @return {import(\"../proj/Projection.js\").default|null} Projection.\n * @api\n */\n getProjection() {\n return this.projection;\n }\n\n /**\n * @param {import(\"../proj/Projection\").default} [projection] Projection.\n * @return {Array<number>|null} Resolutions.\n */\n getResolutions(projection) {\n return null;\n }\n\n /**\n * @return {Promise<import(\"../View.js\").ViewOptions>} A promise for view-related properties.\n */\n getView() {\n return this.viewPromise_;\n }\n\n /**\n * Get the state of the source, see {@link import(\"./Source.js\").State} for possible states.\n * @return {import(\"./Source.js\").State} State.\n * @api\n */\n getState() {\n return this.state_;\n }\n\n /**\n * @return {boolean|undefined} Wrap X.\n */\n getWrapX() {\n return this.wrapX_;\n }\n\n /**\n * @return {boolean} Use linear interpolation when resampling.\n */\n getInterpolate() {\n return this.interpolate_;\n }\n\n /**\n * Refreshes the source. The source will be cleared, and data from the server will be reloaded.\n * @api\n */\n refresh() {\n this.changed();\n }\n\n /**\n * Set the attributions of the source.\n * @param {AttributionLike|undefined} attributions Attributions.\n * Can be passed as `string`, `Array<string>`, {@link module:ol/source/Source~Attribution},\n * or `undefined`.\n * @api\n */\n setAttributions(attributions) {\n this.attributions_ = adaptAttributions(attributions);\n this.changed();\n }\n\n /**\n * Set the state of the source.\n * @param {import(\"./Source.js\").State} state State.\n */\n setState(state) {\n this.state_ = state;\n this.changed();\n }\n}\n\n/**\n * Turns the attributions option into an attributions function.\n * @param {AttributionLike|undefined} attributionLike The attribution option.\n * @return {Attribution|null} An attribution function (or null).\n */\nfunction adaptAttributions(attributionLike) {\n if (!attributionLike) {\n return null;\n }\n if (Array.isArray(attributionLike)) {\n return function (frameState) {\n return attributionLike;\n };\n }\n\n if (typeof attributionLike === 'function') {\n return attributionLike;\n }\n\n return function (frameState) {\n return [attributionLike];\n };\n}\n\nexport default Source;\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<import(\"./extent.js\").Extent>} 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<import(\"./extent.js\").Extent>} 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<import(\"./extent.js\").Extent>} 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<import(\"./extent.js\").Extent>} 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<import(\"./extent.js\").Extent>} */\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), an\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 * @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<import(\"./Feature.js\").default>): 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 * @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(\"./Feature.js\").default>, 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 /** @type {Document|Node|Object|string|undefined} */\n let source;\n if (type == 'json' || type == 'text') {\n source = xhr.responseText;\n } else if (type == 'xml') {\n source = xhr.responseXML;\n if (!source) {\n source = new DOMParser().parseFromString(\n xhr.responseText,\n 'application/xml'\n );\n }\n } else if (type == 'arraybuffer') {\n source = /** @type {ArrayBuffer} */ (xhr.response);\n }\n if (source) {\n success(\n /** @type {Array<import(\"./Feature.js\").default>} */\n (\n format.readFeatures(source, {\n extent: extent,\n featureProjection: projection,\n })\n ),\n format.readProjection(source)\n );\n } else {\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 * @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<import(\"./Feature.js\").default>): 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 = /** @type {import(\"./source/Vector\").default} */ (this);\n loadFeaturesXhr(\n url,\n format,\n extent,\n resolution,\n projection,\n /**\n * @param {Array<import(\"./Feature.js\").default>} 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 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<import(\"../extent.js\").Extent>} 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(\"../geom/Geometry.js\").default} [Geometry=import(\"../geom/Geometry.js\").default]\n */\nexport class VectorSourceEvent extends Event {\n /**\n * @param {string} type Type.\n * @param {import(\"../Feature.js\").default<Geometry>} [feature] Feature.\n * @param {Array<import(\"../Feature.js\").default<Geometry>>} [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 {import(\"../Feature.js\").default<Geometry>|undefined}\n * @api\n */\n this.feature = feature;\n\n /**\n * The loaded features for the `FEATURESLOADED` event, `undefined` otherwise.\n * @type {Array<import(\"../Feature.js\").default<Geometry>>|undefined}\n * @api\n */\n this.features = features;\n }\n}\n\n/***\n * @template Return\n * @typedef {import(\"../Observable\").OnSignature<import(\"../Observable\").EventTypes, import(\"../events/Event.js\").default, Return> &\n * import(\"../Observable\").OnSignature<import(\"../ObjectEventType\").Types, import(\"../Object\").ObjectEvent, Return> &\n * import(\"../Observable\").OnSignature<import(\"./VectorEventType\").VectorSourceEventTypes, VectorSourceEvent, Return> &\n * import(\"../Observable\").CombinedOnSignature<import(\"../Observable\").EventTypes|import(\"../ObjectEventType\").Types|\n * import(\"./VectorEventType\").VectorSourceEventTypes, Return>} VectorSourceOnSignature\n */\n\n/**\n * @typedef {Object} Options\n * @property {import(\"./Source.js\").AttributionLike} [attributions] Attributions.\n * @property {Array<import(\"../Feature.js\").default<Geometry>>|Collection<import(\"../Feature.js\").default<Geometry>>} [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 * @template {import(\"../geom/Geometry.js\").default} [Geometry=import(\"../geom/Geometry.js\").default]\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(\"../geom/Geometry.js\").default} [Geometry=import(\"../geom/Geometry.js\").default]\n */\nclass VectorSource extends Source {\n /**\n * @param {Options<Geometry>} [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<import(\"../events\").EventsKey>}\n */\n this.on;\n\n /***\n * @type {VectorSourceOnSignature<import(\"../events\").EventsKey>}\n */\n this.once;\n\n /***\n * @type {VectorSourceOnSignature<void>}\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|undefined}\n */\n this.format_ = options.format;\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_, 7); // `format` must be set when `url` is set\n // create a XHR feature loader for \"url\" and \"format\"\n this.loader_ = xhr(\n this.url_,\n /** @type {import(\"../format/Feature.js\").default} */ (this.format_)\n );\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<import(\"../Feature.js\").default<Geometry>>}\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<string, import(\"../Feature.js\").default<Geometry>>}\n */\n this.nullGeometryFeatures_ = {};\n\n /**\n * A lookup of features by id (the return from feature.getId()).\n * @private\n * @type {!Object<string, import(\"../Feature.js\").default<Geometry>>}\n */\n this.idIndex_ = {};\n\n /**\n * A lookup of features by uid (using getUid(feature)).\n * @private\n * @type {!Object<string, import(\"../Feature.js\").default<Geometry>>}\n */\n this.uidIndex_ = {};\n\n /**\n * @private\n * @type {Object<string, Array<import(\"../events.js\").EventsKey>>}\n */\n this.featureChangeKeys_ = {};\n\n /**\n * @private\n * @type {Collection<import(\"../Feature.js\").default<Geometry>>|null}\n */\n this.featuresCollection_ = null;\n\n /** @type {Collection<import(\"../Feature.js\").default<Geometry>>} */\n let collection;\n /** @type {Array<import(\"../Feature.js\").default<Geometry>>} */\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 an {@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 {import(\"../Feature.js\").default<Geometry>} 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 {import(\"../Feature.js\").default<Geometry>} 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 {import(\"../Feature.js\").default<Geometry>} feature The feature.\n * @private\n */\n setupChangeEvents_(featureKey, feature) {\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 {import(\"../Feature.js\").default<Geometry>} 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 const id = feature.getId();\n if (id !== undefined) {\n if (!(id.toString() in this.idIndex_)) {\n this.idIndex_[id.toString()] = feature;\n } else {\n valid = false;\n }\n }\n if (valid) {\n assert(!(featureKey in this.uidIndex_), 30); // The passed `feature` was already added to the source\n this.uidIndex_[featureKey] = feature;\n }\n return valid;\n }\n\n /**\n * Add a batch of features to the source.\n * @param {Array<import(\"../Feature.js\").default<Geometry>>} 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<import(\"../Feature.js\").default<Geometry>>} features Features.\n * @protected\n */\n addFeaturesInternal(features) {\n const extents = [];\n const newFeatures = [];\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<import(\"../Feature.js\").default<Geometry>>} collection Collection.\n * @private\n */\n bindFeaturesCollection_(collection) {\n let modifyingCollection = false;\n this.addEventListener(\n VectorEventType.ADDFEATURE,\n /**\n * @param {VectorSourceEvent<Geometry>} 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<Geometry>} 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<import(\"../Feature.js\").default<Geometry>>} 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<import(\"../Feature.js\").default<Geometry>>} 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(import(\"../Feature.js\").default<Geometry>): 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 * @param {import(\"../coordinate.js\").Coordinate} coordinate Coordinate.\n * @param {function(import(\"../Feature.js\").default<Geometry>): 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 (geometry.intersectsCoordinate(coordinate)) {\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(import(\"../Feature.js\").default<Geometry>): 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(import(\"../Feature.js\").default<Geometry>): 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 {import(\"../Feature.js\").default<Geometry>} 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 (geometry.intersectsExtent(extent)) {\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 an {@link module:ol/Collection~Collection} as `features`.\n * @return {Collection<import(\"../Feature.js\").default<Geometry>>|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<import(\"../Feature.js\").default<Geometry>>} 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 /** @type {Array<import(\"../Feature.js\").default<Geometry>>} */ (\n features\n );\n }\n\n /**\n * Get all features whose geometry intersects the provided coordinate.\n * @param {import(\"../coordinate.js\").Coordinate} coordinate Coordinate.\n * @return {Array<import(\"../Feature.js\").default<Geometry>>} 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<import(\"../Feature.js\").default<Geometry>>} 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`.\n * @param {import(\"../coordinate.js\").Coordinate} coordinate Coordinate.\n * @param {function(import(\"../Feature.js\").default<Geometry>):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 {import(\"../Feature.js\").default<Geometry>} 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 {import(\"../Feature.js\").default<Geometry>} feature Feature.\n */\n function (feature) {\n if (filter(feature)) {\n const geometry = feature.getGeometry();\n const previousMinSquaredDistance = minSquaredDistance;\n minSquaredDistance = geometry.closestPointXY(\n x,\n y,\n closestPoint,\n minSquaredDistance\n );\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()).\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 {import(\"../Feature.js\").default<Geometry>|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 ? feature : null;\n }\n\n /**\n * Get a feature by its internal unique identifier (using `getUid`).\n *\n * @param {string} uid Feature identifier.\n * @return {import(\"../Feature.js\").default<Geometry>|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|undefined} 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 {import(\"../Feature.js\").default<Geometry>} */ (\n event.target\n );\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 {import(\"../Feature.js\").default<Geometry>} 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 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 * Remove a single feature 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 {import(\"../Feature.js\").default<Geometry>} feature Feature to remove.\n * @api\n */\n removeFeature(feature) {\n if (!feature) {\n return;\n }\n const featureKey = getUid(feature);\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 const result = this.removeFeatureInternal(feature);\n if (result) {\n this.changed();\n }\n }\n\n /**\n * Remove feature without firing a `change` event.\n * @param {import(\"../Feature.js\").default<Geometry>} feature Feature.\n * @return {import(\"../Feature.js\").default<Geometry>|undefined} The removed feature\n * (or undefined if the feature was not found).\n * @protected\n */\n removeFeatureInternal(feature) {\n const featureKey = getUid(feature);\n const featureChangeKeys = this.featureChangeKeys_[featureKey];\n if (!featureChangeKeys) {\n return;\n }\n featureChangeKeys.forEach(unlistenByKey);\n delete this.featureChangeKeys_[featureKey];\n const id = feature.getId();\n if (id !== undefined) {\n delete this.idIndex_[id.toString()];\n }\n delete this.uidIndex_[featureKey];\n this.dispatchEvent(\n new VectorSourceEvent(VectorEventType.REMOVEFEATURE, feature)\n );\n return feature;\n }\n\n /**\n * Remove a feature from the id index. Called internally when the feature id\n * may have changed.\n * @param {import(\"../Feature.js\").default<Geometry>} feature The feature.\n * @return {boolean} Removed the feature from the index.\n * @private\n */\n removeFromIdIndex_(feature) {\n let removed = false;\n for (const id in this.idIndex_) {\n if (this.idIndex_[id] === feature) {\n delete this.idIndex_[id];\n removed = true;\n break;\n }\n }\n return removed;\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_, 7); // `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/interaction/Modify\n */\nimport Collection from '../Collection.js';\nimport CollectionEventType from '../CollectionEventType.js';\nimport Event from '../events/Event.js';\nimport EventType from '../events/EventType.js';\nimport Feature from '../Feature.js';\nimport MapBrowserEventType from '../MapBrowserEventType.js';\nimport Point from '../geom/Point.js';\nimport PointerInteraction from './Pointer.js';\nimport RBush from '../structs/RBush.js';\nimport VectorEventType from '../source/VectorEventType.js';\nimport VectorLayer from '../layer/Vector.js';\nimport VectorSource from '../source/Vector.js';\nimport {\n altKeyOnly,\n always,\n primaryAction,\n singleClick,\n} from '../events/condition.js';\nimport {\n boundingExtent,\n buffer as bufferExtent,\n createOrUpdateFromCoordinate as createExtent,\n} from '../extent.js';\nimport {\n closestOnSegment,\n distance as coordinateDistance,\n equals as coordinatesEqual,\n squaredDistance as squaredCoordinateDistance,\n squaredDistanceToSegment,\n} from '../coordinate.js';\nimport {createEditingStyle} from '../style/Style.js';\nimport {equals} from '../array.js';\nimport {fromCircle} from '../geom/Polygon.js';\nimport {\n fromUserCoordinate,\n fromUserExtent,\n getUserProjection,\n toUserCoordinate,\n toUserExtent,\n} from '../proj.js';\nimport {getUid} from '../util.js';\n\n/**\n * The segment index assigned to a circle's center when\n * breaking up a circle into ModifySegmentDataType segments.\n * @type {number}\n */\nconst CIRCLE_CENTER_INDEX = 0;\n\n/**\n * The segment index assigned to a circle's circumference when\n * breaking up a circle into ModifySegmentDataType segments.\n * @type {number}\n */\nconst CIRCLE_CIRCUMFERENCE_INDEX = 1;\n\nconst tempExtent = [0, 0, 0, 0];\nconst tempSegment = [];\n\n/**\n * @enum {string}\n */\nconst ModifyEventType = {\n /**\n * Triggered upon feature modification start\n * @event ModifyEvent#modifystart\n * @api\n */\n MODIFYSTART: 'modifystart',\n /**\n * Triggered upon feature modification end\n * @event ModifyEvent#modifyend\n * @api\n */\n MODIFYEND: 'modifyend',\n};\n\n/**\n * @typedef {Object} SegmentData\n * @property {Array<number>} [depth] Depth.\n * @property {Feature} feature Feature.\n * @property {import(\"../geom/SimpleGeometry.js\").default} geometry Geometry.\n * @property {number} [index] Index.\n * @property {Array<Array<number>>} segment Segment.\n * @property {Array<SegmentData>} [featureSegments] FeatureSegments.\n */\n\n/**\n * @typedef {Object} Options\n * @property {import(\"../events/condition.js\").Condition} [condition] A function that\n * takes an {@link module:ol/MapBrowserEvent~MapBrowserEvent} and returns a\n * boolean to indicate whether that event will be considered to add or move a\n * vertex to the sketch. Default is\n * {@link module:ol/events/condition.primaryAction}.\n * @property {import(\"../events/condition.js\").Condition} [deleteCondition] A function\n * that takes an {@link module:ol/MapBrowserEvent~MapBrowserEvent} and returns a\n * boolean to indicate whether that event should be handled. By default,\n * {@link module:ol/events/condition.singleClick} with\n * {@link module:ol/events/condition.altKeyOnly} results in a vertex deletion.\n * @property {import(\"../events/condition.js\").Condition} [insertVertexCondition] A\n * function that takes an {@link module:ol/MapBrowserEvent~MapBrowserEvent} and\n * returns a boolean to indicate whether a new vertex should be added to the sketch\n * features. Default is {@link module:ol/events/condition.always}.\n * @property {number} [pixelTolerance=10] Pixel tolerance for considering the\n * pointer close enough to a segment or vertex for editing.\n * @property {import(\"../style/Style.js\").StyleLike|import(\"../style/flat.js\").FlatStyleLike} [style]\n * Style used for the modification point or vertex. For linestrings and polygons, this will\n * be the affected vertex, for circles a point along the circle, and for points the actual\n * point. If not configured, the default edit style is used (see {@link module:ol/style/Style~Style}).\n * When using a style function, the point feature passed to the function will have a `features`\n * property - an array whose entries are the features that are being modified, and a `geometries`\n * property - an array whose entries are the geometries that are being modified. Both arrays are\n * in the same order. The `geometries` are only useful when modifying geometry collections, where\n * the geometry will be the particular geometry from the collection that is being modified.\n * @property {VectorSource} [source] The vector source with\n * features to modify. If a vector source is not provided, a feature collection\n * must be provided with the `features` option.\n * @property {boolean|import(\"../layer/BaseVector\").default} [hitDetection] When configured, point\n * features will be considered for modification based on their visual appearance, instead of being within\n * the `pixelTolerance` from the pointer location. When a {@link module:ol/layer/BaseVector~BaseVectorLayer} is\n * provided, only the rendered representation of the features on that layer will be considered.\n * @property {Collection<Feature>} [features]\n * The features the interaction works on. If a feature collection is not\n * provided, a vector source must be provided with the `source` option.\n * @property {boolean} [wrapX=false] Wrap the world horizontally on the sketch\n * overlay.\n * @property {boolean} [snapToPointer=!hitDetection] The vertex, point or segment being modified snaps to the\n * pointer coordinate when clicked within the `pixelTolerance`.\n */\n\n/**\n * @classdesc\n * Events emitted by {@link module:ol/interaction/Modify~Modify} instances are\n * instances of this type.\n */\nexport class ModifyEvent extends Event {\n /**\n * @param {ModifyEventType} type Type.\n * @param {Collection<Feature>} features\n * The features modified.\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent\n * Associated {@link module:ol/MapBrowserEvent~MapBrowserEvent}.\n */\n constructor(type, features, mapBrowserEvent) {\n super(type);\n\n /**\n * The features being modified.\n * @type {Collection<Feature>}\n * @api\n */\n this.features = features;\n\n /**\n * Associated {@link module:ol/MapBrowserEvent~MapBrowserEvent}.\n * @type {import(\"../MapBrowserEvent.js\").default}\n * @api\n */\n this.mapBrowserEvent = mapBrowserEvent;\n }\n}\n\n/***\n * @template Return\n * @typedef {import(\"../Observable\").OnSignature<import(\"../Observable\").EventTypes, import(\"../events/Event.js\").default, Return> &\n * import(\"../Observable\").OnSignature<import(\"../ObjectEventType\").Types|\n * 'change:active', import(\"../Object\").ObjectEvent, Return> &\n * import(\"../Observable\").OnSignature<'modifyend'|'modifystart', ModifyEvent, Return> &\n * import(\"../Observable\").CombinedOnSignature<import(\"../Observable\").EventTypes|import(\"../ObjectEventType\").Types|\n * 'change:active'|'modifyend'|'modifystart', Return>} ModifyOnSignature\n */\n\n/**\n * @classdesc\n * Interaction for modifying feature geometries. To modify features that have\n * been added to an existing source, construct the modify interaction with the\n * `source` option. If you want to modify features in a collection (for example,\n * the collection used by a select interaction), construct the interaction with\n * the `features` option. The interaction must be constructed with either a\n * `source` or `features` option.\n *\n * Cartesian distance from the pointer is used to determine the features that\n * will be modified. This means that geometries will only be considered for\n * modification when they are within the configured `pixelTolerance`. For point\n * geometries, the `hitDetection` option can be used to match their visual\n * appearance.\n *\n * By default, the interaction will allow deletion of vertices when the `alt`\n * key is pressed. To configure the interaction with a different condition\n * for deletion, use the `deleteCondition` option.\n * @fires ModifyEvent\n * @api\n */\nclass Modify extends PointerInteraction {\n /**\n * @param {Options} options Options.\n */\n constructor(options) {\n super(/** @type {import(\"./Pointer.js\").Options} */ (options));\n\n /***\n * @type {ModifyOnSignature<import(\"../events\").EventsKey>}\n */\n this.on;\n\n /***\n * @type {ModifyOnSignature<import(\"../events\").EventsKey>}\n */\n this.once;\n\n /***\n * @type {ModifyOnSignature<void>}\n */\n this.un;\n\n /** @private */\n this.boundHandleFeatureChange_ = this.handleFeatureChange_.bind(this);\n\n /**\n * @private\n * @type {import(\"../events/condition.js\").Condition}\n */\n this.condition_ = options.condition ? options.condition : primaryAction;\n\n /**\n * @private\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Browser event.\n * @return {boolean} Combined condition result.\n */\n this.defaultDeleteCondition_ = function (mapBrowserEvent) {\n return altKeyOnly(mapBrowserEvent) && singleClick(mapBrowserEvent);\n };\n\n /**\n * @type {import(\"../events/condition.js\").Condition}\n * @private\n */\n this.deleteCondition_ = options.deleteCondition\n ? options.deleteCondition\n : this.defaultDeleteCondition_;\n\n /**\n * @type {import(\"../events/condition.js\").Condition}\n * @private\n */\n this.insertVertexCondition_ = options.insertVertexCondition\n ? options.insertVertexCondition\n : always;\n\n /**\n * Editing vertex.\n * @type {Feature<Point>}\n * @private\n */\n this.vertexFeature_ = null;\n\n /**\n * Segments intersecting {@link this.vertexFeature_} by segment uid.\n * @type {Object<string, boolean>}\n * @private\n */\n this.vertexSegments_ = null;\n\n /**\n * @type {import(\"../pixel.js\").Pixel}\n * @private\n */\n this.lastPixel_ = [0, 0];\n\n /**\n * Tracks if the next `singleclick` event should be ignored to prevent\n * accidental deletion right after vertex creation.\n * @type {boolean}\n * @private\n */\n this.ignoreNextSingleClick_ = false;\n\n /**\n * @type {Collection<Feature>}\n * @private\n */\n this.featuresBeingModified_ = null;\n\n /**\n * Segment RTree for each layer\n * @type {RBush<SegmentData>}\n * @private\n */\n this.rBush_ = new RBush();\n\n /**\n * @type {number}\n * @private\n */\n this.pixelTolerance_ =\n options.pixelTolerance !== undefined ? options.pixelTolerance : 10;\n\n /**\n * @type {boolean}\n * @private\n */\n this.snappedToVertex_ = false;\n\n /**\n * Indicate whether the interaction is currently changing a feature's\n * coordinates.\n * @type {boolean}\n * @private\n */\n this.changingFeature_ = false;\n\n /**\n * @type {Array}\n * @private\n */\n this.dragSegments_ = [];\n\n /**\n * Draw overlay where sketch features are drawn.\n * @type {VectorLayer}\n * @private\n */\n this.overlay_ = new VectorLayer({\n source: new VectorSource({\n useSpatialIndex: false,\n wrapX: !!options.wrapX,\n }),\n style: options.style ? options.style : getDefaultStyleFunction(),\n updateWhileAnimating: true,\n updateWhileInteracting: true,\n });\n\n /**\n * @const\n * @private\n * @type {!Object<string, function(Feature, import(\"../geom/Geometry.js\").default): void>}\n */\n this.SEGMENT_WRITERS_ = {\n 'Point': this.writePointGeometry_.bind(this),\n 'LineString': this.writeLineStringGeometry_.bind(this),\n 'LinearRing': this.writeLineStringGeometry_.bind(this),\n 'Polygon': this.writePolygonGeometry_.bind(this),\n 'MultiPoint': this.writeMultiPointGeometry_.bind(this),\n 'MultiLineString': this.writeMultiLineStringGeometry_.bind(this),\n 'MultiPolygon': this.writeMultiPolygonGeometry_.bind(this),\n 'Circle': this.writeCircleGeometry_.bind(this),\n 'GeometryCollection': this.writeGeometryCollectionGeometry_.bind(this),\n };\n\n /**\n * @type {VectorSource}\n * @private\n */\n this.source_ = null;\n\n /**\n * @type {boolean|import(\"../layer/BaseVector\").default}\n */\n this.hitDetection_ = null;\n\n /** @type {Collection<Feature>} */\n let features;\n if (options.features) {\n features = options.features;\n } else if (options.source) {\n this.source_ = options.source;\n features = new Collection(this.source_.getFeatures());\n this.source_.addEventListener(\n VectorEventType.ADDFEATURE,\n this.handleSourceAdd_.bind(this)\n );\n this.source_.addEventListener(\n VectorEventType.REMOVEFEATURE,\n this.handleSourceRemove_.bind(this)\n );\n }\n if (!features) {\n throw new Error(\n 'The modify interaction requires features, a source or a layer'\n );\n }\n if (options.hitDetection) {\n this.hitDetection_ = options.hitDetection;\n }\n\n /**\n * @type {Collection<Feature>}\n * @private\n */\n this.features_ = features;\n\n this.features_.forEach(this.addFeature_.bind(this));\n this.features_.addEventListener(\n CollectionEventType.ADD,\n this.handleFeatureAdd_.bind(this)\n );\n this.features_.addEventListener(\n CollectionEventType.REMOVE,\n this.handleFeatureRemove_.bind(this)\n );\n\n /**\n * @type {import(\"../MapBrowserEvent.js\").default}\n * @private\n */\n this.lastPointerEvent_ = null;\n\n /**\n * Delta (x, y in map units) between matched rtree vertex and pointer vertex.\n * @type {Array<number>}\n */\n this.delta_ = [0, 0];\n\n /**\n * @private\n */\n this.snapToPointer_ =\n options.snapToPointer === undefined\n ? !this.hitDetection_\n : options.snapToPointer;\n }\n\n /**\n * @param {Feature} feature Feature.\n * @private\n */\n addFeature_(feature) {\n const geometry = feature.getGeometry();\n if (geometry) {\n const writer = this.SEGMENT_WRITERS_[geometry.getType()];\n if (writer) {\n writer(feature, geometry);\n }\n }\n const map = this.getMap();\n if (map && map.isRendered() && this.getActive()) {\n this.handlePointerAtPixel_(this.lastPixel_, map);\n }\n feature.addEventListener(EventType.CHANGE, this.boundHandleFeatureChange_);\n }\n\n /**\n * @param {import(\"../MapBrowserEvent.js\").default} evt Map browser event.\n * @param {Array<Array<SegmentData>>} segments The segments subject to modification.\n * @private\n */\n willModifyFeatures_(evt, segments) {\n if (!this.featuresBeingModified_) {\n this.featuresBeingModified_ = new Collection();\n const features = this.featuresBeingModified_.getArray();\n for (let i = 0, ii = segments.length; i < ii; ++i) {\n const segment = segments[i];\n for (let s = 0, ss = segment.length; s < ss; ++s) {\n const feature = segment[s].feature;\n if (feature && !features.includes(feature)) {\n this.featuresBeingModified_.push(feature);\n }\n }\n }\n if (this.featuresBeingModified_.getLength() === 0) {\n this.featuresBeingModified_ = null;\n } else {\n this.dispatchEvent(\n new ModifyEvent(\n ModifyEventType.MODIFYSTART,\n this.featuresBeingModified_,\n evt\n )\n );\n }\n }\n }\n\n /**\n * @param {Feature} feature Feature.\n * @private\n */\n removeFeature_(feature) {\n this.removeFeatureSegmentData_(feature);\n // Remove the vertex feature if the collection of candidate features is empty.\n if (this.vertexFeature_ && this.features_.getLength() === 0) {\n this.overlay_.getSource().removeFeature(this.vertexFeature_);\n this.vertexFeature_ = null;\n }\n feature.removeEventListener(\n EventType.CHANGE,\n this.boundHandleFeatureChange_\n );\n }\n\n /**\n * @param {Feature} feature Feature.\n * @private\n */\n removeFeatureSegmentData_(feature) {\n const rBush = this.rBush_;\n /** @type {Array<SegmentData>} */\n const nodesToRemove = [];\n rBush.forEach(\n /**\n * @param {SegmentData} node RTree node.\n */\n function (node) {\n if (feature === node.feature) {\n nodesToRemove.push(node);\n }\n }\n );\n for (let i = nodesToRemove.length - 1; i >= 0; --i) {\n const nodeToRemove = nodesToRemove[i];\n for (let j = this.dragSegments_.length - 1; j >= 0; --j) {\n if (this.dragSegments_[j][0] === nodeToRemove) {\n this.dragSegments_.splice(j, 1);\n }\n }\n rBush.remove(nodeToRemove);\n }\n }\n\n /**\n * Activate or deactivate the interaction.\n * @param {boolean} active Active.\n * @observable\n * @api\n */\n setActive(active) {\n if (this.vertexFeature_ && !active) {\n this.overlay_.getSource().removeFeature(this.vertexFeature_);\n this.vertexFeature_ = null;\n }\n super.setActive(active);\n }\n\n /**\n * Remove the interaction from its current map and attach it to the new map.\n * Subclasses may set up event handlers to get notified about changes to\n * the map here.\n * @param {import(\"../Map.js\").default} map Map.\n */\n setMap(map) {\n this.overlay_.setMap(map);\n super.setMap(map);\n }\n\n /**\n * Get the overlay layer that this interaction renders the modification point or vertex to.\n * @return {VectorLayer} Overlay layer.\n * @api\n */\n getOverlay() {\n return this.overlay_;\n }\n\n /**\n * @param {import(\"../source/Vector.js\").VectorSourceEvent} event Event.\n * @private\n */\n handleSourceAdd_(event) {\n if (event.feature) {\n this.features_.push(event.feature);\n }\n }\n\n /**\n * @param {import(\"../source/Vector.js\").VectorSourceEvent} event Event.\n * @private\n */\n handleSourceRemove_(event) {\n if (event.feature) {\n this.features_.remove(event.feature);\n }\n }\n\n /**\n * @param {import(\"../Collection.js\").CollectionEvent<Feature>} evt Event.\n * @private\n */\n handleFeatureAdd_(evt) {\n this.addFeature_(evt.element);\n }\n\n /**\n * @param {import(\"../events/Event.js\").default} evt Event.\n * @private\n */\n handleFeatureChange_(evt) {\n if (!this.changingFeature_) {\n const feature = /** @type {Feature} */ (evt.target);\n this.removeFeature_(feature);\n this.addFeature_(feature);\n }\n }\n\n /**\n * @param {import(\"../Collection.js\").CollectionEvent<Feature>} evt Event.\n * @private\n */\n handleFeatureRemove_(evt) {\n this.removeFeature_(evt.element);\n }\n\n /**\n * @param {Feature} feature Feature\n * @param {Point} geometry Geometry.\n * @private\n */\n writePointGeometry_(feature, geometry) {\n const coordinates = geometry.getCoordinates();\n\n /** @type {SegmentData} */\n const segmentData = {\n feature: feature,\n geometry: geometry,\n segment: [coordinates, coordinates],\n };\n\n this.rBush_.insert(geometry.getExtent(), segmentData);\n }\n\n /**\n * @param {Feature} feature Feature\n * @param {import(\"../geom/MultiPoint.js\").default} geometry Geometry.\n * @private\n */\n writeMultiPointGeometry_(feature, geometry) {\n const points = geometry.getCoordinates();\n for (let i = 0, ii = points.length; i < ii; ++i) {\n const coordinates = points[i];\n\n /** @type {SegmentData} */\n const segmentData = {\n feature: feature,\n geometry: geometry,\n depth: [i],\n index: i,\n segment: [coordinates, coordinates],\n };\n\n this.rBush_.insert(geometry.getExtent(), segmentData);\n }\n }\n\n /**\n * @param {Feature} feature Feature\n * @param {import(\"../geom/LineString.js\").default} geometry Geometry.\n * @private\n */\n writeLineStringGeometry_(feature, geometry) {\n const coordinates = geometry.getCoordinates();\n for (let i = 0, ii = coordinates.length - 1; i < ii; ++i) {\n const segment = coordinates.slice(i, i + 2);\n\n /** @type {SegmentData} */\n const segmentData = {\n feature: feature,\n geometry: geometry,\n index: i,\n segment: segment,\n };\n\n this.rBush_.insert(boundingExtent(segment), segmentData);\n }\n }\n\n /**\n * @param {Feature} feature Feature\n * @param {import(\"../geom/MultiLineString.js\").default} geometry Geometry.\n * @private\n */\n writeMultiLineStringGeometry_(feature, geometry) {\n const lines = geometry.getCoordinates();\n for (let j = 0, jj = lines.length; j < jj; ++j) {\n const coordinates = lines[j];\n for (let i = 0, ii = coordinates.length - 1; i < ii; ++i) {\n const segment = coordinates.slice(i, i + 2);\n\n /** @type {SegmentData} */\n const segmentData = {\n feature: feature,\n geometry: geometry,\n depth: [j],\n index: i,\n segment: segment,\n };\n\n this.rBush_.insert(boundingExtent(segment), segmentData);\n }\n }\n }\n\n /**\n * @param {Feature} feature Feature\n * @param {import(\"../geom/Polygon.js\").default} geometry Geometry.\n * @private\n */\n writePolygonGeometry_(feature, geometry) {\n const rings = geometry.getCoordinates();\n for (let j = 0, jj = rings.length; j < jj; ++j) {\n const coordinates = rings[j];\n for (let i = 0, ii = coordinates.length - 1; i < ii; ++i) {\n const segment = coordinates.slice(i, i + 2);\n\n /** @type {SegmentData} */\n const segmentData = {\n feature: feature,\n geometry: geometry,\n depth: [j],\n index: i,\n segment: segment,\n };\n\n this.rBush_.insert(boundingExtent(segment), segmentData);\n }\n }\n }\n\n /**\n * @param {Feature} feature Feature\n * @param {import(\"../geom/MultiPolygon.js\").default} geometry Geometry.\n * @private\n */\n writeMultiPolygonGeometry_(feature, geometry) {\n const polygons = geometry.getCoordinates();\n for (let k = 0, kk = polygons.length; k < kk; ++k) {\n const rings = polygons[k];\n for (let j = 0, jj = rings.length; j < jj; ++j) {\n const coordinates = rings[j];\n for (let i = 0, ii = coordinates.length - 1; i < ii; ++i) {\n const segment = coordinates.slice(i, i + 2);\n\n /** @type {SegmentData} */\n const segmentData = {\n feature: feature,\n geometry: geometry,\n depth: [j, k],\n index: i,\n segment: segment,\n };\n\n this.rBush_.insert(boundingExtent(segment), segmentData);\n }\n }\n }\n }\n\n /**\n * We convert a circle into two segments. The segment at index\n * {@link CIRCLE_CENTER_INDEX} is the\n * circle's center (a point). The segment at index\n * {@link CIRCLE_CIRCUMFERENCE_INDEX} is\n * the circumference, and is not a line segment.\n *\n * @param {Feature} feature Feature.\n * @param {import(\"../geom/Circle.js\").default} geometry Geometry.\n * @private\n */\n writeCircleGeometry_(feature, geometry) {\n const coordinates = geometry.getCenter();\n\n /** @type {SegmentData} */\n const centerSegmentData = {\n feature: feature,\n geometry: geometry,\n index: CIRCLE_CENTER_INDEX,\n segment: [coordinates, coordinates],\n };\n\n /** @type {SegmentData} */\n const circumferenceSegmentData = {\n feature: feature,\n geometry: geometry,\n index: CIRCLE_CIRCUMFERENCE_INDEX,\n segment: [coordinates, coordinates],\n };\n\n const featureSegments = [centerSegmentData, circumferenceSegmentData];\n centerSegmentData.featureSegments = featureSegments;\n circumferenceSegmentData.featureSegments = featureSegments;\n this.rBush_.insert(createExtent(coordinates), centerSegmentData);\n let circleGeometry = /** @type {import(\"../geom/Geometry.js\").default} */ (\n geometry\n );\n const userProjection = getUserProjection();\n if (userProjection && this.getMap()) {\n const projection = this.getMap().getView().getProjection();\n circleGeometry = circleGeometry\n .clone()\n .transform(userProjection, projection);\n circleGeometry = fromCircle(\n /** @type {import(\"../geom/Circle.js\").default} */ (circleGeometry)\n ).transform(projection, userProjection);\n }\n this.rBush_.insert(circleGeometry.getExtent(), circumferenceSegmentData);\n }\n\n /**\n * @param {Feature} feature Feature\n * @param {import(\"../geom/GeometryCollection.js\").default} geometry Geometry.\n * @private\n */\n writeGeometryCollectionGeometry_(feature, geometry) {\n const geometries = geometry.getGeometriesArray();\n for (let i = 0; i < geometries.length; ++i) {\n const geometry = geometries[i];\n const writer = this.SEGMENT_WRITERS_[geometry.getType()];\n writer(feature, geometry);\n }\n }\n\n /**\n * @param {import(\"../coordinate.js\").Coordinate} coordinates Coordinates.\n * @param {Array<Feature>} features The features being modified.\n * @param {Array<import(\"../geom/SimpleGeometry.js\").default>} geometries The geometries being modified.\n * @return {Feature} Vertex feature.\n * @private\n */\n createOrUpdateVertexFeature_(coordinates, features, geometries) {\n let vertexFeature = this.vertexFeature_;\n if (!vertexFeature) {\n vertexFeature = new Feature(new Point(coordinates));\n this.vertexFeature_ = vertexFeature;\n this.overlay_.getSource().addFeature(vertexFeature);\n } else {\n const geometry = vertexFeature.getGeometry();\n geometry.setCoordinates(coordinates);\n }\n vertexFeature.set('features', features);\n vertexFeature.set('geometries', geometries);\n return vertexFeature;\n }\n\n /**\n * Handles the {@link module:ol/MapBrowserEvent~MapBrowserEvent map browser event} and may modify the geometry.\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Map browser event.\n * @return {boolean} `false` to stop event propagation.\n */\n handleEvent(mapBrowserEvent) {\n if (!mapBrowserEvent.originalEvent) {\n return true;\n }\n this.lastPointerEvent_ = mapBrowserEvent;\n\n let handled;\n if (\n !mapBrowserEvent.map.getView().getInteracting() &&\n mapBrowserEvent.type == MapBrowserEventType.POINTERMOVE &&\n !this.handlingDownUpSequence\n ) {\n this.handlePointerMove_(mapBrowserEvent);\n }\n if (this.vertexFeature_ && this.deleteCondition_(mapBrowserEvent)) {\n if (\n mapBrowserEvent.type != MapBrowserEventType.SINGLECLICK ||\n !this.ignoreNextSingleClick_\n ) {\n handled = this.removePoint();\n } else {\n handled = true;\n }\n }\n\n if (mapBrowserEvent.type == MapBrowserEventType.SINGLECLICK) {\n this.ignoreNextSingleClick_ = false;\n }\n\n return super.handleEvent(mapBrowserEvent) && !handled;\n }\n\n /**\n * Handle pointer drag events.\n * @param {import(\"../MapBrowserEvent.js\").default} evt Event.\n */\n handleDragEvent(evt) {\n this.ignoreNextSingleClick_ = false;\n this.willModifyFeatures_(evt, this.dragSegments_);\n\n const vertex = [\n evt.coordinate[0] + this.delta_[0],\n evt.coordinate[1] + this.delta_[1],\n ];\n const features = [];\n const geometries = [];\n for (let i = 0, ii = this.dragSegments_.length; i < ii; ++i) {\n const dragSegment = this.dragSegments_[i];\n const segmentData = dragSegment[0];\n const feature = segmentData.feature;\n if (!features.includes(feature)) {\n features.push(feature);\n }\n const geometry = segmentData.geometry;\n if (!geometries.includes(geometry)) {\n geometries.push(geometry);\n }\n const depth = segmentData.depth;\n let coordinates;\n const segment = segmentData.segment;\n const index = dragSegment[1];\n\n while (vertex.length < geometry.getStride()) {\n vertex.push(segment[index][vertex.length]);\n }\n\n switch (geometry.getType()) {\n case 'Point':\n coordinates = vertex;\n segment[0] = vertex;\n segment[1] = vertex;\n break;\n case 'MultiPoint':\n coordinates = geometry.getCoordinates();\n coordinates[segmentData.index] = vertex;\n segment[0] = vertex;\n segment[1] = vertex;\n break;\n case 'LineString':\n coordinates = geometry.getCoordinates();\n coordinates[segmentData.index + index] = vertex;\n segment[index] = vertex;\n break;\n case 'MultiLineString':\n coordinates = geometry.getCoordinates();\n coordinates[depth[0]][segmentData.index + index] = vertex;\n segment[index] = vertex;\n break;\n case 'Polygon':\n coordinates = geometry.getCoordinates();\n coordinates[depth[0]][segmentData.index + index] = vertex;\n segment[index] = vertex;\n break;\n case 'MultiPolygon':\n coordinates = geometry.getCoordinates();\n coordinates[depth[1]][depth[0]][segmentData.index + index] = vertex;\n segment[index] = vertex;\n break;\n case 'Circle':\n segment[0] = vertex;\n segment[1] = vertex;\n if (segmentData.index === CIRCLE_CENTER_INDEX) {\n this.changingFeature_ = true;\n geometry.setCenter(vertex);\n this.changingFeature_ = false;\n } else {\n // We're dragging the circle's circumference:\n this.changingFeature_ = true;\n const projection = evt.map.getView().getProjection();\n let radius = coordinateDistance(\n fromUserCoordinate(geometry.getCenter(), projection),\n fromUserCoordinate(vertex, projection)\n );\n const userProjection = getUserProjection();\n if (userProjection) {\n const circleGeometry = geometry\n .clone()\n .transform(userProjection, projection);\n circleGeometry.setRadius(radius);\n radius = circleGeometry\n .transform(projection, userProjection)\n .getRadius();\n }\n geometry.setRadius(radius);\n this.changingFeature_ = false;\n }\n break;\n default:\n // pass\n }\n\n if (coordinates) {\n this.setGeometryCoordinates_(geometry, coordinates);\n }\n }\n this.createOrUpdateVertexFeature_(vertex, features, geometries);\n }\n\n /**\n * Handle pointer down events.\n * @param {import(\"../MapBrowserEvent.js\").default} evt Event.\n * @return {boolean} If the event was consumed.\n */\n handleDownEvent(evt) {\n if (!this.condition_(evt)) {\n return false;\n }\n const pixelCoordinate = evt.coordinate;\n this.handlePointerAtPixel_(evt.pixel, evt.map, pixelCoordinate);\n this.dragSegments_.length = 0;\n this.featuresBeingModified_ = null;\n const vertexFeature = this.vertexFeature_;\n if (vertexFeature) {\n const projection = evt.map.getView().getProjection();\n const insertVertices = [];\n const vertex = vertexFeature.getGeometry().getCoordinates();\n const vertexExtent = boundingExtent([vertex]);\n const segmentDataMatches = this.rBush_.getInExtent(vertexExtent);\n const componentSegments = {};\n segmentDataMatches.sort(compareIndexes);\n for (let i = 0, ii = segmentDataMatches.length; i < ii; ++i) {\n const segmentDataMatch = segmentDataMatches[i];\n const segment = segmentDataMatch.segment;\n let uid = getUid(segmentDataMatch.geometry);\n const depth = segmentDataMatch.depth;\n if (depth) {\n uid += '-' + depth.join('-'); // separate feature components\n }\n if (!componentSegments[uid]) {\n componentSegments[uid] = new Array(2);\n }\n\n if (\n segmentDataMatch.geometry.getType() === 'Circle' &&\n segmentDataMatch.index === CIRCLE_CIRCUMFERENCE_INDEX\n ) {\n const closestVertex = closestOnSegmentData(\n pixelCoordinate,\n segmentDataMatch,\n projection\n );\n if (\n coordinatesEqual(closestVertex, vertex) &&\n !componentSegments[uid][0]\n ) {\n this.dragSegments_.push([segmentDataMatch, 0]);\n componentSegments[uid][0] = segmentDataMatch;\n }\n continue;\n }\n\n if (\n coordinatesEqual(segment[0], vertex) &&\n !componentSegments[uid][0]\n ) {\n this.dragSegments_.push([segmentDataMatch, 0]);\n componentSegments[uid][0] = segmentDataMatch;\n continue;\n }\n\n if (\n coordinatesEqual(segment[1], vertex) &&\n !componentSegments[uid][1]\n ) {\n if (\n componentSegments[uid][0] &&\n componentSegments[uid][0].index === 0\n ) {\n let coordinates = segmentDataMatch.geometry.getCoordinates();\n switch (segmentDataMatch.geometry.getType()) {\n // prevent dragging closed linestrings by the connecting node\n case 'LineString':\n case 'MultiLineString':\n continue;\n // if dragging the first vertex of a polygon, ensure the other segment\n // belongs to the closing vertex of the linear ring\n case 'MultiPolygon':\n coordinates = coordinates[depth[1]];\n /* falls through */\n case 'Polygon':\n if (\n segmentDataMatch.index !==\n coordinates[depth[0]].length - 2\n ) {\n continue;\n }\n break;\n default:\n // pass\n }\n }\n\n this.dragSegments_.push([segmentDataMatch, 1]);\n componentSegments[uid][1] = segmentDataMatch;\n continue;\n }\n\n if (\n getUid(segment) in this.vertexSegments_ &&\n !componentSegments[uid][0] &&\n !componentSegments[uid][1] &&\n this.insertVertexCondition_(evt)\n ) {\n insertVertices.push(segmentDataMatch);\n }\n }\n\n if (insertVertices.length) {\n this.willModifyFeatures_(evt, [insertVertices]);\n }\n\n for (let j = insertVertices.length - 1; j >= 0; --j) {\n this.insertVertex_(insertVertices[j], vertex);\n }\n }\n return !!this.vertexFeature_;\n }\n\n /**\n * Handle pointer up events.\n * @param {import(\"../MapBrowserEvent.js\").default} evt Event.\n * @return {boolean} If the event was consumed.\n */\n handleUpEvent(evt) {\n for (let i = this.dragSegments_.length - 1; i >= 0; --i) {\n const segmentData = this.dragSegments_[i][0];\n const geometry = segmentData.geometry;\n if (geometry.getType() === 'Circle') {\n // Update a circle object in the R* bush:\n const coordinates = geometry.getCenter();\n const centerSegmentData = segmentData.featureSegments[0];\n const circumferenceSegmentData = segmentData.featureSegments[1];\n centerSegmentData.segment[0] = coordinates;\n centerSegmentData.segment[1] = coordinates;\n circumferenceSegmentData.segment[0] = coordinates;\n circumferenceSegmentData.segment[1] = coordinates;\n this.rBush_.update(createExtent(coordinates), centerSegmentData);\n let circleGeometry = geometry;\n const userProjection = getUserProjection();\n if (userProjection) {\n const projection = evt.map.getView().getProjection();\n circleGeometry = circleGeometry\n .clone()\n .transform(userProjection, projection);\n circleGeometry = fromCircle(circleGeometry).transform(\n projection,\n userProjection\n );\n }\n this.rBush_.update(\n circleGeometry.getExtent(),\n circumferenceSegmentData\n );\n } else {\n this.rBush_.update(boundingExtent(segmentData.segment), segmentData);\n }\n }\n if (this.featuresBeingModified_) {\n this.dispatchEvent(\n new ModifyEvent(\n ModifyEventType.MODIFYEND,\n this.featuresBeingModified_,\n evt\n )\n );\n this.featuresBeingModified_ = null;\n }\n return false;\n }\n\n /**\n * @param {import(\"../MapBrowserEvent.js\").default} evt Event.\n * @private\n */\n handlePointerMove_(evt) {\n this.lastPixel_ = evt.pixel;\n this.handlePointerAtPixel_(evt.pixel, evt.map, evt.coordinate);\n }\n\n /**\n * @param {import(\"../pixel.js\").Pixel} pixel Pixel\n * @param {import(\"../Map.js\").default} map Map.\n * @param {import(\"../coordinate.js\").Coordinate} [coordinate] The pixel Coordinate.\n * @private\n */\n handlePointerAtPixel_(pixel, map, coordinate) {\n const pixelCoordinate = coordinate || map.getCoordinateFromPixel(pixel);\n const projection = map.getView().getProjection();\n const sortByDistance = function (a, b) {\n return (\n projectedDistanceToSegmentDataSquared(pixelCoordinate, a, projection) -\n projectedDistanceToSegmentDataSquared(pixelCoordinate, b, projection)\n );\n };\n\n /** @type {Array<SegmentData>|undefined} */\n let nodes;\n /** @type {Point|undefined} */\n let hitPointGeometry;\n if (this.hitDetection_) {\n const layerFilter =\n typeof this.hitDetection_ === 'object'\n ? (layer) => layer === this.hitDetection_\n : undefined;\n map.forEachFeatureAtPixel(\n pixel,\n (feature, layer, geometry) => {\n if (geometry) {\n geometry = new Point(\n toUserCoordinate(geometry.getCoordinates(), projection)\n );\n }\n const geom = geometry || feature.getGeometry();\n if (\n geom.getType() === 'Point' &&\n feature instanceof Feature &&\n this.features_.getArray().includes(feature)\n ) {\n hitPointGeometry = /** @type {Point} */ (geom);\n const coordinate = /** @type {Point} */ (feature.getGeometry())\n .getFlatCoordinates()\n .slice(0, 2);\n nodes = [\n {\n feature,\n geometry: hitPointGeometry,\n segment: [coordinate, coordinate],\n },\n ];\n }\n return true;\n },\n {layerFilter}\n );\n }\n if (!nodes) {\n const viewExtent = fromUserExtent(\n createExtent(pixelCoordinate, tempExtent),\n projection\n );\n const buffer = map.getView().getResolution() * this.pixelTolerance_;\n const box = toUserExtent(\n bufferExtent(viewExtent, buffer, tempExtent),\n projection\n );\n nodes = this.rBush_.getInExtent(box);\n }\n\n if (nodes && nodes.length > 0) {\n const node = nodes.sort(sortByDistance)[0];\n const closestSegment = node.segment;\n let vertex = closestOnSegmentData(pixelCoordinate, node, projection);\n const vertexPixel = map.getPixelFromCoordinate(vertex);\n let dist = coordinateDistance(pixel, vertexPixel);\n if (hitPointGeometry || dist <= this.pixelTolerance_) {\n /** @type {Object<string, boolean>} */\n const vertexSegments = {};\n vertexSegments[getUid(closestSegment)] = true;\n\n if (!this.snapToPointer_) {\n this.delta_[0] = vertex[0] - pixelCoordinate[0];\n this.delta_[1] = vertex[1] - pixelCoordinate[1];\n }\n if (\n node.geometry.getType() === 'Circle' &&\n node.index === CIRCLE_CIRCUMFERENCE_INDEX\n ) {\n this.snappedToVertex_ = true;\n this.createOrUpdateVertexFeature_(\n vertex,\n [node.feature],\n [node.geometry]\n );\n } else {\n const pixel1 = map.getPixelFromCoordinate(closestSegment[0]);\n const pixel2 = map.getPixelFromCoordinate(closestSegment[1]);\n const squaredDist1 = squaredCoordinateDistance(vertexPixel, pixel1);\n const squaredDist2 = squaredCoordinateDistance(vertexPixel, pixel2);\n dist = Math.sqrt(Math.min(squaredDist1, squaredDist2));\n this.snappedToVertex_ = dist <= this.pixelTolerance_;\n if (this.snappedToVertex_) {\n vertex =\n squaredDist1 > squaredDist2\n ? closestSegment[1]\n : closestSegment[0];\n }\n this.createOrUpdateVertexFeature_(\n vertex,\n [node.feature],\n [node.geometry]\n );\n const geometries = {};\n geometries[getUid(node.geometry)] = true;\n for (let i = 1, ii = nodes.length; i < ii; ++i) {\n const segment = nodes[i].segment;\n if (\n (coordinatesEqual(closestSegment[0], segment[0]) &&\n coordinatesEqual(closestSegment[1], segment[1])) ||\n (coordinatesEqual(closestSegment[0], segment[1]) &&\n coordinatesEqual(closestSegment[1], segment[0]))\n ) {\n const geometryUid = getUid(nodes[i].geometry);\n if (!(geometryUid in geometries)) {\n geometries[geometryUid] = true;\n vertexSegments[getUid(segment)] = true;\n }\n } else {\n break;\n }\n }\n }\n\n this.vertexSegments_ = vertexSegments;\n return;\n }\n }\n if (this.vertexFeature_) {\n this.overlay_.getSource().removeFeature(this.vertexFeature_);\n this.vertexFeature_ = null;\n }\n }\n\n /**\n * @param {SegmentData} segmentData Segment data.\n * @param {import(\"../coordinate.js\").Coordinate} vertex Vertex.\n * @private\n */\n insertVertex_(segmentData, vertex) {\n const segment = segmentData.segment;\n const feature = segmentData.feature;\n const geometry = segmentData.geometry;\n const depth = segmentData.depth;\n const index = segmentData.index;\n let coordinates;\n\n while (vertex.length < geometry.getStride()) {\n vertex.push(0);\n }\n\n switch (geometry.getType()) {\n case 'MultiLineString':\n coordinates = geometry.getCoordinates();\n coordinates[depth[0]].splice(index + 1, 0, vertex);\n break;\n case 'Polygon':\n coordinates = geometry.getCoordinates();\n coordinates[depth[0]].splice(index + 1, 0, vertex);\n break;\n case 'MultiPolygon':\n coordinates = geometry.getCoordinates();\n coordinates[depth[1]][depth[0]].splice(index + 1, 0, vertex);\n break;\n case 'LineString':\n coordinates = geometry.getCoordinates();\n coordinates.splice(index + 1, 0, vertex);\n break;\n default:\n return;\n }\n\n this.setGeometryCoordinates_(geometry, coordinates);\n const rTree = this.rBush_;\n rTree.remove(segmentData);\n this.updateSegmentIndices_(geometry, index, depth, 1);\n\n /** @type {SegmentData} */\n const newSegmentData = {\n segment: [segment[0], vertex],\n feature: feature,\n geometry: geometry,\n depth: depth,\n index: index,\n };\n\n rTree.insert(boundingExtent(newSegmentData.segment), newSegmentData);\n this.dragSegments_.push([newSegmentData, 1]);\n\n /** @type {SegmentData} */\n const newSegmentData2 = {\n segment: [vertex, segment[1]],\n feature: feature,\n geometry: geometry,\n depth: depth,\n index: index + 1,\n };\n\n rTree.insert(boundingExtent(newSegmentData2.segment), newSegmentData2);\n this.dragSegments_.push([newSegmentData2, 0]);\n this.ignoreNextSingleClick_ = true;\n }\n\n /**\n * Removes the vertex currently being pointed.\n * @return {boolean} True when a vertex was removed.\n * @api\n */\n removePoint() {\n if (\n this.lastPointerEvent_ &&\n this.lastPointerEvent_.type != MapBrowserEventType.POINTERDRAG\n ) {\n const evt = this.lastPointerEvent_;\n this.willModifyFeatures_(evt, this.dragSegments_);\n const removed = this.removeVertex_();\n if (this.featuresBeingModified_) {\n this.dispatchEvent(\n new ModifyEvent(\n ModifyEventType.MODIFYEND,\n this.featuresBeingModified_,\n evt\n )\n );\n }\n\n this.featuresBeingModified_ = null;\n return removed;\n }\n return false;\n }\n\n /**\n * Removes a vertex from all matching features.\n * @return {boolean} True when a vertex was removed.\n * @private\n */\n removeVertex_() {\n const dragSegments = this.dragSegments_;\n const segmentsByFeature = {};\n let deleted = false;\n let component, coordinates, dragSegment, geometry, i, index, left;\n let newIndex, right, segmentData, uid;\n for (i = dragSegments.length - 1; i >= 0; --i) {\n dragSegment = dragSegments[i];\n segmentData = dragSegment[0];\n uid = getUid(segmentData.feature);\n if (segmentData.depth) {\n // separate feature components\n uid += '-' + segmentData.depth.join('-');\n }\n if (!(uid in segmentsByFeature)) {\n segmentsByFeature[uid] = {};\n }\n if (dragSegment[1] === 0) {\n segmentsByFeature[uid].right = segmentData;\n segmentsByFeature[uid].index = segmentData.index;\n } else if (dragSegment[1] == 1) {\n segmentsByFeature[uid].left = segmentData;\n segmentsByFeature[uid].index = segmentData.index + 1;\n }\n }\n for (uid in segmentsByFeature) {\n right = segmentsByFeature[uid].right;\n left = segmentsByFeature[uid].left;\n index = segmentsByFeature[uid].index;\n newIndex = index - 1;\n if (left !== undefined) {\n segmentData = left;\n } else {\n segmentData = right;\n }\n if (newIndex < 0) {\n newIndex = 0;\n }\n geometry = segmentData.geometry;\n coordinates = geometry.getCoordinates();\n component = coordinates;\n deleted = false;\n switch (geometry.getType()) {\n case 'MultiLineString':\n if (coordinates[segmentData.depth[0]].length > 2) {\n coordinates[segmentData.depth[0]].splice(index, 1);\n deleted = true;\n }\n break;\n case 'LineString':\n if (coordinates.length > 2) {\n coordinates.splice(index, 1);\n deleted = true;\n }\n break;\n case 'MultiPolygon':\n component = component[segmentData.depth[1]];\n /* falls through */\n case 'Polygon':\n component = component[segmentData.depth[0]];\n if (component.length > 4) {\n if (index == component.length - 1) {\n index = 0;\n }\n component.splice(index, 1);\n deleted = true;\n if (index === 0) {\n // close the ring again\n component.pop();\n component.push(component[0]);\n newIndex = component.length - 1;\n }\n }\n break;\n default:\n // pass\n }\n\n if (deleted) {\n this.setGeometryCoordinates_(geometry, coordinates);\n const segments = [];\n if (left !== undefined) {\n this.rBush_.remove(left);\n segments.push(left.segment[0]);\n }\n if (right !== undefined) {\n this.rBush_.remove(right);\n segments.push(right.segment[1]);\n }\n if (left !== undefined && right !== undefined) {\n /** @type {SegmentData} */\n const newSegmentData = {\n depth: segmentData.depth,\n feature: segmentData.feature,\n geometry: segmentData.geometry,\n index: newIndex,\n segment: segments,\n };\n\n this.rBush_.insert(\n boundingExtent(newSegmentData.segment),\n newSegmentData\n );\n }\n this.updateSegmentIndices_(geometry, index, segmentData.depth, -1);\n if (this.vertexFeature_) {\n this.overlay_.getSource().removeFeature(this.vertexFeature_);\n this.vertexFeature_ = null;\n }\n dragSegments.length = 0;\n }\n }\n return deleted;\n }\n\n /**\n * @param {import(\"../geom/SimpleGeometry.js\").default} geometry Geometry.\n * @param {Array} coordinates Coordinates.\n * @private\n */\n setGeometryCoordinates_(geometry, coordinates) {\n this.changingFeature_ = true;\n geometry.setCoordinates(coordinates);\n this.changingFeature_ = false;\n }\n\n /**\n * @param {import(\"../geom/SimpleGeometry.js\").default} geometry Geometry.\n * @param {number} index Index.\n * @param {Array<number>|undefined} depth Depth.\n * @param {number} delta Delta (1 or -1).\n * @private\n */\n updateSegmentIndices_(geometry, index, depth, delta) {\n this.rBush_.forEachInExtent(\n geometry.getExtent(),\n function (segmentDataMatch) {\n if (\n segmentDataMatch.geometry === geometry &&\n (depth === undefined ||\n segmentDataMatch.depth === undefined ||\n equals(segmentDataMatch.depth, depth)) &&\n segmentDataMatch.index > index\n ) {\n segmentDataMatch.index += delta;\n }\n }\n );\n }\n}\n\n/**\n * @param {SegmentData} a The first segment data.\n * @param {SegmentData} b The second segment data.\n * @return {number} The difference in indexes.\n */\nfunction compareIndexes(a, b) {\n return a.index - b.index;\n}\n\n/**\n * Returns the distance from a point to a line segment.\n *\n * @param {import(\"../coordinate.js\").Coordinate} pointCoordinates The coordinates of the point from\n * which to calculate the distance.\n * @param {SegmentData} segmentData The object describing the line\n * segment we are calculating the distance to.\n * @param {import(\"../proj/Projection.js\").default} projection The view projection.\n * @return {number} The square of the distance between a point and a line segment.\n */\nfunction projectedDistanceToSegmentDataSquared(\n pointCoordinates,\n segmentData,\n projection\n) {\n const geometry = segmentData.geometry;\n\n if (geometry.getType() === 'Circle') {\n let circleGeometry = /** @type {import(\"../geom/Circle.js\").default} */ (\n geometry\n );\n\n if (segmentData.index === CIRCLE_CIRCUMFERENCE_INDEX) {\n const userProjection = getUserProjection();\n if (userProjection) {\n circleGeometry = /** @type {import(\"../geom/Circle.js\").default} */ (\n circleGeometry.clone().transform(userProjection, projection)\n );\n }\n const distanceToCenterSquared = squaredCoordinateDistance(\n circleGeometry.getCenter(),\n fromUserCoordinate(pointCoordinates, projection)\n );\n const distanceToCircumference =\n Math.sqrt(distanceToCenterSquared) - circleGeometry.getRadius();\n return distanceToCircumference * distanceToCircumference;\n }\n }\n\n const coordinate = fromUserCoordinate(pointCoordinates, projection);\n tempSegment[0] = fromUserCoordinate(segmentData.segment[0], projection);\n tempSegment[1] = fromUserCoordinate(segmentData.segment[1], projection);\n return squaredDistanceToSegment(coordinate, tempSegment);\n}\n\n/**\n * Returns the point closest to a given line segment.\n *\n * @param {import(\"../coordinate.js\").Coordinate} pointCoordinates The point to which a closest point\n * should be found.\n * @param {SegmentData} segmentData The object describing the line\n * segment which should contain the closest point.\n * @param {import(\"../proj/Projection.js\").default} projection The view projection.\n * @return {import(\"../coordinate.js\").Coordinate} The point closest to the specified line segment.\n */\nfunction closestOnSegmentData(pointCoordinates, segmentData, projection) {\n const geometry = segmentData.geometry;\n\n if (\n geometry.getType() === 'Circle' &&\n segmentData.index === CIRCLE_CIRCUMFERENCE_INDEX\n ) {\n let circleGeometry = /** @type {import(\"../geom/Circle.js\").default} */ (\n geometry\n );\n const userProjection = getUserProjection();\n if (userProjection) {\n circleGeometry = /** @type {import(\"../geom/Circle.js\").default} */ (\n circleGeometry.clone().transform(userProjection, projection)\n );\n }\n return toUserCoordinate(\n circleGeometry.getClosestPoint(\n fromUserCoordinate(pointCoordinates, projection)\n ),\n projection\n );\n }\n const coordinate = fromUserCoordinate(pointCoordinates, projection);\n tempSegment[0] = fromUserCoordinate(segmentData.segment[0], projection);\n tempSegment[1] = fromUserCoordinate(segmentData.segment[1], projection);\n return toUserCoordinate(\n closestOnSegment(coordinate, tempSegment),\n projection\n );\n}\n\n/**\n * @return {import(\"../style/Style.js\").StyleFunction} Styles.\n */\nfunction getDefaultStyleFunction() {\n const style = createEditingStyle();\n return function (feature, resolution) {\n return style['Point'];\n };\n}\n\nexport default Modify;\n","/**\n * @module ol/geom/Circle\n */\nimport SimpleGeometry from './SimpleGeometry.js';\nimport {createOrUpdate, forEachCorner, intersects} from '../extent.js';\nimport {deflateCoordinate} from './flat/deflate.js';\nimport {rotate} from './flat/transform.js';\n\n/**\n * @classdesc\n * Circle geometry.\n *\n * @api\n */\nclass Circle extends SimpleGeometry {\n /**\n * @param {!import(\"../coordinate.js\").Coordinate} center Center.\n * For internal use, flat coordinates in combination with `layout` and no\n * `radius` are also accepted.\n * @param {number} [radius] Radius.\n * @param {import(\"./Geometry.js\").GeometryLayout} [layout] Layout.\n */\n constructor(center, radius, layout) {\n super();\n if (layout !== undefined && radius === undefined) {\n this.setFlatCoordinates(layout, center);\n } else {\n radius = radius ? radius : 0;\n this.setCenterAndRadius(center, radius, layout);\n }\n }\n\n /**\n * Make a complete copy of the geometry.\n * @return {!Circle} Clone.\n * @api\n */\n clone() {\n const circle = new Circle(\n this.flatCoordinates.slice(),\n undefined,\n this.layout\n );\n circle.applyProperties(this);\n return circle;\n }\n\n /**\n * @param {number} x X.\n * @param {number} y Y.\n * @param {import(\"../coordinate.js\").Coordinate} closestPoint Closest point.\n * @param {number} minSquaredDistance Minimum squared distance.\n * @return {number} Minimum squared distance.\n */\n closestPointXY(x, y, closestPoint, minSquaredDistance) {\n const flatCoordinates = this.flatCoordinates;\n const dx = x - flatCoordinates[0];\n const dy = y - flatCoordinates[1];\n const squaredDistance = dx * dx + dy * dy;\n if (squaredDistance < minSquaredDistance) {\n if (squaredDistance === 0) {\n for (let i = 0; i < this.stride; ++i) {\n closestPoint[i] = flatCoordinates[i];\n }\n } else {\n const delta = this.getRadius() / Math.sqrt(squaredDistance);\n closestPoint[0] = flatCoordinates[0] + delta * dx;\n closestPoint[1] = flatCoordinates[1] + delta * dy;\n for (let i = 2; i < this.stride; ++i) {\n closestPoint[i] = flatCoordinates[i];\n }\n }\n closestPoint.length = this.stride;\n return squaredDistance;\n }\n return minSquaredDistance;\n }\n\n /**\n * @param {number} x X.\n * @param {number} y Y.\n * @return {boolean} Contains (x, y).\n */\n containsXY(x, y) {\n const flatCoordinates = this.flatCoordinates;\n const dx = x - flatCoordinates[0];\n const dy = y - flatCoordinates[1];\n return dx * dx + dy * dy <= this.getRadiusSquared_();\n }\n\n /**\n * Return the center of the circle as {@link module:ol/coordinate~Coordinate coordinate}.\n * @return {import(\"../coordinate.js\").Coordinate} Center.\n * @api\n */\n getCenter() {\n return this.flatCoordinates.slice(0, this.stride);\n }\n\n /**\n * @param {import(\"../extent.js\").Extent} extent Extent.\n * @protected\n * @return {import(\"../extent.js\").Extent} extent Extent.\n */\n computeExtent(extent) {\n const flatCoordinates = this.flatCoordinates;\n const radius = flatCoordinates[this.stride] - flatCoordinates[0];\n return createOrUpdate(\n flatCoordinates[0] - radius,\n flatCoordinates[1] - radius,\n flatCoordinates[0] + radius,\n flatCoordinates[1] + radius,\n extent\n );\n }\n\n /**\n * Return the radius of the circle.\n * @return {number} Radius.\n * @api\n */\n getRadius() {\n return Math.sqrt(this.getRadiusSquared_());\n }\n\n /**\n * @private\n * @return {number} Radius squared.\n */\n getRadiusSquared_() {\n const dx = this.flatCoordinates[this.stride] - this.flatCoordinates[0];\n const dy = this.flatCoordinates[this.stride + 1] - this.flatCoordinates[1];\n return dx * dx + dy * dy;\n }\n\n /**\n * Get the type of this geometry.\n * @return {import(\"./Geometry.js\").Type} Geometry type.\n * @api\n */\n getType() {\n return 'Circle';\n }\n\n /**\n * Test if the geometry and the passed extent intersect.\n * @param {import(\"../extent.js\").Extent} extent Extent.\n * @return {boolean} `true` if the geometry and the extent intersect.\n * @api\n */\n intersectsExtent(extent) {\n const circleExtent = this.getExtent();\n if (intersects(extent, circleExtent)) {\n const center = this.getCenter();\n\n if (extent[0] <= center[0] && extent[2] >= center[0]) {\n return true;\n }\n if (extent[1] <= center[1] && extent[3] >= center[1]) {\n return true;\n }\n\n return forEachCorner(extent, this.intersectsCoordinate.bind(this));\n }\n return false;\n }\n\n /**\n * Set the center of the circle as {@link module:ol/coordinate~Coordinate coordinate}.\n * @param {import(\"../coordinate.js\").Coordinate} center Center.\n * @api\n */\n setCenter(center) {\n const stride = this.stride;\n const radius = this.flatCoordinates[stride] - this.flatCoordinates[0];\n const flatCoordinates = center.slice();\n flatCoordinates[stride] = flatCoordinates[0] + radius;\n for (let i = 1; i < stride; ++i) {\n flatCoordinates[stride + i] = center[i];\n }\n this.setFlatCoordinates(this.layout, flatCoordinates);\n this.changed();\n }\n\n /**\n * Set the center (as {@link module:ol/coordinate~Coordinate coordinate}) and the radius (as\n * number) of the circle.\n * @param {!import(\"../coordinate.js\").Coordinate} center Center.\n * @param {number} radius Radius.\n * @param {import(\"./Geometry.js\").GeometryLayout} [layout] Layout.\n * @api\n */\n setCenterAndRadius(center, radius, layout) {\n this.setLayout(layout, center, 0);\n if (!this.flatCoordinates) {\n this.flatCoordinates = [];\n }\n /** @type {Array<number>} */\n const flatCoordinates = this.flatCoordinates;\n let offset = deflateCoordinate(flatCoordinates, 0, center, this.stride);\n flatCoordinates[offset++] = flatCoordinates[0] + radius;\n for (let i = 1, ii = this.stride; i < ii; ++i) {\n flatCoordinates[offset++] = flatCoordinates[i];\n }\n flatCoordinates.length = offset;\n this.changed();\n }\n\n getCoordinates() {\n return null;\n }\n\n setCoordinates(coordinates, layout) {}\n\n /**\n * Set the radius of the circle. The radius is in the units of the projection.\n * @param {number} radius Radius.\n * @api\n */\n setRadius(radius) {\n this.flatCoordinates[this.stride] = this.flatCoordinates[0] + radius;\n this.changed();\n }\n\n /**\n * Rotate the geometry around a given coordinate. This modifies the geometry\n * coordinates in place.\n * @param {number} angle Rotation angle in counter-clockwise radians.\n * @param {import(\"../coordinate.js\").Coordinate} anchor The rotation center.\n * @api\n */\n rotate(angle, anchor) {\n const center = this.getCenter();\n const stride = this.getStride();\n this.setCenter(\n rotate(center, 0, center.length, stride, angle, anchor, center)\n );\n this.changed();\n }\n}\n\n/**\n * Transform each coordinate of the circle from one coordinate reference system\n * to another. 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 *\n * Internally a circle is currently represented by two points: the center of\n * the circle `[cx, cy]`, and the point to the right of the circle\n * `[cx + r, cy]`. This `transform` function just transforms these two points.\n * So the resulting geometry is also a circle, and that circle does not\n * correspond to the shape that would be obtained by transforming every point\n * of the original circle.\n *\n * @param {import(\"../proj.js\").ProjectionLike} source The current projection. Can be a\n * string identifier or a {@link module:ol/proj/Projection~Projection} object.\n * @param {import(\"../proj.js\").ProjectionLike} destination The desired projection. Can be a\n * string identifier or a {@link module:ol/proj/Projection~Projection} object.\n * @return {Circle} This geometry. Note that original geometry is\n * modified in place.\n * @function\n * @api\n */\nCircle.prototype.transform;\nexport default Circle;\n","/**\n * @module ol/interaction/Draw\n */\nimport Circle from '../geom/Circle.js';\nimport Event from '../events/Event.js';\nimport EventType from '../events/EventType.js';\nimport Feature from '../Feature.js';\nimport GeometryCollection from '../geom/GeometryCollection.js';\nimport InteractionProperty from './Property.js';\nimport LineString from '../geom/LineString.js';\nimport MapBrowserEvent from '../MapBrowserEvent.js';\nimport MapBrowserEventType from '../MapBrowserEventType.js';\nimport MultiLineString from '../geom/MultiLineString.js';\nimport MultiPoint from '../geom/MultiPoint.js';\nimport MultiPolygon from '../geom/MultiPolygon.js';\nimport Point from '../geom/Point.js';\nimport PointerInteraction from './Pointer.js';\nimport Polygon, {fromCircle, makeRegular} from '../geom/Polygon.js';\nimport VectorLayer from '../layer/Vector.js';\nimport VectorSource from '../source/Vector.js';\nimport {FALSE, TRUE} from '../functions.js';\nimport {\n always,\n never,\n noModifierKeys,\n shiftKeyOnly,\n} from '../events/condition.js';\nimport {\n boundingExtent,\n getBottomLeft,\n getBottomRight,\n getTopLeft,\n getTopRight,\n} from '../extent.js';\nimport {clamp, squaredDistance, toFixed} from '../math.js';\nimport {createEditingStyle} from '../style/Style.js';\nimport {\n distance,\n squaredDistance as squaredCoordinateDistance,\n} from '../coordinate.js';\nimport {fromUserCoordinate, getUserProjection} from '../proj.js';\nimport {getStrideForLayout} from '../geom/SimpleGeometry.js';\n\n/**\n * @typedef {Object} Options\n * @property {import(\"../geom/Geometry.js\").Type} type Geometry type of\n * the geometries being drawn with this instance.\n * @property {number} [clickTolerance=6] The maximum distance in pixels between\n * \"down\" and \"up\" for a \"up\" event to be considered a \"click\" event and\n * actually add a point/vertex to the geometry being drawn. The default of `6`\n * was chosen for the draw interaction to behave correctly on mouse as well as\n * on touch devices.\n * @property {import(\"../Collection.js\").default<Feature>} [features]\n * Destination collection for the drawn features.\n * @property {VectorSource} [source] Destination source for\n * the drawn features.\n * @property {number} [dragVertexDelay=500] Delay in milliseconds after pointerdown\n * before the current vertex can be dragged to its exact position.\n * @property {number} [snapTolerance=12] Pixel distance for snapping to the\n * drawing finish. Must be greater than `0`.\n * @property {boolean} [stopClick=false] Stop click, singleclick, and\n * doubleclick events from firing during drawing.\n * @property {number} [maxPoints] The number of points that can be drawn before\n * a polygon ring or line string is finished. By default there is no\n * restriction.\n * @property {number} [minPoints] The number of points that must be drawn\n * before a polygon ring or line string can be finished. Default is `3` for\n * polygon rings and `2` for line strings.\n * @property {import(\"../events/condition.js\").Condition} [finishCondition] A function\n * that takes an {@link module:ol/MapBrowserEvent~MapBrowserEvent} and returns a\n * boolean to indicate whether the drawing can be finished. Not used when drawing\n * POINT or MULTI_POINT geometries.\n * @property {import(\"../style/Style.js\").StyleLike|import(\"../style/flat.js\").FlatStyleLike} [style]\n * Style for sketch features.\n * @property {GeometryFunction} [geometryFunction]\n * Function that is called when a geometry's coordinates are updated.\n * @property {string} [geometryName] Geometry name to use for features created\n * by the draw interaction.\n * @property {import(\"../events/condition.js\").Condition} [condition] A function that\n * takes an {@link module:ol/MapBrowserEvent~MapBrowserEvent} and returns a\n * boolean to indicate whether that event should be handled.\n * By default {@link module:ol/events/condition.noModifierKeys}, i.e. a click,\n * adds a vertex or deactivates freehand drawing.\n * @property {boolean} [freehand=false] Operate in freehand mode for lines,\n * polygons, and circles. This makes the interaction always operate in freehand\n * mode and takes precedence over any `freehandCondition` option.\n * @property {import(\"../events/condition.js\").Condition} [freehandCondition]\n * Condition that activates freehand drawing for lines and polygons. This\n * function takes an {@link module:ol/MapBrowserEvent~MapBrowserEvent} and\n * returns a boolean to indicate whether that event should be handled. The\n * default is {@link module:ol/events/condition.shiftKeyOnly}, meaning that the\n * Shift key activates freehand drawing.\n * @property {boolean|import(\"../events/condition.js\").Condition} [trace=false] Trace a portion of another geometry.\n * Ignored when in freehand mode.\n * @property {VectorSource} [traceSource] Source for features to trace. If tracing is active and a `traceSource` is\n * not provided, the interaction's `source` will be used. Tracing requires that the interaction is configured with\n * either a `traceSource` or a `source`.\n * @property {boolean} [wrapX=false] Wrap the world horizontally on the sketch\n * overlay.\n * @property {import(\"../geom/Geometry.js\").GeometryLayout} [geometryLayout='XY'] Layout of the\n * feature geometries created by the draw interaction.\n */\n\n/**\n * Coordinate type when drawing points.\n * @typedef {import(\"../coordinate.js\").Coordinate} PointCoordType\n */\n\n/**\n * Coordinate type when drawing lines.\n * @typedef {Array<import(\"../coordinate.js\").Coordinate>} LineCoordType\n */\n\n/**\n * Coordinate type when drawing polygons.\n * @typedef {Array<Array<import(\"../coordinate.js\").Coordinate>>} PolyCoordType\n */\n\n/**\n * Types used for drawing coordinates.\n * @typedef {PointCoordType|LineCoordType|PolyCoordType} SketchCoordType\n */\n\n/**\n * @typedef {Object} TraceState\n * @property {boolean} active Tracing active.\n * @property {import(\"../pixel.js\").Pixel} [startPx] The initially clicked pixel location.\n * @property {Array<TraceTarget>} [targets] Targets available for tracing.\n * @property {number} [targetIndex] The index of the currently traced target. A value of -1 indicates\n * that no trace target is active.\n */\n\n/**\n * @typedef {Object} TraceTarget\n * @property {Array<import(\"../coordinate.js\").Coordinate>} coordinates Target coordinates.\n * @property {boolean} ring The target coordinates are a linear ring.\n * @property {number} startIndex The index of first traced coordinate. A fractional index represents an\n * edge intersection. Index values for rings will wrap (may be negative or larger than coordinates length).\n * @property {number} endIndex The index of last traced coordinate. Details from startIndex also apply here.\n */\n\n/**\n * Function that takes an array of coordinates and an optional existing geometry\n * and a projection as arguments, and returns a geometry. The optional existing\n * geometry is the geometry that is returned when the function is called without\n * a second argument.\n * @typedef {function(!SketchCoordType, import(\"../geom/SimpleGeometry.js\").default,\n * import(\"../proj/Projection.js\").default):\n * import(\"../geom/SimpleGeometry.js\").default} GeometryFunction\n */\n\n/**\n * @typedef {'Point' | 'LineString' | 'Polygon' | 'Circle'} Mode\n * Draw mode. This collapses multi-part geometry types with their single-part\n * cousins.\n */\n\n/**\n * @enum {string}\n */\nconst DrawEventType = {\n /**\n * Triggered upon feature draw start\n * @event DrawEvent#drawstart\n * @api\n */\n DRAWSTART: 'drawstart',\n /**\n * Triggered upon feature draw end\n * @event DrawEvent#drawend\n * @api\n */\n DRAWEND: 'drawend',\n /**\n * Triggered upon feature draw abortion\n * @event DrawEvent#drawabort\n * @api\n */\n DRAWABORT: 'drawabort',\n};\n\n/**\n * @classdesc\n * Events emitted by {@link module:ol/interaction/Draw~Draw} instances are\n * instances of this type.\n */\nexport class DrawEvent extends Event {\n /**\n * @param {DrawEventType} type Type.\n * @param {Feature} feature The feature drawn.\n */\n constructor(type, feature) {\n super(type);\n\n /**\n * The feature being drawn.\n * @type {Feature}\n * @api\n */\n this.feature = feature;\n }\n}\n\n/**\n * @param {import(\"../coordinate.js\").Coordinate} coordinate The coordinate.\n * @param {Array<Feature>} features The candidate features.\n * @return {Array<TraceTarget>} The trace targets.\n */\nfunction getTraceTargets(coordinate, features) {\n /**\n * @type {Array<TraceTarget>}\n */\n const targets = [];\n\n for (let i = 0; i < features.length; ++i) {\n const feature = features[i];\n const geometry = feature.getGeometry();\n appendGeometryTraceTargets(coordinate, geometry, targets);\n }\n\n return targets;\n}\n\n/**\n * @param {import(\"../coordinate.js\").Coordinate} a One coordinate.\n * @param {import(\"../coordinate.js\").Coordinate} b Another coordinate.\n * @return {number} The squared distance between the two coordinates.\n */\nfunction getSquaredDistance(a, b) {\n return squaredDistance(a[0], a[1], b[0], b[1]);\n}\n\n/**\n * @param {LineCoordType} coordinates The ring coordinates.\n * @param {number} index The index. May be wrapped.\n * @return {import(\"../coordinate.js\").Coordinate} The coordinate.\n */\nfunction getCoordinate(coordinates, index) {\n const count = coordinates.length;\n if (index < 0) {\n return coordinates[index + count];\n }\n if (index >= count) {\n return coordinates[index - count];\n }\n return coordinates[index];\n}\n\n/**\n * Get the cumulative squared distance along a ring path. The end index index may be \"wrapped\" and it may\n * be less than the start index to indicate the direction of travel. The start and end index may have\n * a fractional part to indicate a point between two coordinates.\n * @param {LineCoordType} coordinates Ring coordinates.\n * @param {number} startIndex The start index.\n * @param {number} endIndex The end index.\n * @return {number} The cumulative squared distance along the ring path.\n */\nfunction getCumulativeSquaredDistance(coordinates, startIndex, endIndex) {\n let lowIndex, highIndex;\n if (startIndex < endIndex) {\n lowIndex = startIndex;\n highIndex = endIndex;\n } else {\n lowIndex = endIndex;\n highIndex = startIndex;\n }\n const lowWholeIndex = Math.ceil(lowIndex);\n const highWholeIndex = Math.floor(highIndex);\n\n if (lowWholeIndex > highWholeIndex) {\n // both start and end are on the same segment\n const start = interpolateCoordinate(coordinates, lowIndex);\n const end = interpolateCoordinate(coordinates, highIndex);\n return getSquaredDistance(start, end);\n }\n\n let sd = 0;\n\n if (lowIndex < lowWholeIndex) {\n const start = interpolateCoordinate(coordinates, lowIndex);\n const end = getCoordinate(coordinates, lowWholeIndex);\n sd += getSquaredDistance(start, end);\n }\n\n if (highWholeIndex < highIndex) {\n const start = getCoordinate(coordinates, highWholeIndex);\n const end = interpolateCoordinate(coordinates, highIndex);\n sd += getSquaredDistance(start, end);\n }\n\n for (let i = lowWholeIndex; i < highWholeIndex - 1; ++i) {\n const start = getCoordinate(coordinates, i);\n const end = getCoordinate(coordinates, i + 1);\n sd += getSquaredDistance(start, end);\n }\n\n return sd;\n}\n\n/**\n * @param {import(\"../coordinate.js\").Coordinate} coordinate The coordinate.\n * @param {import(\"../geom/Geometry.js\").default} geometry The candidate geometry.\n * @param {Array<TraceTarget>} targets The trace targets.\n */\nfunction appendGeometryTraceTargets(coordinate, geometry, targets) {\n if (geometry instanceof LineString) {\n appendTraceTarget(coordinate, geometry.getCoordinates(), false, targets);\n return;\n }\n if (geometry instanceof MultiLineString) {\n const coordinates = geometry.getCoordinates();\n for (let i = 0, ii = coordinates.length; i < ii; ++i) {\n appendTraceTarget(coordinate, coordinates[i], false, targets);\n }\n return;\n }\n if (geometry instanceof Polygon) {\n const coordinates = geometry.getCoordinates();\n for (let i = 0, ii = coordinates.length; i < ii; ++i) {\n appendTraceTarget(coordinate, coordinates[i], true, targets);\n }\n return;\n }\n if (geometry instanceof MultiPolygon) {\n const polys = geometry.getCoordinates();\n for (let i = 0, ii = polys.length; i < ii; ++i) {\n const coordinates = polys[i];\n for (let j = 0, jj = coordinates.length; j < jj; ++j) {\n appendTraceTarget(coordinate, coordinates[j], true, targets);\n }\n }\n return;\n }\n if (geometry instanceof GeometryCollection) {\n const geometries = geometry.getGeometries();\n for (let i = 0; i < geometries.length; ++i) {\n appendGeometryTraceTargets(coordinate, geometries[i], targets);\n }\n return;\n }\n // other types cannot be traced\n}\n\n/**\n * @typedef {Object} TraceTargetUpdateInfo\n * @property {number} index The new target index.\n * @property {number} endIndex The new segment end index.\n */\n\n/**\n * @type {TraceTargetUpdateInfo}\n */\nconst sharedUpdateInfo = {index: -1, endIndex: NaN};\n\n/**\n * @param {import(\"../coordinate.js\").Coordinate} coordinate The coordinate.\n * @param {TraceState} traceState The trace state.\n * @param {import(\"../Map.js\").default} map The map.\n * @param {number} snapTolerance The snap tolerance.\n * @return {TraceTargetUpdateInfo} Information about the new trace target. The returned\n * object is reused between calls and must not be modified by the caller.\n */\nfunction getTraceTargetUpdate(coordinate, traceState, map, snapTolerance) {\n const x = coordinate[0];\n const y = coordinate[1];\n\n let closestTargetDistance = Infinity;\n\n let newTargetIndex = -1;\n let newEndIndex = NaN;\n\n for (\n let targetIndex = 0;\n targetIndex < traceState.targets.length;\n ++targetIndex\n ) {\n const target = traceState.targets[targetIndex];\n const coordinates = target.coordinates;\n\n let minSegmentDistance = Infinity;\n let endIndex;\n for (\n let coordinateIndex = 0;\n coordinateIndex < coordinates.length - 1;\n ++coordinateIndex\n ) {\n const start = coordinates[coordinateIndex];\n const end = coordinates[coordinateIndex + 1];\n const rel = getPointSegmentRelationship(x, y, start, end);\n if (rel.squaredDistance < minSegmentDistance) {\n minSegmentDistance = rel.squaredDistance;\n endIndex = coordinateIndex + rel.along;\n }\n }\n\n if (minSegmentDistance < closestTargetDistance) {\n closestTargetDistance = minSegmentDistance;\n if (target.ring && traceState.targetIndex === targetIndex) {\n // same target, maintain the same trace direction\n if (target.endIndex > target.startIndex) {\n // forward trace\n if (endIndex < target.startIndex) {\n endIndex += coordinates.length;\n }\n } else if (target.endIndex < target.startIndex) {\n // reverse trace\n if (endIndex > target.startIndex) {\n endIndex -= coordinates.length;\n }\n }\n }\n newEndIndex = endIndex;\n newTargetIndex = targetIndex;\n }\n }\n\n const newTarget = traceState.targets[newTargetIndex];\n let considerBothDirections = newTarget.ring;\n if (traceState.targetIndex === newTargetIndex && considerBothDirections) {\n // only consider switching trace direction if close to the start\n const newCoordinate = interpolateCoordinate(\n newTarget.coordinates,\n newEndIndex\n );\n const pixel = map.getPixelFromCoordinate(newCoordinate);\n if (distance(pixel, traceState.startPx) > snapTolerance) {\n considerBothDirections = false;\n }\n }\n\n if (considerBothDirections) {\n const coordinates = newTarget.coordinates;\n const count = coordinates.length;\n const startIndex = newTarget.startIndex;\n const endIndex = newEndIndex;\n if (startIndex < endIndex) {\n const forwardDistance = getCumulativeSquaredDistance(\n coordinates,\n startIndex,\n endIndex\n );\n const reverseDistance = getCumulativeSquaredDistance(\n coordinates,\n startIndex,\n endIndex - count\n );\n if (reverseDistance < forwardDistance) {\n newEndIndex -= count;\n }\n } else {\n const reverseDistance = getCumulativeSquaredDistance(\n coordinates,\n startIndex,\n endIndex\n );\n const forwardDistance = getCumulativeSquaredDistance(\n coordinates,\n startIndex,\n endIndex + count\n );\n if (forwardDistance < reverseDistance) {\n newEndIndex += count;\n }\n }\n }\n\n sharedUpdateInfo.index = newTargetIndex;\n sharedUpdateInfo.endIndex = newEndIndex;\n return sharedUpdateInfo;\n}\n\n/**\n * @param {import(\"../coordinate.js\").Coordinate} coordinate The clicked coordinate.\n * @param {Array<import(\"../coordinate.js\").Coordinate>} coordinates The geometry component coordinates.\n * @param {boolean} ring The coordinates represent a linear ring.\n * @param {Array<TraceTarget>} targets The trace targets.\n */\nfunction appendTraceTarget(coordinate, coordinates, ring, targets) {\n const x = coordinate[0];\n const y = coordinate[1];\n for (let i = 0, ii = coordinates.length - 1; i < ii; ++i) {\n const start = coordinates[i];\n const end = coordinates[i + 1];\n const rel = getPointSegmentRelationship(x, y, start, end);\n if (rel.squaredDistance === 0) {\n const index = i + rel.along;\n targets.push({\n coordinates: coordinates,\n ring: ring,\n startIndex: index,\n endIndex: index,\n });\n return;\n }\n }\n}\n\n/**\n * @typedef {Object} PointSegmentRelationship\n * @property {number} along The closest point expressed as a fraction along the segment length.\n * @property {number} squaredDistance The squared distance of the point to the segment.\n */\n\n/**\n * @type {PointSegmentRelationship}\n */\nconst sharedRel = {along: 0, squaredDistance: 0};\n\n/**\n * @param {number} x The point x.\n * @param {number} y The point y.\n * @param {import(\"../coordinate.js\").Coordinate} start The segment start.\n * @param {import(\"../coordinate.js\").Coordinate} end The segment end.\n * @return {PointSegmentRelationship} The point segment relationship. The returned object is\n * shared between calls and must not be modified by the caller.\n */\nfunction getPointSegmentRelationship(x, y, start, end) {\n const x1 = start[0];\n const y1 = start[1];\n const x2 = end[0];\n const y2 = end[1];\n const dx = x2 - x1;\n const dy = y2 - y1;\n let along = 0;\n let px = x1;\n let py = y1;\n if (dx !== 0 || dy !== 0) {\n along = clamp(((x - x1) * dx + (y - y1) * dy) / (dx * dx + dy * dy), 0, 1);\n px += dx * along;\n py += dy * along;\n }\n\n sharedRel.along = along;\n sharedRel.squaredDistance = toFixed(squaredDistance(x, y, px, py), 10);\n return sharedRel;\n}\n\n/**\n * @param {LineCoordType} coordinates The coordinates.\n * @param {number} index The index. May be fractional and may wrap.\n * @return {import(\"../coordinate.js\").Coordinate} The interpolated coordinate.\n */\nfunction interpolateCoordinate(coordinates, index) {\n const count = coordinates.length;\n\n let startIndex = Math.floor(index);\n const along = index - startIndex;\n if (startIndex >= count) {\n startIndex -= count;\n } else if (startIndex < 0) {\n startIndex += count;\n }\n\n let endIndex = startIndex + 1;\n if (endIndex >= count) {\n endIndex -= count;\n }\n\n const start = coordinates[startIndex];\n const x0 = start[0];\n const y0 = start[1];\n const end = coordinates[endIndex];\n const dx = end[0] - x0;\n const dy = end[1] - y0;\n\n return [x0 + dx * along, y0 + dy * along];\n}\n\n/***\n * @template Return\n * @typedef {import(\"../Observable\").OnSignature<import(\"../Observable\").EventTypes, import(\"../events/Event.js\").default, Return> &\n * import(\"../Observable\").OnSignature<import(\"../ObjectEventType\").Types|\n * 'change:active', import(\"../Object\").ObjectEvent, Return> &\n * import(\"../Observable\").OnSignature<'drawabort'|'drawend'|'drawstart', DrawEvent, Return> &\n * import(\"../Observable\").CombinedOnSignature<import(\"../Observable\").EventTypes|import(\"../ObjectEventType\").Types|\n * 'change:active'|'drawabort'|'drawend'|'drawstart', Return>} DrawOnSignature\n */\n\n/**\n * @classdesc\n * Interaction for drawing feature geometries.\n *\n * @fires DrawEvent\n * @api\n */\nclass Draw extends PointerInteraction {\n /**\n * @param {Options} options Options.\n */\n constructor(options) {\n const pointerOptions = /** @type {import(\"./Pointer.js\").Options} */ (\n options\n );\n if (!pointerOptions.stopDown) {\n pointerOptions.stopDown = FALSE;\n }\n\n super(pointerOptions);\n\n /***\n * @type {DrawOnSignature<import(\"../events\").EventsKey>}\n */\n this.on;\n\n /***\n * @type {DrawOnSignature<import(\"../events\").EventsKey>}\n */\n this.once;\n\n /***\n * @type {DrawOnSignature<void>}\n */\n this.un;\n\n /**\n * @type {boolean}\n * @private\n */\n this.shouldHandle_ = false;\n\n /**\n * @type {import(\"../pixel.js\").Pixel}\n * @private\n */\n this.downPx_ = null;\n\n /**\n * @type {?}\n * @private\n */\n this.downTimeout_;\n\n /**\n * @type {number|undefined}\n * @private\n */\n this.lastDragTime_;\n\n /**\n * Pointer type of the last pointermove event\n * @type {string}\n * @private\n */\n this.pointerType_;\n\n /**\n * @type {boolean}\n * @private\n */\n this.freehand_ = false;\n\n /**\n * Target source for drawn features.\n * @type {VectorSource|null}\n * @private\n */\n this.source_ = options.source ? options.source : null;\n\n /**\n * Target collection for drawn features.\n * @type {import(\"../Collection.js\").default<Feature>|null}\n * @private\n */\n this.features_ = options.features ? options.features : null;\n\n /**\n * Pixel distance for snapping.\n * @type {number}\n * @private\n */\n this.snapTolerance_ = options.snapTolerance ? options.snapTolerance : 12;\n\n /**\n * Geometry type.\n * @type {import(\"../geom/Geometry.js\").Type}\n * @private\n */\n this.type_ = /** @type {import(\"../geom/Geometry.js\").Type} */ (\n options.type\n );\n\n /**\n * Drawing mode (derived from geometry type.\n * @type {Mode}\n * @private\n */\n this.mode_ = getMode(this.type_);\n\n /**\n * Stop click, singleclick, and doubleclick events from firing during drawing.\n * Default is `false`.\n * @type {boolean}\n * @private\n */\n this.stopClick_ = !!options.stopClick;\n\n /**\n * The number of points that must be drawn before a polygon ring or line\n * string can be finished. The default is 3 for polygon rings and 2 for\n * line strings.\n * @type {number}\n * @private\n */\n this.minPoints_ = options.minPoints\n ? options.minPoints\n : this.mode_ === 'Polygon'\n ? 3\n : 2;\n\n /**\n * The number of points that can be drawn before a polygon ring or line string\n * is finished. The default is no restriction.\n * @type {number}\n * @private\n */\n this.maxPoints_ =\n this.mode_ === 'Circle'\n ? 2\n : options.maxPoints\n ? options.maxPoints\n : Infinity;\n\n /**\n * A function to decide if a potential finish coordinate is permissible\n * @private\n * @type {import(\"../events/condition.js\").Condition}\n */\n this.finishCondition_ = options.finishCondition\n ? options.finishCondition\n : TRUE;\n\n /**\n * @private\n * @type {import(\"../geom/Geometry.js\").GeometryLayout}\n */\n this.geometryLayout_ = options.geometryLayout\n ? options.geometryLayout\n : 'XY';\n\n let geometryFunction = options.geometryFunction;\n if (!geometryFunction) {\n const mode = this.mode_;\n if (mode === 'Circle') {\n /**\n * @param {!LineCoordType} coordinates The coordinates.\n * @param {import(\"../geom/SimpleGeometry.js\").default|undefined} geometry Optional geometry.\n * @param {import(\"../proj/Projection.js\").default} projection The view projection.\n * @return {import(\"../geom/SimpleGeometry.js\").default} A geometry.\n */\n geometryFunction = function (coordinates, geometry, projection) {\n const circle = geometry\n ? /** @type {Circle} */ (geometry)\n : new Circle([NaN, NaN]);\n const center = fromUserCoordinate(coordinates[0], projection);\n const squaredLength = squaredCoordinateDistance(\n center,\n fromUserCoordinate(coordinates[coordinates.length - 1], projection)\n );\n circle.setCenterAndRadius(\n center,\n Math.sqrt(squaredLength),\n this.geometryLayout_\n );\n const userProjection = getUserProjection();\n if (userProjection) {\n circle.transform(projection, userProjection);\n }\n return circle;\n };\n } else {\n let Constructor;\n if (mode === 'Point') {\n Constructor = Point;\n } else if (mode === 'LineString') {\n Constructor = LineString;\n } else if (mode === 'Polygon') {\n Constructor = Polygon;\n }\n /**\n * @param {!LineCoordType} coordinates The coordinates.\n * @param {import(\"../geom/SimpleGeometry.js\").default|undefined} geometry Optional geometry.\n * @param {import(\"../proj/Projection.js\").default} projection The view projection.\n * @return {import(\"../geom/SimpleGeometry.js\").default} A geometry.\n */\n geometryFunction = function (coordinates, geometry, projection) {\n if (geometry) {\n if (mode === 'Polygon') {\n if (coordinates[0].length) {\n // Add a closing coordinate to match the first\n geometry.setCoordinates(\n [coordinates[0].concat([coordinates[0][0]])],\n this.geometryLayout_\n );\n } else {\n geometry.setCoordinates([], this.geometryLayout_);\n }\n } else {\n geometry.setCoordinates(coordinates, this.geometryLayout_);\n }\n } else {\n geometry = new Constructor(coordinates, this.geometryLayout_);\n }\n return geometry;\n };\n }\n }\n\n /**\n * @type {GeometryFunction}\n * @private\n */\n this.geometryFunction_ = geometryFunction;\n\n /**\n * @type {number}\n * @private\n */\n this.dragVertexDelay_ =\n options.dragVertexDelay !== undefined ? options.dragVertexDelay : 500;\n\n /**\n * Finish coordinate for the feature (first point for polygons, last point for\n * linestrings).\n * @type {import(\"../coordinate.js\").Coordinate}\n * @private\n */\n this.finishCoordinate_ = null;\n\n /**\n * Sketch feature.\n * @type {Feature<import('../geom/SimpleGeometry.js').default>}\n * @private\n */\n this.sketchFeature_ = null;\n\n /**\n * Sketch point.\n * @type {Feature<Point>}\n * @private\n */\n this.sketchPoint_ = null;\n\n /**\n * Sketch coordinates. Used when drawing a line or polygon.\n * @type {SketchCoordType}\n * @private\n */\n this.sketchCoords_ = null;\n\n /**\n * Sketch line. Used when drawing polygon.\n * @type {Feature<LineString>}\n * @private\n */\n this.sketchLine_ = null;\n\n /**\n * Sketch line coordinates. Used when drawing a polygon or circle.\n * @type {LineCoordType}\n * @private\n */\n this.sketchLineCoords_ = null;\n\n /**\n * Squared tolerance for handling up events. If the squared distance\n * between a down and up event is greater than this tolerance, up events\n * will not be handled.\n * @type {number}\n * @private\n */\n this.squaredClickTolerance_ = options.clickTolerance\n ? options.clickTolerance * options.clickTolerance\n : 36;\n\n /**\n * Draw overlay where our sketch features are drawn.\n * @type {VectorLayer}\n * @private\n */\n this.overlay_ = new VectorLayer({\n source: new VectorSource({\n useSpatialIndex: false,\n wrapX: options.wrapX ? options.wrapX : false,\n }),\n style: options.style ? options.style : getDefaultStyleFunction(),\n updateWhileInteracting: true,\n });\n\n /**\n * Name of the geometry attribute for newly created features.\n * @type {string|undefined}\n * @private\n */\n this.geometryName_ = options.geometryName;\n\n /**\n * @private\n * @type {import(\"../events/condition.js\").Condition}\n */\n this.condition_ = options.condition ? options.condition : noModifierKeys;\n\n /**\n * @private\n * @type {import(\"../events/condition.js\").Condition}\n */\n this.freehandCondition_;\n if (options.freehand) {\n this.freehandCondition_ = always;\n } else {\n this.freehandCondition_ = options.freehandCondition\n ? options.freehandCondition\n : shiftKeyOnly;\n }\n\n /**\n * @type {import(\"../events/condition.js\").Condition}\n * @private\n */\n this.traceCondition_;\n this.setTrace(options.trace || false);\n\n /**\n * @type {TraceState}\n * @private\n */\n this.traceState_ = {active: false};\n\n /**\n * @type {VectorSource|null}\n * @private\n */\n this.traceSource_ = options.traceSource || options.source || null;\n\n this.addChangeListener(InteractionProperty.ACTIVE, this.updateState_);\n }\n\n /**\n * Toggle tracing mode or set a tracing condition.\n *\n * @param {boolean|import(\"../events/condition.js\").Condition} trace A boolean to toggle tracing mode or an event\n * condition that will be checked when a feature is clicked to determine if tracing should be active.\n */\n setTrace(trace) {\n let condition;\n if (!trace) {\n condition = never;\n } else if (trace === true) {\n condition = always;\n } else {\n condition = trace;\n }\n this.traceCondition_ = condition;\n }\n\n /**\n * Remove the interaction from its current map and attach it to the new map.\n * Subclasses may set up event handlers to get notified about changes to\n * the map here.\n * @param {import(\"../Map.js\").default} map Map.\n */\n setMap(map) {\n super.setMap(map);\n this.updateState_();\n }\n\n /**\n * Get the overlay layer that this interaction renders sketch features to.\n * @return {VectorLayer} Overlay layer.\n * @api\n */\n getOverlay() {\n return this.overlay_;\n }\n\n /**\n * Handles the {@link module:ol/MapBrowserEvent~MapBrowserEvent map browser event} and may actually draw or finish the drawing.\n * @param {import(\"../MapBrowserEvent.js\").default} event Map browser event.\n * @return {boolean} `false` to stop event propagation.\n * @api\n */\n handleEvent(event) {\n if (event.originalEvent.type === EventType.CONTEXTMENU) {\n // Avoid context menu for long taps when drawing on mobile\n event.originalEvent.preventDefault();\n }\n this.freehand_ = this.mode_ !== 'Point' && this.freehandCondition_(event);\n let move = event.type === MapBrowserEventType.POINTERMOVE;\n let pass = true;\n if (\n !this.freehand_ &&\n this.lastDragTime_ &&\n event.type === MapBrowserEventType.POINTERDRAG\n ) {\n const now = Date.now();\n if (now - this.lastDragTime_ >= this.dragVertexDelay_) {\n this.downPx_ = event.pixel;\n this.shouldHandle_ = !this.freehand_;\n move = true;\n } else {\n this.lastDragTime_ = undefined;\n }\n if (this.shouldHandle_ && this.downTimeout_ !== undefined) {\n clearTimeout(this.downTimeout_);\n this.downTimeout_ = undefined;\n }\n }\n if (\n this.freehand_ &&\n event.type === MapBrowserEventType.POINTERDRAG &&\n this.sketchFeature_ !== null\n ) {\n this.addToDrawing_(event.coordinate);\n pass = false;\n } else if (\n this.freehand_ &&\n event.type === MapBrowserEventType.POINTERDOWN\n ) {\n pass = false;\n } else if (move && this.getPointerCount() < 2) {\n pass = event.type === MapBrowserEventType.POINTERMOVE;\n if (pass && this.freehand_) {\n this.handlePointerMove_(event);\n if (this.shouldHandle_) {\n // Avoid page scrolling when freehand drawing on mobile\n event.originalEvent.preventDefault();\n }\n } else if (\n event.originalEvent.pointerType === 'mouse' ||\n (event.type === MapBrowserEventType.POINTERDRAG &&\n this.downTimeout_ === undefined)\n ) {\n this.handlePointerMove_(event);\n }\n } else if (event.type === MapBrowserEventType.DBLCLICK) {\n pass = false;\n }\n\n return super.handleEvent(event) && pass;\n }\n\n /**\n * Handle pointer down events.\n * @param {import(\"../MapBrowserEvent.js\").default} event Event.\n * @return {boolean} If the event was consumed.\n */\n handleDownEvent(event) {\n this.shouldHandle_ = !this.freehand_;\n\n if (this.freehand_) {\n this.downPx_ = event.pixel;\n if (!this.finishCoordinate_) {\n this.startDrawing_(event.coordinate);\n }\n return true;\n }\n\n if (!this.condition_(event)) {\n this.lastDragTime_ = undefined;\n return false;\n }\n\n this.lastDragTime_ = Date.now();\n this.downTimeout_ = setTimeout(() => {\n this.handlePointerMove_(\n new MapBrowserEvent(\n MapBrowserEventType.POINTERMOVE,\n event.map,\n event.originalEvent,\n false,\n event.frameState\n )\n );\n }, this.dragVertexDelay_);\n this.downPx_ = event.pixel;\n return true;\n }\n\n /**\n * @private\n */\n deactivateTrace_() {\n this.traceState_ = {active: false};\n }\n\n /**\n * Activate or deactivate trace state based on a browser event.\n * @param {import(\"../MapBrowserEvent.js\").default} event Event.\n * @private\n */\n toggleTraceState_(event) {\n if (!this.traceSource_ || !this.traceCondition_(event)) {\n return;\n }\n\n if (this.traceState_.active) {\n this.deactivateTrace_();\n return;\n }\n\n const map = this.getMap();\n const lowerLeft = map.getCoordinateFromPixel([\n event.pixel[0] - this.snapTolerance_,\n event.pixel[1] + this.snapTolerance_,\n ]);\n const upperRight = map.getCoordinateFromPixel([\n event.pixel[0] + this.snapTolerance_,\n event.pixel[1] - this.snapTolerance_,\n ]);\n const extent = boundingExtent([lowerLeft, upperRight]);\n const features = this.traceSource_.getFeaturesInExtent(extent);\n if (features.length === 0) {\n return;\n }\n\n const targets = getTraceTargets(event.coordinate, features);\n if (targets.length) {\n this.traceState_ = {\n active: true,\n startPx: event.pixel.slice(),\n targets: targets,\n targetIndex: -1,\n };\n }\n }\n\n /**\n * @param {TraceTarget} target The trace target.\n * @param {number} endIndex The new end index of the trace.\n * @private\n */\n addOrRemoveTracedCoordinates_(target, endIndex) {\n // three cases to handle:\n // 1. traced in the same direction and points need adding\n // 2. traced in the same direction and points need removing\n // 3. traced in a new direction\n const previouslyForward = target.startIndex <= target.endIndex;\n const currentlyForward = target.startIndex <= endIndex;\n if (previouslyForward === currentlyForward) {\n // same direction\n if (\n (previouslyForward && endIndex > target.endIndex) ||\n (!previouslyForward && endIndex < target.endIndex)\n ) {\n // case 1 - add new points\n this.addTracedCoordinates_(target, target.endIndex, endIndex);\n } else if (\n (previouslyForward && endIndex < target.endIndex) ||\n (!previouslyForward && endIndex > target.endIndex)\n ) {\n // case 2 - remove old points\n this.removeTracedCoordinates_(endIndex, target.endIndex);\n }\n } else {\n // case 3 - remove old points, add new points\n this.removeTracedCoordinates_(target.startIndex, target.endIndex);\n this.addTracedCoordinates_(target, target.startIndex, endIndex);\n }\n }\n\n /**\n * @param {number} fromIndex The start index.\n * @param {number} toIndex The end index.\n * @private\n */\n removeTracedCoordinates_(fromIndex, toIndex) {\n if (fromIndex === toIndex) {\n return;\n }\n\n let remove = 0;\n if (fromIndex < toIndex) {\n const start = Math.ceil(fromIndex);\n let end = Math.floor(toIndex);\n if (end === toIndex) {\n end -= 1;\n }\n remove = end - start + 1;\n } else {\n const start = Math.floor(fromIndex);\n let end = Math.ceil(toIndex);\n if (end === toIndex) {\n end += 1;\n }\n remove = start - end + 1;\n }\n\n if (remove > 0) {\n this.removeLastPoints_(remove);\n }\n }\n\n /**\n * @param {TraceTarget} target The trace target.\n * @param {number} fromIndex The start index.\n * @param {number} toIndex The end index.\n * @private\n */\n addTracedCoordinates_(target, fromIndex, toIndex) {\n if (fromIndex === toIndex) {\n return;\n }\n\n const coordinates = [];\n if (fromIndex < toIndex) {\n // forward trace\n const start = Math.ceil(fromIndex);\n let end = Math.floor(toIndex);\n if (end === toIndex) {\n // if end is snapped to a vertex, it will be added later\n end -= 1;\n }\n for (let i = start; i <= end; ++i) {\n coordinates.push(getCoordinate(target.coordinates, i));\n }\n } else {\n // reverse trace\n const start = Math.floor(fromIndex);\n let end = Math.ceil(toIndex);\n if (end === toIndex) {\n end += 1;\n }\n for (let i = start; i >= end; --i) {\n coordinates.push(getCoordinate(target.coordinates, i));\n }\n }\n if (coordinates.length) {\n this.appendCoordinates(coordinates);\n }\n }\n\n /**\n * Update the trace.\n * @param {import(\"../MapBrowserEvent.js\").default} event Event.\n * @private\n */\n updateTrace_(event) {\n const traceState = this.traceState_;\n if (!traceState.active) {\n return;\n }\n\n if (traceState.targetIndex === -1) {\n // check if we are ready to pick a target\n if (distance(traceState.startPx, event.pixel) < this.snapTolerance_) {\n return;\n }\n }\n\n const updatedTraceTarget = getTraceTargetUpdate(\n event.coordinate,\n traceState,\n this.getMap(),\n this.snapTolerance_\n );\n\n if (traceState.targetIndex !== updatedTraceTarget.index) {\n // target changed\n if (traceState.targetIndex !== -1) {\n // remove points added during previous trace\n const oldTarget = traceState.targets[traceState.targetIndex];\n this.removeTracedCoordinates_(oldTarget.startIndex, oldTarget.endIndex);\n }\n // add points for the new target\n const newTarget = traceState.targets[updatedTraceTarget.index];\n this.addTracedCoordinates_(\n newTarget,\n newTarget.startIndex,\n updatedTraceTarget.endIndex\n );\n } else {\n // target stayed the same\n const target = traceState.targets[traceState.targetIndex];\n this.addOrRemoveTracedCoordinates_(target, updatedTraceTarget.endIndex);\n }\n\n // modify the state with updated info\n traceState.targetIndex = updatedTraceTarget.index;\n const target = traceState.targets[traceState.targetIndex];\n target.endIndex = updatedTraceTarget.endIndex;\n\n // update event coordinate and pixel to match end point of final segment\n const coordinate = interpolateCoordinate(\n target.coordinates,\n target.endIndex\n );\n const pixel = this.getMap().getPixelFromCoordinate(coordinate);\n event.coordinate = coordinate;\n event.pixel = [Math.round(pixel[0]), Math.round(pixel[1])];\n }\n\n /**\n * Handle pointer up events.\n * @param {import(\"../MapBrowserEvent.js\").default} event Event.\n * @return {boolean} If the event was consumed.\n */\n handleUpEvent(event) {\n let pass = true;\n\n if (this.getPointerCount() === 0) {\n if (this.downTimeout_) {\n clearTimeout(this.downTimeout_);\n this.downTimeout_ = undefined;\n }\n\n this.handlePointerMove_(event);\n const tracing = this.traceState_.active;\n this.toggleTraceState_(event);\n\n if (this.shouldHandle_) {\n const startingToDraw = !this.finishCoordinate_;\n if (startingToDraw) {\n this.startDrawing_(event.coordinate);\n }\n if (!startingToDraw && this.freehand_) {\n this.finishDrawing();\n } else if (\n !this.freehand_ &&\n (!startingToDraw || this.mode_ === 'Point')\n ) {\n if (this.atFinish_(event.pixel, tracing)) {\n if (this.finishCondition_(event)) {\n this.finishDrawing();\n }\n } else {\n this.addToDrawing_(event.coordinate);\n }\n }\n pass = false;\n } else if (this.freehand_) {\n this.abortDrawing();\n }\n }\n\n if (!pass && this.stopClick_) {\n event.preventDefault();\n }\n return pass;\n }\n\n /**\n * Handle move events.\n * @param {import(\"../MapBrowserEvent.js\").default} event A move event.\n * @private\n */\n handlePointerMove_(event) {\n this.pointerType_ = event.originalEvent.pointerType;\n if (\n this.downPx_ &&\n ((!this.freehand_ && this.shouldHandle_) ||\n (this.freehand_ && !this.shouldHandle_))\n ) {\n const downPx = this.downPx_;\n const clickPx = event.pixel;\n const dx = downPx[0] - clickPx[0];\n const dy = downPx[1] - clickPx[1];\n const squaredDistance = dx * dx + dy * dy;\n this.shouldHandle_ = this.freehand_\n ? squaredDistance > this.squaredClickTolerance_\n : squaredDistance <= this.squaredClickTolerance_;\n if (!this.shouldHandle_) {\n return;\n }\n }\n\n if (!this.finishCoordinate_) {\n this.createOrUpdateSketchPoint_(event.coordinate.slice());\n return;\n }\n\n this.updateTrace_(event);\n this.modifyDrawing_(event.coordinate);\n }\n\n /**\n * Determine if an event is within the snapping tolerance of the start coord.\n * @param {import(\"../pixel.js\").Pixel} pixel Pixel.\n * @param {boolean} [tracing] Drawing in trace mode (only stop if at the starting point).\n * @return {boolean} The event is within the snapping tolerance of the start.\n * @private\n */\n atFinish_(pixel, tracing) {\n let at = false;\n if (this.sketchFeature_) {\n let potentiallyDone = false;\n let potentiallyFinishCoordinates = [this.finishCoordinate_];\n const mode = this.mode_;\n if (mode === 'Point') {\n at = true;\n } else if (mode === 'Circle') {\n at = this.sketchCoords_.length === 2;\n } else if (mode === 'LineString') {\n potentiallyDone =\n !tracing && this.sketchCoords_.length > this.minPoints_;\n } else if (mode === 'Polygon') {\n const sketchCoords = /** @type {PolyCoordType} */ (this.sketchCoords_);\n potentiallyDone = sketchCoords[0].length > this.minPoints_;\n potentiallyFinishCoordinates = [\n sketchCoords[0][0],\n sketchCoords[0][sketchCoords[0].length - 2],\n ];\n if (tracing) {\n potentiallyFinishCoordinates = [sketchCoords[0][0]];\n } else {\n potentiallyFinishCoordinates = [\n sketchCoords[0][0],\n sketchCoords[0][sketchCoords[0].length - 2],\n ];\n }\n }\n if (potentiallyDone) {\n const map = this.getMap();\n for (let i = 0, ii = potentiallyFinishCoordinates.length; i < ii; i++) {\n const finishCoordinate = potentiallyFinishCoordinates[i];\n const finishPixel = map.getPixelFromCoordinate(finishCoordinate);\n const dx = pixel[0] - finishPixel[0];\n const dy = pixel[1] - finishPixel[1];\n const snapTolerance = this.freehand_ ? 1 : this.snapTolerance_;\n at = Math.sqrt(dx * dx + dy * dy) <= snapTolerance;\n if (at) {\n this.finishCoordinate_ = finishCoordinate;\n break;\n }\n }\n }\n }\n return at;\n }\n\n /**\n * @param {import(\"../coordinate\").Coordinate} coordinates Coordinate.\n * @private\n */\n createOrUpdateSketchPoint_(coordinates) {\n if (!this.sketchPoint_) {\n this.sketchPoint_ = new Feature(new Point(coordinates));\n this.updateSketchFeatures_();\n } else {\n const sketchPointGeom = this.sketchPoint_.getGeometry();\n sketchPointGeom.setCoordinates(coordinates);\n }\n }\n\n /**\n * @param {import(\"../geom/Polygon.js\").default} geometry Polygon geometry.\n * @private\n */\n createOrUpdateCustomSketchLine_(geometry) {\n if (!this.sketchLine_) {\n this.sketchLine_ = new Feature();\n }\n const ring = geometry.getLinearRing(0);\n let sketchLineGeom = this.sketchLine_.getGeometry();\n if (!sketchLineGeom) {\n sketchLineGeom = new LineString(\n ring.getFlatCoordinates(),\n ring.getLayout()\n );\n this.sketchLine_.setGeometry(sketchLineGeom);\n } else {\n sketchLineGeom.setFlatCoordinates(\n ring.getLayout(),\n ring.getFlatCoordinates()\n );\n sketchLineGeom.changed();\n }\n }\n\n /**\n * Start the drawing.\n * @param {import(\"../coordinate.js\").Coordinate} start Start coordinate.\n * @private\n */\n startDrawing_(start) {\n const projection = this.getMap().getView().getProjection();\n const stride = getStrideForLayout(this.geometryLayout_);\n while (start.length < stride) {\n start.push(0);\n }\n this.finishCoordinate_ = start;\n if (this.mode_ === 'Point') {\n this.sketchCoords_ = start.slice();\n } else if (this.mode_ === 'Polygon') {\n this.sketchCoords_ = [[start.slice(), start.slice()]];\n this.sketchLineCoords_ = this.sketchCoords_[0];\n } else {\n this.sketchCoords_ = [start.slice(), start.slice()];\n }\n if (this.sketchLineCoords_) {\n this.sketchLine_ = new Feature(new LineString(this.sketchLineCoords_));\n }\n const geometry = this.geometryFunction_(\n this.sketchCoords_,\n undefined,\n projection\n );\n this.sketchFeature_ = new Feature();\n if (this.geometryName_) {\n this.sketchFeature_.setGeometryName(this.geometryName_);\n }\n this.sketchFeature_.setGeometry(geometry);\n this.updateSketchFeatures_();\n this.dispatchEvent(\n new DrawEvent(DrawEventType.DRAWSTART, this.sketchFeature_)\n );\n }\n\n /**\n * Modify the drawing.\n * @param {import(\"../coordinate.js\").Coordinate} coordinate Coordinate.\n * @private\n */\n modifyDrawing_(coordinate) {\n const map = this.getMap();\n const geometry = this.sketchFeature_.getGeometry();\n const projection = map.getView().getProjection();\n const stride = getStrideForLayout(this.geometryLayout_);\n let coordinates, last;\n while (coordinate.length < stride) {\n coordinate.push(0);\n }\n if (this.mode_ === 'Point') {\n last = this.sketchCoords_;\n } else if (this.mode_ === 'Polygon') {\n coordinates = /** @type {PolyCoordType} */ (this.sketchCoords_)[0];\n last = coordinates[coordinates.length - 1];\n if (this.atFinish_(map.getPixelFromCoordinate(coordinate))) {\n // snap to finish\n coordinate = this.finishCoordinate_.slice();\n }\n } else {\n coordinates = this.sketchCoords_;\n last = coordinates[coordinates.length - 1];\n }\n last[0] = coordinate[0];\n last[1] = coordinate[1];\n this.geometryFunction_(\n /** @type {!LineCoordType} */ (this.sketchCoords_),\n geometry,\n projection\n );\n if (this.sketchPoint_) {\n const sketchPointGeom = this.sketchPoint_.getGeometry();\n sketchPointGeom.setCoordinates(coordinate);\n }\n if (geometry.getType() === 'Polygon' && this.mode_ !== 'Polygon') {\n this.createOrUpdateCustomSketchLine_(/** @type {Polygon} */ (geometry));\n } else if (this.sketchLineCoords_) {\n const sketchLineGeom = this.sketchLine_.getGeometry();\n sketchLineGeom.setCoordinates(this.sketchLineCoords_);\n }\n this.updateSketchFeatures_();\n }\n\n /**\n * Add a new coordinate to the drawing.\n * @param {!PointCoordType} coordinate Coordinate\n * @private\n */\n addToDrawing_(coordinate) {\n const geometry = this.sketchFeature_.getGeometry();\n const projection = this.getMap().getView().getProjection();\n let done;\n let coordinates;\n const mode = this.mode_;\n if (mode === 'LineString' || mode === 'Circle') {\n this.finishCoordinate_ = coordinate.slice();\n coordinates = /** @type {LineCoordType} */ (this.sketchCoords_);\n if (coordinates.length >= this.maxPoints_) {\n if (this.freehand_) {\n coordinates.pop();\n } else {\n done = true;\n }\n }\n coordinates.push(coordinate.slice());\n this.geometryFunction_(coordinates, geometry, projection);\n } else if (mode === 'Polygon') {\n coordinates = /** @type {PolyCoordType} */ (this.sketchCoords_)[0];\n if (coordinates.length >= this.maxPoints_) {\n if (this.freehand_) {\n coordinates.pop();\n } else {\n done = true;\n }\n }\n coordinates.push(coordinate.slice());\n if (done) {\n this.finishCoordinate_ = coordinates[0];\n }\n this.geometryFunction_(this.sketchCoords_, geometry, projection);\n }\n this.createOrUpdateSketchPoint_(coordinate.slice());\n this.updateSketchFeatures_();\n if (done) {\n this.finishDrawing();\n }\n }\n\n /**\n * @param {number} n The number of points to remove.\n */\n removeLastPoints_(n) {\n if (!this.sketchFeature_) {\n return;\n }\n const geometry = this.sketchFeature_.getGeometry();\n const projection = this.getMap().getView().getProjection();\n const mode = this.mode_;\n for (let i = 0; i < n; ++i) {\n let coordinates;\n if (mode === 'LineString' || mode === 'Circle') {\n coordinates = /** @type {LineCoordType} */ (this.sketchCoords_);\n coordinates.splice(-2, 1);\n if (coordinates.length >= 2) {\n this.finishCoordinate_ = coordinates[coordinates.length - 2].slice();\n const finishCoordinate = this.finishCoordinate_.slice();\n coordinates[coordinates.length - 1] = finishCoordinate;\n this.createOrUpdateSketchPoint_(finishCoordinate);\n }\n this.geometryFunction_(coordinates, geometry, projection);\n if (geometry.getType() === 'Polygon' && this.sketchLine_) {\n this.createOrUpdateCustomSketchLine_(\n /** @type {Polygon} */ (geometry)\n );\n }\n } else if (mode === 'Polygon') {\n coordinates = /** @type {PolyCoordType} */ (this.sketchCoords_)[0];\n coordinates.splice(-2, 1);\n const sketchLineGeom = this.sketchLine_.getGeometry();\n if (coordinates.length >= 2) {\n const finishCoordinate = coordinates[coordinates.length - 2].slice();\n coordinates[coordinates.length - 1] = finishCoordinate;\n this.createOrUpdateSketchPoint_(finishCoordinate);\n }\n sketchLineGeom.setCoordinates(coordinates);\n this.geometryFunction_(this.sketchCoords_, geometry, projection);\n }\n\n if (coordinates.length === 1) {\n this.abortDrawing();\n break;\n }\n }\n\n this.updateSketchFeatures_();\n }\n\n /**\n * Remove last point of the feature currently being drawn. Does not do anything when\n * drawing POINT or MULTI_POINT geometries.\n * @api\n */\n removeLastPoint() {\n this.removeLastPoints_(1);\n }\n\n /**\n * Stop drawing and add the sketch feature to the target layer.\n * The {@link module:ol/interaction/Draw~DrawEventType.DRAWEND} event is\n * dispatched before inserting the feature.\n * @api\n */\n finishDrawing() {\n const sketchFeature = this.abortDrawing_();\n if (!sketchFeature) {\n return;\n }\n let coordinates = this.sketchCoords_;\n const geometry = sketchFeature.getGeometry();\n const projection = this.getMap().getView().getProjection();\n if (this.mode_ === 'LineString') {\n // remove the redundant last point\n coordinates.pop();\n this.geometryFunction_(coordinates, geometry, projection);\n } else if (this.mode_ === 'Polygon') {\n // remove the redundant last point in ring\n /** @type {PolyCoordType} */ (coordinates)[0].pop();\n this.geometryFunction_(coordinates, geometry, projection);\n coordinates = geometry.getCoordinates();\n }\n\n // cast multi-part geometries\n if (this.type_ === 'MultiPoint') {\n sketchFeature.setGeometry(\n new MultiPoint([/** @type {PointCoordType} */ (coordinates)])\n );\n } else if (this.type_ === 'MultiLineString') {\n sketchFeature.setGeometry(\n new MultiLineString([/** @type {LineCoordType} */ (coordinates)])\n );\n } else if (this.type_ === 'MultiPolygon') {\n sketchFeature.setGeometry(\n new MultiPolygon([/** @type {PolyCoordType} */ (coordinates)])\n );\n }\n\n // First dispatch event to allow full set up of feature\n this.dispatchEvent(new DrawEvent(DrawEventType.DRAWEND, sketchFeature));\n\n // Then insert feature\n if (this.features_) {\n this.features_.push(sketchFeature);\n }\n if (this.source_) {\n this.source_.addFeature(sketchFeature);\n }\n }\n\n /**\n * Stop drawing without adding the sketch feature to the target layer.\n * @return {Feature<import(\"../geom/SimpleGeometry.js\").default>|null} The sketch feature (or null if none).\n * @private\n */\n abortDrawing_() {\n this.finishCoordinate_ = null;\n const sketchFeature = this.sketchFeature_;\n this.sketchFeature_ = null;\n this.sketchPoint_ = null;\n this.sketchLine_ = null;\n this.overlay_.getSource().clear(true);\n this.deactivateTrace_();\n return sketchFeature;\n }\n\n /**\n * Stop drawing without adding the sketch feature to the target layer.\n * @api\n */\n abortDrawing() {\n const sketchFeature = this.abortDrawing_();\n if (sketchFeature) {\n this.dispatchEvent(new DrawEvent(DrawEventType.DRAWABORT, sketchFeature));\n }\n }\n\n /**\n * Append coordinates to the end of the geometry that is currently being drawn.\n * This can be used when drawing LineStrings or Polygons. Coordinates will\n * either be appended to the current LineString or the outer ring of the current\n * Polygon. If no geometry is being drawn, a new one will be created.\n * @param {!LineCoordType} coordinates Linear coordinates to be appended to\n * the coordinate array.\n * @api\n */\n appendCoordinates(coordinates) {\n const mode = this.mode_;\n const newDrawing = !this.sketchFeature_;\n if (newDrawing) {\n this.startDrawing_(coordinates[0]);\n }\n /** @type {LineCoordType} */\n let sketchCoords;\n if (mode === 'LineString' || mode === 'Circle') {\n sketchCoords = /** @type {LineCoordType} */ (this.sketchCoords_);\n } else if (mode === 'Polygon') {\n sketchCoords =\n this.sketchCoords_ && this.sketchCoords_.length\n ? /** @type {PolyCoordType} */ (this.sketchCoords_)[0]\n : [];\n } else {\n return;\n }\n\n if (newDrawing) {\n sketchCoords.shift();\n }\n\n // Remove last coordinate from sketch drawing (this coordinate follows cursor position)\n sketchCoords.pop();\n\n // Append coordinate list\n for (let i = 0; i < coordinates.length; i++) {\n this.addToDrawing_(coordinates[i]);\n }\n\n const ending = coordinates[coordinates.length - 1];\n // Duplicate last coordinate for sketch drawing (cursor position)\n this.addToDrawing_(ending);\n this.modifyDrawing_(ending);\n }\n\n /**\n * Initiate draw mode by starting from an existing geometry which will\n * receive new additional points. This only works on features with\n * `LineString` geometries, where the interaction will extend lines by adding\n * points to the end of the coordinates array.\n * This will change the original feature, instead of drawing a copy.\n *\n * The function will dispatch a `drawstart` event.\n *\n * @param {!Feature<LineString>} feature Feature to be extended.\n * @api\n */\n extend(feature) {\n const geometry = feature.getGeometry();\n const lineString = geometry;\n this.sketchFeature_ = feature;\n this.sketchCoords_ = lineString.getCoordinates();\n const last = this.sketchCoords_[this.sketchCoords_.length - 1];\n this.finishCoordinate_ = last.slice();\n this.sketchCoords_.push(last.slice());\n this.sketchPoint_ = new Feature(new Point(last));\n this.updateSketchFeatures_();\n this.dispatchEvent(\n new DrawEvent(DrawEventType.DRAWSTART, this.sketchFeature_)\n );\n }\n\n /**\n * Redraw the sketch features.\n * @private\n */\n updateSketchFeatures_() {\n const sketchFeatures = [];\n if (this.sketchFeature_) {\n sketchFeatures.push(this.sketchFeature_);\n }\n if (this.sketchLine_) {\n sketchFeatures.push(this.sketchLine_);\n }\n if (this.sketchPoint_) {\n sketchFeatures.push(this.sketchPoint_);\n }\n const overlaySource = this.overlay_.getSource();\n overlaySource.clear(true);\n overlaySource.addFeatures(sketchFeatures);\n }\n\n /**\n * @private\n */\n updateState_() {\n const map = this.getMap();\n const active = this.getActive();\n if (!map || !active) {\n this.abortDrawing();\n }\n this.overlay_.setMap(active ? map : null);\n }\n}\n\n/**\n * @return {import(\"../style/Style.js\").StyleFunction} Styles.\n */\nfunction getDefaultStyleFunction() {\n const styles = createEditingStyle();\n return function (feature, resolution) {\n return styles[feature.getGeometry().getType()];\n };\n}\n\n/**\n * Create a `geometryFunction` for `type: 'Circle'` that will create a regular\n * polygon with a user specified number of sides and start angle instead of a\n * {@link import(\"../geom/Circle.js\").Circle} geometry.\n * @param {number} [sides] Number of sides of the regular polygon.\n * Default is 32.\n * @param {number} [angle] Angle of the first point in counter-clockwise\n * radians. 0 means East.\n * Default is the angle defined by the heading from the center of the\n * regular polygon to the current pointer position.\n * @return {GeometryFunction} Function that draws a polygon.\n * @api\n */\nexport function createRegularPolygon(sides, angle) {\n return function (coordinates, geometry, projection) {\n const center = fromUserCoordinate(\n /** @type {LineCoordType} */ (coordinates)[0],\n projection\n );\n const end = fromUserCoordinate(\n /** @type {LineCoordType} */ (coordinates)[coordinates.length - 1],\n projection\n );\n const radius = Math.sqrt(squaredCoordinateDistance(center, end));\n geometry = geometry || fromCircle(new Circle(center), sides);\n\n let internalAngle = angle;\n if (!angle && angle !== 0) {\n const x = end[0] - center[0];\n const y = end[1] - center[1];\n internalAngle = Math.atan2(y, x);\n }\n makeRegular(\n /** @type {Polygon} */ (geometry),\n center,\n radius,\n internalAngle\n );\n\n const userProjection = getUserProjection();\n if (userProjection) {\n geometry.transform(projection, userProjection);\n }\n return geometry;\n };\n}\n\n/**\n * Create a `geometryFunction` that will create a box-shaped polygon (aligned\n * with the coordinate system axes). Use this with the draw interaction and\n * `type: 'Circle'` to return a box instead of a circle geometry.\n * @return {GeometryFunction} Function that draws a box-shaped polygon.\n * @api\n */\nexport function createBox() {\n return function (coordinates, geometry, projection) {\n const extent = boundingExtent(\n /** @type {LineCoordType} */ ([\n coordinates[0],\n coordinates[coordinates.length - 1],\n ]).map(function (coordinate) {\n return fromUserCoordinate(coordinate, projection);\n })\n );\n const boxCoordinates = [\n [\n getBottomLeft(extent),\n getBottomRight(extent),\n getTopRight(extent),\n getTopLeft(extent),\n getBottomLeft(extent),\n ],\n ];\n if (geometry) {\n geometry.setCoordinates(boxCoordinates);\n } else {\n geometry = new Polygon(boxCoordinates);\n }\n const userProjection = getUserProjection();\n if (userProjection) {\n geometry.transform(projection, userProjection);\n }\n return geometry;\n };\n}\n\n/**\n * Get the drawing mode. The mode for multi-part geometries is the same as for\n * their single-part cousins.\n * @param {import(\"../geom/Geometry.js\").Type} type Geometry type.\n * @return {Mode} Drawing mode.\n */\nfunction getMode(type) {\n switch (type) {\n case 'Point':\n case 'MultiPoint':\n return 'Point';\n case 'LineString':\n case 'MultiLineString':\n return 'LineString';\n case 'Polygon':\n case 'MultiPolygon':\n return 'Polygon';\n case 'Circle':\n return 'Circle';\n default:\n throw new Error('Invalid type: ' + type);\n }\n}\n\nexport default Draw;\n","import { FeatureLike } from 'ol/Feature';\nimport Map from 'ol/Map';\nimport { Coordinate } from 'ol/coordinate';\nimport { Geometry, LineString, Point, Polygon } from 'ol/geom';\nimport { Type } from 'ol/geom/Geometry';\nimport { Draw, Modify } from 'ol/interaction';\nimport VectorLayer from 'ol/layer/Vector';\nimport VectorSource from 'ol/source/Vector';\nimport { getArea, getLength } from 'ol/sphere';\nimport { Circle as CircleStyle, Fill, RegularShape, Stroke, Style, Text } from 'ol/style';\n\nimport { formattedValueToString } from '@grafana/data';\n\nimport { MapMeasureOptions, measures } from '../utils/measure';\n\nexport class MeasureVectorLayer extends VectorLayer<VectorSource> {\n opts: MapMeasureOptions = {\n action: 'length',\n unit: 'm',\n };\n constructor() {\n super({\n source: new VectorSource(),\n });\n this.setStyle((feature) => {\n return this.styleFunction(feature, false);\n });\n this.setVisible(true);\n }\n\n setOptions(options: MapMeasureOptions) {\n this.opts = options;\n this.getSource()?.refresh();\n }\n\n getMapMeasurement(geo: Geometry): string {\n let v = 0;\n let action = measures[0];\n if (this.opts.action === 'area') {\n action = measures[1];\n v = getArea(geo);\n } else {\n v = getLength(geo);\n }\n return formattedValueToString(action.getUnit(this.opts.unit).format(v));\n }\n\n segmentStyle = new Style({\n text: new Text({\n font: '12px Calibri,sans-serif',\n fill: new Fill({\n color: 'rgba(255, 255, 255, 1)',\n }),\n backgroundFill: new Fill({\n color: 'rgba(0, 0, 0, 0.4)',\n }),\n padding: [2, 2, 2, 2],\n textBaseline: 'bottom',\n offsetY: -12,\n }),\n image: new RegularShape({\n radius: 6,\n points: 3,\n angle: Math.PI,\n displacement: [0, 8],\n fill: new Fill({\n color: 'rgba(0, 0, 0, 0.4)',\n }),\n }),\n });\n\n segmentStyles = [this.segmentStyle];\n\n // Open Layer styles\n shapeStyle = [\n new Style({\n fill: new Fill({\n color: 'rgba(255, 255, 255, 0.2)',\n }),\n image: new CircleStyle({\n radius: 5,\n stroke: new Stroke({\n color: 'rgba(0, 0, 0, 0.7)',\n }),\n fill: new Fill({\n color: 'rgba(255, 255, 255, 0.2)',\n }),\n }),\n }),\n new Style({\n stroke: new Stroke({\n color: [0, 0, 0, 1],\n width: 2,\n lineDash: [4, 8],\n lineDashOffset: 6,\n }),\n }),\n new Style({\n stroke: new Stroke({\n color: [255, 255, 255, 1],\n width: 2,\n lineDash: [4, 8],\n }),\n }),\n ];\n\n labelStyle = new Style({\n text: new Text({\n font: '14px Calibri,sans-serif',\n fill: new Fill({\n color: 'rgba(255, 255, 255, 1)',\n }),\n backgroundFill: new Fill({\n color: 'rgba(0, 0, 0, 0.7)',\n }),\n padding: [3, 3, 3, 3],\n textBaseline: 'bottom',\n offsetY: -15,\n }),\n image: new RegularShape({\n radius: 8,\n points: 3,\n angle: Math.PI,\n displacement: [0, 10],\n fill: new Fill({\n color: 'rgba(0, 0, 0, 0.7)',\n }),\n }),\n });\n\n tipStyle = new Style({\n text: new Text({\n font: '12px Calibri,sans-serif',\n fill: new Fill({\n color: 'rgba(255, 255, 255, 1)',\n }),\n backgroundFill: new Fill({\n color: 'rgba(0, 0, 0, 0.4)',\n }),\n padding: [2, 2, 2, 2],\n textAlign: 'left',\n offsetX: 15,\n }),\n });\n\n modifyStyle = new Style({\n image: new CircleStyle({\n radius: 5,\n stroke: new Stroke({\n color: 'rgba(0, 0, 0, 0.7)',\n }),\n fill: new Fill({\n color: 'rgba(0, 0, 0, 0.4)',\n }),\n }),\n text: new Text({\n text: 'Drag to modify',\n font: '12px Calibri,sans-serif',\n fill: new Fill({\n color: 'rgba(255, 255, 255, 1)',\n }),\n backgroundFill: new Fill({\n color: 'rgba(0, 0, 0, 0.7)',\n }),\n padding: [2, 2, 2, 2],\n textAlign: 'left',\n offsetX: 15,\n }),\n });\n\n readonly modify = new Modify({ source: this.getSource()!, style: this.modifyStyle });\n tipPoint!: Geometry;\n draw!: Draw; // global so we can remove it later\n\n styleFunction(feature: FeatureLike, segments: boolean, drawType?: string, tip?: string): Style[] {\n const styles = [...this.shapeStyle];\n const geometry = feature.getGeometry();\n if (geometry) {\n const type = geometry.getType();\n let point: Point;\n let label: string;\n let line: LineString;\n if (!drawType || drawType === type) {\n if (type === 'Polygon' && geometry instanceof Polygon) {\n point = geometry.getInteriorPoint();\n label = this.getMapMeasurement(geometry);\n line = new LineString(geometry.getCoordinates()[0]);\n } else if (type === 'LineString' && geometry instanceof LineString) {\n point = new Point(geometry.getLastCoordinate());\n label = this.getMapMeasurement(geometry);\n }\n }\n if (segments && line!) {\n let count = 0;\n line.forEachSegment((a: Coordinate, b: Coordinate) => {\n const segment = new LineString([a, b]);\n const label = this.getMapMeasurement(segment);\n if (this.segmentStyles.length - 1 < count) {\n this.segmentStyles.push(this.segmentStyle.clone());\n }\n const segmentPoint = new Point(segment.getCoordinateAt(0.5));\n this.segmentStyles[count].setGeometry(segmentPoint);\n this.segmentStyles[count].getText().setText(label);\n styles.push(this.segmentStyles[count]);\n count++;\n });\n }\n if (label!) {\n this.labelStyle.setGeometry(point!);\n this.labelStyle.getText().setText(label);\n styles.push(this.labelStyle);\n }\n if (\n tip &&\n type === 'Point' &&\n geometry instanceof Point &&\n !this.modify.getOverlay().getSource().getFeatures().length\n ) {\n this.tipPoint = geometry;\n this.tipStyle.getText().setText(tip);\n styles.push(this.tipStyle);\n }\n }\n return styles;\n }\n\n addInteraction(map: Map, typeSelect: Type, showSegments: boolean, clearPrevious: boolean) {\n const drawType = typeSelect;\n const activeTip =\n ' Click to continue ' + (drawType === 'Polygon' ? 'polygon' : 'line') + ' \\n (double-click to end) ';\n const idleTip = ' Click to start ';\n let tip = idleTip;\n this.draw = new Draw({\n source: this.getSource()!,\n type: drawType,\n style: (feature) => {\n return this.styleFunction(feature, showSegments, drawType, tip);\n },\n });\n this.draw.on('drawstart', () => {\n if (clearPrevious) {\n this.getSource()!.clear();\n }\n this.modify.setActive(false);\n tip = activeTip;\n });\n this.draw.on('drawend', () => {\n this.modifyStyle.setGeometry(this.tipPoint);\n this.modify.setActive(true);\n map.once('pointermove', () => {\n this.modifyStyle.setGeometry('');\n });\n tip = idleTip;\n });\n this.modify.setActive(true);\n map.addInteraction(this.draw);\n }\n}\n","import { css } from '@emotion/css';\nimport Map from 'ol/Map';\nimport React, { useMemo, useRef, useState } from 'react';\n\nimport { GrafanaTheme2, SelectableValue } from '@grafana/data';\nimport { Button, IconButton, RadioButtonGroup, Select } from '@grafana/ui';\nimport { config } from 'app/core/config';\n\nimport { MapMeasure, MapMeasureOptions, measures } from '../utils/measure';\n\nimport { MeasureVectorLayer } from './MeasureVectorLayer';\n\ntype Props = {\n map: Map;\n menuActiveState: (value: boolean) => void;\n};\n\nexport const MeasureOverlay = ({ map, menuActiveState }: Props) => {\n const vector = useRef(new MeasureVectorLayer());\n const measureStyle = getStyles(config.theme2);\n\n // Menu State Management\n const [firstLoad, setFirstLoad] = useState<boolean>(true);\n const [menuActive, setMenuActive] = useState<boolean>(false);\n\n // Options State\n const [options, setOptions] = useState<MapMeasureOptions>({\n action: measures[0].value!,\n unit: measures[0].units[0].value!,\n });\n const unit = useMemo(() => {\n const action = measures.find((m: MapMeasure) => m.value === options.action) ?? measures[0];\n const current = action.getUnit(options.unit);\n vector.current.setOptions(options);\n return {\n current,\n options: action.units,\n };\n }, [options]);\n\n const clearPrevious = true;\n const showSegments = false;\n\n function toggleMenu() {\n setMenuActive(!menuActive);\n // Lift menu state\n // TODO: consolidate into one state\n menuActiveState(!menuActive);\n if (menuActive) {\n map.removeInteraction(vector.current.draw);\n vector.current.setVisible(false);\n } else {\n if (firstLoad) {\n // Initialize on first load\n setFirstLoad(false);\n vector.current.setZIndex(1);\n map.addLayer(vector.current);\n map.addInteraction(vector.current.modify);\n }\n vector.current.setVisible(true);\n map.removeInteraction(vector.current.draw); // Remove last interaction\n const a = measures.find((v: MapMeasure) => v.value === options.action) ?? measures[0];\n vector.current.addInteraction(map, a.geometry, showSegments, clearPrevious);\n }\n }\n\n return (\n <div className={`${measureStyle.infoWrap} ${!menuActive ? measureStyle.infoWrapClosed : null}`}>\n {menuActive ? (\n <div>\n <div className={measureStyle.rowGroup}>\n <RadioButtonGroup\n value={options.action}\n options={measures}\n size=\"md\"\n fullWidth={false}\n onChange={(e: string) => {\n map.removeInteraction(vector.current.draw);\n const m = measures.find((v: MapMeasure) => v.value === e) ?? measures[0];\n const unit = m.getUnit(options.unit);\n setOptions({ ...options, action: m.value!, unit: unit.value! });\n vector.current.addInteraction(map, m.geometry, showSegments, clearPrevious);\n }}\n />\n <Button className={measureStyle.button} icon=\"times\" variant=\"secondary\" size=\"sm\" onClick={toggleMenu} />\n </div>\n <Select\n className={measureStyle.unitSelect}\n value={unit.current}\n options={unit.options}\n isSearchable={false}\n onChange={(v: SelectableValue<string>) => {\n const a = measures.find((v: SelectableValue<string>) => v.value === options.action) ?? measures[0];\n const unit = a.getUnit(v.value) ?? a.units[0];\n setOptions({ ...options, unit: unit.value! });\n }}\n />\n </div>\n ) : (\n <IconButton\n className={measureStyle.icon}\n name=\"ruler-combined\"\n tooltip=\"show measure tools\"\n tooltipPlacement=\"left\"\n onClick={toggleMenu}\n />\n )}\n </div>\n );\n};\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n button: css({\n marginLeft: 'auto',\n }),\n icon: css({\n backgroundColor: theme.colors.secondary.main,\n display: 'inline-block',\n height: '19.25px',\n margin: '1px',\n width: '19.25px',\n }),\n infoWrap: css({\n color: `${theme.colors.text}`,\n backgroundColor: theme.colors.background.secondary,\n // eslint-disable-next-line @grafana/no-border-radius-literal\n borderRadius: '4px',\n padding: '2px',\n }),\n infoWrapClosed: css({\n height: '25.25px',\n width: '25.25px',\n }),\n rowGroup: css({\n display: 'flex',\n justifyContent: 'flex-end',\n }),\n unitSelect: css({\n minWidth: '200px',\n }),\n});\n","import { css } from '@emotion/react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\n\nimport 'ol/ol.css';\nimport 'ol-ext/dist/ol-ext.css';\n\n/**\n * Will be loaded *after* the css above\n */\nexport function getGlobalStyles(theme: GrafanaTheme2) {\n // NOTE: this works with\n // node_modules/ol/ol.css\n // use !important;\n // This file keeps the rules\n\n // .ol-box {\n // border: 2px solid blue;\n // }\n\n // .ol-scale-step-marker {\n // background-color: #000000;\n // }\n // .ol-scale-step-text {\n // color: #000000;\n // text-shadow: -2px 0 #FFFFFF, 0 2px #FFFFFF, 2px 0 #FFFFFF, 0 -2px #FFFFFF;\n // }\n // .ol-scale-text {\n // color: #000000;\n // text-shadow: -2px 0 #FFFFFF, 0 2px #FFFFFF, 2px 0 #FFFFFF, 0 -2px #FFFFFF;\n // }\n // .ol-scale-singlebar {\n // border: 1px solid black;\n // }\n // .ol-viewport, .ol-unselectable {\n // -webkit-tap-highlight-color: rgba(0,0,0,0);\n // }\n\n // .ol-overviewmap .ol-overviewmap-map {\n // border: 1px solid #7b98bc;\n // }\n // .ol-overviewmap:not(.ol-collapsed) {\n // background: rgba(255,255,255,0.8);\n // }\n // .ol-overviewmap-box {\n // border: 2px dotted rgba(0,60,136,0.7);\n // }\n\n return css({\n '.ol-scale-line': {\n background: theme.colors.border.weak, // rgba(0,60,136,0.3);\n },\n '.ol-scale-line-inner': {\n border: `1px solid ${theme.colors.text.primary}`, // #eee;\n borderTop: 0, // 0px;\n color: theme.colors.text.primary, // #eee;\n },\n '.ol-control': {\n backgroundColor: theme.colors.background.primary, // rgba(255,255,255,0.4);\n },\n '.ol-control:hover': {\n backgroundColor: theme.colors.background.secondary, // rgba(255,255,255,0.6);\n },\n '.ol-control button': {\n color: theme.colors.secondary.text, // white;\n backgroundColor: theme.colors.secondary.main, // rgba(0,60,136,0.5);\n },\n '.ol-control button:hover': {\n color: theme.colors.secondary.text,\n backgroundColor: theme.colors.secondary.shade, // rgba(0,60,136,0.5);\n },\n '.ol-control button:focus': {\n color: theme.colors.secondary.text,\n backgroundColor: theme.colors.secondary.main, // rgba(0,60,136,0.5);\n },\n '.ol-attribution ul': {\n color: theme.colors.text.primary, // #000;\n textShadow: 'none',\n },\n '.ol-attribution:not(.ol-collapsed)': {\n backgroundColor: theme.colors.background.secondary, // rgba(255,255,255,0.8);\n },\n });\n}\n","import { Feature } from 'ol';\nimport { Geometry, LineString, Point } from 'ol/geom';\nimport VectorSource from 'ol/source/Vector';\n\nimport { DataFrame, Field } from '@grafana/data';\n\nimport { getGeometryField, LocationFieldMatchers } from './location';\n\nexport interface FrameVectorSourceOptions {}\n\nexport class FrameVectorSource<T extends Geometry = Geometry> extends VectorSource<T> {\n constructor(public location: LocationFieldMatchers) {\n super({});\n }\n\n update(frame: DataFrame) {\n this.clear(true);\n const info = getGeometryField(frame, this.location);\n if (!info.field) {\n this.changed();\n return;\n }\n\n for (let i = 0; i < frame.length; i++) {\n this.addFeatureInternal(\n new Feature({\n frame,\n rowIndex: i,\n geometry: info.field.values[i] as T,\n })\n );\n }\n\n // only call this at the end\n this.changed();\n }\n\n updateLineString(frame: DataFrame) {\n this.clear(true);\n const info = getGeometryField(frame, this.location);\n if (!info.field) {\n this.changed();\n return;\n }\n\n //eslint-disable-next-line\n const field = info.field as unknown as Field<Point>;\n const geometry: Geometry = new LineString(field.values.map((p) => p.getCoordinates()));\n this.addFeatureInternal(\n new Feature({\n frame,\n rowIndex: 0,\n geometry: geometry as T,\n })\n );\n\n // only call this at the end\n this.changed();\n }\n}\n","import { css, cx } from '@emotion/css';\nimport BaseLayer from 'ol/layer/Base';\nimport React, { useMemo } from 'react';\nimport { useObservable } from 'react-use';\nimport { of } from 'rxjs';\n\nimport { DataFrame, formattedValueToString, getFieldColorModeForField, GrafanaTheme2 } from '@grafana/data';\nimport { getMinMaxAndDelta } from '@grafana/data/src/field/scale';\nimport { useStyles2, VizLegendItem } from '@grafana/ui';\nimport { ColorScale } from 'app/core/components/ColorScale/ColorScale';\nimport { SanitizedSVG } from 'app/core/components/SVG/SanitizedSVG';\nimport { getThresholdItems } from 'app/core/components/TimelineChart/utils';\nimport { config } from 'app/core/config';\nimport { DimensionSupplier } from 'app/features/dimensions';\n\nimport { StyleConfigState } from '../style/types';\nimport { MapLayerState } from '../types';\n\nexport interface MarkersLegendProps {\n size?: DimensionSupplier<number>;\n layerName?: string;\n styleConfig?: StyleConfigState;\n layer?: BaseLayer;\n}\n\nexport function MarkersLegend(props: MarkersLegendProps) {\n const { layerName, styleConfig, layer } = props;\n const style = useStyles2(getStyles);\n\n const hoverEvent = useObservable(((layer as any)?.__state as MapLayerState)?.mouseEvents ?? of(undefined));\n\n const colorField = styleConfig?.dims?.color?.field;\n const hoverValue = useMemo(() => {\n if (!colorField || !hoverEvent) {\n return undefined;\n }\n\n const props = hoverEvent.getProperties();\n const frame: DataFrame = props.frame;\n\n if (!frame) {\n return undefined;\n }\n\n const rowIndex: number = props.rowIndex;\n return colorField.values[rowIndex];\n }, [hoverEvent, colorField]);\n\n if (!styleConfig) {\n return <></>;\n }\n\n const { color, opacity } = styleConfig?.base ?? {};\n const symbol = styleConfig?.config.symbol?.fixed;\n\n if (color && symbol && !colorField) {\n return (\n <div className={style.infoWrap}>\n <div className={style.layerName}>{layerName}</div>\n <div className={cx(style.layerBody, style.fixedColorContainer)}>\n <SanitizedSVG\n src={`public/${symbol}`}\n className={style.legendSymbol}\n title={'Symbol'}\n style={{ fill: color, opacity: opacity }}\n />\n </div>\n </div>\n );\n }\n\n if (!colorField) {\n return <></>;\n }\n\n const colorMode = getFieldColorModeForField(colorField);\n\n if (colorMode.isContinuous && colorMode.getColors) {\n const colors = colorMode.getColors(config.theme2);\n const colorRange = getMinMaxAndDelta(colorField);\n // TODO: explore showing mean on the gradiant scale\n // const stats = reduceField({\n // field: color.field!,\n // reducers: [\n // ReducerID.min,\n // ReducerID.max,\n // ReducerID.mean,\n // // std dev?\n // ]\n // })\n\n const display = colorField.display\n ? (v: number) => formattedValueToString(colorField.display!(v))\n : (v: number) => `${v}`;\n return (\n <div className={style.infoWrap}>\n <div className={style.layerName}>{layerName}</div>\n <div className={cx(style.layerBody, style.colorScaleWrapper)}>\n <ColorScale\n hoverValue={hoverValue}\n colorPalette={colors}\n min={colorRange.min ?? 0}\n max={colorRange.max ?? 100}\n display={display}\n useStopsPercentage={false}\n />\n </div>\n </div>\n );\n }\n\n const thresholds = colorField?.config?.thresholds;\n if (!thresholds || thresholds.steps.length < 2) {\n return <div></div>; // don't show anything in the legend\n }\n\n const items = getThresholdItems(colorField!.config, config.theme2);\n return (\n <div className={style.infoWrap}>\n <div className={style.layerName}>{layerName}</div>\n <div className={cx(style.layerBody, style.legend)}>\n {items.map((item: VizLegendItem, idx: number) => (\n <div key={`${idx}/${item.label}`} className={style.legendItem}>\n <i style={{ background: item.color }}></i>\n {item.label}\n </div>\n ))}\n </div>\n </div>\n );\n}\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n infoWrap: css({\n display: 'flex',\n flexDirection: 'column',\n background: theme.colors.background.secondary,\n // eslint-disable-next-line @grafana/no-border-radius-literal\n borderRadius: '1px',\n padding: theme.spacing(1),\n borderBottom: `2px solid ${theme.colors.border.strong}`,\n minWidth: '150px',\n }),\n layerName: css({\n fontSize: theme.typography.body.fontSize,\n }),\n layerBody: css({\n paddingLeft: '10px',\n }),\n legend: css({\n lineHeight: '18px',\n display: 'flex',\n flexDirection: 'column',\n fontSize: theme.typography.bodySmall.fontSize,\n padding: '5px 10px 0',\n\n i: {\n width: '15px',\n height: '15px',\n float: 'left',\n marginRight: '8px',\n opacity: 0.7,\n borderRadius: theme.shape.radius.circle,\n },\n }),\n legendItem: css({\n whiteSpace: 'nowrap',\n }),\n fixedColorContainer: css({\n minWidth: '80px',\n fontSize: theme.typography.bodySmall.fontSize,\n paddingTop: '5px',\n }),\n legendSymbol: css({\n height: '18px',\n width: '18px',\n margin: 'auto',\n }),\n colorScaleWrapper: css({\n minWidth: '200px',\n fontSize: theme.typography.bodySmall.fontSize,\n paddingTop: '10px',\n }),\n});\n","import React, { Component } from 'react';\nimport { Observable, Unsubscribable } from 'rxjs';\n\ninterface Props<T> {\n watch: Observable<T>;\n child: React.ComponentType<T>;\n initialSubProps: T;\n}\n\ninterface State<T> {\n subProps: T;\n}\n\nexport class ObservablePropsWrapper<T extends {}> extends Component<Props<T>, State<T>> {\n sub?: Unsubscribable;\n\n constructor(props: Props<T>) {\n super(props);\n this.state = {\n subProps: props.initialSubProps,\n };\n }\n\n componentDidMount() {\n this.sub = this.props.watch.subscribe({\n next: (subProps: T) => {\n this.setState({ subProps });\n },\n complete: () => {},\n error: (err) => {},\n });\n }\n\n componentWillUnmount() {\n if (this.sub) {\n this.sub.unsubscribe();\n }\n }\n\n render() {\n const { subProps } = this.state;\n return <this.props.child {...subProps} />;\n }\n}\n","import { Fill, RegularShape, Stroke, Circle, Style, Icon, Text } from 'ol/style';\nimport tinycolor from 'tinycolor2';\n\nimport { Registry, RegistryItem, textUtil } from '@grafana/data';\nimport { config } from '@grafana/runtime';\nimport { getPublicOrAbsoluteUrl } from 'app/features/dimensions';\n\nimport { defaultStyleConfig, DEFAULT_SIZE, StyleConfigValues, StyleMaker } from './types';\nimport { getDisplacement } from './utils';\n\ninterface SymbolMaker extends RegistryItem {\n aliasIds: string[];\n make: StyleMaker;\n}\n\nenum RegularShapeId {\n circle = 'circle',\n square = 'square',\n triangle = 'triangle',\n star = 'star',\n cross = 'cross',\n x = 'x',\n}\n\nconst MarkerShapePath = {\n circle: 'img/icons/marker/circle.svg',\n square: 'img/icons/marker/square.svg',\n triangle: 'img/icons/marker/triangle.svg',\n star: 'img/icons/marker/star.svg',\n cross: 'img/icons/marker/cross.svg',\n x: 'img/icons/marker/x-mark.svg',\n};\n\nexport function getFillColor(cfg: StyleConfigValues) {\n const opacity = cfg.opacity == null ? 0.8 : cfg.opacity;\n if (opacity === 1) {\n return new Fill({ color: cfg.color });\n }\n if (opacity > 0) {\n const color = tinycolor(cfg.color).setAlpha(opacity).toRgbString();\n return new Fill({ color });\n }\n return undefined;\n}\n\nexport function getStrokeStyle(cfg: StyleConfigValues) {\n const opacity = cfg.opacity == null ? 0.8 : cfg.opacity;\n if (opacity === 1) {\n return new Stroke({ color: cfg.color, width: cfg.lineWidth ?? 1 });\n }\n if (opacity > 0) {\n const color = tinycolor(cfg.color).setAlpha(opacity).toRgbString();\n return new Stroke({ color, width: cfg.lineWidth ?? 1 });\n }\n return undefined;\n}\n\nconst textLabel = (cfg: StyleConfigValues) => {\n if (!cfg.text) {\n return undefined;\n }\n\n const fontFamily = config.theme2.typography.fontFamily;\n const textConfig = {\n ...defaultStyleConfig.textConfig,\n ...cfg.textConfig,\n };\n return new Text({\n text: cfg.text,\n fill: new Fill({ color: cfg.color ?? defaultStyleConfig.color.fixed }),\n font: `normal ${textConfig.fontSize}px ${fontFamily}`,\n ...textConfig,\n });\n};\n\nexport const textMarker = (cfg: StyleConfigValues) => {\n return new Style({\n text: textLabel(cfg),\n });\n};\n\nexport const circleMarker = (cfg: StyleConfigValues) => {\n const stroke = new Stroke({ color: cfg.color, width: cfg.lineWidth ?? 1 });\n const radius = cfg.size ?? DEFAULT_SIZE;\n return new Style({\n image: new Circle({\n stroke,\n fill: getFillColor(cfg),\n radius,\n displacement: getDisplacement(cfg.symbolAlign ?? defaultStyleConfig.symbolAlign, radius),\n }),\n text: textLabel(cfg),\n stroke, // in case lines are sent to the markers layer\n });\n};\n\n// Does not have image\nexport const polyStyle = (cfg: StyleConfigValues) => {\n return new Style({\n fill: getFillColor(cfg),\n stroke: new Stroke({ color: cfg.color, width: cfg.lineWidth ?? 1 }),\n text: textLabel(cfg),\n });\n};\n\nexport const routeStyle = (cfg: StyleConfigValues) => {\n return new Style({\n fill: getFillColor(cfg),\n stroke: getStrokeStyle(cfg),\n text: textLabel(cfg),\n });\n};\n\n// Square and cross\nconst errorMarker = (cfg: StyleConfigValues) => {\n const radius = cfg.size ?? DEFAULT_SIZE;\n const stroke = new Stroke({ color: '#F00', width: 1 });\n return [\n new Style({\n image: new RegularShape({\n stroke,\n points: 4,\n radius,\n angle: Math.PI / 4,\n }),\n }),\n new Style({\n image: new RegularShape({\n stroke,\n points: 4,\n radius,\n radius2: 0,\n angle: 0,\n }),\n }),\n ];\n};\n\nconst makers: SymbolMaker[] = [\n {\n id: RegularShapeId.circle,\n name: 'Circle',\n aliasIds: [MarkerShapePath.circle],\n make: circleMarker,\n },\n {\n id: RegularShapeId.square,\n name: 'Square',\n aliasIds: [MarkerShapePath.square],\n make: (cfg: StyleConfigValues) => {\n const radius = cfg.size ?? DEFAULT_SIZE;\n const rotation = cfg.rotation ?? 0;\n return new Style({\n image: new RegularShape({\n stroke: new Stroke({ color: cfg.color, width: cfg.lineWidth ?? 1 }),\n fill: getFillColor(cfg),\n points: 4,\n radius,\n angle: Math.PI / 4,\n rotation: (rotation * Math.PI) / 180,\n displacement: getDisplacement(cfg.symbolAlign ?? defaultStyleConfig.symbolAlign, radius),\n }),\n text: textLabel(cfg),\n });\n },\n },\n {\n id: RegularShapeId.triangle,\n name: 'Triangle',\n aliasIds: [MarkerShapePath.triangle],\n make: (cfg: StyleConfigValues) => {\n const radius = cfg.size ?? DEFAULT_SIZE;\n const rotation = cfg.rotation ?? 0;\n return new Style({\n image: new RegularShape({\n stroke: new Stroke({ color: cfg.color, width: cfg.lineWidth ?? 1 }),\n fill: getFillColor(cfg),\n points: 3,\n radius,\n rotation: (rotation * Math.PI) / 180,\n angle: 0,\n displacement: getDisplacement(cfg.symbolAlign ?? defaultStyleConfig.symbolAlign, radius),\n }),\n text: textLabel(cfg),\n });\n },\n },\n {\n id: RegularShapeId.star,\n name: 'Star',\n aliasIds: [MarkerShapePath.star],\n make: (cfg: StyleConfigValues) => {\n const radius = cfg.size ?? DEFAULT_SIZE;\n const rotation = cfg.rotation ?? 0;\n return new Style({\n image: new RegularShape({\n stroke: new Stroke({ color: cfg.color, width: cfg.lineWidth ?? 1 }),\n fill: getFillColor(cfg),\n points: 5,\n radius,\n radius2: radius * 0.4,\n angle: 0,\n rotation: (rotation * Math.PI) / 180,\n displacement: getDisplacement(cfg.symbolAlign ?? defaultStyleConfig.symbolAlign, radius),\n }),\n text: textLabel(cfg),\n });\n },\n },\n {\n id: RegularShapeId.cross,\n name: 'Cross',\n aliasIds: [MarkerShapePath.cross],\n make: (cfg: StyleConfigValues) => {\n const radius = cfg.size ?? DEFAULT_SIZE;\n const rotation = cfg.rotation ?? 0;\n return new Style({\n image: new RegularShape({\n stroke: new Stroke({ color: cfg.color, width: cfg.lineWidth ?? 1 }),\n points: 4,\n radius,\n radius2: 0,\n angle: 0,\n rotation: (rotation * Math.PI) / 180,\n displacement: getDisplacement(cfg.symbolAlign ?? defaultStyleConfig.symbolAlign, radius),\n }),\n text: textLabel(cfg),\n });\n },\n },\n {\n id: RegularShapeId.x,\n name: 'X',\n aliasIds: [MarkerShapePath.x],\n make: (cfg: StyleConfigValues) => {\n const radius = cfg.size ?? DEFAULT_SIZE;\n const rotation = cfg.rotation ?? 0;\n return new Style({\n image: new RegularShape({\n stroke: new Stroke({ color: cfg.color, width: cfg.lineWidth ?? 1 }),\n points: 4,\n radius,\n radius2: 0,\n angle: Math.PI / 4,\n rotation: (rotation * Math.PI) / 180,\n displacement: getDisplacement(cfg.symbolAlign ?? defaultStyleConfig.symbolAlign, radius),\n }),\n text: textLabel(cfg),\n });\n },\n },\n];\n\nasync function prepareSVG(url: string, size?: number): Promise<string> {\n return fetch(url, { method: 'GET' })\n .then((res) => {\n return res.text();\n })\n .then((text) => {\n text = textUtil.sanitizeSVGContent(text);\n\n const parser = new DOMParser();\n const doc = parser.parseFromString(text, 'image/svg+xml');\n const svg = doc.getElementsByTagName('svg')[0];\n if (!svg) {\n return '';\n }\n\n const svgSize = size ?? 100;\n const width = svg.getAttribute('width') ?? svgSize;\n const height = svg.getAttribute('height') ?? svgSize;\n\n // open layers requires a white fill becaues it uses tint to set color\n svg.setAttribute('fill', '#fff');\n svg.setAttribute('width', `${width}px`);\n svg.setAttribute('height', `${height}px`);\n const svgString = new XMLSerializer().serializeToString(svg);\n const svgURI = encodeURIComponent(svgString);\n return `data:image/svg+xml,${svgURI}`;\n })\n .catch((error) => {\n console.error(error); // eslint-disable-line no-console\n return '';\n });\n}\n\n// Really just a cache for the various symbol styles\nconst markerMakers = new Registry<SymbolMaker>(() => makers);\n\nexport function getMarkerAsPath(shape?: string): string | undefined {\n const marker = markerMakers.getIfExists(shape);\n if (marker?.aliasIds?.length) {\n return marker.aliasIds[0];\n }\n return undefined;\n}\n\n// Will prepare symbols as necessary\nexport async function getMarkerMaker(symbol?: string, hasTextLabel?: boolean): Promise<StyleMaker> {\n if (!symbol) {\n return hasTextLabel ? textMarker : circleMarker;\n }\n\n let maker = markerMakers.getIfExists(symbol);\n if (maker) {\n return maker.make;\n }\n\n // Prepare svg as icon\n if (symbol.endsWith('.svg')) {\n const src = await prepareSVG(getPublicOrAbsoluteUrl(symbol));\n maker = {\n id: symbol,\n name: symbol,\n aliasIds: [],\n make: src\n ? (cfg: StyleConfigValues) => {\n const radius = cfg.size ?? DEFAULT_SIZE;\n const rotation = cfg.rotation ?? 0;\n return [\n new Style({\n image: new Icon({\n src,\n color: cfg.color,\n opacity: cfg.opacity ?? 1,\n scale: (DEFAULT_SIZE + radius) / 100,\n rotation: (rotation * Math.PI) / 180,\n displacement: getDisplacement(cfg.symbolAlign ?? defaultStyleConfig.symbolAlign, radius / 2),\n }),\n text: !cfg?.text ? undefined : textLabel(cfg),\n }),\n // transparent bounding box for featureAtPixel detection\n new Style({\n image: new RegularShape({\n fill: new Fill({ color: 'rgba(0,0,0,0)' }),\n points: 4,\n radius: cfg.size,\n rotation: (rotation * Math.PI) / 180 + Math.PI / 4,\n }),\n }),\n ];\n }\n : errorMarker,\n };\n markerMakers.register(maker);\n return maker.make;\n }\n\n // default to showing a circle\n return errorMarker;\n}\n","import { config } from '@grafana/runtime';\nimport { TextDimensionMode } from '@grafana/schema';\n\nimport { getMarkerMaker } from './markers';\nimport {\n HorizontalAlign,\n VerticalAlign,\n defaultStyleConfig,\n StyleConfig,\n StyleConfigFields,\n StyleConfigState,\n SymbolAlign,\n} from './types';\n\n/** Indicate if the style wants to show text values */\nexport function styleUsesText(config: StyleConfig): boolean {\n const text = config?.text;\n if (!text) {\n return false;\n }\n if (text.mode === TextDimensionMode.Fixed && text.fixed?.length) {\n return true;\n }\n if (text.mode === TextDimensionMode.Field && text.field?.length) {\n return true;\n }\n return false;\n}\n\n/** Return a distinct list of fields used to dynamically change the style */\nexport async function getStyleConfigState(cfg?: StyleConfig): Promise<StyleConfigState> {\n if (!cfg) {\n cfg = defaultStyleConfig;\n }\n const hasText = styleUsesText(cfg);\n const fields: StyleConfigFields = {};\n const maker = await getMarkerMaker(cfg.symbol?.fixed, hasText);\n const state: StyleConfigState = {\n config: cfg, // raw values\n hasText,\n fields,\n base: {\n color: config.theme2.visualization.getColorByName(cfg.color?.fixed ?? defaultStyleConfig.color.fixed),\n opacity: cfg.opacity ?? defaultStyleConfig.opacity,\n lineWidth: cfg.lineWidth ?? 1,\n size: cfg.size?.fixed ?? defaultStyleConfig.size.fixed,\n rotation: cfg.rotation?.fixed ?? defaultStyleConfig.rotation.fixed, // add ability follow path later\n symbolAlign: cfg.symbolAlign ?? defaultStyleConfig.symbolAlign,\n },\n maker,\n };\n\n if (cfg.color?.field?.length) {\n fields.color = cfg.color.field;\n }\n if (cfg.size?.field?.length) {\n fields.size = cfg.size.field;\n }\n if (cfg.rotation?.field?.length) {\n fields.rotation = cfg.rotation.field;\n }\n\n if (hasText) {\n state.base.text = cfg.text?.fixed;\n state.base.textConfig = cfg.textConfig ?? defaultStyleConfig.textConfig;\n\n if (cfg.text?.field?.length) {\n fields.text = cfg.text.field;\n }\n }\n\n // Clear the fields if possible\n if (!Object.keys(fields).length) {\n state.fields = undefined;\n }\n return state;\n}\n\n/** Return a displacment array depending on alignment and icon radius */\nexport function getDisplacement(symbolAlign: SymbolAlign, radius: number) {\n const displacement = [0, 0];\n if (symbolAlign?.horizontal === HorizontalAlign.Left) {\n displacement[0] = -radius;\n } else if (symbolAlign?.horizontal === HorizontalAlign.Right) {\n displacement[0] = radius;\n }\n if (symbolAlign?.vertical === VerticalAlign.Top) {\n displacement[1] = radius;\n } else if (symbolAlign?.vertical === VerticalAlign.Bottom) {\n displacement[1] = -radius;\n }\n return displacement;\n}\n","import { capitalize } from 'lodash';\nimport React, { useMemo } from 'react';\nimport { useObservable } from 'react-use';\nimport { Observable, of } from 'rxjs';\n\nimport { FieldConfigPropertyItem, StandardEditorProps, StandardEditorsRegistryItem, FrameMatcher } from '@grafana/data';\nimport {\n ScaleDimensionConfig,\n ResourceDimensionConfig,\n ColorDimensionConfig,\n TextDimensionConfig,\n ScalarDimensionConfig,\n} from '@grafana/schema';\nimport {\n ColorPicker,\n Field,\n HorizontalGroup,\n InlineField,\n InlineFieldRow,\n InlineLabel,\n RadioButtonGroup,\n} from '@grafana/ui';\nimport { NumberValueEditor } from 'app/core/components/OptionsUI/number';\nimport { SliderValueEditor } from 'app/core/components/OptionsUI/slider';\nimport {\n ColorDimensionEditor,\n ResourceDimensionEditor,\n ScaleDimensionEditor,\n ScalarDimensionEditor,\n TextDimensionEditor,\n} from 'app/features/dimensions/editors';\nimport { ResourceFolderName, defaultTextConfig, MediaType } from 'app/features/dimensions/types';\n\nimport {\n HorizontalAlign,\n VerticalAlign,\n defaultStyleConfig,\n GeometryTypeId,\n StyleConfig,\n TextAlignment,\n TextBaseline,\n} from '../style/types';\nimport { styleUsesText } from '../style/utils';\nimport { LayerContentInfo } from '../utils/getFeatures';\n\nexport interface StyleEditorOptions {\n layerInfo?: Observable<LayerContentInfo>;\n simpleFixedValues?: boolean;\n displayRotation?: boolean;\n hideSymbol?: boolean;\n frameMatcher?: FrameMatcher;\n}\n\ntype Props = StandardEditorProps<StyleConfig, StyleEditorOptions>;\n\nexport const StyleEditor = (props: Props) => {\n const { value, onChange, item } = props;\n const context = useMemo(() => {\n if (!item.settings?.frameMatcher) {\n return props.context;\n }\n\n return { ...props.context, data: props.context.data.filter(item.settings.frameMatcher) };\n }, [props.context, item.settings]);\n\n const settings = item.settings;\n\n const onSizeChange = (sizeValue: ScaleDimensionConfig | undefined) => {\n onChange({ ...value, size: sizeValue });\n };\n\n const onSymbolChange = (symbolValue: ResourceDimensionConfig | undefined) => {\n onChange({ ...value, symbol: symbolValue });\n };\n\n const onColorChange = (colorValue: ColorDimensionConfig | undefined) => {\n onChange({ ...value, color: colorValue });\n };\n\n const onOpacityChange = (opacityValue: number | undefined) => {\n onChange({ ...value, opacity: opacityValue });\n };\n\n const onRotationChange = (rotationValue: ScalarDimensionConfig | undefined) => {\n onChange({ ...value, rotation: rotationValue });\n };\n\n const onTextChange = (textValue: TextDimensionConfig | undefined) => {\n onChange({ ...value, text: textValue });\n };\n\n const onTextFontSizeChange = (fontSize: number | undefined) => {\n onChange({ ...value, textConfig: { ...value.textConfig, fontSize } });\n };\n\n const onTextOffsetXChange = (offsetX: number | undefined) => {\n onChange({ ...value, textConfig: { ...value.textConfig, offsetX } });\n };\n\n const onTextOffsetYChange = (offsetY: number | undefined) => {\n onChange({ ...value, textConfig: { ...value.textConfig, offsetY } });\n };\n\n const onTextAlignChange = (textAlign: TextAlignment) => {\n onChange({ ...value, textConfig: { ...value.textConfig, textAlign: textAlign } });\n };\n\n const onTextBaselineChange = (textBaseline: TextBaseline) => {\n onChange({ ...value, textConfig: { ...value.textConfig, textBaseline: textBaseline } });\n };\n\n const onAlignHorizontalChange = (alignHorizontal: HorizontalAlign) => {\n onChange({ ...value, symbolAlign: { ...value?.symbolAlign, horizontal: alignHorizontal } });\n };\n\n const onAlignVerticalChange = (alignVertical: VerticalAlign) => {\n onChange({ ...value, symbolAlign: { ...value?.symbolAlign, vertical: alignVertical } });\n };\n\n const propertyOptions = useObservable(settings?.layerInfo ?? of());\n const featuresHavePoints = propertyOptions?.geometryType === GeometryTypeId.Point;\n const hasTextLabel = styleUsesText(value);\n const maxFiles = 2000;\n\n // Simple fixed value display\n if (settings?.simpleFixedValues) {\n return (\n <>\n {featuresHavePoints && (\n <>\n <InlineFieldRow>\n <InlineField label={'Symbol'}>\n <ResourceDimensionEditor\n value={value?.symbol ?? defaultStyleConfig.symbol}\n context={context}\n onChange={onSymbolChange}\n item={\n {\n settings: {\n resourceType: 'icon',\n folderName: ResourceFolderName.Marker,\n placeholderText: hasTextLabel ? 'Select a symbol' : 'Select a symbol or add a text label',\n placeholderValue: defaultStyleConfig.symbol.fixed,\n showSourceRadio: false,\n maxFiles,\n },\n } as StandardEditorsRegistryItem\n }\n />\n </InlineField>\n </InlineFieldRow>\n <Field label={'Rotation angle'}>\n <ScalarDimensionEditor\n value={value?.rotation ?? defaultStyleConfig.rotation}\n context={context}\n onChange={onRotationChange}\n item={\n {\n settings: {\n min: defaultStyleConfig.rotation.min,\n max: defaultStyleConfig.rotation.max,\n },\n } as StandardEditorsRegistryItem\n }\n />\n </Field>\n </>\n )}\n <InlineFieldRow>\n <InlineField label=\"Color\" labelWidth={10}>\n <InlineLabel width={4}>\n <ColorPicker\n color={value?.color?.fixed ?? defaultStyleConfig.color.fixed}\n onChange={(v) => {\n onColorChange({ fixed: v });\n }}\n />\n </InlineLabel>\n </InlineField>\n </InlineFieldRow>\n <InlineFieldRow>\n <InlineField label=\"Opacity\" labelWidth={10} grow>\n <SliderValueEditor\n value={value?.opacity ?? defaultStyleConfig.opacity}\n context={context}\n onChange={onOpacityChange}\n item={\n {\n settings: {\n min: 0,\n max: 1,\n step: 0.1,\n },\n } as FieldConfigPropertyItem\n }\n />\n </InlineField>\n </InlineFieldRow>\n </>\n );\n }\n\n return (\n <>\n <Field label={'Size'}>\n <ScaleDimensionEditor\n value={value?.size ?? defaultStyleConfig.size}\n context={context}\n onChange={onSizeChange}\n item={\n {\n settings: {\n min: 1,\n max: 100,\n },\n } as StandardEditorsRegistryItem\n }\n />\n </Field>\n {!settings?.hideSymbol && (\n <>\n <Field label={'Symbol'}>\n <ResourceDimensionEditor\n value={value?.symbol ?? defaultStyleConfig.symbol}\n context={context}\n onChange={onSymbolChange}\n item={\n {\n settings: {\n resourceType: MediaType.Icon,\n folderName: ResourceFolderName.Marker,\n placeholderText: hasTextLabel ? 'Select a symbol' : 'Select a symbol or add a text label',\n placeholderValue: defaultStyleConfig.symbol.fixed,\n showSourceRadio: false,\n maxFiles,\n },\n } as StandardEditorsRegistryItem\n }\n />\n </Field>\n <Field label={'Symbol Vertical Align'}>\n <RadioButtonGroup\n value={value?.symbolAlign?.vertical ?? defaultStyleConfig.symbolAlign.vertical}\n onChange={onAlignVerticalChange}\n options={[\n { value: VerticalAlign.Top, label: capitalize(VerticalAlign.Top) },\n { value: VerticalAlign.Center, label: capitalize(VerticalAlign.Center) },\n { value: VerticalAlign.Bottom, label: capitalize(VerticalAlign.Bottom) },\n ]}\n />\n </Field>\n <Field label={'Symbol Horizontal Align'}>\n <RadioButtonGroup\n value={value?.symbolAlign?.horizontal ?? defaultStyleConfig.symbolAlign.horizontal}\n onChange={onAlignHorizontalChange}\n options={[\n { value: HorizontalAlign.Left, label: capitalize(HorizontalAlign.Left) },\n { value: HorizontalAlign.Center, label: capitalize(HorizontalAlign.Center) },\n { value: HorizontalAlign.Right, label: capitalize(HorizontalAlign.Right) },\n ]}\n />\n </Field>\n </>\n )}\n <Field label={'Color'}>\n <ColorDimensionEditor\n value={value?.color ?? defaultStyleConfig.color}\n context={context}\n onChange={onColorChange}\n item={{} as StandardEditorsRegistryItem}\n />\n </Field>\n <Field label={'Fill opacity'}>\n <SliderValueEditor\n value={value?.opacity ?? defaultStyleConfig.opacity}\n context={context}\n onChange={onOpacityChange}\n item={\n {\n settings: {\n min: 0,\n max: 1,\n step: 0.1,\n },\n } as FieldConfigPropertyItem\n }\n />\n </Field>\n {settings?.displayRotation && (\n <Field label={'Rotation angle'}>\n <ScalarDimensionEditor\n value={value?.rotation ?? defaultStyleConfig.rotation}\n context={context}\n onChange={onRotationChange}\n item={\n {\n settings: {\n min: defaultStyleConfig.rotation.min,\n max: defaultStyleConfig.rotation.max,\n },\n } as StandardEditorsRegistryItem\n }\n />\n </Field>\n )}\n <Field label={'Text label'}>\n <TextDimensionEditor\n value={value?.text ?? defaultTextConfig}\n context={context}\n onChange={onTextChange}\n item={{} as StandardEditorsRegistryItem}\n />\n </Field>\n\n {hasTextLabel && (\n <>\n <HorizontalGroup>\n <Field label={'Font size'}>\n <NumberValueEditor\n value={value?.textConfig?.fontSize ?? defaultStyleConfig.textConfig.fontSize}\n context={context}\n onChange={onTextFontSizeChange}\n item={{} as FieldConfigPropertyItem}\n />\n </Field>\n <Field label={'X offset'}>\n <NumberValueEditor\n value={value?.textConfig?.offsetX ?? defaultStyleConfig.textConfig.offsetX}\n context={context}\n onChange={onTextOffsetXChange}\n item={{} as FieldConfigPropertyItem}\n />\n </Field>\n <Field label={'Y offset'}>\n <NumberValueEditor\n value={value?.textConfig?.offsetY ?? defaultStyleConfig.textConfig.offsetY}\n context={context}\n onChange={onTextOffsetYChange}\n item={{} as FieldConfigPropertyItem}\n />\n </Field>\n </HorizontalGroup>\n <Field label={'Align'}>\n <RadioButtonGroup\n value={value?.textConfig?.textAlign ?? defaultStyleConfig.textConfig.textAlign}\n onChange={onTextAlignChange}\n options={[\n { value: TextAlignment.Left, label: capitalize(TextAlignment.Left) },\n { value: TextAlignment.Center, label: capitalize(TextAlignment.Center) },\n { value: TextAlignment.Right, label: capitalize(TextAlignment.Right) },\n ]}\n />\n </Field>\n <Field label={'Baseline'}>\n <RadioButtonGroup\n value={value?.textConfig?.textBaseline ?? defaultStyleConfig.textConfig.textBaseline}\n onChange={onTextBaselineChange}\n options={[\n { value: TextBaseline.Top, label: capitalize(TextBaseline.Top) },\n { value: TextBaseline.Middle, label: capitalize(TextBaseline.Middle) },\n { value: TextBaseline.Bottom, label: capitalize(TextBaseline.Bottom) },\n ]}\n />\n </Field>\n </>\n )}\n </>\n );\n};\n","import { isNumber } from 'lodash';\nimport { FeatureLike } from 'ol/Feature';\nimport Map from 'ol/Map';\nimport VectorLayer from 'ol/layer/Vector';\nimport React, { ReactNode } from 'react';\nimport { ReplaySubject } from 'rxjs';\n\nimport {\n MapLayerRegistryItem,\n MapLayerOptions,\n PanelData,\n GrafanaTheme2,\n FrameGeometrySourceMode,\n EventBus,\n} from '@grafana/data';\nimport { FrameVectorSource } from 'app/features/geo/utils/frameVectorSource';\nimport { getLocationMatchers } from 'app/features/geo/utils/location';\n\nimport { MarkersLegend, MarkersLegendProps } from '../../components/MarkersLegend';\nimport { ObservablePropsWrapper } from '../../components/ObservablePropsWrapper';\nimport { StyleEditor } from '../../editor/StyleEditor';\nimport { defaultStyleConfig, StyleConfig } from '../../style/types';\nimport { getStyleConfigState } from '../../style/utils';\nimport { getStyleDimension} from '../../utils/utils';\n\n// Configuration options for Circle overlays\nexport interface MarkersConfig {\n style: StyleConfig;\n showLegend?: boolean;\n}\n\nconst defaultOptions: MarkersConfig = {\n style: defaultStyleConfig,\n showLegend: true,\n};\n\nexport const MARKERS_LAYER_ID = 'markers';\n\n// Used by default when nothing is configured\nexport const defaultMarkersConfig: MapLayerOptions<MarkersConfig> = {\n type: MARKERS_LAYER_ID,\n name: '', // will get replaced\n config: defaultOptions,\n location: {\n mode: FrameGeometrySourceMode.Auto,\n },\n tooltip: true,\n};\n\n/**\n * Map layer configuration for circle overlay\n */\nexport const markersLayer: MapLayerRegistryItem<MarkersConfig> = {\n id: MARKERS_LAYER_ID,\n name: 'Markers',\n description: 'Use markers to render each data point',\n isBaseMap: false,\n showLocation: true,\n hideOpacity: true,\n\n /**\n * Function that configures transformation and returns a transformer\n * @param map\n * @param options\n * @param theme\n */\n create: async (map: Map, options: MapLayerOptions<MarkersConfig>, eventBus: EventBus, theme: GrafanaTheme2) => {\n // Assert default values\n const config = {\n ...defaultOptions,\n ...options?.config,\n };\n\n const style = await getStyleConfigState(config.style);\n const location = await getLocationMatchers(options.location);\n const source = new FrameVectorSource(location);\n const vectorLayer = new VectorLayer({\n source,\n });\n\n const legendProps = new ReplaySubject<MarkersLegendProps>(1);\n let legend: ReactNode = null;\n if (config.showLegend) {\n legend = <ObservablePropsWrapper watch={legendProps} initialSubProps={{}} child={MarkersLegend} />;\n }\n\n if (!style.fields) {\n // Set a global style\n vectorLayer.setStyle(style.maker(style.base));\n } else {\n vectorLayer.setStyle((feature: FeatureLike) => {\n const idx: number = feature.get('rowIndex');\n const dims = style.dims;\n if (!dims || !isNumber(idx)) {\n return style.maker(style.base);\n }\n\n const values = { ...style.base };\n\n if (dims.color) {\n values.color = dims.color.get(idx);\n }\n if (dims.size) {\n values.size = dims.size.get(idx);\n }\n if (dims.text) {\n values.text = dims.text.get(idx);\n }\n if (dims.rotation) {\n values.rotation = dims.rotation.get(idx);\n }\n return style.maker(values);\n });\n }\n\n return {\n init: () => vectorLayer,\n legend: legend,\n update: (data: PanelData) => {\n if (!data.series?.length) {\n source.clear();\n return; // ignore empty\n }\n\n for (const frame of data.series) {\n style.dims = getStyleDimension(frame, style, theme);\n\n // Post updates to the legend component\n if (legend) {\n legendProps.next({\n styleConfig: style,\n size: style.dims?.size,\n layerName: options.name,\n layer: vectorLayer,\n });\n }\n\n source.update(frame);\n break; // Only the first frame for now!\n }\n },\n\n // Marker overlay options\n registerOptionsUI: (builder) => {\n builder\n .addCustomEditor({\n id: 'config.style',\n path: 'config.style',\n name: 'Styles',\n editor: StyleEditor,\n settings: {\n displayRotation: true,\n },\n defaultValue: defaultOptions.style,\n })\n .addBooleanSwitch({\n path: 'config.showLegend',\n name: 'Show legend',\n description: 'Show map legend',\n defaultValue: defaultOptions.showLegend,\n });\n },\n };\n },\n\n // fill in the default values\n defaultOptions,\n};\n","/**\n * @module ol/layer/TileProperty\n */\n\n/**\n * @enum {string}\n */\nexport default {\n PRELOAD: 'preload',\n USE_INTERIM_TILES_ON_ERROR: 'useInterimTilesOnError',\n};\n","/**\n * @module ol/layer/BaseTile\n */\nimport Layer from './Layer.js';\nimport TileProperty from './TileProperty.js';\n\n/***\n * @template Return\n * @typedef {import(\"../Observable\").OnSignature<import(\"../Observable\").EventTypes, import(\"../events/Event.js\").default, Return> &\n * import(\"../Observable\").OnSignature<import(\"./Base\").BaseLayerObjectEventTypes|\n * import(\"./Layer.js\").LayerEventType|'change:preload'|'change:useInterimTilesOnError', import(\"../Object\").ObjectEvent, Return> &\n * import(\"../Observable\").OnSignature<import(\"../render/EventType\").LayerRenderEventTypes, import(\"../render/Event\").default, Return> &\n * import(\"../Observable\").CombinedOnSignature<import(\"../Observable\").EventTypes|import(\"./Base\").BaseLayerObjectEventTypes|\n * import(\"./Layer.js\").LayerEventType|'change:preload'|'change:useInterimTilesOnError'|import(\"../render/EventType\").LayerRenderEventTypes, Return>} BaseTileLayerOnSignature\n */\n\n/**\n * @template {import(\"../source/Tile.js\").default} TileSourceType\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 {number} [preload=0] Preload. Load low-resolution tiles up to `preload` levels. `0`\n * means no preloading.\n * @property {TileSourceType} [source] Source for this layer.\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 {@link import(\"../Map.js\").default#addLayer map.addLayer()}.\n * @property {boolean} [useInterimTilesOnError=true] Use interim tiles on error.\n * @property {Object<string, *>} [properties] Arbitrary observable properties. Can be accessed with `#get()` and `#set()`.\n */\n\n/**\n * @classdesc\n * For layer sources that provide pre-rendered, tiled images in grids that are\n * organized by zoom levels for specific resolutions.\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/Tile.js\").default} TileSourceType\n * @template {import(\"../renderer/Layer.js\").default} RendererType\n * @extends {Layer<TileSourceType, RendererType>}\n * @api\n */\nclass BaseTileLayer extends Layer {\n /**\n * @param {Options<TileSourceType>} [options] Tile layer options.\n */\n constructor(options) {\n options = options ? options : {};\n\n const baseOptions = Object.assign({}, options);\n\n delete baseOptions.preload;\n delete baseOptions.useInterimTilesOnError;\n super(baseOptions);\n\n /***\n * @type {BaseTileLayerOnSignature<import(\"../events\").EventsKey>}\n */\n this.on;\n\n /***\n * @type {BaseTileLayerOnSignature<import(\"../events\").EventsKey>}\n */\n this.once;\n\n /***\n * @type {BaseTileLayerOnSignature<void>}\n */\n this.un;\n\n this.setPreload(options.preload !== undefined ? options.preload : 0);\n this.setUseInterimTilesOnError(\n options.useInterimTilesOnError !== undefined\n ? options.useInterimTilesOnError\n : true\n );\n }\n\n /**\n * Return the level as number to which we will preload tiles up to.\n * @return {number} The level to preload tiles up to.\n * @observable\n * @api\n */\n getPreload() {\n return /** @type {number} */ (this.get(TileProperty.PRELOAD));\n }\n\n /**\n * Set the level as number to which we will preload tiles up to.\n * @param {number} preload The level to preload tiles up to.\n * @observable\n * @api\n */\n setPreload(preload) {\n this.set(TileProperty.PRELOAD, preload);\n }\n\n /**\n * Whether we use interim tiles on error.\n * @return {boolean} Use interim tiles on error.\n * @observable\n * @api\n */\n getUseInterimTilesOnError() {\n return /** @type {boolean} */ (\n this.get(TileProperty.USE_INTERIM_TILES_ON_ERROR)\n );\n }\n\n /**\n * Set whether we use interim tiles on error.\n * @param {boolean} useInterimTilesOnError Use interim tiles on error.\n * @observable\n * @api\n */\n setUseInterimTilesOnError(useInterimTilesOnError) {\n this.set(TileProperty.USE_INTERIM_TILES_ON_ERROR, useInterimTilesOnError);\n }\n\n /**\n * Get data for a pixel location. The return type depends on the source data. For image tiles,\n * a four element RGBA array will be returned. For data tiles, the array length will match the\n * number of bands in the dataset. For requests outside the layer extent, `null` will be returned.\n * Data for a image tiles can only be retrieved if the source's `crossOrigin` property is set.\n *\n * ```js\n * // display layer data on every pointer move\n * map.on('pointermove', (event) => {\n * console.log(layer.getData(event.pixel));\n * });\n * ```\n * @param {import(\"../pixel\").Pixel} pixel Pixel.\n * @return {Uint8ClampedArray|Uint8Array|Float32Array|DataView|null} Pixel data.\n * @api\n */\n getData(pixel) {\n return super.getData(pixel);\n }\n}\n\nexport default BaseTileLayer;\n","/**\n * @module ol/Tile\n */\nimport EventTarget from './events/Target.js';\nimport EventType from './events/EventType.js';\nimport TileState from './TileState.js';\nimport {abstract} from './util.js';\nimport {easeIn} from './easing.js';\n\n/**\n * A function that takes an {@link module:ol/Tile~Tile} for the tile and a\n * `{string}` for the url as arguments. The default is\n * ```js\n * source.setTileLoadFunction(function(tile, src) {\n * tile.getImage().src = src;\n * });\n * ```\n * For more fine grained control, the load function can use fetch or XMLHttpRequest and involve\n * error handling:\n *\n * ```js\n * import TileState from 'ol/TileState.js';\n *\n * source.setTileLoadFunction(function(tile, src) {\n * const xhr = new XMLHttpRequest();\n * xhr.responseType = 'blob';\n * xhr.addEventListener('loadend', function (evt) {\n * const data = this.response;\n * if (data !== undefined) {\n * tile.getImage().src = URL.createObjectURL(data);\n * } else {\n * tile.setState(TileState.ERROR);\n * }\n * });\n * xhr.addEventListener('error', function () {\n * tile.setState(TileState.ERROR);\n * });\n * xhr.open('GET', src);\n * xhr.send();\n * });\n * ```\n *\n * @typedef {function(Tile, string): void} LoadFunction\n * @api\n */\n\n/**\n * {@link module:ol/source/Tile~TileSource} sources use a function of this type to get\n * the url that provides a tile for a given tile coordinate.\n *\n * This function takes an {@link module:ol/tilecoord~TileCoord} for the tile\n * coordinate, a `{number}` representing the pixel ratio and a\n * {@link module:ol/proj/Projection~Projection} for the projection as arguments\n * and returns a `{string}` representing the tile URL, or undefined if no tile\n * should be requested for the passed tile coordinate.\n *\n * @typedef {function(import(\"./tilecoord.js\").TileCoord, number,\n * import(\"./proj/Projection.js\").default): (string|undefined)} UrlFunction\n * @api\n */\n\n/**\n * @typedef {Object} Options\n * @property {number} [transition=250] A duration for tile opacity\n * transitions in milliseconds. A duration of 0 disables the opacity transition.\n * @property {boolean} [interpolate=false] Use interpolated values when resampling. By default,\n * the nearest neighbor is used when resampling.\n * @api\n */\n\n/**\n * @classdesc\n * Base class for tiles.\n *\n * @abstract\n */\nclass Tile extends EventTarget {\n /**\n * @param {import(\"./tilecoord.js\").TileCoord} tileCoord Tile coordinate.\n * @param {import(\"./TileState.js\").default} state State.\n * @param {Options} [options] Tile options.\n */\n constructor(tileCoord, state, options) {\n super();\n\n options = options ? options : {};\n\n /**\n * @type {import(\"./tilecoord.js\").TileCoord}\n */\n this.tileCoord = tileCoord;\n\n /**\n * @protected\n * @type {import(\"./TileState.js\").default}\n */\n this.state = state;\n\n /**\n * An \"interim\" tile for this tile. The interim tile may be used while this\n * one is loading, for \"smooth\" transitions when changing params/dimensions\n * on the source.\n * @type {Tile}\n */\n this.interimTile = null;\n\n /**\n * A key assigned to the tile. This is used by the tile source to determine\n * if this tile can effectively be used, or if a new tile should be created\n * and this one be used as an interim tile for this new tile.\n * @type {string}\n */\n this.key = '';\n\n /**\n * The duration for the opacity transition.\n * @type {number}\n */\n this.transition_ =\n options.transition === undefined ? 250 : options.transition;\n\n /**\n * Lookup of start times for rendering transitions. If the start time is\n * equal to -1, the transition is complete.\n * @type {Object<string, number>}\n */\n this.transitionStarts_ = {};\n\n /**\n * @type {boolean}\n */\n this.interpolate = !!options.interpolate;\n }\n\n /**\n * @protected\n */\n changed() {\n this.dispatchEvent(EventType.CHANGE);\n }\n\n /**\n * Called by the tile cache when the tile is removed from the cache due to expiry\n */\n release() {\n if (this.state === TileState.ERROR) {\n // to remove the `change` listener on this tile in `ol/TileQueue#handleTileChange`\n this.setState(TileState.EMPTY);\n }\n }\n\n /**\n * @return {string} Key.\n */\n getKey() {\n return this.key + '/' + this.tileCoord;\n }\n\n /**\n * Get the interim tile most suitable for rendering using the chain of interim\n * tiles. This corresponds to the most recent tile that has been loaded, if no\n * such tile exists, the original tile is returned.\n * @return {!Tile} Best tile for rendering.\n */\n getInterimTile() {\n if (!this.interimTile) {\n //empty chain\n return this;\n }\n let tile = this.interimTile;\n\n // find the first loaded tile and return it. Since the chain is sorted in\n // decreasing order of creation time, there is no need to search the remainder\n // of the list (all those tiles correspond to older requests and will be\n // cleaned up by refreshInterimChain)\n do {\n if (tile.getState() == TileState.LOADED) {\n // Show tile immediately instead of fading it in after loading, because\n // the interim tile is in place already\n this.transition_ = 0;\n return tile;\n }\n tile = tile.interimTile;\n } while (tile);\n\n // we can not find a better tile\n return this;\n }\n\n /**\n * Goes through the chain of interim tiles and discards sections of the chain\n * that are no longer relevant.\n */\n refreshInterimChain() {\n if (!this.interimTile) {\n return;\n }\n\n let tile = this.interimTile;\n\n /**\n * @type {Tile}\n */\n let prev = this;\n\n do {\n if (tile.getState() == TileState.LOADED) {\n //we have a loaded tile, we can discard the rest of the list\n //we would could abort any LOADING tile request\n //older than this tile (i.e. any LOADING tile following this entry in the chain)\n tile.interimTile = null;\n break;\n } else if (tile.getState() == TileState.LOADING) {\n //keep this LOADING tile any loaded tiles later in the chain are\n //older than this tile, so we're still interested in the request\n prev = tile;\n } else if (tile.getState() == TileState.IDLE) {\n //the head of the list is the most current tile, we don't need\n //to start any other requests for this chain\n prev.interimTile = tile.interimTile;\n } else {\n prev = tile;\n }\n tile = prev.interimTile;\n } while (tile);\n }\n\n /**\n * Get the tile coordinate for this tile.\n * @return {import(\"./tilecoord.js\").TileCoord} The tile coordinate.\n * @api\n */\n getTileCoord() {\n return this.tileCoord;\n }\n\n /**\n * @return {import(\"./TileState.js\").default} State.\n */\n getState() {\n return this.state;\n }\n\n /**\n * Sets the state of this tile. If you write your own {@link module:ol/Tile~LoadFunction tileLoadFunction} ,\n * it is important to set the state correctly to {@link module:ol/TileState~ERROR}\n * when the tile cannot be loaded. Otherwise the tile cannot be removed from\n * the tile queue and will block other requests.\n * @param {import(\"./TileState.js\").default} state State.\n * @api\n */\n setState(state) {\n if (this.state !== TileState.ERROR && this.state > state) {\n throw new Error('Tile load sequence violation');\n }\n this.state = state;\n this.changed();\n }\n\n /**\n * Load the image or retry if loading previously failed.\n * Loading is taken care of by the tile queue, and calling this method is\n * only needed for preloading or for reloading in case of an error.\n * @abstract\n * @api\n */\n load() {\n abstract();\n }\n\n /**\n * Get the alpha value for rendering.\n * @param {string} id An id for the renderer.\n * @param {number} time The render frame time.\n * @return {number} A number between 0 and 1.\n */\n getAlpha(id, time) {\n if (!this.transition_) {\n return 1;\n }\n\n let start = this.transitionStarts_[id];\n if (!start) {\n start = time;\n this.transitionStarts_[id] = start;\n } else if (start === -1) {\n return 1;\n }\n\n const delta = time - start + 1000 / 60; // avoid rendering at 0\n if (delta >= this.transition_) {\n return 1;\n }\n return easeIn(delta / this.transition_);\n }\n\n /**\n * Determine if a tile is in an alpha transition. A tile is considered in\n * transition if tile.getAlpha() has not yet been called or has been called\n * and returned 1.\n * @param {string} id An id for the renderer.\n * @return {boolean} The tile is in transition.\n */\n inTransition(id) {\n if (!this.transition_) {\n return false;\n }\n return this.transitionStarts_[id] !== -1;\n }\n\n /**\n * Mark a transition as complete.\n * @param {string} id An id for the renderer.\n */\n endTransition(id) {\n if (this.transition_) {\n this.transitionStarts_[id] = -1;\n }\n }\n}\n\nexport default Tile;\n","/**\n * @module ol/ImageTile\n */\nimport Tile from './Tile.js';\nimport TileState from './TileState.js';\nimport {createCanvasContext2D} from './dom.js';\nimport {listenImage} from './Image.js';\n\nclass ImageTile extends Tile {\n /**\n * @param {import(\"./tilecoord.js\").TileCoord} tileCoord Tile coordinate.\n * @param {import(\"./TileState.js\").default} state State.\n * @param {string} src Image source URI.\n * @param {?string} crossOrigin Cross origin.\n * @param {import(\"./Tile.js\").LoadFunction} tileLoadFunction Tile load function.\n * @param {import(\"./Tile.js\").Options} [options] Tile options.\n */\n constructor(tileCoord, state, src, crossOrigin, tileLoadFunction, options) {\n super(tileCoord, state, options);\n\n /**\n * @private\n * @type {?string}\n */\n this.crossOrigin_ = crossOrigin;\n\n /**\n * Image URI\n *\n * @private\n * @type {string}\n */\n this.src_ = src;\n\n this.key = src;\n\n /**\n * @private\n * @type {HTMLImageElement|HTMLCanvasElement}\n */\n this.image_ = new Image();\n if (crossOrigin !== null) {\n this.image_.crossOrigin = crossOrigin;\n }\n\n /**\n * @private\n * @type {?function():void}\n */\n this.unlisten_ = null;\n\n /**\n * @private\n * @type {import(\"./Tile.js\").LoadFunction}\n */\n this.tileLoadFunction_ = tileLoadFunction;\n }\n\n /**\n * Get the HTML image element for this tile (may be a Canvas, Image, or Video).\n * @return {HTMLCanvasElement|HTMLImageElement|HTMLVideoElement} Image.\n * @api\n */\n getImage() {\n return this.image_;\n }\n\n /**\n * Sets an HTML image element for this tile (may be a Canvas or preloaded Image).\n * @param {HTMLCanvasElement|HTMLImageElement} element Element.\n */\n setImage(element) {\n this.image_ = element;\n this.state = TileState.LOADED;\n this.unlistenImage_();\n this.changed();\n }\n\n /**\n * Tracks loading or read errors.\n *\n * @private\n */\n handleImageError_() {\n this.state = TileState.ERROR;\n this.unlistenImage_();\n this.image_ = getBlankImage();\n this.changed();\n }\n\n /**\n * Tracks successful image load.\n *\n * @private\n */\n handleImageLoad_() {\n const image = /** @type {HTMLImageElement} */ (this.image_);\n if (image.naturalWidth && image.naturalHeight) {\n this.state = TileState.LOADED;\n } else {\n this.state = TileState.EMPTY;\n }\n this.unlistenImage_();\n this.changed();\n }\n\n /**\n * Load the image or retry if loading previously failed.\n * Loading is taken care of by the tile queue, and calling this method is\n * only needed for preloading or for reloading in case of an error.\n *\n * To retry loading tiles on failed requests, use a custom `tileLoadFunction`\n * that checks for error status codes and reloads only when the status code is\n * 408, 429, 500, 502, 503 and 504, and only when not too many retries have been\n * made already:\n *\n * ```js\n * const retryCodes = [408, 429, 500, 502, 503, 504];\n * const retries = {};\n * source.setTileLoadFunction((tile, src) => {\n * const image = tile.getImage();\n * fetch(src)\n * .then((response) => {\n * if (retryCodes.includes(response.status)) {\n * retries[src] = (retries[src] || 0) + 1;\n * if (retries[src] <= 3) {\n * setTimeout(() => tile.load(), retries[src] * 1000);\n * }\n * return Promise.reject();\n * }\n * return response.blob();\n * })\n * .then((blob) => {\n * const imageUrl = URL.createObjectURL(blob);\n * image.src = imageUrl;\n * setTimeout(() => URL.revokeObjectURL(imageUrl), 5000);\n * })\n * .catch(() => tile.setState(3)); // error\n * });\n * ```\n *\n * @api\n */\n load() {\n if (this.state == TileState.ERROR) {\n this.state = TileState.IDLE;\n this.image_ = new Image();\n if (this.crossOrigin_ !== null) {\n this.image_.crossOrigin = this.crossOrigin_;\n }\n }\n if (this.state == TileState.IDLE) {\n this.state = TileState.LOADING;\n this.changed();\n this.tileLoadFunction_(this, this.src_);\n this.unlisten_ = listenImage(\n this.image_,\n this.handleImageLoad_.bind(this),\n this.handleImageError_.bind(this)\n );\n }\n }\n\n /**\n * Discards event handlers which listen for load completion or errors.\n *\n * @private\n */\n unlistenImage_() {\n if (this.unlisten_) {\n this.unlisten_();\n this.unlisten_ = null;\n }\n }\n}\n\n/**\n * Get a 1-pixel blank image.\n * @return {HTMLCanvasElement} Blank image.\n */\nfunction getBlankImage() {\n const ctx = createCanvasContext2D(1, 1);\n ctx.fillStyle = 'rgba(0,0,0,0)';\n ctx.fillRect(0, 0, 1, 1);\n return ctx.canvas;\n}\n\nexport default ImageTile;\n","/**\n * @module ol/reproj/common\n */\n\n/**\n * Default maximum allowed threshold (in pixels) for reprojection\n * triangulation.\n * @type {number}\n */\nexport const ERROR_THRESHOLD = 0.5;\n","/**\n * @module ol/reproj/Triangulation\n */\nimport {\n boundingExtent,\n createEmpty,\n extendCoordinate,\n getArea,\n getBottomLeft,\n getBottomRight,\n getTopLeft,\n getTopRight,\n getWidth,\n intersects,\n} from '../extent.js';\nimport {getTransform} from '../proj.js';\nimport {modulo} from '../math.js';\n\n/**\n * Single triangle; consists of 3 source points and 3 target points.\n * @typedef {Object} Triangle\n * @property {Array<import(\"../coordinate.js\").Coordinate>} source Source.\n * @property {Array<import(\"../coordinate.js\").Coordinate>} target Target.\n */\n\n/**\n * Maximum number of subdivision steps during raster reprojection triangulation.\n * Prevents high memory usage and large number of proj4 calls (for certain\n * transformations and areas). At most `2*(2^this)` triangles are created for\n * each triangulated extent (tile/image).\n * @type {number}\n */\nconst MAX_SUBDIVISION = 10;\n\n/**\n * Maximum allowed size of triangle relative to world width. When transforming\n * corners of world extent between certain projections, the resulting\n * triangulation seems to have zero error and no subdivision is performed. If\n * the triangle width is more than this (relative to world width; 0-1),\n * subdivison is forced (up to `MAX_SUBDIVISION`). Default is `0.25`.\n * @type {number}\n */\nconst MAX_TRIANGLE_WIDTH = 0.25;\n\n/**\n * @classdesc\n * Class containing triangulation of the given target extent.\n * Used for determining source data and the reprojection itself.\n */\nclass Triangulation {\n /**\n * @param {import(\"../proj/Projection.js\").default} sourceProj Source projection.\n * @param {import(\"../proj/Projection.js\").default} targetProj Target projection.\n * @param {import(\"../extent.js\").Extent} targetExtent Target extent to triangulate.\n * @param {import(\"../extent.js\").Extent} maxSourceExtent Maximal source extent that can be used.\n * @param {number} errorThreshold Acceptable error (in source units).\n * @param {?number} destinationResolution The (optional) resolution of the destination.\n */\n constructor(\n sourceProj,\n targetProj,\n targetExtent,\n maxSourceExtent,\n errorThreshold,\n destinationResolution\n ) {\n /**\n * @type {import(\"../proj/Projection.js\").default}\n * @private\n */\n this.sourceProj_ = sourceProj;\n\n /**\n * @type {import(\"../proj/Projection.js\").default}\n * @private\n */\n this.targetProj_ = targetProj;\n\n /** @type {!Object<string, import(\"../coordinate.js\").Coordinate>} */\n let transformInvCache = {};\n const transformInv = getTransform(this.targetProj_, this.sourceProj_);\n\n /**\n * @param {import(\"../coordinate.js\").Coordinate} c A coordinate.\n * @return {import(\"../coordinate.js\").Coordinate} Transformed coordinate.\n * @private\n */\n this.transformInv_ = function (c) {\n const key = c[0] + '/' + c[1];\n if (!transformInvCache[key]) {\n transformInvCache[key] = transformInv(c);\n }\n return transformInvCache[key];\n };\n\n /**\n * @type {import(\"../extent.js\").Extent}\n * @private\n */\n this.maxSourceExtent_ = maxSourceExtent;\n\n /**\n * @type {number}\n * @private\n */\n this.errorThresholdSquared_ = errorThreshold * errorThreshold;\n\n /**\n * @type {Array<Triangle>}\n * @private\n */\n this.triangles_ = [];\n\n /**\n * Indicates that the triangulation crosses edge of the source projection.\n * @type {boolean}\n * @private\n */\n this.wrapsXInSource_ = false;\n\n /**\n * @type {boolean}\n * @private\n */\n this.canWrapXInSource_ =\n this.sourceProj_.canWrapX() &&\n !!maxSourceExtent &&\n !!this.sourceProj_.getExtent() &&\n getWidth(maxSourceExtent) >= getWidth(this.sourceProj_.getExtent());\n\n /**\n * @type {?number}\n * @private\n */\n this.sourceWorldWidth_ = this.sourceProj_.getExtent()\n ? getWidth(this.sourceProj_.getExtent())\n : null;\n\n /**\n * @type {?number}\n * @private\n */\n this.targetWorldWidth_ = this.targetProj_.getExtent()\n ? getWidth(this.targetProj_.getExtent())\n : null;\n\n const destinationTopLeft = getTopLeft(targetExtent);\n const destinationTopRight = getTopRight(targetExtent);\n const destinationBottomRight = getBottomRight(targetExtent);\n const destinationBottomLeft = getBottomLeft(targetExtent);\n const sourceTopLeft = this.transformInv_(destinationTopLeft);\n const sourceTopRight = this.transformInv_(destinationTopRight);\n const sourceBottomRight = this.transformInv_(destinationBottomRight);\n const sourceBottomLeft = this.transformInv_(destinationBottomLeft);\n\n /*\n * The maxSubdivision controls how many splittings of the target area can\n * be done. The idea here is to do a linear mapping of the target areas\n * but the actual overall reprojection (can be) extremely non-linear. The\n * default value of MAX_SUBDIVISION was chosen based on mapping a 256x256\n * tile size. However this function is also called to remap canvas rendered\n * layers which can be much larger. This calculation increases the maxSubdivision\n * value by the right factor so that each 256x256 pixel area has\n * MAX_SUBDIVISION divisions.\n */\n const maxSubdivision =\n MAX_SUBDIVISION +\n (destinationResolution\n ? Math.max(\n 0,\n Math.ceil(\n Math.log2(\n getArea(targetExtent) /\n (destinationResolution * destinationResolution * 256 * 256)\n )\n )\n )\n : 0);\n\n this.addQuad_(\n destinationTopLeft,\n destinationTopRight,\n destinationBottomRight,\n destinationBottomLeft,\n sourceTopLeft,\n sourceTopRight,\n sourceBottomRight,\n sourceBottomLeft,\n maxSubdivision\n );\n\n if (this.wrapsXInSource_) {\n let leftBound = Infinity;\n this.triangles_.forEach(function (triangle, i, arr) {\n leftBound = Math.min(\n leftBound,\n triangle.source[0][0],\n triangle.source[1][0],\n triangle.source[2][0]\n );\n });\n\n // Shift triangles to be as close to `leftBound` as possible\n // (if the distance is more than `worldWidth / 2` it can be closer.\n this.triangles_.forEach((triangle) => {\n if (\n Math.max(\n triangle.source[0][0],\n triangle.source[1][0],\n triangle.source[2][0]\n ) -\n leftBound >\n this.sourceWorldWidth_ / 2\n ) {\n const newTriangle = [\n [triangle.source[0][0], triangle.source[0][1]],\n [triangle.source[1][0], triangle.source[1][1]],\n [triangle.source[2][0], triangle.source[2][1]],\n ];\n if (newTriangle[0][0] - leftBound > this.sourceWorldWidth_ / 2) {\n newTriangle[0][0] -= this.sourceWorldWidth_;\n }\n if (newTriangle[1][0] - leftBound > this.sourceWorldWidth_ / 2) {\n newTriangle[1][0] -= this.sourceWorldWidth_;\n }\n if (newTriangle[2][0] - leftBound > this.sourceWorldWidth_ / 2) {\n newTriangle[2][0] -= this.sourceWorldWidth_;\n }\n\n // Rarely (if the extent contains both the dateline and prime meridian)\n // the shift can in turn break some triangles.\n // Detect this here and don't shift in such cases.\n const minX = Math.min(\n newTriangle[0][0],\n newTriangle[1][0],\n newTriangle[2][0]\n );\n const maxX = Math.max(\n newTriangle[0][0],\n newTriangle[1][0],\n newTriangle[2][0]\n );\n if (maxX - minX < this.sourceWorldWidth_ / 2) {\n triangle.source = newTriangle;\n }\n }\n });\n }\n\n transformInvCache = {};\n }\n\n /**\n * Adds triangle to the triangulation.\n * @param {import(\"../coordinate.js\").Coordinate} a The target a coordinate.\n * @param {import(\"../coordinate.js\").Coordinate} b The target b coordinate.\n * @param {import(\"../coordinate.js\").Coordinate} c The target c coordinate.\n * @param {import(\"../coordinate.js\").Coordinate} aSrc The source a coordinate.\n * @param {import(\"../coordinate.js\").Coordinate} bSrc The source b coordinate.\n * @param {import(\"../coordinate.js\").Coordinate} cSrc The source c coordinate.\n * @private\n */\n addTriangle_(a, b, c, aSrc, bSrc, cSrc) {\n this.triangles_.push({\n source: [aSrc, bSrc, cSrc],\n target: [a, b, c],\n });\n }\n\n /**\n * Adds quad (points in clock-wise order) to the triangulation\n * (and reprojects the vertices) if valid.\n * Performs quad subdivision if needed to increase precision.\n *\n * @param {import(\"../coordinate.js\").Coordinate} a The target a coordinate.\n * @param {import(\"../coordinate.js\").Coordinate} b The target b coordinate.\n * @param {import(\"../coordinate.js\").Coordinate} c The target c coordinate.\n * @param {import(\"../coordinate.js\").Coordinate} d The target d coordinate.\n * @param {import(\"../coordinate.js\").Coordinate} aSrc The source a coordinate.\n * @param {import(\"../coordinate.js\").Coordinate} bSrc The source b coordinate.\n * @param {import(\"../coordinate.js\").Coordinate} cSrc The source c coordinate.\n * @param {import(\"../coordinate.js\").Coordinate} dSrc The source d coordinate.\n * @param {number} maxSubdivision Maximal allowed subdivision of the quad.\n * @private\n */\n addQuad_(a, b, c, d, aSrc, bSrc, cSrc, dSrc, maxSubdivision) {\n const sourceQuadExtent = boundingExtent([aSrc, bSrc, cSrc, dSrc]);\n const sourceCoverageX = this.sourceWorldWidth_\n ? getWidth(sourceQuadExtent) / this.sourceWorldWidth_\n : null;\n const sourceWorldWidth = /** @type {number} */ (this.sourceWorldWidth_);\n\n // when the quad is wrapped in the source projection\n // it covers most of the projection extent, but not fully\n const wrapsX =\n this.sourceProj_.canWrapX() &&\n sourceCoverageX > 0.5 &&\n sourceCoverageX < 1;\n\n let needsSubdivision = false;\n\n if (maxSubdivision > 0) {\n if (this.targetProj_.isGlobal() && this.targetWorldWidth_) {\n const targetQuadExtent = boundingExtent([a, b, c, d]);\n const targetCoverageX =\n getWidth(targetQuadExtent) / this.targetWorldWidth_;\n needsSubdivision =\n targetCoverageX > MAX_TRIANGLE_WIDTH || needsSubdivision;\n }\n if (!wrapsX && this.sourceProj_.isGlobal() && sourceCoverageX) {\n needsSubdivision =\n sourceCoverageX > MAX_TRIANGLE_WIDTH || needsSubdivision;\n }\n }\n\n if (!needsSubdivision && this.maxSourceExtent_) {\n if (\n isFinite(sourceQuadExtent[0]) &&\n isFinite(sourceQuadExtent[1]) &&\n isFinite(sourceQuadExtent[2]) &&\n isFinite(sourceQuadExtent[3])\n ) {\n if (!intersects(sourceQuadExtent, this.maxSourceExtent_)) {\n // whole quad outside source projection extent -> ignore\n return;\n }\n }\n }\n\n let isNotFinite = 0;\n\n if (!needsSubdivision) {\n if (\n !isFinite(aSrc[0]) ||\n !isFinite(aSrc[1]) ||\n !isFinite(bSrc[0]) ||\n !isFinite(bSrc[1]) ||\n !isFinite(cSrc[0]) ||\n !isFinite(cSrc[1]) ||\n !isFinite(dSrc[0]) ||\n !isFinite(dSrc[1])\n ) {\n if (maxSubdivision > 0) {\n needsSubdivision = true;\n } else {\n // It might be the case that only 1 of the points is infinite. In this case\n // we can draw a single triangle with the other three points\n isNotFinite =\n (!isFinite(aSrc[0]) || !isFinite(aSrc[1]) ? 8 : 0) +\n (!isFinite(bSrc[0]) || !isFinite(bSrc[1]) ? 4 : 0) +\n (!isFinite(cSrc[0]) || !isFinite(cSrc[1]) ? 2 : 0) +\n (!isFinite(dSrc[0]) || !isFinite(dSrc[1]) ? 1 : 0);\n if (\n isNotFinite != 1 &&\n isNotFinite != 2 &&\n isNotFinite != 4 &&\n isNotFinite != 8\n ) {\n return;\n }\n }\n }\n }\n\n if (maxSubdivision > 0) {\n if (!needsSubdivision) {\n const center = [(a[0] + c[0]) / 2, (a[1] + c[1]) / 2];\n const centerSrc = this.transformInv_(center);\n\n let dx;\n if (wrapsX) {\n const centerSrcEstimX =\n (modulo(aSrc[0], sourceWorldWidth) +\n modulo(cSrc[0], sourceWorldWidth)) /\n 2;\n dx = centerSrcEstimX - modulo(centerSrc[0], sourceWorldWidth);\n } else {\n dx = (aSrc[0] + cSrc[0]) / 2 - centerSrc[0];\n }\n const dy = (aSrc[1] + cSrc[1]) / 2 - centerSrc[1];\n const centerSrcErrorSquared = dx * dx + dy * dy;\n needsSubdivision = centerSrcErrorSquared > this.errorThresholdSquared_;\n }\n if (needsSubdivision) {\n if (Math.abs(a[0] - c[0]) <= Math.abs(a[1] - c[1])) {\n // split horizontally (top & bottom)\n const bc = [(b[0] + c[0]) / 2, (b[1] + c[1]) / 2];\n const bcSrc = this.transformInv_(bc);\n const da = [(d[0] + a[0]) / 2, (d[1] + a[1]) / 2];\n const daSrc = this.transformInv_(da);\n\n this.addQuad_(\n a,\n b,\n bc,\n da,\n aSrc,\n bSrc,\n bcSrc,\n daSrc,\n maxSubdivision - 1\n );\n this.addQuad_(\n da,\n bc,\n c,\n d,\n daSrc,\n bcSrc,\n cSrc,\n dSrc,\n maxSubdivision - 1\n );\n } else {\n // split vertically (left & right)\n const ab = [(a[0] + b[0]) / 2, (a[1] + b[1]) / 2];\n const abSrc = this.transformInv_(ab);\n const cd = [(c[0] + d[0]) / 2, (c[1] + d[1]) / 2];\n const cdSrc = this.transformInv_(cd);\n\n this.addQuad_(\n a,\n ab,\n cd,\n d,\n aSrc,\n abSrc,\n cdSrc,\n dSrc,\n maxSubdivision - 1\n );\n this.addQuad_(\n ab,\n b,\n c,\n cd,\n abSrc,\n bSrc,\n cSrc,\n cdSrc,\n maxSubdivision - 1\n );\n }\n return;\n }\n }\n\n if (wrapsX) {\n if (!this.canWrapXInSource_) {\n return;\n }\n this.wrapsXInSource_ = true;\n }\n\n // Exactly zero or one of *Src is not finite\n // The triangles must have the diagonal line as the first side\n // This is to allow easy code in reproj.s to make it straight for broken\n // browsers that can't handle diagonal clipping\n if ((isNotFinite & 0xb) == 0) {\n this.addTriangle_(a, c, d, aSrc, cSrc, dSrc);\n }\n if ((isNotFinite & 0xe) == 0) {\n this.addTriangle_(a, c, b, aSrc, cSrc, bSrc);\n }\n if (isNotFinite) {\n // Try the other two triangles\n if ((isNotFinite & 0xd) == 0) {\n this.addTriangle_(b, d, a, bSrc, dSrc, aSrc);\n }\n if ((isNotFinite & 0x7) == 0) {\n this.addTriangle_(b, d, c, bSrc, dSrc, cSrc);\n }\n }\n }\n\n /**\n * Calculates extent of the `source` coordinates from all the triangles.\n *\n * @return {import(\"../extent.js\").Extent} Calculated extent.\n */\n calculateSourceExtent() {\n const extent = createEmpty();\n\n this.triangles_.forEach(function (triangle, i, arr) {\n const src = triangle.source;\n extendCoordinate(extent, src[0]);\n extendCoordinate(extent, src[1]);\n extendCoordinate(extent, src[2]);\n });\n\n return extent;\n }\n\n /**\n * @return {Array<Triangle>} Array of the calculated triangles.\n */\n getTriangles() {\n return this.triangles_;\n }\n}\n\nexport default Triangulation;\n","/**\n * @module ol/reproj\n */\nimport {\n containsCoordinate,\n createEmpty,\n extend,\n forEachCorner,\n getCenter,\n getHeight,\n getTopLeft,\n getWidth,\n} from './extent.js';\nimport {createCanvasContext2D, releaseCanvas} from './dom.js';\nimport {getPointResolution, transform} from './proj.js';\nimport {solveLinearSystem} from './math.js';\n\nlet brokenDiagonalRendering_;\n\n/**\n * @type {Array<HTMLCanvasElement>}\n */\nexport const canvasPool = [];\n\n/**\n * This draws a small triangle into a canvas by setting the triangle as the clip region\n * and then drawing a (too large) rectangle\n *\n * @param {CanvasRenderingContext2D} ctx The context in which to draw the triangle\n * @param {number} u1 The x-coordinate of the second point. The first point is 0,0.\n * @param {number} v1 The y-coordinate of the second point.\n * @param {number} u2 The x-coordinate of the third point.\n * @param {number} v2 The y-coordinate of the third point.\n */\nfunction drawTestTriangle(ctx, u1, v1, u2, v2) {\n ctx.beginPath();\n ctx.moveTo(0, 0);\n ctx.lineTo(u1, v1);\n ctx.lineTo(u2, v2);\n ctx.closePath();\n ctx.save();\n ctx.clip();\n ctx.fillRect(0, 0, Math.max(u1, u2) + 1, Math.max(v1, v2));\n ctx.restore();\n}\n\n/**\n * Given the data from getImageData, see if the right values appear at the provided offset.\n * Returns true if either the color or transparency is off\n *\n * @param {Uint8ClampedArray} data The data returned from getImageData\n * @param {number} offset The pixel offset from the start of data.\n * @return {boolean} true if the diagonal rendering is broken\n */\nfunction verifyBrokenDiagonalRendering(data, offset) {\n // the values ought to be close to the rgba(210, 0, 0, 0.75)\n return (\n Math.abs(data[offset * 4] - 210) > 2 ||\n Math.abs(data[offset * 4 + 3] - 0.75 * 255) > 2\n );\n}\n\n/**\n * Determines if the current browser configuration can render triangular clip regions correctly.\n * This value is cached so the function is only expensive the first time called.\n * Firefox on Windows (as of now) does not if HWA is enabled. See https://bugzilla.mozilla.org/show_bug.cgi?id=1606976\n * Chrome works, and everything seems to work on OSX and Android. This function caches the\n * result. I suppose that it is conceivably possible that a browser might flip modes while the app is\n * running, but lets hope not.\n *\n * @return {boolean} true if the Diagonal Rendering is broken.\n */\nfunction isBrokenDiagonalRendering() {\n if (brokenDiagonalRendering_ === undefined) {\n const ctx = createCanvasContext2D(6, 6, canvasPool);\n ctx.globalCompositeOperation = 'lighter';\n ctx.fillStyle = 'rgba(210, 0, 0, 0.75)';\n drawTestTriangle(ctx, 4, 5, 4, 0);\n drawTestTriangle(ctx, 4, 5, 0, 5);\n const data = ctx.getImageData(0, 0, 3, 3).data;\n brokenDiagonalRendering_ =\n verifyBrokenDiagonalRendering(data, 0) ||\n verifyBrokenDiagonalRendering(data, 4) ||\n verifyBrokenDiagonalRendering(data, 8);\n releaseCanvas(ctx);\n canvasPool.push(ctx.canvas);\n }\n\n return brokenDiagonalRendering_;\n}\n\n/**\n * Calculates ideal resolution to use from the source in order to achieve\n * pixel mapping as close as possible to 1:1 during reprojection.\n * The resolution is calculated regardless of what resolutions\n * are actually available in the dataset (TileGrid, Image, ...).\n *\n * @param {import(\"./proj/Projection.js\").default} sourceProj Source projection.\n * @param {import(\"./proj/Projection.js\").default} targetProj Target projection.\n * @param {import(\"./coordinate.js\").Coordinate} targetCenter Target center.\n * @param {number} targetResolution Target resolution.\n * @return {number} The best resolution to use. Can be +-Infinity, NaN or 0.\n */\nexport function calculateSourceResolution(\n sourceProj,\n targetProj,\n targetCenter,\n targetResolution\n) {\n const sourceCenter = transform(targetCenter, targetProj, sourceProj);\n\n // calculate the ideal resolution of the source data\n let sourceResolution = getPointResolution(\n targetProj,\n targetResolution,\n targetCenter\n );\n\n const targetMetersPerUnit = targetProj.getMetersPerUnit();\n if (targetMetersPerUnit !== undefined) {\n sourceResolution *= targetMetersPerUnit;\n }\n const sourceMetersPerUnit = sourceProj.getMetersPerUnit();\n if (sourceMetersPerUnit !== undefined) {\n sourceResolution /= sourceMetersPerUnit;\n }\n\n // Based on the projection properties, the point resolution at the specified\n // coordinates may be slightly different. We need to reverse-compensate this\n // in order to achieve optimal results.\n\n const sourceExtent = sourceProj.getExtent();\n if (!sourceExtent || containsCoordinate(sourceExtent, sourceCenter)) {\n const compensationFactor =\n getPointResolution(sourceProj, sourceResolution, sourceCenter) /\n sourceResolution;\n if (isFinite(compensationFactor) && compensationFactor > 0) {\n sourceResolution /= compensationFactor;\n }\n }\n\n return sourceResolution;\n}\n\n/**\n * Calculates ideal resolution to use from the source in order to achieve\n * pixel mapping as close as possible to 1:1 during reprojection.\n * The resolution is calculated regardless of what resolutions\n * are actually available in the dataset (TileGrid, Image, ...).\n *\n * @param {import(\"./proj/Projection.js\").default} sourceProj Source projection.\n * @param {import(\"./proj/Projection.js\").default} targetProj Target projection.\n * @param {import(\"./extent.js\").Extent} targetExtent Target extent\n * @param {number} targetResolution Target resolution.\n * @return {number} The best resolution to use. Can be +-Infinity, NaN or 0.\n */\nexport function calculateSourceExtentResolution(\n sourceProj,\n targetProj,\n targetExtent,\n targetResolution\n) {\n const targetCenter = getCenter(targetExtent);\n let sourceResolution = calculateSourceResolution(\n sourceProj,\n targetProj,\n targetCenter,\n targetResolution\n );\n\n if (!isFinite(sourceResolution) || sourceResolution <= 0) {\n forEachCorner(targetExtent, function (corner) {\n sourceResolution = calculateSourceResolution(\n sourceProj,\n targetProj,\n corner,\n targetResolution\n );\n return isFinite(sourceResolution) && sourceResolution > 0;\n });\n }\n\n return sourceResolution;\n}\n\n/**\n * @typedef {Object} ImageExtent\n * @property {import(\"./extent.js\").Extent} extent Extent.\n * @property {HTMLCanvasElement|HTMLImageElement|HTMLVideoElement} image Image.\n */\n\n/**\n * Renders the source data into new canvas based on the triangulation.\n *\n * @param {number} width Width of the canvas.\n * @param {number} height Height of the canvas.\n * @param {number} pixelRatio Pixel ratio.\n * @param {number} sourceResolution Source resolution.\n * @param {import(\"./extent.js\").Extent} sourceExtent Extent of the data source.\n * @param {number} targetResolution Target resolution.\n * @param {import(\"./extent.js\").Extent} targetExtent Target extent.\n * @param {import(\"./reproj/Triangulation.js\").default} triangulation Calculated triangulation.\n * @param {Array<ImageExtent>} sources Array of sources.\n * @param {number} gutter Gutter of the sources.\n * @param {boolean} [renderEdges] Render reprojection edges.\n * @param {boolean} [interpolate] Use linear interpolation when resampling.\n * @return {HTMLCanvasElement} Canvas with reprojected data.\n */\nexport function render(\n width,\n height,\n pixelRatio,\n sourceResolution,\n sourceExtent,\n targetResolution,\n targetExtent,\n triangulation,\n sources,\n gutter,\n renderEdges,\n interpolate\n) {\n const context = createCanvasContext2D(\n Math.round(pixelRatio * width),\n Math.round(pixelRatio * height),\n canvasPool\n );\n\n if (!interpolate) {\n context.imageSmoothingEnabled = false;\n }\n\n if (sources.length === 0) {\n return context.canvas;\n }\n\n context.scale(pixelRatio, pixelRatio);\n\n function pixelRound(value) {\n return Math.round(value * pixelRatio) / pixelRatio;\n }\n\n context.globalCompositeOperation = 'lighter';\n\n const sourceDataExtent = createEmpty();\n sources.forEach(function (src, i, arr) {\n extend(sourceDataExtent, src.extent);\n });\n\n const canvasWidthInUnits = getWidth(sourceDataExtent);\n const canvasHeightInUnits = getHeight(sourceDataExtent);\n const stitchContext = createCanvasContext2D(\n Math.round((pixelRatio * canvasWidthInUnits) / sourceResolution),\n Math.round((pixelRatio * canvasHeightInUnits) / sourceResolution),\n canvasPool\n );\n\n if (!interpolate) {\n stitchContext.imageSmoothingEnabled = false;\n }\n\n const stitchScale = pixelRatio / sourceResolution;\n\n sources.forEach(function (src, i, arr) {\n const xPos = src.extent[0] - sourceDataExtent[0];\n const yPos = -(src.extent[3] - sourceDataExtent[3]);\n const srcWidth = getWidth(src.extent);\n const srcHeight = getHeight(src.extent);\n\n // This test should never fail -- but it does. Need to find a fix the upstream condition\n if (src.image.width > 0 && src.image.height > 0) {\n stitchContext.drawImage(\n src.image,\n gutter,\n gutter,\n src.image.width - 2 * gutter,\n src.image.height - 2 * gutter,\n xPos * stitchScale,\n yPos * stitchScale,\n srcWidth * stitchScale,\n srcHeight * stitchScale\n );\n }\n });\n\n const targetTopLeft = getTopLeft(targetExtent);\n\n triangulation.getTriangles().forEach(function (triangle, i, arr) {\n /* Calculate affine transform (src -> dst)\n * Resulting matrix can be used to transform coordinate\n * from `sourceProjection` to destination pixels.\n *\n * To optimize number of context calls and increase numerical stability,\n * we also do the following operations:\n * trans(-topLeftExtentCorner), scale(1 / targetResolution), scale(1, -1)\n * here before solving the linear system so [ui, vi] are pixel coordinates.\n *\n * Src points: xi, yi\n * Dst points: ui, vi\n * Affine coefficients: aij\n *\n * | x0 y0 1 0 0 0 | |a00| |u0|\n * | x1 y1 1 0 0 0 | |a01| |u1|\n * | x2 y2 1 0 0 0 | x |a02| = |u2|\n * | 0 0 0 x0 y0 1 | |a10| |v0|\n * | 0 0 0 x1 y1 1 | |a11| |v1|\n * | 0 0 0 x2 y2 1 | |a12| |v2|\n */\n const source = triangle.source;\n const target = triangle.target;\n let x0 = source[0][0],\n y0 = source[0][1];\n let x1 = source[1][0],\n y1 = source[1][1];\n let x2 = source[2][0],\n y2 = source[2][1];\n // Make sure that everything is on pixel boundaries\n const u0 = pixelRound((target[0][0] - targetTopLeft[0]) / targetResolution);\n const v0 = pixelRound(\n -(target[0][1] - targetTopLeft[1]) / targetResolution\n );\n const u1 = pixelRound((target[1][0] - targetTopLeft[0]) / targetResolution);\n const v1 = pixelRound(\n -(target[1][1] - targetTopLeft[1]) / targetResolution\n );\n const u2 = pixelRound((target[2][0] - targetTopLeft[0]) / targetResolution);\n const v2 = pixelRound(\n -(target[2][1] - targetTopLeft[1]) / targetResolution\n );\n\n // Shift all the source points to improve numerical stability\n // of all the subsequent calculations. The [x0, y0] is used here.\n // This is also used to simplify the linear system.\n const sourceNumericalShiftX = x0;\n const sourceNumericalShiftY = y0;\n x0 = 0;\n y0 = 0;\n x1 -= sourceNumericalShiftX;\n y1 -= sourceNumericalShiftY;\n x2 -= sourceNumericalShiftX;\n y2 -= sourceNumericalShiftY;\n\n const augmentedMatrix = [\n [x1, y1, 0, 0, u1 - u0],\n [x2, y2, 0, 0, u2 - u0],\n [0, 0, x1, y1, v1 - v0],\n [0, 0, x2, y2, v2 - v0],\n ];\n const affineCoefs = solveLinearSystem(augmentedMatrix);\n if (!affineCoefs) {\n return;\n }\n\n context.save();\n context.beginPath();\n\n if (isBrokenDiagonalRendering() || !interpolate) {\n // Make sure that all lines are horizontal or vertical\n context.moveTo(u1, v1);\n // This is the diagonal line. Do it in 4 steps\n const steps = 4;\n const ud = u0 - u1;\n const vd = v0 - v1;\n for (let step = 0; step < steps; step++) {\n // Go horizontally\n context.lineTo(\n u1 + pixelRound(((step + 1) * ud) / steps),\n v1 + pixelRound((step * vd) / (steps - 1))\n );\n // Go vertically\n if (step != steps - 1) {\n context.lineTo(\n u1 + pixelRound(((step + 1) * ud) / steps),\n v1 + pixelRound(((step + 1) * vd) / (steps - 1))\n );\n }\n }\n // We are almost at u0r, v0r\n context.lineTo(u2, v2);\n } else {\n context.moveTo(u1, v1);\n context.lineTo(u0, v0);\n context.lineTo(u2, v2);\n }\n\n context.clip();\n\n context.transform(\n affineCoefs[0],\n affineCoefs[2],\n affineCoefs[1],\n affineCoefs[3],\n u0,\n v0\n );\n\n context.translate(\n sourceDataExtent[0] - sourceNumericalShiftX,\n sourceDataExtent[3] - sourceNumericalShiftY\n );\n\n context.scale(\n sourceResolution / pixelRatio,\n -sourceResolution / pixelRatio\n );\n\n context.drawImage(stitchContext.canvas, 0, 0);\n context.restore();\n });\n\n releaseCanvas(stitchContext);\n canvasPool.push(stitchContext.canvas);\n\n if (renderEdges) {\n context.save();\n\n context.globalCompositeOperation = 'source-over';\n context.strokeStyle = 'black';\n context.lineWidth = 1;\n\n triangulation.getTriangles().forEach(function (triangle, i, arr) {\n const target = triangle.target;\n const u0 = (target[0][0] - targetTopLeft[0]) / targetResolution;\n const v0 = -(target[0][1] - targetTopLeft[1]) / targetResolution;\n const u1 = (target[1][0] - targetTopLeft[0]) / targetResolution;\n const v1 = -(target[1][1] - targetTopLeft[1]) / targetResolution;\n const u2 = (target[2][0] - targetTopLeft[0]) / targetResolution;\n const v2 = -(target[2][1] - targetTopLeft[1]) / targetResolution;\n\n context.beginPath();\n context.moveTo(u1, v1);\n context.lineTo(u0, v0);\n context.lineTo(u2, v2);\n context.closePath();\n context.stroke();\n });\n\n context.restore();\n }\n return context.canvas;\n}\n","/**\n * @module ol/reproj/Tile\n */\nimport {ERROR_THRESHOLD} from './common.js';\n\nimport EventType from '../events/EventType.js';\nimport Tile from '../Tile.js';\nimport TileState from '../TileState.js';\nimport Triangulation from './Triangulation.js';\nimport {\n calculateSourceExtentResolution,\n canvasPool,\n render as renderReprojected,\n} from '../reproj.js';\nimport {clamp} from '../math.js';\nimport {getArea, getIntersection} from '../extent.js';\nimport {listen, unlistenByKey} from '../events.js';\nimport {releaseCanvas} from '../dom.js';\n\n/**\n * @typedef {function(number, number, number, number) : (import(\"../ImageTile.js\").default)} FunctionType\n */\n\n/**\n * @classdesc\n * Class encapsulating single reprojected tile.\n * See {@link module:ol/source/TileImage~TileImage}.\n *\n */\nclass ReprojTile extends Tile {\n /**\n * @param {import(\"../proj/Projection.js\").default} sourceProj Source projection.\n * @param {import(\"../tilegrid/TileGrid.js\").default} sourceTileGrid Source tile grid.\n * @param {import(\"../proj/Projection.js\").default} targetProj Target projection.\n * @param {import(\"../tilegrid/TileGrid.js\").default} targetTileGrid Target tile grid.\n * @param {import(\"../tilecoord.js\").TileCoord} tileCoord Coordinate of the tile.\n * @param {import(\"../tilecoord.js\").TileCoord} wrappedTileCoord Coordinate of the tile wrapped in X.\n * @param {number} pixelRatio Pixel ratio.\n * @param {number} gutter Gutter of the source tiles.\n * @param {FunctionType} getTileFunction\n * Function returning source tiles (z, x, y, pixelRatio).\n * @param {number} [errorThreshold] Acceptable reprojection error (in px).\n * @param {boolean} [renderEdges] Render reprojection edges.\n * @param {boolean} [interpolate] Use linear interpolation when resampling.\n */\n constructor(\n sourceProj,\n sourceTileGrid,\n targetProj,\n targetTileGrid,\n tileCoord,\n wrappedTileCoord,\n pixelRatio,\n gutter,\n getTileFunction,\n errorThreshold,\n renderEdges,\n interpolate\n ) {\n super(tileCoord, TileState.IDLE, {interpolate: !!interpolate});\n\n /**\n * @private\n * @type {boolean}\n */\n this.renderEdges_ = renderEdges !== undefined ? renderEdges : false;\n\n /**\n * @private\n * @type {number}\n */\n this.pixelRatio_ = pixelRatio;\n\n /**\n * @private\n * @type {number}\n */\n this.gutter_ = gutter;\n\n /**\n * @private\n * @type {HTMLCanvasElement}\n */\n this.canvas_ = null;\n\n /**\n * @private\n * @type {import(\"../tilegrid/TileGrid.js\").default}\n */\n this.sourceTileGrid_ = sourceTileGrid;\n\n /**\n * @private\n * @type {import(\"../tilegrid/TileGrid.js\").default}\n */\n this.targetTileGrid_ = targetTileGrid;\n\n /**\n * @private\n * @type {import(\"../tilecoord.js\").TileCoord}\n */\n this.wrappedTileCoord_ = wrappedTileCoord ? wrappedTileCoord : tileCoord;\n\n /**\n * @private\n * @type {!Array<import(\"../ImageTile.js\").default>}\n */\n this.sourceTiles_ = [];\n\n /**\n * @private\n * @type {?Array<import(\"../events.js\").EventsKey>}\n */\n this.sourcesListenerKeys_ = null;\n\n /**\n * @private\n * @type {number}\n */\n this.sourceZ_ = 0;\n\n const targetExtent = targetTileGrid.getTileCoordExtent(\n this.wrappedTileCoord_\n );\n const maxTargetExtent = this.targetTileGrid_.getExtent();\n let maxSourceExtent = this.sourceTileGrid_.getExtent();\n\n const limitedTargetExtent = maxTargetExtent\n ? getIntersection(targetExtent, maxTargetExtent)\n : targetExtent;\n\n if (getArea(limitedTargetExtent) === 0) {\n // Tile is completely outside range -> EMPTY\n // TODO: is it actually correct that the source even creates the tile ?\n this.state = TileState.EMPTY;\n return;\n }\n\n const sourceProjExtent = sourceProj.getExtent();\n if (sourceProjExtent) {\n if (!maxSourceExtent) {\n maxSourceExtent = sourceProjExtent;\n } else {\n maxSourceExtent = getIntersection(maxSourceExtent, sourceProjExtent);\n }\n }\n\n const targetResolution = targetTileGrid.getResolution(\n this.wrappedTileCoord_[0]\n );\n\n const sourceResolution = calculateSourceExtentResolution(\n sourceProj,\n targetProj,\n limitedTargetExtent,\n targetResolution\n );\n\n if (!isFinite(sourceResolution) || sourceResolution <= 0) {\n // invalid sourceResolution -> EMPTY\n // probably edges of the projections when no extent is defined\n this.state = TileState.EMPTY;\n return;\n }\n\n const errorThresholdInPixels =\n errorThreshold !== undefined ? errorThreshold : ERROR_THRESHOLD;\n\n /**\n * @private\n * @type {!import(\"./Triangulation.js\").default}\n */\n this.triangulation_ = new Triangulation(\n sourceProj,\n targetProj,\n limitedTargetExtent,\n maxSourceExtent,\n sourceResolution * errorThresholdInPixels,\n targetResolution\n );\n\n if (this.triangulation_.getTriangles().length === 0) {\n // no valid triangles -> EMPTY\n this.state = TileState.EMPTY;\n return;\n }\n\n this.sourceZ_ = sourceTileGrid.getZForResolution(sourceResolution);\n let sourceExtent = this.triangulation_.calculateSourceExtent();\n\n if (maxSourceExtent) {\n if (sourceProj.canWrapX()) {\n sourceExtent[1] = clamp(\n sourceExtent[1],\n maxSourceExtent[1],\n maxSourceExtent[3]\n );\n sourceExtent[3] = clamp(\n sourceExtent[3],\n maxSourceExtent[1],\n maxSourceExtent[3]\n );\n } else {\n sourceExtent = getIntersection(sourceExtent, maxSourceExtent);\n }\n }\n\n if (!getArea(sourceExtent)) {\n this.state = TileState.EMPTY;\n } else {\n const sourceRange = sourceTileGrid.getTileRangeForExtentAndZ(\n sourceExtent,\n this.sourceZ_\n );\n\n for (let srcX = sourceRange.minX; srcX <= sourceRange.maxX; srcX++) {\n for (let srcY = sourceRange.minY; srcY <= sourceRange.maxY; srcY++) {\n const tile = getTileFunction(this.sourceZ_, srcX, srcY, pixelRatio);\n if (tile) {\n this.sourceTiles_.push(tile);\n }\n }\n }\n\n if (this.sourceTiles_.length === 0) {\n this.state = TileState.EMPTY;\n }\n }\n }\n\n /**\n * Get the HTML Canvas element for this tile.\n * @return {HTMLCanvasElement} Canvas.\n */\n getImage() {\n return this.canvas_;\n }\n\n /**\n * @private\n */\n reproject_() {\n const sources = [];\n this.sourceTiles_.forEach((tile) => {\n if (tile && tile.getState() == TileState.LOADED) {\n sources.push({\n extent: this.sourceTileGrid_.getTileCoordExtent(tile.tileCoord),\n image: tile.getImage(),\n });\n }\n });\n this.sourceTiles_.length = 0;\n\n if (sources.length === 0) {\n this.state = TileState.ERROR;\n } else {\n const z = this.wrappedTileCoord_[0];\n const size = this.targetTileGrid_.getTileSize(z);\n const width = typeof size === 'number' ? size : size[0];\n const height = typeof size === 'number' ? size : size[1];\n const targetResolution = this.targetTileGrid_.getResolution(z);\n const sourceResolution = this.sourceTileGrid_.getResolution(\n this.sourceZ_\n );\n\n const targetExtent = this.targetTileGrid_.getTileCoordExtent(\n this.wrappedTileCoord_\n );\n\n this.canvas_ = renderReprojected(\n width,\n height,\n this.pixelRatio_,\n sourceResolution,\n this.sourceTileGrid_.getExtent(),\n targetResolution,\n targetExtent,\n this.triangulation_,\n sources,\n this.gutter_,\n this.renderEdges_,\n this.interpolate\n );\n\n this.state = TileState.LOADED;\n }\n this.changed();\n }\n\n /**\n * Load not yet loaded URI.\n */\n load() {\n if (this.state == TileState.IDLE) {\n this.state = TileState.LOADING;\n this.changed();\n\n let leftToLoad = 0;\n\n this.sourcesListenerKeys_ = [];\n this.sourceTiles_.forEach((tile) => {\n const state = tile.getState();\n if (state == TileState.IDLE || state == TileState.LOADING) {\n leftToLoad++;\n\n const sourceListenKey = listen(\n tile,\n EventType.CHANGE,\n function (e) {\n const state = tile.getState();\n if (\n state == TileState.LOADED ||\n state == TileState.ERROR ||\n state == TileState.EMPTY\n ) {\n unlistenByKey(sourceListenKey);\n leftToLoad--;\n if (leftToLoad === 0) {\n this.unlistenSources_();\n this.reproject_();\n }\n }\n },\n this\n );\n this.sourcesListenerKeys_.push(sourceListenKey);\n }\n });\n\n if (leftToLoad === 0) {\n setTimeout(this.reproject_.bind(this), 0);\n } else {\n this.sourceTiles_.forEach(function (tile, i, arr) {\n const state = tile.getState();\n if (state == TileState.IDLE) {\n tile.load();\n }\n });\n }\n }\n }\n\n /**\n * @private\n */\n unlistenSources_() {\n this.sourcesListenerKeys_.forEach(unlistenByKey);\n this.sourcesListenerKeys_ = null;\n }\n\n /**\n * Remove from the cache due to expiry\n */\n release() {\n if (this.canvas_) {\n releaseCanvas(this.canvas_.getContext('2d'));\n canvasPool.push(this.canvas_);\n this.canvas_ = null;\n }\n super.release();\n }\n}\n\nexport default ReprojTile;\n","/**\n * @module ol/TileRange\n */\n\n/**\n * A representation of a contiguous block of tiles. A tile range is specified\n * by its min/max tile coordinates and is inclusive of coordinates.\n */\nclass TileRange {\n /**\n * @param {number} minX Minimum X.\n * @param {number} maxX Maximum X.\n * @param {number} minY Minimum Y.\n * @param {number} maxY Maximum Y.\n */\n constructor(minX, maxX, minY, maxY) {\n /**\n * @type {number}\n */\n this.minX = minX;\n\n /**\n * @type {number}\n */\n this.maxX = maxX;\n\n /**\n * @type {number}\n */\n this.minY = minY;\n\n /**\n * @type {number}\n */\n this.maxY = maxY;\n }\n\n /**\n * @param {import(\"./tilecoord.js\").TileCoord} tileCoord Tile coordinate.\n * @return {boolean} Contains tile coordinate.\n */\n contains(tileCoord) {\n return this.containsXY(tileCoord[1], tileCoord[2]);\n }\n\n /**\n * @param {TileRange} tileRange Tile range.\n * @return {boolean} Contains.\n */\n containsTileRange(tileRange) {\n return (\n this.minX <= tileRange.minX &&\n tileRange.maxX <= this.maxX &&\n this.minY <= tileRange.minY &&\n tileRange.maxY <= this.maxY\n );\n }\n\n /**\n * @param {number} x Tile coordinate x.\n * @param {number} y Tile coordinate y.\n * @return {boolean} Contains coordinate.\n */\n containsXY(x, y) {\n return this.minX <= x && x <= this.maxX && this.minY <= y && y <= this.maxY;\n }\n\n /**\n * @param {TileRange} tileRange Tile range.\n * @return {boolean} Equals.\n */\n equals(tileRange) {\n return (\n this.minX == tileRange.minX &&\n this.minY == tileRange.minY &&\n this.maxX == tileRange.maxX &&\n this.maxY == tileRange.maxY\n );\n }\n\n /**\n * @param {TileRange} tileRange Tile range.\n */\n extend(tileRange) {\n if (tileRange.minX < this.minX) {\n this.minX = tileRange.minX;\n }\n if (tileRange.maxX > this.maxX) {\n this.maxX = tileRange.maxX;\n }\n if (tileRange.minY < this.minY) {\n this.minY = tileRange.minY;\n }\n if (tileRange.maxY > this.maxY) {\n this.maxY = tileRange.maxY;\n }\n }\n\n /**\n * @return {number} Height.\n */\n getHeight() {\n return this.maxY - this.minY + 1;\n }\n\n /**\n * @return {import(\"./size.js\").Size} Size.\n */\n getSize() {\n return [this.getWidth(), this.getHeight()];\n }\n\n /**\n * @return {number} Width.\n */\n getWidth() {\n return this.maxX - this.minX + 1;\n }\n\n /**\n * @param {TileRange} tileRange Tile range.\n * @return {boolean} Intersects.\n */\n intersects(tileRange) {\n return (\n this.minX <= tileRange.maxX &&\n this.maxX >= tileRange.minX &&\n this.minY <= tileRange.maxY &&\n this.maxY >= tileRange.minY\n );\n }\n}\n\n/**\n * @param {number} minX Minimum X.\n * @param {number} maxX Maximum X.\n * @param {number} minY Minimum Y.\n * @param {number} maxY Maximum Y.\n * @param {TileRange} [tileRange] TileRange.\n * @return {TileRange} Tile range.\n */\nexport function createOrUpdate(minX, maxX, minY, maxY, tileRange) {\n if (tileRange !== undefined) {\n tileRange.minX = minX;\n tileRange.maxX = maxX;\n tileRange.minY = minY;\n tileRange.maxY = maxY;\n return tileRange;\n }\n return new TileRange(minX, maxX, minY, maxY);\n}\n\nexport default TileRange;\n","/**\n * @module ol/renderer/canvas/TileLayer\n */\nimport CanvasLayerRenderer from './Layer.js';\nimport ImageTile from '../../ImageTile.js';\nimport ReprojTile from '../../reproj/Tile.js';\nimport TileRange from '../../TileRange.js';\nimport TileState from '../../TileState.js';\nimport {\n apply as applyTransform,\n compose as composeTransform,\n makeInverse,\n toString as toTransformString,\n} from '../../transform.js';\nimport {ascending} from '../../array.js';\nimport {\n containsCoordinate,\n createEmpty,\n equals,\n getHeight,\n getIntersection,\n getRotatedViewport,\n getTopLeft,\n getWidth,\n intersects,\n} from '../../extent.js';\nimport {fromUserExtent} from '../../proj.js';\nimport {getUid} from '../../util.js';\nimport {toSize} from '../../size.js';\n\n/**\n * @classdesc\n * Canvas renderer for tile layers.\n * @api\n * @template {import(\"../../layer/Tile.js\").default<import(\"../../source/Tile.js\").default>|import(\"../../layer/VectorTile.js\").default} [LayerType=import(\"../../layer/Tile.js\").default<import(\"../../source/Tile.js\").default>|import(\"../../layer/VectorTile.js\").default]\n * @extends {CanvasLayerRenderer<LayerType>}\n */\nclass CanvasTileLayerRenderer extends CanvasLayerRenderer {\n /**\n * @param {LayerType} tileLayer Tile layer.\n */\n constructor(tileLayer) {\n super(tileLayer);\n\n /**\n * Rendered extent has changed since the previous `renderFrame()` call\n * @type {boolean}\n */\n this.extentChanged = true;\n\n /**\n * @private\n * @type {?import(\"../../extent.js\").Extent}\n */\n this.renderedExtent_ = null;\n\n /**\n * @protected\n * @type {number}\n */\n this.renderedPixelRatio;\n\n /**\n * @protected\n * @type {import(\"../../proj/Projection.js\").default}\n */\n this.renderedProjection = null;\n\n /**\n * @protected\n * @type {number}\n */\n this.renderedRevision;\n\n /**\n * @protected\n * @type {!Array<import(\"../../Tile.js\").default>}\n */\n this.renderedTiles = [];\n\n /**\n * @private\n * @type {boolean}\n */\n this.newTiles_ = false;\n\n /**\n * @protected\n * @type {import(\"../../extent.js\").Extent}\n */\n this.tmpExtent = createEmpty();\n\n /**\n * @private\n * @type {import(\"../../TileRange.js\").default}\n */\n this.tmpTileRange_ = new TileRange(0, 0, 0, 0);\n }\n\n /**\n * @protected\n * @param {import(\"../../Tile.js\").default} tile Tile.\n * @return {boolean} Tile is drawable.\n */\n isDrawableTile(tile) {\n const tileLayer = this.getLayer();\n const tileState = tile.getState();\n const useInterimTilesOnError = tileLayer.getUseInterimTilesOnError();\n return (\n tileState == TileState.LOADED ||\n tileState == TileState.EMPTY ||\n (tileState == TileState.ERROR && !useInterimTilesOnError)\n );\n }\n\n /**\n * @param {number} z Tile coordinate z.\n * @param {number} x Tile coordinate x.\n * @param {number} y Tile coordinate y.\n * @param {import(\"../../Map.js\").FrameState} frameState Frame state.\n * @return {!import(\"../../Tile.js\").default} Tile.\n */\n getTile(z, x, y, frameState) {\n const pixelRatio = frameState.pixelRatio;\n const projection = frameState.viewState.projection;\n const tileLayer = this.getLayer();\n const tileSource = tileLayer.getSource();\n let tile = tileSource.getTile(z, x, y, pixelRatio, projection);\n if (tile.getState() == TileState.ERROR) {\n if (tileLayer.getUseInterimTilesOnError() && tileLayer.getPreload() > 0) {\n // Preloaded tiles for lower resolutions might have finished loading.\n this.newTiles_ = true;\n }\n }\n if (!this.isDrawableTile(tile)) {\n tile = tile.getInterimTile();\n }\n return tile;\n }\n\n /**\n * @param {import(\"../../pixel.js\").Pixel} pixel Pixel.\n * @return {Uint8ClampedArray} Data at the pixel location.\n */\n getData(pixel) {\n const frameState = this.frameState;\n if (!frameState) {\n return null;\n }\n\n const layer = this.getLayer();\n const coordinate = applyTransform(\n frameState.pixelToCoordinateTransform,\n pixel.slice()\n );\n\n const layerExtent = layer.getExtent();\n if (layerExtent) {\n if (!containsCoordinate(layerExtent, coordinate)) {\n return null;\n }\n }\n\n const pixelRatio = frameState.pixelRatio;\n const projection = frameState.viewState.projection;\n const viewState = frameState.viewState;\n const source = layer.getRenderSource();\n const tileGrid = source.getTileGridForProjection(viewState.projection);\n const tilePixelRatio = source.getTilePixelRatio(frameState.pixelRatio);\n\n for (\n let z = tileGrid.getZForResolution(viewState.resolution);\n z >= tileGrid.getMinZoom();\n --z\n ) {\n const tileCoord = tileGrid.getTileCoordForCoordAndZ(coordinate, z);\n const tile = source.getTile(\n z,\n tileCoord[1],\n tileCoord[2],\n pixelRatio,\n projection\n );\n if (\n !(tile instanceof ImageTile || tile instanceof ReprojTile) ||\n (tile instanceof ReprojTile && tile.getState() === TileState.EMPTY)\n ) {\n return null;\n }\n\n if (tile.getState() !== TileState.LOADED) {\n continue;\n }\n\n const tileOrigin = tileGrid.getOrigin(z);\n const tileSize = toSize(tileGrid.getTileSize(z));\n const tileResolution = tileGrid.getResolution(z);\n\n const col = Math.floor(\n tilePixelRatio *\n ((coordinate[0] - tileOrigin[0]) / tileResolution -\n tileCoord[1] * tileSize[0])\n );\n\n const row = Math.floor(\n tilePixelRatio *\n ((tileOrigin[1] - coordinate[1]) / tileResolution -\n tileCoord[2] * tileSize[1])\n );\n\n const gutter = Math.round(\n tilePixelRatio * source.getGutterForProjection(viewState.projection)\n );\n\n return this.getImageData(tile.getImage(), col + gutter, row + gutter);\n }\n\n return null;\n }\n\n /**\n * @param {Object<number, Object<string, import(\"../../Tile.js\").default>>} tiles Lookup of loaded tiles by zoom level.\n * @param {number} zoom Zoom level.\n * @param {import(\"../../Tile.js\").default} tile Tile.\n * @return {boolean|void} If `false`, the tile will not be considered loaded.\n */\n loadedTileCallback(tiles, zoom, tile) {\n if (this.isDrawableTile(tile)) {\n return super.loadedTileCallback(tiles, zoom, tile);\n }\n return false;\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 */\n prepareFrame(frameState) {\n return !!this.getLayer().getSource();\n }\n\n /**\n * Render the layer.\n * @param {import(\"../../Map.js\").FrameState} frameState Frame state.\n * @param {HTMLElement} target Target that may be used to render content to.\n * @return {HTMLElement} The rendered element.\n */\n renderFrame(frameState, target) {\n const layerState = frameState.layerStatesArray[frameState.layerIndex];\n const viewState = frameState.viewState;\n const projection = viewState.projection;\n const viewResolution = viewState.resolution;\n const viewCenter = viewState.center;\n const rotation = viewState.rotation;\n const pixelRatio = frameState.pixelRatio;\n\n const tileLayer = this.getLayer();\n const tileSource = tileLayer.getSource();\n const sourceRevision = tileSource.getRevision();\n const tileGrid = tileSource.getTileGridForProjection(projection);\n const z = tileGrid.getZForResolution(viewResolution, tileSource.zDirection);\n const tileResolution = tileGrid.getResolution(z);\n\n let extent = frameState.extent;\n const resolution = frameState.viewState.resolution;\n const tilePixelRatio = tileSource.getTilePixelRatio(pixelRatio);\n // desired dimensions of the canvas in pixels\n const width = Math.round((getWidth(extent) / resolution) * pixelRatio);\n const height = Math.round((getHeight(extent) / resolution) * pixelRatio);\n\n const layerExtent =\n layerState.extent && fromUserExtent(layerState.extent, projection);\n if (layerExtent) {\n extent = getIntersection(\n extent,\n fromUserExtent(layerState.extent, projection)\n );\n }\n\n const dx = (tileResolution * width) / 2 / tilePixelRatio;\n const dy = (tileResolution * height) / 2 / tilePixelRatio;\n const canvasExtent = [\n viewCenter[0] - dx,\n viewCenter[1] - dy,\n viewCenter[0] + dx,\n viewCenter[1] + dy,\n ];\n\n const tileRange = tileGrid.getTileRangeForExtentAndZ(extent, z);\n\n /**\n * @type {Object<number, Object<string, import(\"../../Tile.js\").default>>}\n */\n const tilesToDrawByZ = {};\n tilesToDrawByZ[z] = {};\n\n const findLoadedTiles = this.createLoadedTileFinder(\n tileSource,\n projection,\n tilesToDrawByZ\n );\n\n const tmpExtent = this.tmpExtent;\n const tmpTileRange = this.tmpTileRange_;\n this.newTiles_ = false;\n const viewport = rotation\n ? getRotatedViewport(\n viewState.center,\n resolution,\n rotation,\n frameState.size\n )\n : undefined;\n for (let x = tileRange.minX; x <= tileRange.maxX; ++x) {\n for (let y = tileRange.minY; y <= tileRange.maxY; ++y) {\n if (\n rotation &&\n !tileGrid.tileCoordIntersectsViewport([z, x, y], viewport)\n ) {\n continue;\n }\n const tile = this.getTile(z, x, y, frameState);\n if (this.isDrawableTile(tile)) {\n const uid = getUid(this);\n if (tile.getState() == TileState.LOADED) {\n tilesToDrawByZ[z][tile.tileCoord.toString()] = tile;\n let inTransition = tile.inTransition(uid);\n if (inTransition && layerState.opacity !== 1) {\n // Skipping transition when layer is not fully opaque avoids visual artifacts.\n tile.endTransition(uid);\n inTransition = false;\n }\n if (\n !this.newTiles_ &&\n (inTransition || !this.renderedTiles.includes(tile))\n ) {\n this.newTiles_ = true;\n }\n }\n if (tile.getAlpha(uid, frameState.time) === 1) {\n // don't look for alt tiles if alpha is 1\n continue;\n }\n }\n\n const childTileRange = tileGrid.getTileCoordChildTileRange(\n tile.tileCoord,\n tmpTileRange,\n tmpExtent\n );\n\n let covered = false;\n if (childTileRange) {\n covered = findLoadedTiles(z + 1, childTileRange);\n }\n if (!covered) {\n tileGrid.forEachTileCoordParentTileRange(\n tile.tileCoord,\n findLoadedTiles,\n tmpTileRange,\n tmpExtent\n );\n }\n }\n }\n\n const canvasScale =\n ((tileResolution / viewResolution) * pixelRatio) / tilePixelRatio;\n\n // set forward and inverse pixel transforms\n composeTransform(\n this.pixelTransform,\n frameState.size[0] / 2,\n frameState.size[1] / 2,\n 1 / pixelRatio,\n 1 / pixelRatio,\n rotation,\n -width / 2,\n -height / 2\n );\n\n const canvasTransform = toTransformString(this.pixelTransform);\n\n this.useContainer(target, canvasTransform, this.getBackground(frameState));\n const context = this.context;\n const canvas = context.canvas;\n\n makeInverse(this.inversePixelTransform, this.pixelTransform);\n\n // set scale transform for calculating tile positions on the canvas\n composeTransform(\n this.tempTransform,\n width / 2,\n height / 2,\n canvasScale,\n canvasScale,\n 0,\n -width / 2,\n -height / 2\n );\n\n if (canvas.width != width || canvas.height != height) {\n canvas.width = width;\n canvas.height = height;\n } else if (!this.containerReused) {\n context.clearRect(0, 0, width, height);\n }\n\n if (layerExtent) {\n this.clipUnrotated(context, frameState, layerExtent);\n }\n\n if (!tileSource.getInterpolate()) {\n context.imageSmoothingEnabled = false;\n }\n\n this.preRender(context, frameState);\n\n this.renderedTiles.length = 0;\n /** @type {Array<number>} */\n let zs = Object.keys(tilesToDrawByZ).map(Number);\n zs.sort(ascending);\n\n let clips, clipZs, currentClip;\n if (\n layerState.opacity === 1 &&\n (!this.containerReused ||\n tileSource.getOpaque(frameState.viewState.projection))\n ) {\n zs = zs.reverse();\n } else {\n clips = [];\n clipZs = [];\n }\n for (let i = zs.length - 1; i >= 0; --i) {\n const currentZ = zs[i];\n const currentTilePixelSize = tileSource.getTilePixelSize(\n currentZ,\n pixelRatio,\n projection\n );\n const currentResolution = tileGrid.getResolution(currentZ);\n const currentScale = currentResolution / tileResolution;\n const dx = currentTilePixelSize[0] * currentScale * canvasScale;\n const dy = currentTilePixelSize[1] * currentScale * canvasScale;\n const originTileCoord = tileGrid.getTileCoordForCoordAndZ(\n getTopLeft(canvasExtent),\n currentZ\n );\n const originTileExtent = tileGrid.getTileCoordExtent(originTileCoord);\n const origin = applyTransform(this.tempTransform, [\n (tilePixelRatio * (originTileExtent[0] - canvasExtent[0])) /\n tileResolution,\n (tilePixelRatio * (canvasExtent[3] - originTileExtent[3])) /\n tileResolution,\n ]);\n const tileGutter =\n tilePixelRatio * tileSource.getGutterForProjection(projection);\n const tilesToDraw = tilesToDrawByZ[currentZ];\n for (const tileCoordKey in tilesToDraw) {\n const tile = /** @type {import(\"../../ImageTile.js\").default} */ (\n tilesToDraw[tileCoordKey]\n );\n const tileCoord = tile.tileCoord;\n\n // Calculate integer positions and sizes so that tiles align\n const xIndex = originTileCoord[1] - tileCoord[1];\n const nextX = Math.round(origin[0] - (xIndex - 1) * dx);\n const yIndex = originTileCoord[2] - tileCoord[2];\n const nextY = Math.round(origin[1] - (yIndex - 1) * dy);\n const x = Math.round(origin[0] - xIndex * dx);\n const y = Math.round(origin[1] - yIndex * dy);\n const w = nextX - x;\n const h = nextY - y;\n const transition = z === currentZ;\n\n const inTransition =\n transition && tile.getAlpha(getUid(this), frameState.time) !== 1;\n let contextSaved = false;\n if (!inTransition) {\n if (clips) {\n // Clip mask for regions in this tile that already filled by a higher z tile\n currentClip = [x, y, x + w, y, x + w, y + h, x, y + h];\n for (let i = 0, ii = clips.length; i < ii; ++i) {\n if (z !== currentZ && currentZ < clipZs[i]) {\n const clip = clips[i];\n if (\n intersects(\n [x, y, x + w, y + h],\n [clip[0], clip[3], clip[4], clip[7]]\n )\n ) {\n if (!contextSaved) {\n context.save();\n contextSaved = true;\n }\n context.beginPath();\n // counter-clockwise (outer ring) for current tile\n context.moveTo(currentClip[0], currentClip[1]);\n context.lineTo(currentClip[2], currentClip[3]);\n context.lineTo(currentClip[4], currentClip[5]);\n context.lineTo(currentClip[6], currentClip[7]);\n // clockwise (inner ring) for higher z tile\n context.moveTo(clip[6], clip[7]);\n context.lineTo(clip[4], clip[5]);\n context.lineTo(clip[2], clip[3]);\n context.lineTo(clip[0], clip[1]);\n context.clip();\n }\n }\n }\n clips.push(currentClip);\n clipZs.push(currentZ);\n } else {\n context.clearRect(x, y, w, h);\n }\n }\n this.drawTileImage(\n tile,\n frameState,\n x,\n y,\n w,\n h,\n tileGutter,\n transition\n );\n if (clips && !inTransition) {\n if (contextSaved) {\n context.restore();\n }\n this.renderedTiles.unshift(tile);\n } else {\n this.renderedTiles.push(tile);\n }\n this.updateUsedTiles(frameState.usedTiles, tileSource, tile);\n }\n }\n\n this.renderedRevision = sourceRevision;\n this.renderedResolution = tileResolution;\n this.extentChanged =\n !this.renderedExtent_ || !equals(this.renderedExtent_, canvasExtent);\n this.renderedExtent_ = canvasExtent;\n this.renderedPixelRatio = pixelRatio;\n this.renderedProjection = projection;\n\n this.manageTilePyramid(\n frameState,\n tileSource,\n tileGrid,\n pixelRatio,\n projection,\n extent,\n z,\n tileLayer.getPreload()\n );\n this.scheduleExpireCache(frameState, tileSource);\n\n this.postRender(context, frameState);\n\n if (layerState.extent) {\n context.restore();\n }\n context.imageSmoothingEnabled = true;\n\n if (canvasTransform !== canvas.style.transform) {\n canvas.style.transform = canvasTransform;\n }\n\n return this.container;\n }\n\n /**\n * @param {import(\"../../ImageTile.js\").default} tile Tile.\n * @param {import(\"../../Map.js\").FrameState} frameState Frame state.\n * @param {number} x Left of the tile.\n * @param {number} y Top of the tile.\n * @param {number} w Width of the tile.\n * @param {number} h Height of the tile.\n * @param {number} gutter Tile gutter.\n * @param {boolean} transition Apply an alpha transition.\n */\n drawTileImage(tile, frameState, x, y, w, h, gutter, transition) {\n const image = this.getTileImage(tile);\n if (!image) {\n return;\n }\n const uid = getUid(this);\n const layerState = frameState.layerStatesArray[frameState.layerIndex];\n const alpha =\n layerState.opacity *\n (transition ? tile.getAlpha(uid, frameState.time) : 1);\n const alphaChanged = alpha !== this.context.globalAlpha;\n if (alphaChanged) {\n this.context.save();\n this.context.globalAlpha = alpha;\n }\n this.context.drawImage(\n image,\n gutter,\n gutter,\n image.width - 2 * gutter,\n image.height - 2 * gutter,\n x,\n y,\n w,\n h\n );\n\n if (alphaChanged) {\n this.context.restore();\n }\n if (alpha !== layerState.opacity) {\n frameState.animate = true;\n } else if (transition) {\n tile.endTransition(uid);\n }\n }\n\n /**\n * @return {HTMLCanvasElement} Image\n */\n getImage() {\n const context = this.context;\n return context ? context.canvas : null;\n }\n\n /**\n * Get the image from a tile.\n * @param {import(\"../../ImageTile.js\").default} tile Tile.\n * @return {HTMLCanvasElement|HTMLImageElement|HTMLVideoElement} Image.\n * @protected\n */\n getTileImage(tile) {\n return tile.getImage();\n }\n\n /**\n * @param {import(\"../../Map.js\").FrameState} frameState Frame state.\n * @param {import(\"../../source/Tile.js\").default} tileSource Tile source.\n * @protected\n */\n scheduleExpireCache(frameState, tileSource) {\n if (tileSource.canExpireCache()) {\n /**\n * @param {import(\"../../source/Tile.js\").default} tileSource Tile source.\n * @param {import(\"../../Map.js\").default} map Map.\n * @param {import(\"../../Map.js\").FrameState} frameState Frame state.\n */\n const postRenderFunction = function (tileSource, map, frameState) {\n const tileSourceKey = getUid(tileSource);\n if (tileSourceKey in frameState.usedTiles) {\n tileSource.expireCache(\n frameState.viewState.projection,\n frameState.usedTiles[tileSourceKey]\n );\n }\n }.bind(null, tileSource);\n\n frameState.postRenderFunctions.push(\n /** @type {import(\"../../Map.js\").PostRenderFunction} */ (\n postRenderFunction\n )\n );\n }\n }\n\n /**\n * @param {!Object<string, !Object<string, boolean>>} usedTiles Used tiles.\n * @param {import(\"../../source/Tile.js\").default} tileSource Tile source.\n * @param {import('../../Tile.js').default} tile Tile.\n * @protected\n */\n updateUsedTiles(usedTiles, tileSource, tile) {\n // FIXME should we use tilesToDrawByZ instead?\n const tileSourceKey = getUid(tileSource);\n if (!(tileSourceKey in usedTiles)) {\n usedTiles[tileSourceKey] = {};\n }\n usedTiles[tileSourceKey][tile.getKey()] = true;\n }\n\n /**\n * Manage tile pyramid.\n * This function performs a number of functions related to the tiles at the\n * current zoom and lower zoom levels:\n * - registers idle tiles in frameState.wantedTiles so that they are not\n * discarded by the tile queue\n * - enqueues missing tiles\n * @param {import(\"../../Map.js\").FrameState} frameState Frame state.\n * @param {import(\"../../source/Tile.js\").default} tileSource Tile source.\n * @param {import(\"../../tilegrid/TileGrid.js\").default} tileGrid Tile grid.\n * @param {number} pixelRatio Pixel ratio.\n * @param {import(\"../../proj/Projection.js\").default} projection Projection.\n * @param {import(\"../../extent.js\").Extent} extent Extent.\n * @param {number} currentZ Current Z.\n * @param {number} preload Load low resolution tiles up to `preload` levels.\n * @param {function(import(\"../../Tile.js\").default):void} [tileCallback] Tile callback.\n * @protected\n */\n manageTilePyramid(\n frameState,\n tileSource,\n tileGrid,\n pixelRatio,\n projection,\n extent,\n currentZ,\n preload,\n tileCallback\n ) {\n const tileSourceKey = getUid(tileSource);\n if (!(tileSourceKey in frameState.wantedTiles)) {\n frameState.wantedTiles[tileSourceKey] = {};\n }\n const wantedTiles = frameState.wantedTiles[tileSourceKey];\n const tileQueue = frameState.tileQueue;\n const minZoom = tileGrid.getMinZoom();\n const rotation = frameState.viewState.rotation;\n const viewport = rotation\n ? getRotatedViewport(\n frameState.viewState.center,\n frameState.viewState.resolution,\n rotation,\n frameState.size\n )\n : undefined;\n let tileCount = 0;\n let tile, tileRange, tileResolution, x, y, z;\n for (z = minZoom; z <= currentZ; ++z) {\n tileRange = tileGrid.getTileRangeForExtentAndZ(extent, z, tileRange);\n tileResolution = tileGrid.getResolution(z);\n for (x = tileRange.minX; x <= tileRange.maxX; ++x) {\n for (y = tileRange.minY; y <= tileRange.maxY; ++y) {\n if (\n rotation &&\n !tileGrid.tileCoordIntersectsViewport([z, x, y], viewport)\n ) {\n continue;\n }\n if (currentZ - z <= preload) {\n ++tileCount;\n tile = tileSource.getTile(z, x, y, pixelRatio, projection);\n if (tile.getState() == TileState.IDLE) {\n wantedTiles[tile.getKey()] = true;\n if (!tileQueue.isKeyQueued(tile.getKey())) {\n tileQueue.enqueue([\n tile,\n tileSourceKey,\n tileGrid.getTileCoordCenter(tile.tileCoord),\n tileResolution,\n ]);\n }\n }\n if (tileCallback !== undefined) {\n tileCallback(tile);\n }\n } else {\n tileSource.useTile(z, x, y, projection);\n }\n }\n }\n }\n tileSource.updateCacheSize(tileCount, projection);\n }\n}\n\nexport default CanvasTileLayerRenderer;\n","/**\n * @module ol/layer/Tile\n */\nimport BaseTileLayer from './BaseTile.js';\nimport CanvasTileLayerRenderer from '../renderer/canvas/TileLayer.js';\n\n/**\n * @classdesc\n * For layer sources that provide pre-rendered, tiled images in grids that are\n * organized by zoom levels for specific resolutions.\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/Tile.js\").default} TileSourceType\n * @extends BaseTileLayer<TileSourceType, CanvasTileLayerRenderer>\n * @api\n */\nclass TileLayer extends BaseTileLayer {\n /**\n * @param {import(\"./BaseTile.js\").Options<TileSourceType>} [options] Tile layer options.\n */\n constructor(options) {\n super(options);\n }\n\n createRenderer() {\n return new CanvasTileLayerRenderer(this);\n }\n}\n\nexport default TileLayer;\n","/**\n * @module ol/structs/LRUCache\n */\n\nimport {assert} from '../asserts.js';\n\n/**\n * @typedef {Object} Entry\n * @property {string} key_ Key.\n * @property {Object} newer Newer.\n * @property {Object} older Older.\n * @property {*} value_ Value.\n */\n\n/**\n * @classdesc\n * Implements a Least-Recently-Used cache where the keys do not conflict with\n * Object's properties (e.g. 'hasOwnProperty' is not allowed as a key). Expiring\n * items from the cache is the responsibility of the user.\n *\n * @fires import(\"../events/Event.js\").default\n * @template T\n */\nclass LRUCache {\n /**\n * @param {number} [highWaterMark] High water mark.\n */\n constructor(highWaterMark) {\n /**\n * Desired max cache size after expireCache(). If set to 0, no cache entries\n * will be pruned at all.\n * @type {number}\n */\n this.highWaterMark = highWaterMark !== undefined ? highWaterMark : 2048;\n\n /**\n * @private\n * @type {number}\n */\n this.count_ = 0;\n\n /**\n * @private\n * @type {!Object<string, Entry>}\n */\n this.entries_ = {};\n\n /**\n * @private\n * @type {?Entry}\n */\n this.oldest_ = null;\n\n /**\n * @private\n * @type {?Entry}\n */\n this.newest_ = null;\n }\n\n /**\n * @return {boolean} Can expire cache.\n */\n canExpireCache() {\n return this.highWaterMark > 0 && this.getCount() > this.highWaterMark;\n }\n\n /**\n * Expire the cache.\n * @param {!Object<string, boolean>} [keep] Keys to keep. To be implemented by subclasses.\n */\n expireCache(keep) {\n while (this.canExpireCache()) {\n this.pop();\n }\n }\n\n /**\n * FIXME empty description for jsdoc\n */\n clear() {\n this.count_ = 0;\n this.entries_ = {};\n this.oldest_ = null;\n this.newest_ = null;\n }\n\n /**\n * @param {string} key Key.\n * @return {boolean} Contains key.\n */\n containsKey(key) {\n return this.entries_.hasOwnProperty(key);\n }\n\n /**\n * @param {function(T, string, LRUCache<T>): ?} f The function\n * to call for every entry from the oldest to the newer. This function takes\n * 3 arguments (the entry value, the entry key and the LRUCache object).\n * The return value is ignored.\n */\n forEach(f) {\n let entry = this.oldest_;\n while (entry) {\n f(entry.value_, entry.key_, this);\n entry = entry.newer;\n }\n }\n\n /**\n * @param {string} key Key.\n * @param {*} [options] Options (reserved for subclasses).\n * @return {T} Value.\n */\n get(key, options) {\n const entry = this.entries_[key];\n assert(entry !== undefined, 15); // Tried to get a value for a key that does not exist in the cache\n if (entry === this.newest_) {\n return entry.value_;\n }\n if (entry === this.oldest_) {\n this.oldest_ = /** @type {Entry} */ (this.oldest_.newer);\n this.oldest_.older = null;\n } else {\n entry.newer.older = entry.older;\n entry.older.newer = entry.newer;\n }\n entry.newer = null;\n entry.older = this.newest_;\n this.newest_.newer = entry;\n this.newest_ = entry;\n return entry.value_;\n }\n\n /**\n * Remove an entry from the cache.\n * @param {string} key The entry key.\n * @return {T} The removed entry.\n */\n remove(key) {\n const entry = this.entries_[key];\n assert(entry !== undefined, 15); // Tried to get a value for a key that does not exist in the cache\n if (entry === this.newest_) {\n this.newest_ = /** @type {Entry} */ (entry.older);\n if (this.newest_) {\n this.newest_.newer = null;\n }\n } else if (entry === this.oldest_) {\n this.oldest_ = /** @type {Entry} */ (entry.newer);\n if (this.oldest_) {\n this.oldest_.older = null;\n }\n } else {\n entry.newer.older = entry.older;\n entry.older.newer = entry.newer;\n }\n delete this.entries_[key];\n --this.count_;\n return entry.value_;\n }\n\n /**\n * @return {number} Count.\n */\n getCount() {\n return this.count_;\n }\n\n /**\n * @return {Array<string>} Keys.\n */\n getKeys() {\n const keys = new Array(this.count_);\n let i = 0;\n let entry;\n for (entry = this.newest_; entry; entry = entry.older) {\n keys[i++] = entry.key_;\n }\n return keys;\n }\n\n /**\n * @return {Array<T>} Values.\n */\n getValues() {\n const values = new Array(this.count_);\n let i = 0;\n let entry;\n for (entry = this.newest_; entry; entry = entry.older) {\n values[i++] = entry.value_;\n }\n return values;\n }\n\n /**\n * @return {T} Last value.\n */\n peekLast() {\n return this.oldest_.value_;\n }\n\n /**\n * @return {string} Last key.\n */\n peekLastKey() {\n return this.oldest_.key_;\n }\n\n /**\n * Get the key of the newest item in the cache. Throws if the cache is empty.\n * @return {string} The newest key.\n */\n peekFirstKey() {\n return this.newest_.key_;\n }\n\n /**\n * Return an entry without updating least recently used time.\n * @param {string} key Key.\n * @return {T} Value.\n */\n peek(key) {\n if (!this.containsKey(key)) {\n return undefined;\n }\n return this.entries_[key].value_;\n }\n\n /**\n * @return {T} value Value.\n */\n pop() {\n const entry = this.oldest_;\n delete this.entries_[entry.key_];\n if (entry.newer) {\n entry.newer.older = null;\n }\n this.oldest_ = /** @type {Entry} */ (entry.newer);\n if (!this.oldest_) {\n this.newest_ = null;\n }\n --this.count_;\n return entry.value_;\n }\n\n /**\n * @param {string} key Key.\n * @param {T} value Value.\n */\n replace(key, value) {\n this.get(key); // update `newest_`\n this.entries_[key].value_ = value;\n }\n\n /**\n * @param {string} key Key.\n * @param {T} value Value.\n */\n set(key, value) {\n assert(!(key in this.entries_), 16); // Tried to set a value for a key that is used already\n const entry = {\n key_: key,\n newer: null,\n older: this.newest_,\n value_: value,\n };\n if (!this.newest_) {\n this.oldest_ = entry;\n } else {\n this.newest_.newer = entry;\n }\n this.newest_ = entry;\n this.entries_[key] = entry;\n ++this.count_;\n }\n\n /**\n * Set a maximum number of entries for the cache.\n * @param {number} size Cache size.\n * @api\n */\n setSize(size) {\n this.highWaterMark = size;\n }\n}\n\nexport default LRUCache;\n","/**\n * @module ol/tilecoord\n */\n\n/**\n * An array of three numbers representing the location of a tile in a tile\n * grid. The order is `z` (zoom level), `x` (column), and `y` (row).\n * @typedef {Array<number>} TileCoord\n * @api\n */\n\n/**\n * @param {number} z Z.\n * @param {number} x X.\n * @param {number} y Y.\n * @param {TileCoord} [tileCoord] Tile coordinate.\n * @return {TileCoord} Tile coordinate.\n */\nexport function createOrUpdate(z, x, y, tileCoord) {\n if (tileCoord !== undefined) {\n tileCoord[0] = z;\n tileCoord[1] = x;\n tileCoord[2] = y;\n return tileCoord;\n }\n return [z, x, y];\n}\n\n/**\n * @param {number} z Z.\n * @param {number} x X.\n * @param {number} y Y.\n * @return {string} Key.\n */\nexport function getKeyZXY(z, x, y) {\n return z + '/' + x + '/' + y;\n}\n\n/**\n * Get the key for a tile coord.\n * @param {TileCoord} tileCoord The tile coord.\n * @return {string} Key.\n */\nexport function getKey(tileCoord) {\n return getKeyZXY(tileCoord[0], tileCoord[1], tileCoord[2]);\n}\n\n/**\n * Get the tile cache key for a tile key obtained through `tile.getKey()`.\n * @param {string} tileKey The tile key.\n * @return {string} The cache key.\n */\nexport function getCacheKeyForTileKey(tileKey) {\n const [z, x, y] = tileKey\n .substring(tileKey.lastIndexOf('/') + 1, tileKey.length)\n .split(',')\n .map(Number);\n return getKeyZXY(z, x, y);\n}\n\n/**\n * Get a tile coord given a key.\n * @param {string} key The tile coord key.\n * @return {TileCoord} The tile coord.\n */\nexport function fromKey(key) {\n return key.split('/').map(Number);\n}\n\n/**\n * @param {TileCoord} tileCoord Tile coord.\n * @return {number} Hash.\n */\nexport function hash(tileCoord) {\n return (tileCoord[1] << tileCoord[0]) + tileCoord[2];\n}\n\n/**\n * @param {TileCoord} tileCoord Tile coordinate.\n * @param {!import(\"./tilegrid/TileGrid.js\").default} tileGrid Tile grid.\n * @return {boolean} Tile coordinate is within extent and zoom level range.\n */\nexport function withinExtentAndZ(tileCoord, tileGrid) {\n const z = tileCoord[0];\n const x = tileCoord[1];\n const y = tileCoord[2];\n\n if (tileGrid.getMinZoom() > z || z > tileGrid.getMaxZoom()) {\n return false;\n }\n const tileRange = tileGrid.getFullTileRange(z);\n if (!tileRange) {\n return true;\n }\n return tileRange.containsXY(x, y);\n}\n","/**\n * @module ol/TileCache\n */\nimport LRUCache from './structs/LRUCache.js';\nimport {fromKey, getKey} from './tilecoord.js';\n\nclass TileCache extends LRUCache {\n clear() {\n while (this.getCount() > 0) {\n this.pop().release();\n }\n super.clear();\n }\n\n /**\n * @param {!Object<string, boolean>} usedTiles Used tiles.\n */\n expireCache(usedTiles) {\n while (this.canExpireCache()) {\n const tile = this.peekLast();\n if (tile.getKey() in usedTiles) {\n break;\n } else {\n this.pop().release();\n }\n }\n }\n\n /**\n * Prune all tiles from the cache that don't have the same z as the newest tile.\n */\n pruneExceptNewestZ() {\n if (this.getCount() === 0) {\n return;\n }\n const key = this.peekFirstKey();\n const tileCoord = fromKey(key);\n const z = tileCoord[0];\n this.forEach((tile) => {\n if (tile.tileCoord[0] !== z) {\n this.remove(getKey(tile.tileCoord));\n tile.release();\n }\n });\n }\n}\n\nexport default TileCache;\n","/**\n * @module ol/source/TileEventType\n */\n\n/**\n * @enum {string}\n */\nexport default {\n /**\n * Triggered when a tile starts loading.\n * @event module:ol/source/Tile.TileSourceEvent#tileloadstart\n * @api\n */\n TILELOADSTART: 'tileloadstart',\n\n /**\n * Triggered when a tile finishes loading, either when its data is loaded,\n * or when loading was aborted because the tile is no longer needed.\n * @event module:ol/source/Tile.TileSourceEvent#tileloadend\n * @api\n */\n TILELOADEND: 'tileloadend',\n\n /**\n * Triggered if tile loading results in an error. Note that this is not the\n * right place to re-fetch tiles. See {@link module:ol/ImageTile~ImageTile#load}\n * for details.\n * @event module:ol/source/Tile.TileSourceEvent#tileloaderror\n * @api\n */\n TILELOADERROR: 'tileloaderror',\n};\n\n/**\n * @typedef {'tileloadstart'|'tileloadend'|'tileloaderror'} TileSourceEventTypes\n */\n","/**\n * @module ol/tilegrid/TileGrid\n */\nimport TileRange, {\n createOrUpdate as createOrUpdateTileRange,\n} from '../TileRange.js';\nimport {DEFAULT_TILE_SIZE} from './common.js';\nimport {assert} from '../asserts.js';\nimport {ceil, clamp, floor} from '../math.js';\nimport {createOrUpdate, getTopLeft} from '../extent.js';\nimport {createOrUpdate as createOrUpdateTileCoord} from '../tilecoord.js';\nimport {intersectsLinearRing} from '../geom/flat/intersectsextent.js';\nimport {isSorted, linearFindNearest} from '../array.js';\nimport {toSize} from '../size.js';\n\n/**\n * @private\n * @type {import(\"../tilecoord.js\").TileCoord}\n */\nconst tmpTileCoord = [0, 0, 0];\n\n/**\n * Number of decimal digits to consider in integer values when rounding.\n * @type {number}\n */\nconst DECIMALS = 5;\n\n/**\n * @typedef {Object} Options\n * @property {import(\"../extent.js\").Extent} [extent] Extent for the tile grid. No tiles outside this\n * extent will be requested by {@link module:ol/source/Tile~TileSource} sources. When no `origin` or\n * `origins` are configured, the `origin` will be set to the top-left corner of the extent.\n * @property {number} [minZoom=0] Minimum zoom.\n * @property {import(\"../coordinate.js\").Coordinate} [origin] The tile grid origin, i.e. where the `x`\n * and `y` axes meet (`[z, 0, 0]`). Tile coordinates increase left to right and downwards. If not\n * specified, `extent` or `origins` must be provided.\n * @property {Array<import(\"../coordinate.js\").Coordinate>} [origins] Tile grid origins, i.e. where\n * the `x` and `y` axes meet (`[z, 0, 0]`), for each zoom level. If given, the array length\n * should match the length of the `resolutions` array, i.e. each resolution can have a different\n * origin. Tile coordinates increase left to right and downwards. If not specified, `extent` or\n * `origin` must be provided.\n * @property {!Array<number>} resolutions Resolutions. The array index of each resolution needs\n * to match the zoom level. This means that even if a `minZoom` is configured, the resolutions\n * array will have a length of `maxZoom + 1`.\n * @property {Array<import(\"../size.js\").Size>} [sizes] Number of tile rows and columns\n * of the grid for each zoom level. If specified the values\n * define each zoom level's extent together with the `origin` or `origins`.\n * A grid `extent` can be configured in addition, and will further limit the extent\n * for which tile requests are made by sources. If the bottom-left corner of\n * an extent is used as `origin` or `origins`, then the `y` value must be\n * negative because OpenLayers tile coordinates use the top left as the origin.\n * @property {number|import(\"../size.js\").Size} [tileSize] Tile size.\n * Default is `[256, 256]`.\n * @property {Array<number|import(\"../size.js\").Size>} [tileSizes] Tile sizes. If given, the array length\n * should match the length of the `resolutions` array, i.e. each resolution can have a different\n * tile size.\n */\n\n/**\n * @classdesc\n * Base class for setting the grid pattern for sources accessing tiled-image\n * servers.\n * @api\n */\nclass TileGrid {\n /**\n * @param {Options} options Tile grid options.\n */\n constructor(options) {\n /**\n * @protected\n * @type {number}\n */\n this.minZoom = options.minZoom !== undefined ? options.minZoom : 0;\n\n /**\n * @private\n * @type {!Array<number>}\n */\n this.resolutions_ = options.resolutions;\n assert(\n isSorted(\n this.resolutions_,\n function (a, b) {\n return b - a;\n },\n true\n ),\n 17\n ); // `resolutions` must be sorted in descending order\n\n // check if we've got a consistent zoom factor and origin\n let zoomFactor;\n if (!options.origins) {\n for (let i = 0, ii = this.resolutions_.length - 1; i < ii; ++i) {\n if (!zoomFactor) {\n zoomFactor = this.resolutions_[i] / this.resolutions_[i + 1];\n } else {\n if (this.resolutions_[i] / this.resolutions_[i + 1] !== zoomFactor) {\n zoomFactor = undefined;\n break;\n }\n }\n }\n }\n\n /**\n * @private\n * @type {number|undefined}\n */\n this.zoomFactor_ = zoomFactor;\n\n /**\n * @protected\n * @type {number}\n */\n this.maxZoom = this.resolutions_.length - 1;\n\n /**\n * @private\n * @type {import(\"../coordinate.js\").Coordinate|null}\n */\n this.origin_ = options.origin !== undefined ? options.origin : null;\n\n /**\n * @private\n * @type {Array<import(\"../coordinate.js\").Coordinate>}\n */\n this.origins_ = null;\n if (options.origins !== undefined) {\n this.origins_ = options.origins;\n assert(this.origins_.length == this.resolutions_.length, 20); // Number of `origins` and `resolutions` must be equal\n }\n\n const extent = options.extent;\n\n if (extent !== undefined && !this.origin_ && !this.origins_) {\n this.origin_ = getTopLeft(extent);\n }\n\n assert(\n (!this.origin_ && this.origins_) || (this.origin_ && !this.origins_),\n 18\n ); // Either `origin` or `origins` must be configured, never both\n\n /**\n * @private\n * @type {Array<number|import(\"../size.js\").Size>}\n */\n this.tileSizes_ = null;\n if (options.tileSizes !== undefined) {\n this.tileSizes_ = options.tileSizes;\n assert(this.tileSizes_.length == this.resolutions_.length, 19); // Number of `tileSizes` and `resolutions` must be equal\n }\n\n /**\n * @private\n * @type {number|import(\"../size.js\").Size}\n */\n this.tileSize_ =\n options.tileSize !== undefined\n ? options.tileSize\n : !this.tileSizes_\n ? DEFAULT_TILE_SIZE\n : null;\n assert(\n (!this.tileSize_ && this.tileSizes_) ||\n (this.tileSize_ && !this.tileSizes_),\n 22\n ); // Either `tileSize` or `tileSizes` must be configured, never both\n\n /**\n * @private\n * @type {import(\"../extent.js\").Extent}\n */\n this.extent_ = extent !== undefined ? extent : null;\n\n /**\n * @private\n * @type {Array<import(\"../TileRange.js\").default>}\n */\n this.fullTileRanges_ = null;\n\n /**\n * @private\n * @type {import(\"../size.js\").Size}\n */\n this.tmpSize_ = [0, 0];\n\n /**\n * @private\n * @type {import(\"../extent.js\").Extent}\n */\n this.tmpExtent_ = [0, 0, 0, 0];\n\n if (options.sizes !== undefined) {\n this.fullTileRanges_ = options.sizes.map(function (size, z) {\n const tileRange = new TileRange(\n Math.min(0, size[0]),\n Math.max(size[0] - 1, -1),\n Math.min(0, size[1]),\n Math.max(size[1] - 1, -1)\n );\n if (extent) {\n const restrictedTileRange = this.getTileRangeForExtentAndZ(extent, z);\n tileRange.minX = Math.max(restrictedTileRange.minX, tileRange.minX);\n tileRange.maxX = Math.min(restrictedTileRange.maxX, tileRange.maxX);\n tileRange.minY = Math.max(restrictedTileRange.minY, tileRange.minY);\n tileRange.maxY = Math.min(restrictedTileRange.maxY, tileRange.maxY);\n }\n return tileRange;\n }, this);\n } else if (extent) {\n this.calculateTileRanges_(extent);\n }\n }\n\n /**\n * Call a function with each tile coordinate for a given extent and zoom level.\n *\n * @param {import(\"../extent.js\").Extent} extent Extent.\n * @param {number} zoom Integer zoom level.\n * @param {function(import(\"../tilecoord.js\").TileCoord): void} callback Function called with each tile coordinate.\n * @api\n */\n forEachTileCoord(extent, zoom, callback) {\n const tileRange = this.getTileRangeForExtentAndZ(extent, zoom);\n for (let i = tileRange.minX, ii = tileRange.maxX; i <= ii; ++i) {\n for (let j = tileRange.minY, jj = tileRange.maxY; j <= jj; ++j) {\n callback([zoom, i, j]);\n }\n }\n }\n\n /**\n * @param {import(\"../tilecoord.js\").TileCoord} tileCoord Tile coordinate.\n * @param {function(number, import(\"../TileRange.js\").default): boolean} callback Callback.\n * @param {import(\"../TileRange.js\").default} [tempTileRange] Temporary import(\"../TileRange.js\").default object.\n * @param {import(\"../extent.js\").Extent} [tempExtent] Temporary import(\"../extent.js\").Extent object.\n * @return {boolean} Callback succeeded.\n */\n forEachTileCoordParentTileRange(\n tileCoord,\n callback,\n tempTileRange,\n tempExtent\n ) {\n let tileRange, x, y;\n let tileCoordExtent = null;\n let z = tileCoord[0] - 1;\n if (this.zoomFactor_ === 2) {\n x = tileCoord[1];\n y = tileCoord[2];\n } else {\n tileCoordExtent = this.getTileCoordExtent(tileCoord, tempExtent);\n }\n while (z >= this.minZoom) {\n if (this.zoomFactor_ === 2) {\n x = Math.floor(x / 2);\n y = Math.floor(y / 2);\n tileRange = createOrUpdateTileRange(x, x, y, y, tempTileRange);\n } else {\n tileRange = this.getTileRangeForExtentAndZ(\n tileCoordExtent,\n z,\n tempTileRange\n );\n }\n if (callback(z, tileRange)) {\n return true;\n }\n --z;\n }\n return false;\n }\n\n /**\n * Get the extent for this tile grid, if it was configured.\n * @return {import(\"../extent.js\").Extent} Extent.\n * @api\n */\n getExtent() {\n return this.extent_;\n }\n\n /**\n * Get the maximum zoom level for the grid.\n * @return {number} Max zoom.\n * @api\n */\n getMaxZoom() {\n return this.maxZoom;\n }\n\n /**\n * Get the minimum zoom level for the grid.\n * @return {number} Min zoom.\n * @api\n */\n getMinZoom() {\n return this.minZoom;\n }\n\n /**\n * Get the origin for the grid at the given zoom level.\n * @param {number} z Integer zoom level.\n * @return {import(\"../coordinate.js\").Coordinate} Origin.\n * @api\n */\n getOrigin(z) {\n if (this.origin_) {\n return this.origin_;\n }\n return this.origins_[z];\n }\n\n /**\n * Get the resolution for the given zoom level.\n * @param {number} z Integer zoom level.\n * @return {number} Resolution.\n * @api\n */\n getResolution(z) {\n return this.resolutions_[z];\n }\n\n /**\n * Get the list of resolutions for the tile grid.\n * @return {Array<number>} Resolutions.\n * @api\n */\n getResolutions() {\n return this.resolutions_;\n }\n\n /**\n * @param {import(\"../tilecoord.js\").TileCoord} tileCoord Tile coordinate.\n * @param {import(\"../TileRange.js\").default} [tempTileRange] Temporary import(\"../TileRange.js\").default object.\n * @param {import(\"../extent.js\").Extent} [tempExtent] Temporary import(\"../extent.js\").Extent object.\n * @return {import(\"../TileRange.js\").default|null} Tile range.\n */\n getTileCoordChildTileRange(tileCoord, tempTileRange, tempExtent) {\n if (tileCoord[0] < this.maxZoom) {\n if (this.zoomFactor_ === 2) {\n const minX = tileCoord[1] * 2;\n const minY = tileCoord[2] * 2;\n return createOrUpdateTileRange(\n minX,\n minX + 1,\n minY,\n minY + 1,\n tempTileRange\n );\n }\n const tileCoordExtent = this.getTileCoordExtent(\n tileCoord,\n tempExtent || this.tmpExtent_\n );\n return this.getTileRangeForExtentAndZ(\n tileCoordExtent,\n tileCoord[0] + 1,\n tempTileRange\n );\n }\n return null;\n }\n\n /**\n * @param {import(\"../tilecoord.js\").TileCoord} tileCoord Tile coordinate.\n * @param {number} z Integer zoom level.\n * @param {import(\"../TileRange.js\").default} [tempTileRange] Temporary import(\"../TileRange.js\").default object.\n * @return {import(\"../TileRange.js\").default|null} Tile range.\n */\n getTileRangeForTileCoordAndZ(tileCoord, z, tempTileRange) {\n if (z > this.maxZoom || z < this.minZoom) {\n return null;\n }\n\n const tileCoordZ = tileCoord[0];\n const tileCoordX = tileCoord[1];\n const tileCoordY = tileCoord[2];\n\n if (z === tileCoordZ) {\n return createOrUpdateTileRange(\n tileCoordX,\n tileCoordY,\n tileCoordX,\n tileCoordY,\n tempTileRange\n );\n }\n\n if (this.zoomFactor_) {\n const factor = Math.pow(this.zoomFactor_, z - tileCoordZ);\n const minX = Math.floor(tileCoordX * factor);\n const minY = Math.floor(tileCoordY * factor);\n if (z < tileCoordZ) {\n return createOrUpdateTileRange(minX, minX, minY, minY, tempTileRange);\n }\n\n const maxX = Math.floor(factor * (tileCoordX + 1)) - 1;\n const maxY = Math.floor(factor * (tileCoordY + 1)) - 1;\n return createOrUpdateTileRange(minX, maxX, minY, maxY, tempTileRange);\n }\n\n const tileCoordExtent = this.getTileCoordExtent(tileCoord, this.tmpExtent_);\n return this.getTileRangeForExtentAndZ(tileCoordExtent, z, tempTileRange);\n }\n\n /**\n * Get a tile range for the given extent and integer zoom level.\n * @param {import(\"../extent.js\").Extent} extent Extent.\n * @param {number} z Integer zoom level.\n * @param {import(\"../TileRange.js\").default} [tempTileRange] Temporary tile range object.\n * @return {import(\"../TileRange.js\").default} Tile range.\n */\n getTileRangeForExtentAndZ(extent, z, tempTileRange) {\n this.getTileCoordForXYAndZ_(extent[0], extent[3], z, false, tmpTileCoord);\n const minX = tmpTileCoord[1];\n const minY = tmpTileCoord[2];\n this.getTileCoordForXYAndZ_(extent[2], extent[1], z, true, tmpTileCoord);\n const maxX = tmpTileCoord[1];\n const maxY = tmpTileCoord[2];\n return createOrUpdateTileRange(minX, maxX, minY, maxY, tempTileRange);\n }\n\n /**\n * @param {import(\"../tilecoord.js\").TileCoord} tileCoord Tile coordinate.\n * @return {import(\"../coordinate.js\").Coordinate} Tile center.\n */\n getTileCoordCenter(tileCoord) {\n const origin = this.getOrigin(tileCoord[0]);\n const resolution = this.getResolution(tileCoord[0]);\n const tileSize = toSize(this.getTileSize(tileCoord[0]), this.tmpSize_);\n return [\n origin[0] + (tileCoord[1] + 0.5) * tileSize[0] * resolution,\n origin[1] - (tileCoord[2] + 0.5) * tileSize[1] * resolution,\n ];\n }\n\n /**\n * Get the extent of a tile coordinate.\n *\n * @param {import(\"../tilecoord.js\").TileCoord} tileCoord Tile coordinate.\n * @param {import(\"../extent.js\").Extent} [tempExtent] Temporary extent object.\n * @return {import(\"../extent.js\").Extent} Extent.\n * @api\n */\n getTileCoordExtent(tileCoord, tempExtent) {\n const origin = this.getOrigin(tileCoord[0]);\n const resolution = this.getResolution(tileCoord[0]);\n const tileSize = toSize(this.getTileSize(tileCoord[0]), this.tmpSize_);\n const minX = origin[0] + tileCoord[1] * tileSize[0] * resolution;\n const minY = origin[1] - (tileCoord[2] + 1) * tileSize[1] * resolution;\n const maxX = minX + tileSize[0] * resolution;\n const maxY = minY + tileSize[1] * resolution;\n return createOrUpdate(minX, minY, maxX, maxY, tempExtent);\n }\n\n /**\n * Get the tile coordinate for the given map coordinate and resolution. This\n * method considers that coordinates that intersect tile boundaries should be\n * assigned the higher tile coordinate.\n *\n * @param {import(\"../coordinate.js\").Coordinate} coordinate Coordinate.\n * @param {number} resolution Resolution.\n * @param {import(\"../tilecoord.js\").TileCoord} [opt_tileCoord] Destination import(\"../tilecoord.js\").TileCoord object.\n * @return {import(\"../tilecoord.js\").TileCoord} Tile coordinate.\n * @api\n */\n getTileCoordForCoordAndResolution(coordinate, resolution, opt_tileCoord) {\n return this.getTileCoordForXYAndResolution_(\n coordinate[0],\n coordinate[1],\n resolution,\n false,\n opt_tileCoord\n );\n }\n\n /**\n * Note that this method should not be called for resolutions that correspond\n * to an integer zoom level. Instead call the `getTileCoordForXYAndZ_` method.\n * @param {number} x X.\n * @param {number} y Y.\n * @param {number} resolution Resolution (for a non-integer zoom level).\n * @param {boolean} reverseIntersectionPolicy Instead of letting edge\n * intersections go to the higher tile coordinate, let edge intersections\n * go to the lower tile coordinate.\n * @param {import(\"../tilecoord.js\").TileCoord} [opt_tileCoord] Temporary import(\"../tilecoord.js\").TileCoord object.\n * @return {import(\"../tilecoord.js\").TileCoord} Tile coordinate.\n * @private\n */\n getTileCoordForXYAndResolution_(\n x,\n y,\n resolution,\n reverseIntersectionPolicy,\n opt_tileCoord\n ) {\n const z = this.getZForResolution(resolution);\n const scale = resolution / this.getResolution(z);\n const origin = this.getOrigin(z);\n const tileSize = toSize(this.getTileSize(z), this.tmpSize_);\n\n let tileCoordX = (scale * (x - origin[0])) / resolution / tileSize[0];\n let tileCoordY = (scale * (origin[1] - y)) / resolution / tileSize[1];\n\n if (reverseIntersectionPolicy) {\n tileCoordX = ceil(tileCoordX, DECIMALS) - 1;\n tileCoordY = ceil(tileCoordY, DECIMALS) - 1;\n } else {\n tileCoordX = floor(tileCoordX, DECIMALS);\n tileCoordY = floor(tileCoordY, DECIMALS);\n }\n\n return createOrUpdateTileCoord(z, tileCoordX, tileCoordY, opt_tileCoord);\n }\n\n /**\n * Although there is repetition between this method and `getTileCoordForXYAndResolution_`,\n * they should have separate implementations. This method is for integer zoom\n * levels. The other method should only be called for resolutions corresponding\n * to non-integer zoom levels.\n * @param {number} x Map x coordinate.\n * @param {number} y Map y coordinate.\n * @param {number} z Integer zoom level.\n * @param {boolean} reverseIntersectionPolicy Instead of letting edge\n * intersections go to the higher tile coordinate, let edge intersections\n * go to the lower tile coordinate.\n * @param {import(\"../tilecoord.js\").TileCoord} [opt_tileCoord] Temporary import(\"../tilecoord.js\").TileCoord object.\n * @return {import(\"../tilecoord.js\").TileCoord} Tile coordinate.\n * @private\n */\n getTileCoordForXYAndZ_(x, y, z, reverseIntersectionPolicy, opt_tileCoord) {\n const origin = this.getOrigin(z);\n const resolution = this.getResolution(z);\n const tileSize = toSize(this.getTileSize(z), this.tmpSize_);\n\n let tileCoordX = (x - origin[0]) / resolution / tileSize[0];\n let tileCoordY = (origin[1] - y) / resolution / tileSize[1];\n\n if (reverseIntersectionPolicy) {\n tileCoordX = ceil(tileCoordX, DECIMALS) - 1;\n tileCoordY = ceil(tileCoordY, DECIMALS) - 1;\n } else {\n tileCoordX = floor(tileCoordX, DECIMALS);\n tileCoordY = floor(tileCoordY, DECIMALS);\n }\n\n return createOrUpdateTileCoord(z, tileCoordX, tileCoordY, opt_tileCoord);\n }\n\n /**\n * Get a tile coordinate given a map coordinate and zoom level.\n * @param {import(\"../coordinate.js\").Coordinate} coordinate Coordinate.\n * @param {number} z Zoom level.\n * @param {import(\"../tilecoord.js\").TileCoord} [opt_tileCoord] Destination import(\"../tilecoord.js\").TileCoord object.\n * @return {import(\"../tilecoord.js\").TileCoord} Tile coordinate.\n * @api\n */\n getTileCoordForCoordAndZ(coordinate, z, opt_tileCoord) {\n return this.getTileCoordForXYAndZ_(\n coordinate[0],\n coordinate[1],\n z,\n false,\n opt_tileCoord\n );\n }\n\n /**\n * @param {import(\"../tilecoord.js\").TileCoord} tileCoord Tile coordinate.\n * @return {number} Tile resolution.\n */\n getTileCoordResolution(tileCoord) {\n return this.resolutions_[tileCoord[0]];\n }\n\n /**\n * Get the tile size for a zoom level. The type of the return value matches the\n * `tileSize` or `tileSizes` that the tile grid was configured with. To always\n * get an {@link import(\"../size.js\").Size}, run the result through {@link module:ol/size.toSize}.\n * @param {number} z Z.\n * @return {number|import(\"../size.js\").Size} Tile size.\n * @api\n */\n getTileSize(z) {\n if (this.tileSize_) {\n return this.tileSize_;\n }\n return this.tileSizes_[z];\n }\n\n /**\n * @param {number} z Zoom level.\n * @return {import(\"../TileRange.js\").default} Extent tile range for the specified zoom level.\n */\n getFullTileRange(z) {\n if (!this.fullTileRanges_) {\n return this.extent_\n ? this.getTileRangeForExtentAndZ(this.extent_, z)\n : null;\n }\n return this.fullTileRanges_[z];\n }\n\n /**\n * @param {number} resolution Resolution.\n * @param {number|import(\"../array.js\").NearestDirectionFunction} [opt_direction]\n * If 0, the nearest resolution will be used.\n * If 1, the nearest higher resolution (lower Z) will be used. If -1, the\n * nearest lower resolution (higher Z) will be used. Default is 0.\n * Use a {@link module:ol/array~NearestDirectionFunction} for more precise control.\n *\n * For example to change tile Z at the midpoint of zoom levels\n * ```js\n * function(value, high, low) {\n * return value - low * Math.sqrt(high / low);\n * }\n * ```\n * @return {number} Z.\n * @api\n */\n getZForResolution(resolution, opt_direction) {\n const z = linearFindNearest(\n this.resolutions_,\n resolution,\n opt_direction || 0\n );\n return clamp(z, this.minZoom, this.maxZoom);\n }\n\n /**\n * The tile with the provided tile coordinate intersects the given viewport.\n * @param {import('../tilecoord.js').TileCoord} tileCoord Tile coordinate.\n * @param {Array<number>} viewport Viewport as returned from {@link module:ol/extent.getRotatedViewport}.\n * @return {boolean} The tile with the provided tile coordinate intersects the given viewport.\n */\n tileCoordIntersectsViewport(tileCoord, viewport) {\n return intersectsLinearRing(\n viewport,\n 0,\n viewport.length,\n 2,\n this.getTileCoordExtent(tileCoord)\n );\n }\n\n /**\n * @param {!import(\"../extent.js\").Extent} extent Extent for this tile grid.\n * @private\n */\n calculateTileRanges_(extent) {\n const length = this.resolutions_.length;\n const fullTileRanges = new Array(length);\n for (let z = this.minZoom; z < length; ++z) {\n fullTileRanges[z] = this.getTileRangeForExtentAndZ(extent, z);\n }\n this.fullTileRanges_ = fullTileRanges;\n }\n}\n\nexport default TileGrid;\n","/**\n * @module ol/tilegrid\n */\nimport TileGrid from './tilegrid/TileGrid.js';\nimport {DEFAULT_MAX_ZOOM, DEFAULT_TILE_SIZE} from './tilegrid/common.js';\nimport {METERS_PER_UNIT, get as getProjection} from './proj.js';\nimport {\n containsCoordinate,\n createOrUpdate,\n getCorner,\n getHeight,\n getWidth,\n} from './extent.js';\nimport {toSize} from './size.js';\n\n/**\n * @param {import(\"./proj/Projection.js\").default} projection Projection.\n * @return {!TileGrid} Default tile grid for the\n * passed projection.\n */\nexport function getForProjection(projection) {\n let tileGrid = projection.getDefaultTileGrid();\n if (!tileGrid) {\n tileGrid = createForProjection(projection);\n projection.setDefaultTileGrid(tileGrid);\n }\n return tileGrid;\n}\n\n/**\n * @param {TileGrid} tileGrid Tile grid.\n * @param {import(\"./tilecoord.js\").TileCoord} tileCoord Tile coordinate.\n * @param {import(\"./proj/Projection.js\").default} projection Projection.\n * @return {import(\"./tilecoord.js\").TileCoord} Tile coordinate.\n */\nexport function wrapX(tileGrid, tileCoord, projection) {\n const z = tileCoord[0];\n const center = tileGrid.getTileCoordCenter(tileCoord);\n const projectionExtent = extentFromProjection(projection);\n if (!containsCoordinate(projectionExtent, center)) {\n const worldWidth = getWidth(projectionExtent);\n const worldsAway = Math.ceil(\n (projectionExtent[0] - center[0]) / worldWidth\n );\n center[0] += worldWidth * worldsAway;\n return tileGrid.getTileCoordForCoordAndZ(center, z);\n }\n return tileCoord;\n}\n\n/**\n * @param {import(\"./extent.js\").Extent} extent Extent.\n * @param {number} [maxZoom] Maximum zoom level (default is\n * DEFAULT_MAX_ZOOM).\n * @param {number|import(\"./size.js\").Size} [tileSize] Tile size (default uses\n * DEFAULT_TILE_SIZE).\n * @param {import(\"./extent.js\").Corner} [corner] Extent corner (default is `'top-left'`).\n * @return {!TileGrid} TileGrid instance.\n */\nexport function createForExtent(extent, maxZoom, tileSize, corner) {\n corner = corner !== undefined ? corner : 'top-left';\n\n const resolutions = resolutionsFromExtent(extent, maxZoom, tileSize);\n\n return new TileGrid({\n extent: extent,\n origin: getCorner(extent, corner),\n resolutions: resolutions,\n tileSize: tileSize,\n });\n}\n\n/**\n * @typedef {Object} XYZOptions\n * @property {import(\"./extent.js\").Extent} [extent] Extent for the tile grid. The origin for an XYZ tile grid is the\n * top-left corner of the extent. If `maxResolution` is not provided the zero level of the grid is defined by the resolution\n * at which one tile fits in the provided extent. If not provided, the extent of the EPSG:3857 projection is used.\n * @property {number} [maxResolution] Resolution at level zero.\n * @property {number} [maxZoom] Maximum zoom. The default is `42`. This determines the number of levels\n * in the grid set. For example, a `maxZoom` of 21 means there are 22 levels in the grid set.\n * @property {number} [minZoom=0] Minimum zoom.\n * @property {number|import(\"./size.js\").Size} [tileSize=[256, 256]] Tile size in pixels.\n */\n\n/**\n * Creates a tile grid with a standard XYZ tiling scheme.\n * @param {XYZOptions} [options] Tile grid options.\n * @return {!TileGrid} Tile grid instance.\n * @api\n */\nexport function createXYZ(options) {\n const xyzOptions = options || {};\n\n const extent = xyzOptions.extent || getProjection('EPSG:3857').getExtent();\n\n const gridOptions = {\n extent: extent,\n minZoom: xyzOptions.minZoom,\n tileSize: xyzOptions.tileSize,\n resolutions: resolutionsFromExtent(\n extent,\n xyzOptions.maxZoom,\n xyzOptions.tileSize,\n xyzOptions.maxResolution\n ),\n };\n return new TileGrid(gridOptions);\n}\n\n/**\n * Create a resolutions array from an extent. A zoom factor of 2 is assumed.\n * @param {import(\"./extent.js\").Extent} extent Extent.\n * @param {number} [maxZoom] Maximum zoom level (default is\n * DEFAULT_MAX_ZOOM).\n * @param {number|import(\"./size.js\").Size} [tileSize] Tile size (default uses\n * DEFAULT_TILE_SIZE).\n * @param {number} [maxResolution] Resolution at level zero.\n * @return {!Array<number>} Resolutions array.\n */\nfunction resolutionsFromExtent(extent, maxZoom, tileSize, maxResolution) {\n maxZoom = maxZoom !== undefined ? maxZoom : DEFAULT_MAX_ZOOM;\n tileSize = toSize(tileSize !== undefined ? tileSize : DEFAULT_TILE_SIZE);\n\n const height = getHeight(extent);\n const width = getWidth(extent);\n\n maxResolution =\n maxResolution > 0\n ? maxResolution\n : Math.max(width / tileSize[0], height / tileSize[1]);\n\n const length = maxZoom + 1;\n const resolutions = new Array(length);\n for (let z = 0; z < length; ++z) {\n resolutions[z] = maxResolution / Math.pow(2, z);\n }\n return resolutions;\n}\n\n/**\n * @param {import(\"./proj.js\").ProjectionLike} projection Projection.\n * @param {number} [maxZoom] Maximum zoom level (default is\n * DEFAULT_MAX_ZOOM).\n * @param {number|import(\"./size.js\").Size} [tileSize] Tile size (default uses\n * DEFAULT_TILE_SIZE).\n * @param {import(\"./extent.js\").Corner} [corner] Extent corner (default is `'top-left'`).\n * @return {!TileGrid} TileGrid instance.\n */\nexport function createForProjection(projection, maxZoom, tileSize, corner) {\n const extent = extentFromProjection(projection);\n return createForExtent(extent, maxZoom, tileSize, corner);\n}\n\n/**\n * Generate a tile grid extent from a projection. If the projection has an\n * extent, it is used. If not, a global extent is assumed.\n * @param {import(\"./proj.js\").ProjectionLike} projection Projection.\n * @return {import(\"./extent.js\").Extent} Extent.\n */\nexport function extentFromProjection(projection) {\n projection = getProjection(projection);\n let extent = projection.getExtent();\n if (!extent) {\n const half =\n (180 * METERS_PER_UNIT.degrees) / projection.getMetersPerUnit();\n extent = createOrUpdate(-half, -half, half, half);\n }\n return extent;\n}\n","/**\n * @module ol/source/Tile\n */\nimport Event from '../events/Event.js';\nimport Source from './Source.js';\nimport TileCache from '../TileCache.js';\nimport TileState from '../TileState.js';\nimport {abstract} from '../util.js';\nimport {assert} from '../asserts.js';\nimport {equivalent} from '../proj.js';\nimport {getKeyZXY, withinExtentAndZ} from '../tilecoord.js';\nimport {\n getForProjection as getTileGridForProjection,\n wrapX,\n} from '../tilegrid.js';\nimport {scale as scaleSize, toSize} from '../size.js';\n\n/***\n * @template Return\n * @typedef {import(\"../Observable\").OnSignature<import(\"../Observable\").EventTypes, import(\"../events/Event.js\").default, Return> &\n * import(\"../Observable\").OnSignature<import(\"../ObjectEventType\").Types, import(\"../Object\").ObjectEvent, Return> &\n * import(\"../Observable\").OnSignature<import(\"./TileEventType\").TileSourceEventTypes, TileSourceEvent, Return> &\n * import(\"../Observable\").CombinedOnSignature<import(\"../Observable\").EventTypes|import(\"../ObjectEventType\").Types|\n * import(\"./TileEventType\").TileSourceEventTypes, Return>} TileSourceOnSignature\n */\n\n/**\n * @typedef {Object} Options\n * @property {import(\"./Source.js\").AttributionLike} [attributions] Attributions.\n * @property {boolean} [attributionsCollapsible=true] Attributions are collapsible.\n * @property {number} [cacheSize] CacheSize.\n * @property {boolean} [opaque=false] Whether the layer is opaque.\n * @property {number} [tilePixelRatio] TilePixelRatio.\n * @property {import(\"../proj.js\").ProjectionLike} [projection] Projection.\n * @property {import(\"./Source.js\").State} [state] State.\n * @property {import(\"../tilegrid/TileGrid.js\").default} [tileGrid] TileGrid.\n * @property {boolean} [wrapX=false] WrapX.\n * @property {number} [transition] Transition.\n * @property {string} [key] Key.\n * @property {number|import(\"../array.js\").NearestDirectionFunction} [zDirection=0] ZDirection.\n * @property {boolean} [interpolate=false] Use interpolated values when resampling. By default,\n * the nearest neighbor is used when resampling.\n */\n\n/**\n * @classdesc\n * Abstract base class; normally only used for creating subclasses and not\n * instantiated in apps.\n * Base class for sources providing images divided into a tile grid.\n * @abstract\n * @api\n */\nclass TileSource extends Source {\n /**\n * @param {Options} options SourceTile source options.\n */\n constructor(options) {\n super({\n attributions: options.attributions,\n attributionsCollapsible: options.attributionsCollapsible,\n projection: options.projection,\n state: options.state,\n wrapX: options.wrapX,\n interpolate: options.interpolate,\n });\n\n /***\n * @type {TileSourceOnSignature<import(\"../events\").EventsKey>}\n */\n this.on;\n\n /***\n * @type {TileSourceOnSignature<import(\"../events\").EventsKey>}\n */\n this.once;\n\n /***\n * @type {TileSourceOnSignature<void>}\n */\n this.un;\n\n /**\n * @private\n * @type {boolean}\n */\n this.opaque_ = options.opaque !== undefined ? options.opaque : false;\n\n /**\n * @private\n * @type {number}\n */\n this.tilePixelRatio_ =\n options.tilePixelRatio !== undefined ? options.tilePixelRatio : 1;\n\n /**\n * @type {import(\"../tilegrid/TileGrid.js\").default|null}\n */\n this.tileGrid = options.tileGrid !== undefined ? options.tileGrid : null;\n\n const tileSize = [256, 256];\n if (this.tileGrid) {\n toSize(this.tileGrid.getTileSize(this.tileGrid.getMinZoom()), tileSize);\n }\n\n /**\n * @protected\n * @type {import(\"../TileCache.js\").default}\n */\n this.tileCache = new TileCache(options.cacheSize || 0);\n\n /**\n * @protected\n * @type {import(\"../size.js\").Size}\n */\n this.tmpSize = [0, 0];\n\n /**\n * @private\n * @type {string}\n */\n this.key_ = options.key || '';\n\n /**\n * @protected\n * @type {import(\"../Tile.js\").Options}\n */\n this.tileOptions = {\n transition: options.transition,\n interpolate: options.interpolate,\n };\n\n /**\n * zDirection hint, read by the renderer. Indicates which resolution should be used\n * by a renderer if the views resolution does not match any resolution of the tile source.\n * If 0, the nearest resolution will be used. If 1, the nearest lower resolution\n * will be used. If -1, the nearest higher resolution will be used.\n * @type {number|import(\"../array.js\").NearestDirectionFunction}\n */\n this.zDirection = options.zDirection ? options.zDirection : 0;\n }\n\n /**\n * @return {boolean} Can expire cache.\n */\n canExpireCache() {\n return this.tileCache.canExpireCache();\n }\n\n /**\n * @param {import(\"../proj/Projection.js\").default} projection Projection.\n * @param {!Object<string, boolean>} usedTiles Used tiles.\n */\n expireCache(projection, usedTiles) {\n const tileCache = this.getTileCacheForProjection(projection);\n if (tileCache) {\n tileCache.expireCache(usedTiles);\n }\n }\n\n /**\n * @param {import(\"../proj/Projection.js\").default} projection Projection.\n * @param {number} z Zoom level.\n * @param {import(\"../TileRange.js\").default} tileRange Tile range.\n * @param {function(import(\"../Tile.js\").default):(boolean|void)} callback Called with each\n * loaded tile. If the callback returns `false`, the tile will not be\n * considered loaded.\n * @return {boolean} The tile range is fully covered with loaded tiles.\n */\n forEachLoadedTile(projection, z, tileRange, callback) {\n const tileCache = this.getTileCacheForProjection(projection);\n if (!tileCache) {\n return false;\n }\n\n let covered = true;\n let tile, tileCoordKey, loaded;\n for (let x = tileRange.minX; x <= tileRange.maxX; ++x) {\n for (let y = tileRange.minY; y <= tileRange.maxY; ++y) {\n tileCoordKey = getKeyZXY(z, x, y);\n loaded = false;\n if (tileCache.containsKey(tileCoordKey)) {\n tile = /** @type {!import(\"../Tile.js\").default} */ (\n tileCache.get(tileCoordKey)\n );\n loaded = tile.getState() === TileState.LOADED;\n if (loaded) {\n loaded = callback(tile) !== false;\n }\n }\n if (!loaded) {\n covered = false;\n }\n }\n }\n return covered;\n }\n\n /**\n * @param {import(\"../proj/Projection.js\").default} projection Projection.\n * @return {number} Gutter.\n */\n getGutterForProjection(projection) {\n return 0;\n }\n\n /**\n * Return the key to be used for all tiles in the source.\n * @return {string} The key for all tiles.\n */\n getKey() {\n return this.key_;\n }\n\n /**\n * Set the value to be used as the key for all tiles in the source.\n * @param {string} key The key for tiles.\n * @protected\n */\n setKey(key) {\n if (this.key_ !== key) {\n this.key_ = key;\n this.changed();\n }\n }\n\n /**\n * @param {import(\"../proj/Projection.js\").default} projection Projection.\n * @return {boolean} Opaque.\n */\n getOpaque(projection) {\n return this.opaque_;\n }\n\n /**\n * @param {import(\"../proj/Projection\").default} [projection] Projection.\n * @return {Array<number>|null} Resolutions.\n */\n getResolutions(projection) {\n const tileGrid = projection\n ? this.getTileGridForProjection(projection)\n : this.tileGrid;\n if (!tileGrid) {\n return null;\n }\n return tileGrid.getResolutions();\n }\n\n /**\n * @abstract\n * @param {number} z Tile coordinate z.\n * @param {number} x Tile coordinate x.\n * @param {number} y Tile coordinate y.\n * @param {number} pixelRatio Pixel ratio.\n * @param {import(\"../proj/Projection.js\").default} projection Projection.\n * @return {!import(\"../Tile.js\").default} Tile.\n */\n getTile(z, x, y, pixelRatio, projection) {\n return abstract();\n }\n\n /**\n * Return the tile grid of the tile source.\n * @return {import(\"../tilegrid/TileGrid.js\").default|null} Tile grid.\n * @api\n */\n getTileGrid() {\n return this.tileGrid;\n }\n\n /**\n * @param {import(\"../proj/Projection.js\").default} projection Projection.\n * @return {!import(\"../tilegrid/TileGrid.js\").default} Tile grid.\n */\n getTileGridForProjection(projection) {\n if (!this.tileGrid) {\n return getTileGridForProjection(projection);\n }\n return this.tileGrid;\n }\n\n /**\n * @param {import(\"../proj/Projection.js\").default} projection Projection.\n * @return {import(\"../TileCache.js\").default} Tile cache.\n * @protected\n */\n getTileCacheForProjection(projection) {\n const sourceProjection = this.getProjection();\n assert(\n sourceProjection === null || equivalent(sourceProjection, projection),\n 68 // A VectorTile source can only be rendered if it has a projection compatible with the view projection.\n );\n return this.tileCache;\n }\n\n /**\n * Get the tile pixel ratio for this source. Subclasses may override this\n * method, which is meant to return a supported pixel ratio that matches the\n * provided `pixelRatio` as close as possible.\n * @param {number} pixelRatio Pixel ratio.\n * @return {number} Tile pixel ratio.\n */\n getTilePixelRatio(pixelRatio) {\n return this.tilePixelRatio_;\n }\n\n /**\n * @param {number} z Z.\n * @param {number} pixelRatio Pixel ratio.\n * @param {import(\"../proj/Projection.js\").default} projection Projection.\n * @return {import(\"../size.js\").Size} Tile size.\n */\n getTilePixelSize(z, pixelRatio, projection) {\n const tileGrid = this.getTileGridForProjection(projection);\n const tilePixelRatio = this.getTilePixelRatio(pixelRatio);\n const tileSize = toSize(tileGrid.getTileSize(z), this.tmpSize);\n if (tilePixelRatio == 1) {\n return tileSize;\n }\n return scaleSize(tileSize, tilePixelRatio, this.tmpSize);\n }\n\n /**\n * Returns a tile coordinate wrapped around the x-axis. When the tile coordinate\n * is outside the resolution and extent range of the tile grid, `null` will be\n * returned.\n * @param {import(\"../tilecoord.js\").TileCoord} tileCoord Tile coordinate.\n * @param {import(\"../proj/Projection.js\").default} [projection] Projection.\n * @return {import(\"../tilecoord.js\").TileCoord} Tile coordinate to be passed to the tileUrlFunction or\n * null if no tile URL should be created for the passed `tileCoord`.\n */\n getTileCoordForTileUrlFunction(tileCoord, projection) {\n projection = projection !== undefined ? projection : this.getProjection();\n const tileGrid = this.getTileGridForProjection(projection);\n if (this.getWrapX() && projection.isGlobal()) {\n tileCoord = wrapX(tileGrid, tileCoord, projection);\n }\n return withinExtentAndZ(tileCoord, tileGrid) ? tileCoord : null;\n }\n\n /**\n * Remove all cached tiles from the source. The next render cycle will fetch new tiles.\n * @api\n */\n clear() {\n this.tileCache.clear();\n }\n\n refresh() {\n this.clear();\n super.refresh();\n }\n\n /**\n * Increases the cache size if needed\n * @param {number} tileCount Minimum number of tiles needed.\n * @param {import(\"../proj/Projection.js\").default} projection Projection.\n */\n updateCacheSize(tileCount, projection) {\n const tileCache = this.getTileCacheForProjection(projection);\n if (tileCount > tileCache.highWaterMark) {\n tileCache.highWaterMark = tileCount;\n }\n }\n\n /**\n * Marks a tile coord as being used, without triggering a load.\n * @abstract\n * @param {number} z Tile coordinate z.\n * @param {number} x Tile coordinate x.\n * @param {number} y Tile coordinate y.\n * @param {import(\"../proj/Projection.js\").default} projection Projection.\n */\n useTile(z, x, y, projection) {}\n}\n\n/**\n * @classdesc\n * Events emitted by {@link module:ol/source/Tile~TileSource} instances are instances of this\n * type.\n */\nexport class TileSourceEvent extends Event {\n /**\n * @param {string} type Type.\n * @param {import(\"../Tile.js\").default} tile The tile.\n */\n constructor(type, tile) {\n super(type);\n\n /**\n * The tile related to the event.\n * @type {import(\"../Tile.js\").default}\n * @api\n */\n this.tile = tile;\n }\n}\n\nexport default TileSource;\n","/**\n * @module ol/tileurlfunction\n */\nimport {assert} from './asserts.js';\nimport {modulo} from './math.js';\nimport {hash as tileCoordHash} from './tilecoord.js';\n\n/**\n * @param {string} template Template.\n * @param {import(\"./tilegrid/TileGrid.js\").default} tileGrid Tile grid.\n * @return {import(\"./Tile.js\").UrlFunction} Tile URL function.\n */\nexport function createFromTemplate(template, tileGrid) {\n const zRegEx = /\\{z\\}/g;\n const xRegEx = /\\{x\\}/g;\n const yRegEx = /\\{y\\}/g;\n const dashYRegEx = /\\{-y\\}/g;\n return (\n /**\n * @param {import(\"./tilecoord.js\").TileCoord} tileCoord Tile Coordinate.\n * @param {number} pixelRatio Pixel ratio.\n * @param {import(\"./proj/Projection.js\").default} projection Projection.\n * @return {string|undefined} Tile URL.\n */\n function (tileCoord, pixelRatio, projection) {\n if (!tileCoord) {\n return undefined;\n }\n return template\n .replace(zRegEx, tileCoord[0].toString())\n .replace(xRegEx, tileCoord[1].toString())\n .replace(yRegEx, tileCoord[2].toString())\n .replace(dashYRegEx, function () {\n const z = tileCoord[0];\n const range = tileGrid.getFullTileRange(z);\n assert(range, 55); // The {-y} placeholder requires a tile grid with extent\n const y = range.getHeight() - tileCoord[2] - 1;\n return y.toString();\n });\n }\n );\n}\n\n/**\n * @param {Array<string>} templates Templates.\n * @param {import(\"./tilegrid/TileGrid.js\").default} tileGrid Tile grid.\n * @return {import(\"./Tile.js\").UrlFunction} Tile URL function.\n */\nexport function createFromTemplates(templates, tileGrid) {\n const len = templates.length;\n const tileUrlFunctions = new Array(len);\n for (let i = 0; i < len; ++i) {\n tileUrlFunctions[i] = createFromTemplate(templates[i], tileGrid);\n }\n return createFromTileUrlFunctions(tileUrlFunctions);\n}\n\n/**\n * @param {Array<import(\"./Tile.js\").UrlFunction>} tileUrlFunctions Tile URL Functions.\n * @return {import(\"./Tile.js\").UrlFunction} Tile URL function.\n */\nexport function createFromTileUrlFunctions(tileUrlFunctions) {\n if (tileUrlFunctions.length === 1) {\n return tileUrlFunctions[0];\n }\n return (\n /**\n * @param {import(\"./tilecoord.js\").TileCoord} tileCoord Tile Coordinate.\n * @param {number} pixelRatio Pixel ratio.\n * @param {import(\"./proj/Projection.js\").default} projection Projection.\n * @return {string|undefined} Tile URL.\n */\n function (tileCoord, pixelRatio, projection) {\n if (!tileCoord) {\n return undefined;\n }\n const h = tileCoordHash(tileCoord);\n const index = modulo(h, tileUrlFunctions.length);\n return tileUrlFunctions[index](tileCoord, pixelRatio, projection);\n }\n );\n}\n\n/**\n * @param {import(\"./tilecoord.js\").TileCoord} tileCoord Tile coordinate.\n * @param {number} pixelRatio Pixel ratio.\n * @param {import(\"./proj/Projection.js\").default} projection Projection.\n * @return {string|undefined} Tile URL.\n */\nexport function nullTileUrlFunction(tileCoord, pixelRatio, projection) {\n return undefined;\n}\n\n/**\n * @param {string} url URL.\n * @return {Array<string>} Array of urls.\n */\nexport function expandUrl(url) {\n const urls = [];\n let match = /\\{([a-z])-([a-z])\\}/.exec(url);\n if (match) {\n // char range\n const startCharCode = match[1].charCodeAt(0);\n const stopCharCode = match[2].charCodeAt(0);\n let charCode;\n for (charCode = startCharCode; charCode <= stopCharCode; ++charCode) {\n urls.push(url.replace(match[0], String.fromCharCode(charCode)));\n }\n return urls;\n }\n match = /\\{(\\d+)-(\\d+)\\}/.exec(url);\n if (match) {\n // number range\n const stop = parseInt(match[2], 10);\n for (let i = parseInt(match[1], 10); i <= stop; i++) {\n urls.push(url.replace(match[0], i.toString()));\n }\n return urls;\n }\n urls.push(url);\n return urls;\n}\n","/**\n * @module ol/source/UrlTile\n */\nimport TileEventType from './TileEventType.js';\nimport TileSource, {TileSourceEvent} from './Tile.js';\nimport TileState from '../TileState.js';\nimport {createFromTemplates, expandUrl} from '../tileurlfunction.js';\nimport {getKeyZXY} from '../tilecoord.js';\nimport {getUid} from '../util.js';\n\n/**\n * @typedef {Object} Options\n * @property {import(\"./Source.js\").AttributionLike} [attributions] Attributions.\n * @property {boolean} [attributionsCollapsible=true] Attributions are collapsible.\n * @property {number} [cacheSize] Cache size.\n * @property {boolean} [opaque=false] Whether the layer is opaque.\n * @property {import(\"../proj.js\").ProjectionLike} [projection] Projection.\n * @property {import(\"./Source.js\").State} [state] State.\n * @property {import(\"../tilegrid/TileGrid.js\").default} [tileGrid] TileGrid.\n * @property {import(\"../Tile.js\").LoadFunction} tileLoadFunction TileLoadFunction.\n * @property {number} [tilePixelRatio] TilePixelRatio.\n * @property {import(\"../Tile.js\").UrlFunction} [tileUrlFunction] TileUrlFunction.\n * @property {string} [url] Url.\n * @property {Array<string>} [urls] Urls.\n * @property {boolean} [wrapX=true] WrapX.\n * @property {number} [transition] Transition.\n * @property {string} [key] Key.\n * @property {number|import(\"../array.js\").NearestDirectionFunction} [zDirection=0] ZDirection.\n * @property {boolean} [interpolate=false] Use interpolated values when resampling. By default,\n * the nearest neighbor is used when resampling.\n */\n\n/**\n * @classdesc\n * Base class for sources providing tiles divided into a tile grid over http.\n *\n * @fires import(\"./Tile.js\").TileSourceEvent\n */\nclass UrlTile extends TileSource {\n /**\n * @param {Options} options Image tile options.\n */\n constructor(options) {\n super({\n attributions: options.attributions,\n cacheSize: options.cacheSize,\n opaque: options.opaque,\n projection: options.projection,\n state: options.state,\n tileGrid: options.tileGrid,\n tilePixelRatio: options.tilePixelRatio,\n wrapX: options.wrapX,\n transition: options.transition,\n interpolate: options.interpolate,\n key: options.key,\n attributionsCollapsible: options.attributionsCollapsible,\n zDirection: options.zDirection,\n });\n\n /**\n * @private\n * @type {boolean}\n */\n this.generateTileUrlFunction_ =\n this.tileUrlFunction === UrlTile.prototype.tileUrlFunction;\n\n /**\n * @protected\n * @type {import(\"../Tile.js\").LoadFunction}\n */\n this.tileLoadFunction = options.tileLoadFunction;\n\n if (options.tileUrlFunction) {\n this.tileUrlFunction = options.tileUrlFunction;\n }\n\n /**\n * @protected\n * @type {!Array<string>|null}\n */\n this.urls = null;\n\n if (options.urls) {\n this.setUrls(options.urls);\n } else if (options.url) {\n this.setUrl(options.url);\n }\n\n /**\n * @private\n * @type {!Object<string, boolean>}\n */\n this.tileLoadingKeys_ = {};\n }\n\n /**\n * Return the tile load function of the source.\n * @return {import(\"../Tile.js\").LoadFunction} TileLoadFunction\n * @api\n */\n getTileLoadFunction() {\n return this.tileLoadFunction;\n }\n\n /**\n * Return the tile URL function of the source.\n * @return {import(\"../Tile.js\").UrlFunction} TileUrlFunction\n * @api\n */\n getTileUrlFunction() {\n return Object.getPrototypeOf(this).tileUrlFunction === this.tileUrlFunction\n ? this.tileUrlFunction.bind(this)\n : this.tileUrlFunction;\n }\n\n /**\n * Return the URLs used for this source.\n * When a tileUrlFunction is used instead of url or urls,\n * null will be returned.\n * @return {!Array<string>|null} URLs.\n * @api\n */\n getUrls() {\n return this.urls;\n }\n\n /**\n * Handle tile change events.\n * @param {import(\"../events/Event.js\").default} event Event.\n * @protected\n */\n handleTileChange(event) {\n const tile = /** @type {import(\"../Tile.js\").default} */ (event.target);\n const uid = getUid(tile);\n const tileState = tile.getState();\n let type;\n if (tileState == TileState.LOADING) {\n this.tileLoadingKeys_[uid] = true;\n type = TileEventType.TILELOADSTART;\n } else if (uid in this.tileLoadingKeys_) {\n delete this.tileLoadingKeys_[uid];\n type =\n tileState == TileState.ERROR\n ? TileEventType.TILELOADERROR\n : tileState == TileState.LOADED\n ? TileEventType.TILELOADEND\n : undefined;\n }\n if (type != undefined) {\n this.dispatchEvent(new TileSourceEvent(type, tile));\n }\n }\n\n /**\n * Set the tile load function of the source.\n * @param {import(\"../Tile.js\").LoadFunction} tileLoadFunction Tile load function.\n * @api\n */\n setTileLoadFunction(tileLoadFunction) {\n this.tileCache.clear();\n this.tileLoadFunction = tileLoadFunction;\n this.changed();\n }\n\n /**\n * Set the tile URL function of the source.\n * @param {import(\"../Tile.js\").UrlFunction} tileUrlFunction Tile URL function.\n * @param {string} [key] Optional new tile key for the source.\n * @api\n */\n setTileUrlFunction(tileUrlFunction, key) {\n this.tileUrlFunction = tileUrlFunction;\n this.tileCache.pruneExceptNewestZ();\n if (typeof key !== 'undefined') {\n this.setKey(key);\n } else {\n this.changed();\n }\n }\n\n /**\n * Set the URL to use for requests.\n * @param {string} url URL.\n * @api\n */\n setUrl(url) {\n const urls = expandUrl(url);\n this.urls = urls;\n this.setUrls(urls);\n }\n\n /**\n * Set the URLs to use for requests.\n * @param {Array<string>} urls URLs.\n * @api\n */\n setUrls(urls) {\n this.urls = urls;\n const key = urls.join('\\n');\n if (this.generateTileUrlFunction_) {\n this.setTileUrlFunction(createFromTemplates(urls, this.tileGrid), key);\n } else {\n this.setKey(key);\n }\n }\n\n /**\n * @param {import(\"../tilecoord.js\").TileCoord} tileCoord Tile coordinate.\n * @param {number} pixelRatio Pixel ratio.\n * @param {import(\"../proj/Projection.js\").default} projection Projection.\n * @return {string|undefined} Tile URL.\n */\n tileUrlFunction(tileCoord, pixelRatio, projection) {\n return undefined;\n }\n\n /**\n * Marks a tile coord as being used, without triggering a load.\n * @param {number} z Tile coordinate z.\n * @param {number} x Tile coordinate x.\n * @param {number} y Tile coordinate y.\n */\n useTile(z, x, y) {\n const tileCoordKey = getKeyZXY(z, x, y);\n if (this.tileCache.containsKey(tileCoordKey)) {\n this.tileCache.get(tileCoordKey);\n }\n }\n}\n\nexport default UrlTile;\n","/**\n * @module ol/source/TileImage\n */\nimport EventType from '../events/EventType.js';\nimport ImageTile from '../ImageTile.js';\nimport ReprojTile from '../reproj/Tile.js';\nimport TileCache from '../TileCache.js';\nimport TileState from '../TileState.js';\nimport UrlTile from './UrlTile.js';\nimport {equivalent, get as getProjection} from '../proj.js';\nimport {getKey, getKeyZXY} from '../tilecoord.js';\nimport {getForProjection as getTileGridForProjection} from '../tilegrid.js';\nimport {getUid} from '../util.js';\n\n/**\n * @typedef {Object} Options\n * @property {import(\"./Source.js\").AttributionLike} [attributions] Attributions.\n * @property {boolean} [attributionsCollapsible=true] Attributions are collapsible.\n * @property {number} [cacheSize] Initial tile cache size. Will auto-grow to hold at least the number of tiles in the viewport.\n * @property {null|string} [crossOrigin] The `crossOrigin` attribute for loaded images. Note that\n * you must provide a `crossOrigin` value if you want to access pixel data with the Canvas renderer.\n * See https://developer.mozilla.org/en-US/docs/Web/HTML/CORS_enabled_image for more detail.\n * @property {boolean} [interpolate=true] Use interpolated values when resampling. By default,\n * linear interpolation is used when resampling. Set to false to use the nearest neighbor instead.\n * @property {boolean} [opaque=false] Whether the layer is opaque.\n * @property {import(\"../proj.js\").ProjectionLike} [projection] Projection. Default is the view projection.\n * @property {number} [reprojectionErrorThreshold=0.5] Maximum allowed reprojection error (in pixels).\n * Higher values can increase reprojection performance, but decrease precision.\n * @property {import(\"./Source.js\").State} [state] Source state.\n * @property {typeof import(\"../ImageTile.js\").default} [tileClass] Class used to instantiate image tiles.\n * Default is {@link module:ol/ImageTile~ImageTile}.\n * @property {import(\"../tilegrid/TileGrid.js\").default} [tileGrid] Tile grid.\n * @property {import(\"../Tile.js\").LoadFunction} [tileLoadFunction] Optional function to load a tile given a URL. The default is\n * ```js\n * function(imageTile, src) {\n * imageTile.getImage().src = src;\n * };\n * ```\n * @property {number} [tilePixelRatio=1] The pixel ratio used by the tile service. For example, if the tile\n * service advertizes 256px by 256px tiles but actually sends 512px\n * by 512px images (for retina/hidpi devices) then `tilePixelRatio`\n * should be set to `2`.\n * @property {import(\"../Tile.js\").UrlFunction} [tileUrlFunction] Optional function to get tile URL given a tile coordinate and the projection.\n * @property {string} [url] URL template. Must include `{x}`, `{y}` or `{-y}`, and `{z}` placeholders.\n * A `{?-?}` template pattern, for example `subdomain{a-f}.domain.com`, may be\n * used instead of defining each one separately in the `urls` option.\n * @property {Array<string>} [urls] An array of URL templates.\n * @property {boolean} [wrapX] Whether to wrap the world horizontally. The default, is to\n * request out-of-bounds tiles from the server. When set to `false`, only one\n * world will be rendered. When set to `true`, tiles will be requested for one\n * world only, but they will be wrapped horizontally to render multiple worlds.\n * @property {number} [transition] Duration of the opacity transition for rendering.\n * To disable the opacity transition, pass `transition: 0`.\n * @property {string} [key] Optional tile key for proper cache fetching\n * @property {number|import(\"../array.js\").NearestDirectionFunction} [zDirection=0]\n * Choose whether to use tiles with a higher or lower zoom level when between integer\n * zoom levels. See {@link module:ol/tilegrid/TileGrid~TileGrid#getZForResolution}.\n */\n\n/**\n * @classdesc\n * Base class for sources providing images divided into a tile grid.\n *\n * @fires import(\"./Tile.js\").TileSourceEvent\n * @api\n */\nclass TileImage extends UrlTile {\n /**\n * @param {!Options} options Image tile options.\n */\n constructor(options) {\n super({\n attributions: options.attributions,\n cacheSize: options.cacheSize,\n opaque: options.opaque,\n projection: options.projection,\n state: options.state,\n tileGrid: options.tileGrid,\n tileLoadFunction: options.tileLoadFunction\n ? options.tileLoadFunction\n : defaultTileLoadFunction,\n tilePixelRatio: options.tilePixelRatio,\n tileUrlFunction: options.tileUrlFunction,\n url: options.url,\n urls: options.urls,\n wrapX: options.wrapX,\n transition: options.transition,\n interpolate:\n options.interpolate !== undefined ? options.interpolate : true,\n key: options.key,\n attributionsCollapsible: options.attributionsCollapsible,\n zDirection: options.zDirection,\n });\n\n /**\n * @protected\n * @type {?string}\n */\n this.crossOrigin =\n options.crossOrigin !== undefined ? options.crossOrigin : null;\n\n /**\n * @protected\n * @type {typeof ImageTile}\n */\n this.tileClass =\n options.tileClass !== undefined ? options.tileClass : ImageTile;\n\n /**\n * @protected\n * @type {!Object<string, TileCache>}\n */\n this.tileCacheForProjection = {};\n\n /**\n * @protected\n * @type {!Object<string, import(\"../tilegrid/TileGrid.js\").default>}\n */\n this.tileGridForProjection = {};\n\n /**\n * @private\n * @type {number|undefined}\n */\n this.reprojectionErrorThreshold_ = options.reprojectionErrorThreshold;\n\n /**\n * @private\n * @type {boolean}\n */\n this.renderReprojectionEdges_ = false;\n }\n\n /**\n * @return {boolean} Can expire cache.\n */\n canExpireCache() {\n if (this.tileCache.canExpireCache()) {\n return true;\n }\n for (const key in this.tileCacheForProjection) {\n if (this.tileCacheForProjection[key].canExpireCache()) {\n return true;\n }\n }\n\n return false;\n }\n\n /**\n * @param {import(\"../proj/Projection.js\").default} projection Projection.\n * @param {!Object<string, boolean>} usedTiles Used tiles.\n */\n expireCache(projection, usedTiles) {\n const usedTileCache = this.getTileCacheForProjection(projection);\n\n this.tileCache.expireCache(\n this.tileCache == usedTileCache ? usedTiles : {}\n );\n for (const id in this.tileCacheForProjection) {\n const tileCache = this.tileCacheForProjection[id];\n tileCache.expireCache(tileCache == usedTileCache ? usedTiles : {});\n }\n }\n\n /**\n * @param {import(\"../proj/Projection.js\").default} projection Projection.\n * @return {number} Gutter.\n */\n getGutterForProjection(projection) {\n if (\n this.getProjection() &&\n projection &&\n !equivalent(this.getProjection(), projection)\n ) {\n return 0;\n }\n return this.getGutter();\n }\n\n /**\n * @return {number} Gutter.\n */\n getGutter() {\n return 0;\n }\n\n /**\n * Return the key to be used for all tiles in the source.\n * @return {string} The key for all tiles.\n */\n getKey() {\n let key = super.getKey();\n if (!this.getInterpolate()) {\n key += ':disable-interpolation';\n }\n return key;\n }\n\n /**\n * @param {import(\"../proj/Projection.js\").default} projection Projection.\n * @return {boolean} Opaque.\n */\n getOpaque(projection) {\n if (\n this.getProjection() &&\n projection &&\n !equivalent(this.getProjection(), projection)\n ) {\n return false;\n }\n return super.getOpaque(projection);\n }\n\n /**\n * @param {import(\"../proj/Projection.js\").default} projection Projection.\n * @return {!import(\"../tilegrid/TileGrid.js\").default} Tile grid.\n */\n getTileGridForProjection(projection) {\n const thisProj = this.getProjection();\n if (this.tileGrid && (!thisProj || equivalent(thisProj, projection))) {\n return this.tileGrid;\n }\n const projKey = getUid(projection);\n if (!(projKey in this.tileGridForProjection)) {\n this.tileGridForProjection[projKey] =\n getTileGridForProjection(projection);\n }\n return this.tileGridForProjection[projKey];\n }\n\n /**\n * @param {import(\"../proj/Projection.js\").default} projection Projection.\n * @return {import(\"../TileCache.js\").default} Tile cache.\n */\n getTileCacheForProjection(projection) {\n const thisProj = this.getProjection();\n if (!thisProj || equivalent(thisProj, projection)) {\n return this.tileCache;\n }\n const projKey = getUid(projection);\n if (!(projKey in this.tileCacheForProjection)) {\n this.tileCacheForProjection[projKey] = new TileCache(\n this.tileCache.highWaterMark\n );\n }\n return this.tileCacheForProjection[projKey];\n }\n\n /**\n * @param {number} z Tile coordinate z.\n * @param {number} x Tile coordinate x.\n * @param {number} y Tile coordinate y.\n * @param {number} pixelRatio Pixel ratio.\n * @param {import(\"../proj/Projection.js\").default} projection Projection.\n * @param {string} key The key set on the tile.\n * @return {!ImageTile} Tile.\n * @private\n */\n createTile_(z, x, y, pixelRatio, projection, key) {\n const tileCoord = [z, x, y];\n const urlTileCoord = this.getTileCoordForTileUrlFunction(\n tileCoord,\n projection\n );\n const tileUrl = urlTileCoord\n ? this.tileUrlFunction(urlTileCoord, pixelRatio, projection)\n : undefined;\n const tile = new this.tileClass(\n tileCoord,\n tileUrl !== undefined ? TileState.IDLE : TileState.EMPTY,\n tileUrl !== undefined ? tileUrl : '',\n this.crossOrigin,\n this.tileLoadFunction,\n this.tileOptions\n );\n tile.key = key;\n tile.addEventListener(EventType.CHANGE, this.handleTileChange.bind(this));\n return tile;\n }\n\n /**\n * @param {number} z Tile coordinate z.\n * @param {number} x Tile coordinate x.\n * @param {number} y Tile coordinate y.\n * @param {number} pixelRatio Pixel ratio.\n * @param {import(\"../proj/Projection.js\").default} projection Projection.\n * @return {!(ImageTile|ReprojTile)} Tile.\n */\n getTile(z, x, y, pixelRatio, projection) {\n const sourceProjection = this.getProjection();\n if (\n !sourceProjection ||\n !projection ||\n equivalent(sourceProjection, projection)\n ) {\n return this.getTileInternal(\n z,\n x,\n y,\n pixelRatio,\n sourceProjection || projection\n );\n }\n const cache = this.getTileCacheForProjection(projection);\n const tileCoord = [z, x, y];\n let tile;\n const tileCoordKey = getKey(tileCoord);\n if (cache.containsKey(tileCoordKey)) {\n tile = cache.get(tileCoordKey);\n }\n const key = this.getKey();\n if (tile && tile.key == key) {\n return tile;\n }\n const sourceTileGrid = this.getTileGridForProjection(sourceProjection);\n const targetTileGrid = this.getTileGridForProjection(projection);\n const wrappedTileCoord = this.getTileCoordForTileUrlFunction(\n tileCoord,\n projection\n );\n const newTile = new ReprojTile(\n sourceProjection,\n sourceTileGrid,\n projection,\n targetTileGrid,\n tileCoord,\n wrappedTileCoord,\n this.getTilePixelRatio(pixelRatio),\n this.getGutter(),\n (z, x, y, pixelRatio) =>\n this.getTileInternal(z, x, y, pixelRatio, sourceProjection),\n this.reprojectionErrorThreshold_,\n this.renderReprojectionEdges_,\n this.getInterpolate()\n );\n newTile.key = key;\n\n if (tile) {\n newTile.interimTile = tile;\n newTile.refreshInterimChain();\n cache.replace(tileCoordKey, newTile);\n } else {\n cache.set(tileCoordKey, newTile);\n }\n return newTile;\n }\n\n /**\n * @param {number} z Tile coordinate z.\n * @param {number} x Tile coordinate x.\n * @param {number} y Tile coordinate y.\n * @param {number} pixelRatio Pixel ratio.\n * @param {!import(\"../proj/Projection.js\").default} projection Projection.\n * @return {!ImageTile} Tile.\n * @protected\n */\n getTileInternal(z, x, y, pixelRatio, projection) {\n let tile = null;\n const tileCoordKey = getKeyZXY(z, x, y);\n const key = this.getKey();\n if (!this.tileCache.containsKey(tileCoordKey)) {\n tile = this.createTile_(z, x, y, pixelRatio, projection, key);\n this.tileCache.set(tileCoordKey, tile);\n } else {\n tile = this.tileCache.get(tileCoordKey);\n if (tile.key != key) {\n // The source's params changed. If the tile has an interim tile and if we\n // can use it then we use it. Otherwise we create a new tile. In both\n // cases we attempt to assign an interim tile to the new tile.\n const interimTile = tile;\n tile = this.createTile_(z, x, y, pixelRatio, projection, key);\n\n //make the new tile the head of the list,\n if (interimTile.getState() == TileState.IDLE) {\n //the old tile hasn't begun loading yet, and is now outdated, so we can simply discard it\n tile.interimTile = interimTile.interimTile;\n } else {\n tile.interimTile = interimTile;\n }\n tile.refreshInterimChain();\n this.tileCache.replace(tileCoordKey, tile);\n }\n }\n return tile;\n }\n\n /**\n * Sets whether to render reprojection edges or not (usually for debugging).\n * @param {boolean} render Render the edges.\n * @api\n */\n setRenderReprojectionEdges(render) {\n if (this.renderReprojectionEdges_ == render) {\n return;\n }\n this.renderReprojectionEdges_ = render;\n for (const id in this.tileCacheForProjection) {\n this.tileCacheForProjection[id].clear();\n }\n this.changed();\n }\n\n /**\n * Sets the tile grid to use when reprojecting the tiles to the given\n * projection instead of the default tile grid for the projection.\n *\n * This can be useful when the default tile grid cannot be created\n * (e.g. projection has no extent defined) or\n * for optimization reasons (custom tile size, resolutions, ...).\n *\n * @param {import(\"../proj.js\").ProjectionLike} projection Projection.\n * @param {import(\"../tilegrid/TileGrid.js\").default} tilegrid Tile grid to use for the projection.\n * @api\n */\n setTileGridForProjection(projection, tilegrid) {\n const proj = getProjection(projection);\n if (proj) {\n const projKey = getUid(proj);\n if (!(projKey in this.tileGridForProjection)) {\n this.tileGridForProjection[projKey] = tilegrid;\n }\n }\n }\n\n clear() {\n super.clear();\n for (const id in this.tileCacheForProjection) {\n this.tileCacheForProjection[id].clear();\n }\n }\n}\n\n/**\n * @param {ImageTile} imageTile Image tile.\n * @param {string} src Source.\n */\nfunction defaultTileLoadFunction(imageTile, src) {\n /** @type {HTMLImageElement|HTMLVideoElement} */ (imageTile.getImage()).src =\n src;\n}\n\nexport default TileImage;\n","/**\n * @module ol/source/XYZ\n */\n\nimport TileImage from './TileImage.js';\nimport {createXYZ, extentFromProjection} from '../tilegrid.js';\n\n/**\n * @typedef {Object} Options\n * @property {import(\"./Source.js\").AttributionLike} [attributions] Attributions.\n * @property {boolean} [attributionsCollapsible=true] Attributions are collapsible.\n * @property {number} [cacheSize] Initial tile cache size. Will auto-grow to hold at least the number of tiles in the viewport.\n * @property {null|string} [crossOrigin] The `crossOrigin` attribute for loaded images. Note that\n * you must provide a `crossOrigin` value if you want to access pixel data with the Canvas renderer.\n * See https://developer.mozilla.org/en-US/docs/Web/HTML/CORS_enabled_image for more detail.\n * @property {boolean} [interpolate=true] Use interpolated values when resampling. By default,\n * linear interpolation is used when resampling. Set to false to use the nearest neighbor instead.\n * @property {boolean} [opaque=false] Whether the layer is opaque.\n * @property {import(\"../proj.js\").ProjectionLike} [projection='EPSG:3857'] Projection.\n * @property {number} [reprojectionErrorThreshold=0.5] Maximum allowed reprojection error (in pixels).\n * Higher values can increase reprojection performance, but decrease precision.\n * @property {number} [maxZoom=42] Optional max zoom level. Not used if `tileGrid` is provided.\n * @property {number} [minZoom=0] Optional min zoom level. Not used if `tileGrid` is provided.\n * @property {number} [maxResolution] Optional tile grid resolution at level zero. Not used if `tileGrid` is provided.\n * @property {import(\"../tilegrid/TileGrid.js\").default} [tileGrid] Tile grid.\n * @property {import(\"../Tile.js\").LoadFunction} [tileLoadFunction] Optional function to load a tile given a URL. The default is\n * ```js\n * function(imageTile, src) {\n * imageTile.getImage().src = src;\n * };\n * ```\n * @property {number} [tilePixelRatio=1] The pixel ratio used by the tile service.\n * For example, if the tile service advertizes 256px by 256px tiles but actually sends 512px\n * by 512px images (for retina/hidpi devices) then `tilePixelRatio`\n * should be set to `2`.\n * @property {number|import(\"../size.js\").Size} [tileSize=[256, 256]] The tile size used by the tile service.\n * Not used if `tileGrid` is provided.\n * @property {number} [gutter=0] The size in pixels of the gutter around image tiles to ignore.\n * This allows artifacts of rendering at tile edges to be ignored.\n * Supported images should be wider and taller than the tile size by a value of `2 x gutter`.\n * @property {import(\"../Tile.js\").UrlFunction} [tileUrlFunction] Optional function to get\n * tile URL given a tile coordinate and the projection.\n * Required if `url` or `urls` are not provided.\n * @property {string} [url] URL template. Must include `{x}`, `{y}` or `{-y}`,\n * and `{z}` placeholders. A `{?-?}` template pattern, for example `subdomain{a-f}.domain.com`,\n * may be used instead of defining each one separately in the `urls` option.\n * @property {Array<string>} [urls] An array of URL templates.\n * @property {boolean} [wrapX=true] Whether to wrap the world horizontally.\n * @property {number} [transition=250] Duration of the opacity transition for rendering.\n * To disable the opacity transition, pass `transition: 0`.\n * @property {number|import(\"../array.js\").NearestDirectionFunction} [zDirection=0]\n * Choose whether to use tiles with a higher or lower zoom level when between integer\n * zoom levels. See {@link module:ol/tilegrid/TileGrid~TileGrid#getZForResolution}.\n */\n\n/**\n * @classdesc\n * Layer source for tile data with URLs in a set XYZ format that are\n * defined in a URL template. By default, this follows the widely-used\n * Google grid where `x` 0 and `y` 0 are in the top left. Grids like\n * TMS where `x` 0 and `y` 0 are in the bottom left can be used by\n * using the `{-y}` placeholder in the URL template, so long as the\n * source does not have a custom tile grid. In this case\n * a `tileUrlFunction` can be used, such as:\n * ```js\n * tileUrlFunction: function(coordinate) {\n * return 'http://mapserver.com/' + coordinate[0] + '/' +\n * coordinate[1] + '/' + (-coordinate[2] - 1) + '.png';\n * }\n * ```\n * @api\n */\nclass XYZ extends TileImage {\n /**\n * @param {Options} [options] XYZ options.\n */\n constructor(options) {\n options = options || {};\n\n const projection =\n options.projection !== undefined ? options.projection : 'EPSG:3857';\n\n const tileGrid =\n options.tileGrid !== undefined\n ? options.tileGrid\n : createXYZ({\n extent: extentFromProjection(projection),\n maxResolution: options.maxResolution,\n maxZoom: options.maxZoom,\n minZoom: options.minZoom,\n tileSize: options.tileSize,\n });\n\n super({\n attributions: options.attributions,\n cacheSize: options.cacheSize,\n crossOrigin: options.crossOrigin,\n interpolate: options.interpolate,\n opaque: options.opaque,\n projection: projection,\n reprojectionErrorThreshold: options.reprojectionErrorThreshold,\n tileGrid: tileGrid,\n tileLoadFunction: options.tileLoadFunction,\n tilePixelRatio: options.tilePixelRatio,\n tileUrlFunction: options.tileUrlFunction,\n url: options.url,\n urls: options.urls,\n wrapX: options.wrapX !== undefined ? options.wrapX : true,\n transition: options.transition,\n attributionsCollapsible: options.attributionsCollapsible,\n zDirection: options.zDirection,\n });\n\n /**\n * @private\n * @type {number}\n */\n this.gutter_ = options.gutter !== undefined ? options.gutter : 0;\n }\n\n /**\n * @return {number} Gutter.\n */\n getGutter() {\n return this.gutter_;\n }\n}\n\nexport default XYZ;\n","import Map from 'ol/Map';\nimport TileLayer from 'ol/layer/Tile';\nimport XYZ from 'ol/source/XYZ';\n\nimport { MapLayerRegistryItem, MapLayerOptions, GrafanaTheme2, EventBus } from '@grafana/data';\n\n// https://carto.com/help/building-maps/basemap-list/\n\nexport enum LayerTheme {\n Auto = 'auto',\n Light = 'light',\n Dark = 'dark',\n}\n\nexport interface CartoConfig {\n theme?: LayerTheme;\n showLabels?: boolean;\n}\n\nexport const defaultCartoConfig: CartoConfig = {\n theme: LayerTheme.Auto,\n showLabels: true,\n};\n\nexport const carto: MapLayerRegistryItem<CartoConfig> = {\n id: 'carto',\n name: 'CARTO basemap',\n description: 'Add layer CARTO Raster basemaps',\n isBaseMap: true,\n defaultOptions: defaultCartoConfig,\n\n /**\n * Function that configures transformation and returns a transformer\n * @param options\n */\n create: async (map: Map, options: MapLayerOptions<CartoConfig>, eventBus: EventBus, theme: GrafanaTheme2) => ({\n init: () => {\n const cfg = { ...defaultCartoConfig, ...options.config };\n let style: string | undefined = cfg.theme;\n if (!style || style === LayerTheme.Auto) {\n style = theme.isDark ? 'dark' : 'light';\n }\n if (cfg.showLabels) {\n style += '_all';\n } else {\n style += '_nolabels';\n }\n return new TileLayer({\n source: new XYZ({\n attributions: `<a href=\"https://carto.com/attribution/\">© CARTO</a>`,\n url: `https://{1-4}.basemaps.cartocdn.com/${style}/{z}/{x}/{y}.png`,\n }),\n });\n },\n\n registerOptionsUI: (builder) => {\n builder\n .addRadio({\n path: 'config.theme',\n name: 'Theme',\n settings: {\n options: [\n { value: LayerTheme.Auto, label: 'Auto', description: 'Match grafana theme' },\n { value: LayerTheme.Light, label: 'Light' },\n { value: LayerTheme.Dark, label: 'Dark' },\n ],\n },\n defaultValue: defaultCartoConfig.theme!,\n })\n .addBooleanSwitch({\n path: 'config.showLabels',\n name: 'Show labels',\n description: '',\n defaultValue: defaultCartoConfig.showLabels,\n });\n },\n }),\n};\n\nexport const cartoLayers = [carto];\n","import Map from 'ol/Map';\nimport TileLayer from 'ol/layer/Tile';\nimport XYZ from 'ol/source/XYZ';\n\nimport { MapLayerRegistryItem, MapLayerOptions, GrafanaTheme2, EventBus } from '@grafana/data';\n\nexport interface XYZConfig {\n url: string;\n attribution: string;\n minZoom?: number;\n maxZoom?: number;\n}\n\nconst sampleURL = 'https://services.arcgisonline.com/ArcGIS/rest/services/World_Topo_Map/MapServer';\nexport const defaultXYZConfig: XYZConfig = {\n url: sampleURL + '/tile/{z}/{y}/{x}',\n attribution: `Tiles © <a href=\"${sampleURL}\">ArcGIS</a>`,\n};\n\nexport const xyzTiles: MapLayerRegistryItem<XYZConfig> = {\n id: 'xyz',\n name: 'XYZ Tile layer',\n description: 'Add map from a generic tile layer',\n isBaseMap: true,\n\n create: async (map: Map, options: MapLayerOptions<XYZConfig>, eventBus: EventBus, theme: GrafanaTheme2) => ({\n init: () => {\n const cfg = { ...options.config };\n if (!cfg.url) {\n cfg.url = defaultXYZConfig.url;\n cfg.attribution = cfg.attribution ?? defaultXYZConfig.attribution;\n }\n return new TileLayer({\n source: new XYZ({\n url: cfg.url,\n attributions: cfg.attribution, // singular?\n }),\n minZoom: cfg.minZoom,\n maxZoom: cfg.maxZoom,\n });\n },\n registerOptionsUI: (builder) => {\n builder\n .addTextInput({\n path: 'config.url',\n name: 'URL template',\n description: 'Must include {x}, {y} or {-y}, and {z} placeholders',\n settings: {\n placeholder: defaultXYZConfig.url,\n },\n })\n .addTextInput({\n path: 'config.attribution',\n name: 'Attribution',\n settings: {\n placeholder: defaultXYZConfig.attribution,\n },\n });\n },\n }),\n};\n\nexport const genericLayers = [xyzTiles];\n","import Map from 'ol/Map';\n\nimport { MapLayerRegistryItem, MapLayerOptions, GrafanaTheme2, RegistryItem, Registry, EventBus } from '@grafana/data';\n\nimport { xyzTiles, defaultXYZConfig, XYZConfig } from './generic';\n\ninterface PublicServiceItem extends RegistryItem {\n slug: string;\n}\n\nconst CUSTOM_SERVICE = 'custom';\nconst DEFAULT_SERVICE = 'streets';\n\nexport const publicServiceRegistry = new Registry<PublicServiceItem>(() => [\n {\n id: DEFAULT_SERVICE,\n name: 'World Street Map',\n slug: 'World_Street_Map',\n },\n {\n id: 'world-imagery',\n name: 'World Imagery',\n slug: 'World_Imagery',\n },\n {\n id: 'world-physical',\n name: 'World Physical',\n slug: 'World_Physical_Map',\n },\n {\n id: 'topo',\n name: 'Topographic',\n slug: 'World_Topo_Map',\n },\n {\n id: 'usa-topo',\n name: 'USA Topographic',\n slug: 'USA_Topo_Maps',\n },\n {\n id: 'ocean',\n name: 'World Ocean',\n slug: 'Ocean/World_Ocean_Base',\n },\n {\n id: CUSTOM_SERVICE,\n name: 'Custom MapServer',\n description: 'Use a custom MapServer with pre-cached values',\n slug: '',\n },\n]);\n\nexport interface ESRIXYZConfig extends XYZConfig {\n server: string;\n}\n\nexport const esriXYZTiles: MapLayerRegistryItem<ESRIXYZConfig> = {\n id: 'esri-xyz',\n name: 'ArcGIS MapServer',\n description: 'Add layer from an ESRI ArcGIS MapServer',\n isBaseMap: true,\n\n create: async (map: Map, options: MapLayerOptions<ESRIXYZConfig>, eventBus: EventBus, theme: GrafanaTheme2) => {\n const cfg = { ...options.config };\n const svc = publicServiceRegistry.getIfExists(cfg.server ?? DEFAULT_SERVICE)!;\n if (svc.id !== CUSTOM_SERVICE) {\n const base = 'https://services.arcgisonline.com/ArcGIS/rest/services/';\n cfg.url = `${base}${svc.slug}/MapServer/tile/{z}/{y}/{x}`;\n cfg.attribution = `Tiles © <a href=\"${base}${svc.slug}/MapServer\">ArcGIS</a>`;\n }\n const opts = { ...options, config: cfg as XYZConfig };\n return xyzTiles.create(map, opts, eventBus, theme).then((xyz) => {\n xyz.registerOptionsUI = (builder) => {\n builder\n .addSelect({\n path: 'config.server',\n name: 'Server instance',\n settings: {\n options: publicServiceRegistry.selectOptions().options,\n },\n })\n .addTextInput({\n path: 'config.url',\n name: 'URL template',\n description: 'Must include {x}, {y} or {-y}, and {z} placeholders',\n settings: {\n placeholder: defaultXYZConfig.url,\n },\n showIf: (cfg) => cfg.config?.server === CUSTOM_SERVICE,\n })\n .addTextInput({\n path: 'config.attribution',\n name: 'Attribution',\n settings: {\n placeholder: defaultXYZConfig.attribution,\n },\n showIf: (cfg) => cfg.config?.server === CUSTOM_SERVICE,\n });\n };\n return xyz;\n });\n },\n\n defaultOptions: {\n server: DEFAULT_SERVICE,\n },\n};\n\nexport const esriLayers = [esriXYZTiles];\n","/**\n * @module ol/source/OSM\n */\n\nimport XYZ from './XYZ.js';\n\n/**\n * The attribution containing a link to the OpenStreetMap Copyright and License\n * page.\n * @const\n * @type {string}\n * @api\n */\nexport const ATTRIBUTION =\n '© ' +\n '<a href=\"https://www.openstreetmap.org/copyright\" target=\"_blank\">OpenStreetMap</a> ' +\n 'contributors.';\n\n/**\n * @typedef {Object} Options\n * @property {import(\"./Source.js\").AttributionLike} [attributions] Attributions.\n * @property {number} [cacheSize] Initial tile cache size. Will auto-grow to hold at least the number of tiles in the viewport.\n * @property {null|string} [crossOrigin='anonymous'] The `crossOrigin` attribute for loaded images. Note that\n * you must provide a `crossOrigin` value if you want to access pixel data with the Canvas renderer.\n * See https://developer.mozilla.org/en-US/docs/Web/HTML/CORS_enabled_image for more detail.\n * @property {boolean} [interpolate=true] Use interpolated values when resampling. By default,\n * linear interpolation is used when resampling. Set to false to use the nearest neighbor instead.\n * @property {number} [maxZoom=19] Max zoom.\n * @property {boolean} [opaque=true] Whether the layer is opaque.\n * @property {number} [reprojectionErrorThreshold=0.5] Maximum allowed reprojection error (in pixels).\n * Higher values can increase reprojection performance, but decrease precision.\n * @property {import(\"../Tile.js\").LoadFunction} [tileLoadFunction] Optional function to load a tile given a URL. The default is\n * ```js\n * function(imageTile, src) {\n * imageTile.getImage().src = src;\n * };\n * ```\n * @property {number} [transition=250] Duration of the opacity transition for rendering.\n * To disable the opacity transition, pass `transition: 0`.\n * @property {string} [url='https://tile.openstreetmap.org/{z}/{x}/{y}.png'] URL template.\n * Must include `{x}`, `{y}` or `{-y}`, and `{z}` placeholders.\n * @property {boolean} [wrapX=true] Whether to wrap the world horizontally.\n * @property {number|import(\"../array.js\").NearestDirectionFunction} [zDirection=0]\n * Choose whether to use tiles with a higher or lower zoom level when between integer\n * zoom levels. See {@link module:ol/tilegrid/TileGrid~TileGrid#getZForResolution}.\n */\n\n/**\n * @classdesc\n * Layer source for the OpenStreetMap tile server.\n * @api\n */\nclass OSM extends XYZ {\n /**\n * @param {Options} [options] Open Street Map options.\n */\n constructor(options) {\n options = options || {};\n\n let attributions;\n if (options.attributions !== undefined) {\n attributions = options.attributions;\n } else {\n attributions = [ATTRIBUTION];\n }\n\n const crossOrigin =\n options.crossOrigin !== undefined ? options.crossOrigin : 'anonymous';\n\n const url =\n options.url !== undefined\n ? options.url\n : 'https://tile.openstreetmap.org/{z}/{x}/{y}.png';\n\n super({\n attributions: attributions,\n attributionsCollapsible: false,\n cacheSize: options.cacheSize,\n crossOrigin: crossOrigin,\n interpolate: options.interpolate,\n maxZoom: options.maxZoom !== undefined ? options.maxZoom : 19,\n opaque: options.opaque !== undefined ? options.opaque : true,\n reprojectionErrorThreshold: options.reprojectionErrorThreshold,\n tileLoadFunction: options.tileLoadFunction,\n transition: options.transition,\n url: url,\n wrapX: options.wrapX,\n zDirection: options.zDirection,\n });\n }\n}\n\nexport default OSM;\n","import { cartoLayers } from './carto';\nimport { esriLayers } from './esri';\nimport { genericLayers } from './generic';\nimport { osmLayers } from './osm';\n\n/**\n * Registry for layer handlers\n */\nexport const basemapLayers = [\n ...osmLayers,\n ...cartoLayers,\n ...esriLayers, // keep formatting\n ...genericLayers,\n];\n","import Map from 'ol/Map';\nimport TileLayer from 'ol/layer/Tile';\nimport OSM from 'ol/source/OSM';\n\nimport { MapLayerRegistryItem, MapLayerOptions, EventBus } from '@grafana/data';\n\nexport const standard: MapLayerRegistryItem = {\n id: 'osm-standard',\n name: 'Open Street Map',\n description: 'Add map from a collaborative free geographic world database',\n isBaseMap: true,\n\n /**\n * Function that configures transformation and returns a transformer\n * @param options\n */\n create: async (map: Map, options: MapLayerOptions, eventBus: EventBus) => ({\n init: () => {\n return new TileLayer({\n source: new OSM(),\n });\n },\n }),\n};\n\nexport const osmLayers = [standard];\n","/*\tCopyright (c) 2018 Jean-Marc VIGLINO, \r\n released under the CeCILL-B license (French BSD license)\r\n (http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.txt).\r\n*/\r\n\r\nimport ol_geom_Polygon from 'ol/geom/Polygon.js'\r\nimport ol_Feature from 'ol/Feature.js'\r\nimport ol_source_Vector from 'ol/source/Vector.js'\r\nimport {all as ol_loadingstrategy_all} from 'ol/loadingstrategy.js'\r\n\r\n/** DayNight source: a source to display day/night on a map\r\n * @constructor \r\n * @extends {ol.source.Vector}\r\n * @param {any} options Vector source options\r\n * @param {string|Date} time source date time\r\n * @param {number} step step in degree for coordinate precision\r\n */\r\nvar ol_source_DayNight = class olsourceDayNight extends ol_source_Vector {\r\n constructor(options) {\r\n options = options || {};\r\n options.strategy = ol_loadingstrategy_all;\r\n super(options);\r\n this.setLoader(this._loader);\r\n this.set('time', options.time || new Date());\r\n this.set('step', options.step || 1);\r\n }\r\n /** Compute the position of the Sun in ecliptic coordinates at julianDay.\r\n * @see http://en.wikipedia.org/wiki/Position_of_the_Sun\r\n * @param {number} julianDay\r\n * @private\r\n */\r\n static _sunEclipticPosition(julianDay) {\r\n var deg2rad = Math.PI / 180;\r\n // Days since start of J2000.0\r\n var n = julianDay - 2451545.0;\r\n // mean longitude of the Sun\r\n var L = 280.460 + 0.9856474 * n;\r\n L %= 360;\r\n // mean anomaly of the Sun\r\n var g = 357.528 + 0.9856003 * n;\r\n g %= 360;\r\n // ecliptic longitude of Sun\r\n var lambda = L + 1.915 * Math.sin(g * deg2rad) +\r\n 0.02 * Math.sin(2 * g * deg2rad);\r\n // distance from Sun in AU\r\n var R = 1.00014 - 0.01671 * Math.cos(g * deg2rad) -\r\n 0.0014 * Math.cos(2 * g * deg2rad);\r\n return { lambda: lambda, R: R };\r\n }\r\n /**\r\n * @see http://en.wikipedia.org/wiki/Axial_tilt#Obliquity_of_the_ecliptic_.28Earth.27s_axial_tilt.29\r\n * @param {number} julianDay\r\n * @private\r\n */\r\n static _eclipticObliquity(julianDay) {\r\n var n = julianDay - 2451545.0;\r\n // Julian centuries since J2000.0\r\n var T = n / 36525;\r\n var epsilon = 23.43929111 -\r\n T * (46.836769 / 3600\r\n - T * (0.0001831 / 3600\r\n + T * (0.00200340 / 3600\r\n - T * (0.576e-6 / 3600\r\n - T * 4.34e-8 / 3600))));\r\n return epsilon;\r\n }\r\n /* Compute the Sun's equatorial position from its ecliptic position.\r\n * @param {number} sunEclLng sun lon in degrees\r\n * @param {number} eclObliq secliptic position in degrees\r\n * @return {number} position in degrees\r\n * @private\r\n */\r\n static _sunEquatorialPosition(sunEclLon, eclObliq) {\r\n var rad2deg = 180 / Math.PI;\r\n var deg2rad = Math.PI / 180;\r\n\r\n var alpha = Math.atan(Math.cos(eclObliq * deg2rad)\r\n * Math.tan(sunEclLon * deg2rad)) * rad2deg;\r\n var delta = Math.asin(Math.sin(eclObliq * deg2rad)\r\n * Math.sin(sunEclLon * deg2rad)) * rad2deg;\r\n\r\n var lQuadrant = Math.floor(sunEclLon / 90) * 90;\r\n var raQuadrant = Math.floor(alpha / 90) * 90;\r\n alpha = alpha + (lQuadrant - raQuadrant);\r\n\r\n return { alpha: alpha, delta: delta };\r\n }\r\n /** Get the day/night separation latitude\r\n * @param {number} lon\r\n * @param {Date} time\r\n * @returns {number}\r\n */\r\n static getNightLat(lon, time) {\r\n var rad2deg = 180 / Math.PI;\r\n var deg2rad = Math.PI / 180;\r\n\r\n var date = time ? new Date(time) : new Date();\r\n\r\n // Calculate the present UTC Julian Date. \r\n // Function is valid after the beginning of the UNIX epoch 1970-01-01 and ignores leap seconds. \r\n var julianDay = (date / 86400000) + 2440587.5;\r\n\r\n // Calculate Greenwich Mean Sidereal Time (low precision equation).\r\n // http://aa.usno.navy.mil/faq/docs/GAST.php \r\n var gst = (18.697374558 + 24.06570982441908 * (julianDay - 2451545.0)) % 24;\r\n\r\n var sunEclPos = ol_source_DayNight._sunEclipticPosition(julianDay);\r\n var eclObliq = ol_source_DayNight._eclipticObliquity(julianDay);\r\n var sunEqPos = ol_source_DayNight._sunEquatorialPosition(sunEclPos.lambda, eclObliq);\r\n\r\n // Hour angle (indegrees) of the sun for a longitude on Earth.\r\n var ha = (gst * 15 + lon) - sunEqPos.alpha;\r\n // Latitude \r\n var lat = Math.atan(-Math.cos(ha * deg2rad) /\r\n Math.tan(sunEqPos.delta * deg2rad)) * rad2deg;\r\n\r\n return lat;\r\n }\r\n /** Loader\r\n * @private\r\n */\r\n _loader(extent, resolution, projection) {\r\n var lonlat = this.getCoordinates(this.get('time'));\r\n var geom = new ol_geom_Polygon([lonlat]);\r\n geom.transform('EPSG:4326', projection);\r\n this.addFeature(new ol_Feature(geom));\r\n }\r\n /** Set source date time\r\n * @param {string|Date} time source date time\r\n */\r\n setTime(time) {\r\n this.set('time', time);\r\n this.refresh();\r\n }\r\n /** Get sun coordinates on earth\r\n * @param {string} time DateTime string, default yet\r\n * @returns {ol.coordinate} position in lonlat\r\n */\r\n getSunPosition(time) {\r\n var date = time ? new Date(time) : new Date();\r\n\r\n // Calculate the present UTC Julian Date. \r\n // Function is valid after the beginning of the UNIX epoch 1970-01-01 and ignores leap seconds. \r\n var julianDay = (date / 86400000) + 2440587.5;\r\n\r\n // Calculate Greenwich Mean Sidereal Time (low precision equation).\r\n // http://aa.usno.navy.mil/faq/docs/GAST.php \r\n var gst = (18.697374558 + 24.06570982441908 * (julianDay - 2451545.0)) % 24;\r\n\r\n var sunEclPos = ol_source_DayNight._sunEclipticPosition(julianDay);\r\n var eclObliq = ol_source_DayNight._eclipticObliquity(julianDay);\r\n var sunEqPos = ol_source_DayNight._sunEquatorialPosition(sunEclPos.lambda, eclObliq);\r\n\r\n return [sunEqPos.alpha - gst * 15, sunEqPos.delta];\r\n }\r\n /** Get night-day separation line\r\n * @param {string} time DateTime string, default yet\r\n * @param {string} options use 'line' to get the separation line, 'day' to get the day polygon, 'night' to get the night polygon or 'daynight' to get both polygon, default 'night'\r\n * @return {Array<ol.Point>|Array<Array<ol.Point>>}\r\n */\r\n getCoordinates(time, options) {\r\n var rad2deg = 180 / Math.PI;\r\n var deg2rad = Math.PI / 180;\r\n\r\n var date = time ? new Date(time) : new Date();\r\n\r\n // Calculate the present UTC Julian Date. \r\n // Function is valid after the beginning of the UNIX epoch 1970-01-01 and ignores leap seconds. \r\n var julianDay = (date / 86400000) + 2440587.5;\r\n\r\n // Calculate Greenwich Mean Sidereal Time (low precision equation).\r\n // http://aa.usno.navy.mil/faq/docs/GAST.php \r\n var gst = (18.697374558 + 24.06570982441908 * (julianDay - 2451545.0)) % 24;\r\n var lonlat = [];\r\n\r\n var sunEclPos = ol_source_DayNight._sunEclipticPosition(julianDay);\r\n var eclObliq = ol_source_DayNight._eclipticObliquity(julianDay);\r\n var sunEqPos = ol_source_DayNight._sunEquatorialPosition(sunEclPos.lambda, eclObliq);\r\n\r\n var step = this.get('step') || 1;\r\n for (var i = -180; i <= 180; i += step) {\r\n var lon = i;\r\n // Hour angle (indegrees) of the sun for a longitude on Earth.\r\n var ha = (gst * 15 + lon) - sunEqPos.alpha;\r\n // Latitude \r\n var lat = Math.atan(-Math.cos(ha * deg2rad) /\r\n Math.tan(sunEqPos.delta * deg2rad)) * rad2deg;\r\n // New point\r\n lonlat.push([lon, lat]);\r\n }\r\n switch (options) {\r\n case 'line': break;\r\n case 'day': sunEqPos.delta *= -1;\r\n // fallthrough\r\n default: {\r\n // Close polygon\r\n lat = (sunEqPos.delta < 0) ? 90 : -90;\r\n for (var tlon = 180; tlon >= -180; tlon -= step) {\r\n lonlat.push([tlon, lat]);\r\n }\r\n lonlat.push(lonlat[0]);\r\n break;\r\n }\r\n }\r\n // Return night + day polygon\r\n if (options === 'daynight') {\r\n var day = [];\r\n lonlat.forEach(function (t) { day.push(t.slice()); });\r\n day[0][1] = -day[0][1];\r\n day[day.length - 1][1] = -day[0][1];\r\n day[day.length - 1][1] = -day[0][1];\r\n lonlat = [lonlat, day];\r\n }\r\n // Return polygon\r\n return lonlat;\r\n }\r\n}\r\n\r\nexport default ol_source_DayNight\r\n","import Feature from 'ol/Feature';\nimport Map from 'ol/Map';\nimport { Coordinate } from 'ol/coordinate';\nimport { MultiLineString } from 'ol/geom';\nimport Point from 'ol/geom/Point';\nimport { Group as LayerGroup } from 'ol/layer';\nimport VectorLayer from 'ol/layer/Vector';\nimport { fromLonLat } from 'ol/proj';\nimport VectorSource from 'ol/source/Vector';\nimport { Fill, Stroke, Style, Circle } from 'ol/style';\nimport DayNight from 'ol-ext/source/DayNight';\nimport { Subscription } from 'rxjs';\n\nimport {\n MapLayerRegistryItem,\n MapLayerOptions,\n PanelData,\n GrafanaTheme2,\n EventBus,\n DataHoverEvent,\n DataHoverClearEvent,\n} from '@grafana/data';\n\nexport enum ShowTime {\n From = 'from',\n To = 'to',\n}\n\n// Configuration options for Circle overlays\nexport interface DayNightConfig {\n show: ShowTime;\n sun: boolean;\n nightColor: string;\n}\n\nconst defaultConfig: DayNightConfig = {\n show: ShowTime.To,\n sun: false,\n nightColor: '#a7a6ba4D',\n};\n\nexport const DAY_NIGHT_LAYER_ID = 'dayNight';\n\n// Used by default when nothing is configured\nexport const defaultDayNightConfig: MapLayerOptions<DayNightConfig> = {\n type: DAY_NIGHT_LAYER_ID,\n name: '', // will get replaced\n config: defaultConfig,\n tooltip: true,\n};\n\n/**\n * Map layer configuration for circle overlay\n */\nexport const dayNightLayer: MapLayerRegistryItem<DayNightConfig> = {\n id: DAY_NIGHT_LAYER_ID,\n name: 'Night / Day',\n description: 'Show day and night regions',\n isBaseMap: false,\n\n /**\n * Function that configures transformation and returns a transformer\n * @param map\n * @param options\n * @param theme\n */\n create: async (map: Map, options: MapLayerOptions<DayNightConfig>, eventBus: EventBus, theme: GrafanaTheme2) => {\n // Assert default values\n const config = {\n ...defaultConfig,\n ...options?.config,\n };\n\n // DayNight source\n const source = new DayNight({});\n const sourceMethods = Object.getPrototypeOf(source);\n const sourceLine = new DayNight({});\n const sourceLineMethods = Object.getPrototypeOf(sourceLine);\n\n // Night polygon\n const vectorLayer = new VectorLayer({\n source,\n style: new Style({\n fill: new Fill({\n color: theme.visualization.getColorByName(config.nightColor),\n }),\n }),\n });\n\n // Night line (for crosshair sharing)\n const nightLineLayer = new VectorLayer({\n source: new VectorSource({\n features: [],\n }),\n style: new Style({\n stroke: new Stroke({\n color: '#607D8B',\n width: 1.5,\n lineDash: [2, 3],\n }),\n }),\n });\n\n // Sun circle\n const sunFeature = new Feature({\n geometry: new Point([]),\n });\n\n const sunLayer = new VectorLayer({\n source: new VectorSource({\n features: [sunFeature],\n }),\n style: new Style({\n image: new Circle({\n radius: 13,\n fill: new Fill({ color: 'rgb(253,184,19)' }),\n }),\n }),\n });\n\n // Sun line (for crosshair sharing)\n const sunLineFeature = new Feature({\n geometry: new Point([]),\n });\n\n const sunLineStyle = new Style({\n image: new Circle({\n radius: 13,\n stroke: new Stroke({\n color: 'rgb(253,184,19)',\n width: 1.5,\n }),\n }),\n });\n\n const sunLineStyleDash = new Style({\n image: new Circle({\n radius: 15,\n stroke: new Stroke({\n color: '#607D8B',\n width: 1.5,\n lineDash: [2, 3],\n }),\n }),\n });\n\n const sunLineLayer = new VectorLayer({\n source: new VectorSource({\n features: [sunLineFeature],\n }),\n style: [sunLineStyleDash, sunLineStyle],\n });\n\n // Build group of layers\n // TODO: add blended night region to \"connect\" current night region to lines\n const layer = new LayerGroup({\n layers: config.sun ? [vectorLayer, sunLayer, sunLineLayer, nightLineLayer] : [vectorLayer, nightLineLayer],\n });\n\n // Crosshair sharing subscriptions\n const subscriptions = new Subscription();\n\n if (false) {\n subscriptions.add(\n eventBus.subscribe(DataHoverEvent, (event) => {\n const time = event.payload?.point?.time;\n if (time) {\n const lineTime = new Date(time);\n const nightLinePoints = sourceLine.getCoordinates(lineTime.toString(), 'line');\n nightLineLayer.getSource()?.clear();\n const lineStringArray: Coordinate[][] = [];\n for (let l = 0; l < nightLinePoints.length - 1; l++) {\n const x1: number = Object.values(nightLinePoints[l])[0];\n const y1: number = Object.values(nightLinePoints[l])[1];\n const x2: number = Object.values(nightLinePoints[l + 1])[0];\n const y2: number = Object.values(nightLinePoints[l + 1])[1];\n const lineString = [fromLonLat([x1, y1]), fromLonLat([x2, y2])];\n lineStringArray.push(lineString);\n }\n nightLineLayer.getSource()?.addFeature(\n new Feature({\n geometry: new MultiLineString(lineStringArray),\n })\n );\n\n let sunLinePos: number[] = [];\n sunLinePos = sourceLineMethods.getSunPosition(lineTime);\n sunLineFeature.getGeometry()?.setCoordinates(fromLonLat(sunLinePos));\n sunLineFeature.setStyle([sunLineStyle, sunLineStyleDash]);\n }\n })\n );\n\n subscriptions.add(\n eventBus.subscribe(DataHoverClearEvent, (event) => {\n nightLineLayer.getSource()?.clear();\n sunLineFeature.setStyle(new Style({}));\n })\n );\n }\n\n return {\n init: () => layer,\n dispose: () => subscriptions.unsubscribe(),\n update: (data: PanelData) => {\n const from = new Date(data.timeRange.from.valueOf());\n const to = new Date(data.timeRange.to.valueOf());\n let selectedTime: Date = new Date();\n let sunPos: number[] = [];\n // TODO: add option for \"Both\"\n if (config.show === ShowTime.From) {\n selectedTime = from;\n } else {\n selectedTime = to;\n }\n\n source.setTime(selectedTime);\n if (config.sun) {\n sunPos = sourceMethods.getSunPosition(selectedTime);\n sunFeature.getGeometry()?.setCoordinates(fromLonLat(sunPos));\n }\n },\n\n // Marker overlay options\n registerOptionsUI: (builder) => {\n if (!options.config?.nightColor) {\n options.config = { ...defaultConfig, ...options.config };\n }\n\n builder.addRadio({\n path: 'config.show',\n name: 'Show',\n settings: {\n options: [\n { label: 'From', value: ShowTime.From },\n { label: 'To', value: ShowTime.To },\n ],\n },\n defaultValue: defaultConfig.show,\n });\n builder.addColorPicker({\n path: 'config.nightColor',\n name: 'Night region color',\n description: 'Pick color of night region',\n defaultValue: defaultConfig.nightColor,\n settings: [{ enableNamedColors: false }],\n });\n builder.addBooleanSwitch({\n path: 'config.sun',\n name: 'Display sun',\n description: 'Show the sun',\n defaultValue: defaultConfig.sun,\n });\n },\n };\n },\n\n // fill in the default values\n defaultOptions: defaultConfig,\n};\n","import { FeatureLike } from 'ol/Feature';\n\nimport { compareValues } from '@grafana/data/src/transformations/matchers/compareValues';\n\nimport { FeatureRuleConfig } from '../types';\n\n/**\n * Check whether feature has property value that matches rule\n * @param rule - style rule with an operation, property, and value\n * @param feature - feature with properties and values\n * @returns boolean\n */\nexport const checkFeatureMatchesStyleRule = (rule: FeatureRuleConfig, feature: FeatureLike) => {\n const val = feature.get(rule.property);\n return compareValues(val, rule.operation, rule.value);\n};\n","import { FeatureLike } from 'ol/Feature';\n\nimport { SelectableValue } from '@grafana/data';\n\nimport { GeometryTypeId } from '../style/types';\n\nexport interface LayerContentInfo {\n geometryType: GeometryTypeId;\n propertes: Array<SelectableValue<string>>;\n}\n\nexport function getLayerPropertyInfo(features: FeatureLike[]): LayerContentInfo {\n const types = new Set<string>();\n const props = new Set<string>();\n features.some((feature, idx) => {\n for (const key of Object.keys(feature.getProperties())) {\n if (key === 'geometry') {\n continue;\n }\n props.add(key);\n const g = feature.getGeometry();\n if (g) {\n types.add(g.getType());\n }\n }\n return idx > 10; // first 10 items\n });\n\n let geometryType = GeometryTypeId.Any;\n if (types.size === 1) {\n switch (types.values().next().value) {\n case 'Point':\n case 'MultiPoint':\n geometryType = GeometryTypeId.Point;\n break;\n case 'Line':\n case 'MultiLine':\n geometryType = GeometryTypeId.Line;\n break;\n case 'Polygon':\n geometryType = GeometryTypeId.Polygon;\n }\n }\n\n return {\n geometryType,\n propertes: Array.from(props.keys()).map((v) => ({ label: v, value: v })),\n };\n}\n\nexport function getUniqueFeatureValues(features: FeatureLike[], key: string): string[] {\n const unique = new Set<string>();\n for (const feature of features) {\n const v = feature.get(key);\n if (v != null) {\n unique.add(`${v}`); // always string\n }\n }\n const buffer = Array.from(unique);\n buffer.sort();\n return buffer;\n}\n","import { FeatureLike } from 'ol/Feature';\nimport OlMap from 'ol/Map';\nimport { unByKey } from 'ol/Observable';\nimport GeoJSON from 'ol/format/GeoJSON';\nimport VectorLayer from 'ol/layer/Vector';\nimport VectorSource from 'ol/source/Vector';\nimport { Fill, Stroke, Style } from 'ol/style';\nimport { ReplaySubject } from 'rxjs';\nimport { map as rxjsmap, first } from 'rxjs/operators';\n\nimport {\n MapLayerRegistryItem,\n MapLayerOptions,\n PanelData,\n GrafanaTheme2,\n PluginState,\n EventBus,\n} from '@grafana/data';\nimport { ComparisonOperation } from '@grafana/schema';\nimport { findField } from 'app/features/dimensions';\n\nimport { StyleEditor } from '../../editor/StyleEditor';\nimport { polyStyle } from '../../style/markers';\nimport { defaultStyleConfig, StyleConfig, StyleConfigState } from '../../style/types';\nimport { getStyleConfigState } from '../../style/utils';\nimport { FeatureRuleConfig, FeatureStyleConfig } from '../../types';\nimport { checkFeatureMatchesStyleRule } from '../../utils/checkFeatureMatchesStyleRule';\nimport { getLayerPropertyInfo } from '../../utils/getFeatures';\nimport { getStyleDimension, getPublicGeoJSONFiles } from '../../utils/utils';\n\n\nexport interface DynamicGeoJSONMapperConfig {\n // URL for a geojson file\n src?: string;\n\n // The default style (applied if no rules match)\n style: StyleConfig;\n\n // Pick style based on a rule\n rules: FeatureStyleConfig[];\n idField?: string;\n dataStyle: StyleConfig;\n}\n\nconst defaultOptions: DynamicGeoJSONMapperConfig = {\n src: 'public/maps/countries.geojson',\n rules: [],\n style: defaultStyleConfig,\n dataStyle: {},\n};\n\ninterface StyleCheckerState {\n state: StyleConfigState;\n poly?: Style | Style[];\n point?: Style | Style[];\n rule?: FeatureRuleConfig;\n}\n\nexport const DEFAULT_STYLE_RULE: FeatureStyleConfig = {\n style: defaultStyleConfig,\n check: {\n property: '',\n operation: ComparisonOperation.EQ,\n value: '',\n },\n};\n\nexport const dynamicGeoJSONLayer: MapLayerRegistryItem<DynamicGeoJSONMapperConfig> = {\n id: 'dynamic-geojson',\n name: 'Dynamic GeoJSON',\n description: 'Style a geojson file based on query results',\n isBaseMap: false,\n state: PluginState.alpha,\n\n /**\n * Function that configures transformation and returns a transformer\n * @param map\n * @param options\n * @param theme\n */\n create: async (map: OlMap, options: MapLayerOptions<DynamicGeoJSONMapperConfig>, eventBus: EventBus, theme: GrafanaTheme2) => {\n const config = { ...defaultOptions, ...options.config };\n\n const source = new VectorSource({\n url: config.src,\n format: new GeoJSON(),\n });\n\n const features = new ReplaySubject<FeatureLike[]>();\n\n const key = source.on('change', () => {\n //one geojson loads\n if (source.getState() === 'ready') {\n unByKey(key);\n features.next(source.getFeatures());\n }\n });\n\n const styles: StyleCheckerState[] = [];\n if (config.rules) {\n for (const r of config.rules) {\n if (r.style) {\n const s = await getStyleConfigState(r.style);\n styles.push({\n state: s,\n rule: r.check,\n });\n }\n }\n }\n if (true) {\n const s = await getStyleConfigState(config.style);\n styles.push({\n state: s,\n });\n }\n\n const style = await getStyleConfigState(config.style);\n const idToIdx = new Map<string, number>();\n\n const vectorLayer = new VectorLayer({\n source,\n style: (feature: FeatureLike) => {\n const idx = idToIdx.get(feature.getId() as string);\n const dims = style.dims;\n\n if (idx && dims) {\n return new Style({\n fill: new Fill({ color: dims.color?.get(idx) }),\n stroke: new Stroke({ color: style.base.color, width: style.base.lineWidth ?? 1 }),\n });\n }\n\n const isPoint = feature.getGeometry()?.getType() === 'Point';\n\n for (const check of styles) {\n if (check.rule && !checkFeatureMatchesStyleRule(check.rule, feature)) {\n continue;\n }\n\n // Support dynamic values\n if (check.state.fields) {\n const values = { ...check.state.base };\n const { text } = check.state.fields;\n\n if (text) {\n values.text = `${feature.get(text)}`;\n }\n if (isPoint) {\n return check.state.maker(values);\n }\n return polyStyle(values);\n }\n\n // Lazy create the style object\n if (isPoint) {\n if (!check.point) {\n check.point = check.state.maker(check.state.base);\n }\n return check.point;\n }\n\n if (!check.poly) {\n check.poly = polyStyle(check.state.base);\n }\n return check.poly;\n }\n return undefined; // unreachable\n },\n });\n\n return {\n init: () => vectorLayer,\n update: (data: PanelData) => {\n const frame = data.series[0];\n if (frame) {\n const field = findField(frame, config.idField);\n if (field) {\n idToIdx.clear();\n field.values.forEach((v, i) => idToIdx.set(v, i));\n }\n\n style.dims = getStyleDimension(frame, style, theme, config.dataStyle);\n }\n vectorLayer.changed();\n },\n registerOptionsUI: (builder) => {\n // get properties for first feature to use as ui options\n const layerInfo = features.pipe(\n first(),\n rxjsmap((v) => getLayerPropertyInfo(v))\n );\n\n builder\n .addSelect({\n path: 'config.src',\n name: 'GeoJSON URL',\n settings: {\n options: getPublicGeoJSONFiles() ?? [],\n allowCustomValue: true,\n },\n defaultValue: defaultOptions.src,\n })\n .addFieldNamePicker({\n path: 'config.idField',\n name: 'ID Field',\n })\n .addCustomEditor({\n id: 'config.dataStyle',\n path: 'config.dataStyle',\n name: 'Data style',\n editor: StyleEditor,\n settings: {\n displayRotation: false,\n },\n defaultValue: defaultOptions.dataStyle,\n })\n .addCustomEditor({\n id: 'config.style',\n path: 'config.style',\n name: 'Default style',\n description: 'The style to apply when no rules above match',\n editor: StyleEditor,\n settings: {\n simpleFixedValues: true,\n layerInfo,\n },\n defaultValue: defaultOptions.style,\n })\n },\n };\n },\n defaultOptions,\n};\n","import { SelectableValue } from '@grafana/data';\n\nexport interface SelectionInfo<T> {\n options: Array<SelectableValue<T>>;\n current?: SelectableValue<T>;\n}\n\n/**\n * The select component is really annoying -- if the current value is not in the list of options\n * it won't show up. This is a wrapper to make that happen.\n */\nexport function getSelectionInfo<T>(v?: T, options?: Array<SelectableValue<T>>): SelectionInfo<T> {\n if (v && !options) {\n const current = { label: `${v}`, value: v };\n return { options: [current], current };\n }\n if (!options) {\n options = [];\n }\n let current = options.find((item) => item.value === v);\n\n if (v && !current) {\n current = {\n label: `${v} (not found)`,\n value: v,\n };\n options.push(current);\n }\n return {\n options,\n current,\n };\n}\n","import { css } from '@emotion/css';\nimport { FeatureLike } from 'ol/Feature';\nimport React, { useCallback, useMemo } from 'react';\nimport { useObservable } from 'react-use';\nimport { Observable } from 'rxjs';\n\nimport { GrafanaTheme2, SelectableValue, StandardEditorProps, StandardEditorsRegistryItem } from '@grafana/data';\nimport { ComparisonOperation } from '@grafana/schema';\nimport { Button, InlineField, InlineFieldRow, Select, useStyles2 } from '@grafana/ui';\nimport { comparisonOperationOptions } from '@grafana/ui/src/components/MatchersUI/FieldValueMatcher';\nimport { NumberInput } from 'app/core/components/OptionsUI/NumberInput';\n\nimport { DEFAULT_STYLE_RULE } from '../layers/data/geojsonLayer';\nimport { defaultStyleConfig, StyleConfig } from '../style/types';\nimport { FeatureStyleConfig } from '../types';\nimport { getUniqueFeatureValues, LayerContentInfo } from '../utils/getFeatures';\nimport { getSelectionInfo } from '../utils/selection';\n\nimport { StyleEditor } from './StyleEditor';\n\nexport interface StyleRuleEditorSettings {\n features: Observable<FeatureLike[]>;\n layerInfo: Observable<LayerContentInfo>;\n}\n\ntype Props = StandardEditorProps<FeatureStyleConfig, any, unknown, StyleRuleEditorSettings>;\n\nexport const StyleRuleEditor = ({ value, onChange, item, context }: Props) => {\n const settings: StyleRuleEditorSettings = item.settings;\n const { features, layerInfo } = settings;\n\n const propertyOptions = useObservable(layerInfo);\n const feats = useObservable(features);\n\n const uniqueSelectables = useMemo(() => {\n const key = value?.check?.property;\n if (key && feats && value.check?.operation === ComparisonOperation.EQ) {\n return getUniqueFeatureValues(feats, key).map((v) => {\n let newValue;\n let isNewValueNumber = !isNaN(Number(v));\n\n if (isNewValueNumber) {\n newValue = {\n value: Number(v),\n label: v,\n };\n } else {\n newValue = { value: v, label: v };\n }\n\n return newValue;\n });\n }\n return [];\n }, [feats, value]);\n\n const styles = useStyles2(getStyles);\n\n const LABEL_WIDTH = 10;\n\n const onChangeProperty = useCallback(\n (selection?: SelectableValue) => {\n onChange({\n ...value,\n check: {\n ...value.check!,\n property: selection?.value,\n },\n });\n },\n [onChange, value]\n );\n\n const onChangeComparison = useCallback(\n (selection: SelectableValue) => {\n onChange({\n ...value,\n check: {\n ...value.check!,\n operation: selection.value ?? ComparisonOperation.EQ,\n },\n });\n },\n [onChange, value]\n );\n\n const onChangeValue = useCallback(\n (selection?: SelectableValue) => {\n onChange({\n ...value,\n check: {\n ...value.check!,\n value: selection?.value,\n },\n });\n },\n [onChange, value]\n );\n\n const onChangeNumericValue = useCallback(\n (v?: number) => {\n onChange({\n ...value,\n check: {\n ...value.check!,\n value: v!,\n },\n });\n },\n [onChange, value]\n );\n\n const onChangeStyle = useCallback(\n (style?: StyleConfig) => {\n onChange({ ...value, style });\n },\n [onChange, value]\n );\n\n const onDelete = useCallback(() => {\n onChange(undefined);\n }, [onChange]);\n\n const check = value.check ?? DEFAULT_STYLE_RULE.check!;\n const propv = getSelectionInfo(check.property, propertyOptions?.propertes);\n const valuev = getSelectionInfo(check.value, uniqueSelectables);\n\n return (\n <div className={styles.rule}>\n <InlineFieldRow className={styles.row}>\n <InlineField label=\"Rule\" labelWidth={LABEL_WIDTH} grow={true}>\n <Select\n placeholder={'Feature property'}\n value={propv.current}\n options={propv.options}\n onChange={onChangeProperty}\n aria-label={'Feature property'}\n isClearable\n allowCustomValue\n />\n </InlineField>\n <InlineField className={styles.inline}>\n <Select\n value={comparisonOperationOptions.find((v) => v.value === check.operation)}\n options={comparisonOperationOptions}\n onChange={onChangeComparison}\n aria-label={'Comparison operator'}\n width={8}\n />\n </InlineField>\n <InlineField className={styles.inline} grow={true}>\n <div className={styles.flexRow}>\n {(check.operation === ComparisonOperation.EQ || check.operation === ComparisonOperation.NEQ) && (\n <Select\n placeholder={'value'}\n value={valuev.current}\n options={valuev.options}\n onChange={onChangeValue}\n aria-label={'Comparison value'}\n isClearable\n allowCustomValue\n />\n )}\n {check.operation !== ComparisonOperation.EQ && (\n <NumberInput\n key={`${check.property}/${check.operation}`}\n value={!isNaN(Number(check.value)) ? Number(check.value) : 0}\n placeholder=\"numeric value\"\n onChange={onChangeNumericValue}\n />\n )}\n </div>\n </InlineField>\n <Button\n size=\"md\"\n icon=\"trash-alt\"\n onClick={() => onDelete()}\n variant=\"secondary\"\n aria-label={'Delete style rule'}\n className={styles.button}\n ></Button>\n </InlineFieldRow>\n <div>\n <StyleEditor\n value={value.style ?? defaultStyleConfig}\n context={context}\n onChange={onChangeStyle}\n item={\n {\n settings: {\n simpleFixedValues: true,\n layerInfo,\n },\n } as StandardEditorsRegistryItem\n }\n />\n </div>\n </div>\n );\n};\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n rule: css({\n marginBottom: theme.spacing(1),\n }),\n row: css({\n display: 'flex',\n marginBottom: '4px',\n }),\n inline: css({\n marginBottom: 0,\n marginLeft: '4px',\n }),\n button: css({\n marginLeft: '4px',\n }),\n flexRow: css({\n display: 'flex',\n flexDirection: 'row',\n alignItems: 'flex-start',\n }),\n});\n","import React, { useCallback } from 'react';\n\nimport { StandardEditorProps, StandardEditorsRegistryItem } from '@grafana/data';\nimport { Button, useTheme2 } from '@grafana/ui';\n\nimport { DEFAULT_STYLE_RULE } from '../layers/data/geojsonLayer';\nimport { defaultStyleConfig } from '../style/types';\nimport { FeatureStyleConfig } from '../types';\n\nimport { StyleRuleEditor, StyleRuleEditorSettings } from './StyleRuleEditor';\n\ntype Props = StandardEditorProps<FeatureStyleConfig[], unknown, unknown>;\n\nexport const GeomapStyleRulesEditor = ({ value, onChange, context, item }: Props) => {\n const theme = useTheme2();\n\n const settings = item.settings;\n const onAddRule = useCallback(() => {\n const { palette } = theme.visualization;\n const color = {\n fixed: palette[Math.floor(Math.random() * palette.length)],\n };\n\n const newRule = [...value, { ...DEFAULT_STYLE_RULE, style: { ...defaultStyleConfig, color } }];\n\n onChange(newRule);\n }, [onChange, value, theme.visualization]);\n\n const onRuleChange = useCallback(\n (idx: number) => (style: FeatureStyleConfig | undefined) => {\n const copyStyles = [...value];\n if (style) {\n copyStyles[idx] = style;\n } else {\n //assume undefined is only returned on delete\n copyStyles.splice(idx, 1);\n }\n onChange(copyStyles);\n },\n [onChange, value]\n );\n\n const styleOptions =\n value &&\n value.map((style, idx: number) => {\n const itemSettings: StandardEditorsRegistryItem<any, StyleRuleEditorSettings> = {\n settings,\n } as StandardEditorsRegistryItem;\n\n return (\n <StyleRuleEditor\n value={style}\n onChange={onRuleChange(idx)}\n context={context}\n item={itemSettings}\n key={`${idx}-${style.check?.property}`}\n />\n );\n });\n\n return (\n <>\n {styleOptions}\n <Button size=\"sm\" icon=\"plus\" onClick={onAddRule} variant=\"secondary\" aria-label={'Add geomap style rule'}>\n {'Add style rule'}\n </Button>\n </>\n );\n};\n","import { FeatureLike } from 'ol/Feature';\nimport Map from 'ol/Map';\nimport { unByKey } from 'ol/Observable';\nimport GeoJSON from 'ol/format/GeoJSON';\nimport VectorLayer from 'ol/layer/Vector';\nimport VectorSource from 'ol/source/Vector';\nimport { Style } from 'ol/style';\nimport { ReplaySubject } from 'rxjs';\nimport { map as rxjsmap, first } from 'rxjs/operators';\n\nimport { MapLayerRegistryItem, MapLayerOptions, GrafanaTheme2, EventBus } from '@grafana/data';\nimport { ComparisonOperation } from '@grafana/schema';\n\nimport { GeomapStyleRulesEditor } from '../../editor/GeomapStyleRulesEditor';\nimport { StyleEditor } from '../../editor/StyleEditor';\nimport { polyStyle } from '../../style/markers';\nimport {\n defaultStyleConfig,\n GeoJSONLineStyles,\n GeoJSONPointStyles,\n GeoJSONPolyStyles,\n StyleConfig,\n StyleConfigState,\n StyleConfigValues,\n} from '../../style/types';\nimport { getStyleConfigState } from '../../style/utils';\nimport { FeatureRuleConfig, FeatureStyleConfig } from '../../types';\nimport { checkFeatureMatchesStyleRule } from '../../utils/checkFeatureMatchesStyleRule';\nimport { getLayerPropertyInfo } from '../../utils/getFeatures';\nimport { getPublicGeoJSONFiles } from '../../utils/utils';\n\nexport interface GeoJSONMapperConfig {\n // URL for a geojson file\n src?: string;\n\n // Pick style based on a rule\n rules: FeatureStyleConfig[];\n\n // The default style (applied if no rules match)\n style: StyleConfig;\n}\n\nconst defaultOptions: GeoJSONMapperConfig = {\n src: 'public/maps/countries.geojson',\n rules: [],\n style: defaultStyleConfig,\n};\n\ninterface StyleCheckerState {\n state: StyleConfigState;\n poly?: Style | Style[];\n point?: Style | Style[];\n rule?: FeatureRuleConfig;\n}\n\nexport const DEFAULT_STYLE_RULE: FeatureStyleConfig = {\n style: defaultStyleConfig,\n check: {\n property: '',\n operation: ComparisonOperation.EQ,\n value: '',\n },\n};\n\nexport const geojsonLayer: MapLayerRegistryItem<GeoJSONMapperConfig> = {\n id: 'geojson',\n name: 'GeoJSON',\n description: 'Load static data from a geojson file',\n isBaseMap: false,\n\n /**\n * Function that configures transformation and returns a transformer\n * @param options\n */\n create: async (map: Map, options: MapLayerOptions<GeoJSONMapperConfig>, eventBus: EventBus, theme: GrafanaTheme2) => {\n const config = { ...defaultOptions, ...options.config };\n\n const source = new VectorSource({\n url: config.src,\n format: new GeoJSON(),\n });\n\n const features = new ReplaySubject<FeatureLike[]>();\n\n const key = source.on('change', () => {\n //one geojson loads\n if (source.getState() === 'ready') {\n unByKey(key);\n features.next(source.getFeatures());\n }\n });\n\n const styles: StyleCheckerState[] = [];\n if (config.rules) {\n for (const r of config.rules) {\n if (r.style) {\n const s = await getStyleConfigState(r.style);\n styles.push({\n state: s,\n rule: r.check,\n });\n }\n }\n }\n if (true) {\n const s = await getStyleConfigState(config.style);\n styles.push({\n state: s,\n });\n }\n\n const polyStyleStrings: string[] = Object.values(GeoJSONPolyStyles);\n const pointStyleStrings: string[] = Object.values(GeoJSONPointStyles);\n const lineStyleStrings: string[] = Object.values(GeoJSONLineStyles);\n const vectorLayer = new VectorLayer({\n source,\n style: (feature: FeatureLike) => {\n const featureType = feature.getGeometry()?.getType();\n const isPoint = featureType === 'Point' || featureType === 'MultiPoint';\n const isPolygon = featureType === 'Polygon' || featureType === 'MultiPolygon';\n const isLine = featureType === 'LineString' || featureType === 'MultiLineString';\n\n for (const check of styles) {\n if (check.rule && !checkFeatureMatchesStyleRule(check.rule, feature)) {\n continue;\n }\n\n // Support dynamic values\n if (check.state.fields) {\n const values = { ...check.state.base };\n const { text } = check.state.fields;\n\n if (text) {\n values.text = `${feature.get(text)}`;\n }\n if (isPoint) {\n return check.state.maker(values);\n }\n return polyStyle(values);\n }\n\n // Support styling polygons from Feature properties\n const featureProps = feature.getProperties();\n if (isPolygon && Object.keys(featureProps).some((property) => polyStyleStrings.includes(property))) {\n const values: StyleConfigValues = {\n color: featureProps[GeoJSONPolyStyles.color] ?? check.state.base.color,\n opacity: featureProps[GeoJSONPolyStyles.opacity] ?? check.state.base.opacity,\n lineWidth: featureProps[GeoJSONPolyStyles.lineWidth] ?? check.state.base.lineWidth,\n };\n return polyStyle(values);\n } else if (isLine && Object.keys(featureProps).some((property) => lineStyleStrings.includes(property))) {\n const values: StyleConfigValues = {\n color: featureProps[GeoJSONLineStyles.color] ?? check.state.base.color,\n lineWidth: featureProps[GeoJSONLineStyles.lineWidth] ?? check.state.base.lineWidth,\n };\n return check.state.maker(values);\n } else if (isPoint && Object.keys(featureProps).some((property) => pointStyleStrings.includes(property))) {\n const values: StyleConfigValues = {\n color: featureProps[GeoJSONPointStyles.color] ?? check.state.base.color,\n size: featureProps[GeoJSONPointStyles.size] ?? check.state.base.size,\n };\n return check.state.maker(values);\n }\n\n // Lazy create the style object\n if (isPoint) {\n if (!check.point) {\n check.point = check.state.maker(check.state.base);\n }\n return check.point;\n }\n\n if (!check.poly) {\n check.poly = polyStyle(check.state.base);\n }\n return check.poly;\n }\n return undefined; // unreachable\n },\n });\n\n return {\n init: () => vectorLayer,\n registerOptionsUI: (builder) => {\n // get properties for first feature to use as ui options\n const layerInfo = features.pipe(\n first(),\n rxjsmap((v) => getLayerPropertyInfo(v))\n );\n\n builder\n .addSelect({\n path: 'config.src',\n name: 'GeoJSON URL',\n settings: {\n options: getPublicGeoJSONFiles() ?? [],\n allowCustomValue: true,\n },\n defaultValue: defaultOptions.src,\n })\n .addCustomEditor({\n id: 'config.style',\n path: 'config.style',\n name: 'Default style',\n description: 'The style to apply when no rules above match',\n editor: StyleEditor,\n settings: {\n simpleFixedValues: true,\n layerInfo,\n },\n defaultValue: defaultOptions.style,\n })\n .addCustomEditor({\n id: 'config.rules',\n path: 'config.rules',\n name: 'Style rules',\n description: 'Apply styles based on feature properties',\n editor: GeomapStyleRulesEditor,\n settings: {\n features,\n layerInfo,\n },\n defaultValue: [],\n });\n },\n };\n },\n defaultOptions,\n};\n","/**\n * @module ol/webgl\n */\n\nimport {SAFARI_BUG_237906} from './has.js';\n\n/**\n * Constants taken from goog.webgl\n */\n\n/**\n * Used by {@link module:ol/webgl/Helper~WebGLHelper} for buffers containing vertices data, such as\n * position, color, texture coordinate, etc. These vertices are then referenced by an index buffer\n * to be drawn on screen (see {@link module:ol/webgl.ELEMENT_ARRAY_BUFFER}).\n * @const\n * @type {number}\n * @api\n */\nexport const ARRAY_BUFFER = 0x8892;\n\n/**\n * Used by {@link module:ol/webgl/Helper~WebGLHelper} for buffers containing indices data.\n * Index buffers are essentially lists of references to vertices defined in a vertex buffer\n * (see {@link module:ol/webgl.ARRAY_BUFFER}), and define the primitives (triangles) to be drawn.\n * @const\n * @type {number}\n * @api\n */\nexport const ELEMENT_ARRAY_BUFFER = 0x8893;\n\n/**\n * Used by {link module:ol/webgl/Buffer~WebGLArrayBuffer}.\n * @const\n * @type {number}\n * @api\n */\nexport const STREAM_DRAW = 0x88e0;\n\n/**\n * Used by {link module:ol/webgl/Buffer~WebGLArrayBuffer}.\n * @const\n * @type {number}\n * @api\n */\nexport const STATIC_DRAW = 0x88e4;\n\n/**\n * Used by {link module:ol/webgl/Buffer~WebGLArrayBuffer}.\n * @const\n * @type {number}\n * @api\n */\nexport const DYNAMIC_DRAW = 0x88e8;\n\n/**\n * @const\n * @type {number}\n */\nexport const UNSIGNED_BYTE = 0x1401;\n\n/**\n * @const\n * @type {number}\n */\nexport const UNSIGNED_SHORT = 0x1403;\n\n/**\n * @const\n * @type {number}\n */\nexport const UNSIGNED_INT = 0x1405;\n\n/**\n * @const\n * @type {number}\n */\nexport const FLOAT = 0x1406;\n\n/** end of goog.webgl constants\n */\n\n/**\n * @const\n * @type {Array<string>}\n */\nconst CONTEXT_IDS = ['experimental-webgl', 'webgl', 'webkit-3d', 'moz-webgl'];\n\n/**\n * @param {HTMLCanvasElement} canvas Canvas.\n * @param {Object} [attributes] Attributes.\n * @return {WebGLRenderingContext} WebGL rendering context.\n */\nexport function getContext(canvas, attributes) {\n attributes = Object.assign(\n {\n preserveDrawingBuffer: true,\n antialias: SAFARI_BUG_237906 ? false : true, // https://bugs.webkit.org/show_bug.cgi?id=237906\n },\n attributes\n );\n const ii = CONTEXT_IDS.length;\n for (let i = 0; i < ii; ++i) {\n try {\n const context = canvas.getContext(CONTEXT_IDS[i], attributes);\n if (context) {\n return /** @type {!WebGLRenderingContext} */ (context);\n }\n } catch (e) {\n // pass\n }\n }\n return null;\n}\n\n/**\n * @type {Array<string>}\n */\nlet supportedExtensions;\n\n/**\n * @return {Array<string>} List of supported WebGL extensions.\n */\nexport function getSupportedExtensions() {\n if (!supportedExtensions) {\n const canvas = document.createElement('canvas');\n const gl = getContext(canvas);\n if (gl) {\n supportedExtensions = gl.getSupportedExtensions();\n }\n }\n return supportedExtensions;\n}\n","/**\n * @module ol/webgl/Buffer\n */\nimport {\n ARRAY_BUFFER,\n DYNAMIC_DRAW,\n ELEMENT_ARRAY_BUFFER,\n STATIC_DRAW,\n STREAM_DRAW,\n} from '../webgl.js';\nimport {assert} from '../asserts.js';\n\n/**\n * Used to describe the intended usage for the data: `STATIC_DRAW`, `STREAM_DRAW`\n * or `DYNAMIC_DRAW`.\n * @enum {number}\n */\nexport const BufferUsage = {\n STATIC_DRAW: STATIC_DRAW,\n STREAM_DRAW: STREAM_DRAW,\n DYNAMIC_DRAW: DYNAMIC_DRAW,\n};\n\n/**\n * @classdesc\n * Object used to store an array of data as well as usage information for that data.\n * Stores typed arrays internally, either Float32Array or Uint16/32Array depending on\n * the buffer type (ARRAY_BUFFER or ELEMENT_ARRAY_BUFFER) and available extensions.\n *\n * To populate the array, you can either use:\n * * A size using `#ofSize(buffer)`\n * * An `ArrayBuffer` object using `#fromArrayBuffer(buffer)`\n * * A plain array using `#fromArray(array)`\n *\n * Note:\n * See the documentation of [WebGLRenderingContext.bufferData](https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/bufferData)\n * for more info on buffer usage.\n * @api\n */\nclass WebGLArrayBuffer {\n /**\n * @param {number} type Buffer type, either ARRAY_BUFFER or ELEMENT_ARRAY_BUFFER.\n * @param {number} [usage] Intended usage, either `STATIC_DRAW`, `STREAM_DRAW` or `DYNAMIC_DRAW`.\n * Default is `DYNAMIC_DRAW`.\n */\n constructor(type, usage) {\n /**\n * @private\n * @type {Float32Array|Uint32Array}\n */\n this.array = null;\n\n /**\n * @private\n * @type {number}\n */\n this.type = type;\n\n assert(type === ARRAY_BUFFER || type === ELEMENT_ARRAY_BUFFER, 62);\n\n /**\n * @private\n * @type {number}\n */\n this.usage = usage !== undefined ? usage : BufferUsage.STATIC_DRAW;\n }\n\n /**\n * Populates the buffer with an array of the given size (all values will be zeroes).\n * @param {number} size Array size\n * @return {WebGLArrayBuffer} This\n */\n ofSize(size) {\n this.array = new (getArrayClassForType(this.type))(size);\n return this;\n }\n\n /**\n * Populates the buffer with an array of the given size.\n * @param {Array<number>} array Numerical array\n * @return {WebGLArrayBuffer} This\n */\n fromArray(array) {\n this.array = getArrayClassForType(this.type).from(array);\n return this;\n }\n\n /**\n * Populates the buffer with a raw binary array buffer.\n * @param {ArrayBuffer} buffer Raw binary buffer to populate the array with. Note that this buffer must have been\n * initialized for the same typed array class.\n * @return {WebGLArrayBuffer} This\n */\n fromArrayBuffer(buffer) {\n this.array = new (getArrayClassForType(this.type))(buffer);\n return this;\n }\n\n /**\n * @return {number} Buffer type.\n */\n getType() {\n return this.type;\n }\n\n /**\n * Will return null if the buffer was not initialized\n * @return {Float32Array|Uint32Array} Array.\n */\n getArray() {\n return this.array;\n }\n\n /**\n * @return {number} Usage.\n */\n getUsage() {\n return this.usage;\n }\n\n /**\n * Will return 0 if the buffer is not initialized\n * @return {number} Array size\n */\n getSize() {\n return this.array ? this.array.length : 0;\n }\n}\n\n/**\n * Returns a typed array constructor based on the given buffer type\n * @param {number} type Buffer type, either ARRAY_BUFFER or ELEMENT_ARRAY_BUFFER.\n * @return {Float32ArrayConstructor|Uint32ArrayConstructor} The typed array class to use for this buffer.\n */\nexport function getArrayClassForType(type) {\n switch (type) {\n case ARRAY_BUFFER:\n return Float32Array;\n case ELEMENT_ARRAY_BUFFER:\n return Uint32Array;\n default:\n return Float32Array;\n }\n}\n\nexport default WebGLArrayBuffer;\n","/**\n * @module ol/webgl/ContextEventType\n */\n\n/**\n * @enum {string}\n */\nexport default {\n LOST: 'webglcontextlost',\n RESTORED: 'webglcontextrestored',\n};\n","/**\n * @module ol/webgl/PostProcessingPass\n */\n\nimport {getUid} from '../util.js';\n\nconst DEFAULT_VERTEX_SHADER = `\n precision mediump float;\n \n attribute vec2 a_position;\n varying vec2 v_texCoord;\n varying vec2 v_screenCoord;\n \n uniform vec2 u_screenSize;\n \n void main() {\n v_texCoord = a_position * 0.5 + 0.5;\n v_screenCoord = v_texCoord * u_screenSize;\n gl_Position = vec4(a_position, 0.0, 1.0);\n }\n`;\n\nconst DEFAULT_FRAGMENT_SHADER = `\n precision mediump float;\n \n uniform sampler2D u_image;\n uniform float u_opacity;\n \n varying vec2 v_texCoord;\n \n void main() {\n gl_FragColor = texture2D(u_image, v_texCoord) * u_opacity;\n }\n`;\n\n/**\n * @typedef {Object} Options\n * @property {WebGLRenderingContext} webGlContext WebGL context; mandatory.\n * @property {number} [scaleRatio] Scale ratio; if < 1, the post process will render to a texture smaller than\n * the main canvas that will then be sampled up (useful for saving resource on blur steps).\n * @property {string} [vertexShader] Vertex shader source\n * @property {string} [fragmentShader] Fragment shader source\n * @property {Object<string,import(\"./Helper\").UniformValue>} [uniforms] Uniform definitions for the post process step\n */\n\n/**\n * @typedef {Object} UniformInternalDescription\n * @property {import(\"./Helper\").UniformValue} value Value\n * @property {WebGLUniformLocation} location Location\n * @property {WebGLTexture} [texture] Texture\n * @private\n */\n\n/**\n * @classdesc\n * This class is used to define Post Processing passes with custom shaders and uniforms.\n * This is used internally by {@link module:ol/webgl/Helper~WebGLHelper}.\n *\n * Please note that the final output on the DOM canvas is expected to have premultiplied alpha, which means that\n * a pixel which is 100% red with an opacity of 50% must have a color of (r=0.5, g=0, b=0, a=0.5).\n * Failing to provide pixel colors with premultiplied alpha will result in render anomalies.\n *\n * The default post-processing pass does *not* multiply color values with alpha value, it expects color values to be\n * premultiplied.\n *\n * Default shaders are shown hereafter:\n *\n * * Vertex shader:\n *\n * ```\n * precision mediump float;\n *\n * attribute vec2 a_position;\n * varying vec2 v_texCoord;\n * varying vec2 v_screenCoord;\n *\n * uniform vec2 u_screenSize;\n *\n * void main() {\n * v_texCoord = a_position * 0.5 + 0.5;\n * v_screenCoord = v_texCoord * u_screenSize;\n * gl_Position = vec4(a_position, 0.0, 1.0);\n * }\n * ```\n *\n * * Fragment shader:\n *\n * ```\n * precision mediump float;\n *\n * uniform sampler2D u_image;\n * uniform float u_opacity;\n *\n * varying vec2 v_texCoord;\n *\n * void main() {\n * gl_FragColor = texture2D(u_image, v_texCoord) * u_opacity;\n * }\n * ```\n *\n * @api\n */\nclass WebGLPostProcessingPass {\n /**\n * @param {Options} options Options.\n */\n constructor(options) {\n this.gl_ = options.webGlContext;\n const gl = this.gl_;\n\n this.scaleRatio_ = options.scaleRatio || 1;\n\n this.renderTargetTexture_ = gl.createTexture();\n this.renderTargetTextureSize_ = null;\n\n this.frameBuffer_ = gl.createFramebuffer();\n\n // compile the program for the frame buffer\n // TODO: make compilation errors show up\n const vertexShader = gl.createShader(gl.VERTEX_SHADER);\n gl.shaderSource(\n vertexShader,\n options.vertexShader || DEFAULT_VERTEX_SHADER\n );\n gl.compileShader(vertexShader);\n const fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);\n gl.shaderSource(\n fragmentShader,\n options.fragmentShader || DEFAULT_FRAGMENT_SHADER\n );\n gl.compileShader(fragmentShader);\n this.renderTargetProgram_ = gl.createProgram();\n gl.attachShader(this.renderTargetProgram_, vertexShader);\n gl.attachShader(this.renderTargetProgram_, fragmentShader);\n gl.linkProgram(this.renderTargetProgram_);\n\n // bind the vertices buffer for the frame buffer\n this.renderTargetVerticesBuffer_ = gl.createBuffer();\n const verticesArray = [-1, -1, 1, -1, -1, 1, 1, -1, 1, 1, -1, 1];\n gl.bindBuffer(gl.ARRAY_BUFFER, this.renderTargetVerticesBuffer_);\n gl.bufferData(\n gl.ARRAY_BUFFER,\n new Float32Array(verticesArray),\n gl.STATIC_DRAW\n );\n\n this.renderTargetAttribLocation_ = gl.getAttribLocation(\n this.renderTargetProgram_,\n 'a_position'\n );\n this.renderTargetUniformLocation_ = gl.getUniformLocation(\n this.renderTargetProgram_,\n 'u_screenSize'\n );\n this.renderTargetOpacityLocation_ = gl.getUniformLocation(\n this.renderTargetProgram_,\n 'u_opacity'\n );\n this.renderTargetTextureLocation_ = gl.getUniformLocation(\n this.renderTargetProgram_,\n 'u_image'\n );\n\n /**\n * Holds info about custom uniforms used in the post processing pass\n * @type {Array<UniformInternalDescription>}\n * @private\n */\n this.uniforms_ = [];\n options.uniforms &&\n Object.keys(options.uniforms).forEach((name) => {\n this.uniforms_.push({\n value: options.uniforms[name],\n location: gl.getUniformLocation(this.renderTargetProgram_, name),\n });\n });\n }\n\n /**\n * Get the WebGL rendering context\n * @return {WebGLRenderingContext} The rendering context.\n * @api\n */\n getGL() {\n return this.gl_;\n }\n\n /**\n * Initialize the render target texture of the post process, make sure it is at the\n * right size and bind it as a render target for the next draw calls.\n * The last step to be initialized will be the one where the primitives are rendered.\n * @param {import(\"../Map.js\").FrameState} frameState current frame state\n * @api\n */\n init(frameState) {\n const gl = this.getGL();\n const textureSize = [\n gl.drawingBufferWidth * this.scaleRatio_,\n gl.drawingBufferHeight * this.scaleRatio_,\n ];\n\n // rendering goes to my buffer\n gl.bindFramebuffer(gl.FRAMEBUFFER, this.getFrameBuffer());\n gl.viewport(0, 0, textureSize[0], textureSize[1]);\n\n // if size has changed: adjust canvas & render target texture\n if (\n !this.renderTargetTextureSize_ ||\n this.renderTargetTextureSize_[0] !== textureSize[0] ||\n this.renderTargetTextureSize_[1] !== textureSize[1]\n ) {\n this.renderTargetTextureSize_ = textureSize;\n\n // create a new texture\n const level = 0;\n const internalFormat = gl.RGBA;\n const border = 0;\n const format = gl.RGBA;\n const type = gl.UNSIGNED_BYTE;\n const data = null;\n gl.bindTexture(gl.TEXTURE_2D, this.renderTargetTexture_);\n gl.texImage2D(\n gl.TEXTURE_2D,\n level,\n internalFormat,\n textureSize[0],\n textureSize[1],\n border,\n format,\n type,\n data\n );\n\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n\n // bind the texture to the framebuffer\n gl.framebufferTexture2D(\n gl.FRAMEBUFFER,\n gl.COLOR_ATTACHMENT0,\n gl.TEXTURE_2D,\n this.renderTargetTexture_,\n 0\n );\n }\n }\n\n /**\n * Render to the next postprocessing pass (or to the canvas if final pass).\n * @param {import(\"../Map.js\").FrameState} frameState current frame state\n * @param {WebGLPostProcessingPass} [nextPass] Next pass, optional\n * @param {function(WebGLRenderingContext, import(\"../Map.js\").FrameState):void} [preCompose] Called before composing.\n * @param {function(WebGLRenderingContext, import(\"../Map.js\").FrameState):void} [postCompose] Called before composing.\n * @api\n */\n apply(frameState, nextPass, preCompose, postCompose) {\n const gl = this.getGL();\n const size = frameState.size;\n\n gl.bindFramebuffer(\n gl.FRAMEBUFFER,\n nextPass ? nextPass.getFrameBuffer() : null\n );\n gl.activeTexture(gl.TEXTURE0);\n gl.bindTexture(gl.TEXTURE_2D, this.renderTargetTexture_);\n\n if (!nextPass) {\n // clear the canvas if we are the first to render to it\n // and preserveDrawingBuffer is true\n const canvasId = getUid(gl.canvas);\n if (!frameState.renderTargets[canvasId]) {\n const attributes = gl.getContextAttributes();\n if (attributes && attributes.preserveDrawingBuffer) {\n gl.clearColor(0.0, 0.0, 0.0, 0.0);\n gl.clear(gl.COLOR_BUFFER_BIT);\n }\n\n frameState.renderTargets[canvasId] = true;\n }\n }\n\n gl.enable(gl.BLEND);\n gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA);\n gl.viewport(0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight);\n\n gl.bindBuffer(gl.ARRAY_BUFFER, this.renderTargetVerticesBuffer_);\n\n gl.useProgram(this.renderTargetProgram_);\n gl.enableVertexAttribArray(this.renderTargetAttribLocation_);\n gl.vertexAttribPointer(\n this.renderTargetAttribLocation_,\n 2,\n gl.FLOAT,\n false,\n 0,\n 0\n );\n gl.uniform2f(this.renderTargetUniformLocation_, size[0], size[1]);\n gl.uniform1i(this.renderTargetTextureLocation_, 0);\n\n const opacity = frameState.layerStatesArray[frameState.layerIndex].opacity;\n gl.uniform1f(this.renderTargetOpacityLocation_, opacity);\n\n this.applyUniforms(frameState);\n\n if (preCompose) {\n preCompose(gl, frameState);\n }\n gl.drawArrays(gl.TRIANGLES, 0, 6);\n if (postCompose) {\n postCompose(gl, frameState);\n }\n }\n\n /**\n * @return {WebGLFramebuffer} Frame buffer\n * @api\n */\n getFrameBuffer() {\n return this.frameBuffer_;\n }\n\n /**\n * Sets the custom uniforms based on what was given in the constructor.\n * @param {import(\"../Map.js\").FrameState} frameState Frame state.\n * @private\n */\n applyUniforms(frameState) {\n const gl = this.getGL();\n\n let value;\n let textureSlot = 1;\n this.uniforms_.forEach(function (uniform) {\n value =\n typeof uniform.value === 'function'\n ? uniform.value(frameState)\n : uniform.value;\n\n // apply value based on type\n if (value instanceof HTMLCanvasElement || value instanceof ImageData) {\n // create a texture & put data\n if (!uniform.texture) {\n uniform.texture = gl.createTexture();\n }\n gl.activeTexture(gl[`TEXTURE${textureSlot}`]);\n gl.bindTexture(gl.TEXTURE_2D, uniform.texture);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n\n if (value instanceof ImageData) {\n gl.texImage2D(\n gl.TEXTURE_2D,\n 0,\n gl.RGBA,\n gl.RGBA,\n value.width,\n value.height,\n 0,\n gl.UNSIGNED_BYTE,\n new Uint8Array(value.data)\n );\n } else {\n gl.texImage2D(\n gl.TEXTURE_2D,\n 0,\n gl.RGBA,\n gl.RGBA,\n gl.UNSIGNED_BYTE,\n value\n );\n }\n\n // fill texture slots\n gl.uniform1i(uniform.location, textureSlot++);\n } else if (Array.isArray(value)) {\n switch (value.length) {\n case 2:\n gl.uniform2f(uniform.location, value[0], value[1]);\n return;\n case 3:\n gl.uniform3f(uniform.location, value[0], value[1], value[2]);\n return;\n case 4:\n gl.uniform4f(\n uniform.location,\n value[0],\n value[1],\n value[2],\n value[3]\n );\n return;\n default:\n return;\n }\n } else if (typeof value === 'number') {\n gl.uniform1f(uniform.location, value);\n }\n });\n }\n}\n\nexport default WebGLPostProcessingPass;\n","/**\n * @module ol/vec/mat4\n */\n\n/**\n * @return {Array<number>} \"4x4 matrix representing a 3D identity transform.\"\n */\nexport function create() {\n return [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1];\n}\n\n/**\n * @param {Array<number>} mat4 Flattened 4x4 matrix receiving the result.\n * @param {import(\"../transform.js\").Transform} transform Transformation matrix.\n * @return {Array<number>} \"2D transformation matrix as flattened 4x4 matrix.\"\n */\nexport function fromTransform(mat4, transform) {\n mat4[0] = transform[0];\n mat4[1] = transform[1];\n mat4[4] = transform[2];\n mat4[5] = transform[3];\n mat4[12] = transform[4];\n mat4[13] = transform[5];\n return mat4;\n}\n","/**\n * @module ol/webgl/Helper\n */\nimport ContextEventType from '../webgl/ContextEventType.js';\nimport Disposable from '../Disposable.js';\nimport WebGLPostProcessingPass from './PostProcessingPass.js';\nimport {\n FLOAT,\n UNSIGNED_BYTE,\n UNSIGNED_INT,\n UNSIGNED_SHORT,\n getContext,\n} from '../webgl.js';\nimport {clear} from '../obj.js';\nimport {\n compose as composeTransform,\n create as createTransform,\n reset as resetTransform,\n rotate as rotateTransform,\n scale as scaleTransform,\n} from '../transform.js';\nimport {create, fromTransform} from '../vec/mat4.js';\nimport {getUid} from '../util.js';\n\n/**\n * @typedef {Object} BufferCacheEntry\n * @property {import(\"./Buffer.js\").default} buffer Buffer.\n * @property {WebGLBuffer} webGlBuffer WebGlBuffer.\n */\n\n/**\n * Shader types, either `FRAGMENT_SHADER` or `VERTEX_SHADER`.\n * @enum {number}\n */\nexport const ShaderType = {\n FRAGMENT_SHADER: 0x8b30,\n VERTEX_SHADER: 0x8b31,\n};\n\n/**\n * Names of uniforms made available to all shaders.\n * Please note: changing these *will* break custom shaders!\n * @enum {string}\n */\nexport const DefaultUniform = {\n PROJECTION_MATRIX: 'u_projectionMatrix',\n OFFSET_SCALE_MATRIX: 'u_offsetScaleMatrix',\n OFFSET_ROTATION_MATRIX: 'u_offsetRotateMatrix',\n TIME: 'u_time',\n ZOOM: 'u_zoom',\n RESOLUTION: 'u_resolution',\n VIEWPORT_SIZE_PX: 'u_viewportSizePx',\n PIXEL_RATIO: 'u_pixelRatio',\n};\n\n/**\n * Attribute types, either `UNSIGNED_BYTE`, `UNSIGNED_SHORT`, `UNSIGNED_INT` or `FLOAT`\n * Note: an attribute stored in a `Float32Array` should be of type `FLOAT`.\n * @enum {number}\n */\nexport const AttributeType = {\n UNSIGNED_BYTE: UNSIGNED_BYTE,\n UNSIGNED_SHORT: UNSIGNED_SHORT,\n UNSIGNED_INT: UNSIGNED_INT,\n FLOAT: FLOAT,\n};\n\n/**\n * Description of an attribute in a buffer\n * @typedef {Object} AttributeDescription\n * @property {string} name Attribute name to use in shaders\n * @property {number} size Number of components per attributes\n * @property {AttributeType} [type] Attribute type, i.e. number of bytes used to store the value. This is\n * determined by the class of typed array which the buffer uses (eg. `Float32Array` for a `FLOAT` attribute).\n * Default is `FLOAT`.\n */\n\n/**\n * @typedef {number|Array<number>|HTMLCanvasElement|HTMLImageElement|ImageData|import(\"../transform\").Transform} UniformLiteralValue\n */\n\n/**\n * Uniform value can be a number, array of numbers (2 to 4), canvas element or a callback returning\n * one of the previous types.\n * @typedef {UniformLiteralValue|function(import(\"../Map.js\").FrameState):UniformLiteralValue} UniformValue\n */\n\n/**\n * @typedef {Object} PostProcessesOptions\n * @property {number} [scaleRatio] Scale ratio; if < 1, the post process will render to a texture smaller than\n * the main canvas which will then be sampled up (useful for saving resource on blur steps).\n * @property {string} [vertexShader] Vertex shader source\n * @property {string} [fragmentShader] Fragment shader source\n * @property {Object<string,UniformValue>} [uniforms] Uniform definitions for the post process step\n */\n\n/**\n * @typedef {Object} Options\n * @property {Object<string,UniformValue>} [uniforms] Uniform definitions; property names must match the uniform\n * names in the provided or default shaders.\n * @property {Array<PostProcessesOptions>} [postProcesses] Post-processes definitions\n * @property {string} [canvasCacheKey] The cache key for the canvas.\n */\n\n/**\n * @typedef {Object} UniformInternalDescription\n * @property {string} name Name\n * @property {UniformValue} [value] Value\n * @property {UniformValue} [prevValue] The previous value.\n * @property {WebGLTexture} [texture] Texture\n * @private\n */\n\n/**\n * @typedef {Object} CanvasCacheItem\n * @property {HTMLCanvasElement} canvas Canvas element.\n * @property {number} users The count of users of this canvas.\n */\n\n/**\n * @type {Object<string,CanvasCacheItem>}\n */\nconst canvasCache = {};\n\n/**\n * @param {string} key The cache key for the canvas.\n * @return {string} The shared cache key.\n */\nfunction getSharedCanvasCacheKey(key) {\n return 'shared/' + key;\n}\n\nlet uniqueCanvasCacheKeyCount = 0;\n\n/**\n * @return {string} The unique cache key.\n */\nfunction getUniqueCanvasCacheKey() {\n const key = 'unique/' + uniqueCanvasCacheKeyCount;\n uniqueCanvasCacheKeyCount += 1;\n return key;\n}\n\n/**\n * @param {string} key The cache key for the canvas.\n * @return {HTMLCanvasElement} The canvas.\n */\nfunction getCanvas(key) {\n let cacheItem = canvasCache[key];\n if (!cacheItem) {\n const canvas = document.createElement('canvas');\n canvas.style.position = 'absolute';\n canvas.style.left = '0';\n cacheItem = {users: 0, canvas};\n canvasCache[key] = cacheItem;\n }\n\n cacheItem.users += 1;\n return cacheItem.canvas;\n}\n\n/**\n * @param {string} key The cache key for the canvas.\n */\nfunction releaseCanvas(key) {\n const cacheItem = canvasCache[key];\n if (!cacheItem) {\n return;\n }\n\n cacheItem.users -= 1;\n if (cacheItem.users > 0) {\n return;\n }\n\n const canvas = cacheItem.canvas;\n const gl = getContext(canvas);\n const extension = gl.getExtension('WEBGL_lose_context');\n if (extension) {\n extension.loseContext();\n }\n\n delete canvasCache[key];\n}\n\n/**\n * @classdesc\n * This class is intended to provide low-level functions related to WebGL rendering, so that accessing\n * directly the WebGL API should not be required anymore.\n *\n * Several operations are handled by the `WebGLHelper` class:\n *\n * ### Define custom shaders and uniforms\n *\n * *Shaders* are low-level programs executed on the GPU and written in GLSL. There are two types of shaders:\n *\n * Vertex shaders are used to manipulate the position and attribute of *vertices* of rendered primitives (ie. corners of a square).\n * Outputs are:\n *\n * * `gl_Position`: position of the vertex in screen space\n *\n * * Varyings usually prefixed with `v_` are passed on to the fragment shader\n *\n * Fragment shaders are used to control the actual color of the pixels drawn on screen. Their only output is `gl_FragColor`.\n *\n * Both shaders can take *uniforms* or *attributes* as input. Attributes are explained later. Uniforms are common, read-only values that\n * can be changed at every frame and can be of type float, arrays of float or images.\n *\n * Shaders must be compiled and assembled into a program like so:\n * ```js\n * // here we simply create two shaders and assemble them in a program which is then used\n * // for subsequent rendering calls; note how a frameState is required to set up a program,\n * // as several default uniforms are computed from it (projection matrix, zoom level, etc.)\n * const vertexShader = new WebGLVertex(VERTEX_SHADER);\n * const fragmentShader = new WebGLFragment(FRAGMENT_SHADER);\n * const program = this.context.getProgram(fragmentShader, vertexShader);\n * helper.useProgram(this.program, frameState);\n * ```\n *\n * Uniforms are defined using the `uniforms` option and can either be explicit values or callbacks taking the frame state as argument.\n * You can also change their value along the way like so:\n * ```js\n * helper.setUniformFloatValue('u_value', valueAsNumber);\n * ```\n *\n * ### Defining post processing passes\n *\n * *Post processing* describes the act of rendering primitives to a texture, and then rendering this texture to the final canvas\n * while applying special effects in screen space.\n * Typical uses are: blurring, color manipulation, depth of field, filtering...\n *\n * The `WebGLHelper` class offers the possibility to define post processes at creation time using the `postProcesses` option.\n * A post process step accepts the following options:\n *\n * * `fragmentShader` and `vertexShader`: text literals in GLSL language that will be compiled and used in the post processing step.\n * * `uniforms`: uniforms can be defined for the post processing steps just like for the main render.\n * * `scaleRatio`: allows using an intermediate texture smaller or higher than the final canvas in the post processing step.\n * This is typically used in blur steps to reduce the performance overhead by using an already downsampled texture as input.\n *\n * The {@link module:ol/webgl/PostProcessingPass~WebGLPostProcessingPass} class is used internally, refer to its documentation for more info.\n *\n * ### Binding WebGL buffers and flushing data into them\n *\n * Data that must be passed to the GPU has to be transferred using {@link module:ol/webgl/Buffer~WebGLArrayBuffer} objects.\n * A buffer has to be created only once, but must be bound every time the buffer content will be used for rendering.\n * This is done using {@link bindBuffer}.\n * When the buffer's array content has changed, the new data has to be flushed to the GPU memory; this is done using\n * {@link flushBufferData}. Note: this operation is expensive and should be done as infrequently as possible.\n *\n * When binding an array buffer, a `target` parameter must be given: it should be either {@link module:ol/webgl.ARRAY_BUFFER}\n * (if the buffer contains vertices data) or {@link module:ol/webgl.ELEMENT_ARRAY_BUFFER} (if the buffer contains indices data).\n *\n * Examples below:\n * ```js\n * // at initialization phase\n * const verticesBuffer = new WebGLArrayBuffer([], DYNAMIC_DRAW);\n * const indicesBuffer = new WebGLArrayBuffer([], DYNAMIC_DRAW);\n *\n * // when array values have changed\n * helper.flushBufferData(ARRAY_BUFFER, this.verticesBuffer);\n * helper.flushBufferData(ELEMENT_ARRAY_BUFFER, this.indicesBuffer);\n *\n * // at rendering phase\n * helper.bindBuffer(ARRAY_BUFFER, this.verticesBuffer);\n * helper.bindBuffer(ELEMENT_ARRAY_BUFFER, this.indicesBuffer);\n * ```\n *\n * ### Specifying attributes\n *\n * The GPU only receives the data as arrays of numbers. These numbers must be handled differently depending on what it describes (position, texture coordinate...).\n * Attributes are used to specify these uses. Specify the attribute names with\n * {@link module:ol/webgl/Helper~WebGLHelper#enableAttributes} (see code snippet below).\n *\n * Please note that you will have to specify the type and offset of the attributes in the data array. You can refer to the documentation of [WebGLRenderingContext.vertexAttribPointer](https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/vertexAttribPointer) for more explanation.\n * ```js\n * // here we indicate that the data array has the following structure:\n * // [posX, posY, offsetX, offsetY, texCoordU, texCoordV, posX, posY, ...]\n * helper.enableAttributes([\n * {\n * name: 'a_position',\n * size: 2\n * },\n * {\n * name: 'a_offset',\n * size: 2\n * },\n * {\n * name: 'a_texCoord',\n * size: 2\n * }\n * ])\n * ```\n *\n * ### Rendering primitives\n *\n * Once all the steps above have been achieved, rendering primitives to the screen is done using {@link prepareDraw}, {@link drawElements} and {@link finalizeDraw}.\n * ```js\n * // frame preparation step\n * helper.prepareDraw(frameState);\n *\n * // call this for every data array that has to be rendered on screen\n * helper.drawElements(0, this.indicesBuffer.getArray().length);\n *\n * // finalize the rendering by applying post processes\n * helper.finalizeDraw(frameState);\n * ```\n *\n * For an example usage of this class, refer to {@link module:ol/renderer/webgl/PointsLayer~WebGLPointsLayerRenderer}.\n */\nclass WebGLHelper extends Disposable {\n /**\n * @param {Options} [options] Options.\n */\n constructor(options) {\n super();\n options = options || {};\n\n /** @private */\n this.boundHandleWebGLContextLost_ = this.handleWebGLContextLost.bind(this);\n\n /** @private */\n this.boundHandleWebGLContextRestored_ =\n this.handleWebGLContextRestored.bind(this);\n\n /**\n * @private\n * @type {string}\n */\n this.canvasCacheKey_ = options.canvasCacheKey\n ? getSharedCanvasCacheKey(options.canvasCacheKey)\n : getUniqueCanvasCacheKey();\n\n /**\n * @private\n * @type {HTMLCanvasElement}\n */\n this.canvas_ = getCanvas(this.canvasCacheKey_);\n\n /**\n * @private\n * @type {WebGLRenderingContext}\n */\n this.gl_ = getContext(this.canvas_);\n\n /**\n * @private\n * @type {!Object<string, BufferCacheEntry>}\n */\n this.bufferCache_ = {};\n\n /**\n * @private\n * @type {Object<string, Object>}\n */\n this.extensionCache_ = {};\n\n /**\n * @private\n * @type {WebGLProgram}\n */\n this.currentProgram_ = null;\n\n this.canvas_.addEventListener(\n ContextEventType.LOST,\n this.boundHandleWebGLContextLost_\n );\n this.canvas_.addEventListener(\n ContextEventType.RESTORED,\n this.boundHandleWebGLContextRestored_\n );\n\n /**\n * @private\n * @type {import(\"../transform.js\").Transform}\n */\n this.offsetRotateMatrix_ = createTransform();\n\n /**\n * @private\n * @type {import(\"../transform.js\").Transform}\n */\n this.offsetScaleMatrix_ = createTransform();\n\n /**\n * @private\n * @type {Array<number>}\n */\n this.tmpMat4_ = create();\n\n /**\n * @private\n * @type {Object<string, Object<string, WebGLUniformLocation>>}\n */\n this.uniformLocationsByProgram_ = {};\n\n /**\n * @private\n * @type {Object<string, Object<string, number>>}\n */\n this.attribLocationsByProgram_ = {};\n\n /**\n * Holds info about custom uniforms used in the post processing pass.\n * If the uniform is a texture, the WebGL Texture object will be stored here.\n * @type {Array<UniformInternalDescription>}\n * @private\n */\n this.uniforms_ = [];\n if (options.uniforms) {\n this.setUniforms(options.uniforms);\n }\n\n /**\n * An array of PostProcessingPass objects is kept in this variable, built from the steps provided in the\n * options. If no post process was given, a default one is used (so as not to have to make an exception to\n * the frame buffer logic).\n * @type {Array<WebGLPostProcessingPass>}\n * @private\n */\n this.postProcessPasses_ = options.postProcesses\n ? options.postProcesses.map(\n (options) =>\n new WebGLPostProcessingPass({\n webGlContext: this.gl_,\n scaleRatio: options.scaleRatio,\n vertexShader: options.vertexShader,\n fragmentShader: options.fragmentShader,\n uniforms: options.uniforms,\n })\n )\n : [new WebGLPostProcessingPass({webGlContext: this.gl_})];\n\n /**\n * @type {string|null}\n * @private\n */\n this.shaderCompileErrors_ = null;\n\n /**\n * @type {number}\n * @private\n */\n this.startTime_ = Date.now();\n }\n\n /**\n * @param {Object<string, UniformValue>} uniforms Uniform definitions.\n */\n setUniforms(uniforms) {\n this.uniforms_ = [];\n for (const name in uniforms) {\n this.uniforms_.push({\n name: name,\n value: uniforms[name],\n });\n }\n }\n\n /**\n * @param {string} canvasCacheKey The canvas cache key.\n * @return {boolean} The provided key matches the one this helper was constructed with.\n */\n canvasCacheKeyMatches(canvasCacheKey) {\n return this.canvasCacheKey_ === getSharedCanvasCacheKey(canvasCacheKey);\n }\n\n /**\n * Get a WebGL extension. If the extension is not supported, null is returned.\n * Extensions are cached after they are enabled for the first time.\n * @param {string} name The extension name.\n * @return {Object|null} The extension or null if not supported.\n */\n getExtension(name) {\n if (name in this.extensionCache_) {\n return this.extensionCache_[name];\n }\n const extension = this.gl_.getExtension(name);\n this.extensionCache_[name] = extension;\n return extension;\n }\n\n /**\n * Just bind the buffer if it's in the cache. Otherwise create\n * the WebGL buffer, bind it, populate it, and add an entry to\n * the cache.\n * @param {import(\"./Buffer\").default} buffer Buffer.\n */\n bindBuffer(buffer) {\n const gl = this.gl_;\n const bufferKey = getUid(buffer);\n let bufferCache = this.bufferCache_[bufferKey];\n if (!bufferCache) {\n const webGlBuffer = gl.createBuffer();\n bufferCache = {\n buffer: buffer,\n webGlBuffer: webGlBuffer,\n };\n this.bufferCache_[bufferKey] = bufferCache;\n }\n gl.bindBuffer(buffer.getType(), bufferCache.webGlBuffer);\n }\n\n /**\n * Update the data contained in the buffer array; this is required for the\n * new data to be rendered\n * @param {import(\"./Buffer\").default} buffer Buffer.\n */\n flushBufferData(buffer) {\n const gl = this.gl_;\n this.bindBuffer(buffer);\n gl.bufferData(buffer.getType(), buffer.getArray(), buffer.getUsage());\n }\n\n /**\n * @param {import(\"./Buffer.js\").default} buf Buffer.\n */\n deleteBuffer(buf) {\n const gl = this.gl_;\n const bufferKey = getUid(buf);\n const bufferCacheEntry = this.bufferCache_[bufferKey];\n if (bufferCacheEntry && !gl.isContextLost()) {\n gl.deleteBuffer(bufferCacheEntry.webGlBuffer);\n }\n delete this.bufferCache_[bufferKey];\n }\n\n /**\n * Clean up.\n */\n disposeInternal() {\n this.canvas_.removeEventListener(\n ContextEventType.LOST,\n this.boundHandleWebGLContextLost_\n );\n this.canvas_.removeEventListener(\n ContextEventType.RESTORED,\n this.boundHandleWebGLContextRestored_\n );\n\n releaseCanvas(this.canvasCacheKey_);\n\n delete this.gl_;\n delete this.canvas_;\n }\n\n /**\n * Clear the buffer & set the viewport to draw.\n * Post process passes will be initialized here, the first one being bound as a render target for\n * subsequent draw calls.\n * @param {import(\"../Map.js\").FrameState} frameState current frame state\n * @param {boolean} [disableAlphaBlend] If true, no alpha blending will happen.\n */\n prepareDraw(frameState, disableAlphaBlend) {\n const gl = this.gl_;\n const canvas = this.getCanvas();\n const size = frameState.size;\n const pixelRatio = frameState.pixelRatio;\n\n if (\n canvas.width !== size[0] * pixelRatio ||\n canvas.height !== size[1] * pixelRatio\n ) {\n canvas.width = size[0] * pixelRatio;\n canvas.height = size[1] * pixelRatio;\n canvas.style.width = size[0] + 'px';\n canvas.style.height = size[1] + 'px';\n }\n\n // loop backwards in post processes list\n for (let i = this.postProcessPasses_.length - 1; i >= 0; i--) {\n this.postProcessPasses_[i].init(frameState);\n }\n\n gl.bindTexture(gl.TEXTURE_2D, null);\n\n gl.clearColor(0.0, 0.0, 0.0, 0.0);\n gl.clear(gl.COLOR_BUFFER_BIT);\n\n gl.enable(gl.BLEND);\n gl.blendFunc(gl.ONE, disableAlphaBlend ? gl.ZERO : gl.ONE_MINUS_SRC_ALPHA);\n }\n\n /**\n * Prepare a program to use a texture.\n * @param {WebGLTexture} texture The texture.\n * @param {number} slot The texture slot.\n * @param {string} uniformName The corresponding uniform name.\n */\n bindTexture(texture, slot, uniformName) {\n const gl = this.gl_;\n gl.activeTexture(gl.TEXTURE0 + slot);\n gl.bindTexture(gl.TEXTURE_2D, texture);\n gl.uniform1i(this.getUniformLocation(uniformName), slot);\n }\n\n /**\n * Clear the render target & bind it for future draw operations.\n * This is similar to `prepareDraw`, only post processes will not be applied.\n * Note: the whole viewport will be drawn to the render target, regardless of its size.\n * @param {import(\"../Map.js\").FrameState} frameState current frame state\n * @param {import(\"./RenderTarget.js\").default} renderTarget Render target to draw to\n * @param {boolean} [disableAlphaBlend] If true, no alpha blending will happen.\n */\n prepareDrawToRenderTarget(frameState, renderTarget, disableAlphaBlend) {\n const gl = this.gl_;\n const size = renderTarget.getSize();\n\n gl.bindFramebuffer(gl.FRAMEBUFFER, renderTarget.getFramebuffer());\n gl.viewport(0, 0, size[0], size[1]);\n gl.bindTexture(gl.TEXTURE_2D, renderTarget.getTexture());\n gl.clearColor(0.0, 0.0, 0.0, 0.0);\n gl.clear(gl.COLOR_BUFFER_BIT);\n gl.enable(gl.BLEND);\n gl.blendFunc(gl.ONE, disableAlphaBlend ? gl.ZERO : gl.ONE_MINUS_SRC_ALPHA);\n }\n\n /**\n * Execute a draw call based on the currently bound program, texture, buffers, attributes.\n * @param {number} start Start index.\n * @param {number} end End index.\n */\n drawElements(start, end) {\n const gl = this.gl_;\n this.getExtension('OES_element_index_uint');\n\n const elementType = gl.UNSIGNED_INT;\n const elementSize = 4;\n\n const numItems = end - start;\n const offsetInBytes = start * elementSize;\n gl.drawElements(gl.TRIANGLES, numItems, elementType, offsetInBytes);\n }\n\n /**\n * Apply the successive post process passes which will eventually render to the actual canvas.\n * @param {import(\"../Map.js\").FrameState} frameState current frame state\n * @param {function(WebGLRenderingContext, import(\"../Map.js\").FrameState):void} [preCompose] Called before composing.\n * @param {function(WebGLRenderingContext, import(\"../Map.js\").FrameState):void} [postCompose] Called before composing.\n */\n finalizeDraw(frameState, preCompose, postCompose) {\n // apply post processes using the next one as target\n for (let i = 0, ii = this.postProcessPasses_.length; i < ii; i++) {\n if (i === ii - 1) {\n this.postProcessPasses_[i].apply(\n frameState,\n null,\n preCompose,\n postCompose\n );\n } else {\n this.postProcessPasses_[i].apply(\n frameState,\n this.postProcessPasses_[i + 1]\n );\n }\n }\n }\n\n /**\n * @return {HTMLCanvasElement} Canvas.\n */\n getCanvas() {\n return this.canvas_;\n }\n\n /**\n * Get the WebGL rendering context\n * @return {WebGLRenderingContext} The rendering context.\n */\n getGL() {\n return this.gl_;\n }\n\n /**\n * Sets the default matrix uniforms for a given frame state. This is called internally in `prepareDraw`.\n * @param {import(\"../Map.js\").FrameState} frameState Frame state.\n */\n applyFrameState(frameState) {\n const size = frameState.size;\n const rotation = frameState.viewState.rotation;\n const pixelRatio = frameState.pixelRatio;\n\n const offsetScaleMatrix = resetTransform(this.offsetScaleMatrix_);\n scaleTransform(offsetScaleMatrix, 2 / size[0], 2 / size[1]);\n\n const offsetRotateMatrix = resetTransform(this.offsetRotateMatrix_);\n if (rotation !== 0) {\n rotateTransform(offsetRotateMatrix, -rotation);\n }\n\n this.setUniformMatrixValue(\n DefaultUniform.OFFSET_SCALE_MATRIX,\n fromTransform(this.tmpMat4_, offsetScaleMatrix)\n );\n this.setUniformMatrixValue(\n DefaultUniform.OFFSET_ROTATION_MATRIX,\n fromTransform(this.tmpMat4_, offsetRotateMatrix)\n );\n\n this.setUniformFloatValue(\n DefaultUniform.TIME,\n (Date.now() - this.startTime_) * 0.001\n );\n this.setUniformFloatValue(DefaultUniform.ZOOM, frameState.viewState.zoom);\n this.setUniformFloatValue(\n DefaultUniform.RESOLUTION,\n frameState.viewState.resolution\n );\n this.setUniformFloatValue(DefaultUniform.PIXEL_RATIO, pixelRatio);\n this.setUniformFloatVec2(DefaultUniform.VIEWPORT_SIZE_PX, [\n size[0],\n size[1],\n ]);\n }\n\n /**\n * Sets the custom uniforms based on what was given in the constructor. This is called internally in `prepareDraw`.\n * @param {import(\"../Map.js\").FrameState} frameState Frame state.\n */\n applyUniforms(frameState) {\n const gl = this.gl_;\n\n let value;\n let textureSlot = 0;\n this.uniforms_.forEach((uniform) => {\n value =\n typeof uniform.value === 'function'\n ? uniform.value(frameState)\n : uniform.value;\n\n // apply value based on type\n if (\n value instanceof HTMLCanvasElement ||\n value instanceof HTMLImageElement ||\n value instanceof ImageData\n ) {\n // create a texture & put data\n if (!uniform.texture) {\n uniform.prevValue = undefined;\n uniform.texture = gl.createTexture();\n }\n gl.activeTexture(gl[`TEXTURE${textureSlot}`]);\n gl.bindTexture(gl.TEXTURE_2D, uniform.texture);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n\n const imageReady =\n !(value instanceof HTMLImageElement) ||\n /** @type {HTMLImageElement} */ (value).complete;\n if (imageReady && uniform.prevValue !== value) {\n uniform.prevValue = value;\n gl.texImage2D(\n gl.TEXTURE_2D,\n 0,\n gl.RGBA,\n gl.RGBA,\n gl.UNSIGNED_BYTE,\n value\n );\n }\n\n // fill texture slots by increasing index\n gl.uniform1i(this.getUniformLocation(uniform.name), textureSlot++);\n } else if (Array.isArray(value) && value.length === 6) {\n this.setUniformMatrixValue(\n uniform.name,\n fromTransform(this.tmpMat4_, value)\n );\n } else if (Array.isArray(value) && value.length <= 4) {\n switch (value.length) {\n case 2:\n gl.uniform2f(\n this.getUniformLocation(uniform.name),\n value[0],\n value[1]\n );\n return;\n case 3:\n gl.uniform3f(\n this.getUniformLocation(uniform.name),\n value[0],\n value[1],\n value[2]\n );\n return;\n case 4:\n gl.uniform4f(\n this.getUniformLocation(uniform.name),\n value[0],\n value[1],\n value[2],\n value[3]\n );\n return;\n default:\n return;\n }\n } else if (typeof value === 'number') {\n gl.uniform1f(this.getUniformLocation(uniform.name), value);\n }\n });\n }\n\n /**\n * Set up a program for use. The program will be set as the current one. Then, the uniforms used\n * in the program will be set based on the current frame state and the helper configuration.\n * @param {WebGLProgram} program Program.\n * @param {import(\"../Map.js\").FrameState} frameState Frame state.\n */\n useProgram(program, frameState) {\n const gl = this.gl_;\n gl.useProgram(program);\n this.currentProgram_ = program;\n this.applyFrameState(frameState);\n this.applyUniforms(frameState);\n }\n\n /**\n * Will attempt to compile a vertex or fragment shader based on source\n * On error, the shader will be returned but\n * `gl.getShaderParameter(shader, gl.COMPILE_STATUS)` will return `true`\n * Use `gl.getShaderInfoLog(shader)` to have details\n * @param {string} source Shader source\n * @param {ShaderType} type VERTEX_SHADER or FRAGMENT_SHADER\n * @return {WebGLShader} Shader object\n */\n compileShader(source, type) {\n const gl = this.gl_;\n const shader = gl.createShader(type);\n gl.shaderSource(shader, source);\n gl.compileShader(shader);\n return shader;\n }\n\n /**\n * Create a program for a vertex and fragment shader. Throws if shader compilation fails.\n * @param {string} fragmentShaderSource Fragment shader source.\n * @param {string} vertexShaderSource Vertex shader source.\n * @return {WebGLProgram} Program\n */\n getProgram(fragmentShaderSource, vertexShaderSource) {\n const gl = this.gl_;\n\n const fragmentShader = this.compileShader(\n fragmentShaderSource,\n gl.FRAGMENT_SHADER\n );\n\n const vertexShader = this.compileShader(\n vertexShaderSource,\n gl.VERTEX_SHADER\n );\n\n const program = gl.createProgram();\n gl.attachShader(program, fragmentShader);\n gl.attachShader(program, vertexShader);\n gl.linkProgram(program);\n\n if (!gl.getShaderParameter(fragmentShader, gl.COMPILE_STATUS)) {\n const message = `Fragment shader compilation failed: ${gl.getShaderInfoLog(\n fragmentShader\n )}`;\n throw new Error(message);\n }\n gl.deleteShader(fragmentShader);\n\n if (!gl.getShaderParameter(vertexShader, gl.COMPILE_STATUS)) {\n const message = `Vertex shader compilation failed: ${gl.getShaderInfoLog(\n vertexShader\n )}`;\n throw new Error(message);\n }\n gl.deleteShader(vertexShader);\n\n if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {\n const message = `GL program linking failed: ${gl.getProgramInfoLog(\n program\n )}`;\n throw new Error(message);\n }\n\n return program;\n }\n\n /**\n * Will get the location from the shader or the cache\n * @param {string} name Uniform name\n * @return {WebGLUniformLocation} uniformLocation\n */\n getUniformLocation(name) {\n const programUid = getUid(this.currentProgram_);\n if (this.uniformLocationsByProgram_[programUid] === undefined) {\n this.uniformLocationsByProgram_[programUid] = {};\n }\n if (this.uniformLocationsByProgram_[programUid][name] === undefined) {\n this.uniformLocationsByProgram_[programUid][name] =\n this.gl_.getUniformLocation(this.currentProgram_, name);\n }\n return this.uniformLocationsByProgram_[programUid][name];\n }\n\n /**\n * Will get the location from the shader or the cache\n * @param {string} name Attribute name\n * @return {number} attribLocation\n */\n getAttributeLocation(name) {\n const programUid = getUid(this.currentProgram_);\n if (this.attribLocationsByProgram_[programUid] === undefined) {\n this.attribLocationsByProgram_[programUid] = {};\n }\n if (this.attribLocationsByProgram_[programUid][name] === undefined) {\n this.attribLocationsByProgram_[programUid][name] =\n this.gl_.getAttribLocation(this.currentProgram_, name);\n }\n return this.attribLocationsByProgram_[programUid][name];\n }\n\n /**\n * Sets the given transform to apply the rotation/translation/scaling of the given frame state.\n * The resulting transform can be used to convert world space coordinates to view coordinates in the [-1, 1] range.\n * @param {import(\"../Map.js\").FrameState} frameState Frame state.\n * @param {import(\"../transform\").Transform} transform Transform to update.\n * @return {import(\"../transform\").Transform} The updated transform object.\n */\n makeProjectionTransform(frameState, transform) {\n const size = frameState.size;\n const rotation = frameState.viewState.rotation;\n const resolution = frameState.viewState.resolution;\n const center = frameState.viewState.center;\n composeTransform(\n transform,\n 0,\n 0,\n 2 / (resolution * size[0]),\n 2 / (resolution * size[1]),\n -rotation,\n -center[0],\n -center[1]\n );\n return transform;\n }\n\n /**\n * Give a value for a standard float uniform\n * @param {string} uniform Uniform name\n * @param {number} value Value\n */\n setUniformFloatValue(uniform, value) {\n this.gl_.uniform1f(this.getUniformLocation(uniform), value);\n }\n\n /**\n * Give a value for a vec2 uniform\n * @param {string} uniform Uniform name\n * @param {Array<number>} value Array of length 4.\n */\n setUniformFloatVec2(uniform, value) {\n this.gl_.uniform2fv(this.getUniformLocation(uniform), value);\n }\n\n /**\n * Give a value for a vec4 uniform\n * @param {string} uniform Uniform name\n * @param {Array<number>} value Array of length 4.\n */\n setUniformFloatVec4(uniform, value) {\n this.gl_.uniform4fv(this.getUniformLocation(uniform), value);\n }\n\n /**\n * Give a value for a standard matrix4 uniform\n * @param {string} uniform Uniform name\n * @param {Array<number>} value Matrix value\n */\n setUniformMatrixValue(uniform, value) {\n this.gl_.uniformMatrix4fv(this.getUniformLocation(uniform), false, value);\n }\n\n /**\n * Will set the currently bound buffer to an attribute of the shader program. Used by `#enableAttributes`\n * internally.\n * @param {string} attribName Attribute name\n * @param {number} size Number of components per attributes\n * @param {number} type UNSIGNED_INT, UNSIGNED_BYTE, UNSIGNED_SHORT or FLOAT\n * @param {number} stride Stride in bytes (0 means attribs are packed)\n * @param {number} offset Offset in bytes\n * @private\n */\n enableAttributeArray_(attribName, size, type, stride, offset) {\n const location = this.getAttributeLocation(attribName);\n // the attribute has not been found in the shaders; do not enable it\n if (location < 0) {\n return;\n }\n this.gl_.enableVertexAttribArray(location);\n this.gl_.vertexAttribPointer(location, size, type, false, stride, offset);\n }\n\n /**\n * Will enable the following attributes to be read from the currently bound buffer,\n * i.e. tell the GPU where to read the different attributes in the buffer. An error in the\n * size/type/order of attributes will most likely break the rendering and throw a WebGL exception.\n * @param {Array<AttributeDescription>} attributes Ordered list of attributes to read from the buffer\n */\n enableAttributes(attributes) {\n const stride = computeAttributesStride(attributes);\n let offset = 0;\n for (let i = 0; i < attributes.length; i++) {\n const attr = attributes[i];\n this.enableAttributeArray_(\n attr.name,\n attr.size,\n attr.type || FLOAT,\n stride,\n offset\n );\n offset += attr.size * getByteSizeFromType(attr.type);\n }\n }\n\n /**\n * WebGL context was lost\n * @private\n */\n handleWebGLContextLost() {\n clear(this.bufferCache_);\n this.currentProgram_ = null;\n }\n\n /**\n * WebGL context was restored\n * @private\n */\n handleWebGLContextRestored() {}\n\n /**\n * Will create or reuse a given webgl texture and apply the given size. If no image data\n * specified, the texture will be empty, otherwise image data will be used and the `size`\n * parameter will be ignored.\n * Note: wrap parameters are set to clamp to edge, min filter is set to linear.\n * @param {Array<number>} size Expected size of the texture\n * @param {ImageData|HTMLImageElement|HTMLCanvasElement} [data] Image data/object to bind to the texture\n * @param {WebGLTexture} [texture] Existing texture to reuse\n * @return {WebGLTexture} The generated texture\n */\n createTexture(size, data, texture) {\n const gl = this.gl_;\n texture = texture || gl.createTexture();\n\n // set params & size\n const level = 0;\n const internalFormat = gl.RGBA;\n const border = 0;\n const format = gl.RGBA;\n const type = gl.UNSIGNED_BYTE;\n gl.bindTexture(gl.TEXTURE_2D, texture);\n if (data) {\n gl.texImage2D(gl.TEXTURE_2D, level, internalFormat, format, type, data);\n } else {\n gl.texImage2D(\n gl.TEXTURE_2D,\n level,\n internalFormat,\n size[0],\n size[1],\n border,\n format,\n type,\n null\n );\n }\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n\n return texture;\n }\n}\n\n/**\n * Compute a stride in bytes based on a list of attributes\n * @param {Array<AttributeDescription>} attributes Ordered list of attributes\n * @return {number} Stride, ie amount of values for each vertex in the vertex buffer\n */\nexport function computeAttributesStride(attributes) {\n let stride = 0;\n for (let i = 0; i < attributes.length; i++) {\n const attr = attributes[i];\n stride += attr.size * getByteSizeFromType(attr.type);\n }\n return stride;\n}\n\n/**\n * Computes the size in byte of an attribute type.\n * @param {AttributeType} type Attribute type\n * @return {number} The size in bytes\n */\nfunction getByteSizeFromType(type) {\n switch (type) {\n case AttributeType.UNSIGNED_BYTE:\n return Uint8Array.BYTES_PER_ELEMENT;\n case AttributeType.UNSIGNED_SHORT:\n return Uint16Array.BYTES_PER_ELEMENT;\n case AttributeType.UNSIGNED_INT:\n return Uint32Array.BYTES_PER_ELEMENT;\n case AttributeType.FLOAT:\n default:\n return Float32Array.BYTES_PER_ELEMENT;\n }\n}\n\nexport default WebGLHelper;\n","/**\n * @module ol/renderer/webgl/Layer\n */\nimport LayerProperty from '../../layer/Property.js';\nimport LayerRenderer from '../Layer.js';\nimport RenderEvent from '../../render/Event.js';\nimport RenderEventType from '../../render/EventType.js';\nimport WebGLHelper from '../../webgl/Helper.js';\nimport {\n compose as composeTransform,\n create as createTransform,\n} from '../../transform.js';\n\n/**\n * @typedef {Object} PostProcessesOptions\n * @property {number} [scaleRatio] Scale ratio; if < 1, the post process will render to a texture smaller than\n * the main canvas that will then be sampled up (useful for saving resource on blur steps).\n * @property {string} [vertexShader] Vertex shader source\n * @property {string} [fragmentShader] Fragment shader source\n * @property {Object<string,import(\"../../webgl/Helper\").UniformValue>} [uniforms] Uniform definitions for the post process step\n */\n\n/**\n * @typedef {Object} Options\n * @property {Object<string,import(\"../../webgl/Helper\").UniformValue>} [uniforms] Uniform definitions for the post process steps\n * @property {Array<PostProcessesOptions>} [postProcesses] Post-processes definitions\n */\n\n/**\n * @classdesc\n * Base WebGL renderer class.\n * Holds all logic related to data manipulation & some common rendering logic\n * @template {import(\"../../layer/Layer.js\").default} LayerType\n * @extends {LayerRenderer<LayerType>}\n */\nclass WebGLLayerRenderer extends LayerRenderer {\n /**\n * @param {LayerType} layer Layer.\n * @param {Options} [options] Options.\n */\n constructor(layer, options) {\n super(layer);\n\n options = options || {};\n\n /**\n * The transform for viewport CSS pixels to rendered pixels. This transform is only\n * set before dispatching rendering events.\n * @private\n * @type {import(\"../../transform.js\").Transform}\n */\n this.inversePixelTransform_ = createTransform();\n\n /**\n * @private\n * @type {CanvasRenderingContext2D}\n */\n this.pixelContext_ = null;\n\n /**\n * @private\n */\n this.postProcesses_ = options.postProcesses;\n\n /**\n * @private\n */\n this.uniforms_ = options.uniforms;\n\n /**\n * @type {WebGLHelper}\n * @protected\n */\n this.helper;\n\n layer.addChangeListener(LayerProperty.MAP, this.removeHelper.bind(this));\n\n this.dispatchPreComposeEvent = this.dispatchPreComposeEvent.bind(this);\n this.dispatchPostComposeEvent = this.dispatchPostComposeEvent.bind(this);\n }\n\n /**\n * @param {WebGLRenderingContext} context The WebGL rendering context.\n * @param {import(\"../../Map.js\").FrameState} frameState Frame state.\n * @protected\n */\n dispatchPreComposeEvent(context, frameState) {\n const layer = this.getLayer();\n if (layer.hasListener(RenderEventType.PRECOMPOSE)) {\n const event = new RenderEvent(\n RenderEventType.PRECOMPOSE,\n undefined,\n frameState,\n context\n );\n layer.dispatchEvent(event);\n }\n }\n\n /**\n * @param {WebGLRenderingContext} context The WebGL rendering context.\n * @param {import(\"../../Map.js\").FrameState} frameState Frame state.\n * @protected\n */\n dispatchPostComposeEvent(context, frameState) {\n const layer = this.getLayer();\n if (layer.hasListener(RenderEventType.POSTCOMPOSE)) {\n const event = new RenderEvent(\n RenderEventType.POSTCOMPOSE,\n undefined,\n frameState,\n context\n );\n layer.dispatchEvent(event);\n }\n }\n\n /**\n * Reset options (only handles uniforms).\n * @param {Options} options Options.\n */\n reset(options) {\n this.uniforms_ = options.uniforms;\n if (this.helper) {\n this.helper.setUniforms(this.uniforms_);\n }\n }\n\n /**\n * @protected\n */\n removeHelper() {\n if (this.helper) {\n this.helper.dispose();\n delete this.helper;\n }\n }\n\n /**\n * Determine whether renderFrame should be called.\n * @param {import(\"../../Map.js\").FrameState} frameState Frame state.\n * @return {boolean} Layer is ready to be rendered.\n */\n prepareFrame(frameState) {\n if (this.getLayer().getRenderSource()) {\n let incrementGroup = true;\n let groupNumber = -1;\n let className;\n for (let i = 0, ii = frameState.layerStatesArray.length; i < ii; i++) {\n const layer = frameState.layerStatesArray[i].layer;\n const renderer = layer.getRenderer();\n if (!(renderer instanceof WebGLLayerRenderer)) {\n incrementGroup = true;\n continue;\n }\n const layerClassName = layer.getClassName();\n if (incrementGroup || layerClassName !== className) {\n groupNumber += 1;\n incrementGroup = false;\n }\n className = layerClassName;\n if (renderer === this) {\n break;\n }\n }\n\n const canvasCacheKey =\n 'map/' + frameState.mapId + '/group/' + groupNumber;\n\n if (!this.helper || !this.helper.canvasCacheKeyMatches(canvasCacheKey)) {\n this.removeHelper();\n\n this.helper = new WebGLHelper({\n postProcesses: this.postProcesses_,\n uniforms: this.uniforms_,\n canvasCacheKey: canvasCacheKey,\n });\n\n if (className) {\n this.helper.getCanvas().className = className;\n }\n\n this.afterHelperCreated();\n }\n }\n\n return this.prepareFrameInternal(frameState);\n }\n\n /**\n * @protected\n */\n afterHelperCreated() {}\n\n /**\n * Determine whether renderFrame should be called.\n * @param {import(\"../../Map.js\").FrameState} frameState Frame state.\n * @return {boolean} Layer is ready to be rendered.\n * @protected\n */\n prepareFrameInternal(frameState) {\n return true;\n }\n\n /**\n * Clean up.\n */\n disposeInternal() {\n this.removeHelper();\n super.disposeInternal();\n }\n\n /**\n * @param {import(\"../../render/EventType.js\").default} type Event type.\n * @param {WebGLRenderingContext} context The rendering context.\n * @param {import(\"../../Map.js\").FrameState} frameState Frame state.\n * @private\n */\n dispatchRenderEvent_(type, context, frameState) {\n const layer = this.getLayer();\n if (layer.hasListener(type)) {\n composeTransform(\n this.inversePixelTransform_,\n 0,\n 0,\n frameState.pixelRatio,\n -frameState.pixelRatio,\n 0,\n 0,\n -frameState.size[1]\n );\n\n const event = new RenderEvent(\n type,\n this.inversePixelTransform_,\n frameState,\n context\n );\n layer.dispatchEvent(event);\n }\n }\n\n /**\n * @param {WebGLRenderingContext} context The rendering context.\n * @param {import(\"../../Map.js\").FrameState} frameState Frame state.\n * @protected\n */\n preRender(context, frameState) {\n this.dispatchRenderEvent_(RenderEventType.PRERENDER, context, frameState);\n }\n\n /**\n * @param {WebGLRenderingContext} context The rendering context.\n * @param {import(\"../../Map.js\").FrameState} frameState Frame state.\n * @protected\n */\n postRender(context, frameState) {\n this.dispatchRenderEvent_(RenderEventType.POSTRENDER, context, frameState);\n }\n}\n\nexport default WebGLLayerRenderer;\n","/**\n * A wrapper class to simplify rendering to a texture instead of the final canvas\n * @module ol/webgl/RenderTarget\n */\nimport {equals} from '../array.js';\n\n// for pixel color reading\nconst tmpArray4 = new Uint8Array(4);\n\n/**\n * @classdesc\n * This class is a wrapper around the association of both a `WebGLTexture` and a `WebGLFramebuffer` instances,\n * simplifying initialization and binding for rendering.\n * @api\n */\nclass WebGLRenderTarget {\n /**\n * @param {import(\"./Helper.js\").default} helper WebGL helper; mandatory.\n * @param {Array<number>} [size] Expected size of the render target texture; note: this can be changed later on.\n */\n constructor(helper, size) {\n /**\n * @private\n * @type {import(\"./Helper.js\").default}\n */\n this.helper_ = helper;\n const gl = helper.getGL();\n\n /**\n * @private\n * @type {WebGLTexture}\n */\n this.texture_ = gl.createTexture();\n\n /**\n * @private\n * @type {WebGLFramebuffer}\n */\n this.framebuffer_ = gl.createFramebuffer();\n\n /**\n * @type {Array<number>}\n * @private\n */\n this.size_ = size || [1, 1];\n\n /**\n * @type {Uint8Array}\n * @private\n */\n this.data_ = new Uint8Array(0);\n\n /**\n * @type {boolean}\n * @private\n */\n this.dataCacheDirty_ = true;\n\n this.updateSize_();\n }\n\n /**\n * Changes the size of the render target texture. Note: will do nothing if the size\n * is already the same.\n * @param {Array<number>} size Expected size of the render target texture\n * @api\n */\n setSize(size) {\n if (equals(size, this.size_)) {\n return;\n }\n this.size_[0] = size[0];\n this.size_[1] = size[1];\n this.updateSize_();\n }\n\n /**\n * Returns the size of the render target texture\n * @return {Array<number>} Size of the render target texture\n * @api\n */\n getSize() {\n return this.size_;\n }\n\n /**\n * This will cause following calls to `#readAll` or `#readPixel` to download the content of the\n * render target into memory, which is an expensive operation.\n * This content will be kept in cache but should be cleared after each new render.\n * @api\n */\n clearCachedData() {\n this.dataCacheDirty_ = true;\n }\n\n /**\n * Returns the full content of the frame buffer as a series of r, g, b, a components\n * in the 0-255 range (unsigned byte).\n * @return {Uint8Array} Integer array of color values\n * @api\n */\n readAll() {\n if (this.dataCacheDirty_) {\n const size = this.size_;\n const gl = this.helper_.getGL();\n\n gl.bindFramebuffer(gl.FRAMEBUFFER, this.framebuffer_);\n gl.readPixels(\n 0,\n 0,\n size[0],\n size[1],\n gl.RGBA,\n gl.UNSIGNED_BYTE,\n this.data_\n );\n this.dataCacheDirty_ = false;\n }\n return this.data_;\n }\n\n /**\n * Reads one pixel of the frame buffer as an array of r, g, b, a components\n * in the 0-255 range (unsigned byte).\n * If x and/or y are outside of existing data, an array filled with 0 is returned.\n * @param {number} x Pixel coordinate\n * @param {number} y Pixel coordinate\n * @return {Uint8Array} Integer array with one color value (4 components)\n * @api\n */\n readPixel(x, y) {\n if (x < 0 || y < 0 || x > this.size_[0] || y >= this.size_[1]) {\n tmpArray4[0] = 0;\n tmpArray4[1] = 0;\n tmpArray4[2] = 0;\n tmpArray4[3] = 0;\n return tmpArray4;\n }\n\n this.readAll();\n const index =\n Math.floor(x) + (this.size_[1] - Math.floor(y) - 1) * this.size_[0];\n tmpArray4[0] = this.data_[index * 4];\n tmpArray4[1] = this.data_[index * 4 + 1];\n tmpArray4[2] = this.data_[index * 4 + 2];\n tmpArray4[3] = this.data_[index * 4 + 3];\n return tmpArray4;\n }\n\n /**\n * @return {WebGLTexture} Texture to render to\n */\n getTexture() {\n return this.texture_;\n }\n\n /**\n * @return {WebGLFramebuffer} Frame buffer of the render target\n */\n getFramebuffer() {\n return this.framebuffer_;\n }\n\n /**\n * @private\n */\n updateSize_() {\n const size = this.size_;\n const gl = this.helper_.getGL();\n\n this.texture_ = this.helper_.createTexture(size, null, this.texture_);\n\n gl.bindFramebuffer(gl.FRAMEBUFFER, this.framebuffer_);\n gl.viewport(0, 0, size[0], size[1]);\n gl.framebufferTexture2D(\n gl.FRAMEBUFFER,\n gl.COLOR_ATTACHMENT0,\n gl.TEXTURE_2D,\n this.texture_,\n 0\n );\n\n this.data_ = new Uint8Array(size[0] * size[1] * 4);\n }\n}\n\nexport default WebGLRenderTarget;\n","/**\n * @module ol/render/webgl/constants\n */\n\n/**\n * @enum {string}\n */\nexport const WebGLWorkerMessageType = {\n GENERATE_POLYGON_BUFFERS: 'GENERATE_POLYGON_BUFFERS',\n GENERATE_POINT_BUFFERS: 'GENERATE_POINT_BUFFERS',\n GENERATE_LINE_STRING_BUFFERS: 'GENERATE_LINE_STRING_BUFFERS',\n};\n\n/**\n * @typedef {Object} WebGLWorkerGenerateBuffersMessage\n * This message will trigger the generation of a vertex and an index buffer based on the given render instructions.\n * When the buffers are generated, the worked will send a message of the same type to the main thread, with\n * the generated buffers in it.\n * Note that any addition properties present in the message *will* be sent back to the main thread.\n * @property {number} id Message id; will be used both in request and response as a means of identification\n * @property {WebGLWorkerMessageType} type Message type\n * @property {ArrayBuffer} renderInstructions Polygon render instructions raw binary buffer.\n * @property {number} [customAttributesSize] Amount of custom attributes count in the polygon render instructions.\n * @property {ArrayBuffer} [vertexBuffer] Vertices array raw binary buffer (sent by the worker).\n * @property {ArrayBuffer} [indexBuffer] Indices array raw binary buffer (sent by the worker).\n * @property {import(\"../../transform\").Transform} [renderInstructionsTransform] Transformation matrix used to project the instructions coordinates\n */\n","/**\n * @module ol/render/webgl/utils\n */\nimport earcut from 'earcut';\nimport {apply as applyTransform} from '../../transform.js';\nimport {clamp} from '../../math.js';\n\nconst tmpArray_ = [];\n\n/**\n * An object holding positions both in an index and a vertex buffer.\n * @typedef {Object} BufferPositions\n * @property {number} vertexPosition Position in the vertex buffer\n * @property {number} indexPosition Position in the index buffer\n */\nconst bufferPositions_ = {vertexPosition: 0, indexPosition: 0};\n\nfunction writePointVertex(buffer, pos, x, y, index) {\n buffer[pos + 0] = x;\n buffer[pos + 1] = y;\n buffer[pos + 2] = index;\n}\n\n/**\n * Pushes a quad (two triangles) based on a point geometry\n * @param {Float32Array} instructions Array of render instructions for points.\n * @param {number} elementIndex Index from which render instructions will be read.\n * @param {Float32Array} vertexBuffer Buffer in the form of a typed array.\n * @param {Uint32Array} indexBuffer Buffer in the form of a typed array.\n * @param {number} customAttributesSize Amount of custom attributes for each element.\n * @param {BufferPositions} [bufferPositions] Buffer write positions; if not specified, positions will be set at 0.\n * @return {BufferPositions} New buffer positions where to write next\n * @property {number} vertexPosition New position in the vertex buffer where future writes should start.\n * @property {number} indexPosition New position in the index buffer where future writes should start.\n * @private\n */\nexport function writePointFeatureToBuffers(\n instructions,\n elementIndex,\n vertexBuffer,\n indexBuffer,\n customAttributesSize,\n bufferPositions\n) {\n // This is for x, y and index\n const baseVertexAttrsCount = 3;\n const baseInstructionsCount = 2;\n const stride = baseVertexAttrsCount + customAttributesSize;\n\n const x = instructions[elementIndex + 0];\n const y = instructions[elementIndex + 1];\n\n // read custom numerical attributes on the feature\n const customAttrs = tmpArray_;\n customAttrs.length = customAttributesSize;\n for (let i = 0; i < customAttrs.length; i++) {\n customAttrs[i] = instructions[elementIndex + baseInstructionsCount + i];\n }\n\n let vPos = bufferPositions ? bufferPositions.vertexPosition : 0;\n let iPos = bufferPositions ? bufferPositions.indexPosition : 0;\n const baseIndex = vPos / stride;\n\n // push vertices for each of the four quad corners (first standard then custom attributes)\n writePointVertex(vertexBuffer, vPos, x, y, 0);\n customAttrs.length &&\n vertexBuffer.set(customAttrs, vPos + baseVertexAttrsCount);\n vPos += stride;\n\n writePointVertex(vertexBuffer, vPos, x, y, 1);\n customAttrs.length &&\n vertexBuffer.set(customAttrs, vPos + baseVertexAttrsCount);\n vPos += stride;\n\n writePointVertex(vertexBuffer, vPos, x, y, 2);\n customAttrs.length &&\n vertexBuffer.set(customAttrs, vPos + baseVertexAttrsCount);\n vPos += stride;\n\n writePointVertex(vertexBuffer, vPos, x, y, 3);\n customAttrs.length &&\n vertexBuffer.set(customAttrs, vPos + baseVertexAttrsCount);\n vPos += stride;\n\n indexBuffer[iPos++] = baseIndex;\n indexBuffer[iPos++] = baseIndex + 1;\n indexBuffer[iPos++] = baseIndex + 3;\n indexBuffer[iPos++] = baseIndex + 1;\n indexBuffer[iPos++] = baseIndex + 2;\n indexBuffer[iPos++] = baseIndex + 3;\n\n bufferPositions_.vertexPosition = vPos;\n bufferPositions_.indexPosition = iPos;\n\n return bufferPositions_;\n}\n\n/**\n * Pushes a single quad to form a line segment; also includes a computation for the join angles with previous and next\n * segment, in order to be able to offset the vertices correctly in the shader\n * @param {Float32Array} instructions Array of render instructions for lines.\n * @param {number} segmentStartIndex Index of the segment start point from which render instructions will be read.\n * @param {number} segmentEndIndex Index of the segment start point from which render instructions will be read.\n * @param {number|null} beforeSegmentIndex Index of the point right before the segment (null if none, e.g this is a line start)\n * @param {number|null} afterSegmentIndex Index of the point right after the segment (null if none, e.g this is a line end)\n * @param {Array<number>} vertexArray Array containing vertices.\n * @param {Array<number>} indexArray Array containing indices.\n * @param {Array<number>} customAttributes Array of custom attributes value\n * @param {import('../../transform.js').Transform} instructionsTransform Transform matrix used to project coordinates in instructions\n * @param {import('../../transform.js').Transform} invertInstructionsTransform Transform matrix used to project coordinates in instructions\n * @private\n */\nexport function writeLineSegmentToBuffers(\n instructions,\n segmentStartIndex,\n segmentEndIndex,\n beforeSegmentIndex,\n afterSegmentIndex,\n vertexArray,\n indexArray,\n customAttributes,\n instructionsTransform,\n invertInstructionsTransform\n) {\n // compute the stride to determine how many vertices were already pushed\n const baseVertexAttrsCount = 5; // base attributes: x0, y0, x1, y1, params (vertex number [0-3], join angle 1, join angle 2)\n const stride = baseVertexAttrsCount + customAttributes.length;\n const baseIndex = vertexArray.length / stride;\n\n // The segment is composed of two positions called P0[x0, y0] and P1[x1, y1]\n // Depending on whether there are points before and after the segment, its final shape\n // will be different\n const p0 = [\n instructions[segmentStartIndex + 0],\n instructions[segmentStartIndex + 1],\n ];\n const p1 = [instructions[segmentEndIndex], instructions[segmentEndIndex + 1]];\n\n // to compute offsets from the line center we need to reproject\n // coordinates back in world units and compute the length of the segment\n const p0world = applyTransform(invertInstructionsTransform, [...p0]);\n const p1world = applyTransform(invertInstructionsTransform, [...p1]);\n\n function computeVertexParameters(vertexNumber, joinAngle1, joinAngle2) {\n const shift = 10000;\n const anglePrecision = 1500;\n return (\n Math.round(joinAngle1 * anglePrecision) +\n Math.round(joinAngle2 * anglePrecision) * shift +\n vertexNumber * shift * shift\n );\n }\n\n // compute the angle between p0pA and p0pB\n // returns a value in [0, 2PI]\n function angleBetween(p0, pA, pB) {\n const lenA = Math.sqrt(\n (pA[0] - p0[0]) * (pA[0] - p0[0]) + (pA[1] - p0[1]) * (pA[1] - p0[1])\n );\n const tangentA = [(pA[0] - p0[0]) / lenA, (pA[1] - p0[1]) / lenA];\n const orthoA = [-tangentA[1], tangentA[0]];\n const lenB = Math.sqrt(\n (pB[0] - p0[0]) * (pB[0] - p0[0]) + (pB[1] - p0[1]) * (pB[1] - p0[1])\n );\n const tangentB = [(pB[0] - p0[0]) / lenB, (pB[1] - p0[1]) / lenB];\n\n // this angle can be clockwise or anticlockwise; hence the computation afterwards\n const angle =\n lenA === 0 || lenB === 0\n ? 0\n : Math.acos(\n clamp(tangentB[0] * tangentA[0] + tangentB[1] * tangentA[1], -1, 1)\n );\n const isClockwise = tangentB[0] * orthoA[0] + tangentB[1] * orthoA[1] > 0;\n return !isClockwise ? Math.PI * 2 - angle : angle;\n }\n\n const joinBefore = beforeSegmentIndex !== null;\n const joinAfter = afterSegmentIndex !== null;\n\n let angle0 = 0;\n let angle1 = 0;\n\n // add vertices and adapt offsets for P0 in case of join\n if (joinBefore) {\n // B for before\n const pB = [\n instructions[beforeSegmentIndex],\n instructions[beforeSegmentIndex + 1],\n ];\n const pBworld = applyTransform(invertInstructionsTransform, [...pB]);\n angle0 = angleBetween(p0world, p1world, pBworld);\n }\n // adapt offsets for P1 in case of join\n if (joinAfter) {\n // A for after\n const pA = [\n instructions[afterSegmentIndex],\n instructions[afterSegmentIndex + 1],\n ];\n const pAworld = applyTransform(invertInstructionsTransform, [...pA]);\n angle1 = angleBetween(p1world, p0world, pAworld);\n }\n\n // add main segment triangles\n vertexArray.push(\n p0[0],\n p0[1],\n p1[0],\n p1[1],\n computeVertexParameters(0, angle0, angle1)\n );\n vertexArray.push(...customAttributes);\n\n vertexArray.push(\n p0[0],\n p0[1],\n p1[0],\n p1[1],\n computeVertexParameters(1, angle0, angle1)\n );\n vertexArray.push(...customAttributes);\n\n vertexArray.push(\n p0[0],\n p0[1],\n p1[0],\n p1[1],\n computeVertexParameters(2, angle0, angle1)\n );\n vertexArray.push(...customAttributes);\n\n vertexArray.push(\n p0[0],\n p0[1],\n p1[0],\n p1[1],\n computeVertexParameters(3, angle0, angle1)\n );\n vertexArray.push(...customAttributes);\n\n indexArray.push(\n baseIndex,\n baseIndex + 1,\n baseIndex + 2,\n baseIndex + 1,\n baseIndex + 3,\n baseIndex + 2\n );\n}\n\n/**\n * Pushes several triangles to form a polygon, including holes\n * @param {Float32Array} instructions Array of render instructions for lines.\n * @param {number} polygonStartIndex Index of the polygon start point from which render instructions will be read.\n * @param {Array<number>} vertexArray Array containing vertices.\n * @param {Array<number>} indexArray Array containing indices.\n * @param {number} customAttributesSize Amount of custom attributes for each element.\n * @return {number} Next polygon instructions index\n * @private\n */\nexport function writePolygonTrianglesToBuffers(\n instructions,\n polygonStartIndex,\n vertexArray,\n indexArray,\n customAttributesSize\n) {\n const instructionsPerVertex = 2; // x, y\n const attributesPerVertex = 2 + customAttributesSize;\n let instructionsIndex = polygonStartIndex;\n const customAttributes = instructions.slice(\n instructionsIndex,\n instructionsIndex + customAttributesSize\n );\n instructionsIndex += customAttributesSize;\n const ringsCount = instructions[instructionsIndex++];\n let verticesCount = 0;\n const holes = new Array(ringsCount - 1);\n for (let i = 0; i < ringsCount; i++) {\n verticesCount += instructions[instructionsIndex++];\n if (i < ringsCount - 1) {\n holes[i] = verticesCount;\n }\n }\n const flatCoords = instructions.slice(\n instructionsIndex,\n instructionsIndex + verticesCount * instructionsPerVertex\n );\n\n // pushing to vertices and indices!! this is where the magic happens\n const result = earcut(flatCoords, holes, instructionsPerVertex);\n for (let i = 0; i < result.length; i++) {\n indexArray.push(result[i] + vertexArray.length / attributesPerVertex);\n }\n for (let i = 0; i < flatCoords.length; i += 2) {\n vertexArray.push(flatCoords[i], flatCoords[i + 1], ...customAttributes);\n }\n\n return instructionsIndex + verticesCount * instructionsPerVertex;\n}\n\n/**\n * Returns a texture of 1x1 pixel, white\n * @private\n * @return {ImageData} Image data.\n */\nexport function getBlankImageData() {\n const canvas = document.createElement('canvas');\n const image = canvas.getContext('2d').createImageData(1, 1);\n image.data[0] = 255;\n image.data[1] = 255;\n image.data[2] = 255;\n image.data[3] = 255;\n return image;\n}\n\n/**\n * Generates a color array based on a numerical id\n * Note: the range for each component is 0 to 1 with 256 steps\n * @param {number} id Id\n * @param {Array<number>} [array] Reusable array\n * @return {Array<number>} Color array containing the encoded id\n */\nexport function colorEncodeId(id, array) {\n array = array || [];\n const radix = 256;\n const divide = radix - 1;\n array[0] = Math.floor(id / radix / radix / radix) / divide;\n array[1] = (Math.floor(id / radix / radix) % radix) / divide;\n array[2] = (Math.floor(id / radix) % radix) / divide;\n array[3] = (id % radix) / divide;\n return array;\n}\n\n/**\n * Reads an id from a color-encoded array\n * Note: the expected range for each component is 0 to 1 with 256 steps.\n * @param {Array<number>} color Color array containing the encoded id\n * @return {number} Decoded id\n */\nexport function colorDecodeId(color) {\n let id = 0;\n const radix = 256;\n const mult = radix - 1;\n id += Math.round(color[0] * radix * radix * radix * mult);\n id += Math.round(color[1] * radix * radix * mult);\n id += Math.round(color[2] * radix * mult);\n id += Math.round(color[3] * mult);\n return id;\n}\n","\n export function create() {\n const source = \"const e=\\\"GENERATE_POLYGON_BUFFERS\\\",t=\\\"GENERATE_POINT_BUFFERS\\\",n=\\\"GENERATE_LINE_STRING_BUFFERS\\\",r={1:\\\"The view center is not defined\\\",2:\\\"The view resolution is not defined\\\",3:\\\"The view rotation is not defined\\\",4:\\\"`image` and `src` cannot be provided at the same time\\\",5:\\\"`imgSize` must be set when `image` is provided\\\",7:\\\"`format` must be set when `url` is set\\\",8:\\\"Unknown `serverType` configured\\\",9:\\\"`url` must be configured or set using `#setUrl()`\\\",10:\\\"The default `geometryFunction` can only handle `Point` geometries\\\",11:\\\"`options.featureTypes` must be an Array\\\",12:\\\"`options.geometryName` must also be provided when `options.bbox` is set\\\",13:\\\"Invalid corner\\\",14:\\\"Invalid color\\\",15:\\\"Tried to get a value for a key that does not exist in the cache\\\",16:\\\"Tried to set a value for a key that is used already\\\",17:\\\"`resolutions` must be sorted in descending order\\\",18:\\\"Either `origin` or `origins` must be configured, never both\\\",19:\\\"Number of `tileSizes` and `resolutions` must be equal\\\",20:\\\"Number of `origins` and `resolutions` must be equal\\\",22:\\\"Either `tileSize` or `tileSizes` must be configured, never both\\\",24:\\\"Invalid extent or geometry provided as `geometry`\\\",25:\\\"Cannot fit empty extent provided as `geometry`\\\",26:\\\"Features must have an id set\\\",27:\\\"Features must have an id set\\\",28:'`renderMode` must be `\\\"hybrid\\\"` or `\\\"vector\\\"`',30:\\\"The passed `feature` was already added to the source\\\",31:\\\"Tried to enqueue an `element` that was already added to the queue\\\",32:\\\"Transformation matrix cannot be inverted\\\",33:\\\"Invalid units\\\",34:\\\"Invalid geometry layout\\\",36:\\\"Unknown SRS type\\\",37:\\\"Unknown geometry type found\\\",38:\\\"`styleMapValue` has an unknown type\\\",39:\\\"Unknown geometry type\\\",40:\\\"Expected `feature` to have a geometry\\\",41:\\\"Expected an `ol/style/Style` or an array of `ol/style/Style.js`\\\",42:\\\"Question unknown, the answer is 42\\\",43:\\\"Expected `layers` to be an array or a `Collection`\\\",47:\\\"Expected `controls` to be an array or an `ol/Collection`\\\",48:\\\"Expected `interactions` to be an array or an `ol/Collection`\\\",49:\\\"Expected `overlays` to be an array or an `ol/Collection`\\\",50:\\\"`options.featureTypes` should be an Array\\\",51:\\\"Either `url` or `tileJSON` options must be provided\\\",52:\\\"Unknown `serverType` configured\\\",53:\\\"Unknown `tierSizeCalculation` configured\\\",55:\\\"The {-y} placeholder requires a tile grid with extent\\\",56:\\\"mapBrowserEvent must originate from a pointer event\\\",57:\\\"At least 2 conditions are required\\\",59:\\\"Invalid command found in the PBF\\\",60:\\\"Missing or invalid `size`\\\",61:\\\"Cannot determine IIIF Image API version from provided image information JSON\\\",62:\\\"A `WebGLArrayBuffer` must either be of type `ELEMENT_ARRAY_BUFFER` or `ARRAY_BUFFER`\\\",64:\\\"Layer opacity must be a number\\\",66:\\\"`forEachFeatureAtCoordinate` cannot be used on a WebGL layer if the hit detection logic has not been enabled. This is done by providing adequate shaders using the `hitVertexShader` and `hitFragmentShader` properties of `WebGLPointsLayerRenderer`\\\",67:\\\"A layer can only be added to the map once. Use either `layer.setMap()` or `map.addLayer()`, not both\\\",68:\\\"A VectorTile source can only be rendered if it has a projection compatible with the view projection\\\",69:\\\"`width` or `height` cannot be provided together with `scale`\\\"};class o extends Error{constructor(e){const t=r[e];super(t),this.code=e,this.name=\\\"AssertionError\\\",this.message=t}}var i=o;function a(e,t){const n=t[0],r=t[1];return t[0]=e[0]*n+e[2]*r+e[4],t[1]=e[1]*n+e[3]*r+e[5],t}function s(e,t){const n=(r=t)[0]*r[3]-r[1]*r[2];var r;!function(e,t){if(!e)throw new i(t)}(0!==n,32);const o=t[0],a=t[1],s=t[2],u=t[3],f=t[4],x=t[5];return e[0]=u/n,e[1]=-a/n,e[2]=-s/n,e[3]=o/n,e[4]=(s*x-u*f)/n,e[5]=-(o*x-a*f)/n,e}function u(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,\\\"default\\\")?e.default:e}new Array(6);var f={exports:{}};function x(e,t,n){n=n||2;var r,o,i,a,s,u,f,x=t&&t.length,h=x?t[0]*n:e.length,v=l(e,0,h,n,!0),d=[];if(!v||v.next===v.prev)return d;if(x&&(v=function(e,t,n,r){var o,i,a,s=[];for(o=0,i=t.length;o<i;o++)(a=l(e,t[o]*r,o<i-1?t[o+1]*r:e.length,r,!1))===a.next&&(a.steiner=!0),s.push(A(a));for(s.sort(b),o=0;o<s.length;o++)n=g(s[o],n);return n}(e,t,v,n)),e.length>80*n){r=i=e[0],o=a=e[1];for(var y=n;y<h;y+=n)(s=e[y])<r&&(r=s),(u=e[y+1])<o&&(o=u),s>i&&(i=s),u>a&&(a=u);f=0!==(f=Math.max(i-r,a-o))?32767/f:0}return c(v,d,n,r,o,f,0),d}function l(e,t,n,r,o){var i,a;if(o===P(e,t,n,r)>0)for(i=t;i<n;i+=r)a=k(i,e[i],e[i+1],a);else for(i=n-r;i>=t;i-=r)a=k(i,e[i],e[i+1],a);return a&&F(a,a.next)&&(R(a),a=a.next),a}function h(e,t){if(!e)return e;t||(t=e);var n,r=e;do{if(n=!1,r.steiner||!F(r,r.next)&&0!==Z(r.prev,r,r.next))r=r.next;else{if(R(r),(r=t=r.prev)===r.next)break;n=!0}}while(n||r!==t);return t}function c(e,t,n,r,o,i,a){if(e){!a&&i&&function(e,t,n,r){var o=e;do{0===o.z&&(o.z=w(o.x,o.y,t,n,r)),o.prevZ=o.prev,o.nextZ=o.next,o=o.next}while(o!==e);o.prevZ.nextZ=null,o.prevZ=null,function(e){var t,n,r,o,i,a,s,u,f=1;do{for(n=e,e=null,i=null,a=0;n;){for(a++,r=n,s=0,t=0;t<f&&(s++,r=r.nextZ);t++);for(u=f;s>0||u>0&&r;)0!==s&&(0===u||!r||n.z<=r.z)?(o=n,n=n.nextZ,s--):(o=r,r=r.nextZ,u--),i?i.nextZ=o:e=o,o.prevZ=i,i=o;n=r}i.nextZ=null,f*=2}while(a>1)}(o)}(e,r,o,i);for(var s,u,f=e;e.prev!==e.next;)if(s=e.prev,u=e.next,i?d(e,r,o,i):v(e))t.push(s.i/n|0),t.push(e.i/n|0),t.push(u.i/n|0),R(e),e=u.next,f=u.next;else if((e=u)===f){a?1===a?c(e=y(h(e),t,n),t,n,r,o,i,2):2===a&&p(e,t,n,r,o,i):c(h(e),t,n,r,o,i,1);break}}}function v(e){var t=e.prev,n=e,r=e.next;if(Z(t,n,r)>=0)return!1;for(var o=t.x,i=n.x,a=r.x,s=t.y,u=n.y,f=r.y,x=o<i?o<a?o:a:i<a?i:a,l=s<u?s<f?s:f:u<f?u:f,h=o>i?o>a?o:a:i>a?i:a,c=s>u?s>f?s:f:u>f?u:f,v=r.next;v!==t;){if(v.x>=x&&v.x<=h&&v.y>=l&&v.y<=c&&E(o,s,i,u,a,f,v.x,v.y)&&Z(v.prev,v,v.next)>=0)return!1;v=v.next}return!0}function d(e,t,n,r){var o=e.prev,i=e,a=e.next;if(Z(o,i,a)>=0)return!1;for(var s=o.x,u=i.x,f=a.x,x=o.y,l=i.y,h=a.y,c=s<u?s<f?s:f:u<f?u:f,v=x<l?x<h?x:h:l<h?l:h,d=s>u?s>f?s:f:u>f?u:f,y=x>l?x>h?x:h:l>h?l:h,p=w(c,v,t,n,r),b=w(d,y,t,n,r),g=e.prevZ,m=e.nextZ;g&&g.z>=p&&m&&m.z<=b;){if(g.x>=c&&g.x<=d&&g.y>=v&&g.y<=y&&g!==o&&g!==a&&E(s,x,u,l,f,h,g.x,g.y)&&Z(g.prev,g,g.next)>=0)return!1;if(g=g.prevZ,m.x>=c&&m.x<=d&&m.y>=v&&m.y<=y&&m!==o&&m!==a&&E(s,x,u,l,f,h,m.x,m.y)&&Z(m.prev,m,m.next)>=0)return!1;m=m.nextZ}for(;g&&g.z>=p;){if(g.x>=c&&g.x<=d&&g.y>=v&&g.y<=y&&g!==o&&g!==a&&E(s,x,u,l,f,h,g.x,g.y)&&Z(g.prev,g,g.next)>=0)return!1;g=g.prevZ}for(;m&&m.z<=b;){if(m.x>=c&&m.x<=d&&m.y>=v&&m.y<=y&&m!==o&&m!==a&&E(s,x,u,l,f,h,m.x,m.y)&&Z(m.prev,m,m.next)>=0)return!1;m=m.nextZ}return!0}function y(e,t,n){var r=e;do{var o=r.prev,i=r.next.next;!F(o,i)&&T(o,r,r.next,i)&&z(o,i)&&z(i,o)&&(t.push(o.i/n|0),t.push(r.i/n|0),t.push(i.i/n|0),R(r),R(r.next),r=e=i),r=r.next}while(r!==e);return h(r)}function p(e,t,n,r,o,i){var a=e;do{for(var s=a.next.next;s!==a.prev;){if(a.i!==s.i&&M(a,s)){var u=U(a,s);return a=h(a,a.next),u=h(u,u.next),c(a,t,n,r,o,i,0),void c(u,t,n,r,o,i,0)}s=s.next}a=a.next}while(a!==e)}function b(e,t){return e.x-t.x}function g(e,t){var n=function(e,t){var n,r=t,o=e.x,i=e.y,a=-1/0;do{if(i<=r.y&&i>=r.next.y&&r.next.y!==r.y){var s=r.x+(i-r.y)*(r.next.x-r.x)/(r.next.y-r.y);if(s<=o&&s>a&&(a=s,n=r.x<r.next.x?r:r.next,s===o))return n}r=r.next}while(r!==t);if(!n)return null;var u,f=n,x=n.x,l=n.y,h=1/0;r=n;do{o>=r.x&&r.x>=x&&o!==r.x&&E(i<l?o:a,i,x,l,i<l?a:o,i,r.x,r.y)&&(u=Math.abs(i-r.y)/(o-r.x),z(r,e)&&(u<h||u===h&&(r.x>n.x||r.x===n.x&&m(n,r)))&&(n=r,h=u)),r=r.next}while(r!==f);return n}(e,t);if(!n)return t;var r=U(n,e);return h(r,r.next),h(n,n.next)}function m(e,t){return Z(e.prev,e,t.prev)<0&&Z(t.next,e,e.next)<0}function w(e,t,n,r,o){return(e=1431655765&((e=858993459&((e=252645135&((e=16711935&((e=(e-n)*o|0)|e<<8))|e<<4))|e<<2))|e<<1))|(t=1431655765&((t=858993459&((t=252645135&((t=16711935&((t=(t-r)*o|0)|t<<8))|t<<4))|t<<2))|t<<1))<<1}function A(e){var t=e,n=e;do{(t.x<n.x||t.x===n.x&&t.y<n.y)&&(n=t),t=t.next}while(t!==e);return n}function E(e,t,n,r,o,i,a,s){return(o-a)*(t-s)>=(e-a)*(i-s)&&(e-a)*(r-s)>=(n-a)*(t-s)&&(n-a)*(i-s)>=(o-a)*(r-s)}function M(e,t){return e.next.i!==t.i&&e.prev.i!==t.i&&!function(e,t){var n=e;do{if(n.i!==e.i&&n.next.i!==e.i&&n.i!==t.i&&n.next.i!==t.i&&T(n,n.next,e,t))return!0;n=n.next}while(n!==e);return!1}(e,t)&&(z(e,t)&&z(t,e)&&function(e,t){var n=e,r=!1,o=(e.x+t.x)/2,i=(e.y+t.y)/2;do{n.y>i!=n.next.y>i&&n.next.y!==n.y&&o<(n.next.x-n.x)*(i-n.y)/(n.next.y-n.y)+n.x&&(r=!r),n=n.next}while(n!==e);return r}(e,t)&&(Z(e.prev,e,t.prev)||Z(e,t.prev,t))||F(e,t)&&Z(e.prev,e,e.next)>0&&Z(t.prev,t,t.next)>0)}function Z(e,t,n){return(t.y-e.y)*(n.x-t.x)-(t.x-e.x)*(n.y-t.y)}function F(e,t){return e.x===t.x&&e.y===t.y}function T(e,t,n,r){var o=S(Z(e,t,n)),i=S(Z(e,t,r)),a=S(Z(n,r,e)),s=S(Z(n,r,t));return o!==i&&a!==s||(!(0!==o||!I(e,n,t))||(!(0!==i||!I(e,r,t))||(!(0!==a||!I(n,e,r))||!(0!==s||!I(n,t,r)))))}function I(e,t,n){return t.x<=Math.max(e.x,n.x)&&t.x>=Math.min(e.x,n.x)&&t.y<=Math.max(e.y,n.y)&&t.y>=Math.min(e.y,n.y)}function S(e){return e>0?1:e<0?-1:0}function z(e,t){return Z(e.prev,e,e.next)<0?Z(e,t,e.next)>=0&&Z(e,e.prev,t)>=0:Z(e,t,e.prev)<0||Z(e,e.next,t)<0}function U(e,t){var n=new B(e.i,e.x,e.y),r=new B(t.i,t.x,t.y),o=e.next,i=t.prev;return e.next=t,t.prev=e,n.next=o,o.prev=n,r.next=n,n.prev=r,i.next=r,r.prev=i,r}function k(e,t,n,r){var o=new B(e,t,n);return r?(o.next=r.next,o.prev=r,r.next.prev=o,r.next=o):(o.prev=o,o.next=o),o}function R(e){e.next.prev=e.prev,e.prev.next=e.next,e.prevZ&&(e.prevZ.nextZ=e.nextZ),e.nextZ&&(e.nextZ.prevZ=e.prevZ)}function B(e,t,n){this.i=e,this.x=t,this.y=n,this.prev=null,this.next=null,this.z=0,this.prevZ=null,this.nextZ=null,this.steiner=!1}function P(e,t,n,r){for(var o=0,i=t,a=n-r;i<n;i+=r)o+=(e[a]-e[i])*(e[i+1]+e[a+1]),a=i;return o}f.exports=x,f.exports.default=x,x.deviation=function(e,t,n,r){var o=t&&t.length,i=o?t[0]*n:e.length,a=Math.abs(P(e,0,i,n));if(o)for(var s=0,u=t.length;s<u;s++){var f=t[s]*n,x=s<u-1?t[s+1]*n:e.length;a-=Math.abs(P(e,f,x,n))}var l=0;for(s=0;s<r.length;s+=3){var h=r[s]*n,c=r[s+1]*n,v=r[s+2]*n;l+=Math.abs((e[h]-e[v])*(e[c+1]-e[h+1])-(e[h]-e[c])*(e[v+1]-e[h+1]))}return 0===a&&0===l?0:Math.abs((l-a)/a)},x.flatten=function(e){for(var t=e[0][0].length,n={vertices:[],holes:[],dimensions:t},r=0,o=0;o<e.length;o++){for(var i=0;i<e[o].length;i++)for(var a=0;a<t;a++)n.vertices.push(e[o][i][a]);o>0&&(r+=e[o-1].length,n.holes.push(r))}return n};var N=u(f.exports);const _=[],O={vertexPosition:0,indexPosition:0};function q(e,t,n,r,o){e[t+0]=n,e[t+1]=r,e[t+2]=o}function L(e,t,n,r,o,i){const a=3+o,s=e[t+0],u=e[t+1],f=_;f.length=o;for(let n=0;n<f.length;n++)f[n]=e[t+2+n];let x=i?i.vertexPosition:0,l=i?i.indexPosition:0;const h=x/a;return q(n,x,s,u,0),f.length&&n.set(f,x+3),x+=a,q(n,x,s,u,1),f.length&&n.set(f,x+3),x+=a,q(n,x,s,u,2),f.length&&n.set(f,x+3),x+=a,q(n,x,s,u,3),f.length&&n.set(f,x+3),x+=a,r[l++]=h,r[l++]=h+1,r[l++]=h+3,r[l++]=h+1,r[l++]=h+2,r[l++]=h+3,O.vertexPosition=x,O.indexPosition=l,O}function C(e,t,n,r,o,i,s,u,f,x){const l=5+u.length,h=i.length/l,c=[e[t+0],e[t+1]],v=[e[n],e[n+1]],d=a(x,[...c]),y=a(x,[...v]);function p(e,t,n){const r=1e4;return Math.round(1500*t)+Math.round(1500*n)*r+e*r*r}function b(e,t,n){const r=Math.sqrt((t[0]-e[0])*(t[0]-e[0])+(t[1]-e[1])*(t[1]-e[1])),o=[(t[0]-e[0])/r,(t[1]-e[1])/r],i=[-o[1],o[0]],a=Math.sqrt((n[0]-e[0])*(n[0]-e[0])+(n[1]-e[1])*(n[1]-e[1])),s=[(n[0]-e[0])/a,(n[1]-e[1])/a],u=0===r||0===a?0:Math.acos((f=s[0]*o[0]+s[1]*o[1],x=-1,l=1,Math.min(Math.max(f,x),l)));var f,x,l;return s[0]*i[0]+s[1]*i[1]>0?u:2*Math.PI-u}const g=null!==o;let m=0,w=0;if(null!==r){m=b(d,y,a(x,[...[e[r],e[r+1]]]))}if(g){w=b(y,d,a(x,[...[e[o],e[o+1]]]))}i.push(c[0],c[1],v[0],v[1],p(0,m,w)),i.push(...u),i.push(c[0],c[1],v[0],v[1],p(1,m,w)),i.push(...u),i.push(c[0],c[1],v[0],v[1],p(2,m,w)),i.push(...u),i.push(c[0],c[1],v[0],v[1],p(3,m,w)),i.push(...u),s.push(h,h+1,h+2,h+1,h+3,h+2)}function G(e,t,n,r,o){const i=2+o;let a=t;const s=e.slice(a,a+o);a+=o;const u=e[a++];let f=0;const x=new Array(u-1);for(let t=0;t<u;t++)f+=e[a++],t<u-1&&(x[t]=f);const l=e.slice(a,a+2*f),h=N(l,x,2);for(let e=0;e<h.length;e++)r.push(h[e]+n.length/i);for(let e=0;e<l.length;e+=2)n.push(l[e],l[e+1],...s);return a+2*f}const j=self;j.onmessage=r=>{const o=r.data;switch(o.type){case t:{const e=3,t=2,n=o.customAttributesSize,r=t+n,i=new Float32Array(o.renderInstructions),a=i.length/r,s=4*a*(n+e),u=new Uint32Array(6*a),f=new Float32Array(s);let x;for(let e=0;e<i.length;e+=r)x=L(i,e,f,u,n,x);const l=Object.assign({vertexBuffer:f.buffer,indexBuffer:u.buffer,renderInstructions:i.buffer},o);j.postMessage(l,[f.buffer,u.buffer,i.buffer]);break}case n:{const e=[],t=[],n=o.customAttributesSize,r=2,i=new Float32Array(o.renderInstructions);let a=0;const u=o.renderInstructionsTransform,f=[1,0,0,1,0,0];let x,l;for(s(f,u);a<i.length;){l=Array.from(i.slice(a,a+n)),a+=n,x=i[a++];for(let n=0;n<x-1;n++)C(i,a+n*r,a+(n+1)*r,n>0?a+(n-1)*r:null,n<x-2?a+(n+2)*r:null,e,t,l,0,f);a+=x*r}const h=Uint32Array.from(t),c=Float32Array.from(e),v=Object.assign({vertexBuffer:c.buffer,indexBuffer:h.buffer,renderInstructions:i.buffer},o);j.postMessage(v,[c.buffer,h.buffer,i.buffer]);break}case e:{const e=[],t=[],n=o.customAttributesSize,r=new Float32Array(o.renderInstructions);let i=0;for(;i<r.length;)i=G(r,i,e,t,n);const a=Uint32Array.from(t),s=Float32Array.from(e),u=Object.assign({vertexBuffer:s.buffer,indexBuffer:a.buffer,renderInstructions:r.buffer},o);j.postMessage(u,[s.buffer,a.buffer,r.buffer]);break}}};\";\n return new Worker(typeof Blob === 'undefined'\n ? 'data:application/javascript;base64,' + Buffer.from(source, 'binary').toString('base64')\n : URL.createObjectURL(new Blob([source], {type: 'application/javascript'})));\n }\n \n","/**\n * @module ol/renderer/webgl/PointsLayer\n */\nimport BaseVector from '../../layer/BaseVector.js';\nimport VectorEventType from '../../source/VectorEventType.js';\nimport ViewHint from '../../ViewHint.js';\nimport WebGLArrayBuffer from '../../webgl/Buffer.js';\nimport WebGLLayerRenderer from './Layer.js';\nimport WebGLRenderTarget from '../../webgl/RenderTarget.js';\nimport {ARRAY_BUFFER, DYNAMIC_DRAW, ELEMENT_ARRAY_BUFFER} from '../../webgl.js';\nimport {AttributeType, DefaultUniform} from '../../webgl/Helper.js';\nimport {WebGLWorkerMessageType} from '../../render/webgl/constants.js';\nimport {\n apply as applyTransform,\n create as createTransform,\n makeInverse as makeInverseTransform,\n multiply as multiplyTransform,\n translate as translateTransform,\n} from '../../transform.js';\nimport {assert} from '../../asserts.js';\nimport {buffer, createEmpty, equals, getWidth} from '../../extent.js';\nimport {colorDecodeId, colorEncodeId} from '../../render/webgl/utils.js';\nimport {create as createWebGLWorker} from '../../worker/webgl.js';\nimport {getUid} from '../../util.js';\nimport {listen, unlistenByKey} from '../../events.js';\n\n/**\n * @typedef {Object} CustomAttribute A description of a custom attribute to be passed on to the GPU, with a value different\n * for each feature.\n * @property {string} name Attribute name.\n * @property {function(import(\"../../Feature\").default, Object<string, *>):number} callback This callback computes the numerical value of the\n * attribute for a given feature (properties are available as 2nd arg for quicker access).\n */\n\n/**\n * @typedef {Object} FeatureCacheItem Object that holds a reference to a feature, its geometry and properties. Used to optimize\n * rebuildBuffers by accessing these objects quicker.\n * @property {import(\"../../Feature\").default} feature Feature\n * @property {Object<string, *>} properties Feature properties\n * @property {import(\"../../geom\").Geometry} geometry Feature geometry\n */\n\n/**\n * @typedef {Object} Options\n * @property {string} [className='ol-layer'] A CSS class name to set to the canvas element.\n * @property {Array<CustomAttribute>} [attributes] These attributes will be read from the features in the source and then\n * passed to the GPU. The `name` property of each attribute will serve as its identifier:\n * * In the vertex shader as an `attribute` by prefixing it with `a_`\n * * In the fragment shader as a `varying` by prefixing it with `v_`\n * Please note that these can only be numerical values.\n * @property {string} vertexShader Vertex shader source, mandatory.\n * @property {string} fragmentShader Fragment shader source, mandatory.\n * @property {string} [hitVertexShader] Vertex shader source for hit detection rendering.\n * @property {string} [hitFragmentShader] Fragment shader source for hit detection rendering.\n * @property {Object<string,import(\"../../webgl/Helper\").UniformValue>} [uniforms] Uniform definitions for the post process steps\n * Please note that `u_texture` is reserved for the main texture slot and `u_opacity` is reserved for the layer opacity.\n * @property {Array<import(\"./Layer\").PostProcessesOptions>} [postProcesses] Post-processes definitions\n */\n\n/**\n * @classdesc\n * WebGL vector renderer optimized for points.\n * All features will be rendered as quads (two triangles forming a square). New data will be flushed to the GPU\n * every time the vector source changes.\n *\n * You need to provide vertex and fragment shaders for rendering. This can be done using\n * {@link module:ol/webgl/ShaderBuilder~ShaderBuilder} utilities. These shaders shall expect a `a_position` attribute\n * containing the screen-space projected center of the quad, as well as a `a_index` attribute\n * whose value (0, 1, 2 or 3) indicates which quad vertex is currently getting processed (see structure below).\n *\n * To include variable attributes in the shaders, you need to declare them using the `attributes` property of\n * the options object like so:\n * ```js\n * new WebGLPointsLayerRenderer(layer, {\n * attributes: [\n * {\n * name: 'size',\n * callback: function(feature) {\n * // compute something with the feature\n * }\n * },\n * {\n * name: 'weight',\n * callback: function(feature) {\n * // compute something with the feature\n * }\n * },\n * ],\n * vertexShader:\n * // shader using attribute a_weight and a_size\n * fragmentShader:\n * // shader using varying v_weight and v_size\n * ```\n *\n * To enable hit detection, you must as well provide dedicated shaders using the `hitVertexShader`\n * and `hitFragmentShader` properties. These shall expect the `a_hitColor` attribute to contain\n * the final color that will have to be output for hit detection to work.\n *\n * The following uniform is used for the main texture: `u_texture`.\n * The following uniform is used for the layer opacity: `u_opacity`.\n *\n * Please note that the main shader output should have premultiplied alpha, otherwise visual anomalies may occur.\n *\n * Points are rendered as quads with the following structure:\n *\n * ```\n * (u0, v1) (u1, v1)\n * [3]----------[2]\n * |` |\n * | ` |\n * | ` |\n * | ` |\n * | ` |\n * | ` |\n * [0]----------[1]\n * (u0, v0) (u1, v0)\n * ```\n *\n * This uses {@link module:ol/webgl/Helper~WebGLHelper} internally.\n *\n * @api\n */\nclass WebGLPointsLayerRenderer extends WebGLLayerRenderer {\n /**\n * @param {import(\"../../layer/Layer.js\").default} layer Layer.\n * @param {Options} options Options.\n */\n constructor(layer, options) {\n const uniforms = options.uniforms || {};\n const projectionMatrixTransform = createTransform();\n uniforms[DefaultUniform.PROJECTION_MATRIX] = projectionMatrixTransform;\n\n super(layer, {\n uniforms: uniforms,\n postProcesses: options.postProcesses,\n });\n\n this.sourceRevision_ = -1;\n\n this.verticesBuffer_ = new WebGLArrayBuffer(ARRAY_BUFFER, DYNAMIC_DRAW);\n this.hitVerticesBuffer_ = new WebGLArrayBuffer(ARRAY_BUFFER, DYNAMIC_DRAW);\n this.indicesBuffer_ = new WebGLArrayBuffer(\n ELEMENT_ARRAY_BUFFER,\n DYNAMIC_DRAW\n );\n\n /**\n * @private\n */\n this.vertexShader_ = options.vertexShader;\n\n /**\n * @private\n */\n this.fragmentShader_ = options.fragmentShader;\n\n /**\n * @type {WebGLProgram}\n * @private\n */\n this.program_;\n\n /**\n * @type {boolean}\n * @private\n */\n this.hitDetectionEnabled_ =\n options.hitFragmentShader && options.hitVertexShader ? true : false;\n\n /**\n * @private\n */\n this.hitVertexShader_ = options.hitVertexShader;\n\n /**\n * @private\n */\n this.hitFragmentShader_ = options.hitFragmentShader;\n\n /**\n * @type {WebGLProgram}\n * @private\n */\n this.hitProgram_;\n\n const customAttributes = options.attributes\n ? options.attributes.map(function (attribute) {\n return {\n name: 'a_' + attribute.name,\n size: 1,\n type: AttributeType.FLOAT,\n };\n })\n : [];\n\n /**\n * A list of attributes used by the renderer. By default only the position and\n * index of the vertex (0 to 3) are required.\n * @type {Array<import('../../webgl/Helper.js').AttributeDescription>}\n */\n this.attributes = [\n {\n name: 'a_position',\n size: 2,\n type: AttributeType.FLOAT,\n },\n {\n name: 'a_index',\n size: 1,\n type: AttributeType.FLOAT,\n },\n ].concat(customAttributes);\n\n /**\n * A list of attributes used for hit detection.\n * @type {Array<import('../../webgl/Helper.js').AttributeDescription>}\n */\n this.hitDetectionAttributes = [\n {\n name: 'a_position',\n size: 2,\n type: AttributeType.FLOAT,\n },\n {\n name: 'a_index',\n size: 1,\n type: AttributeType.FLOAT,\n },\n {\n name: 'a_hitColor',\n size: 4,\n type: AttributeType.FLOAT,\n },\n {\n name: 'a_featureUid',\n size: 1,\n type: AttributeType.FLOAT,\n },\n ].concat(customAttributes);\n\n this.customAttributes = options.attributes ? options.attributes : [];\n\n this.previousExtent_ = createEmpty();\n\n /**\n * This transform is updated on every frame and is the composition of:\n * - invert of the world->screen transform that was used when rebuilding buffers (see `this.renderTransform_`)\n * - current world->screen transform\n * @type {import(\"../../transform.js\").Transform}\n * @private\n */\n this.currentTransform_ = projectionMatrixTransform;\n\n /**\n * This transform is updated when buffers are rebuilt and converts world space coordinates to screen space\n * @type {import(\"../../transform.js\").Transform}\n * @private\n */\n this.renderTransform_ = createTransform();\n\n /**\n * @type {import(\"../../transform.js\").Transform}\n * @private\n */\n this.invertRenderTransform_ = createTransform();\n\n /**\n * @type {Float32Array}\n * @private\n */\n this.renderInstructions_ = new Float32Array(0);\n\n /**\n * These instructions are used for hit detection\n * @type {Float32Array}\n * @private\n */\n this.hitRenderInstructions_ = new Float32Array(0);\n\n /**\n * @type {WebGLRenderTarget}\n * @private\n */\n this.hitRenderTarget_;\n\n /**\n * Keep track of latest message sent to worker\n * @type {number}\n * @private\n */\n this.lastSentId = 0;\n\n /**\n * @private\n */\n this.worker_ = createWebGLWorker();\n\n this.worker_.addEventListener(\n 'message',\n /**\n * @param {*} event Event.\n */\n (event) => {\n const received = event.data;\n if (received.type === WebGLWorkerMessageType.GENERATE_POINT_BUFFERS) {\n const projectionTransform = received.projectionTransform;\n if (received.hitDetection) {\n this.hitVerticesBuffer_.fromArrayBuffer(received.vertexBuffer);\n this.helper.flushBufferData(this.hitVerticesBuffer_);\n } else {\n this.verticesBuffer_.fromArrayBuffer(received.vertexBuffer);\n this.helper.flushBufferData(this.verticesBuffer_);\n }\n this.indicesBuffer_.fromArrayBuffer(received.indexBuffer);\n this.helper.flushBufferData(this.indicesBuffer_);\n\n this.renderTransform_ = projectionTransform;\n makeInverseTransform(\n this.invertRenderTransform_,\n this.renderTransform_\n );\n if (received.hitDetection) {\n this.hitRenderInstructions_ = new Float32Array(\n event.data.renderInstructions\n );\n } else {\n this.renderInstructions_ = new Float32Array(\n event.data.renderInstructions\n );\n if (received.id === this.lastSentId) {\n this.ready = true;\n }\n }\n\n this.getLayer().changed();\n }\n }\n );\n\n /**\n * This object will be updated when the source changes. Key is uid.\n * @type {Object<string, FeatureCacheItem>}\n * @private\n */\n this.featureCache_ = {};\n\n /**\n * Amount of features in the cache.\n * @type {number}\n * @private\n */\n this.featureCount_ = 0;\n\n const source = this.getLayer().getSource();\n this.sourceListenKeys_ = [\n listen(\n source,\n VectorEventType.ADDFEATURE,\n this.handleSourceFeatureAdded_,\n this\n ),\n listen(\n source,\n VectorEventType.CHANGEFEATURE,\n this.handleSourceFeatureChanged_,\n this\n ),\n listen(\n source,\n VectorEventType.REMOVEFEATURE,\n this.handleSourceFeatureDelete_,\n this\n ),\n listen(\n source,\n VectorEventType.CLEAR,\n this.handleSourceFeatureClear_,\n this\n ),\n ];\n source.forEachFeature((feature) => {\n this.featureCache_[getUid(feature)] = {\n feature: feature,\n properties: feature.getProperties(),\n geometry: feature.getGeometry(),\n };\n this.featureCount_++;\n });\n }\n\n afterHelperCreated() {\n this.program_ = this.helper.getProgram(\n this.fragmentShader_,\n this.vertexShader_\n );\n\n if (this.hitDetectionEnabled_) {\n this.hitProgram_ = this.helper.getProgram(\n this.hitFragmentShader_,\n this.hitVertexShader_\n );\n\n this.hitRenderTarget_ = new WebGLRenderTarget(this.helper);\n }\n }\n\n /**\n * @param {import(\"../../source/Vector.js\").VectorSourceEvent} event Event.\n * @private\n */\n handleSourceFeatureAdded_(event) {\n const feature = event.feature;\n this.featureCache_[getUid(feature)] = {\n feature: feature,\n properties: feature.getProperties(),\n geometry: feature.getGeometry(),\n };\n this.featureCount_++;\n }\n\n /**\n * @param {import(\"../../source/Vector.js\").VectorSourceEvent} event Event.\n * @private\n */\n handleSourceFeatureChanged_(event) {\n const feature = event.feature;\n this.featureCache_[getUid(feature)] = {\n feature: feature,\n properties: feature.getProperties(),\n geometry: feature.getGeometry(),\n };\n }\n\n /**\n * @param {import(\"../../source/Vector.js\").VectorSourceEvent} event Event.\n * @private\n */\n handleSourceFeatureDelete_(event) {\n const feature = event.feature;\n delete this.featureCache_[getUid(feature)];\n this.featureCount_--;\n }\n\n /**\n * @private\n */\n handleSourceFeatureClear_() {\n this.featureCache_ = {};\n this.featureCount_ = 0;\n }\n\n /**\n * Render the layer.\n * @param {import(\"../../Map.js\").FrameState} frameState Frame state.\n * @return {HTMLElement} The rendered element.\n */\n renderFrame(frameState) {\n const gl = this.helper.getGL();\n this.preRender(gl, frameState);\n\n const projection = frameState.viewState.projection;\n const layer = this.getLayer();\n const vectorSource = layer.getSource();\n // FIXME fix hit detection isn't reliable when rendering multiple worlds\n const multiWorld = vectorSource.getWrapX() && projection.canWrapX();\n const projectionExtent = projection.getExtent();\n\n const extent = frameState.extent;\n const worldWidth = multiWorld ? getWidth(projectionExtent) : null;\n const endWorld = multiWorld\n ? Math.ceil((extent[2] - projectionExtent[2]) / worldWidth) + 1\n : 1;\n\n const startWorld = multiWorld\n ? Math.floor((extent[0] - projectionExtent[0]) / worldWidth)\n : 0;\n\n let world = startWorld;\n const renderCount = this.indicesBuffer_.getSize();\n\n do {\n // apply the current projection transform with the invert of the one used to fill buffers\n this.helper.makeProjectionTransform(frameState, this.currentTransform_);\n translateTransform(this.currentTransform_, world * worldWidth, 0);\n multiplyTransform(this.currentTransform_, this.invertRenderTransform_);\n this.helper.applyUniforms(frameState);\n\n this.helper.drawElements(0, renderCount);\n } while (++world < endWorld);\n\n this.helper.finalizeDraw(\n frameState,\n this.dispatchPreComposeEvent,\n this.dispatchPostComposeEvent\n );\n const canvas = this.helper.getCanvas();\n\n if (this.hitDetectionEnabled_) {\n this.renderHitDetection(frameState, startWorld, endWorld, worldWidth);\n this.hitRenderTarget_.clearCachedData();\n }\n\n this.postRender(gl, frameState);\n\n return canvas;\n }\n\n /**\n * Determine whether renderFrame should be called.\n * @param {import(\"../../Map.js\").FrameState} frameState Frame state.\n * @return {boolean} Layer is ready to be rendered.\n */\n prepareFrameInternal(frameState) {\n const layer = this.getLayer();\n const vectorSource = layer.getSource();\n const viewState = frameState.viewState;\n const viewNotMoving =\n !frameState.viewHints[ViewHint.ANIMATING] &&\n !frameState.viewHints[ViewHint.INTERACTING];\n const extentChanged = !equals(this.previousExtent_, frameState.extent);\n const sourceChanged = this.sourceRevision_ < vectorSource.getRevision();\n\n if (sourceChanged) {\n this.sourceRevision_ = vectorSource.getRevision();\n }\n\n if (viewNotMoving && (extentChanged || sourceChanged)) {\n const projection = viewState.projection;\n const resolution = viewState.resolution;\n\n const renderBuffer =\n layer instanceof BaseVector ? layer.getRenderBuffer() : 0;\n const extent = buffer(frameState.extent, renderBuffer * resolution);\n vectorSource.loadFeatures(extent, resolution, projection);\n\n this.rebuildBuffers_(frameState);\n this.previousExtent_ = frameState.extent.slice();\n }\n\n this.helper.useProgram(this.program_, frameState);\n this.helper.prepareDraw(frameState);\n\n // write new data\n this.helper.bindBuffer(this.verticesBuffer_);\n this.helper.bindBuffer(this.indicesBuffer_);\n this.helper.enableAttributes(this.attributes);\n\n return true;\n }\n\n /**\n * Rebuild internal webgl buffers based on current view extent; costly, should not be called too much\n * @param {import(\"../../Map\").FrameState} frameState Frame state.\n * @private\n */\n rebuildBuffers_(frameState) {\n // saves the projection transform for the current frame state\n const projectionTransform = createTransform();\n this.helper.makeProjectionTransform(frameState, projectionTransform);\n\n // here we anticipate the amount of render instructions that we well generate\n // this can be done since we know that for normal render we only have x, y as base instructions,\n // and x, y, r, g, b, a and featureUid for hit render instructions\n // and we also know the amount of custom attributes to append to these\n const totalInstructionsCount =\n (2 + this.customAttributes.length) * this.featureCount_;\n if (\n !this.renderInstructions_ ||\n this.renderInstructions_.length !== totalInstructionsCount\n ) {\n this.renderInstructions_ = new Float32Array(totalInstructionsCount);\n }\n if (this.hitDetectionEnabled_) {\n const totalHitInstructionsCount =\n (7 + this.customAttributes.length) * this.featureCount_;\n if (\n !this.hitRenderInstructions_ ||\n this.hitRenderInstructions_.length !== totalHitInstructionsCount\n ) {\n this.hitRenderInstructions_ = new Float32Array(\n totalHitInstructionsCount\n );\n }\n }\n\n // loop on features to fill the buffer\n let featureCache, geometry;\n const tmpCoords = [];\n const tmpColor = [];\n let renderIndex = 0;\n let hitIndex = 0;\n let hitColor;\n for (const featureUid in this.featureCache_) {\n featureCache = this.featureCache_[featureUid];\n geometry = /** @type {import(\"../../geom\").Point} */ (\n featureCache.geometry\n );\n if (!geometry || geometry.getType() !== 'Point') {\n continue;\n }\n\n tmpCoords[0] = geometry.getFlatCoordinates()[0];\n tmpCoords[1] = geometry.getFlatCoordinates()[1];\n applyTransform(projectionTransform, tmpCoords);\n\n hitColor = colorEncodeId(hitIndex + 6, tmpColor);\n\n this.renderInstructions_[renderIndex++] = tmpCoords[0];\n this.renderInstructions_[renderIndex++] = tmpCoords[1];\n\n // for hit detection, the feature uid is saved in the opacity value\n // and the index of the opacity value is encoded in the color values\n if (this.hitDetectionEnabled_) {\n this.hitRenderInstructions_[hitIndex++] = tmpCoords[0];\n this.hitRenderInstructions_[hitIndex++] = tmpCoords[1];\n this.hitRenderInstructions_[hitIndex++] = hitColor[0];\n this.hitRenderInstructions_[hitIndex++] = hitColor[1];\n this.hitRenderInstructions_[hitIndex++] = hitColor[2];\n this.hitRenderInstructions_[hitIndex++] = hitColor[3];\n this.hitRenderInstructions_[hitIndex++] = Number(featureUid);\n }\n\n // pushing custom attributes\n let value;\n for (let j = 0; j < this.customAttributes.length; j++) {\n value = this.customAttributes[j].callback(\n featureCache.feature,\n featureCache.properties\n );\n this.renderInstructions_[renderIndex++] = value;\n if (this.hitDetectionEnabled_) {\n this.hitRenderInstructions_[hitIndex++] = value;\n }\n }\n }\n\n /** @type {import('../../render/webgl/constants.js').WebGLWorkerGenerateBuffersMessage} */\n const message = {\n id: ++this.lastSentId,\n type: WebGLWorkerMessageType.GENERATE_POINT_BUFFERS,\n renderInstructions: this.renderInstructions_.buffer,\n customAttributesSize: this.customAttributes.length,\n };\n // additional properties will be sent back as-is by the worker\n message['projectionTransform'] = projectionTransform;\n this.ready = false;\n this.worker_.postMessage(message, [this.renderInstructions_.buffer]);\n this.renderInstructions_ = null;\n\n /** @type {import('../../render/webgl/constants.js').WebGLWorkerGenerateBuffersMessage} */\n if (this.hitDetectionEnabled_) {\n const hitMessage = {\n id: 0,\n type: WebGLWorkerMessageType.GENERATE_POINT_BUFFERS,\n renderInstructions: this.hitRenderInstructions_.buffer,\n customAttributesSize: 5 + this.customAttributes.length,\n };\n hitMessage['projectionTransform'] = projectionTransform;\n hitMessage['hitDetection'] = true;\n this.worker_.postMessage(hitMessage, [\n this.hitRenderInstructions_.buffer,\n ]);\n this.hitRenderInstructions_ = null;\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<T>} callback Feature callback.\n * @param {Array<import(\"../Map.js\").HitMatch<T>>} matches The hit detected matches with tolerance.\n * @return {T|undefined} Callback result.\n * @template T\n */\n forEachFeatureAtCoordinate(\n coordinate,\n frameState,\n hitTolerance,\n callback,\n matches\n ) {\n assert(this.hitDetectionEnabled_, 66);\n if (!this.hitRenderInstructions_) {\n return undefined;\n }\n\n const pixel = applyTransform(\n frameState.coordinateToPixelTransform,\n coordinate.slice()\n );\n\n const data = this.hitRenderTarget_.readPixel(pixel[0] / 2, pixel[1] / 2);\n const color = [data[0] / 255, data[1] / 255, data[2] / 255, data[3] / 255];\n const index = colorDecodeId(color);\n const opacity = this.hitRenderInstructions_[index];\n const uid = Math.floor(opacity).toString();\n\n const source = this.getLayer().getSource();\n const feature = source.getFeatureByUid(uid);\n if (feature) {\n return callback(feature, this.getLayer(), null);\n }\n return undefined;\n }\n\n /**\n * Render the hit detection data to the corresponding render target\n * @param {import(\"../../Map.js\").FrameState} frameState current frame state\n * @param {number} startWorld the world to render in the first iteration\n * @param {number} endWorld the last world to render\n * @param {number} worldWidth the width of the worlds being rendered\n */\n renderHitDetection(frameState, startWorld, endWorld, worldWidth) {\n // skip render entirely if vertex buffers not ready/generated yet\n if (!this.hitVerticesBuffer_.getSize()) {\n return;\n }\n\n let world = startWorld;\n\n this.hitRenderTarget_.setSize([\n Math.floor(frameState.size[0] / 2),\n Math.floor(frameState.size[1] / 2),\n ]);\n\n this.helper.useProgram(this.hitProgram_, frameState);\n this.helper.prepareDrawToRenderTarget(\n frameState,\n this.hitRenderTarget_,\n true\n );\n\n this.helper.bindBuffer(this.hitVerticesBuffer_);\n this.helper.bindBuffer(this.indicesBuffer_);\n this.helper.enableAttributes(this.hitDetectionAttributes);\n\n do {\n this.helper.makeProjectionTransform(frameState, this.currentTransform_);\n translateTransform(this.currentTransform_, world * worldWidth, 0);\n multiplyTransform(this.currentTransform_, this.invertRenderTransform_);\n this.helper.applyUniforms(frameState);\n\n const renderCount = this.indicesBuffer_.getSize();\n this.helper.drawElements(0, renderCount);\n } while (++world < endWorld);\n }\n\n /**\n * Clean up.\n */\n disposeInternal() {\n this.worker_.terminate();\n this.layer_ = null;\n this.sourceListenKeys_.forEach(function (key) {\n unlistenByKey(key);\n });\n this.sourceListenKeys_ = null;\n super.disposeInternal();\n }\n}\n\nexport default WebGLPointsLayerRenderer;\n","/**\n * @module ol/layer/Heatmap\n */\nimport BaseVector from './BaseVector.js';\nimport WebGLPointsLayerRenderer from '../renderer/webgl/PointsLayer.js';\nimport {clamp} from '../math.js';\nimport {createCanvasContext2D} from '../dom.js';\n\n/**\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 {Array<string>} [gradient=['#00f', '#0ff', '#0f0', '#ff0', '#f00']] The color gradient\n * of the heatmap, specified as an array of CSS color strings.\n * @property {number} [radius=8] Radius size in pixels.\n * @property {number} [blur=15] Blur size in pixels.\n * @property {string|function(import(\"../Feature.js\").default):number} [weight='weight'] The feature\n * attribute to use for the weight or a function that returns a weight from a feature. Weight values\n * should range from 0 to 1 (and values outside will be clamped to that range).\n * @property {import(\"../source/Vector.js\").default<import(\"../geom/Point.js\").default>} [source] Point source.\n * @property {Object<string, *>} [properties] Arbitrary observable properties. Can be accessed with `#get()` and `#set()`.\n */\n\n/**\n * @enum {string}\n * @private\n */\nconst Property = {\n BLUR: 'blur',\n GRADIENT: 'gradient',\n RADIUS: 'radius',\n};\n\n/**\n * @const\n * @type {Array<string>}\n */\nconst DEFAULT_GRADIENT = ['#00f', '#0ff', '#0f0', '#ff0', '#f00'];\n\n/**\n * @classdesc\n * Layer for rendering vector data as a heatmap.\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 * @fires import(\"../render/Event.js\").RenderEvent\n * @extends {BaseVector<import(\"../source/Vector.js\").default, WebGLPointsLayerRenderer>}\n * @api\n */\nclass Heatmap extends BaseVector {\n /**\n * @param {Options} [options] Options.\n */\n constructor(options) {\n options = options ? options : {};\n\n const baseOptions = Object.assign({}, options);\n\n delete baseOptions.gradient;\n delete baseOptions.radius;\n delete baseOptions.blur;\n delete baseOptions.weight;\n super(baseOptions);\n\n /**\n * @private\n * @type {HTMLCanvasElement}\n */\n this.gradient_ = null;\n\n this.addChangeListener(Property.GRADIENT, this.handleGradientChanged_);\n\n this.setGradient(options.gradient ? options.gradient : DEFAULT_GRADIENT);\n\n this.setBlur(options.blur !== undefined ? options.blur : 15);\n\n this.setRadius(options.radius !== undefined ? options.radius : 8);\n\n const weight = options.weight ? options.weight : 'weight';\n if (typeof weight === 'string') {\n this.weightFunction_ = function (feature) {\n return feature.get(weight);\n };\n } else {\n this.weightFunction_ = weight;\n }\n\n // For performance reasons, don't sort the features before rendering.\n // The render order is not relevant for a heatmap representation.\n this.setRenderOrder(null);\n }\n\n /**\n * Return the blur size in pixels.\n * @return {number} Blur size in pixels.\n * @api\n * @observable\n */\n getBlur() {\n return /** @type {number} */ (this.get(Property.BLUR));\n }\n\n /**\n * Return the gradient colors as array of strings.\n * @return {Array<string>} Colors.\n * @api\n * @observable\n */\n getGradient() {\n return /** @type {Array<string>} */ (this.get(Property.GRADIENT));\n }\n\n /**\n * Return the size of the radius in pixels.\n * @return {number} Radius size in pixel.\n * @api\n * @observable\n */\n getRadius() {\n return /** @type {number} */ (this.get(Property.RADIUS));\n }\n\n /**\n * @private\n */\n handleGradientChanged_() {\n this.gradient_ = createGradient(this.getGradient());\n }\n\n /**\n * Set the blur size in pixels.\n * @param {number} blur Blur size in pixels.\n * @api\n * @observable\n */\n setBlur(blur) {\n this.set(Property.BLUR, blur);\n }\n\n /**\n * Set the gradient colors as array of strings.\n * @param {Array<string>} colors Gradient.\n * @api\n * @observable\n */\n setGradient(colors) {\n this.set(Property.GRADIENT, colors);\n }\n\n /**\n * Set the size of the radius in pixels.\n * @param {number} radius Radius size in pixel.\n * @api\n * @observable\n */\n setRadius(radius) {\n this.set(Property.RADIUS, radius);\n }\n\n createRenderer() {\n return new WebGLPointsLayerRenderer(this, {\n className: this.getClassName(),\n attributes: [\n {\n name: 'weight',\n callback: (feature) => {\n const weight = this.weightFunction_(feature);\n return weight !== undefined ? clamp(weight, 0, 1) : 1;\n },\n },\n ],\n vertexShader: `\n precision mediump float;\n uniform mat4 u_projectionMatrix;\n uniform mat4 u_offsetScaleMatrix;\n uniform float u_size;\n attribute vec2 a_position;\n attribute float a_index;\n attribute float a_weight;\n\n varying vec2 v_texCoord;\n varying float v_weight;\n\n void main(void) {\n mat4 offsetMatrix = u_offsetScaleMatrix;\n float offsetX = a_index == 0.0 || a_index == 3.0 ? -u_size / 2.0 : u_size / 2.0;\n float offsetY = a_index == 0.0 || a_index == 1.0 ? -u_size / 2.0 : u_size / 2.0;\n vec4 offsets = offsetMatrix * vec4(offsetX, offsetY, 0.0, 0.0);\n gl_Position = u_projectionMatrix * vec4(a_position, 0.0, 1.0) + offsets;\n float u = a_index == 0.0 || a_index == 3.0 ? 0.0 : 1.0;\n float v = a_index == 0.0 || a_index == 1.0 ? 0.0 : 1.0;\n v_texCoord = vec2(u, v);\n v_weight = a_weight;\n }`,\n fragmentShader: `\n precision mediump float;\n uniform float u_blurSlope;\n\n varying vec2 v_texCoord;\n varying float v_weight;\n\n void main(void) {\n vec2 texCoord = v_texCoord * 2.0 - vec2(1.0, 1.0);\n float sqRadius = texCoord.x * texCoord.x + texCoord.y * texCoord.y;\n float value = (1.0 - sqrt(sqRadius)) * u_blurSlope;\n float alpha = smoothstep(0.0, 1.0, value) * v_weight;\n gl_FragColor = vec4(alpha, alpha, alpha, alpha);\n }`,\n hitVertexShader: `\n precision mediump float;\n uniform mat4 u_projectionMatrix;\n uniform mat4 u_offsetScaleMatrix;\n uniform float u_size;\n attribute vec2 a_position;\n attribute float a_index;\n attribute float a_weight;\n attribute vec4 a_hitColor;\n\n varying vec2 v_texCoord;\n varying float v_weight;\n varying vec4 v_hitColor;\n\n void main(void) {\n mat4 offsetMatrix = u_offsetScaleMatrix;\n float offsetX = a_index == 0.0 || a_index == 3.0 ? -u_size / 2.0 : u_size / 2.0;\n float offsetY = a_index == 0.0 || a_index == 1.0 ? -u_size / 2.0 : u_size / 2.0;\n vec4 offsets = offsetMatrix * vec4(offsetX, offsetY, 0.0, 0.0);\n gl_Position = u_projectionMatrix * vec4(a_position, 0.0, 1.0) + offsets;\n float u = a_index == 0.0 || a_index == 3.0 ? 0.0 : 1.0;\n float v = a_index == 0.0 || a_index == 1.0 ? 0.0 : 1.0;\n v_texCoord = vec2(u, v);\n v_hitColor = a_hitColor;\n v_weight = a_weight;\n }`,\n hitFragmentShader: `\n precision mediump float;\n uniform float u_blurSlope;\n\n varying vec2 v_texCoord;\n varying float v_weight;\n varying vec4 v_hitColor;\n\n void main(void) {\n vec2 texCoord = v_texCoord * 2.0 - vec2(1.0, 1.0);\n float sqRadius = texCoord.x * texCoord.x + texCoord.y * texCoord.y;\n float value = (1.0 - sqrt(sqRadius)) * u_blurSlope;\n float alpha = smoothstep(0.0, 1.0, value) * v_weight;\n if (alpha < 0.05) {\n discard;\n }\n\n gl_FragColor = v_hitColor;\n }`,\n uniforms: {\n u_size: () => {\n return (this.get(Property.RADIUS) + this.get(Property.BLUR)) * 2;\n },\n u_blurSlope: () => {\n return (\n this.get(Property.RADIUS) / Math.max(1, this.get(Property.BLUR))\n );\n },\n },\n postProcesses: [\n {\n fragmentShader: `\n precision mediump float;\n\n uniform sampler2D u_image;\n uniform sampler2D u_gradientTexture;\n uniform float u_opacity;\n\n varying vec2 v_texCoord;\n\n void main() {\n vec4 color = texture2D(u_image, v_texCoord);\n gl_FragColor.a = color.a * u_opacity;\n gl_FragColor.rgb = texture2D(u_gradientTexture, vec2(0.5, color.a)).rgb;\n gl_FragColor.rgb *= gl_FragColor.a;\n }`,\n uniforms: {\n u_gradientTexture: () => {\n return this.gradient_;\n },\n u_opacity: () => {\n return this.getOpacity();\n },\n },\n },\n ],\n });\n }\n\n renderDeclutter() {}\n}\n\n/**\n * @param {Array<string>} colors A list of colored.\n * @return {HTMLCanvasElement} canvas with gradient texture.\n */\nfunction createGradient(colors) {\n const width = 1;\n const height = 256;\n const context = createCanvasContext2D(width, height);\n\n const gradient = context.createLinearGradient(0, 0, width, height);\n const step = 1 / (colors.length - 1);\n for (let i = 0, ii = colors.length; i < ii; ++i) {\n gradient.addColorStop(i * step, colors[i]);\n }\n\n context.fillStyle = gradient;\n context.fillRect(0, 0, width, height);\n\n return context.canvas;\n}\n\nexport default Heatmap;\n","import Map from 'ol/Map';\nimport { Point } from 'ol/geom';\nimport * as layer from 'ol/layer';\n\nimport {\n EventBus,\n FieldType,\n getFieldColorModeForField,\n GrafanaTheme2,\n MapLayerOptions,\n MapLayerRegistryItem,\n PanelData,\n} from '@grafana/data';\nimport { ScaleDimensionConfig } from '@grafana/schema';\nimport { getScaledDimension } from 'app/features/dimensions';\nimport { ScaleDimensionEditor } from 'app/features/dimensions/editors';\nimport { FrameVectorSource } from 'app/features/geo/utils/frameVectorSource';\nimport { getLocationMatchers } from 'app/features/geo/utils/location';\n\n// Configuration options for Heatmap overlays\nexport interface HeatmapConfig {\n weight: ScaleDimensionConfig;\n blur: number;\n radius: number;\n}\n\nconst defaultOptions: HeatmapConfig = {\n weight: {\n fixed: 1,\n min: 0,\n max: 1,\n },\n blur: 15,\n radius: 5,\n};\n\n/**\n * Map layer configuration for heatmap overlay\n */\nexport const heatmapLayer: MapLayerRegistryItem<HeatmapConfig> = {\n id: 'heatmap',\n name: 'Heatmap',\n description: 'Visualizes a heatmap of the data',\n isBaseMap: false,\n showLocation: true,\n\n /**\n * Function that configures transformation and returns a transformer\n * @param options\n */\n create: async (map: Map, options: MapLayerOptions<HeatmapConfig>, eventBus: EventBus, theme: GrafanaTheme2) => {\n const config = { ...defaultOptions, ...options.config };\n\n const location = await getLocationMatchers(options.location);\n const source = new FrameVectorSource<Point>(location);\n const WEIGHT_KEY = \"_weight\";\n\n // Create a new Heatmap layer\n // Weight function takes a feature as attribute and returns a normalized weight value\n const vectorLayer = new layer.Heatmap({\n source,\n blur: config.blur,\n radius: config.radius,\n weight: (feature) => {\n return feature.get(WEIGHT_KEY);\n },\n });\n\n return {\n init: () => vectorLayer,\n update: (data: PanelData) => {\n const frame = data.series[0];\n if (!frame) {\n return;\n }\n source.update(frame);\n\n const weightDim = getScaledDimension(frame, config.weight);\n source.forEachFeature( (f) => {\n const idx: number = f.get('rowIndex');\n if(idx != null) {\n f.set(WEIGHT_KEY, weightDim.get(idx));\n }\n });\n\n // Set heatmap gradient colors\n let colors = ['#00f', '#0ff', '#0f0', '#ff0', '#f00'];\n\n // Either the configured field or the first numeric field value\n const field = weightDim.field ?? frame.fields.find((field) => field.type === FieldType.number);\n if (field) {\n const colorMode = getFieldColorModeForField(field);\n if (colorMode.isContinuous && colorMode.getColors) {\n // getColors return an array of color string from the color scheme chosen\n colors = colorMode.getColors(theme);\n }\n }\n vectorLayer.setGradient(colors);\n },\n\n // Heatmap overlay options\n registerOptionsUI: (builder) => {\n builder\n .addCustomEditor({\n id: 'config.weight',\n path: 'config.weight',\n name: 'Weight values',\n description: 'Scale the distribution for each row',\n editor: ScaleDimensionEditor,\n settings: {\n min: 0, // no contribution\n max: 1,\n hideRange: true, // Don't show the scale factor\n },\n defaultValue: {\n // Configured values\n fixed: 1,\n min: 0,\n max: 1,\n },\n })\n .addSliderInput({\n path: 'config.radius',\n description: 'Configures the size of clusters',\n name: 'Radius',\n defaultValue: defaultOptions.radius,\n settings: {\n min: 1,\n max: 50,\n step: 1,\n },\n })\n .addSliderInput({\n path: 'config.blur',\n description: 'Configures the amount of blur of clusters',\n name: 'Blur',\n defaultValue: defaultOptions.blur,\n settings: {\n min: 1,\n max: 50,\n step: 1,\n },\n });\n },\n };\n },\n // fill in the default values\n defaultOptions,\n};\n","import Feature from 'ol/Feature';\nimport Map from 'ol/Map';\nimport * as layer from 'ol/layer';\nimport * as source from 'ol/source';\nimport * as style from 'ol/style';\n\nimport { MapLayerRegistryItem, MapLayerOptions, PanelData, GrafanaTheme2, PluginState, EventBus } from '@grafana/data';\nimport { getGeometryField, getLocationMatchers } from 'app/features/geo/utils/location';\n\nexport interface LastPointConfig {\n icon?: string;\n}\n\nconst defaultOptions: LastPointConfig = {\n icon: 'https://openlayers.org/en/latest/examples/data/icon.png',\n};\n\nexport const lastPointTracker: MapLayerRegistryItem<LastPointConfig> = {\n id: 'last-point-tracker',\n name: 'Icon at last point',\n description: 'Show an icon at the last point',\n isBaseMap: false,\n showLocation: true,\n state: PluginState.alpha,\n\n /**\n * Function that configures transformation and returns a transformer\n * @param options\n */\n create: async (map: Map, options: MapLayerOptions<LastPointConfig>, eventBus: EventBus, theme: GrafanaTheme2) => {\n const point = new Feature({});\n const config = { ...defaultOptions, ...options.config };\n\n point.setStyle(\n new style.Style({\n image: new style.Icon({\n src: config.icon,\n }),\n })\n );\n\n const vectorSource = new source.Vector({\n features: [point],\n });\n\n const vectorLayer = new layer.Vector({\n source: vectorSource,\n });\n\n const matchers = await getLocationMatchers(options.location);\n return {\n init: () => vectorLayer,\n update: (data: PanelData) => {\n const frame = data.series[0];\n if (frame && frame.length) {\n const out = getGeometryField(frame, matchers);\n if (!out.field) {\n return; // ???\n }\n point.setGeometry(out.field.values[frame.length - 1]);\n }\n },\n };\n },\n\n // fill in the default values\n defaultOptions,\n};\n","/*\tCopyright (c) 2016 Jean-Marc VIGLINO, \r\n released under the CeCILL-B license (French BSD license)\r\n (http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.txt).\r\n\r\n Usefull function to handle geometric operations\r\n*/\r\n\r\nimport ol_geom_LineString from 'ol/geom/LineString.js'\r\nimport ol_geom_LinearRing from 'ol/geom/LinearRing.js'\r\nimport ol_geom_MultiLineString from 'ol/geom/MultiLineString.js'\r\nimport ol_geom_MultiPoint from 'ol/geom/MultiPoint.js'\r\nimport ol_geom_MultiPolygon from 'ol/geom/MultiPolygon.js'\r\nimport ol_geom_Point from 'ol/geom/Point.js'\r\nimport ol_geom_Polygon from 'ol/geom/Polygon.js'\r\nimport ol_geom_Circle from 'ol/geom/Circle.js'\r\nimport {getCenter as ol_extent_getCenter} from 'ol/extent.js'\r\nimport {buffer as ol_extent_buffer} from 'ol/extent.js'\r\n\r\n/** Distance beetween 2 points\r\n *\tUsefull geometric functions\r\n * @param {ol.Coordinate} p1 first point\r\n * @param {ol.Coordinate} p2 second point\r\n * @return {number} distance\r\n */\r\nvar ol_coordinate_dist2d = function(p1, p2) {\r\n var dx = p1[0]-p2[0];\r\n var dy = p1[1]-p2[1];\r\n return Math.sqrt(dx*dx+dy*dy);\r\n}\r\n\r\n/** 2 points are equal\r\n *\tUsefull geometric functions\r\n * @param {ol.Coordinate} p1 first point\r\n * @param {ol.Coordinate} p2 second point\r\n * @return {boolean}\r\n */\r\nvar ol_coordinate_equal = function(p1, p2) {\r\n return (p1[0]==p2[0] && p1[1]==p2[1]);\r\n}\r\n\r\n/** Get center coordinate of a feature\r\n * @param {ol.Feature} f\r\n * @return {ol.coordinate} the center\r\n */\r\nvar ol_coordinate_getFeatureCenter = function(f) {\r\n return ol_coordinate_getGeomCenter (f.getGeometry());\r\n};\r\n\r\n/** Get center coordinate of a geometry\r\n* @param {ol.geom.Geometry} geom\r\n* @return {ol.Coordinate} the center\r\n*/\r\nvar ol_coordinate_getGeomCenter = function(geom) {\r\n switch (geom.getType()) {\r\n case 'Point': \r\n return geom.getCoordinates();\r\n case \"MultiPolygon\":\r\n geom = geom.getPolygon(0);\r\n // fallthrough\r\n case \"Polygon\":\r\n return geom.getInteriorPoint().getCoordinates();\r\n default:\r\n return geom.getClosestPoint(ol_extent_getCenter(geom.getExtent()));\r\n }\r\n};\r\n\r\n/** Offset a polyline\r\n * @param {Array<ol.Coordinate>} coords\r\n * @param {number} offset\r\n * @return {Array<ol.Coordinate>} resulting coord\r\n * @see http://stackoverflow.com/a/11970006/796832\r\n * @see https://drive.google.com/viewerng/viewer?a=v&pid=sites&srcid=ZGVmYXVsdGRvbWFpbnxqa2dhZGdldHN0b3JlfGd4OjQ4MzI5M2Y0MjNmNzI2MjY\r\n */\r\nvar ol_coordinate_offsetCoords = function (coords, offset) {\r\n var path = [];\r\n var N = coords.length-1;\r\n var max = N;\r\n var mi, mi1, li, li1, ri, ri1, si, si1, Xi1, Yi1;\r\n var p0, p1, p2;\r\n var isClosed = ol_coordinate_equal(coords[0],coords[N]);\r\n if (!isClosed) {\r\n p0 = coords[0];\r\n p1 = coords[1];\r\n p2 = [\r\n p0[0] + (p1[1] - p0[1]) / ol_coordinate_dist2d(p0,p1) *offset,\r\n p0[1] - (p1[0] - p0[0]) / ol_coordinate_dist2d(p0,p1) *offset\r\n ];\r\n path.push(p2);\r\n coords.push(coords[N])\r\n N++;\r\n max--;\r\n }\r\n for (var i = 0; i < max; i++) {\r\n p0 = coords[i];\r\n p1 = coords[(i+1) % N];\r\n p2 = coords[(i+2) % N];\r\n\r\n mi = (p1[1] - p0[1])/(p1[0] - p0[0]);\r\n mi1 = (p2[1] - p1[1])/(p2[0] - p1[0]);\r\n // Prevent alignements\r\n if (Math.abs(mi-mi1) > 1e-10) {\r\n li = Math.sqrt((p1[0] - p0[0])*(p1[0] - p0[0])+(p1[1] - p0[1])*(p1[1] - p0[1]));\r\n li1 = Math.sqrt((p2[0] - p1[0])*(p2[0] - p1[0])+(p2[1] - p1[1])*(p2[1] - p1[1]));\r\n ri = p0[0] + offset*(p1[1] - p0[1])/li;\r\n ri1 = p1[0] + offset*(p2[1] - p1[1])/li1;\r\n si = p0[1] - offset*(p1[0] - p0[0])/li;\r\n si1 = p1[1] - offset*(p2[0] - p1[0])/li1;\r\n Xi1 = (mi1*ri1-mi*ri+si-si1) / (mi1-mi);\r\n Yi1 = (mi*mi1*(ri1-ri)+mi1*si-mi*si1) / (mi1-mi);\r\n\r\n // Correction for vertical lines\r\n if(p1[0] - p0[0] == 0) {\r\n Xi1 = p1[0] + offset*(p1[1] - p0[1])/Math.abs(p1[1] - p0[1]);\r\n Yi1 = mi1*Xi1 - mi1*ri1 + si1;\r\n }\r\n if (p2[0] - p1[0] == 0 ) {\r\n Xi1 = p2[0] + offset*(p2[1] - p1[1])/Math.abs(p2[1] - p1[1]);\r\n Yi1 = mi*Xi1 - mi*ri + si;\r\n }\r\n\r\n path.push([Xi1, Yi1]);\r\n }\r\n }\r\n if (isClosed) {\r\n path.push(path[0]);\r\n } else {\r\n coords.pop();\r\n p0 = coords[coords.length-1];\r\n p1 = coords[coords.length-2];\r\n p2 = [\r\n p0[0] - (p1[1] - p0[1]) / ol_coordinate_dist2d(p0,p1) *offset,\r\n p0[1] + (p1[0] - p0[0]) / ol_coordinate_dist2d(p0,p1) *offset\r\n ];\r\n path.push(p2);\r\n }\r\n return path;\r\n}\r\n\r\n/** Find the segment a point belongs to\r\n * @param {ol.Coordinate} pt\r\n * @param {Array<ol.Coordinate>} coords\r\n * @return {} the index (-1 if not found) and the segment\r\n */\r\nvar ol_coordinate_findSegment = function (pt, coords) {\r\n for (var i=0; i<coords.length-1; i++) {\r\n var p0 = coords[i];\r\n var p1 = coords[i+1];\r\n if (ol_coordinate_equal(pt, p0) || ol_coordinate_equal(pt, p1)) {\r\n return { index:1, segment: [p0,p1] };\r\n } else {\r\n var d0 = ol_coordinate_dist2d(p0,p1);\r\n var v0 = [ (p1[0] - p0[0]) / d0, (p1[1] - p0[1]) / d0 ];\r\n var d1 = ol_coordinate_dist2d(p0,pt);\r\n var v1 = [ (pt[0] - p0[0]) / d1, (pt[1] - p0[1]) / d1 ];\r\n if (Math.abs(v0[0]*v1[1] - v0[1]*v1[0]) < 1e-10) {\r\n return { index:1, segment: [p0,p1] };\r\n }\r\n }\r\n }\r\n return { index: -1 };\r\n};\r\n\r\n/**\r\n * Split a Polygon geom with horizontal lines\r\n * @param {Array<ol.Coordinate>} geom\r\n * @param {number} y the y to split\r\n * @param {number} n contour index\r\n * @return {Array<Array<ol.Coordinate>>}\r\n */\r\nvar ol_coordinate_splitH = function (geom, y, n) {\r\n var x, abs;\r\n var list = [];\r\n for (var i=0; i<geom.length-1; i++) {\r\n // Hole separator?\r\n if (!geom[i].length || !geom[i+1].length) continue;\r\n // Intersect\r\n if (geom[i][1]<=y && geom[i+1][1]>y || geom[i][1]>=y && geom[i+1][1]<y) {\r\n abs = (y-geom[i][1]) / (geom[i+1][1]-geom[i][1]);\r\n x = abs * (geom[i+1][0]-geom[i][0]) + geom[i][0];\r\n list.push ({ contour: n, index: i, pt: [x,y], abs: abs });\r\n }\r\n }\r\n // Sort x\r\n list.sort(function(a,b) { return a.pt[0] - b.pt[0] });\r\n // Horizontal segment\r\n var result = [];\r\n for (var j=0; j<list.length-1; j += 2) {\r\n result.push([list[j], list[j+1]])\r\n }\r\n return result;\r\n};\r\n\r\n/** Create a geometry given a type and coordinates */\r\nvar ol_geom_createFromType = function (type, coordinates) {\r\n switch (type) {\r\n case 'LineString': return new ol_geom_LineString(coordinates);\r\n case 'LinearRing': return new ol_geom_LinearRing(coordinates);\r\n case 'MultiLineString': return new ol_geom_MultiLineString(coordinates);\r\n case 'MultiPoint': return new ol_geom_MultiPoint(coordinates);\r\n case 'MultiPolygon': return new ol_geom_MultiPolygon(coordinates);\r\n case 'Point': return new ol_geom_Point(coordinates);\r\n case 'Polygon': return new ol_geom_Polygon(coordinates);\r\n default:\r\n console.error('[createFromType] Unsupported type: '+type);\r\n return null;\r\n }\r\n};\r\n\r\nexport {ol_geom_createFromType}\r\nexport {ol_coordinate_dist2d, ol_coordinate_equal, ol_coordinate_findSegment, ol_coordinate_getFeatureCenter, ol_coordinate_getGeomCenter, ol_coordinate_offsetCoords, ol_coordinate_splitH}\r\n\r\n/** Intersect 2 lines\r\n * @param {Arrar<ol.coordinate>} d1\r\n * @param {Arrar<ol.coordinate>} d2\r\n */\r\nvar ol_coordinate_getIntersectionPoint = function (d1, d2) {\r\n var d1x = d1[1][0] - d1[0][0];\r\n var d1y = d1[1][1] - d1[0][1];\r\n var d2x = d2[1][0] - d2[0][0];\r\n var d2y = d2[1][1] - d2[0][1];\r\n var det = d1x * d2y - d1y * d2x;\r\n if (det != 0) {\r\n var k = (d1x * d1[0][1] - d1x * d2[0][1] - d1y * d1[0][0] + d1y * d2[0][0]) / det;\r\n return [d2[0][0] + k*d2x, d2[0][1] + k*d2y];\r\n } else {\r\n return false;\r\n }\r\n};\r\n\r\nexport { ol_coordinate_getIntersectionPoint }\r\n\r\nvar ol_extent_intersection;\r\n\r\n(function() {\r\n// Split at x\r\nfunction splitX(pts, x) {\r\n var pt;\r\n for (let i=pts.length-1; i>0; i--) {\r\n if ((pts[i][0]>x && pts[i-1][0]<x) || (pts[i][0]<x && pts[i-1][0]>x)) {\r\n pt = [ x, (x - pts[i][0]) / (pts[i-1][0]-pts[i][0]) * (pts[i-1][1]-pts[i][1]) + pts[i][1]];\r\n pts.splice(i, 0, pt);\r\n }\r\n }\r\n}\r\n// Split at y\r\nfunction splitY(pts, y) {\r\n var pt;\r\n for (let i=pts.length-1; i>0; i--) {\r\n if ((pts[i][1]>y && pts[i-1][1]<y) || (pts[i][1]<y && pts[i-1][1]>y)) {\r\n pt = [ (y - pts[i][1]) / (pts[i-1][1]-pts[i][1]) * (pts[i-1][0]-pts[i][0]) + pts[i][0], y];\r\n pts.splice(i, 0, pt);\r\n }\r\n }\r\n}\r\n\r\n/** Fast polygon intersection with an extent (used for area calculation)\r\n * @param {ol_extent_Extent} extent\r\n * @param {ol_geom_Polygon|ol_geom_MultiPolygon} polygon\r\n * @returns {ol_geom_Polygon|ol_geom_MultiPolygon|null} return null if not a polygon geometry\r\n */\r\nol_extent_intersection = function(extent, polygon) {\r\n var poly = (polygon.getType() === 'Polygon');\r\n if (!poly && polygon.getType() !== 'MultiPolygon') return null;\r\n var geom = polygon.getCoordinates();\r\n if (poly) geom = [geom];\r\n geom.forEach(function(g) {\r\n g.forEach(function(c) {\r\n splitX(c, extent[0]);\r\n splitX(c, extent[2]);\r\n splitY(c, extent[1]);\r\n splitY(c, extent[3]);\r\n });\r\n })\r\n // Snap geom to the extent \r\n geom.forEach(function(g) {\r\n g.forEach(function(c) {\r\n c.forEach(function(p) {\r\n if (p[0]<extent[0]) p[0] = extent[0];\r\n else if (p[0]>extent[2]) p[0] = extent[2];\r\n if (p[1]<extent[1]) p[1] = extent[1];\r\n else if (p[1]>extent[3]) p[1] = extent[3];\r\n })\r\n })\r\n })\r\n if (poly) {\r\n return new ol_geom_Polygon(geom[0]);\r\n } else {\r\n return new ol_geom_MultiPolygon(geom);\r\n }\r\n};\r\n})();\r\n\r\nexport { ol_extent_intersection }\r\nexport { ol_extent_intersection as extentIntersection }\r\n\r\n/** Add points along a segment\r\n * @param {ol_Coordinate} p1 \r\n * @param {ol_Coordinate} p2 \r\n * @param {number} d \r\n * @param {boolean} start include starting point, default true\r\n * @returns {Array<ol_Coordinate>}\r\n */\r\nvar ol_coordinate_sampleAt = function(p1, p2, d, start) {\r\n var pts = [];\r\n if (start!==false) pts.push(p1);\r\n var dl = ol_coordinate_dist2d(p1,p2);\r\n if (dl) {\r\n var nb = Math.round(dl/d);\r\n if (nb>1) {\r\n var dx = (p2[0]-p1[0]) / nb;\r\n var dy = (p2[1]-p1[1]) / nb;\r\n for (var i=1; i<nb; i++) {\r\n pts.push([p1[0] + dx*i, p1[1] + dy*i])\r\n }\r\n }\r\n }\r\n pts.push(p2);\r\n return pts;\r\n};\r\nexport { ol_coordinate_sampleAt }\r\n\r\n/** Sample a LineString at a distance\r\n * @param {number} d\r\n * @returns {ol_geom_LineString}\r\n */\r\nol_geom_LineString.prototype.sampleAt = function(d) {\r\n var line = this.getCoordinates();\r\n var result = [];\r\n for (var i=1; i<line.length; i++) {\r\n result = result.concat(ol_coordinate_sampleAt(line[i-1], line[i], d, i===1));\r\n }\r\n return new ol_geom_LineString(result);\r\n};\r\n\r\n/** Sample a MultiLineString at a distance\r\n * @param {number} d\r\n * @returns {ol_geom_MultiLineString}\r\n */\r\nol_geom_MultiLineString.prototype.sampleAt = function(d) {\r\n var lines = this.getCoordinates();\r\n var result = [];\r\n lines.forEach(function(p) {\r\n var l = [];\r\n for (var i=1; i<p.length; i++) {\r\n l = l.concat(ol_coordinate_sampleAt(p[i-1], p[i], d, i===1));\r\n }\r\n result.push(l);\r\n })\r\n return new ol_geom_MultiLineString(result);\r\n};\r\n\r\n/** Sample a Polygon at a distance\r\n * @param {number} d\r\n * @returns {ol_geom_Polygon}\r\n */\r\nol_geom_Polygon.prototype.sampleAt = function(res) {\r\n var poly = this.getCoordinates();\r\n var result = [];\r\n poly.forEach(function(p) {\r\n var l = [];\r\n for (var i=1; i<p.length; i++) {\r\n l = l.concat(ol_coordinate_sampleAt(p[i-1], p[i], res, i===1));\r\n }\r\n result.push(l);\r\n })\r\n return new ol_geom_Polygon(result);\r\n};\r\n\r\n/** Sample a MultiPolygon at a distance\r\n * @param {number} res\r\n * @returns {ol_geom_MultiPolygon}\r\n */\r\nol_geom_MultiPolygon.prototype.sampleAt = function(res) {\r\n var mpoly = this.getCoordinates();\r\n var result = [];\r\n mpoly.forEach(function(poly) {\r\n var a = [];\r\n result.push(a);\r\n poly.forEach(function(p) {\r\n var l = [];\r\n for (var i=1; i<p.length; i++) {\r\n l = l.concat(ol_coordinate_sampleAt(p[i-1], p[i], res, i===1));\r\n }\r\n a.push(l);\r\n })\r\n });\r\n return new ol_geom_MultiPolygon(result);\r\n};\r\n\r\n/** Intersect a geometry using a circle\r\n * @param {ol_geom_Geometry} geom\r\n * @param {number} resolution circle resolution to sample the polygon on the circle, default 1\r\n * @returns {ol_geom_Geometry}\r\n */\r\nol_geom_Circle.prototype.intersection = function(geom, resolution) {\r\n if (geom.sampleAt) {\r\n var ext = ol_extent_buffer(this.getCenter().concat(this.getCenter()), this.getRadius());\r\n geom = ol_extent_intersection(ext, geom);\r\n geom = geom.simplify(resolution);\r\n var c = this.getCenter();\r\n var r = this.getRadius();\r\n //var res = (resolution||1) * r / 100;\r\n var g = geom.sampleAt(resolution).getCoordinates();\r\n switch (geom.getType()) {\r\n case 'Polygon': g = [g];\r\n // fallthrough\r\n case 'MultiPolygon': {\r\n var hasout = false;\r\n // var hasin = false;\r\n var result = [];\r\n g.forEach(function(poly) {\r\n var a = [];\r\n result.push(a);\r\n poly.forEach(function(ring) {\r\n var l = [];\r\n a.push(l);\r\n ring.forEach(function(p) {\r\n var d = ol_coordinate_dist2d(c, p);\r\n if (d > r) {\r\n hasout = true;\r\n l.push([\r\n c[0] + r / d * (p[0]-c[0]),\r\n c[1] + r / d * (p[1]-c[1])\r\n ]);\r\n } else {\r\n // hasin = true;\r\n l.push(p);\r\n }\r\n });\r\n })\r\n });\r\n if (!hasout) return geom;\r\n if (geom.getType() === 'Polygon') {\r\n return new ol_geom_Polygon(result[0]);\r\n } else {\r\n return new ol_geom_MultiPolygon(result);\r\n }\r\n }\r\n }\r\n } else {\r\n console.warn('[ol/geom/Circle~intersection] Unsupported geometry type: '+geom.getType());\r\n }\r\n return geom;\r\n};\r\n","import {ol_coordinate_equal} from \"./GeomUtils.js\";\r\nimport ol_geom_LineString from \"ol/geom/LineString.js\";\r\n\r\n/** Split a lineString by a point or a list of points\r\n *\tNB: points must be on the line, use getClosestPoint() to get one\r\n * @param {ol.Coordinate | Array<ol.Coordinate>} pt points to split the line\r\n * @param {Number} tol distance tolerance for 2 points to be equal\r\n */\r\nol_geom_LineString.prototype.splitAt = function(pt, tol) {\r\n var i;\r\n if (!pt) return [this];\r\n if (!tol) tol = 1e-10;\r\n // Test if list of points\r\n if (pt.length && pt[0].length) {\r\n var result = [this];\r\n for (i=0; i<pt.length; i++) {\r\n var r = [];\r\n for (var k=0; k<result.length; k++) {\r\n var ri = result[k].splitAt(pt[i], tol);\r\n r = r.concat(ri);\r\n }\r\n result = r;\r\n }\r\n return result;\r\n }\r\n // Nothing to do\r\n if (ol_coordinate_equal(pt,this.getFirstCoordinate())\r\n || ol_coordinate_equal(pt,this.getLastCoordinate())) {\r\n return [this];\r\n }\r\n // Get\r\n var c0 = this.getCoordinates();\r\n var ci=[c0[0]];\r\n var c = [];\r\n for (i=0; i<c0.length-1; i++) {\r\n // Filter equal points\r\n if (ol_coordinate_equal(c0[i],c0[i+1])) continue;\r\n // Extremity found\r\n if (ol_coordinate_equal(pt,c0[i+1])) {\r\n ci.push(c0[i+1]);\r\n c.push(new ol_geom_LineString(ci));\r\n ci = [];\r\n }\r\n // Test alignement\r\n else if (!ol_coordinate_equal(pt,c0[i])) {\r\n var d1, d2, split=false;\r\n if (c0[i][0] == c0[i+1][0]) {\r\n d1 = (c0[i][1]-pt[1]) / (c0[i][1]-c0[i+1][1]);\r\n split = (c0[i][0] == pt[0]) && (0 < d1 && d1 <= 1)\r\n } else if (c0[i][1] == c0[i+1][1]) {\r\n d1 = (c0[i][0]-pt[0]) / (c0[i][0]-c0[i+1][0]);\r\n split = (c0[i][1] == pt[1]) && (0 < d1 && d1 <= 1)\r\n } else {\r\n d1 = (c0[i][0]-pt[0]) / (c0[i][0]-c0[i+1][0]);\r\n d2 = (c0[i][1]-pt[1]) / (c0[i][1]-c0[i+1][1]);\r\n split = (Math.abs(d1-d2) <= tol && 0 < d1 && d1 <= 1)\r\n }\r\n // pt is inside the segment > split\r\n if (split) {\r\n ci.push(pt);\r\n c.push (new ol_geom_LineString(ci));\r\n ci = [pt];\r\n }\r\n }\r\n ci.push(c0[i+1]);\r\n }\r\n if (ci.length>1) c.push (new ol_geom_LineString(ci));\r\n if (c.length) return c;\r\n else return [this];\r\n}\r\n\r\n// import('ol-ext/geom/LineStringSplitAt')","/*\tCopyright (c) 2019 Jean-Marc VIGLINO, \r\n released under the CeCILL-B license (French BSD license)\r\n (http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.txt).\r\n*/\r\n\r\nimport ol_style_Style from 'ol/style/Style.js'\r\nimport {asString as ol_color_asString} from 'ol/color.js'\r\nimport {asArray as ol_color_asArray} from 'ol/color.js'\r\nimport {ol_coordinate_dist2d} from '../geom/GeomUtils.js'\r\nimport '../geom/LineStringSplitAt.js'\r\n\r\n/** Flow line style\r\n * Draw LineString with a variable color / width\r\n * NB: the FlowLine style doesn't impress the hit-detection.\r\n * If you want your lines to be sectionable you have to add your own style to handle this.\r\n * (with transparent line: stroke color opacity to .1 or zero width)\r\n * @constructor\r\n * @extends {ol_style_Style}\r\n * @param {Object} options\r\n * @param {boolean} options.visible draw only the visible part of the line, default true\r\n * @param {number|function} options.width Stroke width or a function that gets a feature and the position (beetween [0,1]) and returns current width\r\n * @param {number} options.width2 Final stroke width (if width is not a function)\r\n * @param {number} options.arrow Arrow at start (-1), at end (1), at both (2), none (0), default geta\r\n * @param {ol.colorLike|function} options.color Stroke color or a function that gets a feature and the position (beetween [0,1]) and returns current color\r\n * @param {ol.colorLike} options.color2 Final sroke color if color is nor a function\r\n * @param {ol.colorLike} options.arrowColor Color of arrows, if not defined used color or color2\r\n * @param {string} options.lineCap CanvasRenderingContext2D.lineCap 'butt' | 'round' | 'square', default 'butt'\r\n * @param {number|ol.size} options.arrowSize height and width of the arrow, default 16\r\n * @param {boolean} [options.noOverlap=false] prevent segments overlaping\r\n * @param {number} options.offset0 offset at line start\r\n * @param {number} options.offset1 offset at line end\r\n */\r\nvar ol_style_FlowLine = class olstyleFlowLine extends ol_style_Style {\r\n constructor(options) {\r\n options = options || {}\r\n\r\n super({\r\n stroke: options.stroke,\r\n text: options.text,\r\n zIndex: options.zIndex,\r\n geometry: options.geometry\r\n })\r\n this.setRenderer(this._render.bind(this))\r\n\r\n // Draw only visible\r\n this._visible = (options.visible !== false)\r\n\r\n // Width\r\n if (typeof options.width === 'function') {\r\n this._widthFn = options.width\r\n } else {\r\n this.setWidth(options.width)\r\n }\r\n this.setWidth2(options.width2)\r\n // Color\r\n if (typeof options.color === 'function') {\r\n this._colorFn = options.color\r\n } else {\r\n this.setColor(options.color)\r\n }\r\n this.setColor2(options.color2)\r\n // LineCap\r\n this.setLineCap(options.lineCap)\r\n // Arrow\r\n this.setArrow(options.arrow)\r\n this.setArrowSize(options.arrowSize)\r\n this.setArrowColor(options.arrowColor)\r\n // Offset\r\n this._offset = [0, 0]\r\n this.setOffset(options.offset0, 0)\r\n this.setOffset(options.offset1, 1)\r\n // Overlap\r\n this._noOverlap = options.noOverlap\r\n }\r\n /** Set the initial width\r\n * @param {number} width width, default 0\r\n */\r\n setWidth(width) {\r\n this._width = width || 0\r\n }\r\n /** Set the final width\r\n * @param {number} width width, default 0\r\n */\r\n setWidth2(width) {\r\n this._width2 = width\r\n }\r\n /** Get offset at start or end\r\n * @param {number} where 0=start, 1=end\r\n * @return {number} width\r\n */\r\n getOffset(where) {\r\n return this._offset[where]\r\n }\r\n /** Add an offset at start or end\r\n * @param {number} width\r\n * @param {number} where 0=start, 1=end\r\n */\r\n setOffset(width, where) {\r\n width = Math.max(0, parseFloat(width))\r\n switch (where) {\r\n case 0: {\r\n this._offset[0] = width\r\n break\r\n }\r\n case 1: {\r\n this._offset[1] = width\r\n break\r\n }\r\n }\r\n }\r\n /** Set the LineCap\r\n * @param {steing} cap LineCap (round or butt), default butt\r\n */\r\n setLineCap(cap) {\r\n this._lineCap = (cap === 'round' ? 'round' : 'butt')\r\n }\r\n /** Get the current width at step\r\n * @param {ol.feature} feature\r\n * @param {number} step current drawing step beetween [0,1]\r\n * @return {number}\r\n */\r\n getWidth(feature, step) {\r\n if (this._widthFn)\r\n return this._widthFn(feature, step)\r\n var w2 = (typeof (this._width2) === 'number') ? this._width2 : this._width\r\n return this._width + (w2 - this._width) * step\r\n }\r\n /** Set the initial color\r\n * @param {ol.colorLike} color\r\n */\r\n setColor(color) {\r\n try {\r\n this._color = ol_color_asArray(color)\r\n } catch (e) {\r\n this._color = [0, 0, 0, 1]\r\n }\r\n }\r\n /** Set the final color\r\n * @param {ol.colorLike} color\r\n */\r\n setColor2(color) {\r\n try {\r\n this._color2 = ol_color_asArray(color)\r\n } catch (e) {\r\n this._color2 = null\r\n }\r\n }\r\n /** Set the arrow color\r\n * @param {ol.colorLike} color\r\n */\r\n setArrowColor(color) {\r\n try {\r\n this._acolor = ol_color_asString(color)\r\n } catch (e) {\r\n this._acolor = null\r\n }\r\n }\r\n /** Get the current color at step\r\n * @param {ol.feature} feature\r\n * @param {number} step current drawing step beetween [0,1]\r\n * @return {string}\r\n */\r\n getColor(feature, step) {\r\n if (this._colorFn)\r\n return ol_color_asString(this._colorFn(feature, step))\r\n var color = this._color\r\n var color2 = this._color2 || this._color\r\n return 'rgba(' +\r\n +Math.round(color[0] + (color2[0] - color[0]) * step) + ','\r\n + Math.round(color[1] + (color2[1] - color[1]) * step) + ','\r\n + Math.round(color[2] + (color2[2] - color[2]) * step) + ','\r\n + (color[3] + (color2[3] - color[3]) * step)\r\n + ')'\r\n }\r\n /** Get arrow\r\n */\r\n getArrow() {\r\n return this._arrow\r\n }\r\n /** Set arrow\r\n * @param {number} n -1 | 0 | 1 | 2, default: 0\r\n */\r\n setArrow(n) {\r\n this._arrow = parseInt(n)\r\n if (this._arrow < -1 || this._arrow > 2)\r\n this._arrow = 0\r\n }\r\n /** getArrowSize\r\n * @return {ol.size}\r\n */\r\n getArrowSize() {\r\n return this._arrowSize || [16, 16]\r\n }\r\n /** setArrowSize\r\n * @param {number|ol.size} size\r\n */\r\n setArrowSize(size) {\r\n if (Array.isArray(size))\r\n this._arrowSize = size\r\n else if (typeof (size) === 'number')\r\n this._arrowSize = [size, size]\r\n }\r\n /** drawArrow\r\n * @param {CanvasRenderingContext2D} ctx\r\n * @param {ol.coordinate} p0\r\n * @param ol.coordinate} p1\r\n * @param {number} width\r\n * @param {number} ratio pixelratio\r\n * @private\r\n */\r\n drawArrow(ctx, p0, p1, width, ratio) {\r\n var asize = this.getArrowSize()[0] * ratio\r\n var l = ol_coordinate_dist2d(p0, p1)\r\n var dx = (p0[0] - p1[0]) / l\r\n var dy = (p0[1] - p1[1]) / l\r\n width = Math.max(this.getArrowSize()[1] / 2, width / 2) * ratio\r\n ctx.beginPath()\r\n ctx.moveTo(p0[0], p0[1])\r\n ctx.lineTo(p0[0] - asize * dx + width * dy, p0[1] - asize * dy - width * dx)\r\n ctx.lineTo(p0[0] - asize * dx - width * dy, p0[1] - asize * dy + width * dx)\r\n ctx.lineTo(p0[0], p0[1])\r\n ctx.fill()\r\n }\r\n /** Renderer function\r\n * @param {Array<ol.coordinate>} geom The pixel coordinates of the geometry in GeoJSON notation\r\n * @param {ol.render.State} e The olx.render.State of the layer renderer\r\n */\r\n _render(geom, e) {\r\n if (e.geometry.getType() === 'LineString') {\r\n var i, g, p, ctx = e.context\r\n // Get geometry used at drawing\r\n if (!this._visible) {\r\n var a = e.pixelRatio / e.resolution\r\n var cos = Math.cos(e.rotation)\r\n var sin = Math.sin(e.rotation)\r\n g = e.geometry.getCoordinates()\r\n var dx = geom[0][0] - g[0][0] * a * cos - g[0][1] * a * sin\r\n var dy = geom[0][1] - g[0][0] * a * sin + g[0][1] * a * cos\r\n geom = []\r\n for (i = 0; p = g[i]; i++) {\r\n geom[i] = [\r\n dx + p[0] * a * cos + p[1] * a * sin,\r\n dy + p[0] * a * sin - p[1] * a * cos,\r\n p[2]\r\n ]\r\n }\r\n }\r\n\r\n var asize = this.getArrowSize()[0] * e.pixelRatio\r\n\r\n ctx.save()\r\n // Offsets\r\n if (this.getOffset(0))\r\n this._splitAsize(geom, this.getOffset(0) * e.pixelRatio)\r\n if (this.getOffset(1))\r\n this._splitAsize(geom, this.getOffset(1) * e.pixelRatio, true)\r\n // Arrow 1\r\n if (geom.length > 1 && (this.getArrow() === -1 || this.getArrow() === 2)) {\r\n p = this._splitAsize(geom, asize)\r\n if (this._acolor)\r\n ctx.fillStyle = this._acolor\r\n else\r\n ctx.fillStyle = this.getColor(e.feature, 0)\r\n this.drawArrow(ctx, p[0], p[1], this.getWidth(e.feature, 0), e.pixelRatio)\r\n }\r\n // Arrow 2 \r\n if (geom.length > 1 && this.getArrow() > 0) {\r\n p = this._splitAsize(geom, asize, true)\r\n if (this._acolor)\r\n ctx.fillStyle = this._acolor\r\n else\r\n ctx.fillStyle = this.getColor(e.feature, 1)\r\n this.drawArrow(ctx, p[0], p[1], this.getWidth(e.feature, 1), e.pixelRatio)\r\n }\r\n\r\n // Split into\r\n var geoms = this._splitInto(geom, 255, 2)\r\n var k = 0\r\n var nb = geoms.length\r\n\r\n // Draw\r\n ctx.lineJoin = 'round'\r\n ctx.lineCap = this._lineCap || 'butt'\r\n\r\n if (geoms.length > 1) {\r\n for (k = 0; k < geoms.length; k++) {\r\n var step = k / nb\r\n g = geoms[k]\r\n ctx.lineWidth = this.getWidth(e.feature, step) * e.pixelRatio\r\n ctx.strokeStyle = this.getColor(e.feature, step)\r\n ctx.beginPath()\r\n ctx.moveTo(g[0][0], g[0][1])\r\n for (i = 1; p = g[i]; i++) {\r\n ctx.lineTo(p[0], p[1])\r\n }\r\n ctx.stroke()\r\n }\r\n }\r\n ctx.restore()\r\n }\r\n }\r\n /** Split extremity at\r\n * @param {ol.geom.LineString} geom\r\n * @param {number} asize\r\n * @param {boolean} end start=false or end=true, default false (start)\r\n */\r\n _splitAsize(geom, asize, end) {\r\n var p, p1, p0\r\n var dl, d = 0\r\n if (end)\r\n p0 = geom.pop()\r\n else\r\n p0 = geom.shift()\r\n p = p0\r\n while (geom.length) {\r\n if (end)\r\n p1 = geom.pop()\r\n else\r\n p1 = geom.shift()\r\n dl = ol_coordinate_dist2d(p, p1)\r\n if (d + dl > asize) {\r\n p = [p[0] + (p1[0] - p[0]) * (asize - d) / dl, p[1] + (p1[1] - p[1]) * (asize - d) / dl]\r\n dl = ol_coordinate_dist2d(p, p0)\r\n if (end) {\r\n geom.push(p1)\r\n geom.push(p)\r\n geom.push([p[0] + (p0[0] - p[0]) / dl, p[1] + (p0[1] - p[1]) / dl])\r\n } else {\r\n geom.unshift(p1)\r\n geom.unshift(p)\r\n geom.unshift([p[0] + (p0[0] - p[0]) / dl, p[1] + (p0[1] - p[1]) / dl])\r\n }\r\n break\r\n }\r\n d += dl\r\n p = p1\r\n }\r\n return [p0, p]\r\n }\r\n /** Split line geometry into equal length geometries\r\n * @param {Array<ol.coordinate>} geom\r\n * @param {number} nb number of resulting geometries, default 255\r\n * @param {number} nim minimum length of the resulting geometries, default 1\r\n */\r\n _splitInto(geom, nb, min) {\r\n var i, p\r\n var dt = this._noOverlap ? 1 : .9\r\n // Split geom into equal length geoms\r\n var geoms = []\r\n var dl, l = 0\r\n for (i = 1; p = geom[i]; i++) {\r\n l += ol_coordinate_dist2d(geom[i - 1], p)\r\n }\r\n var length = Math.max(min || 2, l / (nb || 255))\r\n var p0 = geom[0]\r\n l = 0\r\n var g = [p0]\r\n i = 1\r\n p = geom[1]\r\n while (i < geom.length) {\r\n var dx = p[0] - p0[0]\r\n var dy = p[1] - p0[1]\r\n dl = Math.sqrt(dx * dx + dy * dy)\r\n if (l + dl > length) {\r\n var d = (length - l) / dl\r\n g.push([\r\n p0[0] + dx * d,\r\n p0[1] + dy * d\r\n ])\r\n geoms.push(g)\r\n p0 = [\r\n p0[0] + dx * d * dt,\r\n p0[1] + dy * d * dt\r\n ]\r\n g = [p0]\r\n l = 0\r\n } else {\r\n l += dl\r\n p0 = p\r\n g.push(p0)\r\n i++\r\n p = geom[i]\r\n }\r\n }\r\n geoms.push(g)\r\n return geoms\r\n }\r\n}\r\n\r\nexport default ol_style_FlowLine\r\n","import { isNumber } from 'lodash';\nimport { Feature } from 'ol';\nimport { FeatureLike } from 'ol/Feature';\nimport Map from 'ol/Map';\nimport { Geometry, LineString, Point, SimpleGeometry } from 'ol/geom';\nimport VectorLayer from 'ol/layer/Vector';\nimport { Fill, Stroke, Style, Text } from 'ol/style';\nimport FlowLine from 'ol-ext/style/FlowLine';\nimport React, { ReactNode } from 'react';\nimport { ReplaySubject } from 'rxjs';\nimport tinycolor from 'tinycolor2';\n\nimport {\n MapLayerRegistryItem,\n MapLayerOptions,\n PanelData,\n GrafanaTheme2,\n FrameGeometrySourceMode,\n EventBus,\n DataFrame,\n Field,\n PluginState,\n} from '@grafana/data';\nimport { TextDimensionMode } from '@grafana/schema';\nimport { FrameVectorSource } from 'app/features/geo/utils/frameVectorSource';\nimport { getGeometryField, getLocationMatchers } from 'app/features/geo/utils/location';\nimport { GraphFrame } from 'app/plugins/panel/nodeGraph/types';\nimport { getGraphFrame } from 'app/plugins/panel/nodeGraph/utils';\n\nimport { MarkersLegendProps, MarkersLegend } from '../../components/MarkersLegend';\nimport { ObservablePropsWrapper } from '../../components/ObservablePropsWrapper';\nimport { StyleEditor } from '../../editor/StyleEditor';\nimport { StyleConfig, defaultStyleConfig } from '../../style/types';\nimport { getStyleConfigState } from '../../style/utils';\nimport { getStyleDimension } from '../../utils/utils';\n\nexport interface NetworkConfig {\n style: StyleConfig;\n showLegend?: boolean;\n edgeStyle: StyleConfig;\n arrow?: 0 | 1 | -1 | 2;\n}\n\nconst defaultOptions: NetworkConfig = {\n style: defaultStyleConfig,\n showLegend: false,\n edgeStyle: defaultStyleConfig,\n arrow: 0,\n};\n\nexport const NETWORK_LAYER_ID = 'network';\n\n// Used by default when nothing is configured\nexport const defaultMarkersConfig: MapLayerOptions<NetworkConfig> = {\n type: NETWORK_LAYER_ID,\n name: '', // will get replaced\n config: defaultOptions,\n location: {\n mode: FrameGeometrySourceMode.Auto,\n },\n};\n\n/**\n * Map layer configuration for network overlay\n */\nexport const networkLayer: MapLayerRegistryItem<NetworkConfig> = {\n id: NETWORK_LAYER_ID,\n name: 'Network',\n description: 'Render a node graph as a map layer',\n isBaseMap: false,\n showLocation: true,\n hideOpacity: true,\n state: PluginState.beta,\n\n /**\n * Function that configures transformation and returns a transformer\n * @param map\n * @param options\n * @param eventBus\n * @param theme\n */\n create: async (map: Map, options: MapLayerOptions<NetworkConfig>, eventBus: EventBus, theme: GrafanaTheme2) => {\n // Assert default values\n const config = {\n ...defaultOptions,\n ...options?.config,\n };\n\n const style = await getStyleConfigState(config.style);\n const edgeStyle = await getStyleConfigState(config.edgeStyle);\n const location = await getLocationMatchers(options.location);\n const source = new FrameVectorSource(location);\n\n const vectorLayer = new VectorLayer({\n source,\n });\n const hasArrows = config.arrow === 1 || config.arrow === -1 || config.arrow === 2;\n\n // TODO update legend to display edges as well\n const legendProps = new ReplaySubject<MarkersLegendProps>(1);\n let legend: ReactNode = null;\n if (config.showLegend) {\n legend = <ObservablePropsWrapper watch={legendProps} initialSubProps={{}} child={MarkersLegend} />;\n }\n\n vectorLayer.setStyle((feature: FeatureLike) => {\n const geom = feature.getGeometry();\n const idx = feature.get('rowIndex');\n const dims = style.dims;\n\n if (!style.fields && !edgeStyle.fields && !hasArrows && geom?.getType() !== 'LineString') {\n // Set a global style\n return style.maker(style.base);\n }\n\n // For edges\n if (geom?.getType() === 'LineString' && geom instanceof SimpleGeometry) {\n const edgeDims = edgeStyle.dims;\n const edgeTextConfig = edgeStyle.config.textConfig;\n const edgeId = Number(feature.getId());\n const coordinates = geom.getCoordinates();\n const opacity = edgeStyle.config.opacity ?? 1;\n if (coordinates && edgeDims) {\n const segmentStartCoords = coordinates[0];\n const segmentEndCoords = coordinates[1];\n const color1 = tinycolor(\n theme.visualization.getColorByName((edgeDims.color && edgeDims.color.get(edgeId)) ?? edgeStyle.base.color)\n )\n .setAlpha(opacity)\n .toString();\n const color2 = tinycolor(\n theme.visualization.getColorByName((edgeDims.color && edgeDims.color.get(edgeId)) ?? edgeStyle.base.color)\n )\n .setAlpha(opacity)\n .toString();\n const arrowSize1 = (edgeDims.size && edgeDims.size.get(edgeId)) ?? edgeStyle.base.size;\n const arrowSize2 = (edgeDims.size && edgeDims.size.get(edgeId)) ?? edgeStyle.base.size;\n const styles = [];\n\n const flowStyle = new FlowLine({\n visible: true,\n lineCap: config.arrow === 0 ? 'round' : 'square',\n color: color1,\n color2: color2,\n width: (edgeDims.size && edgeDims.size.get(edgeId)) ?? edgeStyle.base.size,\n width2: (edgeDims.size && edgeDims.size.get(edgeId)) ?? edgeStyle.base.size,\n });\n\n if (config.arrow) {\n flowStyle.setArrow(config.arrow);\n if (config.arrow > 0) {\n flowStyle.setArrowColor(color2);\n flowStyle.setArrowSize((arrowSize2 ?? 0) * 2);\n } else {\n flowStyle.setArrowColor(color1);\n flowStyle.setArrowSize((arrowSize1 ?? 0) * 2);\n }\n }\n const LS = new LineString([segmentStartCoords, segmentEndCoords]);\n flowStyle.setGeometry(LS);\n\n const fontFamily = theme.typography.fontFamily;\n if (edgeDims.text || edgeStyle.config.text?.mode === TextDimensionMode.Fixed) {\n const labelStyle = new Style({\n zIndex: 10,\n text: new Text({\n text: edgeDims.text?.get(edgeId) ?? edgeStyle.config.text?.fixed,\n font: `normal ${edgeTextConfig?.fontSize}px ${fontFamily}`,\n fill: new Fill({ color: color1 ?? defaultStyleConfig.color.fixed }),\n stroke: new Stroke({\n color: tinycolor(theme.visualization.getColorByName('text')).setAlpha(opacity).toString(),\n width: Math.max(edgeTextConfig?.fontSize! / 10, 1),\n }),\n ...edgeTextConfig,\n }),\n });\n labelStyle.setGeometry(LS);\n styles.push(labelStyle);\n }\n styles.push(flowStyle);\n return styles;\n }\n }\n if (!dims || !isNumber(idx)) {\n return style.maker(style.base);\n }\n\n const values = { ...style.base };\n\n if (dims.color) {\n values.color = dims.color.get(idx);\n }\n if (dims.size) {\n values.size = dims.size.get(idx);\n }\n if (dims.text) {\n values.text = dims.text.get(idx);\n }\n if (dims.rotation) {\n values.rotation = dims.rotation.get(idx);\n }\n return style.maker(values);\n });\n\n return {\n init: () => vectorLayer,\n legend: legend,\n update: (data: PanelData) => {\n if (!data.series?.length) {\n source.clear();\n return; // ignore empty\n }\n\n // Post updates to the legend component\n if (legend) {\n legendProps.next({\n styleConfig: style,\n size: style.dims?.size,\n layerName: options.name,\n layer: vectorLayer,\n });\n }\n const graphFrames = getGraphFrame(data.series);\n\n for (const frame of data.series) {\n if (frame === graphFrames.edges[0]) {\n edgeStyle.dims = getStyleDimension(frame, edgeStyle, theme);\n } else {\n style.dims = getStyleDimension(frame, style, theme);\n }\n\n updateEdge(source, graphFrames);\n }\n },\n\n // Marker overlay options\n registerOptionsUI: (builder, context) => {\n const networkFrames = getGraphFrame(context.data);\n const frameNodes = networkFrames.nodes[0];\n const frameEdges = networkFrames.edges[0];\n\n builder\n .addCustomEditor({\n id: 'config.style',\n category: ['Node Styles'],\n path: 'config.style',\n name: 'Node Styles',\n editor: StyleEditor,\n settings: {\n displayRotation: true,\n frameMatcher: (frame: DataFrame) => frame === frameNodes,\n },\n defaultValue: defaultOptions.style,\n })\n .addCustomEditor({\n id: 'config.edgeStyle',\n category: ['Edge Styles'],\n path: 'config.edgeStyle',\n name: 'Edge Styles',\n editor: StyleEditor,\n settings: {\n hideSymbol: true,\n frameMatcher: (frame: DataFrame) => frame === frameEdges,\n },\n defaultValue: defaultOptions.style,\n })\n .addRadio({\n path: 'config.arrow',\n name: 'Arrow',\n settings: {\n options: [\n { label: 'None', value: 0 },\n { label: 'Forward', value: 1 },\n { label: 'Reverse', value: -1 },\n { label: 'Both', value: 2 },\n ],\n },\n defaultValue: defaultOptions.arrow,\n })\n .addBooleanSwitch({\n path: 'config.showLegend',\n name: 'Show legend',\n description: 'Show map legend',\n defaultValue: defaultOptions.showLegend,\n });\n },\n };\n },\n\n // fill in the default values\n defaultOptions,\n};\n\nfunction updateEdge(source: FrameVectorSource, graphFrames: GraphFrame) {\n source.clear(true);\n\n const frameNodes = graphFrames.nodes[0];\n const frameEdges = graphFrames.edges[0];\n\n if (!frameNodes || !frameEdges) {\n // TODO: provide helpful error message / link to docs for how to format data\n return;\n }\n\n const info = getGeometryField(frameNodes, source.location);\n if (!info.field) {\n source.changed();\n return;\n }\n\n // TODO: Fix this\n // eslint-disable-next-line\n const field = info.field as unknown as Field<Point>;\n\n // TODO for nodes, don't hard code id field name\n const nodeIdIndex = frameNodes.fields.findIndex((f: Field) => f.name === 'id');\n const nodeIdValues = frameNodes.fields[nodeIdIndex].values;\n\n // Edges\n // TODO for edges, don't hard code source and target fields\n const sourceIndex = frameEdges.fields.findIndex((f: Field) => f.name === 'source');\n const targetIndex = frameEdges.fields.findIndex((f: Field) => f.name === 'target');\n\n const sources = frameEdges.fields[sourceIndex].values;\n const targets = frameEdges.fields[targetIndex].values;\n\n // Loop through edges, referencing node locations\n for (let i = 0; i < sources.length; i++) {\n // Create linestring for each edge\n const sourceId = sources[i];\n const targetId = targets[i];\n\n const sourceNodeIndex = nodeIdValues.findIndex((value: string) => value === sourceId);\n const targetNodeIndex = nodeIdValues.findIndex((value: string) => value === targetId);\n\n if (!field.values[sourceNodeIndex] || !field.values[targetNodeIndex]) {\n continue;\n }\n\n const geometryEdge: Geometry = new LineString([\n field.values[sourceNodeIndex].getCoordinates(),\n field.values[targetNodeIndex].getCoordinates(),\n ]);\n\n const edgeFeature = new Feature({\n geometry: geometryEdge,\n });\n edgeFeature.setId(i);\n source['addFeatureInternal'](edgeFeature); // @TODO revisit?\n }\n\n // Nodes\n for (let i = 0; i < frameNodes.length; i++) {\n source['addFeatureInternal'](\n new Feature({\n frameNodes,\n rowIndex: i,\n geometry: info.field.values[i],\n })\n );\n }\n\n // only call source at the end\n source.changed();\n}\n","/*\tCopyright (c) 2015 Jean-Marc VIGLINO, \r\n released under the CeCILL-B license (French BSD license)\r\n (http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.txt).\r\n*\r\n* Photo style for vector features\r\n*/\r\nimport ol_style_RegularShape from 'ol/style/RegularShape.js'\r\nimport {asString as ol_color_asString} from 'ol/color.js'\r\nimport ol_style_Stroke from 'ol/style/Stroke.js'\r\nimport ol_style_Fill from 'ol/style/Fill.js'\r\n\r\n/**\r\n * @classdesc\r\n * Set Photo style for vector features.\r\n *\r\n * @constructor\r\n * @param {} options\r\n * @param { default | square | circle | anchored | folio } options.kind\r\n * @param {boolean} options.crop crop within square, default is false\r\n * @param {Number} options.radius symbol size\r\n * @param {Number} [options.shadow=0] drop a shadow (the shadow width in pixel)\r\n * @param {string} [options.declutterMode] Declutter mode \"declutter\" | \"obstacle\" | \"none\" | undefined\t\r\n * @param {ol_style_Stroke} options.stroke\r\n * @param {String} options.src image src\r\n * @param {String} options.crossOrigin The crossOrigin attribute for loaded images. Note that you must provide a crossOrigin value if you want to access pixel data with the Canvas renderer.\r\n * @param {Array<number>} [options.displacement] to use with ol > 6\r\n * \t@param {number} [options.offsetX=0] Horizontal offset in pixels, deprecated use displacement with ol>6\r\n * \t@param {number} [options.offsetY=0] Vertical offset in pixels, deprecated use displacement with ol>6\r\n * @param {function} [options.onload] callback when image is loaded (to redraw the layer)\r\n * @param {function} [options.onerror] callback when image is on error (not loaded)\r\n * @extends {ol_style_RegularShape}\r\n * @implements {ol.structs.IHasChecksum}\r\n * @api\r\n */\r\nvar ol_style_Photo = class olstylePhoto extends ol_style_RegularShape {\r\n constructor(options) {\r\n options = options || {}\r\n if (!options.displacement)\r\n options.displacement = [options.offsetX || 0, -options.offsetY || 0]\r\n var sanchor = (options.kind === \"anchored\" ? 8 : 0)\r\n var shadow = (Number(options.shadow) || 0)\r\n if (!options.stroke) {\r\n options.stroke = new ol_style_Stroke({ width: 0, color: \"#000\" })\r\n }\r\n var strokeWidth = options.stroke.getWidth()\r\n if (strokeWidth < 0) strokeWidth = 0;\r\n if (options.kind == 'folio') strokeWidth += 6;\r\n options.stroke.setWidth(strokeWidth)\r\n\r\n super({\r\n radius: options.radius + strokeWidth + sanchor / 2 + shadow / 2,\r\n points: 0,\r\n displacement: [options.displacement[0] || 0, (options.displacement[1] || 0) + sanchor],\r\n // No fill to create a hit detection Image (v5) or transparent (v6) \r\n fill: ol_style_RegularShape.prototype.render ? new ol_style_Fill({ color: [0, 0, 0, 0] }) : null,\r\n declutterMode: options.declutterMode,\r\n })\r\n this.sanchor_ = sanchor;\r\n this._shadow = shadow;\r\n\r\n // Hack to get the hit detection Image (v4.6.5 ?)\r\n if (!this.getHitDetectionImage) {\r\n var img = super.getImage.call(this)\r\n if (!this.hitDetectionCanvas_) {\r\n for (var i in this) {\r\n if (this[i] && this[i].getContext && this[i] !== img) {\r\n this.hitDetectionCanvas_ = this[i]\r\n break\r\n }\r\n }\r\n }\r\n // Clone canvas for hit detection (old versions)\r\n this.hitDetectionCanvas_ = document.createElement('canvas')\r\n this.hitDetectionCanvas_.width = img.width\r\n this.hitDetectionCanvas_.height = img.height\r\n var hit = this.hitDetectionCanvas_\r\n this.getHitDetectionImage = function () {\r\n return hit\r\n }\r\n }\r\n\r\n this._stroke = options.stroke\r\n this._fill = options.fill\r\n this._crop = options.crop\r\n this._crossOrigin = options.crossOrigin\r\n this._kind = options.kind || \"default\"\r\n\r\n this._radius = options.radius\r\n this._src = options.src\r\n\r\n this._offset = [options.offsetX ? options.offsetX : 0, options.offsetY ? options.offsetY : 0]\r\n\r\n this._onload = options.onload\r\n this._onerror = options.onerror\r\n\r\n if (typeof (options.opacity) == 'number')\r\n this.setOpacity(options.opacity)\r\n if (typeof (options.rotation) == 'number')\r\n this.setRotation(options.rotation)\r\n\r\n // Calculate image\r\n this.getImage()\r\n }\r\n /** Set photo offset\r\n * @param {ol.pixel} offset\r\n */\r\n setOffset(offset) {\r\n this._offset = [offset[0] || 0, offset[1] || 0]\r\n this.getImage()\r\n }\r\n /**\r\n * Clones the style.\r\n * @return {ol_style_Photo}\r\n */\r\n clone() {\r\n var i = new ol_style_Photo({\r\n stroke: this._stroke,\r\n fill: this._fill,\r\n shadow: this._shadow,\r\n crop: this._crop,\r\n crossOrigin: this._crossOrigin,\r\n kind: this._kind,\r\n radius: this._radius,\r\n src: this._src,\r\n offsetX: this._offset[0],\r\n offsetY: this._offset[1],\r\n opacity: this.getOpacity(),\r\n rotation: this.getRotation(),\r\n declutterMode: this.getDeclutterMode ? this.getDeclutterMode() : null,\r\n })\r\n i.getImage()\r\n return i\r\n }\r\n /**\r\n * Draw the form without the image\r\n * @private\r\n */\r\n drawBack_(context, color, strokeWidth, pixelratio) {\r\n var shadow = this._shadow\r\n var canvas = context.canvas\r\n context.beginPath()\r\n context.fillStyle = color\r\n context.clearRect(0, 0, canvas.width, canvas.height)\r\n var width = canvas.width / pixelratio\r\n var height = canvas.height / pixelratio\r\n switch (this._kind) {\r\n case 'square': {\r\n context.rect(0, 0, width - shadow, height - shadow)\r\n break\r\n }\r\n case 'circle': {\r\n context.arc(this._radius + strokeWidth, this._radius + strokeWidth, this._radius + strokeWidth, 0, 2 * Math.PI, false)\r\n break\r\n }\r\n case 'folio': {\r\n var offset = 6\r\n strokeWidth -= offset\r\n context.strokeStyle = 'rgba(0,0,0,0.5)'\r\n context.lineWidth = 1\r\n var w = width - shadow - 2 * offset\r\n var a = Math.atan(6 / w)\r\n context.save()\r\n context.rotate(-a)\r\n context.translate(-6, 2)\r\n context.beginPath()\r\n context.rect(offset, offset, w, w)\r\n context.stroke()\r\n context.fill()\r\n context.restore()\r\n context.save()\r\n context.translate(6, -1)\r\n context.rotate(a)\r\n context.beginPath()\r\n context.rect(offset, offset, w, w)\r\n context.stroke()\r\n context.fill()\r\n context.restore()\r\n context.beginPath()\r\n context.rect(offset, offset, w, w)\r\n context.stroke()\r\n break\r\n }\r\n case 'anchored': {\r\n context.roundRect(this.sanchor_ / 2, 0, width - this.sanchor_ - shadow, height - this.sanchor_ - shadow, strokeWidth)\r\n context.moveTo(width / 2 - this.sanchor_ - shadow / 2, height - this.sanchor_ - shadow)\r\n context.lineTo(width / 2 + this.sanchor_ - shadow / 2, height - this.sanchor_ - shadow)\r\n context.lineTo(width / 2 - shadow / 2, height - shadow); break\r\n }\r\n default: {\r\n // roundrect\r\n context.roundRect(0, 0, width - shadow, height - shadow, strokeWidth)\r\n break\r\n }\r\n }\r\n context.closePath()\r\n }\r\n /**\r\n * Get the image icon.\r\n * @param {number} pixelRatio Pixel ratio.\r\n * @return {HTMLCanvasElement} Image or Canvas element.\r\n * @api\r\n */\r\n getImage(pixelratio) {\r\n pixelratio = pixelratio || window.devicePixelRatio;\r\n var canvas = ol_style_RegularShape.prototype.getImage.call(this, pixelratio)\r\n if ((this._gethit || this.img_) && this._currentRatio === pixelratio) return canvas;\r\n // Calculate image at pixel ratio\r\n this._currentRatio = pixelratio;\r\n\r\n var strokeStyle\r\n var strokeWidth = 0\r\n if (this._stroke) {\r\n strokeStyle = ol_color_asString(this._stroke.getColor())\r\n strokeWidth = this._stroke.getWidth()\r\n }\r\n\r\n // Draw hitdetection image\r\n this._gethit = true\r\n var context = this.getHitDetectionImage().getContext('2d')\r\n context.save()\r\n context.setTransform(1, 0, 0, 1, 0, 0)\r\n this.drawBack_(context, \"#000\", strokeWidth, 1)\r\n context.fill()\r\n context.restore()\r\n this._gethit = false\r\n\r\n // Draw the image\r\n context = canvas.getContext('2d')\r\n context.save()\r\n context.setTransform(pixelratio, 0, 0, pixelratio, 0, 0)\r\n this.drawBack_(context, strokeStyle, strokeWidth, pixelratio)\r\n\r\n // Draw a shadow\r\n if (this._shadow) {\r\n context.shadowColor = 'rgba(0,0,0,0.5)'\r\n context.shadowBlur = pixelratio * this._shadow / 2\r\n context.shadowOffsetX = pixelratio * this._shadow / 2\r\n context.shadowOffsetY = pixelratio * this._shadow / 2\r\n }\r\n context.fill()\r\n context.restore()\r\n\r\n var self = this\r\n var img = this.img_ = new Image()\r\n if (this._crossOrigin) img.crossOrigin = this._crossOrigin\r\n img.src = this._src\r\n\r\n // Draw image\r\n if (img.width) {\r\n self.drawImage_(canvas, img, pixelratio)\r\n } else {\r\n img.onload = function () {\r\n self.drawImage_(canvas, img, pixelratio)\r\n // Force change (?!)\r\n // self.setScale(1);\r\n if (self._onload) self._onload()\r\n }\r\n if (self._onerror) {\r\n img.onerror = function () {\r\n self._onerror()\r\n }\r\n }\r\n }\r\n\r\n // Set anchor (ol < 6)\r\n if (!this.getDisplacement) {\r\n var a = this.getAnchor()\r\n a[0] = (canvas.width / pixelratio - this._shadow) / 2 - this._offset[0]\r\n if (this.sanchor_) {\r\n a[1] = canvas.height / pixelratio - this._shadow - this._offset[1]\r\n } else {\r\n a[1] = (canvas.height / pixelratio - this._shadow) / 2 - this._offset[1]\r\n }\r\n }\r\n\r\n return canvas\r\n }\r\n /** Returns the photo image\r\n * @returns {HTMLImageElement}\r\n */\r\n getPhoto() {\r\n return this.img_\r\n }\r\n /**\r\n * Draw an timage when loaded\r\n * @private\r\n */\r\n drawImage_(canvas, img, pixelratio) {\r\n // Remove the circle on the canvas\r\n var context = (canvas.getContext('2d'))\r\n\r\n var strokeWidth = 0\r\n if (this._stroke)\r\n strokeWidth = this._stroke.getWidth()\r\n var size = 2 * this._radius\r\n\r\n context.save()\r\n if (ol_style_RegularShape.prototype.render)\r\n context.setTransform(pixelratio, 0, 0, pixelratio, 0, 0)\r\n if (this._kind == 'circle') {\r\n context.beginPath()\r\n context.arc(this._radius + strokeWidth, this._radius + strokeWidth, this._radius, 0, 2 * Math.PI, false)\r\n context.clip()\r\n }\r\n var s, x, y, w, h, sx, sy, sw, sh\r\n // Crop the image to a square vignette\r\n if (this._crop) {\r\n s = Math.min(img.width / size, img.height / size)\r\n sw = sh = s * size\r\n sx = (img.width - sw) / 2\r\n sy = (img.height - sh) / 2\r\n\r\n x = y = 0\r\n w = h = size + 1\r\n } else {\r\n // Fit the image to the size\r\n s = Math.min(size / img.width, size / img.height)\r\n sx = sy = 0\r\n sw = img.width\r\n sh = img.height\r\n\r\n w = s * sw\r\n h = s * sh\r\n x = (size - w) / 2\r\n y = (size - h) / 2\r\n }\r\n x += strokeWidth + this.sanchor_ / 2\r\n y += strokeWidth\r\n\r\n context.drawImage(img, sx, sy, sw, sh, x, y, w, h)\r\n\r\n // Draw a circle to avoid aliasing on clip\r\n if (this._kind == 'circle' && strokeWidth) {\r\n context.beginPath()\r\n context.strokeStyle = ol_color_asString(this._stroke.getColor())\r\n context.lineWidth = strokeWidth / 4\r\n context.arc(this._radius + strokeWidth, this._radius + strokeWidth, this._radius, 0, 2 * Math.PI, false)\r\n context.stroke()\r\n }\r\n context.restore()\r\n }\r\n}\r\n\r\n/**\r\n * Draws a rounded rectangle using the current state of the canvas. \r\n * Draw a rectangle if the radius is null.\r\n * @param {Number} x The top left x coordinate\r\n * @param {Number} y The top left y coordinate \r\n * @param {Number} width The width of the rectangle \r\n * @param {Number} height The height of the rectangle\r\n * @param {Number} radius The corner radius.\r\n */\r\nCanvasRenderingContext2D.prototype.roundRect = function (x, y, w, h, r) {\r\n if (!r) {\r\n this.rect(x,y,w,h);\r\n } else {\r\n if (w < 2 * r) r = w / 2;\r\n if (h < 2 * r) r = h / 2;\r\n this.beginPath();\r\n this.moveTo(x+r, y);\r\n this.arcTo(x+w, y, x+w, y+h, r);\r\n this.arcTo(x+w, y+h, x, y+h, r);\r\n this.arcTo(x, y+h, x, y, r);\r\n this.arcTo(x, y, x+w, y, r);\r\n this.closePath();\r\n }\r\n return this;\r\n};\r\n\r\nexport default ol_style_Photo\r\n","import { FeatureLike } from 'ol/Feature';\nimport Map from 'ol/Map';\nimport VectorLayer from 'ol/layer/Vector';\nimport { Stroke, Style } from 'ol/style';\nimport Photo from 'ol-ext/style/Photo';\n\nimport {\n MapLayerRegistryItem,\n PanelData,\n GrafanaTheme2,\n EventBus,\n PluginState,\n FieldType,\n Field,\n} from '@grafana/data';\nimport { FrameGeometrySourceMode, MapLayerOptions } from '@grafana/schema';\nimport { findField } from 'app/features/dimensions';\nimport { FrameVectorSource } from 'app/features/geo/utils/frameVectorSource';\nimport { getLocationMatchers } from 'app/features/geo/utils/location';\n\n// Configuration options for Circle overlays\nexport interface PhotoConfig {\n kind: 'square' | 'circle' | 'anchored' | 'folio';\n border: number; // Sets border width around images\n shadow: boolean; // Renders drop shadow behind images\n crop: boolean; // Crops images to fill shape\n src?: string; // Image source field\n radius: number; // Image radius\n color: string; // Border color\n}\n\nconst defaultOptions: PhotoConfig = {\n kind: 'square',\n border: 2,\n shadow: true,\n crop: true,\n radius: 20,\n color: 'rgb(200, 200, 200)',\n};\n\nexport const PHOTOS_LAYER_ID = 'photos';\n\n// Used by default when nothing is configured\nexport const defaultPhotosConfig: MapLayerOptions<PhotoConfig> = {\n type: PHOTOS_LAYER_ID,\n name: '', // will get replaced\n config: defaultOptions,\n location: {\n mode: FrameGeometrySourceMode.Auto,\n },\n tooltip: true,\n};\n\n// TODO Find a way to use SVG scaled to behave like a png, currently using base64 conversion\n//const unknownImageSVG = '../../../../../public/img/icons/unicons/question-circle.svg';\nconst unknownImage =\n 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiBjbGFzcz0iY3NzLWV5eDRkbyI+PHBhdGggZD0iTTExLjI5LDE1LjI5YTEuNTgsMS41OCwwLDAsMC0uMTIuMTUuNzYuNzYsMCwwLDAtLjA5LjE4LjY0LjY0LDAsMCwwLS4wNi4xOCwxLjM2LDEuMzYsMCwwLDAsMCwuMi44NC44NCwwLDAsMCwuMDguMzguOS45LDAsMCwwLC41NC41NC45NC45NCwwLDAsMCwuNzYsMCwuOS45LDAsMCwwLC41NC0uNTRBMSwxLDAsMCwwLDEzLDE2YTEsMSwwLDAsMC0uMjktLjcxQTEsMSwwLDAsMCwxMS4yOSwxNS4yOVpNMTIsMkExMCwxMCwwLDEsMCwyMiwxMiwxMCwxMCwwLDAsMCwxMiwyWm0wLDE4YTgsOCwwLDEsMSw4LThBOCw4LDAsMCwxLDEyLDIwWk0xMiw3QTMsMywwLDAsMCw5LjQsOC41YTEsMSwwLDEsMCwxLjczLDFBMSwxLDAsMCwxLDEyLDlhMSwxLDAsMCwxLDAsMiwxLDEsMCwwLDAtMSwxdjFhMSwxLDAsMCwwLDIsMHYtLjE4QTMsMywwLDAsMCwxMiw3WiI+PC9wYXRoPjwvc3ZnPgo=';\nconst blankPixel =\n 'data:image/svg+xml;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9awAAAABJRU5ErkJggg==';\nlet photoLoad: number[] = []; // TODO find a better way to manage this, used to track image load\n\n/**\n * Map layer configuration for circle overlay\n */\nexport const photosLayer: MapLayerRegistryItem<PhotoConfig> = {\n id: PHOTOS_LAYER_ID,\n name: 'Photos',\n description: 'Render photos at each data point',\n isBaseMap: false,\n showLocation: true,\n hideOpacity: true,\n state: PluginState.beta,\n\n /**\n * Function that configures transformation and returns a transformer\n * @param map\n * @param options\n * @param theme\n */\n create: async (map: Map, options: MapLayerOptions<PhotoConfig>, eventBus: EventBus, theme: GrafanaTheme2) => {\n // Assert default values\n const config = {\n ...defaultOptions,\n ...options?.config,\n };\n\n const location = await getLocationMatchers(options.location);\n const source = new FrameVectorSource(location);\n const vectorLayer = new VectorLayer({\n source,\n });\n\n let images: string[] = [];\n\n vectorLayer.setStyle((feature: FeatureLike) => {\n let src = unknownImage;\n let idx = Infinity;\n if (images.length > 0) {\n idx = feature.get('rowIndex');\n src = images[idx] ?? unknownImage;\n }\n const photoStyle = new Style({\n image: new Photo({\n src,\n radius: config.radius,\n crop: config.crop,\n kind: config.kind,\n shadow: false,\n stroke: new Stroke({\n width: 0,\n color: 'rgba(0,0,0,0)',\n }),\n onload: () => {\n vectorLayer.changed(); // ensure vector layer is rendered properly after image load\n if (photoLoad && !photoLoad.includes(idx)) {\n photoLoad.push(idx);\n }\n },\n }),\n });\n const blankStyle = new Style({\n image: new Photo({\n src: blankPixel,\n radius: config.radius,\n crop: false,\n kind: config.kind,\n shadow: config.shadow,\n stroke: new Stroke({\n width: config.border ?? 0,\n color: theme.visualization.getColorByName(config.color),\n }),\n onload: () => {\n vectorLayer.changed(); // ensure vector layer is rendered properly after image load\n },\n }),\n });\n const errorStyle = new Style({\n image: new Photo({\n src: unknownImage,\n radius: config.radius,\n crop: false,\n kind: config.kind,\n shadow: false,\n stroke: new Stroke({\n width: 0,\n color: 'rgba(0,0,0,0)',\n }),\n onload: () => {\n vectorLayer.changed(); // ensure vector layer is rendered properly after image load\n },\n }),\n });\n if (photoLoad && photoLoad.includes(idx)) {\n return [blankStyle, photoStyle];\n }\n // If image index is not in the loaded array, return layer stack with error\n return [blankStyle, errorStyle, photoStyle];\n });\n\n return {\n init: () => vectorLayer,\n update: (data: PanelData) => {\n if (!data.series?.length) {\n source.clear();\n return; // ignore empty\n }\n\n for (const frame of data.series) {\n source.update(frame);\n\n // Pick field from config, otherwise use first string field\n if (config.src) {\n const srcField: Field | undefined = findField(frame, config.src);\n if (srcField) {\n images = srcField?.values;\n }\n } else {\n for (let i = 0; i < frame.fields.length; i++) {\n const field = frame.fields[i];\n if (field.type === FieldType.string) {\n images = field.values;\n break;\n }\n }\n }\n break; // Only the first frame for now!\n }\n },\n\n // Marker overlay options\n registerOptionsUI: (builder) => {\n builder\n .addFieldNamePicker({\n path: `config.src`,\n name: 'Image Source field',\n settings: {\n filter: (f: Field) => f.type === FieldType.string,\n noFieldsMessage: 'No string fields found',\n },\n })\n .addRadio({\n path: 'config.kind',\n name: 'Kind',\n settings: {\n options: [\n { label: 'Square', value: 'square' },\n { label: 'Circle', value: 'circle' },\n { label: 'Anchored', value: 'anchored' },\n { label: 'Folio', value: 'folio' },\n ],\n },\n defaultValue: defaultOptions.kind,\n })\n .addBooleanSwitch({\n path: 'config.crop',\n name: 'Crop',\n settings: {},\n defaultValue: defaultOptions.crop,\n })\n .addBooleanSwitch({\n path: 'config.shadow',\n name: 'Shadow',\n settings: {},\n defaultValue: defaultOptions.shadow,\n })\n .addSliderInput({\n path: 'config.border',\n name: 'Border',\n settings: {\n min: 0,\n max: 10,\n },\n defaultValue: defaultOptions.border,\n })\n .addColorPicker({\n path: 'config.color',\n name: 'Border color',\n defaultValue: defaultOptions.color,\n settings: [{ enableNamedColors: false }],\n })\n .addSliderInput({\n path: 'config.radius',\n name: 'Radius',\n settings: {\n min: 1,\n max: 100,\n },\n defaultValue: defaultOptions.radius,\n });\n },\n };\n },\n\n // fill in the default values\n defaultOptions,\n};\n","import { isNumber } from 'lodash';\nimport Feature, { FeatureLike } from 'ol/Feature';\nimport Map from 'ol/Map';\nimport { LineString, Point, SimpleGeometry } from 'ol/geom';\nimport { Group as LayerGroup } from 'ol/layer';\nimport VectorLayer from 'ol/layer/Vector';\nimport VectorSource from 'ol/source/Vector';\nimport { Fill, Stroke, Style, Circle } from 'ol/style';\nimport FlowLine from 'ol-ext/style/FlowLine';\nimport { Subscription, throttleTime } from 'rxjs';\nimport tinycolor from 'tinycolor2';\n\nimport {\n MapLayerRegistryItem,\n PanelData,\n GrafanaTheme2,\n PluginState,\n EventBus,\n DataHoverEvent,\n DataHoverClearEvent,\n DataFrame,\n FieldType,\n} from '@grafana/data';\nimport { alpha } from '@grafana/data/src/themes/colorManipulator';\nimport { MapLayerOptions, FrameGeometrySourceMode } from '@grafana/schema';\nimport { FrameVectorSource } from 'app/features/geo/utils/frameVectorSource';\nimport { getGeometryField, getLocationMatchers } from 'app/features/geo/utils/location';\n\nimport { StyleEditor } from '../../editor/StyleEditor';\nimport { routeStyle } from '../../style/markers';\nimport { defaultStyleConfig, StyleConfig } from '../../style/types';\nimport { getStyleConfigState } from '../../style/utils';\nimport { getStyleDimension, isSegmentVisible } from '../../utils/utils';\n\n// Configuration options for Circle overlays\nexport interface RouteConfig {\n style: StyleConfig;\n arrow?: 0 | 1 | -1;\n}\n\nconst defaultOptions: RouteConfig = {\n style: {\n ...defaultStyleConfig,\n opacity: 1,\n lineWidth: 2,\n },\n arrow: 0,\n};\n\nexport const ROUTE_LAYER_ID = 'route';\n\n// Used by default when nothing is configured\nexport const defaultRouteConfig: MapLayerOptions<RouteConfig> = {\n type: ROUTE_LAYER_ID,\n name: '', // will get replaced\n config: defaultOptions,\n location: {\n mode: FrameGeometrySourceMode.Auto,\n },\n tooltip: false,\n};\n\nenum mapIndex {\n x1 = 0,\n y1 = 1,\n x2 = 2,\n y2 = 3,\n}\n\nconst crosshairColor = '#607D8B';\n\n/**\n * Map layer configuration for circle overlay\n */\nexport const routeLayer: MapLayerRegistryItem<RouteConfig> = {\n id: ROUTE_LAYER_ID,\n name: 'Route',\n description: 'Render data points as a route',\n isBaseMap: false,\n showLocation: true,\n state: PluginState.beta,\n\n /**\n * Function that configures transformation and returns a transformer\n * @param options\n */\n create: async (map: Map, options: MapLayerOptions<RouteConfig>, eventBus: EventBus, theme: GrafanaTheme2) => {\n // Assert default values\n const config = {\n ...defaultOptions,\n ...options?.config,\n };\n\n const style = await getStyleConfigState(config.style);\n const location = await getLocationMatchers(options.location);\n const source = new FrameVectorSource(location);\n const vectorLayer = new VectorLayer({ source });\n const hasArrows = config.arrow === 1 || config.arrow === -1;\n\n if (!style.fields && !hasArrows) {\n // Set a global style\n const styleBase = routeStyle(style.base);\n if (style.config.size && style.config.size.fixed) {\n // Applies width to base style if specified\n styleBase.getStroke().setWidth(style.config.size.fixed);\n }\n vectorLayer.setStyle(styleBase);\n } else {\n vectorLayer.setStyle((feature: FeatureLike) => {\n const idx: number = feature.get('rowIndex');\n const dims = style.dims;\n if (!dims || !isNumber(idx)) {\n return routeStyle(style.base);\n }\n\n const styles = [];\n const geom = feature.getGeometry();\n const opacity = style.config.opacity ?? 1;\n if (geom instanceof SimpleGeometry) {\n const coordinates = geom.getCoordinates();\n if (coordinates) {\n let startIndex = 0; // Index start for segment optimization\n const pixelTolerance = 2; // For segment to be visible, it must be > 2 pixels (due to round ends)\n for (let i = 0; i < coordinates.length - 1; i++) {\n const segmentStartCoords = coordinates[startIndex];\n const segmentEndCoords = coordinates[i + 1];\n const color1 = tinycolor(\n theme.visualization.getColorByName((dims.color && dims.color.get(startIndex)) ?? style.base.color)\n )\n .setAlpha(opacity)\n .toString();\n const color2 = tinycolor(\n theme.visualization.getColorByName((dims.color && dims.color.get(i + 1)) ?? style.base.color)\n )\n .setAlpha(opacity)\n .toString();\n\n const arrowSize1 = (dims.size && dims.size.get(startIndex)) ?? style.base.size;\n const arrowSize2 = (dims.size && dims.size.get(i + 1)) ?? style.base.size;\n\n const flowStyle = new FlowLine({\n visible: true,\n lineCap: config.arrow === 0 ? 'round' : 'square',\n color: color1,\n color2: color2,\n width: (dims.size && dims.size.get(startIndex)) ?? style.base.size,\n width2: (dims.size && dims.size.get(i + 1)) ?? style.base.size,\n });\n if (config.arrow) {\n flowStyle.setArrow(config.arrow);\n if (config.arrow > 0) {\n flowStyle.setArrowColor(color2);\n flowStyle.setArrowSize((arrowSize2 ?? 0) * 1.5);\n } else {\n flowStyle.setArrowColor(color1);\n flowStyle.setArrowSize((arrowSize1 ?? 0) * 1.5);\n }\n }\n // Only render segment if change in pixel coordinates is significant enough\n if (isSegmentVisible(map, pixelTolerance, segmentStartCoords, segmentEndCoords)) {\n const LS = new LineString([segmentStartCoords, segmentEndCoords]);\n flowStyle.setGeometry(LS);\n styles.push(flowStyle);\n startIndex = i + 1; // Because a segment was created, move onto the next one\n }\n }\n // If no segments created, render a single point\n if (styles.length === 0) {\n const P = new Point(coordinates[0]);\n const radius = ((dims.size && dims.size.get(0)) ?? style.base.size ?? 10) / 2;\n const color = tinycolor(\n theme.visualization.getColorByName((dims.color && dims.color.get(0)) ?? style.base.color)\n )\n .setAlpha(opacity)\n .toString();\n const ZoomOutCircle = new Style({\n image: new Circle({\n radius: radius,\n fill: new Fill({\n color: color,\n }),\n }),\n });\n ZoomOutCircle.setGeometry(P);\n styles.push(ZoomOutCircle);\n }\n }\n return styles;\n }\n\n const values = { ...style.base };\n\n if (dims.color) {\n values.color = dims.color.get(idx);\n }\n return routeStyle(values);\n });\n }\n\n // Crosshair layer\n const crosshairFeature = new Feature({});\n const hLineFeature = new Feature({});\n const vLineFeature = new Feature({});\n const lineFeatures = [hLineFeature, vLineFeature];\n const crosshairRadius = (style.base.lineWidth || 6) + 3;\n const crosshairStyle = new Style({\n image: new Circle({\n radius: crosshairRadius,\n stroke: new Stroke({\n color: alpha(crosshairColor, 1),\n width: 1,\n }),\n fill: new Fill({ color: alpha(crosshairColor, 0.4) }),\n }),\n });\n const lineStyle = new Style({\n stroke: new Stroke({\n color: crosshairColor,\n width: 1,\n lineDash: [3, 3],\n lineCap: 'square',\n }),\n });\n\n const crosshairLayer = new VectorLayer({\n source: new VectorSource({\n features: [crosshairFeature],\n }),\n style: crosshairStyle,\n });\n\n const linesLayer = new VectorLayer({\n source: new VectorSource({\n features: lineFeatures,\n }),\n style: lineStyle,\n });\n\n const layer = new LayerGroup({\n layers: [vectorLayer, crosshairLayer, linesLayer],\n });\n\n // Crosshair sharing subscriptions\n const subscriptions = new Subscription();\n\n subscriptions.add(\n eventBus\n .getStream(DataHoverEvent)\n .pipe(throttleTime(8))\n .subscribe({\n next: (event) => {\n const mapExtents = map.getView().calculateExtent(map.getSize());\n const feature = source.getFeatures()[0];\n const frame: DataFrame = feature?.get('frame');\n const time = event.payload?.point?.time;\n if (frame && time) {\n const timeField = frame.fields.find((f) => f.type === FieldType.time);\n if (timeField) {\n const timestamps: number[] = timeField.values;\n const pointIdx = findNearestTimeIndex(timestamps, time);\n if (pointIdx !== null) {\n const out = getGeometryField(frame, location);\n if (out.field) {\n const crosshairPoint: Point = out.field.values[pointIdx] as Point;\n const crosshairPointCoords = crosshairPoint.getCoordinates();\n crosshairFeature.setGeometry(crosshairPoint);\n crosshairFeature.setStyle(crosshairStyle);\n hLineFeature.setGeometry(\n new LineString([\n [mapExtents[mapIndex.x1], crosshairPointCoords[mapIndex.y1]],\n [mapExtents[mapIndex.x2], crosshairPointCoords[mapIndex.y1]],\n ])\n );\n vLineFeature.setGeometry(\n new LineString([\n [crosshairPointCoords[mapIndex.x1], mapExtents[mapIndex.y1]],\n [crosshairPointCoords[mapIndex.x1], mapExtents[mapIndex.y2]],\n ])\n );\n lineFeatures.forEach((feature) => feature.setStyle(lineStyle));\n }\n }\n }\n }\n },\n })\n );\n\n subscriptions.add(\n eventBus.subscribe(DataHoverClearEvent, (event) => {\n crosshairFeature.setStyle(new Style({}));\n lineFeatures.forEach((feature) => feature.setStyle(new Style({})));\n })\n );\n\n return {\n init: () => layer,\n dispose: () => subscriptions.unsubscribe(),\n update: (data: PanelData) => {\n if (!data.series?.length) {\n return; // ignore empty\n }\n\n for (const frame of data.series) {\n if (style.fields || hasArrows) {\n style.dims = getStyleDimension(frame, style, theme);\n }\n\n source.updateLineString(frame);\n break; // Only the first frame for now!\n }\n },\n\n // Route layer options\n registerOptionsUI: (builder) => {\n builder\n .addCustomEditor({\n id: 'config.style',\n path: 'config.style',\n name: 'Style',\n editor: StyleEditor,\n settings: {\n simpleFixedValues: false,\n },\n defaultValue: defaultOptions.style,\n })\n .addRadio({\n path: 'config.arrow',\n name: 'Arrow',\n settings: {\n options: [\n { label: 'None', value: 0 },\n { label: 'Forward', value: 1 },\n { label: 'Reverse', value: -1 },\n ],\n },\n defaultValue: defaultOptions.arrow,\n });\n },\n };\n },\n\n // fill in the default values\n defaultOptions,\n};\n\nfunction findNearestTimeIndex(timestamps: number[], time: number): number | null {\n if (timestamps.length === 0) {\n return null;\n } else if (timestamps.length === 1) {\n return 0;\n }\n const lastIdx = timestamps.length - 1;\n if (time < timestamps[0]) {\n return 0;\n } else if (time > timestamps[lastIdx]) {\n return lastIdx;\n }\n\n const probableIdx = Math.abs(Math.round((lastIdx * (time - timestamps[0])) / (timestamps[lastIdx] - timestamps[0])));\n if (time < timestamps[probableIdx]) {\n for (let i = probableIdx; i > 0; i--) {\n if (time > timestamps[i]) {\n return i < lastIdx ? i + 1 : lastIdx;\n }\n }\n return 0;\n } else {\n for (let i = probableIdx; i < lastIdx; i++) {\n if (time < timestamps[i]) {\n return i > 0 ? i - 1 : 0;\n }\n }\n return lastIdx;\n }\n}\n","import { dayNightLayer } from './dayNightLayer';\nimport { dynamicGeoJSONLayer } from './geojsonDynamic';\nimport { geojsonLayer } from './geojsonLayer';\nimport { heatmapLayer } from './heatMap';\nimport { lastPointTracker } from './lastPointTracker';\nimport { markersLayer } from './markersLayer';\nimport { networkLayer } from './networkLayer';\nimport { photosLayer } from './photosLayer';\nimport { routeLayer } from './routeLayer';\n\n/**\n * Registry for layer handlers\n */\nexport const dataLayers = [\n markersLayer,\n heatmapLayer,\n lastPointTracker,\n geojsonLayer,\n dynamicGeoJSONLayer,\n dayNightLayer,\n routeLayer,\n photosLayer,\n networkLayer,\n];\n","import { Map as OpenLayersMap } from 'ol';\n\nimport {\n MapLayerRegistryItem,\n Registry,\n MapLayerOptions,\n GrafanaTheme2,\n EventBus,\n SelectableValue,\n PluginState,\n} from '@grafana/data';\nimport { config, hasAlphaPanels } from 'app/core/config';\n\nimport { basemapLayers } from './basemaps';\nimport { carto } from './basemaps/carto';\nimport { dataLayers } from './data';\n\nexport const DEFAULT_BASEMAP_CONFIG: MapLayerOptions = {\n type: 'default',\n name: '', // will get filled in with a non-empty name\n config: {},\n};\n\n// Default base layer depending on the server setting\nexport const defaultBaseLayer: MapLayerRegistryItem = {\n id: DEFAULT_BASEMAP_CONFIG.type,\n name: 'Default base layer',\n isBaseMap: true,\n\n create: (map: OpenLayersMap, options: MapLayerOptions, eventBus: EventBus, theme: GrafanaTheme2) => {\n const serverLayerType = config?.geomapDefaultBaseLayerConfig?.type;\n if (serverLayerType) {\n const layer = geomapLayerRegistry.getIfExists(serverLayerType);\n if (!layer) {\n throw new Error('Invalid basemap configuration on server');\n }\n return layer.create(map, config.geomapDefaultBaseLayerConfig!, eventBus, theme);\n }\n\n // For now use carto as our default basemap\n return carto.create(map, options, eventBus, theme);\n },\n};\n\n/**\n * Registry for layer handlers\n */\nexport const geomapLayerRegistry = new Registry<MapLayerRegistryItem<any>>(() => [\n defaultBaseLayer,\n ...basemapLayers, // simple basemaps\n ...dataLayers, // Layers with update functions\n]);\n\ninterface RegistrySelectInfo {\n options: Array<SelectableValue<string>>;\n current: Array<SelectableValue<string>>;\n}\n\nfunction getLayersSelection(items: Array<MapLayerRegistryItem<any>>, current?: string): RegistrySelectInfo {\n const registry: RegistrySelectInfo = { options: [], current: [] };\n const alpha: Array<SelectableValue<string>> = [];\n\n for (const layer of items) {\n const option: SelectableValue<string> = { label: layer.name, value: layer.id, description: layer.description };\n\n switch (layer.state) {\n case PluginState.alpha:\n if (!hasAlphaPanels) {\n break;\n }\n option.label = `${layer.name} (Alpha)`;\n option.icon = 'bolt';\n alpha.push(option);\n break;\n case PluginState.beta:\n option.label = `${layer.name} (Beta)`;\n default:\n registry.options.push(option);\n }\n\n if (layer.id === current) {\n registry.current.push(option);\n }\n }\n\n // Position alpha layers at the end of the layers list\n for (const layer of alpha) {\n registry.options.push(layer);\n }\n\n return registry;\n}\n\nexport function getLayersOptions(basemap: boolean, current?: string): RegistrySelectInfo {\n if (basemap) {\n return getLayersSelection([defaultBaseLayer, ...basemapLayers], current);\n }\n\n return getLayersSelection([...dataLayers, ...basemapLayers], current);\n}\n","// Code generated - EDITING IS FUTILE. DO NOT EDIT.\n//\n// Generated by:\n// public/app/plugins/gen.go\n// Using jennies:\n// TSTypesJenny\n// PluginTSTypesJenny\n//\n// Run 'make gen-cue' from repository root to regenerate.\n\nimport * as ui from '@grafana/schema';\n\nexport interface Options {\n basemap: ui.MapLayerOptions;\n controls: ControlsOptions;\n layers: Array<ui.MapLayerOptions>;\n tooltip: TooltipOptions;\n view: MapViewConfig;\n}\n\nexport const defaultOptions: Partial<Options> = {\n layers: [],\n};\n\nexport interface MapViewConfig {\n allLayers?: boolean;\n id: string;\n lastOnly?: boolean;\n lat?: number;\n layer?: string;\n lon?: number;\n maxZoom?: number;\n minZoom?: number;\n padding?: number;\n shared?: boolean;\n zoom?: number;\n}\n\nexport const defaultMapViewConfig: Partial<MapViewConfig> = {\n allLayers: true,\n id: 'zero',\n lat: 0,\n lon: 0,\n zoom: 1,\n};\n\nexport interface ControlsOptions {\n /**\n * let the mouse wheel zoom\n */\n mouseWheelZoom?: boolean;\n /**\n * Lower right\n */\n showAttribution?: boolean;\n /**\n * Show debug\n */\n showDebug?: boolean;\n /**\n * Show measure\n */\n showMeasure?: boolean;\n /**\n * Scale options\n */\n showScale?: boolean;\n /**\n * Zoom (upper left)\n */\n showZoom?: boolean;\n}\n\nexport interface TooltipOptions {\n mode: TooltipMode;\n}\n\nexport enum TooltipMode {\n Details = 'details',\n None = 'none',\n}\n\nexport enum MapCenterID {\n Coords = 'coords',\n Fit = 'fit',\n Zero = 'zero',\n}\n","import { Map as OpenLayersMap } from 'ol';\nimport { FeatureLike } from 'ol/Feature';\nimport { Subject } from 'rxjs';\n\nimport { getFrameMatchers, MapLayerHandler, MapLayerOptions, PanelData, textUtil } from '@grafana/data';\nimport { config } from '@grafana/runtime/src';\n\nimport { GeomapPanel } from '../GeomapPanel';\nimport { MARKERS_LAYER_ID } from '../layers/data/markersLayer';\nimport { DEFAULT_BASEMAP_CONFIG, geomapLayerRegistry } from '../layers/registry';\nimport { MapLayerState } from '../types';\n\nimport { getNextLayerName } from './utils';\n\nexport const applyLayerFilter = (\n handler: MapLayerHandler<unknown>,\n options: MapLayerOptions<unknown>,\n panelDataProps: PanelData\n): void => {\n if (handler.update) {\n let panelData = panelDataProps;\n if (options.filterData) {\n const matcherFunc = getFrameMatchers(options.filterData);\n panelData = {\n ...panelData,\n series: panelData.series.filter(matcherFunc),\n };\n }\n handler.update(panelData);\n }\n};\n\nexport async function updateLayer(panel: GeomapPanel, uid: string, newOptions: MapLayerOptions): Promise<boolean> {\n if (!panel.map) {\n return false;\n }\n const current = panel.byName.get(uid);\n if (!current) {\n return false;\n }\n\n let layerIndex = -1;\n const group = panel.map?.getLayers()!;\n for (let i = 0; i < group?.getLength(); i++) {\n if (group.item(i) === current.layer) {\n layerIndex = i;\n break;\n }\n }\n\n // Special handling for rename\n if (newOptions.name !== uid) {\n if (!newOptions.name) {\n newOptions.name = uid;\n } else if (panel.byName.has(newOptions.name)) {\n return false;\n }\n panel.byName.delete(uid);\n\n uid = newOptions.name;\n panel.byName.set(uid, current);\n }\n\n // Type changed -- requires full re-initalization\n if (current.options.type !== newOptions.type) {\n // full init\n } else {\n // just update options\n }\n\n const layers = panel.layers.slice(0);\n try {\n const info = await initLayer(panel, panel.map, newOptions, current.isBasemap);\n layers[layerIndex]?.handler.dispose?.();\n layers[layerIndex] = info;\n group.setAt(layerIndex, info.layer);\n\n // initialize with new data\n applyLayerFilter(info.handler, newOptions, panel.props.data);\n } catch (err) {\n console.warn('ERROR', err); // eslint-disable-line no-console\n return false;\n }\n\n // Just to trigger a state update\n panel.setState({ legends: [] });\n\n panel.layers = layers;\n panel.doOptionsUpdate(layerIndex);\n return true;\n}\n\nexport async function initLayer(\n panel: GeomapPanel,\n map: OpenLayersMap,\n options: MapLayerOptions,\n isBasemap?: boolean\n): Promise<MapLayerState> {\n if (isBasemap && (!options?.type || config.geomapDisableCustomBaseLayer)) {\n options = DEFAULT_BASEMAP_CONFIG;\n }\n\n // Use default makers layer\n if (!options?.type) {\n options = {\n type: MARKERS_LAYER_ID,\n name: getNextLayerName(panel),\n config: {},\n };\n }\n\n const item = geomapLayerRegistry.getIfExists(options.type);\n if (!item) {\n return Promise.reject('unknown layer: ' + options.type);\n }\n\n if (options.config?.attribution) {\n options.config.attribution = textUtil.sanitizeTextPanelContent(options.config.attribution);\n }\n\n const handler = await item.create(map, options, panel.props.eventBus, config.theme2);\n const layer = handler.init(); // eslint-disable-line\n if (options.opacity != null) {\n layer.setOpacity(options.opacity);\n }\n\n if (!options.name) {\n options.name = getNextLayerName(panel);\n }\n\n const UID = options.name;\n const state: MapLayerState<unknown> = {\n // UID, // unique name when added to the map (it may change and will need special handling)\n isBasemap,\n options,\n layer,\n handler,\n mouseEvents: new Subject<FeatureLike | undefined>(),\n\n getName: () => UID,\n\n // Used by the editors\n onChange: (cfg: MapLayerOptions) => {\n updateLayer(panel, UID, cfg);\n },\n };\n\n panel.byName.set(UID, state);\n // eslint-disable-next-line\n (state.layer as any).__state = state;\n\n applyLayerFilter(handler, options, panel.props.data);\n\n return state;\n}\n\nexport const getMapLayerState = (l: any): MapLayerState => {\n return l?.__state;\n};\n","import { cloneDeep } from 'lodash';\n\nimport { FrameGeometrySourceMode } from '@grafana/schema';\n\nimport { GeomapPanel } from '../GeomapPanel';\nimport { geomapLayerRegistry } from '../layers/registry';\nimport { defaultStyleConfig } from '../style/types';\nimport { GeomapLayerActions, MapLayerState } from '../types';\n\nimport { initLayer } from './layers';\nimport { getNextLayerName } from './utils';\n\nexport const getActions = (panel: GeomapPanel) => {\n const actions: GeomapLayerActions = {\n selectLayer: (uid: string) => {\n const selected = panel.layers.findIndex((v) => v.options.name === uid);\n if (panel.panelContext && panel.panelContext.onInstanceStateChange) {\n panel.panelContext.onInstanceStateChange({\n map: panel.map,\n layers: panel.layers,\n selected,\n actions: panel.actions,\n });\n }\n },\n canRename: (v: string) => {\n return !panel.byName.has(v);\n },\n deleteLayer: (uid: string) => {\n const layers: MapLayerState[] = [];\n for (const lyr of panel.layers) {\n if (lyr.options.name === uid) {\n panel.map?.removeLayer(lyr.layer);\n } else {\n layers.push(lyr);\n }\n }\n panel.layers = layers;\n panel.doOptionsUpdate(0);\n },\n addlayer: (type: string) => {\n const item = geomapLayerRegistry.getIfExists(type);\n if (!item) {\n return; // ignore empty request\n }\n initLayer(\n panel,\n panel.map!,\n {\n type: item.id,\n name: getNextLayerName(panel),\n config: cloneDeep(item.defaultOptions),\n location: item.showLocation ? { mode: FrameGeometrySourceMode.Auto } : undefined,\n tooltip: true,\n ...(!item.hideOpacity && { opacity: defaultStyleConfig.opacity }),\n },\n false\n ).then((lyr) => {\n panel.layers = panel.layers.slice(0);\n panel.layers.push(lyr);\n panel.map?.addLayer(lyr.layer);\n\n panel.doOptionsUpdate(panel.layers.length - 1);\n });\n },\n reorder: (startIndex: number, endIndex: number) => {\n const result = Array.from(panel.layers);\n const [removed] = result.splice(startIndex, 1);\n result.splice(endIndex, 0, removed);\n panel.layers = result;\n\n panel.doOptionsUpdate(endIndex);\n\n // Add the layers in the right order\n const group = panel.map?.getLayers()!;\n group.clear();\n panel.layers.forEach((v) => group.push(v.layer));\n },\n };\n\n return actions;\n};\n","import { createEmpty, extend, Extent } from 'ol/extent';\nimport LayerGroup from 'ol/layer/Group';\nimport VectorLayer from 'ol/layer/Vector';\n\nimport { MapLayerState } from '../types';\n\nexport function getLayersExtent(\n layers: MapLayerState[] = [],\n allLayers = false,\n lastOnly = false,\n layer: string | undefined\n): Extent {\n return layers\n .filter((l) => l.layer instanceof VectorLayer || l.layer instanceof LayerGroup)\n .flatMap((ll) => {\n const l = ll.layer;\n if (l instanceof LayerGroup) {\n return getLayerGroupExtent(l);\n } else if (l instanceof VectorLayer) {\n if (allLayers) {\n // Return everything from all layers\n return [l.getSource().getExtent()] ?? [];\n } else if (lastOnly && layer === ll.options.name) {\n // Return last only for selected layer\n const feat = l.getSource().getFeatures();\n const featOfInterest = feat[feat.length - 1];\n const geo = featOfInterest?.getGeometry();\n if (geo) {\n return [geo.getExtent()] ?? [];\n }\n return [];\n } else if (!lastOnly && layer === ll.options.name) {\n // Return all points for selected layer\n return [l.getSource().getExtent()] ?? [];\n }\n return [];\n } else {\n return [];\n }\n })\n .reduce(extend, createEmpty());\n}\n\nexport function getLayerGroupExtent(lg: LayerGroup) {\n return lg\n .getLayers()\n .getArray()\n .filter((l) => l instanceof VectorLayer)\n .map((l) => {\n if (l instanceof VectorLayer) {\n return l.getSource().getExtent() ?? [];\n } else {\n return [];\n }\n });\n}\n","import { debounce } from 'lodash';\nimport { MapBrowserEvent } from 'ol';\nimport { toLonLat } from 'ol/proj';\n\nimport { DataFrame, DataHoverClearEvent } from '@grafana/data/src';\n\nimport { GeomapPanel } from '../GeomapPanel';\nimport { GeomapHoverPayload, GeomapLayerHover } from '../event';\nimport { MapLayerState } from '../types';\n\nimport { getMapLayerState } from './layers';\n\nexport const setTooltipListeners = (panel: GeomapPanel) => {\n // Tooltip listener\n panel.map?.on('singleclick', panel.pointerClickListener);\n panel.map?.on('pointermove', debounce(panel.pointerMoveListener, 200));\n panel.map?.getViewport().addEventListener('mouseout', (evt: MouseEvent) => {\n panel.props.eventBus.publish(new DataHoverClearEvent());\n });\n};\n\nexport const pointerClickListener = (evt: MapBrowserEvent<MouseEvent>, panel: GeomapPanel) => {\n if (pointerMoveListener(evt, panel)) {\n evt.preventDefault();\n evt.stopPropagation();\n panel.mapDiv!.style.cursor = 'auto';\n panel.setState({ ttipOpen: true });\n }\n};\n\nexport const pointerMoveListener = (evt: MapBrowserEvent<MouseEvent>, panel: GeomapPanel) => {\n // If measure menu is open, bypass tooltip logic and display measuring mouse events\n if (panel.state.measureMenuActive) {\n return true;\n }\n\n // Eject out of this function if map is not loaded or valid tooltip is already open\n if (!panel.map || (panel.state.ttipOpen && panel.state?.ttip?.layers?.length)) {\n return false;\n }\n\n const mouse = evt.originalEvent;\n const pixel = panel.map.getEventPixel(mouse);\n const hover = toLonLat(panel.map.getCoordinateFromPixel(pixel));\n\n const { hoverPayload } = panel;\n hoverPayload.pageX = mouse.pageX;\n hoverPayload.pageY = mouse.pageY;\n hoverPayload.point = {\n lat: hover[1],\n lon: hover[0],\n };\n hoverPayload.data = undefined;\n hoverPayload.columnIndex = undefined;\n hoverPayload.rowIndex = undefined;\n hoverPayload.layers = undefined;\n\n const layers: GeomapLayerHover[] = [];\n const layerLookup = new Map<MapLayerState, GeomapLayerHover>();\n\n let ttip: GeomapHoverPayload = {} as GeomapHoverPayload;\n panel.map.forEachFeatureAtPixel(\n pixel,\n (feature, layer, geo) => {\n const s = getMapLayerState(layer);\n //match hover layer to layer in layers\n //check if the layer show tooltip is enabled\n //then also pass the list of tooltip fields if exists\n //this is used as the generic hover event\n if (!hoverPayload.data) {\n const props = feature.getProperties();\n const frame: DataFrame = props['frame'];\n if (frame) {\n hoverPayload.data = ttip.data = frame;\n hoverPayload.rowIndex = ttip.rowIndex = props['rowIndex'];\n }\n\n if (s?.mouseEvents) {\n s.mouseEvents.next(feature);\n }\n }\n\n if (s) {\n let h = layerLookup.get(s);\n if (!h) {\n h = { layer: s, features: [] };\n layerLookup.set(s, h);\n layers.push(h);\n }\n h.features.push(feature);\n }\n },\n {\n layerFilter: (l) => {\n const hoverLayerState = getMapLayerState(l);\n return hoverLayerState?.options?.tooltip !== false;\n },\n }\n );\n panel.hoverPayload.layers = layers.length ? layers : undefined;\n panel.props.eventBus.publish(panel.hoverEvent);\n\n // This check optimizes Geomap panel re-render behavior (without it, Geomap renders on every mouse move event)\n if (panel.state.ttip === undefined || panel.state.ttip?.layers !== hoverPayload.layers || hoverPayload.layers) {\n panel.setState({ ttip: { ...hoverPayload } });\n }\n\n if (!layers.length) {\n // clear mouse events\n panel.layers.forEach((layer) => {\n layer.mouseEvents.next(undefined);\n });\n }\n\n const found = Boolean(layers.length);\n panel.mapDiv!.style.cursor = found ? 'pointer' : 'auto';\n return found;\n};\n","import { Registry, RegistryItem } from '@grafana/data';\n\ninterface MapCenterItems extends RegistryItem {\n lat?: number;\n lon?: number;\n zoom?: number;\n}\n\nexport enum MapCenterID {\n Zero = 'zero',\n Coordinates = 'coords',\n Fit = 'fit',\n}\n\nexport const centerPointRegistry = new Registry<MapCenterItems>(() => [\n {\n id: MapCenterID.Fit,\n name: 'Fit to data',\n zoom: 15, // max zoom\n },\n {\n id: MapCenterID.Zero,\n name: '(0°, 0°)',\n lat: 0,\n lon: 0,\n },\n {\n id: MapCenterID.Coordinates,\n name: 'Coordinates',\n },\n {\n id: 'north-america',\n name: 'North America',\n lat: 40,\n lon: -100,\n zoom: 4,\n },\n {\n id: 'south-america',\n name: 'South America',\n lat: -20,\n lon: -60,\n zoom: 3,\n },\n {\n id: 'europe',\n name: 'Europe',\n lat: 46,\n lon: 14,\n zoom: 4,\n },\n {\n id: 'africa',\n name: 'Africa',\n lat: 0,\n lon: 30,\n zoom: 3,\n },\n {\n id: 'west-asia',\n name: 'West Asia',\n lat: 26,\n lon: 53,\n zoom: 4,\n },\n {\n id: 's-asia',\n name: 'South Asia',\n lat: 19.5,\n lon: 80,\n zoom: 4,\n },\n {\n id: 'se-asia',\n name: 'South-East Asia',\n lat: 10,\n lon: 106,\n zoom: 4,\n },\n {\n id: 'e-asia',\n name: 'East Asia',\n lat: 33,\n lon: 120,\n zoom: 4,\n },\n {\n id: 'australia',\n name: 'Australia',\n lat: -25,\n lon: 135,\n zoom: 4,\n },\n {\n id: 'oceania',\n name: 'Oceania',\n lat: -10,\n lon: -140,\n zoom: 3,\n },\n]);\n","import { css } from '@emotion/css';\nimport { Global } from '@emotion/react';\nimport { Map as OpenLayersMap, MapBrowserEvent, View } from 'ol';\nimport Attribution from 'ol/control/Attribution';\nimport ScaleLine from 'ol/control/ScaleLine';\nimport Zoom from 'ol/control/Zoom';\nimport { Coordinate } from 'ol/coordinate';\nimport { isEmpty } from 'ol/extent';\nimport MouseWheelZoom from 'ol/interaction/MouseWheelZoom';\nimport { fromLonLat } from 'ol/proj';\nimport React, { Component, ReactNode } from 'react';\nimport { Subscription } from 'rxjs';\n\nimport { DataHoverEvent, PanelData, PanelProps } from '@grafana/data';\nimport { config } from '@grafana/runtime';\nimport { PanelContext, PanelContextRoot } from '@grafana/ui';\nimport { PanelEditExitedEvent } from 'app/types/events';\n\nimport { GeomapOverlay, OverlayProps } from './GeomapOverlay';\nimport { GeomapTooltip } from './GeomapTooltip';\nimport { DebugOverlay } from './components/DebugOverlay';\nimport { MeasureOverlay } from './components/MeasureOverlay';\nimport { MeasureVectorLayer } from './components/MeasureVectorLayer';\nimport { GeomapHoverPayload } from './event';\nimport { getGlobalStyles } from './globalStyles';\nimport { defaultMarkersConfig } from './layers/data/markersLayer';\nimport { DEFAULT_BASEMAP_CONFIG } from './layers/registry';\nimport { ControlsOptions, Options, MapLayerState, MapViewConfig, TooltipMode } from './types';\nimport { getActions } from './utils/actions';\nimport { getLayersExtent } from './utils/getLayersExtent';\nimport { applyLayerFilter, initLayer } from './utils/layers';\nimport { pointerClickListener, pointerMoveListener, setTooltipListeners } from './utils/tooltip';\nimport { updateMap, getNewOpenLayersMap, notifyPanelEditor } from './utils/utils';\nimport { centerPointRegistry, MapCenterID } from './view';\n\n// Allows multiple panels to share the same view instance\nlet sharedView: View | undefined = undefined;\n\ntype Props = PanelProps<Options>;\ninterface State extends OverlayProps {\n ttip?: GeomapHoverPayload;\n ttipOpen: boolean;\n legends: ReactNode[];\n measureMenuActive?: boolean;\n}\n\nexport class GeomapPanel extends Component<Props, State> {\n declare context: React.ContextType<typeof PanelContextRoot>;\n static contextType = PanelContextRoot;\n panelContext: PanelContext | undefined = undefined;\n private subs = new Subscription();\n\n globalCSS = getGlobalStyles(config.theme2);\n\n mouseWheelZoom?: MouseWheelZoom;\n hoverPayload: GeomapHoverPayload = { point: {}, pageX: -1, pageY: -1 };\n readonly hoverEvent = new DataHoverEvent(this.hoverPayload);\n\n map?: OpenLayersMap;\n mapDiv?: HTMLDivElement;\n layers: MapLayerState[] = [];\n readonly byName = new Map<string, MapLayerState>();\n\n constructor(props: Props) {\n super(props);\n this.state = { ttipOpen: false, legends: [] };\n this.subs.add(\n this.props.eventBus.subscribe(PanelEditExitedEvent, (evt) => {\n if (this.mapDiv && this.props.id === evt.payload) {\n this.initMapRef(this.mapDiv);\n }\n })\n );\n }\n\n componentDidMount() {\n this.panelContext = this.context;\n }\n\n componentWillUnmount() {\n this.subs.unsubscribe();\n for (const lyr of this.layers) {\n lyr.handler.dispose?.();\n }\n // Ensure map is disposed\n this.map?.dispose();\n }\n\n shouldComponentUpdate(nextProps: Props) {\n if (!this.map) {\n return true; // not yet initialized\n }\n\n // Check for resize\n if (this.props.height !== nextProps.height || this.props.width !== nextProps.width) {\n this.map.updateSize();\n }\n\n // External data changed\n if (this.props.data !== nextProps.data) {\n this.dataChanged(nextProps.data);\n }\n\n // Options changed\n if (this.props.options !== nextProps.options) {\n this.optionsChanged(nextProps.options);\n }\n\n return true; // always?\n }\n\n componentDidUpdate(prevProps: Props) {\n if (this.map && (this.props.height !== prevProps.height || this.props.width !== prevProps.width)) {\n this.map.updateSize();\n }\n // Check for a difference between previous data and component data\n if (this.map && this.props.data !== prevProps.data) {\n this.dataChanged(this.props.data);\n }\n }\n\n /** This function will actually update the JSON model */\n doOptionsUpdate(selected: number) {\n const { options, onOptionsChange } = this.props;\n const layers = this.layers;\n this.map?.getLayers().forEach((l) => {\n if (l instanceof MeasureVectorLayer) {\n this.map?.removeLayer(l);\n this.map?.addLayer(l);\n }\n });\n onOptionsChange({\n ...options,\n basemap: layers[0].options,\n layers: layers.slice(1).map((v) => v.options),\n });\n\n notifyPanelEditor(this, layers, selected);\n this.setState({ legends: this.getLegends() });\n }\n\n actions = getActions(this);\n\n /**\n * Called when the panel options change\n *\n * NOTE: changes to basemap and layers are handled independently\n */\n optionsChanged(options: Options) {\n const oldOptions = this.props.options;\n if (options.view !== oldOptions.view) {\n const view = this.initMapView(options.view);\n\n if (this.map && view) {\n this.map.setView(view);\n }\n }\n\n if (options.controls !== oldOptions.controls) {\n this.initControls(options.controls ?? { showZoom: true, showAttribution: true });\n }\n }\n\n /**\n * Called when PanelData changes (query results etc)\n */\n dataChanged(data: PanelData) {\n // Only update if panel data matches component data\n if (data === this.props.data) {\n for (const state of this.layers) {\n applyLayerFilter(state.handler, state.options, this.props.data);\n }\n }\n\n // Because data changed, check map view and change if needed (data fit)\n const v = centerPointRegistry.getIfExists(this.props.options.view.id);\n if (v && v.id === MapCenterID.Fit) {\n const view = this.initMapView(this.props.options.view);\n\n if (this.map && view) {\n this.map.setView(view);\n }\n }\n }\n\n initMapRef = async (div: HTMLDivElement) => {\n if (!div) {\n // Do not initialize new map or dispose old map\n return;\n }\n this.mapDiv = div;\n if (this.map) {\n this.map.dispose();\n }\n\n const { options } = this.props;\n\n const map = getNewOpenLayersMap(this, options, div);\n\n this.byName.clear();\n const layers: MapLayerState[] = [];\n try {\n layers.push(await initLayer(this, map, options.basemap ?? DEFAULT_BASEMAP_CONFIG, true));\n\n // Default layer values\n if (!options.layers) {\n options.layers = [defaultMarkersConfig];\n }\n\n for (const lyr of options.layers) {\n layers.push(await initLayer(this, map, lyr, false));\n }\n } catch (ex) {\n console.error('error loading layers', ex);\n }\n\n for (const lyr of layers) {\n map.addLayer(lyr.layer);\n }\n this.layers = layers;\n this.map = map; // redundant\n this.initViewExtent(map.getView(), options.view);\n\n this.mouseWheelZoom = new MouseWheelZoom();\n this.map?.addInteraction(this.mouseWheelZoom);\n\n updateMap(this, options);\n setTooltipListeners(this);\n notifyPanelEditor(this, layers, layers.length - 1);\n\n this.setState({ legends: this.getLegends() });\n };\n\n clearTooltip = () => {\n if (this.state.ttip && !this.state.ttipOpen) {\n this.tooltipPopupClosed();\n }\n };\n\n tooltipPopupClosed = () => {\n this.setState({ ttipOpen: false, ttip: undefined });\n };\n\n pointerClickListener = (evt: MapBrowserEvent<MouseEvent>) => {\n pointerClickListener(evt, this);\n };\n\n pointerMoveListener = (evt: MapBrowserEvent<MouseEvent>) => {\n pointerMoveListener(evt, this);\n };\n\n initMapView = (config: MapViewConfig): View | undefined => {\n let view = new View({\n center: [0, 0],\n zoom: 1,\n showFullExtent: true, // allows zooming so the full range is visible\n });\n\n // With shared views, all panels use the same view instance\n if (config.shared) {\n if (!sharedView) {\n sharedView = view;\n } else {\n view = sharedView;\n }\n }\n\n this.initViewExtent(view, config);\n return view;\n };\n\n initViewExtent(view: View, config: MapViewConfig) {\n const v = centerPointRegistry.getIfExists(config.id);\n if (v) {\n let coord: Coordinate | undefined = undefined;\n if (v.lat == null) {\n if (v.id === MapCenterID.Coordinates) {\n coord = [config.lon ?? 0, config.lat ?? 0];\n } else if (v.id === MapCenterID.Fit) {\n const extent = getLayersExtent(this.layers, config.allLayers, config.lastOnly, config.layer);\n if (!isEmpty(extent)) {\n const padding = config.padding ?? 5;\n const res = view.getResolutionForExtent(extent, this.map?.getSize());\n const maxZoom = config.zoom ?? config.maxZoom;\n view.fit(extent, {\n maxZoom: maxZoom,\n });\n view.setResolution(res * (padding / 100 + 1));\n const adjustedZoom = view.getZoom();\n if (adjustedZoom && maxZoom && adjustedZoom > maxZoom) {\n view.setZoom(maxZoom);\n }\n }\n } else {\n // TODO: view requires special handling\n }\n } else {\n coord = [v.lon ?? 0, v.lat ?? 0];\n }\n if (coord) {\n view.setCenter(fromLonLat(coord));\n }\n }\n\n if (config.maxZoom) {\n view.setMaxZoom(config.maxZoom);\n }\n if (config.minZoom) {\n view.setMaxZoom(config.minZoom);\n }\n if (config.zoom && v?.id !== MapCenterID.Fit) {\n view.setZoom(config.zoom);\n }\n }\n\n initControls(options: ControlsOptions) {\n if (!this.map) {\n return;\n }\n this.map.getControls().clear();\n\n if (options.showZoom) {\n this.map.addControl(new Zoom());\n }\n\n if (options.showScale) {\n this.map.addControl(\n new ScaleLine({\n units: options.scaleUnits,\n minWidth: 100,\n })\n );\n }\n\n this.mouseWheelZoom!.setActive(Boolean(options.mouseWheelZoom));\n\n if (options.showAttribution) {\n this.map.addControl(new Attribution({ collapsed: true, collapsible: true }));\n }\n\n // Update the react overlays\n let topRight1: ReactNode[] = [];\n if (options.showMeasure) {\n topRight1 = [\n <MeasureOverlay\n key=\"measure\"\n map={this.map}\n // Lifts menuActive state and resets tooltip state upon close\n menuActiveState={(value: boolean) => {\n this.setState({ ttipOpen: value, measureMenuActive: value });\n }}\n />,\n ];\n }\n\n let topRight2: ReactNode[] = [];\n if (options.showDebug) {\n topRight2 = [<DebugOverlay key=\"debug\" map={this.map} />];\n }\n\n this.setState({ topRight1, topRight2 });\n }\n\n getLegends() {\n const legends: ReactNode[] = [];\n for (const state of this.layers) {\n if (state.handler.legend) {\n legends.push(<div key={state.options.name}>{state.handler.legend}</div>);\n }\n }\n\n return legends;\n }\n\n render() {\n let { ttip, ttipOpen, topRight1, legends, topRight2 } = this.state;\n const { options } = this.props;\n const showScale = options.controls.showScale;\n if (!ttipOpen && options.tooltip?.mode === TooltipMode.None) {\n ttip = undefined;\n }\n\n return (\n <>\n <Global styles={this.globalCSS} />\n <div className={styles.wrap} onMouseLeave={this.clearTooltip}>\n <div className={styles.map} ref={this.initMapRef}></div>\n <GeomapOverlay\n bottomLeft={legends}\n topRight1={topRight1}\n topRight2={topRight2}\n blStyle={{ bottom: showScale ? '35px' : '8px' }}\n />\n </div>\n <GeomapTooltip ttip={ttip} isOpen={ttipOpen} onClose={this.tooltipPopupClosed} />\n </>\n );\n }\n}\n\nconst styles = {\n wrap: css({\n position: 'relative',\n width: '100%',\n height: '100%',\n }),\n map: css({\n position: 'absolute',\n zIndex: 0,\n width: '100%',\n height: '100%',\n }),\n};\n","import { css, cx } from '@emotion/css';\nimport React from 'react';\nimport { DragDropContext, Draggable, Droppable, DropResult } from 'react-beautiful-dnd';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { Icon, IconButton, useStyles2 } from '@grafana/ui';\n\nimport { LayerName } from './LayerName';\nimport { LayerElement } from './types';\n\nexport const DATA_TEST_ID = 'layer-drag-drop-list';\n\nexport type LayerDragDropListProps<T extends LayerElement> = {\n layers: T[];\n getLayerInfo: (element: T) => string;\n onDragEnd: (result: DropResult) => void;\n onSelect: (element: T) => void;\n onDelete: (element: T) => void;\n onDuplicate?: (element: T) => void;\n showActions: (element: T) => boolean;\n selection?: string[]; // list of unique ids (names)\n excludeBaseLayer?: boolean;\n onNameChange: (element: T, newName: string) => void;\n verifyLayerNameUniqueness?: (nameToCheck: string) => boolean;\n};\n\nexport const LayerDragDropList = <T extends LayerElement>({\n layers,\n getLayerInfo,\n onDragEnd,\n onSelect,\n onDelete,\n onDuplicate,\n showActions,\n selection,\n excludeBaseLayer,\n onNameChange,\n verifyLayerNameUniqueness,\n}: LayerDragDropListProps<T>) => {\n const style = useStyles2(getStyles);\n\n const getRowStyle = (isSelected: boolean) => {\n return isSelected ? `${style.row} ${style.sel}` : style.row;\n };\n\n return (\n <DragDropContext onDragEnd={onDragEnd}>\n <Droppable droppableId=\"droppable\">\n {(provided, snapshot) => (\n <div {...provided.droppableProps} ref={provided.innerRef} data-testid={DATA_TEST_ID}>\n {(() => {\n // reverse order\n const rows: JSX.Element[] = [];\n const lastLayerIndex = excludeBaseLayer ? 1 : 0;\n const shouldRenderDragIconLengthThreshold = excludeBaseLayer ? 2 : 1;\n for (let i = layers.length - 1; i >= lastLayerIndex; i--) {\n const element = layers[i];\n const uid = element.getName();\n\n const isSelected = Boolean(selection?.includes(uid));\n rows.push(\n <Draggable key={uid} draggableId={uid} index={rows.length}>\n {(provided, snapshot) => (\n <div\n className={getRowStyle(isSelected)}\n ref={provided.innerRef}\n {...provided.draggableProps}\n {...provided.dragHandleProps}\n onMouseDown={() => onSelect(element)}\n role=\"button\"\n tabIndex={0}\n >\n <LayerName\n name={uid}\n onChange={(v) => onNameChange(element, v)}\n verifyLayerNameUniqueness={verifyLayerNameUniqueness ?? undefined}\n />\n <div className={style.textWrapper}> {getLayerInfo(element)}</div>\n\n {showActions(element) && (\n <>\n {onDuplicate ? (\n <IconButton\n name=\"copy\"\n tooltip=\"Duplicate\"\n className={style.actionIcon}\n onClick={() => onDuplicate(element)}\n />\n ) : null}\n\n <IconButton\n name=\"trash-alt\"\n tooltip=\"Remove\"\n className={cx(style.actionIcon, style.dragIcon)}\n onClick={() => onDelete(element)}\n />\n </>\n )}\n {layers.length > shouldRenderDragIconLengthThreshold && (\n <Icon\n aria-label=\"Drag and drop icon\"\n title=\"Drag and drop to reorder\"\n name=\"draggabledots\"\n size=\"lg\"\n className={style.dragIcon}\n />\n )}\n </div>\n )}\n </Draggable>\n );\n }\n\n return rows;\n })()}\n\n {provided.placeholder}\n </div>\n )}\n </Droppable>\n </DragDropContext>\n );\n};\n\nLayerDragDropList.defaultProps = {\n isGroup: () => false,\n};\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n wrapper: css({\n marginBottom: theme.spacing(2),\n }),\n row: css({\n padding: theme.spacing(0.5, 1),\n borderRadius: theme.shape.radius.default,\n background: theme.colors.background.secondary,\n minHeight: theme.spacing(4),\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n marginBottom: '3px',\n cursor: 'pointer',\n\n border: `1px solid ${theme.components.input.borderColor}`,\n '&:hover': {\n border: `1px solid ${theme.components.input.borderHover}`,\n },\n }),\n sel: css({\n border: `1px solid ${theme.colors.primary.border}`,\n '&:hover': {\n border: `1px solid ${theme.colors.primary.border}`,\n },\n }),\n dragIcon: css({\n cursor: 'drag',\n }),\n actionIcon: css({\n color: theme.colors.text.secondary,\n '&:hover': {\n color: theme.colors.text.primary,\n },\n }),\n typeWrapper: css({\n color: theme.colors.primary.text,\n marginRight: '5px',\n }),\n textWrapper: css({\n display: 'flex',\n alignItems: 'center',\n flexGrow: 1,\n overflow: 'hidden',\n marginRight: theme.spacing(1),\n }),\n});\n","import React from 'react';\nimport { DropResult } from 'react-beautiful-dnd';\n\nimport { StandardEditorProps } from '@grafana/data';\nimport { Container } from '@grafana/ui';\nimport { AddLayerButton } from 'app/core/components/Layers/AddLayerButton';\nimport { LayerDragDropList } from 'app/core/components/Layers/LayerDragDropList';\n\nimport { getLayersOptions } from '../layers/registry';\nimport { Options, MapLayerState, GeomapInstanceState } from '../types';\n\ntype LayersEditorProps = StandardEditorProps<unknown, unknown, Options, GeomapInstanceState>;\n\nexport const LayersEditor = (props: LayersEditorProps) => {\n const { layers, selected, actions } = props.context.instanceState ?? {};\n if (!layers || !actions) {\n return <div>No layers?</div>;\n }\n\n const onDragEnd = (result: DropResult) => {\n if (!result.destination) {\n return;\n }\n\n const { layers, actions } = props.context.instanceState ?? {};\n if (!layers || !actions) {\n return;\n }\n\n // account for the reverse order and offset (0 is baselayer)\n const count = layers.length - 1;\n const src = (result.source.index - count) * -1;\n const dst = (result.destination.index - count) * -1;\n\n actions.reorder(src, dst);\n };\n\n const onSelect = (element: MapLayerState<unknown>) => {\n actions.selectLayer(element.options.name);\n };\n\n const onDelete = (element: MapLayerState<unknown>) => {\n actions.deleteLayer(element.options.name);\n };\n\n const getLayerInfo = (element: MapLayerState<unknown>) => {\n return element.options.type;\n };\n\n const onNameChange = (element: MapLayerState<unknown>, name: string) => {\n element.onChange({ ...element.options, name });\n };\n\n const selection = selected ? [layers[selected]?.getName()] : [];\n\n return (\n <>\n <Container>\n <AddLayerButton\n onChange={(v) => actions.addlayer(v.value!)}\n options={getLayersOptions(false).options}\n label={'Add layer'}\n />\n </Container>\n <br />\n\n <LayerDragDropList\n layers={layers}\n showActions={() => layers.length > 2} // 2 because base layer is not counted!\n getLayerInfo={getLayerInfo}\n onDragEnd={onDragEnd}\n onSelect={onSelect}\n onDelete={onDelete}\n selection={selection}\n excludeBaseLayer\n onNameChange={onNameChange}\n verifyLayerNameUniqueness={actions.canRename}\n />\n </>\n );\n};\n","import React from 'react';\n\nimport { InlineFieldRow, InlineField } from '@grafana/ui';\nimport { NumberInput } from 'app/core/components/OptionsUI/NumberInput';\n\nimport { MapViewConfig } from '../types';\n\ntype Props = {\n labelWidth: number;\n value: MapViewConfig;\n onChange: (value?: MapViewConfig | undefined) => void;\n};\n\nexport const CoordinatesMapViewEditor = ({ labelWidth, value, onChange }: Props) => {\n const onLatitudeChange = (latitude: number | undefined) => {\n onChange({ ...value, lat: latitude });\n };\n\n const onLongitudeChange = (longitude: number | undefined) => {\n onChange({ ...value, lon: longitude });\n };\n\n return (\n <>\n <InlineFieldRow>\n <InlineField label=\"Latitude\" labelWidth={labelWidth} grow={true}>\n <NumberInput value={value.lat} min={-90} max={90} step={0.001} onChange={onLatitudeChange} />\n </InlineField>\n </InlineFieldRow>\n <InlineFieldRow>\n <InlineField label=\"Longitude\" labelWidth={labelWidth} grow={true}>\n <NumberInput value={value.lon} min={-180} max={180} step={0.001} onChange={onLongitudeChange} />\n </InlineField>\n </InlineFieldRow>\n </>\n );\n};\n","import React, { useCallback, useMemo } from 'react';\n\nimport { SelectableValue, StandardEditorContext } from '@grafana/data';\nimport { InlineFieldRow, InlineField, RadioButtonGroup, Select } from '@grafana/ui';\nimport { NumberInput } from 'app/core/components/OptionsUI/NumberInput';\n\nimport { GeomapInstanceState, Options, MapViewConfig } from '../types';\n\ntype Props = {\n labelWidth: number;\n value: MapViewConfig;\n onChange: (value?: MapViewConfig | undefined) => void;\n context: StandardEditorContext<Options, GeomapInstanceState>;\n};\n\n// Data scope options for 'Fit to data'\nenum DataScopeValues {\n all = 'all',\n layer = 'layer',\n last = 'last',\n}\nenum DataScopeLabels {\n all = 'All layers',\n layer = 'Layer',\n last = 'Last value',\n}\n\nconst ScopeOptions = Object.values(DataScopeValues);\n\nconst DataScopeOptions: Array<SelectableValue<DataScopeValues>> = ScopeOptions.map((dataScopeOption) => ({\n label: DataScopeLabels[dataScopeOption],\n value: dataScopeOption,\n}));\n\nexport const FitMapViewEditor = ({ labelWidth, value, onChange, context }: Props) => {\n const layers = useMemo(() => {\n if (context.options?.layers) {\n return context.options.layers.map((layer) => ({\n label: layer.name,\n value: layer.name,\n description: undefined,\n }));\n }\n return [];\n }, [context.options?.layers]);\n\n const onSelectLayer = useCallback(\n (selection: SelectableValue<string>) => {\n onChange({ ...value, layer: selection.value });\n },\n [value, onChange]\n );\n\n const allLayersEditorFragment = (\n <InlineFieldRow>\n <InlineField label=\"Layer\" labelWidth={labelWidth} grow={true}>\n <Select options={layers} onChange={onSelectLayer} placeholder={layers[0]?.label} />\n </InlineField>\n </InlineFieldRow>\n );\n\n const onChangePadding = (padding: number | undefined) => {\n onChange({ ...value, padding: padding });\n };\n\n const lastOnlyEditorFragment = (\n <InlineFieldRow>\n <InlineField\n label=\"Padding\"\n labelWidth={labelWidth}\n grow={true}\n tooltip=\"sets padding in relative percent beyond data extent\"\n >\n <NumberInput value={value?.padding ?? 5} min={0} step={1} onChange={onChangePadding} />\n </InlineField>\n </InlineFieldRow>\n );\n\n const currentDataScope = value.allLayers\n ? DataScopeValues.all\n : !value.allLayers && value.lastOnly\n ? DataScopeValues.last\n : DataScopeValues.layer;\n\n const onDataScopeChange = (dataScope: DataScopeValues) => {\n if (dataScope !== DataScopeValues.all && !value.layer) {\n onChange({\n ...value,\n allLayers: dataScope === String(DataScopeValues.all),\n lastOnly: dataScope === String(DataScopeValues.last),\n layer: layers[0].value,\n });\n } else {\n onChange({\n ...value,\n allLayers: dataScope === String(DataScopeValues.all),\n lastOnly: dataScope === String(DataScopeValues.last),\n });\n }\n };\n\n return (\n <>\n <InlineFieldRow>\n <InlineField label=\"Data\" labelWidth={labelWidth} grow={true}>\n <RadioButtonGroup\n value={currentDataScope}\n options={DataScopeOptions}\n onChange={onDataScopeChange}\n ></RadioButtonGroup>\n </InlineField>\n </InlineFieldRow>\n {!value?.allLayers && allLayersEditorFragment}\n {!value?.lastOnly && lastOnlyEditorFragment}\n </>\n );\n};\n","import { toLonLat } from 'ol/proj';\nimport React, { useMemo, useCallback } from 'react';\n\nimport { StandardEditorProps, SelectableValue } from '@grafana/data';\nimport { Button, InlineField, InlineFieldRow, Select, VerticalGroup } from '@grafana/ui';\nimport { NumberInput } from 'app/core/components/OptionsUI/NumberInput';\n\nimport { Options, MapViewConfig, GeomapInstanceState } from '../types';\nimport { centerPointRegistry, MapCenterID } from '../view';\n\nimport { CoordinatesMapViewEditor } from './CoordinatesMapViewEditor';\nimport { FitMapViewEditor } from './FitMapViewEditor';\n\nexport const MapViewEditor = ({\n value,\n onChange,\n context,\n}: StandardEditorProps<MapViewConfig, unknown, Options, GeomapInstanceState>) => {\n const labelWidth = 10;\n\n const views = useMemo(() => {\n const ids: string[] = [];\n if (value?.id) {\n ids.push(value.id);\n } else {\n ids.push(centerPointRegistry.list()[0].id);\n }\n return centerPointRegistry.selectOptions(ids);\n }, [value?.id]);\n\n const onSetCurrentView = useCallback(() => {\n const map = context.instanceState?.map;\n if (map) {\n const view = map.getView();\n const coords = view.getCenter();\n if (coords) {\n const center = toLonLat(coords, view.getProjection());\n onChange({\n ...value,\n id: MapCenterID.Coordinates,\n lon: +center[0].toFixed(6),\n lat: +center[1].toFixed(6),\n zoom: +view.getZoom()!.toFixed(2),\n });\n }\n }\n }, [value, onChange, context.instanceState]);\n\n const onSelectView = useCallback(\n (selection: SelectableValue<string>) => {\n const v = centerPointRegistry.getIfExists(selection.value);\n if (v) {\n onChange({\n ...value,\n id: v.id,\n lat: v.lat ?? value?.lat,\n lon: v.lon ?? value?.lon,\n zoom: v.zoom ?? value?.zoom,\n });\n }\n },\n [value, onChange]\n );\n\n return (\n <>\n <InlineFieldRow>\n <InlineField label=\"View\" labelWidth={labelWidth} grow={true}>\n <Select options={views.options} value={views.current} onChange={onSelectView} />\n </InlineField>\n </InlineFieldRow>\n {value.id === MapCenterID.Coordinates && (\n <CoordinatesMapViewEditor labelWidth={labelWidth} value={value} onChange={onChange} />\n )}\n {value.id === MapCenterID.Fit && (\n <FitMapViewEditor labelWidth={labelWidth} value={value} onChange={onChange} context={context} />\n )}\n\n <InlineFieldRow>\n <InlineField label={value?.id === MapCenterID.Fit ? 'Max Zoom' : 'Zoom'} labelWidth={labelWidth} grow={true}>\n <NumberInput\n value={value?.zoom ?? 1}\n min={1}\n max={18}\n step={0.01}\n onChange={(v) => {\n onChange({ ...value, zoom: v });\n }}\n />\n </InlineField>\n </InlineFieldRow>\n\n <VerticalGroup>\n <Button variant=\"secondary\" size=\"sm\" fullWidth onClick={onSetCurrentView}>\n <span>Use current map settings</span>\n </Button>\n </VerticalGroup>\n </>\n );\n};\n","import { get as lodashGet, isEqual } from 'lodash';\n\nimport { FrameGeometrySourceMode, getFrameMatchers, MapLayerOptions } from '@grafana/data';\nimport { NestedPanelOptions, NestedValueAccess } from '@grafana/data/src/utils/OptionsUIBuilders';\nimport { setOptionImmutably } from 'app/features/dashboard/components/PanelEditor/utils';\nimport { addLocationFields } from 'app/features/geo/editor/locationEditor';\n\nimport { defaultMarkersConfig } from '../layers/data/markersLayer';\nimport { DEFAULT_BASEMAP_CONFIG, geomapLayerRegistry, getLayersOptions } from '../layers/registry';\nimport { MapLayerState } from '../types';\n\nimport { FrameSelectionEditor } from './FrameSelectionEditor';\n\nexport interface LayerEditorOptions {\n state: MapLayerState;\n category: string[];\n basemaps: boolean; // only basemaps\n}\n\nexport function getLayerEditor(opts: LayerEditorOptions): NestedPanelOptions<MapLayerOptions> {\n return {\n category: opts.category,\n path: '--', // Not used\n defaultValue: opts.basemaps ? DEFAULT_BASEMAP_CONFIG : defaultMarkersConfig,\n values: (parent: NestedValueAccess) => ({\n getContext: (parent) => {\n return { ...parent, options: opts.state.options, instanceState: opts.state };\n },\n getValue: (path: string) => lodashGet(opts.state.options, path),\n onChange: (path: string, value: string) => {\n const { state } = opts;\n const { options } = state;\n if (path === 'type' && value) {\n const layer = geomapLayerRegistry.getIfExists(value);\n if (layer) {\n const opts = {\n ...options, // keep current shared options\n type: layer.id,\n config: { ...layer.defaultOptions }, // clone?\n };\n if (layer.showLocation) {\n if (!opts.location?.mode) {\n opts.location = { mode: FrameGeometrySourceMode.Auto };\n } else {\n delete opts.location;\n }\n }\n state.onChange(opts);\n return;\n }\n }\n state.onChange(setOptionImmutably(options, path, value));\n },\n }),\n build: (builder, context) => {\n if (!opts.state) {\n return;\n }\n\n const { handler, options } = opts.state;\n const layer = geomapLayerRegistry.getIfExists(options?.type);\n\n const layerTypes = getLayersOptions(\n opts.basemaps,\n options?.type // the selected value\n ? options.type\n : DEFAULT_BASEMAP_CONFIG.type\n );\n\n builder.addSelect({\n path: 'type',\n name: 'Layer type', // required, but hide space\n settings: {\n options: layerTypes.options,\n },\n });\n\n // Show data filter if the layer type can do something with the data query results\n if (handler.update) {\n builder.addCustomEditor({\n id: 'filterData',\n path: 'filterData',\n name: 'Data',\n editor: FrameSelectionEditor,\n defaultValue: undefined,\n });\n }\n\n if (!layer) {\n return; // unknown layer type\n }\n\n // Don't show UI for default configuration\n if (options.type === DEFAULT_BASEMAP_CONFIG.type) {\n return;\n }\n\n if (layer.showLocation) {\n let data = context.data;\n // If `filterData` exists filter data feeding into location editor\n if (options.filterData) {\n const matcherFunc = getFrameMatchers(options.filterData);\n data = data.filter(matcherFunc);\n }\n\n addLocationFields('Location', 'location.', builder, options.location, data);\n }\n if (handler.registerOptionsUI) {\n handler.registerOptionsUI(builder, context);\n }\n if (!isEqual(opts.category, ['Base layer'])) {\n if (!layer.hideOpacity) {\n builder.addSliderInput({\n path: 'opacity',\n name: 'Opacity',\n defaultValue: 1,\n settings: {\n min: 0,\n max: 1,\n step: 0.1,\n },\n });\n }\n builder.addBooleanSwitch({\n path: 'tooltip',\n name: 'Display tooltip',\n description: 'Show the tooltip for layer',\n defaultValue: true,\n });\n }\n },\n };\n}\n","import { cloneDeep } from 'lodash';\n\nimport {\n FieldConfigSource,\n PanelModel,\n PanelTypeChangedHandler,\n Threshold,\n ThresholdsMode,\n fieldReducers,\n FrameGeometrySourceMode,\n DataTransformerConfig,\n DataTransformerID,\n} from '@grafana/data';\nimport { ResourceDimensionMode } from '@grafana/schema';\n\nimport { defaultMarkersConfig, MarkersConfig } from './layers/data/markersLayer';\nimport { getMarkerAsPath } from './style/markers';\nimport { defaultStyleConfig } from './style/types';\nimport { Options, TooltipMode } from './types';\nimport { MapCenterID } from './view';\n\n/**\n * This is called when the panel changes from another panel\n */\nexport const mapPanelChangedHandler: PanelTypeChangedHandler = (panel, prevPluginId, prevOptions, prevFieldConfig) => {\n // Changing from angular/worldmap panel to react/openlayers\n if (prevPluginId === 'grafana-worldmap-panel' && prevOptions.angular) {\n const { fieldConfig, options, xform } = worldmapToGeomapOptions({\n ...prevOptions.angular,\n fieldConfig: prevFieldConfig,\n });\n if (xform?.id?.length) {\n panel.transformations = panel.transformations ? [...panel.transformations, xform] : [xform];\n }\n panel.fieldConfig = fieldConfig; // Mutates the incoming panel\n return options;\n }\n\n return {};\n};\n\nexport function worldmapToGeomapOptions(angular: any): {\n fieldConfig: FieldConfigSource;\n options: Options;\n xform?: DataTransformerConfig;\n} {\n const fieldConfig: FieldConfigSource = {\n defaults: {},\n overrides: [],\n };\n\n const markersLayer = cloneDeep(defaultMarkersConfig);\n const options: Options = {\n view: {\n id: MapCenterID.Zero,\n },\n controls: {\n showZoom: true,\n mouseWheelZoom: Boolean(angular.mouseWheelZoom),\n },\n basemap: {\n type: 'default', // was carto\n name: 'Basemap',\n },\n layers: [markersLayer],\n tooltip: { mode: TooltipMode.Details },\n };\n\n let v = asNumber(angular.decimals);\n if (v) {\n fieldConfig.defaults.decimals = v;\n }\n\n // Set the markers range\n const style = markersLayer.config!.style;\n v = asNumber(angular.circleMaxSize);\n if (v) {\n style.size!.max = v;\n }\n v = asNumber(angular.circleMinSize);\n if (v) {\n style.size!.min = v;\n }\n\n let xform: DataTransformerConfig | undefined = undefined;\n const reducer = fieldReducers.getIfExists(angular.valueName);\n if (reducer && angular.locationData?.length) {\n xform = {\n id: DataTransformerID.reduce,\n options: {\n reducers: [reducer.id],\n },\n };\n\n switch (angular.locationData) {\n case 'countries':\n case 'countries_3letter':\n markersLayer.location = {\n mode: FrameGeometrySourceMode.Lookup,\n gazetteer: 'public/gazetteer/countries.json',\n lookup: undefined, // will default to first string field from reducer\n };\n break;\n\n case 'states':\n markersLayer.location = {\n mode: FrameGeometrySourceMode.Lookup,\n gazetteer: 'public/gazetteer/usa-states.json',\n lookup: undefined, // will default to first string field from reducer\n };\n break;\n }\n }\n\n // Convert thresholds and color values\n if (angular.thresholds && angular.colors) {\n const levels = angular.thresholds.split(',').map((strVale: string) => {\n return Number(strVale.trim());\n });\n\n // One more color than threshold\n const thresholds: Threshold[] = [];\n for (const color of angular.colors) {\n const idx = thresholds.length - 1;\n if (idx >= 0) {\n thresholds.push({ value: levels[idx], color });\n } else {\n thresholds.push({ value: -Infinity, color });\n }\n }\n\n fieldConfig.defaults.thresholds = {\n mode: ThresholdsMode.Absolute,\n steps: thresholds,\n };\n }\n\n v = asNumber(angular.initialZoom);\n if (v) {\n options.view.zoom = v;\n }\n\n // mapCenter: 'Europe',\n // mapCenterLatitude: 46,\n // mapCenterLongitude: 14,\n //\n // Map center (from worldmap)\n const mapCenters: any = {\n '(0°, 0°)': MapCenterID.Zero,\n 'North America': 'north-america',\n Europe: 'europe',\n 'West Asia': 'west-asia',\n 'SE Asia': 'se-asia',\n 'Last GeoHash': MapCenterID.Coordinates, // MapCenterID.LastPoint,\n };\n options.view.id = mapCenters[angular.mapCenter];\n options.view.lat = asNumber(angular.mapCenterLatitude);\n options.view.lon = asNumber(angular.mapCenterLongitude);\n return { fieldConfig, options, xform };\n}\n\nfunction asNumber(v: unknown): number | undefined {\n const num = Number(v);\n return isNaN(num) ? undefined : num;\n}\n\nexport const mapMigrationHandler = (panel: PanelModel): Partial<Options> => {\n const pluginVersion = panel?.pluginVersion ?? '';\n\n // before 8.3, only one layer was supported!\n if (pluginVersion.startsWith('8.1') || pluginVersion.startsWith('8.2')) {\n const layers = panel.options?.layers;\n if (layers?.length === 1) {\n const layer = panel.options.layers[0];\n if (layer?.type === 'markers' && layer.config) {\n // Moving style to child object\n const oldConfig = layer.config;\n const config: MarkersConfig = {\n style: cloneDeep(defaultStyleConfig),\n showLegend: Boolean(oldConfig.showLegend),\n };\n\n if (oldConfig.size) {\n config.style.size = oldConfig.size;\n }\n if (oldConfig.color) {\n config.style.color = oldConfig.color;\n }\n if (oldConfig.fillOpacity) {\n config.style.opacity = oldConfig.fillOpacity;\n }\n const symbol = getMarkerAsPath(oldConfig.shape);\n if (symbol) {\n config.style.symbol = {\n fixed: symbol,\n mode: ResourceDimensionMode.Fixed,\n };\n }\n return { ...panel.options, layers: [{ ...layer, config }] };\n }\n }\n }\n return panel.options;\n};\n","import React from 'react';\n\nimport { PanelPlugin } from '@grafana/data';\nimport { config } from '@grafana/runtime';\nimport { commonOptionsBuilder } from '@grafana/ui';\n\nimport { GeomapPanel } from './GeomapPanel';\nimport { LayersEditor } from './editor/LayersEditor';\nimport { MapViewEditor } from './editor/MapViewEditor';\nimport { getLayerEditor } from './editor/layerEditor';\nimport { mapPanelChangedHandler, mapMigrationHandler } from './migrations';\nimport { defaultMapViewConfig, Options, TooltipMode, GeomapInstanceState } from './types';\n\nexport const plugin = new PanelPlugin<Options>(GeomapPanel)\n .setNoPadding()\n .setPanelChangeHandler(mapPanelChangedHandler)\n .setMigrationHandler(mapMigrationHandler)\n .useFieldConfig({\n useCustomConfig: (builder) => {\n commonOptionsBuilder.addHideFrom(builder);\n },\n })\n .setPanelOptions((builder, context) => {\n let category = ['Map view'];\n builder.addCustomEditor({\n category,\n id: 'view',\n path: 'view',\n name: 'Initial view', // don't show it\n description: 'This location will show when the panel first loads.',\n editor: MapViewEditor,\n defaultValue: defaultMapViewConfig,\n });\n\n builder.addBooleanSwitch({\n category,\n path: 'view.shared',\n description: 'Use the same view across multiple panels. Note: this may require a dashboard reload.',\n name: 'Share view',\n defaultValue: defaultMapViewConfig.shared,\n });\n\n // eslint-disable-next-line\n const state = context.instanceState as GeomapInstanceState;\n if (!state?.layers) {\n // TODO? show spinner?\n } else {\n const layersCategory = ['Map layers'];\n const basemapCategory = ['Basemap layer'];\n builder.addCustomEditor({\n category: layersCategory,\n id: 'layers',\n path: '',\n name: '',\n editor: LayersEditor,\n });\n\n const selected = state.layers[state.selected];\n if (state.selected && selected) {\n builder.addNestedOptions(\n getLayerEditor({\n state: selected,\n category: layersCategory,\n basemaps: false,\n })\n );\n }\n\n const baselayer = state.layers[0];\n if (config.geomapDisableCustomBaseLayer) {\n builder.addCustomEditor({\n category: basemapCategory,\n id: 'layers',\n path: '',\n name: '',\n // eslint-disable-next-line react/display-name\n editor: () => <div>The basemap layer is configured by the server admin.</div>,\n });\n } else if (baselayer) {\n builder.addNestedOptions(\n getLayerEditor({\n state: baselayer,\n category: basemapCategory,\n basemaps: true,\n })\n );\n }\n }\n\n // The controls section\n category = ['Map controls'];\n builder\n .addBooleanSwitch({\n category,\n path: 'controls.showZoom',\n description: 'Show zoom control buttons in the upper left corner',\n name: 'Show zoom control',\n defaultValue: true,\n })\n .addBooleanSwitch({\n category,\n path: 'controls.mouseWheelZoom',\n description: 'Enable zoom control via mouse wheel',\n name: 'Mouse wheel zoom',\n defaultValue: true,\n })\n .addBooleanSwitch({\n category,\n path: 'controls.showAttribution',\n name: 'Show attribution',\n description: 'Show the map source attribution info in the lower right',\n defaultValue: true,\n })\n .addBooleanSwitch({\n category,\n path: 'controls.showScale',\n name: 'Show scale',\n description: 'Indicate map scale',\n defaultValue: false,\n })\n .addBooleanSwitch({\n category,\n path: 'controls.showMeasure',\n name: 'Show measure tools',\n description: 'Show tools for making measurements on the map',\n defaultValue: false,\n })\n .addBooleanSwitch({\n category,\n path: 'controls.showDebug',\n name: 'Show debug',\n description: 'Show map info',\n defaultValue: false,\n })\n .addRadio({\n category,\n path: 'tooltip.mode',\n name: 'Tooltip',\n defaultValue: TooltipMode.Details,\n settings: {\n options: [\n { label: 'None', value: TooltipMode.None, description: 'Show contents on click, not hover' },\n { label: 'Details', value: TooltipMode.Details, description: 'Show popup on hover' },\n ],\n },\n });\n });\n","!function(t,i){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=i():\"function\"==typeof define&&define.amd?define(i):(t=t||self).RBush=i()}(this,function(){\"use strict\";function t(t,r,e,a,h){!function t(n,r,e,a,h){for(;a>e;){if(a-e>600){var o=a-e+1,s=r-e+1,l=Math.log(o),f=.5*Math.exp(2*l/3),u=.5*Math.sqrt(l*f*(o-f)/o)*(s-o/2<0?-1:1),m=Math.max(e,Math.floor(r-s*f/o+u)),c=Math.min(a,Math.floor(r+(o-s)*f/o+u));t(n,r,m,c,h)}var p=n[r],d=e,x=a;for(i(n,e,r),h(n[a],p)>0&&i(n,e,a);d<x;){for(i(n,d,x),d++,x--;h(n[d],p)<0;)d++;for(;h(n[x],p)>0;)x--}0===h(n[e],p)?i(n,e,x):i(n,++x,a),x<=r&&(e=x+1),r<=x&&(a=x-1)}}(t,r,e||0,a||t.length-1,h||n)}function i(t,i,n){var r=t[i];t[i]=t[n],t[n]=r}function n(t,i){return t<i?-1:t>i?1:0}var r=function(t){void 0===t&&(t=9),this._maxEntries=Math.max(4,t),this._minEntries=Math.max(2,Math.ceil(.4*this._maxEntries)),this.clear()};function e(t,i,n){if(!n)return i.indexOf(t);for(var r=0;r<i.length;r++)if(n(t,i[r]))return r;return-1}function a(t,i){h(t,0,t.children.length,i,t)}function h(t,i,n,r,e){e||(e=p(null)),e.minX=1/0,e.minY=1/0,e.maxX=-1/0,e.maxY=-1/0;for(var a=i;a<n;a++){var h=t.children[a];o(e,t.leaf?r(h):h)}return e}function o(t,i){return t.minX=Math.min(t.minX,i.minX),t.minY=Math.min(t.minY,i.minY),t.maxX=Math.max(t.maxX,i.maxX),t.maxY=Math.max(t.maxY,i.maxY),t}function s(t,i){return t.minX-i.minX}function l(t,i){return t.minY-i.minY}function f(t){return(t.maxX-t.minX)*(t.maxY-t.minY)}function u(t){return t.maxX-t.minX+(t.maxY-t.minY)}function m(t,i){return t.minX<=i.minX&&t.minY<=i.minY&&i.maxX<=t.maxX&&i.maxY<=t.maxY}function c(t,i){return i.minX<=t.maxX&&i.minY<=t.maxY&&i.maxX>=t.minX&&i.maxY>=t.minY}function p(t){return{children:t,height:1,leaf:!0,minX:1/0,minY:1/0,maxX:-1/0,maxY:-1/0}}function d(i,n,r,e,a){for(var h=[n,r];h.length;)if(!((r=h.pop())-(n=h.pop())<=e)){var o=n+Math.ceil((r-n)/e/2)*e;t(i,o,n,r,a),h.push(n,o,o,r)}}return r.prototype.all=function(){return this._all(this.data,[])},r.prototype.search=function(t){var i=this.data,n=[];if(!c(t,i))return n;for(var r=this.toBBox,e=[];i;){for(var a=0;a<i.children.length;a++){var h=i.children[a],o=i.leaf?r(h):h;c(t,o)&&(i.leaf?n.push(h):m(t,o)?this._all(h,n):e.push(h))}i=e.pop()}return n},r.prototype.collides=function(t){var i=this.data;if(!c(t,i))return!1;for(var n=[];i;){for(var r=0;r<i.children.length;r++){var e=i.children[r],a=i.leaf?this.toBBox(e):e;if(c(t,a)){if(i.leaf||m(t,a))return!0;n.push(e)}}i=n.pop()}return!1},r.prototype.load=function(t){if(!t||!t.length)return this;if(t.length<this._minEntries){for(var i=0;i<t.length;i++)this.insert(t[i]);return this}var n=this._build(t.slice(),0,t.length-1,0);if(this.data.children.length)if(this.data.height===n.height)this._splitRoot(this.data,n);else{if(this.data.height<n.height){var r=this.data;this.data=n,n=r}this._insert(n,this.data.height-n.height-1,!0)}else this.data=n;return this},r.prototype.insert=function(t){return t&&this._insert(t,this.data.height-1),this},r.prototype.clear=function(){return this.data=p([]),this},r.prototype.remove=function(t,i){if(!t)return this;for(var n,r,a,h=this.data,o=this.toBBox(t),s=[],l=[];h||s.length;){if(h||(h=s.pop(),r=s[s.length-1],n=l.pop(),a=!0),h.leaf){var f=e(t,h.children,i);if(-1!==f)return h.children.splice(f,1),s.push(h),this._condense(s),this}a||h.leaf||!m(h,o)?r?(n++,h=r.children[n],a=!1):h=null:(s.push(h),l.push(n),n=0,r=h,h=h.children[0])}return this},r.prototype.toBBox=function(t){return t},r.prototype.compareMinX=function(t,i){return t.minX-i.minX},r.prototype.compareMinY=function(t,i){return t.minY-i.minY},r.prototype.toJSON=function(){return this.data},r.prototype.fromJSON=function(t){return this.data=t,this},r.prototype._all=function(t,i){for(var n=[];t;)t.leaf?i.push.apply(i,t.children):n.push.apply(n,t.children),t=n.pop();return i},r.prototype._build=function(t,i,n,r){var e,h=n-i+1,o=this._maxEntries;if(h<=o)return a(e=p(t.slice(i,n+1)),this.toBBox),e;r||(r=Math.ceil(Math.log(h)/Math.log(o)),o=Math.ceil(h/Math.pow(o,r-1))),(e=p([])).leaf=!1,e.height=r;var s=Math.ceil(h/o),l=s*Math.ceil(Math.sqrt(o));d(t,i,n,l,this.compareMinX);for(var f=i;f<=n;f+=l){var u=Math.min(f+l-1,n);d(t,f,u,s,this.compareMinY);for(var m=f;m<=u;m+=s){var c=Math.min(m+s-1,u);e.children.push(this._build(t,m,c,r-1))}}return a(e,this.toBBox),e},r.prototype._chooseSubtree=function(t,i,n,r){for(;r.push(i),!i.leaf&&r.length-1!==n;){for(var e=1/0,a=1/0,h=void 0,o=0;o<i.children.length;o++){var s=i.children[o],l=f(s),u=(m=t,c=s,(Math.max(c.maxX,m.maxX)-Math.min(c.minX,m.minX))*(Math.max(c.maxY,m.maxY)-Math.min(c.minY,m.minY))-l);u<a?(a=u,e=l<e?l:e,h=s):u===a&&l<e&&(e=l,h=s)}i=h||i.children[0]}var m,c;return i},r.prototype._insert=function(t,i,n){var r=n?t:this.toBBox(t),e=[],a=this._chooseSubtree(r,this.data,i,e);for(a.children.push(t),o(a,r);i>=0&&e[i].children.length>this._maxEntries;)this._split(e,i),i--;this._adjustParentBBoxes(r,e,i)},r.prototype._split=function(t,i){var n=t[i],r=n.children.length,e=this._minEntries;this._chooseSplitAxis(n,e,r);var h=this._chooseSplitIndex(n,e,r),o=p(n.children.splice(h,n.children.length-h));o.height=n.height,o.leaf=n.leaf,a(n,this.toBBox),a(o,this.toBBox),i?t[i-1].children.push(o):this._splitRoot(n,o)},r.prototype._splitRoot=function(t,i){this.data=p([t,i]),this.data.height=t.height+1,this.data.leaf=!1,a(this.data,this.toBBox)},r.prototype._chooseSplitIndex=function(t,i,n){for(var r,e,a,o,s,l,u,m=1/0,c=1/0,p=i;p<=n-i;p++){var d=h(t,0,p,this.toBBox),x=h(t,p,n,this.toBBox),v=(e=d,a=x,o=void 0,s=void 0,l=void 0,u=void 0,o=Math.max(e.minX,a.minX),s=Math.max(e.minY,a.minY),l=Math.min(e.maxX,a.maxX),u=Math.min(e.maxY,a.maxY),Math.max(0,l-o)*Math.max(0,u-s)),M=f(d)+f(x);v<m?(m=v,r=p,c=M<c?M:c):v===m&&M<c&&(c=M,r=p)}return r||n-i},r.prototype._chooseSplitAxis=function(t,i,n){var r=t.leaf?this.compareMinX:s,e=t.leaf?this.compareMinY:l;this._allDistMargin(t,i,n,r)<this._allDistMargin(t,i,n,e)&&t.children.sort(r)},r.prototype._allDistMargin=function(t,i,n,r){t.children.sort(r);for(var e=this.toBBox,a=h(t,0,i,e),s=h(t,n-i,n,e),l=u(a)+u(s),f=i;f<n-i;f++){var m=t.children[f];o(a,t.leaf?e(m):m),l+=u(a)}for(var c=n-i-1;c>=i;c--){var p=t.children[c];o(s,t.leaf?e(p):p),l+=u(s)}return l},r.prototype._adjustParentBBoxes=function(t,i,n){for(var r=n;r>=0;r--)o(i[r],t)},r.prototype._condense=function(t){for(var i=t.length-1,n=void 0;i>=0;i--)0===t[i].children.length?i>0?(n=t[i-1].children).splice(n.indexOf(t[i]),1):this.clear():a(t[i],this.toBBox)},r});\n"],"names":["module","url","options","earcut","data","holeIndices","dim","hasHoles","outerLen","outerNode","linkedList","triangles","minX","minY","maxX","maxY","x","y","invSize","eliminateHoles","i","earcutLinked","start","end","clockwise","last","signedArea","insertNode","equals","removeNode","filterPoints","p","again","area","ear","pass","indexCurve","stop","prev","next","isEarHashed","isEar","cureLocalIntersections","splitEarcut","a","b","c","ax","bx","cx","ay","by","cy","x0","y0","x1","y1","pointInTriangle","minZ","zOrder","maxZ","n","intersects","locallyInside","isValidDiagonal","splitPolygon","queue","len","list","getLeftmost","compareX","eliminateHole","hole","bridge","findHoleBridge","bridgeReverse","hx","hy","qx","m","mx","my","tanMin","tan","sectorContainsSector","sortLinked","q","e","tail","numMerges","pSize","qSize","inSize","leftmost","px","py","intersectsPolygon","middleInside","r","p1","p2","q1","q2","o1","sign","o2","o3","o4","onSegment","num","inside","a2","Node","b2","an","bp","polygonArea","trianglesArea","sum","j","result","holeIndex","d","GRADIENT_STOPS","ColorScale","colorPalette","min","max","display","hoverValue","useStopsPercentage","colors","setColors","scaleHover","setScaleHover","percent","setPercent","theme","styles","getStyles","getGradientStops","onScaleMouseMove","event","divOffset","offsetWidth","normPercentage","scaleValue","onScaleMouseLeave","clampPercent100","colorArray","stops","colorCount","incr","per","color","gradientEnd","skip","gradientStops","v","AddLayerButton","onChange","label","UNITS_PROP","LEADING_DIGITS","DEFAULT_DPI","ScaleLine","Control","element","className","units","dpi","viewState","center","projection","pointResolutionUnits","pointResolution","minWidth","maxWidth","nominalCount","suffix","metersPerDegree","count","width","decimalCount","previousCount","previousWidth","previousDecimalCount","decimal","html","scale","resolutionScale","mapScale","steps","stepWidth","scaleSteps","cls","position","isLast","lengthString","margin","resolution","inchesPerMeter","mapEvent","frameState","GeomapOverlay","topRight1","topRight2","bottomLeft","blStyle","topRight1Exists","DataHoverRow","feature","rowIndex","geometry","properties","ArrayDataFrame","DataHoverView","DataHoverRows","layers","activeTabIndex","rowMap","setRowMap","updateRowMap","key","value","TabContent","geomapLayer","index","idx","Collapse","generateLabel","names","props","first","frame","f","k","DataHoverTabs","setActiveTabIndex","TabsBar","g","Tab","ComplexDataHoverView","onClose","isOpen","CloseButton","GeomapTooltip","ttip","ref","overlayProps","dialogProps","Portal","VizTooltipContainer","DebugOverlay","view","zoom","selectors","tinycolor","measures","u","m2","RBush","maxEntries","extent","item","extents","values","items","l","uid","bbox","callback","rbush","ImageStyle","pixelRatio","displacement","opacity","rotateWithView","rotation","listener","asColorLike","RegularShape","style","size","fill","image","renderOptions","context","ImageState","stroke","lineJoin","strokeWidth","miterLimit","r1","r2","tmp","points","alpha","miterRatio","bevelAdd","aa","bb","dd","innerMiterRatio","innerLength","lineDash","lineDashOffset","strokeStyle","add","maxRadius","radius","radius2","startAngle","step","angle0","radiusC","CircleStyle","Fill","Stroke","lineCap","Style","defaultGeometryFunction","renderer","text","zIndex","toFunction","obj","styleFunction","defaultStyles","createDefaultStyle","createEditingStyle","white","blue","ImageBase","state","EventType","ImageWrapper","src","crossOrigin","imageLoadFunction","canvas","listenImage","loadHandler","errorHandler","img","listening","decoding","loaded","listenerKeys","error","taintedTestContext","IconImage","imageState","height","ctx","get","iconImage","calculateScale","wantedWidth","wantedHeight","Icon","onload","imageSize","anchor","offset","iconImageSize","DEFAULT_FILL_COLOR","Text","overflow","font","maxAngle","offsetX","offsetY","placement","repeat","textAlign","justify","textBaseline","padding","toStyle","flatStyle","getFill","getStroke","getText","getImage","prefix","iconSrc","iconImg","shapePoints","circleRadius","Property","BaseVectorLayer","Layer","baseOptions","pixel","renderOrder","styleLike","s","Instruction","fillInstruction","strokeInstruction","beginPathInstruction","closePathInstruction","VectorContext","hitDetectionRenderer","circleGeometry","geometryCollectionGeometry","lineStringGeometry","multiLineStringGeometry","multiPointGeometry","multiPolygonGeometry","pointGeometry","polygonGeometry","fillStyle","imageStyle","declutterImageWithText","textStyle","CanvasBuilder","tolerance","maxExtent","dashArray","dash","flatCoordinates","stride","tmpCoord","coordinates","myEnd","ii","closed","skipFirst","lastXCoord","lastYCoord","nextCoord","skipped","lastRel","nextRel","Relationship","ends","builderEnds","builderEnd","type","builderBegin","builderEndss","endss","myEnds","inflate","hitDetectionInstructions","instruction","begin","fillStyleColor","strokeStyleColor","strokeStyleLineCap","strokeStyleLineDash","strokeStyleLineDashOffset","strokeStyleLineJoin","strokeStyleWidth","strokeStyleMiterLimit","createFill","applyStroke","lineWidth","endGeometryInstruction","CanvasImageBuilder","myBegin","sharedData","origin","CanvasLineStringBuilder","moveToLineToInstruction","CanvasPolygonBuilder","numEnds","circleInstruction","lineChunk","chunkLength","chunks","cursor","chunkM","currentChunk","x2","y2","segmentLength","missing","matchingChunk","chunkStart","chunkEnd","acos","m12","m23","x12","y12","x23","y23","TEXT_ALIGN","CanvasTextBuilder","instructions","fillState","strokeState","textState","geometryType","flatOffset","o","oo","cc","chunk","chunkBegin","range","geometryWidths","interiorPoints","beg","w","keep","p0","p3","strokeKey","textKey","fillKey","baseline","textFillStyle","textStrokeStyle","textScale","textOffsetX","textOffsetY","textRotateWithView","textRotation","BATCH_CONSTRUCTORS","PolygonBuilder","Builder","ImageBuilder","LineStringBuilder","BuilderGroup","builderInstructions","zKey","builders","builderKey","builderInstruction","builderType","zIndexKey","replays","replay","Constructor","LayerRenderer","Observable","layer","target","tiles","tile","source","tileRange","coordinate","hitTolerance","matches","canvasPool","pixelContext","createPixelContext","CanvasLayerRenderer","col","row","background","transform","backgroundColor","layerClassName","container","topLeft","topRight","bottomRight","inverted","dx1","dy1","sx","sy","dx2","dy2","drawTextOnPath","startM","measureAndCacheTextWidth","cache","segmentM","advance","interpolate","beginX","beginY","startOffset","startLength","endM","endX","endY","reverse","flat","PI","singleSegment","previousAngle","angle","delta","iStart","charLength","chars","tmpExtent","p4","getDeclutterBox","replayImageOrLabelArgs","rtlRegEx","horizontalTextAlign","align","createTextChunks","acc","line","Executor","overlaps","textIsArray","widths","heights","lineWidths","renderWidth","contextInstructions","h","leftRight","strokeInstructions","fillInstructions","lineHeight","lineOffset","widthHeightIndex","lineWidthIndex","previousFont","fillStrokeArgs","sheetWidth","sheetHeight","centerX","centerY","anchorX","anchorY","originX","originY","snapToPixel","fillStroke","boxW","boxH","boxX","boxY","contextScale","imageOrLabel","dimensions","box","strokePadding","repeatSize","featureCallback","hitExtent","declutterTree","pixelCoordinates","prevX","prevY","roundX","roundY","pendingFill","pendingStroke","lastFillInstruction","lastStrokeInstruction","coordinateCache","viewRotation","viewRotationFromTransform","batchSize","currentGeometry","dx","dy","fn","coords","declutterMode","labelWithAnchor","backgroundFill","backgroundStroke","widthIndex","args","imageArgs","imageDeclutterBox","measurePixelRatio","pixelRatioScale","cachedWidths","pathLength","textLength","parts","drawChars","part","ORDER","ExecutorGroup","allInstructions","renderBuffer","flatClipCoords","executors","instructionByZindex","candidates","declutteredFeatures","contextSize","newContext","indexes","getPixelIndexArray","imageData","zs","executor","builderTypes","jj","circlePixelIndexArrayCache","maxDistanceSq","distances","distanceSq","distance","pixelIndex","CanvasImmediateRenderer","squaredTolerance","userTransform","localTransform","close","length","geometries","flatMidpoint","geometryExtent","flatMidpoints","flatInteriorPoint","flatInteriorPoints","contextFillState","contextStrokeState","contextTextState","imagePixelRatio","imageAnchor","imageOrigin","imageScale","textFillStyleColor","textStrokeStyleColor","textStrokeStyleLineCap","textStrokeStyleLineDash","textStrokeStyleLineDashOffset","textStrokeStyleLineJoin","textStrokeStyleWidth","textStrokeStyleMiterLimit","textFont","textText","textTextAlign","textTextBaseline","t","HIT_DETECT_RESOLUTION","createHitDetectionImageData","transforms","features","featureCount","indexFactor","featuresByZIndex","featureStyleFunction","originalStyle","imgSize","imgContext","byGeometryType","zIndexKeys","geomAndStyle","kk","hitDetect","resultFeatures","SIMPLIFY_TOLERANCE","GEOMETRY_RENDERERS","renderPointGeometry","renderLineStringGeometry","renderPolygonGeometry","renderMultiPointGeometry","renderMultiLineStringGeometry","renderMultiPolygonGeometry","renderGeometryCollectionGeometry","renderCircleGeometry","defaultOrder","feature1","feature2","getSquaredTolerance","getTolerance","builderGroup","declutterBuilderGroup","circleReplay","textReplay","renderFeature","replayGroup","loading","renderFeatureInternal","simplifiedGeometry","renderGeometry","geometryRenderer","lineStringReplay","polygonReplay","imageBuilderGroup","imageReplay","textBuilderGroup","CanvasVectorLayerRenderer","vectorLayer","executorGroup","projectionExtent","vectorSource","viewHints","ViewHint","multiWorld","worldWidth","endWorld","world","compositionContext","layerState","canvasTransform","declutterExecutorGroup","clipped","render","layerExtent","resolve","startX","match","executorGroups","animating","interacting","updateWhileAnimating","updateWhileInteracting","frameStateExtent","vectorLayerRevision","vectorLayerRenderBuffer","vectorLayerRenderOrder","renderedExtent","loadExtents","gutter","loadExtent","userProjection","userExtent","ready","dirty","replayGroupInstructions","VectorLayer","BaseVector","Source","adaptAttributions","self","reject","attributions","attributionLike","tileGrid","z","tileCoord","withCredentials","loadFeaturesXhr","format","success","failure","xhr","dataProjection","setWithCredentials","xhrWithCredentials","VectorSourceEvent","Event","VectorSource","useSpatialIndex","collection","Collection","featureKey","VectorEventType","ObjectEventType","valid","id","newFeatures","geometryFeatures","modifyingCollection","evt","CollectionEventType","fast","featureId","removeAndIgnoreReturn","clearEvent","anExtent","filter","closestFeature","closestPoint","minSquaredDistance","previousMinSquaredDistance","minDistance","sid","loadedExtentsRtree","extentsToLoad","extentToLoad","object","featureChangeKeys","removed","loader","CIRCLE_CENTER_INDEX","CIRCLE_CIRCUMFERENCE_INDEX","tempExtent","tempSegment","ModifyEventType","ModifyEvent","mapBrowserEvent","Modify","Pointer","Vector","getDefaultStyleFunction","writer","map","segments","segment","ss","rBush","nodesToRemove","node","nodeToRemove","active","segmentData","lines","rings","polygons","centerSegmentData","circumferenceSegmentData","featureSegments","vertexFeature","Feature","Point","handled","MapBrowserEventType","vertex","dragSegment","depth","pixelCoordinate","insertVertices","vertexExtent","segmentDataMatches","componentSegments","compareIndexes","segmentDataMatch","closestVertex","closestOnSegmentData","sortByDistance","projectedDistanceToSegmentDataSquared","nodes","hitPointGeometry","layerFilter","geom","viewExtent","buffer","closestSegment","vertexPixel","dist","vertexSegments","pixel1","pixel2","squaredDist1","squaredDist2","geometryUid","rTree","newSegmentData","newSegmentData2","dragSegments","segmentsByFeature","deleted","component","left","newIndex","right","pointCoordinates","distanceToCenterSquared","distanceToCircumference","SimpleGeometry","layout","circle","squaredDistance","circleExtent","deflate","DrawEventType","DrawEvent","getTraceTargets","targets","appendGeometryTraceTargets","getSquaredDistance","getCoordinate","getCumulativeSquaredDistance","startIndex","endIndex","lowIndex","highIndex","lowWholeIndex","highWholeIndex","interpolateCoordinate","sd","LineString","appendTraceTarget","MultiLineString","MultiPolygon","polys","GeometryCollection","sharedUpdateInfo","getTraceTargetUpdate","traceState","snapTolerance","closestTargetDistance","newTargetIndex","newEndIndex","targetIndex","minSegmentDistance","coordinateIndex","rel","getPointSegmentRelationship","newTarget","considerBothDirections","newCoordinate","forwardDistance","reverseDistance","ring","sharedRel","along","Draw","pointerOptions","getMode","geometryFunction","mode","squaredLength","trace","condition","move","MapBrowserEvent","lowerLeft","upperRight","previouslyForward","currentlyForward","fromIndex","toIndex","remove","updatedTraceTarget","oldTarget","tracing","startingToDraw","downPx","clickPx","at","potentiallyDone","potentiallyFinishCoordinates","sketchCoords","finishCoordinate","finishPixel","sketchLineGeom","done","sketchFeature","MultiPoint","newDrawing","ending","lineString","sketchFeatures","overlaySource","createRegularPolygon","sides","internalAngle","createBox","boxCoordinates","MeasureVectorLayer","geo","action","drawType","tip","point","segmentPoint","typeSelect","showSegments","clearPrevious","activeTip","idleTip","MeasureOverlay","menuActiveState","vector","measureStyle","firstLoad","setFirstLoad","menuActive","setMenuActive","setOptions","unit","current","toggleMenu","RadioButtonGroup","Button","Select","IconButton","getGlobalStyles","FrameVectorSource","location","info","field","MarkersLegend","layerName","styleConfig","hoverEvent","useObservable","of","colorField","symbol","SanitizedSVG","colorMode","colorRange","thresholds","ObservablePropsWrapper","subProps","err","RegularShapeId","MarkerShapePath","getFillColor","cfg","getStrokeStyle","textLabel","fontFamily","config","textConfig","textMarker","circleMarker","getDisplacement","polyStyle","routeStyle","errorMarker","makers","prepareSVG","res","svg","svgSize","svgString","markerMakers","Registry","getMarkerAsPath","shape","marker","getMarkerMaker","hasTextLabel","maker","styleUsesText","getStyleConfigState","hasText","fields","symbolAlign","StyleEditor","settings","onSizeChange","sizeValue","onSymbolChange","symbolValue","onColorChange","colorValue","onOpacityChange","opacityValue","onRotationChange","rotationValue","onTextChange","textValue","onTextFontSizeChange","fontSize","onTextOffsetXChange","onTextOffsetYChange","onTextAlignChange","onTextBaselineChange","onAlignHorizontalChange","alignHorizontal","onAlignVerticalChange","alignVertical","featuresHavePoints","maxFiles","InlineFieldRow","InlineField","Field","InlineLabel","ColorPicker","defaultOptions","MARKERS_LAYER_ID","defaultMarkersConfig","markersLayer","eventBus","legendProps","ReplaySubject","legend","dims","builder","BaseTileLayer","TileProperty","preload","useInterimTilesOnError","Tile","TileState","time","ImageTile","tileLoadFunction","getBlankImage","ERROR_THRESHOLD","MAX_SUBDIVISION","MAX_TRIANGLE_WIDTH","Triangulation","sourceProj","targetProj","targetExtent","maxSourceExtent","errorThreshold","destinationResolution","transformInvCache","transformInv","destinationTopLeft","destinationTopRight","destinationBottomRight","destinationBottomLeft","sourceTopLeft","sourceTopRight","sourceBottomRight","sourceBottomLeft","maxSubdivision","leftBound","triangle","arr","newTriangle","aSrc","bSrc","cSrc","dSrc","sourceQuadExtent","sourceCoverageX","sourceWorldWidth","wrapsX","needsSubdivision","targetQuadExtent","isNotFinite","centerSrc","bc","bcSrc","da","daSrc","ab","abSrc","cd","cdSrc","brokenDiagonalRendering_","drawTestTriangle","u1","v1","u2","v2","verifyBrokenDiagonalRendering","isBrokenDiagonalRendering","calculateSourceResolution","targetCenter","targetResolution","sourceCenter","sourceResolution","targetMetersPerUnit","sourceMetersPerUnit","sourceExtent","compensationFactor","calculateSourceExtentResolution","corner","triangulation","sources","renderEdges","pixelRound","sourceDataExtent","canvasWidthInUnits","canvasHeightInUnits","stitchContext","stitchScale","xPos","yPos","srcWidth","srcHeight","targetTopLeft","u0","v0","sourceNumericalShiftX","sourceNumericalShiftY","augmentedMatrix","affineCoefs","ud","vd","ReprojTile","sourceTileGrid","targetTileGrid","wrappedTileCoord","getTileFunction","maxTargetExtent","limitedTargetExtent","sourceProjExtent","errorThresholdInPixels","sourceRange","srcX","srcY","leftToLoad","sourceListenKey","TileRange","createOrUpdate","CanvasTileLayerRenderer","tileLayer","tileState","tilePixelRatio","tileOrigin","tileSize","tileResolution","viewResolution","viewCenter","tileSource","sourceRevision","canvasExtent","tilesToDrawByZ","findLoadedTiles","tmpTileRange","viewport","inTransition","childTileRange","covered","canvasScale","clips","clipZs","currentClip","currentZ","currentTilePixelSize","currentScale","originTileCoord","originTileExtent","tileGutter","tilesToDraw","tileCoordKey","xIndex","nextX","yIndex","nextY","transition","contextSaved","clip","alphaChanged","postRenderFunction","tileSourceKey","usedTiles","tileCallback","wantedTiles","tileQueue","minZoom","tileCount","TileLayer","BaseTile","LRUCache","highWaterMark","entry","keys","getKeyZXY","getKey","getCacheKeyForTileKey","tileKey","fromKey","hash","withinExtentAndZ","TileCache","tmpTileCoord","DECIMALS","TileGrid","zoomFactor","restrictedTileRange","tempTileRange","tileCoordExtent","tileCoordZ","tileCoordX","tileCoordY","factor","opt_tileCoord","reverseIntersectionPolicy","opt_direction","fullTileRanges","getForProjection","createForProjection","wrapX","extentFromProjection","worldsAway","createForExtent","maxZoom","resolutions","resolutionsFromExtent","createXYZ","xyzOptions","gridOptions","maxResolution","half","TileSource","tileCache","sourceProjection","TileSourceEvent","createFromTemplate","template","zRegEx","xRegEx","yRegEx","dashYRegEx","createFromTemplates","templates","tileUrlFunctions","createFromTileUrlFunctions","nullTileUrlFunction","expandUrl","urls","startCharCode","stopCharCode","charCode","UrlTile","TileEventType","tileUrlFunction","TileImage","defaultTileLoadFunction","usedTileCache","thisProj","projKey","urlTileCoord","tileUrl","newTile","interimTile","tilegrid","proj","imageTile","XYZ","LayerTheme","defaultCartoConfig","carto","cartoLayers","sampleURL","defaultXYZConfig","xyzTiles","genericLayers","CUSTOM_SERVICE","DEFAULT_SERVICE","publicServiceRegistry","esriLayers","svc","base","opts","xyz","ATTRIBUTION","OSM","basemapLayers","ol_source_DayNight","julianDay","deg2rad","L","lambda","R","T","epsilon","sunEclLon","eclObliq","rad2deg","lQuadrant","raQuadrant","lon","date","gst","sunEclPos","sunEqPos","ha","lat","lonlat","tlon","day","ShowTime","defaultConfig","DAY_NIGHT_LAYER_ID","defaultDayNightConfig","dayNightLayer","DayNight","sourceMethods","sourceLine","sourceLineMethods","nightLineLayer","sunFeature","sunLayer","sunLineFeature","sunLineStyle","sunLineStyleDash","sunLineLayer","subscriptions","Subscription","from","to","selectedTime","sunPos","checkFeatureMatchesStyleRule","rule","val","compareValues","getLayerPropertyInfo","types","getUniqueFeatureValues","unique","DEFAULT_STYLE_RULE","dynamicGeoJSONLayer","GeoJSON","idToIdx","isPoint","check","layerInfo","getSelectionInfo","StyleRuleEditor","propertyOptions","feats","uniqueSelectables","newValue","LABEL_WIDTH","onChangeProperty","selection","onChangeComparison","onChangeValue","onChangeNumericValue","onChangeStyle","onDelete","propv","valuev","NumberInput","GeomapStyleRulesEditor","onAddRule","palette","newRule","onRuleChange","copyStyles","styleOptions","itemSettings","geojsonLayer","polyStyleStrings","pointStyleStrings","lineStyleStrings","featureType","isPolygon","isLine","featureProps","property","ARRAY_BUFFER","ELEMENT_ARRAY_BUFFER","STREAM_DRAW","STATIC_DRAW","DYNAMIC_DRAW","UNSIGNED_BYTE","UNSIGNED_SHORT","UNSIGNED_INT","FLOAT","CONTEXT_IDS","getContext","attributes","supportedExtensions","getSupportedExtensions","gl","BufferUsage","WebGLArrayBuffer","usage","getArrayClassForType","array","DEFAULT_VERTEX_SHADER","DEFAULT_FRAGMENT_SHADER","WebGLPostProcessingPass","vertexShader","fragmentShader","verticesArray","name","textureSize","level","internalFormat","border","nextPass","preCompose","postCompose","canvasId","textureSlot","uniform","create","fromTransform","mat4","ShaderType","DefaultUniform","AttributeType","canvasCache","getSharedCanvasCacheKey","uniqueCanvasCacheKeyCount","getUniqueCanvasCacheKey","getCanvas","cacheItem","releaseCanvas","extension","WebGLHelper","Disposable","ContextEventType","uniforms","canvasCacheKey","bufferKey","bufferCache","webGlBuffer","buf","bufferCacheEntry","disableAlphaBlend","texture","slot","uniformName","renderTarget","elementType","elementSize","numItems","offsetInBytes","offsetScaleMatrix","offsetRotateMatrix","program","shader","fragmentShaderSource","vertexShaderSource","message","programUid","attribName","computeAttributesStride","attr","getByteSizeFromType","WebGLLayerRenderer","incrementGroup","groupNumber","tmpArray4","WebGLRenderTarget","helper","WebGLWorkerMessageType","tmpArray_","bufferPositions_","writePointVertex","pos","writePointFeatureToBuffers","elementIndex","vertexBuffer","indexBuffer","customAttributesSize","bufferPositions","customAttrs","vPos","iPos","baseIndex","writeLineSegmentToBuffers","segmentStartIndex","segmentEndIndex","beforeSegmentIndex","afterSegmentIndex","vertexArray","indexArray","customAttributes","instructionsTransform","invertInstructionsTransform","p0world","p1world","computeVertexParameters","vertexNumber","joinAngle1","joinAngle2","angleBetween","pA","pB","lenA","tangentA","orthoA","lenB","tangentB","joinBefore","joinAfter","angle1","pBworld","pAworld","writePolygonTrianglesToBuffers","polygonStartIndex","attributesPerVertex","instructionsIndex","ringsCount","verticesCount","holes","flatCoords","getBlankImageData","colorEncodeId","radix","divide","colorDecodeId","mult","WebGLPointsLayerRenderer","projectionMatrixTransform","attribute","received","projectionTransform","startWorld","renderCount","viewNotMoving","extentChanged","sourceChanged","totalInstructionsCount","totalHitInstructionsCount","featureCache","tmpCoords","tmpColor","renderIndex","hitIndex","hitColor","featureUid","hitMessage","DEFAULT_GRADIENT","Heatmap","weight","createGradient","blur","gradient","heatmapLayer","WEIGHT_KEY","weightDim","lastPointTracker","matchers","out","ol_coordinate_dist2d","ol_coordinate_equal","ol_coordinate_getFeatureCenter","ol_coordinate_getGeomCenter","ol_coordinate_offsetCoords","path","N","mi","mi1","li","li1","ri","ri1","si","si1","Xi1","Yi1","isClosed","ol_coordinate_findSegment","pt","d0","d1","ol_coordinate_splitH","abs","ol_geom_createFromType","ol_coordinate_getIntersectionPoint","d2","d1x","d1y","d2x","d2y","det","ol_extent_intersection","splitX","pts","splitY","polygon","poly","ol_coordinate_sampleAt","dl","nb","mpoly","ext","ol_extent","hasout","tol","c0","ci","split","ol_style_FlowLine","where","cap","w2","ol_color","color2","ratio","asize","cos","sin","geoms","dt","NETWORK_LAYER_ID","networkLayer","edgeStyle","hasArrows","edgeDims","edgeTextConfig","edgeId","segmentStartCoords","segmentEndCoords","color1","arrowSize1","arrowSize2","flowStyle","FlowLine","LS","labelStyle","graphFrames","updateEdge","networkFrames","frameNodes","frameEdges","nodeIdIndex","nodeIdValues","sourceIndex","sourceId","targetId","sourceNodeIndex","targetNodeIndex","geometryEdge","edgeFeature","ol_style_Photo","sanchor","shadow","hit","pixelratio","sw","sh","PHOTOS_LAYER_ID","defaultPhotosConfig","unknownImage","blankPixel","photoLoad","photosLayer","images","photoStyle","Photo","blankStyle","errorStyle","srcField","ROUTE_LAYER_ID","defaultRouteConfig","mapIndex","crosshairColor","routeLayer","styleBase","pixelTolerance","P","ZoomOutCircle","crosshairFeature","hLineFeature","vLineFeature","lineFeatures","crosshairRadius","crosshairStyle","lineStyle","crosshairLayer","linesLayer","throttleTime","mapExtents","timeField","timestamps","pointIdx","findNearestTimeIndex","crosshairPoint","crosshairPointCoords","lastIdx","probableIdx","dataLayers","DEFAULT_BASEMAP_CONFIG","defaultBaseLayer","serverLayerType","geomapLayerRegistry","getLayersSelection","registry","option","getLayersOptions","basemap","defaultMapViewConfig","TooltipMode","MapCenterID","applyLayerFilter","handler","panelDataProps","panelData","matcherFunc","updateLayer","panel","newOptions","layerIndex","group","initLayer","isBasemap","UID","Subject","getMapLayerState","getActions","selected","lyr","getLayersExtent","allLayers","lastOnly","ll","getLayerGroupExtent","feat","lg","setTooltipListeners","pointerClickListener","pointerMoveListener","mouse","hover","hoverPayload","layerLookup","found","centerPointRegistry","sharedView","GeomapPanel","div","ex","MouseWheelZoom","View","nextProps","prevProps","onOptionsChange","oldOptions","coord","adjustedZoom","Zoom","Attribution","legends","ttipOpen","showScale","PanelContext","DATA_TEST_ID","LayerDragDropList","getLayerInfo","onDragEnd","onSelect","onDuplicate","showActions","excludeBaseLayer","onNameChange","verifyLayerNameUniqueness","getRowStyle","isSelected","provided","snapshot","rows","lastLayerIndex","shouldRenderDragIconLengthThreshold","LayerName","LayersEditor","actions","dst","CoordinatesMapViewEditor","labelWidth","onLatitudeChange","latitude","onLongitudeChange","longitude","DataScopeValues","DataScopeLabels","DataScopeOptions","dataScopeOption","FitMapViewEditor","onSelectLayer","allLayersEditorFragment","onChangePadding","lastOnlyEditorFragment","currentDataScope","onDataScopeChange","dataScope","MapViewEditor","views","ids","onSetCurrentView","onSelectView","getLayerEditor","parent","lodash","layerTypes","FrameSelectionEditor","mapPanelChangedHandler","prevPluginId","prevOptions","prevFieldConfig","fieldConfig","xform","worldmapToGeomapOptions","angular","asNumber","reducer","fieldReducer","levels","strVale","mapCenters","mapMigrationHandler","pluginVersion","oldConfig","PanelPlugin","category","layersCategory","basemapCategory","baselayer","M"],"sourceRoot":""}
Submit
FILE
FOLDER
INFO
Name
Size
Permission
Action
static
---
0755
0.c88fc16b6533c8976681.js
11857 bytes
0644
0.c88fc16b6533c8976681.js.map
46011 bytes
0644
1118.6d1cbbd2070e00a7483d.js
9459 bytes
0644
1118.6d1cbbd2070e00a7483d.js.map
22012 bytes
0644
1121.6c31bf81768d3312b0d4.js
11557 bytes
0644
1121.6c31bf81768d3312b0d4.js.map
40274 bytes
0644
1122.1b3b5a9bdf4a2fc70a83.js
4310 bytes
0644
1122.1b3b5a9bdf4a2fc70a83.js.map
9301 bytes
0644
1133.cd705902767ed2e9bf55.js
107191 bytes
0644
1133.cd705902767ed2e9bf55.js.map
459177 bytes
0644
1216.ddb58ad09e0c4e3f4079.js
12860 bytes
0644
1216.ddb58ad09e0c4e3f4079.js.map
47906 bytes
0644
1282.2347f27d5b3a18a42a1e.js
2965 bytes
0644
1282.2347f27d5b3a18a42a1e.js.map
6699 bytes
0644
1345.8570fef914aafab94513.js
2223 bytes
0644
1345.8570fef914aafab94513.js.map
5201 bytes
0644
1347.8ad23b870a6e21306189.js
32035 bytes
0644
1347.8ad23b870a6e21306189.js.map
89851 bytes
0644
1420.f2553cafc235b7c32261.js
14576 bytes
0644
1420.f2553cafc235b7c32261.js.map
32839 bytes
0644
1438.897db349b7f48a15b9eb.js
2830 bytes
0644
1438.897db349b7f48a15b9eb.js.map
6911 bytes
0644
1446.babd36e7134aac1046c4.js
1832 bytes
0644
1446.babd36e7134aac1046c4.js.map
3282 bytes
0644
1488.ff35935a06f41b02b6cc.js
316 bytes
0644
1488.ff35935a06f41b02b6cc.js.map
1206 bytes
0644
1560.30962127c91e5eae9982.js
8916 bytes
0644
1560.30962127c91e5eae9982.js.map
20515 bytes
0644
1660.e1f66118fb028d12074f.js
21866 bytes
0644
1660.e1f66118fb028d12074f.js.map
71039 bytes
0644
1698.68ff1ef08e94a87836b3.js
12570 bytes
0644
1698.68ff1ef08e94a87836b3.js.map
46006 bytes
0644
1708.f42a783c0f6c7a317d49.js
2249 bytes
0644
1708.f42a783c0f6c7a317d49.js.map
2954 bytes
0644
1710.d96221051fceaf8c89dd.js
10172 bytes
0644
1710.d96221051fceaf8c89dd.js.map
22097 bytes
0644
1740.e57d920c47a11759ade4.js
6204 bytes
0644
1740.e57d920c47a11759ade4.js.map
13740 bytes
0644
1888.0ede69d3190c536744b9.js
6822 bytes
0644
1888.0ede69d3190c536744b9.js.map
15421 bytes
0644
1914.58113477b565d57e8bfe.js
10710 bytes
0644
1914.58113477b565d57e8bfe.js.map
23555 bytes
0644
198.b84c0e4f5759344ae05a.js
8267 bytes
0644
198.b84c0e4f5759344ae05a.js.map
19446 bytes
0644
205.6c51b5e35c8147226738.js
3542 bytes
0644
205.6c51b5e35c8147226738.js.map
8376 bytes
0644
2058.0e5df44647184aaf02e2.js
1252 bytes
0644
2058.0e5df44647184aaf02e2.js.map
4744 bytes
0644
2077.12b2df3682085a92a810.js
34133 bytes
0644
2077.12b2df3682085a92a810.js.map
122011 bytes
0644
2094.259625d8acf28b9c7361.js
16518 bytes
0644
2094.259625d8acf28b9c7361.js.map
41269 bytes
0644
21.afca69f2d336e287a655.js
6172 bytes
0644
21.afca69f2d336e287a655.js.map
17305 bytes
0644
2136.9c8dcd43d3af327f51f5.js
498667 bytes
0644
2136.9c8dcd43d3af327f51f5.js.map
1908011 bytes
0644
2228.cf629cf4a83c5b6c2671.js
269 bytes
0644
2228.cf629cf4a83c5b6c2671.js.map
457 bytes
0644
2244.9324c28eca7d2ffb7568.js
3396 bytes
0644
2244.9324c28eca7d2ffb7568.js.map
7683 bytes
0644
2261.ac6a26854d5acee00776.js
106373 bytes
0644
2261.ac6a26854d5acee00776.js.map
478562 bytes
0644
2278.bdd73b14b6337c6b14e4.js
5754 bytes
0644
2278.bdd73b14b6337c6b14e4.js.map
13399 bytes
0644
2398.3de0e7aa3057b7dcf9da.js
8016 bytes
0644
2398.3de0e7aa3057b7dcf9da.js.map
18383 bytes
0644
2514.c86950e9813e27962050.js
1983 bytes
0644
2514.c86950e9813e27962050.js.map
4863 bytes
0644
2571.345ecfd2b82551018f2e.js
162139 bytes
0644
2571.345ecfd2b82551018f2e.js.map
2046 bytes
0644
2586.972e9a7d564398afee76.js
6385 bytes
0644
2586.972e9a7d564398afee76.js.map
14676 bytes
0644
2658.f4100815829c4d37d35c.js
5432 bytes
0644
2658.f4100815829c4d37d35c.js.map
13650 bytes
0644
2686.2fbaa7db9c01d59cad8d.js
2815 bytes
0644
2686.2fbaa7db9c01d59cad8d.js.map
6564 bytes
0644
2692.20098ad0182743d98d62.js
2282 bytes
0644
2692.20098ad0182743d98d62.js.map
5680 bytes
0644
2694.a31d749361a36eb167da.js
2726 bytes
0644
2694.a31d749361a36eb167da.js.map
3618 bytes
0644
2745.2e5ec1fdf377d2940fb4.js
33584 bytes
0644
2745.2e5ec1fdf377d2940fb4.js.map
120277 bytes
0644
2962.4c3147d8ee365fe296ef.js
7640 bytes
0644
2962.4c3147d8ee365fe296ef.js.map
17621 bytes
0644
3042.248a4194805a8500fd28.js
19010 bytes
0644
3042.248a4194805a8500fd28.js.map
38148 bytes
0644
3062.4e9a427c2a59d53f902e.js
4663 bytes
0644
3062.4e9a427c2a59d53f902e.js.map
10650 bytes
0644
3082.c09cff56c35d736ee8b6.js
52872 bytes
0644
3082.c09cff56c35d736ee8b6.js.map
56822 bytes
0644
3096.8d41728a4f5010bc56a2.js
4378 bytes
0644
3096.8d41728a4f5010bc56a2.js.map
10739 bytes
0644
3098.f22ad6dab13d06477be0.js
31462 bytes
0644
3098.f22ad6dab13d06477be0.js.map
85588 bytes
0644
3182.1d531f28507c00e391fc.js
13817 bytes
0644
3182.1d531f28507c00e391fc.js.map
26653 bytes
0644
3407.666eb88a718e66b93f72.js
34425 bytes
0644
3407.666eb88a718e66b93f72.js.map
103716 bytes
0644
3418.d31d882b87bd5a2ef66f.js
33061 bytes
0644
3418.d31d882b87bd5a2ef66f.js.map
114234 bytes
0644
3541.8d063e3d43d55745d89b.js
20582 bytes
0644
3541.8d063e3d43d55745d89b.js.map
67154 bytes
0644
3543.eecef49ce94da5ee0418.js
136752 bytes
0644
3543.eecef49ce94da5ee0418.js.map
446118 bytes
0644
3622.976b1aef94b333e450b9.js
1260 bytes
0644
3622.976b1aef94b333e450b9.js.map
2819 bytes
0644
3686.102abfc00452299017bb.js
87 bytes
0644
3718.3993946b7a0eb8f64b4d.js
23620 bytes
0644
3718.3993946b7a0eb8f64b4d.js.map
92024 bytes
0644
3726.3adfe210678d2cd26969.js
31765 bytes
0644
3726.3adfe210678d2cd26969.js.map
118227 bytes
0644
398.4e93ffb675609ea7a9c6.js
2990 bytes
0644
398.4e93ffb675609ea7a9c6.js.map
7145 bytes
0644
4114.953b39a9ce57caa0e87a.js
2536 bytes
0644
4114.953b39a9ce57caa0e87a.js.map
6028 bytes
0644
4120.67bf5d203ed4a2eb5f1b.js
3229 bytes
0644
4120.67bf5d203ed4a2eb5f1b.js.map
7533 bytes
0644
4209.c7060d489834063658f5.js
17352 bytes
0644
4209.c7060d489834063658f5.js.map
30980 bytes
0644
4254.c5f4a5512b252e3a5796.js
71716 bytes
0644
4254.c5f4a5512b252e3a5796.js.map
237783 bytes
0644
4289.d5662b0904798ff437e9.js
16496 bytes
0644
4289.d5662b0904798ff437e9.js.map
32015 bytes
0644
4334.bc078c368a20ed3257b6.js
2598 bytes
0644
4334.bc078c368a20ed3257b6.js.map
6308 bytes
0644
4630.b604ea691184ba563d59.js
5585 bytes
0644
4630.b604ea691184ba563d59.js.map
11866 bytes
0644
4680.358dfdd92851f69ecc97.js
4573 bytes
0644
4680.358dfdd92851f69ecc97.js.map
10841 bytes
0644
4698.696713071ff5d9929a11.js
3682 bytes
0644
4698.696713071ff5d9929a11.js.map
8967 bytes
0644
4787.bd938ea7cb58d64ee246.js
738 bytes
0644
4787.bd938ea7cb58d64ee246.js.map
2168 bytes
0644
4839.17a10e0ceca3eb8954b4.js
39585 bytes
0644
4839.17a10e0ceca3eb8954b4.js.map
145699 bytes
0644
494.8cf705bc1ea509187c88.js
3796 bytes
0644
494.8cf705bc1ea509187c88.js.map
8987 bytes
0644
4958.cd447d877778fc5af081.js
4923 bytes
0644
4958.cd447d877778fc5af081.js.map
11000 bytes
0644
4962.0da526ad79f816a15985.js
2242 bytes
0644
4962.0da526ad79f816a15985.js.map
4978 bytes
0644
50.7b1e44d5b9dbbed566be.js
617497 bytes
0644
50.7b1e44d5b9dbbed566be.js.map
2271464 bytes
0644
5017.003cacead1bba1cba035.js
3567142 bytes
0644
5017.003cacead1bba1cba035.js.map
13214665 bytes
0644
5130.4d31108de97088a3b014.js
2850 bytes
0644
5130.4d31108de97088a3b014.js.map
6536 bytes
0644
5196.064b914693b6a5591a48.js
4035 bytes
0644
5196.064b914693b6a5591a48.js.map
10273 bytes
0644
5240.eceb5f73f807ac22d800.js
704 bytes
0644
5240.eceb5f73f807ac22d800.js.map
2618 bytes
0644
5277.ce6608b6f47246e32767.js
269 bytes
0644
5277.ce6608b6f47246e32767.js.map
457 bytes
0644
5280.4348c762594edebf7d0e.js
16657 bytes
0644
5280.4348c762594edebf7d0e.js.map
89146 bytes
0644
5356.eabc0dc2021a3814a65f.js
10156 bytes
0644
5356.eabc0dc2021a3814a65f.js.map
25249 bytes
0644
5358.7c5e9e1b192582f3082d.js
6173 bytes
0644
5358.7c5e9e1b192582f3082d.js.map
19652 bytes
0644
5364.ac21c32fd45a27bc998a.js
3070 bytes
0644
5364.ac21c32fd45a27bc998a.js.map
7368 bytes
0644
5398.d0c11aa7c1232f4afe44.js
81872 bytes
0644
5398.d0c11aa7c1232f4afe44.js.map
769414 bytes
0644
5428.e85b0800b30feca9d7dc.js
330175 bytes
0644
5428.e85b0800b30feca9d7dc.js.map
530929 bytes
0644
5511.93023985e5c5efe49ae2.js
21275 bytes
0644
5511.93023985e5c5efe49ae2.js.map
93188 bytes
0644
5550.9284e42acc3f2bbdfc9d.js
7039 bytes
0644
5550.9284e42acc3f2bbdfc9d.js.map
16382 bytes
0644
558.701e8b4db7b852c4a10d.js
12211 bytes
0644
558.701e8b4db7b852c4a10d.js.map
24505 bytes
0644
5618.638c32d58d896f3f7261.js
3348 bytes
0644
5618.638c32d58d896f3f7261.js.map
8181 bytes
0644
5648.cb3fd92dbbc06f7d45d2.js
57392 bytes
0644
5648.cb3fd92dbbc06f7d45d2.js.map
60585 bytes
0644
5786.db7abc3b8e4f474a8f7b.js
5325 bytes
0644
5786.db7abc3b8e4f474a8f7b.js.map
11885 bytes
0644
5807.f05d997ece5811bbc849.js
2922915 bytes
0644
5807.f05d997ece5811bbc849.js.map
10524334 bytes
0644
5950.30ec6aaa9dcece6c3b3c.js
4616249 bytes
0644
5950.30ec6aaa9dcece6c3b3c.js.map
19277501 bytes
0644
6018.f4de7ac19ac8f0c774e6.js
5861 bytes
0644
6018.f4de7ac19ac8f0c774e6.js.map
13314 bytes
0644
6029.0549a3fcb50e73c4b256.js
409895 bytes
0644
6029.0549a3fcb50e73c4b256.js.map
998408 bytes
0644
6185.883629fcc773b4968b24.js
2258 bytes
0644
6185.883629fcc773b4968b24.js.map
4788 bytes
0644
6263.e4ef9aaa3073ebacc3a5.js
54594 bytes
0644
6263.e4ef9aaa3073ebacc3a5.js.map
242030 bytes
0644
6302.257b2eb06c25ee74090e.js
8440 bytes
0644
6302.257b2eb06c25ee74090e.js.map
19322 bytes
0644
6359.f824c85233ec703f8cea.js
11411 bytes
0644
6359.f824c85233ec703f8cea.js.map
41881 bytes
0644
6377.45d36c143a694fc45bd3.js
20571 bytes
0644
6377.45d36c143a694fc45bd3.js.map
79590 bytes
0644
6378.27b1e6d863a0a3b85962.js
977993 bytes
0644
6378.27b1e6d863a0a3b85962.js.map
3865587 bytes
0644
6414.192cf271de6ecbbbcb11.js
3984 bytes
0644
6414.192cf271de6ecbbbcb11.js.map
9134 bytes
0644
6446.b4b93ee91aa1bb57ea93.js
7731 bytes
0644
6446.b4b93ee91aa1bb57ea93.js.map
17485 bytes
0644
6464.f379e014f9909e621de6.js
34429 bytes
0644
6464.f379e014f9909e621de6.js.map
113303 bytes
0644
6499.9f52e0855fd4782a8b45.js
78297 bytes
0644
6499.9f52e0855fd4782a8b45.js.map
273155 bytes
0644
6587.bfb1ca0c32c6f325b0df.js
135004 bytes
0644
6587.bfb1ca0c32c6f325b0df.js.map
541974 bytes
0644
660.838743295c2108f3492d.js
43101 bytes
0644
660.838743295c2108f3492d.js.map
100340 bytes
0644
6678.a615dbe07b8a3e591e66.js
14725 bytes
0644
6678.a615dbe07b8a3e591e66.js.map
51145 bytes
0644
680.1a328432fae403eacab3.js
53846 bytes
0644
680.1a328432fae403eacab3.js.map
57615 bytes
0644
6830.0c200fec1efc2be388e2.js
5811 bytes
0644
6830.0c200fec1efc2be388e2.js.map
13972 bytes
0644
6934.fa19d392db34411fb300.js
168944 bytes
0644
6934.fa19d392db34411fb300.js.map
540337 bytes
0644
6940.9c5d3a2dcf9d7d58fa2c.js
3408 bytes
0644
6940.9c5d3a2dcf9d7d58fa2c.js.map
8039 bytes
0644
6969.f8f153735314f9426000.js
1119 bytes
0644
6969.f8f153735314f9426000.js.map
4230 bytes
0644
6990.cc2f5674128929a3f870.js
4418 bytes
0644
6990.cc2f5674128929a3f870.js.map
10503 bytes
0644
7048.117de444b1e1cb5a1360.js
4365 bytes
0644
7048.117de444b1e1cb5a1360.js.map
10316 bytes
0644
7166.480da6892ee84ee8bb53.js
593985 bytes
0644
7166.480da6892ee84ee8bb53.js.map
2430098 bytes
0644
7200.dc60128b9d612fc7b5b0.js
3634 bytes
0644
7200.dc60128b9d612fc7b5b0.js.map
8184 bytes
0644
7246.3adf293a34fa2043387b.js
4306 bytes
0644
7246.3adf293a34fa2043387b.js.map
9084 bytes
0644
7400.024c96bd5b99b8b47a63.js
14112 bytes
0644
7400.024c96bd5b99b8b47a63.js.map
64001 bytes
0644
7409.24316c87d08c1053c46a.js
3287 bytes
0644
7409.24316c87d08c1053c46a.js.map
11649 bytes
0644
7455.845968885abe369e6479.js
19801 bytes
0644
7455.845968885abe369e6479.js.map
77213 bytes
0644
7466.09e6e197d2507f62097d.js
11670 bytes
0644
7466.09e6e197d2507f62097d.js.map
24830 bytes
0644
7515.95323f0dfbd0de010e5c.js
1083 bytes
0644
7515.95323f0dfbd0de010e5c.js.map
1321 bytes
0644
7613.6334cff4df12cc157522.js
808779 bytes
0644
7613.6334cff4df12cc157522.js.map
991378 bytes
0644
7836.6a7e4207e70fc2dc235f.js
7192 bytes
0644
7836.6a7e4207e70fc2dc235f.js.map
17613 bytes
0644
7882.1a3cc418752c83396970.js
3743 bytes
0644
7882.1a3cc418752c83396970.js.map
14950 bytes
0644
7886.485c46f14540aa23cf70.js
8668 bytes
0644
7886.485c46f14540aa23cf70.js.map
20124 bytes
0644
7914.2b1a06c504df18e20fe4.js
2390 bytes
0644
7914.2b1a06c504df18e20fe4.js.map
6418 bytes
0644
7982.6761217193d3060dbf0e.js
188973 bytes
0644
7982.6761217193d3060dbf0e.js.map
1737667 bytes
0644
8054.094788468423bb88ee68.js
38124 bytes
0644
8054.094788468423bb88ee68.js.map
132296 bytes
0644
8107.92bd414247a1d05c014f.js
5144 bytes
0644
8107.92bd414247a1d05c014f.js.map
15320 bytes
0644
8230.2eedae6021a4715c6dea.js
2413 bytes
0644
8230.2eedae6021a4715c6dea.js.map
5812 bytes
0644
8332.f4b05d2f028641445650.js
3177 bytes
0644
8332.f4b05d2f028641445650.js.map
7186 bytes
0644
8334.c95ec0eb6900c0cf7e89.js
7803 bytes
0644
8334.c95ec0eb6900c0cf7e89.js.map
17714 bytes
0644
8390.1fd9505094c8cf8830ab.js
2096 bytes
0644
8390.1fd9505094c8cf8830ab.js.map
5157 bytes
0644
84.a6f8658e6a033d642231.js
30608 bytes
0644
84.a6f8658e6a033d642231.js.map
142543 bytes
0644
8494.4470c87b7093ddf70db7.js
2180 bytes
0644
8494.4470c87b7093ddf70db7.js.map
4863 bytes
0644
8542.1391ab96a455b01963a7.js
1514 bytes
0644
8542.1391ab96a455b01963a7.js.map
3249 bytes
0644
8566.e05562713181c6ca30fe.js
3852 bytes
0644
8566.e05562713181c6ca30fe.js.map
8781 bytes
0644
8730.3dcdd8cbf22c63b45d78.js
2109 bytes
0644
8730.3dcdd8cbf22c63b45d78.js.map
2893 bytes
0644
8786.1b0e43b80c82c73e2096.js
1535 bytes
0644
8786.1b0e43b80c82c73e2096.js.map
4055 bytes
0644
8902.37d0b14aa6ef24687b7b.js
2673 bytes
0644
8902.37d0b14aa6ef24687b7b.js.map
5993 bytes
0644
8990.5a822b8788ebf0bdba81.js
3969 bytes
0644
8990.5a822b8788ebf0bdba81.js.map
9161 bytes
0644
9034.200fc7a09b466256c9a9.js
3486 bytes
0644
9034.200fc7a09b466256c9a9.js.map
8180 bytes
0644
9038.7ae2448b9cc5c423aeca.js
4937 bytes
0644
9038.7ae2448b9cc5c423aeca.js.map
11973 bytes
0644
9118.3121c6b96ec7dc211973.js
48311 bytes
0644
9118.3121c6b96ec7dc211973.js.map
62149 bytes
0644
9150.9eb62d45f9b21cb38850.js
10056 bytes
0644
9150.9eb62d45f9b21cb38850.js.map
21143 bytes
0644
9199.9897e268d6d13e834d4c.js
2307 bytes
0644
9199.9897e268d6d13e834d4c.js.map
8853 bytes
0644
9320.c403e78b78aa6df1d0bd.js
336139 bytes
0644
9320.c403e78b78aa6df1d0bd.js.map
1624993 bytes
0644
9355.421530b20c759bb75633.js
22098 bytes
0644
9355.421530b20c759bb75633.js.map
66961 bytes
0644
9384.a0d5fc49f1b15b3e311e.js
2855 bytes
0644
9384.a0d5fc49f1b15b3e311e.js.map
3717 bytes
0644
9390.fa2af7f3d3d9600c08ee.js
4201 bytes
0644
9390.fa2af7f3d3d9600c08ee.js.map
9682 bytes
0644
946.f2494c0c39a9590349b9.js
9194 bytes
0644
946.f2494c0c39a9590349b9.js.map
22193 bytes
0644
9510.4cfa85a51931dc20573a.js
2949 bytes
0644
9510.4cfa85a51931dc20573a.js.map
6939 bytes
0644
9521.de2a74ca5eb365810ca5.js
46306 bytes
0644
9521.de2a74ca5eb365810ca5.js.map
51040 bytes
0644
9538.996ade7a03ccdb01942d.js
64493 bytes
0644
9538.996ade7a03ccdb01942d.js.map
49212 bytes
0644
9569.a8d60b39654a160cb917.js
27965 bytes
0644
9569.a8d60b39654a160cb917.js.map
99160 bytes
0644
9643.b408884004ca73c102bc.js
627 bytes
0644
9643.b408884004ca73c102bc.js.map
2195 bytes
0644
968.22e079d28acb4131d34c.js
4001 bytes
0644
968.22e079d28acb4131d34c.js.map
9740 bytes
0644
970.a61e37b9b897c8098261.js
5239 bytes
0644
970.a61e37b9b897c8098261.js.map
13858 bytes
0644
9711.d6e977bd60f0e5ba673d.js
13555 bytes
0644
9711.d6e977bd60f0e5ba673d.js.map
43973 bytes
0644
9737.3340c89ea96d33307cc7.js
1001 bytes
0644
9737.3340c89ea96d33307cc7.js.map
3504 bytes
0644
9739.5a801055fcf72bf4d06f.js
1147 bytes
0644
9739.5a801055fcf72bf4d06f.js.map
4390 bytes
0644
9772.49e918c9331237552c0b.js
141 bytes
0644
9772.49e918c9331237552c0b.js.map
416 bytes
0644
9838.b8f01dc360f0c2151291.js
4003 bytes
0644
9838.b8f01dc360f0c2151291.js.map
8118 bytes
0644
AdminAuthentication.b7044adf53b669e61a87.js
22504 bytes
0644
AdminAuthentication.b7044adf53b669e61a87.js.map
67352 bytes
0644
AdminEditOrgPage.96fb6c37346641f44246.js
6369 bytes
0644
AdminEditOrgPage.96fb6c37346641f44246.js.map
20602 bytes
0644
AdminFeatureTogglesPage.22157fe31f358f1c4f09.js
4939 bytes
0644
AdminFeatureTogglesPage.22157fe31f358f1c4f09.js.map
16531 bytes
0644
AdminListOrgsPage.f01c8496fd635e20124b.js
2702 bytes
0644
AdminListOrgsPage.f01c8496fd635e20124b.js.map
7735 bytes
0644
AdminSettings.845c6def917892a0c1f9.js
1903 bytes
0644
AdminSettings.845c6def917892a0c1f9.js.map
5580 bytes
0644
AlertAmRoutes.10a0d9a23a082caf12c8.js
54554 bytes
0644
AlertAmRoutes.10a0d9a23a082caf12c8.js.map
208792 bytes
0644
AlertGroups.efd523dc41621f9f7935.js
10088 bytes
0644
AlertGroups.efd523dc41621f9f7935.js.map
39108 bytes
0644
AlertRuleListIndex.f0b17a6119cc5ea575ed.js
44623 bytes
0644
AlertRuleListIndex.f0b17a6119cc5ea575ed.js.map
156842 bytes
0644
AlertRuleListLegacy.8e675db4469232c87308.js
6270 bytes
0644
AlertRuleListLegacy.8e675db4469232c87308.js.map
18086 bytes
0644
AlertSilences.4ff252ad4c0057124d5d.js
24687 bytes
0644
AlertSilences.4ff252ad4c0057124d5d.js.map
83377 bytes
0644
AlertTabCtrl.d3377d127a336a69beb5.js
9844 bytes
0644
AlertTabCtrl.d3377d127a336a69beb5.js.map
27934 bytes
0644
AlertingAdmin.e62f9c73a69abe6a1ac0.js
10523 bytes
0644
AlertingAdmin.e62f9c73a69abe6a1ac0.js.map
37393 bytes
0644
AlertingFeatureTogglePage.f971bb7b2ad4ceb0acbd.js
672 bytes
0644
AlertingFeatureTogglePage.f971bb7b2ad4ceb0acbd.js.map
1220 bytes
0644
AlertingHome.0d6be993ef4a3df37345.js
33492 bytes
0644
AlertingHome.0d6be993ef4a3df37345.js.map
106868 bytes
0644
AlertingRedirectToRule.37a0040f89e20b99b751.js
3648 bytes
0644
AlertingRedirectToRule.37a0040f89e20b99b751.js.map
10875 bytes
0644
AlertingRuleForm.66bb5b2724b31ae6a5a4.js
79931 bytes
0644
AlertingRuleForm.66bb5b2724b31ae6a5a4.js.map
292923 bytes
0644
AlertingUpgrade.c757b99e306db50cdb16.js
31333 bytes
0644
AlertingUpgrade.c757b99e306db50cdb16.js.map
98330 bytes
0644
AngularApp.7e72879caebef22a5217.js
72809 bytes
0644
AngularApp.7e72879caebef22a5217.js.map
102853 bytes
0644
ApiKeysPage.12b0cd511f7b1e9c50dc.js
8422 bytes
0644
ApiKeysPage.12b0cd511f7b1e9c50dc.js.map
23375 bytes
0644
BenchmarksPage.3a183df3d44714f9a96a.js
2941 bytes
0644
BenchmarksPage.3a183df3d44714f9a96a.js.map
9749 bytes
0644
ChangePasswordPage.5e0562f6a9674bd95cfe.js
470 bytes
0644
ChangePasswordPage.5e0562f6a9674bd95cfe.js.map
1195 bytes
0644
Connections.b53c715b9b9a782d8647.js
32448 bytes
0644
Connections.b53c715b9b9a782d8647.js.map
112998 bytes
0644
CorrelationsFeatureToggle.71addced22f59948b708.js
674 bytes
0644
CorrelationsFeatureToggle.71addced22f59948b708.js.map
1149 bytes
0644
CorrelationsPage.4e02feddf752bdf7cfe6.js
22725 bytes
0644
CorrelationsPage.4e02feddf752bdf7cfe6.js.map
69262 bytes
0644
CreateTeam.dbde5b87278cf087cc5e.js
3046 bytes
0644
CreateTeam.dbde5b87278cf087cc5e.js.map
9594 bytes
0644
DashboardImport.06e6c4c03113061aae6c.js
18153 bytes
0644
DashboardImport.06e6c4c03113061aae6c.js.map
58242 bytes
0644
DashboardListPage.dac1fe75fbaa4f9b1c23.js
30967 bytes
0644
DashboardListPage.dac1fe75fbaa4f9b1c23.js.map
108517 bytes
0644
DashboardPage.5e50193556ad6b828f5d.js
2786 bytes
0644
DashboardPage.5e50193556ad6b828f5d.js.map
8754 bytes
0644
DashboardPageProxy.9a6d60e5cac89c11c71c.js
65136 bytes
0644
DashboardPageProxy.9a6d60e5cac89c11c71c.js.map
226791 bytes
0644
DataTrailsPage.aa19ca6750eb3f91ac5d.js
331 bytes
0644
DataTrailsPage.aa19ca6750eb3f91ac5d.js.map
582 bytes
0644
EditNotificationChannelLegacy.75122e6dbfb215d89d81.js
10507 bytes
0644
EditNotificationChannelLegacy.75122e6dbfb215d89d81.js.map
37444 bytes
0644
EmbeddedDashboard.3856404d3d608c739864.js
1768 bytes
0644
EmbeddedDashboard.3856404d3d608c739864.js.map
5917 bytes
0644
FolderAlerting.a0fe69e3574320c8a74a.js
9633 bytes
0644
FolderAlerting.a0fe69e3574320c8a74a.js.map
29985 bytes
0644
FolderLibraryPanelsPage.95dd7bf6735e202a79d2.js
8599 bytes
0644
FolderLibraryPanelsPage.95dd7bf6735e202a79d2.js.map
25919 bytes
0644
LibraryPanelsPage.4a952d4aa9c21984995a.js
2704 bytes
0644
LibraryPanelsPage.4a952d4aa9c21984995a.js.map
7623 bytes
0644
ListPublicDashboardPage.469a693c4011a5193fcd.js
4713 bytes
0644
ListPublicDashboardPage.469a693c4011a5193fcd.js.map
14309 bytes
0644
MuteTimings.cb66b37f52c9ee3ce1da.js
20855 bytes
0644
MuteTimings.cb66b37f52c9ee3ce1da.js.map
58932 bytes
0644
NewNotificationChannelLegacy.1d57814bc534bb1a3681.js
9785 bytes
0644
NewNotificationChannelLegacy.1d57814bc534bb1a3681.js.map
32951 bytes
0644
NewOrgPage.2bb0e1cab09f0cbd0310.js
1325 bytes
0644
NewOrgPage.2bb0e1cab09f0cbd0310.js.map
3158 bytes
0644
NotificationsListLegacyPage.33212668898a6db361a8.js
2547 bytes
0644
NotificationsListLegacyPage.33212668898a6db361a8.js.map
6671 bytes
0644
NotificationsListPage.1eb9cb05bf88eee08291.js
1620 bytes
0644
NotificationsListPage.1eb9cb05bf88eee08291.js.map
3378 bytes
0644
NotificationsPage.d26b90d7348139106351.js
4646 bytes
0644
NotificationsPage.d26b90d7348139106351.js.map
25381 bytes
0644
OrgDetailsPage.2d5c98f188683c2e1d3b.js
6742 bytes
0644
OrgDetailsPage.2d5c98f188683c2e1d3b.js.map
17850 bytes
0644
PlaylistEditPage.d14b3673a1bb03ca0dbb.js
6892 bytes
0644
PlaylistEditPage.d14b3673a1bb03ca0dbb.js.map
19989 bytes
0644
PlaylistNewPage.13696f39b95b8416ede2.js
6583 bytes
0644
PlaylistNewPage.13696f39b95b8416ede2.js.map
19084 bytes
0644
PlaylistPage.8f45dcc09add615f90e8.js
7895 bytes
0644
PlaylistPage.8f45dcc09add615f90e8.js.map
25502 bytes
0644
PlaylistStartPage.8be462b13a24cddee188.js
275 bytes
0644
PlaylistStartPage.8be462b13a24cddee188.js.map
698 bytes
0644
PluginListPage.815b65d32380d0a800f7.js
12167 bytes
0644
PluginListPage.815b65d32380d0a800f7.js.map
43537 bytes
0644
PluginPage.c790de5e17a0b728dd3a.js
314 bytes
0644
PluginPage.c790de5e17a0b728dd3a.js.map
668 bytes
0644
ProfileFeatureTogglePage.a14257ebc5da1e8c85e0.js
552 bytes
0644
ProfileFeatureTogglePage.a14257ebc5da1e8c85e0.js.map
1012 bytes
0644
PublicDashboardPage.51c7c24941781e091898.js
4295 bytes
0644
PublicDashboardPage.51c7c24941781e091898.js.map
14393 bytes
0644
SelectOrgPage.695c19a5101a3a03ee28.js
1124 bytes
0644
SelectOrgPage.695c19a5101a3a03ee28.js.map
2993 bytes
0644
SendResetMailPage.f16b7172a87070f57227.js
1736 bytes
0644
SendResetMailPage.f16b7172a87070f57227.js.map
4350 bytes
0644
ServerStats.3fbd2493deb8f4598755.js
3863 bytes
0644
ServerStats.3fbd2493deb8f4598755.js.map
11534 bytes
0644
ServiceAccountCreatePage.4f989fb6cd2a41193ff0.js
2440 bytes
0644
ServiceAccountCreatePage.4f989fb6cd2a41193ff0.js.map
7939 bytes
0644
ServiceAccountPage.bc7c35b63b03ccc89628.js
14806 bytes
0644
ServiceAccountPage.bc7c35b63b03ccc89628.js.map
51593 bytes
0644
ServiceAccountsPage.baaa08c045390c05e276.js
14565 bytes
0644
ServiceAccountsPage.baaa08c045390c05e276.js.map
46399 bytes
0644
SignupInvited.81ad56aceb8dd1839e15.js
2360 bytes
0644
SignupInvited.81ad56aceb8dd1839e15.js.map
6096 bytes
0644
SnapshotListPage.519c760ed66124a771ff.js
3061 bytes
0644
SnapshotListPage.519c760ed66124a771ff.js.map
9043 bytes
0644
SoloPanelPage.c729750a88c3fa90d1cc.js
3229 bytes
0644
SoloPanelPage.c729750a88c3fa90d1cc.js.map
12316 bytes
0644
SoloPanelPageOld.6518c21ccaf29701fa97.js
1727 bytes
0644
SoloPanelPageOld.6518c21ccaf29701fa97.js.map
5509 bytes
0644
StoragePage.9b93a99e75f7f2842c11.js
14081 bytes
0644
StoragePage.9b93a99e75f7f2842c11.js.map
48740 bytes
0644
SupportBundles.567d512b3f919b8112e4.js
3058 bytes
0644
SupportBundles.567d512b3f919b8112e4.js.map
8751 bytes
0644
SupportBundlesCreate.fc6b6e4cf6366f751081.js
2779 bytes
0644
SupportBundlesCreate.fc6b6e4cf6366f751081.js.map
8882 bytes
0644
TeamList.2e23d37c91734f608f09.js
9019 bytes
0644
TeamList.2e23d37c91734f608f09.js.map
30348 bytes
0644
TeamPages.4f6177b4c6ec769c72d8.js
22839 bytes
0644
TeamPages.4f6177b4c6ec769c72d8.js.map
66001 bytes
0644
TestStuffPage.8ddabdd17d265b771b17.js
2654 bytes
0644
TestStuffPage.8ddabdd17d265b771b17.js.map
8058 bytes
0644
UserCreatePage.72e86cf2c9a3ce50cff3.js
1470 bytes
0644
UserCreatePage.72e86cf2c9a3ce50cff3.js.map
3788 bytes
0644
UserInvitePage.c8243c9cee4b06e10222.js
2576 bytes
0644
UserInvitePage.c8243c9cee4b06e10222.js.map
6594 bytes
0644
UserListPage.acbb5778a782ca90c7ba.js
25463 bytes
0644
UserListPage.acbb5778a782ca90c7ba.js.map
79671 bytes
0644
UserProfileEditPage.7cc4c218d9e4664250e3.js
14593 bytes
0644
UserProfileEditPage.7cc4c218d9e4664250e3.js.map
42901 bytes
0644
UsersListPage.1b61c82d62ca416b6f2f.js
8800 bytes
0644
UsersListPage.1b61c82d62ca416b6f2f.js.map
30059 bytes
0644
alert-rules-drawer-content.1fd9de3b496d077a5f3a.js
957 bytes
0644
alert-rules-drawer-content.1fd9de3b496d077a5f3a.js.map
3199 bytes
0644
alert-rules-toolbar-button.6f275f0d03748b6c297d.js
1429 bytes
0644
alert-rules-toolbar-button.6f275f0d03748b6c297d.js.map
4041 bytes
0644
alertmanagerPlugin.d13ca72afb3f996bb284.js
3810 bytes
0644
alertmanagerPlugin.d13ca72afb3f996bb284.js.map
10753 bytes
0644
app.b11fde05d43f9632a473.js
920821 bytes
0644
app.b11fde05d43f9632a473.js.map
69088 bytes
0644
assets-manifest.json
280835 bytes
0644
azureMonitorPlugin.0bc37a9d4e3bd8421cc0.js
232 bytes
0644
azureMonitorPlugin.0bc37a9d4e3bd8421cc0.js.map
600 bytes
0644
brace.fcd4b1c7e8b9264ab02c.js
371235 bytes
0644
brace.fcd4b1c7e8b9264ab02c.js.map
1132097 bytes
0644
canvasPanel.a46aa5e57d26b1fcc380.js
485254 bytes
0644
canvasPanel.a46aa5e57d26b1fcc380.js.map
2136916 bytes
0644
cloudMonitoringPlugin.c6ea431eae8e9ad2c7b1.js
198 bytes
0644
cloudMonitoringPlugin.c6ea431eae8e9ad2c7b1.js.map
555 bytes
0644
cloudwatchPlugin.06ef34f60000c4f7ea37.js
192 bytes
0644
cloudwatchPlugin.06ef34f60000c4f7ea37.js.map
544 bytes
0644
dark.7fa24d1908c1c96e6fcc.js
134 bytes
0644
elasticsearchPlugin.3f2edb012f5162b48903.js
214 bytes
0644
elasticsearchPlugin.3f2edb012f5162b48903.js.map
583 bytes
0644
explore-feature-toggle-page.897d9f08c342ad4c0702.js
612 bytes
0644
explore-feature-toggle-page.897d9f08c342ad4c0702.js.map
1280 bytes
0644
explore.476912733278e2a99729.js
165810 bytes
0644
explore.476912733278e2a99729.js.map
579148 bytes
0644
geomapPanel.14b9605971a38c51d262.js
417078 bytes
0644
geomapPanel.14b9605971a38c51d262.js.map
540371 bytes
0644
grafana.dark.8c716fbcf630eae84ced.css
209089 bytes
0644
grafana.light.b8b3904788f25480f4a1.css
209047 bytes
0644
grafanaPlugin.1cb208185a89de28dc3a.js
8654 bytes
0644
grafanaPlugin.1cb208185a89de28dc3a.js.map
28174 bytes
0644
graphPlugin.f47f722cdfc0ceb85136.js
70277 bytes
0644
graphPlugin.f47f722cdfc0ceb85136.js.map
243430 bytes
0644
graphitePlugin.d59175976346917781fe.js
75305 bytes
0644
graphitePlugin.d59175976346917781fe.js.map
272016 bytes
0644
heatmapPanel.f6f29a53ed0f682b4404.js
37545 bytes
0644
heatmapPanel.f6f29a53ed0f682b4404.js.map
158066 bytes
0644
influxdbPlugin.140a7777089f9559c11c.js
68843 bytes
0644
influxdbPlugin.140a7777089f9559c11c.js.map
265085 bytes
0644
jaegerPlugin.d254fd4a19ef0cb5b4f5.js
19727 bytes
0644
jaegerPlugin.d254fd4a19ef0cb5b4f5.js.map
65603 bytes
0644
light.af65e5ce03b9ed0aa2b1.js
134 bytes
0644
loki-query-field.a588d587d9d762b18f22.js
191 bytes
0644
loki-query-field.a588d587d9d762b18f22.js.map
548 bytes
0644
lokiPlugin.77364509de280321b6f8.js
185 bytes
0644
lokiPlugin.77364509de280321b6f8.js.map
536 bytes
0644
mixedPlugin.f36bd557a883d9a67538.js
180 bytes
0644
mssqlPlugin.88775f59ced74c2283c5.js
20457 bytes
0644
mssqlPlugin.88775f59ced74c2283c5.js.map
61420 bytes
0644
mysqlPlugin.72fb44411afd8165d201.js
17323 bytes
0644
mysqlPlugin.72fb44411afd8165d201.js.map
45415 bytes
0644
nodeGraphPanel.9a7cdd8efdae281cbe28.js
2107 bytes
0644
nodeGraphPanel.9a7cdd8efdae281cbe28.js.map
7132 bytes
0644
opentsdbPlugin.418b8c8ea0d97ed99edb.js
22866 bytes
0644
opentsdbPlugin.418b8c8ea0d97ed99edb.js.map
82180 bytes
0644
parcaPlugin.7f2e6dde7161b08ceed2.js
11184 bytes
0644
parcaPlugin.7f2e6dde7161b08ceed2.js.map
42340 bytes
0644
postgresPlugin.f88c598bae2653ae177b.js
18902 bytes
0644
postgresPlugin.f88c598bae2653ae177b.js.map
54304 bytes
0644
prom-query-field.ff217c474ea457bdd65e.js
14104 bytes
0644
prom-query-field.ff217c474ea457bdd65e.js.map
76811 bytes
0644
prometheusPlugin.2ba02c28d3f7293e903e.js
224 bytes
0644
prometheusPlugin.2ba02c28d3f7293e903e.js.map
699 bytes
0644
pyroscopePlugin.eb14b78419d619d90dca.js
22269 bytes
0644
pyroscopePlugin.eb14b78419d619d90dca.js.map
86896 bytes
0644
react-monaco-editor.988b1aa5e90b11f9941a.js
15759 bytes
0644
react-monaco-editor.988b1aa5e90b11f9941a.js.map
51544 bytes
0644
runtime.4b7e1b5735d2ed64b824.js
13640 bytes
0644
runtime.4b7e1b5735d2ed64b824.js.map
35122 bytes
0644
tableOldPlugin.8c72b8399d197aeebe16.js
25242 bytes
0644
tableOldPlugin.8c72b8399d197aeebe16.js.map
80497 bytes
0644
tempoPlugin.efa8c2a55984263b4b61.js
182 bytes
0644
tempoPlugin.efa8c2a55984263b4b61.js.map
529 bytes
0644
testDataDSPlugin.9717509b124d754e4f35.js
120550 bytes
0644
testDataDSPlugin.9717509b124d754e4f35.js.map
303302 bytes
0644
visjs-network.d93b3aa71ac24c8cde84.js
459653 bytes
0644
visjs-network.d93b3aa71ac24c8cde84.js.map
1951742 bytes
0644
zipkinPlugin.70f0f24b6d0b6e673ccb.js
13172 bytes
0644
zipkinPlugin.70f0f24b6d0b6e673ccb.js.map
46861 bytes
0644
N4ST4R_ID | Naxtarrr