87 lines
3.8 KiB
JavaScript
87 lines
3.8 KiB
JavaScript
import fs from 'fs';
|
|
import test from 'tape';
|
|
import path from 'path';
|
|
import load from 'load-json-file';
|
|
import write from 'write-json-file';
|
|
import truncate from '@turf/truncate';
|
|
import { polygon, multiPolygon } from '@turf/helpers';
|
|
import simplify from '.';
|
|
|
|
const directories = {
|
|
in: path.join(__dirname, 'test', 'in') + path.sep,
|
|
out: path.join(__dirname, 'test', 'out') + path.sep
|
|
};
|
|
|
|
let fixtures = fs.readdirSync(directories.in).map(filename => {
|
|
return {
|
|
filename,
|
|
name: path.parse(filename).name,
|
|
geojson: load.sync(directories.in + filename)
|
|
};
|
|
});
|
|
// fixtures = fixtures.filter(({name}) => name.includes('#555'));
|
|
|
|
test('simplify', t => {
|
|
for (const {filename, name, geojson} of fixtures) {
|
|
let {tolerance, highQuality} = geojson.properties || {};
|
|
tolerance = tolerance || 0.01;
|
|
highQuality = highQuality || false;
|
|
|
|
const simplified = truncate(simplify(geojson, {
|
|
tolerance: tolerance,
|
|
highQuality: highQuality
|
|
}));
|
|
|
|
if (process.env.REGEN) write.sync(directories.out + filename, simplified);
|
|
t.deepEqual(simplified, load.sync(directories.out + filename), name);
|
|
}
|
|
|
|
t.end();
|
|
});
|
|
|
|
|
|
test('simplify -- throw', t => {
|
|
const poly = polygon([[[0, 0], [2, 2], [2, 0], [0, 0]]]);
|
|
t.throws(() => simplify(null), /geojson is required/, 'missing geojson');
|
|
t.throws(() => simplify(poly, {tolerance: -1}), /invalid tolerance/, 'negative tolerance');
|
|
t.end();
|
|
});
|
|
|
|
|
|
test('simplify -- removes ID & BBox from properties', t => {
|
|
const properties = {foo: 'bar'};
|
|
const id = 12345;
|
|
const bbox = [0, 0, 2, 2];
|
|
const poly = polygon([[[0, 0], [2, 2], [2, 0], [0, 0]]], properties, {bbox, id});
|
|
const simple = simplify(poly, {tolerance: 0.1});
|
|
|
|
t.equal(simple.id, id);
|
|
t.deepEqual(simple.bbox, bbox);
|
|
t.deepEqual(simple.properties, properties);
|
|
t.end();
|
|
});
|
|
|
|
|
|
test('simplify -- issue #555', t => {
|
|
// polygons from issue #555
|
|
const poly1 = polygon([[[-75.693254, 45.431144], [-75.693335, 45.431109], [-75.693335, 45.431109], [-75.693254, 45.431144]]]);
|
|
const poly2 = polygon([[[-75.627178, 45.438106], [-75.627179, 45.438106], [-75.62718, 45.438106], [-75.627178, 45.438106]]]);
|
|
const poly3 = polygon([[[-75.684722, 45.410083], [-75.684641, 45.409989], [-75.684641, 45.409989], [-75.684722, 45.410083], [-75.684722, 45.410083]]]);
|
|
const poly4 = polygon([[[-75.885634, 45.272762], [-75.885482, 45.272641], [-75.885554, 45.272596], [-75.885534, 45.272581], [-75.885581, 45.272551], [-75.885703, 45.272647], [-75.885706, 45.272645], [-75.885709, 45.272647], [-75.885767, 45.272693], [-75.885759, 45.272698], [-75.885716, 45.272728], [-75.885716, 45.272728], [-75.885712, 45.272731], [-75.885712, 45.272731], [-75.885708, 45.272734], [-75.885684, 45.272749], [-75.885671, 45.272739], [-75.885634, 45.272762]], [[-75.885708, 45.27273], [-75.885708, 45.272729], [-75.885708, 45.272729], [-75.885708, 45.27273]]]);
|
|
const options = {tolerance: 0.000001, highQuality: true};
|
|
|
|
t.throws(() => simplify(poly1, options), /invalid polygon/);
|
|
t.throws(() => simplify(poly2, options), /invalid polygon/);
|
|
t.throws(() => simplify(poly3, options), /invalid polygon/);
|
|
t.throws(() => simplify(poly4, options), /invalid polygon/);
|
|
t.end();
|
|
});
|
|
|
|
test('simplify -- issue #918', t => {
|
|
// simplify hangs on this input #918
|
|
t.throws(() => simplify(multiPolygon([[[[0, 90], [0, 90], [0, 90], [0, 90], [0, 90], [0, 90], [0, 90], [0, 90], [0, 90], [0, 90], [0, 90]]]])), /invalid polygon/, 'invalid polygon');
|
|
t.throws(() => simplify(multiPolygon([[[[0, 1], [0, 2], [0, 3], [0, 2.5], [0, 1]]]])), /invalid polygon/, 'invalid polygon');
|
|
t.throws(() => simplify(multiPolygon([[[[0, 1], [0, 1], [1, 2], [0, 1]]]])), /invalid polygon/, 'invalid polygon');
|
|
t.end();
|
|
});
|