{"version":3,"sources":["webpack:///../node_modules/@google/markerclustererplus/src/markerclusterer.js","webpack:///../node_modules/query-string/index.js","webpack:///../node_modules/strict-uri-encode/index.js","webpack:///../node_modules/object-assign/index.js","webpack:///../node_modules/decode-uri-component/index.js","webpack:///../node_modules/mercator-projection/index.js"],"names":["ClusterIcon","cluster","styles","getMarkerClusterer","extend","google","maps","OverlayView","this","cluster_","className_","getClusterClass","styles_","center_","div_","sums_","visible_","setMap","getMap","Cluster","mc","markerClusterer_","map_","gridSize_","getGridSize","minClusterSize_","getMinimumClusterSize","averageCenter_","getAverageCenter","markers_","bounds_","clusterIcon_","getStyles","MarkerClusterer","map","opt_markers","opt_options","clusters_","listeners_","activeMap_","ready_","gridSize","minimumClusterSize","maxZoom_","maxZoom","title_","title","zoomOnClick_","undefined","zoomOnClick","averageCenter","ignoreHidden_","ignoreHidden","enableRetinaIcons_","enableRetinaIcons","imagePath_","imagePath","IMAGE_PATH","imageExtension_","imageExtension","IMAGE_EXTENSION","imageSizes_","imageSizes","IMAGE_SIZES","calculator_","calculator","CALCULATOR","batchSize_","batchSize","BATCH_SIZE","batchSizeIE_","batchSizeIE","BATCH_SIZE_IE","clusterClass_","clusterClass","navigator","userAgent","toLowerCase","indexOf","setupStyles_","addMarkers","prototype","onAdd","cMouseDownInCluster","cDraggingMapByCluster","cClusterIcon","gmVersion","version","split","parseInt","document","createElement","className","show","getPanes","overlayMouseTarget","appendChild","boundsChangedListener_","event","addListener","addDomListener","e","stopPropagation","theBounds","mz","trigger","getZoomOnClick","getMaxZoom","getBounds","fitBounds","setTimeout","getZoom","setZoom","cancelBubble","onRemove","parentNode","hide","removeListener","clearInstanceListeners","removeChild","draw","pos","getPosFromLatLng_","style","top","y","left","x","zIndex","Marker","MAX_ZINDEX","display","img","bp","backgroundPosition_","spriteH","replace","spriteV","cssText","createCss","url_","width_","height_","innerHTML","anchorText_","textColor_","textSize_","fontFamily_","fontWeight_","fontStyle_","textDecoration_","text","getTitle","useStyle","sums","index","Math","max","min","length","url","height","width","anchorText","anchorIcon_","anchorIcon","textColor","textSize","textDecoration","fontWeight","fontStyle","fontFamily","backgroundPosition","setCenter","center","push","join","latlng","getProjection","fromLatLngToDivPixel","getSize","getMarkers","getCenter","i","bounds","LatLngBounds","markers","getPosition","remove","addMarker","marker","mCount","isMarkerAlreadyAdded_","l","lat","lng","LatLng","calculateBounds_","isAdded","updateIcon_","isMarkerInClusterBounds","contains","getExtendedBounds","numStyles","getCalculator","cMarkerClusterer","repaint","prevZoom_","zoom","minZoom","mapTypes","getMapTypeId","resetViewport_","bind","redraw_","size","fitMapToMarkers","getVisible","getIgnoreHidden","setGridSize","setMinimumClusterSize","setMaxZoom","setStyles","setTitle","setZoomOnClick","setAverageCenter","setIgnoreHidden","getEnableRetinaIcons","setEnableRetinaIcons","getImageExtension","setImageExtension","getImagePath","setImagePath","getImageSizes","setImageSizes","setCalculator","getBatchSizeIE","setBatchSizeIE","setClusterClass","getTotalMarkers","getClusters","getTotalClusters","opt_nodraw","pushMarkerTo_","key","hasOwnProperty","getDraggable","removeMarker","removed","removeMarker_","removeMarkers","r","splice","clearMarkers","oldClusters","slice","projection","tr","getNorthEast","bl","getSouthWest","trPix","blPix","ne","fromDivPixelToLatLng","sw","createClusters_","opt_hide","distanceBetweenPoints_","p1","p2","dLat","PI","dLon","a","sin","cos","atan2","sqrt","isMarkerInBounds_","addToClosestCluster_","d","distance","clusterToAddTo","iFirst","mapBounds","timerRefStatic","clearTimeout","iLast","obj1","obj2","object","property","apply","count","toString","dv","module","exports","strictUriEncode","objectAssign","decodeComponent","encode","value","opts","strict","encodeURIComponent","extract","str","queryStart","parse","formatter","result","arrayFormat","accumulator","exec","concat","parserForArrayFormat","ret","Object","create","trim","forEach","param","parts","shift","val","keys","sort","reduce","Boolean","Array","isArray","keysSorter","input","b","Number","stringify","obj","encoderForArrayFormat","val2","filter","parseUrl","query","c","charCodeAt","toUpperCase","getOwnPropertySymbols","propIsEnumerable","propertyIsEnumerable","toObject","TypeError","assign","test1","String","getOwnPropertyNames","test2","fromCharCode","n","test3","letter","err","shouldUseNative","target","source","from","symbols","to","s","arguments","call","singleMatcher","RegExp","multiMatcher","decodeComponents","components","decodeURIComponent","right","decode","tokens","match","encodedURI","replaceMap","entries","customDecodeURIComponent","fromLatLngToPoint","latLng","opt_point","point","origin","pixelOrigin_","TILE_SIZE","siny","opt_min","opt_max","_bound","deg","log","pixelsPerLonRadian_","fromPointToLatLng","latRadians","rad","atan","exp"],"mappings":"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","file":"1.cefb3f348aca63e9cfb9.js","sourcesContent":["/**\n * @name MarkerClustererPlus for Google Maps V3\n * @version 2.1.11\n * @author Gary Little\n * @fileoverview\n * The library creates and manages per-zoom-level clusters for large amounts of markers.\n *
\n * This is an enhanced V3 implementation of the V2 MarkerClusterer by Xiaoxi Wu. It is\n * based on the V3 MarkerClusterer port by Luke Mahe. MarkerClustererPlus was created\n * by Gary Little.\n *
\n * v2.0 release: MarkerClustererPlus v2.0 is backward compatible with MarkerClusterer v1.0. It\n * adds support for the ignoreHidden
, title
, batchSizeIE
,\n * and calculator
properties as well as support for four more events. It also allows\n * greater control over the styling of the text that appears on the cluster marker. The\n * documentation has been significantly improved and the overall code has been simplified and\n * polished. Very large numbers of markers can now be managed without causing Javascript timeout\n * errors on Internet Explorer. Note that the name of the clusterclick
event has been\n * deprecated. The new name is click
, so please change your application code now.\n */\n\n/**\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n\n/**\n * @name ClusterIconStyle\n * @class This class represents the object for values in the styles
array passed\n * to the {@link MarkerClusterer} constructor. The element in this array that is used to\n * style the cluster icon is determined by calling the calculator
function.\n *\n * @property {string} url The URL of the cluster icon image file. Required.\n * @property {number} height The display height (in pixels) of the cluster icon. Required.\n * @property {number} width The display width (in pixels) of the cluster icon. Required.\n * @property {Array} [anchorText] The position (in pixels) from the center of the cluster icon to\n * where the text label is to be centered and drawn. The format is [yoffset, xoffset]
\n * where yoffset
increases as you go down from center and xoffset
\n * increases to the right of center. The default is [0, 0]
.\n * @property {Array} [anchorIcon] The anchor position (in pixels) of the cluster icon. This is the\n * spot on the cluster icon that is to be aligned with the cluster position. The format is\n * [yoffset, xoffset]
where yoffset
increases as you go down and\n * xoffset
increases to the right of the top-left corner of the icon. The default\n * anchor position is the center of the cluster icon.\n * @property {string} [textColor=\"black\"] The color of the label text shown on the\n * cluster icon.\n * @property {number} [textSize=11] The size (in pixels) of the label text shown on the\n * cluster icon.\n * @property {string} [textDecoration=\"none\"] The value of the CSS text-decoration
\n * property for the label text shown on the cluster icon.\n * @property {string} [fontWeight=\"bold\"] The value of the CSS font-weight
\n * property for the label text shown on the cluster icon.\n * @property {string} [fontStyle=\"normal\"] The value of the CSS font-style
\n * property for the label text shown on the cluster icon.\n * @property {string} [fontFamily=\"Arial,sans-serif\"] The value of the CSS font-family
\n * property for the label text shown on the cluster icon.\n * @property {string} [backgroundPosition=\"0 0\"] The position of the cluster icon image\n * within the image defined by url
. The format is \"xpos ypos\"
\n * (the same format as for the CSS background-position
property). You must set\n * this property appropriately when the image defined by url
represents a sprite\n * containing multiple images. Note that the position must be specified in px units.\n */\n/**\n * @name ClusterIconInfo\n * @class This class is an object containing general information about a cluster icon. This is\n * the object that a calculator
function returns.\n *\n * @property {string} text The text of the label to be shown on the cluster icon.\n * @property {number} index The index plus 1 of the element in the styles
\n * array to be used to style the cluster icon.\n * @property {string} title The tooltip to display when the mouse moves over the cluster icon.\n * If this value is undefined
or \"\"
, title
is set to the\n * value of the title
property passed to the MarkerClusterer.\n */\n/**\n * A cluster icon.\n *\n * @constructor\n * @extends google.maps.OverlayView\n * @param {Cluster} cluster The cluster with which the icon is to be associated.\n * @param {Array} [styles] An array of {@link ClusterIconStyle} defining the cluster icons\n * to use for various cluster sizes.\n * @private\n */\nfunction ClusterIcon(cluster, styles) {\n cluster.getMarkerClusterer().extend(ClusterIcon, google.maps.OverlayView);\n\n this.cluster_ = cluster;\n this.className_ = cluster.getMarkerClusterer().getClusterClass();\n this.styles_ = styles;\n this.center_ = null;\n this.div_ = null;\n this.sums_ = null;\n this.visible_ = false;\n\n this.setMap(cluster.getMap()); // Note: this causes onAdd to be called\n}\n\n\n/**\n * Adds the icon to the DOM.\n */\nClusterIcon.prototype.onAdd = function () {\n var cClusterIcon = this;\n var cMouseDownInCluster;\n var cDraggingMapByCluster;\n var gmVersion = google.maps.version.split(\".\");\n\n gmVersion = parseInt(gmVersion[0] * 100, 10) + parseInt(gmVersion[1], 10);\n\n this.div_ = document.createElement(\"div\");\n this.div_.className = this.className_;\n if (this.visible_) {\n this.show();\n }\n\n this.getPanes().overlayMouseTarget.appendChild(this.div_);\n\n // Fix for Issue 157\n this.boundsChangedListener_ = google.maps.event.addListener(this.getMap(), \"bounds_changed\", function () {\n cDraggingMapByCluster = cMouseDownInCluster;\n });\n\n google.maps.event.addDomListener(this.div_, \"mousedown\", function () {\n cMouseDownInCluster = true;\n cDraggingMapByCluster = false;\n });\n\n// March 1, 2018: Fix for this 3.32 exp bug, https://issuetracker.google.com/issues/73571522\n// But it doesn't work with earlier releases so do a version check.\n if (gmVersion >= 332) { // Ugly version-dependent code\n google.maps.event.addDomListener(this.div_, \"touchstart\", function (e) {\n e.stopPropagation();\n });\n }\n\n google.maps.event.addDomListener(this.div_, \"click\", function (e) {\n cMouseDownInCluster = false;\n if (!cDraggingMapByCluster) {\n var theBounds;\n var mz;\n var mc = cClusterIcon.cluster_.getMarkerClusterer();\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(mc, \"click\", cClusterIcon.cluster_);\n google.maps.event.trigger(mc, \"clusterclick\", cClusterIcon.cluster_); // deprecated name\n\n // The default click handler follows. Disable it by setting\n // the zoomOnClick property to false.\n if (mc.getZoomOnClick()) {\n // Zoom into the cluster.\n mz = mc.getMaxZoom();\n theBounds = cClusterIcon.cluster_.getBounds();\n mc.getMap().fitBounds(theBounds);\n // There is a fix for Issue 170 here:\n setTimeout(function () {\n mc.getMap().fitBounds(theBounds);\n // Don't zoom beyond the max zoom level\n if (mz !== null && (mc.getMap().getZoom() > mz)) {\n mc.getMap().setZoom(mz + 1);\n }\n }, 100);\n }\n\n // Prevent event propagation to the map:\n e.cancelBubble = true;\n if (e.stopPropagation) {\n e.stopPropagation();\n }\n }\n });\n\n google.maps.event.addDomListener(this.div_, \"mouseover\", function () {\n var mc = cClusterIcon.cluster_.getMarkerClusterer();\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(mc, \"mouseover\", cClusterIcon.cluster_);\n });\n\n google.maps.event.addDomListener(this.div_, \"mouseout\", function () {\n var mc = cClusterIcon.cluster_.getMarkerClusterer();\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(mc, \"mouseout\", cClusterIcon.cluster_);\n });\n};\n\n\n/**\n * Removes the icon from the DOM.\n */\nClusterIcon.prototype.onRemove = function () {\n if (this.div_ && this.div_.parentNode) {\n this.hide();\n google.maps.event.removeListener(this.boundsChangedListener_);\n google.maps.event.clearInstanceListeners(this.div_);\n this.div_.parentNode.removeChild(this.div_);\n this.div_ = null;\n }\n};\n\n\n/**\n * Draws the icon.\n */\nClusterIcon.prototype.draw = function () {\n if (this.visible_) {\n var pos = this.getPosFromLatLng_(this.center_);\n this.div_.style.top = pos.y + \"px\";\n this.div_.style.left = pos.x + \"px\";\n this.div_.style.zIndex = google.maps.Marker.MAX_ZINDEX + 1; // Put above all unclustered markers\n }\n};\n\n\n/**\n * Hides the icon.\n */\nClusterIcon.prototype.hide = function () {\n if (this.div_) {\n this.div_.style.display = \"none\";\n }\n this.visible_ = false;\n};\n\n\n/**\n * Positions and shows the icon.\n */\nClusterIcon.prototype.show = function () {\n if (this.div_) {\n var img = \"\";\n // NOTE: values must be specified in px units\n var bp = this.backgroundPosition_.split(\" \");\n var spriteH = parseInt(bp[0].replace(/^\\s+|\\s+$/g, \"\"), 10);\n var spriteV = parseInt(bp[1].replace(/^\\s+|\\s+$/g, \"\"), 10);\n var pos = this.getPosFromLatLng_(this.center_);\n this.div_.style.cssText = this.createCss(pos);\n img = \"\";\n this.div_.innerHTML = img + \"
MarkerClusterer
object with which this\n * cluster is associated.\n */\nfunction Cluster(mc) {\n this.markerClusterer_ = mc;\n this.map_ = mc.getMap();\n this.gridSize_ = mc.getGridSize();\n this.minClusterSize_ = mc.getMinimumClusterSize();\n this.averageCenter_ = mc.getAverageCenter();\n this.markers_ = [];\n this.center_ = null;\n this.bounds_ = null;\n this.clusterIcon_ = new ClusterIcon(this, mc.getStyles());\n}\n\n\n/**\n * Returns the number of markers managed by the cluster. You can call this from\n * a click
, mouseover
, or mouseout
event handler\n * for the MarkerClusterer
object.\n *\n * @return {number} The number of markers in the cluster.\n */\nCluster.prototype.getSize = function () {\n return this.markers_.length;\n};\n\n\n/**\n * Returns the array of markers managed by the cluster. You can call this from\n * a click
, mouseover
, or mouseout
event handler\n * for the MarkerClusterer
object.\n *\n * @return {Array} The array of markers in the cluster.\n */\nCluster.prototype.getMarkers = function () {\n return this.markers_;\n};\n\n\n/**\n * Returns the center of the cluster. You can call this from\n * a click
, mouseover
, or mouseout
event handler\n * for the MarkerClusterer
object.\n *\n * @return {google.maps.LatLng} The center of the cluster.\n */\nCluster.prototype.getCenter = function () {\n return this.center_;\n};\n\n\n/**\n * Returns the map with which the cluster is associated.\n *\n * @return {google.maps.Map} The map.\n * @ignore\n */\nCluster.prototype.getMap = function () {\n return this.map_;\n};\n\n\n/**\n * Returns the MarkerClusterer
object with which the cluster is associated.\n *\n * @return {MarkerClusterer} The associated marker clusterer.\n * @ignore\n */\nCluster.prototype.getMarkerClusterer = function () {\n return this.markerClusterer_;\n};\n\n\n/**\n * Returns the bounds of the cluster.\n *\n * @return {google.maps.LatLngBounds} the cluster bounds.\n * @ignore\n */\nCluster.prototype.getBounds = function () {\n var i;\n var bounds = new google.maps.LatLngBounds(this.center_, this.center_);\n var markers = this.getMarkers();\n for (i = 0; i < markers.length; i++) {\n bounds.extend(markers[i].getPosition());\n }\n return bounds;\n};\n\n\n/**\n * Removes the cluster from the map.\n *\n * @ignore\n */\nCluster.prototype.remove = function () {\n this.clusterIcon_.setMap(null);\n this.markers_ = [];\n delete this.markers_;\n};\n\n\n/**\n * Adds a marker to the cluster.\n *\n * @param {google.maps.Marker} marker The marker to be added.\n * @return {boolean} True if the marker was added.\n * @ignore\n */\nCluster.prototype.addMarker = function (marker) {\n var i;\n var mCount;\n var mz;\n\n if (this.isMarkerAlreadyAdded_(marker)) {\n return false;\n }\n\n if (!this.center_) {\n this.center_ = marker.getPosition();\n this.calculateBounds_();\n } else {\n if (this.averageCenter_) {\n var l = this.markers_.length + 1;\n var lat = (this.center_.lat() * (l - 1) + marker.getPosition().lat()) / l;\n var lng = (this.center_.lng() * (l - 1) + marker.getPosition().lng()) / l;\n this.center_ = new google.maps.LatLng(lat, lng);\n this.calculateBounds_();\n }\n }\n\n marker.isAdded = true;\n this.markers_.push(marker);\n\n mCount = this.markers_.length;\n mz = this.markerClusterer_.getMaxZoom();\n if (mz !== null && this.map_.getZoom() > mz) {\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 (i = 0; i < mCount; i++) {\n this.markers_[i].setMap(null);\n }\n } else {\n marker.setMap(null);\n }\n\n this.updateIcon_();\n return true;\n};\n\n\n/**\n * Determines if a marker lies within the cluster's bounds.\n *\n * @param {google.maps.Marker} marker The marker to check.\n * @return {boolean} True if the marker lies in the bounds.\n * @ignore\n */\nCluster.prototype.isMarkerInClusterBounds = function (marker) {\n return this.bounds_.contains(marker.getPosition());\n};\n\n\n/**\n * Calculates the extended bounds of the cluster with the grid.\n */\nCluster.prototype.calculateBounds_ = function () {\n var bounds = new google.maps.LatLngBounds(this.center_, this.center_);\n this.bounds_ = this.markerClusterer_.getExtendedBounds(bounds);\n};\n\n\n/**\n * Updates the cluster icon.\n */\nCluster.prototype.updateIcon_ = function () {\n var mCount = this.markers_.length;\n var mz = this.markerClusterer_.getMaxZoom();\n\n if (mz !== null && this.map_.getZoom() > mz) {\n this.clusterIcon_.hide();\n return;\n }\n\n if (mCount < this.minClusterSize_) {\n // Min cluster size not yet reached.\n this.clusterIcon_.hide();\n return;\n }\n\n var numStyles = this.markerClusterer_.getStyles().length;\n var sums = this.markerClusterer_.getCalculator()(this.markers_, numStyles);\n this.clusterIcon_.setCenter(this.center_);\n this.clusterIcon_.useStyle(sums);\n this.clusterIcon_.show();\n};\n\n\n/**\n * Determines if a marker has already been added to the cluster.\n *\n * @param {google.maps.Marker} marker The marker to check.\n * @return {boolean} True if the marker has already been added.\n */\nCluster.prototype.isMarkerAlreadyAdded_ = function (marker) {\n var i;\n if (this.markers_.indexOf) {\n return this.markers_.indexOf(marker) !== -1;\n } else {\n for (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\n/**\n * @name MarkerClustererOptions\n * @class This class represents the optional parameter passed to\n * the {@link MarkerClusterer} constructor.\n * @property {number} [gridSize=60] The grid size of a cluster in pixels. The grid is a square.\n * @property {number} [maxZoom=null] The maximum zoom level at which clustering is enabled or\n * null
if clustering is to be enabled at all zoom levels.\n * @property {boolean} [zoomOnClick=true] Whether to zoom the map when a cluster marker is\n * clicked. You may want to set this to false
if you have installed a handler\n * for the click
event and it deals with zooming on its own.\n * @property {boolean} [averageCenter=false] Whether the position of a cluster marker should be\n * the average position of all markers in the cluster. If set to false
, the\n * cluster marker is positioned at the location of the first marker added to the cluster.\n * @property {number} [minimumClusterSize=2] The minimum number of markers needed in a cluster\n * before the markers are hidden and a cluster marker appears.\n * @property {boolean} [ignoreHidden=false] Whether to ignore hidden markers in clusters. You\n * may want to set this to true
to ensure that hidden markers are not included\n * in the marker count that appears on a cluster marker (this count is the value of the\n * text
property of the result returned by the default calculator
).\n * If set to true
and you change the visibility of a marker being clustered, be\n * sure to also call MarkerClusterer.repaint()
.\n * @property {string} [title=\"\"] The tooltip to display when the mouse moves over a cluster\n * marker. (Alternatively, you can use a custom calculator
function to specify a\n * different tooltip for each cluster marker.)\n * @property {function} [calculator=MarkerClusterer.CALCULATOR] The function used to determine\n * the text to be displayed on a cluster marker and the index indicating which style to use\n * for the cluster marker. The input parameters for the function are (1) the array of markers\n * represented by a cluster marker and (2) the number of cluster icon styles. It returns a\n * {@link ClusterIconInfo} object. The default calculator
returns a\n * text
property which is the number of markers in the cluster and an\n * index
property which is one higher than the lowest integer such that\n * 10^i
exceeds the number of markers in the cluster, or the size of the styles\n * array, whichever is less. The styles
array element used has an index of\n * index
minus 1. For example, the default calculator
returns a\n * text
value of \"125\"
and an index
of 3
\n * for a cluster icon representing 125 markers so the element used in the styles
\n * array is 2
. A calculator
may also return a title
\n * property that contains the text of the tooltip to be used for the cluster marker. If\n * title
is not defined, the tooltip is set to the value of the title
\n * property for the MarkerClusterer.\n * @property {string} [clusterClass=\"cluster\"] The name of the CSS class defining general styles\n * for the cluster markers. Use this class to define CSS styles that are not set up by the code\n * that processes the styles
array.\n * @property {Array} [styles] An array of {@link ClusterIconStyle} elements defining the styles\n * of the cluster markers to be used. The element to be used to style a given cluster marker\n * is determined by the function defined by the calculator
property.\n * The default is an array of {@link ClusterIconStyle} elements whose properties are derived\n * from the values for imagePath
, imageExtension
, and\n * imageSizes
.\n * @property {boolean} [enableRetinaIcons=false] Whether to allow the use of cluster icons that\n * have sizes that are some multiple (typically double) of their actual display size. Icons such\n * as these look better when viewed on high-resolution monitors such as Apple's Retina displays.\n * Note: if this property is true
, sprites cannot be used as cluster icons.\n * @property {number} [batchSize=MarkerClusterer.BATCH_SIZE] Set this property to the\n * number of markers to be processed in a single batch when using a browser other than\n * Internet Explorer (for Internet Explorer, use the batchSizeIE property instead).\n * @property {number} [batchSizeIE=MarkerClusterer.BATCH_SIZE_IE] When Internet Explorer is\n * being used, markers are processed in several batches with a small delay inserted between\n * each batch in an attempt to avoid Javascript timeout errors. Set this property to the\n * number of markers to be processed in a single batch; select as high a number as you can\n * without causing a timeout error in the browser. This number might need to be as low as 100\n * if 15,000 markers are being managed, for example.\n * @property {string} [imagePath=MarkerClusterer.IMAGE_PATH]\n * The full URL of the root name of the group of image files to use for cluster icons.\n * The complete file name is of the form imagePath
n.imageExtension
\n * where n is the image file number (1, 2, etc.).\n * @property {string} [imageExtension=MarkerClusterer.IMAGE_EXTENSION]\n * The extension name for the cluster icon image files (e.g., \"png\"
or\n * \"jpg\"
).\n * @property {Array} [imageSizes=MarkerClusterer.IMAGE_SIZES]\n * An array of numbers containing the widths of the group of\n * imagePath
n.imageExtension
image files.\n * (The images are assumed to be square.)\n */\n/**\n * Creates a MarkerClusterer object with the options specified in {@link MarkerClustererOptions}.\n * @constructor\n * @extends google.maps.OverlayView\n * @param {google.maps.Map} map The Google map to attach to.\n * @param {Array.gridSize
property.\n *\n * @return {number} The grid size.\n */\nMarkerClusterer.prototype.getGridSize = function () {\n return this.gridSize_;\n};\n\n\n/**\n * Sets the value of the gridSize
property.\n *\n * @param {number} gridSize The grid size.\n */\nMarkerClusterer.prototype.setGridSize = function (gridSize) {\n this.gridSize_ = gridSize;\n};\n\n\n/**\n * Returns the value of the minimumClusterSize
property.\n *\n * @return {number} The minimum cluster size.\n */\nMarkerClusterer.prototype.getMinimumClusterSize = function () {\n return this.minClusterSize_;\n};\n\n/**\n * Sets the value of the minimumClusterSize
property.\n *\n * @param {number} minimumClusterSize The minimum cluster size.\n */\nMarkerClusterer.prototype.setMinimumClusterSize = function (minimumClusterSize) {\n this.minClusterSize_ = minimumClusterSize;\n};\n\n\n/**\n * Returns the value of the maxZoom
property.\n *\n * @return {number} The maximum zoom level.\n */\nMarkerClusterer.prototype.getMaxZoom = function () {\n return this.maxZoom_;\n};\n\n\n/**\n * Sets the value of the maxZoom
property.\n *\n * @param {number} maxZoom The maximum zoom level.\n */\nMarkerClusterer.prototype.setMaxZoom = function (maxZoom) {\n this.maxZoom_ = maxZoom;\n};\n\n\n/**\n * Returns the value of the styles
property.\n *\n * @return {Array} The array of styles defining the cluster markers to be used.\n */\nMarkerClusterer.prototype.getStyles = function () {\n return this.styles_;\n};\n\n\n/**\n * Sets the value of the styles
property.\n *\n * @param {Array.title
property.\n *\n * @return {string} The content of the title text.\n */\nMarkerClusterer.prototype.getTitle = function () {\n return this.title_;\n};\n\n\n/**\n * Sets the value of the title
property.\n *\n * @param {string} title The value of the title property.\n */\nMarkerClusterer.prototype.setTitle = function (title) {\n this.title_ = title;\n};\n\n\n/**\n * Returns the value of the zoomOnClick
property.\n *\n * @return {boolean} True if zoomOnClick property is set.\n */\nMarkerClusterer.prototype.getZoomOnClick = function () {\n return this.zoomOnClick_;\n};\n\n\n/**\n * Sets the value of the zoomOnClick
property.\n *\n * @param {boolean} zoomOnClick The value of the zoomOnClick property.\n */\nMarkerClusterer.prototype.setZoomOnClick = function (zoomOnClick) {\n this.zoomOnClick_ = zoomOnClick;\n};\n\n\n/**\n * Returns the value of the averageCenter
property.\n *\n * @return {boolean} True if averageCenter property is set.\n */\nMarkerClusterer.prototype.getAverageCenter = function () {\n return this.averageCenter_;\n};\n\n\n/**\n * Sets the value of the averageCenter
property.\n *\n * @param {boolean} averageCenter The value of the averageCenter property.\n */\nMarkerClusterer.prototype.setAverageCenter = function (averageCenter) {\n this.averageCenter_ = averageCenter;\n};\n\n\n/**\n * Returns the value of the ignoreHidden
property.\n *\n * @return {boolean} True if ignoreHidden property is set.\n */\nMarkerClusterer.prototype.getIgnoreHidden = function () {\n return this.ignoreHidden_;\n};\n\n\n/**\n * Sets the value of the ignoreHidden
property.\n *\n * @param {boolean} ignoreHidden The value of the ignoreHidden property.\n */\nMarkerClusterer.prototype.setIgnoreHidden = function (ignoreHidden) {\n this.ignoreHidden_ = ignoreHidden;\n};\n\n\n/**\n * Returns the value of the enableRetinaIcons
property.\n *\n * @return {boolean} True if enableRetinaIcons property is set.\n */\nMarkerClusterer.prototype.getEnableRetinaIcons = function () {\n return this.enableRetinaIcons_;\n};\n\n\n/**\n * Sets the value of the enableRetinaIcons
property.\n *\n * @param {boolean} enableRetinaIcons The value of the enableRetinaIcons property.\n */\nMarkerClusterer.prototype.setEnableRetinaIcons = function (enableRetinaIcons) {\n this.enableRetinaIcons_ = enableRetinaIcons;\n};\n\n\n/**\n * Returns the value of the imageExtension
property.\n *\n * @return {string} The value of the imageExtension property.\n */\nMarkerClusterer.prototype.getImageExtension = function () {\n return this.imageExtension_;\n};\n\n\n/**\n * Sets the value of the imageExtension
property.\n *\n * @param {string} imageExtension The value of the imageExtension property.\n */\nMarkerClusterer.prototype.setImageExtension = function (imageExtension) {\n this.imageExtension_ = imageExtension;\n};\n\n\n/**\n * Returns the value of the imagePath
property.\n *\n * @return {string} The value of the imagePath property.\n */\nMarkerClusterer.prototype.getImagePath = function () {\n return this.imagePath_;\n};\n\n\n/**\n * Sets the value of the imagePath
property.\n *\n * @param {string} imagePath The value of the imagePath property.\n */\nMarkerClusterer.prototype.setImagePath = function (imagePath) {\n this.imagePath_ = imagePath;\n};\n\n\n/**\n * Returns the value of the imageSizes
property.\n *\n * @return {Array} The value of the imageSizes property.\n */\nMarkerClusterer.prototype.getImageSizes = function () {\n return this.imageSizes_;\n};\n\n\n/**\n * Sets the value of the imageSizes
property.\n *\n * @param {Array} imageSizes The value of the imageSizes property.\n */\nMarkerClusterer.prototype.setImageSizes = function (imageSizes) {\n this.imageSizes_ = imageSizes;\n};\n\n\n/**\n * Returns the value of the calculator
property.\n *\n * @return {function} the value of the calculator property.\n */\nMarkerClusterer.prototype.getCalculator = function () {\n return this.calculator_;\n};\n\n\n/**\n * Sets the value of the calculator
property.\n *\n * @param {function(Array.batchSizeIE
property.\n *\n * @return {number} the value of the batchSizeIE property.\n */\nMarkerClusterer.prototype.getBatchSizeIE = function () {\n return this.batchSizeIE_;\n};\n\n\n/**\n * Sets the value of the batchSizeIE
property.\n *\n * @param {number} batchSizeIE The value of the batchSizeIE property.\n */\nMarkerClusterer.prototype.setBatchSizeIE = function (batchSizeIE) {\n this.batchSizeIE_ = batchSizeIE;\n};\n\n\n/**\n * Returns the value of the clusterClass
property.\n *\n * @return {string} the value of the clusterClass property.\n */\nMarkerClusterer.prototype.getClusterClass = function () {\n return this.clusterClass_;\n};\n\n\n/**\n * Sets the value of the clusterClass
property.\n *\n * @param {string} clusterClass The value of the clusterClass property.\n */\nMarkerClusterer.prototype.setClusterClass = function (clusterClass) {\n this.clusterClass_ = clusterClass;\n};\n\n\n/**\n * Returns the array of markers managed by the clusterer.\n *\n * @return {Array} The array of markers managed by the clusterer.\n */\nMarkerClusterer.prototype.getMarkers = function () {\n return this.markers_;\n};\n\n\n/**\n * Returns the number of markers managed by the clusterer.\n *\n * @return {number} The number of markers.\n */\nMarkerClusterer.prototype.getTotalMarkers = function () {\n return this.markers_.length;\n};\n\n\n/**\n * Returns the current array of clusters formed by the clusterer.\n *\n * @return {Array} The array of clusters formed by the clusterer.\n */\nMarkerClusterer.prototype.getClusters = function () {\n return this.clusters_;\n};\n\n\n/**\n * Returns the number of clusters formed by the clusterer.\n *\n * @return {number} The number of clusters formed by the clusterer.\n */\nMarkerClusterer.prototype.getTotalClusters = function () {\n return this.clusters_.length;\n};\n\n\n/**\n * Adds a marker to the clusterer. The clusters are redrawn unless\n * opt_nodraw
is set to true
.\n *\n * @param {google.maps.Marker} marker The marker to add.\n * @param {boolean} [opt_nodraw] Set to true
to prevent redrawing.\n */\nMarkerClusterer.prototype.addMarker = function (marker, opt_nodraw) {\n this.pushMarkerTo_(marker);\n if (!opt_nodraw) {\n this.redraw_();\n }\n};\n\n\n/**\n * Adds an array of markers to the clusterer. The clusters are redrawn unless\n * opt_nodraw
is set to true
.\n *\n * @param {Array.true
to prevent redrawing.\n */\nMarkerClusterer.prototype.addMarkers = function (markers, opt_nodraw) {\n var key;\n for (key in markers) {\n if (markers.hasOwnProperty(key)) {\n this.pushMarkerTo_(markers[key]);\n }\n }\n if (!opt_nodraw) {\n this.redraw_();\n }\n};\n\n\n/**\n * Pushes a marker to the clusterer.\n *\n * @param {google.maps.Marker} marker The marker to add.\n */\nMarkerClusterer.prototype.pushMarkerTo_ = function (marker) {\n // If the marker is draggable add a listener so we can update the clusters on the dragend:\n if (marker.getDraggable()) {\n var cMarkerClusterer = this;\n google.maps.event.addListener(marker, \"dragend\", function () {\n if (cMarkerClusterer.ready_) {\n this.isAdded = false;\n cMarkerClusterer.repaint();\n }\n });\n }\n marker.isAdded = false;\n this.markers_.push(marker);\n};\n\n\n/**\n * Removes a marker from the cluster. The clusters are redrawn unless\n * opt_nodraw
is set to true
. Returns true
if the\n * marker was removed from the clusterer.\n *\n * @param {google.maps.Marker} marker The marker to remove.\n * @param {boolean} [opt_nodraw] Set to true
to prevent redrawing.\n * @return {boolean} True if the marker was removed from the clusterer.\n */\nMarkerClusterer.prototype.removeMarker = function (marker, opt_nodraw) {\n var removed = this.removeMarker_(marker);\n\n if (!opt_nodraw && removed) {\n this.repaint();\n }\n\n return removed;\n};\n\n\n/**\n * Removes an array of markers from the cluster. The clusters are redrawn unless\n * opt_nodraw
is set to true
. Returns true
if markers\n * were removed from the clusterer.\n *\n * @param {Array.true
to prevent redrawing.\n * @return {boolean} True if markers were removed from the clusterer.\n */\nMarkerClusterer.prototype.removeMarkers = function (markers, opt_nodraw) {\n var i, r;\n var removed = false;\n\n for (i = 0; i < markers.length; i++) {\n r = this.removeMarker_(markers[i]);\n removed = removed || r;\n }\n\n if (!opt_nodraw && removed) {\n this.repaint();\n }\n\n return removed;\n};\n\n\n/**\n * Removes a marker and returns true if removed, false if not.\n *\n * @param {google.maps.Marker} marker The marker to remove\n * @return {boolean} Whether the marker was removed or not\n */\nMarkerClusterer.prototype.removeMarker_ = function (marker) {\n var i;\n var index = -1;\n if (this.markers_.indexOf) {\n index = this.markers_.indexOf(marker);\n } else {\n for (i = 0; i < this.markers_.length; i++) {\n if (marker === this.markers_[i]) {\n index = i;\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 this.markers_.splice(index, 1); // Remove the marker from the list of managed markers\n return true;\n};\n\n\n/**\n * Removes all clusters and markers from the map and also removes all markers\n * managed by the clusterer.\n */\nMarkerClusterer.prototype.clearMarkers = function () {\n this.resetViewport_(true);\n this.markers_ = [];\n};\n\n\n/**\n * Recalculates and redraws all the marker clusters from scratch.\n * Call this after changing any properties.\n */\nMarkerClusterer.prototype.repaint = function () {\n var oldClusters = this.clusters_.slice();\n this.clusters_ = [];\n this.resetViewport_(false);\n this.redraw_();\n\n // Remove the old clusters.\n // Do it in a timeout to prevent blinking effect.\n setTimeout(function () {\n var i;\n for (i = 0; i < oldClusters.length; i++) {\n oldClusters[i].remove();\n }\n }, 0);\n};\n\n\n/**\n * Returns the current bounds extended by the grid size.\n *\n * @param {google.maps.LatLngBounds} bounds The bounds to extend.\n * @return {google.maps.LatLngBounds} The extended bounds.\n * @ignore\n */\nMarkerClusterer.prototype.getExtendedBounds = function (bounds) {\n var projection = this.getProjection();\n\n // Turn the bounds into latlng.\n var tr = new google.maps.LatLng(bounds.getNorthEast().lat(),\n bounds.getNorthEast().lng());\n var bl = new google.maps.LatLng(bounds.getSouthWest().lat(),\n bounds.getSouthWest().lng());\n\n // Convert the points to pixels and the extend out by the grid size.\n var trPix = projection.fromLatLngToDivPixel(tr);\n trPix.x += this.gridSize_;\n trPix.y -= this.gridSize_;\n\n var blPix = projection.fromLatLngToDivPixel(bl);\n blPix.x -= this.gridSize_;\n blPix.y += this.gridSize_;\n\n // Convert the pixel points back to LatLng\n var ne = projection.fromDivPixelToLatLng(trPix);\n var sw = projection.fromDivPixelToLatLng(blPix);\n\n // Extend the bounds to contain the new bounds.\n bounds.extend(ne);\n bounds.extend(sw);\n\n return bounds;\n};\n\n\n/**\n * Redraws all the clusters.\n */\nMarkerClusterer.prototype.redraw_ = function () {\n this.createClusters_(0);\n};\n\n\n/**\n * Removes all clusters from the map. The markers are also removed from the map\n * if opt_hide
is set to true
.\n *\n * @param {boolean} [opt_hide] Set to true
to also remove the markers\n * from the map.\n */\nMarkerClusterer.prototype.resetViewport_ = function (opt_hide) {\n var i, marker;\n // Remove all the clusters\n for (i = 0; i < this.clusters_.length; i++) {\n this.clusters_[i].remove();\n }\n this.clusters_ = [];\n\n // Reset the markers to not be added and to be removed from the map.\n for (i = 0; i < this.markers_.length; i++) {\n marker = this.markers_[i];\n marker.isAdded = false;\n if (opt_hide) {\n marker.setMap(null);\n }\n }\n};\n\n\n/**\n * Calculates the distance between two latlng locations in km.\n *\n * @param {google.maps.LatLng} p1 The first lat lng point.\n * @param {google.maps.LatLng} p2 The second lat lng point.\n * @return {number} The distance between the two points in km.\n * @see http://www.movable-type.co.uk/scripts/latlong.html\n*/\nMarkerClusterer.prototype.distanceBetweenPoints_ = function (p1, p2) {\n var R = 6371; // Radius of the Earth in km\n var dLat = (p2.lat() - p1.lat()) * Math.PI / 180;\n var dLon = (p2.lng() - p1.lng()) * Math.PI / 180;\n var a = Math.sin(dLat / 2) * Math.sin(dLat / 2) +\n Math.cos(p1.lat() * Math.PI / 180) * Math.cos(p2.lat() * Math.PI / 180) *\n Math.sin(dLon / 2) * Math.sin(dLon / 2);\n var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));\n var d = R * c;\n return d;\n};\n\n\n/**\n * Determines if a marker is contained in a bounds.\n *\n * @param {google.maps.Marker} marker The marker to check.\n * @param {google.maps.LatLngBounds} bounds The bounds to check against.\n * @return {boolean} True if the marker is in the bounds.\n */\nMarkerClusterer.prototype.isMarkerInBounds_ = function (marker, bounds) {\n return bounds.contains(marker.getPosition());\n};\n\n\n/**\n * Adds a marker to a cluster, or creates a new cluster.\n *\n * @param {google.maps.Marker} marker The marker to add.\n */\nMarkerClusterer.prototype.addToClosestCluster_ = function (marker) {\n var i, d, cluster, center;\n var distance = 40000; // Some large number\n var clusterToAddTo = null;\n for (i = 0; i < this.clusters_.length; i++) {\n cluster = this.clusters_[i];\n center = cluster.getCenter();\n if (center) {\n d = this.distanceBetweenPoints_(center, marker.getPosition());\n if (d < distance) {\n distance = d;\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 cluster.addMarker(marker);\n this.clusters_.push(cluster);\n }\n};\n\n\n/**\n * Creates the clusters. This is done in batches to avoid timeout errors\n * in some browsers when there is a huge number of markers.\n *\n * @param {number} iFirst The index of the first marker in the batch of\n * markers to be added to clusters.\n */\nMarkerClusterer.prototype.createClusters_ = function (iFirst) {\n var i, marker;\n var mapBounds;\n var cMarkerClusterer = this;\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 MarkerClusterer
begins\n * clustering markers.\n * @name MarkerClusterer#clusteringbegin\n * @param {MarkerClusterer} mc The MarkerClusterer whose markers are being clustered.\n * @event\n */\n google.maps.event.trigger(this, \"clusteringbegin\", this);\n\n if (typeof this.timerRefStatic !== \"undefined\") {\n clearTimeout(this.timerRefStatic);\n delete this.timerRefStatic;\n }\n }\n\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 if (this.getMap().getZoom() > 3) {\n mapBounds = new google.maps.LatLngBounds(this.getMap().getBounds().getSouthWest(),\n this.getMap().getBounds().getNorthEast());\n } else {\n mapBounds = new google.maps.LatLngBounds(new google.maps.LatLng(85.02070771743472, -178.48388434375), new google.maps.LatLng(-85.08136444384544, 178.00048865625));\n }\n var bounds = this.getExtendedBounds(mapBounds);\n\n var iLast = Math.min(iFirst + this.batchSize_, this.markers_.length);\n\n for (i = iFirst; i < iLast; i++) {\n marker = this.markers_[i];\n if (!marker.isAdded && this.isMarkerInBounds_(marker, bounds)) {\n if (!this.ignoreHidden_ || (this.ignoreHidden_ && marker.getVisible())) {\n this.addToClosestCluster_(marker);\n }\n }\n }\n\n if (iLast < this.markers_.length) {\n this.timerRefStatic = setTimeout(function () {\n cMarkerClusterer.createClusters_(iLast);\n }, 0);\n } else {\n delete this.timerRefStatic;\n\n /**\n * This event is fired when the MarkerClusterer
stops\n * clustering markers.\n * @name MarkerClusterer#clusteringend\n * @param {MarkerClusterer} mc The MarkerClusterer whose markers are being clustered.\n * @event\n */\n google.maps.event.trigger(this, \"clusteringend\", this);\n }\n};\n\n\n/**\n * Extends an object's prototype by another's.\n *\n * @param {Object} obj1 The object to be extended.\n * @param {Object} obj2 The object to extend with.\n * @return {Object} The new extended object.\n * @ignore\n */\nMarkerClusterer.prototype.extend = function (obj1, obj2) {\n return (function (object) {\n var property;\n for (property in object.prototype) {\n this.prototype[property] = object.prototype[property];\n }\n return this;\n }).apply(obj1, [obj2]);\n};\n\n\n/**\n * The default function for determining the label text and style\n * for a cluster icon.\n *\n * @param {Array.