| | | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte | | | | PNY WIRD VON NVIDIA ZUM HÄNDLER DES JAHRES GEWÄHLT, eine Pressemitteilung
|
Autor
|
Thema: X und Y (Varchar2) in GEOM umwandeln (1634 mal gelesen)
|
LarsB Mitglied
Beiträge: 448 Registriert: 13.05.2003 Windows 7 Prof. 64-Bit Tarox-Workstation mit Xeon 8 Core CPU mit 3.60 GHz 24 GB RAM NVIDIA Quadro 4000 AutoCAD Map 2019 MapEdit AutoCAD 2019
|
erstellt am: 10. Jun. 2015 16:13 <-- editieren / zitieren --> Unities abgeben:
Hallo, ich habe in einer Oracle-Tabelle einfache X- und Y-Koordinaten stehen (als Varchar2). Mehr nicht. OK, eine FID steht auch noch drin Weitere Attribute folgen. Kann ich daraus, per VIEW oder MVIEW eine Geometrie erzeugen? Also einen Punkt in einer Karte? Wenn ich die Frage hier stelle, klingt das irgendwie ganz einfach. Finde aber keine Lösung. Google erzählt mir was von SDO_POINT_TYPE oder SDO_GEOMETRY aber ich verstehe das nicht so recht. Die Liste mit den Koordinaten wird unregelmäßig ergänzt oder geändert. Also müsste die Geometrie fortlaufend aktualisiert werden. Besteht da eine elegante Möglichkeit? Danke Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Mistfink Mitglied GISler
Beiträge: 217 Registriert: 08.06.2006 Map 3D / 2013 AIMS 2013 Win 7, 64bit
|
erstellt am: 10. Jun. 2015 16:41 <-- editieren / zitieren --> Unities abgeben: Nur für LarsB
Hallo Lars, so ungefähr geht es: create or replace view points as select fid, sdo_geometry( 2001, -- 2d Punkt null, -- SRID sdo_point_type(x,y,null), null, null) geom from table1; SRID - Koordinatensystem-Code sollte noch eingetragen werden. Table1 - x,y als Varchar2 Noch daran denken - wenn man im View Geometrien erzeugt kann man darauf keine Spatial Index anlegen. Dann werden die Daten nicht im MapGuide angezeigt. Siehe: http://ww3.cad.de/foren/ubb/Forum285/HTML/000918.shtml#000008 Gruss, Robert ------------------ raumpatrouille3d.blogspot.com Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Mistfink Mitglied GISler
Beiträge: 217 Registriert: 08.06.2006 Map 3D / 2013 AIMS 2013 Win 7, 64bit
|
erstellt am: 10. Jun. 2015 16:45 <-- editieren / zitieren --> Unities abgeben: Nur für LarsB
noch als Ergänzung: neue Tabelle erstellen und einmalig mit oben gezeigtem SQL abfüllen (create table as .... anstelle create view as ... ) spatial index erstellen und nutzen auf Original Tabelle - die ja aktualisiert wird - Trigger anlegen der bei jeder Aktualisierung (Delete, Update, Insert) die geänderten/neuen/gelöschten Daten in der zweiten Tabellen mit den Spatial Geometrien nachführt. ------------------ raumpatrouille3d.blogspot.com Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
LarsB Mitglied
Beiträge: 448 Registriert: 13.05.2003 Windows 7 Prof. 64-Bit Tarox-Workstation mit Xeon 8 Core CPU mit 3.60 GHz 24 GB RAM NVIDIA Quadro 4000 AutoCAD Map 2019 MapEdit AutoCAD 2019
|
erstellt am: 11. Jun. 2015 08:34 <-- editieren / zitieren --> Unities abgeben:
Hallo Robert, das ist mal eine interessante Variante mit dem Trigger. ich habe hier ständig das Problem, dass ich Geometrie aus anderen Tabellen mit Sachdaten aus weiteren Tabellen verknüpfen muss. Leider verweigert MapGuide dann die Zusammenarbeit, wie du es auch schon geschrieben hast. Mit den Triggern kenne ich mich noch nicht so aus. Da muss ich mich erst einmal einlesen. Die View muss dafür in dem selben Benutzer liegen wie die Originaltabelle? Der Trigger auch? Oder kann man per Databaselink die Daten dann auch von einem Benutzer holen? Also Benutzer A mit Koordinatentabelle Benutzer B mit Trigger und VIEW bzw. mit CREATE TABLE Danke und Gruß Lars Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Mistfink Mitglied GISler
Beiträge: 217 Registriert: 08.06.2006 Map 3D / 2013 AIMS 2013 Win 7, 64bit
|
erstellt am: 11. Jun. 2015 09:01 <-- editieren / zitieren --> Unities abgeben: Nur für LarsB
Hallo Lars, DB-Link heisst Du greifst auf eine andere DB zu. Ein anderer User kann aber in der gleichen DB vorhanden sein. Bei Verwendung eines DB Links müsste man vielleicht etwas anders vorgehen - wenn Du einen DB Link verwenden musst sag nochmal Bescheid. Ist es auch eine Oracle DB zu der der Link besteht? Ohne DB Link - Variante: Benutzer A mit Koordinatentabelle (Original) und Trigger und neuer Tabelle mit Spatial Geometrie Benutzer B - mit View auf Tabelle mit Spatial Geomtrie im Benutzer A Die Trigger müssen an die Originaltabelle da sich ja dort die Daten ändern und man auf diese Aenderungen (per Trigger) reagieren muss. Wenn Du aber nur Punktförmige Geometrien hast - geht das dann nicht über FDO ODBC mit dem man ja auf X,Y Spalten zugreifen kann?
Zum Oracle Trigger kann ich Dir auch ein zwei Beispiele geben, Gruss, Robert
------------------ raumpatrouille3d.blogspot.com Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
LarsB Mitglied
Beiträge: 448 Registriert: 13.05.2003 Windows 7 Prof. 64-Bit Tarox-Workstation mit Xeon 8 Core CPU mit 3.60 GHz 24 GB RAM NVIDIA Quadro 4000 AutoCAD Map 2019 MapEdit AutoCAD 2019
|
erstellt am: 11. Jun. 2015 09:17 <-- editieren / zitieren --> Unities abgeben:
Ja, ich greife auf eine anderen Datenbank zu. Ist aber alles Oracle. Der Database-Link steht aber auch. Das funktioniert. FDO-ODBC? Das geht auch mit Oracle? Ein Beispiel für den Trigger wäre auch klasse
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Mistfink Mitglied GISler
Beiträge: 217 Registriert: 08.06.2006 Map 3D / 2013 AIMS 2013 Win 7, 64bit
|
erstellt am: 11. Jun. 2015 11:02 <-- editieren / zitieren --> Unities abgeben: Nur für LarsB
Hallo Lars, also per FDO ODBC sollte man auch auf Oracle zugreifen können. Du müsstest auf dem MapGuide Server eine entsprechende ODBC Verbindung einrichten.
Ich weiss nicht, ob die ODBC Verbindung mit VARCHAR2 für Koordinatenangaben zurecht kommt - eventuell müsstest Du diese als NUMBER vorhalten? Soweit ich weiss war FDO ODBC früher mal nicht so performant - aber das hat sich inzwischen vielleicht gegeben. Falls es mit ODBC nicht geht oder andere Geomtrietypen ins Spiel kommen sind unten die Beispiel-Trigger.
Man muss auch keine neue Tabelle anlegen (also im Beispiel table1_spatial). Man kann die bestehende Tabelle auch einfach um eine GEOM Spalte ergänzen und dann per Trigger diese Spalte nachführen, wenn sich X,Y geändert hat bzw. eine neuer Datensatz eingefügt wurde. Dann muss man nur in der Ziel-DB den View erzeugen. Robert
-- anstelle einer neuen Tabelle könnte man diese bestehende Tabelle (im Beispiel tbale1) einfach um ein GEOM Feld ergänzen -- die trigger müsste man dann nur geringfügig anpassen.
create table table1_spatial as select fid, sdo_geometry( 2001, -- 2d Punkt null, -- SRID sdo_point_type(x,y,null), null, null) geom from table1; CREATE OR REPLACE TRIGGER Table1_BU -- BU = BeforeUpdate BEFORE UPDATE OF X,Y ON Table1 -- Trigger wird nur aktiv wenn sich X oder Y ändern FOR EACH ROW -- pro geänderter Zeile wird Trigger ausgeführt, ändert sich mehrere Datensätze wird der Trigger je geänderten Datensatz ausgeführt BEGIN
update table1_spatial set geom = sdo_geometry( 2001, -- 2d Punkt null, -- SRID muss noch gesetzt werden sdo_point_type ( :new.x, -- der neue X Wert :new.y, -- der neue Y Wert null ), null, null) where fid = :new.fid; -- FID sollte sich nicht beim Update ändern, man kann auch ld.fid verwenden -- zu :new / ld siehe: http://docs.oracle.com/cd/B28359_01/appdev.111/b28370/triggers.htm#g1041933 END; CREATE OR REPLACE TRIGGER Table1_BI -- BI = BeforeInsert BEFORE INSERT ON Table1 -- Trigger wird bei INSERT aktiv FOR EACH ROW -- pro geänderter Zeile wird Trigger ausgeführt, ändert sich mehrere Datensätze wird der Trigger je geänderten Datensatz ausgeführt BEGIN
insert into table1_spatial (fid, geom) values (:new.fid, sdo_geometry( 2001, -- 2d Punkt null, -- SRID muss noch gesetzt werden sdo_point_type ( :new.x, -- der neue X Wert :new.y, -- der neue Y Wert null ), null, null)); END; ------------------ raumpatrouille3d.blogspot.com Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
LarsB Mitglied
Beiträge: 448 Registriert: 13.05.2003 Windows 7 Prof. 64-Bit Tarox-Workstation mit Xeon 8 Core CPU mit 3.60 GHz 24 GB RAM NVIDIA Quadro 4000 AutoCAD Map 2019 MapEdit AutoCAD 2019
|
erstellt am: 11. Jun. 2015 11:50 <-- editieren / zitieren --> Unities abgeben:
Hallo, das muss ich erst einmal verdauen. Da die andere Datenbank eine Fremddatenbank ist, muss ich mal schauen, was ich dort alles anstellen darf. Ich habe mich gerade mit der VIEW beschäftigt. select fid, SDO_GEOMETRY(2001, 25832,SDO_POINT_TYPE(X,Y, NULL), NULL, NULL) GEOM FROM PUNKT will nicht so recht. ORA-01722: Ungültige Zahl sagt er mir. Wenn ich x und y durch eine einfach zahl ersetze, dann geht es.
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Mistfink Mitglied GISler
Beiträge: 217 Registriert: 08.06.2006 Map 3D / 2013 AIMS 2013 Win 7, 64bit
|
erstellt am: 11. Jun. 2015 13:22 <-- editieren / zitieren --> Unities abgeben: Nur für LarsB
Hallo Lars, die Koordinatenangaben verwenden ein Komma als Trennzeichen? Dann sollte folgende Ergänzung helfen: sdo_point_type(to_number(replace(x,',','.')),to_number(replace(y,',','.')),null), null, null) geom Das Komma wird durch einen Punkt ausgetauscht und dann wird der Varchar2 Datentyp explizit in ein NUMBER Typ umgewandelt. Robert ------------------ raumpatrouille3d.blogspot.com Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
LarsB Mitglied
Beiträge: 448 Registriert: 13.05.2003 Windows 7 Prof. 64-Bit Tarox-Workstation mit Xeon 8 Core CPU mit 3.60 GHz 24 GB RAM NVIDIA Quadro 4000 AutoCAD Map 2019 MapEdit AutoCAD 2019
|
erstellt am: 11. Jun. 2015 13:39 <-- editieren / zitieren --> Unities abgeben:
|
LarsB Mitglied
Beiträge: 448 Registriert: 13.05.2003 Windows 7 Prof. 64-Bit Tarox-Workstation mit Xeon 8 Core CPU mit 3.60 GHz 24 GB RAM NVIDIA Quadro 4000 AutoCAD Map 2019 MapEdit AutoCAD 2019
|
erstellt am: 11. Jun. 2015 15:13 <-- editieren / zitieren --> Unities abgeben:
|
Mistfink Mitglied GISler
Beiträge: 217 Registriert: 08.06.2006 Map 3D / 2013 AIMS 2013 Win 7, 64bit
|
erstellt am: 11. Jun. 2015 15:16 <-- editieren / zitieren --> Unities abgeben: Nur für LarsB
also x,y sind die Namen der beiden Spalten, die in der Tabelle die Koordinatenwerte haben - wenn die bei Dir nicht x und y heissen müsstest Du das im SQL anpassen hast du mal kontrolliert ob in den beiden spalten wirklich nur "Zahlenwerte" vorkommen? Um die Geometrie zu erzeugen muss ein Zahlenwert vorliegen - Oracle wandelt dabei varchar2 automatisch in number um - das funktioniert solange Zahlen in der spalte stehen. wenn dort keine Zahlen stehen kann Oracle das nicht in eine Typ "Number" umwandeln. ------------------ raumpatrouille3d.blogspot.com Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
LarsB Mitglied
Beiträge: 448 Registriert: 13.05.2003 Windows 7 Prof. 64-Bit Tarox-Workstation mit Xeon 8 Core CPU mit 3.60 GHz 24 GB RAM NVIDIA Quadro 4000 AutoCAD Map 2019 MapEdit AutoCAD 2019
|
erstellt am: 11. Jun. 2015 15:19 <-- editieren / zitieren --> Unities abgeben:
Das mit X und Y ist mir schon klar. Also es stehen dort ziffern drin: X 402513.437 Y 5881347.921 aber wie gesagt, den Punkt nimmt er nicht. So mag er es: X 402513,437 Y 5881347,921 [Diese Nachricht wurde von LarsB am 11. Jun. 2015 editiert.] [Diese Nachricht wurde von LarsB am 11. Jun. 2015 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Mistfink Mitglied GISler
Beiträge: 217 Registriert: 08.06.2006 Map 3D / 2013 AIMS 2013 Win 7, 64bit
|
erstellt am: 11. Jun. 2015 15:35 <-- editieren / zitieren --> Unities abgeben: Nur für LarsB
ah, verstehe - bei uns ist es genau andersherum - der Punkt ist das korrekte Trennzeichen, nicht das Komma. Dann müsstest Du bei replace bloss "." und "," vertauschen. ------------------ raumpatrouille3d.blogspot.com Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
LarsB Mitglied
Beiträge: 448 Registriert: 13.05.2003 Windows 7 Prof. 64-Bit Tarox-Workstation mit Xeon 8 Core CPU mit 3.60 GHz 24 GB RAM NVIDIA Quadro 4000 AutoCAD Map 2019 MapEdit AutoCAD 2019
|
erstellt am: 11. Jun. 2015 15:47 <-- editieren / zitieren --> Unities abgeben:
Ah, ok. Manches kann so einfach sein... Danke So geht es nun: select fid, SDO_GEOMETRY(2001, 25832, sdo_point_type(to_number(replace(wert_x,'.',',')),to_number(replace(wert_y,'.',',')),null), null, null) geom FROM PUNKT Ob ich den Rest verstehe, weiß ich noch nicht. Ich habe jetzt eine View in der aus Koordinaten eine Geometrie-View gemacht wird. Jetzt muss ich das noch in eine Tabelle bekommen. Dazu muss ich mir deine Tipps dann noch mal in Ruhe durchlesen. Gruß, Lars [Diese Nachricht wurde von LarsB am 11. Jun. 2015 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
LarsB Mitglied
Beiträge: 448 Registriert: 13.05.2003 Windows 7 Prof. 64-Bit Tarox-Workstation mit Xeon 8 Core CPU mit 3.60 GHz 24 GB RAM NVIDIA Quadro 4000 AutoCAD Map 2019 MapEdit AutoCAD 2019
|
erstellt am: 15. Jun. 2015 15:15 <-- editieren / zitieren --> Unities abgeben:
Hallo Robert, habe mir jetzt mal alles durchgelesen und nachvollzogen: Insert--------- CREATE OR REPLACE TRIGGER PUNKT_BI BEFORE INSERT ON PUNKT FOR EACH ROW BEGIN insert into T_KOORDINATEN (fid, geom) values (:new.fid, SDO_GEOMETRY( 2001, 25832, sdo_point_type(to_number(replace(:new.wert_x,'.',',')),to_number(replace(:new.wert_y,'.',',')), null), null, null)); END; Update------------- CREATE OR REPLACE TRIGGER PUNKT_BU BEFORE UPDATE OF WERT_X,WERT_Y ON PUNKT FOR EACH ROW BEGIN update T_KOORDINATEN set geom = SDO_GEOMETRY( 2001, 25832, sdo_point_type(to_number(replace(:new.wert_x,'.',',')),to_number(replace(:new.wert_y,'.',',')), null), null, null) where fid = :new.fid; END; DELETE--------------- CREATE OR REPLACE TRIGGER PUNKT_BD BEFORE DELETE ON PUNKT FOR EACH ROW BEGIN DELETE FROM T_KOORDINATEN where fid = ld.fid; END; ---------------------------------------------- Wenn ich jetzt in der Tabelle Punkte, außer den Koordinaten, noch einen TESTWERT (z.b. die farbe rot, grün oder blau) habe, wie bekomme ich den dann mit? Wo müsste ich diesen z.B. beim BEFORE UPDATE Trigger einsetzten, damit dieser auch aktualisiert wird? Ich habe einige Varianten getestet, leider erfolglos. Danke für deine Hilfe. Gruß, Lars
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Mistfink Mitglied GISler
Beiträge: 217 Registriert: 08.06.2006 Map 3D / 2013 AIMS 2013 Win 7, 64bit
|
erstellt am: 17. Jun. 2015 07:50 <-- editieren / zitieren --> Unities abgeben: Nur für LarsB
Hoi Lars, hab erst ich jetzt gesehen dass Du noch etwas geschrieben hast. Beim Update - Du willst noch einen weiteren Wert berüpcksichtigen, der sich in der Ausgangstabelle geändert hat und in der zweiten Tabelle nachgeführt werden muss?
im Update Trigger: update T_KOORDINATEN set geom = SDO_GEOMETRY( 2001, 25832, sdo_point_type(to_number(replace(:new.wert_x,'.',',')),to_number(replace(:new.wert_y,'.',',')), null), null, null), set testwert = :new.testwert where fid = :new.fid;
Robert
------------------ raumpatrouille3d.blogspot.com Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|