refactor(frontend): fetch NL municipalities from PostGIS API instead of static file

Replace static netherlands_municipalities_simplified.geojson with dynamic
PostGIS API call to /boundaries/countries/NL/admin2/geojson.

Transform API response properties to expected format:
- API: {code, name, name_local, admin1_code, admin1_name}
- Expected: {code, naam, provincieCode, provincieNaam}

This ensures NL boundary data comes from the authoritative PostGIS
database rather than a static file that could become outdated.
This commit is contained in:
kempersc 2025-12-07 19:48:07 +01:00
parent 12965071be
commit 57c743b005

View file

@ -4,7 +4,7 @@
* Custom hook for managing werkgebied (service area) polygon display on MapLibre GL maps.
*
* Loads:
* - Municipality GeoJSON boundaries from netherlands_municipalities_simplified.geojson
* - Municipality GeoJSON boundaries from PostGIS API (NL admin2 boundaries)
* - Archive-to-municipalities mapping from archive_werkgebied_mapping.json
* - Historical HALC boundaries from netherlands_historical_adm2_1500.geojson
* - Historical archive mapping from historical_archive_halc_mapping.json
@ -71,12 +71,14 @@ interface HistoricalArchiveMapping {
}>;
}
// URLs for data files
const MUNICIPALITIES_URL = '/data/netherlands_municipalities_simplified.geojson';
// URLs for data files (static files only - municipalities now fetched from API)
const WERKGEBIED_MAPPING_URL = '/data/archive_werkgebied_mapping.json';
const HISTORICAL_HALC_URL = '/data/netherlands_historical_adm2_1500.geojson';
const HISTORICAL_MAPPING_URL = '/data/historical_archive_halc_mapping.json';
// PostGIS Boundaries API URL
const BOUNDARIES_API_URL = import.meta.env.VITE_POSTGRES_API_URL || '/api/postgres';
// Layer and source IDs
const WERKGEBIED_SOURCE_ID = 'werkgebied-source';
const WERKGEBIED_FILL_LAYER_ID = 'werkgebied-fill';
@ -139,22 +141,57 @@ export function useWerkgebiedMapLibre(map: maplibregl.Map | null): WerkgebiedHoo
setError(null);
try {
// Load all files in parallel
// Load static files and API data in parallel
// Note: Municipalities now fetched from PostGIS API instead of static file
const [municipalitiesRes, mappingRes, halcRes, historicalMappingRes] = await Promise.all([
fetch(MUNICIPALITIES_URL),
fetch(`${BOUNDARIES_API_URL}/boundaries/countries/NL/admin2/geojson?simplify=0.001`),
fetch(WERKGEBIED_MAPPING_URL),
fetch(HISTORICAL_HALC_URL),
fetch(HISTORICAL_MAPPING_URL),
]);
if (!municipalitiesRes.ok) {
throw new Error(`Failed to load municipalities: ${municipalitiesRes.statusText}`);
throw new Error(`Failed to load municipalities from API: ${municipalitiesRes.statusText}`);
}
if (!mappingRes.ok) {
throw new Error(`Failed to load werkgebied mapping: ${mappingRes.statusText}`);
}
municipalitiesRef.current = await municipalitiesRes.json();
// Parse API response and transform to expected format
const apiGeoJSON = await municipalitiesRes.json();
// Transform API properties to expected format:
// API: {id, code, name, name_local, admin1_code, area_km2, source}
// Expected: {code, naam, provincieCode?, provincieNaam?}
const transformedFeatures = apiGeoJSON.features.map((feature: {
type: 'Feature';
properties: {
id?: number;
code: string;
name: string;
name_local?: string;
admin1_code?: string;
admin1_name?: string;
area_km2?: number;
source?: string;
};
geometry: GeoJSON.Geometry;
}) => ({
type: 'Feature',
properties: {
code: feature.properties.code,
naam: feature.properties.name_local || feature.properties.name,
provincieCode: feature.properties.admin1_code,
provincieNaam: feature.properties.admin1_name,
},
geometry: feature.geometry,
}));
municipalitiesRef.current = {
type: 'FeatureCollection',
features: transformedFeatures,
};
mappingRef.current = await mappingRes.json();
// HALC data is optional - don't fail if not available
@ -174,7 +211,7 @@ export function useWerkgebiedMapLibre(map: maplibregl.Map | null): WerkgebiedHoo
dataLoadedRef.current = true;
console.log(`[useWerkgebiedMapLibre] Loaded ${municipalitiesRef.current?.features.length} municipalities`);
console.log(`[useWerkgebiedMapLibre] Loaded ${municipalitiesRef.current?.features.length} municipalities from PostGIS API`);
console.log(`[useWerkgebiedMapLibre] Loaded ${mappingRef.current?.statistics.total_archives} archives`);
} catch (err) {
console.error('[useWerkgebiedMapLibre] Error loading data:', err);