80
RĪGAS TEHNISKĀ UNIVERSITĀTE Datorzinātnes un informācijas tehnoloģijas fakultāte „Lielu datu bāzu administrēšana” 1. praktiskais darbs „Grafiskās datu bāzes” Izstrādāja: Mārtiņš Paukšte (I DGDB – 3) Pārbaudīja: asoc. prof. Jānis Eiduks

Izvēlētā ģeometrija - datubaze.files.wordpress.com  · Web viewRĪGAS TEHNISKĀ UNIVERSITĀTE. Datorzinātnes un informācijas tehnoloģijas fakultāte „Lielu datu bāzu administrēšana”

  • Upload
    lenhu

  • View
    217

  • Download
    0

Embed Size (px)

Citation preview

RĪGAS TEHNISKĀ UNIVERSITĀTEDatorzinātnes un informācijas tehnoloģijas fakultāte

„Lielu datu bāzu administrēšana”

1. praktiskais darbs„Grafiskās datu bāzes”

Izstrādāja: Mārtiņš Paukšte (I DGDB – 3)Pārbaudīja: asoc. prof. Jānis Eiduks

Rīga, 2012

1. Izvēlētā ģeometrija___________________________________________________________________4

2. Slāņu definēšana____________________________________________________________________6

3. Slāņu meta datu ievade_______________________________________________________________9

4. Grafisko datu ievade________________________________________________________________11

Dažu ģeometriju piemēri ar paskaidrojumiem______________________________________________________11

Kodēšana un datu ievades interfeiss_____________________________________________________________15

Koki_______________________________________________________________________________________________19

Ēkas_______________________________________________________________________________________________21

Ceļi_______________________________________________________________________________________________23

Ūdenstilpnes________________________________________________________________________________________26

Tilti_______________________________________________________________________________________________27

Pludmales__________________________________________________________________________________________28

Sētas______________________________________________________________________________________________30

Citi objekti__________________________________________________________________________________________31

SQLLOADER izmantošana ģeometrijas datiem______________________________________________________33

5. Grafisko indeksu veidošana___________________________________________________________34

R – koka____________________________________________________________________________________34

Fiksētais indekss______________________________________________________________________________34

Hibrīdais indekss_____________________________________________________________________________34

Indeksu metadati_____________________________________________________________________________35

6. Datu vizualizācija___________________________________________________________________36

7. Grafiskie vaicājumi__________________________________________________________________41

SDO_LENGTH________________________________________________________________________________41

SDO_DISTANCE_______________________________________________________________________________42

SDO_WITHIN_DISTANCE_______________________________________________________________________43

SDO_TOUCH_________________________________________________________________________________44

SDO_FILTER_________________________________________________________________________________45

SDO_NN____________________________________________________________________________________46

SDO_RELATE_________________________________________________________________________________47

Maskas piemērs (ANYINTERACT)________________________________________________________________________47

GeoRaptor Spatial vaicājumu rīks________________________________________________________________48

8. Grafisko datu apstrāde ar Java________________________________________________________50

Nepieciešamais programmnodrošinājums_________________________________________________________50

Bibliotēku (.jar) piesaistīšana___________________________________________________________________51

Java programmas piemērs______________________________________________________________________51

9. Lielie objekti (LOB)__________________________________________________________________54

Vispārīgi par LOB_____________________________________________________________________________54

Dažas vienkāršas darbības ar CLOB_______________________________________________________________55

Datu ielāde ar SQL LOADER_____________________________________________________________________57

Datu ielāde ar BFILE tipa norādi_________________________________________________________________58

Secinājumi_____________________________________________________________________________60

1. Izvēlētā ģeometrija

Tika izvēlēta attēlojuma ģeometrija – vektoru grafika un izveidota shēma, kurā attēlots - privātmāju komplekss, parks un pludmales (skat. 1. att.).

(1.att. Mēģinājums Visio)

Sākotnēji attēls tika zīmēts ar MS Visio, bet pēc tam apstrādāts ar MS Paint (skat. 2. att.).

(2. att. Pēcapstrāde ar MS Paint)

2. Slāņu definēšana

Attiecīgi pēc izveidotā attēla tika izdalīti 8 slāņi un katram slānim izveidota tabula ģeometrijas glabāšanai + virkne unikālajai atslēgai. Katrā slāņa tabulā ir ieraksta identifikators, lauks „ģeometrija” ar tipu MSDYS.SDO_GEOMETRY un atributīvais lauks.

Atsevišķa shēma netika veidota, taču visiem datubāzes objektiem tika izveidots prefikss „gdb” (Grafiskā datu bāze), lai būtu ērtāka objektu meklēšana/filtrēšana un varētu atšķirt, kuri objekti ir mūsu projekta sfērā un kuri – standarta vai citu lietotāju/projektu veidoti.

Koki

CREATE TABLE gdb_koki ( koka_id NUMBER, geometrija MDSYS.SDO_GEOMETRY, apraksts VARCHAR2(255), CONSTRAINT pk_koki PRIMARY KEY (koka_id) );

CREATE SEQUENCE gdb_koka_id_seq INCREMENT BY 1 START WITH 1 MINVALUE 1 MAXVALUE 999999999999999999999999999 NOCYCLE NOORDER CACHE 20/

Ēkas

CREATE TABLE gdb_ekas ( ekas_id NUMBER, geometrija MDSYS.SDO_GEOMETRY, apraksts VARCHAR2(255), CONSTRAINT pk_ekas PRIMARY KEY (ekas_id) );

CREATE SEQUENCE gdb_ekas_id_seq INCREMENT BY 1 START WITH 1 MINVALUE 1 MAXVALUE 999999999999999999999999999 NOCYCLE NOORDER CACHE 20/

Ceļi

CREATE TABLE gdb_celi ( cela_id NUMBER, geometrija MDSYS.SDO_GEOMETRY,

tips VARCHAR2(255), CONSTRAINT pk_celi PRIMARY KEY (cela_id) );

CREATE SEQUENCE gdb_cela_id_seq INCREMENT BY 1 START WITH 1 MINVALUE 1 MAXVALUE 999999999999999999999999999 NOCYCLE NOORDER CACHE 20/

Ūdenstilpnes

CREATE TABLE gdb_udenstilpnes ( udenstilpnes_id NUMBER, geometrija MDSYS.SDO_GEOMETRY, piezimes VARCHAR2(255), CONSTRAINT pk_udenstilpnes PRIMARY KEY (udenstilpnes_id) );

CREATE SEQUENCE gdb_udenstilpnes_id_seq INCREMENT BY 1 START WITH 1 MINVALUE 1 MAXVALUE 999999999999999999999999999 NOCYCLE NOORDER CACHE 20/

Tilti

CREATE TABLE gdb_tilti ( tilta_id NUMBER, geometrija MDSYS.SDO_GEOMETRY, apraksts VARCHAR2(255), CONSTRAINT pk_tilti PRIMARY KEY (tilta_id) );

CREATE SEQUENCE gdb_tilta_id_seq INCREMENT BY 1 START WITH 1 MINVALUE 1 MAXVALUE 999999999999999999999999999 NOCYCLE NOORDER CACHE 20/

Pludmales

CREATE TABLE gdb_pludmales ( pludmales_id NUMBER, geometrija MDSYS.SDO_GEOMETRY, apraksts VARCHAR2(255),

CONSTRAINT pk_pludmales PRIMARY KEY (pludmales_id) );

CREATE SEQUENCE gdb_pludmales_id_seq INCREMENT BY 1 START WITH 1 MINVALUE 1 MAXVALUE 999999999999999999999999999 NOCYCLE NOORDER CACHE 20/

Sētas

CREATE TABLE gdb_setas ( setas_id NUMBER, geometrija MDSYS.SDO_GEOMETRY, CONSTRAINT pk_setas PRIMARY KEY (setas_id) );

CREATE SEQUENCE gdb_setas_id_seq INCREMENT BY 1 START WITH 1 MINVALUE 1 MAXVALUE 999999999999999999999999999 NOCYCLE NOORDER CACHE 20/

Citi objekti

CREATE TABLE gdb_citi_objekti ( cita_objekta_id NUMBER, geometrija MDSYS.SDO_GEOMETRY, nosaukums VARCHAR2(255), CONSTRAINT pk_citi_objekti PRIMARY KEY (cita_objekta_id) );

CREATE SEQUENCE gdb_cita_objekta_id_seq INCREMENT BY 1 START WITH 1 MINVALUE 1 MAXVALUE 999999999999999999999999999 NOCYCLE NOORDER CACHE 20/

3. Slāņu meta datu ievade

Katram slānim (katrai tabulai) tika izveidots ieraksts meta datu tabulā (USER_SDO_GEOM_METADATA),

kurā norāda:

Slāņa tabulas nosaukumu

Kolonnu kurā glabāsies ģeometrijas tipa dati (SDO_GEOMETRY)

X un Y maksimālās koordinātes

Precizitāti, ar kādu tiks ievadītas koordinātes

Attēls tika veidots mērogā 1:1, tāpēc, lai precīzi attēlotu visus lokus un izliekumus (skatīt 2. attēlu), tika

izvēlēta precizitāte „0.01” (dažiem pat līdz 0.001).

DELETE FROM user_sdo_geom_metadata WHERE TABLE_NAME LIKE 'GDB%';

INSERT INTO user_sdo_geom_metadata(table_name,column_name,diminfo,srid) VALUES ('GDB_KOKI' ,'GEOMETRIJA' -- Kolonna, kurā glabājas ģeometrijas tipa dati SDO_GEOMETRY ,mdsys.sdo_dim_array ( mdsys.sdo_dim_element('X',0,160,0.01), -- X: Min, Max, Precizitāte mdsys.sdo_dim_element('Y',0,160,0.01) -- Y: Min, Max, Precizitāte ) ,NULL );

INSERT INTO user_sdo_geom_metadata(table_name,column_name,diminfo,srid) VALUES ('GDB_EKAS' ,'GEOMETRIJA' ,mdsys.sdo_dim_array ( mdsys.sdo_dim_element('X',0,160,0.01), mdsys.sdo_dim_element('Y',0,160,0.01) ) ,NULL );

INSERT INTO user_sdo_geom_metadata(table_name,column_name,diminfo,srid) VALUES ('GDB_CELI' ,'GEOMETRIJA' ,mdsys.sdo_dim_array ( mdsys.sdo_dim_element('X',0,160,0.01), mdsys.sdo_dim_element('Y',0,160,0.01) ) ,NULL );

INSERT INTO user_sdo_geom_metadata(table_name,column_name,diminfo,srid) VALUES ('GDB_UDENSTILPNES' ,'GEOMETRIJA' ,mdsys.sdo_dim_array ( mdsys.sdo_dim_element('X',0,160,0.01),

mdsys.sdo_dim_element('Y',0,160,0.01) ) ,NULL );

INSERT INTO user_sdo_geom_metadata(table_name,column_name,diminfo,srid) VALUES ('GDB_TILTI' ,'GEOMETRIJA' ,mdsys.sdo_dim_array ( mdsys.sdo_dim_element('X',0,160,0.001), mdsys.sdo_dim_element('Y',0,160,0.001) ) ,NULL );

INSERT INTO user_sdo_geom_metadata(table_name,column_name,diminfo,srid) VALUES ('GDB_PLUDMALES' ,'GEOMETRIJA' ,mdsys.sdo_dim_array ( mdsys.sdo_dim_element('X',0,160,0.01), mdsys.sdo_dim_element('Y',0,160,0.01) ) ,NULL );

INSERT INTO user_sdo_geom_metadata(table_name,column_name,diminfo,srid) VALUES ('GDB_SETAS' ,'GEOMETRIJA' ,mdsys.sdo_dim_array ( mdsys.sdo_dim_element('X',0,160,0.01), mdsys.sdo_dim_element('Y',0,160,0.01) ) ,NULL );

INSERT INTO user_sdo_geom_metadata(table_name,column_name,diminfo,srid) VALUES ('GDB_CITI_OBJEKTI' ,'GEOMETRIJA' ,mdsys.sdo_dim_array ( mdsys.sdo_dim_element('X',0,160,0.01), mdsys.sdo_dim_element('Y',0,160,0.01) ) ,NULL );

