Pavel Stančík
VŠB-TU Ostrava
e-mail:g94980@vsb.cz
Abstrakt
Cílem této práce je hodnocení současných trendů v oblasti World Wide Web v souvislosti s GIS a současných možností publikace dynamických WWW stránek za pomocí jazyka Java.
Celá práce se opírá o ročníkový projekt, který se uskutečnil v roce 1998 na VŠB - TU v Ostravě s názvem "GIS a WWW". Cílem tohoto projektu se stalo vybudování aplikace MapViewer v jazyce Java, umožňující prohlížení souborů výměnného formátu MapInfo.
Abstract
The meaning of this issue is evaluation of trends of the World Wide Web network within connection to GIS, also today's ability of publication dynamic WWW pages with Java language. The whole work corresponds with bachelors' project "GIS and WWW", which run in 1998 on VŠB-Technical University in Ostrava. Meaning of that project was building application MapViewer - viewer of MapInfo exchange formats, which is created in Java programming language.
1. Základní charakteristika projektu
V loňském roce proběhl v oboru GIS na VŠB-TU v Ostravě ročníkový projekt s názvem "GIS a WWW". Jeho výsledkem byla zpráva o metodách propojení aplikací GIS se službou WWW (World Wide Web). Tato zpráva se rovněž zmiňuje o americké společnosti PlexStar, která začala vyvíjet aplikace pro nasazení v oblasti GIS v programovacím jazyce Java. Pro bližší informace o tomto projektu viz. GIS a WWW.
Nabídlo se mi hned několik možností na vytvoření projektu, který by se zabýval propojením aplikací v oblasti GIS se službou WWW, protože GIS a WWW není jen publikování geografických informací za pomocí služby WWW, ale také zpřístupnění celého systému prostřednictvím této služby kdekoliv na světě, on-line prohledávání rozsáhlých databází, ochrana přenosu geografických dat a tak dále. Zaměřil jsem se na vytvoření aplikace, která dovoluje prohlížet geografická data přes síť WWW.
2. Základní požadavky na aplikaci
Při rozhodování, ve kterém programovacím jazyce by měla být aplikace programována jsem zvažoval tyto body:
Na tomto základě jsem vybral programovací jazyk Java, který plně vyhovuje výše zmíněným požadavkům a rozhodl se vytvořit aplikaci pro prohlížení dat z programu MapInfo, společnosti MapInfo Corporation. Jako vstupní soubory byly vybrány formáty MIF/MID, což jsou výměnné formáty MapInfa.
3. Java
Programovací jazyk Java vznikl v roce 1990. V roce 1993, kdy přecházela služba WWW ze své textové podoby do grafické se zde objevilo nové využití pro jazyk Java. Pomocí takzvaných Applets se do WWW stránky začaly zabudovávat aktivní prvky. Oficiální oznámení o technologii Java bylo učiněno v květnu 1995 na konferenci SunWorld v San Francisku. Od té doby se datuje podporování Javy ve WWW prohlížečích společnosti Netscape Communications. V té době se také přestěhoval vývojový tým Javy do střediska v Palo Alto, Kalifornie.
Technologie Java je založena na podobnosti s programovacím jazykem C++, od kterého se ovšem odlišuje bezpečností.
Jelikož byla zprvu Java navržena pro domácí spotřebiče, musel být tento jazyk jednoduchý a musel být zbaven některých funkcí, které by mohly zapříčinit poškození systému. Proto v sobě Java nemá zabudované ukazatele, které zajišťovaly přímý přístup na určité adresy v paměti počítače. Naopak do ní byl zabudován nástroj na uvolňování již nevyužívané paměti, tzv. Garbage Collector.
Java je multiplatformní programovací jazyk, což znamená, že jednou vytvořený kód lze spustit na jakémkoliv počítači.
Java je síťový jazyk, ve kterém můžeme jednoduchými metodami přistupovat k počítačům v síti, sdílet jejich data, tiskárny a ostatní periferie.
Java je velmi stabilní, tuto vlastnost získala díky odstranění ukazatelů, ale také díky tomu, že v počítači běží v odděleném paměťovém prostoru, takže objeví-li se v kódu chyba, zhroutí se pouze ten program, který chybu vyvolal, avšak operační systém bezpečně pracuje dále.
Aby mohla aplikace Javy běžet na různých platformách, musí být překládaná do speciálního kódu, tzv. byte-kódu. Byte - kód připomíná instrukce procesoru, je posílán do klientského počítače, kde ho převezme interpreter, program spustitelný pouze na dané platformě. Interpreter poté přeloží byte-kód do instrukcí pro daný procesor.
Byte-kód Javy je na cestě do klientského počítače prověřován, zda nepřekračuje omezení jazyka a může být spuštěn. WWW prohlížeče obsahují verifikaci, která ověřuje, zda byte-kód neobsahuje virus.
4. Programování aplikace
K programování bylo použito vývojové prostředí Microsoft J++ s JVM (Java Virtual Machine) verze 1.00.6229, což je Java překladač z roku 1996. V době testování aplikace bylo použito vývojové prostředí JDK (Java Development Kit) od společnosti SUN Microsystems Inc. verze 1.1.6.
Jako první byl vytvořen rám aplikace, soubor MapViewer.java, který v sobě nese informace o apletu, metodu start, která spouští applet, metodu stop, která applet zastavuje a metodu init, která definuje velikost appletu, vytvoří samostatné okno, otevře ho a předá řízení souboru Viewer.java. V tomto souboru je obsaženo jádro aplikace, které volá třídy geoprvků a ostatní třídy, jako například dialogová okna, grafická tlačítka a podobně.
Třída Viewer obsahuje konstruktor Viewer a metody handleEvent, action a paint, které jsou klíčovými metodami celé aplikace.
Metoda handleEvent zachycuje jakoukoliv uživatelovu činnost a obhospodařuje interaktivně posuny výkresu.
Metoda paint() pro vykreslování obsahu okna MapVieweru obsahuje jednotlivé kódy pro vykreslování geoprvků.
Metoda Menu() při inicializaci vytvoří roletové (pull-down) menu s nabídkami akcí.
Metoda handleEvent() byla rozšířena o ošetření akce "Otevři", při které se vytvoří instance třídy FileDialog, která vyvolá okno "Otevřít Soubor". Okno "Otevřít" vrátí programu název souboru pro vstup, je ověřena existence souboru a předáno řízení metodě OtevřítSoubor.
Byla přidána metoda OtevriSoubor(), která otevře daný soubor a přečte první řádek souboru. Je-li první řádek nadepsán sekvencí "Version 300" (což odpovídá hlavičce výměnného souboru MapInfa 3.0), pokračuje se v činnosti. Pokud není totožný s hlavičkou MIF souboru, či se známou verzí, je zobrazeno dialogové okno s varováním a program se vrátí do výchozí pozice čekaje na další uživatelovy pokyny.
V případě, že datový soubor vyhovuje, načte se hlavička souboru a vytvoří se dynamická datová struktura odvozená od třídy Vector(), která bude uchovávat atributové informace ze souboru MID. Hlavička souboru MIF obsahuje řádek, specifikující verzi, oddělovač atributů v souboru MID, souřadný systém, počet sloupců tabulky MID, názvy a datové typy jednotlivých sloupců ukončuje řádek s textem "data".
Dále se načítají jednotlivé řádky a kontroluje se zbývající počet bytů k přečtení s velikostí souboru.
Byl vytvořen soubor "Geoprvky.java", který obsahuje třídy Polylinie, Linie, Oblouk, Region, Čtyřúhelník, Zaoblený čtyřúhelník, Elipsa, Text a Bod.
Tyto třídy odpovídají geoprvkům definovaným v aplikaci MapInfo. U všech bylo určeno, jaké informace o nich je potřeba uchovat. Jako příklad uvádím dva geoprvky:
Třída Linie: Byl navržen konstruktor Linie() s parametry: X1, Y1, X2, Y2, šířka, styl, barva. Tyto hodnoty se nacházejí v souboru MIF. Každý objekt má své specifické parametry, musí tedy být tyto parametry definované v této třídě jako vlastnosti. Tyto vlastnosti přicházejí do objektu vyvoláním nové instance třídy. Pomocí Java metody drawLine se pak jednoduše vykreslí v požadované barvě.
Třída Region: Byl navržen konstruktor Region s parametry: pole souřadnic X, pole souřadnic Y, šířka, styl, barva, počet segmentů a počet polygonů. Region obsahuje jeden, nebo více polygonů. Polygon (očima programátora) je posloupnost linií, které na sebe navazují, přičemž poslední souřadnice posledního segmentu odpovídá první souřadnici prvního segmentu, čímž tvoří uzavřenou plochu. Musela být vytvořena třída Segment, která uchovává souřadnice jednoho segmentu. Třída Region tak využívá třídu Segment pro uchování všech segmentů, které potom vrací Javě jako pole k vykreslení polygonu metodou drawPolygon(). Je-li definován polygon jako vyplněný, vyvolá se místo toho metoda fillPolygon() s barvou vyplnění.
Třídu Segment ještě využívá třída Polylinie.
Uchovávání geoprvků v paměti zajišťuje dynamická datová struktura Vektor(). Tato třída může uchovávat a obhospodařovat různé objekty.
Třída se volá při načtení geoprvku z datového souboru MIF jako :
Vector points = new Vector();
points.addElement(new Point(X1,Y1, šířka, styl, barva));
metoda addElement přidá objekt do dynamického seznamu.
Pro každý geoprvek je do objektu Vector přidána i atributová složka.
Zprvu jsem se obával toho, že Java dovoluje vykreslit prvky na obrazovku pouze se souřadnicemi celočíselného typu (int - v Javě 4 bajty), ovšem MIF obsahuje reálné souřadnice ve zdvojnásobné přesnosti. Data jsem nakonec uložil jako typ s dvojnásobnou přesností a při každém vykreslování převáděl na celočíselný typ:
int np = lines.size(); //Počet linií
Po vykreslení všech geoprvků se zobrazí dialogové okno s hlášením o stavu načtení a počtem prvků a počtem špatně načtených prvků. if (np>0) //Vykreslení linií
(int)(p.Y2*Zoom));
{
{
for (int i=0; i
Linie p = (Linie)lines.elementAt(i);
Color bar = new Color(p.barva);
g.setColor((Color)bar);
g.drawLine((int)(p.X1*Zoom), (int)(p.Y1*Zoom), (int)(p.X2*Zoom),
}
}
Dále byly implementovány metody ZoomIn a ZoomOut. Bylo potřeba zajistit posouvání objektů ve výkresu, proto byly implementovány pohyblivé lišty (Scroll-bars). Aby se snížil čas při přepočítávání hodnot pro každý prvek, posouvá se vždy jen počátek souřadnicového systému. V Javě to zajišťuje metoda graphics.translate(x,y), kde x,y jsou nové souřadnice počátku.
Byla implementována metoda Posun(), která po výběru z nabídky změní kurzor na typ HAND:
if (m_objSelected.toString()=="Posunout") // Stisknuto "Zobrazit\Posunout"
{
setCursor(HAND_CURSOR);
Mode = POSUN;
return true;
}
a táhne-li uživatel výkres myší, výkres se posouvá.
Dále byla upravena metoda mouseDown(), která podle pozice kursoru, (u objektů Region, Rectangle a Round Rectangle metodou Inside()) zjistí, na který prvek uživatel klepl a v dialogovém okně Informace zobrazí informace o daném geoprvku a v samotném výkresu jej zvýrazní.
Jelikož byla pro ukládání dat o geoprvku použita třída Vector(), byla do aplikace MapViewer jednoduše implementována správa vrstev. Je možno do výkresu načítat několik vrstev (Layers) a díky dokonalé správě dynamických datových struktur jednotlivé vrstvy vypínat a mazat.
Závěr
I když se aplikace MapViewer nedá srovnávat s profesionálními programy, najde jistě své uplatnění jako jednoduchý prohlížeč souborů výměnného formátu MapInfa.
Až doposud není možné spouštět aplikaci ve standardním WWW prohlížeči, díky ochranným omezením, které jsou v současných WWW prohlížečích zabudovány. Tato omezení je možné sice obejít, ale na úkor zabezpečení uživatelova WWW prohlížeče.
Literatura:
[1] GIS a WWW - Pavel Stančík - projektová dokumentace
(c) 1998, (elektronická podoba)
[2] Thinking in Java - Bruce Eckel
(c) 1996 by Prentice Hall, Inc. (elektronická podoba)
[3] 1001 tipů Java - Mark C. Chan, Steven W. Griffith, A. F. Iasi
ISBN 80-86097-11-0, Unis publishing 1997
[4] Hooked on Java - Arthur van Hoff, Sami Shio, Orca Starbuck (Sun Microsystems, Inc.)
ISBN 0-201-48837-X, Addison-Wesley Publishing Co. 1996