EÖTVÖS LORÁND TUDOMÁNYEGYETEM INFORMATIKAI KAR PROGRAMOZÁSELMÉLET ÉS SZOFTVERTECHNOLÓGIAI TANSZÉK

Méret: px
Mutatás kezdődik a ... oldaltól:

Download "EÖTVÖS LORÁND TUDOMÁNYEGYETEM INFORMATIKAI KAR PROGRAMOZÁSELMÉLET ÉS SZOFTVERTECHNOLÓGIAI TANSZÉK"

Átírás

1 EÖTVÖS LORÁND TUDOMÁNYEGYETEM INFORMATIKAI KAR PROGRAMOZÁSELMÉLET ÉS SZOFTVERTECHNOLÓGIAI TANSZÉK Távérzékelt felvétel georeferáló programcsomag megvalósítása Témavezető: Giachetta Roberto egyetemi tanársegéd, ELTE IK PSZT Szerző: Fodor Krisztián programtervező informatikus Bsc, nappali tagozat Budapest, 2012

2 A projekt az Európai Unió támogatásával, az Európai Szociális Alap társfinanszírozásával valósul meg (a támogatás száma TÁMOP /B-09/1/KMR ).

3 Tartalomjegyzék 1 Bevezetés Elméleti háttér A georeferencia és a georeferálás Matematikai módszerek Az optimális másodfokú illeszkedés megállapítása Gauss elimináció Legkisebb négyzetes közelítés Chip Matching Bilineáris interpoláció Felhasználói dokumentáció Előfeltételek és a program telepítése Az indító képernyő Nyers formátum megnyitása GeoTIFF formátum megnyitása A Referenciapontok fül Kontrollpont manuális hozzáadása Automatizál kontrollpont keresés Georeferálás Gyorsbillentyűk Fejlesztői dokumentáció A fejlesztés folyamata Formátumok megvalósítása Georeferáló modul implementálása A felületet és a georeferáló modult összekötő köztes réteg A grafikus felület megalkotása

4 4.1.5 Tesztelési terv kivitelezése Technológiai háttér A.NET keretrendszer és a c# nyelv BIL, BIP, BSQ formátumok A GeoTIFF formátum Használati esetek Adatkezelés Referált kép betöltése Kontrollpontok hozzáadása Georeferálás Kilépés A rendszer felépítése A Georeferencer névtér A View névtér Implementációs megoldások BIL, BIP, BSQ beolvasása Memóriakezelés Tesztelés A használati esetek tesztelése Funkcionális tesztelés Teljesítményteszt Összegzés

5 1 Bevezetés A XXI. századra a nyomtatott információhordozók elkezdtek a háttérbe szorulni, melynek egyik leglátványosabb példája az e-book. Manapság már a legtöbb könyvnek megtalálhatjuk a digitális változatát is, de akár különféle újságokat is olvashatunk eszközeinken. Ez rendkívül kényelmes az olvasónak, hiszen gyorsabban és gyakran olcsóbban juthat hozzá a kiválasztott könyvekhez. Ugyanakkor vannak hátrányai is a digitális tartalmaknak. Megjelent jó néhány e-book formátum, amelyek legnagyobb problémája, hogy ezek megjelenítése között lehetnek eltérések. Elképzelhető tehát, hogy az egyik formátumban a regényünk 540 oldalas, míg a másikban már 570. Ugyanígy az is előfordulhat, hogy előbbinél a 3. fejezet az 50. oldalon, míg a másiknál a 61. oldalon kezdődik. Hasonlóképpen lehet megközelíteni a térképek és a térinformatikai felvételek mai helyzetét is. Hatalmas előnyt jelent, és nagyon kényelmes, hogy az interneten keresztül különféle adatbázisok tartalmát böngészhetjük, és szinte bármiről találhatunk felvételt. Ugyanakkor rengeteg formátum létezik, és a szabványok sincsenek megfelelően lefektetve. A formátumokon túl vannak egyéb és sokkal fontosabb eltérések is egyes felvételek között. Ilyenek például a különféle vetületi rendszerek vagy a kép egyes pontjainak térbeli koordinátákkal való megfeleltetése. Dolgozatom ez utóbbi problémával foglalkozik, és az úgynevezett georeferálást helyezi a középpontba; egy olyan eljárást, mely során a raszteres képformátumokat georeferenciával látjuk el. A georeferencia arra nyújt megoldást, hogy az egyes rögzített objektumok pontjaihoz koordinátákat rendelhessünk, és hogy ezeket milyen koordinátarendszerben kell értelmezni. Ezek ismeretében lehetőség van más rendszerbe is átírni a koordinátákat. A georeferálás meghatározó része a térinformatikának, hiszen ezen keresztül lehetőség nyílik különféle bemeneti adatok egységes kezelésére. E módszer segítségével képesek vagyunk olyan problémákat megoldani, mint például egy felvétel ellátása geokoordinátákkal egy másik már referált felvétel segítségével. A módszer komoly előnyt jelenthet földtudományi kutatásokban is. Érdemes itt megemlíteni azt a projektet, mely során Lázár térképét georeferálták sikerrel (lásd [1]). A Lázár térkép hazánk első ország-térképének tekinthető. A 16. század első feléből származik, és a kor eszközeihez képest meglepően pontos és méretarányos. Az eljárás 3

6 során közel 600 illesztési pontos adatbázist használtak fel. A koordináták maximum 200 méteres pontossággal bírnak. Polinomiális georeferálást alkalmaztak, és az eredmény meglepően jó illeszkedést mutatott a mai vetületi rendszerekkel. Az alábbi kísérlet főleg az eredménye miatt érdekes. A különböző időskálákon folyó kutatások egyik iránya a földtanilag rövid, történelmi időléptékű, néhány évszázados skálájú változások vizsgálata, amely így egyúttal a környezettörténeti kutatások részét is képezik. E vizsgálatokban alapvető fontosságúak az archív térképek. Mivel a Lázár-térkép műfajában az első és az azóta eltelt csaknem 500 év alatt a környezet különféle (természetes és mesterséges) változásokon ment át, a térkép alkalmas például arra, hogy megvizsgáljuk, vajon az ábrázolt vízrajznak a mai állapottól való eltérése eredhet-e valós folyamatokból. Dolgozatom során ismertetem az alapvető georeferáló eljárásokat, majd bemutatásra kerül néhány formátum és azok implementációja, végezetül pedig szemléltetem ezen ismertek felhasználásával készült georeferáló alkalmazásomat. A program.net keretrendszer segítségével, C# nyelven készült. A tervezés és fejlesztés során fontos szempont volt, hogy a formátumok, illetve a georeferáló modul úgy készüljön el, hogy azokat könnyedén integrálni lehessen az AEGIS térinformatikai rendszerbe (lásd [2]). Az AEGIS az ELTE Informatikai Karán jelenleg is fejlesztés alatt álló projekt. Célja egy egységes nyílt forrású informatikai keretrendszer létrehozása, amely átfogó térinformatikai funkcionalitást biztosít az adatok központi tárolása mellett. 4

