Skip to content

Spatial variabelen

Jip Claassens edited this page Aug 17, 2026 · 3 revisions

Spatial variabelen — NVM inlezen, verrijken, exporteren

Alles in main/SourceData/NVM.dms. Dit is de GeoDMS-stap tussen R-stap 3b en R-stap 4: transacties met coördinaten komen binnen, transacties met omgevingskenmerken gaan eruit.

1. Inlezen (TableChopper)

De slim-CSV uit R/03b_export_spatial_input.R staat in de OneDrive-map EnhancedData:

NVM_1985_2023_cleaned_geocoded_<nvm_filedate>_slim.csv

TableChopper leest hem als één string en hakt hem zelf in kolommen:

  • filedata_src — hele bestand als str-storage;
  • filedata — daarvan worden komma's en quotes verwijderd (dus: geen komma's in tekstvelden verwachten; de scheidingsteken is ;);
  • count_rows = aantal \n min 1, headerline = eerste regel;
  • field/name — kolomnamen uit de header, via AsItemName tot geldige GeoDMS-itemnamen gemaakt;
  • data — per kolom ReadElems op de bodylines.

NVM_Data is de resulterende container met alle kolommen als string. Omdat de kolomindeling uit de header komt, breekt een gewijzigde kolomvolgorde in de R-export hier niet; een gewijzigde kolomnaam wel.

2. Typeren (Result)

Result zet de strings om naar getypeerde attributen en hangt er de ruimtelijke koppelingen aan:

geometry     := point_xy(x, y, rdc_meter)
rdc_10m_rel  := geometry[rdc_10m]
rdc_25m_rel  := geometry[rdc_25m]
rdc_100m_rel := geometry[rdc_100m]

Overgenomen kenmerken: obsid, de vier type-dummies, price [eur], size/lotsize [m²], trans_year/trans_month, buildingyear, nrooms, d_maintgood, bag_pand_hoogte, plus een hier afgeleide d_highrise := bag_pand_hoogte >= Hoogbouwgrens.

Twee dingen om te weten:

  • lotsize wordt null bij >= 99999 m² (sentinelwaarde uit de brondata).
  • d_highrise blijft null als bag_pand_hoogte leeg is: null propageert door de vergelijking. Dit GeoDMS-d_highrise gaat níét mee in de spatial-export — het wordt alleen gebruikt in de regiokarakteristieken, waar nulls buiten het gemiddelde vallen en het raster dus "aandeel hoogbouw onder bekende pandhoogtes" wordt. De R-pipeline definieert dezelfde variabele anders (0 bij onbekend, plus een d_hoogte_onbekend-dummy); zie de toelichting daar.

3. De omgevingsvariabelen

Elke variabele is een raster dat op de transactiecoördinaat wordt uitgelezen.

exportkolom GeoDMS-item bron grid
uai_2021 Diversen/UAi_2021_int UAI_2021.tif 100m
uai_2012_network Diversen/UAI_2012_netwerk_x100 UAI_netwerk_geschaald_2012.tif 100m
tt_500k_inw_2020_min Diversen/tt_500kinhab_min_2020 Reistijd500kInw_2020_500m_NL.tif 100m
tt_500k_inw_2024_min Diversen/tt_500kinhab_min_2024 TraveltimeTo500k_Population_2024_From_100m_Points.tif 100m
tt_trainstation_2006_min Diversen/tt_Trainstation_2006_min reistijd_minuten_station_2006.tif 100m
tt_OVknooppunten_2026_min Diversen/Reistijd_OVknooppunten_min TraveltimeToNearest_OV_Knooppunten_20260316_100m.tif 100m
d_groennabij BBG/Dominant/BBG_groen_buff BBG 2020 (CBS-bodemgebruik) 10m
fr_natuur_500m LGN/natuur_500m LGN<jaar>_m25.tif 25m
fr_natuur_2500m LGN/natuur_2500m (donut 500–2500m) idem 100m
fr_natuur_tot2500m LGN/natuur_tot2500m (schijf 0–2500m) idem 100m
fr_landbouw_500m LGN/landbouw_500m idem 25m
fr_stadsgroen_500m LGN/stadsgroen_500m idem 25m
fr_overiggroen_500m LGN/overiggroen_500m idem 25m
fr_water_500m LGN/water_500m idem 25m
fr_groen_500m BGT/fr_groen_500m GroenOpp_<datum>_Per_AdminDomain_Nederland.tif 25m
fr_groen_100m BGT/fr_groen_100m idem 25m