SELECT * FROM user_sdo_geom_metadata WHERE TABLE_NAME LIKE 'GDB%';

4. Grafisko datu ievade

Dažu ģeometriju piemēri ar paskaidrojumiem

-- PunktsINSERT INTO gdb_citi_objekti(cita_objekta_id,geometrija)VALUES( gdb_cita_objekta_id_seq.NEXTVAL, MDSYS.SDO_GEOMETRY(2001, -- 01:Punkts NULL, NULL, MDSYS.SDO_ELEM_INFO_ARRAY(1,1,1), -- X,1,X:Point MDSYS.SDO_ORDINATE_ARRAY(10,15) ));

-- PunktiINSERT INTO gdb_citi_objekti(cita_objekta_id,geometrija)VALUES( gdb_cita_objekta_id_seq.NEXTVAL, MDSYS.SDO_GEOMETRY(2005, -- 05:Punkti NULL, NULL, MDSYS.SDO_ELEM_INFO_ARRAY(1,1,3), -- 1,1:Punkts, 3:Punktu skaits MDSYS.SDO_ORDINATE_ARRAY(10,15, 20,25, 5,5) -- Katra punkta X un Y koordinātes ));

-- Line (Līnija)INSERT INTO gdb_citi_objekti(cita_objekta_id,geometrija)VALUES( gdb_cita_objekta_id_seq.NEXTVAL, MDSYS.SDO_GEOMETRY( 2002, -- "02" - Līnija NULL, -- SDO_SRID NULL, -- SDO_POINT MDSYS.SDO_ELEM_INFO_ARRAY(1,2,1), MDSYS.SDO_ORDINATE_ARRAY(0,0, 100,100) -- x1,y1,x2,y2,x...,y... ));

-- Arc (Loks)INSERT INTO gdb_citi_objekti(cita_objekta_id,geometrija)VALUES( gdb_cita_objekta_id_seq.NEXTVAL, mdsys.SDO_GEOMETRY( 2002, -- "02" - Līnija NULL, -- SDO_SRID NULL, -- SDO_POINT mdsys.SDO_ELEM_INFO_ARRAY(1,2,2), -- 1,X,Y: X - līnija, Y - Loks? mdsys.SDO_ORDINATE_ARRAY(40,15, 45,25, 50,15) -- Jānorāda 3 pukti + katri 2 nākošie (ja vajag) ));

-- Circle (Rinķis)INSERT INTO gdb_citi_objekti(cita_objekta_id,geometrija)VALUES( gdb_cita_objekta_id_seq.NEXTVAL, mdsys.SDO_GEOMETRY( 2003, -- two-dimensional polygon NULL, NULL,

mdsys.SDO_ELEM_INFO_ARRAY(1,1003,4), -- 4 norāda, ka tas būs riņķis mdsys.SDO_ORDINATE_ARRAY(8,7, 10,9, 8,11) -- Norāda 3 punktus, kas atrodas uz r.l. ));

-- Rectangle (Taisnstūris)INSERT INTO gdb_citi_objekti(cita_objekta_id,geometrija)VALUES( gdb_cita_objekta_id_seq.NEXTVAL, mdsys.SDO_GEOMETRY( 2003, -- "03" - Poligons NULL, -- SDO_SRID NULL, -- SDO_POINT mdsys.SDO_ELEM_INFO_ARRAY(1,1003,3), -- 1003:viens poligons, 3:Taisnstūris mdsys.SDO_ORDINATE_ARRAY(10,10, 20,20) -- Norāda kreiso apakšējo un labo augšējo stūri ));

-- Poligons ar taisnām līnijām (Neregulārs daudzstūris utt.)-- 1) Sākuma punktam jāsakrīt ar beigu punktu-- 2) Apiešana pretīpulksteņa rādītāja virzienamINSERT INTO gdb_citi_objekti(cita_objekta_id,geometrija)VALUES( gdb_cita_objekta_id_seq.NEXTVAL, SDO_GEOMETRY( 2003, -- two-dimensional polygon NULL, NULL, SDO_ELEM_INFO_ARRAY(1,1003,1), -- 1,1003:Poligons, 1: Taisnas līnijas SDO_ORDINATE_ARRAY(15,11, 18,11, 18,16, 15,17, 15,11) ));

