{"version":3,"file":"canvasMarker.mjs","sources":["../../../../../packages/sdk/plugins/canvasMarker.ts"],"sourcesContent":["import L from 'leaflet'\nimport rbush from 'rbush'\n\nconst CanvasIconLayer = (L.Layer ? L.Layer : L.Class).extend({\n  //Add event listeners to initialized section.\n  initialize(options: any) {\n    L.setOptions(this, options)\n    this._onClickListeners = []\n    this._onHoverListeners = []\n  },\n\n  setOptions(options: any) {\n    L.setOptions(this, options)\n    return this.redraw()\n  },\n\n  redraw() {\n    this._redraw(true)\n  },\n\n  //Multiple layers at a time for rBush performance\n  addMarkers(markers: any[]) {\n    const tmpMark: any[] = []\n    const tmpLatLng: any[] = []\n\n    markers.forEach(\n      (marker: {\n        options: { pane: string; icon: any }\n        getLatLng: () => any\n      }) => {\n        if (!(marker.options.pane == 'markerPane' && marker.options.icon)) {\n          console.error(\"Layer isn't a marker\")\n          return\n        }\n\n        const latlng = marker.getLatLng()\n        const isDisplaying = this._map.getBounds().contains(latlng)\n        const s = this._addMarker(marker, latlng, isDisplaying)\n\n        //Only add to Point Lookup if we are on map\n        if (isDisplaying === true) tmpMark.push(s[0])\n\n        tmpLatLng.push(s[1])\n      }\n    )\n\n    this._markers.load(tmpMark)\n    this._latlngMarkers.load(tmpLatLng)\n  },\n\n  //Adds single layer at a time. Less efficient for rBush\n  addMarker(marker: { getLatLng: () => any }) {\n    const latlng = marker.getLatLng()\n    const isDisplaying = this._map.getBounds().contains(latlng)\n    const dat = this._addMarker(marker, latlng, isDisplaying)\n\n    //Only add to Point Lookup if we are on map\n    if (isDisplaying === true) this._markers.insert(dat[0])\n\n    this._latlngMarkers.insert(dat[1])\n  },\n\n  addLayer(layer: { options: { pane: string; icon: any } }) {\n    if (layer.options.pane == 'markerPane' && layer.options.icon)\n      this.addMarker(layer)\n    else console.error(\"Layer isn't a marker\")\n  },\n\n  addLayers(layers: any) {\n    this.addMarkers(layers)\n  },\n\n  removeLayer(layer: any) {\n    this.removeMarker(layer, true)\n  },\n\n  removeMarker(\n    marker: { [x: string]: any; data: any; getLatLng: () => any },\n    redraw: boolean\n  ) {\n    //If we are removed point\n    if (marker['minX']) marker = marker.data\n\n    const latlng = marker.getLatLng()\n    const isDisplaying = this._map.getBounds().contains(latlng)\n\n    const markerData = {\n      minX: latlng.lng,\n      minY: latlng.lat,\n      maxX: latlng.lng,\n      maxY: latlng.lat,\n      data: marker,\n    }\n\n    this._latlngMarkers.remove(\n      markerData,\n      (\n        a: { data: { _leaflet_id: any } },\n        b: { data: { _leaflet_id: any } }\n      ) => {\n        return a.data._leaflet_id === b.data._leaflet_id\n      }\n    )\n\n    this._latlngMarkers.total--\n    this._latlngMarkers.dirty++\n\n    if (isDisplaying === true && redraw === true) {\n      this._redraw(true)\n    }\n  },\n\n  onAdd(map: {\n    _panes: { overlayPane: { appendChild: (arg0: any) => void } }\n    on: (arg0: string, arg1: any, arg2: any) => void\n  }) {\n    this._map = map\n\n    if (!this._canvas) this._initCanvas()\n\n    if (this.options.pane) this.getPane().appendChild(this._canvas)\n    else map._panes.overlayPane.appendChild(this._canvas)\n\n    map.on('moveend', this._reset, this)\n    map.on('resize', this._reset, this)\n\n    map.on('click', this._executeListeners, this)\n    map.on('mousemove', this._executeListeners, this)\n  },\n\n  onRemove(map: {\n    getPanes: () => {\n      (): any\n      new (): any\n      overlayPane: {\n        (): any\n        new (): any\n        removeChild: { (arg0: any): void; new (): any }\n      }\n    }\n    off: (arg0: string, arg1: any, arg2: any) => void\n  }) {\n    if (this.options.pane) this.getPane().removeChild(this._canvas)\n    else map.getPanes().overlayPane.removeChild(this._canvas)\n\n    map.off('click', this._executeListeners, this)\n    map.off('mousemove', this._executeListeners, this)\n\n    map.off('moveend', this._reset, this)\n    map.off('resize', this._reset, this)\n  },\n\n  addTo(map: { addLayer: (arg0: any) => void }) {\n    map.addLayer(this)\n    return this\n  },\n\n  clearLayers() {\n    this._latlngMarkers = null\n    this._markers = null\n    this._redraw(true)\n  },\n\n  _addMarker(\n    marker: { _map: any; options: { icon: { options: { iconSize: any } } } },\n    latlng: { lng: any; lat: any },\n    isDisplaying: boolean\n  ) {\n    //Needed for pop-up & tooltip to work.\n    marker._map = this._map\n\n    //_markers contains Points of markers currently displaying on map\n    if (!this._markers) this._markers = new rbush()\n\n    //_latlngMarkers contains Lat\\Long coordinates of all markers in layer.\n    if (!this._latlngMarkers) {\n      this._latlngMarkers = new rbush()\n      this._latlngMarkers.dirty = 0\n      this._latlngMarkers.total = 0\n    }\n\n    L.Util.stamp(marker)\n\n    const pointPos = this._map.latLngToContainerPoint(latlng)\n    const iconSize = marker.options.icon.options.iconSize\n\n    const adjX = iconSize[0] / 2\n    const adjY = iconSize[1] / 2\n    const ret = [\n      {\n        minX: pointPos.x - adjX,\n        minY: pointPos.y - adjY,\n        maxX: pointPos.x + adjX,\n        maxY: pointPos.y + adjY,\n        data: marker,\n      },\n      {\n        minX: latlng.lng,\n        minY: latlng.lat,\n        maxX: latlng.lng,\n        maxY: latlng.lat,\n        data: marker,\n      },\n    ]\n\n    this._latlngMarkers.dirty++\n    this._latlngMarkers.total++\n\n    //Only draw if we are on map\n    if (isDisplaying === true) this._drawMarker(marker, pointPos)\n\n    return ret\n  },\n\n  _drawMarker(\n    marker: {\n      getLatLng: () => any\n      options: { icon: { options: { iconUrl: any } } }\n      canvas_img: HTMLImageElement\n    },\n    pointPos: any\n  ) {\n    if (!this._imageLookup) this._imageLookup = {}\n    if (!pointPos) {\n      pointPos = this._map.latLngToContainerPoint(marker.getLatLng())\n    }\n\n    const iconUrl = marker.options.icon.options.iconUrl\n\n    if (marker.canvas_img) {\n      this._drawImage(marker, pointPos)\n    } else {\n      if (this._imageLookup[iconUrl]) {\n        marker.canvas_img = this._imageLookup[iconUrl][0]\n\n        if (this._imageLookup[iconUrl][1] === false) {\n          this._imageLookup[iconUrl][2].push([marker, pointPos])\n        } else {\n          this._drawImage(marker, pointPos)\n        }\n      } else {\n        const i = new Image()\n        i.src = iconUrl\n        marker.canvas_img = i\n\n        //Image,isLoaded,marker\\pointPos ref\n        this._imageLookup[iconUrl] = [i, false, [[marker, pointPos]]]\n\n        i.onload = () => {\n          this._imageLookup[iconUrl][1] = true\n          this._imageLookup[iconUrl][2].forEach((e: any[]) => {\n            this._drawImage(e[0], e[1])\n          })\n        }\n      }\n    }\n  },\n\n  _drawImage(\n    marker: { options: { icon: { options: any } }; canvas_img: any },\n    pointPos: { x: number; y: number }\n  ) {\n    const options = marker.options.icon.options\n\n    this._context.drawImage(\n      marker.canvas_img,\n      pointPos.x - options.iconAnchor[0],\n      pointPos.y - options.iconAnchor[1],\n      options.iconSize[0],\n      options.iconSize[1]\n    )\n  },\n\n  _reset() {\n    const topLeft = this._map.containerPointToLayerPoint([0, 0])\n    L.DomUtil.setPosition(this._canvas, topLeft)\n\n    const size = this._map.getSize()\n\n    this._canvas.width = size.x\n    this._canvas.height = size.y\n\n    this._redraw()\n  },\n\n  _redraw(clear: any) {\n    if (clear)\n      this._context.clearRect(0, 0, this._canvas.width, this._canvas.height)\n    if (!this._map || !this._latlngMarkers) return\n\n    let tmp: { minX: number; minY: number; maxX: any; maxY: any; data: any }[] =\n      []\n\n    //If we are 10% individual inserts\\removals, reconstruct lookup for efficiency\n    if (this._latlngMarkers.dirty / this._latlngMarkers.total >= 0.1) {\n      this._latlngMarkers.all().forEach((e: any) => {\n        tmp.push(e)\n      })\n\n      this._latlngMarkers.clear()\n      this._latlngMarkers.load(tmp)\n      this._latlngMarkers.dirty = 0\n      tmp = []\n    }\n\n    const mapBounds = this._map.getBounds()\n\n    //Only re-draw what we are showing on the map.\n\n    const mapBoxCoords = {\n      minX: mapBounds.getWest(),\n      minY: mapBounds.getSouth(),\n      maxX: mapBounds.getEast(),\n      maxY: mapBounds.getNorth(),\n    }\n\n    this._latlngMarkers.search(mapBoxCoords).forEach(\n      (e: {\n        data: {\n          getLatLng: () => any\n          options: { icon: { options: { iconSize: any } } }\n        }\n      }) => {\n        //Readjust Point Map\n        const pointPos = this._map.latLngToContainerPoint(e.data.getLatLng())\n\n        const iconSize = e.data.options.icon.options.iconSize\n        const adjX = iconSize[0] / 2\n        const adjY = iconSize[1] / 2\n\n        const newCoords = {\n          minX: pointPos.x - adjX,\n          minY: pointPos.y - adjY,\n          maxX: pointPos.x + adjX,\n          maxY: pointPos.y + adjY,\n          data: e.data,\n        }\n\n        tmp.push(newCoords)\n\n        //Redraw points\n        this._drawMarker(e.data, pointPos)\n      }\n    )\n\n    //Clear rBush & Bulk Load for performance\n    this._markers.clear()\n    this._markers.load(tmp)\n  },\n\n  _initCanvas() {\n    this._canvas = L.DomUtil.create(\n      'canvas',\n      'leaflet-canvas-icon-layer leaflet-layer'\n    )\n    const originProp = L.DomUtil.testProp([\n      'transformOrigin',\n      'WebkitTransformOrigin',\n      'msTransformOrigin',\n    ]) as any\n    this._canvas.style[originProp] = '50% 50%'\n\n    const size = this._map.getSize()\n    this._canvas.width = size.x\n    this._canvas.height = size.y\n\n    this._context = this._canvas.getContext('2d')\n\n    const animated = this._map.options.zoomAnimation && L.Browser.any3d\n    L.DomUtil.addClass(\n      this._canvas,\n      `leaflet-zoom-${animated ? 'animated' : 'hide'}`\n    )\n  },\n\n  addOnClickListener(listener: any) {\n    this._onClickListeners.push(listener)\n  },\n\n  addOnHoverListener(listener: any) {\n    this._onHoverListeners.push(listener)\n  },\n\n  _executeListeners(event: {\n    containerPoint: { x: any; y: any }\n    type: string\n  }) {\n    if (!this._markers) return\n\n    const x = event.containerPoint.x\n    const y = event.containerPoint.y\n\n    if (this._openToolTip) {\n      this._openToolTip.closeTooltip()\n      delete this._openToolTip\n    }\n\n    const ret = this._markers.search({ minX: x, minY: y, maxX: x, maxY: y })\n\n    if (ret && ret.length > 0) {\n      this._map._container.style.cursor = 'pointer'\n\n      if (event.type === 'click') {\n        const hasPopup = ret[0].data.getPopup()\n        if (hasPopup) ret[0].data.openPopup()\n\n        this._onClickListeners.forEach(\n          (listener: (arg0: any, arg1: any) => void) => {\n            listener(event, ret)\n          }\n        )\n      }\n\n      if (event.type === 'mousemove') {\n        const hasTooltip = ret[0].data.getTooltip()\n        if (hasTooltip) {\n          this._openToolTip = ret[0].data\n          ret[0].data.openTooltip()\n        }\n\n        this._onHoverListeners.forEach(\n          (listener: (arg0: any, arg1: any) => void) => {\n            listener(event, ret)\n          }\n        )\n      }\n    } else {\n      this._map._container.style.cursor = ''\n    }\n  },\n})\n\nconst canvasIconLayer = (options?: any) => new (CanvasIconLayer as any)(options)\n\nexport { CanvasIconLayer, canvasIconLayer }\n"],"names":["_","o","Layer","Class","extend","initialize","t","setOptions","this","_onClickListeners","_onHoverListeners","redraw","_redraw","addMarkers","a","n","forEach","i","options","pane","icon","s","getLatLng","e","_map","getBounds","contains","r","_addMarker","push","_markers","load","_latlngMarkers","addMarker","insert","addLayer","addLayers","removeLayer","removeMarker","minX","data","lng","minY","lat","maxX","maxY","remove","_leaflet_id","total","dirty","onAdd","_canvas","_initCanvas","getPane","appendChild","_panes","overlayPane","on","_reset","_executeListeners","onRemove","removeChild","getPanes","off","addTo","clearLayers","c","Util","stamp","latLngToContainerPoint","iconSize","h","x","y","_drawMarker","_imageLookup","iconUrl","canvas_img","_drawImage","Image","src","onload","_context","drawImage","iconAnchor","containerPointToLayerPoint","DomUtil","setPosition","getSize","width","height","clearRect","all","clear","getWest","getSouth","getEast","getNorth","search","l","d","create","testProp","style","getContext","zoomAnimation","Browser","any3d","addClass","addOnClickListener","addOnHoverListener","containerPoint","_openToolTip","closeTooltip","length","_container","cursor","type","getPopup","openPopup","getTooltip","openTooltip","g"],"mappings":"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"}