7 2 Elméleti háttér Az alábbi fejezetben elsősorban az alkalmazás elkészítése során felhasznált módszerek elméleti hátterét ismertetem, azaz részletesebben bemutatom a georeferencia és a georeferálás kapcsolatát és fontosságát. Ezenfelül bemutatatásra kerülnek a programban alkalmazott különféle georeferáló módszerek és az ezekhez kapcsolódó matematikai háttér. 2.1 A georeferencia és a georeferálás A térinformatikán belül a georeferencia az a módszer, amely segítségével valamely térinformatikai rendszerben rögzített objektum egyes pontjaihoz koordinátákat rendelhetünk. Ez a módszer azért nagyon jelentős az informatika e területén, mert ez a kulcsa a különféle bemeneti adatok egységes térbeli kezelésének, a térbeli adatintegrációnak. Egy térkép georeferálása (1. ábra) azt jelenti, hogy a raszteres képformátumú állomány képpontjaihoz georeferenciát rendelünk. 1. ábra: Georeferálás 5

8 A raszteres képek képpontjainak kezdetben csak a síkkoordináta-rendszerben érvényes pixel-koordinátái vannak (a bal felső sarok a (0,0) koordináta). A georeferálás során alkalmas illesztési pontokat keresünk, úgynevezett GCP-ket (Ground Control Point). Ezeknek a pontoknak meg kell adnunk a pixel-koordinátát, illetve a térképi koordinátát (a megfelelő vetületi rendszerben). A referálás pontosságát és eredményességét nagyban befolyásolják a kontrollpontok. A pontok megválasztását végezhetjük manuálisan, de léteznek automatizált eljárások is. Az alkalmazásomban mindkét módra van lehetőség. Ezen eljárás segítségével képesek vagyunk részben megegyező térképeket referálni a már referált minta alapján. 2.2 Matematikai módszerek A programom elkészítése során néhány numerikus módszert alkalmazok a probléma megoldására, melyeket lentebb fogom ismertetni Az optimális másodfokú illeszkedés megállapítása Mivel a két felvétel koordinátáit meg kell feleltetni, egy másodfokú leképezést szükséges felírni, amely az egyik koordinátáit átképzi a másikba. Tegyük fel, hogy az illesztendő pontok száma n, és mivel a feladat felbontható X, illetve Y irányú illeszkedésre, ezért a pontok a következők: (u!, v! ),, (u!, u! ), a végpontok pedig: (x!, y! ),,(x!, y! ). Ez esetben felírhatóak az alábbi mátrixok: A = 1 u! v!! u!! v! u! v!, b = 1 u! v!! u!! v! u! v! z! z!, a = a! a! Ahol z = y vagy z = x. Továbbá megkaphatjuk az optimális paramétervektort, amely mellett a leképezést elvégezve a legjobb eredményt kapjuk az alábbi optimalizációs formulával: min A a b! 6

9 2.2.2 Gauss elimináció A fenti probléma megoldásához elengedhetetlen, hogy ismerjük az egyenletrendszerben az ismeretleneket. Ezek meghatározása Gauss eliminációval történik. Az egyenletek ismeretleneinek meghatározásához ez az eljárás implementációs szempontból is jó választás, hiszen könnyen megvalósítható Legkisebb négyzetes közelítés A kontrollpontokat alapul véve meghatározható az optimális másodfokú közelítés. Ha adott (u!", u!" ), akkor az ehhez tartozó f!, f! másodfokú polinomot keressük. A cél az, hogy a kontrollpont és a polinom eltérés a lehető legkisebb legyen. A minimális másodfokú hibát az eltérés adja:!!!! F! u!, v! x!! + F! u!, v! y!! Chip Matching Abban az esetben, ha nem definiálhatóak kontrollpontok, de létezik már georeferált felvétel, amely egészében vagy részben lefedi a georeferálandó képet, akkor lehetőségünk van automatikus kontrollpont detektálásra mintaillesztéssel (Chip Matching) (2. ábra). Az Euklideszi norma segítségével vizsgáljuk az adott chip illeszkedésének mértékét az aktuális tartalommal. Az eltérés mértékét az alábbi formula adja meg, melyet minden pontra ki kell számolni:!!!! M P, I, y, x =!!!!!! P i, j I(y + i, x + j)!! Végül ezek közül megkeressük a minimálisat: H H I P min y= 0 1 W W I P min x= 0 1 M(P, I, y, x) Az ennek eredményéül kapott pontra fogjuk az illesztést elvégezni. 7

10 georeferált kép (minta) Chipek georeferálandó kép illesztés 2. ábra: Chip illesztés Az illesztésnek több módja is lehetséges (globális, adott régióban). Az adott régióban történő illesztés lényege, hogy nem szükséges az egész képre lefuttatni a vizsgált chipet, csak azon a területen, ahol a legvalószínűbb az előfordulása. Ebből fakadóan lényegesen hatékonyabb a globális illesztésnél. A programomban a régiós illesztést valósítottam meg Bilineáris interpoláció Miután meghatároztuk az optimális másodfokú leképezést, a felvételt még át kell transzformálni az egyik képi koordináta-rendszerből a másikba. Ehhez ki kell számítanunk négy pont megfelelő leképezését, majd ezután interpoláció segítségével meg kell határozni az összes többi pont megfelelőjét. Az egyváltozós lineáris interpoláció két dimenzióra való kiterjesztése a bilineáris interpoláció (lásd [3]). A lényege, hogy először az egyik, majd utána a másik irányba kell elvégezni egy-egy lineáris interpolációt (3. ábra). 8

11 3. ábra: Bilineáris interpoláció szemléltetése Az optimális transzformáció a következőképpen írható le, ahol 𝑓 az optimális transzformáció: Keresett pont: 𝑃 = (𝑥, 𝑦) Ismert pontok: 𝑄!! = 𝑓 𝑥!, 𝑦!, 𝑄!" = 𝑓 𝑥!, 𝑦!, 𝑄!" = 𝑓 𝑥!, 𝑦!, 𝑄!! = 𝑓 𝑥!, 𝑦! Az interpolációt először x irányába hajtjuk végre, majd y irányába. Így megkapjuk a kívánt 𝑓(𝑥, 𝑦)-t. A felhasznált formula: 𝑓 𝑄!! 𝑥! 𝑥 𝑦! 𝑦 𝑥! 𝑥! 𝑦! 𝑦! 𝑓 𝑄!" + 𝑥 𝑥! 𝑦! 𝑦 𝑥! 𝑥! 𝑦! 𝑦! 𝑓 𝑄!" + 𝑥! 𝑥 𝑦 𝑦! 𝑥! 𝑥! 𝑦! 𝑦! 𝑓 𝑄!! + 𝑥 𝑥! 𝑦 𝑦! 𝑥! 𝑥! 𝑦! 𝑦! 𝑓 𝑥, 𝑦 = 9

12 3 Felhasználói dokumentáció A felhasználó dokumentáció első részében a program telepítését, valamint ennek előfeltételeit ismertetem. Ezek után bemutatom a program felületét ábrák segítségével (előnézeti, pontilletési, georeferáló panel), valamint ismertetem a funkcionalitásokat. 3.1 Előfeltételek és a program telepítése Az alkalmazás telepítéséhez, illetve annak hibamentes futtatásához szükséges szoftveres és hardveres követelményei a következők: Minimum konfiguráció: 1.7 GHz-es processzor 1 GB memória 20 MB merevlemez tárhely Windows XP vagy újabb operációs rendszer.net 3.5 (Mono ) vagy újabb keretrendszer Ajánlott konfiguráció: 2.3 GHz-es processzor 2 GB (vagy több) memória Windows 7 operációs rendszer.net 3.5 vagy újabb keretrendszer 1024x786-as képernyőfelbontás A program használata során a felhasználónak szüksége lesz a GeoTIFF, BIL, BIP, BSQ formátumok valamelyikére. Az alábbi formátumok méretei a néhány MB-tól egészen a több GB-ig terjedhetnek. Ezeknek a fájloknak a merevlemezen foglalt tárhelyigénye nincs belekalkulálva a fenti specifikációba. Megjegyzendő, hogy a felvétel méretének növekedésével egyenes arányosan nő a műveletigény is, illetve a beolvasni kívánt képet el kell, hogy tudjuk tárolni a memóriában. A program telepítéséhez a setup.exe állományt kell futtatni. Az indítás után egy telepítő varázsló jelenik meg. Az instrukciókat követve néhány lépésben települ a 10

