Parcely
Contents
Příklad Parcely
Představme si velmi jednoduchý systému pro evidenci parcel a jejich vlastníků. Vytvoříme jednoduchou datovou strukturu, pomocí které budeme evidovat vlastníka/vlastníky pozemku/ů. Připouštíme variantu, kdy jeden vlastník může vlastnit více parcel (současně i postupně v čase). Stejně jako jedna parcela může mít více vlastníků v daném okamžiku.
Rozborem situace zjistíme, že lze nadefinovat datové entity VLASTNIK a PARCELA, mezi kterými vznikne vztah typu M:N:
VLASTNIK m – VLASTNI – n PARCELA
Strukturu entitních typů zapíšeme pomocí lineárního zápisu:
VLASTNIK(idVlastnik, jmenoVla, prijmeniVla, adresaVla), PARCELA(idParcela, KU, tvarParcela), VLASTNI(VLASTNIK, PARCELA, datumOd, datumDo)
kde atributy s prefixem 'id' představují primární atributy, a vazba umožňuje sledovat kdo vlastnil parcelu v určitém období.
Před vytvořením struktury v databázi připravíme rozkladem této vazby vazební tabulku, jejíž záznamy budou představovat údaje o vlastníkovi parcely, včetně časového intervalu vlastnictví.
VLASTNIK 1 --- m VLASTNICTVI n---1 PARCELA
Vazební tabulka VLASTNICTVI bude mít primární atribut a dva atributy typu cizí klíč, a atributy vazby.
VLASTNICTVI(idVlastnictvi, idVlastnik, idParcela, datumOd, datumDo).
Vytvoření tabulek a vložení dat
Tabulky vytvoříme pomocí příkazu CREATE TABLE, kde uvedeme název tabulky, názvy a datové typy atributů, a omezení na atributy či tabulku.
Tabulka VLASTNIK
Před tvorbou samotné tabulky je vhodné ošetřit možnost existence tabulky se stejným názvem (například z důvodu předchozího nepovedeného příkazu).
DROP TABLE VLASTNIK;
CREATE TABLE VLASTNIK( idVlastnik NUMBER PRIMARY KEY, jmenovla VARCHAR2(25) NOT NULL, prijmenivla VARCHAR2(25) NOT NULL, adresavla VARCHAR2(30) );
Do tabulky VLASTNIK vložíme několik záznamů pomocí příkazu INSERT INTO table_name VALUES (value1, value2, value3, ...), kdy je nutno dodržet pořadí vkládaných hodnot podle definice tabulky.
INSERT INTO vlastnik VALUES (1, 'Jan', 'Volný', 'Frýdek-Místek'); INSERT INTO vlastnik VALUES (2, 'Petr', 'Krátký', 'Frýdek-Místek'); INSERT INTO vlastnik VALUES (3, 'Jan', 'Bohustý', 'Frýdek-Místek'); INSERT INTO vlastnik VALUES (4, 'Jindřich', 'Volný', 'Ostrava'); INSERT INTO vlastnik VALUES (5, 'Jana', 'Volná', 'Ostrava'); INSERT INTO vlastnik values (6, 'Věra', 'Krásná', 'Frýdek-Místek');
Ověříme uložení dat kontrolním výpisem z tabulky: select * from VLASTNIK.
Tabulka PARCELA
Dále vytvoříme tabulku PARCELA podobným působem jako VLASTNIK.
DROP TABLE PARCELA; CREATE TABLE PARCELA (idParcela NUMBER PRIMARY KEY, ku VARCHAR2(8) NOT NULL, tvarParcela SDO_GEOMETRY );
INSERT INTO parcela VALUES(0,'ova01', SDO_GEOMETRY(2003, NULL, NULL, SDO_ELEM_INFO_ARRAY(1,1003,3), --obdelnik SDO_ORDINATE_ARRAY(1,1,5,10) ) );
INSERT INTO parcela VALUES( 1,'ova001', SDO_GEOMETRY(2003, NULL, NULL, SDO_ELEM_INFO_ARRAY(1,1003,3), --obdelnik SDO_ORDINATE_ARRAY(0,0, 1,10) ) );
INSERT INTO parcela VALUES(20, 'ova005', SDO_GEOMETRY(2003, NULL, NULL, SDO_ELEM_INFO_ARRAY(1,1003,1), -- polygon SDO_ORDINATE_ARRAY(5,10, 4,10, 2,10, 9,15, 9,16, 20,10, 5,10 ) ) ); INSERT INTO parcela VALUES(21, 'ova005', SDO_GEOMETRY(2003, NULL, NULL, SDO_ELEM_INFO_ARRAY(1,1003,1), SDO_ORDINATE_ARRAY(5,1, 8,1, 8,6, 5,7, 5,1) ) ); INSERT INTO parcela VALUES(22, 'ova005', SDO_GEOMETRY(2003, NULL, NULL, SDO_ELEM_INFO_ARRAY(1,1003,1), SDO_ORDINATE_ARRAY(5,1, 5,7, 1,7, 1,1, 5,1) ) );
INSERT INTO parcela VALUES(23, 'ova005', SDO_GEOMETRY(2003, NULL, NULL, SDO_ELEM_INFO_ARRAY(1,1003,1), SDO_ORDINATE_ARRAY(5,7, 5,10, 2,10, 1,9, 1,7, 5,7) ) );
INSERT INTO parcela VALUES(24, 'ova005', SDO_GEOMETRY(2003, NULL, NULL, SDO_ELEM_INFO_ARRAY(1,1003,1), SDO_ORDINATE_ARRAY(5,10, 5,7, 8,6, 7,10, 5,10) ) );
Tvorba prostorového indexu
Nejprve je nutno "obeznámit" SŘBD s tím, že existuje tabulka s geometrickou složkou. Tyto informace se ukládají v systémové tabulce user_sdo_geom_metadata, kam je nutno zapsat název tabulky, jméno sloupce obsahujícího geosložku, rámec prostoru, nad kterým bude vytvořen prostorový index a souřadnicový systém, ke kterému jsou data vztažena.
INSERT INTO user_sdo_geom_metadata VALUES ('parcela', 'tvarparcela', SDO_DIM_ARRAY(sdo_dim_element('X',0,30,0.005), sdo_dim_element('Y',0,30,0.005)), NULL );
Ověření správně uložených informací: :'select * from user_sdo_geom_metadata';
Požadavek na prostorové zaindexování geometrie parcel je nutný z důvodu další práce s prostorovou složkou. Bez zaindexování nelze zobrazit geometrie vprohlížeči, ani pokládat některé typy dotazů.
CREATE INDEX sp_par_idx ON parcela(tvarparcela) INDEXTYPE is mdsys.spatial_index;
Po správném vytvoření prostorového indexu je možné zobrazit geometrickou složku v GeoRaptoru. Klikněte pravým tlačítkem na název tabulky a zvolte GeoRaptor. Poté si vyberte 'Přidat do prohlížeče'. Otevře se nové okno, které je provázáno s prostorovou složkou tabulky.
Tvorba vazební tabulky VLASTNICTVI
Vytvoříme tabulku VLASTNICTVI, která zachycuje kdo je vlastníkem parcely v daném čase. Pokud ve sloupci 'doVlastni' nebude uvedena hodnota, pak je parcela ve vlastnictví majitele s odpovídajícím idVlastnik, proto je zde povolena hodnota NULL. Dále jsou při vytváření tabulky uvedena omezení, která plynou z vazby na tabulky VLASTNIK a PARCELA. Jsou zde vytvořeny cizí klíče se shodnými názvy, jako primární klíče u nadřazených tabulek.
DROP TABLE VLASTNICTVI; CREATE TABLE VLASTNICTVI( idVlastnictvi NUMBER PRIMARY KEY, idVlastnik NUMBER(6) NOT NULL, idParcela NUMBER(6) NOT NULL, odVlastni DATE NOT NULL, -- datum nabyti parcely doVlastni DATE, -- datum pozbyti parcely constraints vla_vla FOREIGN KEY (idVlastnik) references VLASTNIK, constraints vla_pa FOREIGN KEY (idParcela) references PARCELA );
Vložíme záznamy do tabulky Vlastnictví. Pro vložení hodnot datumu je využita konverzní funkce to_date, která umožňuje zadávat datum ve zvoleném formátu (zde DD-MM-YY).
insert into vlastnictvi values(1, 2, 20, to_date('01-01-07', 'DD-MM-YY'), to_date('01-01-08', 'DD-MM-YY')); insert into vlastnictvi values(2, 4, 20, to_date('01-01-09', 'DD-MM-YY'),to_date('01-01-11', 'DD-MM-YY')); insert into vlastnictvi values(3, 2, 20, to_date('01-01-12', 'DD-MM-YY'),null); insert into vlastnictvi values(4, 3, 21, to_date('01-12-10', 'DD-MM-YY'),null); insert into vlastnictvi values(5, 5, 22, to_date('01-05-13', 'DD-MM-YY'),null);
Co ukazují tyto záznamy? O jaké změny vlastnictví v čase se jedná? Tatáž parcela (s id=20) střídá majitele, poté se vrací zpět prvně uvedenému vlastníkovi.
Vyhledání aktuálního vlastníka parcely s číslem id=20.
select y.jmenovla, y.prijmenivla from vlastnictvi x, vlastnik y where x.idVlastnik = y.idVlastnik and x.doVlastni is null and x.idParcela = 20;
Vyhledání aktuálních vlastníků parcel z katastrálního území 'ova005'.
select y.jmenovla, y.prijmenivla from vlastnictvi x, vlastnik y, parcela z where x.idparcela = z.idparcela and x.idVlastnik = y.idVlastnik and x.doVlastni is null and z.ku = 'ova005';
V případě, že chceme zobrazit parcely vyhledaných vlastníků, přidáme do výstupu i geometrickou složku parcely a tu zobrazíme v GoeRaptoru.
select y.jmenovla, y.prijmenivla, z.tvarparcely from vlastnictvi x, vlastnik y, parcela z where x.idparcela = z.idparcela and x.idVlastnik = y.idVlastnik and x.doVlastni is null and z.ku = 'ova005';
Dotazy s prostorovou složkou
Chceme zjistit, co se stane s parcelami v případě, že budu chtít postavit novou budovu. Jak bude vypadat průnik stavby a dotčených parcel?
Novou budovu s její geometrií uložím do tabulky STAVBA.
CREATE TABLE STAVBA (idStavba NUMBER PRIMARY KEY, typStavba VARCHAR2(8) NOT NULL, tvarStavba SDO_GEOMETRY );
INSERT INTO stavba VALUES(1122,'rodDum', SDO_GEOMETRY(2003, NULL, NULL,SDO_ELEM_INFO_ARRAY(1,1003,3),SDO_ORDINATE_ARRAY(4,6, 8,8)) );
INSERT INTO user_sdo_geom_metadata VALUES ('stavba', 'tvarStavba', SDO_DIM_ARRAY(sdo_dim_element('X',0,30,0.005), sdo_dim_element('Y',0,30,0.005)), NULL );
CREATE INDEX sp_stav_idx ON stavba(tvarStavba) INDEXTYPE is mdsys.spatial_index;
INSERT INTO parcela VALUES(1122,'ova005', SDO_GEOMETRY(2003, NULL, NULL, SDO_ELEM_INFO_ARRAY(1,1003,3), SDO_ORDINATE_ARRAY(4,6, 8,8)), );
a zjistíme průnik obou geometrických složek.
select p1.idparcela, p2.idparcela, SDO_GEOM.SDO_INTERSECTION(p1.tvarparcela,p2.tvarparcela,0.005) from parcela p1, parcela p2 where p1.idparcela = 1 AND p2.idparcela = 1122; --je nový geoobjekt - tvar chystané stavby
Zakreslím si nový objekt přes hranice a bude mne zajímat, o kolik např. zemědělské půdy přijdu?