Ga naar inhoud

Functioneel landgebruik produceren

Het productiepakket bevat scripts/functioneel_landgebruik.py voor het maken van een landelijk raster met functionele landgebruiksklassen. De betekenis van de klassen, bronnen en bewerkingen staat bij Functioneel landgebruik.

Vooraf

De productie haalt alle standaardbronnen op: BAG, BGT, BRP, TOP10NL, LIWO, HYDAMO, Waterketen DAMO en de beoordeelde OSM-drinkwaterlocaties. BGT-vlakken en de LIWO-selectie worden automatisch voorbereid. Bestaande bronnen worden hergebruikt; zie de gedeelde opties voor vernieuwen en offline gebruik. Een expliciete --bgt-path gebruikt het opgegeven voorbereide bestand.

Alle meldingen, inclusief worker-details en bronvoorbereiding, staan in productie.log van de hoofdproductie. De terminal toont de hoofdvoortgang. Losse Python-bewerkingen blijven hun expliciete sources-object ondersteunen; een ontbrekende optionele bron in zo'n object kan bewust worden overgeslagen.

Voor de BAG-koppeling maakt de verwerking eenmalig bag-light.pand_vbo.sqlite naast bag-light.gpkg. Dit is een afgeleid zoekbestand; de oorspronkelijke BAG blijft ongewijzigd. De bronmap moet hiervoor schrijfbaar zijn. Bij landelijke productie wordt dit bestand vóór het starten van de workers opgebouwd, met voortgang in de log. Daarna hergebruiken alle workers dezelfde index. Een gewijzigde bestandsgrootte of wijzigingsdatum van de BAG leidt tot opnieuw opbouwen. Bij handmatige vervanging met behoud van beide kenmerken moet je het zoekbestand verwijderen. Het mag opnieuw worden gemaakt en hoort niet in Git.

De index versnelt het vinden van verblijfsobjecten per pand. De functiekeuze, oppervlakteberekening en omgang met gedeelde verblijfsobjecten blijven gelijk.

Volg Installatie en controleer het productiepakket met pixi run --locked controleer. Gegevens komen standaard onder ./data in de projectfolder; zie Opslag van gegevens voor een andere locatie.

Dit voorbeeld verwerkt een landelijk tegelrooster. Downloads en berekeningen kunnen veel schijfruimte en tijd vragen. Controleer de opties met --help en de functionele beschrijving voordat u de productie start.

Starten

Nieuwe scriptproducties schrijven naast de klassen en broncodes ook tiles/<tile_id>/gebouw_ids.tif, tiles/<tile_id>/gebouwen.gpkg, gebouw_index.sqlite in de runmap en functioneel_landgebruik_gebouw_ids.vrt. Dit zijn inputs voor DEM-productie. De library-optie write_building_ids=True schakelt dezelfde uitvoer in bij een eigen tegelworkflow. Oudere tegels zonder deze companions worden daarvoor niet stilzwijgend hergebruikt. building_context_m bepaalt de extra voorbereide gebouwomgeving voor donoruitsluiting (standaard 5 m). Deze moet minstens zo groot zijn als de maximale gebouwzoekafstand van de DEM-bewerking.

De productie gebruikt het gezamenlijke BGT-vlakkenbestand. Ontbrekende voorbereiding wordt automatisch uitgevoerd.

Open PowerShell in uw projectfolder en voer uit:

pixi run --locked functioneel_landgebruik

Met --area alkmaar produceert dezelfde workflow uitsluitend vier Alkmaar-tegels:

pixi run functioneel_landgebruik --area alkmaar --workers 2

Alle gedeelde gebieden zijn beschikbaar, ook --area 38. De standaard is --area nederland. Uitvoer staat onder processed_data/functioneel_landgebruik/<area>/<run-id>/, op hetzelfde nationale grid. --building-context-m bepaalt de voorbereide buurcontext (standaard 5 m). DEM-productie kan dezelfde workflow starten als geschikte tegels ontbreken.

De taak voert het meegeleverde script uit. Rechtstreeks starten kan ook:

pixi run --locked python ./scripts/functioneel_landgebruik.py

De gedeelde productie gebruikt de volgende instellingen:

Instelling Huidige waarde
Workers 4; instelbaar via FUNCTIONEEL_LANDGEBRUIK_WORKERS of --workers
RESOLUTION_M 0,5 meter
TEGELGROOTTE_M 5.000 meter
BGT_BESTAND bgt.gpkg
CONTROLE_OPSLAAN True: NoData-controle schrijven

Stel het aantal workers desgewenst in via .env in de map van waaruit u het script start (normaal de repositoryhoofdmap):

FUNCTIONEEL_LANDGEBRUIK_WORKERS=8

Zonder instelling worden 4 workers gebruikt. --workers heeft voorrang. Er worden nooit meer workers gestart dan te verwerken tegels. De waarde moet een geheel getal van minstens 1 zijn. Een omgevingsvariabele met dezelfde naam heeft voorrang op .env. Start het script opnieuw na een wijziging.

Het script hergebruikt de voorbereide actuele BGT. De BGT moet de vijf gebruikte lagen en de einddatumvelden bevatten. De gebruikte CSV wordt in de uitvoermap bewaard; bij een afwijkende CSV moet u een nieuwe uitvoermap kiezen.

Bij conversie van BGT-wegdelen en terreindelen wordt tijdelijk één GML-laag naast het doelbestand uitgepakt. Houd ruimte vrij voor de grootste uitgepakte laag, naast het nieuwe GeoPackage. Dit is nodig om alle attributen te behouden en expliciet geometrie2d te gebruiken in plaats van een kruinlijn. De bestaande ZIP kan worden hergebruikt. Alleen het script opnieuw starten herstelt een eerder verkeerd omgezet GeoPackage niet: dat bronbestand wordt hergebruikt.

Standaard ontstaat een nieuwe runmap. Met --run-id NAAM --resume hervat u een compatibele run en worden aanwezige resultaten hergebruikt. --run-id NAAM --overwrite vernieuwt zowel het tegelrooster, de rastertegels als de landelijke TIFF. Er zijn geen afzonderlijke overschrijfopties meer voor tegels en TIFF. Zie productiemappen voor de gedeelde naamgeving en controles.

Bij het hervatten van een compatibele run wordt de legenda van het samengestelde raster opnieuw geschreven. Als de labels afwijken van de ingebedde rasterattribuuttabel, wordt de COG opnieuw opgebouwd vanuit het bestaande VRT. Daarvoor hoeven de landgebruiksklassen niet opnieuw berekend te worden, maar het schrijven van de COG kost wel tijd en schijfruimte. De QGIS-stijl en de compatibiliteitskopie .tif.aux.xml krijgen dezelfde labels. Losse tegelrasters en hun stijlen blijven bij hergebruik ongewijzigd.

Resultaten

Onder processed_data/functioneel_landgebruik/nederland/<run-id> in uw datastore vindt u:

  • tiles/<tile_id>/: per tegel functioneel_landgebruik.tif, functioneel_landgebruik_bronnen.tif, gebouw_ids.tif, gebouwen.gpkg, nodata.gpkg en status.json; <tile_id> bevat xmin_ymin_xmax_ymax;
  • functioneel_landgebruik.vrt: de tegels samengevoegd als virtueel raster;
  • functioneel_landgebruik.tif: het samengestelde Cloud Optimized GeoTIFF-raster.
  • functioneel_landgebruik.tif.aux.xml: compatibiliteitskopie van de in de TIFF ingebedde rasterattribuuttabel met pixelcode, omschrijving en kleur;
  • functioneel_landgebruik_bronnen.tif: bronlaag per cel, met een JSON-legenda;
  • functioneel_landgebruik.qml: legenda voor het landelijke raster in QGIS;
  • nodata.gpkg: NoData-vlakken met bron en reden;
  • status.json: voortgang en eventuele foutmelding;
  • run.json: rekeninstellingen, bronidentiteit, pakketversie en runstatus;
  • landgebruik_met_code.csv: de gebruikte codetabel.

Het logbestand is productie.log in dezelfde uitvoermap. Open het resultaat in QGIS en controleer de dekking en klassen voor uw toepassing.

De QML bevat unieke pixelcodes met hun labels en kleuren. De landelijke TIFF krijgt dezelfde klassen in een ingebedde rasterattribuuttabel en een identieke .tif.aux.xml-bijlage. Beide tabellen worden uit hetzelfde kleurenpalet gemaakt. Moderne lezers kunnen de TIFF zelfstandig lezen; de bijlage ondersteunt oudere GDAL-versies. Bewaar voor brede compatibiliteit de .tif, .tif.aux.xml en .qml bij elkaar. Productie vereist GDAL 3.12 of nieuwer en controleert dit vooraf. De ingebedde tabel wordt tijdens COG-creatie geschreven, zodat de geoptimaliseerde bestandsindeling behouden blijft.

Voeg de TIFF opnieuw toe aan QGIS om de legenda te laden. Bij een al geopende laag kunt u via Laageigenschappen ? Symbologie ? Stijl ? Stijl laden het QML-bestand kiezen. Bij hergebruik worden QML en de compatibiliteitstabel bijgewerkt. Een geldige TIFF met passende ingebedde tabel blijft ongewijzigd. Heeft een oudere TIFF alleen een externe tabel, dan wordt de COG opnieuw gemaakt vanuit het bestaande VRT; geldige rastertegels worden hergebruikt. Een ontbrekende of verouderde bijlage wordt afzonderlijk hersteld.

NoData controleren

Voeg bij bouw_functioneel_landgebruik_tiles(...) of bouw_functioneel_landgebruik(...) deze instelling toe:

diagnostics_path=data_dir / "nodata.gpkg",

Open nodata.gpkg in QGIS. Het bestand bevat uitsluitend:

  • laag nodata: vlakken die precies de lege cellen van het eindraster volgen;
  • kolom bron: de betrokken bron, bijvoorbeeld BAG of BGT;
  • kolom reden: een korte uitleg waarom hier geen landgebruik staat.

Gevulde rastercellen en afzonderlijke bronobjecten staan niet in deze laag. Ook een punt zonder klasse verschijnt alleen als zijn rastercel leeg blijft. Zonder NoData is de laag leeg.

Bij een open BAG-keuze staat de concrete reden, bijvoorbeeld een onbekend gebruiksdoel of een ontbrekende oppervlakte. Bij andere gaten worden de gevonden bronuitsluitingen vermeld, zoals uitgefilterde BGT-historie of een ontbrekende CSV-koppeling. Meerdere aanwijzingen op dezelfde plek staan samen in de reden. Dit bewijst niet dat een uitgesloten bronobject die plek in de actuele situatie had moeten vullen. Zonder specifieke aanwijzing staat er: Geen bron vult deze plek. De bron is dan Niet vastgesteld. Als daar wel TOP10NL-terrein ligt, vermeldt de controle de bronwaarde, bijvoorbeeld: grasland aanwezig; TOP10NL-terreinlaag niet verwerkt. De bron is dan TOP10NL. Dit verklaart alleen het gat; het voegt geen landgebruiksklasse toe.

De controle verandert het raster niet. Grenzende vlakken kunnen gescheiden blijven bij tegel- en verwerkingsgrenzen. De vlakoppervlakken overlappen niet binnen de berekende tegel.

Workers schrijven tiles/<tile_id>/nodata.gpkg. Deze controles blijven na succesvol samenvoegen bewaard, naast het centrale nodata.gpkg. Bij een fout blijven de voltooide tegelcontroles beschikbaar voor hervatten. Een bestaand eindbestand kan ontbrekende controles voor ongewijzigde rastertegels leveren.

Zonder diagnostics_path wordt geen controle gemaakt. Bestaande rasters zonder passende controle worden niet achteraf verklaard: bereken ze opnieuw met overwrite=True. Het oudere controleformaat met objecten, punten en een tegeloverzicht wordt niet als nieuwe NoData-controle hergebruikt. Voor hergebruik worden rasterpad, bestandsgrootte en wijzigingsdatum gecontroleerd; deze technische gegevens staan buiten de attributentabel.

BAG controleren: brongegevens en statusselectie

Start vanuit de repository:

from waterlagen.functioneel_landgebruik.controle import main

main(overwrite=True)

De functie maakt één bestand voor Flik-Flak en Vughterstraat: processed_data/functioneel_landgebruik/controle/bag_controle.gpkg, laag bag_controle. De kolom uitsnede geeft aan welk voorbeeld je bekijkt. Vanaf stap 6 bevat hetzelfde bestand ook gemalen_controle als een gemalenbron beschikbaar is. Dat is een puntlaag; de panden blijven in bag_controle staan. Gebruik identificatie om een pand terug te vinden; QGIS-fid kan bij een nieuwe uitvoer veranderen.

Lees eerst toelichting_resultaat: die vermeldt waarom het pand is ingedeeld, uitgesloten of nog geen klasse heeft. Bij open functiecombinaties staan de aantallen verblijfsobjecten en de niet-toepasbare regels concreet beschreven. De grens van drie betreft verblijfsobjecten, niet het aantal verschillende functies.

Per pand staan alle stappen naast elkaar:

Stap Belangrijkste kolommen
1. Bron status, gebruiksdoel, bron_aantal_vbo, bron_vbo_overzicht
2. Selectie meegenomen_stap2, reden_statusselectie
3. Functie gekozen_pandfunctie, functiekeuze_status, reden_functiekeuze
4. Bouwlagen oppervlaktesom, pandoppervlakte, verhouding, bouwlagen en uitleg
5. Klasse omschrijving, beide codes, klasse_status, reden_klasse
6. Bijzondere gebouwen oorspronkelijke basis_...-klasse, bronkoppelingen, gemaalcapaciteit en uiteindelijke reden_klasse

Het VBO-overzicht toont per verblijfsobject het ID, alle doelen en de gezamenlijke oppervlakte. Het bronveld gebruiksdoel is niet de gekozen pandfunctie. Uitgesloten panden blijven in de laag staan. Hun latere stappen zijn gemarkeerd als niet uitgevoerd en krijgen geen klasse.

Standaard worden alle zes stappen uitgevoerd. Met stap=5 bekijk je alleen de gewone BAG-indeling. De losse berekeningsfuncties blijven behouden, maar worden niet meer naar aparte bestanden of lagen geschreven.

De functiekeuze volgt de beslisboom voor de gebouwfunctie, inclusief de regels voor NULL, overige gebruiksfunctie en appartementencomplexen. Wonen blijft buiten de functieoppervlaktevergelijking, maar telt wel mee bij de bouwlagen.

Bij meerdere doelen in een verblijfsobject wordt eerst één functie geselecteerd volgens de prioriteit in de functionele beschrijving hierboven. De diagnostiek vermeldt deze keuze; het volledige VBO-oppervlak telt eenmaal mee bij die functie.

Bij gelijke grootste totale oppervlakten geldt dezelfde prioriteit als bij meerdere doelen binnen één VBO. De diagnostiek vermeldt de gekozen functie. Ongeldige benodigde oppervlakten en niet-opgeloste combinaties krijgen nog te beoordelen. Bij een oppervlaktevergelijking geldt dit ook voor een verblijfsobject dat aan meerdere panden is gekoppeld: de verdeling is onbekend. Er wordt geen oppervlakte tussen panden verdeeld. Panden zonder gekoppeld verblijfsobject krijgen geen gebruiksdoel, nog zonder klassecode.

Voor het verblijfsobject van Flik-Flak met onderwijs en sport wordt onderwijsfunctie gekozen; de volledige 9.345 m² telt daarbij mee. De bronwaarden blijven behouden. Het winkel/woning-pand krijgt winkelfunctie ondanks het grotere woonoppervlak. De BAG-voorbereiding gebruikt dezelfde indelingsfuncties als deze controle.

Stap 4 voegt de volgende kolommen toe aan dezelfde laag:

  • som_vbo_oppervlakte_m2: som van alle gekoppelde VBO-oppervlakten;
  • pandoppervlakte_m2: oppervlakte van de volledige pandgeometrie;
  • verhouding_vbo_pand: VBO-som gedeeld door pandoppervlakte;
  • berekend_aantal_bouwlagen: verhouding naar boven afgerond;
  • bouwlagen_status en reden_bouwlagen: berekend of nog te beoordelen, met uitleg.

Dit volgt de berekening uit de notitie (p. 4-5). Ook woonoppervlakte telt mee als de gekozen functie winkel is. Een VBO met meerdere doelen telt eenmaal mee met zijn gezamenlijke oppervlakte. De functiekeuze uit stap 3 verandert hierdoor niet. Het aantal bouwlagen is een schatting uit oppervlakten.

Zonder VBO, bij ontbrekende of ongeldige oppervlakten of bij een VBO dat aan meerdere panden is gekoppeld, blijft de berekening open. Er wordt geen oppervlakteverdeling aangenomen. Stap 4 kent nog geen woning/appartementklasse of landgebruikscode toe. Controle en productie gebruiken dezelfde berekening.

Stap 5 voegt de volgende kolommen toe aan dezelfde laag:

  • lgb_omschrijving: gebouwklasse op basis van functie en bouwlagen;
  • lgb_code_binnendijks en lgb_code_buitendijks: respectievelijk de standaardcode en de buitendijkse code;
  • klasse_status en reden_klasse: ingedeeld of nog te beoordelen, met uitleg.

