Coretable-Ansatz für XPlanung
Auf Grund der Komplexität des XPlanungsmodells ist die Suche nach einer geeigneten Datenhaltung eine Herausforderung. Klassischerweise kommen hierfür relationale DBMS zum Einsatz, insb. Postgres/PostGIS ist etabliert. Eine vollständig relationale Abbildung des Objektmodells führt allerdings zu tausenden Tabellen, was die Verwendung einer solchen Datenhaltung z.B. in QGIS nicht handhabbar erscheinen lässt. Dokumentenbasierte/NoSQL-Alternativen weisen hingegen nur eingeschränkte Geometriefunktionalität auf.
Inspiriert vom AdV-Smart/Basemap.de-Projekt (siehe Vorträge hier, insb. diesen) hat die XLeitstelle daher einen sog. Coretable-Ansatz für XPlanung entwickelt:
Dabei werden die Features in einer einzigen Basistabelle (coretable) gespeichert, wobei die Properties in ihrer komplexen Struktur als JSON(B) Objekt abgelegt werden. Darüber hinaus gibt es nur noch eine refs-Tabelle, in der die Feature-Refererenzen gespeichert werden, was z.B. die Verwendung relationaler Funktionalität wie Fremdschlüssel ermöglicht. Hierdurch wird die Komplexität enorm verringert, der Datenimport erleichtert und eine im Grunde modellagnostische, d.h. auch versionsübergreifende Datenhaltung ermöglicht, während weiterhin PostGIS für umfassende Geometriefeatures genutzt und die referenzielle Integrität sichergestellt werden kann. Durch eine entsprechende Conversion Rule in Shapechange kann dieses DB-Schema direkt als Quelle für ldproxy genutzt werden, vgl. #7.
Beispiel
BP_Plan-Objekt:
{
"sort_key": 1,
"id": "d626c910-9167-4242-97b6-2ba48d1fdcd1",
"featuretype": "BP_Plan",
"properties": {
"name": "Blankenese43",
"planArt": [
"1000"
],
"gemeinde": [
{
"ags": "02000000",
"gemeindeName": "Freie und Hansestadt Hamburg",
"ortsteilName": "223"
}
],
"aendertPlan": [
{
"planName": "BSBlankenese",
"aenderungsArt": "2000"
}
],
"rechtsstand": "3000",
"beschreibung": "Westgrenze des Flurstücks 2509, West- und Südwestgrenze des Flurstücks 2508, Nordgrenzen der Flurstücke 2156 und 2508, Südostgrenze des Flurstücks 1794, über das Flurstück 2508, Nord¬grenze des Flurstücks 1205, Nordwest- und Nordgrenze des Flurstücks 1204, West¬grenze des Flurstücks 1202, West- und Nordgrenze des Flurstücks 2494, Nord¬west- und Nordostgrenze des Flurstücks 2488, Nordostgrenzen der Flurstücke 2489 und 2490, Nord- und Westgrenze des Flurstücks 2494, über das Flurstück 1169, über das Flurstück 1871, Ost-, und Südostgrenze des Flurstücks 1871, über das Flurstück 1179, Nordost-, Südost- und Ostgrenze des Flurstücks 1180, Nordost-, Südost- und Südwestgrenze des Flurstücks 1182, Südgrenze des Flurstücks 2495 – Stehrs Treppe – Nordostgrenze des Flurstücks 2497 und über das Flurstück 2497, über das Flurstück 2245 (Strandweg), über die Flurstücke 2276, 2140 und 2435, Süd- und Westgrenze des Flurstücks 2435, Südwestgrenzen der Flurstücke 1635 und 2275, über die Flurstücke 2275 und 2245 (Strandweg) der Gemarkung Blankenese.",
"versionBauNVO": {
"name": "Testtest",
"datum": "2020-12-12"
},
"externeReferenz": [
{
"typ": "1020",
"referenzURL": "file:///Blankenese43.jpg",
"beschreibung": "Test der Transformation: Legende",
"referenzName": "Unbekannt"
}
],
"gruenordnungsplan": false,
"erstellungsMassstab": 1000,
"durchfuehrungsVertrag": false,
"erschliessungsVertrag": false,
"rechtsverordnungsDatum": "2016-06-21",
"staedtebaulicherVertrag": false
},
"geometry": "MULTIPOLYGON (((552858.808 5934844.355, 552859.382 5934839.671, 552859.431 5934839.253, 552861.104 5934825.073, 552861.153 5934823.525, 552847.299 5934813.022, 552842.548 5934810.453, 552837.076 5934809.88, 552826.081 5934809.504, 552821.104 5934812.318, 552811.566 5934817.712, 552800.318 5934824.071, 552782.213 5934802.667, 552769.415 5934801.632, 552720.086 5934832.869, 552718.744 5934834.335, 552696.825 5934857.624, 552695.027 5934854.203, 552694.157 5934853.012, 552681.382 5934828.975, 552662.787 5934793.986, 552661.323 5934794.564, 552660.458 5934793.06, 552641.041 5934802.938, 552638.527 5934808.407, 552631.206 5934804.545, 552626.775 5934802.207, 552586.621 5934820.173, 552576.333 5934828.705, 552568.658 5934832.742, 552562.235 5934839.778, 552561.447 5934840.432, 552559.78 5934841.815, 552548.513 5934850.528, 552548.45 5934850.419, 552543.257 5934841.404, 552557.94 5934830.383, 552557.044 5934828.523, 552565.227 5934824.814, 552572.402 5934819.392, 552569.14 5934812.474, 552563.769 5934801.081, 552558.902 5934777.573, 552556.052 5934753.452, 552554.977 5934743.794, 552553.573 5934731.186, 552560.687 5934727.565, 552576.301 5934717.546, 552583.342 5934711.54, 552588.317 5934707.296, 552589.729 5934705.471, 552595.329 5934698.225, 552596.915 5934691.039, 552600.632 5934689.187, 552604.546 5934682.295, 552661.728 5934665.161, 552666.623 5934663.694, 552675.494 5934659.621, 552785.043 5934628.63, 552785.639 5934631.13, 552786.753 5934634.987, 552793.105 5934656.981, 552793.869 5934659.625, 552796.821 5934669.846, 552799.618 5934679.529, 552799.67 5934679.735, 552801.871 5934688.453, 552802.068 5934692.541, 552800.661 5934695.917, 552797.89 5934700.452, 552795.124 5934706.771, 552792.94 5934712.892, 552792.12 5934716.156, 552793.868 5934715.88, 552793.966 5934714.323, 552796.857 5934714.929, 552797.109 5934715.367, 552801.79 5934723.508, 552802.984 5934722.972, 552803.522 5934724.763, 552803.673 5934725.265, 552803.674 5934725.269, 552805.904 5934734.328, 552802.492 5934735.062, 552799.735 5934735.656, 552799.148 5934735.782, 552804.847 5934745.134, 552806.37 5934744.139, 552815.237 5934756.277, 552814.468 5934757.007, 552815.099 5934758.59, 552817.062 5934763.138, 552823.727 5934772.103, 552830.677 5934778.279, 552835 5934781.282, 552841.613 5934784.838, 552845.965 5934786.166, 552850.26 5934788.887, 552857.941 5934795.615, 552861.64 5934800.865, 552865.561 5934814.439, 552866.328 5934817.094, 552867.006 5934820.322, 552867.053 5934826.893, 552865.032 5934832.428, 552863.831 5934834.737, 552862.875 5934836.576, 552861.692 5934838.854, 552861.036 5934840.117, 552858.808 5934844.355)))",
"version": "6.0"
}
Und die dazugehörigen Referenzen:
[
{
"sort_key": 1,
"base_id": "d626c910-9167-4242-97b6-2ba48d1fdcd1",
"related_id": "e5a35956-9d84-4144-a530-49e9771f5424",
"rel": "texte",
"rel_inv": null
},
{
"sort_key": 2,
"base_id": "d626c910-9167-4242-97b6-2ba48d1fdcd1",
"related_id": "f3c8d90b-623f-46b5-aa5f-213a5fb01331",
"rel": "texte",
"rel_inv": null
},
{
"sort_key": 19,
"base_id": "d626c910-9167-4242-97b6-2ba48d1fdcd1",
"related_id": "0cbd020e-ebe2-4e2f-b032-c3b5ab851f12",
"rel": "bereich",
"rel_inv": "gehoertZuPlan"
}
]