[Pkg-javascript-commits] [leaflet-markercluster] 03/219: Add chunkedLoading option. refs #292
Jonas Smedegaard
dr at jones.dk
Sat May 7 09:39:05 UTC 2016
This is an automated email from the git hooks/post-receive script.
js pushed a commit to branch master
in repository leaflet-markercluster.
commit 8b65285a06fea5c0949e160676a3362856689e34
Author: danzel <danzel at localhost.geek.nz>
Date: Fri Dec 20 09:56:17 2013 +1300
Add chunkedLoading option. refs #292
---
src/MarkerClusterGroup.js | 132 +++++++++++++++++++++++++---------------------
1 file changed, 72 insertions(+), 60 deletions(-)
diff --git a/src/MarkerClusterGroup.js b/src/MarkerClusterGroup.js
index 7f8f0fb..42564d2 100644
--- a/src/MarkerClusterGroup.js
+++ b/src/MarkerClusterGroup.js
@@ -27,6 +27,10 @@ L.MarkerClusterGroup = L.FeatureGroup.extend({
//Increase to increase the distance away that spiderfied markers appear from the center
spiderfyDistanceMultiplier: 1,
+ //When bulk adding layers, runs chunks at a time. Means addLayers may not add all the layers in the call, others will be loaded during setTimeouts
+ chunkedLoading: false,
+ chunkSize: 500,
+
//Options to pass to the L.Polygon constructor
polygonOptions: {}
},
@@ -153,52 +157,79 @@ L.MarkerClusterGroup = L.FeatureGroup.extend({
//Takes an array of markers and adds them in bulk
addLayers: function (layersArray) {
- var i, l, m,
- onMap = this._map,
- fg = this._featureGroup,
- npg = this._nonPointGroup;
+ var fg = this._featureGroup,
+ npg = this._nonPointGroup,
+ chunkSize = this.options.chunkSize,
+ i, l, m;
- for (i = 0, l = layersArray.length; i < l; i++) {
- m = layersArray[i];
+ if (this._map) {
+ var start = 0;
+ var end = this.options.chunkedLoading && chunkSize < layersArray.length ? chunkSize : layersArray.length;
+ var process = L.bind(function () {
+ console.log((+new Date()) + ' processing ' + start + ' - ' + end);
+ for (i = start; i < end; i++) {
+ m = layersArray[i];
+
+ //Not point data, can't be clustered
+ if (!m.getLatLng) {
+ npg.addLayer(m);
+ continue;
+ }
- //Not point data, can't be clustered
- if (!m.getLatLng) {
- npg.addLayer(m);
- continue;
- }
+ if (this.hasLayer(m)) {
+ continue;
+ }
- if (this.hasLayer(m)) {
- continue;
- }
+ this._addLayer(m, this._maxZoom);
- if (!onMap) {
- this._needsClustering.push(m);
- continue;
- }
+ //If we just made a cluster of size 2 then we need to remove the other marker from the map (if it is) or we never will
+ if (m.__parent) {
+ if (m.__parent.getChildCount() === 2) {
+ var markers = m.__parent.getAllChildMarkers(),
+ otherMarker = markers[0] === m ? markers[1] : markers[0];
+ fg.removeLayer(otherMarker);
+ }
+ }
+ }
+
+ if (end === layersArray.length) {
+ console.log((+new Date()) + ' done');
+ //Update the icons of all those visible clusters that were affected
+ this._featureGroup.eachLayer(function (c) {
+ if (c instanceof L.MarkerCluster && c._iconNeedsUpdate) {
+ c._updateIcon();
+ }
+ });
+
+ this._topClusterLevel._recursivelyAddChildrenToMap(null, this._zoom, this._currentShownBounds);
+ } else {
+ start = end;
+ end = Math.min(end + chunkSize, layersArray.length);
+ console.log((+new Date()) + ' queueing ' + start + ' - ' + end);
+ setTimeout(process, 100);
+ }
+ }, this);
- this._addLayer(m, this._maxZoom);
+ process();
+ } else {
+ console.log((+new Date()) + ' start pre-add');
+ for (i = 0, l = layersArray.length; i < l; i++) {
+ m = layersArray[i];
- //If we just made a cluster of size 2 then we need to remove the other marker from the map (if it is) or we never will
- if (m.__parent) {
- if (m.__parent.getChildCount() === 2) {
- var markers = m.__parent.getAllChildMarkers(),
- otherMarker = markers[0] === m ? markers[1] : markers[0];
- fg.removeLayer(otherMarker);
+ //Not point data, can't be clustered
+ if (!m.getLatLng) {
+ npg.addLayer(m);
+ continue;
}
- }
- }
- if (onMap) {
- //Update the icons of all those visible clusters that were affected
- fg.eachLayer(function (c) {
- if (c instanceof L.MarkerCluster && c._iconNeedsUpdate) {
- c._updateIcon();
+ if (this.hasLayer(m)) {
+ continue;
}
- });
- this._topClusterLevel._recursivelyAddChildrenToMap(null, this._zoom, this._currentShownBounds);
+ this._needsClustering.push(m);
+ }
+ console.log((+new Date()) + ' end pre-add');
}
-
return this;
},
@@ -414,23 +445,9 @@ L.MarkerClusterGroup = L.FeatureGroup.extend({
}
this._needsRemoving = [];
- for (i = 0, l = this._needsClustering.length; i < l; i++) {
- layer = this._needsClustering[i];
-
- //If the layer doesn't have a getLatLng then we can't cluster it, so add it to our child featureGroup
- if (!layer.getLatLng) {
- this._featureGroup.addLayer(layer);
- continue;
- }
-
-
- if (layer.__parent) {
- continue;
- }
- this._addLayer(layer, this._maxZoom);
- }
- this._needsClustering = [];
-
+ //Remember the current zoom level and bounds
+ this._zoom = this._map.getZoom();
+ this._currentShownBounds = this._getExpandedVisibleBounds();
this._map.on('zoomend', this._zoomEnd, this);
this._map.on('moveend', this._moveEnd, this);
@@ -441,15 +458,10 @@ L.MarkerClusterGroup = L.FeatureGroup.extend({
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);
+ l = this._needsClustering;
+ this._needsClustering = [];
+ this.addLayers(l);
},
//Overrides FeatureGroup.onRemove
--
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