Seit Oracle10g Release 2 unterstützt die Oracle-Datenbank die EPSG-Systematik für Koordinatensysteme. Die
Projektion Gauss-Krüger Zone 3 steht damit gleich zweimal bereit:
- als "klassische" Oracle-SRID 82027
- im EPSG-Standard als Code 31467
SQL> select srid,cs_name from cs_srs where srid in (31467, 82027)
SRID CS_NAME
---------- ----------------------------------------
31467 DHDN / Gauss-Kruger zone 3
82027 GK Zone 3 (DHDN)
Man könnte auf den Gedanken kommen, dass es nun egal ist, welchen Code man verwendet. Aber
das ist es leider nicht. Zwischen dem nach EPSG standardisierten System 31467 und
der "Oracle-Version" gibt es Unterschiede ... und die möchte ich in diesem Blog Posting
herausarbeiten.
Zunächst nehme ich die Koordinate von Oracle in München (mit dem Oracle-Geocoder, versteht sich)
und rechne die nach EPSG:31467 um.
select sdo_cs.transform(
sdo_geometry(2001, 8307, sdo_point_type(11.536734, 48.1800773, null), null, null),
31467
) transformed from dual;
TRANSFORMED
------------------------------------------------------------------------------------
SDO_GEOMETRY(2001, 31467, SDO_POINT_TYPE(3688714,69, 5341125,2, NULL), NULL, NULL)
Dies ist die absolut korrekte Koordinate im Koordinatensystem EPSG:31467. Man könnte aber
auf den Gedanken kommen, diese mit der ID 82027 in die Datenbank zu speichern ... wenn's
das gleiche Koordinatensystem ist, wäre das ja egal ...
Also rechnen wir die Koordinate wieder in WGS84 zurück und zwar einmal mit der
SRID 31467 und einmal mit 82027.
select sdo_cs.transform(
SDO_GEOMETRY(2001, 31467, SDO_POINT_TYPE(3688714.69, 5341125.2, NULL), NULL, NULL ),
8307
) transformed from dual;
TRANSFORMED
------------------------------------------------------------------------------------
SDO_GEOMETRY(2001, 8307, SDO_POINT_TYPE(11,5367341, 48,1800773, NULL), NULL, NULL)
select sdo_cs.transform(
SDO_GEOMETRY(2001, 82027, SDO_POINT_TYPE(3688714.69, 5341125.2, NULL), NULL, NULL ),
8307
) from dual;
TRANSFORMED
------------------------------------------------------------------------------------
SDO_GEOMETRY(2001, 8307, SDO_POINT_TYPE(11,5391267, 48,180154, NULL), NULL, NULL)
Und man sieht, dass es nicht das gleiche ist. Wenn man die Well Known Texts vergleicht,
lässt sich auch feststellen, dass es in den Parametern ein paar Unterschiede gibt. Die Abweichung
liegt meist im Bereich von ca. 100 bis 200 Metern.
select sdo_geom.sdo_distance(
sdo_cs.transform(
SDO_GEOMETRY(2001, 31467, SDO_POINT_TYPE(3688714.69, 5341125.2, NULL), NULL, NULL ),
8307
),
sdo_cs.transform(
SDO_GEOMETRY(2001, 82027, SDO_POINT_TYPE(3688714.69, 5341125.2, NULL), NULL, NULL ),
8307
),
1
) distanz from dual;
DISTANZ
-------------
178,128988
Und was bedeutet das? Zuerstmal alles kein Problem! Man muss es, wenn man GK3-Koordinaten (bspw. aus Shapefiles) in die Datenbank lädt, nur beachten.
Stellt man beim Betrachten der
Daten Abweichungen im Bereich von 100 bis 200 Metern fest, sollte man die andere GK3-SRID versuchen.
Meistens liegt man mit der neueren EPSG-Nummer 31467 richtig. Aber ich habe auch
schon Fälle erlebt, in denen die 82027 genommen werden musste.
Rechnet man eine Geometrie von 82027 nach 31467 um, kommen (folgerichtig) auch
nicht die gleichen Koordinaten heraus.
SQL> select sdo_cs.transform(
2 SDO_GEOMETRY(2001, 82027, SDO_POINT_TYPE(3688714.69, 5341125.2, NULL), NULL, NULL ),
3 31467
4 ) TRANSFORMED from dual;
TRANSFORMED
-----------------------------------------------------------------------------------
SDO_GEOMETRY(2001, 31467, SDO_POINT_TYPE(3688892,31, 5341139,61, NULL), NULL, NULL)
Für die anderen in Deutschland gebräuchlichen Gauss-Krüger Projektionen gilt das analog.
SQL> select srid,cs_name from cs_srs where srid in (31466, 82015);
SRID CS_NAME
---------- ----------------------------------------
31466 DHDN / Gauss-Kruger zone 2
82015 GK Zone 2 (DHDN)
SQL> select srid,cs_name from cs_srs where srid in (31468, 82032);
SRID CS_NAME
---------- ----------------------------------------
31468 DHDN / Gauss-Kruger zone 4
82032 GK Zone 4 (DHDN)