Laatst bijgewerkt: 20 maart 2025
- download van BGT de objecten als GML bestand.
https://app.pdok.nl/lv/bgt/download-viewer/
– markeer een gebied (in ons geval het Noordereiland)
– bij de features schakelen we alles uit behalve ‘Vegetatieobject’
- maak nieuwe database (naam demo)
installeer Postgis extensie
Toelichting
– omdat we werken met spatial data moet je in Postgres
de Postgis extensie installeren
- laad het GML bestand in een Postgres database met ogr2ogr.
Navigeer naar het ogr2ogr programma
– open OSGeo4W-shell (vanuit het start menu)
– voer uit: cd C:\Program Files\QGIS 3.28.2\bin
ogr2ogr -update -append -f "PostgreSQL" PG:"host=localhost port=5432 dbname=demo user=postgres password=**** active_schema=public" "C:\Users\afdmu\Downloads\extract\bgt_vegetatieobject.gml" -progress -t_srs EPSG:28992
Opmerkingen
ogr2ogr is een opensource tool waarmee data geconverteerd kan worden tussen verschillende bronnen.
ogr2ogr maakt onderdeel uit van GDAL en kan zelfstandig gedownload en geïnstalleerd worden.
De GDAL library wordt ook automatisch meegeleverd met QGIS. De srid is (mogelijk) verloren gegaan tijdens de import
Controleer het import resultaat als volgt:
select gml_id,
plus_type,
geometrie2dvegetatieobject,
st_srid (geometrie2dvegetatieobject),
st_astext (geometrie2dvegetatieobject)
from solitaryvegetationobject
;
Indien er geen srid getoond worden kunnen we deze als volgt herstellen
UPDATE solitaryvegetationobject
SET geometrie2dvegetatieobject = ST_SetSRID(geometrie2dvegetatieobject, 28992)
;
- We moeten de z-waarde berekenen.
Download het relevante deel van AHN4.
https://service.pdok.nl/rws/ahn/atom/dtm_05m.xml
– download het relevante gebied
- De z-waarde kunnen we berekenen met behulp van
QGIS en een klein een python scriptje.
Genereer met onderstaande sql statement de
input voor dit python script.
De output van onderstaand bewerking wordt
de input voor het python script. In deze tutorial
richten we ons op punt-objecten.
create table qgis_input_file
as
select 'QgsPointXY('|| ST_X(geometrie2dvegetatieobject)||', '||ST_Y(geometrie2dvegetatieobject)||'),'
from solitaryvegetationobject
where ST_GeometryType(geometrie2dvegetatieobject) = 'ST_Point'
;
- Merk op dat we vanuit de BGT alleen een x en een
y coördinaat hebben en dat de z (hoogte) waarde
nog ontbreekt.
- Je kunt de uitkomst kopiëren en plakken in het python script.
Wanneer er sprake is van grote hoeveelheden dan kun je met behulp van ogr2ogr een csv dump maken.
ogr2ogr -f "CSV" C:\Users\afdmu\Downloads\QGIS_input_file.csv PG:"host=localhost port=5432 dbname=demo user=postgres password=**** active_schema=public" -sql "SELECT * FROM qgis_input_file" -progress
Download het python script hier
- open QGIS
– kaartlagen > Laag toevoegen > rasterlaag toevoegen
– kies de rasterlaag die we zojuist gedownload hebben van PDOK
– ‘ctrl-alt-p’ om een python console te openen
– click op het icoontje ‘editor tonen’
– voer het script uit
- Het resultaat zal er ongeveer als volgt uitzien:
INSERT INTO qgis_import (geom, scale, rotation, model) VALUES (ST_GeomFromText(‘POINT(108756.658 513904.316 0.08529999852180481)’, 28992), 10, 10, ‘tree.glb’);
INSERT INTO qgis_import (geom, scale, rotation, model) VALUES (ST_GeomFromText(‘POINT(108755.762 513904.519 0.12210000306367874)’, 28992), 10, 10, ‘tree.glb’);
INSERT INTO qgis_import (geom, scale, rotation, model) VALUES (ST_GeomFromText(‘POINT(108820.742 513850.342 0.06159999966621399)’, 28992), 10, 10, ‘tree.glb’);
Toelichting:
het script genereert ‘INSERT’ opdrachten voor QGIS. QGIS verrijkt onze data met de z-waarden die we weer moeten importeren in Postgres. Er volgt later nog een actie.
- maak in Postgres wederom een hulptabelletje.
CREATE TABLE IF NOT EXISTS public.qgis_import
(
id integer,
geom geometry(PointZ,28992),
scale double precision,
scale_non_uniform double precision[],
rotation double precision,
model character varying,
tags json)
;
- voer het INSERT script uit in Postgres
Merk op dat het INSERT script een x, y én een z-waarde bevat.
- Alle voorgaande bewerkingen zijn gebaseerd op het projectiestelsel EPSG:28992.
Immers; de BGT- en het AHN bestand die aangeboden worden door PDOK zijn gebaseerd op EPSG:28992
Cesium (de 3D viewer) verwacht echter EPSG:4326.
Daarom moeten we nog een transformatie uitvoeren.
We doen dit wederom in een nieuwe tabel. De ST_transform functie zorgt ervoor dat EPSG:28992 geconverteerd wordt naar EPSG:4326
create table tiling_table
as
select id
, ST_transform (geom, 4326) geom
, scale
, scale_non_uniform
, rotation
, model
, tags
from qgis_import
;
- controleer het resultaat met behulp van onderstaand sql-statement
– ST_AsText zorgt ervoor dat de binaire geometry waarde wordt getoond als text
– ST_SRID zorgt ervoor dat het projectstelsel getoond wordt behorende tot het veld
– ST_GeometryType zorgt ervoor dat het type geometrie getoond wordt
select ST_AsText(geom), ST_SRID(geom)
, ST_GeometryType(geom)
from tiling_table
limit 100
;
- Voorzie deze tabel van een index. Dit verbetert de performance enorm.
CREATE INDEX geom_idx
ON tiling_table
USING GIST (geom);
De tabel ’tiling_table’ vormt de input voor het programma i3dm.export
- De z-waarde bepaling is niet in alle gevallen gelukt.
Het gedownloade BGT-gebied komt niet helemaal overeen
met het gedownloade AHN4 bestand.
Verwijder de records zonder z-waarde (daar kan het i3dm programma
niet mee omgaan)
delete from tiling_table
where st_astext (geom)='POINT Z (NaN NaN NaN)'
;
- download i3dm vanaf https://github.com/Geodan/i3dm.export
– download ZIP
– Prerequisite: .NET 8.0 SDK
– installeer
$ dotnet tool install -g i3dm.export
- voer het i3dm programma uit
vanuit de geinstalleerde executable:
$ i3dm.export -c "Host=localhost;Username=postgres;Password=postgres;Database=test;Port=5432" -t public.tiling_table -g 1000 -o "C:\Users\afdmu\Downloads\tiles\"
- in de output folder vinden we 2 folders en een json file
- indien je op je computer een webserver hebt geïnstalleerd zoals IIS (Windows van Microsoft), Apache, nodejs of nginx dan kun je de output plaatsen in de www folder van je webserver.
Je kunt de tileset.json bekijken door in je webbrowser de localhost url te bevragen:
http://localhost:5173/…/…/tileset.json
- indien je de tileset op het world wide web wilt delen dan heb je een aantal opties.
– je kunt je eigen laptop zo configueren dat de tilesets bereikbaar zijn vanaf het www.
Je computer moet dan altijd aan staan. Deze optie is niet aan te raden. Ook met het oog op beveiliging.
– je kunt ook gebruik maken van een hosting firma zoals hostinger.com, strava, hosting.nl e.d.
Deze firma’s voorzien – afhankelijk van het hosting pakket – vaak in SSL beveiliging, backups, upgrades e.d.
Van deze optie maakt 3dtilesnederland.nl gebruik
Plaats in dit geval de bestanden via ftp of soortgelijk middel op de server van de hosting firma en vervolgens zijn de bestanden zijn beschikbaar vanaf het www.
- om het uiteindelijke resultaat te bekijken kun je naar de ‘quick start guide > Cesium’ gaan.
volg daar de korte stappen en plak de url van jouw nieuwe tileset in de constante tileset
const tileset = await Cesium.Cesium3DTileset.fromUrl(
"... jouw tileset... .tileset.json"
);