@react-google-maps/marker-clusterer 2.19.0 → 2.19.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/Clusterer.d.ts +23 -2
- package/dist/cjs.js +29 -3
- package/dist/cjs.js.map +1 -1
- package/dist/cjs.min.js +1 -1
- package/dist/cjs.min.js.map +1 -1
- package/dist/esm.js +29 -3
- package/dist/esm.js.map +1 -1
- package/dist/esm.min.js +1 -1
- package/dist/esm.min.js.map +1 -1
- package/dist/index.d.ts +23 -2
- package/dist/umd.js +29 -3
- package/dist/umd.js.map +1 -1
- package/dist/umd.min.js +1 -1
- package/dist/umd.min.js.map +1 -1
- package/package.json +1 -1
- package/src/Clusterer.tsx +50 -13
package/dist/cjs.min.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cjs.min.js","sources":["../src/ClusterIcon.tsx","../src/Cluster.tsx","../src/Clusterer.tsx"],"sourcesContent":["/* global google */\n/* eslint-disable filenames/match-regex */\nimport type { Cluster } from './Cluster'\n\nimport type { ClusterIconStyle, ClusterIconInfo } from './types'\n\nexport class ClusterIcon {\n cluster: Cluster\n className: string\n clusterClassName: string\n styles: ClusterIconStyle[]\n center: google.maps.LatLng | undefined\n div: HTMLDivElement | null\n sums: ClusterIconInfo | null\n visible: boolean\n url: string\n height: number\n width: number\n anchorText: [number, number]\n anchorIcon: [number, number]\n textColor: string\n textSize: number\n textDecoration: string\n fontWeight: string\n fontStyle: string\n fontFamily: string\n backgroundPosition: string\n cMouseDownInCluster: boolean | null\n cDraggingMapByCluster: boolean | null\n timeOut: number | null\n\n boundsChangedListener: google.maps.MapsEventListener | null\n\n constructor(cluster: Cluster, styles: ClusterIconStyle[]) {\n cluster.getClusterer().extend(ClusterIcon, google.maps.OverlayView)\n\n this.cluster = cluster\n\n this.clusterClassName = this.cluster.getClusterer().getClusterClass()\n\n this.className = this.clusterClassName\n\n this.styles = styles\n\n this.center = undefined\n\n this.div = null\n\n this.sums = null\n\n this.visible = false\n\n this.boundsChangedListener = null\n\n this.url = ''\n\n this.height = 0\n this.width = 0\n\n this.anchorText = [0, 0]\n this.anchorIcon = [0, 0]\n\n this.textColor = 'black'\n this.textSize = 11\n this.textDecoration = 'none'\n this.fontWeight = 'bold'\n this.fontStyle = 'normal'\n this.fontFamily = 'Arial,sans-serif'\n\n this.backgroundPosition = '0 0'\n\n this.cMouseDownInCluster = null\n this.cDraggingMapByCluster = null\n this.timeOut = null;\n\n (this as unknown as google.maps.OverlayView).setMap(cluster.getMap()) // Note: this causes onAdd to be called\n\n this.onBoundsChanged = this.onBoundsChanged.bind(this)\n this.onMouseDown = this.onMouseDown.bind(this)\n this.onClick = this.onClick.bind(this)\n this.onMouseOver = this.onMouseOver.bind(this)\n this.onMouseOut = this.onMouseOut.bind(this)\n this.onAdd = this.onAdd.bind(this)\n this.onRemove = this.onRemove.bind(this)\n this.draw = this.draw.bind(this)\n this.hide = this.hide.bind(this)\n this.show = this.show.bind(this)\n this.useStyle = this.useStyle.bind(this)\n this.setCenter = this.setCenter.bind(this)\n this.getPosFromLatLng = this.getPosFromLatLng.bind(this)\n }\n\n onBoundsChanged() {\n this.cDraggingMapByCluster = this.cMouseDownInCluster\n }\n\n onMouseDown() {\n this.cMouseDownInCluster = true\n\n this.cDraggingMapByCluster = false\n }\n\n onClick(event: Event) {\n this.cMouseDownInCluster = false\n\n if (!this.cDraggingMapByCluster) {\n const markerClusterer = this.cluster.getClusterer()\n\n /**\n * This event is fired when a cluster marker is clicked.\n * @name MarkerClusterer#click\n * @param {Cluster} c The cluster that was clicked.\n * @event\n */\n google.maps.event.trigger(markerClusterer, 'click', this.cluster)\n google.maps.event.trigger(markerClusterer, 'clusterclick', this.cluster) // deprecated name\n\n // The default click handler follows. Disable it by setting\n // the zoomOnClick property to false.\n if (markerClusterer.getZoomOnClick()) {\n // Zoom into the cluster.\n const maxZoom = markerClusterer.getMaxZoom()\n\n const bounds = this.cluster.getBounds()\n\n const map = (markerClusterer as unknown as google.maps.OverlayView).getMap()\n\n if (map !== null && 'fitBounds' in map) {\n map.fitBounds(bounds)\n }\n\n\n // There is a fix for Issue 170 here:\n this.timeOut = window.setTimeout(() => {\n const map = (markerClusterer as unknown as google.maps.OverlayView).getMap()\n\n if (map !== null) {\n if ('fitBounds' in map) {\n map.fitBounds(bounds)\n }\n\n const zoom = map.getZoom() || 0\n\n // Don't zoom beyond the max zoom level\n if (\n maxZoom !== null &&\n zoom > maxZoom\n ) {\n map.setZoom(maxZoom + 1)\n }\n }\n }, 100)\n }\n\n // Prevent event propagation to the map:\n event.cancelBubble = true\n\n if (event.stopPropagation) {\n event.stopPropagation()\n }\n }\n }\n\n onMouseOver() {\n /**\n * This event is fired when the mouse moves over a cluster marker.\n * @name MarkerClusterer#mouseover\n * @param {Cluster} c The cluster that the mouse moved over.\n * @event\n */\n google.maps.event.trigger(\n this.cluster.getClusterer(),\n 'mouseover',\n this.cluster\n )\n }\n\n onMouseOut() {\n /**\n * This event is fired when the mouse moves out of a cluster marker.\n * @name MarkerClusterer#mouseout\n * @param {Cluster} c The cluster that the mouse moved out of.\n * @event\n */\n google.maps.event.trigger(\n this.cluster.getClusterer(),\n 'mouseout',\n this.cluster\n )\n }\n\n onAdd() {\n this.div = document.createElement('div')\n\n this.div.className = this.className\n\n if (this.visible) {\n this.show()\n }\n\n ;(this as unknown as google.maps.OverlayView).getPanes()?.overlayMouseTarget.appendChild(this.div)\n\n const map = (this as unknown as google.maps.OverlayView).getMap()\n\n if (map !== null) {\n // Fix for Issue 157\n this.boundsChangedListener = google.maps.event.addListener(\n map,\n 'bounds_changed',\n this.onBoundsChanged\n )\n\n this.div.addEventListener('mousedown', this.onMouseDown)\n\n this.div.addEventListener('click', this.onClick)\n\n this.div.addEventListener('mouseover', this.onMouseOver)\n\n this.div.addEventListener('mouseout', this.onMouseOut)\n }\n }\n\n onRemove() {\n if (this.div && this.div.parentNode) {\n this.hide()\n\n if (this.boundsChangedListener !== null) {\n google.maps.event.removeListener(this.boundsChangedListener)\n }\n\n this.div.removeEventListener('mousedown', this.onMouseDown)\n\n this.div.removeEventListener('click', this.onClick)\n\n this.div.removeEventListener('mouseover', this.onMouseOver)\n\n this.div.removeEventListener('mouseout', this.onMouseOut)\n\n this.div.parentNode.removeChild(this.div)\n\n if (this.timeOut !== null) {\n window.clearTimeout(this.timeOut)\n\n this.timeOut = null\n }\n\n this.div = null\n }\n }\n\n draw() {\n if (this.visible && this.div !== null && this.center) {\n const pos = this.getPosFromLatLng(this.center)\n\n this.div.style.top = pos !== null ? `${pos.y}px` : '0'\n this.div.style.left = pos !== null ? `${pos.x}px` : '0'\n }\n }\n\n hide() {\n if (this.div) {\n this.div.style.display = 'none'\n }\n\n this.visible = false\n }\n\n show() {\n if (this.div && this.center) {\n const divTitle = this.sums === null ||\n typeof this.sums.title === 'undefined' ||\n this.sums.title === '' ? this.cluster.getClusterer().getTitle() : this.sums.title\n\n // NOTE: values must be specified in px units\n const bp = this.backgroundPosition.split(' ')\n\n const spriteH = parseInt(bp[0]?.replace(/^\\s+|\\s+$/g, '') || '0', 10)\n const spriteV = parseInt(bp[1]?.replace(/^\\s+|\\s+$/g, '') || '0', 10)\n\n const pos = this.getPosFromLatLng(this.center)\n\n this.div.className = this.className\n this.div .setAttribute('style', `cursor: pointer; position: absolute; top: ${pos !== null ? `${pos.y}px` : '0'}; left: ${pos !== null ? `${pos.x}px` : '0'}; width: ${this.width}px; height: ${this.height}px; `)\n\n const img = document.createElement('img')\n\n img.alt = divTitle\n img.src = this.url\n img.width = this.width\n img.height = this.height\n img.setAttribute('style', `position: absolute; top: ${spriteV}px; left: ${spriteH}px`)\n\n if (!this.cluster.getClusterer().enableRetinaIcons) {\n img.style.clip = `rect(-${spriteV}px, -${spriteH + this.width}px, -${\n spriteV + this.height\n }, -${spriteH})`\n }\n\n const textElm = document.createElement('div')\n\n textElm .setAttribute('style', `position: absolute; top: ${this.anchorText[0]}px; left: ${this.anchorText[1]}px; color: ${this.textColor}; font-size: ${this.textSize}px; font-family: ${this.fontFamily}; font-weight: ${this.fontWeight}; fontStyle: ${this.fontStyle}; text-decoration: ${this.textDecoration}; text-align: center; width: ${this.width}px; line-height: ${this.height}px`)\n\n if (this.sums?.text) textElm.innerText = `${this.sums?.text}`\n if (this.sums?.html) textElm.innerHTML = `${this.sums?.html}`\n\n this.div.innerHTML = ''\n\n this.div.appendChild(img)\n this.div.appendChild(textElm)\n\n this.div.title = divTitle\n\n this.div.style.display = ''\n }\n\n this.visible = true\n }\n\n useStyle(sums: ClusterIconInfo) {\n this.sums = sums\n\n const styles = this.cluster.getClusterer().getStyles()\n\n const style =\n styles[Math.min(styles.length - 1, Math.max(0, sums.index - 1))]\n\n if (style) {\n this.url = style.url\n this.height = style.height\n this.width = style.width\n\n if (style.className) {\n this.className = `${this.clusterClassName} ${style.className}`\n }\n\n this.anchorText = style.anchorText || [0, 0]\n this.anchorIcon = style.anchorIcon || [this.height / 2, this.width / 2]\n\n this.textColor = style.textColor || 'black'\n\n this.textSize = style.textSize || 11\n\n this.textDecoration = style.textDecoration || 'none'\n\n this.fontWeight = style.fontWeight || 'bold'\n\n this.fontStyle = style.fontStyle || 'normal'\n\n this.fontFamily = style.fontFamily || 'Arial,sans-serif'\n\n this.backgroundPosition = style.backgroundPosition || '0 0'\n }\n }\n\n setCenter(center: google.maps.LatLng) {\n this.center = center\n }\n\n getPosFromLatLng(latlng: google.maps.LatLng): google.maps.Point | null {\n const pos = (this as unknown as google.maps.OverlayView).getProjection().fromLatLngToDivPixel(latlng)\n\n if (pos !== null) {\n pos.x -= this.anchorIcon[1]\n\n pos.y -= this.anchorIcon[0]\n }\n\n return pos\n }\n}\n","/* global google */\n\nimport type { Clusterer } from './Clusterer'\n\nimport { ClusterIcon } from './ClusterIcon'\n\nimport type { MarkerExtended } from './types'\n\nexport class Cluster {\n markerClusterer: Clusterer\n map: google.maps.Map | google.maps.StreetViewPanorama | null\n gridSize: number\n minClusterSize: number\n averageCenter: boolean\n markers: MarkerExtended[]\n center: google.maps.LatLng | undefined\n bounds: google.maps.LatLngBounds | null\n clusterIcon: ClusterIcon\n\n constructor(markerClusterer: Clusterer) {\n this.markerClusterer = markerClusterer\n\n this.map = (this.markerClusterer as unknown as google.maps.OverlayView).getMap()\n\n this.gridSize = this.markerClusterer.getGridSize()\n\n this.minClusterSize = this.markerClusterer.getMinimumClusterSize()\n\n this.averageCenter = this.markerClusterer.getAverageCenter()\n\n this.markers = []\n\n this.center = undefined\n\n this.bounds = null\n\n this.clusterIcon = new ClusterIcon(this, this.markerClusterer.getStyles())\n\n this.getSize = this.getSize.bind(this)\n this.getMarkers = this.getMarkers.bind(this)\n this.getCenter = this.getCenter.bind(this)\n this.getMap = this.getMap.bind(this)\n this.getClusterer = this.getClusterer.bind(this)\n this.getBounds = this.getBounds.bind(this)\n this.remove = this.remove.bind(this)\n this.addMarker = this.addMarker.bind(this)\n this.isMarkerInClusterBounds = this.isMarkerInClusterBounds.bind(this)\n this.calculateBounds = this.calculateBounds.bind(this)\n this.updateIcon = this.updateIcon.bind(this)\n this.isMarkerAlreadyAdded = this.isMarkerAlreadyAdded.bind(this)\n }\n\n getSize(): number {\n return this.markers.length\n }\n\n getMarkers(): MarkerExtended[] {\n return this.markers\n }\n\n getCenter(): google.maps.LatLng | undefined {\n return this.center\n }\n\n getMap(): google.maps.Map | google.maps.StreetViewPanorama | null {\n return this.map\n }\n\n getClusterer(): Clusterer {\n return this.markerClusterer\n }\n\n getBounds(): google.maps.LatLngBounds {\n const bounds = new google.maps.LatLngBounds(this.center, this.center)\n\n const markers = this.getMarkers()\n\n for (const marker of markers) {\n const position = marker.getPosition()\n\n if (position) {\n bounds.extend(position)\n }\n }\n\n return bounds\n }\n\n remove() {\n (this.clusterIcon as unknown as google.maps.OverlayView).setMap(null)\n\n this.markers = []\n\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n delete this.markers\n }\n\n addMarker(marker: MarkerExtended): boolean {\n if (this.isMarkerAlreadyAdded(marker)) {\n return false\n }\n\n if (!this.center) {\n const position = marker.getPosition()\n\n if (position) {\n this.center = position\n\n this.calculateBounds()\n }\n } else {\n if (this.averageCenter) {\n const position = marker.getPosition()\n\n if (position) {\n const length = this.markers.length + 1\n\n this.center = new google.maps.LatLng(\n (this.center.lat() * (length - 1) + position.lat()) / length,\n (this.center.lng() * (length - 1) + position.lng()) / length\n )\n\n this.calculateBounds()\n }\n }\n }\n\n marker.isAdded = true\n\n this.markers.push(marker)\n\n const mCount = this.markers.length\n\n const maxZoom = this.markerClusterer.getMaxZoom()\n\n const zoom = this.map?.getZoom()\n\n if (maxZoom !== null && typeof zoom !== 'undefined' && zoom > maxZoom) {\n // Zoomed in past max zoom, so show the marker.\n if (marker.getMap() !== this.map) {\n marker.setMap(this.map)\n }\n } else if (mCount < this.minClusterSize) {\n // Min cluster size not reached so show the marker.\n if (marker.getMap() !== this.map) {\n marker.setMap(this.map)\n }\n } else if (mCount === this.minClusterSize) {\n // Hide the markers that were showing.\n for (const markerElement of this.markers) {\n markerElement.setMap(null)\n }\n } else {\n marker.setMap(null)\n }\n\n return true\n }\n\n isMarkerInClusterBounds(marker: MarkerExtended): boolean {\n if (this.bounds !== null) {\n const position = marker.getPosition()\n\n if (position) {\n return this.bounds.contains(position)\n }\n }\n\n return false\n }\n\n calculateBounds() {\n this.bounds = this.markerClusterer.getExtendedBounds(\n new google.maps.LatLngBounds(this.center, this.center)\n )\n }\n\n updateIcon() {\n const mCount = this.markers.length\n\n const maxZoom = this.markerClusterer.getMaxZoom()\n\n const zoom = this.map?.getZoom()\n\n if (maxZoom !== null && typeof zoom !== 'undefined' && zoom > maxZoom) {\n this.clusterIcon.hide()\n\n return\n }\n\n if (mCount < this.minClusterSize) {\n // Min cluster size not yet reached.\n this.clusterIcon.hide()\n\n return\n }\n\n if (this.center) {\n this.clusterIcon.setCenter(this.center)\n }\n\n this.clusterIcon.useStyle(\n this.markerClusterer.getCalculator()(this.markers, this.markerClusterer.getStyles().length)\n )\n\n this.clusterIcon.show()\n }\n\n isMarkerAlreadyAdded(marker: MarkerExtended): boolean {\n if (this.markers.includes) {\n return this.markers.includes(marker)\n }\n\n for (let i = 0; i < this.markers.length; i++) {\n if (marker === this.markers[i]) {\n return true\n }\n }\n\n return false\n }\n}\n","/* global google */\n/* eslint-disable filenames/match-regex */\nimport { Cluster } from './Cluster'\nimport type { ClusterIcon } from './ClusterIcon'\n\nimport type {\n MarkerExtended,\n ClustererOptions,\n ClusterIconStyle,\n TCalculator,\n ClusterIconInfo,\n} from './types'\n\n/**\n * Supports up to 9007199254740991 (Number.MAX_SAFE_INTEGER) markers\n * which is not a problem as max array length is 4294967296 (2**32)\n */\nfunction CALCULATOR(\n markers: MarkerExtended[],\n numStyles: number\n): ClusterIconInfo {\n const count = markers.length\n\n const numberOfDigits = count.toString().length\n\n const index = Math.min(numberOfDigits, numStyles)\n\n return {\n text: count.toString(),\n index,\n title: '',\n }\n}\n\nconst BATCH_SIZE = 2000\n\nconst BATCH_SIZE_IE = 500\n\nconst IMAGE_PATH =\n 'https://developers.google.com/maps/documentation/javascript/examples/markerclusterer/m'\n\nconst IMAGE_EXTENSION = 'png'\n\nconst IMAGE_SIZES = [53, 56, 66, 78, 90]\n\nconst CLUSTERER_CLASS = 'cluster'\n\nexport class Clusterer {\n markers: MarkerExtended[]\n clusters: Cluster[]\n listeners: google.maps.MapsEventListener[]\n activeMap: google.maps.Map | google.maps.StreetViewPanorama | null\n ready: boolean\n gridSize: number\n minClusterSize: number\n maxZoom: number | null\n styles: ClusterIconStyle[]\n title: string\n zoomOnClick: boolean\n averageCenter: boolean\n ignoreHidden: boolean\n enableRetinaIcons: boolean\n imagePath: string\n imageExtension: string\n imageSizes: number[]\n calculator: TCalculator\n batchSize: number\n batchSizeIE: number\n clusterClass: string\n timerRefStatic: number | null\n\n constructor(\n map: google.maps.Map,\n optMarkers: MarkerExtended[] = [],\n optOptions: ClustererOptions = {}\n ) {\n this.getMinimumClusterSize = this.getMinimumClusterSize.bind(this)\n this.setMinimumClusterSize = this.setMinimumClusterSize.bind(this)\n this.getEnableRetinaIcons = this.getEnableRetinaIcons.bind(this)\n this.setEnableRetinaIcons = this.setEnableRetinaIcons.bind(this)\n this.addToClosestCluster = this.addToClosestCluster.bind(this)\n this.getImageExtension = this.getImageExtension.bind(this)\n this.setImageExtension = this.setImageExtension.bind(this)\n this.getExtendedBounds = this.getExtendedBounds.bind(this)\n this.getAverageCenter = this.getAverageCenter.bind(this)\n this.setAverageCenter = this.setAverageCenter.bind(this)\n this.getTotalClusters = this.getTotalClusters.bind(this)\n this.fitMapToMarkers = this.fitMapToMarkers.bind(this)\n this.getIgnoreHidden = this.getIgnoreHidden.bind(this)\n this.setIgnoreHidden = this.setIgnoreHidden.bind(this)\n this.getClusterClass = this.getClusterClass.bind(this)\n this.setClusterClass = this.setClusterClass.bind(this)\n this.getTotalMarkers = this.getTotalMarkers.bind(this)\n this.getZoomOnClick = this.getZoomOnClick.bind(this)\n this.setZoomOnClick = this.setZoomOnClick.bind(this)\n this.getBatchSizeIE = this.getBatchSizeIE.bind(this)\n this.setBatchSizeIE = this.setBatchSizeIE.bind(this)\n this.createClusters = this.createClusters.bind(this)\n this.onZoomChanged = this.onZoomChanged.bind(this)\n this.getImageSizes = this.getImageSizes.bind(this)\n this.setImageSizes = this.setImageSizes.bind(this)\n this.getCalculator = this.getCalculator.bind(this)\n this.setCalculator = this.setCalculator.bind(this)\n this.removeMarkers = this.removeMarkers.bind(this)\n this.resetViewport = this.resetViewport.bind(this)\n this.getImagePath = this.getImagePath.bind(this)\n this.setImagePath = this.setImagePath.bind(this)\n this.pushMarkerTo = this.pushMarkerTo.bind(this)\n this.removeMarker = this.removeMarker.bind(this)\n this.clearMarkers = this.clearMarkers.bind(this)\n this.setupStyles = this.setupStyles.bind(this)\n this.getGridSize = this.getGridSize.bind(this)\n this.setGridSize = this.setGridSize.bind(this)\n this.getClusters = this.getClusters.bind(this)\n this.getMaxZoom = this.getMaxZoom.bind(this)\n this.setMaxZoom = this.setMaxZoom.bind(this)\n this.getMarkers = this.getMarkers.bind(this)\n this.addMarkers = this.addMarkers.bind(this)\n this.getStyles = this.getStyles.bind(this)\n this.setStyles = this.setStyles.bind(this)\n this.addMarker = this.addMarker.bind(this)\n this.onRemove = this.onRemove.bind(this)\n this.getTitle = this.getTitle.bind(this)\n this.setTitle = this.setTitle.bind(this)\n this.repaint = this.repaint.bind(this)\n this.onIdle = this.onIdle.bind(this)\n this.redraw = this.redraw.bind(this)\n this.extend = this.extend.bind(this)\n this.onAdd = this.onAdd.bind(this)\n this.draw = this.draw.bind(this)\n\n this.extend(Clusterer, google.maps.OverlayView)\n\n this.markers = []\n this.clusters = []\n this.listeners = []\n this.activeMap = null\n this.ready = false\n this.gridSize = optOptions.gridSize || 60\n this.minClusterSize = optOptions.minimumClusterSize || 2\n this.maxZoom = optOptions.maxZoom || null\n this.styles = optOptions.styles || []\n\n this.title = optOptions.title || ''\n\n this.zoomOnClick = true\n\n if (optOptions.zoomOnClick !== undefined) {\n this.zoomOnClick = optOptions.zoomOnClick\n }\n\n this.averageCenter = false\n\n if (optOptions.averageCenter !== undefined) {\n this.averageCenter = optOptions.averageCenter\n }\n\n this.ignoreHidden = false\n\n if (optOptions.ignoreHidden !== undefined) {\n this.ignoreHidden = optOptions.ignoreHidden\n }\n\n this.enableRetinaIcons = false\n\n if (optOptions.enableRetinaIcons !== undefined) {\n this.enableRetinaIcons = optOptions.enableRetinaIcons\n }\n this.imagePath = optOptions.imagePath || IMAGE_PATH\n\n this.imageExtension = optOptions.imageExtension || IMAGE_EXTENSION\n\n this.imageSizes = optOptions.imageSizes || IMAGE_SIZES\n\n this.calculator = optOptions.calculator || CALCULATOR\n\n this.batchSize = optOptions.batchSize || BATCH_SIZE\n\n this.batchSizeIE = optOptions.batchSizeIE || BATCH_SIZE_IE\n\n this.clusterClass = optOptions.clusterClass || CLUSTERER_CLASS\n\n if (navigator.userAgent.toLowerCase().indexOf('msie') !== -1) {\n // Try to avoid IE timeout when processing a huge number of markers:\n this.batchSize = this.batchSizeIE\n }\n\n this.timerRefStatic = null\n\n this.setupStyles()\n\n this.addMarkers(optMarkers, true);\n\n (this as unknown as google.maps.OverlayView).setMap(map) // Note: this causes onAdd to be called\n }\n\n onZoomChanged() {\n this.resetViewport(false)\n\n // Workaround for this Google bug: when map is at level 0 and \"-\" of\n // zoom slider is clicked, a \"zoom_changed\" event is fired even though\n // the map doesn't zoom out any further. In this situation, no \"idle\"\n // event is triggered so the cluster markers that have been removed\n // do not get redrawn. Same goes for a zoom in at maxZoom.\n if (\n (this as unknown as google.maps.OverlayView).getMap()?.getZoom() === ((this as unknown as google.maps.OverlayView).get('minZoom') || 0) ||\n (this as unknown as google.maps.OverlayView).getMap()?.getZoom() === (this as unknown as google.maps.OverlayView).get('maxZoom')\n ) {\n google.maps.event.trigger(this, 'idle')\n }\n }\n\n onIdle() {\n this.redraw()\n }\n\n onAdd() {\n const map = (this as unknown as google.maps.OverlayView).getMap()\n\n this.activeMap = map\n\n this.ready = true\n\n this.repaint()\n\n if (map !== null) {\n // Add the map event listeners\n this.listeners = [\n google.maps.event.addListener(\n map,\n 'zoom_changed',\n this.onZoomChanged\n ),\n google.maps.event.addListener(\n map,\n 'idle',\n this.onIdle\n ),\n ]\n }\n }\n\n onRemove() {\n // Put all the managed markers back on the map:\n for (const marker of this.markers) {\n if (marker.getMap() !== this.activeMap) {\n marker.setMap(this.activeMap)\n }\n }\n\n // Remove all clusters:\n for (const cluster of this.clusters) {\n cluster.remove()\n }\n\n this.clusters = []\n\n // Remove map event listeners:\n for (const listener of this.listeners) {\n google.maps.event.removeListener(listener)\n }\n\n this.listeners = []\n\n this.activeMap = null\n\n this.ready = false\n }\n\n draw() { return }\n\n setupStyles() {\n if (this.styles.length > 0) {\n return\n }\n\n for (let i = 0; i < this.imageSizes.length; i++) {\n this.styles.push({\n url: `${this.imagePath + (i + 1)}.${this.imageExtension}`,\n height: this.imageSizes[i] || 0,\n width: this.imageSizes[i] || 0,\n })\n }\n }\n\n fitMapToMarkers() {\n const markers = this.getMarkers()\n\n const bounds = new google.maps.LatLngBounds()\n\n for (const marker of markers) {\n const position = marker.getPosition()\n\n if (position) {\n bounds.extend(position)\n }\n }\n\n const map = (this as unknown as google.maps.OverlayView).getMap()\n\n if (map !== null && 'fitBounds' in map) {\n map.fitBounds(bounds)\n }\n\n }\n\n getGridSize(): number {\n return this.gridSize\n }\n\n setGridSize(gridSize: number) {\n this.gridSize = gridSize\n }\n\n getMinimumClusterSize(): number {\n return this.minClusterSize\n }\n\n setMinimumClusterSize(minimumClusterSize: number) {\n this.minClusterSize = minimumClusterSize\n }\n\n getMaxZoom(): number | null {\n return this.maxZoom\n }\n\n setMaxZoom(maxZoom: number) {\n this.maxZoom = maxZoom\n }\n\n getStyles(): ClusterIconStyle[] {\n return this.styles\n }\n\n setStyles(styles: ClusterIconStyle[]) {\n this.styles = styles\n }\n\n getTitle(): string {\n return this.title\n }\n\n setTitle(title: string) {\n this.title = title\n }\n\n getZoomOnClick(): boolean {\n return this.zoomOnClick\n }\n\n setZoomOnClick(zoomOnClick: boolean) {\n this.zoomOnClick = zoomOnClick\n }\n\n getAverageCenter(): boolean {\n return this.averageCenter\n }\n\n setAverageCenter(averageCenter: boolean) {\n this.averageCenter = averageCenter\n }\n\n getIgnoreHidden(): boolean {\n return this.ignoreHidden\n }\n\n setIgnoreHidden(ignoreHidden: boolean) {\n this.ignoreHidden = ignoreHidden\n }\n\n getEnableRetinaIcons(): boolean {\n return this.enableRetinaIcons\n }\n\n setEnableRetinaIcons(enableRetinaIcons: boolean) {\n this.enableRetinaIcons = enableRetinaIcons\n }\n\n getImageExtension(): string {\n return this.imageExtension\n }\n\n setImageExtension(imageExtension: string) {\n this.imageExtension = imageExtension\n }\n\n getImagePath(): string {\n return this.imagePath\n }\n\n setImagePath(imagePath: string) {\n this.imagePath = imagePath\n }\n\n getImageSizes(): number[] {\n return this.imageSizes\n }\n\n setImageSizes(imageSizes: number[]) {\n this.imageSizes = imageSizes\n }\n\n getCalculator(): TCalculator {\n return this.calculator\n }\n\n setCalculator(calculator: TCalculator) {\n this.calculator = calculator\n }\n\n getBatchSizeIE(): number {\n return this.batchSizeIE\n }\n\n setBatchSizeIE(batchSizeIE: number) {\n this.batchSizeIE = batchSizeIE\n }\n\n getClusterClass(): string {\n return this.clusterClass\n }\n\n setClusterClass(clusterClass: string) {\n this.clusterClass = clusterClass\n }\n\n getMarkers(): MarkerExtended[] {\n return this.markers\n }\n\n getTotalMarkers(): number {\n return this.markers.length\n }\n\n getClusters(): Cluster[] {\n return this.clusters\n }\n\n getTotalClusters(): number {\n return this.clusters.length\n }\n\n addMarker(marker: MarkerExtended, optNoDraw: boolean) {\n this.pushMarkerTo(marker)\n\n if (!optNoDraw) {\n this.redraw()\n }\n }\n\n addMarkers(markers: MarkerExtended[], optNoDraw: boolean) {\n for (const key in markers) {\n if (Object.prototype.hasOwnProperty.call(markers, key)) {\n const marker = markers[key]\n\n if (marker) {\n this.pushMarkerTo(marker)\n }\n }\n }\n\n if (!optNoDraw) {\n this.redraw()\n }\n }\n\n pushMarkerTo(marker: MarkerExtended) {\n // If the marker is draggable add a listener so we can update the clusters on the dragend:\n if (marker.getDraggable()) {\n google.maps.event.addListener(marker, 'dragend', () => {\n if (this.ready) {\n marker.isAdded = false\n\n this.repaint()\n }\n })\n }\n\n marker.isAdded = false\n\n this.markers.push(marker)\n }\n\n removeMarker_(marker: MarkerExtended): boolean {\n let index = -1\n\n if (this.markers.indexOf) {\n index = this.markers.indexOf(marker)\n } else {\n for (let i = 0; i < this.markers.length; i++) {\n if (marker === this.markers[i]) {\n index = i\n\n break\n }\n }\n }\n\n if (index === -1) {\n // Marker is not in our list of markers, so do nothing:\n return false\n }\n\n marker.setMap(null)\n\n this.markers.splice(index, 1) // Remove the marker from the list of managed markers\n\n return true\n }\n\n removeMarker(marker: MarkerExtended, optNoDraw: boolean): boolean {\n const removed = this.removeMarker_(marker)\n\n if (!optNoDraw && removed) {\n this.repaint()\n }\n\n return removed\n }\n\n removeMarkers(markers: MarkerExtended[], optNoDraw: boolean): boolean {\n let removed = false\n\n for (const marker of markers) {\n removed = removed || this.removeMarker_(marker)\n }\n\n if (!optNoDraw && removed) {\n this.repaint()\n }\n\n return removed\n }\n\n clearMarkers() {\n this.resetViewport(true)\n\n this.markers = []\n }\n\n repaint() {\n const oldClusters = this.clusters.slice()\n\n this.clusters = []\n\n this.resetViewport(false)\n\n this.redraw()\n\n // Remove the old clusters.\n // Do it in a timeout to prevent blinking effect.\n setTimeout(function timeout() {\n for (const oldCluster of oldClusters) {\n oldCluster.remove()\n }\n }, 0)\n }\n\n getExtendedBounds(bounds: google.maps.LatLngBounds): google.maps.LatLngBounds {\n const projection = (this as unknown as google.maps.OverlayView).getProjection()\n\n // Convert the points to pixels and the extend out by the grid size.\n const trPix = projection.fromLatLngToDivPixel(\n // Turn the bounds into latlng.\n new google.maps.LatLng(bounds.getNorthEast().lat(), bounds.getNorthEast().lng())\n )\n\n if (trPix !== null) {\n trPix.x += this.gridSize\n trPix.y -= this.gridSize\n }\n\n const blPix = projection.fromLatLngToDivPixel(\n // Turn the bounds into latlng.\n new google.maps.LatLng(bounds.getSouthWest().lat(), bounds.getSouthWest().lng())\n )\n\n if (blPix !== null) {\n blPix.x -= this.gridSize\n blPix.y += this.gridSize\n }\n\n\n // Extend the bounds to contain the new bounds.\n if (trPix !== null) {\n // Convert the pixel points back to LatLng nw\n const point1 = projection.fromDivPixelToLatLng(trPix)\n\n if (point1 !== null) {\n bounds.extend(point1)\n }\n }\n\n if (blPix !== null) {\n // Convert the pixel points back to LatLng sw\n const point2 = projection.fromDivPixelToLatLng(blPix)\n\n if (point2 !== null) {\n bounds.extend(\n point2\n )\n }\n }\n\n\n return bounds\n }\n\n redraw() {\n // Redraws all the clusters.\n this.createClusters(0)\n }\n\n resetViewport(optHide: boolean) {\n // Remove all the clusters\n for (const cluster of this.clusters) {\n cluster.remove()\n }\n\n this.clusters = []\n\n // Reset the markers to not be added and to be removed from the map.\n for (const marker of this.markers) {\n marker.isAdded = false\n\n if (optHide) {\n marker.setMap(null)\n }\n }\n }\n\n distanceBetweenPoints(p1: google.maps.LatLng, p2: google.maps.LatLng): number {\n const R = 6371 // Radius of the Earth in km\n\n const dLat = ((p2.lat() - p1.lat()) * Math.PI) / 180\n const dLon = ((p2.lng() - p1.lng()) * Math.PI) / 180\n\n const a =\n Math.sin(dLat / 2) * Math.sin(dLat / 2) +\n Math.cos((p1.lat() * Math.PI) / 180) *\n Math.cos((p2.lat() * Math.PI) / 180) *\n Math.sin(dLon / 2) *\n Math.sin(dLon / 2)\n\n return R * (2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)))\n }\n\n isMarkerInBounds(marker: MarkerExtended, bounds: google.maps.LatLngBounds): boolean {\n const position = marker.getPosition()\n\n if (position) {\n return bounds.contains(position)\n }\n\n return false\n }\n\n addToClosestCluster(marker: MarkerExtended) {\n let cluster\n\n let distance = 40000 // Some large number\n\n let clusterToAddTo = null\n\n for (const clusterElement of this.clusters) {\n cluster = clusterElement\n\n const center = cluster.getCenter()\n\n const position = marker.getPosition()\n\n if (center && position) {\n const d = this.distanceBetweenPoints(center, position)\n\n if (d < distance) {\n distance = d\n\n clusterToAddTo = cluster\n }\n }\n }\n\n if (clusterToAddTo && clusterToAddTo.isMarkerInClusterBounds(marker)) {\n clusterToAddTo.addMarker(marker)\n } else {\n cluster = new Cluster(this)\n\n cluster.addMarker(marker)\n\n this.clusters.push(cluster)\n }\n }\n\n createClusters(iFirst: number) {\n if (!this.ready) {\n return\n }\n\n // Cancel previous batch processing if we're working on the first batch:\n if (iFirst === 0) {\n /**\n * This event is fired when the <code>Clusterer</code> begins\n * clustering markers.\n * @name Clusterer#clusteringbegin\n * @param {Clusterer} mc The Clusterer whose markers are being clustered.\n * @event\n */\n google.maps.event.trigger(this, 'clusteringbegin', this)\n\n if (this.timerRefStatic !== null) {\n window.clearTimeout(this.timerRefStatic)\n\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n delete this.timerRefStatic\n }\n }\n\n const map = (this as unknown as google.maps.OverlayView).getMap()\n\n const bounds = map !== null && 'getBounds' in map ? map.getBounds() : null\n\n const zoom = map?.getZoom() || 0\n // Get our current map view bounds.\n // Create a new bounds object so we don't affect the map.\n //\n // See Comments 9 & 11 on Issue 3651 relating to this workaround for a Google Maps bug:\n const mapBounds = zoom > 3\n ? new google.maps.LatLngBounds(\n bounds?.getSouthWest(),\n bounds?.getNorthEast()\n )\n : new google.maps.LatLngBounds(\n new google.maps.LatLng(85.02070771743472, -178.48388434375),\n new google.maps.LatLng(-85.08136444384544, 178.00048865625)\n )\n\n const extendedMapBounds = this.getExtendedBounds(mapBounds)\n\n const iLast = Math.min(iFirst + this.batchSize, this.markers.length)\n\n for (let i = iFirst; i < iLast; i++) {\n const marker = this.markers[i]\n\n if (marker && !marker.isAdded && this.isMarkerInBounds(marker, extendedMapBounds) && (!this.ignoreHidden || (this.ignoreHidden && marker.getVisible()))) {\n this.addToClosestCluster(marker)\n }\n }\n\n if (iLast < this.markers.length) {\n this.timerRefStatic = window.setTimeout(\n () => {\n this.createClusters(iLast)\n },\n 0\n )\n } else {\n this.timerRefStatic = null\n\n /**\n * This event is fired when the <code>Clusterer</code> stops\n * clustering markers.\n * @name Clusterer#clusteringend\n * @param {Clusterer} mc The Clusterer whose markers are being clustered.\n * @event\n */\n google.maps.event.trigger(this, 'clusteringend', this)\n\n for (const cluster of this.clusters) {\n cluster.updateIcon()\n }\n }\n }\n\n extend<A extends typeof ClusterIcon | typeof Clusterer>(obj1: A, obj2: typeof google.maps.OverlayView): A {\n return function applyExtend(this: A, object: typeof google.maps.OverlayView): A {\n for (const property in object.prototype) {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n this.prototype[property] = object.prototype[property as keyof google.maps.OverlayView]\n }\n\n return this\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n }.apply<A, [typeof google.maps.OverlayView], any>(obj1, [obj2])\n }\n}\n"],"names":["ClusterIcon","cluster","styles","getClusterer","extend","google","maps","OverlayView","this","clusterClassName","getClusterClass","className","center","undefined","div","sums","visible","boundsChangedListener","url","height","width","anchorText","anchorIcon","textColor","textSize","textDecoration","fontWeight","fontStyle","fontFamily","backgroundPosition","cMouseDownInCluster","cDraggingMapByCluster","timeOut","setMap","getMap","onBoundsChanged","bind","onMouseDown","onClick","onMouseOver","onMouseOut","onAdd","onRemove","draw","hide","show","useStyle","setCenter","getPosFromLatLng","prototype","event","markerClusterer_1","trigger","getZoomOnClick","maxZoom_1","getMaxZoom","bounds_1","getBounds","map","fitBounds","window","setTimeout","zoom","getZoom","setZoom","cancelBubble","stopPropagation","document","createElement","_a","getPanes","overlayMouseTarget","appendChild","addListener","addEventListener","parentNode","removeListener","removeEventListener","removeChild","clearTimeout","pos","style","top","concat","y","left","x","display","divTitle","title","getTitle","bp","split","spriteH","parseInt","replace","spriteV","_b","setAttribute","img","alt","src","enableRetinaIcons","clip","textElm","_c","text","innerText","_d","_e","html","innerHTML","_f","getStyles","Math","min","length","max","index","latlng","getProjection","fromLatLngToDivPixel","Cluster","markerClusterer","gridSize","getGridSize","minClusterSize","getMinimumClusterSize","averageCenter","getAverageCenter","markers","bounds","clusterIcon","getSize","getMarkers","getCenter","remove","addMarker","isMarkerInClusterBounds","calculateBounds","updateIcon","isMarkerAlreadyAdded","LatLngBounds","markers_1","_i","position","getPosition","marker","length_1","LatLng","lat","lng","isAdded","push","mCount","maxZoom","contains","getExtendedBounds","getCalculator","includes","i","CALCULATOR","numStyles","count","numberOfDigits","toString","BATCH_SIZE","BATCH_SIZE_IE","IMAGE_PATH","IMAGE_EXTENSION","IMAGE_SIZES","CLUSTERER_CLASS","Clusterer","optMarkers","optOptions","setMinimumClusterSize","getEnableRetinaIcons","setEnableRetinaIcons","addToClosestCluster","getImageExtension","setImageExtension","setAverageCenter","getTotalClusters","fitMapToMarkers","getIgnoreHidden","setIgnoreHidden","setClusterClass","getTotalMarkers","setZoomOnClick","getBatchSizeIE","setBatchSizeIE","createClusters","onZoomChanged","getImageSizes","setImageSizes","setCalculator","removeMarkers","resetViewport","getImagePath","setImagePath","pushMarkerTo","removeMarker","clearMarkers","setupStyles","setGridSize","getClusters","setMaxZoom","addMarkers","setStyles","setTitle","repaint","onIdle","redraw","clusters","listeners","activeMap","ready","minimumClusterSize","zoomOnClick","ignoreHidden","imagePath","imageExtension","imageSizes","calculator","batchSize","batchSizeIE","clusterClass","navigator","userAgent","toLowerCase","indexOf","timerRefStatic","get","listener","optNoDraw","key","Object","hasOwnProperty","call","_this","getDraggable","removeMarker_","splice","removed","markers_2","oldClusters","slice","oldClusters_1","projection","trPix","getNorthEast","blPix","getSouthWest","point1","fromDivPixelToLatLng","point2","optHide","distanceBetweenPoints","p1","p2","dLat","PI","dLon","a","sin","cos","atan2","sqrt","isMarkerInBounds","distance","clusterToAddTo","d","iFirst","mapBounds","extendedMapBounds","iLast","getVisible","obj1","obj2","object","property","apply"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cjs.min.js","sources":["../src/ClusterIcon.tsx","../src/Cluster.tsx","../src/Clusterer.tsx"],"sourcesContent":["/* global google */\n/* eslint-disable filenames/match-regex */\nimport type { Cluster } from './Cluster'\n\nimport type { ClusterIconStyle, ClusterIconInfo } from './types'\n\nexport class ClusterIcon {\n cluster: Cluster\n className: string\n clusterClassName: string\n styles: ClusterIconStyle[]\n center: google.maps.LatLng | undefined\n div: HTMLDivElement | null\n sums: ClusterIconInfo | null\n visible: boolean\n url: string\n height: number\n width: number\n anchorText: [number, number]\n anchorIcon: [number, number]\n textColor: string\n textSize: number\n textDecoration: string\n fontWeight: string\n fontStyle: string\n fontFamily: string\n backgroundPosition: string\n cMouseDownInCluster: boolean | null\n cDraggingMapByCluster: boolean | null\n timeOut: number | null\n\n boundsChangedListener: google.maps.MapsEventListener | null\n\n constructor(cluster: Cluster, styles: ClusterIconStyle[]) {\n cluster.getClusterer().extend(ClusterIcon, google.maps.OverlayView)\n\n this.cluster = cluster\n\n this.clusterClassName = this.cluster.getClusterer().getClusterClass()\n\n this.className = this.clusterClassName\n\n this.styles = styles\n\n this.center = undefined\n\n this.div = null\n\n this.sums = null\n\n this.visible = false\n\n this.boundsChangedListener = null\n\n this.url = ''\n\n this.height = 0\n this.width = 0\n\n this.anchorText = [0, 0]\n this.anchorIcon = [0, 0]\n\n this.textColor = 'black'\n this.textSize = 11\n this.textDecoration = 'none'\n this.fontWeight = 'bold'\n this.fontStyle = 'normal'\n this.fontFamily = 'Arial,sans-serif'\n\n this.backgroundPosition = '0 0'\n\n this.cMouseDownInCluster = null\n this.cDraggingMapByCluster = null\n this.timeOut = null;\n\n (this as unknown as google.maps.OverlayView).setMap(cluster.getMap()) // Note: this causes onAdd to be called\n\n this.onBoundsChanged = this.onBoundsChanged.bind(this)\n this.onMouseDown = this.onMouseDown.bind(this)\n this.onClick = this.onClick.bind(this)\n this.onMouseOver = this.onMouseOver.bind(this)\n this.onMouseOut = this.onMouseOut.bind(this)\n this.onAdd = this.onAdd.bind(this)\n this.onRemove = this.onRemove.bind(this)\n this.draw = this.draw.bind(this)\n this.hide = this.hide.bind(this)\n this.show = this.show.bind(this)\n this.useStyle = this.useStyle.bind(this)\n this.setCenter = this.setCenter.bind(this)\n this.getPosFromLatLng = this.getPosFromLatLng.bind(this)\n }\n\n onBoundsChanged() {\n this.cDraggingMapByCluster = this.cMouseDownInCluster\n }\n\n onMouseDown() {\n this.cMouseDownInCluster = true\n\n this.cDraggingMapByCluster = false\n }\n\n onClick(event: Event) {\n this.cMouseDownInCluster = false\n\n if (!this.cDraggingMapByCluster) {\n const markerClusterer = this.cluster.getClusterer()\n\n /**\n * This event is fired when a cluster marker is clicked.\n * @name MarkerClusterer#click\n * @param {Cluster} c The cluster that was clicked.\n * @event\n */\n google.maps.event.trigger(markerClusterer, 'click', this.cluster)\n google.maps.event.trigger(markerClusterer, 'clusterclick', this.cluster) // deprecated name\n\n // The default click handler follows. Disable it by setting\n // the zoomOnClick property to false.\n if (markerClusterer.getZoomOnClick()) {\n // Zoom into the cluster.\n const maxZoom = markerClusterer.getMaxZoom()\n\n const bounds = this.cluster.getBounds()\n\n const map = (markerClusterer as unknown as google.maps.OverlayView).getMap()\n\n if (map !== null && 'fitBounds' in map) {\n map.fitBounds(bounds)\n }\n\n\n // There is a fix for Issue 170 here:\n this.timeOut = window.setTimeout(() => {\n const map = (markerClusterer as unknown as google.maps.OverlayView).getMap()\n\n if (map !== null) {\n if ('fitBounds' in map) {\n map.fitBounds(bounds)\n }\n\n const zoom = map.getZoom() || 0\n\n // Don't zoom beyond the max zoom level\n if (\n maxZoom !== null &&\n zoom > maxZoom\n ) {\n map.setZoom(maxZoom + 1)\n }\n }\n }, 100)\n }\n\n // Prevent event propagation to the map:\n event.cancelBubble = true\n\n if (event.stopPropagation) {\n event.stopPropagation()\n }\n }\n }\n\n onMouseOver() {\n /**\n * This event is fired when the mouse moves over a cluster marker.\n * @name MarkerClusterer#mouseover\n * @param {Cluster} c The cluster that the mouse moved over.\n * @event\n */\n google.maps.event.trigger(\n this.cluster.getClusterer(),\n 'mouseover',\n this.cluster\n )\n }\n\n onMouseOut() {\n /**\n * This event is fired when the mouse moves out of a cluster marker.\n * @name MarkerClusterer#mouseout\n * @param {Cluster} c The cluster that the mouse moved out of.\n * @event\n */\n google.maps.event.trigger(\n this.cluster.getClusterer(),\n 'mouseout',\n this.cluster\n )\n }\n\n onAdd() {\n this.div = document.createElement('div')\n\n this.div.className = this.className\n\n if (this.visible) {\n this.show()\n }\n\n ;(this as unknown as google.maps.OverlayView).getPanes()?.overlayMouseTarget.appendChild(this.div)\n\n const map = (this as unknown as google.maps.OverlayView).getMap()\n\n if (map !== null) {\n // Fix for Issue 157\n this.boundsChangedListener = google.maps.event.addListener(\n map,\n 'bounds_changed',\n this.onBoundsChanged\n )\n\n this.div.addEventListener('mousedown', this.onMouseDown)\n\n this.div.addEventListener('click', this.onClick)\n\n this.div.addEventListener('mouseover', this.onMouseOver)\n\n this.div.addEventListener('mouseout', this.onMouseOut)\n }\n }\n\n onRemove() {\n if (this.div && this.div.parentNode) {\n this.hide()\n\n if (this.boundsChangedListener !== null) {\n google.maps.event.removeListener(this.boundsChangedListener)\n }\n\n this.div.removeEventListener('mousedown', this.onMouseDown)\n\n this.div.removeEventListener('click', this.onClick)\n\n this.div.removeEventListener('mouseover', this.onMouseOver)\n\n this.div.removeEventListener('mouseout', this.onMouseOut)\n\n this.div.parentNode.removeChild(this.div)\n\n if (this.timeOut !== null) {\n window.clearTimeout(this.timeOut)\n\n this.timeOut = null\n }\n\n this.div = null\n }\n }\n\n draw() {\n if (this.visible && this.div !== null && this.center) {\n const pos = this.getPosFromLatLng(this.center)\n\n this.div.style.top = pos !== null ? `${pos.y}px` : '0'\n this.div.style.left = pos !== null ? `${pos.x}px` : '0'\n }\n }\n\n hide() {\n if (this.div) {\n this.div.style.display = 'none'\n }\n\n this.visible = false\n }\n\n show() {\n if (this.div && this.center) {\n const divTitle = this.sums === null ||\n typeof this.sums.title === 'undefined' ||\n this.sums.title === '' ? this.cluster.getClusterer().getTitle() : this.sums.title\n\n // NOTE: values must be specified in px units\n const bp = this.backgroundPosition.split(' ')\n\n const spriteH = parseInt(bp[0]?.replace(/^\\s+|\\s+$/g, '') || '0', 10)\n const spriteV = parseInt(bp[1]?.replace(/^\\s+|\\s+$/g, '') || '0', 10)\n\n const pos = this.getPosFromLatLng(this.center)\n\n this.div.className = this.className\n this.div .setAttribute('style', `cursor: pointer; position: absolute; top: ${pos !== null ? `${pos.y}px` : '0'}; left: ${pos !== null ? `${pos.x}px` : '0'}; width: ${this.width}px; height: ${this.height}px; `)\n\n const img = document.createElement('img')\n\n img.alt = divTitle\n img.src = this.url\n img.width = this.width\n img.height = this.height\n img.setAttribute('style', `position: absolute; top: ${spriteV}px; left: ${spriteH}px`)\n\n if (!this.cluster.getClusterer().enableRetinaIcons) {\n img.style.clip = `rect(-${spriteV}px, -${spriteH + this.width}px, -${\n spriteV + this.height\n }, -${spriteH})`\n }\n\n const textElm = document.createElement('div')\n\n textElm .setAttribute('style', `position: absolute; top: ${this.anchorText[0]}px; left: ${this.anchorText[1]}px; color: ${this.textColor}; font-size: ${this.textSize}px; font-family: ${this.fontFamily}; font-weight: ${this.fontWeight}; fontStyle: ${this.fontStyle}; text-decoration: ${this.textDecoration}; text-align: center; width: ${this.width}px; line-height: ${this.height}px`)\n\n if (this.sums?.text) textElm.innerText = `${this.sums?.text}`\n if (this.sums?.html) textElm.innerHTML = `${this.sums?.html}`\n\n this.div.innerHTML = ''\n\n this.div.appendChild(img)\n this.div.appendChild(textElm)\n\n this.div.title = divTitle\n\n this.div.style.display = ''\n }\n\n this.visible = true\n }\n\n useStyle(sums: ClusterIconInfo) {\n this.sums = sums\n\n const styles = this.cluster.getClusterer().getStyles()\n\n const style =\n styles[Math.min(styles.length - 1, Math.max(0, sums.index - 1))]\n\n if (style) {\n this.url = style.url\n this.height = style.height\n this.width = style.width\n\n if (style.className) {\n this.className = `${this.clusterClassName} ${style.className}`\n }\n\n this.anchorText = style.anchorText || [0, 0]\n this.anchorIcon = style.anchorIcon || [this.height / 2, this.width / 2]\n\n this.textColor = style.textColor || 'black'\n\n this.textSize = style.textSize || 11\n\n this.textDecoration = style.textDecoration || 'none'\n\n this.fontWeight = style.fontWeight || 'bold'\n\n this.fontStyle = style.fontStyle || 'normal'\n\n this.fontFamily = style.fontFamily || 'Arial,sans-serif'\n\n this.backgroundPosition = style.backgroundPosition || '0 0'\n }\n }\n\n setCenter(center: google.maps.LatLng) {\n this.center = center\n }\n\n getPosFromLatLng(latlng: google.maps.LatLng): google.maps.Point | null {\n const pos = (this as unknown as google.maps.OverlayView).getProjection().fromLatLngToDivPixel(latlng)\n\n if (pos !== null) {\n pos.x -= this.anchorIcon[1]\n\n pos.y -= this.anchorIcon[0]\n }\n\n return pos\n }\n}\n","/* global google */\n\nimport type { Clusterer } from './Clusterer'\n\nimport { ClusterIcon } from './ClusterIcon'\n\nimport type { MarkerExtended } from './types'\n\nexport class Cluster {\n markerClusterer: Clusterer\n map: google.maps.Map | google.maps.StreetViewPanorama | null\n gridSize: number\n minClusterSize: number\n averageCenter: boolean\n markers: MarkerExtended[]\n center: google.maps.LatLng | undefined\n bounds: google.maps.LatLngBounds | null\n clusterIcon: ClusterIcon\n\n constructor(markerClusterer: Clusterer) {\n this.markerClusterer = markerClusterer\n\n this.map = (this.markerClusterer as unknown as google.maps.OverlayView).getMap()\n\n this.gridSize = this.markerClusterer.getGridSize()\n\n this.minClusterSize = this.markerClusterer.getMinimumClusterSize()\n\n this.averageCenter = this.markerClusterer.getAverageCenter()\n\n this.markers = []\n\n this.center = undefined\n\n this.bounds = null\n\n this.clusterIcon = new ClusterIcon(this, this.markerClusterer.getStyles())\n\n this.getSize = this.getSize.bind(this)\n this.getMarkers = this.getMarkers.bind(this)\n this.getCenter = this.getCenter.bind(this)\n this.getMap = this.getMap.bind(this)\n this.getClusterer = this.getClusterer.bind(this)\n this.getBounds = this.getBounds.bind(this)\n this.remove = this.remove.bind(this)\n this.addMarker = this.addMarker.bind(this)\n this.isMarkerInClusterBounds = this.isMarkerInClusterBounds.bind(this)\n this.calculateBounds = this.calculateBounds.bind(this)\n this.updateIcon = this.updateIcon.bind(this)\n this.isMarkerAlreadyAdded = this.isMarkerAlreadyAdded.bind(this)\n }\n\n getSize(): number {\n return this.markers.length\n }\n\n getMarkers(): MarkerExtended[] {\n return this.markers\n }\n\n getCenter(): google.maps.LatLng | undefined {\n return this.center\n }\n\n getMap(): google.maps.Map | google.maps.StreetViewPanorama | null {\n return this.map\n }\n\n getClusterer(): Clusterer {\n return this.markerClusterer\n }\n\n getBounds(): google.maps.LatLngBounds {\n const bounds = new google.maps.LatLngBounds(this.center, this.center)\n\n const markers = this.getMarkers()\n\n for (const marker of markers) {\n const position = marker.getPosition()\n\n if (position) {\n bounds.extend(position)\n }\n }\n\n return bounds\n }\n\n remove() {\n (this.clusterIcon as unknown as google.maps.OverlayView).setMap(null)\n\n this.markers = []\n\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n delete this.markers\n }\n\n addMarker(marker: MarkerExtended): boolean {\n if (this.isMarkerAlreadyAdded(marker)) {\n return false\n }\n\n if (!this.center) {\n const position = marker.getPosition()\n\n if (position) {\n this.center = position\n\n this.calculateBounds()\n }\n } else {\n if (this.averageCenter) {\n const position = marker.getPosition()\n\n if (position) {\n const length = this.markers.length + 1\n\n this.center = new google.maps.LatLng(\n (this.center.lat() * (length - 1) + position.lat()) / length,\n (this.center.lng() * (length - 1) + position.lng()) / length\n )\n\n this.calculateBounds()\n }\n }\n }\n\n marker.isAdded = true\n\n this.markers.push(marker)\n\n const mCount = this.markers.length\n\n const maxZoom = this.markerClusterer.getMaxZoom()\n\n const zoom = this.map?.getZoom()\n\n if (maxZoom !== null && typeof zoom !== 'undefined' && zoom > maxZoom) {\n // Zoomed in past max zoom, so show the marker.\n if (marker.getMap() !== this.map) {\n marker.setMap(this.map)\n }\n } else if (mCount < this.minClusterSize) {\n // Min cluster size not reached so show the marker.\n if (marker.getMap() !== this.map) {\n marker.setMap(this.map)\n }\n } else if (mCount === this.minClusterSize) {\n // Hide the markers that were showing.\n for (const markerElement of this.markers) {\n markerElement.setMap(null)\n }\n } else {\n marker.setMap(null)\n }\n\n return true\n }\n\n isMarkerInClusterBounds(marker: MarkerExtended): boolean {\n if (this.bounds !== null) {\n const position = marker.getPosition()\n\n if (position) {\n return this.bounds.contains(position)\n }\n }\n\n return false\n }\n\n calculateBounds() {\n this.bounds = this.markerClusterer.getExtendedBounds(\n new google.maps.LatLngBounds(this.center, this.center)\n )\n }\n\n updateIcon() {\n const mCount = this.markers.length\n\n const maxZoom = this.markerClusterer.getMaxZoom()\n\n const zoom = this.map?.getZoom()\n\n if (maxZoom !== null && typeof zoom !== 'undefined' && zoom > maxZoom) {\n this.clusterIcon.hide()\n\n return\n }\n\n if (mCount < this.minClusterSize) {\n // Min cluster size not yet reached.\n this.clusterIcon.hide()\n\n return\n }\n\n if (this.center) {\n this.clusterIcon.setCenter(this.center)\n }\n\n this.clusterIcon.useStyle(\n this.markerClusterer.getCalculator()(this.markers, this.markerClusterer.getStyles().length)\n )\n\n this.clusterIcon.show()\n }\n\n isMarkerAlreadyAdded(marker: MarkerExtended): boolean {\n if (this.markers.includes) {\n return this.markers.includes(marker)\n }\n\n for (let i = 0; i < this.markers.length; i++) {\n if (marker === this.markers[i]) {\n return true\n }\n }\n\n return false\n }\n}\n","/* global google */\n/* eslint-disable filenames/match-regex */\nimport { Cluster } from './Cluster'\nimport type { ClusterIcon } from './ClusterIcon'\n\nimport type {\n MarkerExtended,\n ClustererOptions,\n ClusterIconStyle,\n TCalculator,\n ClusterIconInfo,\n} from './types'\n\n/**\n * Supports up to 9007199254740991 (Number.MAX_SAFE_INTEGER) markers\n * which is not a problem as max array length is 4294967296 (2**32)\n */\nfunction CALCULATOR(\n markers: MarkerExtended[],\n numStyles: number\n): ClusterIconInfo {\n const count = markers.length\n\n const numberOfDigits = count.toString().length\n\n const index = Math.min(numberOfDigits, numStyles)\n\n return {\n text: count.toString(),\n index,\n title: '',\n }\n}\n\nconst BATCH_SIZE = 2000\n\nconst BATCH_SIZE_IE = 500\n\nconst IMAGE_PATH =\n 'https://developers.google.com/maps/documentation/javascript/examples/markerclusterer/m'\n\nconst IMAGE_EXTENSION = 'png'\n\nconst IMAGE_SIZES = [53, 56, 66, 78, 90]\n\nconst CLUSTERER_CLASS = 'cluster'\n\nexport class Clusterer implements google.maps.OverlayView {\n markers: MarkerExtended[]\n clusters: Cluster[]\n listeners: google.maps.MapsEventListener[]\n activeMap: google.maps.Map | google.maps.StreetViewPanorama | null\n ready: boolean\n gridSize: number\n minClusterSize: number\n maxZoom: number | null\n styles: ClusterIconStyle[]\n title: string\n zoomOnClick: boolean\n averageCenter: boolean\n ignoreHidden: boolean\n enableRetinaIcons: boolean\n imagePath: string\n imageExtension: string\n imageSizes: number[]\n calculator: TCalculator\n batchSize: number\n batchSizeIE: number\n clusterClass: string\n timerRefStatic: number | null\n\n constructor(\n map: google.maps.Map,\n optMarkers: MarkerExtended[] = [],\n optOptions: ClustererOptions = {}\n ) {\n this.getMinimumClusterSize = this.getMinimumClusterSize.bind(this)\n this.setMinimumClusterSize = this.setMinimumClusterSize.bind(this)\n this.getEnableRetinaIcons = this.getEnableRetinaIcons.bind(this)\n this.setEnableRetinaIcons = this.setEnableRetinaIcons.bind(this)\n this.addToClosestCluster = this.addToClosestCluster.bind(this)\n this.getImageExtension = this.getImageExtension.bind(this)\n this.setImageExtension = this.setImageExtension.bind(this)\n this.getExtendedBounds = this.getExtendedBounds.bind(this)\n this.getAverageCenter = this.getAverageCenter.bind(this)\n this.setAverageCenter = this.setAverageCenter.bind(this)\n this.getTotalClusters = this.getTotalClusters.bind(this)\n this.fitMapToMarkers = this.fitMapToMarkers.bind(this)\n this.getIgnoreHidden = this.getIgnoreHidden.bind(this)\n this.setIgnoreHidden = this.setIgnoreHidden.bind(this)\n this.getClusterClass = this.getClusterClass.bind(this)\n this.setClusterClass = this.setClusterClass.bind(this)\n this.getTotalMarkers = this.getTotalMarkers.bind(this)\n this.getZoomOnClick = this.getZoomOnClick.bind(this)\n this.setZoomOnClick = this.setZoomOnClick.bind(this)\n this.getBatchSizeIE = this.getBatchSizeIE.bind(this)\n this.setBatchSizeIE = this.setBatchSizeIE.bind(this)\n this.createClusters = this.createClusters.bind(this)\n this.onZoomChanged = this.onZoomChanged.bind(this)\n this.getImageSizes = this.getImageSizes.bind(this)\n this.setImageSizes = this.setImageSizes.bind(this)\n this.getCalculator = this.getCalculator.bind(this)\n this.setCalculator = this.setCalculator.bind(this)\n this.removeMarkers = this.removeMarkers.bind(this)\n this.resetViewport = this.resetViewport.bind(this)\n this.getImagePath = this.getImagePath.bind(this)\n this.setImagePath = this.setImagePath.bind(this)\n this.pushMarkerTo = this.pushMarkerTo.bind(this)\n this.removeMarker = this.removeMarker.bind(this)\n this.clearMarkers = this.clearMarkers.bind(this)\n this.setupStyles = this.setupStyles.bind(this)\n this.getGridSize = this.getGridSize.bind(this)\n this.setGridSize = this.setGridSize.bind(this)\n this.getClusters = this.getClusters.bind(this)\n this.getMaxZoom = this.getMaxZoom.bind(this)\n this.setMaxZoom = this.setMaxZoom.bind(this)\n this.getMarkers = this.getMarkers.bind(this)\n this.addMarkers = this.addMarkers.bind(this)\n this.getStyles = this.getStyles.bind(this)\n this.setStyles = this.setStyles.bind(this)\n this.addMarker = this.addMarker.bind(this)\n this.onRemove = this.onRemove.bind(this)\n this.getTitle = this.getTitle.bind(this)\n this.setTitle = this.setTitle.bind(this)\n this.repaint = this.repaint.bind(this)\n this.onIdle = this.onIdle.bind(this)\n this.redraw = this.redraw.bind(this)\n this.onAdd = this.onAdd.bind(this)\n this.draw = this.draw.bind(this)\n\n this.extend = this.extend.bind(this)\n this.extend(Clusterer, google.maps.OverlayView)\n\n this.markers = []\n this.clusters = []\n this.listeners = []\n this.activeMap = null\n this.ready = false\n this.gridSize = optOptions.gridSize || 60\n this.minClusterSize = optOptions.minimumClusterSize || 2\n this.maxZoom = optOptions.maxZoom || null\n this.styles = optOptions.styles || []\n\n this.title = optOptions.title || ''\n\n this.zoomOnClick = true\n\n if (optOptions.zoomOnClick !== undefined) {\n this.zoomOnClick = optOptions.zoomOnClick\n }\n\n this.averageCenter = false\n\n if (optOptions.averageCenter !== undefined) {\n this.averageCenter = optOptions.averageCenter\n }\n\n this.ignoreHidden = false\n\n if (optOptions.ignoreHidden !== undefined) {\n this.ignoreHidden = optOptions.ignoreHidden\n }\n\n this.enableRetinaIcons = false\n\n if (optOptions.enableRetinaIcons !== undefined) {\n this.enableRetinaIcons = optOptions.enableRetinaIcons\n }\n this.imagePath = optOptions.imagePath || IMAGE_PATH\n\n this.imageExtension = optOptions.imageExtension || IMAGE_EXTENSION\n\n this.imageSizes = optOptions.imageSizes || IMAGE_SIZES\n\n this.calculator = optOptions.calculator || CALCULATOR\n\n this.batchSize = optOptions.batchSize || BATCH_SIZE\n\n this.batchSizeIE = optOptions.batchSizeIE || BATCH_SIZE_IE\n\n this.clusterClass = optOptions.clusterClass || CLUSTERER_CLASS\n\n if (navigator.userAgent.toLowerCase().indexOf('msie') !== -1) {\n // Try to avoid IE timeout when processing a huge number of markers:\n this.batchSize = this.batchSizeIE\n }\n\n this.timerRefStatic = null\n\n this.setupStyles()\n\n this.addMarkers(optMarkers, true);\n\n (this as unknown as google.maps.OverlayView).setMap(map) // Note: this causes onAdd to be called\n }\n\n onZoomChanged(): void {\n this.resetViewport(false)\n\n // Workaround for this Google bug: when map is at level 0 and \"-\" of\n // zoom slider is clicked, a \"zoom_changed\" event is fired even though\n // the map doesn't zoom out any further. In this situation, no \"idle\"\n // event is triggered so the cluster markers that have been removed\n // do not get redrawn. Same goes for a zoom in at maxZoom.\n if (\n (this as unknown as google.maps.OverlayView).getMap()?.getZoom() === ((this as unknown as google.maps.OverlayView).get('minZoom') || 0) ||\n (this as unknown as google.maps.OverlayView).getMap()?.getZoom() === (this as unknown as google.maps.OverlayView).get('maxZoom')\n ) {\n google.maps.event.trigger(this, 'idle')\n }\n }\n\n onIdle(): void {\n this.redraw()\n }\n\n onAdd(): void {\n const map = (this as unknown as google.maps.OverlayView).getMap()\n\n this.activeMap = map\n\n this.ready = true\n\n this.repaint()\n\n if (map !== null) {\n // Add the map event listeners\n this.listeners = [\n google.maps.event.addListener(\n map,\n 'zoom_changed',\n this.onZoomChanged\n ),\n google.maps.event.addListener(\n map,\n 'idle',\n this.onIdle\n ),\n ]\n }\n }\n\n onRemove(): void {\n // Put all the managed markers back on the map:\n for (const marker of this.markers) {\n if (marker.getMap() !== this.activeMap) {\n marker.setMap(this.activeMap)\n }\n }\n\n // Remove all clusters:\n for (const cluster of this.clusters) {\n cluster.remove()\n }\n\n this.clusters = []\n\n // Remove map event listeners:\n for (const listener of this.listeners) {\n google.maps.event.removeListener(listener)\n }\n\n this.listeners = []\n\n this.activeMap = null\n\n this.ready = false\n }\n\n draw(): void { return }\n\n getMap(): null { return null }\n\n getPanes(): null { return null }\n\n getProjection() {\n return {\n fromContainerPixelToLatLng(): null { return null },\n fromDivPixelToLatLng(): null { return null},\n fromLatLngToContainerPixel(): null { return null},\n fromLatLngToDivPixel(): null { return null},\n getVisibleRegion(): null { return null },\n getWorldWidth(): number { return 0 }\n }\n }\n\n setMap(): void { return }\n\n addListener() {\n return {\n remove() { return }\n }\n }\n\n bindTo(): void { return }\n\n get(): void { return }\n\n notify(): void { return }\n\n set(): void { return }\n setValues(): void { return }\n unbind(): void { return }\n unbindAll(): void { return }\n\n setupStyles(): void {\n if (this.styles.length > 0) {\n return\n }\n\n for (let i = 0; i < this.imageSizes.length; i++) {\n this.styles.push({\n url: `${this.imagePath + (i + 1)}.${this.imageExtension}`,\n height: this.imageSizes[i] || 0,\n width: this.imageSizes[i] || 0,\n })\n }\n }\n\n fitMapToMarkers(): void {\n const markers = this.getMarkers()\n\n const bounds = new google.maps.LatLngBounds()\n\n for (const marker of markers) {\n const position = marker.getPosition()\n\n if (position) {\n bounds.extend(position)\n }\n }\n\n const map = (this as unknown as google.maps.OverlayView).getMap()\n\n if (map !== null && 'fitBounds' in map) {\n map.fitBounds(bounds)\n }\n\n }\n\n getGridSize(): number {\n return this.gridSize\n }\n\n setGridSize(gridSize: number) {\n this.gridSize = gridSize\n }\n\n getMinimumClusterSize(): number {\n return this.minClusterSize\n }\n\n setMinimumClusterSize(minimumClusterSize: number) {\n this.minClusterSize = minimumClusterSize\n }\n\n getMaxZoom(): number | null {\n return this.maxZoom\n }\n\n setMaxZoom(maxZoom: number) {\n this.maxZoom = maxZoom\n }\n\n getStyles(): ClusterIconStyle[] {\n return this.styles\n }\n\n setStyles(styles: ClusterIconStyle[]) {\n this.styles = styles\n }\n\n getTitle(): string {\n return this.title\n }\n\n setTitle(title: string) {\n this.title = title\n }\n\n getZoomOnClick(): boolean {\n return this.zoomOnClick\n }\n\n setZoomOnClick(zoomOnClick: boolean) {\n this.zoomOnClick = zoomOnClick\n }\n\n getAverageCenter(): boolean {\n return this.averageCenter\n }\n\n setAverageCenter(averageCenter: boolean) {\n this.averageCenter = averageCenter\n }\n\n getIgnoreHidden(): boolean {\n return this.ignoreHidden\n }\n\n setIgnoreHidden(ignoreHidden: boolean) {\n this.ignoreHidden = ignoreHidden\n }\n\n getEnableRetinaIcons(): boolean {\n return this.enableRetinaIcons\n }\n\n setEnableRetinaIcons(enableRetinaIcons: boolean) {\n this.enableRetinaIcons = enableRetinaIcons\n }\n\n getImageExtension(): string {\n return this.imageExtension\n }\n\n setImageExtension(imageExtension: string) {\n this.imageExtension = imageExtension\n }\n\n getImagePath(): string {\n return this.imagePath\n }\n\n setImagePath(imagePath: string) {\n this.imagePath = imagePath\n }\n\n getImageSizes(): number[] {\n return this.imageSizes\n }\n\n setImageSizes(imageSizes: number[]) {\n this.imageSizes = imageSizes\n }\n\n getCalculator(): TCalculator {\n return this.calculator\n }\n\n setCalculator(calculator: TCalculator) {\n this.calculator = calculator\n }\n\n getBatchSizeIE(): number {\n return this.batchSizeIE\n }\n\n setBatchSizeIE(batchSizeIE: number) {\n this.batchSizeIE = batchSizeIE\n }\n\n getClusterClass(): string {\n return this.clusterClass\n }\n\n setClusterClass(clusterClass: string) {\n this.clusterClass = clusterClass\n }\n\n getMarkers(): MarkerExtended[] {\n return this.markers\n }\n\n getTotalMarkers(): number {\n return this.markers.length\n }\n\n getClusters(): Cluster[] {\n return this.clusters\n }\n\n getTotalClusters(): number {\n return this.clusters.length\n }\n\n addMarker(marker: MarkerExtended, optNoDraw: boolean) {\n this.pushMarkerTo(marker)\n\n if (!optNoDraw) {\n this.redraw()\n }\n }\n\n addMarkers(markers: MarkerExtended[], optNoDraw: boolean) {\n for (const key in markers) {\n if (Object.prototype.hasOwnProperty.call(markers, key)) {\n const marker = markers[key]\n\n if (marker) {\n this.pushMarkerTo(marker)\n }\n }\n }\n\n if (!optNoDraw) {\n this.redraw()\n }\n }\n\n pushMarkerTo(marker: MarkerExtended) {\n // If the marker is draggable add a listener so we can update the clusters on the dragend:\n if (marker.getDraggable()) {\n google.maps.event.addListener(marker, 'dragend', () => {\n if (this.ready) {\n marker.isAdded = false\n\n this.repaint()\n }\n })\n }\n\n marker.isAdded = false\n\n this.markers.push(marker)\n }\n\n removeMarker_(marker: MarkerExtended): boolean {\n let index = -1\n\n if (this.markers.indexOf) {\n index = this.markers.indexOf(marker)\n } else {\n for (let i = 0; i < this.markers.length; i++) {\n if (marker === this.markers[i]) {\n index = i\n\n break\n }\n }\n }\n\n if (index === -1) {\n // Marker is not in our list of markers, so do nothing:\n return false\n }\n\n marker.setMap(null)\n\n this.markers.splice(index, 1) // Remove the marker from the list of managed markers\n\n return true\n }\n\n removeMarker(marker: MarkerExtended, optNoDraw: boolean): boolean {\n const removed = this.removeMarker_(marker)\n\n if (!optNoDraw && removed) {\n this.repaint()\n }\n\n return removed\n }\n\n removeMarkers(markers: MarkerExtended[], optNoDraw: boolean): boolean {\n let removed = false\n\n for (const marker of markers) {\n removed = removed || this.removeMarker_(marker)\n }\n\n if (!optNoDraw && removed) {\n this.repaint()\n }\n\n return removed\n }\n\n clearMarkers() {\n this.resetViewport(true)\n\n this.markers = []\n }\n\n repaint() {\n const oldClusters = this.clusters.slice()\n\n this.clusters = []\n\n this.resetViewport(false)\n\n this.redraw()\n\n // Remove the old clusters.\n // Do it in a timeout to prevent blinking effect.\n setTimeout(function timeout() {\n for (const oldCluster of oldClusters) {\n oldCluster.remove()\n }\n }, 0)\n }\n\n getExtendedBounds(bounds: google.maps.LatLngBounds): google.maps.LatLngBounds {\n const projection = (this as unknown as google.maps.OverlayView).getProjection()\n\n // Convert the points to pixels and the extend out by the grid size.\n const trPix = projection.fromLatLngToDivPixel(\n // Turn the bounds into latlng.\n new google.maps.LatLng(bounds.getNorthEast().lat(), bounds.getNorthEast().lng())\n )\n\n if (trPix !== null) {\n trPix.x += this.gridSize\n trPix.y -= this.gridSize\n }\n\n const blPix = projection.fromLatLngToDivPixel(\n // Turn the bounds into latlng.\n new google.maps.LatLng(bounds.getSouthWest().lat(), bounds.getSouthWest().lng())\n )\n\n if (blPix !== null) {\n blPix.x -= this.gridSize\n blPix.y += this.gridSize\n }\n\n\n // Extend the bounds to contain the new bounds.\n if (trPix !== null) {\n // Convert the pixel points back to LatLng nw\n const point1 = projection.fromDivPixelToLatLng(trPix)\n\n if (point1 !== null) {\n bounds.extend(point1)\n }\n }\n\n if (blPix !== null) {\n // Convert the pixel points back to LatLng sw\n const point2 = projection.fromDivPixelToLatLng(blPix)\n\n if (point2 !== null) {\n bounds.extend(\n point2\n )\n }\n }\n\n\n return bounds\n }\n\n redraw() {\n // Redraws all the clusters.\n this.createClusters(0)\n }\n\n resetViewport(optHide: boolean) {\n // Remove all the clusters\n for (const cluster of this.clusters) {\n cluster.remove()\n }\n\n this.clusters = []\n\n // Reset the markers to not be added and to be removed from the map.\n for (const marker of this.markers) {\n marker.isAdded = false\n\n if (optHide) {\n marker.setMap(null)\n }\n }\n }\n\n distanceBetweenPoints(p1: google.maps.LatLng, p2: google.maps.LatLng): number {\n const R = 6371 // Radius of the Earth in km\n\n const dLat = ((p2.lat() - p1.lat()) * Math.PI) / 180\n const dLon = ((p2.lng() - p1.lng()) * Math.PI) / 180\n\n const a =\n Math.sin(dLat / 2) * Math.sin(dLat / 2) +\n Math.cos((p1.lat() * Math.PI) / 180) *\n Math.cos((p2.lat() * Math.PI) / 180) *\n Math.sin(dLon / 2) *\n Math.sin(dLon / 2)\n\n return R * (2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)))\n }\n\n isMarkerInBounds(marker: MarkerExtended, bounds: google.maps.LatLngBounds): boolean {\n const position = marker.getPosition()\n\n if (position) {\n return bounds.contains(position)\n }\n\n return false\n }\n\n addToClosestCluster(marker: MarkerExtended) {\n let cluster\n\n let distance = 40000 // Some large number\n\n let clusterToAddTo = null\n\n for (const clusterElement of this.clusters) {\n cluster = clusterElement\n\n const center = cluster.getCenter()\n\n const position = marker.getPosition()\n\n if (center && position) {\n const d = this.distanceBetweenPoints(center, position)\n\n if (d < distance) {\n distance = d\n\n clusterToAddTo = cluster\n }\n }\n }\n\n if (clusterToAddTo && clusterToAddTo.isMarkerInClusterBounds(marker)) {\n clusterToAddTo.addMarker(marker)\n } else {\n cluster = new Cluster(this)\n\n cluster.addMarker(marker)\n\n this.clusters.push(cluster)\n }\n }\n\n createClusters(iFirst: number) {\n if (!this.ready) {\n return\n }\n\n // Cancel previous batch processing if we're working on the first batch:\n if (iFirst === 0) {\n /**\n * This event is fired when the <code>Clusterer</code> begins\n * clustering markers.\n * @name Clusterer#clusteringbegin\n * @param {Clusterer} mc The Clusterer whose markers are being clustered.\n * @event\n */\n google.maps.event.trigger(this, 'clusteringbegin', this)\n\n if (this.timerRefStatic !== null) {\n window.clearTimeout(this.timerRefStatic)\n\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n delete this.timerRefStatic\n }\n }\n\n const map = (this as unknown as google.maps.OverlayView).getMap()\n\n const bounds = map !== null && 'getBounds' in map ? map.getBounds() : null\n\n const zoom = map?.getZoom() || 0\n // Get our current map view bounds.\n // Create a new bounds object so we don't affect the map.\n //\n // See Comments 9 & 11 on Issue 3651 relating to this workaround for a Google Maps bug:\n const mapBounds = zoom > 3\n ? new google.maps.LatLngBounds(\n bounds?.getSouthWest(),\n bounds?.getNorthEast()\n )\n : new google.maps.LatLngBounds(\n new google.maps.LatLng(85.02070771743472, -178.48388434375),\n new google.maps.LatLng(-85.08136444384544, 178.00048865625)\n )\n\n const extendedMapBounds = this.getExtendedBounds(mapBounds)\n\n const iLast = Math.min(iFirst + this.batchSize, this.markers.length)\n\n for (let i = iFirst; i < iLast; i++) {\n const marker = this.markers[i]\n\n if (marker && !marker.isAdded && this.isMarkerInBounds(marker, extendedMapBounds) && (!this.ignoreHidden || (this.ignoreHidden && marker.getVisible()))) {\n this.addToClosestCluster(marker)\n }\n }\n\n if (iLast < this.markers.length) {\n this.timerRefStatic = window.setTimeout(\n () => {\n this.createClusters(iLast)\n },\n 0\n )\n } else {\n this.timerRefStatic = null\n\n /**\n * This event is fired when the <code>Clusterer</code> stops\n * clustering markers.\n * @name Clusterer#clusteringend\n * @param {Clusterer} mc The Clusterer whose markers are being clustered.\n * @event\n */\n google.maps.event.trigger(this, 'clusteringend', this)\n\n for (const cluster of this.clusters) {\n cluster.updateIcon()\n }\n }\n }\n\n extend<A extends typeof Clusterer | typeof ClusterIcon>(obj1: A, obj2: typeof google.maps.OverlayView): A {\n return function applyExtend(this: A, object: typeof google.maps.OverlayView): A {\n for (const property in object.prototype) {\n\n // eslint-disable-next-line @typescript-eslint/ban-types\n const prop = property as keyof google.maps.OverlayView & (string & {})\n\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n this.prototype[prop] = object.prototype[prop]\n }\n\n return this\n }.apply<A, [typeof google.maps.OverlayView], A>(obj1, [obj2])\n }\n}\n"],"names":["ClusterIcon","cluster","styles","getClusterer","extend","google","maps","OverlayView","this","clusterClassName","getClusterClass","className","center","undefined","div","sums","visible","boundsChangedListener","url","height","width","anchorText","anchorIcon","textColor","textSize","textDecoration","fontWeight","fontStyle","fontFamily","backgroundPosition","cMouseDownInCluster","cDraggingMapByCluster","timeOut","setMap","getMap","onBoundsChanged","bind","onMouseDown","onClick","onMouseOver","onMouseOut","onAdd","onRemove","draw","hide","show","useStyle","setCenter","getPosFromLatLng","prototype","event","markerClusterer_1","trigger","getZoomOnClick","maxZoom_1","getMaxZoom","bounds_1","getBounds","map","fitBounds","window","setTimeout","zoom","getZoom","setZoom","cancelBubble","stopPropagation","document","createElement","_a","getPanes","overlayMouseTarget","appendChild","addListener","addEventListener","parentNode","removeListener","removeEventListener","removeChild","clearTimeout","pos","style","top","concat","y","left","x","display","divTitle","title","getTitle","bp","split","spriteH","parseInt","replace","spriteV","_b","setAttribute","img","alt","src","enableRetinaIcons","clip","textElm","_c","text","innerText","_d","_e","html","innerHTML","_f","getStyles","Math","min","length","max","index","latlng","getProjection","fromLatLngToDivPixel","Cluster","markerClusterer","gridSize","getGridSize","minClusterSize","getMinimumClusterSize","averageCenter","getAverageCenter","markers","bounds","clusterIcon","getSize","getMarkers","getCenter","remove","addMarker","isMarkerInClusterBounds","calculateBounds","updateIcon","isMarkerAlreadyAdded","LatLngBounds","markers_1","_i","position","getPosition","marker","length_1","LatLng","lat","lng","isAdded","push","mCount","maxZoom","contains","getExtendedBounds","getCalculator","includes","i","CALCULATOR","numStyles","count","numberOfDigits","toString","BATCH_SIZE","BATCH_SIZE_IE","IMAGE_PATH","IMAGE_EXTENSION","IMAGE_SIZES","CLUSTERER_CLASS","Clusterer","optMarkers","optOptions","setMinimumClusterSize","getEnableRetinaIcons","setEnableRetinaIcons","addToClosestCluster","getImageExtension","setImageExtension","setAverageCenter","getTotalClusters","fitMapToMarkers","getIgnoreHidden","setIgnoreHidden","setClusterClass","getTotalMarkers","setZoomOnClick","getBatchSizeIE","setBatchSizeIE","createClusters","onZoomChanged","getImageSizes","setImageSizes","setCalculator","removeMarkers","resetViewport","getImagePath","setImagePath","pushMarkerTo","removeMarker","clearMarkers","setupStyles","setGridSize","getClusters","setMaxZoom","addMarkers","setStyles","setTitle","repaint","onIdle","redraw","clusters","listeners","activeMap","ready","minimumClusterSize","zoomOnClick","ignoreHidden","imagePath","imageExtension","imageSizes","calculator","batchSize","batchSizeIE","clusterClass","navigator","userAgent","toLowerCase","indexOf","timerRefStatic","get","listener","fromContainerPixelToLatLng","fromDivPixelToLatLng","fromLatLngToContainerPixel","getVisibleRegion","getWorldWidth","bindTo","notify","set","setValues","unbind","unbindAll","optNoDraw","key","Object","hasOwnProperty","call","_this","getDraggable","removeMarker_","splice","removed","markers_2","oldClusters","slice","oldClusters_1","projection","trPix","getNorthEast","blPix","getSouthWest","point1","point2","optHide","distanceBetweenPoints","p1","p2","dLat","PI","dLon","a","sin","cos","atan2","sqrt","isMarkerInBounds","distance","clusterToAddTo","d","iFirst","mapBounds","extendedMapBounds","iLast","getVisible","obj1","obj2","object","property","prop","apply"],"mappings":"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"}
|
package/dist/esm.js
CHANGED
|
@@ -463,9 +463,9 @@ var Clusterer = /** @class */ (function () {
|
|
|
463
463
|
this.repaint = this.repaint.bind(this);
|
|
464
464
|
this.onIdle = this.onIdle.bind(this);
|
|
465
465
|
this.redraw = this.redraw.bind(this);
|
|
466
|
-
this.extend = this.extend.bind(this);
|
|
467
466
|
this.onAdd = this.onAdd.bind(this);
|
|
468
467
|
this.draw = this.draw.bind(this);
|
|
468
|
+
this.extend = this.extend.bind(this);
|
|
469
469
|
this.extend(Clusterer, google.maps.OverlayView);
|
|
470
470
|
this.markers = [];
|
|
471
471
|
this.clusters = [];
|
|
@@ -562,6 +562,31 @@ var Clusterer = /** @class */ (function () {
|
|
|
562
562
|
this.ready = false;
|
|
563
563
|
};
|
|
564
564
|
Clusterer.prototype.draw = function () { return; };
|
|
565
|
+
Clusterer.prototype.getMap = function () { return null; };
|
|
566
|
+
Clusterer.prototype.getPanes = function () { return null; };
|
|
567
|
+
Clusterer.prototype.getProjection = function () {
|
|
568
|
+
return {
|
|
569
|
+
fromContainerPixelToLatLng: function () { return null; },
|
|
570
|
+
fromDivPixelToLatLng: function () { return null; },
|
|
571
|
+
fromLatLngToContainerPixel: function () { return null; },
|
|
572
|
+
fromLatLngToDivPixel: function () { return null; },
|
|
573
|
+
getVisibleRegion: function () { return null; },
|
|
574
|
+
getWorldWidth: function () { return 0; }
|
|
575
|
+
};
|
|
576
|
+
};
|
|
577
|
+
Clusterer.prototype.setMap = function () { return; };
|
|
578
|
+
Clusterer.prototype.addListener = function () {
|
|
579
|
+
return {
|
|
580
|
+
remove: function () { return; }
|
|
581
|
+
};
|
|
582
|
+
};
|
|
583
|
+
Clusterer.prototype.bindTo = function () { return; };
|
|
584
|
+
Clusterer.prototype.get = function () { return; };
|
|
585
|
+
Clusterer.prototype.notify = function () { return; };
|
|
586
|
+
Clusterer.prototype.set = function () { return; };
|
|
587
|
+
Clusterer.prototype.setValues = function () { return; };
|
|
588
|
+
Clusterer.prototype.unbind = function () { return; };
|
|
589
|
+
Clusterer.prototype.unbindAll = function () { return; };
|
|
565
590
|
Clusterer.prototype.setupStyles = function () {
|
|
566
591
|
if (this.styles.length > 0) {
|
|
567
592
|
return;
|
|
@@ -943,12 +968,13 @@ var Clusterer = /** @class */ (function () {
|
|
|
943
968
|
Clusterer.prototype.extend = function (obj1, obj2) {
|
|
944
969
|
return function applyExtend(object) {
|
|
945
970
|
for (var property in object.prototype) {
|
|
971
|
+
// eslint-disable-next-line @typescript-eslint/ban-types
|
|
972
|
+
var prop = property;
|
|
946
973
|
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
947
974
|
// @ts-ignore
|
|
948
|
-
this.prototype[
|
|
975
|
+
this.prototype[prop] = object.prototype[prop];
|
|
949
976
|
}
|
|
950
977
|
return this;
|
|
951
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
952
978
|
}.apply(obj1, [obj2]);
|
|
953
979
|
};
|
|
954
980
|
return Clusterer;
|