Created
March 4, 2018 20:05
-
-
Save aimore/d4fe7329b7d2371ccd6a573fb686d60c to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
Leaflet.markercluster, Provides Beautiful Animated Marker Clustering functionality for Leaflet, a JS library for interactive maps. | |
https://github.com/Leaflet/Leaflet.markercluster | |
(c) 2012-2013, Dave Leaver, smartrak | |
*/ | |
! function(t, e) { | |
L.MarkerClusterGroup = L.FeatureGroup.extend({ | |
options: { | |
maxClusterRadius: 80, | |
iconCreateFunction: null, | |
spiderfyOnMaxZoom: !0, | |
showCoverageOnHover: !0, | |
zoomToBoundsOnClick: !0, | |
singleMarkerMode: !1, | |
disableClusteringAtZoom: null, | |
removeOutsideVisibleBounds: !0, | |
animateAddingMarkers: !1, | |
spiderfyDistanceMultiplier: 1, | |
chunkedLoading: !1, | |
chunkInterval: 200, | |
chunkDelay: 50, | |
chunkProgress: null, | |
polygonOptions: {} | |
}, | |
initialize: function(t) { | |
L.Util.setOptions(this, t), this.options.iconCreateFunction || (this.options.iconCreateFunction = this._defaultIconCreateFunction), this._featureGroup = L.featureGroup(), this._featureGroup.on(L.FeatureGroup.EVENTS, this._propagateEvent, this), this._nonPointGroup = L.featureGroup(), this._nonPointGroup.on(L.FeatureGroup.EVENTS, this._propagateEvent, this), this._inZoomAnimation = 0, this._needsClustering = [], this._needsRemoving = [], this._currentShownBounds = null, this._queue = [] | |
}, | |
addLayer: function(t) { | |
if (t instanceof L.LayerGroup) { | |
var e = []; | |
for (var i in t._layers) e.push(t._layers[i]); | |
return this.addLayers(e) | |
} | |
if (!t.getLatLng) return this._nonPointGroup.addLayer(t), this; | |
if (!this._map) return this._needsClustering.push(t), this; | |
if (this.hasLayer(t)) return this; | |
this._unspiderfy && this._unspiderfy(), this._addLayer(t, this._maxZoom); | |
var n = t, | |
s = this._map.getZoom(); | |
if (t.__parent) | |
for (; n.__parent._zoom >= s;) n = n.__parent; | |
return this._currentShownBounds.contains(n.getLatLng()) && (this.options.animateAddingMarkers ? this._animationAddLayer(t, n) : this._animationAddLayerNonAnimated(t, n)), this | |
}, | |
removeLayer: function(t) { | |
if (t instanceof L.LayerGroup) { | |
var e = []; | |
for (var i in t._layers) e.push(t._layers[i]); | |
return this.removeLayers(e) | |
} | |
return t.getLatLng ? this._map ? t.__parent ? (this._unspiderfy && (this._unspiderfy(), this._unspiderfyLayer(t)), this._removeLayer(t, !0), this._featureGroup.hasLayer(t) && (this._featureGroup.removeLayer(t), t.setOpacity && t.setOpacity(1)), this) : this : (!this._arraySplice(this._needsClustering, t) && this.hasLayer(t) && this._needsRemoving.push(t), this) : (this._nonPointGroup.removeLayer(t), this) | |
}, | |
addLayers: function(t) { | |
var e, i, n, s, r = this._featureGroup, | |
o = this._nonPointGroup, | |
a = this.options.chunkedLoading, | |
h = this.options.chunkInterval, | |
_ = this.options.chunkProgress; | |
if (this._map) { | |
var u = 0, | |
l = (new Date).getTime(), | |
d = L.bind(function() { | |
for (var e = (new Date).getTime(); u < t.length; u++) { | |
if (a && 0 === u % 200) { | |
var i = (new Date).getTime() - e; | |
if (i > h) break | |
} | |
if (s = t[u], s.getLatLng) { | |
if (!this.hasLayer(s) && (this._addLayer(s, this._maxZoom), s.__parent && 2 === s.__parent.getChildCount())) { | |
var n = s.__parent.getAllChildMarkers(), | |
p = n[0] === s ? n[1] : n[0]; | |
r.removeLayer(p) | |
} | |
} else o.addLayer(s) | |
} | |
_ && _(u, t.length, (new Date).getTime() - l), u === t.length ? (this._featureGroup.eachLayer(function(t) { | |
t instanceof L.MarkerCluster && t._iconNeedsUpdate && t._updateIcon() | |
}), this._topClusterLevel._recursivelyAddChildrenToMap(null, this._zoom, this._currentShownBounds)) : setTimeout(d, this.options.chunkDelay) | |
}, this); | |
d() | |
} else { | |
for (e = [], i = 0, n = t.length; n > i; i++) s = t[i], s.getLatLng ? this.hasLayer(s) || e.push(s) : o.addLayer(s); | |
this._needsClustering = this._needsClustering.concat(e) | |
} | |
return this | |
}, | |
removeLayers: function(t) { | |
var e, i, n, s = this._featureGroup, | |
r = this._nonPointGroup; | |
if (!this._map) { | |
for (e = 0, i = t.length; i > e; e++) n = t[e], this._arraySplice(this._needsClustering, n), r.removeLayer(n); | |
return this | |
} | |
for (e = 0, i = t.length; i > e; e++) n = t[e], n.__parent ? (this._removeLayer(n, !0, !0), s.hasLayer(n) && (s.removeLayer(n), n.setOpacity && n.setOpacity(1))) : r.removeLayer(n); | |
return this._topClusterLevel._recursivelyAddChildrenToMap(null, this._zoom, this._currentShownBounds), s.eachLayer(function(t) { | |
t instanceof L.MarkerCluster && t._updateIcon() | |
}), this | |
}, | |
clearLayers: function() { | |
return this._map || (this._needsClustering = [], delete this._gridClusters, delete this._gridUnclustered), this._noanimationUnspiderfy && this._noanimationUnspiderfy(), this._featureGroup.clearLayers(), this._nonPointGroup.clearLayers(), this.eachLayer(function(t) { | |
delete t.__parent | |
}), this._map && this._generateInitialClusters(), this | |
}, | |
getBounds: function() { | |
var t = new L.LatLngBounds; | |
this._topClusterLevel && t.extend(this._topClusterLevel._bounds); | |
for (var e = this._needsClustering.length - 1; e >= 0; e--) t.extend(this._needsClustering[e].getLatLng()); | |
return t.extend(this._nonPointGroup.getBounds()), t | |
}, | |
eachLayer: function(t, e) { | |
var i, n = this._needsClustering.slice(); | |
for (this._topClusterLevel && this._topClusterLevel.getAllChildMarkers(n), i = n.length - 1; i >= 0; i--) t.call(e, n[i]); | |
this._nonPointGroup.eachLayer(t, e) | |
}, | |
getLayers: function() { | |
var t = []; | |
return this.eachLayer(function(e) { | |
t.push(e) | |
}), t | |
}, | |
getLayer: function(t) { | |
var e = null; | |
return this.eachLayer(function(i) { | |
L.stamp(i) === t && (e = i) | |
}), e | |
}, | |
hasLayer: function(t) { | |
if (!t) return !1; | |
var e, i = this._needsClustering; | |
for (e = i.length - 1; e >= 0; e--) | |
if (i[e] === t) return !0; | |
for (i = this._needsRemoving, e = i.length - 1; e >= 0; e--) | |
if (i[e] === t) return !1; | |
return !(!t.__parent || t.__parent._group !== this) || this._nonPointGroup.hasLayer(t) | |
}, | |
zoomToShowLayer: function(t, e) { | |
var i = function() { | |
if ((t._icon || t.__parent._icon) && !this._inZoomAnimation) | |
if (this._map.off("moveend", i, this), this.off("animationend", i, this), t._icon) e(); | |
else if (t.__parent._icon) { | |
var n = function() { | |
this.off("spiderfied", n, this), e() | |
}; | |
this.on("spiderfied", n, this), t.__parent.spiderfy() | |
} | |
}; | |
if (t._icon && this._map.getBounds().contains(t.getLatLng())) e(); | |
else if (t.__parent._zoom < this._map.getZoom()) this._map.on("moveend", i, this), this._map.panTo(t.getLatLng()); | |
else { | |
var n = function() { | |
this._map.off("movestart", n, this), n = null | |
}; | |
this._map.on("movestart", n, this), this._map.on("moveend", i, this), this.on("animationend", i, this), t.__parent.zoomToBounds(), n && i.call(this) | |
} | |
}, | |
onAdd: function(t) { | |
this._map = t; | |
var e, i, n; | |
if (!isFinite(this._map.getMaxZoom())) throw "Map has no maxZoom specified"; | |
for (this._featureGroup.onAdd(t), this._nonPointGroup.onAdd(t), this._gridClusters || this._generateInitialClusters(), e = 0, i = this._needsRemoving.length; i > e; e++) n = this._needsRemoving[e], this._removeLayer(n, !0); | |
this._needsRemoving = [], this._zoom = this._map.getZoom(), this._currentShownBounds = this._getExpandedVisibleBounds(), this._map.on("zoomend", this._zoomEnd, this), this._map.on("moveend", this._moveEnd, this), this._spiderfierOnAdd && this._spiderfierOnAdd(), this._bindEvents(), i = this._needsClustering, this._needsClustering = [], this.addLayers(i) | |
}, | |
onRemove: function(t) { | |
t.off("zoomend", this._zoomEnd, this), t.off("moveend", this._moveEnd, this), this._unbindEvents(), this._map._mapPane.className = this._map._mapPane.className.replace(" leaflet-cluster-anim", ""), this._spiderfierOnRemove && this._spiderfierOnRemove(), this._hideCoverage(), this._featureGroup.onRemove(t), this._nonPointGroup.onRemove(t), this._featureGroup.clearLayers(), this._map = null | |
}, | |
getVisibleParent: function(t) { | |
for (var e = t; e && !e._icon;) e = e.__parent; | |
return e || null | |
}, | |
_arraySplice: function(t, e) { | |
for (var i = t.length - 1; i >= 0; i--) | |
if (t[i] === e) return t.splice(i, 1), !0 | |
}, | |
_removeLayer: function(t, e, i) { | |
var n = this._gridClusters, | |
s = this._gridUnclustered, | |
r = this._featureGroup, | |
o = this._map; | |
if (e) | |
for (var a = this._maxZoom; a >= 0 && s[a].removeObject(t, o.project(t.getLatLng(), a)); a--); | |
var h, _ = t.__parent, | |
u = _._markers; | |
for (this._arraySplice(u, t); _ && (_._childCount--, !(_._zoom < 0));) e && _._childCount <= 1 ? (h = _._markers[0] === t ? _._markers[1] : _._markers[0], n[_._zoom].removeObject(_, o.project(_._cLatLng, _._zoom)), s[_._zoom].addObject(h, o.project(h.getLatLng(), _._zoom)), this._arraySplice(_.__parent._childClusters, _), _.__parent._markers.push(h), h.__parent = _.__parent, _._icon && (r.removeLayer(_), i || r.addLayer(h))) : (_._recalculateBounds(), i && _._icon || _._updateIcon()), _ = _.__parent; | |
delete t.__parent | |
}, | |
_isOrIsParent: function(t, e) { | |
for (; e;) { | |
if (t === e) return !0; | |
e = e.parentNode | |
} | |
return !1 | |
}, | |
_propagateEvent: function(t) { | |
if (t.layer instanceof L.MarkerCluster) { | |
if (t.originalEvent && this._isOrIsParent(t.layer._icon, t.originalEvent.relatedTarget)) return; | |
t.type = "cluster" + t.type | |
} | |
this.fire(t.type, t) | |
}, | |
_defaultIconCreateFunction: function(t) { | |
var e = t.getChildCount(), | |
i = " marker-cluster-"; | |
return i += 10 > e ? "small" : 100 > e ? "medium" : "large", new L.DivIcon({ | |
html: "<div><span>" + e + "</span></div>", | |
className: "marker-cluster" + i, | |
iconSize: new L.Point(40, 40) | |
}) | |
}, | |
_bindEvents: function() { | |
var t = this._map, | |
e = this.options.spiderfyOnMaxZoom, | |
i = this.options.showCoverageOnHover, | |
n = this.options.zoomToBoundsOnClick; | |
(e || n) && this.on("clusterclick", this._zoomOrSpiderfy, this), i && (this.on("clustermouseover", this._showCoverage, this), this.on("clustermouseout", this._hideCoverage, this), t.on("zoomend", this._hideCoverage, this)) | |
}, | |
_zoomOrSpiderfy: function(t) { | |
var e = this._map; | |
e.getMaxZoom() === e.getZoom() ? this.options.spiderfyOnMaxZoom && t.layer.spiderfy() : this.options.zoomToBoundsOnClick && t.layer.zoomToBounds(), t.originalEvent && 13 === t.originalEvent.keyCode && e._container.focus() | |
}, | |
_showCoverage: function(t) { | |
var e = this._map; | |
this._inZoomAnimation || (this._shownPolygon && e.removeLayer(this._shownPolygon), t.layer.getChildCount() > 2 && t.layer !== this._spiderfied && (this._shownPolygon = new L.Polygon(t.layer.getConvexHull(), this.options.polygonOptions), e.addLayer(this._shownPolygon))) | |
}, | |
_hideCoverage: function() { | |
this._shownPolygon && (this._map.removeLayer(this._shownPolygon), this._shownPolygon = null) | |
}, | |
_unbindEvents: function() { | |
var t = this.options.spiderfyOnMaxZoom, | |
e = this.options.showCoverageOnHover, | |
i = this.options.zoomToBoundsOnClick, | |
n = this._map; | |
(t || i) && this.off("clusterclick", this._zoomOrSpiderfy, this), e && (this.off("clustermouseover", this._showCoverage, this), this.off("clustermouseout", this._hideCoverage, this), n.off("zoomend", this._hideCoverage, this)) | |
}, | |
_zoomEnd: function() { | |
this._map && (this._mergeSplitClusters(), this._zoom = this._map._zoom, this._currentShownBounds = this._getExpandedVisibleBounds()) | |
}, | |
_moveEnd: function() { | |
if (!this._inZoomAnimation) { | |
var t = this._getExpandedVisibleBounds(); | |
this._topClusterLevel._recursivelyRemoveChildrenFromMap(this._currentShownBounds, this._zoom, t), this._topClusterLevel._recursivelyAddChildrenToMap(null, this._map._zoom, t), this._currentShownBounds = t | |
} | |
}, | |
_generateInitialClusters: function() { | |
var t = this._map.getMaxZoom(), | |
e = this.options.maxClusterRadius, | |
i = e; | |
"function" != typeof e && (i = function() { | |
return e | |
}), this.options.disableClusteringAtZoom && (t = this.options.disableClusteringAtZoom - 1), this._maxZoom = t, this._gridClusters = {}, this._gridUnclustered = {}; | |
for (var n = t; n >= 0; n--) this._gridClusters[n] = new L.DistanceGrid(i(n)), this._gridUnclustered[n] = new L.DistanceGrid(i(n)); | |
this._topClusterLevel = new L.MarkerCluster(this, -1) | |
}, | |
_addLayer: function(t, e) { | |
var i, n, s = this._gridClusters, | |
r = this._gridUnclustered; | |
for (this.options.singleMarkerMode && (t.options.icon = this.options.iconCreateFunction({ | |
getChildCount: function() { | |
return 1 | |
}, | |
getAllChildMarkers: function() { | |
return [t] | |
} | |
})); e >= 0; e--) { | |
i = this._map.project(t.getLatLng(), e); | |
var o = s[e].getNearObject(i); | |
if (o) return o._addChild(t), t.__parent = o, void 0; | |
if (o = r[e].getNearObject(i)) { | |
var a = o.__parent; | |
a && this._removeLayer(o, !1); | |
var h = new L.MarkerCluster(this, e, o, t); | |
s[e].addObject(h, this._map.project(h._cLatLng, e)), o.__parent = h, t.__parent = h; | |
var _ = h; | |
for (n = e - 1; n > a._zoom; n--) _ = new L.MarkerCluster(this, n, _), s[n].addObject(_, this._map.project(o.getLatLng(), n)); | |
for (a._addChild(_), n = e; n >= 0 && r[n].removeObject(o, this._map.project(o.getLatLng(), n)); n--); | |
return | |
} | |
r[e].addObject(t, i) | |
} | |
this._topClusterLevel._addChild(t), t.__parent = this._topClusterLevel | |
}, | |
_enqueue: function(t) { | |
this._queue.push(t), this._queueTimeout || (this._queueTimeout = setTimeout(L.bind(this._processQueue, this), 300)) | |
}, | |
_processQueue: function() { | |
for (var t = 0; t < this._queue.length; t++) this._queue[t].call(this); | |
this._queue.length = 0, clearTimeout(this._queueTimeout), this._queueTimeout = null | |
}, | |
_mergeSplitClusters: function() { | |
this._processQueue(), this._zoom < this._map._zoom && this._currentShownBounds.intersects(this._getExpandedVisibleBounds()) ? (this._animationStart(), this._topClusterLevel._recursivelyRemoveChildrenFromMap(this._currentShownBounds, this._zoom, this._getExpandedVisibleBounds()), this._animationZoomIn(this._zoom, this._map._zoom)) : this._zoom > this._map._zoom ? (this._animationStart(), this._animationZoomOut(this._zoom, this._map._zoom)) : this._moveEnd() | |
}, | |
_getExpandedVisibleBounds: function() { | |
if (!this.options.removeOutsideVisibleBounds) return this.getBounds(); | |
var t = this._map, | |
e = t.getBounds(), | |
i = e._southWest, | |
n = e._northEast, | |
s = L.Browser.mobile ? 0 : Math.abs(i.lat - n.lat), | |
r = L.Browser.mobile ? 0 : Math.abs(i.lng - n.lng); | |
return new L.LatLngBounds(new L.LatLng(i.lat - s, i.lng - r, !0), new L.LatLng(n.lat + s, n.lng + r, !0)) | |
}, | |
_animationAddLayerNonAnimated: function(t, e) { | |
if (e === t) this._featureGroup.addLayer(t); | |
else if (2 === e._childCount) { | |
e._addToMap(); | |
var i = e.getAllChildMarkers(); | |
this._featureGroup.removeLayer(i[0]), this._featureGroup.removeLayer(i[1]) | |
} else e._updateIcon() | |
} | |
}), L.MarkerClusterGroup.include(L.DomUtil.TRANSITION ? { | |
_animationStart: function() { | |
this._map._mapPane.className += " leaflet-cluster-anim", this._inZoomAnimation++ | |
}, | |
_animationEnd: function() { | |
this._map && (this._map._mapPane.className = this._map._mapPane.className.replace(" leaflet-cluster-anim", "")), this._inZoomAnimation--, this.fire("animationend") | |
}, | |
_animationZoomIn: function(t, e) { | |
var i, n = this._getExpandedVisibleBounds(), | |
s = this._featureGroup; | |
this._topClusterLevel._recursively(n, t, 0, function(r) { | |
var o, a = r._latlng, | |
h = r._markers; | |
for (n.contains(a) || (a = null), r._isSingleParent() && t + 1 === e ? (s.removeLayer(r), r._recursivelyAddChildrenToMap(null, e, n)) : (r.setOpacity(0), r._recursivelyAddChildrenToMap(a, e, n)), i = h.length - 1; i >= 0; i--) o = h[i], n.contains(o._latlng) || s.removeLayer(o) | |
}), this._forceLayout(), this._topClusterLevel._recursivelyBecomeVisible(n, e), s.eachLayer(function(t) { | |
t instanceof L.MarkerCluster || !t._icon || t.setOpacity(1) | |
}), this._topClusterLevel._recursively(n, t, e, function(t) { | |
t._recursivelyRestoreChildPositions(e) | |
}), this._enqueue(function() { | |
this._topClusterLevel._recursively(n, t, 0, function(t) { | |
s.removeLayer(t), t.setOpacity(1) | |
}), this._animationEnd() | |
}) | |
}, | |
_animationZoomOut: function(t, e) { | |
this._animationZoomOutSingle(this._topClusterLevel, t - 1, e), this._topClusterLevel._recursivelyAddChildrenToMap(null, e, this._getExpandedVisibleBounds()), this._topClusterLevel._recursivelyRemoveChildrenFromMap(this._currentShownBounds, t, this._getExpandedVisibleBounds()) | |
}, | |
_animationZoomOutSingle: function(t, e, i) { | |
var n = this._getExpandedVisibleBounds(); | |
t._recursivelyAnimateChildrenInAndAddSelfToMap(n, e + 1, i); | |
var s = this; | |
this._forceLayout(), t._recursivelyBecomeVisible(n, i), this._enqueue(function() { | |
if (1 === t._childCount) { | |
var r = t._markers[0]; | |
r.setLatLng(r.getLatLng()), r.setOpacity && r.setOpacity(1) | |
} else t._recursively(n, i, 0, function(t) { | |
t._recursivelyRemoveChildrenFromMap(n, e + 1) | |
}); | |
s._animationEnd() | |
}) | |
}, | |
_animationAddLayer: function(t, e) { | |
var i = this, | |
n = this._featureGroup; | |
n.addLayer(t), e !== t && (e._childCount > 2 ? (e._updateIcon(), this._forceLayout(), this._animationStart(), t._setPos(this._map.latLngToLayerPoint(e.getLatLng())), t.setOpacity(0), this._enqueue(function() { | |
n.removeLayer(t), t.setOpacity(1), i._animationEnd() | |
})) : (this._forceLayout(), i._animationStart(), i._animationZoomOutSingle(e, this._map.getMaxZoom(), this._map.getZoom()))) | |
}, | |
_forceLayout: function() { | |
L.Util.falseFn(e.body.offsetWidth) | |
} | |
} : { | |
_animationStart: function() {}, | |
_animationZoomIn: function(t, e) { | |
this._topClusterLevel._recursivelyRemoveChildrenFromMap(this._currentShownBounds, t), this._topClusterLevel._recursivelyAddChildrenToMap(null, e, this._getExpandedVisibleBounds()), this.fire("animationend") | |
}, | |
_animationZoomOut: function(t, e) { | |
this._topClusterLevel._recursivelyRemoveChildrenFromMap(this._currentShownBounds, t), this._topClusterLevel._recursivelyAddChildrenToMap(null, e, this._getExpandedVisibleBounds()), this.fire("animationend") | |
}, | |
_animationAddLayer: function(t, e) { | |
this._animationAddLayerNonAnimated(t, e) | |
} | |
}), L.markerClusterGroup = function(t) { | |
return new L.MarkerClusterGroup(t) | |
}, L.MarkerCluster = L.Marker.extend({ | |
initialize: function(t, e, i, n) { | |
L.Marker.prototype.initialize.call(this, i ? i._cLatLng || i.getLatLng() : new L.LatLng(0, 0), { | |
icon: this | |
}), this._group = t, this._zoom = e, this._markers = [], this._childClusters = [], this._childCount = 0, this._iconNeedsUpdate = !0, this._bounds = new L.LatLngBounds, i && this._addChild(i), n && this._addChild(n) | |
}, | |
getAllChildMarkers: function(t) { | |
t = t || []; | |
for (var e = this._childClusters.length - 1; e >= 0; e--) this._childClusters[e].getAllChildMarkers(t); | |
for (var i = this._markers.length - 1; i >= 0; i--) t.push(this._markers[i]); | |
return t | |
}, | |
getChildCount: function() { | |
return this._childCount | |
}, | |
zoomToBounds: function() { | |
for (var t, e = this._childClusters.slice(), i = this._group._map, n = i.getBoundsZoom(this._bounds), s = this._zoom + 1, r = i.getZoom(); e.length > 0 && n > s;) { | |
s++; | |
var o = []; | |
for (t = 0; t < e.length; t++) o = o.concat(e[t]._childClusters); | |
e = o | |
} | |
n > s ? this._group._map.setView(this._latlng, s) : r >= n ? this._group._map.setView(this._latlng, r + 1) : this._group._map.fitBounds(this._bounds) | |
}, | |
getBounds: function() { | |
var t = new L.LatLngBounds; | |
return t.extend(this._bounds), t | |
}, | |
_updateIcon: function() { | |
this._iconNeedsUpdate = !0, this._icon && this.setIcon(this) | |
}, | |
createIcon: function() { | |
return this._iconNeedsUpdate && (this._iconObj = this._group.options.iconCreateFunction(this), this._iconNeedsUpdate = !1), this._iconObj.createIcon() | |
}, | |
createShadow: function() { | |
return this._iconObj.createShadow() | |
}, | |
_addChild: function(t, e) { | |
this._iconNeedsUpdate = !0, this._expandBounds(t), t instanceof L.MarkerCluster ? (e || (this._childClusters.push(t), t.__parent = this), this._childCount += t._childCount) : (e || this._markers.push(t), this._childCount++), this.__parent && this.__parent._addChild(t, !0) | |
}, | |
_expandBounds: function(t) { | |
var e, i = t._wLatLng || t._latlng; | |
t instanceof L.MarkerCluster ? (this._bounds.extend(t._bounds), e = t._childCount) : (this._bounds.extend(i), e = 1), this._cLatLng || (this._cLatLng = t._cLatLng || i); | |
var n = this._childCount + e; | |
this._wLatLng ? (this._wLatLng.lat = (i.lat * e + this._wLatLng.lat * this._childCount) / n, this._wLatLng.lng = (i.lng * e + this._wLatLng.lng * this._childCount) / n) : this._latlng = this._wLatLng = new L.LatLng(i.lat, i.lng) | |
}, | |
_addToMap: function(t) { | |
t && (this._backupLatlng = this._latlng, this.setLatLng(t)), this._group._featureGroup.addLayer(this) | |
}, | |
_recursivelyAnimateChildrenIn: function(t, e, i) { | |
this._recursively(t, 0, i - 1, function(t) { | |
var i, n, s = t._markers; | |
for (i = s.length - 1; i >= 0; i--) n = s[i], n._icon && (n._setPos(e), n.setOpacity(0)) | |
}, function(t) { | |
var i, n, s = t._childClusters; | |
for (i = s.length - 1; i >= 0; i--) n = s[i], n._icon && (n._setPos(e), n.setOpacity(0)) | |
}) | |
}, | |
_recursivelyAnimateChildrenInAndAddSelfToMap: function(t, e, i) { | |
this._recursively(t, i, 0, function(n) { | |
n._recursivelyAnimateChildrenIn(t, n._group._map.latLngToLayerPoint(n.getLatLng()).round(), e), n._isSingleParent() && e - 1 === i ? (n.setOpacity(1), n._recursivelyRemoveChildrenFromMap(t, e)) : n.setOpacity(0), n._addToMap() | |
}) | |
}, | |
_recursivelyBecomeVisible: function(t, e) { | |
this._recursively(t, 0, e, null, function(t) { | |
t.setOpacity(1) | |
}) | |
}, | |
_recursivelyAddChildrenToMap: function(t, e, i) { | |
this._recursively(i, -1, e, function(n) { | |
if (e !== n._zoom) | |
for (var s = n._markers.length - 1; s >= 0; s--) { | |
var r = n._markers[s]; | |
i.contains(r._latlng) && (t && (r._backupLatlng = r.getLatLng(), r.setLatLng(t), r.setOpacity && r.setOpacity(0)), n._group._featureGroup.addLayer(r)) | |
} | |
}, function(e) { | |
e._addToMap(t) | |
}) | |
}, | |
_recursivelyRestoreChildPositions: function(t) { | |
for (var e = this._markers.length - 1; e >= 0; e--) { | |
var i = this._markers[e]; | |
i._backupLatlng && (i.setLatLng(i._backupLatlng), delete i._backupLatlng) | |
} | |
if (t - 1 === this._zoom) | |
for (var n = this._childClusters.length - 1; n >= 0; n--) this._childClusters[n]._restorePosition(); | |
else | |
for (var s = this._childClusters.length - 1; s >= 0; s--) this._childClusters[s]._recursivelyRestoreChildPositions(t) | |
}, | |
_restorePosition: function() { | |
this._backupLatlng && (this.setLatLng(this._backupLatlng), delete this._backupLatlng) | |
}, | |
_recursivelyRemoveChildrenFromMap: function(t, e, i) { | |
var n, s; | |
this._recursively(t, -1, e - 1, function(t) { | |
for (s = t._markers.length - 1; s >= 0; s--) n = t._markers[s], i && i.contains(n._latlng) || (t._group._featureGroup.removeLayer(n), n.setOpacity && n.setOpacity(1)) | |
}, function(t) { | |
for (s = t._childClusters.length - 1; s >= 0; s--) n = t._childClusters[s], i && i.contains(n._latlng) || (t._group._featureGroup.removeLayer(n), n.setOpacity && n.setOpacity(1)) | |
}) | |
}, | |
_recursively: function(t, e, i, n, s) { | |
var r, o, a = this._childClusters, | |
h = this._zoom; | |
if (e > h) | |
for (r = a.length - 1; r >= 0; r--) o = a[r], t.intersects(o._bounds) && o._recursively(t, e, i, n, s); | |
else if (n && n(this), s && this._zoom === i && s(this), i > h) | |
for (r = a.length - 1; r >= 0; r--) o = a[r], t.intersects(o._bounds) && o._recursively(t, e, i, n, s) | |
}, | |
_recalculateBounds: function() { | |
var t, e = this._markers, | |
i = this._childClusters; | |
for (this._bounds = new L.LatLngBounds, delete this._wLatLng, t = e.length - 1; t >= 0; t--) this._expandBounds(e[t]); | |
for (t = i.length - 1; t >= 0; t--) this._expandBounds(i[t]) | |
}, | |
_isSingleParent: function() { | |
return this._childClusters.length > 0 && this._childClusters[0]._childCount === this._childCount | |
} | |
}), L.DistanceGrid = function(t) { | |
this._cellSize = t, this._sqCellSize = t * t, this._grid = {}, this._objectPoint = {} | |
}, L.DistanceGrid.prototype = { | |
addObject: function(t, e) { | |
var i = this._getCoord(e.x), | |
n = this._getCoord(e.y), | |
s = this._grid, | |
r = s[n] = s[n] || {}, | |
o = r[i] = r[i] || [], | |
a = L.Util.stamp(t); | |
this._objectPoint[a] = e, o.push(t) | |
}, | |
updateObject: function(t, e) { | |
this.removeObject(t), this.addObject(t, e) | |
}, | |
removeObject: function(t, e) { | |
var i, n, s = this._getCoord(e.x), | |
r = this._getCoord(e.y), | |
o = this._grid, | |
a = o[r] = o[r] || {}, | |
h = a[s] = a[s] || []; | |
for (delete this._objectPoint[L.Util.stamp(t)], i = 0, n = h.length; n > i; i++) | |
if (h[i] === t) return h.splice(i, 1), 1 === n && delete a[s], !0 | |
}, | |
eachObject: function(t, e) { | |
var i, n, s, r, o, a, h, _ = this._grid; | |
for (i in _) { | |
o = _[i]; | |
for (n in o) | |
for (a = o[n], s = 0, r = a.length; r > s; s++) h = t.call(e, a[s]), h && (s--, r--) | |
} | |
}, | |
getNearObject: function(t) { | |
var e, i, n, s, r, o, a, h, _ = this._getCoord(t.x), | |
u = this._getCoord(t.y), | |
l = this._objectPoint, | |
d = this._sqCellSize, | |
p = null; | |
for (e = u - 1; u + 1 >= e; e++) | |
if (s = this._grid[e]) | |
for (i = _ - 1; _ + 1 >= i; i++) | |
if (r = s[i]) | |
for (n = 0, o = r.length; o > n; n++) a = r[n], h = this._sqDist(l[L.Util.stamp(a)], t), d > h && (d = h, p = a); | |
return p | |
}, | |
_getCoord: function(t) { | |
return Math.floor(t / this._cellSize) | |
}, | |
_sqDist: function(t, e) { | |
var i = e.x - t.x, | |
n = e.y - t.y; | |
return i * i + n * n | |
} | |
}, | |
function() { | |
L.QuickHull = { | |
getDistant: function(t, e) { | |
var i = e[1].lat - e[0].lat, | |
n = e[0].lng - e[1].lng; | |
return n * (t.lat - e[0].lat) + i * (t.lng - e[0].lng) | |
}, | |
findMostDistantPointFromBaseLine: function(t, e) { | |
var i, n, s, r = 0, | |
o = null, | |
a = []; | |
for (i = e.length - 1; i >= 0; i--) n = e[i], s = this.getDistant(n, t), s > 0 && (a.push(n), s > r && (r = s, o = n)); | |
return { | |
maxPoint: o, | |
newPoints: a | |
} | |
}, | |
buildConvexHull: function(t, e) { | |
var i = [], | |
n = this.findMostDistantPointFromBaseLine(t, e); | |
return n.maxPoint ? (i = i.concat(this.buildConvexHull([t[0], n.maxPoint], n.newPoints)), i = i.concat(this.buildConvexHull([n.maxPoint, t[1]], n.newPoints))) : [t[0]] | |
}, | |
getConvexHull: function(t) { | |
var e, i = !1, | |
n = !1, | |
s = null, | |
r = null; | |
for (e = t.length - 1; e >= 0; e--) { | |
var o = t[e]; | |
(i === !1 || o.lat > i) && (s = o, i = o.lat), (n === !1 || o.lat < n) && (r = o, n = o.lat) | |
} | |
var a = [].concat(this.buildConvexHull([r, s], t), this.buildConvexHull([s, r], t)); | |
return a | |
} | |
} | |
}(), L.MarkerCluster.include({ | |
getConvexHull: function() { | |
var t, e, i = this.getAllChildMarkers(), | |
n = []; | |
for (e = i.length - 1; e >= 0; e--) t = i[e].getLatLng(), n.push(t); | |
return L.QuickHull.getConvexHull(n) | |
} | |
}), L.MarkerCluster.include({ | |
_2PI: 2 * Math.PI, | |
_circleFootSeparation: 25, | |
_circleStartAngle: Math.PI / 6, | |
_spiralFootSeparation: 28, | |
_spiralLengthStart: 11, | |
_spiralLengthFactor: 5, | |
_circleSpiralSwitchover: 9, | |
spiderfy: function() { | |
if (this._group._spiderfied !== this && !this._group._inZoomAnimation) { | |
var t, e = this.getAllChildMarkers(), | |
i = this._group, | |
n = i._map, | |
s = n.latLngToLayerPoint(this._latlng); | |
this._group._unspiderfy(), this._group._spiderfied = this, e.length >= this._circleSpiralSwitchover ? t = this._generatePointsSpiral(e.length, s) : (s.y += 10, t = this._generatePointsCircle(e.length, s)), this._animationSpiderfy(e, t) | |
} | |
}, | |
unspiderfy: function(t) { | |
this._group._inZoomAnimation || (this._animationUnspiderfy(t), this._group._spiderfied = null) | |
}, | |
_generatePointsCircle: function(t, e) { | |
var i, n, s = this._group.options.spiderfyDistanceMultiplier * this._circleFootSeparation * (2 + t), | |
r = s / this._2PI, | |
o = this._2PI / t, | |
a = []; | |
for (a.length = t, i = t - 1; i >= 0; i--) n = this._circleStartAngle + i * o, a[i] = new L.Point(e.x + r * Math.cos(n), e.y + r * Math.sin(n))._round(); | |
return a | |
}, | |
_generatePointsSpiral: function(t, e) { | |
var i, n = this._group.options.spiderfyDistanceMultiplier * this._spiralLengthStart, | |
s = this._group.options.spiderfyDistanceMultiplier * this._spiralFootSeparation, | |
r = this._group.options.spiderfyDistanceMultiplier * this._spiralLengthFactor, | |
o = 0, | |
a = []; | |
for (a.length = t, i = t - 1; i >= 0; i--) o += s / n + 5e-4 * i, a[i] = new L.Point(e.x + n * Math.cos(o), e.y + n * Math.sin(o))._round(), n += this._2PI * r / o; | |
return a | |
}, | |
_noanimationUnspiderfy: function() { | |
var t, e, i = this._group, | |
n = i._map, | |
s = i._featureGroup, | |
r = this.getAllChildMarkers(); | |
for (this.setOpacity(1), e = r.length - 1; e >= 0; e--) t = r[e], s.removeLayer(t), t._preSpiderfyLatlng && (t.setLatLng(t._preSpiderfyLatlng), delete t._preSpiderfyLatlng), t.setZIndexOffset && t.setZIndexOffset(0), t._spiderLeg && (n.removeLayer(t._spiderLeg), delete t._spiderLeg); | |
i._spiderfied = null | |
} | |
}), L.MarkerCluster.include(L.DomUtil.TRANSITION ? { | |
SVG_ANIMATION: function() { | |
return e.createElementNS("http://www.w3.org/2000/svg", "animate").toString().indexOf("SVGAnimate") > -1 | |
}(), | |
_animationSpiderfy: function(t, i) { | |
var n, s, r, o, a = this, | |
h = this._group, | |
_ = h._map, | |
u = h._featureGroup, | |
l = _.latLngToLayerPoint(this._latlng); | |
for (n = t.length - 1; n >= 0; n--) s = t[n], s.setOpacity ? (s.setZIndexOffset(1e6), s.setOpacity(0), u.addLayer(s), s._setPos(l)) : u.addLayer(s); | |
h._forceLayout(), h._animationStart(); | |
var d = L.Path.SVG ? 0 : .3, | |
p = L.Path.SVG_NS; | |
for (n = t.length - 1; n >= 0; n--) | |
if (o = _.layerPointToLatLng(i[n]), s = t[n], s._preSpiderfyLatlng = s._latlng, s.setLatLng(o), s.setOpacity && s.setOpacity(1), r = new L.Polyline([a._latlng, o], { | |
weight: 1.5, | |
color: "#222", | |
opacity: d | |
}), _.addLayer(r), s._spiderLeg = r, L.Path.SVG && this.SVG_ANIMATION) { | |
var c = r._path.getTotalLength(); | |
r._path.setAttribute("stroke-dasharray", c + "," + c); | |
var f = e.createElementNS(p, "animate"); | |
f.setAttribute("attributeName", "stroke-dashoffset"), f.setAttribute("begin", "indefinite"), f.setAttribute("from", c), f.setAttribute("to", 0), f.setAttribute("dur", .25), r._path.appendChild(f), f.beginElement(), f = e.createElementNS(p, "animate"), f.setAttribute("attributeName", "stroke-opacity"), f.setAttribute("attributeName", "stroke-opacity"), f.setAttribute("begin", "indefinite"), f.setAttribute("from", 0), f.setAttribute("to", .5), f.setAttribute("dur", .25), r._path.appendChild(f), f.beginElement() | |
} | |
if (a.setOpacity(.3), L.Path.SVG) | |
for (this._group._forceLayout(), n = t.length - 1; n >= 0; n--) s = t[n]._spiderLeg, s.options.opacity = .5, s._path.setAttribute("stroke-opacity", .5); | |
setTimeout(function() { | |
h._animationEnd(), h.fire("spiderfied") | |
}, 200) | |
}, | |
_animationUnspiderfy: function(t) { | |
var e, i, n, s = this._group, | |
r = s._map, | |
o = s._featureGroup, | |
a = t ? r._latLngToNewLayerPoint(this._latlng, t.zoom, t.center) : r.latLngToLayerPoint(this._latlng), | |
h = this.getAllChildMarkers(), | |
_ = L.Path.SVG && this.SVG_ANIMATION; | |
for (s._animationStart(), this.setOpacity(1), i = h.length - 1; i >= 0; i--) e = h[i], e._preSpiderfyLatlng && (e.setLatLng(e._preSpiderfyLatlng), delete e._preSpiderfyLatlng, e.setOpacity ? (e._setPos(a), e.setOpacity(0)) : o.removeLayer(e), _ && (n = e._spiderLeg._path.childNodes[0], n.setAttribute("to", n.getAttribute("from")), n.setAttribute("from", 0), n.beginElement(), n = e._spiderLeg._path.childNodes[1], n.setAttribute("from", .5), n.setAttribute("to", 0), n.setAttribute("stroke-opacity", 0), n.beginElement(), e._spiderLeg._path.setAttribute("stroke-opacity", 0))); | |
setTimeout(function() { | |
var t = 0; | |
for (i = h.length - 1; i >= 0; i--) e = h[i], e._spiderLeg && t++; | |
for (i = h.length - 1; i >= 0; i--) e = h[i], e._spiderLeg && (e.setOpacity && (e.setOpacity(1), e.setZIndexOffset(0)), t > 1 && o.removeLayer(e), r.removeLayer(e._spiderLeg), delete e._spiderLeg); | |
s._animationEnd() | |
}, 200) | |
} | |
} : { | |
_animationSpiderfy: function(t, e) { | |
var i, n, s, r, o = this._group, | |
a = o._map, | |
h = o._featureGroup; | |
for (i = t.length - 1; i >= 0; i--) r = a.layerPointToLatLng(e[i]), n = t[i], n._preSpiderfyLatlng = n._latlng, n.setLatLng(r), n.setZIndexOffset && n.setZIndexOffset(1e6), h.addLayer(n), s = new L.Polyline([this._latlng, r], { | |
weight: 1.5, | |
color: "#222" | |
}), a.addLayer(s), n._spiderLeg = s; | |
this.setOpacity(.3), o.fire("spiderfied") | |
}, | |
_animationUnspiderfy: function() { | |
this._noanimationUnspiderfy() | |
} | |
}), L.MarkerClusterGroup.include({ | |
_spiderfied: null, | |
_spiderfierOnAdd: function() { | |
this._map.on("click", this._unspiderfyWrapper, this), this._map.options.zoomAnimation && this._map.on("zoomstart", this._unspiderfyZoomStart, this), this._map.on("zoomend", this._noanimationUnspiderfy, this), L.Path.SVG && !L.Browser.touch && this._map._initPathRoot() | |
}, | |
_spiderfierOnRemove: function() { | |
this._map.off("click", this._unspiderfyWrapper, this), this._map.off("zoomstart", this._unspiderfyZoomStart, this), this._map.off("zoomanim", this._unspiderfyZoomAnim, this), this._unspiderfy() | |
}, | |
_unspiderfyZoomStart: function() { | |
this._map && this._map.on("zoomanim", this._unspiderfyZoomAnim, this) | |
}, | |
_unspiderfyZoomAnim: function(t) { | |
L.DomUtil.hasClass(this._map._mapPane, "leaflet-touching") || (this._map.off("zoomanim", this._unspiderfyZoomAnim, this), this._unspiderfy(t)) | |
}, | |
_unspiderfyWrapper: function() { | |
this._unspiderfy() | |
}, | |
_unspiderfy: function(t) { | |
this._spiderfied && this._spiderfied.unspiderfy(t) | |
}, | |
_noanimationUnspiderfy: function() { | |
this._spiderfied && this._spiderfied._noanimationUnspiderfy() | |
}, | |
_unspiderfyLayer: function(t) { | |
t._spiderLeg && (this._featureGroup.removeLayer(t), t.setOpacity(1), t.setZIndexOffset(0), this._map.removeLayer(t._spiderLeg), delete t._spiderLeg) | |
} | |
}) | |
}(window, document); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment