@react-google-maps/marker-clusterer 2.16.0 → 2.19.0
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/Cluster.d.ts +28 -0
- package/dist/ClusterIcon.d.ts +43 -0
- package/dist/Clusterer.d.ts +86 -0
- package/dist/__tests__/clusterer.test.d.ts +4 -0
- package/dist/cjs.js +71 -51
- 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 +71 -51
- 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 +31 -31
- package/dist/types.d.ts +44 -0
- package/dist/umd.js +71 -51
- 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 +9 -8
- package/src/Cluster.tsx +7 -7
- package/src/ClusterIcon.tsx +24 -21
- package/src/Clusterer.tsx +32 -28
- package/src/types.tsx +29 -29
package/dist/umd.min.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"umd.min.js","sources":["../src/ClusterIcon.tsx","../src/Cluster.tsx","../src/Clusterer.tsx"],"sourcesContent":["/* global google */\n/* eslint-disable filenames/match-regex */\nimport { Cluster } from './Cluster'\n\nimport { 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[]\n anchorIcon: 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, ''), 10)\n const spriteV = parseInt(bp[1].replace(/^\\s+|\\s+$/g, ''), 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 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 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 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/* eslint-disable filenames/match-regex */\nimport { Clusterer } from './Clusterer'\n\nimport { ClusterIcon } from './ClusterIcon'\n\nimport { 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 (let i = 0; i < markers.length; i++) {\n const position = markers[i].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 (let i = 0; i < mCount; i++) {\n this.markers[i].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 { ClusterIcon } from './ClusterIcon'\n\nimport {\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 (let i = 0; i < this.markers.length; i++) {\n if (this.markers[i].getMap() !== this.activeMap) {\n this.markers[i].setMap(this.activeMap)\n }\n }\n\n // Remove all clusters:\n for (let i = 0; i < this.clusters.length; i++) {\n this.clusters[i].remove()\n }\n\n this.clusters = []\n\n // Remove map event listeners:\n for (let i = 0; i < this.listeners.length; i++) {\n google.maps.event.removeListener(this.listeners[i])\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],\n width: this.imageSizes[i],\n })\n }\n }\n\n fitMapToMarkers() {\n const markers = this.getMarkers()\n\n const bounds = new google.maps.LatLngBounds()\n\n for (let i = 0; i < markers.length; i++) {\n const position = markers[i].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 this.pushMarkerTo(markers[key])\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 (let i = 0; i < markers.length; i++) {\n removed = removed || this.removeMarker_(markers[i])\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 (let i = 0; i < oldClusters.length; i++) {\n oldClusters[i].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 (let i = 0; i < this.clusters.length; i++) {\n this.clusters[i].remove()\n }\n\n this.clusters = []\n\n // Reset the markers to not be added and to be removed from the map.\n for (let i = 0; i < this.markers.length; i++) {\n const marker = this.markers[i]\n\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 (let i = 0; i < this.clusters.length; i++) {\n cluster = this.clusters[i]\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.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 (let i = 0; i < this.clusters.length; i++) {\n this.clusters[i].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 // @ts-ignore\n this.prototype[property] = object.prototype[property as keyof google.maps.OverlayView]\n }\n\n return this\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","setAttribute","img","alt","src","enableRetinaIcons","clip","textElm","text","innerText","_b","_c","html","innerHTML","_d","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","i","position","getPosition","marker","length_1","LatLng","lat","lng","isAdded","push","mCount","maxZoom","contains","getExtendedBounds","getCalculator","includes","CALCULATOR","numStyles","count","numberOfDigits","toString","IMAGE_SIZES","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","optNoDraw","key","Object","hasOwnProperty","call","_this","getDraggable","removeMarker_","splice","removed","oldClusters","slice","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":"umd.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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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@react-google-maps/marker-clusterer",
|
|
3
3
|
"sideEffects": false,
|
|
4
|
-
"version": "2.
|
|
4
|
+
"version": "2.19.0",
|
|
5
5
|
"description": "Marker Clusterer for React.js Google Maps API",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"author": {
|
|
@@ -54,15 +54,16 @@
|
|
|
54
54
|
"devDependencies": {
|
|
55
55
|
"@rollup/plugin-commonjs": "22.0.1",
|
|
56
56
|
"@rollup/plugin-node-resolve": "13.3.0",
|
|
57
|
-
"@rollup/plugin-typescript": "
|
|
57
|
+
"@rollup/plugin-typescript": "11.1.2",
|
|
58
58
|
"@types/babel-types": "7.0.11",
|
|
59
|
-
"@types/google.maps": "3.
|
|
60
|
-
"jest": "29.
|
|
61
|
-
"jest-cli": "29.
|
|
62
|
-
"rimraf": "
|
|
59
|
+
"@types/google.maps": "3.53.4",
|
|
60
|
+
"jest": "29.6.1",
|
|
61
|
+
"jest-cli": "29.6.1",
|
|
62
|
+
"rimraf": "5.0.1",
|
|
63
63
|
"rollup": "2.77.0",
|
|
64
|
-
"rollup-plugin-dts": "
|
|
65
|
-
"rollup-plugin-terser": "7.0.2"
|
|
64
|
+
"rollup-plugin-dts": "5.3.0",
|
|
65
|
+
"rollup-plugin-terser": "7.0.2",
|
|
66
|
+
"typescript": "5.1.6"
|
|
66
67
|
},
|
|
67
68
|
"gitHead": "80167ddcc3d8e356dbf0b0c3a6292c6a3a989f83"
|
|
68
69
|
}
|
package/src/Cluster.tsx
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
/* global google */
|
|
2
|
-
|
|
3
|
-
import { Clusterer } from './Clusterer'
|
|
2
|
+
|
|
3
|
+
import type { Clusterer } from './Clusterer'
|
|
4
4
|
|
|
5
5
|
import { ClusterIcon } from './ClusterIcon'
|
|
6
6
|
|
|
7
|
-
import { MarkerExtended } from './types'
|
|
7
|
+
import type { MarkerExtended } from './types'
|
|
8
8
|
|
|
9
9
|
export class Cluster {
|
|
10
10
|
markerClusterer: Clusterer
|
|
@@ -75,8 +75,8 @@ export class Cluster {
|
|
|
75
75
|
|
|
76
76
|
const markers = this.getMarkers()
|
|
77
77
|
|
|
78
|
-
for (
|
|
79
|
-
const position =
|
|
78
|
+
for (const marker of markers) {
|
|
79
|
+
const position = marker.getPosition()
|
|
80
80
|
|
|
81
81
|
if (position) {
|
|
82
82
|
bounds.extend(position)
|
|
@@ -148,8 +148,8 @@ export class Cluster {
|
|
|
148
148
|
}
|
|
149
149
|
} else if (mCount === this.minClusterSize) {
|
|
150
150
|
// Hide the markers that were showing.
|
|
151
|
-
for (
|
|
152
|
-
|
|
151
|
+
for (const markerElement of this.markers) {
|
|
152
|
+
markerElement.setMap(null)
|
|
153
153
|
}
|
|
154
154
|
} else {
|
|
155
155
|
marker.setMap(null)
|
package/src/ClusterIcon.tsx
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/* global google */
|
|
2
2
|
/* eslint-disable filenames/match-regex */
|
|
3
|
-
import { Cluster } from './Cluster'
|
|
3
|
+
import type { Cluster } from './Cluster'
|
|
4
4
|
|
|
5
|
-
import { ClusterIconStyle, ClusterIconInfo } from './types'
|
|
5
|
+
import type { ClusterIconStyle, ClusterIconInfo } from './types'
|
|
6
6
|
|
|
7
7
|
export class ClusterIcon {
|
|
8
8
|
cluster: Cluster
|
|
@@ -16,8 +16,8 @@ export class ClusterIcon {
|
|
|
16
16
|
url: string
|
|
17
17
|
height: number
|
|
18
18
|
width: number
|
|
19
|
-
anchorText: number
|
|
20
|
-
anchorIcon: number
|
|
19
|
+
anchorText: [number, number]
|
|
20
|
+
anchorIcon: [number, number]
|
|
21
21
|
textColor: string
|
|
22
22
|
textSize: number
|
|
23
23
|
textDecoration: string
|
|
@@ -274,13 +274,13 @@ export class ClusterIcon {
|
|
|
274
274
|
// NOTE: values must be specified in px units
|
|
275
275
|
const bp = this.backgroundPosition.split(' ')
|
|
276
276
|
|
|
277
|
-
const spriteH = parseInt(bp[0]
|
|
278
|
-
const spriteV = parseInt(bp[1]
|
|
277
|
+
const spriteH = parseInt(bp[0]?.replace(/^\s+|\s+$/g, '') || '0', 10)
|
|
278
|
+
const spriteV = parseInt(bp[1]?.replace(/^\s+|\s+$/g, '') || '0', 10)
|
|
279
279
|
|
|
280
280
|
const pos = this.getPosFromLatLng(this.center)
|
|
281
281
|
|
|
282
282
|
this.div.className = this.className
|
|
283
|
-
this.div .setAttribute('style', `cursor:
|
|
283
|
+
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; `)
|
|
284
284
|
|
|
285
285
|
const img = document.createElement('img')
|
|
286
286
|
|
|
@@ -324,29 +324,32 @@ export class ClusterIcon {
|
|
|
324
324
|
const style =
|
|
325
325
|
styles[Math.min(styles.length - 1, Math.max(0, sums.index - 1))]
|
|
326
326
|
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
327
|
+
if (style) {
|
|
328
|
+
this.url = style.url
|
|
329
|
+
this.height = style.height
|
|
330
|
+
this.width = style.width
|
|
330
331
|
|
|
331
|
-
|
|
332
|
-
|
|
332
|
+
if (style.className) {
|
|
333
|
+
this.className = `${this.clusterClassName} ${style.className}`
|
|
334
|
+
}
|
|
333
335
|
|
|
334
|
-
|
|
335
|
-
|
|
336
|
+
this.anchorText = style.anchorText || [0, 0]
|
|
337
|
+
this.anchorIcon = style.anchorIcon || [this.height / 2, this.width / 2]
|
|
336
338
|
|
|
337
|
-
|
|
339
|
+
this.textColor = style.textColor || 'black'
|
|
338
340
|
|
|
339
|
-
|
|
341
|
+
this.textSize = style.textSize || 11
|
|
340
342
|
|
|
341
|
-
|
|
343
|
+
this.textDecoration = style.textDecoration || 'none'
|
|
342
344
|
|
|
343
|
-
|
|
345
|
+
this.fontWeight = style.fontWeight || 'bold'
|
|
344
346
|
|
|
345
|
-
|
|
347
|
+
this.fontStyle = style.fontStyle || 'normal'
|
|
346
348
|
|
|
347
|
-
|
|
349
|
+
this.fontFamily = style.fontFamily || 'Arial,sans-serif'
|
|
348
350
|
|
|
349
|
-
|
|
351
|
+
this.backgroundPosition = style.backgroundPosition || '0 0'
|
|
352
|
+
}
|
|
350
353
|
}
|
|
351
354
|
|
|
352
355
|
setCenter(center: google.maps.LatLng) {
|
package/src/Clusterer.tsx
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
/* global google */
|
|
2
2
|
/* eslint-disable filenames/match-regex */
|
|
3
3
|
import { Cluster } from './Cluster'
|
|
4
|
-
import { ClusterIcon } from './ClusterIcon'
|
|
4
|
+
import type { ClusterIcon } from './ClusterIcon'
|
|
5
5
|
|
|
6
|
-
import {
|
|
6
|
+
import type {
|
|
7
7
|
MarkerExtended,
|
|
8
8
|
ClustererOptions,
|
|
9
9
|
ClusterIconStyle,
|
|
@@ -242,22 +242,22 @@ export class Clusterer {
|
|
|
242
242
|
|
|
243
243
|
onRemove() {
|
|
244
244
|
// Put all the managed markers back on the map:
|
|
245
|
-
for (
|
|
246
|
-
if (
|
|
247
|
-
|
|
245
|
+
for (const marker of this.markers) {
|
|
246
|
+
if (marker.getMap() !== this.activeMap) {
|
|
247
|
+
marker.setMap(this.activeMap)
|
|
248
248
|
}
|
|
249
249
|
}
|
|
250
250
|
|
|
251
251
|
// Remove all clusters:
|
|
252
|
-
for (
|
|
253
|
-
|
|
252
|
+
for (const cluster of this.clusters) {
|
|
253
|
+
cluster.remove()
|
|
254
254
|
}
|
|
255
255
|
|
|
256
256
|
this.clusters = []
|
|
257
257
|
|
|
258
258
|
// Remove map event listeners:
|
|
259
|
-
for (
|
|
260
|
-
google.maps.event.removeListener(
|
|
259
|
+
for (const listener of this.listeners) {
|
|
260
|
+
google.maps.event.removeListener(listener)
|
|
261
261
|
}
|
|
262
262
|
|
|
263
263
|
this.listeners = []
|
|
@@ -277,8 +277,8 @@ export class Clusterer {
|
|
|
277
277
|
for (let i = 0; i < this.imageSizes.length; i++) {
|
|
278
278
|
this.styles.push({
|
|
279
279
|
url: `${this.imagePath + (i + 1)}.${this.imageExtension}`,
|
|
280
|
-
height: this.imageSizes[i],
|
|
281
|
-
width: this.imageSizes[i],
|
|
280
|
+
height: this.imageSizes[i] || 0,
|
|
281
|
+
width: this.imageSizes[i] || 0,
|
|
282
282
|
})
|
|
283
283
|
}
|
|
284
284
|
}
|
|
@@ -288,8 +288,8 @@ export class Clusterer {
|
|
|
288
288
|
|
|
289
289
|
const bounds = new google.maps.LatLngBounds()
|
|
290
290
|
|
|
291
|
-
for (
|
|
292
|
-
const position =
|
|
291
|
+
for (const marker of markers) {
|
|
292
|
+
const position = marker.getPosition()
|
|
293
293
|
|
|
294
294
|
if (position) {
|
|
295
295
|
bounds.extend(position)
|
|
@@ -451,7 +451,11 @@ export class Clusterer {
|
|
|
451
451
|
addMarkers(markers: MarkerExtended[], optNoDraw: boolean) {
|
|
452
452
|
for (const key in markers) {
|
|
453
453
|
if (Object.prototype.hasOwnProperty.call(markers, key)) {
|
|
454
|
-
|
|
454
|
+
const marker = markers[key]
|
|
455
|
+
|
|
456
|
+
if (marker) {
|
|
457
|
+
this.pushMarkerTo(marker)
|
|
458
|
+
}
|
|
455
459
|
}
|
|
456
460
|
}
|
|
457
461
|
|
|
@@ -517,8 +521,8 @@ export class Clusterer {
|
|
|
517
521
|
removeMarkers(markers: MarkerExtended[], optNoDraw: boolean): boolean {
|
|
518
522
|
let removed = false
|
|
519
523
|
|
|
520
|
-
for (
|
|
521
|
-
removed = removed || this.removeMarker_(
|
|
524
|
+
for (const marker of markers) {
|
|
525
|
+
removed = removed || this.removeMarker_(marker)
|
|
522
526
|
}
|
|
523
527
|
|
|
524
528
|
if (!optNoDraw && removed) {
|
|
@@ -546,8 +550,8 @@ export class Clusterer {
|
|
|
546
550
|
// Remove the old clusters.
|
|
547
551
|
// Do it in a timeout to prevent blinking effect.
|
|
548
552
|
setTimeout(function timeout() {
|
|
549
|
-
for (
|
|
550
|
-
|
|
553
|
+
for (const oldCluster of oldClusters) {
|
|
554
|
+
oldCluster.remove()
|
|
551
555
|
}
|
|
552
556
|
}, 0)
|
|
553
557
|
}
|
|
@@ -609,16 +613,14 @@ export class Clusterer {
|
|
|
609
613
|
|
|
610
614
|
resetViewport(optHide: boolean) {
|
|
611
615
|
// Remove all the clusters
|
|
612
|
-
for (
|
|
613
|
-
|
|
616
|
+
for (const cluster of this.clusters) {
|
|
617
|
+
cluster.remove()
|
|
614
618
|
}
|
|
615
619
|
|
|
616
620
|
this.clusters = []
|
|
617
621
|
|
|
618
622
|
// Reset the markers to not be added and to be removed from the map.
|
|
619
|
-
for (
|
|
620
|
-
const marker = this.markers[i]
|
|
621
|
-
|
|
623
|
+
for (const marker of this.markers) {
|
|
622
624
|
marker.isAdded = false
|
|
623
625
|
|
|
624
626
|
if (optHide) {
|
|
@@ -660,8 +662,8 @@ export class Clusterer {
|
|
|
660
662
|
|
|
661
663
|
let clusterToAddTo = null
|
|
662
664
|
|
|
663
|
-
for (
|
|
664
|
-
cluster =
|
|
665
|
+
for (const clusterElement of this.clusters) {
|
|
666
|
+
cluster = clusterElement
|
|
665
667
|
|
|
666
668
|
const center = cluster.getCenter()
|
|
667
669
|
|
|
@@ -740,7 +742,7 @@ export class Clusterer {
|
|
|
740
742
|
for (let i = iFirst; i < iLast; i++) {
|
|
741
743
|
const marker = this.markers[i]
|
|
742
744
|
|
|
743
|
-
if (!marker.isAdded && this.isMarkerInBounds(marker, extendedMapBounds) && (!this.ignoreHidden || (this.ignoreHidden && marker.getVisible()))) {
|
|
745
|
+
if (marker && !marker.isAdded && this.isMarkerInBounds(marker, extendedMapBounds) && (!this.ignoreHidden || (this.ignoreHidden && marker.getVisible()))) {
|
|
744
746
|
this.addToClosestCluster(marker)
|
|
745
747
|
}
|
|
746
748
|
}
|
|
@@ -764,8 +766,8 @@ export class Clusterer {
|
|
|
764
766
|
*/
|
|
765
767
|
google.maps.event.trigger(this, 'clusteringend', this)
|
|
766
768
|
|
|
767
|
-
for (
|
|
768
|
-
|
|
769
|
+
for (const cluster of this.clusters) {
|
|
770
|
+
cluster.updateIcon()
|
|
769
771
|
}
|
|
770
772
|
}
|
|
771
773
|
}
|
|
@@ -773,11 +775,13 @@ export class Clusterer {
|
|
|
773
775
|
extend<A extends typeof ClusterIcon | typeof Clusterer>(obj1: A, obj2: typeof google.maps.OverlayView): A {
|
|
774
776
|
return function applyExtend(this: A, object: typeof google.maps.OverlayView): A {
|
|
775
777
|
for (const property in object.prototype) {
|
|
778
|
+
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
776
779
|
// @ts-ignore
|
|
777
780
|
this.prototype[property] = object.prototype[property as keyof google.maps.OverlayView]
|
|
778
781
|
}
|
|
779
782
|
|
|
780
783
|
return this
|
|
784
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
781
785
|
}.apply<A, [typeof google.maps.OverlayView], any>(obj1, [obj2])
|
|
782
786
|
}
|
|
783
787
|
}
|