Add zoomToShowLayer

This commit is contained in:
danzel
2012-09-11 16:24:05 +12:00
parent 81e5456759
commit 8f4dde032b
2 changed files with 108 additions and 89 deletions
+5 -1
View File
@@ -88,7 +88,11 @@ markers.on('clusterclick', function (a) {
``` ```
### Adding and removing Markers ### Adding and removing Markers
addLayer and removeLayer are supported and they should work for most uses. addLayer, removeLayer and clearLayers are supported and they should work for most uses.
### Other Methods
hasLayer(layer): Returns true if the given layer (marker) is in the MarkerClusterGroup
zoomToShowLayer(layer, callback): Zooms to show the given marker (spidifying if required), calls the callback when the marker is visible on the map
### Handling LOTS of markers ### Handling LOTS of markers
The Clusterer can handle 10000 or even 50000 markers (in chrome). IE9 has some issues with 50000. The Clusterer can handle 10000 or even 50000 markers (in chrome). IE9 has some issues with 50000.
+103 -88
View File
@@ -108,6 +108,109 @@ L.MarkerClusterGroup = L.FeatureGroup.extend({
return this; return this;
}, },
clearLayers: function () {
//Need our own special implementation as the LayerGroup one doesn't work for us
//If we aren't on the map yet, just blow away the markers we know of
if (!this._map) {
this._needsClustering = [];
return this;
}
if (this._unspiderfy) {
this._unspiderfy();
}
//Remove all the visible layers
for (var i in this._layers) {
if (this._layers.hasOwnProperty(i)) {
L.FeatureGroup.prototype.removeLayer.call(this, this._layers[i]);
}
}
//Reset _topClusterLevel and the DistanceGrids
this._generateInitialClusters();
return this;
},
hasLayer: function (layer) {
var res = false;
this._topClusterLevel._recursively(new L.LatLngBounds([layer.getLatLng()]), 0, this._map.getMaxZoom() + 1,
function (cluster) {
for (var i = cluster._markers.length - 1; i >= 0 && !res; i--) {
if (cluster._markers[i] === layer) {
res = true;
}
}
}, null);
return res;
},
zoomToShowLayer: function (layer, callback) {
layer.__parent.zoomToBounds();
setTimeout(function () {
if (layer._icon) {
callback();
} else {
layer.__parent.spiderfy();
setTimeout(function () {
callback();
}, L.DomUtil.TRANSITION ? 250 : 0); //TODO: This is hardcoded based on the time to spiderfy
}
}, L.DomUtil.TRANSITION ? 600 : 0); //TODO: This is hardcoded based on the leaflet time to zoom
},
//Overrides FeatureGroup.onAdd
onAdd: function (map) {
L.FeatureGroup.prototype.onAdd.call(this, map);
if (!this._gridClusters) {
this._generateInitialClusters();
}
for (var i = 0, l = this._needsClustering.length; i < l; i++) {
this._addLayer(this._needsClustering[i], this._maxZoom);
}
this._needsClustering = [];
this._map.on('zoomend', this._zoomEnd, this);
this._map.on('moveend', this._moveEnd, this);
if (this._spiderfierOnAdd) { //TODO FIXME: Not sure how to have spiderfier add something on here nicely
this._spiderfierOnAdd();
}
this._bindEvents();
//Actually add our markers to the map:
//Remember the current zoom level and bounds
this._zoom = this._map.getZoom();
this._currentShownBounds = this._getExpandedVisibleBounds();
//Make things appear on the map
this._topClusterLevel._recursivelyAddChildrenToMap(null, this._zoom, this._currentShownBounds);
},
//Overrides FeatureGroup.onRemove
onRemove: function (map) {
this._map.off('zoomend', this._zoomEnd, this);
this._map.off('moveend', this._moveEnd, this);
//In case we are in a cluster animation
this._map._mapPane.className = this._map._mapPane.className.replace(' leaflet-cluster-anim', '');
if (this._spiderfierOnRemove) { //TODO FIXME: Not sure how to have spiderfier add something on here nicely
this._spiderfierOnRemove();
}
L.FeatureGroup.prototype.onRemove.call(this, map);
},
//Remove the given object from the given array //Remove the given object from the given array
_arraySplice: function (anArray, obj) { _arraySplice: function (anArray, obj) {
for (var i = anArray.length - 1; i >= 0; i--) { for (var i = anArray.length - 1; i >= 0; i--) {
@@ -173,94 +276,6 @@ L.MarkerClusterGroup = L.FeatureGroup.extend({
} }
}, },
clearLayers: function () {
//Need our own special implementation as the LayerGroup one doesn't work for us
//If we aren't on the map yet, just blow away the markers we know of
if (!this._map) {
this._needsClustering = [];
return this;
}
if (this._unspiderfy) {
this._unspiderfy();
}
//Remove all the visible layers
for (var i in this._layers) {
if (this._layers.hasOwnProperty(i)) {
L.FeatureGroup.prototype.removeLayer.call(this, this._layers[i]);
}
}
//Reset _topClusterLevel and the DistanceGrids
this._generateInitialClusters();
return this;
},
hasLayer: function (layer) {
var res = false;
this._topClusterLevel._recursively(new L.LatLngBounds([layer.getLatLng()]), 0, this._map.getMaxZoom() + 1,
function (cluster) {
for (var i = cluster._markers.length - 1; i >= 0 && !res; i--) {
if (cluster._markers[i] === layer) {
res = true;
}
}
}, null);
return res;
},
//Overrides FeatureGroup.onAdd
onAdd: function (map) {
L.FeatureGroup.prototype.onAdd.call(this, map);
if (!this._gridClusters) {
this._generateInitialClusters();
}
for (var i = 0, l = this._needsClustering.length; i < l; i++) {
this._addLayer(this._needsClustering[i], this._maxZoom);
}
this._needsClustering = [];
this._map.on('zoomend', this._zoomEnd, this);
this._map.on('moveend', this._moveEnd, this);
if (this._spiderfierOnAdd) { //TODO FIXME: Not sure how to have spiderfier add something on here nicely
this._spiderfierOnAdd();
}
this._bindEvents();
//Actually add our markers to the map:
//Remember the current zoom level and bounds
this._zoom = this._map.getZoom();
this._currentShownBounds = this._getExpandedVisibleBounds();
//Make things appear on the map
this._topClusterLevel._recursivelyAddChildrenToMap(null, this._zoom, this._currentShownBounds);
},
//Overrides FeatureGroup.onRemove
onRemove: function (map) {
this._map.off('zoomend', this._zoomEnd, this);
this._map.off('moveend', this._moveEnd, this);
//In case we are in a cluster animation
this._map._mapPane.className = this._map._mapPane.className.replace(' leaflet-cluster-anim', '');
if (this._spiderfierOnRemove) { //TODO FIXME: Not sure how to have spiderfier add something on here nicely
this._spiderfierOnRemove();
}
L.FeatureGroup.prototype.onRemove.call(this, map);
},
//Overrides FeatureGroup._propagateEvent //Overrides FeatureGroup._propagateEvent
_propagateEvent: function (e) { _propagateEvent: function (e) {
if (e.target instanceof L.MarkerCluster) { if (e.target instanceof L.MarkerCluster) {