Modelovánà geoprostorové báze dat na úrovni datového modelu KN
Modelovánà geoprostorové báze dat na úrovni datového modelu KN Modelovánà geoprostorové báze dat na úrovni datového modelu KN
Modelování geoprostorové báze dat na úrovni datového modelu KN 4.6.2.1 Program RELtoOO.exe Účelem programu RELtoOO.exe je načíst soubor bodyNahr.txt s výsledkem dotazu na výběr úseků katastrální hranice popsaného v kapitole 4.4 a tyto úseky za sebou seřadit v protisměru chodu hodinových ručiček v pořadí, jaké odpovídá jejich skutečnému uspořádání v terénu. Z popisu a SQL zápisu dotazu je vidět, že jsou vybrány úseky vždy pro jedno konkrétní katastrální území. Po spuštění programu je uživatel vyzván k zadání kódu katastrálního území a identifikátoru hranice. Kód katastrálního území je de facto předurčen vybranými daty. V rámci uživatelského komfortu by bylo možné přizpůsobit zdrojový kód výběrového dotazu a programu RELtoOO.exe způsobem, který by nepožadoval explicitní zadání hodnoty kódu katastrálního území. Stejně tak by šlo vhodným způsobem naprogramovat databázový trigger 24 , který by automaticky generoval a vkládal identifikátory (id) hranice do tabulky KATASTRALNI_HRANICE. Výstupem programu je textový soubor RELtoOO.sql, obsahující SQL příkaz INSERT, vkládající do tabulky KATASTRALNI_HRANICE potřebné údaje. Princip fungování programu RELtoOO.exe lze shrnout do následujících bodů: • Načtení vstupního souboru s identifikátory hraničních úseků a souřadnicemi bodů katastrální hranice do vhodné datové struktury. Název vstupního souboru a cesta k němu jsou implicitně dány zdrojovým kódem programu. Proto je třeba při ukládání výsledku dotazu dodržet umístění a název souboru požadovaných programem. Program prochází vstupní soubor, u každého úseku uloží jeho identifikátor společně s dvěma páry souřadnic (souřadnice počátečního a koncového bodu úseku) do proměnné typu usek. Typ usek a ukazatel pusek na tento typ jsem si definoval následujícím způsobem: TYPE pusek=^usek; //ukazatel na zaznam typu usek usek = RECORD //definice zaznamu typu usek id : REAL; //identifikator useku x1,y1, x2,y2 : REAL; //souradnice poc. a kon. bodu pred : pusek; //nasledujici zaznam dalsi : pusek; //predchazejici zaznam projito : BOOLEAN; //identifikator pridani useku END; Př. 14: Definice typu usek a ukazatele na tento typ pusek. 24 Triggery jsou programovým kódem, který se vykonává na základě určité operace – nejčastěji nad tabulkou či záznamem. 46
Modelování geoprostorové báze dat na úrovni datového modelu KN Ze záznamů s uloženými úseky hranic je při načítání dat vytvářen dynamický obousměrně zřetězený lineární seznam 25 . U každého prvku seznamu je zřejmé, který záznam je jeho předchůdcem a který záznam je jeho následovníkem. Z použití této struktury vyplývá, že po dokončení procházení a čtení vstupního souboru má výsledný seznam právě tolik položek, kolik bylo vybráno úseků katastrální hranice, což přispívá k efektivnímu zacházení s paměťovým prostorem. • Vyhledání úseku v seznamu vytvořeném při načítání dat (původní seznam) obsahujícího nejjižnější bod (maximální hodnota souřadnice X). Pokud by více úseků obsahovalo maximální hodnotu X-ové souřadnice, uvažoval by se jako počáteční úsek geometrického popisu hranice prvně nalezený úsek s maximální X-ovou souřadnicí. Poté jsem vytvořil nový obousměrně zřetězený seznam, jehož položky jsou typu usek. Do jeho počátku jsem umístil usek, který obsahuje nejjižnější bod a je považován za počáteční bod geometrického popisu. Zároveň jsem hodnotu proměnné projito u tohoto záznamu v původním seznamu nastavil na TRUE, což značí, že při hledání navazujícího záznamu (úseku) v původním seznamu vytvořeného při načítání dat nemá být tento úsek již uvažován. Definicí atributu projito jsem se snažil zvýšit efektivnost procházení prvotním seznamem a především snížit algoritmickou složitost programu. • Seřazení úseků tak, jak na sebe ve skutečnosti navazují. Na úsek, který obsahuje nejjižnější bod a představuje první záznam nového seznamu, jsem navázal úsek další, pro který muselo platit, že jeden z jeho bodů je shodný s bodem prvního úseku, který ale zároveň není bodem nejjižnějším. Dále jsem vždy v původním seznamu hledal úsek, který by s posledně přidaným úsekem v novém seznamu měl shodný právě jeden bod. Takto jsem postupně vytvořil zřetězený seznam prvků a platilo, že každé dva sousední prvky nového seznamu (dva úseky) mají právě jeden společný bod. Po každém navázání úseku na předcházející úsek v novém seznamu došlo u odpovídajícího záznamu v původním seznamu k nastavení hodnoty atributu projito na hodnotu TRUE a úsek tak nebyl při dalším prohledávání původního seznamu dále uvažován. Potvrzením správnosti uvedeného postupu vedoucího k seřazení úseků katastrální hranice podle skutečného stavu byl okamžik, kdy se přidal do nového seznamu poslední prvek. Velice snadno se nechalo otestovat, zda posledně přidaný úsek má odlišný identifikátor od prvního prvku seznamu a zároveň obsahuje bod, jehož souřadnice odpovídají souřadnicím nejjižnějšího bodu prvního úseku. Kontrola této skutečnosti byla úspěšná, čímž se potvrdila správná programová realizace 25 Možnost dynamického uložení množiny údajů do paměti vykazující se provázaností jednotlivých položek. 47
- Page 1 and 2: ZÁPADOČESKÁ UNIVERZITA V PLZNI F
- Page 3 and 4: Poděkování Na tomto místě bych
- Page 5 and 6: Modelování geoprostorové báze d
- Page 7 and 8: Modelování geoprostorové báze d
- Page 9 and 10: Modelování geoprostorové báze d
- Page 11 and 12: Modelování geoprostorové báze d
- Page 13 and 14: Modelování geoprostorové báze d
- Page 15 and 16: Modelování geoprostorové báze d
- Page 17 and 18: Modelování geoprostorové báze d
- Page 19 and 20: Modelování geoprostorové báze d
- Page 21 and 22: Modelování geoprostorové báze d
- Page 23 and 24: Modelování geoprostorové báze d
- Page 25 and 26: Modelování geoprostorové báze d
- Page 27 and 28: Modelování geoprostorové báze d
- Page 29 and 30: Modelování geoprostorové báze d
- Page 31 and 32: Modelování geoprostorové báze d
- Page 33 and 34: Modelování geoprostorové báze d
- Page 35 and 36: Modelování geoprostorové báze d
- Page 37 and 38: Modelování geoprostorové báze d
- Page 39 and 40: Modelování geoprostorové báze d
- Page 41 and 42: Modelování geoprostorové báze d
- Page 43 and 44: Modelování geoprostorové báze d
- Page 45 and 46: Modelování geoprostorové báze d
- Page 47 and 48: Modelování geoprostorové báze d
- Page 49: Modelování geoprostorové báze d
- Page 53 and 54: Modelování geoprostorové báze d
- Page 55 and 56: Modelování geoprostorové báze d
- Page 57 and 58: Modelování geoprostorové báze d
- Page 59 and 60: Modelování geoprostorové báze d
- Page 61 and 62: Modelování geoprostorové báze d
- Page 63 and 64: Modelování geoprostorové báze d
- Page 65 and 66: Modelování geoprostorové báze d
- Page 67 and 68: Modelování geoprostorové báze d
- Page 69 and 70: Modelování geoprostorové báze d
- Page 71 and 72: Modelování geoprostorové báze d
- Page 73 and 74: Modelování geoprostorové báze d
- Page 75 and 76: Modelování geoprostorové báze d
- Page 77 and 78: Modelování geoprostorové báze d
- Page 79 and 80: Modelování geoprostorové báze d
- Page 81 and 82: Modelování geoprostorové báze d
- Page 83 and 84: Modelování geoprostorové báze d
- Page 85 and 86: Modelování geoprostorové báze d
- Page 87 and 88: Modelování geoprostorové báze d
- Page 89 and 90: Příloha A Operátory v Oracle Spa
- Page 91 and 92: Příloha B PL/SQL podprogramy v ba
- Page 93 and 94: Příloha B PL/SQL podprogramy v ba
- Page 95 and 96: Příloha D Ladící (tuning) podpr
- Page 97 and 98: Příloha E Utility v Oracle Spatia
- Page 99 and 100: Příloha F Analyzující podprogra
Modelování geoprostorové báze <strong>dat</strong> <strong>na</strong> úrovni <strong>dat</strong>ového <strong>modelu</strong> <strong>KN</strong><br />
4.6.2.1 Program RELtoOO.exe<br />
Účelem programu RELtoOO.exe je <strong>na</strong>číst soubor bodyNahr.txt s<br />
výsledkem dotazu <strong>na</strong> výběr úseků katastrální hranice popsaného<br />
v kapitole 4.4 a tyto úseky za sebou seřadit v protisměru chodu<br />
hodinových ručiček v pořadí, jaké odpovídá jejich skutečnému<br />
uspořádání v terénu. Z popisu a SQL zápisu dotazu je vidět, že jsou<br />
vybrány úseky vždy pro jedno konkrétní katastrální území.<br />
Po spuštění programu je uživatel vyzván k zadání kódu<br />
katastrálního území a identifikátoru hranice. Kód katastrálního území je<br />
de facto předurčen vybranými <strong>dat</strong>y. V rámci uživatelského komfortu by<br />
bylo možné přizpůsobit zdrojový kód výběrového dotazu a programu<br />
RELtoOO.exe způsobem, který by nepožadoval explicitní zadání hodnoty<br />
kódu katastrálního území. Stejně tak by šlo vhodným způsobem<br />
<strong>na</strong>programovat <strong>dat</strong>abázový trigger 24 , který by automaticky generoval a<br />
vkládal identifikátory (id) hranice do tabulky KATASTRALNI_HRANICE.<br />
Výstupem programu je textový soubor RELtoOO.sql, obsahující SQL<br />
příkaz INSERT, vkládající do tabulky KATASTRALNI_HRANICE potřebné<br />
údaje.<br />
Princip fungování programu RELtoOO.exe lze shrnout do<br />
následujících bodů:<br />
• Načtení vstupního souboru s identifikátory hraničních úseků a<br />
souřadnicemi bodů katastrální hranice do vhodné <strong>dat</strong>ové<br />
struktury. Název vstupního souboru a cesta k němu jsou<br />
implicitně dány zdrojovým kódem programu. Proto je třeba při<br />
ukládání výsledku dotazu dodržet umístění a název souboru<br />
požadovaných programem. Program prochází vstupní soubor, u<br />
každého úseku uloží jeho identifikátor společně s dvěma páry<br />
souřadnic (souřadnice počátečního a koncového bodu úseku) do<br />
proměnné typu usek. Typ usek a ukazatel pusek <strong>na</strong> tento typ<br />
jsem si definoval následujícím způsobem:<br />
TYPE<br />
pusek=^usek;<br />
//ukazatel <strong>na</strong> zaz<strong>na</strong>m typu usek<br />
usek = RECORD<br />
//definice zaz<strong>na</strong>mu typu usek<br />
id : REAL;<br />
//identifikator useku<br />
x1,y1, x2,y2 : REAL; //souradnice poc. a kon. bodu<br />
pred : pusek; //<strong>na</strong>sledujici zaz<strong>na</strong>m<br />
dalsi : pusek; //predchazejici zaz<strong>na</strong>m<br />
projito : BOOLEAN; //identifikator pridani useku<br />
END;<br />
Př. 14: Definice typu usek a ukazatele <strong>na</strong> tento typ pusek.<br />
24<br />
Triggery jsou programovým kódem, který se vykonává <strong>na</strong> základě určité operace –<br />
nejčastěji <strong>na</strong>d tabulkou či záz<strong>na</strong>mem.<br />
46