[Pkg-javascript-commits] [leaflet-markercluster] 216/479: New, working removeLayer code
Jonas Smedegaard
dr at jones.dk
Thu Oct 16 16:00:32 UTC 2014
This is an automated email from the git hooks/post-receive script.
js pushed a commit to branch master
in repository leaflet-markercluster.
commit fa4d9913f6a7ea9b9dd14c7f8d0b04d19aaf2c9a
Author: danzel <danzel at localhost.geek.nz>
Date: Tue Sep 11 14:43:26 2012 +1200
New, working removeLayer code
---
src/MarkerCluster.js | 23 +-------------
src/MarkerClusterGroup.js | 79 +++++++++++++++++++++++++++++++++++++++++++++--
2 files changed, 77 insertions(+), 25 deletions(-)
diff --git a/src/MarkerCluster.js b/src/MarkerCluster.js
index 5eb9c42..fb15ceb 100644
--- a/src/MarkerCluster.js
+++ b/src/MarkerCluster.js
@@ -89,28 +89,7 @@ L.MarkerCluster = L.Marker.extend({
}
},
- _removeChildMarker: function (marker) {
- var markers = this._markers,
- i;
-
- for (i = markers.length - 1; i >= 0; i--) {
- if (markers[i] === marker) {
- markers.splice(i, 1);
-
- var p = this;
- while (p) {
- p._childCount--;
- p._recalculateBounds();
- p._updateIcon();
- p = p._parent;
- }
- return true;
- }
- }
-
- },
-
- //Expand our bounds and tell our parent to
+ //Expand our bounds and tell our parent to
_expandBounds: function (marker) {
var addedCount,
addedLatLng = marker._wLatLng || marker._latlng;
diff --git a/src/MarkerClusterGroup.js b/src/MarkerClusterGroup.js
index 1762762..8ad5c0e 100644
--- a/src/MarkerClusterGroup.js
+++ b/src/MarkerClusterGroup.js
@@ -103,11 +103,84 @@ L.MarkerClusterGroup = L.FeatureGroup.extend({
this._unspiderfyLayer(layer);
}
- layer.__cluster._removeChildMarker(layer);
+ //Remove the marker from clusters
+ this._removeLayer(layer, true);
+ if (layer._icon) {
+ L.FeatureGroup.prototype.removeLayer.call(this, layer);
+ }
return this;
},
+ //Remove the given object from the given array
+ _arraySplice: function (anArray, obj) {
+ for (var i = anArray.length - 1; i >= 0; i--) {
+ if (anArray[i] === obj) {
+ anArray.splice(i, 1);
+ return;
+ }
+ }
+ },
+
+ _removeLayer: function (marker, removeFromDistanceGrid) {
+ var gridClusters = this._gridClusters,
+ gridUnclustered = this._gridUnclustered,
+ map = this._map;
+
+ //Remove the marker from distance clusters it might be in
+ if (removeFromDistanceGrid) {
+ for (var z = this._maxZoom; z >= 0; z--) {
+ if (!gridUnclustered[z].removeObject(marker, map.project(marker.getLatLng(), z))) {
+ break;
+ }
+ }
+ }
+
+ //Work our way up the clusters removing them as we go if required
+ var cluster = marker.__cluster,
+ markers = cluster._markers,
+ otherMarker;
+
+ //Remove the marker from the immediate parents marker list
+ this._arraySplice(markers, marker);
+
+ while (cluster) {
+ cluster._childCount--;
+
+ if (cluster._zoom < 0) {
+ //Top level, do nothing?
+
+ } else if (removeFromDistanceGrid && cluster._childCount <= 1) { //Cluster no longer required
+ //We need to push the other marker up to the parent
+ otherMarker = cluster._markers[0] == marker ? cluster._markers[1] : cluster._markers[0];
+
+ if (!otherMarker) {
+ debugger;
+ }
+
+ //Update distance grid
+ gridClusters[cluster._zoom].removeObject(cluster, map.project(cluster._cLatLng, cluster._zoom));
+ gridUnclustered[cluster._zoom].addObject(otherMarker, map.project(otherMarker.getLatLng(), cluster._zoom));
+
+ //Move otherMarker up to parent
+ this._arraySplice(cluster._parent._childClusters, cluster);
+ cluster._parent._markers.push(otherMarker);
+ otherMarker.__cluster = cluster._parent;
+
+ if (cluster._icon) {
+ //Cluster is currently on the map, need to put the marker on the map instead
+ L.FeatureGroup.prototype.removeLayer.call(this, cluster);
+ L.FeatureGroup.prototype.addLayer.call(this, otherMarker);
+ }
+ } else {
+ cluster._recalculateBounds();
+ cluster._updateIcon();
+ }
+
+ cluster = cluster._parent;
+ }
+ },
+
clearLayers: function () {
//Need our own special implementation as the LayerGroup one doesn't work for us
@@ -343,7 +416,7 @@ L.MarkerClusterGroup = L.FeatureGroup.extend({
closest = gridUnclustered[zoom].getNearObject(markerPoint);
if (closest) {
if (closest.__cluster) {
- closest.__cluster._removeChildMarker(closest);
+ this._removeLayer(closest, false);
}
var parent = closest.__cluster || this._topClusterLevel;
@@ -351,7 +424,7 @@ L.MarkerClusterGroup = L.FeatureGroup.extend({
console.log('creating new cluster with 2 markers at zoom ' + zoom);
var newCluster = new L.MarkerCluster(this, zoom, closest, layer);
- gridClusters[zoom].addObject(newCluster, this._map.project(closest.getLatLng(), zoom));
+ gridClusters[zoom].addObject(newCluster, this._map.project(newCluster._cLatLng, zoom));
closest.__cluster = newCluster;
layer.__cluster = newCluster;
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-javascript/leaflet-markercluster.git
More information about the Pkg-javascript-commits
mailing list