mapshaper 0.7.19 → 0.7.20

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/mapshaper.js CHANGED
@@ -78,7 +78,7 @@
78
78
  return obj === Object(obj); // via underscore
79
79
  }
80
80
 
81
- function clamp$1(val, min, max) {
81
+ function clamp$2(val, min, max) {
82
82
  return val < min ? min : (val > max ? max : val);
83
83
  }
84
84
 
@@ -751,7 +751,7 @@
751
751
  function findValueByRank(arr, rank) {
752
752
  if (!arr.length || rank < 1 || rank > arr.length) error$1("[findValueByRank()] invalid input");
753
753
 
754
- rank = clamp$1(rank | 0, 1, arr.length);
754
+ rank = clamp$2(rank | 0, 1, arr.length);
755
755
  var k = rank - 1, // conv. rank to array index
756
756
  n = arr.length,
757
757
  l = 0,
@@ -1125,7 +1125,7 @@
1125
1125
  // self-import and the resulting Rollup circular-dependency warning.
1126
1126
  var utils = {
1127
1127
  addThousandsSep, addslashes, arrayToIndex,
1128
- clamp: clamp$1, cleanNumericString, contains, copyElements, countValues, createBuffer,
1128
+ clamp: clamp$2, cleanNumericString, contains, copyElements, countValues, createBuffer,
1129
1129
  defaults, difference,
1130
1130
  endsWith, every, expandoBuffer, extend: extend$1, extendBuffer,
1131
1131
  find: find$1, findMedian, findQuantile, findRankByValue, findStringPrefix,
@@ -6373,7 +6373,7 @@
6373
6373
  }
6374
6374
 
6375
6375
  function projectPoint(xy, crsFrom, crsTo) {
6376
- if (crsAreEqual(crsFrom, crsTo)) return xy.concat();
6376
+ if (crsHaveSameTransform(crsFrom, crsTo)) return xy.concat();
6377
6377
  var proj = getProjTransform2(crsFrom, crsTo);
6378
6378
  return proj(xy[0], xy[1]);
6379
6379
  }
@@ -6418,6 +6418,16 @@
6418
6418
  return !!str && str == crsToProj4(b);
6419
6419
  }
6420
6420
 
6421
+ function crsHaveSameTransform(a, b) {
6422
+ var str = crsToNormalizedProj4(a);
6423
+ return !!str && str == crsToNormalizedProj4(b);
6424
+ }
6425
+
6426
+ function crsToNormalizedProj4(P) {
6427
+ var normalizer = mproj$1.internal && mproj$1.internal.get_normalized_proj_defn;
6428
+ return P && normalizer ? normalizer(P) : null;
6429
+ }
6430
+
6421
6431
  function isProjAlias(str) {
6422
6432
  return str in projectionAliases;
6423
6433
  }
@@ -6690,6 +6700,7 @@
6690
6700
  var Projections = /*#__PURE__*/Object.freeze({
6691
6701
  __proto__: null,
6692
6702
  crsAreEqual: crsAreEqual,
6703
+ crsHaveSameTransform: crsHaveSameTransform,
6693
6704
  crsToPrj: crsToPrj,
6694
6705
  crsToProj4: crsToProj4,
6695
6706
  crsToWkt2: crsToWkt2,
@@ -30601,6 +30612,13 @@ ${svg}
30601
30612
  .option('target', targetOpt)
30602
30613
  .option('no-replace', noReplaceOpt);
30603
30614
 
30615
+ parser.command('blur')
30616
+ // .describe('apply a Gaussian-like blur to projected raster layers')
30617
+ .option('radius', {
30618
+ describe: '[raster] blur amount in pixels, corresponding to 2 * sigma (e.g. 10 or 10px)'
30619
+ })
30620
+ .option('target', targetOpt);
30621
+
30604
30622
  parser.command('classify')
30605
30623
  // .describe('apply sequential or categorical classification')
30606
30624
  .describe('assign colors or values using one of several methods')
@@ -51569,10 +51587,10 @@ ${svg}
51569
51587
 
51570
51588
  function getTrianglePixelBounds(grid, p1, p2, p3) {
51571
51589
  return [
51572
- clamp(Math.floor(Math.min(p1.x, p2.x, p3.x)), 0, grid.width - 1),
51573
- clamp(Math.floor(Math.min(p1.y, p2.y, p3.y)), 0, grid.height - 1),
51574
- clamp(Math.ceil(Math.max(p1.x, p2.x, p3.x)), 0, grid.width - 1),
51575
- clamp(Math.ceil(Math.max(p1.y, p2.y, p3.y)), 0, grid.height - 1)
51590
+ clamp$1(Math.floor(Math.min(p1.x, p2.x, p3.x)), 0, grid.width - 1),
51591
+ clamp$1(Math.floor(Math.min(p1.y, p2.y, p3.y)), 0, grid.height - 1),
51592
+ clamp$1(Math.ceil(Math.max(p1.x, p2.x, p3.x)), 0, grid.width - 1),
51593
+ clamp$1(Math.ceil(Math.max(p1.y, p2.y, p3.y)), 0, grid.height - 1)
51576
51594
  ];
51577
51595
  }
51578
51596
 
@@ -51593,8 +51611,8 @@ ${svg}
51593
51611
  }
51594
51612
 
51595
51613
  function copyNearestRasterSample(srcGrid, destGrid, sx, sy, dx, dy) {
51596
- var srcX = clamp(Math.floor(sx), 0, srcGrid.width - 1);
51597
- var srcY = clamp(Math.floor(sy), 0, srcGrid.height - 1);
51614
+ var srcX = clamp$1(Math.floor(sx), 0, srcGrid.width - 1);
51615
+ var srcY = clamp$1(Math.floor(sy), 0, srcGrid.height - 1);
51598
51616
  var src = (srcY * srcGrid.width + srcX) * srcGrid.bands;
51599
51617
  var dest = (dy * destGrid.width + dx) * destGrid.bands;
51600
51618
  if (!rasterSourcePixelIsCovered(srcGrid, srcX, srcY)) return;
@@ -51606,12 +51624,12 @@ ${svg}
51606
51624
  }
51607
51625
 
51608
51626
  function copyBilinearRasterSample(srcGrid, destGrid, sx, sy, dx, dy) {
51609
- var srcX = clamp(Math.floor(sx - 0.5), 0, srcGrid.width - 1);
51610
- var srcY = clamp(Math.floor(sy - 0.5), 0, srcGrid.height - 1);
51611
- var srcX2 = clamp(srcX + 1, 0, srcGrid.width - 1);
51612
- var srcY2 = clamp(srcY + 1, 0, srcGrid.height - 1);
51613
- var tx = clamp(sx - 0.5 - srcX, 0, 1);
51614
- var ty = clamp(sy - 0.5 - srcY, 0, 1);
51627
+ var srcX = clamp$1(Math.floor(sx - 0.5), 0, srcGrid.width - 1);
51628
+ var srcY = clamp$1(Math.floor(sy - 0.5), 0, srcGrid.height - 1);
51629
+ var srcX2 = clamp$1(srcX + 1, 0, srcGrid.width - 1);
51630
+ var srcY2 = clamp$1(srcY + 1, 0, srcGrid.height - 1);
51631
+ var tx = clamp$1(sx - 0.5 - srcX, 0, 1);
51632
+ var ty = clamp$1(sy - 0.5 - srcY, 0, 1);
51615
51633
  var src00 = (srcY * srcGrid.width + srcX) * srcGrid.bands;
51616
51634
  var src10 = (srcY * srcGrid.width + srcX2) * srcGrid.bands;
51617
51635
  var src01 = (srcY2 * srcGrid.width + srcX) * srcGrid.bands;
@@ -51716,7 +51734,7 @@ ${svg}
51716
51734
  return (x - a.x) * (b.y - a.y) - (y - a.y) * (b.x - a.x);
51717
51735
  }
51718
51736
 
51719
- function clamp(val, min, max) {
51737
+ function clamp$1(val, min, max) {
51720
51738
  return val < min ? min : val > max ? max : val;
51721
51739
  }
51722
51740
 
@@ -54972,17 +54990,17 @@ ${svg}
54972
54990
  print(msgArg || '');
54973
54991
  };
54974
54992
 
54975
- cmd.renameLayers = function(layers, names, catalog) {
54993
+ cmd.renameLayers = function(layers, names) {
54976
54994
  if (names && names.join('').indexOf('=') > -1) {
54977
- renameByAssignment(names, catalog);
54995
+ renameByAssignment(names, layers);
54978
54996
  } else {
54979
54997
  renameTargetLayers(names, layers);
54980
54998
  }
54981
54999
  };
54982
55000
 
54983
- function renameByAssignment(names, catalog) {
55001
+ function renameByAssignment(names, layers) {
54984
55002
  var index = mapLayerNames(names);
54985
- catalog.forEachLayer(function(lyr) {
55003
+ layers.forEach(function(lyr) {
54986
55004
  if (index[lyr.name]) {
54987
55005
  noteLayerMetadataWillChange(lyr, {operation: 'rename-layers'});
54988
55006
  lyr.name = index[lyr.name];
@@ -54993,17 +55011,14 @@ ${svg}
54993
55011
 
54994
55012
  function renameTargetLayers(names, layers) {
54995
55013
  var nameCount = names && names.length || 0;
54996
- var name = '';
54997
- var suffix = '';
55014
+ if (nameCount != layers.length) {
55015
+ stop$1("Expected one name for each target layer; received " + nameCount +
55016
+ " name" + (nameCount == 1 ? "" : "s") + " for " + layers.length +
55017
+ " target layer" + (layers.length == 1 ? "" : "s"));
55018
+ }
54998
55019
  layers.forEach(function(lyr, i) {
54999
- if (i < nameCount) {
55000
- name = names[i];
55001
- }
55002
- if (name && nameCount < layers.length && (i >= nameCount - 1)) {
55003
- suffix = (suffix || 0) + 1;
55004
- }
55005
55020
  noteLayerMetadataWillChange(lyr, {operation: 'rename-layers'});
55006
- lyr.name = name + suffix;
55021
+ lyr.name = names[i];
55007
55022
  markLayerMetadataChanged(lyr, {operation: 'rename-layers'});
55008
55023
  });
55009
55024
  }
@@ -57859,7 +57874,7 @@ ${svg}
57859
57874
  name == 'require' || name == 'drop' || name == 'target' ||
57860
57875
  name == 'if' || name == 'elif' || name == 'else' || name == 'endif' ||
57861
57876
  name == 'run' || name == 'i' || name == 'snap' || name == 'frame' ||
57862
- name == 'comment';
57877
+ name == 'comment' || name == 'rename-layers';
57863
57878
  }
57864
57879
 
57865
57880
  function commandAcceptsEmptyTarget(name) {
@@ -57900,8 +57915,7 @@ ${svg}
57900
57915
  T$1.start();
57901
57916
 
57902
57917
  if (name == 'rename-layers') {
57903
- // default target is all layers
57904
- targets = job.catalog.findCommandTargets(opts.target || '*');
57918
+ targets = job.catalog.findCommandTargets(opts.target);
57905
57919
  targetLayers = targets.reduce(function(memo, obj) {
57906
57920
  return memo.concat(obj.layers);
57907
57921
  }, []);
@@ -57970,6 +57984,9 @@ ${svg}
57970
57984
  outputLayers = applyCommandToEachLayer(cmd.buffer, targetLayers, targetDataset, opts);
57971
57985
  // outputLayers = cmd.buffer(targetLayers, targetDataset, opts);
57972
57986
 
57987
+ } else if (name == 'blur') {
57988
+ cmd.blur(targetLayers, targetDataset, opts);
57989
+
57973
57990
  } else if (name == 'data-fill') {
57974
57991
  applyCommandToEachLayer(cmd.dataFill, targetLayers, arcs, opts);
57975
57992
 
@@ -58176,7 +58193,7 @@ ${svg}
58176
58193
  applyCommandToEachLayer(cmd.renameFields, targetLayers, opts.fields);
58177
58194
 
58178
58195
  } else if (name == 'rename-layers') {
58179
- cmd.renameLayers(targetLayers, opts.names, job.catalog);
58196
+ cmd.renameLayers(targetLayers, opts.names);
58180
58197
 
58181
58198
  } else if (name == 'require') {
58182
58199
  await cmd.require(opts);
@@ -58330,7 +58347,7 @@ ${svg}
58330
58347
  });
58331
58348
  }
58332
58349
 
58333
- var version = "0.7.19";
58350
+ var version = "0.7.20";
58334
58351
 
58335
58352
  // Parse command line args into commands and run them
58336
58353
  // Function takes an optional Node-style callback. A Promise is returned if no callback is given.
@@ -59019,6 +59036,291 @@ ${svg}
59019
59036
  return false;
59020
59037
  }
59021
59038
 
59039
+ var BOX_BLUR_PASSES = 3;
59040
+
59041
+ function blurRasterGrid(raster, optsArg) {
59042
+ var opts = optsArg || {};
59043
+ var grid = getRasterGrid(raster);
59044
+ var radius = getBlurRadius(opts);
59045
+ var sigma = radius / 2;
59046
+ var boxes = getGaussianBoxWidths(sigma, BOX_BLUR_PASSES);
59047
+ var samples = new grid.samples.constructor(grid.samples.length);
59048
+ var tmp = new Float32Array(grid.width * grid.height);
59049
+ var channel = new Float32Array(grid.width * grid.height);
59050
+ var weights = getRasterBlurWeights(grid);
59051
+ validateBlurGrid(grid);
59052
+ if (grid.bands == 4) {
59053
+ blurRgbaGrid(grid, samples, channel, tmp, weights, boxes);
59054
+ return Object.assign({}, grid, {
59055
+ samples: samples
59056
+ });
59057
+ }
59058
+ for (var band = 0; band < grid.bands; band++) {
59059
+ copyBandToChannel(grid, band, channel);
59060
+ blurChannel(channel, tmp, weights, grid.width, grid.height, boxes);
59061
+ copyChannelToBand(channel, samples, grid, band);
59062
+ }
59063
+ return Object.assign({}, grid, {
59064
+ samples: samples
59065
+ });
59066
+ }
59067
+
59068
+ function getBlurRadius(opts) {
59069
+ var arg = opts.radius;
59070
+ var radius;
59071
+ if (arg == null || arg === '') stop$1('Missing blur radius');
59072
+ if (typeof arg == 'string') {
59073
+ arg = arg.trim().replace(/px$/i, '');
59074
+ }
59075
+ radius = Number(arg);
59076
+ if (!(radius > 0 && isFinite(radius))) {
59077
+ stop$1('Expected radius= to be a positive pixel value');
59078
+ }
59079
+ return radius;
59080
+ }
59081
+
59082
+ function validateBlurGrid(grid) {
59083
+ if (!grid || !grid.samples || !grid.width || !grid.height || !grid.bands) {
59084
+ stop$1('Expected a raster grid');
59085
+ }
59086
+ }
59087
+
59088
+ // Convert a Gaussian sigma to box widths using the method described by
59089
+ // Ivan Kutskir / Peter Kovesi. Three box passes are a close, fast approximation.
59090
+ function getGaussianBoxWidths(sigma, n) {
59091
+ var ideal = Math.sqrt((12 * sigma * sigma / n) + 1);
59092
+ var wl = Math.floor(ideal);
59093
+ if (wl % 2 === 0) wl--;
59094
+ var wu = wl + 2;
59095
+ var m = Math.round((12 * sigma * sigma - n * wl * wl - 4 * n * wl - 3 * n) / (-4 * wl - 4));
59096
+ var boxes = [];
59097
+ for (var i = 0; i < n; i++) {
59098
+ boxes.push(i < m ? wl : wu);
59099
+ }
59100
+ return boxes;
59101
+ }
59102
+
59103
+ function blurRgbaGrid(grid, samples, channel, tmp, weights, boxes) {
59104
+ var alpha = new Float32Array(grid.width * grid.height);
59105
+ copyBandToChannel(grid, 3, alpha);
59106
+ blurChannel(alpha, tmp, weights, grid.width, grid.height, boxes);
59107
+ for (var band = 0; band < grid.bands; band++) {
59108
+ if (band < 3) {
59109
+ copyPremultipliedBandToChannel(grid, band, channel);
59110
+ blurChannel(channel, tmp, weights, grid.width, grid.height, boxes);
59111
+ copyUnpremultipliedChannelToBand(channel, alpha, samples, grid, band);
59112
+ } else {
59113
+ copyChannelToBand(alpha, samples, grid, 3);
59114
+ }
59115
+ }
59116
+ }
59117
+
59118
+ function blurChannel(channel, tmp, weights, width, height, boxes) {
59119
+ boxes.forEach(function(widthPx) {
59120
+ var radius = Math.floor((widthPx - 1) / 2);
59121
+ if (radius < 1) return;
59122
+ if (weights) {
59123
+ boxBlurWeighted(channel, tmp, weights, width, height, radius);
59124
+ } else {
59125
+ boxBlur(channel, tmp, width, height, radius);
59126
+ }
59127
+ });
59128
+ }
59129
+
59130
+ function boxBlur(src, tmp, width, height, radius) {
59131
+ boxBlurHorizontal(src, tmp, width, height, radius);
59132
+ boxBlurVertical(tmp, src, width, height, radius);
59133
+ }
59134
+
59135
+ function boxBlurHorizontal(src, dest, width, height, radius) {
59136
+ var size = radius * 2 + 1;
59137
+ var x, y, row, sum;
59138
+ for (y = 0; y < height; y++) {
59139
+ row = y * width;
59140
+ sum = src[row] * (radius + 1);
59141
+ for (x = 1; x <= radius; x++) sum += src[row + Math.min(width - 1, x)];
59142
+ for (x = 0; x < width; x++) {
59143
+ dest[row + x] = sum / size;
59144
+ sum += src[row + Math.min(width - 1, x + radius + 1)] - src[row + Math.max(0, x - radius)];
59145
+ }
59146
+ }
59147
+ }
59148
+
59149
+ function boxBlurVertical(src, dest, width, height, radius) {
59150
+ var size = radius * 2 + 1;
59151
+ var x, y, sum;
59152
+ for (x = 0; x < width; x++) {
59153
+ sum = src[x] * (radius + 1);
59154
+ for (y = 1; y <= radius; y++) sum += src[Math.min(height - 1, y) * width + x];
59155
+ for (y = 0; y < height; y++) {
59156
+ dest[y * width + x] = sum / size;
59157
+ sum += src[Math.min(height - 1, y + radius + 1) * width + x] - src[Math.max(0, y - radius) * width + x];
59158
+ }
59159
+ }
59160
+ }
59161
+
59162
+ function boxBlurWeighted(src, tmp, weights, width, height, radius) {
59163
+ boxBlurHorizontalWeighted(src, tmp, weights, width, height, radius);
59164
+ boxBlurVerticalWeighted(tmp, src, weights, width, height, radius);
59165
+ }
59166
+
59167
+ function boxBlurHorizontalWeighted(src, dest, weights, width, height, radius) {
59168
+ var x, y, row, id, addId, subId, sum, weightSum;
59169
+ for (y = 0; y < height; y++) {
59170
+ row = y * width;
59171
+ sum = src[row] * weights[row] * (radius + 1);
59172
+ weightSum = weights[row] * (radius + 1);
59173
+ for (x = 1; x <= radius; x++) {
59174
+ id = row + Math.min(width - 1, x);
59175
+ sum += src[id] * weights[id];
59176
+ weightSum += weights[id];
59177
+ }
59178
+ for (x = 0; x < width; x++) {
59179
+ id = row + x;
59180
+ dest[id] = weightSum > 0 ? sum / weightSum : src[id];
59181
+ addId = row + Math.min(width - 1, x + radius + 1);
59182
+ subId = row + Math.max(0, x - radius);
59183
+ sum += src[addId] * weights[addId] - src[subId] * weights[subId];
59184
+ weightSum += weights[addId] - weights[subId];
59185
+ }
59186
+ }
59187
+ }
59188
+
59189
+ function boxBlurVerticalWeighted(src, dest, weights, width, height, radius) {
59190
+ var x, y, id, addId, subId, sum, weightSum;
59191
+ for (x = 0; x < width; x++) {
59192
+ sum = src[x] * weights[x] * (radius + 1);
59193
+ weightSum = weights[x] * (radius + 1);
59194
+ for (y = 1; y <= radius; y++) {
59195
+ id = Math.min(height - 1, y) * width + x;
59196
+ sum += src[id] * weights[id];
59197
+ weightSum += weights[id];
59198
+ }
59199
+ for (y = 0; y < height; y++) {
59200
+ id = y * width + x;
59201
+ dest[id] = weightSum > 0 ? sum / weightSum : src[id];
59202
+ addId = Math.min(height - 1, y + radius + 1) * width + x;
59203
+ subId = Math.max(0, y - radius) * width + x;
59204
+ sum += src[addId] * weights[addId] - src[subId] * weights[subId];
59205
+ weightSum += weights[addId] - weights[subId];
59206
+ }
59207
+ }
59208
+ }
59209
+
59210
+ function copyBandToChannel(grid, band, channel) {
59211
+ var samples = grid.samples;
59212
+ var bands = grid.bands;
59213
+ for (var i = 0, j = band; i < channel.length; i++, j += bands) {
59214
+ channel[i] = samples[j];
59215
+ }
59216
+ }
59217
+
59218
+ function copyPremultipliedBandToChannel(grid, band, channel) {
59219
+ var samples = grid.samples;
59220
+ var bands = grid.bands;
59221
+ var alphaOffset = 3 - band;
59222
+ var maxAlpha = getAlphaMaxValue(samples);
59223
+ for (var i = 0, j = band; i < channel.length; i++, j += bands) {
59224
+ channel[i] = samples[j] * samples[j + alphaOffset] / maxAlpha;
59225
+ }
59226
+ }
59227
+
59228
+ function copyUnpremultipliedChannelToBand(channel, alpha, samples, grid, band) {
59229
+ var bands = grid.bands;
59230
+ var isFloat = samples instanceof Float32Array || samples instanceof Float64Array;
59231
+ var range = isFloat ? null : getTypedArrayRange(samples);
59232
+ var maxAlpha = getAlphaMaxValue(samples);
59233
+ var val, a;
59234
+ for (var i = 0, j = band; i < channel.length; i++, j += bands) {
59235
+ a = alpha[i];
59236
+ val = a > 0 ? channel[i] * maxAlpha / a : 0;
59237
+ samples[j] = isFloat ? val : clamp(Math.round(val), range.min, range.max);
59238
+ }
59239
+ }
59240
+
59241
+ function copyChannelToBand(channel, samples, grid, band) {
59242
+ var bands = grid.bands;
59243
+ var isFloat = samples instanceof Float32Array || samples instanceof Float64Array;
59244
+ var range = isFloat ? null : getTypedArrayRange(samples);
59245
+ var val;
59246
+ for (var i = 0, j = band; i < channel.length; i++, j += bands) {
59247
+ val = channel[i];
59248
+ samples[j] = isFloat ? val : clamp(Math.round(val), range.min, range.max);
59249
+ }
59250
+ }
59251
+
59252
+ function getRasterBlurWeights(grid) {
59253
+ if (!grid.coverage && grid.nodata == null) return null;
59254
+ var weights = new Float32Array(grid.width * grid.height);
59255
+ for (var i = 0; i < weights.length; i++) {
59256
+ weights[i] = rasterBlurPixelIsValid(grid, i) ? 1 : 0;
59257
+ }
59258
+ return weights;
59259
+ }
59260
+
59261
+ function rasterBlurPixelIsValid(grid, pixelId) {
59262
+ var off, n;
59263
+ if (grid.coverage && grid.coverage[pixelId] === 0) return false;
59264
+ if (grid.nodata == null) return true;
59265
+ off = pixelId * grid.bands;
59266
+ n = Math.min(grid.bands, 3);
59267
+ for (var i = 0; i < n; i++) {
59268
+ if (grid.samples[off + i] != grid.nodata) return true;
59269
+ }
59270
+ return false;
59271
+ }
59272
+
59273
+ function getAlphaMaxValue(samples) {
59274
+ if (samples instanceof Float32Array || samples instanceof Float64Array) return 1;
59275
+ return getTypedArrayRange(samples).max;
59276
+ }
59277
+
59278
+ function getTypedArrayRange(arr) {
59279
+ if (arr instanceof Uint8Array || arr instanceof Uint8ClampedArray) return {min: 0, max: 255};
59280
+ if (arr instanceof Int8Array) return {min: -128, max: 127};
59281
+ if (arr instanceof Uint16Array) return {min: 0, max: 65535};
59282
+ if (arr instanceof Int16Array) return {min: -32768, max: 32767};
59283
+ if (arr instanceof Uint32Array) return {min: 0, max: 4294967295};
59284
+ if (arr instanceof Int32Array) return {min: -2147483648, max: 2147483647};
59285
+ return {min: -Infinity, max: Infinity};
59286
+ }
59287
+
59288
+ function clamp(val, min, max) {
59289
+ return val < min ? min : val > max ? max : val;
59290
+ }
59291
+
59292
+ cmd.blur = blurRasterLayers;
59293
+
59294
+ function blurRasterLayers(layers, dataset, optsArg) {
59295
+ var opts = optsArg || {};
59296
+ requireProjectedDataset(dataset);
59297
+ layers.forEach(function(lyr) {
59298
+ if (!layerHasRaster(lyr)) {
59299
+ stop$1('Command requires a raster layer');
59300
+ }
59301
+ blurRasterLayer(lyr, opts);
59302
+ });
59303
+ }
59304
+
59305
+ function blurRasterLayer(lyr, opts) {
59306
+ var raster = lyr.raster;
59307
+ noteLayerWillChange(lyr, {operation: 'blurRasterLayer', unit: 'raster'});
59308
+ raster.grid = blurRasterGrid(raster, opts);
59309
+ raster.view = raster.view || {};
59310
+ delete raster.view.scalingStats;
59311
+ if (runningInBrowser()) {
59312
+ raster.view.preview = createRasterPreview(raster, opts);
59313
+ } else {
59314
+ delete raster.view.preview;
59315
+ }
59316
+ markLayerChanged(lyr, {operation: 'blurRasterLayer', unit: 'raster'});
59317
+ }
59318
+
59319
+ var Blur = /*#__PURE__*/Object.freeze({
59320
+ __proto__: null,
59321
+ blurRasterLayers: blurRasterLayers
59322
+ });
59323
+
59022
59324
  function UndoTransaction(label) {
59023
59325
  this.label = label || '';
59024
59326
  this.units = [];
@@ -59809,6 +60111,7 @@ ${svg}
59809
60111
  ArcUtils,
59810
60112
  Bbox2Clipping,
59811
60113
  BinArray$1,
60114
+ Blur,
59812
60115
  // BufferCommon,
59813
60116
  Calc,
59814
60117
  CalcUtils,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mapshaper",
3
- "version": "0.7.19",
3
+ "version": "0.7.20",
4
4
  "description": "A tool for editing geospatial data for mapping and GIS.",
5
5
  "keywords": [
6
6
  "shapefile",
@@ -73,7 +73,7 @@
73
73
  "idb-keyval": "^6.2.0",
74
74
  "jpeg-js": "^0.4.4",
75
75
  "kdbush": "^3.0.0",
76
- "mproj": "0.1.2",
76
+ "mproj": "0.1.3",
77
77
  "msgpackr": "^1.10.1",
78
78
  "open": "^11.0.0",
79
79
  "pngjs": "^7.0.0",