13 program. Abban az esetben, ha a számítógépünkön nem található meg a.net környezet 3.5-ös vagy újabb változata, akkor a telepítő felajánlja annak automatikus telepítését is egyúttal (aktív internetkapcsolat szükséges, és a folyamat végén újraindítás szükséges). Ha hiba lépne fel, és a telepítő nem képes önmagától feltelepíteni a keretrendszert, akkor ezt a felhasználó is megteheti. Ehhez el kell látogatni a [4]-ben található oldalra, ahonnan letölthető a szükséges.net verzió. A keretrendszer telepítése után a setup.exe ismételt futtatásával folytathatjuk a telepítést. A telepítés sikeres befejezése után az általunk megadott könyvtárban lévő Georeferencing.exe futtatásával indíthatjuk el a programot. 3.2 Az indító képernyő Miután elindítjuk az alkalmazást, a 4. ábrán látható kép fogad bennünket. A felület magyar nyelven kommunikál a felhasználóval, és a felület nem átméretezhető. Az ablakban legfölül megtalálunk egy információs sávot, ami a könnyebb kezelhetőséget hivatott szolgálni, középen található a felület lényegi része, ami ebben a pillanatban még üres, illetve legalul egy információs sávot láthatunk, amin keresztül kommunikál a program a felhasználóval. 4. ábra: Az alkalmazás kezdőképernyője 11

14 A menüsorban két elemet találunk; Fájl, valamint Georeferálás. Előbbiben a következő műveletek érhetőek el: felvételek megnyitása, georeferált kép mentése, alkalmazás bezárása. Az indulást követően csak a Megnyitás és a Kilépés menüpontok elérhetőek. A mentés gomb csak azután válik elérhetővé, miután megnyitottunk egy GeoTIFF állományt. Jelenleg csak a tiff formátum mentése elérhető. A Georeferálás menüpont alatt megtaláljuk az összes georeferáláshoz szükséges műveletet, melyek inaktívak egészen addig, ameddig nem olvasunk be egy alkalmas GeoTIFF fájlt: felvétel georeferálása, sarkpontok manuális megadása, referencia kép betöltése. Ahhoz, hogy georeferálást indíthassunk, szükség van egy referált felvételre, egy felvételre, amit referálni szeretnénk, valamint helyes kontrollpontokra. Az alkalmazás két formátumcsoportot különböztet meg: Nyers képi formátum: BIL, BIP, BSQ (Raw Image) GeoTIFF A program nem engedi az ezektől eltérő formátumok megnyitását. Ha a megnyitott állomány sérült, vagy valamely egyéb oknál fogva nem lehet olvasni, akkor a felhasználó erről hibaüzenet formájában kap értesítést. A felület központ része három nagy részre bontható. Az Előnézet fülön a megnyitott felvételt teljes méretében tekinthetjük meg. A középső Referencia pontok fülön állíthatjuk be a referálás paramétereit, illetve adhatjuk meg a kontrollpontokat. A harmadik Georeferálás fülön tekinthetjük meg a georeferálás eredményét. 12

15 3.2.1 Nyers formátum megnyitása Abban az esetben, ha ilyen felvételt szeretnénk megnyitni, akkor a következő ablak fog minket fogadni (5. ábra). Ezeknek a formátumoknak van egy úgynevezett header fájlja, amiben megtalálhatóak a képre vonatkozó adatok. Ugyanakkor sajnálatos módon a fájl tartalma nem szabványosított, tehát a felhasználónak kell ezt bevinni a felületen keresztül. A mezőkbe nem vihető be hibás formátumú adat, de a szemantika helyesség a felhasználó felelőssége. 5. ábra: BIL, BIP, BSQ formátumok adatainak megadása GeoTIFF formátum megnyitása Az alkalmazás által kezelt formátumok közül csak ez alkalmas a georeferálásra. Az eljárás szempontjából elengedhetetlen, hogy ismerjük a referálásra szánt kép sarokpontjaink a térbeli koordinátáit a megfelelő vetületi rendszerben. Ezek hiányában csak megtekinteni tudjuk a képet. Ezeket kétféleképpen adhatjuk meg az alkalmazásnak. Az egyik a kényelmet szolgáló megoldás, hogy az állomány nevével megegyező szöveges leíróban tároljuk (txt kiterjesztéssel). A leíró fájl felépítése: Row X Ref. Y Ref UL <bal felső X koordináta> <bal felső Y koordináta> UR <jobb felső X koordináta> < jobb felső Y koordináta> LL <bal alsó X koordináta> <bal alsó Y koordináta> 13

16 LR < jobb alsó X koordináta> < jobb alsó Y koordináta> Ha felvételhez nem létezik, vagy hibás a leíró, akkor a program jelzi ezt a felhasználó felé. Ebben az esetben lehetőség van manuális sarokpont hozzáadásra. Ezt a Georeferálás menü alatt található Sarokpontok megadása funkcióval (6. ábra) tehetjük meg. Az adatok formátuma ellenőrzésre kerül, de azok helyességéről a felhasználónak kell gondoskodnia. 6. ábra: Sarokpontok megadása ablak 3.3 A Referenciapontok fül E fül alatt van lehetőségünk hozzáadni, illetve módosítani a kontrollpontokat. Ez a művelet elengedhetetlen a georeferálás szempontjából. Három jól különálló részre bonthatjuk ezt a részét a felületnek (7. ábra): pontok hozzáadása, referencia kép előnézete, a georeferálni kívánt kép előnézete. 14

17 Ez a felület csak GeoTIFF állomány esetén használható. Miután beolvastunk egy megfelelő fájlt, annak tartalma megjelenik a Referálandó kép pont alatt. Miután ezzel a művelettel végeztünk, és fájlból vagy manuálisan megadtuk a célfelvétel sarokkoordinátáit, akkor a program engedélyezi a referencia kép betöltését, ami szintén megjelenik az ablakban. Erre két helyen van módunk, a menüsorban Georeferálás > Referencia kép betöltése, valamint a felületen elhelyezett gomb segítségével. Ekkor az alkalmazás elvégzi az előzetes transzformációkat a két felvétel alapján, aminek eredménye azonnal megjelenik. Ezen a ponton már lehetőségünk van referencia pontok hozzáadására is. 7. ábra: Kontrollpont kezelő ablak Referencia pontok hozzáadására a program két megoldást biztosít: Manuális pont hozzáadás, Chipek illesztése alapján automatikus pontkeresés. Ezek együttes használata nincs kizárva, ugyanakkor külön-külön is megállják a helyüket. 15

18 3.3.1 Kontrollpont manuális hozzáadása Ha koordinátát manuálisan szeretnénk hozzáadni, akkor ezt megtehetjük a Manuális pont hozzáadás fül alatt, de szükséges, hogy előtte megnyissunk egy felvételt. Ez esetben ki kell jelölni a referálandó felvételen egy pontot a képre kattintva. Ezt a program fekete ponttal jelöli meg. Ezután meg kell adnunk a képi, illetve a térbeli koordinátákat és a Hozzáadás gombbal felvehetjük új referencia pontként. A bevitt adatok formátuma ellenőrzésre kerül, és hiba esetén pontos hibajelzést ad. Ha a hozzáadás sikeres volt, akkor erről az információs sávban visszaigazolást kapunk, valamint megjelenik a pontlista tetején. Lehetőségünk van a felvett pontok listáját szerkeszteni. Nincs más dolgunk, mint kijelölni a kívánt pontot és az Eltávolít gombbal törölhetjük. A teljes listát is kiüríthetjük a Kiürít gombbal. Fontos, hogy az utóbbi két művelet nem visszavonható Automatizál kontrollpont keresés Az alkalmazás lehetőséget biztosít arra, hogy egy úgynevezett Chip illesztési eljárással felderítse a lehetséges kontrollpontokat. Az említett funkciót a Chip illesztés fülön találjuk (8. ábra) 8. ábra: A Chip illesztő eljárás működés közben 16

19 Ehhez az eljáráshoz fontos, hogy mind a referált, mind a georeferálandó felvétel meg legyen nyitva. Ebben az esetben aktívvá válik a Chipek betöltése gomb. Ha a program elvégezte az előzetes számításokat, akkor elérhetővé válik a Chipek illesztése opció. A gombra kattintva elindul az illesztő eljárás. Az éppen feldolgozás alatt álló chip megjelenik a felületen, valamint a georeferálásra szánt felvételen fekete keret jelöli annak valós helyét. A művelet pillanatnyi állapotát nyomon követhetjük az infósávban található állapotjelzővel Georeferálás Ha a program számára elérhető a két szükséges felvétel, valamint adottak a szükséges koordináták, akkor elérhetővé válik a georeferálás művelet. A funkció a menüsor Georeferálás menüpontja alatt érhető el. Ha folyamat közben hibát jelez a program, akkor nagy valószínűséggel hibás koordinátákat adtunk meg. A referálás eredménye megtekinthető a központi panel utolsó füle alatt (9. ábra). Ha szeretnénk, akkor lehetőség van most készült felvétel elmentésére. Az alkalmazás jelenleg tif kiterjesztésbe képes menteni a végeredményt. 9. ábra: A georeferálás eredményét megjelenítő felület. 17

20 3.3.4 Gyorsbillentyűk A program lehetővé teszi a fontosabb funkció gyorsbillentyűkkel való elérését, a könnyebb használat érdekében. Fájl megnyitása: Ctrl + O Alkalmazás bezárása: Ctrl + Q Referencia kép betöltése: Ctrl + R Mentés: Ctrl + S 18

21 4 Fejlesztői dokumentáció A fejlesztés célja egy olyan grafikus felületű alkalmazás megvalósítása volt, amelynek segítségével különösebb elméleti tudás nélkül lehet gyorsan és könnyedén felvételeket georeferálni. Ehhez meg kellett teremteni az előfeltételeket, azaz megvalósítani az erre alkalmas formátum kezelését. A tervezés során törekedtem olyan kontrollpont rendszer felállítására, amellyel előismeret nélkül is lehetőséget tudok biztosítani a program helyes használatára (Chip Matching). Azonban ha igazán pontos és valóban helyes eredményt szeretnék kapni a georeferálás során, akkor fontos, hogy valóban helyes és megerősített adatokkal dolgozzunk, és erre a legmegfelelőbb módszer a manuális pontillesztés. Egy olyan rendszer kialakítása, amely képes létező adatbázisokból adatot gyűjteni vagy azokat ellenőrizni, olyan problémakör, amely túlmutat a jelen dolgozat keretein. Grafikus alkalmazásról lévén szó, fontos volt a jó kezelőfelület kialakítása és annak egyszerű használatára, valamint olyan programszerkezet kialakítása, amely magas hibatűrő képességekkel rendelkezik. Az implementáció során törekedtem arra, hogy jól olvasható kódot írjak, és az általam kialakított kódolási konvenciókat betartsam. 4.1 A fejlesztés folyamata Az alkalmazás tervezése során az alapvető funkcionalitásokon túl, a fejlesztés menetét is meghatároztam mérföldkövek formájában, és ezeket sorban megvalósítva érte el a program a mostani formáját. Lentebb ismertetem a fejlesztés legmeghatározóbb mérföldköveit. Azonban mielőtt nekikezdhettem volna a fejlesztésnek, szükséges volt a megfelelő fejlesztői környezet kialakítása. Ezenkívül be kellett szereznem a program bemenetéül szolgáló felvételeket, amelyek mind a fejlesztés, mind a tesztelés során elengedhetetlenek voltak. Mivel a készülő program alapjául a.net keretrendszert választottam, ezért első lépésben ennek installálására került sor Ezt követően az általam választott fejlesztői környezet került telepítésre, amely esetemben a Microsoft Visual Studio 2010 volt. Legvégül a tesztelést nagyban elősegítő eszköz a dottrace (lásd [5]) 19

22 teljesítménytesztelő alkalmazást telepítettem. Ezzel a fejlesztéshez szükséges környezet kialakítása lezárult Formátumok megvalósítása Az első mérföldkő a formátumok implementálása volt. A GeoTIFF, valamint a nyers formátumok megvalósítása kritikus volt a későbbi implementáció szempontjából. Legfontosabb célkitűzés a hatékony implementáció volt, hiszen a később elkészítésre kerülő programkomponensek ezekre fognak támaszkodni. Ez a mérföldkő két lényeges részre bontható, azaz a formátumok (szám szerint négy) specifikációjának megértésére, és ez alapján a beolvasásra, és a GeoTIFF esetében a kiíratás megvalósítására; valamint a hatékony, tárolásra alkalmas adatszerkezet megválasztására, és a használatot elősegítő eljárások implementálására. A megvalósításban segítséget nyújtottak a [6]-ban található minta kódrészletek Georeferáló modul implementálása A dolgozatom központi témája lényegében a második - és egyben a legtöbb időt és felkészülést igénylő - mérföldkő alatt valósult meg. A kivitelezés közben végig törekedtem arra, hogy a georeferáló modul könnyedén integrálható legyen más környezetbe. A fejlesztés e fázisa a referáláshoz elengedhetetlen eljárások megvalósítását öleli fel. A második mérföldkő lezárásával lényegében minden szükséges funkcionalitás megvalósult, ami szükséges egy felvétel megnyitásához és annak georeferálásához A felületet és a georeferáló modult összekötő köztes réteg A harmadik nagyobb mérföldkőnek a grafikusfelület és a georeferáló modul között elhelyezkedő réteg megalkotását tekintem. A tervezés során fontosnak tartottam, hogy minél jobban elkülönítsem a grafikus felületet a logikai részektől, és a köztes réteg is ezt hivatott elősegíteni, ezzel is előkészítve azt, hogy a következő lépésben rákerülhessen az alkalmazásra a felület. 20

