Published: Aug 29, 2017 by Maarten Vroegindeweij
BGT, AHN & RD-coördinaten, GIS2BIM package
Het blijft fantastisch om te allerlei data in Revit in te laden! Er is zo veel beschikbaar. Deze keer een lange blog over allerlei zaken op het gebied van het inlezen van omgevingsinformatie.
Allereerst het resultaat:
Stap 1
-Vul locatiegegevens in(invoervelden zijn gemaakt met data-shapes package en werkbalk is gemaakt met dyno: http://prorubim.com/en/tools/dyno/)
Stap 2
Klik op ‘KadasterBAG’.
Stap 3
Haal een kop koffie.
Je hebt het BAG, het kadaster en de luchtfoto 2016 op het RD-stelsel in Revit.
Stap 4
Klik op BGT en haal nog 2 bakken koffie.
En daar is het BGT(nog niet volledig) als vectordata(lijnen en filled regions) op schaal in Revit.
In deze blog komen aan de orde:
- GIS2BIM Dynamo Package.
- Mogelijkheden voor het inladen van GIS informative.
- Locatieserver v3.
- Uitgebreider gebruik van BAG-informative.
- BGT inlezen via GML met Python.
- Luchtfoto via WMS inladen.
- Shared coördinates en RD-coördinaten.
- Ideëen en toekomst.
1. GIS2BIM Dynamo Package
Het kader van ‘delen is vermenigvuldigen’ heb ik een Github project aangemaakt waarin alle hierboven genoemde nodes staan en support files. Er zijn nog tal van verbeteringen mogelijk en noodzakelijk. Van harte uitgenodigd om mee te doen!
De package is te downloaden via de package manager in Dynamo
Documentatie is te vinden op: https://github.com/DutchSailor/GIS2BIM/wiki/Nodes-version-0.3
In de ‘extra’ map van de package zijn de voorbeeldworkspaces te vinden.
2. Mogelijkheden voor het inladen van GIS informatie
We kunnen op een aantal manieren GEO-informatie inlezen.
1 ) Via WFS(vectordata vanuit een webserver)
Voorbeeld: Kadaster, Ruimtelijke plannen, BAG
Je doet een webrequest aan een server om gegevens te ontvangen van een bepaalde regio. Je krijgt als resultaat een xml met onderandere polygonen en metadata die omgezet kunnen naar lijnen, teksten, solids enzovoorts.
2 ) Via WMS(rasterdata vanuit webserver)
Voorbeeld: Luchtfoto
Je doet een webrequest aan een server om gegevens te ontvangen van een bepaalde regio. Je krijgt als resultaat een png, jpg enz. Deze kun je in Revit inladen.
3 ) Via gedownloade xml/gml/laszip-bestanden
Voorbeeld: BGT, AHN
Je kunt de BGT in delen van 2 bij 2 km(of groter downloaden). Je krijgt dan GML-bestanden. Deze kun je inlezen en omzetten naar lijnen, teksten, solids enzovoorts.
4 ) Via WMTS(rasterdata, vooraf gegeneerde tiles)
Voorbeeld: Diverse
Lijkt op WMS. Het verschil is dat WMTS vooraf gegenereerde tiles zijn waar je er dus een x-aantal van wilt downloaden afhankelijk van de grootte van het gewenste gebied waar je in bezig bent en deze vervolgens samenvoegen.
In de GIS2BIM-package zijn voor alle methoden diverse nodes opgenomen.
3. Nieuwe locatieserver
Er is een nieuwe versie van de locatieserver gelanceerd.
https://pdokforum.geonovum.nl/t/nieuwe-versie-locatieserver-v3-is-beschikbaar/647
Deze is verwerkt in de node GetLocationdataNetherlands.
Overige verbeteringen in de GetLocation-node: Kadastraal perceel, sectie, lengtegraad en breedtegraad zijn uit te lezen.
Verder is er een node met een aantal geoservices.
4. Uitgebreider gebruik van BAG-informative
Er is er een BAG:pand en een BAG:gebruiksobject. Een pand kan meerdere gebruiksobjecten bevatten.(appartementen bijvoorbeeld) Voor de pandgeometrie willen we BAG:pand gebruiken en voor de huisnummers en onderstaande informatie BAG:gebruiksobject.
Er zijn meerdere opties om gebruik te maken van de BAG-informatie.
1) 3D families aanmaken met Dynamo, parameters aanmaken en de bovenstaande informatie hierin wegschrijven.
2) Informatie als losse text in een view plaatsen.
Optie 1 is vanuit BIM-oogpunt wenselijk, alleen nogal langzaam als je bijvoorbeeld 400 panden hebt in de omgeving. Revit gaat namelijk 400 families maken en vervolgens plaatsen. Dit heeft even wat tijd nodig. Vandaar dat beide opties soms handig zijn. Je kunt dan wel huisnummers, bouwjaar e.d. taggen en een kleur geven op basis van het bouwjaar zoals hieronder te zien is.
Optie 2 is met name handig om gewoon een situatietekening in 2D te maken.
Hierboven het resultaat van BAG:pand met teksten en filled regions.
Hierboven de dynamocode. De customnodes zijn in de GIS2BIM-package te vinden.
Het vervolg is om de informatie van de wegen e.d. in Revit te laden.
5. BGT inlezen via GML met Python
Het BGT is helaas niet als webservice beschikbaar. Het is echter wel te downloaden en in te lezen in Revit. Je kunt een deel downloaden via deze link.
Er is een node om automatisch de BGT-data te downloaden: GIS2BIM.DownloadBGTData. Hiervoor maak je gebruik van GIS2BIM.GetMortonCodeCoordinate. Deze maakt met behulp van bitshifting een mortoncode: https://en.wikipedia.org/wiki/Z-order_curve
Deze code kun je gebruiken om het desbetreffende deel van de BGT te downloaden. Vervolgens is er een node om het zip-bestand uit te pakken.
Het BGT omvat een heel aantal GML-bestanden. Voor elke laag een apart bestand:
Sommige GML-bestanden bevatten een punt en bijbehorende informatie(bomen, verkeersborden e.d.)
Andere bevatten polygonen, zoals hierboven. Dit betreft het spoor.
Het geheel gaan we omzetten met Dynamo. Het blijkt best wel een dingjetje te zijn om grote xml of gml-bestanden in Dynamo in te laden en daar bewerkingen op uit te voeren. De hierboven genoemde GML-bestanden hebben soms meer dan 100.000 of meer punten. De truc is om deze GML-bestanden te filteren op basis van een boundingbox alvorens deze om te zetten naar geometrie.
Je kunt dit in Dynamo doen met point in Polygon. Maar dan heb je eerst al geometry gemaakt voordat je deze gaat filteren. Dit is heel erg traag en het geheel loopt regelmatig vast.
Het bleek veel sneller om dit met Python te doen. Bekijk de node GIS2BIM.FilterGML om de code te bekijken.
Binnen de BGT zijn er allerlei lagen. Zowel polygonen als punten. Via deze link is te zien welke informatie in welke laag opgeslagen is.
Hieronder een tussenstand met wat nu in GIS2BIM-package zit.
Panden(filled region)
bgt_overigbouwwerk
Groen(filled region)
bgt_begroeidterreindeel
Lijnen(Detaillines, aparte lagen)
bgt_functioneelgebied
bgt_gebouwinstallatie
bgt_kunstwerkdeel
bgt_onbegroeidterreindeel
bgt_ondersteunendwegdeel
bgt_overigescheiding
bgt_scheiding
bgt_spoor
bgt_tunneldeel
Wegen bruggen en kunstwerken(filled region)
bgt_kunstwerkdeel
bgt_overbruggingsdeel
bgt_wegdeel
Water(filled region)
bgt_ondersteunendwaterdeel
bgt_waterdeel
Labels(text)
bgt_openbareruimtelabel
Puntobject(2d detailcomponent)
bgt_vegetatieobject
Nu nog niet meegenomen
bgt_bak
bgt_bord
bgt_buurt
bgt_installatie
bgt_kast
bgt_mast
bgt_ongeclassificeerdobject
bgt_openbareruimte
bgt_paal
bgt_put
bgt_sensor
bgt_straatmeubilair
bgt_waterinrichtingselement
bgt_wijk
We gaan de GML vertalen naar:
1) Filled Regions
2) Detail Lines
3) Texten
Dat ziet er als onderstaand uit:(labels werken nog niet)
Onderstaand het resultaat
Het BAG komt dus via een WFS-webrequest en de BGT via een filtering van een automatische download van de gml-bestanden.
Even het adres wijzigen. Zie daar het resultaat!
Je kunt overigens natuurlijk ook gemakkelijk families maken van de data, alleen het wordt dan snel traag. Het zijn al snel bijvoorbeeld 10.000-50.000 lijnen en componenten e.d.
6.Luchtfoto via WMS inladen!
We kunnen ook WMS data inladen.
Je kunt een webrequest formuleren, bijvoorbeeld voor het inladen van luchtfoto van 2016.
De delen van het webrequest zien er als volgt uit:
Bekijk het voorbeeld alvast via link. Werkt niet goed in Edge, wel in Firefox en Google Chrome.
Op basis van een boundingbox van RD-coördinaten maken we opnieuw een webrequest. De standaard webrequest-node van Revit functioneerd hier niet. Deze geeft namelijk direct een textfile als resultaat. We doen de webrequest daarom met Python.
En dat werkt, zie hieronder. Het bestand wordt tijdelijk ergens opgeslagen.
Vervolgens importeren we het bestand in een view. Dit ook weer met Python. Met dank aan Konrad Sobon. Zie de discussie op: http://dynamobim.com/forums/topic/is-it-possible/
Vervolgens stellen we de breedte van de rasterimage in conform de werkelijke breedte.
En vervolgens is deze op schaal en juiste positie in de view geplaatst!
Nu we het raamwerk van een WMS-request hebben kunnen we alle WMS-data die je maar kunt bedenken met 1 druk op de knop in Revit inladen.
Zoals bijvoorbeeld de CBS statistieken voor de WOZ-waarde van woningen:
Getcapabilitieslink: http://geodata.nationaalgeoregister.nl/cbsvierkanten100mv2/wms?&request=GetCapabilities&service=WMS
Resultaat:
Legenda:
7.Shared coördinates en RD-coördinaten
Aangezien al de GIS-informatie die we gebruiken op RD-coördinaten staat kunnen we ook de RD-coördinaten uitlezen. Dit kan door het Surveypoint te verplaatsen.
Ook deze zit inmiddels in een GIS2BIM-node.
En vervolgens kun je overal rd-coordinaten uitlezen.
8. Ideëen en toekomst
Wat nog meer allemaal mogelijk is:
- http://topotijdreis.nl/ met WMTS importeren(als bouwhistorie achtergrond)
- Bekijken of een pand een rijksmonument is; in een risicogebied voor funderingsproblemen ligt enz. enz.
- Topography maken op basis van ahn-pointcloud en deze voorzien van een WMS luchtfoto als rendermateriaal.
- Google API en Open Streetmap gebruiken als webrequest
- WMTS webrequest voor bijvoorbeeld infrarood luchtfoto’s.
- GEF importeren in Revit op basis van een willekeurig polygon. Dit najaar komt het dinoloket als wfs-service beschikbaar.
- In het BGT zitten definities van verkeersborden, lantaarnpalen, riooolputten, betaalautomaten, brievenbussen e.d. Je zou hier een hele serie 3D-families voor kunnen maken die automatisch geplaatst worden op basis van de desbetreffende GML.
- QGIS via een python-script gebruiken om data in te lezen.
- Locatierapportage. Bij start van een project run je een mega-script waarbij honderden WMS en WFS-services bevraagd gaan worden. Onder andere geluid, natura2000, milieu, vleermuizen enzovoorts. Je zou hier nog een risico-analyse aan kunnen koppelen.
- KLIK-data inladen en omzetten naar vectordata.
Handige leerpunten. Ik ben nu steeds meer dingen in Python aan het doen in plaats van in Dynamo. Een paar tips:
1) IronPython 2.7 is niet hetzelfde als Python 2 of 3. IronPython is implementatie van Python voor .NET. Dat betekend dat je heel Python libraries niet kunt gebruiken in IronPython.
2) Een zeer handige manier om je Pythonscript te testen is PyCharm. https://www.jetbrains.com/pycharm/ Let op dat je de interpreter op IronPython 2.7 zet en dus niet op Python 2 of 3.
3) Je kunt daardoor wel gebruik maken van de gehele .NET omgeving. Bijvoorbeeld de ZipFile Class.
https://msdn.microsoft.com/en-us/library/system.io.compression.zipfile%28v=vs.110%29.aspx
Om gebruik te maken van .NET moet je via clr.AddReference the desbetreffende Assembly en Namespace aanroepen.
clr.AddReference(“ASSEMBLY”)
from NAMESPACE import CLASS