79 lines
9.1 KiB
JavaScript
79 lines
9.1 KiB
JavaScript
/**
|
|
* Boundary tests — validates WKB parser reads geometry from local GeoPackage.
|
|
* Results saved to tests/tree/ for inspection.
|
|
*/
|
|
import { describe, it, expect } from 'vitest';
|
|
import { resolve } from 'path';
|
|
import { writeFileSync, mkdirSync } from 'fs';
|
|
import { getBoundaryFromGpkg } from '../gpkg-reader.js';
|
|
const OUT_DIR = resolve('tests', 'tree');
|
|
function save(name, data) {
|
|
mkdirSync(OUT_DIR, { recursive: true });
|
|
writeFileSync(resolve(OUT_DIR, name), JSON.stringify(data, null, 2), 'utf-8');
|
|
console.log(` → saved tests/tree/${name}`);
|
|
}
|
|
describe('GeoPackage Boundaries', () => {
|
|
it('reads a country outer boundary (DEU)', async () => {
|
|
const result = await getBoundaryFromGpkg('DEU');
|
|
expect(result).not.toBeNull();
|
|
expect(result.features.length).toBeGreaterThan(0);
|
|
const f = result.features[0];
|
|
expect(f.type).toBe('Feature');
|
|
expect(f.geometry.type).toBe('MultiPolygon');
|
|
expect(f.geometry.coordinates.length).toBeGreaterThan(0);
|
|
// Sanity: first coordinate should be in Germany's longitude range (5-16°E)
|
|
const firstCoord = f.geometry.coordinates[0][0][0];
|
|
expect(firstCoord[0]).toBeGreaterThan(4);
|
|
expect(firstCoord[0]).toBeLessThan(16);
|
|
expect(firstCoord[1]).toBeGreaterThan(46);
|
|
expect(firstCoord[1]).toBeLessThan(56);
|
|
console.log(`DEU: ${result.features.length} features, ${f.geometry.coordinates.length} polygons`);
|
|
console.log(`First coord: [${firstCoord[0].toFixed(4)}, ${firstCoord[1].toFixed(4)}]`);
|
|
// Save a summary (not full geometry — too large)
|
|
save('test-boundary-deu.json', {
|
|
featureCount: result.features.length,
|
|
geometryType: f.geometry.type,
|
|
polygonCount: f.geometry.coordinates.length,
|
|
firstCoord: firstCoord,
|
|
properties: f.properties,
|
|
});
|
|
}, 120000);
|
|
it('reads a province boundary (ESP.6_1 = Cataluña)', async () => {
|
|
const result = await getBoundaryFromGpkg('ESP.6_1', 1);
|
|
expect(result).not.toBeNull();
|
|
expect(result.features.length).toBeGreaterThan(0);
|
|
const f = result.features[0];
|
|
expect(f.geometry.type).toBe('MultiPolygon');
|
|
// Cataluña longitude ~0.1°E to 3.3°E
|
|
const firstCoord = f.geometry.coordinates[0][0][0];
|
|
expect(firstCoord[0]).toBeGreaterThan(-1);
|
|
expect(firstCoord[0]).toBeLessThan(4);
|
|
console.log(`Cataluña: ${f.geometry.coordinates.length} polygons, first coord [${firstCoord[0].toFixed(4)}, ${firstCoord[1].toFixed(4)}]`);
|
|
save('test-boundary-cataluna.json', {
|
|
featureCount: result.features.length,
|
|
geometryType: f.geometry.type,
|
|
polygonCount: f.geometry.coordinates.length,
|
|
firstCoord: firstCoord,
|
|
properties: f.properties,
|
|
});
|
|
}, 120000);
|
|
it('reads L2 boundaries (DEU.14_1 = Sachsen → districts)', async () => {
|
|
const result = await getBoundaryFromGpkg('DEU.14_1', 2);
|
|
expect(result).not.toBeNull();
|
|
// Sachsen has 13 Kreise
|
|
expect(result.features.length).toBe(13);
|
|
const names = result.features.map(f => f.properties.NAME_2).sort();
|
|
expect(names).toContain('Dresden');
|
|
expect(names).toContain('Leipzig');
|
|
console.log(`Sachsen L2: ${result.features.length} districts: ${names.join(', ')}`);
|
|
save('test-boundary-sachsen-l2.json', {
|
|
featureCount: result.features.length,
|
|
districts: result.features.map(f => ({
|
|
name: f.properties.NAME_2,
|
|
gid: f.properties.GID_2,
|
|
polygonCount: f.geometry.coordinates.length,
|
|
})),
|
|
});
|
|
}, 120000);
|
|
});
|
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm91bmRhcnkudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9fX3Rlc3RzX18vYm91bmRhcnkudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFDSCxPQUFPLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDOUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMvQixPQUFPLEVBQUUsYUFBYSxFQUFFLFNBQVMsRUFBRSxNQUFNLElBQUksQ0FBQztBQUM5QyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUV4RCxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBRXpDLFNBQVMsSUFBSSxDQUFDLElBQVksRUFBRSxJQUFhO0lBQ3JDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUN4QyxhQUFhLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDOUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyx3QkFBd0IsSUFBSSxFQUFFLENBQUMsQ0FBQztBQUNoRCxDQUFDO0FBRUQsUUFBUSxDQUFDLHVCQUF1QixFQUFFLEdBQUcsRUFBRTtJQUVuQyxFQUFFLENBQUMsc0NBQXNDLEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDbEQsTUFBTSxNQUFNLEdBQUcsTUFBTSxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUVoRCxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQzlCLE1BQU0sQ0FBQyxNQUFPLENBQUMsUUFBUSxDQUFD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
|