De codes volgen tabel 1 uit de notitie van 17 september 2025 (p. 3-5). Voor de tien reguliere functies gelden 1, 2 of 3-plus bouwlagen. Een gekozen woonfunctie met maximaal 3 VBO's is een woning; vanaf 4 VBO's een appartementencomplex (code 4/132), onafhankelijk van de bouwlagen. Een openstaande functiekeuze blijft zonder klasse, ook als bouwlagen bekend zijn. De winkel/woning krijgt met 4 berekende bouwlagen de winkelklasse met 3 of meer bouwlagen (31/159).

Als overige gebruiksfunctie de leidende functie is, telt alleen de oppervlakte van VBO's met die gekozen functie mee voor de grens van 100 m²: meer dan 100 m² geeft 32/160, maximaal 100 m² geeft 33/161. Dit geldt ook bij gemengde functies. Ontbrekende oppervlakten van deze VBO's worden niet als nul meegeteld. Geen gebruiksdoel in stap 3 geeft de aparte categorie 34/162, niet dezelfde categorie als een onopgeloste combinatie.

Deze stap controleert nog niet op buitendijkse ligging. Er wordt geen definitieve rastercode gekozen. TOP10NL-aanvullingen zoals kassen zijn hier nog niet toegepast. Stap 5 leest codes en omschrijvingen uit de CSV; lgb_koppeling_id laat zien welke rij is gebruikt. De landelijke verwerking gebruikt dezelfde tabel en BAG-beslisregels.

Stap 6 controleren

Maak desgewenst eerst de OSM-vlakken voor drinkwaterproductielocaties:

from waterlagen.functioneel_landgebruik.osm_drinkwater import download_osm_drinkwater

download_osm_drinkwater()

De functie schrijft standaard source_data/osm/drinkwaterlocaties.gpkg binnen de geconfigureerde opslaglocatie. Daarna gebruiken BAG-controle en rasterproductie het bestand automatisch. Bestaande uitvoer wordt hergebruikt; gebruik overwrite=True om OSM opnieuw op te halen. Met cache_dir=Path("map") wordt het Overpass-antwoord bewaard en met offline=True, cache_dir=Path("map") opnieuw gebruikt. De bronselectie en de beperkingen staan bij OSM-drinkwaterlocaties. De meegeleverde broncontrole bepaalt welke 54 locaties worden opgehaald; gebruik reviews_path=Path("bestand.json") voor een aangepaste beoordeling.

Het GeoPackage bevat de laag drinkwaterproductieterrein voor de koppeling met BAG-panden en daarnaast afzonderlijke controlelagen voor terreinen en losse gebouwcontouren. Standaard koppelen alleen de terreinen. Met include_buildings=True, overwrite=True worden ook losse gebouwcontouren in de koppellaag opgenomen; controleer die keuze per locatie.

De TOP10NL-GeoPackage moet top10nl_gebouw_vlak bevatten. Kassen worden daarin automatisch opgezocht. De standaardvoorbeelden hoeven geen kas of gemaal te bevatten; kies daarvoor een passende bounds.

In gemalen_controle staan de broncapaciteit, beide mogelijke codes, bag_pand_id, bag_gebruiksdoelen, geometrie_kaart, pand_capaciteit_m3_min en reden_ruimtelijke_koppeling. De puntlaag behoudt alle bronpunten, ook als voor de kaart een BAG-pand wordt gebruikt of geen capaciteitsklasse kon worden bepaald. Bekijk in bag_controle de kolommen gekoppelde_gemalen en gemaalcapaciteit_m3_min voor de panduitkomst.

Een pand zonder gekoppeld VBO of met uitsluitend lege gebruiksdoelen mag nu ook worden gekoppeld. De gemaalbron levert het bewijs van de gemaalfunctie. Het punt moet binnen precies één geselecteerd pand liggen en de gezamenlijke capaciteit moet geldig en indeelbaar zijn. De controle vermeldt waarom het pand is gebruikt. Een combinatie van een bekend doel en een ontbrekend doel wordt niet automatisch gekoppeld.

