UNPKG

@react-google-maps/marker-clusterer

Version:
3 lines (2 loc) 14.7 kB
!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((t=t||self).markerClusterer={})}(this,function(t){"use strict";var e=function(){function t(e,i){e.getClusterer().extend(t,google.maps.OverlayView),this.cluster=e,this.className=this.cluster.getClusterer().getClusterClass(),this.styles=i,this.center=void 0,this.div=null,this.sums=null,this.visible=!1,this.boundsChangedListener=null,this.url="",this.height=0,this.width=0,this.anchorText=[0,0],this.anchorIcon=[0,0],this.textColor="black",this.textSize=11,this.textDecoration="none",this.fontWeight="bold",this.fontStyle="normal",this.fontFamily="Arial,sans-serif",this.backgroundPosition="0 0",this.setMap(e.getMap())}var e=t.prototype;return e.onAdd=function(){var t,e,i=this;this.div=document.createElement("div"),this.div.className=this.className,this.visible&&this.show(),this.getPanes().overlayMouseTarget.appendChild(this.div),this.boundsChangedListener=google.maps.event.addListener(this.getMap(),"boundschanged",function(){e=t}),google.maps.event.addDomListener(this.div,"mousedown",function(){t=!0,e=!1}),google.maps.event.addDomListener(this.div,"click",function(s){if(t=!1,!e){var n=i.cluster.getClusterer();if(google.maps.event.trigger(n,"click",i.cluster),google.maps.event.trigger(n,"clusterclick",i.cluster),n.getZoomOnClick()){var r=n.getMaxZoom(),o=i.cluster.getBounds();n.getMap().fitBounds(o),setTimeout(function(){n.getMap().fitBounds(o),null!==r&&n.getMap().getZoom()>r&&n.getMap().setZoom(r+1)},100)}s.cancelBubble=!0,s.stopPropagation&&s.stopPropagation()}}),google.maps.event.addDomListener(this.div,"mouseover",function(){google.maps.event.trigger(i.cluster.getClusterer(),"mouseover",i.cluster)}),google.maps.event.addDomListener(this.div,"mouseout",function(){google.maps.event.trigger(i.cluster.getClusterer(),"mouseout",i.cluster)})},e.onRemove=function(){this.div&&this.div.parentNode&&(this.hide(),null!==this.boundsChangedListener&&google.maps.event.removeListener(this.boundsChangedListener),google.maps.event.clearInstanceListeners(this.div),this.div.parentNode.removeChild(this.div),this.div=null)},e.draw=function(){if(this.visible&&null!==this.div&&this.center){var t=this.getPosFromLatLng(this.center),e=t.x;this.div.style.top=t.y+"px",this.div.style.left=e+"px"}},e.hide=function(){this.div&&(this.div.style.display="none"),this.visible=!1},e.show=function(){if(this.div&&this.center){var t="",e=this.backgroundPosition.split(" "),i=parseInt(e[0].replace(/^\s+|\s+$/g,""),10),s=parseInt(e[1].replace(/^\s+|\s+$/g,""),10),n=this.getPosFromLatLng(this.center);this.div.style.cssText=this.createCss(n),t="<img src='"+this.url+"' style='position: absolute; top: "+s+"px; left: "+i+"px; ",this.cluster.getClusterer().enableRetinaIcons||(t+="clip: rect("+-1*s+"px, "+(-1*i+this.width)+"px, "+(-1*s+this.height)+"px, "+-1*i+"px);"),this.div.innerHTML=(t+="'>")+"<div 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+";font-style: "+this.fontStyle+";text-decoration: "+this.textDecoration+";text-align: center;width: "+this.width+"px;line-height:"+this.height+"px;'>"+this.sums.text+"</div>",this.div.title=void 0===this.sums.title||""===this.sums.title?this.cluster.getClusterer().getTitle():this.sums.title,this.div.style.display=""}this.visible=!0},e.useStyle=function(t){this.sums=t;var e=this.styles[Math.min(this.styles.length-1,Math.max(0,t.index-1))];this.url=e.url,this.height=e.height,this.width=e.width,this.anchorText=e.anchorText||[0,0],this.anchorIcon=e.anchorIcon||[this.height/2,this.width/2],this.textColor=e.textColor||"black",this.textSize=e.textSize||11,this.textDecoration=e.textDecoration||"none",this.fontWeight=e.fontWeight||"bold",this.fontStyle=e.fontStyle||"normal",this.fontFamily=e.fontFamily||"Arial,sans-serif",this.backgroundPosition=e.backgroundPosition||"0 0"},e.setCenter=function(t){this.center=t},e.createCss=function(t){var e=[];return e.push("cursor: pointer;"),e.push("position: absolute; top: "+t.y+"px; left: "+t.x+"px;"),e.push("width: "+this.width+"px; height: "+this.height+"px;"),e.join("")},e.getPosFromLatLng=function(t){var e=this.getProjection().fromLatLngToDivPixel(t);return e.x-=this.anchorIcon[1],e.y-=this.anchorIcon[0],e.x=e.x,e.y=e.y,e},t}(),i=function(){function t(t){this.markerClusterer=t,this.map=this.markerClusterer.getMap(),this.gridSize=this.markerClusterer.getGridSize(),this.minClusterSize=this.markerClusterer.getMinimumClusterSize(),this.averageCenter=this.markerClusterer.getAverageCenter(),this.markers=[],this.center=void 0,this.bounds=null,this.clusterIcon=new e(this,this.markerClusterer.getStyles())}var i=t.prototype;return i.getSize=function(){return this.markers.length},i.getMarkers=function(){return this.markers},i.getCenter=function(){return this.center},i.getMap=function(){return this.map},i.getClusterer=function(){return this.markerClusterer},i.getBounds=function(){for(var t=new google.maps.LatLngBounds(this.center,this.center),e=this.getMarkers(),i=0;i<e.length;i++){var s=e[i].getPosition();s&&t.extend(s)}return t},i.remove=function(){this.clusterIcon.setMap(null),this.markers=[],delete this.markers},i.addMarker=function(t){if(this.isMarkerAlreadyAdded(t))return!1;if(this.center){if(this.averageCenter){var e=t.getPosition();if(e){var i=this.markers.length+1;this.center=new google.maps.LatLng((this.center.lat()*(i-1)+e.lat())/i,(this.center.lng()*(i-1)+e.lng())/i),this.calculateBounds()}}}else{var s=t.getPosition();s&&(this.center=s,this.calculateBounds())}t.isAdded=!0,this.markers.push(t);var n=this.markers.length,r=this.markerClusterer.getMaxZoom();if(null!==r&&this.map.getZoom()>r)t.getMap()!==this.map&&t.setMap(this.map);else if(n<this.minClusterSize)t.getMap()!==this.map&&t.setMap(this.map);else if(n===this.minClusterSize)for(var o=0;o<n;o++)this.markers[o].setMap(null);else t.setMap(null);return this.updateIcon(),!0},i.isMarkerInClusterBounds=function(t){if(null!==this.bounds){var e=t.getPosition();if(e)return this.bounds.contains(e)}return!1},i.calculateBounds=function(){this.bounds=this.markerClusterer.getExtendedBounds(new google.maps.LatLngBounds(this.center,this.center))},i.updateIcon=function(){var t=this.markers.length,e=this.markerClusterer.getMaxZoom();null!==e&&this.map.getZoom()>e?this.clusterIcon.hide():t<this.minClusterSize?this.clusterIcon.hide():(this.center&&this.clusterIcon.setCenter(this.center),this.clusterIcon.useStyle(this.markerClusterer.getCalculator()(this.markers,this.markerClusterer.getStyles().length)),this.clusterIcon.show())},i.isMarkerAlreadyAdded=function(t){if(this.markers.indexOf)return this.markers.includes(t);for(var e=0;e<this.markers.length;e++)if(t===this.markers[e])return!0;return!1},t}(),s=function(t,e){for(var i=0,s=t.length.toString(),n=s;0!==n;)n=parseInt(n,10)/10,i++;return{text:s,index:i=Math.min(i,e),title:""}},n=2e3,r=500,o="https://developers.google.com/maps/documentation/javascript/examples/markerclusterer/m",a="png",h=[53,56,66,78,90],l="cluster",u=function(){function t(e,i,u){void 0===i&&(i=[]),void 0===u&&(u={}),this.extend(t,google.maps.OverlayView),this.markers=[],this.clusters=[],this.listeners=[],this.activeMap=null,this.ready=!1,this.gridSize=u.gridSize||60,this.minClusterSize=u.minimumClusterSize||2,this.maxZoom=u.maxZoom||null,this.styles=u.styles||[],this.title=u.title||"",this.zoomOnClick=!0,void 0!==u.zoomOnClick&&(this.zoomOnClick=u.zoomOnClick),this.averageCenter=!1,void 0!==u.averageCenter&&(this.averageCenter=u.averageCenter),this.ignoreHidden=!1,void 0!==u.ignoreHidden&&(this.ignoreHidden=u.ignoreHidden),this.enableRetinaIcons=!1,void 0!==u.enableRetinaIcons&&(this.enableRetinaIcons=u.enableRetinaIcons),this.imagePath=u.imagePath||o,this.imageExtension=u.imageExtension||a,this.imageSizes=u.imageSizes||h,this.calculator=u.calculator||s,this.batchSize=u.batchSize||n,this.batchSizeIE=u.batchSizeIE||r,this.clusterClass=u.clusterClass||l,-1!==navigator.userAgent.toLowerCase().indexOf("msie")&&(this.batchSize=this.batchSizeIE),this.timerRefStatic=null,this.setupStyles(),this.addMarkers(i,!0),this.setMap(e)}var e=t.prototype;return e.onAdd=function(){var t=this;this.activeMap=this.getMap(),this.ready=!0,this.repaint(),this.listeners=[google.maps.event.addListener(this.getMap(),"zoom_changed",function(){t.resetViewport(!1),t.getMap().getZoom()!==(t.get("minZoom")||0)&&t.getMap().getZoom()!==t.get("maxZoom")||google.maps.event.trigger(t,"idle")}),google.maps.event.addListener(this.getMap(),"idle",function(){t.redraw()})]},e.onRemove=function(){for(var t=0;t<this.markers.length;t++)this.markers[t].getMap()!==this.activeMap&&this.markers[t].setMap(this.activeMap);for(var e=0;e<this.clusters.length;e++)this.clusters[e].remove();this.clusters=[];for(var i=0;i<this.listeners.length;i++)google.maps.event.removeListener(this.listeners[i]);this.listeners=[],this.activeMap=null,this.ready=!1},e.draw=function(){},e.setupStyles=function(){if(!(this.styles.length>0))for(var t=0;t<this.imageSizes.length;t++)this.styles.push({url:this.imagePath+(t+1)+"."+this.imageExtension,height:this.imageSizes[t],width:this.imageSizes[t]})},e.fitMapToMarkers=function(){for(var t=this.getMarkers(),e=new google.maps.LatLngBounds,i=0;i<t.length;i++){var s=t[i].getPosition();s&&e.extend(s)}this.getMap().fitBounds(e)},e.getGridSize=function(){return this.gridSize},e.setGridSize=function(t){this.gridSize=t},e.getMinimumClusterSize=function(){return this.minClusterSize},e.setMinimumClusterSize=function(t){this.minClusterSize=t},e.getMaxZoom=function(){return this.maxZoom},e.setMaxZoom=function(t){this.maxZoom=t},e.getStyles=function(){return this.styles},e.setStyles=function(t){this.styles=t},e.getTitle=function(){return this.title},e.setTitle=function(t){this.title=t},e.getZoomOnClick=function(){return this.zoomOnClick},e.setZoomOnClick=function(t){this.zoomOnClick=t},e.getAverageCenter=function(){return this.averageCenter},e.setAverageCenter=function(t){this.averageCenter=t},e.getIgnoreHidden=function(){return this.ignoreHidden},e.setIgnoreHidden=function(t){this.ignoreHidden=t},e.getEnableRetinaIcons=function(){return this.enableRetinaIcons},e.setEnableRetinaIcons=function(t){this.enableRetinaIcons=t},e.getImageExtension=function(){return this.imageExtension},e.setImageExtension=function(t){this.imageExtension=t},e.getImagePath=function(){return this.imagePath},e.setImagePath=function(t){this.imagePath=t},e.getImageSizes=function(){return this.imageSizes},e.setImageSizes=function(t){this.imageSizes=t},e.getCalculator=function(){return this.calculator},e.setCalculator=function(t){this.calculator=t},e.getBatchSizeIE=function(){return this.batchSizeIE},e.setBatchSizeIE=function(t){this.batchSizeIE=t},e.getClusterClass=function(){return this.clusterClass},e.setClusterClass=function(t){this.clusterClass=t},e.getMarkers=function(){return this.markers},e.getTotalMarkers=function(){return this.markers.length},e.getClusters=function(){return this.clusters},e.getTotalClusters=function(){return this.clusters.length},e.addMarker=function(t,e){this.pushMarkerTo(t),e||this.redraw()},e.addMarkers=function(t,e){for(var i in t)t.hasOwnProperty(i)&&this.pushMarkerTo(t[i]);e||this.redraw()},e.pushMarkerTo=function(t){var e=this;t.getDraggable()&&google.maps.event.addListener(t,"dragend",function(){e.ready&&(t.isAdded=!1,e.repaint())}),t.isAdded=!1,this.markers.push(t)},e.removeMarker_=function(t){var e=-1;if(this.markers.indexOf)e=this.markers.indexOf(t);else for(var i=0;i<this.markers.length;i++)if(t===this.markers[i]){e=i;break}return-1!==e&&(t.setMap(null),this.markers.splice(e,1),!0)},e.removeMarker=function(t,e){var i=this.removeMarker_(t);return!e&&i&&this.repaint(),i},e.removeMarkers=function(t,e){for(var i=!1,s=0;s<t.length;s++)i=i||this.removeMarker_(t[s]);return!e&&i&&this.repaint(),i},e.clearMarkers=function(){this.resetViewport(!0),this.markers=[]},e.repaint=function(){var t=this.clusters.slice();this.clusters=[],this.resetViewport(!1),this.redraw(),setTimeout(function(){for(var e=0;e<t.length;e++)t[e].remove()},0)},e.getExtendedBounds=function(t){var e=this.getProjection(),i=e.fromLatLngToDivPixel(new google.maps.LatLng(t.getNorthEast().lat(),t.getNorthEast().lng()));i.x+=this.gridSize,i.y-=this.gridSize;var s=e.fromLatLngToDivPixel(new google.maps.LatLng(t.getSouthWest().lat(),t.getSouthWest().lng()));return s.x-=this.gridSize,s.y+=this.gridSize,t.extend(e.fromDivPixelToLatLng(i)),t.extend(e.fromDivPixelToLatLng(s)),t},e.redraw=function(){this.createClusters(0)},e.resetViewport=function(t){for(var e=0;e<this.clusters.length;e++)this.clusters[e].remove();this.clusters=[];for(var i=0;i<this.markers.length;i++){var s=this.markers[i];s.isAdded=!1,t&&s.setMap(null)}},e.distanceBetweenPoints=function(t,e){var i=(e.lat()-t.lat())*Math.PI/180,s=(e.lng()-t.lng())*Math.PI/180,n=Math.sin(i/2)*Math.sin(i/2)+Math.cos(t.lat()*Math.PI/180)*Math.cos(e.lat()*Math.PI/180)*Math.sin(s/2)*Math.sin(s/2);return 2*Math.atan2(Math.sqrt(n),Math.sqrt(1-n))*6371},e.isMarkerInBounds=function(t,e){var i=t.getPosition();return!!i&&e.contains(i)},e.addToClosestCluster=function(t){for(var e,s=4e4,n=null,r=0;r<this.clusters.length;r++){var o=(e=this.clusters[r]).getCenter(),a=t.getPosition();if(o&&a){var h=this.distanceBetweenPoints(o,a);h<s&&(s=h,n=e)}}n&&n.isMarkerInClusterBounds(t)?n.addMarker(t):((e=new i(this)).addMarker(t),this.clusters.push(e))},e.createClusters=function(t){var e=this;if(this.ready){0===t&&(google.maps.event.trigger(this,"clusteringbegin",this),null!==this.timerRefStatic&&(window.clearTimeout(this.timerRefStatic),delete this.timerRefStatic));for(var i=this.getMap().getZoom()>3?new google.maps.LatLngBounds(this.getMap().getBounds().getSouthWest(),this.getMap().getBounds().getNorthEast()):new google.maps.LatLngBounds(new google.maps.LatLng(85.02070771743472,-178.48388434375),new google.maps.LatLng(-85.08136444384544,178.00048865625)),s=this.getExtendedBounds(i),n=Math.min(t+this.batchSize,this.markers.length),r=t;r<n;r++){var o=this.markers[r];!o.isAdded&&this.isMarkerInBounds(o,s)&&(!this.ignoreHidden||this.ignoreHidden&&o.getVisible())&&this.addToClosestCluster(o)}n<this.markers.length?this.timerRefStatic=window.setTimeout(function(){e.createClusters(n)},0):(this.timerRefStatic=null,google.maps.event.trigger(this,"clusteringend",this))}},e.extend=function(t,e){return function(t){for(var e in t.prototype)this.prototype[e]=t.prototype[e];return this}.apply(t,[e])},t}();t.Cluster=i,t.ClusterIcon=e,t.Clusterer=u}); //# sourceMappingURL=markerclusterer.umd.production.min.js.map