23 4.1.4 A grafikus felület megalkotása A negyedik egy meghatározó mérföldkő volt, hiszen a fejlesztés során ez volt a leglátványosabb fejlődés. Az implementációs és a tervezési döntéseknek hála a funkcionalitások felületbe való ágyazása igen könnyedén megvalósítható volt. Néhány kivételtől eltekintve nem kellet módosítani a már kész forrást, ahol mégis, azt a köztes réteg miatt könnyen lehetett eszközölni. Ebben a fázisban kellett meghozni a felületre vonatkozó meghatározó döntéseket, melyek a kezelhetőséget és a felhasználó élményt hivatottak szolgálni. A grafikus felület felépítésében nagy segítséget jelentett a Visual Studio felülettervező eszköze és az előre elkészített felületi elemek. A negyedik mérföldkő teljesítésére a program elnyerte közel végleges formáját, és elkezdődhetett a mindent felölelő rendszertesztelés kivitelezése Tesztelési terv kivitelezése Utolsó lépésként az alkalmazás tesztelésére került sor. Habár minden egyes mérföldkő után alapos tesztelésnek vetettem alá az alkalmazás új komponenseit, a teljes rendszertesztek elengedhetetlenek voltak. Különösen nagy hangsúlyt fektettem az illesztési pontokra a fehérdoboz tesztelés segítségével. Ezt követően a stressz tesztek kerültek elvégzésre, melyek rávilágítottak a program szűk keresztmetszeteire, és fény derült néhány szélsőséges hibára. A tesztek során felmerült hibákat kijavítottam, illetve a kétséges implementációs megfontolásokat újragondoltam, és módosításokat eszközöltem. Ezután a problémás területek részletes újratesztelése következett. Legvégül a felület tesztelése maradt a fekete doboz módszer alapján. Ez a fázis nem csak az esetleges hátra maradt hibák felfedezését szolgálta, hanem a felület használhatóságát is vizsgálta. 21

24 4.2 Technológiai háttér A.NET keretrendszer és a c# nyelv A.NET keretrendszer fejlesztését a Microsoft azzal a céllal kezdte el, hogy vetélytársat és megfelelő alternatívát állítson a Java mellé, aki akkoriban még töretlen sikernek örvendett a könnyű megtanulhatósága és platformfüggetlenségének köszönhetően. A.NET célja az volt, hogy megtervezzenek és kivitelezzenek egy olyan egységes, futás idejű fordítási környezetet, amely a Microsoft már meglévő nyelveire támaszkodik. A.NET 1.0-át 2002-ben adja ki a cég, de nem hozza meg a várt áttörést, csak ben a 2.0-ás verzióval. Ez a változat már komoly versenytársa lesz a Java platformnak. A későbbiekben még sok egyéb hasznos funkcionalitással bővül a keretrendszer eszköztára (10. ábra), ilyen például a webes platformot erősítő ASP vagy a WinForms utódjának szánt WPF, a LINQ, amely bevezette funkcionális nyelvek támogatását, valamint ADO.NET ami az adatbázis kezelés területén hozott újdonságokat, illetve a 4.0-val előtérbe helyezték a párhuzamosítást. 10. ábra: A.NET keretrendszer verziói 22

25 Jelen pillanatban közel 50 nyelvnek biztosít támogatást a.net keretrendszer. Ezek közül fontos kiemelni a C#-ot (lásd [7]), hiszen ezt tekinthető a.net saját programozási nyelvének. Története összeforrt a.net-ével, nem véletlenül. A C# teljes egészében a.net környezetre támaszkodik és kihasználja annak sajátosságait. A keretrendszer és a nyelv kölcsönösen segítették egymás elterjedését. A C# megalkotásakor sokat merítettek a Java-ból, ebből kifolyólag rengeteg párhuzam fedezhető fel köztük, ezen kívül a C++ kézjegyeit is megtalálhatjuk benne. Ismervén a nyelveket, amelyek inspirálták, nem meglepő, hogy teljes mértékben objektumorientált nyelvvel állunk szemben. Ahogy már fentebb említettem, teljes eszköztárát a.net-ből meríti, ez jelenti legnagyobb előnyét és hátrányát is. Rendkívül nagy előnyt jelent, hogy gyors fejlesztést tesz lehetővé a programozó számára. A nyelvben egy úgynevezett szemétgyűjtő (Garbage Collector) eljárás gondoskodik az objektumok felszabadításokról. Ez jelenti a másik nagy előnyt, hiszen nem kell foglalkozni a felszabadítás problémájával (ellentétben a C++ esetén, ami destruktort használ erre a célra), és így elkerülhetjük a hibákból fakadó memóriaszivárgásokat. Ugyanakkor ez az automatizált felszabadítási eljárás nagyban megnöveli az erőforrásigényt, ezzel szembeállítva az emberi, illetve a számítógépes erőforrások értékét BIL, BIP, BSQ formátumok A BIL, BIP, valamint a BSQ raszteres formátumok (lásd [8]) nevüket a rétegek elrendezéséről kapták (11. ábra): Band Interleaved by Line (BIL), Band Interleaved by Pixel (BIP), Band Sequential (BSQ). A három formátum lényegében csak az elrendezéstől tér el, és nélkülözi bármiféle tömörítés használatát, ezzel megkönnyítve a beolvasás implementációját. Ugyanakkor a tömörítés hiányával méretnövekedés is együtt jár, ezért nem ritkák a több GB-os fájlméretek ennél a típusnál. Fontos, hogy a formátum nem tárol térbeli információkat a felvételről, tehát ebből kifolyólag ezek a képek alkalmatlanok georeferálásra. 23

26 11. ábra: Egyes formátumok rétegtárolási megoldásai Egyszerűnek és kellően szabad formátumnak tekinthető, és ez jelenti az előnyét és egyben hátrányát is. A képi adatokat tartalmazó fájlon kívül szokás csatolni egy azzal nevében azonos.hdr kiterjesztésű leírót (header file) is, ami tartalmazza a kép legfontosabb tulajdonságait, amely nélkül nem lehet elvégezni a beolvasást. Fentebb azért írtam, hogy szokás csatolni, mert a formátum leírója körül eléggé kaotikus a helyzet. Már a megadása sem kötelező, bár ilyenkor problémás lehet a felvétel megnyitása. A kiterjesztés is teljesen szabad, és ami a legkellemetlenebb, hogy a fájl tartalma is felvételenként változhat. Összességében semmilyen kikötést nem tartalmaz a szabvány a leíróra vonatkozóan néhány konvenciótól eltekintve. Továbbá mellékelhetünk statisztikai adatokat tartalmazó (.stx), illetve színeket leíró (.clr) opcionális fájlokat. A felvétel olvasásának szempontjából elengedhetetlen információk: 24

27 nrows: egy réteg magassága képpontban, ncols: egy réteg szélességes képpontban, nbands: a fájlban megtalálható rétegek száma, nbits: bitmélység (bit/pixel). Ezeket az információkat a leírófájlnak kell tartalmazni valamilyen formában. A felsorolt adatok viszonyára kiváló példa a 12. ábra. 12. ábra: Egy réteg felépítése BIL formátum esetén A GeoTIFF formátum A TIFF (Tagged-Image File Format) formátumot (lásd [9]) az Aldus cég dolgozta ki a nyolcvanas évek végén, amelynek fejlesztését később az Adobe vette át. Jelenleg az 1992-ben kiadott 6-os verziónál tart. Érdemes megjegyezni, hogy a specifikáció nyilvános, azaz bárki szabadon készíthet TIFF olvasó vagy író programot. Az 13. ábrán látható a formátum szerkezete. A fájl elején található egy fejelem (header), ebben alapvető információkat tudhatunk. Ilyen például a bájtok tárolási sorrendje vagy az Image File Directory (későbbiekben: IFD) kezdőcíme. Az IFD lényegében egy kulcs-érték párokat tartalmazó felsorolás, melynek elemei a képre vonatkozó információkat tartalmaznak (pl.: szélesség, magasság, létrehozás dátuma, stb.). Egy fájl tartalmazhat több IFD-t is, és a fájlon belül sincs megkötve a helyük. Azonban van egy megkötés, hogy a fájlnak legalább egy IFD-t kell tartalmaznia, és az IFD-nek legalább egy eleme (Entry) kell, hogy legyen. Az IFD elemek 12 bájton tárolódnak, és a felépítésük a következő: 0-1 bájt mezőazonosító címe, 2-3 bájt mezőtípus, melynek értékei a következők lehetnek: 1 = byte 25

