Files
openlayers/test/node/ol/geom/flat/simplify.test.js
2021-05-01 10:18:23 -06:00

917 lines
16 KiB
JavaScript

import expect from '../../../expect.js';
import {
douglasPeucker,
quantize,
radialDistance,
simplifyLineString,
} from '../../../../../src/ol/geom/flat/simplify.js';
describe('ol/geom/flat/simplify.js', function () {
const flatCoordinates = [
224.55,
250.15,
226.91,
244.19,
233.31,
241.45,
234.98,
236.06,
244.21,
232.76,
262.59,
215.31,
267.76,
213.81,
273.57,
201.84,
273.12,
192.16,
277.62,
189.03,
280.36,
181.41,
286.51,
177.74,
292.41,
159.37,
296.91,
155.64,
314.95,
151.37,
319.75,
145.16,
330.33,
137.57,
341.48,
139.96,
369.98,
137.89,
387.39,
142.51,
391.28,
139.39,
409.52,
141.14,
414.82,
139.75,
427.72,
127.3,
439.6,
119.74,
474.93,
107.87,
486.51,
106.75,
489.2,
109.45,
493.79,
108.63,
504.74,
119.66,
512.96,
122.35,
518.63,
120.89,
524.09,
126.88,
529.57,
127.86,
534.21,
140.93,
539.27,
147.24,
567.69,
148.91,
575.25,
157.26,
580.62,
158.15,
601.53,
156.85,
617.74,
159.86,
622.0,
167.04,
629.55,
194.6,
638.9,
195.61,
641.26,
200.81,
651.77,
204.56,
671.55,
222.55,
683.68,
217.45,
695.25,
219.15,
700.64,
217.98,
703.12,
214.36,
712.26,
215.87,
721.49,
212.81,
727.81,
213.36,
729.98,
208.73,
735.32,
208.2,
739.94,
204.77,
769.98,
208.42,
779.6,
216.87,
784.2,
218.16,
800.24,
214.62,
810.53,
219.73,
817.19,
226.82,
820.77,
236.17,
827.23,
236.16,
829.89,
239.89,
851.0,
248.94,
859.88,
255.49,
865.21,
268.53,
857.95,
280.3,
865.48,
291.45,
866.81,
298.66,
864.68,
302.71,
867.79,
306.17,
859.87,
311.37,
860.08,
314.35,
858.29,
314.94,
858.1,
327.6,
854.54,
335.4,
860.92,
343.0,
856.43,
350.15,
851.42,
352.96,
849.84,
359.59,
854.56,
365.53,
849.74,
370.38,
844.09,
371.89,
844.75,
380.44,
841.52,
383.67,
839.57,
390.4,
845.59,
399.05,
848.4,
407.55,
843.71,
411.3,
844.09,
419.88,
839.51,
432.76,
841.33,
441.04,
847.62,
449.22,
847.16,
458.44,
851.38,
462.79,
853.97,
471.15,
866.36,
480.77,
];
const simplifiedRadiallyFlatCoordinates = [
224.55,
250.15,
226.91,
244.19,
233.31,
241.45,
234.98,
236.06,
244.21,
232.76,
262.59,
215.31,
267.76,
213.81,
273.57,
201.84,
273.12,
192.16,
277.62,
189.03,
280.36,
181.41,
286.51,
177.74,
292.41,
159.37,
296.91,
155.64,
314.95,
151.37,
319.75,
145.16,
330.33,
137.57,
341.48,
139.96,
369.98,
137.89,
387.39,
142.51,
409.52,
141.14,
414.82,
139.75,
427.72,
127.3,
439.6,
119.74,
474.93,
107.87,
486.51,
106.75,
493.79,
108.63,
504.74,
119.66,
512.96,
122.35,
518.63,
120.89,
524.09,
126.88,
529.57,
127.86,
534.21,
140.93,
539.27,
147.24,
567.69,
148.91,
575.25,
157.26,
580.62,
158.15,
601.53,
156.85,
617.74,
159.86,
622.0,
167.04,
629.55,
194.6,
638.9,
195.61,
641.26,
200.81,
651.77,
204.56,
671.55,
222.55,
683.68,
217.45,
695.25,
219.15,
700.64,
217.98,
712.26,
215.87,
721.49,
212.81,
727.81,
213.36,
729.98,
208.73,
735.32,
208.2,
739.94,
204.77,
769.98,
208.42,
779.6,
216.87,
800.24,
214.62,
810.53,
219.73,
817.19,
226.82,
820.77,
236.17,
827.23,
236.16,
851.0,
248.94,
859.88,
255.49,
865.21,
268.53,
857.95,
280.3,
865.48,
291.45,
866.81,
298.66,
867.79,
306.17,
859.87,
311.37,
858.1,
327.6,
854.54,
335.4,
860.92,
343.0,
856.43,
350.15,
851.42,
352.96,
849.84,
359.59,
854.56,
365.53,
849.74,
370.38,
844.09,
371.89,
844.75,
380.44,
839.57,
390.4,
845.59,
399.05,
848.4,
407.55,
843.71,
411.3,
844.09,
419.88,
839.51,
432.76,
841.33,
441.04,
847.62,
449.22,
847.16,
458.44,
851.38,
462.79,
853.97,
471.15,
866.36,
480.77,
];
const simplifiedFlatCoordinates = [
224.55,
250.15,
267.76,
213.81,
296.91,
155.64,
330.33,
137.57,
409.52,
141.14,
439.6,
119.74,
486.51,
106.75,
529.57,
127.86,
539.27,
147.24,
617.74,
159.86,
629.55,
194.6,
671.55,
222.55,
727.81,
213.36,
739.94,
204.77,
769.98,
208.42,
779.6,
216.87,
800.24,
214.62,
820.77,
236.17,
859.88,
255.49,
865.21,
268.53,
857.95,
280.3,
867.79,
306.17,
859.87,
311.37,
854.54,
335.4,
860.92,
343.0,
849.84,
359.59,
854.56,
365.53,
844.09,
371.89,
839.57,
390.4,
848.4,
407.55,
839.51,
432.76,
853.97,
471.15,
866.36,
480.77,
];
const simplifiedHighQualityFlatCoordinates = [
224.55,
250.15,
267.76,
213.81,
296.91,
155.64,
330.33,
137.57,
409.52,
141.14,
439.6,
119.74,
486.51,
106.75,
529.57,
127.86,
539.27,
147.24,
617.74,
159.86,
629.55,
194.6,
671.55,
222.55,
727.81,
213.36,
739.94,
204.77,
769.98,
208.42,
784.2,
218.16,
800.24,
214.62,
820.77,
236.17,
859.88,
255.49,
865.21,
268.53,
857.95,
280.3,
867.79,
306.17,
858.29,
314.94,
854.54,
335.4,
860.92,
343.0,
849.84,
359.59,
854.56,
365.53,
844.09,
371.89,
839.57,
390.4,
848.4,
407.55,
839.51,
432.76,
853.97,
471.15,
866.36,
480.77,
];
describe('simplifyLineString', function () {
it('works with empty line strings', function () {
expect(simplifyLineString([], 0, 0, 2, 1, true)).to.eql([]);
expect(simplifyLineString([], 0, 0, 2, 1, false)).to.eql([]);
});
it('works with a line string with a single point', function () {
expect(simplifyLineString([1, 2], 0, 2, 2, 1, true)).to.eql([1, 2]);
expect(simplifyLineString([1, 2], 0, 2, 2, 1, false)).to.eql([1, 2]);
});
it('returns the expected result with low quality', function () {
const result = simplifyLineString(
flatCoordinates,
0,
flatCoordinates.length,
2,
25,
false
);
expect(result.length).to.be(simplifiedFlatCoordinates.length);
expect(result).to.eql(simplifiedFlatCoordinates);
});
it('returns the expected result with high quality', function () {
const result = simplifyLineString(
flatCoordinates,
0,
flatCoordinates.length,
2,
25,
true
);
expect(result.length).to.be(simplifiedHighQualityFlatCoordinates.length);
expect(result).to.eql(simplifiedHighQualityFlatCoordinates);
});
});
describe('radialDistance', function () {
let dest;
beforeEach(function () {
dest = [];
});
it('works with empty line strings', function () {
expect(radialDistance([], 0, 0, 2, 1, dest, 0)).to.be(0);
expect(dest).to.eql([]);
});
it('works with a line string with a single point', function () {
expect(radialDistance([1, 2], 0, 2, 2, 1, dest, 0)).to.be(2);
expect(dest).to.eql([1, 2]);
});
it('works with a line string with two points', function () {
expect(radialDistance([1, 2, 3, 4], 0, 4, 2, 1, dest, 0)).to.be(4);
expect(dest).to.eql([1, 2, 3, 4]);
});
it('works when the points are widely spaced', function () {
expect(
radialDistance([0, 0, 1, 0, 2, 0, 3, 0], 0, 8, 2, 0.5, dest, 0)
).to.be(8);
expect(dest).to.eql([0, 0, 1, 0, 2, 0, 3, 0]);
});
it('works when the spacing matches the tolerance', function () {
expect(
radialDistance([0, 0, 1, 0, 2, 0, 3, 0], 0, 8, 2, 1, dest, 0)
).to.be(6);
expect(dest).to.eql([0, 0, 2, 0, 3, 0]);
});
it('works when the points are closely spaced', function () {
expect(
radialDistance([0, 0, 1, 0, 2, 0, 3, 0], 0, 8, 2, 1.5, dest, 0)
).to.be(6);
expect(dest).to.eql([0, 0, 2, 0, 3, 0]);
});
it('works when the line oscillates with widely spaced points', function () {
expect(
radialDistance(
[0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1],
0,
12,
2,
1,
dest,
0
)
).to.be(12);
expect(dest).to.eql([0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1]);
});
it('works when the line oscillates with closely spaced points', function () {
expect(
radialDistance(
[0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1],
0,
12,
2,
2,
dest,
0
)
).to.be(4);
expect(dest).to.eql([0, 0, 1, 1]);
});
it('works when the line oscillates within the tolerance', function () {
expect(
radialDistance(
[0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0],
0,
14,
2,
2,
dest,
0
)
).to.be(2);
expect(dest).to.eql([0, 0]);
});
it('works with real data', function () {
expect(
radialDistance(
flatCoordinates,
0,
flatCoordinates.length,
2,
25,
dest,
0
)
).to.be(simplifiedRadiallyFlatCoordinates.length);
expect(dest).to.eql(simplifiedRadiallyFlatCoordinates);
});
});
describe('douglasPeucker', function () {
let dest;
beforeEach(function () {
dest = [];
});
it('works with empty line strings', function () {
expect(douglasPeucker([], 0, 0, 2, 1, dest, 0)).to.be(0);
expect(dest).to.eql([]);
});
it('works with a line string with a single point', function () {
expect(douglasPeucker([1, 2], 0, 2, 2, 1, dest, 0)).to.be(2);
expect(dest).to.eql([1, 2]);
});
it('works with a line string with two points', function () {
expect(douglasPeucker([1, 2, 3, 4], 0, 4, 2, 1, dest, 0)).to.be(4);
expect(dest).to.eql([1, 2, 3, 4]);
});
it('works when the points are widely spaced', function () {
expect(
douglasPeucker([0, 0, 1, 0, 2, 0, 3, 0], 0, 8, 2, 0.5, dest, 0)
).to.be(4);
expect(dest).to.eql([0, 0, 3, 0]);
});
it('works when the spacing matches the tolerance', function () {
expect(
douglasPeucker([0, 0, 1, 0, 2, 0, 3, 0], 0, 8, 2, 1, dest, 0)
).to.be(4);
expect(dest).to.eql([0, 0, 3, 0]);
});
it('works when the points are closely spaced', function () {
expect(
douglasPeucker([0, 0, 1, 0, 2, 0, 3, 0], 0, 8, 2, 1.5, dest, 0)
).to.be(4);
expect(dest).to.eql([0, 0, 3, 0]);
});
it('does not elimnate points outside the tolerance', function () {
expect(douglasPeucker([0, 0, 1, 1, 2, 0], 0, 6, 2, 0.5, dest, 0)).to.be(
6
);
expect(dest).to.eql([0, 0, 1, 1, 2, 0]);
});
it('does eliminate points within the tolerance', function () {
expect(douglasPeucker([0, 0, 1, 1, 2, 0], 0, 6, 2, 2, dest, 0)).to.be(4);
expect(dest).to.eql([0, 0, 2, 0]);
});
it('does not eliminate multiple points outside the tolerance', function () {
expect(
douglasPeucker([0, 0, 1, 1, 1, -1, 2, 0], 0, 8, 2, 0.5, dest, 0)
).to.be(8);
expect(dest).to.eql([0, 0, 1, 1, 1, -1, 2, 0]);
});
it('does eliminate multiple points within the tolerance', function () {
expect(
douglasPeucker([0, 0, 1, 1, 1, -1, 2, 0], 0, 8, 2, 2, dest, 0)
).to.be(4);
expect(dest).to.eql([0, 0, 2, 0]);
});
it('works when the line oscillates with widely spaced points', function () {
expect(
douglasPeucker(
[0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1],
0,
12,
2,
1,
dest,
0
)
).to.be(4);
expect(dest).to.eql([0, 0, 1, 1]);
});
it('works when the line oscillates with closely spaced points', function () {
expect(
douglasPeucker(
[0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1],
0,
12,
2,
2,
dest,
0
)
).to.be(4);
expect(dest).to.eql([0, 0, 1, 1]);
});
it('works when the line oscillates within the tolerance', function () {
expect(
douglasPeucker(
[0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0],
0,
14,
2,
2,
dest,
0
)
).to.be(4);
expect(dest).to.eql([0, 0, 0, 0]);
});
it('works on small triangles', function () {
expect(
douglasPeucker([3, 0, 4, 1, 5, 2, 5, 0], 0, 8, 2, 1, dest, 0)
).to.be(6);
expect(dest).to.eql([3, 0, 5, 2, 5, 0]);
});
it('is the same as high quality simplification', function () {
expect(
douglasPeucker(
flatCoordinates,
0,
flatCoordinates.length,
2,
25,
dest,
0
)
).to.be(simplifiedHighQualityFlatCoordinates.length);
expect(dest).to.eql(simplifiedHighQualityFlatCoordinates);
});
});
describe('quantize', function () {
it('handles empty coordinates', function () {
const simplifiedFlatCoordinates = [];
expect(quantize([], 0, 0, 2, 2, simplifiedFlatCoordinates, 0)).to.be(0);
expect(simplifiedFlatCoordinates).to.be.empty();
});
it('expands points to a zero-length line', function () {
const simplifiedFlatCoordinates = [];
expect(
quantize([0, 0, 0, 0], 0, 4, 2, 2, simplifiedFlatCoordinates, 0)
).to.be(4);
expect(simplifiedFlatCoordinates).to.eql([0, 0, 0, 0]);
});
it('snaps near-by points to the same value', function () {
const simplifiedFlatCoordinates = [];
expect(
quantize([0.1, 0, 0, 0.1], 0, 4, 2, 2, simplifiedFlatCoordinates, 0)
).to.be(4);
expect(simplifiedFlatCoordinates).to.eql([0, 0, 0, 0]);
});
it('eliminates duplicate snapped points', function () {
const simplifiedFlatCoordinates = [];
expect(
quantize(
[0.1, 0, 2, 0, 2.1, 0, 2, 0.1, 1.9, 0, 2, -0.1],
0,
12,
2,
2,
simplifiedFlatCoordinates,
0
)
).to.be(4);
expect(simplifiedFlatCoordinates).to.eql([0, 0, 2, 0]);
});
it('eliminates horizontal colinear points', function () {
const simplifiedFlatCoordinates = [];
expect(
quantize(
[0, 0, 2, 0, 4, 0, 6, 0],
0,
8,
2,
2,
simplifiedFlatCoordinates,
0
)
).to.be(4);
expect(simplifiedFlatCoordinates).to.eql([0, 0, 6, 0]);
});
it('eliminates vertical colinear points', function () {
const simplifiedFlatCoordinates = [];
expect(
quantize(
[0, 0, 0, -2, 0, -4, 0, -6],
0,
8,
2,
2,
simplifiedFlatCoordinates,
0
)
).to.be(4);
expect(simplifiedFlatCoordinates).to.eql([0, 0, 0, -6]);
});
it('eliminates diagonal colinear points', function () {
const simplifiedFlatCoordinates = [];
expect(
quantize(
[0, 0, 2, -2, 4, -4, 6, -6],
0,
8,
2,
2,
simplifiedFlatCoordinates,
0
)
).to.be(4);
expect(simplifiedFlatCoordinates).to.eql([0, 0, 6, -6]);
});
it('handles switchbacks', function () {
const simplifiedFlatCoordinates = [];
expect(
quantize(
[0, 0, 2, 0, 0, 0, 4, 0],
0,
8,
2,
2,
simplifiedFlatCoordinates,
0
)
).to.be(8);
expect(simplifiedFlatCoordinates).to.eql([0, 0, 2, 0, 0, 0, 4, 0]);
});
});
});