tag:blogger.com,1999:blog-18820066226615450292024-02-08T02:48:12.053+01:00DEMO-DAMOIntegrale bouwstenen voor informatiesystemen bij waterbeheerdersUnknownnoreply@blogger.comBlogger23125tag:blogger.com,1999:blog-1882006622661545029.post-89010882206160341122018-10-08T00:42:00.000+02:002018-11-10T12:26:11.324+01:00Watersysteem: Connecting-The-Dots<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
In de voorgaande berichten is gekeken naar de topografische water- en kunstwerk objecten die in de Basisregistratie Grootschalige Topografie (BGT) aanwezig zijn en iedere waterbeheerder dient te gebruiken in haar processen. De BGT geeft echter het verband tussen deze objecten niet weer. Stel je gooit een emmer water in een ‘waterdeel’, dan kan de BGT niet aangeven waar het heen stroomt. Als waterbeheerder zal je dat wel willen weten.</div>
<a name='more'></a><br />
Ten behoeve van waterbeheersingstaken worden al eeuwen kaarten en registers bijgehouden met waterlopen en kunstwerken. Enkele decennia geleden deed de computer zijn intrede en zijn deze registers letterlijk geautomatiseerd, dat wil zeggen inclusief methodieken, procedures en handigheidjes (zelfs kaartbladindelingen) die voor papieren registers destijds zeer relevant waren.<br />
<br />
Vandaag de dag is het mogelijk bijna real-time inzicht te krijgen in het watersysteem en gaat de opzet van registers wat inhoud en functie betreft veranderen. Ook al omdat als basis de BGT gebruikt moet worden, zodat iedereen (overheid en maatschappij) telkens over dezelfde objecten spreekt.<br />
<br />
Van een proefgebied met een oppervlak van 150.000 ha. zijn 100.000 waterdelen en kunstwerkdelen uit de BGT in een DEMO database geladen. Alle objecten kunnen in QGIS gevisualiseerd worden als punt en soms ook als vlak:<br />
<span id="docs-internal-guid-8d9ac7b7-7fff-9555-7b10-453b078b6e14" style="font-weight: normal;"></span><br />
<br />
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"><img height="407" src="https://lh4.googleusercontent.com/ncZrDm0rMfXeiawpezO-trZvMNkuPdgd9Om7MzddhTkacuPuailgg2YOD92f1qSnDg-BPLpq8x94leGyEKmgIdRxeJAZcKTfWjieuzwwlaLZlXFFx8Jl2qzOOAqpgxe5m-6SWsP4" style="-webkit-transform: rotate(0.00rad); border: none; transform: rotate(0.00rad);" width="602" /></span></div>
<b style="font-weight: normal;"><br /></b>
<br />
Een watersysteem is eigenlijk een netwerk van verbonden <i>watervakken</i> en -<i>knooppunten</i>.<br />
<br />
Op de traditionele manier is het opzetten van zo’n register een project van vele manjaren. Substantieel onderdeel van ieder project is de zorgvuldige registratie van data in een GIS systeem. Bij de uitwerking wordt zoveel mogelijk informatie vastgelegd. In de praktijk blijkt veel informatie arbitrair te zijn of zoveel vragen op te roepen dat het eigenlijk desinformatie is.<br />
<br />
Veel van deze ‘informatie’ in een GIS systeem is ook niet meer zo relevant als deze real-time uit andere systemen afgetapt kan worden.<br />
<br />
In de DEMO omgeving wordt om deze reden getracht om <i>lean-and-mean</i> een watersysteem netwerk op te zetten op basis van <i>demo.waterdeel</i> en <i>demo.kunstwerkdeel</i> (zie eerdere berichten). Helaas niet volledig geautomatiseerd, maar het is wel eenvoudig <i>connecting-the-dots</i> geworden waarbij telkens een lijn getekend wordt over een aantal punten die bij elkaar horen. Voor het vastleggen van afstanden en een prettig kaartbeeld volgt de lijn zoveel mogelijk de waterdelen. Met wat hulp en standaard instellingen van QGIS is het invoeren van een watersysteem simpel en supersnel te doen:<br />
<span style="font-weight: normal;"></span><br />
<span style="font-family: "arial"; font-size: 14.6667px; white-space: pre;"><br /></span>
<img height="387" src="https://lh4.googleusercontent.com/4IurlPw2jX70Wx-kG_382zakujHDkqVoHtufnzykibqBId8JITSoxBGfTL3dClK-Z839rdeZAn5Ex-H3ON9Azu_w70SQs17gfm2gXERCx9a-nYN1jz52zCB1NgOi-jVqtZbwXIlu" style="border: none; font-family: arial; font-size: 11pt; transform: rotate(0rad); white-space: pre;" width="602" /><br />
<br />
Er is in PostgreSQL een apart databaseschema gemaakt met daarin twee ‘netwerk’ objecten (specialisaties van <i>demo.object</i>, dus incl. metadata, historie, archivering, domeinen, etc..):<br />
<ul>
<li><b>waterknooppunt</b></li>
<li><b>watervak</b></li>
</ul>
Zo maar even wat kenmerken die later een rol kunnen spelen in business rules (bijvoorbeeld voor bewaken datakwaliteit of geautomatiseerd afleiden van relaties):<br />
<br />
De locatie van een <i>waterknooppunt</i> (punt) bevindt zich altijd:<br />
<ul>
<li>in een waterdeel (vlak), om en nabij het begin- of eind van dat waterdeel</li>
<li>in een waterdeel (vlak), op een splitsing van water</li>
<li>ins blaue hinein (niet BGT gerelateerd)</li>
</ul>
<div>
De tussenpunten van een <i>watervak</i> (lijn) liggen altijd:</div>
<ul>
<li>op locaties (punt) van waterdelen</li>
<li>op locaties (punt) van kunstwerken</li>
<li>globaal op waterdelen (vlak)</li>
<li>ins blaue hinein (niet BGT gerelateerd)</li>
</ul>
Topologische restricties:<br />
<ul style="margin-bottom: 0pt; margin-top: 0pt;">
<li>watervakken overlappen elkaar niet</li>
<li>waterknooppunten liggen niet op elkaar </li>
<li>watervakken beginnen en eindigen in waterknooppunten</li>
<li>waterknooppunten liggen op begin- en eindpunten van watervakken</li>
</ul>
<div>
<br />
De restricties worden niet vooraf afgedwongen, maar real-time of achteraf gecontroleerd.<br />
Als een ' fout' wordt gemaakt of geconstateerd, blokkeert dat het productieproces niet. Uiteindelijk moeten alle fouten er wel uitgehaald worden.<br />
<br /></div>
<div>
<div>
That’s it. Meer afspraken zijn niet nodig.</div>
<div>
<br /></div>
<div>
De punten en lijnen vormen samen een netwerk zonder toegevoegde kennis, een lege kapstok. Aanvankelijk heeft het alleen waarde om te kunnen bepalen of 'iets' nu wel of niet deel uitmaakt van het watersysteem. Het netwerk krijgt pas meerwaarde als aan de punten en lijnen <i>measures</i> zoals afstand, stroomrichting, verhang gekoppeld worden. Hiermee kunnen complexe netwerkanalyses gedaan worden. Maar de <i>measures </i>worden pas toegevoegd op het moment dat er een informatievraag ligt waar het aan bij kan dragen.</div>
<div>
<br /></div>
<div>
De genoemde topologische restricties dragen bij aan de kwaliteit van het netwerk. Zij kunnen op meerdere manieren afgedwongen worden.<br />
<br />
In PostgreSQL kunnen de objecten van meet af aan topologisch gemodelleerd worden (in nodes, edges en faces), maar dit wordt al snel erg complex. Het is veel handiger om <i>simple-features </i>(punten, lijnen, vlakken) te gebruiken, daarmee kan in QGIS immers ook topologie afgedwongen worden. De keuze staat vrij, de enige eis is dat de data in de database straks te interpreteren is als een wiskundige <a href="https://nl.wikipedia.org/wiki/Grafentheorie">graaf</a>.</div>
<div>
<br /></div>
<div>
De komende tijd wordt om wat ervaring op te doen in QGIS een denkbeeldig primair watersysteem netwerk gemaakt van het proefgebied. De bevindingen worden weer gedeeld.</div>
<div>
<br /></div>
</div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<br /></div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-1882006622661545029.post-41851114692944747192018-10-04T14:38:00.002+02:002021-04-29T12:23:45.303+02:00demo.kunstwerkdeel (duiker)De Basisregistratie Grootschalige Topografie (BGT) bevat veel gegevens over kunstwerkdelen (brugen, stuwen, duikers, ..). Helaas mankeert er nog het een en ander aan waardoor deze kunstwerkdelen pas na een bewerking gebruikt kunnen worden in eigen informatiesystemen. In de nabije toekomst zullen onderstaande handelingen hopelijk overbodig zijn.<br />
<br />
<a name='more'></a><br />
<br />
Zie hieronder een BGT kaartje. De sloten links en rechts van de weg zijn met elkaar verbonden via een duiker die onder de weg doorloopt. Deze duiker is in de BGT kennelijk opgeknipt in 3 zelfstandige duiker-objecten. Een waterbeheerder wil in zijn eigen informatiesysteem uiteraard maar één duiker, conform de werkelijkheid buiten. Welke van de drie dat zou moeten zijn is niet duidelijk.<br />
<br />
<span id="docs-internal-guid-871a724b-7fff-6dce-d8c2-8f2f00b32b92"><span style="font-family: "arial"; font-size: 11pt; vertical-align: baseline; white-space: pre-wrap;"><img height="424" src="https://lh3.googleusercontent.com/qCBN1AeLXcEzIsXmPSuXU1jBjCydpTcaIdgimv5f03qjvXQkMrMfg2HYbXeO28nbylRsUOondawUQjT44K4LvINBPKebzdbXQoQFhylOsIoMBs4X-LVFnDdvcdfBKz7ghArEQ144" style="border: none; transform: rotate(0rad);" width="602" /></span></span><br />
<br />
<br />
De duiker in het plaatje is kennelijk topologisch doorsneden met de wegdelen. Daarbij worden duiker, weg en bermen opgeknipt in kleinere objecten. Soms is dat opknippen wenselijk, maar hier zeker niet. Voor vlakken onderling is het toepassen van topologie terecht en conform afspraak. Sloten en wegen overlappen elkaar immers niet (<i>opdelend </i>principe). Een duiker is voor een terrein functioneel gezien niet relevant, de aanwezigheid is daarentegen wel van belang voor de inrichting van het terrein/weg/spoorbaan/.. (<i>indelend</i> principe).<br />
<br />
Hier een ander voorbeeld van een duiker waarbij het opdelende principe onterecht is toegepast:<br />
<br />
<span id="docs-internal-guid-283071bb-7fff-d858-98e6-64f61d181397"><span style="font-family: "arial"; font-size: 11pt; vertical-align: baseline; white-space: pre-wrap;"><img height="347" src="https://lh4.googleusercontent.com/DW6uFVlH6TGTsZWYhoD2LoDe67mBxQX-CVBMgylD74gPpsUauPh5u1iJ9KNu0wgMAyreVuRk-jE5t6bwuokOa37rkDmHNz60BYX9CIMu2dsafjPR3VebDCw_4rCYDxRyfkC2VG7N" style="-webkit-transform: rotate(0.00rad); border: none; transform: rotate(0.00rad);" width="371" /></span></span><br />
<br />
Zo zou het moeten zijn:<br />
<br />
<span id="docs-internal-guid-4d06c78e-7fff-0dcc-b770-ef19b7af4c81"><span style="font-family: "arial"; font-size: 11pt; vertical-align: baseline; white-space: pre-wrap;"><img height="217" src="https://lh6.googleusercontent.com/J2uFi4OXN5RZOGxgDeuuSfw0m_N4uDpkT3QjZk7Jejt0Vom6-pQM840bSnxs6zTWSBo_tNKxHnyEdXk4FdKTpwPJZgDduJIBD0oPIrNhOAI5dUW2LB1z4ERwTgt1sZ09t4NZCLQw" style="-webkit-transform: rotate(0.00rad); border: none; transform: rotate(0.00rad);" width="366" /></span></span><br />
<br />
<br />
<br />
Maar hoe kom je nu van de ene tot de andere situatie?<br />
<br />
Er zijn een aantal opties:<br />
<ul>
<li>In QGIS alle duikers nalopen en objecten telkens <i>handmatig samenvoegen</i> tot één object, en de rest verwijderen. Er is al snel sprake van duizenden duikers, dus dit is wel even wat werk.. En als de BGT muteert uiteraard niet vergeten de eigen systemen weer bij te werken.</li>
<li>In Python een <i>uitvoerbaar programma</i> (executable) schrijven die de handelingen in QGIS automatiseert. Dit scheelt uren uren handwerk en, nog belangrijker, het proces is betrouwbaar en herhaalbaar. Wel goed onthouden waar je het script opslaat en hoe het gestart moet worden, het zal nooit dagelijkse routine worden (waarmee ik maar wil zeggen dat er extra beheerlast is).</li>
<li>In de DEMO database een <i>database functie</i> (function) schrijven in één van de beschikbare talen (SQL, Python, pgsql, ..). De functie is daarmee altijd onder de motorkap beschikbaar en lift mee met het onderhoud op de database. Het gebruik is simpel, betrouwbaar, herhaalbaar bij updates van de BGT.</li>
</ul>
Er is gekozen voor de laatste optie.<br />
<br />
Functie 1 (<i>get_kunstwerkdelenset</i>) geeft van een duiker naar keuze een lijst van alle verbonden (duiker) objecten:<br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"><span id="docs-internal-guid-f90bb0d4-7fff-efbd-c5b8-47c09b925c26"><br /></span>
</span><br />
<div dir="ltr" style="margin-left: -0.75pt;">
<table style="border-collapse: collapse; border: none;"><colgroup><col width="800"></col></colgroup><tbody>
<tr style="height: 0pt;"><td style="background-color: #cccccc; border-bottom: solid #000000 1pt; border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-top: solid #000000 1pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;"><div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Courier New, Courier, monospace; font-size: x-small; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">CREATE TYPE kunstwerkdelenset AS (object_pk integer);</span><br />
<span style="background-color: transparent; color: black; font-family: Courier New, Courier, monospace; font-size: x-small; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"><br /></span></div>
<span style="background-color: transparent; font-family: "Courier New", Courier, monospace; font-size: x-small; white-space: pre;">--DROP FUNCTION get_kunstwerkdelenset(integer);</span><br />
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">CREATE OR REPLACE FUNCTION get_kunstwerkdelenset(integer) RETURNS SETOF kunstwerkdelenset AS $$</span><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"> WITH RECURSIVE kunstwerkdelen (object_pk, geometrie, alle_delen, cyclus) AS (</span><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"> SELECT object_pk, geometrie, ARRAY[object_pk], FALSE</span><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"> FROM kunstwerkdeel WHERE object_pk = $1 AND ST_GeometryType(geometrie) = 'ST_LineString'</span><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"> UNION ALL</span><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"> SELECT k.object_pk, k.geometrie, alle_delen || k.object_pk, k.object_pk = ANY(alle_delen)</span><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"> FROM kunstwerkdeel k</span><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"> JOIN kunstwerkdelen ON</span><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"> cyclus = FALSE</span><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"> AND ST_GeometryType(k.geometrie) = 'ST_LineString'</span><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"> AND ST_Touches(k.geometrie, kunstwerkdelen.geometrie))</span><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"> SELECT object_pk FROM kunstwerkdelen WHERE cyclus = FALSE ORDER BY object_pk;</span><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"><br class="kix-line-break" /></span><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">$$ LANGUAGE SQL;</span></span></div>
</td></tr>
</tbody></table>
</div>
<br />
Even testen..<br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"><span style="font-family: Courier New, Courier, monospace;"><br /></span>
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">psql>SELECT get_kunstwerkdelenset(248667)</span></span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">248667</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">256557</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">256595</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">264497</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">264716</span><br />
<br />
Het werkt..<br />
<br />
Functie 2 (<i>merge_kunstwerkdelenset</i>) doorloopt alle <i>demo.kunstwerkdelen</i> van het type 'duiker' en vraagt telkens een setje te maken van alle verbonden duikers. Als er inderdaad een setje te vinden is, dan wordt de eerste duiker bijgewerkt en de overige ' duikers' verwijderd uit <i>demo.kunstwerkdelen</i>.<br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"><span id="docs-internal-guid-d0123248-7fff-a0f3-3832-7fa85498301f"><br /></span>
</span><br />
<div dir="ltr" style="margin-left: 0pt;">
<table style="border-collapse: collapse; border: none;"><colgroup><col width="800"></col></colgroup><tbody>
<tr style="height: 0pt;"><td style="background-color: #cccccc; border-bottom: solid #000000 1pt; border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-top: solid #000000 1pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;"><div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: Courier New, Courier, monospace; font-size: x-small;">--DROP FUNCTION merge_kunstwerkdelenset();</span></span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: Courier New, Courier, monospace; font-size: x-small;">CREATE OR REPLACE FUNCTION merge_kunstwerkdelenset() RETURNS void AS</span></span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: Courier New, Courier, monospace; font-size: x-small;">$BODY$</span></span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: Courier New, Courier, monospace; font-size: x-small;">DECLARE</span></span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> r record;</span></span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> q record;</span></span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: Courier New, Courier, monospace; font-size: x-small;">BEGIN</span></span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> FOR r IN SELECT * FROM kunstwerkdeel WHERE typekunstwerk = 'duiker' AND ST_GeometryType(geometrie) = 'ST_LineString'</span></span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> LOOP</span></span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> FOR q IN SELECT * FROM get_kunstwerkdelenset(r.object_pk::integer)</span></span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> LOOP</span></span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> IF (q.object_pk <> r.object_pk) THEN</span></span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> UPDATE kunstwerkdeel SET geometrie = ST_Union(geometrie,</span></span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> (SELECT s.geometrie FROM kunstwerkdeel s WHERE s.object_pk = q.object_pk))</span></span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> WHERE object_pk = r.object_pk;</span></span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> DELETE FROM kunstwerkdeel WHERE object_pk = q.object_pk;</span></span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> END IF;</span></span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> END LOOP;</span></span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> END LOOP;</span></span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: Courier New, Courier, monospace; font-size: x-small;">END</span></span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: Courier New, Courier, monospace; font-size: x-small;">$BODY$</span></span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: Courier New, Courier, monospace; font-size: x-small;">LANGUAGE 'plpgsql';</span></span></div>
</td></tr>
</tbody></table>
</div>
<br />
Nu is het nog een kwestie van:<br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"><br /></span>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">psql>SELECT merge_kunstwerkdelenset()</span><br />
<br />
en dan is het even wachten... (1/2 uur voor 17.000 duikers) .. klaar.<br />
<br />
Omdat de tabel <i>demo.kunstwerkdelen</i> een standaard DEMO opzet kent (zie eerdere blogs), zal de database de bovenstaande UPDATE en DELETE wijzigingen automatisch loggen. Het is later dus altijd te achterhalen wat er met individuele BGT objecten is gebeurd. Deze eigenschap komt weer goed van pas bij de bijhouding van de eigen objecten als de BGT wijzigt. Dat zal ik later laten zien.<br />
<br />
Volgende keer zien we waar deze opschoning van duikers (en andere kunstwerken) toe leidt<br />
<div>
<br /></div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-1882006622661545029.post-36532596804886097512018-09-23T22:01:00.000+02:002021-04-29T12:24:34.206+02:00demo.kunstwerkdeelDe minimale beschrijving van een watersysteem bevat naast <i>waterdelen</i> ook <i>kunstwerkdelen</i>.<br />
Een kunstwerk(deel) is een civieltechnisch werk voor de infrastructuur van wegen, water, spoorbanen,waterkeringen en/of leidingen, niet bedoeld voor permanent menselijk verblijf. In relatie met een watersysteem moet je daarbij denken aan gemaaltjes, stuwen, duikers, sluisjes, etc. Hoe zou een kunstwerkdeel in een basisregistratie water ondergebracht kunnen worden?<br />
<a name='more'></a><br />
Het detailniveau van <i>waterdelen</i> en <i>kunstwerkdelen</i> wordt in de Basisregistratie Grootschalige Topografie (BGT) globaal maar wel met een onderling vergelijkbaar detailniveau beschreven (waarbij er wel een vervelende mix is van verplichte- en optionele onderdelen).<br />
<div>
Deze BGT specificaties zijn het vertrekpunt voor een waterbeheerder, die de BGT data met zo min mogelijk aanpassingen zal willen overnemen in een eigen registratie (keep-it-simple is daarbij het adagio). Het ER-diagram van <i>demo.kunstwerkdeel</i> kan er bijvoorbeeld zo uitzien:<br />
<div>
<br />
<img src="https://lh5.googleusercontent.com/_BJM262OtPPICg-UnnEnTAGnVYmh8s2o8BHCc7Xinku91392Luo1M3WV-wX-7pdykumImB669lzWYNW9_mjiPGFU1wTsFQcCJ9xF3pGuzL_02IxEmUUGqs1grjB2qFPZkvslGYUH" /><br />
<br />
Het dataobject <i>demo.kunstwerkdeel</i> erft een aantal basiseigenschappen en -functionaliteiten (net als <i>demo.waterdeel)</i> van <i>demo.fysiekobject</i> en (buiten beeld) <i>demo.object.</i><br />
<br />
De bijbehorende DDL is als volgt:<br />
<div>
<span id="docs-internal-guid-ed087275-7fff-a27c-e4bd-88f1071da4a4"><br /></span>
<br />
<div dir="ltr" style="margin-left: 0pt;">
<table style="border-collapse: collapse; border: none; width: 451.27559055118115pt;"><colgroup><col width="*"></col></colgroup><tbody>
<tr style="height: 0pt;"><td style="background-color: #b7b7b7; border-bottom: solid #000000 1pt; border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-top: solid #000000 1pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">CREATE TABLE public.kunstwerkdeel (</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"><span class="Apple-tab-span" style="white-space: pre;"> </span></span><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">bgtobject varchar NULL,</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"><span class="Apple-tab-span" style="white-space: pre;"> </span></span><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">code varchar NULL,</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"><span class="Apple-tab-span" style="white-space: pre;"> </span></span><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">typekunstwerk typekunstwerk NULL,</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"><span class="Apple-tab-span" style="white-space: pre;"> </span></span><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">typeregelbaarheid typeregelbaarheid NULL,</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"><span class="Apple-tab-span" style="white-space: pre;"> </span></span><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">soortmateriaal soortmateriaal NULL,</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"><span class="Apple-tab-span" style="white-space: pre;"> </span></span><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">maatgevendehoogte numeric(6,3) NULL,</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"><span class="Apple-tab-span" style="white-space: pre;"> </span></span><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">geometrie geometry NULL,</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"><span class="Apple-tab-span" style="white-space: pre;"> </span></span><span style="background-color: transparent; color: black; font-family: "arial"; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">CONSTRAINT typekunstwerk_pk PRIMARY KEY (object_pk)</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">)</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">INHERITS (public.fysiekobject);</span></div>
</td></tr>
</tbody></table>
</div>
<br />
Met de data die de BGT voor een proefgebied levert als uitgangspunt zijn onderstaande domeinwaarden vooraf verzameld en in de database beschikbaar gemaakt:<br />
<br />
<table style="border-collapse: collapse; border: none;"><colgroup><col width="195"></col><col width="158"></col></colgroup><tbody>
<tr style="height: 0pt;"><td style="border-bottom: solid #000000 1pt; border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-top: solid #000000 1pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="color: black; font-family: "arial"; font-size: 11pt; vertical-align: baseline; white-space: pre;">typekunstwerk</span></div>
</td><td style="border-bottom: solid #000000 1pt; border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-top: solid #000000 1pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="color: black; font-family: "arial"; font-size: 11pt; vertical-align: baseline; white-space: pre;">bodemval</span></div>
</td></tr>
<tr style="height: 0pt;"><td style="border-bottom: solid #000000 1pt; border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-top: solid #000000 1pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="color: black; font-family: "arial"; font-size: 11pt; vertical-align: baseline; white-space: pre;">typekunstwerk</span></div>
</td><td style="border-bottom: solid #000000 1pt; border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-top: solid #000000 1pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="color: black; font-family: "arial"; font-size: 11pt; vertical-align: baseline; white-space: pre;">duiker</span></div>
</td></tr>
<tr style="height: 0pt;"><td style="border-bottom: solid #000000 1pt; border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-top: solid #000000 1pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="color: black; font-family: "arial"; font-size: 11pt; vertical-align: baseline; white-space: pre;">typekunstwerk</span></div>
</td><td style="border-bottom: solid #000000 1pt; border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-top: solid #000000 1pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="color: black; font-family: "arial"; font-size: 11pt; vertical-align: baseline; white-space: pre;">gemaal</span></div>
</td></tr>
<tr style="height: 0pt;"><td style="border-bottom: solid #000000 1pt; border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-top: solid #000000 1pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="color: black; font-family: "arial"; font-size: 11pt; vertical-align: baseline; white-space: pre;">typekunstwerk</span></div>
</td><td style="border-bottom: solid #000000 1pt; border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-top: solid #000000 1pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="color: black; font-family: "arial"; font-size: 11pt; vertical-align: baseline; white-space: pre;">sluis</span></div>
</td></tr>
<tr style="height: 0pt;"><td style="border-bottom: solid #000000 1pt; border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-top: solid #000000 1pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="color: black; font-family: "arial"; font-size: 11pt; vertical-align: baseline; white-space: pre;">typekunstwerk</span></div>
</td><td style="border-bottom: solid #000000 1pt; border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-top: solid #000000 1pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="color: black; font-family: "arial"; font-size: 11pt; vertical-align: baseline; white-space: pre;">steiger</span></div>
</td></tr>
<tr style="height: 0pt;"><td style="border-bottom: solid #000000 1pt; border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-top: solid #000000 1pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="color: black; font-family: "arial"; font-size: 11pt; vertical-align: baseline; white-space: pre;">typekunstwerk</span></div>
</td><td style="border-bottom: solid #000000 1pt; border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-top: solid #000000 1pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="color: black; font-family: "arial"; font-size: 11pt; vertical-align: baseline; white-space: pre;">strekdam</span></div>
</td></tr>
<tr style="height: 0pt;"><td style="border-bottom: solid #000000 1pt; border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-top: solid #000000 1pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="color: black; font-family: "arial"; font-size: 11pt; vertical-align: baseline; white-space: pre;">typekunstwerk</span></div>
</td><td style="border-bottom: solid #000000 1pt; border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-top: solid #000000 1pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="color: black; font-family: "arial"; font-size: 11pt; vertical-align: baseline; white-space: pre;">stuw</span></div>
</td></tr>
<tr style="height: 0pt;"><td style="border-bottom: solid #000000 1pt; border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-top: solid #000000 1pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="color: black; font-family: "arial"; font-size: 11pt; vertical-align: baseline; white-space: pre;">typekunstwerk</span></div>
</td><td style="border-bottom: solid #000000 1pt; border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-top: solid #000000 1pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="color: black; font-family: "arial"; font-size: 11pt; vertical-align: baseline; white-space: pre;">vispassage</span></div>
</td></tr>
<tr style="height: 0pt;"><td style="border-bottom: solid #000000 1pt; border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-top: solid #000000 1pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="color: black; font-family: "arial"; font-size: 10pt; vertical-align: baseline; white-space: pre;">typeregelbaarheid</span></div>
</td><td style="border-bottom: solid #000000 1pt; border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-top: solid #000000 1pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="color: black; font-family: "arial"; font-size: 10pt; vertical-align: baseline; white-space: pre;">automatisch op afstand</span></div>
</td></tr>
<tr style="height: 0pt;"><td style="border-bottom: solid #000000 1pt; border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-top: solid #000000 1pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="color: black; font-family: "arial"; font-size: 10pt; vertical-align: baseline; white-space: pre;">typeregelbaarheid</span></div>
</td><td style="border-bottom: solid #000000 1pt; border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-top: solid #000000 1pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="color: black; font-family: "arial"; font-size: 10pt; vertical-align: baseline; white-space: pre;">automatisch</span></div>
</td></tr>
<tr style="height: 0pt;"><td style="border-bottom: solid #000000 1pt; border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-top: solid #000000 1pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="color: black; font-family: "arial"; font-size: 10pt; vertical-align: baseline; white-space: pre;">typeregelbaarheid</span></div>
</td><td style="border-bottom: solid #000000 1pt; border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-top: solid #000000 1pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="color: black; font-family: "arial"; font-size: 10pt; vertical-align: baseline; white-space: pre;">handmatig</span></div>
</td></tr>
<tr style="height: 0pt;"><td style="border-bottom: solid #000000 1pt; border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-top: solid #000000 1pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="color: black; font-family: "arial"; font-size: 10pt; vertical-align: baseline; white-space: pre;">typeregelbaarheid</span></div>
</td><td style="border-bottom: solid #000000 1pt; border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-top: solid #000000 1pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="color: black; font-family: "arial"; font-size: 10pt; vertical-align: baseline; white-space: pre;">niet</span></div>
</td></tr>
<tr style="height: 0pt;"><td style="border-bottom: solid #000000 1pt; border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-top: solid #000000 1pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="color: black; font-family: "arial"; font-size: 10pt; vertical-align: baseline; white-space: pre;">typeregelbaarheid</span></div>
</td><td style="border-bottom: solid #000000 1pt; border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-top: solid #000000 1pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="color: black; font-family: "arial"; font-size: 10pt; vertical-align: baseline; white-space: pre;">regelbaar</span></div>
</td></tr>
<tr style="height: 0pt;"><td style="border-bottom: solid #000000 1pt; border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-top: solid #000000 1pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="color: black; font-family: "arial"; font-size: 10pt; vertical-align: baseline; white-space: pre;">soortmateriaal kunstwerk</span></div>
</td><td style="border-bottom: solid #000000 1pt; border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-top: solid #000000 1pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="color: black; font-family: "arial"; font-size: 10pt; vertical-align: baseline; white-space: pre;">beton</span></div>
</td></tr>
<tr style="height: 0pt;"><td style="border-bottom: solid #000000 1pt; border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-top: solid #000000 1pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="color: black; font-family: "arial"; font-size: 10pt; vertical-align: baseline; white-space: pre;">soortmateriaal kunstwerk</span></div>
</td><td style="border-bottom: solid #000000 1pt; border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-top: solid #000000 1pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="color: black; font-family: "arial"; font-size: 10pt; vertical-align: baseline; white-space: pre;">hout</span></div>
</td></tr>
<tr style="height: 0pt;"><td style="border-bottom: solid #000000 1pt; border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-top: solid #000000 1pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="color: black; font-family: "arial"; font-size: 10pt; vertical-align: baseline; white-space: pre;">soortmateriaal kunstwerk</span></div>
</td><td style="border-bottom: solid #000000 1pt; border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-top: solid #000000 1pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="color: black; font-family: "arial"; font-size: 10pt; vertical-align: baseline; white-space: pre;">kunststof</span></div>
</td></tr>
<tr style="height: 0pt;"><td style="border-bottom: solid #000000 1pt; border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-top: solid #000000 1pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="color: black; font-family: "arial"; font-size: 10pt; vertical-align: baseline; white-space: pre;">soortmateriaal kunstwerk</span></div>
</td><td style="border-bottom: solid #000000 1pt; border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-top: solid #000000 1pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="color: black; font-family: "arial"; font-size: 10pt; vertical-align: baseline; white-space: pre;">metselwerk</span></div>
</td></tr>
<tr style="height: 0pt;"><td style="border-bottom: solid #000000 1pt; border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-top: solid #000000 1pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="color: black; font-family: "arial"; font-size: 10pt; vertical-align: baseline; white-space: pre;">soortmateriaal kunstwerk</span></div>
</td><td style="border-bottom: solid #000000 1pt; border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-top: solid #000000 1pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="color: black; font-family: "arial"; font-size: 10pt; vertical-align: baseline; white-space: pre;">staal</span></div>
</td></tr>
</tbody></table>
<br />
Dit is veel beperkter dan de officiële Aquo-standaard, maar het dekt de lading.<br />
<br />
Net zo als voor ieder dataobject worden er een aantal standaard triggers gemaakt:<br />
<br />
<div dir="ltr" style="margin-left: 0pt;">
<table style="border-collapse: collapse; border: none; width: 451.27559055118115pt;"><colgroup><col width="*"></col></colgroup><tbody>
<tr style="height: 0pt;"><td style="background-color: #cccccc; border-bottom: solid #000000 1pt; border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-top: solid #000000 1pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;"><div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">--DROP TRIGGER a_kunstwerkdeel_insert ON kunstwerkdeel;</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">CREATE TRIGGER a_kunstwerkdeel_insert</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"> BEFORE INSERT</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"> ON public.kunstwerkdeel</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"> FOR EACH ROW</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"> EXECUTE PROCEDURE public.fysiekobject_upsert();</span></div>
<br />
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">--DROP TRIGGER b_kunstwerkdeel_insert ON kunstwerkdeel;</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">CREATE TRIGGER b_kunstwerkdeel_insert</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"> BEFORE INSERT</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"> ON public.kunstwerkdeel</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"> FOR EACH ROW</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"> EXECUTE PROCEDURE public.object_insert('nsDEMO');</span></div>
<br />
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">--DROP TRIGGER a_kunstwerkdeel_update ON kunstwerkdeel;</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">CREATE TRIGGER a_kunstwerkdeel_update</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"> BEFORE UPDATE</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"> ON public.kunstwerkdeel</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"> FOR EACH ROW</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"> EXECUTE PROCEDURE public.fysiekobject_upsert();</span></div>
<br />
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">ALTER TABLE kunstwerkdeel DISABLE TRIGGER a_kunstwerkdeel_update;</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">--ALTER TABLE kunstwerkdeel ENABLE TRIGGER a_kunstwerkdeel_update;</span></div>
<br />
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">--DROP TRIGGER b_kunstwerkdeel_update ON kunstwerkdeel;</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">CREATE TRIGGER b_kunstwerkdeel_update</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"> BEFORE UPDATE</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"> ON public.kunstwerkdeel</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"> FOR EACH ROW</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"> EXECUTE PROCEDURE public.object_update();</span></div>
<br />
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">--DROP TRIGGER kunstwerkdeel_delete ON kunstwerkdeel;</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">CREATE TRIGGER kunstwerkdeel_delete</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"> BEFORE DELETE</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"> ON public.kunstwerkdeel</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"> FOR EACH ROW</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"> EXECUTE PROCEDURE public.object_delete();</span></div>
</td></tr>
</tbody></table>
</div>
<br />
Merk op dat er (net als bij waterdeel) telkens <u>twee</u> INSERT en UPDATE triggers zijn, die per definitie altijd in alfabetische volgorde afgehandeld worden.<br />
<br />
De a-trigger zorgt voor het automatisch aanmaken van een representatieve (punt) locatie van een kunstwerkdeel (meestal het zwaartepunt van de BGT punt-, lijn- of vlak geometrie).<br />
Beide a- (update) triggers staan standaard op DISABLED. Dat betekent dat de locatie bij een update actie in principe niet automatisch wordt herberekend.<br />
<br />
Na het inregelen van bovenstaande opzet zijn voor het proefgebiedje ongeveer 17.350 kunstwerkdelen uit de BGT in DEMO geladen. Dat ziet er zo uit:<br />
<ul>
<li>De blauwe vlakken (lijken lijntjes) zijn de waterdelen, de slootjes, beekjes, greppels</li>
<li>De groene lijntjes (te klein, hier niet zichtbaar) zijn de stuwtjes, duikers, gemaaltjes</li>
<li>De puntjes zijn de respectievelijke locaties van de waterdelen en kunstwerkdelen</li>
</ul>
Als ondergrond wordt hier een luchtfoto via PDOK gebruikt.<br /><ul>
</ul>
<img height="384" src="https://lh4.googleusercontent.com/V-oFdIU_aVOhNWAA-wXAuh2v0RYDcS8B384Nas4e4d-nC9LXOLroe9bMO8oosQctLcKu4uWT8xPyews3S-p__DWyIxs5oFoqw6Bpi22LL7ThUzlROgfO2EQ6NgwRSKZjswKiZDGf" width="640" /><br />
<br /></div>
</div>
</div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-1882006622661545029.post-72209789790113998022018-09-16T22:41:00.001+02:002018-10-04T15:19:00.032+02:00demo.waterdeelDe vorige keer is de Basisregistratie Grootschalige Topografie (BGT) via PDOK gedownload. De waterbeheerder wordt geacht deze BGT in haar processen te gebruiken. Dat betekent dat een 0-situatie vastgelegd en in (eigen) beheer genomen moet worden. Hierbij de eerste voorbereidingen om dit voor het objectsoort <i>bgt_waterdeel</i> te doen.<br />
<a name='more'></a><br />
Het downloadbestand <i>bgt_waterdeel.gml</i> is zonder verdere voorbereiding met één opdrachtregel ingelezen in een PostgreSQL database, zie <a href="https://demo-damo.blogspot.com/2018/09/in-maart-2016-is-een-proefje-gedaan-of.html">Basisregistratie Grootschalige Topografie (revisited) (9/2018)</a>:<br />
<br />
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<img height="399" src="https://lh5.googleusercontent.com/SxYbe4yGg-dWapS1Wt2vgZwp_rN6brGMx-D0SYLjMFaPb5zj1JIXt3RkKYcEVMipfOvSBoyS2NLo5Ir4bRWj1objabRfCeEXBY8M0ZyaYXZ2J-exfuMD24MuhyQaTuKk-5d0Ddvp" style="border: none; font-family: arial; font-size: 11pt; transform: rotate(0rad); white-space: pre;" width="177" /></div>
<div>
<br /></div>
In de database DEMO is vooraf een tabel <i>demo.waterdeel</i> uitgewerkt, die de basis zal zijn voor de verdere informatievoorziening. Deze tabel maakt gebruik van alle opties zoals overerving van <i>object</i> en <i>fysiekobject</i>, <i>demo</i> domeinwaarden, Role-Based-Access-Control (<i>RBAC</i>), Row-Level Security (<i>RLS</i>), logging (<i>archive.archiveobject</i>), etc.. De meeste onderwerpen zijn besproken in eerdere blogs. Het ERD-diagram van <i>waterdeel</i> ziet er als volgt uit:<br />
<div>
<b style="font-weight: normal;"><br /></b>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"><img height="425" src="https://lh4.googleusercontent.com/X5-bdi4s2oeBhs1mEW7eOT2CA6pWovTmIfeNFce4p2KPFzxQUTgasHNPyQ98fEDOydNd11ULGx6u4Sgj8x2MNy2LHg4Ndd4E2Pp3UrFjnZZEpSJw0Axlfdxd9w2UKckUzd6liR9a" style="border: none; transform: rotate(0rad);" width="500" /></span></div>
<div>
<br /></div>
Het SQL CREATE script:<br />
<br />
<div dir="ltr" style="margin-left: 0pt;">
<table style="border-collapse: collapse; border: none; width: 451.27559055118115pt;"><colgroup><col width="*"></col></colgroup><tbody>
<tr style="height: 0pt;"><td style="background-color: #b7b7b7; border-bottom: solid #000000 1pt; border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-top: solid #000000 1pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">--DROP TABLE public.waterdeel;</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">CREATE TABLE public.waterdeel</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">(</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"> bgtobject varchar,</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"> code varchar,</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"> typewater public.typewater,</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"> typestroming public.typestroming,</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"> saliniteit public.saliniteit,</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"> persistentie public.persistentie,</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"> categoriewater public.categoriewater,</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"> geometrie geometry(POLYGON, 28992),</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"> CONSTRAINT waterdeel_pk PRIMARY KEY(object_pk)</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">) INHERITS (public.fysiekobject)</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">WITH (</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"> OIDS=FALSE</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">);</span></div>
</td></tr>
</tbody></table>
</div>
<br />
De lijst met domeinwaarden is kort gehouden, maar is wel langer geworden dan die van de BGT. Omdat er meer -en andere- labeltjes aan de eigen waterdelen komt te hangen moeten sommige bgt-waterdelen in de eigen registratie nog verder opgedeeld worden in kleinere stukken, maar daarover later meer.<br />
<br />
De domeinwaarden zijn arbitrair gekozen, het is maar een voorbeeld uitwerking:<br />
<b style="font-weight: normal;"><br /></b>
<br />
<div dir="ltr" style="margin-left: 0pt;">
<table style="border-collapse: collapse; border: none;"><colgroup><col width="127"></col><col width="158"></col></colgroup><tbody>
<tr style="height: 0pt;"><td style="border-bottom: solid #000000 1pt; border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-top: solid #000000 1pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">categoriewater</span></div>
</td><td style="border-bottom: solid #000000 1pt; border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-top: solid #000000 1pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">primair</span></div>
</td></tr>
<tr style="height: 0pt;"><td style="border-bottom: solid #000000 1pt; border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-top: solid #000000 1pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">categoriewater</span></div>
</td><td style="border-bottom: solid #000000 1pt; border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-top: solid #000000 1pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">secundair</span></div>
</td></tr>
<tr style="height: 0pt;"><td style="border-bottom: solid #000000 1pt; border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-top: solid #000000 1pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">categoriewater</span></div>
</td><td style="border-bottom: solid #000000 1pt; border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-top: solid #000000 1pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">tertiair</span></div>
</td></tr>
<tr style="height: 0pt;"><td style="border-bottom: solid #000000 1pt; border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-top: solid #000000 1pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">persistentie</span></div>
</td><td style="border-bottom: solid #000000 1pt; border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-top: solid #000000 1pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">afwisselend</span></div>
</td></tr>
<tr style="height: 0pt;"><td style="border-bottom: solid #000000 1pt; border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-top: solid #000000 1pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">persistentie</span></div>
</td><td style="border-bottom: solid #000000 1pt; border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-top: solid #000000 1pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">droogvallend</span></div>
</td></tr>
<tr style="height: 0pt;"><td style="border-bottom: solid #000000 1pt; border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-top: solid #000000 1pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">persistentie</span></div>
</td><td style="border-bottom: solid #000000 1pt; border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-top: solid #000000 1pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">permanent</span></div>
</td></tr>
<tr style="height: 0pt;"><td style="border-bottom: solid #000000 1pt; border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-top: solid #000000 1pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">saliniteit</span></div>
</td><td style="border-bottom: solid #000000 1pt; border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-top: solid #000000 1pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">brak</span></div>
</td></tr>
<tr style="height: 0pt;"><td style="border-bottom: solid #000000 1pt; border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-top: solid #000000 1pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">saliniteit</span></div>
</td><td style="border-bottom: solid #000000 1pt; border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-top: solid #000000 1pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">matig zilt</span></div>
</td></tr>
<tr style="height: 0pt;"><td style="border-bottom: solid #000000 1pt; border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-top: solid #000000 1pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">saliniteit</span></div>
</td><td style="border-bottom: solid #000000 1pt; border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-top: solid #000000 1pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">zoet</span></div>
</td></tr>
<tr style="height: 0pt;"><td style="border-bottom: solid #000000 1pt; border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-top: solid #000000 1pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">saliniteit</span></div>
</td><td style="border-bottom: solid #000000 1pt; border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-top: solid #000000 1pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">zout</span></div>
</td></tr>
<tr style="height: 0pt;"><td style="border-bottom: solid #000000 1pt; border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-top: solid #000000 1pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">typestroming</span></div>
</td><td style="border-bottom: solid #000000 1pt; border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-top: solid #000000 1pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">langzaam stromend</span></div>
</td></tr>
<tr style="height: 0pt;"><td style="border-bottom: solid #000000 1pt; border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-top: solid #000000 1pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">typestroming</span></div>
</td><td style="border-bottom: solid #000000 1pt; border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-top: solid #000000 1pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">snelstromend</span></div>
</td></tr>
<tr style="height: 0pt;"><td style="border-bottom: solid #000000 1pt; border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-top: solid #000000 1pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">typestroming</span></div>
</td><td style="border-bottom: solid #000000 1pt; border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-top: solid #000000 1pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">stilstaand</span></div>
</td></tr>
<tr style="height: 0pt;"><td style="border-bottom: solid #000000 1pt; border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-top: solid #000000 1pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">typewater</span></div>
</td><td style="border-bottom: solid #000000 1pt; border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-top: solid #000000 1pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">beek</span></div>
</td></tr>
<tr style="height: 0pt;"><td style="border-bottom: solid #000000 1pt; border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-top: solid #000000 1pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">typewater</span></div>
</td><td style="border-bottom: solid #000000 1pt; border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-top: solid #000000 1pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">gracht</span></div>
</td></tr>
<tr style="height: 0pt;"><td style="border-bottom: solid #000000 1pt; border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-top: solid #000000 1pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">typewater</span></div>
</td><td style="border-bottom: solid #000000 1pt; border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-top: solid #000000 1pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">greppel</span></div>
</td></tr>
<tr style="height: 0pt;"><td style="border-bottom: solid #000000 1pt; border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-top: solid #000000 1pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">typewater</span></div>
</td><td style="border-bottom: solid #000000 1pt; border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-top: solid #000000 1pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">haven</span></div>
</td></tr>
<tr style="height: 0pt;"><td style="border-bottom: solid #000000 1pt; border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-top: solid #000000 1pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">typewater</span></div>
</td><td style="border-bottom: solid #000000 1pt; border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-top: solid #000000 1pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">kanaal</span></div>
</td></tr>
<tr style="height: 0pt;"><td style="border-bottom: solid #000000 1pt; border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-top: solid #000000 1pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">typewater</span></div>
</td><td style="border-bottom: solid #000000 1pt; border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-top: solid #000000 1pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">meer</span></div>
</td></tr>
<tr style="height: 0pt;"><td style="border-bottom: solid #000000 1pt; border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-top: solid #000000 1pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">typewater</span></div>
</td><td style="border-bottom: solid #000000 1pt; border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-top: solid #000000 1pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">nevengeul</span></div>
</td></tr>
<tr style="height: 0pt;"><td style="border-bottom: solid #000000 1pt; border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-top: solid #000000 1pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">typewater</span></div>
</td><td style="border-bottom: solid #000000 1pt; border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-top: solid #000000 1pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">plas</span></div>
</td></tr>
<tr style="height: 0pt;"><td style="border-bottom: solid #000000 1pt; border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-top: solid #000000 1pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">typewater</span></div>
</td><td style="border-bottom: solid #000000 1pt; border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-top: solid #000000 1pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">rivier</span></div>
</td></tr>
<tr style="height: 0pt;"><td style="border-bottom: solid #000000 1pt; border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-top: solid #000000 1pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">typewater</span></div>
</td><td style="border-bottom: solid #000000 1pt; border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-top: solid #000000 1pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">sloot</span></div>
</td></tr>
<tr style="height: 0pt;"><td style="border-bottom: solid #000000 1pt; border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-top: solid #000000 1pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">typewater</span></div>
</td><td style="border-bottom: solid #000000 1pt; border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-top: solid #000000 1pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">spreng</span></div>
</td></tr>
<tr style="height: 0pt;"><td style="border-bottom: solid #000000 1pt; border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-top: solid #000000 1pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">typewater</span></div>
</td><td style="border-bottom: solid #000000 1pt; border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-top: solid #000000 1pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">ven</span></div>
</td></tr>
<tr style="height: 0pt;"><td style="border-bottom: solid #000000 1pt; border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-top: solid #000000 1pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">typewater</span></div>
</td><td style="border-bottom: solid #000000 1pt; border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-top: solid #000000 1pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">vijver</span></div>
</td></tr>
<tr style="height: 0pt;"><td style="border-bottom: solid #000000 1pt; border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-top: solid #000000 1pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">typewater</span></div>
</td><td style="border-bottom: solid #000000 1pt; border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-top: solid #000000 1pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">wadi</span></div>
</td></tr>
<tr style="height: 0pt;"><td style="border-bottom: solid #000000 1pt; border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-top: solid #000000 1pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">typewater</span></div>
</td><td style="border-bottom: solid #000000 1pt; border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-top: solid #000000 1pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">waterloop</span></div>
</td></tr>
<tr style="height: 0pt;"><td style="border-bottom: solid #000000 1pt; border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-top: solid #000000 1pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">typewater</span></div>
</td><td style="border-bottom: solid #000000 1pt; border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-top: solid #000000 1pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "arial"; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">watervlakte</span></div>
</td></tr>
</tbody></table>
</div>
<br />
Twee extra insert-/update triggers laat <i>fysiekobject</i> automatisch een <i>ST_PointOnSurface</i> plaatsen op het zwaartepunt van een waterdeel.</div>
<div>
Deze punten helpen om visueel de waterdelen van elkaar te onderscheiden bij het bewerken, om een topologisch netwerk van waterlopen en kunstwerken op te zetten en om later informatie op de kaart te kunnen koppelen aan locaties.<br />
<br />
<div dir="ltr" style="margin-left: 0pt;">
<table style="border-collapse: collapse; border: none; width: 451.27559055118115pt;"><colgroup><col width="*"></col></colgroup><tbody>
<tr style="height: 0pt;"><td style="background-color: #b7b7b7; border-bottom: solid #000000 1pt; border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-top: solid #000000 1pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;"><div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">--DROP TRIGGER a_waterdeel_insert ON waterdeel;</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">CREATE TRIGGER a_waterdeel_insert</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"> BEFORE INSERT</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"> ON public.waterdeel</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"> FOR EACH ROW</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"> EXECUTE PROCEDURE public.fysiekobject_upsert();</span></div>
<br />
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">--DROP TRIGGER a_waterdeel_update ON waterdeel;</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">CREATE TRIGGER a_waterdeel_update</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"> BEFORE UPDATE OF geometrie</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"> ON public.waterdeel</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"> FOR EACH ROW</span></div>
<div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"> EXECUTE PROCEDURE public.fysiekobject_upsert();</span></div>
</td></tr>
</tbody></table>
</div>
<br />
Demo.waterdeel is met deze laatste actie klaar voor gebruik.</div>
<div>
<br /></div>
<div>
Met een python script is demo.waterdeel gevuld op basis van de bgt_waterdelen.<br />
Inmiddels zit er een leuke testset in met 100.000 waterdelen.</div>
<div>
<br />
<img height="421" src="https://lh6.googleusercontent.com/b9Tm4mHmbh2Otho0t__jI-9X8s27HrWbv--_SUVk0diVrXR0vVkjn4xFpl1yMHJSRBJtOx1aAtLDW4yxGiSBs2xpbB4YsvTn3QeKK82R7dV2-8l-Ebxg0muHkbGEqrlwp67KdK1j" style="-webkit-transform: rotate(0.00rad); border: none; transform: rotate(0.00rad);" width="602" /></div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-1882006622661545029.post-12873380570441580142018-09-10T01:30:00.002+02:002018-10-04T15:19:14.573+02:00Basisregistratie Grootschalige Topografie (revisited)<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "arial";"><span style="font-size: 14.6667px; white-space: pre-wrap;">In maart 2016 is een proefje gedaan of de watergerelateerde lagen van de Basisregistratie Grootschalige Topografie (BGT) makkelijk in te lezen zijn in QGIS/PostgreSQL. Dat lukte redelijk. Nu maar eens kijken of het nog slimmer kan en wat een volgende stap kan zijn in het gebruik van de BGT in eigen processen en kernregistraties.</span></span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "arial";"><span style="font-size: 14.6667px; white-space: pre-wrap;"></span></span></div>
<a name='more'></a><span style="font-family: "arial";"><br /></span>
<br />
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "arial";"><span style="font-size: 14.6667px; white-space: pre-wrap;">Op een downloadpagina van PDOK wordt een BGT export via het selecteren van kaartvierkanten voorbereid en wordt een grote .zip met alle objecten gedownload. De .zip bevat voor ieder bgt- objecttype een .gml bestand. Het downloaden lukt de ene keer wat beter dan de andere keer, maar door de bank genomen werkt het wel. Het is voor mij (als burger) nog niet mogelijk om geclipte informatie (bijvoorbeeld per gemeente) of mutaties op te vragen.</span></span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "arial";"><span style="font-size: 14.6667px; white-space: pre-wrap;"><br /></span></span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "arial";"><span style="font-size: 14.6667px; white-space: pre-wrap;"> Voor de waterbeheerder zijn (als BGT afnemer) de volgende bgt-objecttypen van belang:</span></span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
</div>
<ul>
<li>bgt_waterdeel</li>
<li>bgt_ondersteunendwaterdeel</li>
<li>bgt_kunstwerkdeel</li>
<li>bgt_waterinrichtingselement</li>
<li>bgt_sensor</li>
</ul>
<span style="font-family: "arial"; font-size: 14.6667px; white-space: pre-wrap;">De overige bgt-objecten zijn natuurlijk belangrijk als referentiedata.</span><br />
<span style="font-family: "arial"; font-size: 14.6667px; white-space: pre-wrap;">De bgt-objecten uit bovenstaand lijstje zullen op één of andere manier in beheer genomen <u>moeten </u>worden omdat het de basis vormt voor de informatievoorziening van een waterbeheerder.</span><br />
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "arial";"><span style="font-size: 14.6667px; white-space: pre-wrap;"><br /></span></span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "arial";"><span style="font-size: 14.6667px; white-space: pre-wrap;">In 2016 is <i>bgt_waterdeel</i> nog in een aantal stappen met handwerk via QGIS in PostgreSQL geladen, waarbij de data door beperkingen van het tussentijds gebruikte SHAPE formaat ook nog eens is verminkt. Deze werkwijze is anno 2018 echt niet meer acceptabel </span></span><span style="font-family: "arial"; font-size: 11pt; vertical-align: baseline; white-space: pre-wrap;"> (</span><a href="http://switchfromshapefile.org/" style="text-decoration-line: none;"><span style="color: #1155cc; font-family: "arial"; font-size: 11pt; vertical-align: baseline; white-space: pre-wrap;">Shapefile must die !</span></a><span style="font-family: "arial"; font-size: 11pt; vertical-align: baseline; white-space: pre-wrap;">). Ditmaal wordt </span><span style="font-family: "arial";"><span style="font-size: 14.6667px; white-space: pre-wrap;">de </span></span><span id="docs-internal-guid-a2878c3a-7fff-fb11-8deb-d21faeb2a5d6"><a href="https://www.gdal.org/index.html" style="text-decoration-line: none;"><span style="color: #1155cc; font-family: "arial"; font-size: 11pt; vertical-align: baseline; white-space: pre-wrap;">GDAL</span></a></span><span style="font-family: "arial";"><span style="font-size: 14.6667px; white-space: pre-wrap;"> library aangeroepen om in één stap een .gml bestand over te zetten naar PostgreSQL. Bijvoorbeeld voor bgt_waterdeel:</span></span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<b id="docs-internal-guid-836c5ade-7fff-66e5-af59-75b008c26ae2" style="font-weight: normal;"><br /></b></div>
<div dir="ltr" style="margin-left: 0pt;">
<table style="border-collapse: collapse; border: none; width: 451.27559055118115pt;"><colgroup><col width="*"></col></colgroup><tbody>
<tr style="height: 0pt;"><td style="background-color: #b7b7b7; border-bottom: solid #000000 1pt; border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-top: solid #000000 1pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">ogr2ogr -overwrite -nlt POLYGON -f PostgreSQL PG:"dbname='demo'</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">host='localhost' port='5432' active_schema=bgt user='****'</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "courier new"; font-size: 10pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">password="*****" bgt_waterdeel.gml</span></div>
</td></tr>
</tbody></table>
</div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<br /></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "arial";"><span style="font-size: 14.6667px; white-space: pre-wrap;">Deze stap is uitermate goed te automatiseren.</span></span><br />
<span style="font-family: "arial";"><span style="font-size: 14.6667px; white-space: pre-wrap;">De datastructuur in de database (de tabel <i>bgt.bgt_waterdeel</i>) wordt automatisch aangemaakt en neemt 1:1 de .gml inhoud over. GDAL werk wat dat betreft ècht goed en is zeer robuust.</span></span><br />
<span style="font-family: "arial";"><span style="font-size: 14.6667px; white-space: pre-wrap;">Veel simpeler kan het niet worden zou je denken.</span></span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "arial";"><span style="font-size: 14.6667px; white-space: pre-wrap;"><br /></span></span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "arial";"><span style="font-size: 14.6667px; white-space: pre-wrap;">Eigenlijk kan het wèl simpeler, de data zou ook geleverd kunnen worden in het opensource<i> OGC GeoPackage</i> formaat (.gpkg). Dat is in principe al een (SQLite) database, maar verpakt in een bestand. Deze bestanden zijn </span></span><span style="font-family: "arial"; font-size: 14.6667px; white-space: pre-wrap;">direct te openen in bijvoorbeeld QGIS. Dit .gpkg formaat is de beoogde opvolger van SHAPE. Als externe partij zou ik zeer geholpen zijn als waterbeheerders dit soort bestanden als open datasets beschikbaar stelt.</span><br />
<span style="font-family: "arial";"><span style="font-size: 14.6667px; white-space: pre-wrap;"><br /></span></span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "arial";"><span style="font-size: 14.6667px; white-space: pre-wrap;">Maar goed, met GDAL werkt het ook. De PostgreSQL tabel <i>bgt.bgt_waterdeel</i> wordt aan een QGIS project toegevoegd, van een projectie (SRID = 28992) een een weergave stijl voorzien, en het kaartbeeld is compleet. Nu nog even de dataset clippen met het gebied van de waterbeheerder en de basis voor een kernregistratie-water ligt klaar.</span></span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "arial";"><span style="font-size: 14.6667px; white-space: pre-wrap;">Van GML bestand naar de presentatie in QGIS is pakweg een kwartiertje werk. Het ziet er dan bijvoorbeeld zo uit:</span></span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "arial";"><span style="font-size: 14.6667px; white-space: pre-wrap;"><br /></span></span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span id="docs-internal-guid-4530dbbc-7fff-a375-b293-14a7dba9b136"><span style="font-family: "arial"; font-size: 11pt; vertical-align: baseline; white-space: pre-wrap;"><img height="421" src="https://lh5.googleusercontent.com/hFqhGFVxdnu2qaBr97y115eykqh42-VlaONBMhMMOZyepoh3MMpF1UkG6rE0v9Rxr5ht2Rp58g3mKQHO_FtpfmAMHp_pQKAxSNi5WDx5DMfLZOUaoyfEZCE2CoqPEEKv9uggzmLi" style="-webkit-transform: rotate(0.00rad); border: none; transform: rotate(0.00rad);" width="602" /></span></span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<br /></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "arial";"><span style="font-size: 14.6667px; white-space: pre-wrap;">Dit is nu de BGT basis die de waterbeheerder volgens de wet vanaf 1/1/2016 moet gebruiken in haar werkprocessen.</span></span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "arial";"><span style="font-size: 14.6667px; white-space: pre-wrap;"><br /></span></span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "arial";"><span style="font-size: 14.6667px; white-space: pre-wrap;">Drie uitdagingen worden al snel duidelijk als je naar de data kijkt:</span></span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
</div>
<ul>
<li>De bgt kent vele bronhouders en is continu aan verandering onderhevig. De waterbeheerder kan voor de initiële vulling en bijhouding van zijn registraties zich niet op een bewegend doel blijven richten, dus zal de bgt informatie op één of andere manier lokaal in beheer genomen <u>moeten </u>worden (incl. kwaliteitscontroles en mutatieprocessen).</li>
<li>Het aggregatieniveau van BGT (watergerelateerde) objecten is voor waterbeheerders te grof. Het kleinste stukje water in de eigen registratie moet ook homogeen zijn wat betreft typering op gebieden als waterkwantiteit, -kwaliteit en categorie (primair, secundair, tertiair). Dat resulteert in kleinere stukjes water in de eigen registratie dan de bgt_waterdelen, De bgt-waterdelen moeten dus nog verder opgeknipt worden, waarbij de verwijzing naar het oorspronkelijke bgt-object nooit verloren mag gaan.</li>
<li>De BGT is inhoudelijk niet altijd juist. Er zitten systematische fouten in, maar ook toevallige fouten. Zie bijvoorbeeld bovenstaande afbeelding: geselecteerd object is zowel <i>waterloop </i>als <i>watervlakte</i>, en dat zijn toch echt verschillende (NEN 3610) watertypen. Dit object voldoet daarom niet aan de definitie van waterdeel en zou daarom opgedeeld moeten worden in kleinere waterdelen.</li>
</ul>
<span style="font-family: "arial"; font-size: 14.6667px; white-space: pre-wrap;">Nu is de waterbeheerder naast BGT afnemer ook vaak BGT bronhouder voor het thema water. Dat betekent dat de waterbeheerder zelf aan zet is om deze uitdagingen meteen bij de bron aan te pakken. De bronhouder mag vooralsnog naar eigen inzicht haar objecten extra opknippen, maak daar aub gebruik van. Dat scheelt later veel werk bij afnemers.</span><br />
<span style="font-family: "arial"; font-size: 14.6667px; white-space: pre-wrap;"><br /></span>
<span style="font-family: "arial"; font-size: 14.6667px; white-space: pre-wrap;">Maar naast de waterbeheerder er zijn ook nog veel watergerelateerde objecten afkomstig van andere bronhouders, en dan is er geen mogelijkheid objecten op te knippen.</span><br />
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "arial";"><span style="font-size: 14.6667px; white-space: pre-wrap;"><br /></span></span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "arial";"><span style="font-size: 14.6667px; white-space: pre-wrap;">Al met al wordt het nog een flinke puzzel om de BGT te integreren in eigen processen en registraties, maar het is zeker te doen, en het levert zeker baten op.</span></span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "arial";"><span style="font-size: 14.6667px; white-space: pre-wrap;"><br /></span></span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "arial";"><span style="font-size: 14.6667px; white-space: pre-wrap;">De volgende keer gaan we door met het object waterdeel.</span></span></div>
<div>
<br /></div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-1882006622661545029.post-17135037898281104062018-09-05T22:13:00.000+02:002018-11-10T12:52:53.404+01:00Gevangen in standaarden<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "arial";"><span style="font-size: 14.6667px; white-space: pre-wrap;">Het is logisch dat waterbeheerders (zelfs binnen dezelfde organisatie) naar oppervlaktewater kijken vanuit een eigen perspectief. Dat perspectief is door de jaren heen verwerkt in informatiemodellen en -systemen. Hergebruik en nut voor voor anderen van de verzamelde informatie staat daarbij niet hoog op de prioriteitenlijst. Dit heeft geleid tot een aantal complexe gegevensstandaarden die niet op elkaar aansluiten wat uiteindelijk leidt tot onbruikbare data.</span></span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "arial";"><span style="font-size: 14.6667px; white-space: pre-wrap;">Is een standaard eenmaal stabiel en heilig verklaard dan liggen de specificaties vast en wordt het lastig om koerswijzigingen in standaarden voor elkaar te krijgen. Vanaf dat moment staan innovaties op gespannen voet met standaarden.</span></span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<a name='more'></a></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "arial"; font-size: 14.6667px; white-space: pre-wrap;"><br /></span>
<span style="font-family: "arial"; font-size: 14.6667px; white-space: pre-wrap;">In de praktijk worden diverse standaarden vooral technisch met ingewikkelde transformaties en datamapping aan elkaar geknoopt om iedereen maar tevreden te houden. Mooi voorbeeld is de estafette tussen de informatiemodellen waar de waterbeheerder mee te maken heeft: DAMO >> IMWA >> INSPIRE. Bij iedere gegevensoverdracht gaat een beetje informatie verloren. De standaarden zijn vanaf een bepaald punt domweg incompatible, al beschrijven zij dezelfde werkelijkheid. In het generieke datamodel voor waterbeheerders (</span><span id="docs-internal-guid-8a3c09a8-7fff-afc0-1481-09d96ddb7498" style="font-family: "arial"; font-size: 14.6667px; white-space: pre-wrap;"><a href="http://damo.hetwaterschapshuis.nl/FysiekModel/index.htm" style="text-decoration-line: none;"><span style="color: #1155cc; font-family: "arial"; font-size: 11pt; vertical-align: baseline;">DAMO</span></a></span><span style="font-family: "arial"; font-size: 14.6667px; white-space: pre-wrap;">) is deze worsteling van de standaarden goed te zien. Zoek het object </span><i style="font-family: arial; font-size: 14.6667px; white-space: pre-wrap;">oppervlaktewaterlichaam</i><span style="font-family: "arial"; font-size: 14.6667px; white-space: pre-wrap;"> maar eens op. Het blijkt dat voor dit object behoefte is aan maar liefst drie 'unieke' identificatievelden (</span><i style="font-family: arial; font-size: 14.6667px; white-space: pre-wrap;">oppervlaktewaterlichaamID, code, lokaalID</i><span style="font-family: "arial"; font-size: 14.6667px; white-space: pre-wrap;">), waar je mag verwachten dat één toch echt wel volstaat. Het object is ontstaan uit objecten van hiërarchisch hogere informatiemodellen zoals BGT en NEN3610, waarbij in DAMO nog de opmerking wordt geplaatst dat de definitie van deze bovenliggende objecten </span><i style="font-family: arial; font-size: 14.6667px; white-space: pre-wrap;">eigenlijk niet juist is </i><span style="font-family: "arial"; font-size: 14.6667px; white-space: pre-wrap;">(!). De verschillen lijken triviaal, maar leiden uiteindelijk tot complexe informatiesystemen, veel voorbereidingen bij gegevensuitwisseling en leveringen van onbruikbare data.</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "arial";"><span style="font-size: 14.6667px; white-space: pre-wrap;"><br /></span></span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "arial";"><span style="font-size: 14.6667px; white-space: pre-wrap;">Nog fraaier is dat er kennelijk meer dan <b>250</b> watertypen nodig zijn om oppervlaktewater te beschrijven vanuit diverse invalshoeken, en minstens net zo kwalijk, verspreid over verschillende objecten van verschillende informatiemodellen. Op hoeveel manieren kun je zeggen dat een beek een beek is, en op hoeveel plekken moet dat dan vastgelegd worden ?</span></span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "arial";"><span style="font-size: 14.6667px; white-space: pre-wrap;"><br /></span></span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "arial";"><span style="font-size: 14.6667px; white-space: pre-wrap;"><i><b>If</b> it looks l<b>ike a duck</b>, swims <b>like a duck</b>, and quacks <b>like a duck</b>, then it probably is a <b>duck</b>.</i></span></span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "arial";"><span style="font-size: 14.6667px; white-space: pre-wrap;"><br /></span></span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "arial";"><span style="font-size: 14.6667px; white-space: pre-wrap;"><b>Voorbeeld KRW</b></span></span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "arial";"><span style="font-size: 14.6667px; white-space: pre-wrap;">Het informatiemodel KaderRichtlijn Water (KRW) kent o.a. de watertypen ‘Grote diepe kanalen <i>met</i> scheepvaart’ en ‘Grote diepe kanalen <i>zonder</i> scheepvaart’.</span></span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "arial";"><span style="font-size: 14.6667px; white-space: pre-wrap;"><br /></span></span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "arial";"><span style="font-size: 14.6667px; white-space: pre-wrap;">Normaliter zijn deze typeringen de uitkomst van een analyse en worden gecodeerd in een KRW model opgeslagen. In dit voorbeeld als code ‘M07a’ en ‘M07b’. Helemaal goed, maar interpreteer dit niet als een watertype. Het is een kwaliteitslabel, dat is iets anders.</span></span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "arial";"><span style="font-size: 14.6667px; white-space: pre-wrap;"><br /></span></span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "arial";"><span style="font-size: 14.6667px; white-space: pre-wrap;">Iemand kan ook achter een beeldscherm gaan zitten en zelf kunnen gaan bepalen of een water een groot, diep kanaal met scheepvaart <span style="font-size: 14.6667px;">is.</span> Dezelfde overwegingen zijn eerder door anderen ook al gemaakt vanuit een ander perspectief (om te beginnen door de landmeter). Wie zorgt er dan voor de consistentie van toegekende watertypen over alle systemen heen?</span></span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "arial";"><span style="font-size: 14.6667px; white-space: pre-wrap;">Dat er werk dubbel gebeurt met misschien zelfs tegengestelde resultaten komt omdat de definities van watertypen onhandig zijn opgesteld of verkeerd worden toegepast.</span></span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "arial";"><span style="font-size: 14.6667px; white-space: pre-wrap;"><br /></span></span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "arial";"><span style="font-size: 14.6667px; white-space: pre-wrap;">Het grootste bezwaar is dat fysieke kenmerken (groot en diep) in een watertype wordt samengevoegd met een ander kenmerk zoals de aanwezigheid van scheepvaart. Dat laatste kenmerk kan beter automatisch afgeleid worden van het officiële <span id="docs-internal-guid-e854a373-7fff-a884-2c2e-05b6a7bf112a"><a href="http://publicaties.minienm.nl/documenten/wegwijzer-voor-de-binnenscheepvaart" style="text-decoration-line: none;"><span style="background-color: white; color: #1155cc; font-family: "arial"; font-size: 12pt; vertical-align: baseline;">vaarregister</span></a></span> van het ministerie van IenW, </span></span><span style="font-family: "arial"; font-size: 14.6667px; white-space: pre-wrap;">hoewel het geen sinecure is om deze koppeling te leggen</span><span style="font-family: "arial"; font-size: 14.6667px; white-space: pre-wrap;">. Het informatiemodel DAMO heeft nota bene ook een speciaal object <i>vaarweg</i>.</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "arial";"><span style="font-size: 14.6667px; white-space: pre-wrap;"><br /></span></span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "arial";"><span style="font-size: 14.6667px; white-space: pre-wrap;">Andere voorbeelden van informatie die beter automatisch afgeleid en/of separaat vastgelegd kan worden zijn de eigenschappen <span id="docs-internal-guid-f8ab8178-7fff-fdcb-0d1f-f2667efb5768"><a href="http://www2.hetlnvloket.nl/mijndossier/grondsoortenkaart/GRONDSOORTEN10.HTML" style="text-decoration-line: none;"><span style="background-color: white; color: #1155cc; font-family: "arial"; font-size: 12pt; vertical-align: baseline;">ondergrond</span></a></span> (Zand/Klei, Kalk, Veen), chloridegehalte, stroming, etc. Nu worden ze te vaak meegenomen in de benaming van een watertype.</span></span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "arial";"><span style="font-size: 14.6667px; white-space: pre-wrap;"><br /></span></span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "arial";"><span style="font-size: 14.6667px; white-space: pre-wrap;">Tot slot blijkt dat sommige watertypen ook impliciete eigenschappen bevat. De twee genoemde watertypen hierboven betreft bijvoorbeeld altijd <i>zoet water</i>. Je moet het maar weten.</span></span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "arial";"><span style="font-size: 14.6667px; white-space: pre-wrap;"><br /></span></span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "arial";"><span style="font-size: 14.6667px; white-space: pre-wrap;"><b>Voorbeeld DAMO</b></span></span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "arial";"><span style="font-size: 14.6667px; white-space: pre-wrap;">De watertypen zoals DAMO beschrijft zijn door de tijd ook flink versnipperd. Sloot, kadesloot, kavelsloot, poldersloot, te verlanden sloot, vaarsloot, wegsloot, dijksloot, zure sloten, licht brakke sloten.. de lijst is eindeloos lang.</span></span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "arial";"><span style="font-size: 14.6667px; white-space: pre-wrap;">Ook hier weer wordt te pas en te onpas een basis typering (sloot) verweven met functies (varen), locaties (polder, boezem) of ondergrond (zandgaten, grindgaten, kleigaten). Waarom? Data Management t.a.v. een thema sloot wordt zo alleen maar complexer.</span></span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "arial";"><span style="font-size: 14.6667px; white-space: pre-wrap;"><br /></span></span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "arial";"><span style="font-size: 14.6667px; white-space: pre-wrap;"><b>Voorbeeld BGT / IMGeo</b></span></span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "arial";"><span style="font-size: 14.6667px; white-space: pre-wrap;">Hoe zit het dan met de hiërarchisch hogere standaarden, die zijn toch zeker generiek? De BGT kent inderdaad een kort lijstje met watertypen en bevat de waarden <i>waterloop</i> en <i>watervlakte</i> dat bijna alles al afdekt. Alleen <i>greppel</i> als apart type ontbreekt nog. Maar er staan ook nog wat andere waarden in de lijst zoals <i>zee</i> en '<i>greppel, droge sloot'</i>, die net als de KRW en DAMO verwijzen naar impliciete eigenschappen. Vraagt niemand zich af of dat in deze vorm iets toevoegt?</span></span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "arial";"><span style="font-size: 14.6667px; white-space: pre-wrap;"><br /></span></span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "arial";"><span style="font-size: 14.6667px; white-space: pre-wrap;">Het BGT-type water lijstje is belangrijk omdat de waterbeheerder deze verplicht moet gebruiken in haar processen. De BGT is immers een basisregistratie. Maar omdat men het BGT lijstje toch te compact vond is het toegestaan dat de BGT naast de vastgestelde (dus verplichte) inhoud ook aanvullende (dus optionele) inhoud mag bevatten. De BGT bouwt voort op het model IMGeo, dus kan het lijstje van IMGeo, dat langer is, in hetzelfde record NAAST HET LIJSTJE VAN DE BGT gebruikt worden. Wat een warboel..</span></span><br />
<span style="font-family: "arial"; font-size: 14.6667px; white-space: pre-wrap;">Dus in de BGT kan in één record staan dat een waterdeel een waterloop is, maar ook een sloot.</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "arial";"><span style="font-size: 14.6667px; white-space: pre-wrap;"><br /></span></span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "arial";"><span style="font-size: 14.6667px; white-space: pre-wrap;">Zelfs de watertypen van het IMGeo model bevatten waarden die versleuteld zijn met hun functie (<i>gracht, haven</i>) en wordt '<i>meer, plas, ven en vijver'</i> op één hoop gegooid, terwijl dat juist wel onderscheidende typen zijn. IMGeo krijgt voor dit onderdeel dan ook geen schoonheidsprijs.</span></span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "arial";"><span style="font-size: 14.6667px; white-space: pre-wrap;"><br /></span></span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "arial";"><span style="font-size: 14.6667px; white-space: pre-wrap;"><b>Hoe kan het beter?</b></span></span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "arial";"><span style="font-size: 14.6667px; white-space: pre-wrap;">Een fictief informatiesysteem voor waterbeheerders biedt natuurlijk de ruimte om creatief met standaarden om te gaan, ze mogen even opzij gelegd worden.</span></span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "arial";"><span style="font-size: 14.6667px; white-space: pre-wrap;">Als er dan toch geschrapt wordt in watertypen, wat zijn dan de uitgangspunten, wat blijft er over van de huidige standaard, waar worden gegevens geregistreerd, en hoe wordt de consistentie bewaakt ? Deze blog van vandaag geeft alleen antwoord op de eerste vraag.</span></span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "arial";"><span style="font-size: 14.6667px; white-space: pre-wrap;"><br /></span></span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "arial";"><span style="font-size: 14.6667px; white-space: pre-wrap;">Wikipedia is weliswaar geen standaard, maar biedt veel en zeer relevante informatie als je maar de moeite neemt om goed te lezen. Kijk bijvoorbeeld naar de pagina over watergangen of waterlopen. Daar is voor een waterbeheerder prima uit te vissen dat er in de basis maar een beperkt aantal watertypen nodig zijn en dat de overige eigenschappen beter apart geregistreerd kunnen worden. Zo is de volgende indeling bedacht, die idealiter al in de BGT (en IMGeo) toegepast zou moeten worden, maar nu wordt meegenomen in het fictieve informatiesysteem DEMO.</span></span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "arial";"><span style="font-size: 14.6667px; white-space: pre-wrap;"><br /></span></span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "arial";"><span style="font-size: 14.6667px; white-space: pre-wrap;"><a href="https://nl.wikipedia.org/wiki/Watergang_(wateroppervlak)" style="text-decoration-line: none;"><span style="background-color: white; color: #1155cc; font-family: "arial"; font-size: 12pt; font-weight: 700; vertical-align: baseline;">waterloop</span></a><b>: rivier, beek, nevengeul, wadi, kanaal, sloot, greppel, spreng, [default] waterloop</b></span></span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "arial";"><span style="font-size: 14.6667px; white-space: pre-wrap;"><a href="https://nl.wikipedia.org/wiki/Meer_(watervlakte)" style="text-decoration-line: none;"><span style="background-color: white; color: #1155cc; font-family: "arial"; font-size: 12pt; font-weight: 700; vertical-align: baseline;">watervlakte</span></a><b>: gracht, haven, </b></span></span><b style="font-family: arial; font-size: 14.6667px; white-space: pre-wrap;">meer, plas, ven, vijver, [default] watervlakte</b></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "arial";"><span style="font-size: 14.6667px; white-space: pre-wrap;"><br /></span></span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "arial";"><span style="font-size: 14.6667px; white-space: pre-wrap;">aanvullende eigenschappen (apart registreren):</span></span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<ul>
<li><i>stromingstoestand</i>: stilstaand, langzaam stromend, snelstromend</li>
<li><i>saliniteit</i>: zoet, brak, matig zilt, zout</li>
<li><i>oorsprong</i>: natuurlijk, kunstmatig, sterk veranderd</li>
<li><i>persistentie</i>: permanent, droogvallend, getijde</li>
<li><i>categorie</i>: primair, secundair, tertiair</li>
</ul>
</div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<i style="font-family: arial; font-size: 14.6667px; white-space: pre-wrap;">functie(s)</i><span style="font-family: "arial"; font-size: 14.6667px; white-space: pre-wrap;">: vanuit andere objecten worden functies gerelateerd aan waterlopen/-vlakten (tegen database richtlijnen in), bijvoorbeeld bij object </span><i style="font-family: arial; font-size: 14.6667px; white-space: pre-wrap;">vaarweg</i><span style="font-family: "arial"; font-size: 14.6667px; white-space: pre-wrap;"> wordt een verwijzing gemaakt naar een object </span><i style="font-family: arial; font-size: 14.6667px; white-space: pre-wrap;">waterdeel</i><span style="font-family: "arial"; font-size: 14.6667px; white-space: pre-wrap;"> of </span><i style="font-family: arial; font-size: 14.6667px; white-space: pre-wrap;">set van waterdelen</i><span style="font-family: "arial"; font-size: 14.6667px; white-space: pre-wrap;"> voor de functie </span><i style="font-family: arial; font-size: 14.6667px; white-space: pre-wrap;">scheepvaart.</i></div>
<div>
<br /></div>
</div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-1882006622661545029.post-8950227864365873602016-11-24T21:31:00.000+01:002018-09-16T22:44:24.283+02:00Forms in QGISIn de eerdere berichten is verteld over de DEMO (PostgreSQL) database waarin relaties/domeinen op een afwijkende manier zijn vastgelegd. Relaties worden nu on-the-fly gelegd op applicatieniveau en niet meer in de database. En dat pakt helemaal niet verkeerd uit als je bijvoorbeeld QGIS gebruikt. Hieronder een fictief voorbeeld.<br />
<a name='more'></a><br />
In dit voorbeeld worden kort en bondig een aantal stappen doorlopen in QGIS. Het moet net genoeg richting bieden om zelf ook aan de slag te kunnen gaan. En mocht je vastlopen; vragen staat vrij..<br />
<br />
In QGIS is een nieuw (leeg) project gestart en is de postgis tabel <i>demo.public.oppervlaktewaterlichaam</i> (zie blog over <a href="http://demo-damo.blogspot.nl/2016/02/object-hierarchie-in-een-database.html">object hierarchie in een database</a>) als kaartlaag <i>oppervlaktewaterlichaam </i>toegevoegd. Een aantal objecten op deze laag staan 'in onderzoek', d.w.z. er is onderzocht of deze objecten wel juist getypeerd en gecategoriseerd zijn en een aantal zullen naar aanleiding van het onderzoek gewijzigd moeten worden.<br />
<br />
De Use case is simpel:<br />
<ul>
<li>doorloop alle oppervlaktewaterlichamen die in onderzoek staan (<i>inonderzoek</i> aangevinkt)</li>
<ul>
<li>zet de typeringen (<i>waterkwaliteit</i>, <i>waterkwantiteit</i>) en de <i>categorie </i>juist</li>
<li>vink het attribuut <i>inonderzoek</i> uit</li>
<li>voer de wijzigingen door in de database</li>
</ul>
</ul>
We willen hierbij een zo eenvoudig mogelijke objecteditor (<i>QGIS form</i>) gebruiken om het aantal handelingen per object zoveel mogelijk te beperken.<br />
<br />
<h4>
Aan de slag</h4>
<div>
<br /></div>
<div>
Vanaf dit moment: Vergeet niet regelmatig het QGIS project (.qgs bestand) op te slaan, Alle instellingen maken immers deel uit van de project-definitie en gaan verloren als er niet opgeslagen wordt.<br />
<br />
Aan het QGIS project wordt nog een tabel 'zonder geometrie' toegevoegd met de<br />
naam <i>domeinwaarden</i> (zie blog over <a href="http://demo-damo.blogspot.nl/2016/02/domeintabellen.html">domeintabellen</a>). Een aantal attribuutwaarden van <i>oppervlaktewaterlichaam</i> vinden in deze tabel hun oorsprong.<br />
<br />
Er zijn kennelijk <i>oppervlaktewaterlichamen </i>waarvan het attribuut <i>inonderzoek</i> de waarde <i>t </i>(true) bevat. Door deze objecten donkerder af te beelden zijn ze makkelijk op de kaart terug te vinden. De stijl van deze laag is daarom via het venster <i>Laag Eigenschappen</i> (r-klik op laag <i>oppervlaktewaterlichaam </i>> eigenschappen) <i>Regel-gebaseerd </i>gemaakt:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEigzIggYB2hQjXzdvfgvQ0kZpZ436Pik96URsIg8tiAhiw43hywLy6wrIcCXIdVFs12ILRZOT-0I9UiypbTPOG3t1VVbDdCRxn5ysKJ3UOamkXRqLI41Gc7xxvnVt6Kx5MWuC_g_hsqhq8/s1600/Schermafdruk+2016-11-24+19.07.17.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="302" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEigzIggYB2hQjXzdvfgvQ0kZpZ436Pik96URsIg8tiAhiw43hywLy6wrIcCXIdVFs12ILRZOT-0I9UiypbTPOG3t1VVbDdCRxn5ysKJ3UOamkXRqLI41Gc7xxvnVt6Kx5MWuC_g_hsqhq8/s640/Schermafdruk+2016-11-24+19.07.17.png" width="640" /></a></div>
</div>
<div>
<br /></div>
<div>
Het kaartbeeld ziet er als volgt uit:</div>
<div>
<br /></div>
<div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJPnkUllEddz6CCbgvYhizYm5LfSQj8ZJ6Br3CMY3LVqmwx_NmZ-cce9K9gDCvOyCZ_pc0G04j6RfuieSQiKB3eHSrg_qK9VF57-SuhEYm8tNOWgR5M5LwYAdia0nDtLlxFbe9csSFddg/s1600/Schermafdruk+2016-11-24+15.38.09.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em; text-align: center;"><img border="0" height="380" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJPnkUllEddz6CCbgvYhizYm5LfSQj8ZJ6Br3CMY3LVqmwx_NmZ-cce9K9gDCvOyCZ_pc0G04j6RfuieSQiKB3eHSrg_qK9VF57-SuhEYm8tNOWgR5M5LwYAdia0nDtLlxFbe9csSFddg/s640/Schermafdruk+2016-11-24+15.38.09.png" width="640" /></a></div>
<br />
<br />
In de basis is het project gereed en kunnen de werkzaamheden uitgevoerd worden, maar de automatisch gegenereerde objecteditor werkt nog niet goed (incl. foutmeldingen van de database).<br />
Daar gaan we wat aan doen. Open de eerder genoemde <i>Laag Eigenschappen</i> van de laag <i>oppervlaktewaterlichaam</i> en selecteer het onderdeel <i>Velden</i>.</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgU2fF0-rSUJ2w4DhEhg8upDQ7h6Hq4suvnoXgoLy070eJiWZJpyKpP1WcwgdqE2_yzCioMERZQuDLwH61kQjyrwTz51FHfuqUpzTqZ3Bm_QIXTbo5bkWHL4fk7LsWFHcManQzsrBf0NmI/s1600/Schermafdruk+2016-11-24+16.06.47.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="348" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgU2fF0-rSUJ2w4DhEhg8upDQ7h6Hq4suvnoXgoLy070eJiWZJpyKpP1WcwgdqE2_yzCioMERZQuDLwH61kQjyrwTz51FHfuqUpzTqZ3Bm_QIXTbo5bkWHL4fk7LsWFHcManQzsrBf0NmI/s640/Schermafdruk+2016-11-24+16.06.47.png" width="640" /></a></div>
<div>
<br /></div>
<div>
Er staat bovenaan dat de user-interface (UI) layout automatisch gegenereerd wordt.</div>
<div>
<br /></div>
<div>
In de kolom <i>Wijzig-hulpmiddel </i>staat voor ieder veld aangegeven wat voor user-interface bouwsteen (<i>Widget)</i> gebruikt wordt en wat het gedrag is. Bij iedere nieuwe laag staat er alleen maar <i>Tekst bewerken</i>. Dat is daarmee de eerste keuze, maar niet altijd de juiste keuze. We doorlopen alle rijen en kiezen voor ieder veld het beste hulpmiddel. Zo is voor deze Case gebruik gemaakt van de volgende hulpmiddelen:</div>
<div>
<br />
<ul>
<li><i>Tekst bewerken</i> = <i>Label </i>+ <i>Line edit</i> (eerste keuze)</li>
<li><i>Datum/Tijd </i>= <i>Label </i>+ <i>Date/Time edit</i></li>
<li><i>Keuzevak</i> = <i>Checkbox</i></li>
<li><i>Waarde relatie </i>= <i>Label + </i><i>Combobox</i> (domeinlijst)</li>
</ul>
</div>
<div>
<br />
Ieder veld wordt voorzien van een passend hulpmiddel, ook al wordt het niet meteen gebruikt.<br />
Met het inrichten van een hulpmiddel wordt gedrag geregeld, denk aan:</div>
<div>
<ul>
<li>Is het veld aanpasbaar? (ja/nee)</li>
<li>Mag het een lege waarde bevatten? (ja/nee)</li>
<li>Hoe moet een veld weergegeven worden?</li>
<li>..</li>
</ul>
</div>
<div>
<br />
Soms is er specifiek gedrag te definiëren voor één bepaald hulpmiddel:<br />
<br /></div>
<div>
<i>Keuzevak (bijv. inonderzoek)</i>:</div>
<div>
<ul>
<li>Weergave aangevinkte status = <i>t</i></li>
<li>Weergave niet-aangevinkte status = <i>f</i></li>
</ul>
<div>
De waarden <i>t </i>en <i>f </i>zijn bruikbaar voor de regelgebaseerde stijlinstellingen, en worden in PostgreSQL bovendien herkend als <i>True</i> en <i>False</i>.</div>
</div>
<div>
<br /></div>
<div>
<i>Waarde relatie (bijv. categorieoppwaterlichaam):</i></div>
<div>
<ul>
<li>Laag = <i>domeinwaarden</i></li>
<li>Sleutelkolom = <i>omschrijving</i></li>
<li>Waardekolom = <i>omschrijving</i></li>
<li>Filter expressie = <i>"naamruimte" = 'damo' AND "domein" = 'categorieoppwaterlichaam' </i></li>
</ul>
</div>
<div>
<br />
De automatische objecteditor is nu wel bruikbaar, maar niet alle velden zijn relevant voor deze Case.</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4dWAegJAC3fl28g2w_zcRcfLFgQwxcJnZ0wDDJcHJ7X2f0KUUF7zByGWjVny3oiFgzarbHTJI37tRAGpTjJbFXAudWeZ37HRBhjK1-u3UFq0VSs37bwh1kEW1jNVEPsu8CzkkC13SXUQ/s1600/Schermafdruk+2016-11-24+17.18.07.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="387" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4dWAegJAC3fl28g2w_zcRcfLFgQwxcJnZ0wDDJcHJ7X2f0KUUF7zByGWjVny3oiFgzarbHTJI37tRAGpTjJbFXAudWeZ37HRBhjK1-u3UFq0VSs37bwh1kEW1jNVEPsu8CzkkC13SXUQ/s400/Schermafdruk+2016-11-24+17.18.07.png" width="400" /></a></div>
<div>
<br /></div>
<div>
Alleen de velden 1-2-11 zijn nodig voor identificatie, 12-13-14 om data te wijzigen, en 7 om aan te geven dat het object afgehandeld is.<br />
Het <i>Wijzig-hulpmiddel</i> voor de overige velden kunnen we op <i>Verborgen </i>zetten, maar daarmee gaat er specifiek gedrag verloren. Dus dat doen we niet.</div>
<div>
<br /></div>
<div>
Er is wat voor te zeggen om zelf een user-interface te ontwerpen in <i>QtDesigner </i>(maakt deel uit van een standaard QGIS installatie). Zoek een programma met deze naam, start het op en maak een nieuw <i>form</i> aan:</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7DZgWXtnS4UL1sTIHoDIp9OIjPTUDMd0bLZ9paMzyl0UQIoX7zm60Jy9rwta-v-tNvhMnsTfUK8allVbwEDl6NIxPdAi25xh8J7ViqFGdCDYBETcTfTVJFtiS215fiRnSdMDsL1bNEXo/s1600/Schermafdruk+2016-11-24+17.27.23.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="374" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7DZgWXtnS4UL1sTIHoDIp9OIjPTUDMd0bLZ9paMzyl0UQIoX7zm60Jy9rwta-v-tNvhMnsTfUK8allVbwEDl6NIxPdAi25xh8J7ViqFGdCDYBETcTfTVJFtiS215fiRnSdMDsL1bNEXo/s640/Schermafdruk+2016-11-24+17.27.23.png" width="640" /></a></div>
<div>
<br /></div>
<div>
Sleep de juiste widgets uit de <i>Widget Box</i> (links) naar het canvas (midden) en zorg dat ze bij benadering juist staan (naast elkaar - onder elkaar). Kies daarna <i>Form > Lay Out in a Grid</i> en alle widgets worden netjes uitgelijnd zoals hierboven.</div>
<div>
<br /></div>
<div>
Zorg dat de <i>objectName</i> van iedere widget in de Property Editor (rechtsonder) EXACT overeenkomt met de veldnaam in QGIS. Het resultaat ziet er nog niet zo anders uit dan het standaard formulier van QGIS, maar eigen UI's bieden op termijn veel meer mogelijkheden.</div>
<div>
<br /></div>
<div>
Bewaar deze <i>form</i>-definitie (.ui bestand) in dezelfde map als het QGIS project (.qgs bestand).</div>
<div>
<br /></div>
<div>
Ga terug naar het venster <i>Laag Eigenschappen</i> en pas de layout van <i>oppervlaktewaterlichaam</i> aan van <i>Automatisch genereren</i> naar <i>Geef een UI-bestand op</i> en blader naar het .ui bestand. Bevestig de actie (<i>Apply</i> of <i>Ok</i>). Vanaf dat moment wordt de volgende objecteditor gebruikt:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgFq75bEpJK8NGZ5Hy8VxOu034i9P_GBM_Gq_EzhscAkhOb7rAJJvSp1YQS9icFpDddp7hJmh8h6EJ6LXoktCvR1eNUFBecRKMaSzHu03Jkx6iA7SAZAPswMEnfgQMSvlv4O4geg_SmfrE/s1600/Schermafdruk+2016-11-24+20.26.50.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="387" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgFq75bEpJK8NGZ5Hy8VxOu034i9P_GBM_Gq_EzhscAkhOb7rAJJvSp1YQS9icFpDddp7hJmh8h6EJ6LXoktCvR1eNUFBecRKMaSzHu03Jkx6iA7SAZAPswMEnfgQMSvlv4O4geg_SmfrE/s400/Schermafdruk+2016-11-24+20.26.50.png" width="400" /></a></div>
<br />
Alleen de velden die bij de werkzaamheden helpen worden getoond, en de domeinlijsten werken zoals je mag verwachten:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjW2nYWCEnL1fqtzVe7_tuKq1bAptvCyPug0PeN7Xp-0b6ZytybZ0LBedTyBaSrSl-IAfRkaHUAI7mfhfS9hWuwzjU31IjvCWRN7XyMsRhZlm-hXTfEK8Yl_-jq_Swzvs0Jg4ILjVxAe-Y/s1600/Schermafdruk+2016-11-24+20.28.19.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="387" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjW2nYWCEnL1fqtzVe7_tuKq1bAptvCyPug0PeN7Xp-0b6ZytybZ0LBedTyBaSrSl-IAfRkaHUAI7mfhfS9hWuwzjU31IjvCWRN7XyMsRhZlm-hXTfEK8Yl_-jq_Swzvs0Jg4ILjVxAe-Y/s400/Schermafdruk+2016-11-24+20.28.19.png" width="400" /></a></div>
.<br />
Met deze editor ernaast kan het hele gebied (en attributentabel) afgelopen worden en kunnen de wijzigingen soepel doorgevoerd worden in de DEMO database.<br />
<br />
De DEMO database is ingericht met <i>domain-check-constraints</i> (zie blog oever <a href="http://demo-damo.blogspot.nl/2016/02/datatypen.html">domeinen</a>) en <i>row-level-security</i> (zie blog over <a href="http://demo-damo.blogspot.nl/2016/02/toegangscontrole-2-rls.html">RLS</a>). De gebruiker kan alleen data wijzigen voor de naamruimte (<i>namespace</i>) die hij onder zijn beheer heeft, in dit voorbeeld alleen de <i>oppervlaktewaterlichamen </i>van de bronhouder <i>NL.IMWA.038</i>.<br />
<br />
De DEMO database is ook ingericht met een <i>archive</i> schema voor het automatisch bijhouden van historie. Iedere wijziging wordt automatisch gelogd, Info als gebruikersnaam en (versie) datumvelden worden automatisch bijgewerkt.<br />
<br />
De object-editor die hierboven gemaakt is heeft tot nu toe geen negatieve impact gehad op de werking van DEMO.<br />
It just works!</div>
<div>
<br /></div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-1882006622661545029.post-58452721721963553102016-10-19T01:51:00.004+02:002018-09-06T12:00:28.320+02:00Aquo-ds webservice en Python<span style="font-weight: normal;"><span style="font-family: inherit;">Gangbare domeinwaarden (vaste eigenschappen van objecten) in de watersector maken deel uit van de Aquo standaard en worden via <a href="http://www.aquo.nl/">http://www.aquo.nl/</a> gepubliceerd. Deze domeinwaarden worden tot nu toe altijd overgenomen en onderhouden in eigen informatiesystemen, Aquo biedt echter ook een Aquo-ds webservice waarmee actuele domeinwaarden geraadpleegd kunnen worden. Zou het nu niet handig zijn om voor het onderhoud van het eigen systeem deze service in te zetten ?</span></span><br />
<a name='more'></a><span style="font-family: inherit;"><br /></span>
<span style="font-family: inherit;">Onderstaand <i>one-page</i> (!) Python script leest de aquo-ds webservice uit en vernieuwd de tabel <i>domeinwaarden</i> in een eigen informatiesysteem (DEMO database).</span><br />
<span style="font-family: inherit;"><br /></span>
<span style="font-family: inherit;"><a href="http://www.aquo.nl/tools/aquo-ds-webservice/">Aquo-ds</a> is een SOAP (Simple Object Acces Protocol) webservice. Een begeleidende WSDL (Web Services Description Language) beschrijft de samenstelling van de webservice. </span><br />
<span style="font-family: inherit;">Op de Aquo website staat een <a href="http://www.aquo.nl/documents/2013/09/handleiding-aquo-ds-webservice.pdf">handleiding</a> die laat zien hoe je in .NET (waarbij C#/Visual Studio gebruikt wordt) een programma kunt opzetten. Het is echter alles behalve simpel. Zodra van het aangegeven (microsoft) pad wordt afgeweken loop je al snel vast.</span><br />
<span style="font-family: inherit;"><br /></span>
<span style="font-family: inherit;"><span style="font-family: inherit;">Op GitHub is alternatieve aquo-ds (java) code te vinden van Nelen en Schuurmans. De code is net zo <a href="https://github.com/ddsc/ddsc-aquo/tree/master/src/nl/nelen_schuurmans/aquo">intimiderend </a>als die van Aquo zelf. </span>Start-up bedrijven kiezen vaak voor een scripttaal als <i>Python</i> om snel en eenvoudig resultaten neer te kunnen zetten, onder het motto <i>klein als het kan - groot als het moet</i>. Dat geldt ook voor het automatiseren van het beheer van domeinwaarden.</span><br />
<span style="font-family: inherit;"><br /></span>
<span style="font-family: inherit;">Wat is daar voor nodig geweest:</span><br />
<ul>
<li><span style="font-family: inherit;">Het volgen van een basiscursus Python (<a href="https://www.codecademy.com/learn/python">codecademy</a>)</span></li>
</ul>
<ul>
<li><span style="font-family: inherit;">Het diagonaal doorlezen van een boek (<a href="http://www.headfirstlabs.com/books/hfpython/">Head First Python</a>)</span></li>
</ul>
<ul>
<li><span style="font-family: inherit;">Het inrichten van een python omgeving (<a href="https://www.jetbrains.com/pycharm/">PyCharm</a>)</span></li>
</ul>
<span style="font-family: inherit;">Het resultaat laat zich wat lastig in beeld brengen, maar het beheer van dit soort gegevens is vanaf nu geautomatiseerd:</span><br />
<span style="font-family: inherit;"><br /></span>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8FzWDYyoYW80HWEARgfTj3bMrFOoxQtJDTm1v1RHlsYgO32NS2pSmVqraEtjEnv7qZYsPcoxo3ev0BX8kDJav7FFj_oXoGdM0aiE7c7ojAtkRdij4buFHJlDcPFpz6iDDEscWnrzuO14/s1600/aquo-ds.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em; text-align: center;"><img border="0" height="291" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8FzWDYyoYW80HWEARgfTj3bMrFOoxQtJDTm1v1RHlsYgO32NS2pSmVqraEtjEnv7qZYsPcoxo3ev0BX8kDJav7FFj_oXoGdM0aiE7c7ojAtkRdij4buFHJlDcPFpz6iDDEscWnrzuO14/s640/aquo-ds.png" width="640" /></a></div>
<span style="font-family: inherit;"><br /></span>
<br />
<span style="font-family: inherit;"><br /></span>
<span style="font-family: inherit;">Het Python script:</span><br />
<span style="font-family: inherit;"><br /></span>
<br />
<div style="background-color: #ebebeb;">
<div style="font-family: "courier new", courier, monospace;">
<span style="font-family: "courier new" , "courier" , monospace;">import string</span></div>
<div style="font-family: "courier new", courier, monospace;">
<span style="font-family: "courier new" , "courier" , monospace;">import psycopg2</span></div>
<div style="font-family: "courier new", courier, monospace;">
<span style="font-family: "courier new" , "courier" , monospace;">from datetime import datetime</span></div>
<div style="font-family: "courier new", courier, monospace;">
<span style="font-family: "courier new" , "courier" , monospace;">from suds.client import Client</span></div>
<div style="font-family: "courier new", courier, monospace;">
<span style="font-family: "courier new" , "courier" , monospace;">from suds.plugin import MessagePlugin</span></div>
<div style="font-family: "courier new", courier, monospace;">
<span style="font-family: "courier new" , "courier" , monospace;"><br /></span></div>
<div style="font-family: "courier new", courier, monospace;">
<span style="font-family: "courier new" , "courier" , monospace;"># Filter het SOAP gedeelte uit het bericht, de rest wordt niet gebruikt</span></div>
<div style="font-family: "courier new", courier, monospace;">
<span style="font-family: "courier new" , "courier" , monospace;">class Filter(MessagePlugin):</span></div>
<div style="font-family: "courier new", courier, monospace;">
<span style="font-family: "courier new" , "courier" , monospace;"> def received(self, context):</span></div>
<div style="font-family: "courier new", courier, monospace;">
<span style="font-family: "courier new" , "courier" , monospace;"> reply = context.reply</span></div>
<span style="font-family: "courier new" , "courier" , monospace;"> context.reply = reply[reply.find("<s:Envelope"):reply.rfind(">") + 1]</span><br />
<div style="font-family: "courier new", courier, monospace;">
<span style="font-family: "courier new" , "courier" , monospace;"> </span></div>
<div style="font-family: "courier new", courier, monospace;">
<s:envelope reply.rfind=""><span style="font-family: "courier new" , "courier" ,;"># Peildatum</span></s:envelope></div>
<div style="font-family: "courier new", courier, monospace;">
<s:envelope reply.rfind=""><span style="font-family: "courier new" , "courier" , monospace;">today = datetime.today()</span></s:envelope></div>
<div style="font-family: "courier new", courier, monospace;">
<s:envelope reply.rfind=""><span style="font-family: "courier new" , "courier" , monospace;"><br /></span></s:envelope></div>
<div style="font-family: "courier new", courier, monospace;">
<s:envelope reply.rfind=""><span style="font-family: "courier new" , "courier" ,;"># Maak een connectie met DEMO (zelf parameters invullen)</span></s:envelope></div>
<div style="font-family: "courier new", courier, monospace;">
<s:envelope reply.rfind=""><span style="font-family: "courier new" , "courier" ,;">conn = psycopg2._connect('host=<..> dbname=demo user=<..> password=<..>')</span></s:envelope></div>
<div style="font-family: "courier new", courier, monospace;">
<s:envelope reply.rfind=""><span style="font-family: "courier new" , "courier" ,;">conn.autocommit = True</span></s:envelope></div>
<div style="font-family: "courier new", courier, monospace;">
<s:envelope reply.rfind=""><span style="font-family: "courier new" , "courier" ,;">curs = conn.cursor()</span></s:envelope></div>
<div style="font-family: "courier new", courier, monospace;">
<s:envelope reply.rfind=""><span style="font-family: "courier new" , "courier" ,;"><br /></span></s:envelope></div>
<div style="font-family: "courier new", courier, monospace;">
<s:envelope reply.rfind=""><span style="font-family: "courier new" , "courier" ,;">client = Client('http://domeintabellen-idsw-ws.rws.nl/DomainTableWS.svc?wsdl', plugins=[Filter()])</span></s:envelope></div>
<div style="font-family: "courier new", courier, monospace;">
<s:envelope reply.rfind=""><span style="font-family: "courier new" , "courier" ,;"><br /></span></s:envelope></div>
<div style="font-family: "courier new", courier, monospace;">
<s:envelope reply.rfind=""><span style="font-family: "courier new" , "courier" ,;"># Maak een domeinlijst Aquo-ds</span></s:envelope></div>
<div style="font-family: "courier new", courier, monospace;">
<s:envelope reply.rfind=""><span style="font-family: "courier new" , "courier" ,;">request = client.factory.create('ns1:GetDomainTableNamesRequest')</span></s:envelope></div>
<div style="font-family: "courier new", courier, monospace;">
<s:envelope reply.rfind=""><span style="font-family: "courier new" , "courier" ,;">request.CheckDate = today</span></s:envelope></div>
<div style="font-family: "courier new", courier, monospace;">
<s:envelope reply.rfind=""><span style="font-family: "courier new" , "courier" ,;">result = client.service['basic'].GetDomainTableNames(request)</span></s:envelope></div>
<div style="font-family: "courier new", courier, monospace;">
<span style="font-family: "courier new" , "courier" , monospace;"><s:envelope reply.rfind="">tablenames = </s:envelope>result.DomainTableNames[0]</span></div>
<div style="font-family: "courier new", courier, monospace;">
<span style="font-family: "courier new" , "courier" , monospace;"><br /></span></div>
<div style="font-family: "courier new", courier, monospace;">
<span style="font-family: "courier new" , "courier" , monospace;"># Voorbereiden ophalen domeinwaarden Aquo-ds</span></div>
<div style="font-family: "courier new", courier, monospace;">
<span style="font-family: "courier new" , "courier" , monospace;">req = client.factory.create('ns1:GetDomainTableRequest')</span></div>
<div style="font-family: "courier new", courier, monospace;">
<span style="font-family: "courier new" , "courier" , monospace;">req.PageSize = 1000</span></div>
<div style="font-family: "courier new", courier, monospace;">
<span style="font-family: "courier new" , "courier" , monospace;">req.StartPage = 1</span></div>
<div style="font-family: "courier new", courier, monospace;">
<span style="font-family: "courier new" , "courier" , monospace;">req.CheckDate = today</span></div>
<div style="font-family: "courier new", courier, monospace;">
<span style="font-family: "courier new" , "courier" , monospace;"><br /></span></div>
<div style="font-family: "courier new", courier, monospace;">
<span style="font-family: "courier new" , "courier" , monospace;"># Haal per domein alle -waarden op</span></div>
<div style="font-family: "courier new", courier, monospace;">
<span style="font-family: "courier new" , "courier" , monospace;">for tablename in tablenames:</span></div>
<div style="font-family: "courier new", courier, monospace;">
<span style="font-family: "courier new" , "courier" , monospace;"> req.DomaintableName = tablename</span></div>
<div style="font-family: "courier new", courier, monospace;">
<span style="font-family: "courier new" , "courier" , monospace;"> res = client.service['basic'].GetDomainTable(req)</span></div>
<div style="font-family: "courier new", courier, monospace;">
<span style="font-family: "courier new" , "courier" , monospace;"> try:</span></div>
<div style="font-family: "courier new", courier, monospace;">
<span style="font-family: "courier new" , "courier" , monospace;"> for datarow in res.Data.DataRow:</span></div>
<div style="font-family: "courier new", courier, monospace;">
<span style="font-family: "courier new" , "courier" , monospace;"> # Parkeerplaats data</span></div>
<div style="font-family: "courier new", courier, monospace;">
<span style="font-family: "courier new" , "courier" , monospace;"> mp = {'PK': '', 'ID': '',</span></div>
<div style="font-family: "courier new", courier, monospace;">
<span style="font-family: "courier new" , "courier" , monospace;"> 'domein': string.lower(tablename).encode('utf-8'),</span></div>
<div style="font-family: "courier new", courier, monospace;">
<span style="font-family: "courier new" , "courier" , monospace;"> 'naamruimte': 'aquo', 'Code': '',
'Omschrijving': '', 'Afkorting': '', 'Groep': '', 'begindatum': '', 'einddatum': ''}</span></div>
<div style="font-family: "courier new", courier, monospace;">
<span style="font-family: "courier new" , "courier" , monospace;"> </span></div>
<div style="font-family: "courier new", courier, monospace;">
<span style="font-family: "courier new" , "courier" , monospace;"> # Ophalen domeinwaarden</span></div>
<div style="font-family: "courier new", courier, monospace;">
<span style="font-family: "courier new" , "courier" , monospace;"> mp['begindatum'] = datarow['BeginDate'].isoformat()</span></div>
<div style="font-family: "courier new", courier, monospace;">
<span style="font-family: "courier new" , "courier" , monospace;"> mp['einddatum'] = datarow['EndDate'].isoformat()</span></div>
<div style="font-family: "courier new", courier, monospace;">
<span style="font-family: "courier new" , "courier" , monospace;"> for field in datarow['Fields'].DataField: </span>mp[field[1]] = field[2]</div>
<div style="font-family: "courier new", courier, monospace;">
<span style="font-family: "courier new" , "courier" , monospace;"><br /></span></div>
<div style="font-family: "courier new", courier, monospace;">
<span style="font-family: "courier new" , "courier" , monospace;"> # Is deze Aquo-ds domeinwaarde al bekend in DEMO?</span></div>
<div style="font-family: "courier new", courier, monospace;">
<span style="font-family: "courier new" , "courier" , monospace;"> curs.execute("""SELECT domeinwaarden_pk FROM domeinwaarden</span></div>
<div style="font-family: "courier new", courier, monospace;">
<span style="font-family: "courier new" , "courier" , monospace;"> WHERE naamruimte = %(naamruimte)s
AND domein = %(domein)s</span></div>
<div style="font-family: "courier new", courier, monospace;">
<span style="font-family: "courier new" , "courier" , monospace;"> AND omschrijving = %(Omschrijving)s;""", mp)</span></div>
<div style="font-family: "courier new", courier, monospace;">
<span style="font-family: "courier new" , "courier" , monospace;"> row = curs.fetchone()</span></div>
<div style="font-family: "courier new", courier, monospace;">
<span style="font-family: "courier new" , "courier" , monospace;"><br /></span></div>
<div style="font-family: "courier new", courier, monospace;">
<span style="font-family: "courier new" , "courier" , monospace;"> if row is None:</span></div>
<div style="font-family: "courier new", courier, monospace;">
<span style="font-family: "courier new" , "courier" , monospace;"> sql = """INSERT INTO domeinwaarden
(id, naamruimte, domein, code,</span></div>
<div style="font-family: "courier new", courier, monospace;">
<span style="font-family: "courier new" , "courier" , monospace;"> omschrijving, afkorting, groep, begindatum, einddatum)</span></div>
<div style="font-family: "courier new", courier, monospace;">
<span style="font-family: "courier new" , "courier" , monospace;"> VALUES (%(ID)s, %(naamruimte)s, %(domein)s, %(Code)s, %(Omschrijving)s,</span></div>
<div style="font-family: "courier new", courier, monospace;">
<span style="font-family: "courier new" , "courier" , monospace;"> %(Afkorting)s,
%(Groep)s, %(begindatum)s, %(einddatum)s);"""</span></div>
<div style="font-family: "courier new", courier, monospace;">
<span style="font-family: "courier new" , "courier" , monospace;"> else:</span></div>
<div style="font-family: "courier new", courier, monospace;">
<span style="font-family: "courier new" , "courier" , monospace;"> mp['PK'] = row[0]</span></div>
<div style="font-family: "courier new", courier, monospace;">
<span style="font-family: "courier new" , "courier" , monospace;"> sql = """UPDATE domeinwaarden SET
id = %(ID)s, code = %(Code)s,</span></div>
<div style="font-family: "courier new", courier, monospace;">
<span style="font-family: "courier new" , "courier" , monospace;"> afkorting = %(Afkorting)s, groep = %(Groep)s,</span></div>
<div style="font-family: "courier new", courier, monospace;">
<span style="font-family: "courier new" , "courier" , monospace;"> begindatum = %(begindatum)s, einddatum = %(einddatum)s</span></div>
<div style="font-family: "courier new", courier, monospace;">
<span style="font-family: "courier new" , "courier" , monospace;"> WHERE domeinwaarden_pk = %(PK)s;"""</span></div>
<div style="font-family: "courier new", courier, monospace;">
<span style="font-family: "courier new" , "courier" , monospace;"><br /></span></div>
<div style="font-family: "courier new", courier, monospace;">
<span style="font-family: "courier new" , "courier" , monospace;"> # Aquo-ds domeinwaarde naar DEMO brengen</span></div>
<div style="font-family: "courier new", courier, monospace;">
<span style="font-family: "courier new" , "courier" , monospace;"> try:</span></div>
<div style="font-family: "courier new", courier, monospace;">
<span style="font-family: "courier new" , "courier" , monospace;"> curs.execute(sql, mp)</span></div>
<div style="font-family: "courier new", courier, monospace;">
<span style="font-family: "courier new" , "courier" , monospace;"> except:
print('SQL Execute error in '+ mp['domein'])</span></div>
<div style="font-family: "courier new", courier, monospace;">
<span style="font-family: "courier new" , "courier" , monospace;"><br /></span></div>
<div style="font-family: "courier new", courier, monospace;">
<span style="font-family: "courier new" , "courier" , monospace;"> except AttributeError:
print('AttributeError in ' + tablename)</span></div>
<div style="font-family: "courier new", courier, monospace;">
<span style="font-family: "courier new" , "courier" , monospace;"><br /></span></div>
<div style="font-family: "courier new", courier, monospace;">
<span style="font-family: "courier new" , "courier" , monospace;"># connectie met DEMO sluiten</span></div>
<div style="font-family: "courier new", courier, monospace;">
<span style="font-family: "courier new" , "courier" , monospace;">curs.close()</span></div>
<div style="font-family: "courier new", courier, monospace;">
<span style="font-family: "courier new" , "courier" , monospace;">conn.close()</span></div>
</div>
<span style="font-family: inherit;"><br />
</span><br />
That's it..<br />
<br />
Zo simpel kan het dus ook.<br />
<br />Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-1882006622661545029.post-34809007565811463372016-06-07T10:23:00.000+02:002018-09-16T22:47:54.000+02:00Peilbuis, of hoe informatie bruikbaar wordt (2)In dit experiment wordt gekeken hoe een set peilbuis gegevens verdeeld kan zijn over basis-, kern- en procesregistraties, en hoe deze registraties met elkaar gekoppeld toch weer een integraal beeld kunnen geven voor een specifiek proces, bijvoorbeeld <i>Asset Management</i>. Daarbij staan de gangbare principes als <i>eenmalige opslag, meervoudig gebruik</i> en <i>eenduidig eigenaarschap en -beheer</i> centraal.<br />
<div>
<a name='more'></a></div>
<div>
<br />
In een voorgaand bericht zijn de objecten <i>Grondwatermonitoringsput</i> en <i>Monitoringsbuis</i> uitgewerkt als fictieve basisregistratieobjecten, en opgenomen in het datamodel van DEMO.<br />
<br />
DEMO is via een tweetal ETL scripts gevuld met ca. 1.000 grondwatermonitoringsputten met 1.475 bijbehorende monitoringsbuizen waarvan de informatie vrij beschikbaar te vinden is op internet, en die gelegen zijn in de provincies Friesland en Noord Brabant. Alle objecten zijn ingelezen als ware het eigen objecten.</div>
<div>
<br /></div>
<div>
Als basisregistratieobject bevat een peilbuis maar een zeer beperkte set gegevens. De organisatie houdt echter veel meer gegevens bij, voor een deel voor de hele organisatie (de kern- of procesoverstijgende gegevens) en voor een deel specifiek voor afgebakende processen zoals <i>Monitoren</i> en/of <i>In stand houden</i>. In dit experiment wordt het proces <i>In stand houden (beheer en onderhoud)</i> betrokken. Belangrijk onderdeel van dit proces is <i>Asset Management</i> conform ISO 55000.</div>
<div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3rSD11_rhVdqijhXdpsn6mYCqJrrg9eH4bIghwqdtXERCxNpciTgtGKZOEMBxrOTGsT_1ovfZfuBYVrAZG7oSwTXATisOiEu8dIsVxOR1nZSwfCP8iYKFBGk9SLCHf3n0Y7WPRtrUPSs/s1600/Asset+Management.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="353" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3rSD11_rhVdqijhXdpsn6mYCqJrrg9eH4bIghwqdtXERCxNpciTgtGKZOEMBxrOTGsT_1ovfZfuBYVrAZG7oSwTXATisOiEu8dIsVxOR1nZSwfCP8iYKFBGk9SLCHf3n0Y7WPRtrUPSs/s400/Asset+Management.png" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<span style="text-align: start;"><br /></span></div>
<div class="separator" style="clear: both; text-align: start;">
In bovenstaande plaat is de basisregistratie BRO en de kernregistratie DEMO gepositioneerd in het deel <i>Asset Portfolio.</i> De <i>Asset lifecycle</i> is wordt meestal ondersteund door een doelgericht informatiesysteem dat vaak wordt aangeduid als <i>onderhoudsbeheersysteem (OBS)</i>.</div>
<div class="separator" style="clear: both; text-align: start;">
<br /></div>
<div class="separator" style="clear: both; text-align: start;">
Het OBS gaat uiteraard over het beheer en onderhoud van peilbuizen, en maakt daarbij gebruik van <i>peilbuis stamgegevens.</i></div>
<div class="separator" style="clear: both; text-align: start;">
<br /></div>
<div class="separator" style="clear: both; text-align: start;">
<br /></div>
<div style="background-color: #ebebeb;">
<i>Stamgegeven : Omschrijving of ander indicatief gegeven met een geringe wijzigingsfrequentie, zulks in tegenstelling tot muterende gegevens.</i></div>
<br />
<div class="separator" style="clear: both; text-align: start;">
Deze gegevens ontstaan in het OBS of deze gegevens komen uit andere systemen en worden in het OBS overgetypt. Voor het experiment is een fictief client-server gebaseerd OBS ingericht dat gegevens bevat van 1475 peilbuizen. De ID's van de peilbuizen komen overeen met de ID's van de monitoringsbuizen uit de BRO. Op basis van dit attribuut zijn beide registraties te koppelen.</div>
<div class="separator" style="clear: both; text-align: start;">
<br /></div>
<div class="separator" style="clear: both; text-align: start;">
Nu komt de organisatie met de wens om basis- en kernregistraties in het OBS te integreren met onderhoudsdata. Dat is een flinke wijziging, het betekent dat de stamdata peilbuizen in het OBS voortaan bestaat uit de optelsom van:</div>
<div class="separator" style="clear: both; text-align: start;">
<br /></div>
<ul>
<li>BRO basisregistratiegegevens: globale kenmerken peilbuis, locatie, eigenaar, functie</li>
<li>DEMO kernregistratiegegevens: organisatiespecifieke eigenschappen</li>
<li>OBS: procesgegevens onderhoud</li>
</ul>
De leverancier begrijpt de wens uiteraard, maar ziet terecht risico's in de implementatie, en zal meteen stellen dat het datamodel van OBS niet aangepast kan worden. De consequenties zijn te groot, er zijn user interfaces en functionaliteit op deze data gebouwd, de data wordt in alle hoeken van het systeem gebruikt.<br />
<br />
<div class="separator" style="clear: both; text-align: start;">
De impasse die hier ontstaat is te doorbreken door samen vooraf goed na te denken over een concept architectuur. Uiteraard mist de input van de leverancier omdat het OBS in dit experiment een fictief systeem is, maar stel dat er uit een overleg toch een bruikbaar model is ontstaan dat in archimate taal is uitgewerkt met behulp van een <a href="http://www.archimatetool.com/">archimate tool</a>. Uit het model kunnen diverse architectuur schema's (views) samengesteld worden die gebruikt worden voor verdere detaillering en besluitvorming in het verandertraject. Hieronder het eerste architectuurproduct, een algemeen overzicht.</div>
<div class="separator" style="clear: both; text-align: start;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiR17l1xkQFXUKYkgyg1va5yeIddUgsxlDANKRoS9hvTzmksH-j2kR1IsveGJiwPW1akAVrQjTlYXhZHSp_OVnmJS5v81NBxCbBrypDllZQSvbPEIIYHhwcAv6eopcNK7RrK8YXreLiQcY/s1600/DAMO-OBS.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="371" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiR17l1xkQFXUKYkgyg1va5yeIddUgsxlDANKRoS9hvTzmksH-j2kR1IsveGJiwPW1akAVrQjTlYXhZHSp_OVnmJS5v81NBxCbBrypDllZQSvbPEIIYHhwcAv6eopcNK7RrK8YXreLiQcY/s640/DAMO-OBS.png" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: start;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: start;">
<br /></div>
<div class="separator" style="clear: both; text-align: start;">
De uitgangspunten van het model zijn de principes van de organisatie:</div>
<div class="separator" style="clear: both; text-align: start;">
1. beheer bij de bron,</div>
<div class="separator" style="clear: both; text-align: start;">
2. eenmalige opslag - meervoudig gebruik,</div>
<div class="separator" style="clear: both; text-align: start;">
3. eenduidig eigenaarschap en -beheer</div>
<div class="separator" style="clear: both; text-align: start;">
<br /></div>
<div class="separator" style="clear: both; text-align: start;">
en de constraint van de leverancier:</div>
<div class="separator" style="clear: both; text-align: start;">
4. het huidige datamodel OBS kan niet worden aangepast.</div>
<div class="separator" style="clear: both; text-align: start;">
<br /></div>
<div class="separator" style="clear: both; text-align: start;">
Hier volgt een korte toelichting op de plaat:</div>
<div class="separator" style="clear: both; text-align: start;">
<br /></div>
<div class="separator" style="clear: both; text-align: start;">
Op de technieklaag (de groene elementen) is te zien dat het databaseplatform van DEMO en OBS van elkaar verschillen. Dit is een belangrijk gegeven.</div>
<div class="separator" style="clear: both; text-align: start;">
<br /></div>
<div class="separator" style="clear: both; text-align: start;">
Op de proceslaag (de gele elementen) is te zien dat het OBS gebruikt wordt door het proces <i>In stand houden.</i></div>
<div class="separator" style="clear: both; text-align: start;">
<i><br /></i></div>
<div class="separator" style="clear: both; text-align: start;">
Het proces <i>databeheer </i>kent de bijzondere rol <i>bronhouderschap</i>. Dat betekent dat de organisatie kennelijk de (mede-) regisseur/producent is van de basisregistratie BRO. Uiteraard alleen voor de eigen peilbuizen.</div>
<div class="separator" style="clear: both; text-align: start;">
<br /></div>
<div class="separator" style="clear: both; text-align: start;">
De meeste complexiteit zit in de applicatielaag (de blauwe elementen).</div>
<div class="separator" style="clear: both; text-align: start;">
<br /></div>
<div class="separator" style="clear: both; text-align: start;">
In het OBS bestaat een dataobject <i>stamdata peilbuis</i> in de vorm van een fysieke databasetabel. In dezelfde databaseomgeving (MSSQL ) wordt een nieuw dataobject <i>kerndata peilbuis(OBS)</i> geintroduceerd, dat het dataobject <i>stamdata peilbuis</i> voor een belangrijk deel overlapt. De overlappende databaseattributen hebben identieke namen en datatypes<i>.</i></div>
<div class="separator" style="clear: both; text-align: start;">
<br /></div>
<div class="separator" style="clear: both; text-align: start;">
In DEMO is een vergelijkbaar dataobject <i>kerndata peilbuis(KR),</i> dat wil zeggen dat attribuut namen en -datatypes gelijk zijn getrokken met <i>kerndata peilbuis(OBS)</i>, maar dat het uiteraard wel in een andere databaseomgeving is geimplementeerd (PostgreSQL).</div>
<div class="separator" style="clear: both; text-align: start;">
<br /></div>
<div class="separator" style="clear: both; text-align: start;">
Deze twee kerndata dataobjecten worden gebruikt om een brug te slaan tussen DEMO en het OBS. Het proces <i>databeheer </i>is daarbij verantwoordelijk voor de inrichting en het beheer van het dataobject <i>kerndata peilbuis(KR).</i> Het proces <i>In stand houden</i> heeft geen inhoudelijke kennis van basis- en kernregistraties en zal met <i>databeheer</i> een overeenkomst aangaan (<i>SLA</i>) ten aanzien van het beheer en de beschikbaarheid van <i>kerndata peilbuis(KR). </i>Dit wordt mogelijk de kern van het succes. Ieder staat voor eigen taken en verantwoordelijkheden, de scheiding is helder.</div>
<div class="separator" style="clear: both; text-align: start;">
<br /></div>
<div class="separator" style="clear: both; text-align: start;">
De uitwerking van <i>kerndata peilbuis(KR)</i> door <i>databeheer</i> leidt tot een databaseview die voor de geautomatiseerde koppeling beschikbaar wordt gesteld (SLA). Nogmaals, het is een werkend, doch fictief voorbeeld.</div>
<div class="separator" style="clear: both; text-align: start;">
<br /></div>
<div style="background-color: #ebebeb;">
<br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: xx-small;">CREATE OR REPLACE VIEW geostore.zoo8zh8d AS</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: xx-small;"> SELECT</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: xx-small;"> a.guid AS _PRFGUID,</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: xx-small;"> c.name::character varying(24) AS _MBBHRDESCR,</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: xx-small;"> d.gemeentena::character varying(50) AS _PRFMBGEMEENTE,</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: xx-small;"> b.naam::character varying(36) AS _PRFMBCODE,</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: xx-small;"> b.functie::character varying(25) AS _MBDLDESCR,</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: xx-small;"> a.buisnummer::numeric(3) AS _PRFMBGFILTERNUMMER,</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: xx-small;"> a.buistype::character varying(50) AS _PRFBSTYP,</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: xx-small;"> a.status::character varying(20) AS _MBSTSDESCR,</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: xx-small;"> a.lengte::numeric(6,3) AS _PRFMBGDIEPTEBUIS,</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: xx-small;"> a.bovenkant::numeric(6,3) AS _PRFMBGBKPEILBUIS,</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: xx-small;"> a.filtermateriaal::character varying(50) AS _MBGMDESCR,</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: xx-small;"> a.filterdiameter::numeric(6,3) AS _PRFMBGDIAMETERFILTER,</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: xx-small;"> a.filterbovenkant::numeric(6,3) AS _PRFMBGBKFILTER,</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: xx-small;"> a.filteronderkant::numeric(6,3) AS _PRFMBGOKFILTER,</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: xx-small;"> (((e.gemeente::text || e.sectie::text) || e.nummer))::character varying(15) AS _PRFMBGPERCEEL,</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: xx-small;"> st_x(st_transform(b.geometrie, 4326)) AS _PRFGEOCODEX,</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: xx-small;"> st_y(st_transform(b.geometrie, 4326)) AS _PRFGEOCODEY</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: xx-small;"> FROM monitoringsbuis a</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: xx-small;"> LEFT JOIN grondwatermonitoringsput b ON a.grondwatermonitoringsput = b.guid AND b.naamruimte::character varying(15) = ((( SELECT kvstore.value</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: xx-small;"> FROM kvstore</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: xx-small;"> WHERE kvstore.key::text = 'nsKvK'::text))::character varying(15))</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: xx-small;"> LEFT JOIN bgt.administrativeunit c ON st_within(b.geometrie, c.geom) = true</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: xx-small;"> LEFT JOIN dkk.gemeente d ON st_within(b.geometrie, d.geom) = true</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: xx-small;"> LEFT JOIN dkk.perceel e ON st_within(b.geometrie, e.the_geom) = true;</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: xx-small;"><br /></span></div>
</div>
<div class="separator" style="clear: both; text-align: start;">
<br /></div>
<div class="separator" style="clear: both; text-align: start;">
Wat valt op?</div>
<div class="separator" style="clear: both; text-align: start;">
<br /></div>
<ul>
<li>dat <i>monitoringsbuis</i> is kennelijk het centrale object in OBS is, aangevuld met wat data van <i>grondwatermonitoringsput (naam, functie en ligging)</i> en wat locatiegegevens (<i>gemeente, kadastraal perceel, lokale overheid</i>).</li>
<li>Er wordt nu gefilterd op eigendom peilbuizen (<i>eigenaarschap = KvK nummer van de organisatie)</i>, uiteraard zijn op basis van de <i>naamruimte </i>ook andere afspraken te maken (zie eerdere berichten). </li>
<li>Veel attributen in PostgreSQL zijn ruim gedimensioneerd, bijvoorbeeld als datatype <span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;">text. </span>MSSQL databases (en daarmee ook OBS) zijn in dimensionering veel restrictiever en zien liever datatypes als <span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;">character varying(xx)</span>. </li>
<li>OBS kent geen geometrie attribuut, wel numerieke <i>x</i> en <i>y</i> kolommen. Deze kolommen bevatten bovendien LON/LAT waarden die gebruikt worden in navigatiesystemen (om met een TOMTOM naar een peilbuis toe te kunnen rijden). DEMO gebruikt een ander coordinatensysteem, zodat een conversie noodzakelijk is.</li>
</ul>
<div>
De runtime voor het opvragen van alle 1475 peilbuizen in deze view is ca. 1 sec.<br />
<br />
In volgende berichten worden drie koppelscenario's uitgewerkt, een ETL koppeling (1) en een realtime linked-server koppeling (2) waarbij de werking en inrichting van het OBS niet wordt aangepast, en een koppeling op basis van services (3), waarbij het OBS ingrijpender wordt aangepast.<br />
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-1882006622661545029.post-36029132585885727792016-04-23T23:52:00.000+02:002018-09-16T22:45:03.648+02:00Peilbuis, of hoe informatie bruikbaar wordt (1)Gefragmenteerd gegevensbeheer is een bestaand vraagstuk dat niet 1-2-3 opgelost gaat worden. Ieder multidisciplinair object komt in meerdere systemen voor, en systemen praten onvoldoende met elkaar.<br />
<br />
Het objecttype <i>Peilbuis</i> wordt als voorbeeld bij de horens gevat.<br />
In dit eerste deel wordt gekeken naar een bruikbare gegevensstructuur en hoe deze geimplementeerd kan worden in een kernregistratie.<br />
<a name='more'></a><br />
De nationale registratie van peilbuizen maakt deel uit van de Basisregistratie Ondergrond (BRO). Deze basisregistratie is nog volop in ontwikkeling. Er komt een informatiemodel IMBRO dat aansluit op de andere sectorale IM* modellen zoals IMGeo, IMWA, IMRO etc. Meer informatie over de BRO is te vinden op de websites:<br />
<a href="https://bro.pleio.nl/">Basisregistratie Ondergrond op Pleio</a><br />
<a href="http://www.broinfo.nl/">BROinfo</a><br />
<br />
Waterbeheerders zijn zowel afnemer èn leverancier van peilbuisgegevens. Het leveren van informatie via berichtenverkeer en PKI-overheidscertificaten aan de BRO wordt straks (> 2017) lastig en complex. Begin maar vast met inlezen zou ik zeggen. Des te belangrijker om de eigen informatievoorziening tijdig op orde te krijgen.<br />
<br />
Peilbuisgegevens worden al jaren in GIS systemen en Excel opgeslagen. Hierbij wordt gebruik gemaakt van een al ouder gegevensmodel:<br />
<a href="http://www.aquo.nl/Aquo/lm_aquo/entiteit/GWM.htm">http://www.aquo.nl/Aquo/lm_aquo/entiteit/GWM.htm</a><br />
<br />
Dan nu aan de slag.<br />
<br />
<b>1. Op hoofdlijn</b><br />
De basisregistratie BRO is vertrekpunt, maar wordt in DEMO sterk vereenvoudigd Alle gegevens moeten wel tussen BRO en DEMO over en weer uitwisselbaar blijven.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjhzJbqUwD0w3FBpZoU0FNmlCXR-Zqajscb-HbNy_NEuIYwT-e120Owbdb86cSNuSrRM2fmDK-stVwWQhfOkT_bN-7039gnA0m-vZ_jupJ7gRsRyzcF5-b8GVMbRpxBLTMPs1rCz_qK41o/s1600/BRO+peilbuizen.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="225" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjhzJbqUwD0w3FBpZoU0FNmlCXR-Zqajscb-HbNy_NEuIYwT-e120Owbdb86cSNuSrRM2fmDK-stVwWQhfOkT_bN-7039gnA0m-vZ_jupJ7gRsRyzcF5-b8GVMbRpxBLTMPs1rCz_qK41o/s400/BRO+peilbuizen.png" width="400" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<i>Grondwatermonitoringsput</i> en <i>Monitoringsbuis</i> zijn in DEMO <i>top-level</i> objecttypen, en kennen daardoor standaard al de volgende eigenschappen:<br />
<ul>
<li>Unieke identificatie (guid)</li>
<li>Objectbegintijd</li>
<li>Objecteindtijd</li>
<li>Tijdstipregistratie</li>
<li>Eindregistratie</li>
<li>Indicatie 'In onderzoek'</li>
</ul>
Beiden zijn bovendien <i>fysieke </i>objecttypen, waardoor de volgende eigenschappen ook al aanwezig zijn:<br />
<ul>
<li>Status</li>
<ul>
<li>'planvorming'</li>
<li>'klaar voor gebruik'</li>
<li>'in gebruik'</li>
<li>'storing'</li>
<li>'buiten gebruik'</li>
<li>'niet meer aanwezig'</li>
</ul>
<li>Ontstaanswijze</li>
<ul>
<li>'mensenwerk'</li>
</ul>
</ul>
<div>
Deze eigenschappen worden hergebruikt, waarbij definities in DEMO leidend zijn.</div>
<div>
<br /></div>
<div>
<b>2. Intrinsieke eigenschappen</b></div>
<div>
Het is altijd de uitdaging de eigenschappen van een object te beschrijven die er toe doen, en weg te laten wat indirect is of zelfs niet aan de objectbeschrijving bijdraagt. Beschrijf daarom het <i>wat (fysieke kenmerken)</i>, en niet het <i>hoe</i>, <i>waarom</i> of <i>waarmee.</i> Daarom:</div>
<div>
<ul>
<li>geen maaiveldhoogte</li>
<li>geen informatie over meetplannen, monsternames, meetfrequenties</li>
<li>geen informatie over watervoerende pakketten</li>
<li>geen onderhoudsaspecten</li>
<li>geen algemene 'opmerkingen'</li>
</ul>
<div>
Deze eigenschappen maken deel uit van de eerder genoemde standaarden, maar worden dus niet overgenomen.<br />
<br /></div>
<div>
Over zelf geplaatste peilbuizen moeten extra gegevens bijgehouden en geleverd worden, zoals KvK nummers van aannemers en onderhoudsdiensten, de registratiestatus en -geschiedenis, toegepaste technieken en methodieken etc. etc. Al deze<i> metadata</i> wordt in DEMO samengevat in èèn XML veld, wat de gegevensbeheerder veel werk zal schelen.</div>
<div>
<br /></div>
<b>3. Nieuwe domeinen</b><br />
<div>
In een eerdere blog is al eens uitgelegd hoe domeinen in DEMO werken. Langs die weg worden de noodzakelijke nieuwe BRO domeinen uitgewerkt:<br />
<ul>
<li>Nieuwe domeinlijsten en -waarden verzamelen uit BRO documentatie</li>
<li>Domeinwaarden inlezen in tabel <i>public.domeinwaarden</i></li>
<li>Nieuwe datatypen definieren</li>
<ul>
<li><i>bro-id</i></li>
<li><i>kvknummer</i></li>
<li><i>initielefunctie</i></li>
<li><i>typemonitoringsbuis</i></li>
<li><i>materiaalmonitoringsbuis</i></li>
</ul>
<li>Nieuwe check-constraints voor deze datatypen definieren</li>
<li>KvK nummer eigen organisatie vastleggen (voor beheer eigen peilbuizen conform BRO model)</li>
</ul>
<div>
Voorbeelden:</div>
<div>
<br /></div>
<div style="background-color: #ebebeb; font-family: "courier new" , "courier" , monospace; font-size: x-small;">
<br />
--KvK nummer kent 8 cijfers, òf 11 cijfers, en kan een voorloopnul bevatten.<br />
--https://openkvk.nl/<br />
--DROP DOMAIN public.kvknummer;<br />
CREATE DOMAIN public.kvknummer<br />
AS character varying<br />
COLLATE pg_catalog."default"<br />
CONSTRAINT kvknummer CHECK (VALUE ~ '^([0-9]{11}|[0-9]{8})$');<br />
ALTER DOMAIN public.kvknummer OWNER TO postgres;<br />
<br />
--DROP DOMAIN public.typemateriaal;<br />
CREATE DOMAIN public.typemateriaal<br />
AS character varying<br />
COLLATE pg_catalog."default"<br />
CONSTRAINT typemateriaal CHECK (VALUE = ANY (get_domainvalues('imbro', 'typemateriaal')));<br />
ALTER DOMAIN public.typemateriaal OWNER TO postgres;
<br />
<br />
--Eigen KvK nummer vastleggen<br />
INSERT INTO public.kvstore VALUES(DEFAULT, 'nsKvK', '17251019');</div>
<br />
<b>3. De nieuwe tabellen</b><br />
<br />
<div style="background-color: #ebebeb; font-family: "courier new" , "courier" , monospace; font-size: x-small;">
<br />
CREATE TABLE grondwatermonitoringsput<br />
grondwatermonitoringsput_pk serial PRIMARY KEY,<br />
BRO_id public.broid,<br />
naam varchar,<br />
eigenaar public.kvknummer,<br />
functie public.initielefunctie,<br />
metadata xml,<br />
geometrie geometry(POINT,28992),<br />
actor varchar,<br />
CONSTRAINT grondwatermonitoringsput_guid_key UNIQUE (guid)<br />
) INHERITS (fysiekobject)<br />
WITH ( OIDS=FALSE )<br />
<br />
CREATE TABLE monitoringsbuis<br />
(<br />
monitoringsbuis_pk serial PRIMARY KEY,<br />
grondwatermonitoringsput varchar,<br />
buisnummer numeric(3),<br />
buistype public.typemonitoringsbuis,<br />
bovenkant numeric(6,3),<br />
lengte numeric(6,3),<br />
filtermateriaal public.typemateriaal,<br />
filterdiameter numeric(4),<br />
filterbovenkant numeric(6,3),<br />
filteronderkant numeric(6,3),<br />
metadata xml,<br />
actor varchar,<br />
CONSTRAINT monitoringsbuis_grondwatermonitoringsput_fkey FOREIGN KEY (grondwatermonitoringsput)<br />
REFERENCES public.grondwatermonitoringsput (guid) MATCH SIMPLE<br />
ON UPDATE NO ACTION ON DELETE NO ACTION<br />
) INHERITS (fysiekobject)<br />
WITH ( OIDS=FALSE )</div>
<br />
De tabellen zijn zowel in het schema <i>public </i>als in het schema <i>archive </i>gemaakt.<br />
<br />
<b>4. De nieuwe triggers</b><br />
Zoals bij ieder nieuw objecttype zijn INSERT, UPDATE en DELETE triggers gemaakt voor:<br />
<ul>
<li>het registreren van nieuwe objecten </li>
<li>het vastleggen van het <i>KvK nummer (eigenaar) </i>bij invoeren van nieuwe records</li>
<li>het bijhouden van historie bij wijzigen en verwijderen van objecten</li>
</ul>
<br />
<span style="font-weight: bold;">4. Security</span><br />
<br />
<span style="font-family: inherit;">(als voorbeeld alleen de monitoringsbuis)</span><br />
<br /></div>
<div style="background-color: #ebebeb; font-family: "courier new" , "courier" , monospace; font-size: x-small;">
CREATE ROLE nsBRO;<br />
COMMENT ON ROLE nsBRO IS 'Informatiedomein Basisregistratie Ondergrond';<br />
<br />
GRANT nsbro TO "joe@<organisatie>.nl";<br />
<br />
GRANT SELECT ON monitoringsbuis TO PUBLIC;<br />
<br />
-- public schema only<br />
GRANT INSERT, UPDATE, DELETE ON public.monitoringsbuis TO NSBRO;<br />
ALTER TABLE public.monitoringsbuis ENABLE ROW LEVEL SECURITY;<br />
CREATE POLICY user_mod ON public.monitoringsbuis FOR ALL USING (true) WITH CHECK (naamruimte = (SELECT value FROM public.kvstore WHERE key = 'nsBRO')::varchar);<br />
ALTER TABLE public.monitoringsbuis ENABLE TRIGGER ALL;<br />
</organisatie></div>
<br />
Hiermee is het objecttype Peilbuis geimplementeerd in DEMO. Er is inmiddels ook testdata beschikbaar, de volgende keer wordt dit als <i>proof-of-eating-the-pudding</i> ingelezen. Daarna staat alles gereed om eens naar het gegevensbeheer te kijken.</div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-1882006622661545029.post-29163066482741995992016-03-20T22:08:00.000+01:002018-10-04T15:19:44.484+02:00Basisregistratie Grootschalige TopografieDe Basisregistratie Grootschalige Topografie (BGT) wordt dé gedetailleerde grootschalige basiskaart (digitale kaart) van heel Nederland. Op éénduidige wijze wordt de ligging van alle fysieke objecten zoals gebouwen, wegen, water, spoorlijnen en (landbouw)terreinen geregistreerd.<br />
<br />
De BGT wordt als open data aangeboden via het PDOK portaal. Deze basisregistratie blijkt prima in te lezen in QGIS en op te slaan in PostgreSQL.<br />
<a name='more'></a><div>
<br /></div>
<div>
De productie- en beheertaak van de BGT is belegd bij meerdere bronhouders, waarbij iedere bronhouder verantwoordelijk is voor een eigen thema: </div>
<div>
<ul>
<li>Gemeenten</li>
<li>Ministerie van Defensie</li>
<li>Ministerie van Economische Zaken</li>
<li>Ministerie van Infrastructuur en Milieu</li>
<li>Prorail</li>
<li>Provincies</li>
<li>Waterschappen</li>
</ul>
<div>
Zo zijn waterschappen verantwoordelijk voor het thema <i>water</i>. Omdat deze blog toch over water gaat, zijn maar eens wat BGT 2x2 km vakken en als één zip bestand gedownload (zie deze <a href="https://www.pdok.nl/nl/producten/pdok-downloads/download-basisregistratie-grootschalige-topografie">BGT</a> pagina).<br />
<br />
Het downloadbestand bevat per objecttype een GML bestand, bijvoorbeeld <i>bgt_waterdeel.gml</i>.</div>
</div>
<div>
<br /></div>
<div>
<b>DEMO</b></div>
<div>
<br /></div>
<div>
Het inlezen van <i>bgt_waterdeel</i> in DEMO start met het vertalen van het GML bestand naar een tijdelijke QGIS laag via het menupad:</div>
<div>
<i style="background-color: white; font-family: arial, tahoma, helvetica, freesans, sans-serif; font-size: 13px; line-height: 18.2px;">Processing -> Toolbox -> GDAL/OGR -> [OGR] Conversion -> Convert format</i></div>
<div>
Bij uitvoer is gekozen voor output naar een tijdelijke laag (ESRI Shapefile formaat).<br />
<br />
Met een tweede stap wordt het shapebestand opgeslagen in een databasetabel:</div>
<div>
<i style="background-color: white; font-family: arial, tahoma, helvetica, freesans, sans-serif; font-size: 13px; line-height: 18.2px;">Processing -> Toolbox - GeoServer/PostGIS tools -> Import into PostGIS</i></div>
<div>
Vooraf is hiervoor een nieuw <i>bgt </i>databaseschema gemaakt, de rest gebeurt automatisch.<br />
<br />
De DDL van de PostgreSQL tabel ziet er na het inlezen als volgt uit:<br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"><br /></span>
<br />
<div style="background-color: #ebebeb;">
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;">CREATE TABLE bgt.waterdeel</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;">(</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"> id serial NOT NULL,</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"> the_geom geometry(MultiPolygon,28992),</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"> gml_id character varying(80),</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"> creationda character varying(10),</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"> tijdstipre character varying(23),</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"> relatieveh integer,</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"> inonderzoe integer,</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"> lv-publica character varying(23),</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"> bronhouder character varying(5),</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"> namespace character varying(8),</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"> lokaalid character varying(38),</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"> bgt-status character varying(8),</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"> plus-statu character varying(10),</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"> class character varying(20),</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"> plus-type character varying(23),</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"> eindregist character varying(23),</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"> CONSTRAINT waterdeel_pkey PRIMARY KEY (id)</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;">)</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;">WITH (</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"> OIDS=FALSE</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;">);</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;">ALTER TABLE bgt.waterdeel</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"> OWNER TO postgres;</span></div>
<br />
In onderstaand QGIS kaartvenster zijn luchtfoto's (PDOK), kadastrale percelen (DKK), waterdelen (BGT) en as-waterlopen (webservice van een waterschap) in één beeld samengebracht.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1lMSSve54eN8VL1NyCVetxMC69YFLubCNIZaQFJhTRuf63TX4x-uqCbiXyvbaJ7pZ8cmnRGKRs4QqUnEi4C46BHaImfDHNZYsPS-o-L6somkgZLqDemQfJcZIJeMM2f2hkrI_AJwAhg4/s1600/Schermafdruk+2016-03-20+20.52.54.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="420" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1lMSSve54eN8VL1NyCVetxMC69YFLubCNIZaQFJhTRuf63TX4x-uqCbiXyvbaJ7pZ8cmnRGKRs4QqUnEi4C46BHaImfDHNZYsPS-o-L6somkgZLqDemQfJcZIJeMM2f2hkrI_AJwAhg4/s640/Schermafdruk+2016-03-20+20.52.54.png" width="640" /></a></div>
<br /></div>
<div>
Ik ben door de kaart gaan wandelen en zie een aantal kansen voor DEMO.<br />
Maar dat zijn dan weer onderwerpen voor een volgende keer. </div>
<div>
<i style="background-color: white; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13px; line-height: 18.2px;"><br /></i></div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-1882006622661545029.post-3434134704091793162016-02-28T22:09:00.000+01:002019-03-14T15:57:42.423+01:00De Digitale Kadastrale Kaart (DKK)De Nederlandse overheid heeft bepaald dat openbare overheidsgegevens door iedereen mogen worden gebruikt en verspreid. Deze gegevens worden open data genoemd. Het Kadaster biedt de Digitale kadastrale kaart (DKK) aan als open data via <a href="http://www.kadaster.nl/web/Themas/Registraties/PDOK.htm">Publieke Dienstverlening op de Kaart</a> (PDOK). Deze kaart is zo in te lezen in QGIS.<br />
<a name='more'></a><br />
<div style="background-color: #ebebeb;">
<br />
<b>Perceel</b>: een virtuele eenheid van zakelijk recht, in het terrein af te bakenen door middel van uit te zetten en omsluitende rechtsgrenzen, en voorzien van een unieke kadastrale aanduiding volgens de identificatie van het Rijkskadaster.<br />
<br /></div>
<div>
<br />
<br />
De DKK bestaat uit een set van GML bestanden, telkens per provincie gebundeld:<br />
<br />
<ul>
<li>Annotatie.gml</li>
<li>Bebouwing.gml</li>
<li>Kadastralegrens.gml</li>
<li>Perceel.gml</li>
</ul>
Hier schemert een oude discussie doorheen. Zijn (perceel)vlakken wel beschikbaar? Of moeten die aan de hand van deze gegevens gebouwd worden? Een beheerder van 'ruimte' is in eerste instantie geinteresseerd in perceelvlakken, maar kreeg in afgelopen jaren vaak grenzen aangeleverd.<br />
<br />
Diethard Jansen van <i>GIS-hulp</i> heeft in een blog (<a href="http://www.qgis.nl/2016/01/29/kadastrale-percelen-genereren-vanuit-brk/">kadastrale-percelen-genereren-vanuit-brk</a>) uitgelegd hoe je zelf in een aantal <i>(file-based)</i> stappen in QGIS vlakken kunt opbouwen aan de hand van de perceelgrenzen uit <i>Kadastralegrens.gml,</i> en hoe je deze met een <i>JOIN</i> kan koppelen aan perceelnummers uit <i>Perceel.gml</i>.<br />
<div>
<br /></div>
<div>
<div>
<b>DEMO</b></div>
</div>
<div>
<br /></div>
<div>
In <i>demo</i> kunnen we een aantal stappen overslaan.</div>
<div>
<br /></div>
<div>
1. Omdat het data van derden betreft (geen beheer !) wordt in de database een apart schema <i>dkk</i> gemaakt.</div>
<div>
<br /></div>
<div>
2. In QGIS wordt via de menuoptie <i>Processing - Toolbox - GeoServer/PostGIS tools - Import into PostGIS</i> de onderstaande opdracht uitgevoerd:</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjc0shY-h5rNTs-HZDGOsxVlJ_G_mj9GsH7jgvzDnw8MDhvyqVlKyUp1Almul03KAI28YjP-E3X3PRoZYtXNnjvJr8u5MwQkBn54dRPbN93mC8oKNm7m-iiqgcKBoWgOC8S-G0RxEuHwZE/s1600/dkk_import1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="297" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjc0shY-h5rNTs-HZDGOsxVlJ_G_mj9GsH7jgvzDnw8MDhvyqVlKyUp1Almul03KAI28YjP-E3X3PRoZYtXNnjvJr8u5MwQkBn54dRPbN93mC8oKNm7m-iiqgcKBoWgOC8S-G0RxEuHwZE/s400/dkk_import1.png" width="400" /></a></div>
<div>
<br /></div>
<div>
Voilà, 1.2 miljoen percelen van de provincie Noord-Brabant zijn nu in de demo database aanwezig.</div>
<div>
<br /></div>
<div>
3. In QGIS kan het resultaat als PostGIS datalaag aan het kaartbeeld toegevoegd worden en kan aangegeven worden hoe percelen gelabeld moeten worden met perceelnummers.</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQyMlzQY-7BwPcrFS5Y-MKx5cZ3l5FQqPjwNeDdv4MHENQErotrlbQp4EMfKWPi70Ua4axoWaEFw3QUXLrVAGuENhyphenhyphenLkuh9OsWrimCc1CdnodwP4PYlAZVJPqZrfIZ-Wwa-rFiaL97R4A/s1600/dkk_waterlopen.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="352" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQyMlzQY-7BwPcrFS5Y-MKx5cZ3l5FQqPjwNeDdv4MHENQErotrlbQp4EMfKWPi70Ua4axoWaEFw3QUXLrVAGuENhyphenhyphenLkuh9OsWrimCc1CdnodwP4PYlAZVJPqZrfIZ-Wwa-rFiaL97R4A/s640/dkk_waterlopen.png" width="640" /></a></div>
<div>
<br /></div>
<div>
De crux van dit verhaal zit in een bestand <i>perceel.gfs</i>.<br />
Dit bestand geeft de opbouw van <i>perceel.gml</i> aan, het is een soort stylesheet.<br />
<br />
Als een .gml bestand de eerste keer ter verwerking wordt aangeboden zonder bijbehorend .gfs of .xsd bestand, dan wordt een .gfs bestand na een analyse automatisch aangemaakt.<br />
<br />
Door dit bestand een beetje naar eigen inzicht aan te passen, sluit het netjes aan op de <i>demo </i>situatie, is het resultaat wat compacter, en levert het netto perceelvlakken op.<br />
<br />
Iedere keer dat in PDOK een nieuw <i>perceel.gml</i> beschikbaar komt (1x maand ?), is het inlezen van de kadastrale kaart nu een fluitje van een cent geworden.<br />
<br />
Perceel.gfs:</div>
<div style="background-color: #ebebeb;">
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"><GMLFeatureClassList></span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"> <GMLFeatureClass></span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"> <Name>Perceel</Name></span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"> <ElementPath>Perceel</ElementPath> </span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"> <SRSName>urn:ogc:def:crs:EPSG::28992</SRSName></span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"> <PropertyDefn></span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"> <Name>lokaalID</Name></span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"> <ElementPath>identificatie|NEN3610ID|lokaalID</ElementPath></span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"> <Type>Integer</Type></span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"> </PropertyDefn></span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"> <PropertyDefn></span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"> <Name>Objectbegintijd</Name></span><span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"><ElementPath>historie|KadasterHistorie|logischTijdstipOntstaan</ElementPath> <Type>String</Type></span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"> <Width>23</Width></span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"> </PropertyDefn></span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"> <PropertyDefn></span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"> <Name>gemeente</Name></span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"><ElementPath>kadastraleAanduiding|TypeKadastraleAanduiding|kadastraleGemeente|KadastraleGemeenteKeuze|AKRKadastraleGemeenteCode</ElementPath></span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"> <Type>String</Type></span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"> <Width>5</Width></span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"> </PropertyDefn></span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"> <PropertyDefn></span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"> <Name>sectie</Name><ElementPath>kadastraleAanduiding|TypeKadastraleAanduiding|sectie</ElementPath></span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"> <Type>String</Type></span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"> <Width>2</Width></span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"> </PropertyDefn></span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"> <PropertyDefn></span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"> <Name>nummer</Name> <ElementPath>kadastraleAanduiding|TypeKadastraleAanduiding|perceelnummer</ElementPath></span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"> <Type>Integer</Type></span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"> </PropertyDefn></span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"> <PropertyDefn></span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"> <Name>oppervlak</Name> <ElementPath>kadastraleGrootte|TypeOppervlak|waarde</ElementPath></span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"> <Type>Integer</Type></span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"> </PropertyDefn></span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"> <GeomPropertyDefn></span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"> <Name>begrenzing</Name></span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"> <ElementPath>begrenzingPerceel</ElementPath></span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"> <Type>Polygon</Type></span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"> </GeomPropertyDefn></span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"> </GMLFeatureClass></span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"></GMLFeatureClassList></span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"><br /></span></div>
</div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-1882006622661545029.post-63180238768417503482016-02-19T18:17:00.002+01:002016-03-20T22:11:21.046+01:00CREATE DOMAINAan een PostgreSQL database kunnen <i>domains</i> toegevoegd worden. Een prima basis voor het opnemen van domeinlijsten in databasetabellen.<br />
<div>
<a name='more'></a><br />
<b>DAMO: Domeinwaarden opnemen in tabellen</b></div>
<div>
<br />
Een PostgreSQL <i>domain</i> is eigenlijk een speciaal data-type met optionele constraints, bijvoorbeeld:</div>
<br />
<div style="background-color: #ebebeb;">
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;">CREATE DOMAIN public.jaofnee AS character varying</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"> CONSTRAINT jaofnee CHECK (value = ANY (ARRAY['j', 'ja', 'n', 'nee']));</span>
<br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"><br /></span></div>
<div>
<br /></div>
<div>
Een eenmaal gedefinieerd domain kan in tabeldefinities toegepast worden:<br />
<br /></div>
<div style="background-color: #ebebeb;">
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;">CREATE TABLE object</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;">(<br /> ..</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"> inonderzoek jaofnee,</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"> ..<br />)</span>
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;">
</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"><br /></span></div>
<br />
Het voorbeeld spreekt voor zich. De grote winst in het gebruik van <i>domains</i> is dat de check constraints geen onderdeel (meer) uitmaken van de tabeldefinities, maar van generieke data-typen:<br />
<br />
<ul>
<li>eenvoudig van opzet</li>
<li>éénmalig definieren, meervoudig toepassen in tabellen</li>
<li>geen tabelonderhoud bij domein aanpassingen</li>
</ul>
<br />
<br />
Maar het kan nog beter..<br />
Door check-constraints te laten verwijzen naar de tabel <em>public.domeinwaarden</em> waarin alle mogelijke domeinwaarden zijn opgenomen neemt het eenduidig gebruik toe en het beheer nog verder af. Zie als voorbeeld het volgende speciale data-type <i>watertypekwalitatief</i>:<br />
<br />
<div style="background-color: #ebebeb;">
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"><br /></span>
<br />
<div style="background-color: #ebebeb;">
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;">CREATE DOMAIN public.watertypekwalitatief</span></div>
<div style="background-color: #ebebeb;">
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"> AS character varying</span></div>
<div style="background-color: #ebebeb;">
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"> COLLATE pg_catalog."default"</span></div>
<div style="background-color: #ebebeb;">
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"> CONSTRAINT watertypekwalitatief CHECK (VALUE = ANY (get_domainvalues('aquo', 'watertypekwalitatief')));</span></div>
<div style="background-color: #ebebeb;">
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;">ALTER DOMAIN public.watertypekwalitatief OWNER TO postgres;</span></div>
<div style="background-color: #ebebeb;">
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"><br /></span>
</div>
</div>
<br />
Mochten domeinwaarden in de tabel <i>public.domeinwaarden </i>later veranderen, dan heeft dat op de tabellen waar deze gebruikt worden geen effect.<br />
<br />
Merk op dat er in deze constraints gebruik gemaakt wordt van een functie <i>get_domainvalues:</i><br />
<br />
<div style="background-color: #ebebeb;">
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"><br /></span></div>
<div style="background-color: #ebebeb;">
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;">CREATE OR REPLACE FUNCTION public.get_domainvalues(varchar, varchar) RETURNS character varying[]</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"> AS 'SELECT array_agg(omschrijving) FROM public.domeinwaarden</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"> WHERE naamruimte = $1 AND domein = $2;'</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;">LANGUAGE SQL SECURITY DEFINER;</span><br />
<br /></div>
<br />
Deze functie stelt aan de hand van twee parameters (in dit voorbeeld '<i>aquo</i>' en '<i>watertypekwalitatief</i>' ) een lijst samen met alle (in het heden EN verleden) passende domeinwaarden:<br />
<br />
<div style="background-color: #ebebeb;">
<br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;">"{"heuvellandbeken bovenloop","heuvellandbeken middenloop","heuvellandbeken benedenloop",rivieren,veenbeken,"overige rivieren",stadswateren,kleigaten,petgaten,"afgesloten zeearmen",laagveenplassen,"licht brakke sloten",duinbeken,"brakke sloten","weteringen (...)"}"</span><br />
<br /></div>
<br />
Veel meer valt er over <i>domains </i>niet te vertellen,<br />
Bij het gebruik van domeinen in objecttabellen komt nog wel de geldigheid ter sprake.<br />
<br />
<div>
<b><br /></b></div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-1882006622661545029.post-1748125194496799712016-02-14T22:00:00.000+01:002018-09-16T22:46:42.121+02:00Normaliseren.. Of niet?We zijn gewend informatie te normaliseren, maar doen we dit niet te vaak, te diep?<br />
Zijn er sowieso criteria's te stellen wanneer genormaliseerd moet worden?<br />
<a name='more'></a><br />
Dit is een typisch voorbeeld van een applicatie waarbij de informatie van een bedrijfsobject <i>Order </i>over meerdere tabellen in de database is verspreid. Alleen het hoogste niveau van normalisatie is te zien, er zijn nog meer tabellen achter deze tabellen. Tezamen maken ze het object <i>Order</i> pas compleet.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgjnGVWseSnYOA8S_JxBXQUxyEiLoqJT9EJfzGyiV2CLFah4GII9LZqU7SIQAxOZ2VnpZiXjm8ghgvbfbBbhcQxdskkmCN_T2XCGsVFaWeIgBMveiBZzdRyGenJZSFtzoQM_VWxwF-xsNU/s1600/RDBMS+disadvantage.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="306" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgjnGVWseSnYOA8S_JxBXQUxyEiLoqJT9EJfzGyiV2CLFah4GII9LZqU7SIQAxOZ2VnpZiXjm8ghgvbfbBbhcQxdskkmCN_T2XCGsVFaWeIgBMveiBZzdRyGenJZSFtzoQM_VWxwF-xsNU/s400/RDBMS+disadvantage.png" width="400" /></a></div>
<br />
Functioneel gezien zijn <i>Orders </i><span style="background-color: white; font-family: "arial" , "tahoma" , "helvetica" , "freesans" , sans-serif; font-size: 13px; line-height: 18.2px;">hiërarchische </span>objecten die zich lastig laat vangen in tabellen en relaties. Mensen en programma's werken bij voorkeur met complete objecten en moeten door het verschil in opslagstructuur continu vertaalslagen maken. Dus ondanks de voordelen die een relationele database heeft op het gebied van integriteit (zal ik in een later bericht iets over zeggen), transacties, bevraging, etcetera, hebben we er soms last van dat alle data in een relationele database is opgeslagen.<br />
<br />
Bij het bouwen van ieder nieuw informatiesysteem wordt tegenwoordig de eis gesteld dat het product 'database onafhankelijk' moet zijn. Eigenlijk is dat vreemd. In dat geval bepaalt de kleinst-gemene-deler de uitgangspunten (ACID, SQL-standaard, etc). Dit legt de oplossing meteen beperkingen op, terwijl veel databasesystemen juist eigen extra's aanbieden. Zolang deze niet gericht zijn op een <i>vendor lock-in</i> zou je daar gebruik van willen maken. In een exit-strategie wordt vooraf onderzocht wat het betekent om van de extra's afscheid te nemen, zodat er een onderbouwde keuze gemaakt kan worden in welke mate onderliggende systemen benut mag worden.<br />
<div>
<div>
<br /></div>
<div>
<div>
<b>DEMO</b><br />
<div>
<br /></div>
<div>
In een eerder bericht '<i>Object hiërarchie in een database'</i> is al een slag gemaakt naar het aanbrengen van object <span style="background-color: white; font-family: "arial" , "tahoma" , "helvetica" , "freesans" , sans-serif; font-size: 13px; line-height: 18.2px;">hiërarchie </span>door middel van overerving van tabellen, een PostgreSQL extraatje. <a href="http://docs.oracle.com/cd/B28359_01/appdev.111/b28371/adobjint.htm#CHDCAIAF">Oracle</a> kent objectrelaties waar dit waarschijnlijk ook mee kan, maar koppelt dit al snel aan applicatieontwikkeling.</div>
<div>
<br /></div>
<div>
Dit bericht gaat echter het over een ander aspect, het vermijden van <i>foreign-key</i> relaties als gevolg van normalisatie.</div>
</div>
</div>
<div>
<br /></div>
<div>
Voor demo is gekozen om bedrijfsobjecten zo min mogelijk te normaliseren naar tabellen, met deze kanttekeningen:</div>
<div>
<ul>
<li>Objecttabellen bevatten nooit eigenschappen van andere objecten, er is géén overlap. Dit is een vorm van normalisatie, die echter niet in tabellen wordt doorgevoerd.</li>
<li>Er kunnen technische redenen zijn om in bepaalde gevallen toch foreign-keys te gebruiken.</li>
</ul>
</div>
<div>
Een aantal overdenkingen bij de kanttekeningen:</div>
<div>
<ul>
<li>Relaties tussen (bedrijfs)objecten worden altijd <i>on-the-fly</i> afgeleid met gebruik van <i>UUID</i> ofwel <i>guid</i> objectidentificaties.</li>
<li>De afleiding vind plaats in (updatable) views, of zelfs buiten de database, in applicaties.</li>
<li>De eigenschappen (tabelkolommen) van objecten die gebonden zijn aan keuzelijsten bevatten geen (<i>foreign-key</i>) verwijzing naar een andere tabel, maar bevatten letterlijk de waarde van de keuze. Dit kost iets meer initiele databaseinrichting en opslagcapaciteit, maar alle data van een object is als één onlosmakelijk geheel zonder meer beschikbaar.</li>
<li>Foreign-key relaties in relationele databases lopen traditioneel van <i>parent </i>naar <i>child,</i> al dan niet via tussentabellen. In DEMO worden relaties tussen objecten juist <i>on-the-fly</i> afgeleid van <i>child </i>naar <i>parent</i>. Dus geen optionele relatie tussen de objecten <i>oppervlaktewaterlichaam </i>en <i>vaarweg </i>(want een oppervlaktewaterlichaam moet geen informatie over vaarwegen bevatten, dat is een ander informatiedomein), maar juist een verplichte verwijzing (door het opnemen van <i>UUIDs</i>) van een <i>vaarweg </i>naar <i>oppervlaktewaterlichamen</i>.</li>
</ul>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7bOrdI9wmoGa05oQXz_PSdnPmt0AthWInmZEMGYr9wgDdcINE3eJBRG23cQFmtK-ntliMy5Qc9KuLH4OL7dGLOmhB6mRIfyk9fOmn52gosJwfBAHkJ3wDTMdbcY2XctPuPnm3UIn2PfI/s1600/Foreign+key+vs+Relate.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="256" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7bOrdI9wmoGa05oQXz_PSdnPmt0AthWInmZEMGYr9wgDdcINE3eJBRG23cQFmtK-ntliMy5Qc9KuLH4OL7dGLOmhB6mRIfyk9fOmn52gosJwfBAHkJ3wDTMdbcY2XctPuPnm3UIn2PfI/s400/Foreign+key+vs+Relate.png" width="400" /></a></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
Het is nog niet volledig in beeld wat de consequenties van deze aanpak zijn, maar het ziet er tot nu toe erg bruikbaar en zinvol uit.</div>
</div>
</div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-1882006622661545029.post-21733477854784333842016-02-13T19:09:00.000+01:002018-09-06T11:56:49.401+02:00Toegangscontrole (3) - emailadres als loginAls er voor een website ingelogd moet worden, gebeurt dat vaak op basis van een emailadres dat gevalideerd kan worden. Door dezelfde keuze te maken voor de toegang tot eigen data, -databases of -toepassingen, kan de toegangscontrole aangescherpt worden. Toegang tot data en systemen voor andere organisaties wordt zo ook eenvoudiger gemaakt.<br />
<a name='more'></a><br />
<div>
In hoofdlijnen steekt het delen van functionaliteit en data met andere organisaties met de bijbehorende toegangscontrole zo in elkaar:</div>
<div>
<br />
<div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhXsQVmXoFbbcCPOvmtDhENR4VSc5h8bPlZ2Y0JY6Z0C-3zUes-6gx3yuYc-MO5IxUp9N20Ovca9ql9H6_B2PhKxYCCYITUHUE9RtA8nMQufc_KoN2os4y_-GKeZ24GVvKCEszWLIB7c6w/s1600/email+login.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="472" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhXsQVmXoFbbcCPOvmtDhENR4VSc5h8bPlZ2Y0JY6Z0C-3zUes-6gx3yuYc-MO5IxUp9N20Ovca9ql9H6_B2PhKxYCCYITUHUE9RtA8nMQufc_KoN2os4y_-GKeZ24GVvKCEszWLIB7c6w/s640/email+login.png" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
</div>
<ul>
<li>Via (legacy) applicaties ontstaat nog steeds data en wordt deze gedeeld binnen de eigen organisatie.</li>
<li>Via een Integratielaag (<a href="http://wso2.com/">WSO2 middleware</a>) worden functionaliteit en data beschikbaar gesteld voor (create, retrieve, update, delete) gebruik binnen samenwerkingsverbanden .</li>
<li>Het toepassen van mailadres georienteerde logins geeft overzicht, de integratielaag kan de toegangscontrole op zich nemen bij de poort.</li>
<li>Security-breaches door misbruik van logins is traceable, analyses zijn zo gemaakt.</li>
</ul>
<br />
<b>Voordelen</b> van gebruik van email logins:<br />
<ul>
<li>Gebruikersnamen zijn per definitie uniek</li>
<li>Gebruiker is (in naam) al gekoppeld aan een (mogelijk externe) organisatie</li>
<li>Externe organisaties kunnen toegang tot data krijgen op basis van hun internetdomeinnaam</li>
<li>Aanvullende authentication kan intern of bij de externe organisatie plaatsvinden</li>
<li>Toegang tot data op basis van bijv OpenID wordt mogelijk</li>
<li>Minimale gebruikersregistratie vooraf</li>
</ul>
<br />
<b>Nadelen</b> van gebruik van email logins:<br />
<div>
<ul>
<li>Als de gebruikersnaam niet afgeschermd wordt, kan dat een privacy issue zijn.</li>
<li>Iedere (externe) organisatie moet beseffen dat een emailadres de basis is voor toegang tot data (Security Awareness)</li>
</ul>
<div>
<br />
Mogelijke maatregelen om de nadelen terug te brengen:</div>
</div>
<div>
<ul>
<li>Zorg voor het gebruik van <i>display namen</i> die afwijken van loginnamen</li>
<li>Toegang tot systeemtabellen (zoals <i>pg_roles</i>) afschermen voor gebruikers</li>
</ul>
<div>
<b><br /></b>
<b>Vertaald naar DEMO</b></div>
</div>
<div>
<br /></div>
<div>
In PostgreSQL worden <i>LOGIN-roles</i> gebruikt als middel om aan te melden.</div>
<div>
Een <i>LOGIN-role</i> staat voor een persoon van vlees en bloed of voor een proces(stap): </div>
<div>
<br /></div>
<div>
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;">jane@hierzo.nl</span></div>
<div>
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;">vergunningen@daarzo.nl</span></div>
<div>
<br /></div>
<div>
Met de definitie van de rol wordt een <i>COMMENT ON ROLE</i> toegevoegd als alternatieve <i>display name</i>.</div>
<div>
<br /></div>
<div style="background-color: #ebebeb;">
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;">CREATE ROLE "jane@<organisatie>.nl" LOGIN</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"> </span><span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;">ENCRYPTED PASSWORD 'md56ea41a82a20a7c9a9d8f17f8b0af07f3'</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"> NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE NOREPLICATION;</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;">GRANT nsbgt TO "jane@<organisatie>.nl";</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;">GRANT nslegger TO "jane@<organisatie>.nl";</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;">COMMENT ON ROLE "jane@<organisatie>.nl" IS 'Jane Doe';</span></div>
<br />
Bij iedere (CRUD) actie op data, inclusief het vastleggen van historie, wordt in de database altijd de (unieke) loginnaam vastgelegd, dus in dit geval: <i>jane@<organisatie>.nl</i>.<br />
<br />
Een kleine aanpassing met veel potentie..<br />
<br /></div>
</div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-1882006622661545029.post-67305965272819533472016-02-11T00:46:00.000+01:002018-09-16T22:46:53.954+02:00DomeintabellenWat is een domeintabel?<br />
Objecten en relaties hebben eigenschappen (bijvoorbeeld: het object ‘werknemer' heeft onder andere een voornaam, achternaam, geslacht, BSN-nummer, woonplaats). Deze eigenschappen zijn mogelijk beperkt in de toegestane waarden, dit heet een domein. Bijvoorbeeld, de eigenschap ‘geslacht' heeft als mogelijke waarden: ‘Man', ‘Vrouw' en ‘Onzijdig'. Deze domeinwaarden worden doorgaans gecodeerd. Voor eigenschappen als ‘voornaam' zijn geen domeintabellen opgesteld, omdat de mogelijke waarden hiervoor onbeperkt zijn.<i>(Bron:<a href="http://www.aquo.nl/glossary/domeintabel/">Aquo.nl-domeintabel</a>) </i><br />
<a name='more'></a><br />
Voor verdere toelichting over het gebruik van domeinen wordt verwezen naar de <i> <a href="http://www.aquo.nl/documents/2013/09/aquo-praktijkrichtlijn-aquo-domeintabellen.pdf">Praktijkrichtlijn Aquo-domeintabellen</a>.</i> Dit document is al enkele jaren oud en wellicht niet geactualiseerd sinds 2011.<br />
<br />
Het is voor informatiesystemen gebruikelijk alle domeinen te verzamelen in enkele domein-, stam- en/of stuurtabellen, waarbij in de objecttabellen sleutels (foreign-key relaties) opgenomen worden die indirect verwijzen naar de juiste domeinwaarden, zoals <i>werknemer > tabelrelatie > geslacht</i>.<br />
Er wordt meestal wat programmatuur om deze tabellen heen geschreven om er een werkend geheel van te maken.<br />
<br />
<div>
Nu een korte beschouwing na wat <a href="http://domeintabellen-idsw.rws.nl/ZoekenDomeintabel.aspx">Aquo domeintabellen</a> bekeken te hebben:</div>
<div>
<br /></div>
<div>
- Er is geen toegevoegde waarde van de kolom <i>ID</i>.</div>
<div>
- Voor 90% van alle domeinwaarden blijkt de kolom <i>code </i>niet significant te verschillen van de kolom <i>afkorting</i>. Sterker, er is maar één tabel gezien waarbij beiden van elkaar afwijken, namelijk <i>WatertypeKwalitatief</i>, waarbij het ook nog eens lijkt dat de kolom <i>afkorting</i> wordt misbruikt als een alternatieve <i>code </i>waarde. Huh..?</div>
<div>
- Het aantal kolommen/eigenschappen kan per domein verschillen, maar er is zo te zien wel een minimum set (waarbij <i>ID </i>en <i>afkorting </i>maar alvast weggelaten worden):</div>
<div>
<ul>
<li><i>Code</i></li>
<li><i>Omschrijving</i></li>
<li><i>Groep</i></li>
<li><i>D_BEGIN</i></li>
<li><i>D_EIND</i></li>
<li><i>D_STATUS</i></li>
</ul>
</div>
<div>
- Alle overige kolommen die af-en-toe voorkomen zijn zeker relevant, maar niet echt geschikt om in een databasetabel te verzamelen.<br />
- De kolom <i>Code </i>is vaak te abstract om te gebruiken als de domeinwaarde, het zegt vaak niets.<br />
<i>- </i>De kolom <i>Omschrijving</i> daarentegen voldoet prima als aanduiding van de domeinwaarde.<br />
<br />
Hierboven is Aquo genoemd als bron voor domeinwaarden, maar er zijn natuurlijk meer bronhouders, inclusief de eigen organisatie.<br />
<br />
<b>Uitwerking in DEMO</b><br />
<br />
1. Er is maar één domeinwaardentabel, in het schema <i>public, </i>voor alle domeinwaarden afkomstig van alle domeinbronhouders, inclusief de eigen organisatie.<br />
<br />
2. De domeinwaardentabel wordt gebruikt als <i>lookup table</i> voor alle schema's binnen (en eventueel buiten) de database.<br />
<br />
3. Een object legt geen verwijzing (sleutel) vast naar een domeinwaarde, maar de <i>omschrijving </i>van die domeinwaarde. Applicaties krijgen hiermee eenvoudiger toegang tot objectinformatie.<br />
<br />
3. Voor iedere domeinwaarde geldt, rekening houdend met historie: <i>once-in, never out</i>. Applicaties worden met een view geholpen om actuele domeinwaarden op te vragen.<br />
<br />
5. Het originele bronrecord van iedere domeinwaarde (ongeacht het aantal kolommen dat het record bevat) bevind zich integraal in de domeinwaardentabel in een JSON kolom. Applicaties kunnen deze structuur geautomatiseerd inlezen en naar wens gebruiken. Voorbeelden volgen later..<br />
<br />
6. Aan een domeinwaarde is te zien of het een waarde is uit een limitatieve <i>enumeratie </i>of een waarde uit een vrij aan te vullen <i>codelijst</i>. Van een enumeratie is altijd een codelijst te maken, maar de limitatieve domeinwaarden blijven voor applicaties altijd apart toepasbaar.<br />
<br />
Zo doende is de volgende tabel ontstaan, waaraan twee views zijn toegevoegd:<br />
<br />
<div style="background-color: #ebebeb;">
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;">CREATE TABLE public.domeinwaarden</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;">(</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"> domeinwaarden_pk serial PRIMARY KEY,</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"> naamruimte varchar,</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"> domein varchar,</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"> code varchar,</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"> omschrijving varchar,</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"> groep varchar,</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"> begindatum date,</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"> einddatum date,</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"> status varchar,</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"> json json,</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"> enumerator boolean,</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"> waardering integer</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;">)</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;">WITH (</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"> OIDS=FALSE</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;">);</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;">ALTER TABLE public.domeinwaarden OWNER TO postgres;</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;">CREATE OR REPLACE VIEW public.current_domeinwaarden AS</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"> SELECT *</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"> FROM domeinwaarden</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"> WHERE einddatum IS NULL;</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;">ALTER TABLE public.current_domeinwaarden</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"> OWNER TO postgres;</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;">CREATE OR REPLACE VIEW public.current_enum_domeinwaarden AS</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"> SELECT *</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"> FROM domeinwaarden</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"> WHERE einddatum IS NULL AND enumerator = true;</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;">ALTER TABLE public.current_enum_domeinwaarden</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"> OWNER TO postgres;</span><br />
<div>
<br /></div>
</div>
<div>
</div>
<br />
Deze opzet is sterk vereenvoudigd ten opzichte van traditionele informatiesystemen.<br />
Er hoeft niets geprogrammeerd te worden.<br />
Het voldoet prima, biedt functioneel gezien zelfs meer mogelijkheden..</div>
<div>
<br />
<br /></div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-1882006622661545029.post-18621757407305491372016-02-08T20:34:00.000+01:002018-09-06T11:55:46.345+02:00Object hiërarchie in een database<div>
De aansluiting van een <em>relational database management system (RDBMS)</em> op een logisch objectenmodel is altijd nog een uitdaging (of veel werk), simpelweg omdat het conceptueel niet op elkaar aansluit. PostgreSQL is onderwater echter object-gericht (ORDBMS) en kan zo aan deze tekortkoming enigszins tegemoet komen.</div>
<a name='more'></a><br />
<div>
Voor het beschrijven van kenmerken van (geo) objecten wordt gebruik gemaakt van de Aquo standaard. De onderstaande plaat (afkomstig uit de <a href="http://www.aquo.nl/documents/2013/09/aquo-praktijkrichtlijn-imwa.pdf">Aquo praktijkrichtlijn IMWA</a>, 2009) en geeft een hiërarchie in objectklassen aan:<br />
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEir3hyFlEHowbgdxCGMzMarL7DTE2OIuAdEBedmLVugV4g9fbmNEFo3n6ZtAfyzRSgb6F1_Q5z1I8tBa3es7bL0nnARbs5MCKcATX9KBg64Jz1Gg2IHAEDqf9cXMhwy8_rtq_tWMJZj5qQ/s1600/IMWA+-+DEMO.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="364" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEir3hyFlEHowbgdxCGMzMarL7DTE2OIuAdEBedmLVugV4g9fbmNEFo3n6ZtAfyzRSgb6F1_Q5z1I8tBa3es7bL0nnARbs5MCKcATX9KBg64Jz1Gg2IHAEDqf9cXMhwy8_rtq_tWMJZj5qQ/s400/IMWA+-+DEMO.png" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div>
<br />
<br />
Het gaat daarbij niet zozeer om de inhoud van de plaat, maar het concept van hiërarchie. Hoe kun je dat slim (her)gebruiken voor gegevensbeheer? Een traditioneel ingerichte database normaliseert bovenstaand model naar meerdere tabellen met de nodige hulptabellen en foreign-keys relaties. Dat wordt al snel een complex en uitgebreid databasemodel, met alle gevolgen voor database- en gegevensbeheer.</div>
<div>
Voor het bevragen van data moeten complexe SQL queries opgesteld worden en applicaties kunnen niet altijd even makkelijk op het datamodel van de database aansluiten.<br />
Kan dat niet beter?<br />
<strong><br /></strong></div>
<div>
<strong>DEMO</strong><br />
<strong><br /></strong></div>
<div>
Postgres, als oject-gericht database systeem, kent de mogelijkheid van <em>tabelovererving</em> dat voor DEMO prima toegepast kan worden.<br />
Daarom is om te beginnen op het hoogste objectniveau een tabel met de naam <em>object</em> gemaakt:<br />
<br /></div>
<div style="background-color: #ebebeb;">
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;">CREATE TABLE object<br />(<br /> object_pk serial PRIMARY KEY,<br /> naamruimte varchar,<br /> guid UUID DEFAULT (SELECT uuid_generate_v4()),<br /> objectbegintijd timestamp DEFAULT CURRENT_TIMESTAMP,<br /> objecteindtijd timestamp,<br /> tijdstipregistratie timestamp DEFAULT CURRENT_TIMESTAMP,<br /> eindregistratie timestamp,<br /> inonderzoek boolean<br />)<br />WITH (<br /> OIDS=FALSE<br />);<br />ALTER TABLE object OWNER TO postgres;</span><br />
<span style="font-family: "courier new"; font-size: x-small;"><br /></span></div>
<br />
<br />
Deze tabel bevat de essentiële metadata <em>over</em> een object, maar geen enkele eigenschap <em>van</em> een object (uitgezonderd de <em>guid</em>), zelfs het objecttype ontbreekt.<br />
Eén niveau dieper komen we bij fysieke - en registratieve objecten. Deze tabellen bevatten door overerving in ieder geval de bovenstaande metadata van object en voegen daar nieuwe attributen op het juiste aggregatieniveau aan toe. Bijvoorbeeld:<br />
<br />
<br />
<div style="background-color: #ebebeb;">
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;">CREATE TABLE fysiekobject<br />(<br /> status public.objectstatus,<br /> ontstaanswijze public.ontstaanswijze,<br /> CONSTRAINT fysiekobject_pk PRIMARY KEY(object_pk)<br />) INHERITS (object)<br />WITH (<br /> OIDS=FALSE<br />);<br />ALTER TABLE public.fysiekobject OWNER TO postgres;</span><br />
<br /></div>
<br />
<br />
Er zijn nog meer kenmerken denkbaar, maar het moet wel passen bij dit aggregatieniveau. Kenmerken als <em>wie is de eigenaar</em>, <em>wie pleegt het onderhoud</em> zijn hier misplaatst, daar is een fysiek object te generiek voor. Zelfs met algemene kenmerken als <em>Wat heeft dit fysieke object gekost (stichtingskosten)</em> loop je al snel tegen beperkingen aan (in de zin van 'niet nuttig' of zelfs 'niet bruikbaar').<br />
De hiërarchie daalt vervolgens een stap dieper af naar bijvoorbeeld <em>oppervlaktewaterlichaam</em>.<br />
<br />
<br />
<div style="background-color: #ebebeb;">
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;">CREATE TABLE oppervlaktewaterlichaam<br />(<br /> code varchar,<br /> naam varchar,<br /> watertypekwalitatief public.watertypekwalitatief,<br /> watertypekwantitatief public.watertypekwantitatief,<br /> categorieoppwaterlichaam public.categorieoppwaterlichaam,<br /> persistentie public.persistentie,<br /> breedte numeric(9,3),<br /> lengte numeric(9,3),<br /> oppervlakte numeric(10),<br /> niveau varchar DEFAULT 'maaiveld',<br /> geometrie public.vlakoflijn,<br /> actor varchar,<br /> CONSTRAINT oppervlaktewater_pk PRIMARY KEY(object_pk)<br />) INHERITS (fysiekobject)<br />WITH (<br /> OIDS=FALSE<br />);<br />ALTER TABLE oppervlaktewaterlichaam OWNER TO postgres;<br />GRANT SELECT ON oppervlaktewaterlichaam TO PUBLIC;</span><br />
<br /></div>
<br />
<br />
Deze tabel omvat door de overerving ook de kolommen van <em>fysiekobject</em> en indirect van <em>object.</em><br />
Iedere tabel in de lijn is verantwoordelijk voor de eigen toegangsregels, indexen, triggers, procedures e.d. Daarbij zijn <em>constraints</em> en <em>sequences</em> wel gezamenlijk te gebruiken. Zie ter illustratie het gebruik van individuele <em>PRIMARY KEY CONSTRAINTs</em> in bovenstaande tabellen op basis van één <em>object_pk.</em><br />
<br />
<br />
Met <em>oppervlaktewaterlichaam</em> komen we op het niveau van de databeheerder. Vanaf dit niveau moeten de <em>GRANTs</em> toegekend en de <em>Row Level Security (RLS)</em> ingericht worden, niet eerder. Toegang tot bovenliggende tabellen wordt automatisch gepropageerd, andersom niet.<br />
<br />
<br />
Met deze objectgerichte opzet worden twee zaken bereikt:<br />
<ul>
<li>Database bevat relatief weinig tabellen en relaties.</li>
<li>Tabeldefinities zijn compact en leesbaar.</li>
<li>Het datamodel is consistent. Er is geen objecttype te definiëren waarbij essentiële attributen worden vergeten. Bijvoorbeeld: ieder object dat afgeleid is van <em>fysiek object</em> heeft per definitie een s<em>tatus</em>.</li>
<li>Op ieder aggregatieniveau zijn de gegevens met simpele <em>one-liners</em> op te vragen:</li>
<ul>
<li>Hoeveel objecten zijn er, gegroepeerd naar objecttype?</li>
<li>Hoeveel kunstwerken zijn er, gegroepeerd naar kunstwerktype?</li>
<li>Visualiseer ALLE storingen op enig moment.</li>
<li>Hoeveel en welke objecten bevatten naar alle waarschijnlijkheid foutieve gegevens en zijn in onderzoek?</li>
</ul>
</ul>
<br />
<br />
Mooi toch ?<br />
<ul><ul>
</ul>
</ul>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3SDJxSUOxswP03iVCBLd19pHuYKucaokh8S4BmkYvnolnCrZTEsQwlLk32zHAg9Uvbf436XIFFk_tXOUujUB5mxrKnZjLtRWPV1vpk8G33U0hyphenhyphenebSj52FYGylLhmRJK567Mg0k9ZnTV8/s1600/IMWA+objectenmodel.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"></a><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3SDJxSUOxswP03iVCBLd19pHuYKucaokh8S4BmkYvnolnCrZTEsQwlLk32zHAg9Uvbf436XIFFk_tXOUujUB5mxrKnZjLtRWPV1vpk8G33U0hyphenhyphenebSj52FYGylLhmRJK567Mg0k9ZnTV8/s1600/IMWA+objectenmodel.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><br /></a></div>
<br />Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-1882006622661545029.post-12908544182731317362016-02-06T23:02:00.000+01:002018-09-06T11:57:21.789+02:00Toegangscontrole (2) - RLSNaast de mogelijkheden om databeheerders op basis van een rol toegang te geven tot database tabellen, is het aanvullend mogelijk de toegang te verfijnen naar bepaalde records. Hiervoor wordt gebruik gemaakt van <i>Row Level Security</i> functionaliteit<i>,</i> sinds kort beschikbaar in PostgreSQL.<br />
<a name='more'></a><br />
<div>
<br /></div>
Zo is voor DEMO de autorisatie uitgewerkt:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjMzclXFDvlZrHBBZuSQwrOvSCjufiIyhMkfTkj7SonyqEZIU7_qd2N5NtWpVRxA3XJQnL-MXW6TpYg3nCeqvZiBvV5Wlr7uISRbuyccHyix1RPIquRIIu3sJCCzpufJr-rYFhwFRrgX68/s1600/Row+level+security.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="337" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjMzclXFDvlZrHBBZuSQwrOvSCjufiIyhMkfTkj7SonyqEZIU7_qd2N5NtWpVRxA3XJQnL-MXW6TpYg3nCeqvZiBvV5Wlr7uISRbuyccHyix1RPIquRIIu3sJCCzpufJr-rYFhwFRrgX68/s640/Row+level+security.png" width="640" /></a></div>
<br />
<div>
<br /></div>
Hoe werkt het?<br />
<div>
<br />
Alle datamodellen die een rol spelen bij de informatie uitwisseling met derden (IMWA, INSPIRE, BGT, ..) eisen dat bij ieder object een bronhouder wordt aangegeven. Dit wordt in een attribuut <i>naamruimte, namespace,</i> of <i>bronhouder</i> vastgelegd. Dit attribuut bevat een <i>bronhouderscode </i>waarmee via-via te achterhalen is wie de bronhouder is.<br />
<br />
Het ligt voor de hand dit attribuut in DEMO dan ook zo dicht mogelijk bij de bron op te nemen in objecttabellen, zoals DAMO dat ook beoogd heeft.<br />
<br />
<div style="background-color: #ebebeb;">
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;">CREATE TABLE oppervlaktewaterlichaam</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;">(</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"> ..</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"> naamruimte varchar,</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"> ..</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;">)</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;">WITH (</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"> OIDS=FALSE</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;">);</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;">ALTER TABLE oppervlaktewaterlichaam OWNER TO postgres;</span></div>
<br />
De superuser (postgres) wordt standaard eigenaar van iedere nieuwe tabel en krijgt alle rechten op de tabel. De superuser geeft, tenzij anders bepaald, iedere tabel vrij om te mogen raadplegen, en geeft het recht tot gegevensbeheer aan de PostgreSQL <i>Group Role</i> die bij het <i>informatiedomein </i>hoort waar de tabel onderdeel van uitmaakt. Bijvoorbeeld de bovenstaande tabel <i>oppervlaktewaterlichaam </i>dat hoort bij het <i>informatiemodel Water (IMWA)</i>.<br />
<br />
<div style="background-color: #ebebeb;">
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;">GRANT SELECT ON oppervlaktewaterlichaam TO PUBLIC;</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;">GRANT INSERT, UPDATE, DELETE ON public.oppervlaktewaterlichaam TO NSIMWA;</span></div>
<br />
<span style="font-size: x-small;">(Note: Er zijn nog andere tabellen met identieke gegevens voor andere domeinen zoals oppervlaktewaterlichaam voor de <i>Kaderrichtlijn Water (KRW)</i>, De toegangscontrole voor die tabellen is vergelijkbaar geconfigureerd).</span><br />
<br />
Hiermee kan iedere gegevensbeheerder die lid is van de groep <i>nsIMWA</i> alle data in de tabel bewerken. Daarmee is de autorisatie echter niet afdoende geregeld. De tabel bevat weliswaar één objecttype van één informatiedomein (bijvoorbeeld <i>oppervlaktewaterlichamen</i> van <i>nsIMWA</i>), maar de tabel bevat mogelijk ook objecten van andere bronhouders (met een andere bronhouderscode). De gegevensbeheerder moet wel de objecten van de eigen organisatie onderhouden, maar niet die van een ander.</div>
<div>
<br /></div>
<div>
Om deze scheiding te kunnen maken moet eerst een verband gelegd kunnen worden tussen het <i>informatiedomein </i>en de <i>bronhouderscode</i> voor dat domein van de eigen organisatie. Dit gebeurt in een <i>KV-store</i>, een simpele tabel met <i>sleutel-waarde</i> kolommen, De KV-store is een tabel die typisch voor 1001 dingen gebruikt wordt en in veel systemen voorkomt.</div>
<div>
<br /></div>
<div>
Dan komt nu het <i>Row Level Security (RLS)</i> onderdeel. Met onderstaande twee regels wordt:<br />
<ul>
<li><i>RLS </i>geactiveerd voor deze tabel,</li>
<li>wordt het informatiedomein voor deze tabel achterhaald,</li>
<li>worden indirect alle rechten aan de juiste groep gebruikers toegekend.</li>
</ul>
<br />
<div style="background-color: #ebebeb;">
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;">ALTER TABLE public.oppervlaktewaterlichaam ENABLE ROW LEVEL SECURITY;</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;">CREATE POLICY user_mod ON public.oppervlaktewaterlichaam FOR ALL USING (true) WITH CHECK (naamruimte = (SELECT value FROM public.kvstore WHERE key = 'nsIMWA')::varchar);</span>
</div>
<br />
<div>
Het inlezen en beheren van de data van de overige bronhouders kan via een superuser verlopen, die sowieso alle rechten op de tabel blijft houden, of via het instellen van extra policies.<br />
<br /></div>
<div>
Nog één opmerking:</div>
<div>
Het bovenstaande verhaal is alleen van toepassing op het schema waarin data wordt beheerd (<i>public</i>). Let er op dat in bovenstaande code soms een kwalificatie <i>public</i> staat en soms niet. Dat is iedere keer zeer bewust gedaan, daarover later meer.<br />
<br /></div>
<div>
Voilà, uitdaging van autorisatie aangegaan en zonder veel toeters en bellen kunnen invullen.<br />
<br /></div>
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"><br /></span></div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-1882006622661545029.post-16467404052210537192016-02-05T11:06:00.000+01:002016-03-20T22:24:59.175+01:00Toegangscontrole - RBAC<div>
</div>
<div>
Role-based access control (RBAC) is een methode waarmee op een effectieve en efficiënte wijze <a href="https://nl.wikipedia.org/wiki/Toegangscontrole">toegangscontrole</a> voor informatiesystemen kan worden ingericht. Kenmerk van RBAC is dat individuen niet rechtstreeks worden <a href="https://nl.wikipedia.org/wiki/Autorisatie">geautoriseerd</a> in informatiesystemen, maar dat ze uitsluitend rechten krijgen door een vorm van groepslidmaatschap, op basis van de rol die ze hebben binnen een organisatie of bedrijfsproces. Ook de permissies op objecten/functies in informatiesystemen kunnen worden gegroepeerd in rollen. (<a href="https://nl.wikipedia.org/wiki/Role-based_access_control">Wikipedia</a>)</div>
<a name='more'></a><br />
<div>
<br /></div>
<div>
</div>
Eerst een aantal richtinggevende uitspraken waar de toegangscontrole op gegevens aan moet voldoen:<br />
<ol>
<li>Iedere gegevensbeheerder wordt vooraf geïdentificeerd en geautoriseerd. Van de registratie wordt een administratie bijgehouden (BIWA).</li>
<li>De toewijzing en het gebruik van speciale bevoegdheden behoren te worden beperkt en beheerst (BIWA)</li>
<li>Ieder gegeven is geclassificeerd (BIWA)</li>
<li>De toegangscontrole op gegevens wordt zo laag mogelijk in bronsystemen gelegd</li>
<li>Ieder gegeven maakt deel uit van één informatiedomein</li>
<li>Gegevensbeheerders voeren beheer uit op basis van een domeinlidmaatschap</li>
<li>De toegangscontrole op data wordt <em>Role Based</em> ingericht</li>
</ol>
<span style="font-size: x-small;">(BIWA - Baseline Informatiebeveiliging Waterschappen)</span><br />
<br />
Hieraan is eenvoudig met standaard functionaliteit te voldoen door het toekennen van rollen waarmee de toegang tot tabellen wordt geregeld. In een later bericht wordt verteld hoe <i>Row Level Security </i>ervoor zorgt dat meerdere bronhouders hun gegevens kunnen samenvoegen in één tabel, waarbij men de data van een ander kan zien en gebruiken, maar alleen de eigen data kan beheren.<br />
<span style="font-size: x-small;"><br /></span>
<strong>DEMO</strong><br />
<br />
PostgreSQL kent geen users, alleen maar twee typen rollen.<br />
Een <em>Login Role,</em> die zo wordt ingericht dat het alleen gebruikt kan worden om zich aan te melden:<br />
<br />
<div style="background-color: #ebebeb;">
<span style="font-size: x-small;">CREATE ROLE jane LOGIN</span><br />
<span style="font-size: x-small;"> ENCRYPTED PASSWORD 'md571aa5663875719a2e0dbdb91aaa3c332'</span><br />
<span style="font-size: x-small;"> NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE NOREPLICATION;</span></div>
<br />
Een <em>Group Role,</em> die zo wordt ingericht dat het <em>alleen maar</em> beheertaken kan uitvoeren. Een <em>Group Role</em> sluit naadloos aan op het concept van <em>naamruimte</em> (<em>namespace</em>) of <em>informatiedomein</em>.<br />
<br />
<div style="background-color: #ebebeb;">
<span style="font-size: x-small;">CREATE ROLE nsBGT</span><br />
<span style="font-size: x-small;"> NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE NOREPLICATION;</span><br />
<span style="font-size: x-small;">COMMENT ON ROLE nsBGT IS 'informatiedomein Bronhouder Basisregistratie Grootschalige Topografie';</span><br />
<span style="font-size: x-small;">-- Jane is o.a. gegevensbeheerder van het informatiedomein nsBGT</span><br />
<span style="font-size: x-small;">GRANT nsBGT to jane;</span></div>
<br />
Daarnaast is er nog de superuser voor speciale bevoegdheden : <em>postgres</em>.<br />
Een tweede superuser dient als achtervang.<br />
<br />
Simpeler is het niet te maken.<br />
De kunst is echter het consequent toepassen.Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-1882006622661545029.post-17444078839194998572016-02-01T21:30:00.000+01:002016-03-20T22:26:16.407+01:00Wèrkelijk unieke objectidentificatieWe duiken meteen de diepte in..<br />
<br />
De standaard (logische) datamodellen waar DEMO-DAMO op gebaseerd wordt gaan er van uit dat ieder (bedrijfs) object uniek identificeerbaar is met het attribuut <em>LokaalID</em>, echter zonder aan te geven wat de reikwijdte van dit attribuut is en hoe het gebruikt moet worden.<br />
<br />
Een gemiste kans, want door een <em>Globally Unique Identifer (GUID)</em> of <em>Universally Unique Identifier (UUID)</em> te gebruiken als <i>LokaalID</i> wordt een object pas écht uniek, òòk buiten de eigen organisatie.
<br />
<a name='more'></a><br />
Iedere tabel in een informatiesysteem gebruikt een <em>PRIMARY KEY (PK)</em> om ervoor te zorgen dat ieder record in die tabel uniek is, en gebruikt deze sleutel ook voor het leggen van relaties met andere tabellen en het indiceren van records. Meestal is de PK een oplopend nummer (<em>integer</em>) dat door het databasesysteem automatisch gegenereerd wordt.<br />
<br />
Het is verleidelijk om een PK op te waarderen als hèt identificerend gegeven van een object naar de gebruiker toe. Dat is niet verstandig, alleen al om het feit dat PK's over tabellen, of zelfs databases heen, niet zonder meer uniek is. Een PK heeft een belangrijke taak binnen een relationeel database systeem, maar daar moet het bij blijven.<br />
Dus PK's zijn niet bruikbaar als identificerend gegeven van een object.<br />
<br />
Meestal wordt aan een objecttabel een extra kolom toegevoegd met een uniek 'code' attribuut. In deze code worden vaak ook nog eens een aantal objecteigenschappen versleuteld. Dat kan handig zijn voor degene die vaak met deze objecten werkt, maar zo'n code verliest al snel iedere betekenis buiten de tabel. Omdat ieder objecttype een eigen codeersysteem kent, staat dit verdere standaardisatie in de weg. Dus coderingen ook niet gaan gebruiken als identificerend gegeven van een object.<br />
<br />
Door een <em>Globally Unique Identifer (GUID)</em> of <em>Universally Unique Identifier (UUID)</em> als identificerend gegeven te gebruiken wordt een object pas écht uniek, ook buiten de eigen organisatie.<br />
<br />
<strong>GUID's in DEMO</strong><br />
<br />
De omschrijving van een GUID in DEMO is een <em>'Uniek identificatienummer voor het object dat onveranderlijk is zolang het object bestaat'.</em><br />
<br />
Dit is bijvoorbeeld een GUID: <i>ddee9026-f2ff-49aa-881a-e60d9bb00e06</i><br />
<br />
Niet iets waar je als gebruiker mee geconfronteerd wil worden. Het is te vergelijken met het Burgerservicenummer (BSN). Het is een administratienummer wat zeer bruikbaar is als koppelvlak tussen verschillende systemen, maar niet geschikt om even over te typen om een object in een tabel te zoeken.<br />
<br />
PostgreSQL wordt tijdens installatie aangepast zodat het zelf GUID's kan genereren:<br />
<br />
<div style="background-color: #ebebeb;">
<span style="font-family: "courier new" , "courier" , monospace; font-size: xx-small;">--Enable UUID generation</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: xx-small;">CREATE EXTENSION "uuid-ossp"</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: xx-small;"> SCHEMA public
VERSION "1.0";</span>
</div>
<br />
De GUID wordt bij ieder object opgenomen als het attribuut <em>guid </em>van het type <em>UUID</em>.<br />
In heel DEMO is er maar één (abstracte) tabel nodig waar de guid als identificerend attribuut is opgenomen. <br />
<br />
<div style="background-color: #ebebeb;">
<span style="font-family: "courier new" , "courier" , monospace; font-size: xx-small;">--DROP TABLE public.object;</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: xx-small;">CREATE TABLE public.object
(</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: xx-small;">
object_pk serial PRIMARY KEY,</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: xx-small;"> naamruimte varchar,</span><br />
<span style="color: red; font-family: "courier new" , "courier" , monospace; font-size: xx-small;">
guid UUID,</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: xx-small;">
objectbegintijd timestamp DEFAULT CURRENT_TIMESTAMP,</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: xx-small;">
objecteindtijd timestamp,</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: xx-small;">
tijdstipregistratie timestamp DEFAULT CURRENT_TIMESTAMP,</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: xx-small;">
eindregistratie timestamp,</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: xx-small;"> inonderzoek boolean</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: xx-small;">
)
WITH (
OIDS=FALSE
);</span>
</div>
<br />
Deze tabel wordt geërfd door ieder andere objectentabel in DEMO (hierover later meer). Daarmee heeft ieder object meteen ook minimaal bovenstaande set van attributen.<br />
De GUID wordt gegenereerd met INSERT TRIGGERs die op alle objectentabellen in het schema <em>public</em> zijn gelegd. Bij aanmaak van een nieuw object wordt de GUID gelijktijdig in een tabel <em>public.oidx</em> geregistreerd. Hiermee is altijd te achterhalen wat voor type object bij een gegeven GUID hoort. Ter illustratie hieronder een stukje van een INSERT TRIGGER functie op de objecttabel <i>public.oppervlaktewaterlichaam</i>:
<br />
<br />
<div style="background-color: #ebebeb;">
<span style="font-family: "courier new" , "courier" , monospace; font-size: xx-small;">CREATE OR REPLACE FUNCTION public.oppervlaktewaterlichaam_insert() </span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: xx-small;">RETURNS trigger AS</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: xx-small;">
$BODY$</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: xx-small;">
BEGIN</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: xx-small;">
..
</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: xx-small;"> NEW.guid = (SELECT uuid_generate_v4());</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: xx-small;">
..</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: xx-small;">
INSERT INTO public.oidx VALUES(DEFAULT, NEW.guid, TG_TABLE_NAME);</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: xx-small;">
RETURN NEW;</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: xx-small;">
END;</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: xx-small;">
$BODY$ LANGUAGE plpgsql SECURITY DEFINER;</span>
</div>
<br />
Eindgebruikers hebben niet veel met GUID's op, maar dat is ook niet de bedoeling. Het zijn administratieve gegevens die door het systeem automatisch gegenereerd en afgehandeld worden.<br />
Ze zijn er.. En ze zijn er om systemen te laten samenwerken.<br />
<br />Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-1882006622661545029.post-73458124857582458582016-01-28T01:46:00.000+01:002016-01-28T17:18:46.831+01:00Applicatielandschap<div class="separator" style="clear: both; text-align: left;">
Kijk, dat is dan weer het voordeel als je geen rekening hoeft te houden met een thuissituatie.</div>
<div class="separator" style="clear: both; text-align: left;">
Het staat vrij te kiezen welke applicaties ingezet worden.</div>
<a name='more'></a><br />
<div class="separator" style="clear: both; text-align: left;">
Hoewel, dat is niet helemaal waar.. Om te beginnen is er geen budget, dat beperkt de keuze al tot <i>Open source</i>, freeware of proeflicenties van commerciële software.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7Wb7j5LsCd_LMIS__4I930WDtbvPkFH0WhED8gA2tMg5y6h2yzCMn9i7LqO85x19OlxZTHU8AX_avRLeRRLdvrW3YDQnBLXl_0fTMBf1dlKx0tGMOIz29ZKMjvWNY74dtR5fpqpLzk48/s1600/Applicatielandschap.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="350" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7Wb7j5LsCd_LMIS__4I930WDtbvPkFH0WhED8gA2tMg5y6h2yzCMn9i7LqO85x19OlxZTHU8AX_avRLeRRLdvrW3YDQnBLXl_0fTMBf1dlKx0tGMOIz29ZKMjvWNY74dtR5fpqpLzk48/s400/Applicatielandschap.png" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<br />
Maar goed, er zijn genoeg alternatieven, al schetsen de gevestigde leveranciers graag een ander beeld. Bovenstaande plaat is het geworden, alleen <i>Analysing, Reporting, Dashboarding</i> is nog niet uitgewerkt.in applicaties.<br />
<br />
Wat valt er over de keuzes te zeggen?<br />
<br />
PDOK (dataportaal), PDI (gegevensuitwisseling), PostgreSQL (database) zijn bekende producten die ik regelmatig gebruik in productieomgevingen.<br />
<br />
QGIS (beheer van geografische gegevens) ken ik nog uit de tijd van Gary Sherman. Hij wilde graag een alternatief voor ArcView maken, maar dat liep wat uit de hand. De rest is geschiedenis. Ik heb er zeker tien jaar niet meer mee gewerkt, voor zover er destijds mee te werken viel..<br />
<br />
WSO2 is nieuw voor mij, maar ik heb er op basis van de beschikbare documentatie en professionele ondersteuning wel vertrouwen in. Zij hebben eerder al aanbestedingen bij waterbeheerders gewonnen (net als hun naaste Open source concurrenten overigens).<br />
<br />
En Chrome is natuurlijk... Chrome, <i>all-time favourite</i> browser sinds versie 4.<br />
<br />
Ieder platform is goed met <i>scripting </i>aan te sturen, zodat het echte programmeerwerk maar beperkt zal zijn.<br />
<br />
<i>That's it for now..</i><br />
<br />Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-1882006622661545029.post-65857662269981730782016-01-26T00:08:00.000+01:002016-02-06T01:57:29.082+01:00It Giet Oan!Ok dan, <i>go-for-it</i>, anders komt het er niet van.<br />
Maar wat is nu precies de bedoeling?<br />
<a name='more'></a><br />
<br />
De bedoeling is te kijken naar de huidige informatievoorziening van een waterbeheerder en <i>frank en vrij</i> te bedenken hoe je onderdelen daarvan vandaag de dag zou kunnen invullen als je <i>van scratch af aan</i> zou kunnen beginnen. Het hoeft allemaal niet te functioneren en een verkeerde keuze of uitwerking levert ook een interessant resultaat op.<br />
<br />
Daar waar nodig wordt verband gelegd met architectuur. Maar niet te vaak. De kapstok voor ieder onderdeel is een procesdiagram. De afgelopen jaren is bij de overheid veel werk verzet met het verzamelen en beheren van data, maar het proces en de gewenste resultaten verdienen ook aandacht. Het één niet zonder het ander.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEigEJNqy9eUnGFZQxxne1JgE9in5At_kkpqhtSd2gQt90BDMww04F3n6eMtQErhjZh7oe7F69QJFj2yC_nFYxunOzApaG2T6PUEOPE6RntZRhyL64yuMgCf8WmAKU7MAaCpaOkJQzp9jNo/s1600/Input-Proces-Output.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="45" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEigEJNqy9eUnGFZQxxne1JgE9in5At_kkpqhtSd2gQt90BDMww04F3n6eMtQErhjZh7oe7F69QJFj2yC_nFYxunOzApaG2T6PUEOPE6RntZRhyL64yuMgCf8WmAKU7MAaCpaOkJQzp9jNo/s400/Input-Proces-Output.png" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
Deze blog gaat zeker in het begin over het verzamelen en beheren van data, waarbij bovenstaand diagram er voor moet waken dat het wel <i>fit for business</i> is en blijft.<br />
<br />
Bij de waterschappen ligt momenteel DAMO-W op de plank voor het vastleggen van watersysteemgegevens. Een paar waterschappen zijn bezig met de implementatie. De basis van DAMO-W is een logisch (en daarmee database onafhankelijk) datamodel dat in beheer is bij Het Waterschapshuis. Raadpleeg hiervoor de <a href="http://www.hetwaterschapshuis.nl/pagina/producten/watersysteembeheer/damo-watersysteem.html">landingspagina</a> van DAMO Watersysteem en volg de links onderaan die pagina.<br />
<br />
Het bestaande logische model is een mooi vertrekpunt voor het uitvoeren van wat <i>frank en vrij </i>verkenningen, een alternatieve demo van DAMO als het ware.<br />
<br />
Niet te veel hooi op de vork?<br />
Nee, ik verwacht het eerlijk gezegd niet.<br />
Enerzijds is het allemaal <i>fictief. </i>Het hoeft niet perfect te werken of compleet te zijn, dat scheelt al heel veel. Anderzijds heb ik al het één en ander kant en klaar op de plank liggen, ik hoef het alleen maar toonbaar te maken en te delen.<br />
<br />
En als je het vergelijkt met huisvesting : nieuwbouw met <i>lessons-learned</i> is vaak eenvoudiger dan verbouw.Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-1882006622661545029.post-50279561087975310242016-01-25T03:14:00.002+01:002016-01-28T17:16:58.991+01:00Herkenbare situatie?<div>
Je werkt als <em>ICT'er</em> bij een overheidsinstelling en vraagt je continu af of het slimmer en beter kan.<a name='more'></a><br />
Je denkt vaak van wel, maar je weet ook dat iedere verandering onzekerheden en risico's met zich meebrengt die men liever uit de weg gaat. En er is een spanningsveld met de dagelijkse werkzaamheden, die niet verwaarloosd mogen worden. Het doorvoeren van een vernieuwing wordt vaak pas mogelijk nadat zij eerst (liefst elders) bewezen is èn goed in de organisatie verankerd zijn. Dan nog is succes niet gegarandeerd, niet iedere vernieuwing is per definitie een verbetering. Vernieuwen of innoveren is dus bepaald geen sinecure..</div>
<br />
<div>
Neem nou bijvoorbeeld een overheidsinstelling die over waterbeheer gaat. Er wordt veel informatie verzameld, - bewerkt, - gedeeld, en er is een omvangrijke producten- en dienstencatalogus. Big Data en IoT zijn vandaag <i>hot, </i>morgen weer <em>not</em><em>.</em> Leveranciers zijn er als de kippen bij om innovaties op hun vakgebied te promoten. De basisvoorzieningen van de organisatie blijven daarbij stabiel: <em>If it ain't broke, don't fix it.</em> Hoe ga je in zo'n omgeving met tegengestelde belangen om?</div>
<div>
</div>
Iedere waterbeheerder maakt min of meer gebruik van een Enterprise Architectuur die gebaseerd is op een gezamenlijke <i>Waterschaps Informatie & Logisch Model Architectuur</i> (<a href="http://www.wikixl.nl/wiki/wilma/index.php/Inleiding">WILMA</a>). Standaardisatie heeft in iedere architectuur een belangrijke rol. Zo maken waterbeheerders afspraken over het gebruik van <i>standaard datamodellen</i> (<a href="http://www.hetwaterschapshuis.nl/pagina/producten/watersysteembeheer/damo-watersysteem.html">DAMO's</a>), gegevenswoordenboeken en koppelvlakken ten behoeve van de uitwisseling van data (<a href="http://www.ihw.nl/pagina/producten/aquo.html">Aquo</a>).<br />
Dat zijn drie mooie (openbaar toegankelijke) vertrekpunten om eens anders te kijken naar ICT basisvoorzieningen.<br />
<br />
Dat leidt tot de volgende uitdaging:<br />
<ol>
<li>Werk aan een <em>fictieve</em> implementatie van <i>logische datamodellen</i> op basis van vrij beschikbare middelen (denk bijvoorbeeld aan <i>Open source</i>), en daarbij bewust zoeken naar alternatieve oplossingen (denk bijvoorbeeld aan toepassen van <i>NoSQL</i>), en deel de resultaten met iedereen die er in geïnteresseerd is.</li>
<li>Werk een aantal <i>fictieve</i> voorbeelden uit, waarmee je kunt zien dat de informatie naadloos te gebruiken is binnen processen.</li>
</ol>
<i>Technology driven </i>nieuwsgierigheid is de belangrijkste drijfveer om deze uitdagingen aan te gaan. Ik besef me dat het een zeer specifiek onderwerp is voor een kleine markt, maar geloof me, het is de moeite waard. Het is volkomen begrijpelijk als je na het lezen van een paar berichten de blog verlaat om nooit meer terug te komen. Aan de andere kant verwacht ik dat de <i>long tail </i>van internet zijn werk doet en er interessante contacten uit voortkomen. Het ontwikkelen van kant en klare producten is niet aan de orde, daar zijn andere trajecten voor nodig.<br />
Mijn persoonlijke doel is kennis opdoen en gesprekspartner kunnen zijn in een klant- leverancier relatie. Ik start deze blog alleen en in privé tijd, maar ik sta uiteraard open voor hulp of reacties.<br />
<br />
En als er ooit maar één persoon iets uit deze blog in zijn eigen organisatie (of voor een klant) toe gaat passen, dan ben ik helemaal tevreden met zo'n bijvangst.Unknownnoreply@blogger.com0