Reistijden

Beide 500k-reistijden zijn gemaximeerd op 120 minuten en missende cellen worden op het maximum gezet (MakeDefined(..., max(...))). Station-reistijd 0 wordt null (die nullen zijn artefacten, geen echte nulreistijden).

UAI_2021 en de twee oudste reistijden worden als uint32 geëxporteerd — bewust getrunceerd, want dat is het gedrag waarmee het bevroren 20251024-ijkpunt is geschat. De actieve variabelen (uai_2012_network, tt_500k_inw_2024, tt_OVknooppunten) gaan als float32 de deur uit; de truncatie voegde alleen kwantisatieruis toe (besluit 2026-07-15).

Groenfracties (LGN)

main/SourceData/LGN.dms berekent per groencategorie het aandeel van die categorie in een omgevingsring. Twee dingen zijn hier bewust gedaan:

  • Randcorrectie. De noemer is het LGN-gedekte oppervlak binnen de ring, niet het hele ringoppervlak. Zonder dat krijgen grens- en kustwoningen een kunstmatig lage groenfractie, want zee en buitenland zijn klasse onbekend.
  • Buitenring op 100m. De 0–2500m-fracties worden op het 100m-grid berekend (eerst categorie-fractie per 100m-cel, dan potentials). Dat houdt de kernel klein en het matcht het AdminDomain waarop de RuimteScanner de fractie in zichtjaren naspeelt.

De bron is LGN<jaar>_m25.tif, de door RSopen modus-geaggregeerde 25m-versie — bewust dezelfde bron als de RS-kant, zodat de RS-indicator in het basisjaar exact dezelfde fracties reproduceert. Celwaarden zijn LGNKlasse-indices, geen LGN-codes; de koppeling staat in main/Classifications/LGNKlasse.dms en wordt door LGN/Checks gecontroleerd.

Deze definitie moet identiek blijven aan de RSopen-kant (IsNatuur_hedonisch / IsWater_hedonisch); wat er misgaat als dat niet zo is, staat in Koppeling met RuimteScanner. Hoe de fracties in de RuimteScanner tot een euro-bedrag leiden, staat op Woningwaarde agv groenveranderingen.

Groenfractie (BGT)

fr_groen_500m / fr_groen_100m zijn het aandeel BGT-groen, exclusief cellen die volgens LGN natuur of landbouw zijn. Die uitsluiting voorkomt dubbeltelling met fr_natuur_tot2500m en haalt agrarisch grasland en bos uit de groenterm. Privaat groen (tuin, erf) telt gedempt mee via de empirische groenfractie per BGT-klasse (erf ≈ 0,35); het eigen perceel wordt in de regressie al door lnlotsize gecontroleerd.

Deze twee zijn sensitiviteiten, geen kernvariabelen — zie de specbeschrijving in R-pipeline.

4. Exporteren (export_spatial)

GeoDmsRun.exe main.dms /SourceData/NVM/export_spatial/bestand

Schrijft naar dezelfde EnhancedData-map:

NVM_1985_2023_cleaned_geocoded_<nvm_filedate>_slim_spatial.csv

;-gescheiden, kopregel hardgecodeerd in export_spatial/impl/Kopregel, nulls als lege string (MakeDefined(..., '')). Sleutel is obsid — dat is trans_id uit de R-pipeline, waarop R/04_import_spatial.R terugkoppelt.

Voeg je een variabele toe, dan moet je hem op drie plekken aanpassen: Result (attribuut), impl/Kopregel (naam) en impl/Body (waarde) — en daarna in R/04_import_spatial.R opnemen in de nodig-vector. Die vector gooit een harde fout als een kolom ontbreekt, dus een vergeten Body-regel komt vanzelf boven water.

Clone this wiki locally