Aanvullende bronnen zijn optioneel en worden niet automatisch gedownload. Voor het controlescript geef je special_sources=SpecialBuildingSources(...) op, uit waterlagen.functioneel_landgebruik.kassen_rwzi_drinkwater. Naast top10nl_gpkg kun je rwzi_gpkg, rwzi_layer, drinking_water_gpkg en drinking_water_layer instellen. De RWZI-bron is de laag rwzi uit Waterketen DAMO. Download deze vooraf met de downloadinstructies. Controle en rasterproductie gebruiken automatisch source_data/waterketen_damo/waterketen_damo.gpkg als dit bestand aanwezig is. Er geldt geen statusfilter; de oudere opties rwzi_status_column en rwzi_active_value blijven geaccepteerd maar worden niet gebruikt. Met gemalen_gpkg kun je een eigen HyDAMO-bestand aanwijzen.

Voor rasterproductie staan de optionele paden op FunctioneelLandgebruikSources (rwzi_gpkg, drinking_water_gpkg, gemalen_gpkg) en de bijbehorende laag- en veldnamen op FunctioneelLandgebruikLayers. Gebruik dataclasses.replace om de paden van FunctioneelLandgebruikSources.from_datastore(...) aan te vullen. De OSM-bron uit de standaardopslag wordt door from_datastore(...) automatisch gevonden als het bestand bestaat. Controleer de selectieregels en beperkingen voordat je de uitkomsten gebruikt.

Meerdere gemalen in één pand controleren

Roep waterlagen.functioneel_landgebruik.controle_gemalen.main() aan voor een uitsnede van 500 × 500 meter rond gemaal Lely. De huidige bron bevat drie afzonderlijke gemaalobjecten (afdelingen 2, 3 en 4) van elk 450 m³/min, binnen BAG-pand 0463100000001005 met overige gebruiksfunctie. De verwachte som is 1.350 m³/min: klasse >1.000, codes 43/171. Dit controleert de verwerking van de bronregistraties; het bewijst niet onafhankelijk de werkelijke pompcapaciteit.

De uitvoer staat onder processed_data/functioneel_landgebruik/controle_gemalen_lely:

  • controle.gpkg: lagen bag_controle en gemalen_controle;
  • landgebruik.tif en landgebruik.qml: raster met categorielegenda;
  • berekening.log: voortgang.

Controleer bij het pand gekoppelde_gemalen, gemaalcapaciteit_m3_min en beide lgb_code-kolommen. Bij de punten staan de afzonderlijke capaciteiten, bag_pand_id, geometrie_kaart en pand_capaciteit_m3_min. Het script hergebruikt de lokale bronnen en overschrijft alleen dit voorbeeld. Sluit de uitvoer in QGIS voor opnieuw draaien. Pas zo nodig BGT_FILENAME aan; standaard wordt het herstelde bgt.gpkg gebruikt.

De codetabel aanpassen

De standaardtabel staat in src/waterlagen/functioneel_landgebruik/landgebruik_met_code.csv. Deze CSV is onderdeel van de codeversie. Gebruik de pakketversie als uitgangspunt voor je eigen tabel. Kopieer de meegeleverde tabel naar een eigen bestand, zodat pakketupdates je aanpassingen niet vervangen:

from pathlib import Path
from shutil import copyfile
from waterlagen.functioneel_landgebruik.landgebruikstabel import DEFAULT_MAPPING_CSV

copyfile(DEFAULT_MAPPING_CSV, Path("mijn_landgebruik.csv"))

Gebruik --mapping-csv voor een eigen tabel. De productie bewaart de gebruikte CSV in de uitvoermap. Vanuit Python kan dit ook met main(mapping_csv=Path(...)) of met bouw_functioneel_landgebruik(..., mapping_csv=Path(...)).

Vanaf de repositoryhoofdmap kan het productiescript ook direct een eigen tabel gebruiken:

pixi run python scripts/functioneel_landgebruik.py --mapping-csv mijn_landgebruik.csv

Kies na een wijziging een nieuwe run-ID (of start zonder --run-id voor een nieuwe tijdstempel). Een bestaande run accepteert alleen exact dezelfde CSV-bytes; ook sorteren of opnieuw opslaan in Excel kan die bytes wijzigen. Zo blijven de opgeslagen tabel, rastertegels en landelijke TIFF bij dezelfde productie horen. Zie productiemappen.

Bewerken in Excel

De meegeleverde CSV kun je gewoon in Excel openen en bewerken. Sla het bestand daarna weer op als CSV, niet als .xlsx.

Controleer bij het opslaan dat Excel ; als scheidingsteken gebruikt. Afhankelijk van je regionale instellingen kan Excel automatisch , gebruiken. Komma's binnen een bronwaarde horen bij de tekst zelf en mogen dus niet als kolomscheiding worden gebruikt.

Kolom Gebruik
Koppelmethode mapping voor een directe bronwaarde; functie voor een ingebouwde Python-regel.
Koppel-ID Verplicht en vast voor functie; mag leeg blijven voor mapping.
Bron, Bronlaag, Bronveld Ondersteunde bron, laag en attribuut voor directe koppelingen. Bij functies beschrijven ze de invoer; de BAG-identiteit wordt gecontroleerd.
Bronwaarde Precies één volledige waarde per rij, of * als vangnet.
LGB-code_binnendijks, LGB-code_buitendijks Respectievelijk de standaardcode en de buitendijkse code, bewerkbaar van 1 t/m 255; 0 blijft NoData. De twee codereeksen mogen niet overlappen.
LGB_beschrijving Bewerkbare klassenaam voor uitvoer en legenda. Dezelfde standaardcode vereist dezelfde beschrijving.
Toelichting Optionele vrije tekst, zonder invloed op verwerking.
Documentatie Optionele documentatie-URL; wordt tijdens verwerking niet opgehaald.

Pas normaal de twee codes en de beschrijving aan. Kopieer voor een nieuwe directe koppeling een mapping-rij uit dezelfde bronlaag, laat Koppel-ID leeg en vul één nieuwe bronwaarde in. Herhaal een doelcode gerust voor meerdere bronwaarden, met een consistente beschrijving. Dubbele bronwaarden binnen dezelfde bronlaag zijn niet toegestaan, ook niet bij gelijke uitvoercodes.

Let op (!). Bij regels met Koppelmethode == functie kun je alleen de LGB-code_binnendijks, LGB-code_buitendijks, LGB_beschrijving, Toelichting en Documentatie aanpassen.

De functie zelf ligt vast in de software en wordt herkend via Koppel-ID. Je kunt via de CSV dus geen nieuwe Python-functies of nieuwe rekenregels toevoegen.

Houd bij het aanpassen van codes rekening met overlap en rastervoorrang. CSV-rijvolgorde en codehoogte bepalen niet welke bron bij overlap wint. Bij aangepaste codetabellen geldt een uitzondering op de conflictregel voor bijzondere gebouwen:

  • Meerdere passende kas-, RWZI- of drinkwaterregels mogen dezelfde klasse opleveren. Zowel de standaardcodes als de buitendijkse codes moeten overeenkomen.
  • Verschillen de codeparen, dan krijgt het pand NoData. Ook de eerder bepaalde BAG-klasse vervalt.
  • Een gekoppeld gemaal samen met een andere bijzondere gebouwfunctie blijft een conflict. Ook bij gelijke codeparen krijgt het pand NoData.

De ondersteunde directe combinaties zijn:

Bron Bronlaag Bronveld
BRP brp_gewas gewascode
TOP10NL top10nl_functioneel_gebied_vlak, top10nl_functioneel_gebied_multivlak typefunctioneelgebied
BGT bgt_wegdeel, bgt_ondersteunendwegdeel bgt-functie
BGT bgt_begroeidterreindeel bgt-fysiekVoorkomen
BGT bgt_onbegroeidterreindeel, bgt_waterdeel Leeg, uitsluitend *

Een willekeurige nieuwe bron, laag of attribuut kan niet alleen door een CSV-rij worden toegevoegd. Niet-ondersteunde combinaties geven een foutmelding.

* vangt geldige bronwaarden op waarvoor geen expliciete koppeling bestaat. Expliciete waarden gaan altijd voor, ongeacht de rijvolgorde. Lege waarden, witruimte en ontbrekende waarden vallen hierbuiten. Voor BRP moet de waarde bovendien een positief geheel getal zijn. Een leeg Bronveld betekent geen attribuutfilter: alle verder geschikte objecten worden gekoppeld. Dit is alleen ondersteund voor de twee genoemde BGT-lagen en vereist Bronwaarde = *. Zie ook de functionele verwerking.

Sorteren verandert classificatie, kleuren en legendalabels niet.

Bestaande rasters worden bij --resume hergebruikt en veranderen niet mee met de CSV. Gebruik voor een nieuwe codering een nieuwe run-ID. In eigen Python-workflows blijven de overwrite-parameters beschikbaar. De BAG-controle vernieuwt bij rechtstreeks starten wel het controlebestand.

