300 likes | 485 Views
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;
E N D
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)); SELECTREF(p) INTO xFROM person_tab pWHERE ...… 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‘ )); INSERT INTO person_tab VALUES (Employee( 'Jim Smith', '15 Jun 1965', 5000 ));
Kolekce CREATE TYPE WeekDays ASVARRAY(7) OFVARCHAR(10); CREATE TYPE PhoneNumberTable AS TABLE OF PhoneNumber; CREATE TYPE Person AS OBJECT (...phoneNumbers PhoneNumberTable); = CREATE TABLE person_tab OF PersonNESTED 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 TABLETABULKA (jméno_věciVARCHAR2(32),geometrieMDSYS.SDO_GEOMETRY);
SDO_GEOMETRY Předdefinováno jako: CREATE TYPE SDO_GEOMETRY AS OBJECT (SDO_GTYPENUMBER,SDO_SRID NUMBER,SDO_POINT SDO_POINT_TYPE,SDO_ELEM_INFO MDSYS.SDO_ELEM_INFO_ARRAY,SDO_ORDINATES MDSYS.SDO_ORDINATE_ARRAY);
SDO_GTYPE CREATE TYPESDO_GEOMETRY AS OBJECT (SDO_GTYPENUMBER,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 CREATE TYPESDO_GEOMETRY AS OBJECT (SDO_GTYPENUMBER,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 CREATE TYPESDO_GEOMETRY AS OBJECT (SDO_GTYPENUMBER,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 CREATE TYPESDO_GEOMETRY AS OBJECT (SDO_GTYPENUMBER,SDO_SRIDNUMBER,SDO_POINT SDO_POINT_TYPE,SDO_ELEM_INFOMDSYS.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 CREATE TYPESDO_GEOMETRY AS OBJECT (SDO_GTYPENUMBER,SDO_SRIDNUMBER,SDO_POINT SDO_POINT_TYPE,SDO_ELEM_INFO MDSYS.SDO_ELEM_INFO_ARRAY,SDO_ORDINATESMDSYS.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
A = 40 , 20 B = 110 , 90 exterior rectangle ETYPE = 1003 E _ INTERPRETATION = 3 MDSYS . SDO _ ORDINATE _ ARRAY ( A , B ) Příklad dat 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)));
A = 75 , 15 B = 115 , 55 C = 75 , 95 exterior circle ETYPE = 1003 E _ INTERPRETATION = 4 MDSYS . SDO _ ORDINATE _ ARRAY ( A , B , C ) Příklad dat 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 INDEXTABULKA_I ONTABULKA(geometrie)INDEXTYPE IS MDSYS.SPATIAL_INDEX; CREATE INDEXTABULKA_I ONTABULKA(geometrie)INDEXTYPE IS MDSYS.SPATIAL_INDEXPARAMETERS('SDO_LEVEL = 6, SDO_NUMTILES=12');
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ěciAND 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.GIDAND SDO_RELATE(A.geometrie, C.geometrie, 'mask=anyinteract') = 'TRUE' ) AND V.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' );
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_GEORASTERAS OBJECT(rasterTypeNUMBER,spatialExtentMDSYS.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 NOLOGGINGLOB(rasterBlock) STORE AS rdt_1_rbseg(TABLESPACE geor_tbs_2CHUNK 8192CACHE READSNOLOGGINGPCTVERSION 0STORAGE (PCTINCREASE 0) ));
Manipulace • SDO_GEOR • SDO_GEOR_UTL [ http://www.oracle.com/technology/sample_code/products/spatial/htdocs/georaster.html ]
Díky Otázky?