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 +338 -35
- package/package.json +2 -2
- package/www/mapshaper-gui.js +118 -52
- package/www/mapshaper.js +338 -35
- package/www/modules.js +71 -0
- package/www/page.css +2 -0
- package/www/sponsor.html +3 -5
package/mapshaper.js
CHANGED
|
@@ -78,7 +78,7 @@
|
|
|
78
78
|
return obj === Object(obj); // via underscore
|
|
79
79
|
}
|
|
80
80
|
|
|
81
|
-
function clamp$
|
|
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$
|
|
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$
|
|
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 (
|
|
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
|
|
54993
|
+
cmd.renameLayers = function(layers, names) {
|
|
54976
54994
|
if (names && names.join('').indexOf('=') > -1) {
|
|
54977
|
-
renameByAssignment(names,
|
|
54995
|
+
renameByAssignment(names, layers);
|
|
54978
54996
|
} else {
|
|
54979
54997
|
renameTargetLayers(names, layers);
|
|
54980
54998
|
}
|
|
54981
54999
|
};
|
|
54982
55000
|
|
|
54983
|
-
function renameByAssignment(names,
|
|
55001
|
+
function renameByAssignment(names, layers) {
|
|
54984
55002
|
var index = mapLayerNames(names);
|
|
54985
|
-
|
|
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
|
-
|
|
54997
|
-
|
|
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 =
|
|
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
|
-
|
|
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
|
|
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.
|
|
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.
|
|
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.
|
|
76
|
+
"mproj": "0.1.3",
|
|
77
77
|
"msgpackr": "^1.10.1",
|
|
78
78
|
"open": "^11.0.0",
|
|
79
79
|
"pngjs": "^7.0.0",
|