De BGT-GeoPackage moet nu ook bgt_begroeidterreindeel, bgt_onbegroeidterreindeel en bgt_ondersteunendwegdeel bevatten, naast waterdelen en wegdelen, steeds met de einddatumvelden. Een bestaand onvolledig bronbestand wordt niet automatisch opnieuw gedownload.

Voor TOP10NL zijn zowel top10nl_functioneel_gebied_vlak als top10nl_functioneel_gebied_multivlak nodig voor de terreinindeling. Beide zitten in het volledige TOP10NL-bestand. Een ontbrekende laag geeft een foutmelding; deze wordt niet stilzwijgend overgeslagen.

De uitsnede selecteert panden. Verblijfsobjecten worden daarna via de exacte pand-ID-koppeling opgehaald, ook buiten de uitsnede. Geometrie en bronwaarden blijven intact. Een verblijfsobject kan aan meerdere panden gekoppeld zijn; zijn volledige bronoppervlakte blijft bij dat object staan en wordt niet over panden verdeeld. Een pand zonder koppeling blijft eveneens zichtbaar.

Geef bounds aan de Python-controlefunctie door voor een andere uitsnede. Met overwrite=True vernieuwt u het gezamenlijke controlebestand. Sluit de laag in QGIS als het bestand daardoor vergrendeld is. Bij rechtstreeks aanroepen van main() wordt een bestaand bestand hergebruikt; gebruik main(overwrite=True) om het te vernieuwen.

Een vooraf voorbereid BGT-bestand kan aan de Python-productiefunctie met main(bgt_path=...) worden doorgegeven, of aan de CLI met --bgt-path. Deze route downloadt of converteert geen BGT. Aanvullende vlaklagen in dat bestand worden gebruikt om NoData te verklaren.

Gaten aanvullen en bronnenraster

Gebruik in een eigen Python-bewerking gap_fill_distance_m voor de gewenste zoekafstand in meters (standaard 1.0; 0 schakelt aanvullen uit). De losse en parallelle rasterfuncties hebben hiervoor gap_fill_distance_m. Zie de aanvulregels en broncodes.

De landelijke productie schrijft naast functioneel_landgebruik.tif ook functioneel_landgebruik_bronnen.tif, een bijbehorende VRT en functioneel_landgebruik_bronnen.json met bronlagen en donorinstellingen. Per tegel staat het bronnenraster als functioneel_landgebruik_bronnen.tif naast functioneel_landgebruik.tif in tiles/<tile_id>/. Een losse berekening met die standaardnaam gebruikt eveneens deze namen. Andere losse bestandsnamen behouden de oude submap bronnen/. Beide rasters hebben hetzelfde rasterrooster en NoData-waarde 0. VRT's worden uit expliciete lijsten met hetzelfde product samengesteld, zodat bronrasters en gebouw-ID's niet in het landgebruik belanden.

Gebruik een nieuwe run-ID voor de nieuwe tegelmapstructuur. Bestaande producties worden niet verplaatst of hernoemd; DEM kan geldige oude landgebruikinputs blijven lezen.

Hergebruik vereist een compleet rasterpaar met dezelfde aanvulinstellingen. Oudere tegels zonder bronraster moeten opnieuw worden berekend. Gebruik een nieuwe productie-run wanneer de zoekafstand verandert; de runparameters bewaken de consistentie bij hervatten. De lokale landsgrensbron is nodig wanneer het aanvullen ingeschakeld is.

Tijdelijk vergrendelde uitvoerbestanden

Bij toegangsweigering tijdens het vervangen van statusbestanden of publiceren van COG's probeert de productie de vervanging maximaal tien keer opnieuw, met telkens een seconde wachttijd. Het log noemt de bron, bestemming en Windows-foutcode. Blijvende toegangsproblemen worden niet genegeerd.

Een al gevalideerde tijdelijke COG blijft bij een publicatiefout bewaard. Bij hervatten kan dezelfde conversie worden hergebruikt als de invoer, exportinstellingen en het tijdelijke bestand nog overeenkomen met het checkpoint. De logging onderscheidt conversie, validatie en publicatie: 100% conversie betekent nog niet dat het eindbestand is gepubliceerd. Open tijdelijke uitvoerbestanden niet in een GIS-viewer terwijl de productie loopt.

Redactie: AI