-- Poligons ar liektām līnijām-- (Sākuma punktam jāsakrīt ar beigu punktu)INSERT INTO gdb_citi_objekti(cita_objekta_id,geometrija)VALUES( gdb_cita_objekta_id_seq.NEXTVAL, SDO_GEOMETRY( 2003, -- two-dimensional polygon NULL, NULL, SDO_ELEM_INFO_ARRAY(1,1003,2), -- 1,1003:Poligons, 2: Liektas līnijas SDO_ORDINATE_ARRAY(15,115, 20,118, 15,120 -- 1. loka 3 punkti ,11,120, 10,117 -- 2. loka vidējais un beigu punkts ,10,113,15,115 -- 3. loka vidējais un beigu punkts(sakrīt ar sākuma punktu )));

-- Poligons ar caurumu (Katram poligonam sākuma punktiem jāsakrīt ar beigu punktiem)INSERT INTO gdb_citi_objekti(cita_objekta_id,geometrija)VALUES( gdb_cita_objekta_id_seq.NEXTVAL, SDO_GEOMETRY( 2003, -- divu dimensiju poligons NULL, NULL, SDO_ELEM_INFO_ARRAY(1,1003,1, 19,2003,1), -- poligons ar caurumu SDO_ORDINATE_ARRAY(2,4, 4,3, 10,3, 13,5, 13,9, 11,13, 5,13, 2,11, 2,4, -- pretēji pulksteņa rādītāja virzienam 7,5, 7,10, 10,10, 10,5, 7,5) -- pulksteņa rādītāja virzienā ));

-- Salikta (Compound) līnijaINSERT INTO gdb_citi_objekti(cita_objekta_id,geometrija)VALUES( gdb_cita_objekta_id_seq.NEXTVAL, sdo_geometry ( 2002, -- 20: 2 dimensiju, 02: Līniju segmenti NULL, NULL, sdo_elem_info_array (1,4,5 -- 1,4: Salikta līnija, 5: Sastāvēs 5 elementiem ,1,2,1 -- 1:koordinātes sākas ar 1. pozīciju, 2,1: Taisna līnija ,3,2,2 -- 3:koordinātes sākas ar 3. pozīciju, 2,2: Loks ,7,2,1 -- 7:koordinātes sākas ar 7. pozīciju, 2,1: Taisna līnija ,9,2,1 -- 9:koordinātes sākas ar 9. pozīciju, 2,1: Taisna līnija ,11,2,2 -- 11:koordinātes sākas ar 11. pozīciju, 2,2: Loks ), sdo_ordinate_array (15,45 -- 1.līnijas sākumpunkts ,20,45, 23,48, 20,51 -- 1. loka 3 punkti ,10,51 -- 2. līnijas beigu punkts/3. līnijas sākuma punkts ,5,40 -- 3. līnijas beigu punkts/ 2. loka sākuma punkts ,10,35 -- 2. loka vidējais punkts ,15,40 -- 2. loka beigu punkts ) )); -- Tas pats:Tikai, ja viena tipa (taisna,liekta)līnija seko otrai, tad to var uzskatīt kā1 elementuINSERT INTO gdb_citi_objekti(cita_objekta_id,geometrija)VALUES( gdb_cita_objekta_id_seq.NEXTVAL, sdo_geometry ( 2002, -- 20: 2 dimensiju, 02: Līniju segmenti NULL, NULL, sdo_elem_info_array (1,4,4/*5*/ -- 1,4: Salikta līnija, 5: Sastāvēs 5 elementiem #:2 līnijas seko viena aiz otras ,1,2,1 -- 1:koordinātes sākas ar 1. pozīciju, 2,1: Taisna līnija ,3,2,2 -- 3:koordinātes sākas ar 3. pozīciju, 2,2: Loks ,7,2,1 -- 7:koordinātes sākas ar 7. pozīciju, 2,1: Taisna līnija --,9,2,1 -- 9:koordinātes sākas ar 9. pozīciju, 2,1: Taisna līnija #:2 līnijas seko viena aiz otras ,11,2,2 -- 11:koordinātes sākas ar 11. pozīciju, 2,2: Loks ), sdo_ordinate_array (15,45 -- 1.līnijas sākumpunkts ,20,45, 23,48, 20,51 -- 1. loka 3 punkti ,10,51 -- 2. līnijas beigu punkts/3. līnijas sākuma punkts ,5,40 -- 3. līnijas beigu punkts/ 2. loka sākuma punkts ,10,35 -- 2. loka vidējais punkts ,15,40 -- 2. loka beigu punkts ) ));

-- Salikts poligons no līnijām (Sākuma punktam jāsakrīt ar beigu punktu)INSERT INTO gdb_citi_objekti(cita_objekta_id,geometrija)VALUES( gdb_cita_objekta_id_seq.NEXTVAL, SDO_GEOMETRY( 2003, -- 20: 2 dimensiju, 03:Poligons NULL, NULL, SDO_ELEM_INFO_ARRAY(1,1005,2, 1,2,1, 5,2,2), SDO_ORDINATE_ARRAY(6,10, 10,1 -- 1.līnija ,14,10 -- 2. līnijas sākuma punkts ,10,14, 6,10 -- loka vidējais un beigu punkts ) ));

-- Vairākas līnijas (Var izmantot kāraustītu līniju vai krustiņus (2 līnijas))-- Līdzīgi var izdarīt arīar lokiemINSERT INTO gdb_citi_objekti(cita_objekta_id,geometrija)VALUES( gdb_cita_objekta_id_seq.NEXTVAL, sdo_geometry ( 2006, -- "06":Vairākas līnijas vai loki NULL, NULL, sdo_elem_info_array (1,2,1, -- 5,2,1, -- 2. līnijas koordinātes sākas 5. pozīcijā 9,2,1, -- 3. līnijas koordinātes sākas 9. pozīcijā 13,2,1 -- 4. līnijas koordinātes sākas 13. pozīcijā ), sdo_ordinate_array (50,15, 55,15, -- 1. līnija 60,15, 65,15, -- 2. līnija 67,17, 70,20, -- 3. līnija (slīpa) 73,23, 76,26 -- 4. līnija (slīpa) ) ));

-- Vairāki poligoniINSERT INTO gdb_citi_objekti(cita_objekta_id,geometrija)VALUES( gdb_cita_objekta_id_seq.NEXTVAL, sdo_geometry( 2007, -- "07":Vairāki poligoni NULL, NULL, sdo_elem_info_array (1,1003,1,-- "1003,1":Poligons 11,1003,3 -- 2. poligons sākas 11. pozīcijā",3":Taisnsūtris:norāda ar 2. punktiem ), sdo_ordinate_array (50,105, 55,105, 60,110, 50,110, 50,105, 62,108, 65,112)) );

Kodēšana un datu ievades interfeiss

Kā redzams ģeometriju „kodēšana” prasa diezgan lielu koncentrēšanos un precizitāti, tāpēc, lai

atvieglotu šo darbu, tika izstrādāta pakotne GDB_UTILS ar procedurālu PL/SQL interfeisu, lai dabīgā valodā

(angļu gan) varētu norādīt nepieciešamās ģeometrijas – tā, lai galvenā lieta, uz ko koncentrēties, ir

ievadāmās punktu X un Y koordinātes:

CREATE OR REPLACE PACKAGE BODY gdb_utilsIS----------------------------------------------------------------------------------------- Cik konkrētu simbolu ir tekstā?---------------------------------------------------------------------------------------FUNCTION get_count_of_specific_symbol (p_string IN VARCHAR2 ,p_symbol IN VARCHAR2)RETURN NUMBERISBEGIN RETURN LENGTH (p_string) - LENGTH (REPLACE (p_string, p_symbol, ''));END get_count_of_specific_symbol;----------------------------------------------------------------------------------------- No padotā teksta izgūst norādītās koordinātes vērtību---------------------------------------------------------------------------------------FUNCTION get_specific_coord_value (p_coord_number IN NUMBER ,p_coords_string IN VARCHAR2) RETURN VARCHAR2IS l_coords_string VARCHAR2(255):= p_coords_string; l_comma_position NUMBER := 0; l_comma_counter NUMBER := 1; l_coords_value VARCHAR2(30); l_emergency_counter NUMBER := 1;BEGIN LOOP IF l_comma_counter = p_coord_number THEN -- atrasta vajadzīgā koordināte IF INSTR(l_coords_string,',') > 0 THEN l_coords_value := SUBSTR(l_coords_string,0,instr(l_coords_string,',')-1); ELSE -- INSTR(l_coords_string,',') = 0 -- Vairs nav komatu, tātad tā ir pēdējā koordināte un tā arī tiek prasīta, -- tāpēc arī atgriež atlikušo vērtību NULL; l_coords_value := l_coords_string; END IF;

EXIT; END IF;

l_comma_position := INSTR(l_coords_string,','); l_comma_counter := l_comma_counter + 1; l_coords_string := TRIM(substr(l_coords_string,l_comma_position+1)); l_emergency_counter := l_emergency_counter +1;

IF l_emergency_counter = 100 THEN dbms_output.put_line('Kļūda apstrādē funkcijā "get_specific_coord_value"!'); RETURN 'X'; END IF;

END LOOP;

IF l_coords_value IS NULL THEN dbms_output.put_line('Kļūda apstrādē funkcijā "get_specific_coord_value"!');

RETURN 'X'; ELSE RETURN TRIM(l_coords_value); END IF;END;----------------------------------------------------------------------------------------- Universal interface--------------------------------------------------------------------------------------- PROCEDURE insert_geometry ( -- Mandatory for everyone p_geometry_type IN VARCHAR2, p_target_table IN VARCHAR2, p_key_column IN VARCHAR2, -- Must be a defined sequence -- Universal (Papildus kolonna, kurāvar nodot vērtību) p_custom_column IN VARCHAR2 DEFAULT NULL, p_custom_col_value IN VARCHAR2 DEFAULT NULL, -- DOT (Punkts) p_dot_x IN NUMBER DEFAULT NULL, p_dot_y IN NUMBER DEFAULT NULL, -- DOTS (Vairāki punkti) p_dot_coords IN VARCHAR2 DEFAULT NULL, -- LINE (Taisne) p_line_coords IN VARCHAR2 DEFAULT NULL, -- x1,y1,y1,y2 + x3,y3 + ... -- ARC (Loks) p_arc_coords IN VARCHAR2 DEFAULT NULL, -- x1,y1,x2,y2,x3,y3 + x4,y4,x5,y5 + ... -- LINE_ARC_MIX (Taisne, Loks, Loks, Taisne utt.) p_line_arc_mix_sequence IN VARCHAR2 DEFAULT NULL, -- L,A,A,L,L,L,A,... p_line_arc_mix_coords IN VARCHAR2 DEFAULT NULL, -- x1,y1,x2,y2,x3,y3,x4,y4,...,... -- CIRCLE (Aplis) p_circle_center_X IN NUMBER DEFAULT NULL, p_circle_center_Y IN NUMBER DEFAULT NULL, p_circle_diameter IN NUMBER DEFAULT NULL, -- RECTANGLE (Taisnstūris) p_rectangle_ll_X IN NUMBER DEFAULT NULL, -- Lower-Left X p_rectangle_ll_Y IN NUMBER DEFAULT NULL, -- Lower-Left Y p_rectangle_ur_X IN NUMBER DEFAULT NULL, -- Upper-Right X p_rectangle_ur_Y IN NUMBER DEFAULT NULL, -- Upper-Right Y -- POLYGON (Daudzstūris) p_polygon_coords IN VARCHAR2 DEFAULT NULL, -- X,Y coords - counter clockwise p_inner_poly_coords IN VARCHAR2 DEFAULT NULL -- Hole: Clockwise ) IS l_statement VARCHAR2(4000) := 'INSERT INTO '|| p_target_table || '(' || p_key_column || ',geometrija'; known_error EXCEPTION; BEGIN

IF p_custom_column IS NOT NULL THEN l_statement := l_statement || ','||p_custom_column; END IF;

l_statement := l_statement || ') VALUES (' || 'gdb_'||p_key_column ||'_seq.NEXTVAL';

IF p_geometry_type = 'DOT' THEN l_statement := l_statement ||',' || 'MDSYS.SDO_GEOMETRY(2001,NULL,NULL,' -- 01:Point || 'MDSYS.SDO_ELEM_INFO_ARRAY(1,1,1),' -- X,1,X:Point || 'MDSYS.SDO_ORDINATE_ARRAY(' ||p_dot_x||','||p_dot_y||'))'; ELSIF p_geometry_type = 'DOTS' THEN l_statement := l_statement ||',' || 'MDSYS.SDO_GEOMETRY(2005,NULL,NULL,' -- 05:Punkti || 'MDSYS.SDO_ELEM_INFO_ARRAY(1,1,' -- 1,1:Punkts

|| TO_CHAR(ROUND(get_count_of_specific_symbol(p_dot_coords,',')/2)) -- Punktu skaits: ROUND (Komatu skaits / 2) || '),' || 'MDSYS.SDO_ORDINATE_ARRAY(' || p_dot_coords -- Katra punkta X un Y koordinātes ||'))';

ELSIF p_geometry_type = 'ARC' THEN l_statement := l_statement ||',' || 'MDSYS.SDO_GEOMETRY(2002,NULL,NULL,' -- 2:Arc || 'MDSYS.SDO_ELEM_INFO_ARRAY(1,2,2),' -- 2:Line, 2:Arc || 'MDSYS.SDO_ORDINATE_ARRAY(' || p_arc_coords --||p_arc_x1||','||p_arc_y1||','||p_arc_x2||','||p_arc_y2||','||p_arc_x3||','||p_arc_y3 ||'))'; ELSIF p_geometry_type = 'LINE' THEN l_statement := l_statement ||',' || 'MDSYS.SDO_GEOMETRY(2002,NULL,NULL,' -- 2:Line || 'MDSYS.SDO_ELEM_INFO_ARRAY(1,2,1),' -- 2:Line || 'MDSYS.SDO_ORDINATE_ARRAY(' || p_line_coords --||p_line_x1||','||p_line_y1||','||p_line_x2||','||p_line_y2 ||'))'; ELSIF p_geometry_type = 'LINE_ARC_MIX' THEN l_statement := l_statement ||',' || 'MDSYS.SDO_GEOMETRY(2002,NULL,NULL,' -- 20: 2 dimensiju, 02: Līniju segmenti || 'MDSYS.SDO_ELEM_INFO_ARRAY(1,4,' -- 1,4: Salikta līnija || TO_CHAR(get_count_of_specific_symbol(p_line_arc_mix_sequence,',') + 1); -- Saskaita, cik komatu ir padotajātekstā

-- Saliek Line un Arc kodus un koordinātu sākumpunktus DECLARE l_current_pos NUMBER:= 1; l_current_coord_pos NUMBER:=1; l_current_segment_value VARCHAR2(1); -- 'L'/'A' -> Line/Arc BEGIN FOR i IN 1..get_count_of_specific_symbol(p_line_arc_mix_sequence,',')+1 LOOP l_current_segment_value := get_specific_coord_value(l_current_pos,p_line_arc_mix_sequence); l_statement := l_statement || ',' || l_current_coord_pos; IF l_current_segment_value = 'L' THEN l_statement := l_statement || ',2,1'; -- Linija l_current_coord_pos := l_current_coord_pos + 2; -- Līnijai norāda 2 punktus ELSIF l_current_segment_value = 'A' THEN l_statement := l_statement || ',2,2'; -- Loks l_current_coord_pos := l_current_coord_pos + 4; -- Lokam norāda 3 punktus ELSE dbms_output.put_line('Kļūda! Vērtībām jābūt "L" vai "A"!'); RAISE known_error; END IF; l_current_pos := l_current_pos + 1; END LOOP; END;

l_statement := l_statement ||'),' || 'MDSYS.SDO_ORDINATE_ARRAY(' || p_line_arc_mix_coords ||'))';

ELSIF p_geometry_type = 'CIRCLE' THEN l_statement := l_statement ||',' || 'MDSYS.SDO_GEOMETRY(2003,NULL,NULL,'

|| 'MDSYS.SDO_ELEM_INFO_ARRAY(1,1003,4),' -- 4:Circle || 'MDSYS.SDO_ORDINATE_ARRAY(' ||p_circle_center_X||','||p_circle_center_Y||'-'||p_circle_diameter ||'/2,'||p_circle_center_X||'+'||p_circle_diameter||'/2,' ||p_circle_center_Y||','||p_circle_center_X||',' ||p_circle_center_Y||'+'||p_circle_diameter||'/2))';

ELSIF p_geometry_type = 'RECTANGLE' THEN l_statement := l_statement ||',' || 'MDSYS.SDO_GEOMETRY(2003,NULL,NULL,' || 'MDSYS.SDO_ELEM_INFO_ARRAY(1,1003,3),' -- 3:Rectangle || 'MDSYS.SDO_ORDINATE_ARRAY(' ||p_rectangle_ll_X||','||p_rectangle_ll_Y||','||p_rectangle_ur_X||','||p_rectangle_ur_Y||'))'; ELSIF p_geometry_type = 'POLYGON' THEN -- Poligons (Daudzstūris) ar taisnām līnijām (Neregulārs daudzstūris utt.) -- 1) Sākuma punktam jasakrīt ar beigu punktu -- 2) Apiešana pretīpulksteņa rādītāja virzienam l_statement := l_statement ||',' || 'MDSYS.SDO_GEOMETRY(2003,NULL,NULL,' || 'MDSYS.SDO_ELEM_INFO_ARRAY(1,1003,1'; -- 1,1003:Poligons, 1: Taisnas līnijas -- Aizpildītas "cauruma" koordinātes IF p_inner_poly_coords IS NOT NULL THEN l_statement:= l_statement ||',' || TO_CHAR(get_count_of_specific_symbol(p_polygon_coords,',') + 1 + 3) -- Nosaka "cauruma" pirmās koordinātes vietu (komatu skaits + 1 un + 3 ārejāpoligona noslēdzošās koordinātes) ||',2003,1'; END IF;

l_statement := l_statement|| '),' || 'MDSYS.SDO_ORDINATE_ARRAY(' || p_polygon_coords -- Piekabina vēlreiz 1. koordināti ||','||get_specific_coord_value(1,p_polygon_coords) ||','||get_specific_coord_value(2,p_polygon_coords);

-- Aizpildītas "cauruma" koordinātes IF p_inner_poly_coords IS NOT NULL THEN l_statement := l_statement || ','||p_inner_poly_coords -- Piekabina vēlreiz 1. koordināti ||','||get_specific_coord_value(1,p_inner_poly_coords) ||','||get_specific_coord_value(2,p_inner_poly_coords);

END IF;

l_statement := l_statement ||'))'; ELSE dbms_output.put_line('Sorry, unsupported geometry...'); RAISE known_error; END IF;

IF p_custom_column IS NOT NULL THEN l_statement := l_statement || ','''||p_custom_col_value||''''; END IF;

l_statement := l_statement || ')'; dbms_output.put_line(l_statement); EXECUTE IMMEDIATE l_statement; EXCEPTION WHEN known_error THEN NULL; END insert_geometry;---------------------------------------------------------------------------------------END;

Procedūra atkarībā no pieprasītās ģeometrijas tipa dinamiski „salipina” komandas INSERT tekstu un

beigās ar EXECUTE_IMMEDIATE to izpilda. Tā, protams, ir papildināma ar citām sarežģītākām ģeometrijām,

taču ar esošo šim darbam bija pietiekoši. Šīs procedūras izsaukumu var lietot tādu kāds tas ir, bet, lai vēl

vairāk saīsinātu pierakstu un koda atkārtošanos, tad katram slānim var definēt savu „starpprocedūru” un to

tad arī likt lietā koordināšu ievadē.

Papildus ērtībai – riņķa līnijai nav jānorāda 3 punkti uz līnijas, bet X un Y koordinātes centram un

diametrs, poligonam nav jānorāda pēdējais punkts tāds pats kā pirmajam (tas notiek automātiski

procedūras iekšienē).

Koki

(3. att. Koku veidi)

----------------------------------------------------------------------------------------- Koks--------------------------------------------------------------------------------------- PROCEDURE insert_koks (X IN NUMBER ,Y IN NUMBER ,diametrs IN NUMBER ,p_info IN VARCHAR2 DEFAULT NULL ) IS BEGIN

gdb_utils.insert_geometry(p_geometry_type => 'CIRCLE' ,p_target_table => 'gdb_koki' ,p_key_column => 'koka_id' ,p_custom_column => 'APRAKSTS' ,p_custom_col_value => p_info ,p_circle_center_X => X ,p_circle_center_Y => Y ,p_circle_diameter => diametrs ); END insert_koks;----------------------------------------------------------------------------------------- Koks:Krūmi---------------------------------------------------------------------------------------PROCEDURE insert_koks_krumi (p_koordinates IN VARCHAR2 ,p_info IN VARCHAR2 DEFAULT NULL ) IS BEGIN

gdb_utils.insert_geometry(p_geometry_type => 'DOTS' ,p_target_table => 'gdb_koki' ,p_key_column => 'koka_id' ,p_custom_column => 'APRAKSTS' ,p_custom_col_value => p_info ,p_dot_coords => p_koordinates ); END insert_koks_krumi;---------------------------------------------------------------------------------------

/* Koki */

BEGIN DELETE FROM gdb_koki; gdb_utils.insert_koks(8,75,4,'#1:Vertikāli'); gdb_utils.insert_koks(8,68,4,'#2:Vertikāli');

gdb_utils.insert_koks(8,62,4,'#3:Vertikāli'); gdb_utils.insert_koks(8,55,4,'#4:Vertikāli'); gdb_utils.insert_koks(8,33,4,'#5:Vertikāli'); gdb_utils.insert_koks(8,27,4,'#6:Vertikāli');

gdb_utils.insert_koks(8,20,4,'#1:Horizontāli'); gdb_utils.insert_koks(15,20,4,'#2:Horizontāli'); gdb_utils.insert_koks(21,20,4,'#3:Horizontāli'); gdb_utils.insert_koks(28,20,4,'#4:Horizontāli'); gdb_utils.insert_koks(34,20,4,'#5:Horizontāli'); gdb_utils.insert_koks(41,20,4,'#6:Horizontāli'); gdb_utils.insert_koks(48,20,4,'#7:Horizontāli'); gdb_utils.insert_koks(54,20,4,'#8:Horizontāli'); gdb_utils.insert_koks(76,20,4,'#9:Horizontāli'); gdb_utils.insert_koks(82,20,4,'#10:Horizontāli'); gdb_utils.insert_koks(89,20,4,'#11:Horizontāli'); gdb_utils.insert_koks(95,20,4,'#12:Horizontāli'); gdb_utils.insert_koks(102,20,4,'#13:Horizontāli'); gdb_utils.insert_koks(109,20,4,'#14:Horizontāli'); gdb_utils.insert_koks(115,20,4,'#15:Horizontāli'); gdb_utils.insert_koks(122,20,4,'#16:Horizontāli'); gdb_utils.insert_koks(129,20,4,'#17:Horizontāli'); gdb_utils.insert_koks(136,20,4,'#18:Horizontāli'); gdb_utils.insert_koks(142,20,4,'#19:Horizontāli'); gdb_utils.insert_koks(149,20,4,'#20:Horizontāli');

gdb_utils.insert_koks(55,143,4,'#1:Ap apli'); gdb_utils.insert_koks(63,145,4,'#2:Ap apli'); gdb_utils.insert_koks(70,145,4,'#3:Ap apli'); gdb_utils.insert_koks(77,142,4,'#4:Ap apli'); gdb_utils.insert_koks(83,134,4,'#5:Ap apli'); gdb_utils.insert_koks(86,129,4,'#6:Ap apli'); gdb_utils.insert_koks(86,119,4,'#7:Ap apli'); gdb_utils.insert_koks(79,108,4,'#8:Ap apli'); gdb_utils.insert_koks(70,103,4,'#9:Ap apli'); gdb_utils.insert_koks(60,103,4,'#10:Ap apli'); gdb_utils.insert_koks(54,105,4,'#11:Ap apli'); gdb_utils.insert_koks(49,109,4,'#12:Ap apli'); gdb_utils.insert_koks(44,118,4,'#13:Ap apli'); gdb_utils.insert_koks(43,130,4,'#14:Ap apli'); gdb_utils.insert_koks(46,136,4,'#15:Ap apli');

gdb_utils.insert_koks(63,132,7,'Aplis - vidus:Lielais'); gdb_utils.insert_koks(67,131,4,'Aplis - vidus:#1'); gdb_utils.insert_koks(64,135,3,'Aplis - vidus:#2'); gdb_utils.insert_koks(67,135,2,'Aplis - vidus:#3'); gdb_utils.insert_koks(70,133,2,'Aplis - vidus:#4');

gdb_utils.insert_koks_krumi('145,82, 139,84, 143,83, 149,82, 151,65, 152,68, 149,69, 151,73' ||',147,74, 148,75, 144,84, 147,83, 151,83, 141,81, 144,79, 150,79, 145,76, 146,79, 146,77' ||',148,76, 151,80, 152,76, 148,72, 151,70, 152,62' ,'Krumi aiz ezera');

COMMIT;END;

Ēkas

(4. att. Ēku veidi)

----------------------------------------------------------------------------------------- Ēka: Taisnsturis--------------------------------------------------------------------------------------- PROCEDURE insert_eka_taisnsturis (x1 IN NUMBER ,y1 IN NUMBER ,x2 IN NUMBER ,y2 IN NUMBER ,p_info IN VARCHAR2 DEFAULT NULL ) IS BEGIN gdb_utils.insert_geometry(p_geometry_type => 'RECTANGLE' ,p_target_table => 'gdb_ekas' ,p_key_column => 'ekas_id' ,p_custom_column => 'APRAKSTS' ,p_custom_col_value => p_info ,p_rectangle_ll_X => x1 ,p_rectangle_ll_Y => y1 ,p_rectangle_ur_X => x2 ,p_rectangle_ur_Y => y2 ); END insert_eka_taisnsturis;----------------------------------------------------------------------------------------- Ēka: Poligons--------------------------------------------------------------------------------------- PROCEDURE insert_eka_poligons (p_poligons IN VARCHAR2 ,p_info IN VARCHAR2 DEFAULT NULL ,p_caurums IN VARCHAR2 DEFAULT NULL ) IS BEGIN gdb_utils.insert_geometry(p_geometry_type => 'POLYGON' ,p_target_table => 'gdb_ekas'

,p_key_column => 'ekas_id' ,p_custom_column => 'APRAKSTS' ,p_custom_col_value => p_info ,p_polygon_coords => p_poligons ,p_inner_poly_coords => p_caurums ); END insert_eka_poligons;

---------------------------------------------------------------------------------------

/* Ēkas */BEGIN DELETE FROM gdb_ekas; gdb_utils.insert_eka_taisnsturis(5,40,14,52,'Māja #1'); gdb_utils.insert_eka_taisnsturis(19,54,31,64,'Māja #2'); gdb_utils.insert_eka_taisnsturis(39,54,51,64,'Māja #3'); gdb_utils.insert_eka_taisnsturis(19,29,31,38,'Māja #4'); gdb_utils.insert_eka_taisnsturis(39,29,51,38,'Māja #5'); gdb_utils.insert_eka_taisnsturis(72,29,83,38,'Māja #6'); gdb_utils.insert_eka_taisnsturis(91,24,102,33,'Māja #7'); gdb_utils.insert_eka_taisnsturis(91,59,102,68,'Māja #8'); gdb_utils.insert_eka_poligons('105,58, 111,49, 118,53, 112,62','Māja #9'); gdb_utils.insert_eka_poligons('105,34, 112,30, 118,40, 111,44','Māja #10');

gdb_utils.insert_eka_poligons( '70,74, 70,69, 77,69, 77,62, 70,62, 70,50, 81,50, 81,74' -- Ārējais poligons ,'Komplekss ar caurumu' ,'72.5,53, 72.5,58, 77,58, 77,53' -- "Caurums" );

COMMIT;END;

(5. att. Ēku vizuālie dati)

Ceļi

(6. att. Ceļu veidi)

----------------------------------------------------------------------------------------- Ceļš: Taisnes + Loki--------------------------------------------------------------------------------------- PROCEDURE insert_cels (p_line_arc_mix_sequence IN VARCHAR2 ,p_line_arc_mix_coords IN VARCHAR2 ,p_info IN VARCHAR2 ) IS BEGIN

gdb_utils.insert_geometry(p_geometry_type => 'LINE_ARC_MIX' ,p_target_table => 'gdb_celi' ,p_key_column => 'cela_id' ,p_custom_column => 'TIPS' ,p_custom_col_value => p_info ,p_line_arc_mix_sequence => p_line_arc_mix_sequence ,p_line_arc_mix_coords => p_line_arc_mix_coords ); END insert_cels;---------------------------------------------------------------------------------------

/* Ceļi */

BEGIN DELETE FROM gdb_celi; gdb_utils.insert_cels('L','0,4,156,4','ŠOSEJA: ārējāmala');

gdb_utils.insert_cels('L,A,L,A,L,A,L' ,'0,13, 61,13, 62.8,14, 63,15, 63,42, 62,44, 61,44.3, 49,44.3, 47,43, 47,42, 47,38' ,'ŠOSEJA: iekšējāmala + iebraucamais ceļš#1');

gdb_utils.insert_cels('L,A,L,A,L' ,'43,38, 43,42, 43,43, 41, 44.3, 28,44.3, 27,44, 26,42, 26,38' ,'Iela #1');

gdb_utils.insert_cels('L,A,L' ,'23,38, 23,42, 22.5,43.5, 21,44.3, 14,44.3' ,'Iela #2');

gdb_utils.insert_cels('L,A,L' ,'14,48, 21,48, 22.5,49, 23,50, 23,54' ,'Iela #3');

gdb_utils.insert_cels('L,A,L,A,L' ,'26,54, 26,50, 26.5,49, 28,48, 41,48, 42.5,49, 43,50, 43,54' ,'Iela #4');

gdb_utils.insert_cels('L,A,L,A,L' ,'47,54, 47,50, 47.5,49, 49,48, 61,48, 62.5,49, 63,50, 63,73' ,'Iela #5');

gdb_utils.insert_cels('L,L,A' ,'67,73, 67,67, 69,67, 70.5,68, 71,69' ,'Iela #6');

/*gdb_utils.insert_cels('A,L,L,A,L,A,A,A,L' ,'71,62, 70.5,63, 69,64, 67,64, 67,50, 67.5,49, 69,48, 86,48, 87.5,49, 88,50, 89,53, 93,56, 94.5,57, 95,58, 95,59' ,'Iela #7 + Apļa loks #1');*/ gdb_utils.insert_cels('A,L,L,A,L,A,L' ,'71,62, 70.5,63, 69,64, 67,64, 67,50, 67.5,49, 69,48, 86,48, 89,53, 95,56, 95,59' ,'Iela #7 + Apļa loks #1');

/*gdb_utils.insert_cels('L,A,A,A' ,'98,59, 98,58, 99,56.6, 100,56, 102.5,55, 104,54, 105.5,55, 106.5,55.5' ,'Apļa loks #2');*/

gdb_utils.insert_cels('L,A,L' ,'98,59, 98,56, 101,55, 104,52.5, 107.3,54.6' ,'Apļa loks #2');

/*gdb_utils.insert_cels('L,A,A,A,L' ,'109,52, 106,50, 105,48.5, 105,47.5, 105.1,46, 105,44, 105.6,43, 107,42, 109,41' ,'Apļa loks #3');*/

gdb_utils.insert_cels('L,A,L' ,'109,52, 106,50, 107,47, 106.5,42.5,109,41' ,'Apļa loks #3'); /*gdb_utils.insert_cels('L,A,A,A,L' ,'107.5,38, 104,39.5, 103,39, 102,38, 101,36.5, 99,36, 98,36, 97,34, 97,33' ,'Apļa loks #4');*/

gdb_utils.insert_cels('L,A,L' ,'107.4,38, 104.5,39.5, 102,37, 98,35, 98,33' ,'Apļa loks #4'); /*gdb_utils.insert_cels('L,A,A,A,L,A,L' ,'94,33, 94,34, 93.5,35, 92,36, 90,37, 87,43, 86.5,44, 85,44.3, 81,44.3, 80,44, 79,43, 79,38' ,'Apļa loks #5');*/

gdb_utils.insert_cels('L,A,L,A,L' ,'94.5,33, 94.5,35, 89.5,37, 86,44.3, 81,44.3, 80,44, 79,43, 79,38' ,'Apļa loks #5');

gdb_utils.insert_cels('L,A,L,A,L,A,L' ,'156,13, 69,13, 67.5,13.5, 67,15, 67,42, 68,44, 69,44.3, 75,44.3, 76.9,43,77,42, 77,38' ,'ŠOSEJA: iekšējāmala + iebraucamais ceļš#2');

gdb_utils.insert_cels('L,A' ,'63,95, 63,105.5, 58,106.5, 51.5,110.5' ,'Celiņšuz apli - kreisāpuse');

gdb_utils.insert_cels('L,A' ,'66,95, 66,105.5, 75,109, 82,120' ,'Celiņšuz apli - labāpuse');

gdb_utils.insert_cels('A,L,L,L,L,L,A' ,'82,128, 81,131, 78.8,135, 88,142, 96,143, 95,145, 88,144, 77.5,136.5, 67.1,142.2, 53.5,139' ,'Apļa ārējāmala - garā+ Ceļšuz laipu');

gdb_utils.insert_cels('A' ,'48.5,134, 45.5,124, 47,116.5' ,'Apļa ārējāmala - īsā');

gdb_utils.insert_cels('A' ,'53,112, 68,108, 80,120'

,'Apļa iekšējāmala - apakšējais loks');

gdb_utils.insert_cels('A' ,'48.5,117.5, 47.5,125, 50,133' ,'Apļa iekšējāmala - kreisais loks');

gdb_utils.insert_cels('A' ,'55,137.5, 70.5,139, 80,128' ,'Apļa iekšējāmala - augšējais loks');

COMMIT;END;

(7. att. Ceļu dati vizuāli)

Ūdenstilpnes

(8. att. Ūdenstilpņu veidi)

----------------------------------------------------------------------------------------- Ūdenstilpne : Taisnes + Loki--------------------------------------------------------------------------------------- PROCEDURE insert_udenstilpne (p_line_arc_mix_sequence IN VARCHAR2 ,p_line_arc_mix_coords IN VARCHAR2 ,p_info IN VARCHAR2 ) IS BEGIN

gdb_utils.insert_geometry(p_geometry_type => 'LINE_ARC_MIX' ,p_target_table => 'gdb_udenstilpnes' ,p_key_column => 'udenstilpnes_id' ,p_custom_column => 'PIEZIMES' ,p_custom_col_value => p_info ,p_line_arc_mix_sequence => p_line_arc_mix_sequence ,p_line_arc_mix_coords => p_line_arc_mix_coords ); END insert_udenstilpne;---------------------------------------------------------------------------------------

/* Ūdenstilpnes */DELETE FROM gdb_udenstilpnes;

BEGIN

gdb_utils.insert_udenstilpne( 'L,A,A,A,L,A,A,A' ||',L,A,L,A,L,A,L,A' ||',A,A,A,L,A,A,A' , '0,111,20,111,33,111,53,114,58,116,62,119,64,121,69,123,79,123,94,121,100,118,108,107,108,96,106,93' ||',102,91,10,91,5,84,10,78,113,78,125,72,130,60,130,33,140,23,151,33,151,59,140,81,118,91' ||',115,93,114,96,113,105,109,114,102,121,89,125,68,126,58,130,54,135,53,137,46,142,25,143,0,142' ,'Upes garais krasts');

gdb_utils.insert_udenstilpne( 'A,A,L,A,L,A,A,L' , '0,139,18,139,38,140,45,140,50,137,52,134,54,130,61,125,59,121,58,120,53,117,35,113,15,114,0,116' ,'Upes īsais krasts');

gdb_utils.insert_udenstilpne( 'A,A,L,A,L' , '102,159,106,156,110,154,120,147,128,134, 129,126,134,115,148,108,156,107' ,'Jūra');

COMMIT;

END;

(9. att. Ūdenstilpņu dati vizuāli)

Tilti

(10. att. Tiltu veidi)

----------------------------------------------------------------------------------------- Tilts--------------------------------------------------------------------------------------- PROCEDURE insert_tilts (p_cetrsturis_koordinates IN VARCHAR2 -- 8 gab. (4 punkti) ,p_info IN VARCHAR2 DEFAULT NULL ) IS BEGIN gdb_utils.insert_geometry(p_geometry_type => 'POLYGON' ,p_target_table => 'gdb_tilti' ,p_key_column => 'tilta_id' ,p_custom_column => 'APRAKSTS' ,p_custom_col_value => p_info

,p_polygon_coords => p_cetrsturis_koordinates ); END insert_tilts;--------------------------------------------------------------------------------------- /* Tilti */

BEGINDELETE FROM gdb_tilti; gdb_utils.insert_tilts('61.5,95,61.5,73,68.5,73,68.5,95','lielais tilts'); gdb_utils.insert_tilts('48,134.4, 51,132.3, 55.5,137, 52.6,139.8','mazais tilts #1'); gdb_utils.insert_tilts('79,128, 79,120, 83,120, 83,128','mazais tilts #2'); gdb_utils.insert_tilts('46.4,116.1, 51,110, 53.5,112.5, 49.4,118','mazais tilts #3');

COMMIT;END;

(11. att. Tiltu dati vizuāli)

Pludmales

(12. att. Pludmaļu veidi)

----------------------------------------------------------------------------------------- Pludmale: Taisnes + Loki--------------------------------------------------------------------------------------- PROCEDURE insert_pludmale (p_line_arc_mix_sequence IN VARCHAR2 ,p_line_arc_mix_coords IN VARCHAR2 ,p_info IN VARCHAR2 ) IS BEGIN

gdb_utils.insert_geometry(p_geometry_type => 'LINE_ARC_MIX' ,p_target_table => 'gdb_pludmales' ,p_key_column => 'pludmales_id' ,p_custom_column => 'APRAKSTS' ,p_custom_col_value => p_info ,p_line_arc_mix_sequence => p_line_arc_mix_sequence ,p_line_arc_mix_coords => p_line_arc_mix_coords ); END insert_pludmale;--------------------------------------------------------------------------------------- /* Pludmales */

BEGIN DELETE FROM gdb_pludmales; gdb_utils.insert_pludmale('A','102,159, 111,132, 136.4,112.7' ,'Pie dzintara jūras'); gdb_utils.insert_pludmale('A','13,78, 35,68, 57,78' ,'Mazā'); gdb_utils.insert_pludmale('A,A,A','84,78, 97,71, 111,70, 119,67, 122,57, 123.5,41, 131,29' ,'Lielā');

COMMIT;END;

(13. att. Pludmaļu dati vizuāli)

Sētas

(14. att. Sētu veidi)

----------------------------------------------------------------------------------------- Sēta--------------------------------------------------------------------------------------- PROCEDURE insert_seta (p_line_coords IN VARCHAR2) IS BEGIN

gdb_utils.insert_geometry(p_geometry_type => 'LINE' ,p_target_table => 'gdb_setas' ,p_key_column => 'setas_id' ,p_line_coords => p_line_coords ); END insert_seta;--------------------------------------------------------------------------------------- /* Citi objekti */BEGIN DELETE FROM gdb_setas; gdb_utils.insert_seta('5,84, 3,84, 3,59, 13,59, 20,50, 13,59, 3,59, 3,16,' ||'16,16, 16,38, 20,42, 16,38, 16,16, 36,16, 36,42, 29,42, 41,42,' ||'36,42, 36,16, 58,16'); gdb_utils.insert_seta('60,17.5, 60,42, 49,42'); gdb_utils.insert_seta('36,68, 36,51, 29,51, 41,51'); gdb_utils.insert_seta('60,78, 60,51, 49,51'); gdb_utils.insert_seta('75,42, 70,42, 70,17.5'); gdb_utils.insert_seta('72,16, 88,16, 88,35, 85,42 ,81,42, 85,42, 88,35, 92,35,' ||'88,35, 88,16, 104,16, 104,33, 103,35, 100,35, 103,35, 105,38,' ||'103,35, 104,33, 104,16, 153,16, 153,86, 134,86'); gdb_utils.insert_seta('107.5,49, 109,47, 107.5,44, 109,47, 122,47'); gdb_utils.insert_seta('100,57, 103,57, 104,54, 103,57, 111,70'); gdb_utils.insert_seta('84,78, 84,57, 89,53'); COMMIT;END;

(15. att. Sētu dati vizuāli)

Citi objekti

(16. att. Citu objektu veidi)

----------------------------------------------------------------------------------------- Cits objekts: Poligons--------------------------------------------------------------------------------------- PROCEDURE insert_cits_objekts_poligons (p_koordinates IN VARCHAR2 ,p_info IN VARCHAR2 DEFAULT NULL) IS BEGIN

gdb_utils.insert_geometry(p_geometry_type => 'POLYGON' ,p_target_table => 'gdb_citi_objekti' ,p_key_column => 'cita_objekta_id' ,p_custom_column => 'NOSAUKUMS' ,p_custom_col_value => p_info ,p_polygon_coords => p_koordinates ); END insert_cits_objekts_poligons;----------------------------------------------------------------------------------------- Cits objekts: Aplis--------------------------------------------------------------------------------------- PROCEDURE insert_cits_objekts_aplis (p_x IN NUMBER,p_y IN NUMBER,p_diametrs IN NUMBER ,p_info IN VARCHAR2 DEFAULT NULL) IS BEGIN

gdb_utils.insert_geometry(p_geometry_type => 'CIRCLE' ,p_target_table => 'gdb_citi_objekti' ,p_key_column => 'cita_objekta_id' ,p_custom_column => 'NOSAUKUMS' ,p_custom_col_value => p_info ,p_circle_center_X => p_x ,p_circle_center_Y => p_y ,p_circle_diameter => p_diametrs ); END insert_cits_objekts_aplis;

----------------------------------------------------------------------------------------- Cits objekts: Taisnstūris--------------------------------------------------------------------------------------- PROCEDURE insert_cits_obj_taisnsturis (x1 IN NUMBER ,y1 IN NUMBER ,x2 IN NUMBER ,y2 IN NUMBER ,p_info IN VARCHAR2 DEFAULT NULL ) IS BEGIN gdb_utils.insert_geometry(p_geometry_type => 'RECTANGLE' ,p_target_table => 'gdb_citi_objekti' ,p_key_column => 'cita_objekta_id' ,p_custom_column => 'NOSAUKUMS' ,p_custom_col_value => p_info ,p_rectangle_ll_X => x1 ,p_rectangle_ll_Y => y1

,p_rectangle_ur_X => x2 ,p_rectangle_ur_Y => y2 ); END insert_cits_obj_taisnsturis;---------------------------------------------------------------------------------------/* Citi objekti */BEGIN DELETE FROM gdb_citi_objekti; gdb_utils.insert_cits_obj_taisnsturis(0,0,156,159,'Robeža');

gdb_utils.insert_cits_objekts_poligons('92.7,150, 100.1,134, 103.7,136, 97.1,152','Laipiņa');

gdb_utils.insert_cits_objekts_poligons('43,126, 43,122, 44.5,122, 44.5,126','Soliņš#1'); gdb_utils.insert_cits_objekts_poligons('73.5,105, 76.5,107, 76,108, 72.5,106','Soliņš#2'); gdb_utils.insert_cits_objekts_poligons('81.5,111, 84,114, 83,115, 80.5,112','Soliņš#3');

gdb_utils.insert_cits_objekts_poligons('62.5,113, 63.5,111.5, 65.5,111.5, 66.5,113, 65.5,114.5, 63.5,114.5' ,'Piemineklis parkā:Sešstūris');

gdb_utils.insert_cits_objekts_poligons('58,16, 59,14.5, 61,14.5, 62,16, 61,17.5, 59,17.5' ,'Vārtu stabs:Kreisais'); gdb_utils.insert_cits_objekts_poligons('68,16, 69,14.5, 71,14.5, 72,16, 71,17.5, 69,17.5' ,'Vārtu stabs:Labais');

gdb_utils.insert_cits_objekts_aplis(96,46,8,'Aplis:Ārējais'); gdb_utils.insert_cits_objekts_aplis(96,46,4,'Aplis:Iekšējais'); gdb_utils.insert_cits_objekts_poligons('94,46, 97,44.3, 97,47.7','Strūklaka:Trīsstūris');

COMMIT;END;

SQLLOADER izmantošana ģeometrijas datiem

Protams, ja jāstrādā ar lieliem datu apjomiem, tad var pielietot sqlloader, kas ir spējīga strādāt arī ar

objektu tipiem. Piemērs - kontrolfails + datu fails slānim „Tilti” (4 poligoni):

load data infile *TRUNCATECONTINUEIF NEXT(1:1) = '#'into table gdb_tiltifields terminated by '|'TRAILING NULLCOLS ( tilta_id "GDB_TILTA_ID_SEQ.NEXTVAL", apraksts CHAR, geometrija column object ( SDO_GTYPE CONSTANT 2003, SDO_ELEM_INFO VARRAY TERMINATED BY '|/' (elements FLOAT EXTERNAL), SDO_ORDINATES VARRAY TERMINATED BY '|/' (ordinates FLOAT EXTERNAL) ) )begindata||lielais tilts|#1|1003|1|/#61,5|95|61,5|73|68,5|73|68,5|95|61,5|95|/||mazais tilts #1|#1|1003|1|/#48|134,4|51|132,3|55,5|137|52,6|139,8|/||mazais tilts #2|#1|1003|1|/#79|128|79|120|83|120|83|128|/||mazais tilts #3|#1|1003|1|/#46,4|116,1|51|110|53,5|112,5|49,4|118|/

5. Grafisko indeksu veidošana

Lai efektīvāk piekļūtu datiem, ir jāizveido grafiskais indekss katrai tabulai. Indeksēšana ļauj ātrāk

pārmeklēt datus un izmantot dažas papildus funkcijas grafisko datu vaicājumos.

Tika izmantoti 3 indeksu veidi:

fiksētie

hibrīda

R-koka

R – koka indeksa gadījumā tiek aproksimēta katra ģeometrija ar mazāko tās iespējamo robežu. Lai

izveidotu šādu indeksu, nav jānorāda nekādi parametri.

-- R-Tree:CREATE INDEX gdb_koki_idx ON gdb_koki (geometrija)INDEXTYPE IS MDSYS.SPATIAL_INDEX;

CREATE INDEX gdb_ekas_idx ON gdb_ekas (geometrija)INDEXTYPE IS MDSYS.SPATIAL_INDEX;

CREATE INDEX gdb_tilti_idx ON gdb_tilti (geometrija)INDEXTYPE IS MDSYS.SPATIAL_INDEX;

Fiksētais indekss pārklāj attēlu (datus) ar režģi, kura rūtiņas dēvē par dakstiņiem. Dakstiņa izmēru

nosaka, veidojot indeksu - parametrā SDO_LEVEL. Aproksimācija būs precīzāka, ja dakstiņu izmēri būs

mazāki.

-- Fixed:CREATE INDEX gdb_setas_idx ON gdb_setas(geometrija)INDEXTYPE IS MDSYS.SPATIAL_INDEX PARAMETERS ('SDO_LEVEL = 3');

CREATE INDEX gdb_citi_objekti_idx ON gdb_citi_objekti(geometrija)INDEXTYPE IS MDSYS.SPATIAL_INDEX PARAMETERS ('SDO_LEVEL = 4');

Hibrīdais indekss veido fiksēta izmēra dakstiņu režģi (tāpat kā fiksētais indekss), bet papildus vietām

vēl tiek izveidots mainīgā izmēra dakstiņu pārklājums (vēl smalkāks režģis), kurā dakstiņu maksimālo skaitu

nosaka ar parametru SDO_NUMTILES. Datu piekļūšana lietojot hibrīda indeksu ir lēnāka, bet precīzāka.

-- Hybrid:CREATE INDEX gdb_celi_idx ON gdb_celi (geometrija)INDEXTYPE IS MDSYS.SPATIAL_INDEX PARAMETERS ('SDO_LEVEL = 4, SDO_NUMTILES = 4');

CREATE INDEX gdb_udenstilpnes_idx ON gdb_udenstilpnes (geometrija)INDEXTYPE IS MDSYS.SPATIAL_INDEX PARAMETERS ('SDO_LEVEL = 3, SDO_NUMTILES = 8');

CREATE INDEX gdb_pludmales_idx ON gdb_pludmales (geometrija)INDEXTYPE IS MDSYS.SPATIAL_INDEX PARAMETERS ('SDO_LEVEL = 5, SDO_NUMTILES = 3');

Indeksu metadati meklējami tabulā ALL_SDO_INDEX_INFO

-- Metadati:SELECT * FROM ALL_SDO_INDEX_INFO;

6. Datu vizualizācija

Ģeometrisko datu vizualizācijai tika izmantots „Oracle SQL Developer” paplašinājums „Geo Raptor”.

Tā izmantošana pamata vajadzībām ir ļoti vienkārša:

1) Pieslēdzas datubāzei un uz tabulām, kas satur ģeometriskos datus nospiež labo peles taustiņu: GeoRaptor > Add To Spatial View:

(17. Att. Pievieno spatial view)

2) Tālāk atver:View > GeoRaptor > Spatial View:

(18. att. Ieslēdz Spatial View)

3) Kokā ieķeksē, kurus slāņus attēlot dotajā brīdī un uz viena no slāņiem nospiež labo peles taustiņu un <Zoom to Layer>. Šajā brīdī vajadzētu parādīties ģeometriskajiem datiem:

(19. att. Pietuvina slāni)

Katram slānim var definēt īpašības (Properties), piemēram, izvēlēties krāsu:

(20. att. Slāņa īpašības – krāsa)

(21. att. Āttēls ar krāsām)

Vēl viena laba lieta slāņu īpašībās ir to nosaukumu atrādīšana attēlā (Labeling), kur var izvēlēties jau slāņa

tabulas kādu konkrētu lauku, kurā esam savadījuši iekšā ģeometrijas aprakstošo informāciju:

(22. att. Ģeometriju nosaukumi attēlā)

Kad kursors atrodas virs attēla, apakšējā joslā rāda tā atrašanās vietas X un Y koordinātes. Tas var palīdzēt

ātrāk noteikt, kādas koordinātes jāraksta datu ievadē:

(23. att. X un Y koordinātes)

7. Grafiskie vaicājumi

SDO_LENGTH

Ar šo operatoru var noteikt ģeometrijas garumu/perimetru. Otrajā parametrā jāpadod informācija no

ģeometrijas metadatiem:-- Upes garākrasta garumsSELECT u.piezimes, SDO_GEOM.sdo_length (u.geometrija ,(SELECT md.diminfo FROM user_sdo_geom_metadata md WHERE md.table_name = 'GDB_UDENSTILPNES') ) AS upes_garums FROM gdb_udenstilpnes u WHERE u.piezimes LIKE 'Upes garais krasts';

(24. att. Upes garā krasta līnija)

SDO_DISTANCE

Nosaka attālumu starp divām ģeometrijām – katrai jāpadod metadatu informācija parametrā.

-- Attālums starp diviem stabiem (abi atrodas vienā slānī)SELECT SDO_GEOM. sdo_distance ((SELECT stabs_1.geometrija FROM gdb_citi_objekti stabs_1 WHERE stabs_1.nosaukums = 'Vartu stabs:Kreisais') ,md.diminfo ,(SELECT stabs_2.geometrija FROM gdb_citi_objekti stabs_2 WHERE stabs_2.nosaukums = 'Vartu stabs:Labais') ,md.diminfo ) distance FROM user_sdo_geom_metadata md WHERE md.table_name = 'GDB_CITI_OBJEKTI';

(25. att. Attālums starp vārtu stabiem)

SDO_WITHIN_DISTANCE

Ar šo operatoru norāda attālumu, kurā meklē citas ģeometrijas.-- Koki, kas atrodas 10 vienību attālumā no konkrētas ēkasSELECT k.koka_id, k.apraksts FROM gdb_koki k, gdb_ekas e WHERE e.apraksts = 'Maja #4' AND sdo_within_distance (e.geometrija, k.geometrija, 'distance=10') = 'TRUE';

(26. att. Koki noteiktā attālumā)

SDO_TOUCH

Ar šo operatoru var konstatēt, kur ģeometrijas pieskaras viena otrai.-- Kļūdas zīmējumā: Kur sētas pieskaras ceļiemSELECT c.cela_id, c.tips FROM gdb_setas s, gdb_celi c WHERE sdo_touch (s.geometrija, c.geometrija) = 'TRUE';

(27. att. Kļūdainā pieskāršanās)

SDO_FILTER

SDO_FILTER - primārais filtrs – tas atlasa ģeometrijas, kuras kaut kādā veidā ir saistītas ar norādīto

ģeometriju. Vaicājumā iekļautajai ģeometrijas kolonnai jābūt ar Spatial indeksu.-- Kura no ģeometrijām tabulāir saistīta ar uzdoto ģeometriju parametrā- taisnstūri:SELECT a.ekas_id,e.apraksts FROM gdb_ekas e WHERE sdo_filter (e.geometrija, -- Filtrs: Taisnstūris sdo_geometry (2003, NULL, NULL, sdo_elem_info_array (1, 1003, 3), sdo_ordinate_array (13, 33, 44, 46))) = 'TRUE';

(28. att. Primārais filtrs – taisnstūris)

-- Divu slāņu saistītās ģeometrijas:SELECT t.apraksts, u.piezimes FROM gdb_tilti t, gdb_udenstilpnes u WHERE sdo_filter (t.geometrija, u.geometrija) = 'TRUE';

(29. att. Primārais filtrs – divu ģeometriju savstarpējā saistība)

SDO_NN

SDO_NN – atrod tuvākās ģeometrijas (NN - Nearest Neighbour) norādītajai ģeometrijai.

Parametros jānodod ģeometrija, kuras pārskata, ģeometrija, no kuras skatās, atgriežamo kaimiņu skaits un

mērvienība (pēc noklusējuma „1”, bet to vajag, ja grib papildus lietot SDO_NN_DISTANCE, kas papildus

nosaka attālumu līdz kaimiņam).-- Objekti no slāņa "Ēkas", kas atrodas vistuvāk strūklakai (trīsstūrim)SELECT e.apraksts, ROUND(sdo_nn_distance(1),2) distance -- "1" sakrīt ar SDO_NN pēdējo paremetru FROM gdb_citi_objekti co -- co gdb_citi_objekti_idx ,gdb_ekas e WHERE co.nosaukums = 'Struklaka:Trissturis' AND SDO_NN(e.geometrija ,co.geometrija ,'SDO_NUM_RES=6' -- "6" - cik tuvākos kaimiņus attēlot ,1 -- Mērvienība, bet jānorāda, ja grib lietot vaicājumāSDO_NN_DISTANCE ) = 'TRUE' ORDER BY distance;

(30. att. Tuvākie kaimiņi)

SDO_RELATE

SDO_RELATE – dēvē par primārā un sekundārā filtra operatoru. Tas tāpat kā SDO_FILTER parametros

pieņem divas ģeometrijas, bet papildus vēl parametru - masku, kas nosaka topoloģiskās attiecības starp

vaicājumā iekļautajām ģeometrijām.

Maskas piemērs (ANYINTERACT)

Ja lieto masku ANYINTERACT, tad tas ir tāds pats kā primārais filtrs (SDO_RELATE) (skatīt 1. vaicājumu).

Tāpat tas ir arī ekvivalents operatoram SDO_ANYINTERACT.-- Kura no ģeometrijām tabulāir saistīta ar uzdoto ģeometriju parametrā- taisnstūri:SELECT a.ekas_id, e.apraksts FROM gdb_ekas e WHERE sdo_relate (e.geometrija, -- Filtrs: Taisnstūris sdo_geometry (2003, NULL, NULL, sdo_elem_info_array (1, 1003, 3),

sdo_ordinate_array (13, 33, 44, 46)), 'MASK=ANYINTERACT') = 'TRUE';

Vispār ir tā, ka SDO_RELATE maskām ir ekvivalenti atsevišķi operatori:

ANYINTERACT -> SDO_ANYINTERACTCONTAINS -> SDO_CONTAINSCOVERS -> SDO_COVEREDBYCOVEREDBY -> SDO_COVERSEQUAL -> SDO_EQUALINSIDE -> SDO_INSIDEON -> SDO_ONOVERLAPBDYDISJOINT -> SDO_OVERLAPBDYDISJOINTOVERLAPBDYINTERSECT -> SDO_OVERLAPBDYINTERSECTTOUCH -> SDO_TOUCHutt., tāpēc pārējās maskas netika darbā apskatītas.

GeoRaptor Spatial vaicājumu rīks

SQL Devleoper paplašīnajums GeoRaptor piedāvā diezgan plašas iespējas izpildīt vaicājumus, nerakstot

SQL, bet, „uzzīmējot” vaicājumu ar peles palīdzību.

(31. att. GeoRaptor vaicājuma izvēlne)

(31. att. GeoRaptor vaicājuma izmēru noteikšana)

(32.att. GeoRaptor ģenerēts vaicājums)

Vaicājums tikai nedaudz jāpielabo savām vajadzībām.

8. Grafisko datu apstrāde ar Java

Tika aplūkotas dažas iespējas un piemēri kā programmēšanas valodas Java vidē var apstrādāt Spatial datus,

izmantojot Oracle klasi JGeometry.

Nepieciešamais programmnodrošinājums

Darbam ar Java tika izmantota programma NetBeans 7.1. Lai uzsāktu darbu, ir nepieciešamas dažas Java

bibliotēkas, kuras nav standarta komplektācijā:

oracle.jdbc.*

oracle.sql.*

oralce.spatial.*

Ar pirmajām divām problēmu nebija – tās ir brīvi pieejamas internetā (piemēram, findjar.com, kurā var ērti

sameklēt vajadzīgo paku pēc nepieciešamās klases):

(33. att. Bibliotēku meklēšana)

Bet, lai dabūtu oracle.spatial.* klases, nepieciešams lejupielādēt un uzinstalēt Oracle datubāzi 10g Release

1 vai jaunāku, kuras komplektācijā ir pieejama Oracle Spatial Java Class Library, kas būtībā ir 4 pakas:

sdoapi.jar sdonm.jar sdotopo.jar sdout.jar

Pēc instalēšanas pakas ir atrodamas direktorijā:$ora_home/product/{version}/db_1/md/jlib/

Bibliotēku (.jar) piesaistīšana

Bibliotēkas var piesaistīt vairākos veidos:1) Mainot sistēmas mainīgā CLASSPATH vērtību, iekļaujot tajā ceļu uz vietu, kur saglabātas bibliotēkas2) Iekopējot bibliotēkas direktorijā:

C:\Program Files\Java\jdk1.6.0\jre\lib\ext\3) Norāda IDE rīka konfigurācijā (šajā gadījumā NetBeans) – kur atradīsies iekļaujamās pakas:

Projekta kokā uz mapes „Libraries” spiež labo peles taustiņu un izvēlas „Add JAR/Folder”:

(34. att. Bibliotēku pievienošana)

Java programmas piemērspackage mpa_spatial;

import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.sql.Connection;import oracle.jdbc.OracleTypes;import oracle.sql.CLOB;import java.sql.*;import java.sql.DriverManager;import java.sql.SQLException;import oracle.jdbc.driver.OracleConnection;import oracle.spatial.geometry.DataException;import java.io.OutputStream;import java.io.ByteArrayOutputStream;import java.io.ByteArrayInputStream;import java.io.InputStream;import oracle.jdbc.driver.OracleDriver;import oracle.sql.STRUCT;import oracle.spatial.util.*;import oracle.spatial.geometry.*;

public class MPA_Spatial {

protected static Connection m_conn; public static void main(String[] args) throws SQLException, IOException { Statement stmt = null; ResultSet rslt = null; STRUCT geomObj = null; JGeometry jGeom = null;

//Pieslēdzas datubāzei try { DriverManager.registerDriver(new OracleDriver()) ; //jdbc:oracle:thin:@localhost:PortNumber:SID/ServiceName,DBuserName, Password m_conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:RTU10GR2", "SYSTEM", "SYSTEM"); } catch(SQLException e) { e.printStackTrace();} stmt = m_conn.createStatement(); // #1. piemērs: Nolasa ģeometriju un pārbauda veic dažādas parbaudes ar to // Ģeometrijas nolasīšana no datu bāzes rslt = stmt.executeQuery("SELECT geometrija FROM gdb_koki WHERE apraksts = 'Aplis - vidus:Lielais'"); rslt.next(); geomObj = (STRUCT) rslt.getObject(1); //oracle.sql.STRUCT //PārkonvertēSTRUCT uz JGeometry tipu jGeom = JGeometry.load(geomObj); System.out.println("Ģeometrijas dimensijas: " + jGeom.getDimensions()); //Funkcija parbauda, vai ģeometrija ir riņķis if (jGeom.isCircle()) { System.out.println("Jā, tas ir riņķis."); } else { System.out.println("Nē, tas nav riņķis!"); }

(35. att. Java programmas rezultāts #1)

// #2. piemērs: Izpilda filtra vaicājumu un izvada atgrieztās ģeometrijas .xsd //faila formātā, ko var pielietot attēlošanai karšu sistēmās rslt = stmt.executeQuery("SELECT geometrija " + //Kolonna ar spatial datu tipu //SDO_GEOMETRY "FROM gdb_ekas " + //Rectangle filter: "WHERE sdo_filter (geometrija," +

"sdo_geometry(2003,NULL,NULL," + "sdo_elem_info_array(1,1003,3)," + "sdo_ordinate_array (13,33,44,46))) = 'TRUE'"); String theGMLString = null; GML2 gmltest = new GML2(); gmltest.setConnection((OracleConnection)m_conn); while (rslt.next()) { geomObj = (STRUCT) rslt.getObject(1); //Konvertē Spatial ģeometrijas objektu uz Geography Markup Language(GML 2.0), //kas balstās uz ģeometriju tipiem, kas definēti "Open GIS geometry.xsd" //shēmas dokumentā theGMLString = gmltest.to_GMLGeometry(geomObj); System.out.println(theGMLString); }

(36. att. Java programmas rezultāts #2)

// #3. piemērs: Izveido ģeometriju un ievieto to datubāzē // Izveido ģeometriju jGeom = JGeometry.createCircle(15, 76, 6, 0); // x,y,Rādiuss,SRID // Ģeometrijas ierakstīšana datu bāzē PreparedStatement ps = m_conn.prepareStatement( "INSERT INTO gdb_koki(koka_id,geometrija,apraksts)" + "VALUES(gdb_koka_id_seq.NEXTVAL,?,'Koks nācis no Java')"); //KonvertēJGeometry instanci uz DB STRUCT geomObj = JGeometry.store(jGeom, m_conn); ps.setObject(1, geomObj); ps.execute(); System.out.println("Ģeometrija ierakstīta datubāzē...");

(37. att. Java programmas rezultāts #3)

// Aizver visas konekcijas ----------------------------------------------------- stmt.close(); rslt.close(); m_conn.close(); }}

9. Lielie objekti (LOB)

Vispārīgi par LOB

LOB (Large OBjects) – datu tipi paredzēti nestrukturizētu vai ar laiku strukturizētu datu glabāšanai.

Dažādu ražotāju datubāzes piedāvā dažādus datu tipus paredzētus šim nolūkam. Oracle piedāvātie datu

tipi ir:

BLOB – Binārie lielie objekti

CLOB – Simbolu LOB

NCLOB – Nacionālo simbolu LOB

BFILE – ārējā binārā datne (darbojas ātrāk kā *LOB)

LOB var glabāties:

a) Failsistēmā (tabulā glabājas tikai norāda)

b) Pašā datubāzē – atsevišķā tabultelpā

Galvenās darbības Oracle datubāzē veic, izmantojot funkcijas pakā DBMS_LOB:

.append – pievieno norādītā LOB saturu jau esošā LOB beigās .close – aizver LOB, kurš atvērt apstrādei .compare – salīdzina divu LOB vērtības .convertToBlob – konvertē CLOB vai NCLOB uz BLOB .convertToClob – konvertē BLOB uz CLOB vai NCLOB .copy – kopē visu vai daļu no viena LOB uz citu .createTemporary – izveido īslaicīgas glabāšanas CLOB vai BLOB un tā attiecīgos indeksus lietotāja

noklusētajā īslaicīgās glabāšanas tabultelpā .empty_blob – piešķir BLOB vērtību NULL .empty_clob – piešķir CLOB vērtību NULL .erase – izdzēš visu vai daļu no LOB .fileOpen – atver failu .fileClose – aizver failu, kas atvērts ar dmbs_lob.file_open .fileCloseAll – aizver visus failus, kas atvērti ar dbms_lob.file_open .fileExists – nosaka vai fails eksistē .fileGetName – atgriež faila nosaukumu un direktoriju, kurā tas atrodas .fileIsOpen – pārbauda vai fails nav atvērts .fragment_delete – izdzēš norādīto faila apgabalu .fragment_insert – ievieto norādītos datus (maks. 32K) norādītajā vietā LOB .fragment_move – pārvieto norādīto faila daļu uz citu norādīto vietu LOB .fragment_replace – aizvieto norādīto faila fragmentu ar citu (maks. 32K) .freeTemporary – atbrīvo BLOB vai CLOB noklusētajā pagaidu tabultelpā .getChunkSize – noskaidro, cik daudz vietas ir atvēlēts LOB .getLength – noskaidro LOB vērtības garumu .getDuplicateRegions – [nav dokumentēts] .getOptions – izgūst konkrētā LOB iestatījumus .getStorageLimit – nosaka datubāzes apjoma ierobežojumus LOB .instr – atgriež pozīciju, kur n-to reizi parādās uzdotā vērtība .isopen – pārbauda vai LOB jau nav atvērts .isSecureFile (11g) – pārbauda vai fails tiek glabāts kodēta SECUREFILE veidā

.isTemporary – pārbauda vai lokators norāda uz pagaidu LOB .loadBlobFromFile – ielādē BFILE datus iekšējā BLOB .loadClobFromFile – ielādē BFILE datus iekšējā CLOB .loadFromFile – ielādē BFILE datus iekšējā LOB .open – atver LOB norādītajā režīmā .read – nolasa LOB datus sākot no norādītās vietas .setOptions – pārraksta LOB iestatījumus .substr – atgriež LOB daļu no norādītās vietas .trim – nocērp LOB vērtību līdz norādītajai vērtībai .write – ieraksta datus LOB .writeAppend – ieraksta datus LOB beigās

Dažas vienkāršas darbības ar CLOB

Tabula: LOB glabāšanaiCREATE TABLE rtu_lob_tests ( nosaukums VARCHAR2(255), clob_elem CLOB, nclob_elem NCLOB, blob_elem BLOB, bfile_elem BFILE );

Izpildāmais kods:DECLARE l_count NUMBER; l_clob_elem CLOB; l_erased_amount NUMBER(15); l_clob_elem_2 CLOB;BEGIN DELETE FROM rtu_lob_tests WHERE clob_elem IS NOT NULL; dbms_output.put_line('Izveido 1. LOB ierakstu...'); INSERT INTO rtu_lob_tests (nosaukums, clob_elem) VALUES ('Teksts #1','Šis ir vienkāršs teksts, kas tiek glabāts CLOB mainīgajā.');

dbms_output.put_line('Izveido 2. LOB ierakstu...'); INSERT INTO rtu_lob_tests (nosaukums, clob_elem) VALUES ('Teksts #2','Arī šeit nav nekādu jaunumu un teksts tiek glabāts kā CLOB');

-- Uz CLOB kolonnu var izpildīt parastus SQL teksta vaicājumus SELECT count(*) INTO l_count FROM rtu_lob_tests WHERE clob_elem like '%teksts%'; dbms_output.put_line('Atlasīti '|| l_count || ' atbilstoši ieraksti...'); -- Var izpildīt SQL update teksta labošanai

UPDATE rtu_lob_tests SET clob_elem = REPLACE(clob_elem,'CLOB','Simbolu LOB') WHERE nosaukums LIKE 'Teksts%'; dbms_output.put_line(SQL%ROWCOUNT ||' ierakstos teksts "CLOB" aizvietots ar "Simbolu LOB"...');

-- Ielasa 1. vērtību CLOB mainīgajā SELECT clob_elem INTO l_clob_elem FROM rtu_lob_tests WHERE nosaukums = 'Teksts #1' FOR UPDATE; -- Ja šis nebūs, tad būs kļūda: -- ORA-22920: row containing the LOB value is not locked

dbms_output.put_line('Mainīgā vērtība: "'|| l_clob_elem||'"'); dbms_output.put_line('Izmērs: '|| dbms_lob.getlength(l_clob_elem)||' baiti');

-- Komanda APPEND veic izmaiņas datubāzē dbms_lob.append(l_clob_elem,' Pielikums ar komandu APPEND.'); dbms_output.put_line('Izmērs pēc APPEND: '|| dbms_lob.getlength(l_clob_elem)||' baiti'); -- Komanda DELETE nodzēš vērtību (atstāj tukšumus), bet izmērs nesamazinās l_erased_amount := 5; -- Cik simbolus izdzēst dbms_lob.erase(l_clob_elem,l_erased_amount,1); -- "1" - no kuras pozīcijas dbms_output.put_line('Izmērs pēc ERASE: '|| dbms_lob.getlength(l_clob_elem)||' baiti');

dbms_output.put_line('Novienādo abus ierakstus...'); UPDATE rtu_lob_tests SET clob_elem = l_clob_elem WHERE nosaukums LIKE 'Teksts #2' RETURNING clob_elem INTO l_clob_elem_2; IF dbms_lob.compare(l_clob_elem,l_clob_elem_2) = 0 THEN dbms_output.put_line('COMPARE funkcija saka, ka vērtības ir vienādas...'); END IF; END;

Izvade DBMS_OUTPUT:

Datu ielāde ar SQL LOADER

Izpildāmais fails: clob_loader.batsqlldr system/system@RTU10GR2 control='clob_loader.ctl'

Kontrolfails: clob_loader.ctlload datainfile *into table rtu_lob_testsreplacefields terminated by ','( nosaukums, faila_mape filler char(100), blob_elem lobfile(faila_mape) terminated by eof)begindataWin 3.1,Z:\RTU_MG\2_sem\LDB_ADM\Spatial\MPA\LOB\win31logo.pngWindows 7,Z:\RTU_MG\2_sem\LDB_ADM\Spatial\MPA\LOB\candy_windows_logo-5537.jpgLinux in Win,Z:\RTU_MG\2_sem\LDB_ADM\Spatial\MPA\LOB\Linux_Windows_Vista_by_Musl1m.png

Pēc ielādes, piemēram, ar SQL Developer var apskatīt rezultātus:

(38. att. Ielādētie faili ar sqlldr)

Datu ielāde ar BFILE tipa norādi

-- BLOB faila ielādes procedūra (izmanto BFILE tipa mainīgo)CREATE OR REPLACE PROCEDURE load_file ( p_name VARCHAR2, -- Nosaukums p_file_name VARCHAR2 -- Faila nosaukums ) IS

src_file BFILE; dst_file BLOB; lgh_file BINARY_INTEGER; BEGIN

src_file := bfilename('RTU_LOB_TEMP_DIR', p_file_name); -- Direktorija

-- Ievieto tukšu ierakstu priekš ieraksta rezervēšanas INSERT INTO rtu_lob_tests (nosaukums, blob_elem) VALUES (p_name, EMPTY_BLOB()) RETURNING blob_elem INTO dst_file;

-- Rezervēierakstu SELECT blob_elem INTO dst_file FROM rtu_lob_tests WHERE nosaukums = p_name FOR UPDATE NOWAIT;

-- Atver failu dbms_lob.fileopen(src_file, dbms_lob.file_readonly);

-- Nosaka faila garumu lgh_file := dbms_lob.getlength(src_file);

-- Nolasa failu dbms_lob.loadfromfile(dst_file, src_file, lgh_file);

-- Labo BLOB lauku UPDATE rtu_lob_tests SET blob_elem = dst_file WHERE nosaukums = p_name;

-- Aizver failu dbms_lob.fileclose(src_file);END load_file;/

-- Izveido direktoriju, no kuras lasīs failusCREATE OR REPLACE DIRECTORY rtu_lob_temp_dir as 'C:\TEMP\';

-- Ielādē failus:BEGIN load_file('Nikola Tesla','tesla_colorado.jpg'); load_file('Stīvs Džobs','steve_jobs.jpg'); load_file('Mihails Kalašņikovs','Mikhail_Kalashnikov.jpg'); COMMIT;END;/

(39. att. Ielādētie faili ar procedūru)

Secinājumi

Darbā mēģināju neiekļaut tēmas, kas neattiecas uz grafiskajām datubāzēm – tādas kā – Oracle DB

instalēšana, datu relāciju loģikas projektēšanu, kam ar grafiku nav sakara.

Ar rīku Oracle SQL Developer nav viegli strādāt – var pat just, ka rīkam ir savas priekšrocības, bet

nepietiek pacietības šīs priekšrocības izpētīt, jo rīks ir ļoti nestabils, es pat teiktu – lietotājam nedraudzīgs –

nekad netiek pārjautāts par darbību, ko varbūt nejauši lietotājs ir izsaucis, ne tur noklikšķinot ar kursoru un,

ja reiz rīks ir „aizdomājies” ar kādu darbību, tad nekas neliecina, ka tas fonā strādā, un vienīgais veids kā

pārbaudīt, vai tas ir pieejams (Responding), ir – noklikšķināt kaut kur, izsaucot jaunu darbību – un rezultātā

darbības var sastāties rindā, kuru nobeigt nākas ar „Windows Task Manager”.

Viena no dīvainībām bija tā, ka veidojot indeksus, ieguvu vairākas kļūdas vienlaicīgi, bet par spīti

tam, indeksu metadatu tabulā bija redzams, ka tā statuss ir „VALID”:CREATE INDEX gdb_setas_idx ON gdb_setas(geometrija)INDEXTYPE IS MDSYS.SPATIAL_INDEX PARAMETERS ('SDO_LEVEL = 3');

[1]: ORA-29855: error occurred in the execution of ODCIINDEXCREATE routine[1]: ORA-13249: internal error in Spatial index: [mdidxrbd][1]: ORA-13249: Error in Spatial index: index build failed[1]: ORA-13206: internal error [Tessellate] while creating the spatial index[1]: ORA-13249: Error in spatial index: [mdpridxtessellate][1]: ORA-13200: internal error [ROWID:AAADYKAABAAAKfSAAK] in spatial indexing.[1]: ORA-13019: coordinates out of bounds[1]: ORA-06512: at "MDSYS.SDO_INDEX_METHOD_10I", line 10

Bet pēc tam, izpildot jebkādas darbības tabulā ar šādu indeksu, iegūst kļūdu:DELETE FROM gdb_setas;

ORA-29861: domain index is marked LOADING/FAILED/UNUSABLE

Protams, izrādījās, ka tabulā esošajos datos gan X, gan Y koordinātes pārsniedza slāņa meta datu tabulā

definētos maksimumus. Palielināju maksimumus un indeksi izveidojās bez kļūdām.

Vislielākais personiskais ieguldījums šajā darbā laikam ir PL/SQL procedūra, kura man pašam šķita

diezgan ērti izmantojama un, ja kādreiz būs nepieciešamība darboties ar Spatial datiem, tad noteikti būs

vieglāk šo izmantot.

Lai arī cik bieži tika atgādināts, ka poligonam punktu apiešanas virziens ir pretējs pulksteņa rādītāja

virzienam (un iekšējai malai – pulksteņa rādītāja virzienā), tāpat nācās pavadīt izmisuma pilnus brīžus, kad

tas bija piemirsies. Šajā sakarā gribētos, lai būtu kaut kādas validācijas ģeometrijas ievadē - bija doma ar

kaut ko tādu papildināt manu universālo procedūru, taču pietrūka laika. Teorētiski arī Oracle datubāzē

varēja būt kādas validācijas. Ar tiem pašiem lokiem arī bieži bija tā, ka ievadu koordinātes, kuras laikam

skaitījās neiespējamas un tāpēc GeoRaptor šo ģeometriju vienkārši neattēloja, bet iemesls uz to brīdi nav

zināms (bija viena no koordinātēm jāpalielina par 0.1). Tāpēc patiesībā jau mēs šos darbus nepildām tādā

secībā kā tas ir saturā. Īstā secība ir – konstruēt pa punktiņam figūras un gandrīz pēc katra punkta ievades

to pārbaudīt ar GeoRaptor vizualizāciju. Tas arī vajadzīgs, lai sadaļā „Datu ievade” varētu uzreiz pēc INSERT

parādīt, ko tad īsti tie cipariņi ir nozīmējuši attēlā. Indeksus arī vajadzētu veidot pirms kaut ko grib grafiski

paskatīties, jo GeoRaptor ik pa laikam palika nestabils savā darbībā un izvadīja kļūdas (kaut ko par

pārsniegtu atvērto kursoru skaitu) – tad nācās to pārstartēt. Protams, to, ka šīs kļūdas ir dēļ indeksu

neesamības, es sapratu tikai, kad biju pabeidzis zīmējumu un SQLDeveloper rīku biju pārstartējis kādas 50

reizes, konstruējot savu attēlu.

Bet kopumā šī bija vērtīga pieredze un privāto krājumu papildinājums.

Java

Ar programmēšanas valodu Java ir nācies periodiski un īslaicīgi saskarties un tāpat kā vienmēr arī

šoreiz nācās pamatīgi papūlēties, lai pašmācības ceļā kaut ko tiešām dabūtu gatavu. Ja lielāko daļu ir

strādāts ar procedurālo programmēšanu (piemēram, PL/SQL), tad uz Java pārslēgties ir visai pagrūti. Ļoti

daudz laika nācās pavadīt pie tādām (pieņemu, ka Jav-istiem pašsaprotamām) lietām kā bibliotēku

meklēšanu un pieslēgšanu. Interesanti būtu darbu attīstīt tālāk, izmantojot Java Applet un grafisko

elementu attēlošanu tajā.

LOB

Darbā ar attēliem nepatīkami bija tas, ka nav nevienas bezmaksas programmas, ar kuru var ievietot

failus tabulā (tādas kā OraLobEditor) vai arī tādas ir grūti atrast.

Kas man īsti nelikās loģiski, bet pieņēmu, ka tas nu tā ir – ka, ja labo CLOB mainīgā vērtību, kurš

ielasīts no datubāzes tabulas, tad uzreiz automātiski tiek veiktas izmaiņas arī tabulā. Tāpēc arī jārezervē

ieraksts, no kura tiek ielasīta vērtība (ORA-22920: row containing the LOB value is not locked).

Patīkami bija tas, ka kompilējot kodu, Oracle kļūdu ziņojumi sakarā ar LOB, bija diezgan labi

saprotami.