Prostorové databáze PDB demonstrační cvičení Oracle [ http://www.fit.vutbr.cz/~chmelarp/pdb/ ] [ http://www.fit.vutbr.cz/study/courses/PDB ]
Objekty v databázi CREATE TYPE Person AS OBJECT ( name VARCHAR(30), birthdate DATE, MEMBER FUNCTION getAge RETURN NUMBER ) NOT FINAL; CREATE TYPE Employee UNDER Person ( salary NUMBER, manager REF Employee, MEMBER PROCEDURE incrSalary (increment NUMBER) ); SELECT REF(p) INTO x FROM person_tab p WHERE ... … p.manager.name … ; [ Kuba ]
Objektově relační schizofrenie CREATE TABLE person_tab OF Person; INSERT INTO person_tab VALUES ( 'Jim Smith', '15 Jun 1965' ); INSERT INTO person_tab VALUES ( Person( 'Jim Smith', '15 Jun 1965‘ ) ); VALUES ( Employee( 'Jim Smith', '15 Jun 1965', 5000 ) );
Kolekce CREATE TYPE WeekDays AS VARRAY(7) OF VARCHAR(10); CREATE TYPE PhoneNumberTable AS TABLE OF PhoneNumber; CREATE TYPE Person AS OBJECT ( ... phoneNumbers PhoneNumberTable ); = CREATE TABLE person_tab OF Person NESTED TABLE phoneNumbers STORE AS phoneNumbers_tab;
Vytvoření tabulky Tabulka s metadaty Vložení metadat Vytvoření tabulky s prostorovými daty Vložení dat Vytvoření indexu [ http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14255.pdf ]
Tabulka s metadaty Nevytváří se, od verze 9.X.Y již součástí systému (pohled v MDSYS) CREATE TABLE USER_SDO_GEOM_METADATA ( TABLE_NAME VARCHAR2(30), COLUMN_NAME VARCHAR2(30), DIMINFO MDSYS.SDO_DIM_ARRAY, SRID zadává se NULL ); Listing Information about Schema Objects ALL_OBJECTS, USER_OBJECTS ALL_CATALOG, USER_CATALOG ALL_TABLES, USER_TABLES ALL_TAB_COLUMNS, USER_TAB_COLUMNS ALL_TAB_COMMENTS, USER_TAB_COMMENTS ALL_COL_COMMENTS, USER_COL_COMMENTS ALL_VIEWS, USER_VIEWS ALL_MVIEWS, USER_MVIEWS ALL_INDEXES, USER_INDEXES ALL_IND_COLUMNS, USER_IND_COLUMNS USER_CLUSTERS USER_CLU_COLUMNS ALL_SEQUENCES, USER_SEQUENCES ALL_SYNONYMS, USER_SYNONYMS ALL_DEPENDENCIES, USER_DEPENDENCIES
Vložení metadat Nutné zaregistrovat informace o tom, kde jsou prostorová data – neděje se automaticky, jako u relačních dat INSERT INTO USER_SDO_GEOM_METADATA VALUES ( 'TABULKA', 'geometrie', MDSYS.SDO_DIM_ARRAY( MDSYS.SDO_DIM_ELEMENT( 'X', 0, 400, 0.005 ), MDSYS.SDO_DIM_ELEMENT( 'Y', 0, 300, 0.005 ) ), NULL ); CREATE TABLE USER_SDO_GEOM_METADATA ( TABLE_NAME VARCHAR2(30), COLUMN_NAME VARCHAR2(30), DIMINFO MDSYS.SDO_DIM_ARRAY, SRID zadává se NULL );
Vytvoření tabulky Jméno a sloupec musí korespondovat s metadaty CREATE TABLE TABULKA ( jméno_věci VARCHAR2(32), geometrie MDSYS.SDO_GEOMETRY );
SDO_GEOMETRY Předdefinováno jako: CREATE TYPE SDO_GEOMETRY AS OBJECT ( SDO_GTYPE NUMBER, SDO_SRID NUMBER, SDO_POINT SDO_POINT_TYPE, SDO_ELEM_INFO MDSYS.SDO_ELEM_INFO_ARRAY, SDO_ORDINATES MDSYS.SDO_ORDINATE_ARRAY );
SDO_GTYPE 4 číslice: dltt d: dimenze (1-4 (2)) CREATE TYPE SDO_GEOMETRY AS OBJECT ( SDO_GTYPE NUMBER, SDO_SRID NUMBER, SDO_POINT SDO_POINT_TYPE, SDO_ELEM_INFO MDSYS.SDO_ELEM_INFO_ARRAY, SDO_ORDINATES MDSYS.SDO_ORDINATE_ARRAY ); 4 číslice: dltt d: dimenze (1-4 (2)) l: lineární reference (0) tt: typ (00-07) 00: neznámý 01: bod 02: úsečka / křivka 03: polygon 04-07: viz manuál
SDO_SRID Souřadný systém Euklidovský typicky NULL CREATE TYPE SDO_GEOMETRY AS OBJECT ( SDO_GTYPE NUMBER, SDO_SRID NUMBER, SDO_POINT SDO_POINT_TYPE, SDO_ELEM_INFO MDSYS.SDO_ELEM_INFO_ARRAY, SDO_ORDINATES MDSYS.SDO_ORDINATE_ARRAY ); Souřadný systém Euklidovský typicky NULL
SDO_POINT Objekt – bod X, Y, Z Jen pokud „l“ z GTYPE je 0 CREATE TYPE SDO_GEOMETRY AS OBJECT ( SDO_GTYPE NUMBER, SDO_SRID NUMBER, SDO_POINT SDO_POINT_TYPE, SDO_ELEM_INFO MDSYS.SDO_ELEM_INFO_ARRAY, SDO_ORDINATES MDSYS.SDO_ORDINATE_ARRAY ); Objekt – bod X, Y, Z Jen pokud „l“ z GTYPE je 0 Typicky ve 2D Další dvě položky MUSÍ být NULL Pokud geometrie není bod je NULL
SDO_ELEM_INFO Pole trojic Offset v dalším parametru SDO_ORDINATES CREATE TYPE SDO_GEOMETRY AS OBJECT ( SDO_GTYPE NUMBER, SDO_SRID NUMBER, SDO_POINT SDO_POINT_TYPE, SDO_ELEM_INFO MDSYS.SDO_ELEM_INFO_ARRAY, SDO_ORDINATES MDSYS.SDO_ORDINATE_ARRAY ); Pole trojic Offset v dalším parametru SDO_ORDINATES Typ elementu Interpretace 1-1 Bod 2-1 Řetězec úseček 1003/2003-1 Polygon 1003/2003-3 Obdélník (rovnoběžný) 1003/2003-4 Kružnice
SDO_ORDINATES Pole (n-tic) CREATE TYPE SDO_GEOMETRY AS OBJECT ( SDO_GTYPE NUMBER, SDO_SRID NUMBER, SDO_POINT SDO_POINT_TYPE, SDO_ELEM_INFO MDSYS.SDO_ELEM_INFO_ARRAY, SDO_ORDINATES MDSYS.SDO_ORDINATE_ARRAY ); Pole (n-tic) Seznam bodů, které tvoří objekt definovaný v SDO_ELEM_INFO X, Y, Z Důležitý offset Musí odpovídat definici
Příklad dat A = 40 , 20 B 110 90 exterior rectangle ETYPE 1003 E _ INTERPRETATION 3 MDSYS . SDO ORDINATE ARRAY ( ) Obdélník INSERT INTO TABULKA VALUES ( 'PC', MDSYS.SDO_GEOMETRY ( 2003, NULL, NULL, MDSYS.SDO_ELEM_INFO_ARRAY( 1,1003,3 ), MDSYS.SDO_ORDINATE_ARRAY( 40,20, 110,90 ) ) );
Příklad dat A = 75 , 15 B 115 55 exterior circle ETYPE 1003 E _ INTERPRETATION 4 MDSYS . SDO ORDINATE ARRAY ( C ) 95 Kružnice INSERT INTO TABULKA VALUES ( 'Kvetinac1', MDSYS.SDO_GEOMETRY( 2003, NULL, NULL, MDSYS.SDO_ELEM_INFO_ARRAY( 1,1003,4 ), MDSYS.SDO_ORDINATE_ARRAY( 75,15, 75,95, 115,55,) ) );
Vytvoření indexu Až po vložení dat Ne nad prázdnou tabulkou Detaily viz dokumentace CREATE INDEX TABULKA_I ON TABULKA(geometrie) INDEXTYPE IS MDSYS.SPATIAL_INDEX; CREATE INDEX TABULKA_I ON TABULKA(geometrie) INDEXTYPE IS MDSYS.SPATIAL_INDEX PARAMETERS('SDO_LEVEL = 6, SDO_NUMTILES=12');
Ukázka
Dotazování a operace SQL Funkce z objektů prostorové nadstavby nad objektově-relačním schématem Operátory Geometrické funkce Agregační funkce Nelze bez indexu
Ukázka operací SDO_GEOM.SDO_AREA(geom, tol, [,unit]) geom je geometrie (jak ji ukládáme do DB) vytažená z DB dotazem, nebo je to konstanta stejného tvaru tol je číselná přesnost, s jakou se má pracovat v rámci sítě bodů (zásadně stejná, nebo hrubější, než jak je objekt uložen) nepovinná je textová položka udávající jednotky Výsledek: Výsledkem je číselná hodnota udávající plochu 2D polygonu.
Ukázka operací SDO_GEOM.SDO_CENTROID(geom, tol) geom je geometrie (jak ji ukládáme do DB) vytažená z DB dotazem, nebo je to konstanta stejného tvaru tol je číselná přesnost, s jakou se má pracovat v rámci sítě bodů (zásadně stejná, nebo hrubější, než jak je objekt uložen) Výsledek: Výsledkem je geometrie – bod. Jedná se o těžiště a je aplikovatelné na polygon, multi-polygon, bod, bodový shluk (cluster).
Ukázka operací SDO_GEOM.SDO_DISTANCE(geom1, geom2, tol, [,unit]) geom1/geom2 je geometrie (jak ji ukládáme do DB) vytažená z DB dotazem, nebo je to konstanta stejného tvaru tol je číselná přesnost, s jakou se má pracovat v rámci sítě bodů (zásadně stejná, nebo hrubější, než jak je objekt uložen) nepovinná je textová položka udávající jednotky Výsledek: Výsledkem je číselná hodnota udávající vzdálenost dvou nejbližších bodů, nebo segmentů daných objektů.
Ukázka operací SDO_GEOM.SDO_INTERSECTION(geom1, geom2, tol) // UNION, XOR, DIFERENCE geom1/geom2 je geometrie (jak ji ukládáme do DB) vytažená z DB dotazem, nebo je to konstanta stejného tvaru tol je číselná přesnost, s jakou se má pracovat v rámci sítě bodů (zásadně stejná, nebo hrubější, než jak je objekt uložen) Výsledek: Výsledkem je geometrický obrazec daný topologickým průnikem obou zadaných objektů.
Ukázka dotazu SELECT A.jméno_věci FROM TABULKA A, TABULKA D WHERE D.jméno_věci='Kvetinac3' AND A.jméno_věci<>D.jméno_věci AND MDSYS.SDO_WITHIN_DISTANCE( A.geometrie, D.geometrie, 'distance=50') = 'TRUE';
Ukázka dotazu SELECT V.GID, W.GID, SDO_GEOM.SDO_DISTANCE(V.geometrie, W.geometrie, 0.005) "Vzdalenost” FROM VECIKDE V, VECIKDE W WHERE W.GID <> V.GID AND W.GID IN ( SELECT A.GID FROM VECIKDE A, VECIKDE C WHERE C.GID='Stul' AND A.GID<>C.GID AND SDO_RELATE(A.geometrie, C.geometrie, 'mask=anyinteract') = 'TRUE' ) AND V.GID IN (SELECT A.GID SDO_RELATE(A.geometrie, C.geometrie, 'mask=anyinteract') = 'TRUE' );
GeoRaster Rastrová data (grid, buňky, pixely) Vzdálené pozorování Fotogrammetrie Mapové podklady GIS [ http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14254.pdf ]
Vytvoření tabulky CREATE TABLE georaster_table ( georid VARCHAR2(32), georaster SDO_GEORASTER ); CREATE TYPE SDO_GEORASTER AS OBJECT ( rasterType NUMBER, spatialExtent MDSYS.SDO_GEOMETRY, rasterDataTable VARCHAR2(32), rasterID NUMBER, metadata SYS.XMLType );
Vytvoření rastru CREATE TABLE rasterDataTable_1 OF SDO_RASTER ( PRIMARY KEY (rasterID, pyramidLevel, bandBlockNumber, rowBlockNumber, columnBlockNumber)) TABLESPACE geor_tbs NOLOGGING LOB(rasterBlock) STORE AS rdt_1_rbseg( TABLESPACE geor_tbs_2 CHUNK 8192 CACHE READS NOLOGGING PCTVERSION 0 STORAGE (PCTINCREASE 0) ) );
Manipulace SDO_GEOR SDO_GEOR_UTL [ http://www.oracle.com/technology/sample_code/products/spatial/htdocs/georaster.html ]
Díky Otázky?