instrument time elapsed and report progress

This commit is contained in:
Rasmus Schultz
2013-12-24 16:47:21 -05:00
parent c1d4a88728
commit 8732cb4f0a
3 changed files with 53 additions and 23 deletions
+26 -11
View File
@@ -32,9 +32,11 @@ 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
// When bulk adding layers, adds markers in chunks. Means addLayers may not add all the layers in the call, others will be loaded during setTimeouts
chunkedLoading: false,
chunkSize: 500,
chunkInterval: 200, // process markers for a maximum of ~ n milliseconds (then trigger the chunkProgress callback)
chunkDelay: 50, // at the end of each interval, give n milliseconds back to system/browser
chunkProgress: null, // progress callback: function(processed, total, elapsed) (e.g. for a progress indicator)
//Options to pass to the L.Polygon constructor
polygonOptions: {}
@@ -164,15 +166,25 @@ L.MarkerClusterGroup = L.FeatureGroup.extend({
addLayers: function (layersArray) {
var fg = this._featureGroup,
npg = this._nonPointGroup,
chunkSize = this.options.chunkSize,
chunkInterval = this.options.chunkInterval,
chunkProgress = this.options.chunkProgress,
newMarkers, i, l, m;
if (this._map) {
var start = 0;
var end = this.options.chunkedLoading && chunkSize < layersArray.length ? chunkSize : layersArray.length;
var offset = 0,
started = (new Date()).getTime();
var process = L.bind(function () {
for (i = start; i < end; i++) {
m = layersArray[i];
var start = (new Date()).getTime();
for (; offset < layersArray.length; offset++) {
if (offset % 200 === 0) {
// every couple hundred markers, instrument the time elapsed since processing started:
var elapsed = (new Date()).getTime() - start;
if (elapsed > chunkInterval) {
break; // been working too hard, time to take a break :-)
}
}
m = layersArray[offset];
//Not point data, can't be clustered
if (!m.getLatLng) {
@@ -196,7 +208,12 @@ L.MarkerClusterGroup = L.FeatureGroup.extend({
}
}
if (end === layersArray.length) {
if (chunkProgress) {
// report progress and time elapsed:
chunkProgress(offset, layersArray.length, (new Date()).getTime() - started);
}
if (offset === layersArray.length) {
//Update the icons of all those visible clusters that were affected
this._featureGroup.eachLayer(function (c) {
if (c instanceof L.MarkerCluster && c._iconNeedsUpdate) {
@@ -206,9 +223,7 @@ L.MarkerClusterGroup = L.FeatureGroup.extend({
this._topClusterLevel._recursivelyAddChildrenToMap(null, this._zoom, this._currentShownBounds);
} else {
start = end;
end = Math.min(end + chunkSize, layersArray.length);
setTimeout(process, 0);
setTimeout(process, this.options.chunkDelay);
}
}, this);
+1 -1
View File
File diff suppressed because one or more lines are too long
+26 -11
View File
@@ -27,9 +27,11 @@ 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
// When bulk adding layers, adds markers in chunks. Means addLayers may not add all the layers in the call, others will be loaded during setTimeouts
chunkedLoading: false,
chunkSize: 500,
chunkInterval: 200, // process markers for a maximum of ~ n milliseconds (then trigger the chunkProgress callback)
chunkDelay: 50, // at the end of each interval, give n milliseconds back to system/browser
chunkProgress: null, // progress callback: function(processed, total, elapsed) (e.g. for a progress indicator)
//Options to pass to the L.Polygon constructor
polygonOptions: {}
@@ -159,15 +161,25 @@ L.MarkerClusterGroup = L.FeatureGroup.extend({
addLayers: function (layersArray) {
var fg = this._featureGroup,
npg = this._nonPointGroup,
chunkSize = this.options.chunkSize,
chunkInterval = this.options.chunkInterval,
chunkProgress = this.options.chunkProgress,
newMarkers, i, l, m;
if (this._map) {
var start = 0;
var end = this.options.chunkedLoading && chunkSize < layersArray.length ? chunkSize : layersArray.length;
var offset = 0,
started = (new Date()).getTime();
var process = L.bind(function () {
for (i = start; i < end; i++) {
m = layersArray[i];
var start = (new Date()).getTime();
for (; offset < layersArray.length; offset++) {
if (offset % 200 === 0) {
// every couple hundred markers, instrument the time elapsed since processing started:
var elapsed = (new Date()).getTime() - start;
if (elapsed > chunkInterval) {
break; // been working too hard, time to take a break :-)
}
}
m = layersArray[offset];
//Not point data, can't be clustered
if (!m.getLatLng) {
@@ -191,7 +203,12 @@ L.MarkerClusterGroup = L.FeatureGroup.extend({
}
}
if (end === layersArray.length) {
if (chunkProgress) {
// report progress and time elapsed:
chunkProgress(offset, layersArray.length, (new Date()).getTime() - started);
}
if (offset === layersArray.length) {
//Update the icons of all those visible clusters that were affected
this._featureGroup.eachLayer(function (c) {
if (c instanceof L.MarkerCluster && c._iconNeedsUpdate) {
@@ -201,9 +218,7 @@ L.MarkerClusterGroup = L.FeatureGroup.extend({
this._topClusterLevel._recursivelyAddChildrenToMap(null, this._zoom, this._currentShownBounds);
} else {
start = end;
end = Math.min(end + chunkSize, layersArray.length);
setTimeout(process, 0);
setTimeout(process, this.options.chunkDelay);
}
}, this);