Freitag, 28. März 2014

Koordinatensystem einer Tabelle verändern

Hin und wieder (gerade in frühen Projektphasen) kommt es vor, dass Geodaten in Tabellen mit dem falschen Koordinatensystem ausgestattet werden - Ursache kann ein falsch eingerichteter Ladeprozess sein oder schlicht eine falsche Information. Wenn nun das Koordinatensystem geändert werden soll, stellt sich die Frage, wie man das möglichst effzient und einfach machen kann - ohne alles zu löschen und neu zu laden. Hier ein Vorschlag - so gehe ich vor:

1. Spatial Index löschen

Das Koordinatensystem ist Teil des Spatial Index - ein anderes Koordinatensystem braucht einen neuen Index. Also muss der bestehende gelöscht werden.

drop index {spatial-index-name};

Index dropped.

2. Koordinatensystem in den Daten austauschen

Hierfür müssen die SDO_GEOMETRY-Daten nicht komplett neu geladen werden. Man kann sich stattdessen die Tatsache zunutze machen, dass man sich in einer Oracle-Datenbank befindet. Das Attribut SDO_SRID (welches in jedem SDO_GEOMETRY die Koordinatensystem-ID enthält) kann einfach per SQL UPDATE Kommando aktualisiert werden. Der Rest der Daten muss nicht angefasst werden (Achtung: Der Alias - hier: "a" - ist bei diesem SQL UPDATE wichtig).

update {table-name} a set a.{geometry-column}.sdo_srid = {neue SRID};

XXXX rows updated.

3. Koordinatensystem in USER_SDO_GEOM_METADATA ändern

Auch im Spatial Dictionary muss das Koordinatensystem ausgetauscht werden. Der Eintrag in USER_SDO_GEOM_METADATA muss dem in den SDO_GEOMETRY-Instanzen entsprechen.

update USER_SDO_GEOM_METADATA set SRID = {neue SRID} 
where TABLE_NAME = '{table-name}' and COLUMN_NAME = '{geometry-column}';

1 row updated.

Es kann natürlich auch sein, dass die Dimensionsinformation auch noch aktualisiert werden muss. Für Längen- und Breitengrade kann DIMINFO wie folgt versorgt werden.

update USER_SDO_GEOM_METADATA 
set DIMINFO = SDO_DIM_ARRAY(SDO_DIM_ELEMENT('X',-180,180,0.05),SDO_DIM_ELEMENT('Y',-90,90,0.05))
where TABLE_NAME = '{table-name}' and COLUMN_NAME = '{geometry-column}';

1 row updated.

4. Index neu bauen

Das sollte einfach sein ...

create index  {spatial-index-name} on {table-name} ({geometry-column})
indextype is mdsys.spatial_index;

Index created.