From 9cd5eab7f9bc76ce69f3cd87d2d7c6ab771d07b7 Mon Sep 17 00:00:00 2001 From: dnomadb Date: Wed, 6 Jan 2016 10:38:42 -0800 Subject: [PATCH] integrating weighted breaks --- lib/raster.js | 6 ++++-- lib/utils.js | 7 ++++--- test/raster.test.js | 14 +++++++++++++- 3 files changed, 21 insertions(+), 6 deletions(-) diff --git a/lib/raster.js b/lib/raster.js index 1b756fa..acfa9d7 100644 --- a/lib/raster.js +++ b/lib/raster.js @@ -164,9 +164,11 @@ Raster.prototype.getZooms = function(callback) { var pixelSize = utils.convertToMeters(this.details.pixelSize, utils.getUnitType(this.projection)); var spatialResolutions = utils.getSpatialResolutions(); - + // Threshold weight = the amount to shift the break; + // 0 = no shift (always upsamples), 1 = full shift (always downsamples) + var thresholdWeight = 0.25; var _this = this; - var validSpatialResolutions = utils.getValidSpatialResolutions(spatialResolutions, _this.details.pixelSize[0]); + var validSpatialResolutions = utils.getValidSpatialResolutions(spatialResolutions, _this.details.pixelSize[0], thresholdWeight); this.details.pixelSize = pixelSize; return callback( diff --git a/lib/utils.js b/lib/utils.js index e1f5244..9a83c3c 100644 --- a/lib/utils.js +++ b/lib/utils.js @@ -94,8 +94,9 @@ module.exports.getSpatialResolutions = function() { }); }; -module.exports.getValidSpatialResolutions = function(spatialResolutions, pixelSize) { - return spatialResolutions.filter(function(res) { - return res > pixelSize; +module.exports.getValidSpatialResolutions = function(spatialResolutions, pixelSize, thresholdWeight) { + return spatialResolutions.filter(function(res, i) { + var zBreak = res - spatialResolutions[Math.min(i + 1, spatialResolutions.length - 1)] * thresholdWeight; + return zBreak > pixelSize; }); }; diff --git a/test/raster.test.js b/test/raster.test.js index ca5e90d..e397a15 100644 --- a/test/raster.test.js +++ b/test/raster.test.js @@ -403,9 +403,21 @@ tape('[SPATIAL RESOLUTIONS] Get spatial resolutions / valid spatial resolutions' var expectedResolutions = JSON.parse('[156542.96875,78271.484375,39135.7421875,19567.87109375,9783.935546875,4891.9677734375,2445.98388671875,1222.991943359375,611.4959716796875,305.74798583984375,152.87399291992188,76.43699645996094,38.21849822998047,19.109249114990234,9.554624557495117,4.777312278747559,2.3886561393737793,1.1943280696868896,0.5971640348434448,0.2985820174217224]'); assert.deepLooseEqual(spatialResolutions, expectedResolutions); - var validSpatialResolutions = utils.getValidSpatialResolutions(spatialResolutions, 30.20012); + var validSpatialResolutions = utils.getValidSpatialResolutions(spatialResolutions, 30.20012, 0); var expectedValidResolutions = JSON.parse('[156542.96875,78271.484375,39135.7421875,19567.87109375,9783.935546875,4891.9677734375,2445.98388671875,1222.991943359375,611.4959716796875,305.74798583984375,152.87399291992188,76.43699645996094,38.21849822998047]'); assert.deepLooseEqual(validSpatialResolutions, expectedValidResolutions); assert.end(); }); + +tape('[SPATIAL RESOLUTIONS] Get spatial resolutions / valid spatial resolutions with weight', function(assert) { + var spatialResolutions = utils.getSpatialResolutions(); + var expectedResolutions = JSON.parse('[156542.96875,78271.484375,39135.7421875,19567.87109375,9783.935546875,4891.9677734375,2445.98388671875,1222.991943359375,611.4959716796875,305.74798583984375,152.87399291992188,76.43699645996094,38.21849822998047,19.109249114990234,9.554624557495117,4.777312278747559,2.3886561393737793,1.1943280696868896,0.5971640348434448,0.2985820174217224]'); + assert.deepLooseEqual(spatialResolutions, expectedResolutions); + + var validSpatialResolutions = utils.getValidSpatialResolutions(spatialResolutions, 40.20012, 0.25); + var expectedValidResolutions = JSON.parse('[156542.96875,78271.484375,39135.7421875,19567.87109375,9783.935546875,4891.9677734375,2445.98388671875,1222.991943359375,611.4959716796875,305.74798583984375,152.87399291992188,76.43699645996094]'); + assert.deepLooseEqual(validSpatialResolutions, expectedValidResolutions); + + assert.end(); +});