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

27.06.2015 Views

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

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!