28 2 = ascii 3 = short 4 = long 5 = rational 12 = double 4-7 bájt az értékek száma, 8-11 bájt a tag kezdőcíme. 13. ábra: A TIFF formátum szerkezete 26

29 Az ismertetett struktúra igen rugalmas, hiszen a tag-ek száma szabadon bővíthető, így lényegében bármilyen információt képes hordozni a kép. A nyers képi formátumokkal ellentétben a TIFF támogat tömörítő eljárásokat. A legismertebbek: PackBits Huffman LZW Ezek nehezítik a formátum implementációját, ugyanakkor nagyban csökkentik a fájlméretet. A GeoTIFF (lásd [10]) fejlesztését a 90-es évek elején kezdte meg az Intergraphnál. A céljuk az volt, hogy a már meglévő és bevált TIFF formátumot kibővítsék oly módon, hogy az képes legyen a georeferencia, metaadatok, stb. átvitelére. A választás logikus volt, hiszen a TIFF ereje ebben rejlik, hogy dinamikusan lehet bővíteni az IFDket. Azonban a földrajzi vonatkozásoknál előfordulhatnak óriási mennyiségű paraméterek is, nem lett volna célszerű a sok privát címke szabványosítva. Ezzel két nagyobb probléma léphetett volna fel. Az első, hogy nagymértékben csökkentek volna a szabad hozzáadható címkenevek, illetve a sokkal lényegesebb probléma az olvasók szempontjából jelentkezett volna. A GeoTIFF-eket az egyszerű TIFF olvasók is képesek olvasni, és ezek a GeoTIFF specifikáció ismeretének hiányában nem lennének képesek felismerni a speciális tag-eket. Ez hibához vagy legalábbis felesleges lassuláshoz vezetett volna. A megoldás végül az lett, hogy egy privát címkével azonosított kulcsokat használ a formátum, a kulcsokat a GeoKeyDirectoryTag alatt érhetjük el. Tehát végeredményben a GeoTIFF csak egy speciális címkével kiegészített TIFF kép. 4.3 Használati esetek A program futása során több használati esetet különböztethetünk meg (14. ábra), ezeket az alábbiakban vázlatosan, majd később részletesen ismertetem. Adatkezelés 27

30 GeoTIFF betöltése Nyers formátum betöltése Adattörlés Adatmentés Sarokpontok felvétele Felvétel adatainak megadása Referált kép betöltése Kontrollpontok hozzáadása Manuális pont hozzáadás Pont törlés Összes pont törlése Chip illesztés Chipek betöltése Chipek illesztése Georeferálás Eredmény megtekintése Eredmény mentése Kilépés Adatkezelés A Fájl menüpontból elérhető tevékenységeket foglal magában. Alapvetően két formátumcsoport különböztethető meg a beolvasáskor, a Raw image, valamint a GeoTIFF típusok. Ha egy nyers képi formátumot olvasunk be, akkor elengedhetetlen, hogy megadjuk a szükséges képi paramétereket. GeoTIFF esetében módosíthatjuk vagy megadhatjuk a sarokpontokat. A programfutás bármely szakaszában lehetőségünk van új felvétel beolvasására, de ebben az esetben alaphelyzetbe áll a folyamat. A fejlesztés jelen állapotában a GeoTIFF formátumok mentésére van lehetőségünk Referált kép betöltése Ez a funkció csak akkor válik elérhetővé, ha GeoTIFF fájllal dolgozunk. Miután megnyitottunk egy alkalmas fájlt, a program automatikusan elvégzi a szükséges előzetes transzformációkat. 28

31 uc Georeferencing Georeferálás Adatkezelés «extend» Adatbetöltés «extend» GeoTIFF betöltés Sarokpontok felvétele «extend» «extend» «extend» «extend» Adattörlés Nyers formátum betöltés «invokes» Felv étel adatainak megadása Referált kép betöltése Adatmentés Pont hozzáadás «invokes» Manuális pont hozzáadás «extend» Pont törlés Felhasználó Kontrollpontok hozzáadása «extend» «extend» Chip illesztés «extend» Összes pont törlése «invokes» Georeferálás «invokes» Eredmény megtekintése «invokes» Chipek betöltése «extend» Eredmény mentése Chipek illesztése Kilépés 14. ábra: Használati esetek Kontrollpontok hozzáadása Ahhoz, hogy az alkalmazás helyes eredményeket tudjon generálni, elengedhetetlenek a megfelelő mennyiségű és minőségű referenciapontok. Ezek megadására lehetőségünk van manuális, valamint automatizált eljárás segítségével. Manuális hozzáadás esetén a pontok hozzáadásán kívül lehetőség van azok eltávolítására, valamint a teljes lista ürítésére is. Az automatizált folyamat során az úgynevezett Chip Matching eljárást használja, amely során a két felvétel között egyezéseket keres, és így határoz meg lehetséges kontrollpontokat. A Chipek betöltésére, valamint az illesztési folyamat elindítására a felületen elhelyezett gombok segítségével van lehetőség. 29

32 4.3.4 Georeferálás Georeferálásra szigorúan csak abban az esetben kerülhet sor, ha megadtuk a cél, illetve a referált felvételt, és a kontrollpontok hozzáadása is megtörtént. Ha az előfeltételek teljesültek, akkor a Georeferálás menüből elindíthatjuk a referáló eljárást. Ha a folyamat sikeresen lezárult, a program automatikusan az eredményt tartalmazó ablakba továbbít minket. Ezt követően lehetőségünk van elmenteni a georeferált felvételt. Új georeferálási folyamatot indíthatunk, ha megnyitunk egy új képet, de ekkor az előző referálásból származó információk elvesznek Kilépés A programot bezárhatjuk a főablak menüjéből vagy a teljes ablak bezárásával. A szándék megerősítést követően a program leáll. A nem mentett információk elvesznek a kilépést követően. 4.4 A rendszer felépítése A rendszer alapvetően a modell/nézet (Model/View, MV) architektúrának megfelelően lett kialakítva. Ennek köszönhetően a megjelenés és a működés jól szétválasztható. Annak érdekében, hogy ezt a kód is jól tükrözze, ezek a funkcionalitások két különálló névtérben (namespace) kaptak helyet. A megjelenítés elemei a Thesis.View névtér alá kerültek. A logikai komponensek pedig a Thesis.Georeferencer névtérben találhatók meg, amely az MV struktúra Model részének feleltethető meg. A 15. ábrán az alkalmazás logikai felépítése látható. Az alkalmazásban megvalósított formátumok a Thesis.Georeferencer.IO névtérben találhatók meg, amely szintén a strukturáltságot hivatott elősegíteni. 30

33 15. ábra: Az alkalmazás névtereinek felépítése A Georeferencer névtér A Georeferencer névtérben találhatóak az alkalmazás belső működéséért felelős osztályok, valamint az alkalmazás által használt formátumok, illetve az ezeket olvasó és író osztályok. A névtéren belüli kapcsolatokat a 16. ábra szemlélteti. Az IO.Enums névtérben kaptak helyet a formátumokhoz szükséges felsoroló típusok, valamint a Coordinate struktúra, amelyek a 17. ábrán láthatóak. Azért döntöttem a Coordinate típus esetében a struktúra és nem az osztály mellett, mert a C# nyelvben ezek között van egy komoly különbség. A class egy referencia típus, míg a struct egy érték típus, azaz két különböző struktúra lehet azonos, ha adattagjai 31

34 megegyeznek (esetünkben az x, és az y koordináták), ellentétben egy osztállyal. A struktúra e tulajdonságát a program során többször is kihasználom, ahol egy pont létezését vizsgálom. class Georeferencer ImageHandler IO:RawImage IO:RawImageType IO:GeoTiffReader IO:GeoTiffWriter -_Reader -_GeoTiffField -_Writer IO:CompressionType GeoTiffField IO:ByteEncoding ImageGeoreferencer -_Georeferencer +ReferenceImage +TargetImage IO:GeoTiff IO:ProjectionModelType IO:Coordinate IO:RasterSpaceType IO:GeoTaggedImageOpenMode 16. ábra: A Georeferencer névtér osztálykapcsolatai A felsoroló típusok az egységes felépítést, valamint a jobb áttekinthetőséget szolgálják. A ByteEncoding a kódolási módot hivatott reprezentálni. A GeoTIFF leggyakoribb tömörítési eljárásait a CompressionType foglalja magában. A GeoTaggedImageOpenMode felsorolóval a GeoTIFF formátumok megnyitásakor megadhatjuk, hogy ki szeretnénk-e olvasni a geokulcsokat. Az egyes projekciós modellek a ProjectionModelType-ban kaptak helyet. A RasterSpaceType a rasztertér típusait tartalmazza. 32

35 class Enums «enumeratio... Enums:: ByteEncoding «enumeratio... Enums:: CompressionType «enumeration» Enums:: GeoTaggedImageOpenMode «enumeration» Enums:: ProjectionModelType Standard Reverse None Huffman PackBits Other ReadGeoKeys SkipGeoKeys Undefined Projected Geographic Geocentric UserDefined «enumeration» Enums:: RasterSpaceType RasterPixelIsPoint RasterPixelIsArea Unknown «enumeratio... Raw ImageType BIL BIP BSQ + X: Double + Y: Double «struct» IO::Coordinate + Coordinate(Double, Double) 17. ábra: Felsoroló típusok, és a Coordinate struktúra. A RawImage osztály (18. ábra) reprezentálja a BIL, BIP, BSQ típusú formátumokat, valamint ez végzi az adatok beolvasását is. class RawImage IO::RawImage - _Image: List<byte[]> - _ImagePath: string - _ImageType: RawImageType - _ImgLayer: byte ([]) - _nbands: int - _nbits: int + Stride: int - CopyDataToBitmap(byte[]) : Bitmap + GetBitmap() : Bitmap + GetLayer(uint) : byte[] + GetLayerBitmap(uint) : Bitmap + RawImage(string, int, int, int, int, RawImageType) + ReadImage() : void «property» + ncols() : int + nrows() : int 18. ábra: BIL, BIP, BSQ formátumokat reprezentáló osztály A megvalósításnál fontosnak tartottam, hogy az osztály mind a három formátumot egységesen kezelje, ezzel is megkönnyítve a használatát. Továbbá nem készítettem 33

36 külön beolvasó osztályt, mint ahogy azt majd a GeoTIFF esetén láthatjuk, mert egyszerű formátum lévén ennek nem éreztem szükségét. Az osztály úgy lett kialakítva, hogy lehetőség van csak egy réteg beolvasására a GetLayer függvény segítségével, ugyanakkor az egész felvételt is beolvashatjuk a ReadImage eljárással. Az osztály egy réteget csak egyszer olvas be, azaz ha beolvassuk a 2. réteget, majd utána a teljes kép olvasására adunk utasítást, ez esetben a 2. réteg már nem kerül beolvasásra. Ennek a megoldásnak a következtében jelentősen csökkenhet a felesleges olvasások száma, ha valaki nem megfelelő odafigyeléssel akarja lekérni a felvétel egyes rétegeit. A GetBitmap és a GetLayerBitmap függvényhívásokkal lehetőségünk van arra is, hogy Bitmap formátumba kapjuk vissza a kívánt adatokat. Az alkalmazás fő formátuma a GeoTIFF. A formátum összetettségéből fakadóan rendelkezik külön olvasó, illetve író osztállyal is. Az olvasást a GeoTiffReader osztály (19. ábra) valósítja meg. class GeoTiffReader IO::GeoTiffReader - _BitsPerSample: Byte ([]) - _Buffer: Byte ([]) - _ByteOrder: ByteEncoding - _FileStream: FileStream - _IFDOffset: UInt32 - _StripByteCounts: ArrayList - _StripOffsets: ArrayList + Close() : void + GeoTiffReader(string) - ParseValue(UInt16, Int32) : Object - ReadIFDEntryList(UInt32) : void + ReadImageData() : UInt16[] + ReadImageFileDirectory() : Dictionary<UInt16, ArrayList> - ReadStripDataTag() : void - TypeSize(UInt16) : UInt16 «property» + BitsPerSample() : Byte + Compression() : CompressionType + ImageFileDirectory() : Dictionary<UInt16, ArrayList> + SamplePerPixel() : Byte 19. ábra: A GeoTIFF fájlt beolvasó osztály Az olvasó osztály képes beolvasni egyszerű TIFF fájlokat is, de elsődleges célja a kibővített GeoTIFF formátum kezelése. A beolvasáshoz csak a kívánt fájl elérési útját 34

37 kell megadni, ekkor azonban még nem történik meg az olvasás, ezt a ReadImageData függvény segítségével tudjuk kiváltani, ami visszaadja a kinyert képi információkat. A felvételhez tartozó IFD információkat a ReadImageFileDirectory függvénnyel tudjuk kiolvasni. Az IFD-k kinyerése úgy lett kialakítva, hogy igazodjon a TIFF formátum filozófiájához, azaz bármilyen és bármennyi privát címke felvehető. Tehát az olvasó kiolvassa az összes címkét, és kulcs kódjának ismeretében az lekérdezhető. Az olvasó jelen állapotában nem támogatja a tömörített állományok feldolgozását. A GeoTIFF fájlok írásáról a GeoTiffWriter osztály (20. ábra) gondoskodik. Az osztály megírására az olvasó után került sor, így sokkal könnyebb dolgom volt, hiszen kis túlzással az ott megvalósított lépéseket kell fordítva végrehajtani. Az implementációkor a legnagyobb feladatot az IFD kiírása jelentette. class GeoTiffWriter IO::GeoTiffWriter - _Buffer: Byte ([]) - _Entity: WritableField - _FileStream: FileStream - _ImageFileDirectory: Dictionary<UInt16, ArrayList> - _NewImageFileDirectory: Dictionary<UInt16, ArrayList> - _SourceImage: GeoTiff - _StripNumberOfData: UInt32 - _StriptStartAddress: UInt16 - BuildImageFileDirectory() : void - CreateCompression() : void - CreateGeoTags() : void - CreateHeader() : void - CreateHeight() : void - CreateRadiometricResolution() : void - CreateRowsPerStrip() : void - CreateSpectralResolution() : void - CreateStripByteCounts() : void - CreateStripOffsets() : void - CreateWidth() : void + GeoTiffWriter(GeoTiff) - GetTypeCode(int) : UInt16 - GetTypeSize(UInt16) : UInt16 + Save(String, Dictionary<UInt16, ArrayList>) : bool - WritableFieldWrite() : void - WriteDataList(UInt16, UInt32, ArrayList) : void - WriteImageData() : void - WriteImageFileDirectory() : void «property» + _GeoTiffFieldData() : Dictionary<UInt32, WritableField> 20. ábra: A GeoTiff típust kiíró osztály 35

38 Az osztály mindössze két publikus metódussal rendelkezik. A konstruktorral, amely a lemezre menteni kívánt GeoTiff típust vár, valamint egy Save metódussal, amelyik elvégzi a lemezre kiírást. Az IO névtér elemeinek bemutatásának a végére hagytam a GeoTiff osztály ismertetését, amelynek osztálydiagramja a 21. ábrán látható. A képi információkat egy háromdimenziós tömbbel reprezentálom, így lehetőség van az egyes rétegek különálló kezelésére. Az adatok kinyeréséről a már fentebb bemutatott GeoTiffReader osztály gondoskodik, tehát ezen a szinten már csak az adatok rendszerezéséről és feldolgozásáról kell gondoskodni. Az osztálynak két konstruktora van, az egyikkel elérési út alapján hozhatunk létre GeoTiff-et, viszont lehetőség van üres objektum készítésére is. Sok olyan publikus metódussal rendelkezik, melyekkel manipulálhatjuk a képet, vagy információt nyerhetünk róla. A fontosabbak: GetBitmap: Segítségével visszakaphatjuk a képet Bitmap formátumba. Ez a megjelenítés szempontjából fontos funkció. A kódban használok unsafe blokkot a hatékonyabb megvalósítás érdekében. GetLayer: A függvénnyel lekérhetjük a felvétel egy spektrális sávját. A sávok nullától vannak indexelve. GetPixel: Egy adott koordináta képpontját adja vissza egy háromelemű tömbben az RGB-nek megfelelő sorrendben. Interpolate: A korábban már ismertetett interpolációs eljárást valósítja meg. Save: Az eljárás elmenti a GeoTiff típust szabványos GeoTIFF formátumba. SetGrid: A befogó téglalap értékeit adhatjuk meg. SetPixelStretchImage: Az interpoláció során előfordulhat, hogy a kép méretei változnak. Ez a függvény azért felelős, hogy a képet reprezentáló tömb csak a tényleges képi adatokat tartalmazza. 36

39 class GeoTiff IO::GeoTiff - _GeoKeys: Dictionary<Int16, Object> - _GridBottomLeft: Coordinate - _GridBottomRight: Coordinate - _GridTopLeft: Coordinate - _GridTopRight: Coordinate - _Image: UInt16 ([,,]) - _OriginalHeight: int - _OriginalImage: UInt16 ([,,]) - _OriginalWidth: int - _Reader: GeoTiffReader - _Writer: GeoTiffWriter + GeoTiff(string) + GeoTiff(Int32, Int32, Int32) + GetBitmap(Int32, Int32, Int32) : Bitmap + GetCoordinate(Int32, Int32) : Double[] + GetImagePoint(Coordinate) : Coordinate + GetLayer(Int32) : UInt16[] + GetPixel(Int32, Int32) : UInt16[] - GetPixel(UInt16[,,], Int32, Int32) : UInt16[] + GetReferencePoint(Int32, Int32) : Coordinate + GetReferencePoint(Coordinate) : Coordinate + Interpolate(Coordinate[], Coordinate[], int, int) : void - ProcessGeoKeys() : void - ReadStringFromIFD(UInt16) : string + Save(string) : void + SetGrid(Coordinate, Coordinate) : void + SetPixel(Int32, Int32, Int32, UInt16) : void - SetScale() : void + StretchImage(UInt16[,,], int, int, int, int) : UInt16[] + StretchImage(GeoTiff, int, int, int, int) : GeoTiff «property» + CopyRight() : string + DateTime() : DateTime + Description() : string + GeoCitation() : string + GeoCoordinateTansformationCode() : Int32 + GeoFormatVersion() : string + GeoProjectedCoordinateSystemCode() : Int32 + GeoProjectionCode() : Int32 + GeoProjectionModel() : ProjectionModelType + GeoRasterSpace() : RasterSpaceType + GridBottomLeft() : Coordinate + GridBottomRight() : Coordinate + GridScaleX() : Double + GridScaleY() : Double + GridSize() : Double[] + GridTopLeft() : Coordinate + GridTopRight() : Coordinate + Height() : Int32 + Make() : string + Model() : string + ModelTiePoints() : Double[] + RadiometricResolution() : Int32 + Software() : string + SpatialResolution() : Double[] + SpectralResolution() : Int32 + Width() : Int ábra: A GeoTiff osztály diagramja 37

40 Emellett az osztály rendelkezik olyan publikus tulajdonságokkal, mint például a szélesség, hosszúság vagy felvétek készítésének ideje, és egyéb hasznos információkkal, melyek elengedhetetlenek a georeferáláshoz. A Georeferencer névtér elemeinek bemutatásának sorában a végére vettem a georeferáló modul bemutatását, hiszen az eddigi osztályok legtöbbjére, ha közvetve is, de épít. Az ImageGeoreferencer osztály (22. ábra) az alkalmazás központi része. Itt valósul meg a georeferáló eljárás, illetve a már ismertetett matematikai eljárások jelentős része is itt került implementálásra. Annak érdekében, hogy ez az osztály minél átláthatóbb legyen, és valóban csak a szükséges műveleteket tartalmazza, létrehoztam egy ImageHandler nevű osztályt (22. ábra), ami egy köztes réteget képez a felület és a legalsó referáló modul között. Ezt azért tartottam fontosnak, mert így elkülöníthetem a referenciapontok kezelését, valamint néhány apróbb műveletet (leíró fájlok kezelést, stb.), melyek nem valós részei a georeferálás folyamatának, de mégsem kell ezekkel a megjelenítő réteget terhelnem. Az ImageGeoreferencer típus két konstruktorral rendelkezik, az egyikkel azonnal megadhatjuk a referált, valamint a cél felvételt, de arra is van lehetőség, hogy csak inicializáljuk az osztály és később adjuk meg azokat az AddReferenceImage, illetve AddTargetImage eljárásokkal. A Transform függvény segítségével előzetes transzformációkat tudunk végezni a georeferálandó felvételen a sarokpontok alapján, amely az interpoláció hibájával tért vissza. A GeoreferenceImage függvény lényeges és komplex műveletet hajt végre, hiszen itt történik a tényleges georeferálás, és az előző függvényhez hasonlóan ez is az interpoláció hibáját adja vissza. Ezen felül az osztálynak van két privát metódusa is. Az egyik a CalculateEquation, ami az egyenletrendszer megoldásáért felel, valamint az InterpolationError, amit a fent említett Transform, illetve a GeoreferenceImage függvények hívnak az interpolációs hiba megállapításához. A köztes réteg szerepét betöltő ImageHandler osztály legfontosabb feladata, hogy a kontrollpontokat tárolja, illetve azokat továbbítsa a georeferáló modul felé. A Chip illesztés is itt lett implementálva, hiszen szorosan kapcsolódik a kontrollpontok problémaköréhez. Az illesztéshez kapcsolódó függvények a LoadChips, és a MatchChipForRegion. Előbbivel betölthetjük a Chipeket, ezek száma és mérete a paraméterben kapott értékektől függnek, míg utóbbival az illesztés végezhető el. A 38