import type { DatasetCreateResponse } from '../types' export type SourceDomainKey = | 'space' | 'nature' | 'soil' | 'mobility' | 'people' | 'climate' export type SourcePriority = 'next' | 'planned' | 'later' export interface SourceDomainDefinition { key: SourceDomainKey label: string question: string } export interface OfficialSourceDefinition { key: string domain: SourceDomainKey name: string owner: string coverage: string value: string metricExamples: string priority: SourcePriority url: string matches: (dataset: DatasetCreateResponse) => boolean } const sourceNameIs = (dataset: DatasetCreateResponse, sourceName: string): boolean => dataset.source_name === sourceName const referenceLayerIs = (dataset: DatasetCreateResponse, layerName: string): boolean => String(dataset.reference_layer_name ?? dataset.source_metadata?.['theme'] ?? '').toLowerCase() === layerName const thematicProductIs = (dataset: DatasetCreateResponse, productKey: string): boolean => sourceNameIs(dataset, 'department_omgeving_thematic_raster') && dataset.source_metadata?.['product_key'] === productKey export const SOURCE_DOMAINS: SourceDomainDefinition[] = [ { key: 'space', label: 'Ruimte en bebouwing', question: 'Wat staat en gebeurt hier, en hoe verandert het ruimtegebruik?', }, { key: 'nature', label: 'Natuur en landbouw', question: 'Hoeveel bos, natuurwaarde en landbouwgebruik ligt in de selectie?', }, { key: 'soil', label: 'Bodem en reliëf', question: 'Welke bodem, hoogte, helling en erosiegevoeligheid komen voor?', }, { key: 'mobility', label: 'Mobiliteit en bereikbaarheid', question: 'Welke netwerken en knooppunten maken het gebied bereikbaar?', }, { key: 'people', label: 'Bevolking en voorzieningen', question: 'Hoeveel mensen wonen er en hoe bereikbaar zijn dagelijkse diensten?', }, { key: 'climate', label: 'Klimaat en leefomgeving', question: 'Welke risico’s en omgevingsdruk spelen rond hitte, lucht en water?', }, ] export const OFFICIAL_SOURCE_PORTFOLIO: OfficialSourceDefinition[] = [ { key: 'grb_buildings', domain: 'space', name: 'GRB-gebouwen', owner: 'Digitaal Vlaanderen', coverage: 'Actuele gebouwcontouren', value: 'Objectniveau voor bebouwing, kaartselectie en AI-validatie.', metricExamples: 'aantal gebouwen, bebouwde oppervlakte, dichtheid', priority: 'next', url: 'https://www.vlaanderen.be/datavindplaats/catalogus/grbgis', matches: (dataset) => sourceNameIs(dataset, 'grb') && referenceLayerIs(dataset, 'buildings'), }, { key: 'building_register', domain: 'space', name: 'Gebouwen- en Adressenregister', owner: 'Digitaal Vlaanderen', coverage: 'Continu geactualiseerd', value: 'Gebouwstatus en geaggregeerde eenheden als aanvulling op GRB.', metricExamples: 'gerealiseerde gebouwen, gebouweenheden, statusverdeling', priority: 'planned', url: 'https://www.vlaanderen.be/datavindplaats/catalogus/gebouwen-en-adressenregister', matches: (dataset) => sourceNameIs(dataset, 'digitaal_vlaanderen_buildings_addresses_register'), }, { key: 'land_use', domain: 'space', name: 'Landgebruik Vlaanderen', owner: 'Departement Omgeving', coverage: '10 m raster, meerdere officiële toestanden', value: 'Werkelijk gebruik voor wonen, industrie, landbouw en natuur.', metricExamples: 'hectare per landgebruiksklasse, aandeel van selectie, evolutie', priority: 'next', url: 'https://www.vlaanderen.be/datavindplaats/catalogus/landgebruik-vlaanderen-toestand-2022', matches: (dataset) => sourceNameIs(dataset, 'department_omgeving_land_use') || sourceNameIs(dataset, 'historical_landuse'), }, { key: 'orthophoto', domain: 'space', name: 'Actuele en historische orthofoto’s', owner: 'Digitaal Vlaanderen', coverage: '1971, 1979-1990 en jaarlijkse reeksen 2000-2025', value: 'Beeldbewijs voor actuele toestand en visuele evolutie.', metricExamples: 'beeldjaargang en begrensde AI- of visuele analyse', priority: 'next', url: 'https://www.vlaanderen.be/datavindplaats/catalogus/orthofotomozaiek-kleinschalig-zomeropnamen', matches: (dataset) => sourceNameIs(dataset, 'digitaal_vlaanderen_orthophoto'), }, { key: 'space_occupation', domain: 'space', name: 'Ruimtebeslag Vlaanderen 2025', owner: 'Departement Omgeving', coverage: '10 m raster, toestand 2025', value: 'Gebiedsdruk en ingenomen ruimte naast het fijnere GRB-objectbeeld.', metricExamples: 'hectare ruimtebeslag, aandeel, vergelijking met open ruimte', priority: 'next', url: 'https://www.vlaanderen.be/datavindplaats/catalogus/ruimtebeslag-vlaanderen-toestand-2025', matches: (dataset) => thematicProductIs(dataset, 'space_occupation_2025'), }, { key: 'settlement_typology', domain: 'space', name: 'Kernen, linten en verspreide bebouwing', owner: 'Departement Omgeving', coverage: 'Toestand 2022', value: 'Begrijpelijke morfologie voor kern, lint en verspreide bebouwing.', metricExamples: 'oppervlakte en aandeel per morfologisch type', priority: 'next', url: 'https://www.vlaanderen.be/datavindplaats/catalogus/kernen-linten-verspreide-bebouwing-in-vlaanderen-kernen-toestand-2022', matches: (dataset) => sourceNameIs(dataset, 'department_omgeving_settlement_typology'), }, { key: 'business_parks', domain: 'space', name: 'Bedrijventerreinen OSLO', owner: 'VLAIO / Digitaal Vlaanderen', coverage: 'Productieservice, toestand 2026', value: 'Economische ruimte, bezetting en bedrijventerreincontext.', metricExamples: 'hectare bedrijventerrein, bezette/onbezette oppervlakte', priority: 'planned', url: 'https://www.vlaanderen.be/datavindplaats/catalogus/wfs-bedrijventerreinen', matches: (dataset) => sourceNameIs(dataset, 'vlaio_business_parks'), }, { key: 'bwk', domain: 'nature', name: 'BWK / Natura 2000', owner: 'INBO', coverage: 'Toestand 2025', value: 'Biologische waardering, biotopen en habitattypen.', metricExamples: 'hectare natuurwaarde, habitat en regionaal belangrijk biotoop', priority: 'next', url: 'https://www.vlaanderen.be/datavindplaats/catalogus/biologische-waarderingskaart-en-natura-2000-habitatkaart-toestand-2025', matches: (dataset) => sourceNameIs(dataset, 'inbo_bwk_natura2000'), }, { key: 'agriculture', domain: 'nature', name: 'Landbouwgebruikspercelen', owner: 'Agentschap Landbouw en Zeevisserij', coverage: 'Jaarlijkse definitieve bestanden', value: 'Landbouwoppervlakte en teeltevolutie zonder perceellijnage te verzinnen.', metricExamples: 'hectare landbouw en hoofdteeltgroep per jaar', priority: 'next', url: 'https://www.vlaanderen.be/datavindplaats/catalogus/open-geodata-landbouwgebruikspercelen', matches: (dataset) => sourceNameIs(dataset, 'agentschap_landbouw_zeevisserij_agricultural_parcels'), }, { key: 'open_space', domain: 'nature', name: 'Open ruimte Vlaanderen', owner: 'Departement Omgeving', coverage: '10 m raster, toestand 2022', value: 'Openruimte-aandeel en versnippering naast ruimtebeslag en landgebruik.', metricExamples: 'hectare open ruimte, aandeel en fragmentatie', priority: 'planned', url: 'https://www.vlaanderen.be/datavindplaats/catalogus/open-ruimte-vlaanderen-toestand-2022', matches: (dataset) => thematicProductIs(dataset, 'open_space_2022'), }, { key: 'dhmv', domain: 'soil', name: 'Digitaal Hoogtemodel Vlaanderen II', owner: 'Digitaal Vlaanderen', coverage: 'DTM/DSM, opname 2013-2015', value: 'Hoogte, reliëf en helling als gemeten terreinbasis.', metricExamples: 'hoogte m TAW, reliëf en helling in graden', priority: 'next', url: 'https://www.vlaanderen.be/digitaal-vlaanderen/onze-diensten-en-platformen/earth-observation-data-science-eodas/het-digitaal-hoogtemodel/digitaal-hoogtemodel-vlaanderen-ii', matches: (dataset) => sourceNameIs(dataset, 'digitaal_vlaanderen_dhmv'), }, { key: 'soil_map', domain: 'soil', name: 'Digitale bodemkaart', owner: 'Databank Ondergrond Vlaanderen', coverage: 'Vlaams Gewest, historische kartering', value: 'Bodemtype, textuur en drainage voor landbouw en geschiktheid.', metricExamples: 'hectare per bodemtype, drainage- en textuurverdeling', priority: 'next', url: 'https://www.vlaanderen.be/datavindplaats/catalogus/digitale-bodemkaart-van-het-vlaams-gewest-bodemtypes', matches: (dataset) => sourceNameIs(dataset, 'dov_soil_map'), }, { key: 'erosion', domain: 'soil', name: 'Potentiële bodemerosie per perceel', owner: 'Departement Omgeving', coverage: 'Perceelmodel, editie 2023', value: 'Potentiële erosiedruk gecombineerd met landbouw en reliëf.', metricExamples: 'hectare per erosieklasse en aandeel risicogebied', priority: 'planned', url: 'https://www.vlaanderen.be/datavindplaats/catalogus/potentiele-bodemerosiekaart-per-perceel-2023', matches: (dataset) => sourceNameIs(dataset, 'department_omgeving_erosion'), }, { key: 'grb_roads', domain: 'mobility', name: 'GRB-wegen en transport', owner: 'Digitaal Vlaanderen', coverage: 'Actuele wegcontext', value: 'Wegennet en transportcontext in de kaartselectie.', metricExamples: 'kilometer weg, dichtheid en afstand tot netwerk', priority: 'next', url: 'https://www.vlaanderen.be/datavindplaats/catalogus/grbgis', matches: (dataset) => sourceNameIs(dataset, 'grb') && referenceLayerIs(dataset, 'roads'), }, { key: 'node_value', domain: 'mobility', name: 'Knooppuntwaarde per hectare', owner: 'Departement Omgeving', coverage: '1 ha raster, toestand 2022', value: 'Modelmatige bereikbaarheid via collectief vervoer.', metricExamples: 'gemiddelde, mediaan en percentielen van de bronindex', priority: 'next', url: 'https://www.vlaanderen.be/datavindplaats/catalogus/knooppuntwaarde-per-ha-toestand-2022', matches: (dataset) => thematicProductIs(dataset, 'node_value_2022'), }, { key: 'hoppin', domain: 'mobility', name: 'Hoppinpunten en mobiliteitsknooppunten', owner: 'Departement Mobiliteit en Openbare Werken', coverage: 'Geplande en gerealiseerde punten', value: 'Multimodale overstappunten en voorzieningen in de buurt.', metricExamples: 'aantal punten, status en afstand tot selectie', priority: 'planned', url: 'https://www.vlaanderen.be/DataCatalogRecord/c262d7d0-d90d-4695-a8c6-6427ef4abb38', matches: (dataset) => sourceNameIs(dataset, 'mow_hoppin'), }, { key: 'cycle_highways', domain: 'mobility', name: 'Fietssnelwegen', owner: 'Vereniging van de Vlaamse Provincies', coverage: 'Vlaams netwerk, productieservice', value: 'Gerealiseerde en geplande functionele fietsverbindingen.', metricExamples: 'kilometer route, realisatiestatus en kwaliteit', priority: 'planned', url: 'https://www.vlaanderen.be/datavindplaats/catalogus/fietssnelwegen-wfs', matches: (dataset) => sourceNameIs(dataset, 'vvp_cycle_highways'), }, { key: 'statistical_sectors', domain: 'people', name: 'Statistische sectoren', owner: 'Statbel / Digitaal Vlaanderen', coverage: 'Gebiedsindeling, toestand 2024/2025', value: 'Betrouwbare ruimtelijke sleutel voor socio-economische indicatoren.', metricExamples: 'sectorprofielen en gewogen indicatoren per selectie', priority: 'next', url: 'https://www.vlaanderen.be/datavindplaats/catalogus/statistische-sectoren-van-belgie-toestand-01-01-2024', matches: (dataset) => sourceNameIs(dataset, 'statbel') && referenceLayerIs(dataset, 'statistical_sectors'), }, { key: 'population_density', domain: 'people', name: 'Inwonersdichtheid per hectare', owner: 'Departement Omgeving / Statbel', coverage: '1 ha raster, toestand 2019', value: 'Gebiedsdekkende bevolkingsdichtheid zonder adressen te tonen.', metricExamples: 'geschat aantal inwoners en inwoners per hectare', priority: 'next', url: 'https://www.vlaanderen.be/datavindplaats/catalogus/inwonersdichtheid-per-ha-vlaanderen-toestand-2019', matches: (dataset) => thematicProductIs(dataset, 'population_density_2019'), }, { key: 'service_level', domain: 'people', name: 'Totaal voorzieningenniveau', owner: 'Departement Omgeving', coverage: '1 ha raster, toestand 2022', value: 'Nabijheid van dagelijkse voorzieningen in één brongetrouwe score.', metricExamples: 'gemiddelde, mediaan en percentielen van de 0-1-score', priority: 'next', url: 'https://www.vlaanderen.be/datavindplaats/catalogus/totaal-voorzieningenniveau-toestand-2022', matches: (dataset) => thematicProductIs(dataset, 'service_level_2022'), }, { key: 'municipality_indicators', domain: 'people', name: 'Gemeente in cijfers', owner: 'Vlaamse Milieumaatschappij', coverage: 'Gemeentelijke klimaat- en leefomgevingsindicatoren', value: 'Contextcijfers voor Mol en vergelijking met andere gemeenten.', metricExamples: 'hittegolfdagen, temperatuur en luchtkwaliteitsindex', priority: 'later', url: 'https://www.vlaanderen.be/datavindplaats/catalogus/gemeente-in-cijfers', matches: (dataset) => sourceNameIs(dataset, 'vmm_municipality_indicators'), }, { key: 'flood_hazard', domain: 'climate', name: 'VMM-overstromingsgevaar', owner: 'Vlaamse Milieumaatschappij', coverage: 'Fluviaal/pluviaal, T10/T100/T1000, huidig en 2050', value: 'Gemodelleerde lokale maximumdiepte per kansscenario.', metricExamples: 'hectare positieve diepte, gemiddelde/P90/maximale diepte', priority: 'next', url: 'https://www.vlaanderen.be/datavindplaats/catalogus/publieke-inspire-coverage-service-van-ogrk', matches: (dataset) => sourceNameIs(dataset, 'vmm_flood_hazard'), }, { key: 'waterinfo', domain: 'climate', name: 'Waterinfo meetreeksen', owner: 'Waterinfo Vlaanderen', coverage: 'Stationgebonden jaarmetingen', value: 'Hydrologische waarnemingen als puntreeksen, niet als gebiedsvolume.', metricExamples: 'waterstand, debiet en neerslag per station en periode', priority: 'planned', url: 'https://waterinfo.vlaanderen.be/', matches: (dataset) => sourceNameIs(dataset, 'waterinfo'), }, { key: 'heat_stress', domain: 'climate', name: 'Hitte-eilanden in steden', owner: 'Vlaamse Milieumaatschappij', coverage: 'Jaarbeelden 2019-2022', value: 'Ruimtelijke blootstelling aan hittestress voor leefomgevingsanalyse.', metricExamples: 'hittegolfgraaddagen en aandeel blootgesteld gebied', priority: 'next', url: 'https://www.vlaanderen.be/datavindplaats/catalogus/hitte-eilanden-in-steden', matches: (dataset) => sourceNameIs(dataset, 'vmm_heat_stress'), }, { key: 'air_quality', domain: 'climate', name: 'Luchtkwaliteit', owner: 'Vlaamse Milieumaatschappij / Departement Omgeving', coverage: 'Meetreeksen en geselecteerde gebiedskaarten', value: 'PM2,5 en andere luchtindicatoren met expliciete schaal en jaargang.', metricExamples: 'concentratie, normoverschrijding en trend per brongebied', priority: 'planned', url: 'https://www.vlaanderen.be/datavindplaats/catalogus/concentratie-fijn-stof-pm25-in-de-omgevingslucht', matches: (dataset) => sourceNameIs(dataset, 'vmm_air_quality'), }, { key: 'vha', domain: 'climate', name: 'Vlaamse Hydrografische Atlas', owner: 'Vlaamse Milieumaatschappij', coverage: 'Actuele gecategoriseerde waterlopen', value: 'Autoritatief waterlopennetwerk voor lengte, categorie en beheerder.', metricExamples: 'kilometer waterloop per categorie en afstand tot netwerk', priority: 'later', url: 'https://www.vlaanderen.be/datavindplaats/catalogus/ogc-api-features-vlaamse-hydrografische-atlas-waterlopen', matches: (dataset) => sourceNameIs(dataset, 'vmm_vha'), }, { key: 'vha_bathymetry_profiles', domain: 'climate', name: 'VHA-dwarsprofielen waterbodem', owner: 'Vlaamse Milieumaatschappij', coverage: 'Historische profielpunten op Vlaamse waterlopen', value: 'Gemeten profielinformatie en officiële bronbladen op exacte kaartlocaties.', metricExamples: 'aantal profielen, geregistreerde diepte en breedte per meetpunt', priority: 'next', url: 'https://vha.waterinfo.be/arcgis/rest/services/digitale_atlas/MapServer', matches: (dataset) => sourceNameIs(dataset, 'vmm_vha_bathymetry_profiles'), }, { key: 'mdk_bcp_bathymetry', domain: 'climate', name: 'Dieptemodel Belgisch Continentaal Plat', owner: 'Agentschap Maritieme Dienstverlening en Kust', coverage: 'Belgische Noordzee, 20 x 20 m raster in LAT', value: 'Continue zeebodemhoogte voor mariene selectie en evolutie.', metricExamples: 'minimum/maximum diepte, diepteklassen en bodemvolume per peilcampagne', priority: 'planned', url: 'https://www.vlaanderen.be/datavindplaats/catalogus/dieptemodel-van-de-zeebodem-belgisch-continentaal-plat-noordzee', matches: (dataset) => sourceNameIs(dataset, 'mdk_bcp_bathymetry'), }, { key: 'spw_waterway_bathymetry', domain: 'climate', name: 'Waalse vaarweg- en stuwmeerbathymetrie', owner: 'Service public de Wallonie', coverage: 'Gemeten Waalse vaarwegen en stuwmeren, 0,5 m in mDNG', value: 'Officiële waterbodemhoogtes voor begrensde analyse buiten Vlaanderen.', metricExamples: 'bodemhoogte, gemeten oppervlakte en brondekking', priority: 'next', url: 'https://geoportail.wallonie.be/catalogue/0a544b42-0b30-4c8e-85e7-38149b99eae0.html', matches: (dataset) => sourceNameIs(dataset, 'spw_bathymetry'), }, ] export function operationalSources( datasets: DatasetCreateResponse[], domain?: SourceDomainKey, ): OfficialSourceDefinition[] { const ready = datasets.filter((dataset) => dataset.status === 'ready') return OFFICIAL_SOURCE_PORTFOLIO.filter( (source) => (!domain || source.domain === domain) && ready.some(source.matches), ) } export function sourcesForDomain(domain: SourceDomainKey): OfficialSourceDefinition[] { return OFFICIAL_SOURCE_PORTFOLIO.filter((source) => source.domain === domain) }