Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Geometrie per VIEW von anderen Benutzer holen

Dieses Thema im Forum "Oracle" wurde erstellt von Steve6, 22 April 2015.

  1. Steve6

    Steve6 Aktiver Benutzer

    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
     
  2. Steve6

    Steve6 Aktiver Benutzer

    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 von einem Moderator bearbeitet: 29 Juni 2015
  3. Distrilec

    Distrilec Datenbank-Guru

    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... ?
     
  4. akretschmer

    akretschmer Datenbank-Guru

    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.
     
  5. Steve6

    Steve6 Aktiver Benutzer

    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.
     
  6. Steve6

    Steve6 Aktiver Benutzer

    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 von einem Moderator bearbeitet: 30 Juni 2015
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden