MarcoDuiker/QGIS_BGT_Import

veld plus-type heeft verkeerde lengte

Closed this issue · 18 comments

Het veld "plus-type" in bgt_functioneelgebied_V heeft als type TEXT(10). Te zien in QGIS, maar ook bijv met de query:
SELECT sql FROM sqlite_master WHERE type = 'table' AND name = 'bgt_functioneelgebied_V'
Maar wanneer we naar de echte data kijken in de geopackage komen er langere waarden voor:
SELECT distinct "plus-type" , length("plus-type") as veldlengte FROM bgt_functioneelgebied_V where length("plus-type")>10
Dan zien we dan maar 1 waarde een lengte onder de 10 heeft (voor een bepaald BGT gebied):

waardeOnbekend 14
infrastructuur waterstaatswerken 32
recreatie: park 15
bedrijvigheid 13
begraafplaats 13
recreatie: camping 18
Een Geopackage is een SQLITE database en sqlite gaat anders om met de definitie in het create statement vs de waarden (zie: https://www.sqlite.org/flextypegood.html (een indirect gevolg van het ontstaan van sqlite als Tcl-applicatie).
Is het mogelijk de typen aan te passen zodat de waarden er inpassen? Want als je met ogr2ogr delen van de geopackage verder verwerkt levert dit problemen op. (PG: Truncated plus-type field value, it was too long.).
Het makkelijkste is trouwens om alle velden met type TEXT(), het type TEXT te geven.
Ik heb alleen naar "plus-type" in bgt_functioneelgebied_V gekeken, maar ongetwijfeld treedt dit probleem op bij meerdere tabellen en velden.
Groeten,
Harm

Dit probleem is al opgelost in de .gfs bestanden in master.

Deze zijn nog niet meegegaan in de laatste release omdat ze nog niet getest zijn.

Ben jij wellicht in de gelegenheid deze te testen?

Hallo Marco,
mijn testgebied is een klein, agrarisch gebied in Groningen (Middag-Humsterland). Vrijwel alles gaat goed met de gfs bestanden uit master, behalve bgt_functioneelgebied_V: naam -> 120 (in dit gebied is iig een naam van 55 karakters).
Groeten,
Harm

Dank. Kun je deze zinsnede wat verduidelijken?

bgt_functioneelgebied_V: naam -> 120 (in dit gebied is iig een naam van 55 karakters).

Zeker!
Bestand: bgt_functioneelgebied_V.gfs
Nu in master (zie regel 90):

<PropertyDefn>
   <Name>naam</Name>
   <ElementPath>naam</ElementPath>
   <Type>String</Type>
   <Width>25</Width>
 </PropertyDefn>

Maar er komt in mijn proefgebied een naam voor met 55 karakters: select naam, max(length(naam)) from bgt_functioneelgebied_V
Aangepast naar (120 is een gok: ik heb het niet opgezocht in de BGT catalogus, maar mijn proefgebied is maar klein).

  <PropertyDefn>
     <Name>naam</Name>
     <ElementPath>naam</ElementPath>
     <Type>String</Type>
     <Width>120</Width>
   </PropertyDefn>

De aangepaste gfs bestanden zijn opgenomen in release 3.18. Deze komt na goedkeuring door qgis.org beschikbaar in de qgis plugins repository.

@MarcoDuiker sorry Marco, ik was er nog niet aan toe gekomen alles nog even te controleren en een nette issue aan te maken, maar bij bovenstaand keek ik naar de attrihuutwaarden. Later kwam ik er achter dat er records zijn zonder geometrie. Met als query: select $t as table_name, coalesce(ST_GeometryType(geom), 'NULL') as GeomType, count(*) from bgt_weginrichtingselement_V group by ST_GeometryType(geom)
Vind ik:

{table_name bgt_bak_P GeomType MULTIPOINT count() 60}
{table_name bgt_begroeidterreindeel_L GeomType NULL count(
) 614}
{table_name bgt_begroeidterreindeel_V GeomType NULL count() 77780}
{table_name bgt_bord_P GeomType MULTIPOINT count(
) 4097}
{table_name bgt_functioneelgebied_V GeomType NULL count() 302}
{table_name bgt_gebouwinstallatie_V GeomType NULL count(
) 1326}
{table_name bgt_installatie_P GeomType MULTIPOINT count() 6}
{table_name bgt_kast_P GeomType MULTIPOINT count(
) 197}
{table_name bgt_kunstwerkdeel_L GeomType NULL count() 4591}
{table_name bgt_kunstwerkdeel_P GeomType MULTIPOINT count(
) 9}
{table_name bgt_kunstwerkdeel_V GeomType NULL count() 1632}
{table_name bgt_mast_P GeomType MULTIPOINT count(
) 3}
{table_name bgt_onbegroeidterreindeel_L GeomType NULL count() 21}
{table_name bgt_onbegroeidterreindeel_V GeomType NULL count(
) 30137}
{table_name bgt_ondersteunendwaterdeel_V GeomType NULL count() 46921}
{table_name bgt_ondersteunendwegdeel_L GeomType NULL count(
) 154}
{table_name bgt_ondersteunendwegdeel_V GeomType NULL count() 26900}
{table_name bgt_ongeclassificeerdobject_L GeomType NULL count(
) 125}
{table_name bgt_ongeclassificeerdobject_V GeomType NULL count() 128}
{table_name bgt_openbareruimtelabel_P GeomType MULTIPOINT count(
) 11029}
{table_name bgt_overbruggingsdeel_V GeomType NULL count() 1629}
{table_name bgt_overigbouwwerk_V GeomType NULL count(
) 1461}
{table_name bgt_overigescheiding_L GeomType NULL count() 264}
{table_name bgt_paal_P GeomType MULTIPOINT count(
) 4458}
{table_name bgt_pand_P GeomType MULTIPOINT count() 32538}
{table_name bgt_pand_V GeomType NULL count(
) 60334}
{table_name bgt_put_P GeomType MULTIPOINT count() 1812}
{table_name bgt_scheiding_L GeomType NULL count(
) 24078}
{table_name bgt_scheiding_V GeomType NULL count() 2110}
{table_name bgt_sensor_P GeomType MULTIPOINT count(
) 78}
{table_name bgt_spoor_L GeomType NULL count() 140}
{table_name bgt_straatmeubilair_P GeomType MULTIPOINT count(
) 240}
{table_name bgt_tunneldeel_V GeomType NULL count() 14}
{table_name bgt_vegetatieobject_L GeomType NULL count(
) 1790}
{table_name bgt_vegetatieobject_P GeomType MULTIPOINT count() 8859}
{table_name bgt_vegetatieobject_V GeomType NULL count(
) 1406}
{table_name bgt_waterdeel_V GeomType NULL count() 35672}
{table_name bgt_waterinrichtingselement_L GeomType NULL count(
) 1652}
{table_name bgt_waterinrichtingselement_P GeomType MULTIPOINT count() 2370}
{table_name bgt_wegdeel_L GeomType NULL count(
) 2}
{table_name bgt_wegdeel_V GeomType NULL count() 70655}
{table_name bgt_weginrichtingselement_L GeomType NULL count(
) 3123}
{table_name bgt_weginrichtingselement_V GeomType NULL count(*) 638}

Nogmaals: ongeverifieerd, maar er missen iig in mijn setup een flink aantal geometrieen

Eerlijk gezegd kan ik uit bovenstaande niet opmaken of er iets misgaat, en wat dan.

Ik wil er best naar kijken, maar dan graag een duidelijke en reproduceerbare melding met een bijbehorende dataset.

@MarcoDuiker dit betekent dat er in de tabel bgt_waterdeel_V GeomType 35672 records zitten met een lege geometrie. (alleen attribuut waarden).:
{table_name bgt_waterdeel_V GeomType NULL count() 35672}
Zie dit extract: https://bestandendelen.pleio.nl/?s=download&token=ba26726c-d030-46c0-ab60-cef7e13be9b7

Dat lijkt me prima. Bij mijn weten zijn dat de lijngeometrieen.

als er geen vlakgeometrieen zijn, verwacht ik 0 records in de tabel bgt_waterdeel_V , maar er zitten 35672 records in.

Natuurlijk zijn er wel vlak geometrieeen.
Da's nu het hele punt. Er zijn zowel vlak als lijn geometrieen.
De attribuuttabel toont alle record, zowel in de lijnen als vlakken laag. Alleen in de vlakken laag, zijn de geometrieen voor de lijnen leeg en vice versa.

Heb je de help wel gelezen?

Ik heb blijkbaar de help niet gelezen (of zolang geleden dat ik me het niet herinner). Sorry!
Voor mij is het een heel verwarrend datamodel zo. Ik voer zelf nu al een nabewerking uit waarbij ik per objectklasse maar 1 tabel gebruik met alle geometrietypen erin (QGIS splitst het wel uit.). Maar als het gewoon vanuit jou kant een weloverwogen ontwerpbeslissing was: prima. Excuses voor de verwarring dan en dan zouden de gfs bestanden goed moeten zijn (iig voor mijn proefgebied).

Er is zeker geen sprake van een weloverwogen ontwerpbeslissing van mijn kant.
Dit is de manier waarop OGR en QGIS omgaan met meerdere geometrietypen in 1 bestand.

Ik kan niet zeggen dat ik daar heel enthousiast over ben, maar dat ligt verder buiten mijn invloedsfeer.

Ik gebruik een combi van -overwrite en -append en het generiek geometry datatype.
(Aangepast) voorbeeld van schrijven naar GPKG ( bronbestand bgt_20230719tmp.gpkg=>de gepackage die BGT_Import produceert):
ogr2ogr --config CPL_DEBUG ON -overwrite -skipfailures -f "GPKG" bgttest.gpkg -nln bgt_vegetatieobject -lco LAUNDER=no -nlt GEOMETRY -spat 206912 540346 278026 621876 -spat_srs EPSG:28992 -a_srs EPSG:28992 -t_srs EPSG:28992 -where "eindregistratie is NULL" bgt_20230719tmp.gpkg bgt_vegetatieobject_L
ogr2ogr --config CPL_DEBUG ON -append -skipfailures -f "GPKG" bgttest.gpkg -nln bgt_vegetatieobject -nlt GEOMETRY -spat 206912 540346 278026 621876 -spat_srs EPSG:28992 -a_srs EPSG:28992 -t_srs EPSG:28992 -where "eindregistratie is NULL" bgt_20230719tmp.gpkg bgt_vegetatieobject_P
ogr2ogr --config CPL_DEBUG ON -append -skipfailures -f "GPKG" bgttest.gpkg -nln bgt_vegetatieobject -nlt GEOMETRY -spat 206912 540346 278026 621876 -spat_srs EPSG:28992 -a_srs EPSG:28992 -t_srs EPSG:28992 -where "eindregistratie is NULL" bgt_20230719tmp.gpkg bgt_vegetatieobject_V

Zou ook met GML->GPKG moeten werken....

Ik gebruik een combi van -overwrite en -append en het generiek geometry datatype.
(Aangepast) voorbeeld van schrijven naar GPKG ( bronbestand bgt_20230719tmp.gpkg=>de gepackage die BGT_Import produceert):
ogr2ogr --config CPL_DEBUG ON -overwrite -skipfailures -f "GPKG" bgttest.gpkg -nln bgt_vegetatieobject -lco LAUNDER=no -nlt GEOMETRY -spat 206912 540346 278026 621876 -spat_srs EPSG:28992 -a_srs EPSG:28992 -t_srs EPSG:28992 -where "eindregistratie is NULL and geom is not null" bgt_20230719tmp.gpkg bgt_vegetatieobject_L
ogr2ogr --config CPL_DEBUG ON -append -skipfailures -f "GPKG" bgttest.gpkg -nln bgt_vegetatieobject -nlt GEOMETRY -spat 206912 540346 278026 621876 -spat_srs EPSG:28992 -a_srs EPSG:28992 -t_srs EPSG:28992 -where "eindregistratie is NULL and geom is not null" bgt_20230719tmp.gpkg bgt_vegetatieobject_P
ogr2ogr --config CPL_DEBUG ON -append -skipfailures -f "GPKG" bgttest.gpkg -nln bgt_vegetatieobject -nlt GEOMETRY -spat 206912 540346 278026 621876 -spat_srs EPSG:28992 -a_srs EPSG:28992 -t_srs EPSG:28992 -where "eindregistratie is NULL and geom is not null" bgt_20230719tmp.gpkg bgt_vegetatieobject_V
Zou ook met GML->GPKG moeten werken....

Het is me niet duidelijk wat je hiermee precies bedoelt.

Als je direct correct kunt converteren vanuit gml (wat imho niet kan), waar heb je dan de plugin voor nodig?

Of bedoel je hier te zeggen dat ik mbv het toevoegen van een attribuutilter moet voorkomen dat er null geometrieen in het resutaat komen?

ik heb daartoe een poging gedaan in master. Wellicht kun je uitproberen of dat helpt.

Dank! Dat levert helaas fouten op (voor alle objectklassen):
2023-08-01T22:22:23 INFO Importing from BGT-zip: bgt_waterdeel.gml
2023-08-01T22:22:23 INFO Importing from BGT-zip: ...bgt_waterdeel.gml_V
2023-08-01T22:22:23 INFO Succesfully opened: bgt_waterdeel.gml_V
2023-08-01T22:22:23 WARNING Error importing: bgt_waterdeel.gml_V "geom" not recognised as an available field.

Ik vermoed dat je in dit geval waarschijnlijk: geometrie2dWaterdeel is not NULL had moeten doen ipv 'geom' Dit werkt iig:
ogr2ogr --config CPL_DEBUG ON -overwrite -skipfailures -f "GPKG" bgttest.gpkg -nln bgt_waterdeel -a_srs EPSG:28992 -oo GFS_TEMPLATE="C:\Users\HarmOlthof\AppData\Roaming\QGIS\QGIS3\profiles\default\python\plugins\BGTImport\bgt_utils\gfs\bgt_waterdeel_V.gfs" -nlt CONVERT_TO_LINEAR -nlt GEOMETRY -nlt PROMOTE_TO_MULTI -where "eindregistratie is NULL and geometrie2dWaterdeel is not null" bgt_waterdeel.gml