123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335 |
- var BMap = window.BMap
- var BMapLib = (window.BMapLib = BMapLib || {})
- ;(function () {
- var b = function (m, l, j) {
- l = d(l)
- var n = m.pointToPixel(l.getNorthEast())
- var i = m.pointToPixel(l.getSouthWest())
- n.x += j
- n.y -= j
- i.x -= j
- i.y += j
- var h = m.pixelToPoint(n)
- var k = m.pixelToPoint(i)
- return new BMap.Bounds(k, h)
- }
- var d = function (i) {
- var k = f(i.getNorthEast().lng, -180, 180)
- var h = f(i.getSouthWest().lng, -180, 180)
- var j = f(i.getNorthEast().lat, -74, 74)
- var l = f(i.getSouthWest().lat, -74, 74)
- return new BMap.Bounds(new BMap.Point(h, l), new BMap.Point(k, j))
- }
- var f = function (j, k, h) {
- k && (j = Math.max(j, k))
- h && (j = Math.min(j, h))
- return j
- }
- var a = function (h) {
- return '[object Array]' === Object.prototype.toString.call(h)
- }
- var c = function (l, n) {
- var j = -1
- if (a(n)) {
- if (n.indexOf) {
- j = n.indexOf(l)
- } else {
- for (var k = 0, h; (h = n[k]); k++) {
- if (h === l) {
- j = k
- break
- }
- }
- }
- }
- return j
- }
- var e = (BMapLib.MarkerClusterer = function (l, h) {
- if (!l) {
- return
- }
- this._map = l
- this._markers = []
- this._clusters = []
- var k = h || {}
- this._gridSize = k.gridSize || 60
- this._maxZoom = k.maxZoom || 18
- this._minClusterSize = k.minClusterSize || 2
- this._isAverageCenter = false
- if (k.isAverageCenter != undefined) {
- this._isAverageCenter = k.isAverageCenter
- }
- this._styles = k.styles || []
- var j = this
- this._map.addEventListener('zoomend', function () {
- j._redraw()
- })
- this._map.addEventListener('moveend', function () {
- j._redraw()
- })
- var i = k.markers
- a(i) && this.addMarkers(i)
- })
- e.prototype.addMarkers = function (k) {
- for (var j = 0, h = k.length; j < h; j++) {
- this._pushMarkerTo(k[j])
- }
- this._createClusters()
- }
- e.prototype._pushMarkerTo = function (h) {
- var i = c(h, this._markers)
- if (i === -1) {
- h.isInCluster = false
- this._markers.push(h)
- }
- }
- e.prototype.addMarker = function (h) {
- this._pushMarkerTo(h)
- this._createClusters()
- }
- e.prototype._createClusters = function () {
- var j = this._map.getBounds()
- var l = b(this._map, j, this._gridSize)
- for (var k = 0, h; (h = this._markers[k]); k++) {
- if (!h.isInCluster && l.containsPoint(h.getPosition())) {
- this._addToClosestCluster(h)
- }
- }
- }
- e.prototype._addToClosestCluster = function (l) {
- var p = 4000000
- var n = null
- // var k = l.getPosition()
- for (var m = 0, j; (j = this._clusters[m]); m++) {
- var h = j.getCenter()
- if (h) {
- var o = this._map.getDistance(h, l.getPosition())
- if (o < p) {
- p = o
- n = j
- }
- }
- }
- if (n && n.isMarkerInClusterBounds(l)) {
- n.addMarker(l)
- } else {
- // eslint-disable-next-line
- var j = new g(this)
- j.addMarker(l)
- this._clusters.push(j)
- }
- }
- e.prototype._clearLastClusters = function () {
- for (var j = 0, h; (h = this._clusters[j]); j++) {
- h.remove()
- }
- this._clusters = []
- this._removeMarkersFromCluster()
- }
- e.prototype._removeMarkersFromCluster = function () {
- for (var j = 0, h; (h = this._markers[j]); j++) {
- h.isInCluster = false
- }
- }
- e.prototype._removeMarkersFromMap = function () {
- for (var j = 0, h; (h = this._markers[j]); j++) {
- h.isInCluster = false
- this._map.removeOverlay(h)
- }
- }
- e.prototype._removeMarker = function (h) {
- var i = c(h, this._markers)
- if (i === -1) {
- return false
- }
- this._map.removeOverlay(h)
- this._markers.splice(i, 1)
- return true
- }
- e.prototype.removeMarker = function (h) {
- var i = this._removeMarker(h)
- if (i) {
- this._clearLastClusters()
- this._createClusters()
- }
- return i
- }
- e.prototype.removeMarkers = function (l) {
- var k = false
- for (var h = 0; h < l.length; h++) {
- var j = this._removeMarker(l[h])
- k = k || j
- }
- if (k) {
- this._clearLastClusters()
- this._createClusters()
- }
- return k
- }
- e.prototype.clearMarkers = function () {
- this._clearLastClusters()
- this._removeMarkersFromMap()
- this._markers = []
- }
- e.prototype._redraw = function () {
- this._clearLastClusters()
- this._createClusters()
- }
- e.prototype.getGridSize = function () {
- return this._gridSize
- }
- e.prototype.setGridSize = function (h) {
- this._gridSize = h
- this._redraw()
- }
- e.prototype.getMaxZoom = function () {
- return this._maxZoom
- }
- e.prototype.setMaxZoom = function (h) {
- this._maxZoom = h
- this._redraw()
- }
- e.prototype.getStyles = function () {
- return this._styles
- }
- e.prototype.setStyles = function (h) {
- this._styles = h
- this._redraw()
- }
- e.prototype.getMinClusterSize = function () {
- return this._minClusterSize
- }
- e.prototype.setMinClusterSize = function (h) {
- this._minClusterSize = h
- this._redraw()
- }
- e.prototype.isAverageCenter = function () {
- return this._isAverageCenter
- }
- e.prototype.getMap = function () {
- return this._map
- }
- e.prototype.getMarkers = function () {
- return this._markers
- }
- e.prototype.getClustersCount = function () {
- var k = 0
- for (var j = 0, h; (h = this._clusters[j]); j++) {
- h.isReal() && k++
- }
- return k
- }
- function g(h) {
- this._markerClusterer = h
- this._map = h.getMap()
- this._minClusterSize = h.getMinClusterSize()
- this._isAverageCenter = h.isAverageCenter()
- this._center = null
- this._markers = []
- this._gridBounds = null
- this._isReal = false
- this._clusterMarker = new BMapLib.TextIconOverlay(
- this._center,
- this._markers.length,
- {
- styles: this._markerClusterer.getStyles(),
- }
- )
- }
- g.prototype.addMarker = function (k) {
- if (this.isMarkerInCluster(k)) {
- return false
- }
- if (!this._center) {
- this._center = k.getPosition()
- this.updateGridBounds()
- } else {
- if (this._isAverageCenter) {
- var j = this._markers.length + 1
- var o = (this._center.lat * (j - 1) + k.getPosition().lat) / j
- var m = (this._center.lng * (j - 1) + k.getPosition().lng) / j
- this._center = new BMap.Point(m, o)
- this.updateGridBounds()
- }
- }
- k.isInCluster = true
- this._markers.push(k)
- var h = this._markers.length
- if (h < this._minClusterSize) {
- this._map.addOverlay(k)
- return true
- } else {
- if (h === this._minClusterSize) {
- for (var n = 0; n < h; n++) {
- this._markers[n].getMap() && this._map.removeOverlay(this._markers[n])
- }
- }
- }
- this._map.addOverlay(this._clusterMarker)
- this._isReal = true
- this.updateClusterMarker()
- return true
- }
- g.prototype.isMarkerInCluster = function (j) {
- if (this._markers.indexOf) {
- return this._markers.indexOf(j) != -1
- } else {
- for (var k = 0, h; (h = this._markers[k]); k++) {
- if (h === j) {
- return true
- }
- }
- }
- return false
- }
- g.prototype.isMarkerInClusterBounds = function (h) {
- return this._gridBounds.containsPoint(h.getPosition())
- }
- g.prototype.isReal = function () {
- return this._isReal
- }
- g.prototype.updateGridBounds = function () {
- var h = new BMap.Bounds(this._center, this._center)
- this._gridBounds = b(this._map, h, this._markerClusterer.getGridSize())
- }
- g.prototype.updateClusterMarker = function () {
- if (this._map.getZoom() > this._markerClusterer.getMaxZoom()) {
- this._clusterMarker && this._map.removeOverlay(this._clusterMarker)
- for (var l = 0, j; (j = this._markers[l]); l++) {
- this._map.addOverlay(j)
- }
- return
- }
- if (this._markers.length < this._minClusterSize) {
- this._clusterMarker.hide()
- return
- }
- this._clusterMarker.setPosition(this._center)
- this._clusterMarker.setText(this._markers.length)
- var k = this._map
- var h = this.getBounds()
- this._clusterMarker.addEventListener('click', function () {
- k.setViewport(h)
- })
- }
- g.prototype.remove = function () {
- // eslint-disable-next-line
- for (var j = 0, h; (h = this._markers[j]); j++) {
- this._markers[j].getMap() && this._map.removeOverlay(this._markers[j])
- }
- this._map.removeOverlay(this._clusterMarker)
- this._markers.length = 0
- delete this._markers
- }
- g.prototype.getBounds = function () {
- var k = new BMap.Bounds(this._center, this._center)
- for (var j = 0, h; (h = this._markers[j]); j++) {
- k.extend(h.getPosition())
- }
- return k
- }
- g.prototype.getCenter = function () {
- return this._center
- }
- })()
|