MarcoDuiker / QGIS_BGT_Import

The QGIS BGT Import plugin for importing Dutch BGT data.
Other
4 stars 1 forks source link

veld plus-type heeft verkeerde lengte #20

Closed Harm-Olthof closed 11 months ago

Harm-Olthof commented 11 months ago

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

MarcoDuiker commented 11 months ago

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?

Harm-Olthof commented 11 months ago

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

MarcoDuiker commented 11 months ago

Dank. Kun je deze zinsnede wat verduidelijken?

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

Harm-Olthof commented 11 months ago

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>
MarcoDuiker commented 11 months ago

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

Harm-Olthof commented 11 months ago

@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

MarcoDuiker commented 11 months ago

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.

Harm-Olthof commented 11 months ago

@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

MarcoDuiker commented 11 months ago

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

Harm-Olthof commented 11 months ago

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

MarcoDuiker commented 11 months ago

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?

Harm-Olthof commented 11 months ago

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).

MarcoDuiker commented 11 months ago

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.

Harm-Olthof commented 11 months ago

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....

Harm-Olthof commented 11 months ago

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....

MarcoDuiker commented 11 months ago

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?

MarcoDuiker commented 11 months ago

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

Harm-Olthof commented 11 months ago

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