In diesem LineLetter beleuchten wir häufige Geometriefehler und zeigen Ihnen den Umgang mit der neuen automatischen Geometriebereinigung in der 1-Klick-Wartung des Autodesk Infrastructure Administrators 2022.0.1.
Inhalt
- Geänderte Funktion im Infrastructure Administrator
- Grundlegende Parameter für Spatial-Geometrien
- Aufbau von Oracle-Spatial-Geometrien
- Geometrie erzeugen und ändern
- Bereinigen von Geometrien an der Konsole
- Häufige Geometriefehler
Geänderte Funktion im Infrastructure Administrator
Mit dem Update 2022.0.1 von AutoCAD Map 3D hat Autodesk die Geometrie-Prüfung in der 1-Klick-Wartung aus der Gruppe der Datenbank-Überprüfungen ohne Korrektions-Funktionen in die Gruppe der Datenbank-Überprüfungen mit Korrektions-Funktion verschoben, um soweit möglich eine automatisierte Korrektur zu ermöglichen.
Aktivieren Sie die Geometrieprüfung in der Liste der Überprüfungen und führen Sie die Überprüfung aus, indem Sie auf die Schaltfläche Probleme suchen klicken.
Sind Geometriefehler in der Fachschale enthalten, werden diese aufgelistet. Mit einem Klick auf die Schaltfläche Probleme beheben werden diese soweit möglich korrigiert.
Führen Sie unbedingt nach der Bereinigung noch einmal die Prüfung aus, denn zum einen lassen sich auf diesem Wege längst nicht alle Fehler beheben und zum anderen ist es möglich, dass die Ergebnisse unerwartet ausfallen.
In der Version 2022.0.1 werden derzeit nur Geometrien bereinigt, die den Fehler ORA-13346 für kollineare Bogensegmente in Liniengeometrien und Polygonen aufweisen. Derartige Fehler entstehen bevorzugt durch die Rundung der Koordinatenwerte auf die Genauigkeit der Fachschale.
Grundlegende Parameter für Spatial-Geometrien
Um ergründen zu können, wodurch fehlerhafte Oracle Spatial-Geometrien entstehen und wie sie korrigiert werden können, muss man grob das Konzept und den Aufbau einer Oracle Spatial-Geometrie kennen. Für Oracle Spatial-Geometrien sind neben den eigentlichen Koordinatenwerten noch das zugrundeliegende Koordinatensystem, die Dimension (2D oder 3D) und die Genauigkeit entscheidend. Diese 3 Parameter bestimmen Sie einmalig bei der Einrichtung der Fachschale.
Im Grunde ist es möglich, in einer Fachschale beliebige Geometrien mit verschiedenen Koordinatensystemen zu verwenden. Das Besondere einer Autodesk Fachschale besteht jedoch darin, dass man einmalig und zentral für alle Objektklassen die Dimension (2D oder 3D) und das Koordinatensystem sowie die Grenzen bestimmt, in denen sich später die Geometrien befinden dürfen. Diese Informationen werden in der Tabelle TB_INFO gespeichert. Wann immer eine neue Objektklasse angelegt wird, kopiert der Infrastructure Administrator die Information aus der TB_INFO als Vorgabewert zur jeweiligen Objektklassen-Definition in der Tabelle TB_DICTIONARY und fügt einen neuen Eintrag in der System-Ansicht USER_SDO_GEOM_METADATA hinzu. Durch diesen Eintrag kennt Oracle einen neuen GIS-Objekt-Layer in der Fachschale. Externe Systeme wie MapGuide OpenSource und GDAL/OGR im Allgemeinen lesen diese Angaben in der USER_SDO_GEOM_METADATA aus, um die Liste der verfügbaren Layer anzuzeigen.
Eine Datenbank wird durch die Anwendung von Indizes performant. Durch Indizes kann ein System schneller Ergebnisse finden. So wird beispielsweise um die Lage eines Punkt bezogen auf ein darunter liegendes komplexes Polygon nicht sogleich jeder Polygonpunkt herangezogen, sondern zunächst geprüft, ob sich der zu prüfende Punkt innerhalb der rechteckigen Umgrenzung des Polygons (BoundingBox) befindet. Diese BoundingBox ist ein Beispiel zum Verständnis für einen räumlichen Index. Diese Information wird beim Speichern der Geometrie in dem Datensatz automatisch im Hintergrund berechnet. Ausschlaggebend dafür ist das Vorhandensein eines räumlichen (=Spatial-)Index. Der Spatialindex einer Tabelle wird automatisch angelegt, wenn man eine neue Geometrieobjektklasse anlegt. Das Berechnen des Spatialindex für Geometrien einer Objektklasse setzt ausnahmslos valide Geometrien voraus. Sollten Sie also einmal versuchen, nachträglich Spatialindizes neu berechnen zu lassen, stellen Sie zuvor mit der 1-Klick-Wartung sicher, dass alle Geometrien valide sind.
Die Neuberechnung der Spatial-Indizes kann erforderlich sein, wenn Sie eine Fachschale in die Datenbank importiert haben oder aber infolge des Fehlers ORA-13011 die Grenzen der Fachschale anpassen mussten. Führen Sie anschließend die Prüfung und Neuerstellung der Spatial-Konfiguration und Spatial-Indizes aus. Nach einem Import einer Fachschale über die Datapump (IMPDP) fehlen beispielsweise die Einträge der viewbasierten Objektklassen in der USER_SDO_GEOM_METADATA zuverlässig komplett.
Sollte es einmal erforderlich sein, die Grenzen der Fachschale nachträglich zu erweitern, korrigieren Sie zunächst die Einträge in der Tabelle TB_INFO und TB_DICTIONARY, starten dann den Infrastructure Administrator bzw. öffnen das Unternehmensprojekt mit der betroffenen Fachschale neu und führen die vorgenannten 3 Schritte aus.
-- Allgemeine Grenzen in TB_INFO
update TB_SETTINGS set ITEM_VALUE = <srid>
where ITEMTHEMA='TOPOBASE' and ITEMKEY='LAST_SRID' and USER_ID='ALL';
update TB_INFO set VALUE_NUMBER = <srid> where PARAM='DEFAULT_SRID';
update TB_INFO set VALUE_NUMBER = <min_x> where PARAM='DEFAULT_SPATIAL_MIN_X';
update TB_INFO set VALUE_NUMBER = <max_x> where PARAM='DEFAULT_SPATIAL_MAX_X';
update TB_INFO set VALUE_NUMBER = <min_y> where PARAM='DEFAULT_SPATIAL_MIN_Y';
update TB_INFO set VALUE_NUMBER = <max_y> where PARAM='DEFAULT_SPATIAL_MAX_Y';
-- Objektklassenspezifische Grenzen in TB_DICTIONARY update TB_DICTIONARY
set SRID = (select value_number from tb_info where PARAM='DEFAULT_SRID'), MIN_X = (select value_number from tb_info where PARAM='DEFAULT_SPATIAL_MIN_X'), MAX_X = (select value_number from tb_info where PARAM='DEFAULT_SPATIAL_MAX_X'), MIN_Y = (select value_number from tb_info where PARAM='DEFAULT_SPATIAL_MIN_Y'), MAX_Y = (select value_number from tb_info where PARAM='DEFAULT_SPATIAL_MAX_Y');
-- Anschließend Konfiguration für Systemtabellen prüfen,
-- user_sdo_geom_metadata aktualisieren
-- und neue Spatial-Indizes erstellen
Aufbau von Oracle-Spatial-Geometrien
Der Konstruktor für Instanzen vom Typ SDO_GEOMETRY wird wie nachstehend definiert:
SDO_GEOMETRY(SDO_GTYPE,SDO_SRID,SDO_POINT,SDO_ELEM_INFO,SDO_ORDINATES)
Bei der Definition jeder Geometrie werden demnach folgende Angaben benötigt:
SDO_GTYPE | Dimension (erste Ziffer: 2=2D, 3=3D) und Geometrietyp (letzte Ziffer: 1=Punkt, 2 =Linie, 3=Fläche, 5=Multipunkt, 6=Multilinie, 7=Multifläche) |
SDO_SRID | EPSG-Code des Koordinatensystems |
SDO_POINT | Punkt-Koordinaten (mit x, y und z, wobei z bei 2D-Geometrien null ist) |
SDO_ELEM_INFO | Element-Informationen (Polygonpatches, Bogensegmente), die Anzahl der Werte ist immer ein Vielfaches von 3 |
SDO_ORDINATES | Koordinatenliste, die Anzahl der Werte ist immer ein Vielfaches der im sdo_gtype angegebenen Dimension |
Eine Punktgeometrie bei x=590000 und y=5650000 im Koordinatensystem ETRS89.UTM-32N sieht demnach wie folgt aus:
sdo_geometry(
2001,
25832,
sdo_point_type(590000,5650000,null),
null,
null
)
Eine waagerechte Linie mit 10 Metern Länge im selben Koordinatenbereich wird folgendermaßen definiert:
sdo_geometry(
2002,
25832,
null,
sdo_elem_info_array(1,2,1),
sdo_ordinate_array(590000,5650000,590010,5650000)
)
Bei dem quadratischen Polygon mit 10 Metern Kantenlänge im selben Koordinatenbereich beachten Sie die Konstruktionsrichtung entgegen dem Uhrzeigersinn:
sdo_geometry(
2003,
25832,
null,
sdo_elem_info_array(1,1003,1),
sdo_ordinate_array(
590000,5650000,
590010,5650000,
590010,5650010,
590000,5650010,
590000,5650000)
)
Etwas komplexer wird das bei Multiobjekten (zugunsten der besseren Lesbarkeit formatiert):
sdo_geometry( 2007, 25832, null, sdo_elem_info_array(1,1003,1,11,1003,1), sdo_ordinate_array(
593160,5647760,
593160,5647750,
593170,5647750,
593170,5647760,
593160,5647760,
593160,5647780,
593160,5647770,
593170,5647770,
593170,5647780,
593160,5647780) )
Geometrie erzeugen und ändern
Die Geometrie eines Objekts wird in einer Geometrieobjektklasse einer Fachschale vorgabemäßig in das Feld GEOM gespeichert. Nur in seltenen Ausnahmefällen wurde manuell durch den Datenbankadministrator ein weiteres Feld mit einer Zweitgeometrie ergänzt.
Sie erzeugen neue Datensätze mit Geometrien entweder über den Fachschalen-Explorer durch Rechtsklick auf die jeweilige Objektklasse oder im Formular durch Drücken der Schaltfläche Neues Objekt digitalisieren und im Dialogfeld auswählen. | ||
Geometrie erstellen in einer Punkt-, Linien- oder Flächenobjektklasse | In einer Objektklasse mit variabler Geometrie (Sammlungsobjektklasse) stehen für jeden Geometrietyp einzelne Befehle zur Verfügung. |
Sie können die Lage der Geometrie im Zeichenbereich durch die Griffbearbeitung verändern oder im Geometrie-Editor des Formulars editeren. Der Geometrie-Editor ist in den Formularen nur sichtbar, wenn man das Steuerelement explizit dem Formular über den Formular-Designer hinzufügt. Über den Geometrie-Editor können Sie einzelne Stützpunkte ergänzen, verschieben oder löschen oder die Art des Punkts (Linienstützpunkt, Bogen-Anfang, Bogen-Mittelpunkt, Bogen-Endpunkt) bestimmen. Die Änderung der Geometrie wird beim Speichern der Änderungen am Datensatz übernommen.
Lässt sich eine Geometrie nicht bereinigen, erzeugen Sie eine neue. Dabei können Sie das Werkzeug für den ausgewählten Datensatz eine neue Geometrie digitalisieren oder eine CAD-Geometrie umwandeln.
Bitte beachten Sie, dass Sie als Ausgangsobjekt ein AutoCAD-Objekt vom Typ MPOLYGON auswählen, wenn Sie ein flächenhaftes Multiobjekt oder eine Fläche mit Inseln als neue Geometrie erstellen wollen.
Bereinigen von Geometrien an der Konsole
In einigen Fällen können Sie komfortabel die Geometrien über die SQL-Konsole (z.B. über den SQL-Sheet) bereinigen, indem Sie die Oracle-Funktion SDO_UTIL.RECTIFY_GEOMETRY(geom, 0.0005) auf die fehlerhaften Geometrien ausführen.
UPDATE strm_wi_abschnitt
SET geom = sdo_util.rectify_geometry(geom, 0.0005)
WHERE fid in
(
SELECT fid from
(
SELECT a.fid, sdo_geom.validate_geometry_with_context(a.geom,b.diminfo) info
FROM strm_wi_abschnitt a,
user_sdo_geom_metadata b
WHERE a.geom is not null and
b.table_name = 'STRM_WI_ABSCHNITT'
AND b.column_name = 'GEOM'
)
WHERE info = '13346'
);
commit;
Seien Sie dabei jedoch besonders vorsichtig, denn das Ergebnis kann unerwartet ausfallen. Diese Art der Bereinigung kann bei graphisch nicht relevanten Fehlern (z.B. ORA-13348, ORA-13356, ORA-13367) Anwendung finden. Aber auch hier bleibt zu beachten, dass bei der Bereinigung des Fehlers ORA-13356 (doppelte Punkte) in einer Linie mit zwei aufeinanderliegenden Punkten Punktgeometrien generiert werden, die in einer Linienobjektklasse ebenso wenig zulässig sind.
Unter Umständen lässt sich bei Bedarf für kurze Zeit (wenige Minuten!) die Geometrie aus dem Flashback-Speicher der Oracle-Datenbank zurückholen:
update strm_wi_abschnitt
set geom = (select geom
from strm_wi_abschnitt as of timestamp
systimestamp - interval '10' minute
where fid = 121183)
where fid = 121183;
Häufige Geometriefehler
Zum Abschluss stellen wir noch eine Liste mit typischen Fehlermeldungen und Lösungsansätzen bereit, die Ihnen helfen kann, fehlerhafte Geometrien zu korrigieren und so saubere Geometrien zu erzeugen und daraufhin verlässliche Ergebnisse in Analysen zu erhalten. Weiterführende Angaben entnehmen Sie der Oracle-Dokumentation.
13011 | Ein angegebener Dimensionswert liegt außerhalb des für diese Dimension definierten Bereichs. Für sich genommen ist die Geometrie valides, sie liegt nicht vollständig im Bereich, der in der TB_INFO angegeben wurde. | Ändern Sie die Grenzen der Fachschale oder verschieben Sie die Geometrie, dass sie vollständig im Bereich der Fachschalengrenzen liegt. | |||
---|---|---|---|---|---|
13340 | Eine Geometrie, die als Punkt angegeben wird, hat mehr als eine Koordinate in ihrer Definition. | Ein Punkt hat nur eine Koordinate. Wenn es sich um ein einzelnes Punktobjekt handelt, entfernen Sie die Fremdkoordinaten aus der Definition. Soll die Geometrie hingegen einen Linestring (offene Polylinie) oder ein Polygon beschreiben, ersetzen Sie die Geometrie. | |||
13341 | Eine Geometrie, die als Linie angegeben wird, enthält in ihrer Definition weniger als zwei Koordinaten. | Eine Linie muss aus mindestens zwei verschiedenen Koordinaten bestehen. Fügen Sie weitere Koordinaten hinzu oder ersetzen Sie die Geometrie durch eine Punktgeometrie. | |||
13342 | Eine Geometrie, die als Bogen angegeben wird, enthält in ihrer Definition weniger als drei Koordinaten. |
|
|||
13343 | Eine Geometrie, die als Polygon angegeben wird, enthält in ihrer Definition weniger als vier Koordinaten. |
|
|||
13344 | Eine Geometrie, die als Polygon mit Bogensegmenten angegeben wird, enthält in ihrer Definition weniger als fünf Koordinaten. |
|
|||
13346 | Ungültige Definition eines Bogens: Die Koordinaten, die einen Bogen definieren, sind kollinear. Ein Bogen wird unter Verwendung von drei nicht kollinearen Koordinaten definiert. |
|
|||
13347 | Zwei oder mehr der drei Punkte, die einen Bogen definieren, sind gleich. |
|
|||
13348 | Polygon-Umrandung wurde nicht geschlossen. |
|
|||
13349 | Polygon-Umrandung schneidet sich selbst. |
|
|||
13350 | Die inneren oder äußeren Ringe eines komplexen Polygons berühren sich. |
|
|||
13351 | Zwei oder mehr innere und/oder äußere Ringe eines komplexen Polygons überlappen sich. |
|
|||
13353 | Das ELEM_INFO_ARRAY in einer SDO_GEOMETRY-Definition enthält mehr oder weniger Elemente als erwartet. | Dieser Fehler ist eher infolge einer automatisierten Übernahme nicht valider Geometrien oder durch manuelle Manipulation der Geometriedefiniton (z.B. an der SQL-Konsole) zu erwarten. Checken Sie die Geometrie in AutoCAD Map 3D aus, wandeln diese in ein AutoCAD-Objekt und ersetzen Sie die vorhandene Geometrie durch das AutoCAD-Objekt. AutoCAD Map 3D wird daraus eine valide Geometriedefinition generieren. | |||
13354 | Das Offset-Feld in ELEM_INFO_ARRAY einer SDO_GEOMETRY-Definition verweist auf einen ungültigen Array-Index (Position) in SDO_ORDINATE_ARRAY. | Dieser Fehler ist eher infolge einer automatisierten Übernahme nicht valider Geometrien oder durch manuelle Manipulation der Geometriedefiniton (z.B. an der SQL-Konsole) zu erwarten. Checken Sie die Geometrie in AutoCAD Map 3D aus, wandeln diese in ein AutoCAD-Objekt und ersetzen Sie die vorhandene Geometrie durch das AutoCAD-Objekt. AutoCAD Map 3D wird daraus eine valide Geometriedefinition generieren. | |||
13355 | Die Anzahl der Elemente in SDO_ORDINATE_ARRAY ist kein Vielfaches der Dimensionen. Die Anzahl der Werte im Ordinate_Array muss ein Vielfaches der Dimension sein, bei einer 2D-Linie mit zwei Punkten demnach 4 Werte, bei einer 3D-Linie mit zwei Punkten 6 Werte. | Dieser Fehler ist eher infolge einer automatisierten Übernahme nicht valider Geometrien oder durch manuelle Manipulation der Geometriedefiniton (z.B. an der SQL-Konsole) zu erwarten. Checken Sie die Geometrie in AutoCAD Map 3D aus, wandeln diese in ein AutoCAD-Objekt und ersetzen Sie die vorhandene Geometrie durch das AutoCAD-Objekt. AutoCAD Map 3D wird daraus eine valide Geometriedefinition generieren. | |||
13356 | Es gibt wiederholte (aufeinanderliegende) Punkte in der Reihenfolge der Koordinaten. |
|
|||
13364 | Ebenen Dimension stimmt nicht mit Geometrie-Dimension überein. | Sie haben versucht, eine 2D-Geometrie in eine Objektklasse einzufügen, die eine 3D-Geometrie erwartet oder umgekehrt eine 3D-Geometrie in eine 2D-Objektklasse. Die Dimension der Objektklasse wird in der USER_SDO_GEOM_METADATA im SDO_DIM_ARRAY angegeben. | |||
13365 | Ebenen SRID stimmt nicht mit Geometrie-SRID überein. | Sie haben versucht, eine Geometrie in eine Objektklasse einzufügen, die auf ein anderes Koordinatensystem (SRID) verweist, als in der USER_SDO_GEOM_METADATA angegeben wurde. Das kann durch eine fehlerhafte Konfiguration der Objektklasse oder durch manuelles Einfügen der Geometrie an der SQL-Konsole verursacht worden sein. | |||
13366 | In einer Oracle Spatial-Geometrie werden Innen- und Außenringe nicht konsistent verwendet bzw. ungültig kombiniert. | Dieser Fehler ist eher infolge einer automatisierten Übernahme nicht valider Geometrien oder durch manuelle Manipulation der Geometriedefiniton (z.B. an der SQL-Konsole) zu erwarten. Checken Sie die Geometrie in AutoCAD Map 3D aus, wandeln diese in ein AutoCAD-Objekt und ersetzen Sie die vorhandene Geometrie durch das AutoCAD-Objekt. AutoCAD Map 3D wird daraus eine valide Geometriedefinition generieren. | |||
13367 | In einer Oracle Spatial-Geometrie sind die äußeren und / oder inneren Ringe nicht richtig ausgerichtet. |
|
|||
13368 | In einer Polygongeometrie gibt es mehr als einen Außenring. | Unterschieden wird grundsätzlich in Polygone mit nur einem Außenring und beliebig vielen inneren Ringen gegenüber Multipolygone mit beliebig vielen Außen- und Innenringen. Handelt es sich um ein Objekt mit mehreren Außenringen, stellen Sie den Typ der Geometrie auf Multipolygon, andernfalls erstellen Sie mehrere Datensätze mit einfachen Polygonen oder entfernen den überflüssigen Außenring. | |||
13 375 | Der Layer/die Objektklasse erwartet einen Typ, der vom Typ der aktuellen Geometrie abweicht oder nicht mit diesem übereinstimmt. | Wurde in der USER_SDO_GEOM_META_DATA ein konkreter Geometrietyp angegeben (z.B. Punkt), muss die eingefügte Geometrie diesem Typ entsprechen. Entweder weisen Sie eine andere Geometrie mit dem erwarteten Geometrietyp zu oder ändern die Einschränkung in der USER_SDO_GEOM_METADATA. |
Viel Spaß beim Ausprobieren!
© 01/2022 Mensch und Maschine acadGraph GmbH. Alle Rechte vorbehalten