Geometrie per VIEW von anderen Benutzer holen

Steve6

Aktiver Benutzer
Beiträge
26
Hallo,

wir haben hier zwei Datenbanken. Auf der einen habe ich die Geometrie, auf der anderen die Sachdaten. Ich muss nun die Geometrie in die Datenbank der Sachdaten holen, um diese dort zu nutzen. Dabei aber nicht kopieren, da sich die Geometrie regelmäßig ändert.
Als Beispiel: DB1 Benutzer Geom, DB2 Benutzer Sachdaten

Also ein einfaches Beispiel:

select

B.FID,
B.GEOM

FROM GEBAUDE@geometrieDB b

Den Databaselink habe ich angelegt und diese VIEW funktioniert auch. Ich bekomme die Ergebnisse angezeigt.

Was mir nicht gelingt: Die Geometrie in unserem WEB-GIS darzustellen.
Ich habe die VIEW in USER_SDO_GEOM_METADATA eingetragen.
Das Problem scheint aber wohl der fehlende Spatial Index zu sein. Ich google schon seit Tagen herum, finde aber keine Lösung.
Eine materialized VIEW hat auch nicht funktioniert.

Jetzt hoffe ich auf die Spezialisten.

Danke
 
Werbung:
Hallo, ich bin hier etwas weiter.
Ich habe inzwischen eine Materialized VIEW mit den Daten die ich benötige. Zumindest in der Testdatenbank läuft fast alles :)

Ich habe eine Materialized VIEW erstellt, die sich zum testen jede Minute aktualisiert. Dort werden die Daten aus der Tabelle Punkt geholt und die Werte WERT_X und WERT_Y in eine Geometrie gewandelt:

Code:
CREATE MATERIALIZED VIEW MV_PUNKT_TEMP
REFRESH FORCE ON DEMAND
START WITH SYSDATE NEXT SYSDATE + 1/24/60
as
select fid, TESTWERT, SDO_GEOMETRY(2001, 25832, sdo_point_type(to_number(replace(wert_x,'.',',')),to_number(replace(wert_y,'.',',')),null), null, null) geom FROM PUNKT;

Jetzt habe ich die Tabelle in die SDO_GEOM_METADATA eingetragen:

Code:
INSERT INTO user_sdo_geom_metadata VALUES
('MV_PUNKT_TEMP',
'GEOM',
SDO_DIM_ARRAY
(SDO_DIM_ELEMENT ('X',-10,10000000, 0.0005),
SDO_DIM_ELEMENT ('Y',-10,10000000, 0.0005)),25832)

Das funktioniert auch gut. Die MV wird jede Minute aktualisiert.
Was mit jetzt geht, ist der SPATIAL_INDEX. Dieser wird benötigt, um die Daten in dem WEB-GIS anzeigen zu lassen.

Ich habe den Index erstellt:

Code:
CREATE INDEX MV_PUNKT_TEMP_idx
ON MV_PUNKT_TEMP  (GEOM)
INDEXTYPE IS MDSYS.SPATIAL_INDEX

Doch dann wird die Materialized View nicht mehr aktualisiert. ich denke, dass der Index hier auch aktualisiert werden muss.
Aber wie?
 
Zuletzt bearbeitet von einem Moderator:
Also mMn wärst du in einem WEB-GIS Forum besser aufgehoben...

Was meinst du mit "dass der Index hier auch aktualisiert werden muss" ?
Ein Index aktualisiert sich bei Insert / Delete / Update von selbst... ?
 
Doch dann wird die Materialized View nicht mehr aktualisiert. ich denke, dass der Index hier auch aktualisiert werden muss.

Da bezweifle ich. Test mit PostgreSQL:

Code:
test=# select * from foo;
  t  | anzahl
--------+--------
 text 1 |  3
 text 2 |  5
 text 3 |  2
(3 rows)

test=*# create materialized view mat_foo as select * from foo;
SELECT 3
test=*# create index idx_mat_foo on mat_foo(t);
CREATE INDEX
test=*# insert into foo values ('text 4',4);
INSERT 0 1
test=*# select * from mat_foo ;
  t  | anzahl
--------+--------
 text 1 |  3
 text 2 |  5
 text 3 |  2
(3 rows)

test=*# refresh materialized view mat_foo ;
REFRESH MATERIALIZED VIEW
test=*# select * from mat_foo ;
  t  | anzahl
--------+--------
 text 1 |  3
 text 2 |  5
 text 3 |  2
 text 4 |  4
(4 rows)

test=*# rollback;
ROLLBACK
test=#

Ein Refresh reicht also aus.
 
Hallo und Danke für die Rückmeldungen.

Trifft das denn auch auf einen Spatial-Index zu? Mir ist nur aufgefallen, dass die Daten in der Materialized View nicht mehr aktualisiert werden, sobald ich den Spatial-Index erstelle.
Den Refresh gebe ich doch mit

START WITH SYSDATE NEXT SYSDATE + 1/24/60

vor. Dann sollte die MV aktualisiert werden. Das macht sie ja auch bis zu dem Punkt, an dem ich den Spatial-Index erstelle.
 
Werbung:
Jetzt hat es funktioniert. Es fehlte wohl "WITH ROWID" beim erstellen der MV. Also:

Erstellen der Materialized VIEW:

Code:
CREATE MATERIALIZED VIEW MV_PUNKT_TEMP
REFRESH FORCE ON DEMAND WITH ROWID
START WITH SYSDATE NEXT SYSDATE + 1/24/60
as
select fid, TESTWERT, SDO_GEOMETRY(2001, 25832, sdo_point_type(to_number(replace(wert_x,'.',',')),to_number(replace(wert_y,'.',',')),null), null, null) geom FROM PUNKT;

Eintragen der MV in die USER_SDO_GEOM_METADATA

Code:
INSERT INTO user_sdo_geom_metadata VALUES
('MV_PUNKT_TEMP',
'GEOM',
SDO_DIM_ARRAY
(SDO_DIM_ELEMENT ('X',-10,10000000, 0.0005),
SDO_DIM_ELEMENT ('Y',-10,10000000, 0.0005)),25832);

Erstellen des SPATIAL-INDEX

Code:
CREATE INDEX MV_PUNKT_TEMP_idx
ON MV_PUNKT_TEMP  (GEOM)
INDEXTYPE IS MDSYS.SPATIAL_INDEX;

So funktioniert es.
 
Zuletzt bearbeitet von einem Moderator:
Zurück
Oben