From 755cd3cb645063d639ae38e670835ba2165210b4 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Thu, 9 Aug 2012 18:10:20 +0300 Subject: [PATCH] calculate point average as cluster center instead of bounds center --- src/MarkerCluster.js | 28 +++++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/src/MarkerCluster.js b/src/MarkerCluster.js index cc73b0cba..5a3f887c4 100644 --- a/src/MarkerCluster.js +++ b/src/MarkerCluster.js @@ -44,7 +44,7 @@ L.MarkerCluster = L.Marker.extend({ _baseInit: function () { L.Marker.prototype.initialize.call(this, this._latlng, { icon: this._group.options.iconCreateFunction(this._childCount) }); }, - + _addChild: function (new1) { if (new1 instanceof L.MarkerCluster) { this._childClusters.push(new1); @@ -63,13 +63,27 @@ L.MarkerCluster = L.Marker.extend({ _expandBounds: function (marker) { + var addedCount, + addedLatLng; + if (marker instanceof L.MarkerCluster) { this._bounds.extend(marker._bounds); + addedCount = marker._childCount; + addedLatLng = marker._latlng; } else { - this._bounds.extend(marker.getLatLng()); + addedLatLng = marker.getLatLng(); + this._bounds.extend(addedLatLng); + addedCount = 1; } - this._latlng = this._bounds.getCenter(); + var totalCount = this._childCount + addedCount; + + if (!this._latlng) { + this._latlng = addedLatLng; + } else { + this._latlng.lat = (addedLatLng.lat * addedCount + this._latlng.lat * this._childCount) / totalCount; + this._latlng.lng = (addedLatLng.lng * addedCount + this._latlng.lng * this._childCount) / totalCount; + } }, //Set our markers position as given and add it to the map @@ -187,7 +201,7 @@ L.MarkerCluster = L.Marker.extend({ markers.splice(i, 1); this._childCount--; this._recalculateBounds(); - + if (!('_zoom' in this)) { this.setIcon(group.options.iconCreateFunction(this._childCount)); } @@ -213,7 +227,7 @@ L.MarkerCluster = L.Marker.extend({ L.FeatureGroup.prototype.removeLayer.call(group, child); L.FeatureGroup.prototype.addLayer.call(group, child._markers[0]); } - + //Take ownership of its only marker and bin the cluster markers.push(child._markers[0]); childClusters.splice(i, 1); @@ -345,7 +359,7 @@ L.MarkerCluster = L.Marker.extend({ delete this._backupLatlng; } }, - + //exceptBounds: If set, don't remove any markers/clusters in it _recursivelyRemoveChildrenFromMap: function (previousBounds, depth, exceptBounds) { var m, i; @@ -438,4 +452,4 @@ L.MarkerCluster = L.Marker.extend({ //Don't need to check this._markers as the rest won't work if there are any return this._childClusters.length > 0 && this._childClusters[0]._childCount === this._childCount; } -}); \ No newline at end of file +});