Da mit Sicherheit nicht alle Interessierten die Gelegenheit hatten, den Webcast live zu verfolgen, haben wir diesen aufgezeichnet. Er steht auf ON24 bereit. Einfach auf "Präsentation starten" klicken und los geht's.
Tipps, Tricks, Best Practices und Aktuelles zu Oracle Spatial Technologies
Freitag, 21. September 2012
Aufgezeichneter Webcast "Wie kommen Daten auf die Karte"
Mittwoch, 1. August 2012
Das Navi in der Datenbank
Dafür braucht´s doch eigentlich nicht so viel. Lassen Sie mich mal "laut" denken:
Vom Start- als auch Endpunkt kenne ich die (ungefähre) Adresse.
Was ich jetzt brauche, ist ein Prozess, der Folgendes für mich erledigt:
- Suche in einem Straßennetz nach Start- und Zielpunkt.
- Berechne den kürzesten oder auch schnellsten Weg zwischen diesen beiden Punkten.
- Gib mir die ermittelte Route zurück sowohl in ihrer textlichen Beschreibung als auch grafisch in einer Karte dargestellt.
Ein Straßennetz als Datengrundlage
Wo bekomme ich ein Straßennetz her? Wie findet das seinen Weg in meine Datenbank?Sie merken schon, ich verwende den Begriff Straßennetz. So ein Netz hat eine bestimmte Struktur, ist es doch aus Knoten und Kanten aufgebaut, das mit Hilfe des Netzwerkdatenmodells (NDM) (Funktionalität der DB EE Option Oracle Spatial) abgebildet wird. Soll das Netz noch "routingfähig" sein, so sind noch zusätzliche Dinge zu berücksichtigen. Um hier nicht „Hand anlegen“ zu müssen, kann man auf bekannte Datenanbieter zurückgreifen an, welche routingfähige Datensets für die Oracle Datenbank bereitstellen. Die Zauberformel hier heißt: Bitte im "Oracle Delivery Format" (ODF).
Für diesen Blog verwende ich ein Demo-Datenset für die Stadt San Francisco, welches vom Datenanbieter NAVTEQ kostenfrei abgegeben wird. Zwar war ich dort noch nicht, aber Start- und Endpunkte für Testanfragen zu finden, sollte nicht so schwer sein.
Also laden Sie sich das Datenset zunächst einmal herunter. Den entsprechenden Link darauf finden Sie auf den "Oracle Spatial – Partners´ Data Downloads" Seiten.
Nach dem Auspacken finden Sie typischerweise sowohl die eigentlichen Daten als .dmp-Datei sowie Installationsanleitung und Setup-Skript.
Die Daten sollen einem eigenen DB-Benutzer zugeordnet werden. Von daher lege ich diesen erst einmal an und statte ihn mit notwendigen Rechten aus.
sqlplus system/oracle
-- Neuen Datenbank-Nutzer anlegen als SYSTEM create user navteq_sf identified by navteq_sf; -- Nutzer NAVTEQ_SF mit notwendigen Rechten ausstatten alter user NAVTEQ_SF default tablespace USERS quota unlimited on USERS; grant connect,resource,create view to navteq_sf; grant create any directory to navteq_sf; -- Ausloggen exit;So jetzt geht´s daran, das San Francisco Datenset zu importieren. Bei diesem doch relativ kleinen Datenbestand von ca. 230MB reicht der altbekannte imp-Befehl aus.
REM Importieren der Daten REM Vorher in das Verzeichnis wechseln, in welchem die Daten liegen imp navteq_sf/navteq_sf file=NAVTEQ_SF_Sample.dmp log=NAVTEQ_SF_Sample.log full=yesIm Installationsskript finden Sie Hinweise, dass anschliessend ein bisschen Postprocessing notwendig ist. Es müssen nämlich noch Darstellungsvorschriften für die spätere Visualisierung als Karte eingefügt werden. Und auch das Netzwerk ist zu registrieren sowie für eine effiziente Anfragebearbeitung zu partitionieren. Letzteres setzt übrigens nicht die Option Partitioning voraus, sondern gehört zum Funktionsumfang von Oracle Spatial und dessen NDM.
sqlplus navteq_sf/navteq_sf
-- Postprocessing wie im Installationsskript bei NAVTEQ beschrieben -- Metadaten einfügen insert into user_sdo_maps select * from my_maps; insert into user_sdo_cached_maps select * from my_cached_maps; insert into user_sdo_themes select * from my_themes; insert into user_sdo_styles select * from my_styles; commit; -- Anmelden als SYSTEM connect system/oracle -- DB Verzeichnis für die Log-Datei anlegen create or replace directory sdo_router_log_dir AS '/tmp/NAVTEQ'; -- Zugriffsrechte sowohl auf DB- als auch OS-Verzeichnis einräumen grant read, write on directory sdo_router_log_dir to navteq_sf; call dbms_java.grant_permisssdo_router_partitionion( 'NAVTEQ_SF', 'SYS:java.io.FilePermission', '/tmp/NAVTEQ/sdo_router_partition.log', 'write' ); call dbms_java.grant_permission( 'MDSYS', 'SYS:java.io.FilePermission', '/tmp/NAVTEQ/sdo_router_partition.log', 'write' ); -- Anmelden als NAVTEQ_SF -- Netzwerk einrichten -- Parameter: -- Name der Log-Datei (Default: 'sdo_router_partition.log') -- Name des Netzwerkes (Default: 'NDM_US') execute sdo_router_partition.delete_router_network('sdo_router_partition.log', 'NAVTEQ_SF_NET'); execute sdo_router_partition.create_router_network('sdo_router_partition.log', 'NAVTEQ_SF_NET'); -- Noch mal prüfen select network from user_sdo_network_metadata; -- Netzwerk partitionieren -- Parameter: -- Name der Log-Datei (Default: 'sdo_router_partition.log') -- Max. Anzahl von anzulegenden Partitionen (Default: 10000) -- Fahrseite (Default: 'R') -- Name des Netzwerkes (Default: 'NDM_US') -- Cleanup (Default: TRUE) execute sdo_router_partition.partition_router('sdo_router_partition.log',1000,'R','NAVTEQ_SF_NET'); -- Partitionen prüfen select count(*) from partition; -- Remove the directory as user SYSTEM connect system/oracle drop directory sdo_router_log_dir;Wie sieht mein soeben geladenes, registriertes und partitioniertes Netzwerk eigentlich aus?
Das überprüfe ich mit dem NDM Editor, einer Java-Anwendung, welcher im Verzeichnis $ORACLE_HOME/md/demo/network/editor liegt, sofern man die Oracle DB Examples installiert hat. Da dieser Editor "einst" für Demozwecke mit Spatial in der Oracle DB 10g entwickelt wurde, ist dessen Oberfläche schon "etwas in die Jahre" gekommen. Aber voilá, mein Netzwerk ist da.
Damit ist der 1. Teil auch schon geschafft.
Routing Engine aufsetzen
Im Gegensatz zu den Datensets (routingfähiges Netzwerk) ist die Routing Engine Bestandteil von Oracle Spatial. Über diese wird eine XML-basierter Web Service bereitgestellt, der entweder- eine individuelle Route von A nach B und für diese Informationen zu Distanz, Richtung und voraussichtlicher Fahrzeit berechnet oder
- Mehrfachrouten von A nach B, C, D, ... berechnet und für jede der ermittelten Routen die Distanz sowie voraussichtlicher Fahrzeit ausgibt.
Wenn für das Routing besondere Einschränkungen (sogenannte Netzwerk-Constraints wie z.B. gesperrte Bereiche, Abbiegeverbote) oder dynamische Kosten zu berücksichtigen sind, dann steht dafür eine Java-API bereit.
Die Routing Engine ist technisch gesehen eine J2EE Web-Anwendung, die ich auf einem WebLogic Server deployen werde. Dazu habe ich vorab über OTN den WebLogic Server 10.3.6 heruntergeladen (wls1036_dev.zip), ausgepackt und eine Domain (Name: route_domain / Port: 7001) angelegt. Hinweise für das Anlegen der Domain können der Online-Dokumentation entnommen werden.
Hinweise zum Deployment gibt es im Kapitel 13 des Oracle Spatial Developer´s Guide. Das Netzwerk hatten wir ja schon registriert. Dadurch können die Punkte 1 und 2 im Kap. 13.2 übersprungen werden. Auch die Default-Web-Seite wird im Moment nicht benötigt. Was ich jedoch benötige, ist das routeserver.ear-File aus $ORACLE_HOME/md/jlib. Hier folge ich genau der Handbuch-Beschreibung inklusive dem Kopieren von xmlparserv2.jar aus $ORACLE_HOME/LIB/ nach $routeserver.ear/web.war/WEB-INF/lib/.
Da wir für die Umwandlung von Adressen in Geokoordinaten auch einen Geocoding-Service benötigen, wird das geocoder.ear-File aus $ORACLE_HOME/md/jlib analog in die gleiche WebLogic-Domain deployed. Hinweise dazu gibt es im Kapitel 11.7 des gleichen Handbuchs.
Bevor die Admin Console des RouteServers das 1. Mal gestartet wird, um den RouteServer zu deployen, sollte noch die Speicherzuweisungen für die Java-Umgebung in $MW_HOME/user_projects/domains/route_domain/bin/setDomainEnv.sh erhöht werden. Ich habe die folgenden Werte für meine 32-bit Java Runtime Umgebung verwendet:
- -Xms512m
- -Xmx1024m
- -XX:PermSize=128m
- -XX:MaxPermSize=256m
Und jetzt kann der RouteServer gestartet werden.
cd $MW_HOME/user_projects/domains/route_domain/bin ./startWebLogic.shUm zu sehen, ob RouteServer als auch Geocoder richtig deployed sind, starte ich zunächst die Admin-Console auf der Route Domain. Einfach einen Browser öffnen und als URL http://localhost:7001/console eingeben.
Jetzt muss der RouteServer noch so konfiguriert werden, dass er auf das zuvor angelegt Straßennetz von San Francisco zugreift, um für diesen Bereich dann Routen berechnen zu können. Die Admin-Konsole kann geschlossen und der RouteServer gestoppt werden.Zum Stoppen reicht eine CTRL-C im Terminalfenster.
Die Konfigurationsdatei web.xml für den RouteServer liegt im Verzeichnis $MW_HOME/routeserver.ear/web.war/WEB-INF.
Die vorgenommenen Änderungen sind nachfolgend aufgeführt. In der Tabelle angegebene Parameterwerte bleiben unverändert.
param-name | param-value |
---|---|
routeserver_schema_jdbc_connect_string | jdbc:oracle:thin:@localhost:1521:orcl |
routeserver_schema_username | NAVTEQ_SF |
routeserver_network_name | NAVTEQ_SF_NET |
geocoder_http_url | http://localhost:7001/geocoder/gcserver |
geocoder_schema_host | localhost |
geocoder_schema_port | 1521 |
geocoder_schema_sid | orcl |
geocoder_schema_username | NAVTEQ_SF |
geocoder_schema_password | navteq_sf |
max_speed_limit | 100 |
language | German |
Hinweis: Die Parameterwerte beziehen sich auf meine Testumgebung. Gegebenenfalls müssen Sie diese für Ihre Testumgebung anpassen.
Die Konfigurationsdatei geocodercfg.xml für den Geocoder liegt im Verzeichnis $MW_HOME/geocoder.ear/web.war/WEB-INF und ist nicht ganz so umfangreich. Hier genüt es, die Datenbank-Attribute im element geocoder abzuändern.
Um alle Änderungen zu aktivieren, starte ich den RouteServer noch mal wie oben bereits beschrieben. Im Browser geben sie dann die URL http://localhost:7001/routeserver ein. Was Sie dann erhalten, ist die nachfolgend abgebildete Webseite:
Mit diesem Schritt sind alle vorbereitenden Maßnahmen abgeschlossen und der RouteServer kann wie eingangs beschrieben verwendet werden.Routen berechnen mittels XML Request und Response
Anfragen an den RouteServer werden nun als XML-Request gestellt. Ergebnisse kommen als XML-Response zurück.Jetzt können einfache (simple) als auch Batch-Anfragen gestellt werden über die vorhandenen Links. Die Angaben im XML Dokument (Request) zu Start und Ziel(en) sind dabei auf das Datenset für San Francisco anzupassen. Auch die Angaben zu den Präferenzen im Element route_request sind anpaßbar. Erläuterungen zu den gültigen Werten finden sich im Handbuch.
Nachfolgend ein Beispiel:
<?xml version="1.0" standalone="yes"?> <route_request id="10" route_preference="fastest" road_preference="local" return_driving_directions="true" distance_unit="km" time_unit="minute" return_route_geometry="true"> <start_location> <input_location id="1"> <input_address> <us_form2 street="3001 Taraval St" city="San Francisco" state="CA" zip_code="94116" /> </input_address> </input_location> </start_location> <end_location> <input_location id="2"> <input_address> <us_form1 street="3010 Geary Boulevard" lastline="san francisco, ca" /> </input_address> </input_location> </end_location> </route_request>Das Ergebnis sieht dann so aus:
Für die Spezifikation der Adressen (Element input_address) gibt es verschiedene formatierte als auch unformatierte Eingabemöglichkeiten. Detaillierte Informationen dazu finden sich in der Geocoding Request XML Schema Definition.
Für den Eistieg in das Routing mit Oracle Spatial will ich es mit diesen Ausführungen bewenden lassen. Probieren Sie es einfach aus.
P.S. Zum besseren Verständnis sind die verwendeten Umgebungsvariablen nachfolgend aufgeführt:
ORACLE_HOME=/home/oracle/app/oracle/product/11.2.0/dbhome_2
JAVA_HOME=/usr/java/latest
MW_HOME=/home/oracle/middleware
WL_HOME=/home/oracle/middleware/wlserver
Donnerstag, 31. Mai 2012
TU Berlin ist ein Gewinner des 2012 Oracle Spatial Award
In der Kategorie Education and Research ging der Preis nach Deutschland an die Technische Universität Berlin.
Wofür gab es den Preis?
"The Institute for Geodesy and Geoinformation Science of the Technical University of Berlin (TU Berlin) was selected for its leading research work in mapping of urban and regional space onto virtual 3D-city and landscape models, and use of Oracle Spatial, including 3D Vector and Georaster type support, as the data management platform."
Herzlichen Glückwünsch von uns an das Team um Prof. Thomas Kolbe.
Informationen zu den anderen Gewinnern finden sich in diesem Blog Post von Mandy Ho.
Mittwoch, 4. April 2012
Location Intelligence & Oracle Spatial User Conference Agenda
Key executives beinhalten u.a.:
- Conference Introduction - Jim Steiner, Vice President, Server Technologies, Oracle
- Big Data Analytics - Pat Sack, Oracle National Security Group
- Open Source Solutions Take Hybrid Approach - Xavier Lopez, Director, Oracle Spatial and Semantic Technologies, Oracle
- Embedded Geospatial Capabilities in Enterprise Computing and BI Solutions, Jayant Sharma, Technical Director, Oracle Spatial
- What You Need To Know About Exadata – Dan Geringer, Oracle
- New Performance Enhancements in Oracle Spatial — Siva Ravada, Oracle
- Oracle Support for Spatial – Richard Pitts, Oracle
- Oracle Partner Network Spatial Specialization – Lindsey Pickle, Oracle Partner Network
Freitag, 16. März 2012
Gebäudekonstruktion mit Oracle Spatial - Teil 1: LOD1
Wie die 3D Funktionalität verwendet wird, möchte ich in mehreren Blog-Postings anhand des Aufbaus von 3D Stadtmodellen erläutern.
Im heutigen Posting soll es zunächst um die Konstruktion von LOD1 gehen. Die Abkürzung LOD steht für Level of Detail, Level 1 für die Konstruktion von Gebäudeblöcken aus in die Höhe gezogenen Grundflächen, auch Klötzchenmodell genannt.
Was wird benötigt?
- Gebäudehöhe
- Höhe über Grund
Genausogut können Hausumringe z.B. aus ALK-Daten verwendet werden, sofern Höhenangaben beigegeben sind.
Wie geht man vor?
- Liegen die Daten nicht direkt als SDO_GEOMETRY vor, müssen sie mit einem Werkzeug zuvor konvertiert werden.
- Für die zu erzeugenden 3D-Geometrien wird eine neue Tabelle angelegt.
create table buildings_lod1 ( building_id number primary key, gmlid varchar2(30), height number, ground_height number, geom sdo_geometry );
- Mit der Funktion SDO_UTIL.EXTRUDE werden aus den 2D-Geometrien (Flächen) unter Verwendung der Höhenangaben HEIGHT und GROUND_HEIGHT 3D-Geometrien (Körper) erzeugt.
-- Vorgehen für Version 11.2 insert into buildings_lod1 ( building_id, gmlid, height, ground_height, geom) select building_id, gmlid, height, ground_height, sdo_util.extrude ( geom, sdo_number_array (ground_height), sdo_number_array (height), 0.005, 7405 -- Compound CRS aus EPSG:27700 + EPSG:5701 ) from building_footprints; commit;
Für die 567 Gebäudesätze braucht es wenige Sekunden und die neue Tabelle ist befüllt.
Neues Koordinatensystem ist jetzt EPSG:7405, also OSGB 1936 + ODN height. - Zwecks Überprüfung werden die Daten nun noch nach KML konvertiert, in einem Ordner im XMLDB Repository als Resource abgelegt und mit Google Earth zur Anzeige gebracht.
-- PL/SQL Prozedur: Export SDO_GEOMETRY als KML declare result boolean; kmldoc xmltype; begin SELECT -- Anm.: Ein bisschen SQL/XML in der Datenbank kann nicht schaden xmlelement ( "kml", xmlattributes ('http://www.opengis.net/kml/2.2' as "xmlns"), xmlelement ( "Document", xmlelement ( "Style", xmlattributes('BuildingStyle' as "id"), xmlelement ("LineStyle", xmlelement ("width", '1'), xmlelement ("color", 'ffffffff') ), xmlelement ( "PolyStyle", xmlelement ("color", 'bfc0c0c0') ), xmlelement ( "BalloonStyle", xmlelement ("text", '$[name]') ) ), xmlagg ( xmlelement ( "Placemark", xmlelement ("name", 'Building '|| gmlid), xmlelement ("styleUrl", '#BuildingStyle'), xmltype ( sdo_util.to_kmlgeometry ( snap_to_ground ( sdo_cs.transform(geom,4327), 0 ) ) ) ) ) ) ) INTO kmldoc FROM buildings_lod1; -- Wenn KML-Datei schon in Repository vorhanden ist, dann löschen if dbms_xdb.existsresource ('/public/Buildings/buildings_lod1.kml') then dbms_xdb.deleteresource('/public/Buildings/buildings_lod1.kml'); end if; -- KML-Datei ins Repository schreiben result := dbms_xdb.createResource ('/public/Buildings/buildings_lod1.kml', kmldoc); if not result then raise_application_error (-20000, 'Failed to create resource'); end if; end; / commit;
Die Hilfsfunktion SNAP_TO_GROUND ist übrigens wie folgt definiert:
-- "Alles auf Grund" create or replace function snap_to_ground ( geom sdo_geometry, ground_height number) return sdo_geometry deterministic is i number; g sdo_geometry; current_ground_height number; offset number; begin g := geom; current_ground_height := sdo_geom.sdo_min_mbr_ordinate(g,3); offset := current_ground_height - ground_height; i := 0; while i < g.sdo_ordinates.count loop g.sdo_ordinates(i+3) := g.sdo_ordinates(i+3) - offset; i := i + 3; end loop; return g; end; /
Die ausserdem verwendeten Funktionen SDO_UTIL.TO_KMLGEOMETRY und SDO_CS.TRANSFORM sind Bestandteil der Oracle DB Spatial Features.
Alternativ kann der Export natürlich auch als GML (CityGML-konform) erfolgen. Dann läßt sich das Ergebnis, wie in der nachfolgenden Abbildung, z.B. mit dem LandExplorer CityGML Viewer darstellen.
Donnerstag, 15. März 2012
Anzeige von Vektordaten (Geometrien) im SQL Developer Version 3.1
Der SQL Developer enthält seit einiger Zeit Funktionalität für die Visualisierung von und den Umgang mit Daten des Typs SDO_GEOMETRY.
Mit Version 3.1 hat es nun eine Änderung gegeben, was die tabellarische Anzeige der Werte in den SDO_GEOMETRY-Spalten betrifft.
Diese werden jetzt als Platzhalter [MDSYS.SDO_GEOMETRY] angezeigt, statt wie bisher mit ihrem vollen Textinhalt.
Der eigentliche Wert wird mittels Doppelklick auf den Platzhalter eingeblendet.
Hintergrund dieser Änderung ist eine wesentliche bessere Performance in Bezug auf die Anzeige von Daten in Tabellen mit vielen Geometrien oder grossen Geometrien, die also sehr viele Stützpunkte aufweisen.
Kommentare und Informationen zum Werkzeug und seinen Features können im SQL Developer Forum ausgetauscht werden.
Für Änderungswünsche steht seitens des SQL Developer Product Management der Bereich SQL Developer Exchange zur Verfügung.
Webcast: Integration von Geodaten in ADF
Interessenten sind herzlich eingeladen, sich einzuwählen.
Einwahldaten für die Webkonferenz:
- http://stconference.oracle.com
- Conference ID: 9746601
- Conference Key: 123456
- Telefonnummern: 069 2222 16 106 oder 0800 66 485 15
- Conference Code: 208 503 9
- Security Passcode: 112233
Samstag, 10. März 2012
DOAG SIG Spatial am 18. April in Frankfurt a.M.
Die Vortragsliste umfasst folgende interessanten Beiträge:
- Das Navi in der Datenbank: Oracle11g has NAVTEQ on Board
- Das Netz: Der Umgang mit dem "Oracle Network Data Model" am Beispiel
- Verwaltung von 3D Stadtmodellen
- Koeexistenz zwischen Smallworld-GIS und Oracle Spatial
- Oracle Apex IR und OpenLayers/OSM Karten gemeinsam nutzen - dank APEX Plug-In Technologie
- Autodesk on Oracle: Erfassung und Bearbeitung raumbezogener Daten mit Oracle 11gR2 Spatial
Sonntag, 4. März 2012
Was tun, wenn die Datenbank ein Koordinatensystem nicht kennt?
select * from cs_srs where srid = 4647;eine leere Ergebnismenge. Aber das ist kein Grund zur Panik.
Denn das Problem ist mit wenigen INSERT-Befehlen behoben, sofern man nicht bis zum nächsten DB-Release warten möchte.
- Die Informationen zum fehlenden Koordinatensystem.
Für unser Beispiel 4647 sind die über die Suchfunktion auf den EPSG-Seiten zu finden. - Dazu braucht es noch die Angaben zur Transformation.
Die sind im Bereich Conversion zu finden, wenn man auf den Link View öffnet.
Wie man dort sieht, ist der dazugehörige EPSG-Code 4648. Und auch dafür gibt es einen Eintrag auf den EPSG-Seiten.
Zuerst wird die Transformation eingetragen, da später beim INSERT des Koordinatensystems auf diese referenziert wird.
insert into sdo_coord_ops ( COORD_OP_ID, COORD_OP_NAME, COORD_OP_TYPE, SOURCE_SRID, TARGET_SRID, COORD_TFM_VERSION, COORD_OP_VARIANT, COORD_OP_METHOD_ID, UOM_ID_SOURCE_OFFSETS, UOM_ID_TARGET_OFFSETS, INFORMATION_SOURCE, DATA_SOURCE, SHOW_OPERATION, IS_LEGACY, LEGACY_CODE, REVERSE_OP, IS_IMPLEMENTED_FORWARD, IS_IMPLEMENTED_REVERSE) values ( 4648, -- Code 'UTM zone 32N with prefix', -- Name 'CONVERSION', -- Operation NULL, NULL, NULL, NULL, 9807, -- Transverse Mercator (= Operation Method Name) NULL, NULL, 'Landesvermessungsamt Schleswig-Holstein.', -- Information Source 'OGP', -- Data Source 1, -- 'FALSE', -- Not legacy NULL, 1, -- Operation is reversible 1, -- Forward 1); -- and reverseAls Wert für die Spalte COORD_OP_TYPE ist CONVERSION einzutragen. Informationen zu möglichen anderen Werten sind im Oracle Spatial Developer's Guide zu finden.
Der Wert für die Spalte COORD_OP_METHOD_ID wurde mit der nachfolgenden Abfrage ermittelt.
-- Operation Method select * from sdo_coord_op_methods where coord_op_method_name = 'Transverse Mercator'; -- COORD_OP_METHOD_ID = 9807Nun sind noch die Parameterwerte wie in der Abbildung angegeben einzufügen. Dazu braucht es ein paar IDs aus den Tabellen SDO_COORD_OP_PARAMS und SDO_UNIT_OF_MEASURE.
-- Conversion parameters select parameter_id from sdo_coord_op_params where parameter_name = 'Latitude of natural origin'; -- 8801 select parameter_id from sdo_coord_op_params where parameter_name = 'Longitude of natural origin'; -- 8802 select parameter_id from sdo_coord_op_params where parameter_name = 'Scale factor at natural origin'; -- 8805 select parameter_id from sdo_coord_op_params where parameter_name = 'False easting'; -- 8806 select parameter_id from sdo_coord_op_params where parameter_name = 'False northing'; -- 8807 -- Units of measure select uom_id from sdo_units_of_measure where unit_of_meas_name = 'degree'; -- 9102 select uom_id from sdo_units_of_measure where unit_of_meas_name = 'unity'; -- 9201 select uom_id from sdo_units_of_measure where unit_of_meas_name = 'metre'; -- 9001Die 5 Parameter Latitude of natural origin, Longitude of natural origin, Scale factor at natural origin, False easting und False northing werden jetzt nacheinander in die Tabelle SDO_COORD_OP_PARAM_VALS eingetragen.
insert into sdo_coord_op_param_vals ( COORD_OP_ID, COORD_OP_METHOD_ID, PARAMETER_ID, PARAMETER_VALUE, PARAM_VALUE_FILE_REF, PARAM_VALUE_FILE, PARAM_VALUE_XML, UOM_ID) values ( 4648, 9807, 8801, -- Latitude of natural origin 0, NULL, NULL, NULL, 9102); -- degree insert into sdo_coord_op_param_vals ( COORD_OP_ID, COORD_OP_METHOD_ID, PARAMETER_ID, PARAMETER_VALUE, PARAM_VALUE_FILE_REF, PARAM_VALUE_FILE, PARAM_VALUE_XML, UOM_ID) values ( 4648, 9807, 8802, -- Longitude of natural origin 9, NULL, NULL, NULL, 9102); -- degree insert into sdo_coord_op_param_vals ( COORD_OP_ID, COORD_OP_METHOD_ID, PARAMETER_ID, PARAMETER_VALUE, PARAM_VALUE_FILE_REF, PARAM_VALUE_FILE, PARAM_VALUE_XML, UOM_ID) values ( 4648, 9807, 8805, -- Scale factor at natural origin .9996, NULL, NULL, NULL, 9201); -- unity insert into sdo_coord_op_param_vals ( COORD_OP_ID, COORD_OP_METHOD_ID, PARAMETER_ID, PARAMETER_VALUE, PARAM_VALUE_FILE_REF, PARAM_VALUE_FILE, PARAM_VALUE_XML, UOM_ID) values ( 4648, 9807, 8806, -- False easting 32500000, NULL, NULL, NULL, 9001); -- metre insert into sdo_coord_op_param_vals ( COORD_OP_ID, COORD_OP_METHOD_ID, PARAMETER_ID, PARAMETER_VALUE, PARAM_VALUE_FILE_REF, PARAM_VALUE_FILE, PARAM_VALUE_XML, UOM_ID values ( 4648, 9807, 8807, -- False northing 0, NULL, NULL, NULL, 9001); -- metreAbschliessend ist dann nur noch das Koordinatensystem 4647 einzutragen in den dafür vorgesehenen View SDO_COORD_REF_SYSTEM.
insert into sdo_coord_ref_system ( SRID, COORD_REF_SYS_NAME, COORD_REF_SYS_KIND, COORD_SYS_ID, DATUM_ID, GEOG_CRS_DATUM_ID, SOURCE_GEOG_SRID, PROJECTION_CONV_ID, CMPD_HORIZ_SRID, CMPD_VERT_SRID, INFORMATION_SOURCE, DATA_SOURCE, IS_LEGACY, LEGACY_CODE, LEGACY_WKTEXT, LEGACY_CS_BOUNDS, IS_VALID, SUPPORTS_SDO_GEOMETRY) values ( 4647, -- Code 'ETRS89 / UTM zone N32', -- Name 'PROJECTED', -- Projected CRS 4400, -- Erläuterung nachfolgend NULL, 6258, -- Erläuterung nachfolgend 4258, -- Erläuterung nachfolgend 4648, -- Zuvor registrierte Operation NULL, NULL, 'Landesvermessungsamt Schleswig-Holstein', -- Information Source 'OGP', -- Data Source 'FALSE', -- Not legacy NULL, NULL, NULL, 'TRUE', -- Is valid 'TRUE'); commit;Um den Wert 4400 für COORD_SYS_ID zu ermitteln, muss man ein bisschen genauer in die Tabelle SDO_COORD_SYS schauen. Und findet dann:
-- Coordinate axes: Easting, Northing. UoM = m select * from sdo_coord_sys where coord_sys_name like '%2D%Axes: easting, northing (E,N)%Orientations: east, north%UoM: m.'; -- COORD_SYS_ID = 4400GEOG_CRS_DATUM_ID und SOURCE_GEOG_SRID sind auch wieder mit den entsprechenden Abfragen zu ermitteln.
-- Geodetic Datum = European Terrestrial Reference System (ETRS) 1989 select * from sdo_datums where datum_name = 'European Terrestrial Reference System 1989'; -- DATUM_ID = 6258 select * from sdo_coord_ref_sys where coord_ref_sys_name = 'ETRS89' and coord_ref_sys_kind like '%2D%'; -- SRID = 4258Das Ergebnis kann nun begutachtet werden:
select * from cs_srs where srid = 4647;Mehr Infos sind natürlich im Oracle Spatial Developer's Guide zu finden.