gml kao podloga geo-prostornoj interoperabilnosti · geografska informacija nije ograničena kao...
TRANSCRIPT
SVEUČILIŠTE U ZAGREBU
FAKULTET ELEKTROTEHNIKE I RAČUNARSTVA
DIPLOMSKI RAD br. 2063
GML kao podloga geo-prostornoj interoperabilnosti
Martin Žagar
Zagreb, lipanj 2004.
2
Sadržaj
0. Uvod 6
1. Upotreba GML-a za opisivanje geo-prostornih podataka 7
1.1. Pozadina i razvoj GML-a 7
1.2. Svojstva GML-a 9
1.2.1. Jednostavna svojstva 9
1.2.2. Geometrijska svojstva 10
1.3. Osnovne GML Sheme 10
1.3.1. Svojstvena shema 11
1.3.2. Geometrijska shema 11
1.3.3. XLink Shema 11
1.4. Kodiranje geografskih Informacija pomoću GML-a 11
1.5. GML aplikacijske sheme 12
1.5.1. Zaglavlje 12
1.5.2. Korijenski element 13
1.5.3. Dijeljene definicije 14
1.5.4. Definicije svojstava 15
1.5.5. Ograničenja na vrijednostima svojstava 16
1.6. Struktura GML dokumenata 16
1.7. Provjera ispravnosti GML dokumenata 18
1.8. Zaključak 18
2. Metode vizualizacije GML-a 19
2.1. ArcExplorer 20
3. Vizualizacija GML podataka pomoću SVG-a 23
3.1. Vizualizacija geografskih podataka 23
3.2. Nastanak i razvoj SVG-a 23
3.3. Alati za vizualizaciju SVG-a 25
3.4. Prikazivanje svojstava u SVG-u 25
3.5. Vidljivo područje - Viewport i Viewbox 26
3.6. Koordinatni sustavi i transformacije 26
3.7. Osnovni geometrijski elementi SVG-a 27
3.8. Tekst u SVG-u 32
3.9. Stiliziranje grafike 34
3
3.10. Grupiranje elemenata u SVG-u 38
3.11. Transformacije koordinata 38
3.12. Ispunjavanje površina 39
3.13. Naglašavanje linija 41
3.14. Interakcija u SVG-u 42
4.Upotreba XSLT-a u vizualizaciji GML podataka 48
4.1. XSL-FO i XPath 49
4.2. Stabla i čvorovi 49
4.3. XSLT struktura i elementi 50
4.4. Predložak 51
4.5. Selektiranje čvorova 52
4.6. Imenovani predlošci 52
4.7. Sadržaj izlaza 53
4.8. Izlazne metode 54
4.9. Umetanje lista pravila 54
4.10. Stvaranje XSLT liste pravila 55
4.11. XSLT Procesori 58
4.12. Zaključak 59
5.0. Primjer vizualizacije GML-a 60
5.1. XMLNotepad 60
5.2. Msxsl 62
5.3. Rezultat transformacije prikazan u SVG obliku i vizualiziran
pomoću MS IE 63
6. Zaključak 68
7. Literatura 69
8. Sažetak 70
9. Abstract 71
10. Zahvala 72
11. Životopis 73
Dodatak A: gmlFeature.dtd 74
Dodatak B: gmlGeometry.dtd 76
Dodatak C: mreza.gml 80
Dodatak D: transf.xsl 95
Dodatak E: SVG source dobiven transformacijom dokumenta mreza.gml 103
4
Popis oznaka i kratica OpenGIS Consortium (OGC)
Geography Markup Language (GML)
Extensible Markup Language (XML)
Document Type Definition (DTD)
Resource Description Framework (RDF)
Geografski Informacijski Sustav (GIS)
Computer Aided Design (CAD)
Scalable Vector Graphics (SVG)
Graphics Interchange Format (GIF)
Joint Photographic Experts Group (JPEG)
Portable Network Graphics (PNG)
World Wide Web Consortium (W3C)
XML Stylesheet Language Transformation (XSLT)
Document Object Model (DOM)
Cascading Style Sheet (CSS)
XSL Formatting Objects (XSL-FO)
XML Path Language (Xpath)
5
Popis slika i tablica Slika 1. Vizualizacija GML-a pomoću SVG-a 6
Slika 2. Izbornik interoperability 20
Slika 3. Učitavanje GML dokumenta 20
Slika 4. Primjer identificiranja za grad Beijing (Peking) 21
Slika 5. Mjerenje udaljenosti pomoću izbornika Measure 22
Slika 6. Definiranje transparentnosti u SVG-u 25
Slika 7. Uz definiciju atributa C elementa <path> 28
Slika 8. Primjer korištenja atributa C u elementu <path> 28
Slika 9. Primjer upotrebe ravnih i zakrivljenih linija 29
Slika 10. Primjer osnovnih geometrijskih elemenata 31
Slika 11. Različiti tekstualni elementi 33
Slika 12. Selekcija klasa 37
Slika 13. Pravila ispunjavanja 41
Slika 14. Značajke naglašavanja obrisa 42
Slika 15. Interaktivnost SVG dokumenta (1) 43
Slika 16. Interaktivnost SVG dokumenta (2) 43
Slika 17. XML Notepad 61
Slika 18. Greška koju javlja XMLNotepad ukoliko izvorni kod nije valjan 61
Slika 19. Msxsl komandni prozor 62
Slika 20. Izlazna datoteka proba31.svg 63
Slika 21. Prikazivanje koordinata 64
Slika 22. Ispisivanje atributa i značajki elementa trafo-stanica 65
Slika 23. Ispisivanje atributa i značajki elementa vod 67
Slika 24. Selektiranje teksta 68
Tablica 1. Osnovne geometrijske značajke u GML 2.0. 10
Tablica 2. Transformacije u SVG-u 39
Tablica 3. Funkcije, metode i varijable JavaScript-a 45
6
0. Uvod GML (eng. Geography Markup Language) je oblikovan da podrži interoperabilnost i
to omogućava kroz uporabu osnovnih geometrijskih oznaka - tagova (svi sustavi koji
podržavaju GML koriste iste geometrijske tagove), zajedničkim podatkovnim
modelom (svojstvima) i mehanizmom za kreiranje i dijeljenje aplikacijskih shema.
Kratki uvod u GML se nalazi u prvom poglavlju. Međutim, GML datoteke ne
sadržavaju informacije o stilu i načinu prikazivanja. To se može riješiti na više načina,
od kojih je za ovaj diplomski rad izabrano rješenje vizualizacije pomoću SVG-a (eng.
Scalable Vector Graphics) (slika 1). Opis SVG standarda se nalazi u trećem
poglavlju. Za prikaz je potrebno format GML transformirati u format SVG.
Transformacija se obavlja definiranjem pripadne liste pravila, odnosno pripadnog
XSLT dokumenta. Postupci stvaranja XSLT dokumenta su opisani u četvrtom
poglavlju. U petom poglavlju je dan primjer prikaza razdjelne mreže u GML formatu.
Slika 1. Vizualizacija GML-a pomoću SVG-a
7
1. Upotreba GML-a za opisivanje geo-prostornih podataka
1.1. Pozadina i razvoj GML-a
Geografska informacija nije ograničena kao samostalan sustav ili jedna homogena
mreža. Ona je dijeljena u heterogenim okolinama koje služe za prikaz geografske
stvarnosti u računalu. U većini slučajeva su geografski podaci skupljani od više
određenih organizacija u različite svrhe i zbog toga su podaci mogli biti u drugačijim
modelima. Aplikacije koje koriste različite zbirke podataka (npr. za zaštitu okoliša,
konstrukciju cesta) moraju međudjelovati sa drugim sustavima, ne samo na razini
podataka, nego također i na aplikacijskoj razini. To uključuje podatke podijeljene
između sustava, kao i podatke koji su strukturirani na način da imaju značenje u
odgovarajućoj paradigmi.
Uvođenje XML-a je omogućilo lagano stvaranje specijaliziranih jezika i kao rezultat
su nastali neki geografski orijentirani jezici koji su trebali ispunjavati gore navedene
zahtjeve, ali niti jedan se nije nametnuo kao prihvatljiv standard za geo-informacijsko
područje. Napokon, OpenGIS Consortium (OGC) je predložio standard nazvan
Geography Markup Language (GML), za prezentaciju geografskih podataka,
temeljen na XML-u. Standard specificira strukturu za kodiranje podatka, način
povezivanja podataka, te definira prijenos i spremanje podatka u okolini Interneta,
uključujući i prostorne i neprostorne značajke pojedinih svojstava.
GML 1.0 je definiran od OGC u svibnju 2000. g. i zasniva se na specifikaciji XML 1.0.
Sastoji od tri GML profila, koji nude različite razine fleksibilnosti u strukturiranju
podataka. Za to se koriste Document Type Definition (DTD) i Resource Description
Framework (RDF).
8
Profil 1 je za one koji žele upotrijebiti rješenja koja se temelje na čistom DTD-u i ne
žele razvijati poseban DTD specifičan za dotičnu aplikaciju. Ovaj profil zahtijeva
upotrebu GML Feature i GML Geometry DTD-ova.
Profil 2 je za one koji žele upotrijebiti rješenja koja se temelje na čistom DTD-u, ali su
spremni razviti vlastiti, aplikacijski specifičan, DTD. Ovaj profil zahtijeva od korisnika
da stvori aplikacijski specifični GML Feature DTD koji koristi ranije definiran GML
Geometry DTD.
Profil 3 je za one koji su spremni na korištenje RDF Sheme. Korisnici ovog profila
tipično će zahtijevati veću kontrolu nad geoprostornim podacima (tj. oni moraju moći
dati ime određenom tipu prema stvarnoj shemi definicije). Ovaj profil zahtijeva od
korisnika da stvori specifičnu RDF Shemu definicija koja koristi GML RDF Shemu
definicija.
GML 2.0 je definiran i izdan u ožujku 2001., također od strane OGC-a, kao
nasljednik standarda GML 1.0. GML 2.0 pruža jedinstveno kodiranje metoda (XML
Shema) i jedinstven pristup stvaranju GML shema. GML 2.0 izbjegava nespretnu
kombinaciju DTD-a i RDF-a u GML 1.0 i podržava nasljeđivanje tipova, distribuciju
shema integracija i imena. Osim toga, pruža širok skup unaprijed definiranih
primitivnih tipova podataka (string, boolean, real, month) i dopušta stvaranje
ugrađenih i korisnički definiranih vrsta podataka. Upotreba XML Shema u GML pruža
mehanizam za vrednovanje i verifikaciju definiran u specifikaciji XML 1.0 .
Specifikacija GML 2.0 definira tri osnovne sheme; geometrijsku shemu
(geometry.xsd), svojstvenu shemu (feature.xsd), i XLink shemu (xlinks.xsd) za
kodiranje geoprostornih informacija. Ove tri osnovne meta-sheme pružaju skup
temeljnih klasa iz kojih se dalje konstruiraju aplikacijske sheme. Početkom 2003. je
definiran standard GML 3.0 čija su dodatna svojstva, u odnosu na GML 2.0,
vremenske značajke, jedinice mjere i proširenje pojedinih geometrijskih značajki
unaprijed definiranih GML shemama. Trenutno je aktualna verzija GML 3.1.
objavljena u travnju 2004. koja donosi neka pojednostavljenja u korištenju shema.
9
1.2. Svojstva GML-a
GML modelira svijet zasnivajući se na običnom geografskom modelu pa se
geografsko svojstvo definira kao apstrakcija nekog prirodnog obilježja i mora biti
povezano s nekim mjestom na Zemlji.
Zato se geografska stvarnost može digitalno predstaviti pomoću svojstva feature.
Stanje obilježja je određeno pomoću skupa značajki, gdje svaka značajka ima ime,
tip i vrijednost. Geografska svojstva su svojstva čije značajke imaju geometrijske
vrijednosti. Zbirka svojstava je skup svojstava koja se može opisati kao jedno
svojstvo. Definicija tipova svojstava ovisi o domeni primjene i broju značajki svojstva
koja se mogu odrediti tipom svojstva.
1.2.1. Jednostavna svojstva
Simple features (jednostavna svojstva) se koriste u GML specifikacijama 1.0 i 2.0. To
su svojstva koja su prikazana dvodimenzionalnom geometrijom. Iako GML 2.0
dopušta 3-D koordinatne sustave, ne pruža izravnu potporu za trodimenzionalnu
geometriju. Tek je GML 3.0 pružio potpunu potporu 3-D koordinatnim sustavima.
Model jednostavnog svojstva je pojednostavljenje općeg modela opisanog OGC
specifikacijom. Jedno pojednostavljenje je pretpostavka da svojstva imaju ili
jednostavne značajke ili geometrijske značajke, a drugo je da se pretpostavlja 2-
dimenzionalan SRS (Spatial Reference Sistem – referentni koordinatni sustav) i
upotreba linearne interpolacije između koordinata.
Nadalje, Simple Feature model pruža geometrijske elemente koji odgovaraju
geometrijskim klasama Point, LineString, LinearRing, Polygon, MultiPoint,
MultiLineString, MultiPolygon, MultiGeometry i Box. Jednostavna svojstva su ona
koja se mogu opisati osnovnim tipovima podataka kao na primjer string, integer, real,
Boolean itd.
10
1.2.2. Geometrijska svojstva
OGC model jednostavnih svojstava definira skup osnovnih geometrijskih elemenata
(gore spomenutih), koja imaju neka svoja svojstva. Tip svojstva može imati više
geometrijskih značajki koje opisuju različite geoprostorne osobine. GML imenuje
geometrijske značajke u trima razinama:
• formalno ime obilježava geometrijske značajke kao vrijednosti temeljene na
tipu geometrije
• opisno ime je skup standardiziranih sinonima za formalna imena koja
olakšavaju upotrebu skupa uvjeta i
• aplikacijski specifična imena koja odabire korisnik i definirana su u pripadnim
aplikacijskim shemama temeljenima na GML-u.
Formalna i opisna imena za osnovne geometrijske značajke su navedena u tablici 1.
Formalno ime Opisno ime Geometrijski tip
boundedBy - Box
pointProperty location Position, CenterOf Point
lineStringProperty lineStringProperty, edgeOf LineString
polygonProperty extentOf, coverage Polygon
geometryProperty - geometryProperty
multiPointProperty multiLocation, multiPosition,
multiCenterOf
MultiPoint
multiLineStringProperty multiCenterLineOf, multiEdgeOf MultiLineString
multiPolygonProperty multiExtentOf, multiCoverage MultiPolygon
multiGeometryProperty - MultiGeometry
Tablica 1. Osnovne geometrijske značajke u GML 2.0. (Izvor: GML 2.0 specifikacija)
1.3. Osnovne GML Sheme
GML 2.0 definira tri osnovne shema za kodiranje prostornih informacija. Ove sheme
pružaju komponente za izgrađivanje GML aplikacijskih shema. Drugim riječima,
11
osnovne GML sheme pružaju meta-shemu, odnosno skup temeljnih klasa, od kojih
se može konstruirati aplikacijska shema.
1.3.1. Svojstvena shema
Svojstvena shema definira osnovni model svojstava i njihovih značajki koja opisuju i
apstraktne i konkretne elemente i tipove. Definirane su i zbirke svojstava (kao tip
svojstva), a uključuje i često korištene značajke svojstava, kao na primjer fid (feature
identifier), ime i opis. Element <include> u svojstvenoj shemi uključuje definicije i
deklaracije koje su sadržane u geometrijskoj shemi za upotrebu u definiranju tipova
svojstava.
1.3.2. Geometrijska shema
Geometrijska shema uključuje detaljnu geometriju komponente, odnosno definicije
tipova za apstraktne geometrijske elemente, konkretne točke, linije i poligone, kao i
složene definicije tipova. Element <import> u geometrijskoj shemi uvodi definicije i
deklaracije koje su sadržane u XLink shemi.
1.3.3. XLink Shema
XLink shema dopušta umetanje elemenata u XML dokument pomoću kojih se
stvaraju i opisuju veze između resursa. Koristi XML sintaksu u stvaranju strukture
povezivanja sličnog jednostavnim hiperlinkovima u HTML-u.
1.4. Kodiranje geografskih informacija pomoću GML-a
Korištenjem triju osnovnih shema XML-a , može se kodirati raznovrsne geoprostorne
informacije kao što su svojstva s ili bez geometrijskih značajki, geometrija, zbirka
svojstava i načini na koji su svojstva povezana. Geografsko obilježje u GML-u je, kao
12
što je već spomenuto, lista jednostavnih i geometrijskih značajki. Svojstva su
određena imenima elementa, a definicija klase svojstava imenuje značajke koje
određeni tip svojstva mora imati. Definicije tipova nasljeđuju odgovarajuće ime klase
na koji dodaju sufiks ”Type”, npr. svojstvo Road se kodira kao
<element name= "Road" type= "RoadType "/>.
1.5. GML aplikacijske sheme Tri osnovne GML sheme (svojstvena shema, geometrijska shema i XLink shema)
same po sebi ne pružaju odgovarajuću shemu za složene podatkovne instance jer
ograničavaju podatke, već definiraju osnovne tipove i strukture koje mogu biti
korištene u aplikacijskoj shemi. GML aplikacijska shema opisuje stvarne tipove
obilježja i tipove značajki koje su od interesa za određenu domenu, koristeći
komponente definirane u standardnim shemama. Bilo koja GML aplikacijska shema
mora biti pisana u skladu sa GML 2.0 specifikacijom i ne smije mijenjati ime,
definiciju, ili tip podataka obaveznih GML elemenata. Međutim, definicije apstraktnih
tipova mogu se slobodno proširivati ili ograničavati. Kao i bilo koji drugi XML
dokument, GML aplikacijska shema također se sastoji od zaglavlja i tijela.
1.5.1. Zaglavlje Zaglavlje počinje s XML-om deklaracijom koja se sastoji od version i encoding
atributa. Element <schema> mora sadržavati imenovane prostore koji su korišteni u
definiranju sheme. Atribut targetNamespace definira korisnički imenovan prostor i
njegova vrijednost je jedinstven identifikator za GML prostor. Za primjer:
<?xml version="1.0" encoding="iso-8859-1"?>
<schema targetNamespace="http://www.itc.nl/gfm"
xmlns:gfm="http://www.itc.nl/gfm"
xmlns:gml="http://www.opengis.net/gml"
xmlns:xlink=http://www.w3.org/1999/xlink
13
xmlns=http://www.w3.org/2000/10/XMLSchema
elementFormDefault="qualified" version="1.0">
<annotation>
<appinfo>gfm.xsd v1.0 </appinfo>
<documentation xsl:lang="en">
GML aplication schema
</documentation>
</annotation>
<import namespace=http://www.opengis.net/gml schemaLocation="feature.xsd"/>
U elementu <annotation> se nalaze informacije o aplikacijskoj shemi, dok se
elementom <import> uključuje druge definirane GML sheme koje su korištene u
ovoj shemi. U ovom slučaju je uključena GML svojstvena shema (feature.xsd) koja
uključuje i geometrijske i Xlink sheme.
1.5.2. Korijenski element Prvi element u aplikacijskoj shemi definira korijenski element. U definiciji sheme
korijenski element ima svoju zamjensku grupu i temelji se na
gml:AbstractFeatureCollectionType. Na primjer, ako se topografska
informacija sela modelira u GML-u, može se sastojati od ceste, rijeke, terena, zgrade
i klasa koja opisuju svojstva granica. Zbirka ovih klasa svojstava je korijenski element
i ako se on nazove kao VillageTopoModel, može biti određen u shemi kako
slijedi.
<element name="VillageTopoModel" type="gfm:VillageTopoModelType"
substitutionGroup="gml:_FeatureCollection/>
<complexType name="VillageTopoModelType">
<complexContent>
<extension base="gml:AbstractFeatureCollectionType">
<sequence>
<element name="dateCreated" type="date"/>
</sequence>
</extension>
</complexContent>
</complexType>
14
1.5.3. Dijeljene definicije
Postoje neke značajke koje su dijeljene od više objekata u definiciji sheme. Na
primjer, vremenske i metadata informacije su vezane za svako svojstvo u modelu. Da
bi se naslijedile te značajke u svim svojstvima definira se complexType koji se
odnosi na definicije grupa i svi tipovi svojstava moraju naslijediti taj tip.
<group name="TemporalData">
<sequence>
<element name="begindate" type="string" />
<element name="enddate" type="string" />
</sequence>
</group>
<group name="MetaData">
<sequence>
<element name="source_type" type="string"/>
<element name="source_description" type="string"/>
<element name="accuracy" type="string"/>
<element name="actuality" type="string"/>
<element name="code_num" type="integer"/>
</sequence>
</group>
<complexType name="TopoDataType" abstract="true">
<complexContent>
<extension base="gml:AbstractFeatureType">
<sequence>
<element name="code_id" type="integer"/>
<group ref="gfm:TemporalData"/>
<group ref="gfm:MetaData"/>
</sequence>
</extension>
</complexContent>
</complexType>
15
1.5.4. Definicije svojstava
Svojstva su objekti koji su vidljivi na karti. U primjeru ispod, zgrada je jedan tip
svojstva i zbirka takvih građevinskih svojstava je predstavljena tipom
BuildingLayer. Svi takvi slojevi mogu biti određeni u TopoDataLayerType koji
nasljeđuje gml:AbstractFeatureCollectionType.
<complexType name="TopoDataLayerType">
<complexContent>
<extension base="gml:AbstractFeatureCollectionType"/>
</complexContent>
</complexType>
<element name="BuildingLayer" type="TopoDataLayerType"
substitutionGroup="gml:_FeatureCollection"/>
<element name="Building" type="gfm:BuildingType"
substitutionGroup="gml:_Feature"/>
<complexType name="BuildingType" >
<complexContent>
<extention base="gfm:TopoDataType>
<sequence>
<element name="type" type="string"/>
<element name="function" type="string"/>
<element name="height_category" type="string"/>
<element name="height" type="string"/>
<element name="status" type="string"/>
<element ref="gml:geometryProperty"/>
<element name="heightlevel" type="integer" minOccurs="0" />
<element name="name" type="string" minOccurs="0" />
</sequence>
</extension>
</complexContent>
</complexType>
Svi drugi slojevi svojstava mogu biti definirani na sličan način.
16
1.5.5. Ograničenja na vrijednostima svojstava
Značajka svojstva može imati unaprijed definiran broj dopuštenih vrijednosti. Kada je
takva značajka tipa string, moguće je nabrajanje tih svojstava.
<element name="function" type="functionType"/>
<simpleType name="functionType">
<restriction base="string">
<enumeration value="Municipality"/>
<enumeration value="Police office"/>
<enumeration value="Post office"/>
<enumeration value="Church"/>
<enumeration value="Hospital"/>
<enumeration value="Station"/>
<enumeration value="Storage tank"/>
<enumeration value="Other"/>
</restriction>
</simpleType>
1.6. Struktura GML dokumenata
Bilo koji GML dokument počinje sa standardnim XML zaglavljem u kojem se
definiraju encoding i version atributi, te nakon toga dolazi korijenski element (kao i
kod aplikacijske sheme). Element <gml:boundedBy> sadržava vanjsku granicu svih
svojstava u GML dokumentu. Atribut SrsName unutar <Box> elementa govori o
koordinatnom sustavu u kojem su koordinate opisane. Nakon određivanja granica
cijele zbirke svojstava, svaka zbirka je opisana zasebno sa svojim granicama. Primjer
tako fragmentiranog GML dokumenta se nalazi ispod.
<gml:boundedBy>
<gml:Box srsName="EPSG:7408">
<gml:coordinates>
190000,446000 193000,449000
</gml:coordinates>
17
</gml:Box>
</gml:boundedBy>
<gfm:featureMember>
<gfm:BuildingLayer>
<gml:boundedBy>
<gml:Box srsName="EPSG:7408">
<gml:coordinates>
190000,446000 193000,449000
</gml:coordinates>
</gml:Box>
</gml:boundedBy>
<gfm:featureMember>
<gfm:Building fid="GFM.Bld260">
<gfm:code_id>Bld260</gfm:code_id>
<gfm:begindate>10 Janu 2003</gfm:begindate>
<gfm:enddate/>
<gfm:code_num>8885</gfm:code_num>
<gfm:type>Tower</gfm:type>
<gfm:function>Municipality</gfm:function>
<gfm:height_category>3</gfm:height_category>
<gfm:height>40</gfm:height>
<gfm:status>Occupied</gfm:status>
<gml:geometryProperty>
<gml:Polygon srsName="ESPG:7408">
<gml:outerBoundaryIs>
<gml:LinearRing>
<gml:coordinates>
191100,447200 191150,447200 191150,
447225 191000,447225 191100,447200
</gml:coordinates>
</gml:LinearRing>
</gml:outerBoundaryIs>
</gml:Polygon>
</gml:geometryProperty>
</gfm:Building>
</gfm:featureMember>
</gfm:featureMember>
18
1.7. Provjera ispravnosti GML dokumenata Ispravnost GML dokumenta mora biti provjerena kroz validaciju (vrednovanje). Prvo
dokument mora biti dobro formiran (well-formed) što znači da je pisan u skladu sa
XML sintaksom. Slijedeći korak je validacija u skladu sa definicijom sheme. To je
moguće ostvariti pomoću programa XMLSpy, XMLNotepad, TurboXML i sl.
1.8. Zaključak
GML je standard temeljen na XML-u i služi za opisivanje geografskih podataka. GML
modelira geografske podatke kao svojstva i zbirke svojstava koje su definirane u
aplikacijskim shemama. Aplikacijske sheme nasljeđuju temeljne GML sheme. GML
dokument temeljen na takvoj shemi može biti obrađen bilo kojim XML parserom.
GML ne pruža nikakve informacije o prikazu i zato se sadržaj podataka mora
pretvoriti u drugi grafički format.
19
2. Metode vizualizacije GML-a
Prema principima XML tehnologije i razvojnim ciljevima, GML ne bi trebao sadržavati
prezentacijske podatke. Kao posljedica toga, GML datoteke ne sadržavaju
informacije o stilu i načinu prikazivanja. S druge strane, postoje načini kako dodati
stilove prema kojima se GML prikazuje. Jedna od metoda je, kada se GML podaci
importiraju u GIS ili drugu CAD aplikaciju, stilovi mogu biti dodani kroz tu programsku
podršku. Druga metoda je razvoj specifičnog GML-viewera (pokazivača) koji zna
čitati GML podatke i generirati kartografski pogled. Takav program treba imati
interaktivni modul da bi mogao mijenjati grafičke značajke i svojstva. Također je
moguće napraviti odvojen dokument koji sadržava informacije potrebne za prikaz,
koji će zajedno sa GML podacima takav viewer znati čitati i generirati grafički prikaz.
Takvi specijalizirani pokazivači još nisu jako razvijeni i raspoloživi. Za sada postoji
samo jedan GML-viewer zadovoljavajućih mogućnosti, a da je besplatan. Ime mu je
ArcExplorer i proizvod je tvrtke «ESRI». Vjerojatno je i proizvod tvrtke «InterGraph»
također visoko razvijen (jer je to poznata tvrtka na polju geografskih informacijskih
sustava), ali njihov proizvod ima cijenu od oko 800 $ pa je dosta nepristupačan.
ArcExploreru je posvećeno sljedeće poglavlje.
Postoji još jedna mogućnost prikaza geografskih podataka, a to je transformacija
GML-a u drugi XML grafički format - SVG. Glavna prednost ovakvog pristupa je u
tome što je SVGViewer (proizvod tvrtke «Adobe») standardno ugrađen u MS IE 6.0
na više, pa nema potrebe za instalacijom dodatnih programa (ArcExplorer nakon što
ga se instalira zahtjeva točno određen JRE 1.4.0. i zahtjeva brisanje određenih
programa što može stvarati probleme, tako da nije baš najpodesniji u smislu
računalne otvorenosti). Način vizualizacije podataka pomoću SVGViewera bit će
prikazan u poglavlju 3.
20
2.1. ArcExplorer
Slika 2. Izbornik interoperability
ArcExplorer-Java Edition je program za vizualizaciju geografskih podatka. Osim
vizualizacije prostornih podataka i njihovih svojstava, moguće je nad njima obavljati i
upite, razne analize i prilagođavati kartografski prikaz pojedinom korisniku.
Slika 3. Učitavanje GML dokumenta
Pomoću izbornika interoperability prikazanog na slici 2. moguće je učitati GML
dokument zajedno sa pripadajućom aplikacijskom shemom (slika 3). Također je
moguće spremiti izmjene ili kartografski prikaz nekog drugog formata u GML.
Moguće je podesiti koje slojeve će program spremiti, koje labele će ostati vezane i
spremiti selektirane podatke koje smo dobili upitima. Upitima postižemo selekciju
21
točno određenih podataka i to je vrlo važno svojstvo jer je moguće u samom izrazu
za selekciju uključiti različite atribute, operatore i izračune.
Slika 4. Primjer identificiranja za grad Beijing (Peking)
U izborniku Tools je moguće povećati ili udaljiti mapu, selektirati samo jedan njezin
dio, identificirati pojedina svojstva pomoću naredbe identify (kao što je prikazano na
slici 4., klikom miša iznad kružića koji predstavlja Peking dobili smo njegove
značajke). Još jedno zgodno svojstvo je mjerenje udaljenosti između pojedinih
svojstava (objekata) na karti. To je prikazano na slici 5. na primjeru udaljenosti
ukupnog puta od New Yorka preko Kansas Citya i San Antonia do Houstona. Oznaka
Segment koja se nalazi u gornjem lijevo uglu karte daje duljinu zadnjeg segmenta, a
Total ukupnu označenu duljinu.
22
Slika 5. Mjerenje udaljenosti pomoću izbornika Measure
U izborniku Layer možemo podesiti izgled prikaza (boje, veličina slova i oznaka) kao i
informacije koje će se pojaviti na mapi (imena gradova, rijeka). Moguće je
pridjeljivanje oznaka u odnosu na neka svojstva (na primjer različite boje za
označavanje gradova s obzirom na broj stanovnika i sl.). Aktiviranje pojedinih slojeva
moguće je korištenjem izbornika koji se nalazi na lijevoj strani (na slici 5. je uokviren
crveno).
Još jedna pogodnost ArcExplorera je opcija Geography Network kojom je moguće
pristupiti globalnoj mreži geografskih podataka putem Interneta i korištenje podataka
od korisnika diljem svijeta. U tu svrhu postoje i opcije WMS (Web Map Server) i WFS
(Web Feature Server).
Više o ArcExploreru na www.esri.com/arcexplorer.
23
3. Vizualizacija GML podataka pomoću SVG-a
SVG (eng. Scalable Vector Graphics) je XML aplikacija za dvodimenzionalnu grafiku.
Ima mnoge prednosti pred drugim grafičkim formatima. Ovdje će biti opisane
prednosti i mogućnosti SVG-a, kao i prikladnost za gledanje geografskih podataka.
3.1. Vizualizacija geografskih podataka
Geografski podaci daju informaciju o prirodnim elementima na Zemljinoj površina kao
što su ceste, rijeke, zgrade, tlo, teren, granice i sl. Kada govorimo o vizualizaciji tih
podataka, to znači da se svi ti elementi moraju grafički predstaviti. Pri tome se koriste
osnovni grafički elementi, točke, linije i površine. Točke služe za definiranje položaja i
najosnovniji su od ova tri tipa. Linije su linearna polja točaka i definiraju smjer kao i
poziciju. Površine definiraju opseg, smjer i poziciju i predstavljene su
dvodimenzionalnim razmještajem točaka.
Da bi vizualizacija dobila što više na značenju, treba se identificirati i analizirati
podatke koji će biti predstavljeni prije nego ih se simbolizira. Tekst se koristi u
vizualizaciji za prikaz informacija koje nije moguće simbolizirati.
3.2. Nastanak i razvoj SVG-a
Većina grafika na Webu se sastoji od slika predstavljenih kao niz obojenih piksela.
GIF (Graphics Interchange Format), JPEG (Joint Photographic Experts Group) i PNG
(Portable Network Graphics) su primjeri grafičkih formata koji se zasnivaju na ovom
principu. Alternativan pristup za slanje vrijednosti piksela putem Weba je slanje uputa
24
kako nacrtati crtež koji prikazuje svojstva kao što su linije ili vektori, i popuniti te
oblike (vektorska grafika), što nudi značajne prednosti pred formatima temeljenim na
pikselima (bitmap i rasterska grafika).
Međutim, niti jedan takav vektorski format nije bio široko prihvaćen od alata za
kreiranje Web stranica i najčešće je bio vrlo kompliciran. Zbog toga je W3C (World
Wide Web Consortium) 2001. godine razvio novi standardni format za vektorsku
grafiku, Scalable Vector Graphics (SVG), koji se podudarao sa potrebama Web
preglednika i relativno je jednostavan.
SVG dopušta tri osnovna tipa grafičkih objekata; vektorski grafički oblici (tj. putovi koji
se sastoje od ravnih i zakrivljenih linija), slike i tekst. Također podržava gradijentno
ispunjavanje površina, korištenje filtara i komponente kao što su simboli i oznake
(markeri). U SVG-u grafički objekti mogu biti grupirani, stilizirani, transformirani i
spojeni u veće objekte. SVG crteži mogu biti dinamični i interaktivni.
SVG nudi mnoge važne prednosti pred rasterskim formatima:
• Ima svojstvo zumiranja: slike mogu biti povećavane bez žrtvovanja oštrine,
detalja ili jasnoće.
• Tekst ostaje tekst: tekst se u SVG slikama može editirati i može se
pretraživati. Ne postoje ograničenja vezana uz font i korisnici će uvijek vidjeti
sliku na isti način na koji je napravljena.
• Malena veličina dokumenta: donosi brzinu u izvođenju.
• Neovisnost prikaza, bez obzira na radnu stanicu.
• Interaktivnost: SVG slike mogu reagirati na korisničke akcije s promjenom
izgleda, audio efektima i animacijom.
• Otvoren standard: SVG je otvoren standard razvijen od strane W3C i za
razliku od nekih drugih grafičkih formata, SVG nema vlasnika.
• Baziran na XML-u: nudi sve prednosti XML-a, interoperabilnost, široku
podršku i laganu transformaciju pomoću XML Stylesheet Language
Transformation (XSLT).
25
3.3. Alati za vizualizaciju SVG-a
Postoje dvoje glavne vrste SVG viewera, samostalni SVG vieweri i SVGenabled Web
preglednici.
Najrazvijeniji i najnapredniji samostalni SVG viewer je Adobe SVG viewer.
Raspoloživ je za različite platforme i radi u svim značajnijim Web preglednicima. Ovaj
viewer podržava većinu SVG specifikacije, uključujući i SVG DOMsupport, i ima
velike mogućnosti uključivanja skriptnih jezika (ECMAScript, JavaScript). SVG viewer
se standardno nalazi u Web pregledniku MS IE 6.0. na više.
3.4. Prikazivanje svojstava u SVG-u
SVG je grafički format razvijen da udovolji zahtjevima Web okoline. SVG vieweri
simuliraju «painters» algoritam, što znači da se preklapajuća područja prebojana ili
ovisno o vrijednosti transparentnosti, prosijava donji sloj takvih područja. To se može
vidjeti na slici 6. Transparentnost se definira atributom fill-opacity i vrijednost se
kreće od 0 za prozirno do 1 za neprozirno.
Slika 6. Definiranje transparentnosti u SVG-u
26
Ako su svi objekti definirani kao neprozirni na vrhu će biti onaj koji je zadnji definiran
u dokumentu. Dakle elementi se prebojavaju u skladu sa slijedom pojavljivanja u
kodu. Time možemo dobiti 2.5D prostor kojim se može relativno dobro prikazati reljef
podloge.
3.5. Vidljivo područje - Viewport i Viewbox
Viewport je područje u kojem će SVG biti vidljiv. Atributi width i height (širina i
visina) elementa <svg> se koriste za definiranje dimenzija, a atributima x i y se
određuju koordinate gornjeg lijevog ugla u dotičnom koordinatnom sustavu. Kada je
<svg> element ugniježđen unutar SVG dokumenta, stvara se novi Viewport, kojem
je pridružen novi koordinatni sustav s novim početnim koordinatama i vlastitom
veličinom. ViewBox atribut definira područje prikazivanja u Viewport ekranu u kojem
možemo definirati vlastite početne koordinate (atributi originX i originY), pa nam
tako koordinatni sustav ne mora počinjati sa koordinatama 0,0 nego npr. -200,-200.
3.6. Koordinatni sustavi i transformacije
SVG koristi Kartezijev koordinatni sustav, čije ishodište je locirano u gornji lijevi kut
polja za prikaz. X-os raste prema desno, a Y-os raste nadolje. Zbog toga kada
koristimo SVG za prikaz mapa, Y-os mora biti invertirana množenjem svih y-
vrijednosti sa -1 ili nekim drugim načinom.
27
3.7. Osnovni geometrijski elementi SVG-a
Slični kao i ostali vektorski grafički paketi, SVG također ima neke unaprijed definirane
osnovne geometrijske oblike: <rectangle>, <circle>, <ellipse>, <line>,
<polyline>, <polygon> i objekte puta (<path>). Element <path> je najvažniji i
najsloženiji geometrijski oblik u SVG. Njime možemo nacrtati otvorene i zatvorene
linije objekata i poligone, a sastoji se od liste koordinata. Primjer jednog od načina
izgleda elementa <path>:
<path d= "M x1 y1 L x2 y2 L x3 y3 L x4 y4 ... L xn yn "/>.
Atribut d dopušta opis nekoliko tipova crteža. M x1 y1 znači pomakni se (move) na
koordinate x1, y1. L x2 y2 povlači liniju od trenutnih koordinata na koordinate
x2, y2. Element <path> koristi različitu sintaksu kojom se mogu ostvariti
kompleksni oblici korištenjem samo jednog elementa. Moguće vrijednosti za d atribut
su: M = moveto, L = lineto, H = horizontal lineto (ima samo jedan parametar, i to x,
jer vrijednost y-osi ostaje ista), V = vertical lineto (ima samo jedan parametar, y,
vrijednost x ostaje ista), C = curveto, S = smooth curveto, Q = quadratic bezier
curveto, T = smooth quadratic bezier curveto, A = eliptcal arc i Z = closepath (navodi
se na kraju bez koordinata i njime zatvaramo granice objekta povlačenjem ravne
linije od trenutnih koordinata do početnih koordinata). Korištenjem velika slova (npr.
M) definiramo apsolutne koordinate, a malim slovima (npr. m) relativno pozicioniranje.
Slike 7. i 8. prikazuju mogućnosti povezane s parametrom c atributa d.
28
Slika 7. Uz definiciju atributa C elementa <path>
Slika 8. Primjer korištenja atributa C u elementu <path>
Primjer korištenja atributa elementa <path> je stvaranje patke kako je prikazano na
slici 9. Gornja patka je definirana skupom točaka i sastoji se zapravo od niza pravaca
koji povezuju te točke:
<path d="M 0 112 L 20 124 L 40 129 L 60 126 L 80 120 L 100 111
L 120 104 L 140 101 L 164 106 L 170 103 L 173 80 L 178 60 L
185 39 L 200 30 L 220 30 L 240 40 L 260 61 L 280 69 L 290 68 L
29
288 77 L 272 85 L 250 85 L 230 85 L 215 88 L 211 95 L 215 110
L 228 120 L 241 130 L 251 149 L 252 164 L 242 181 L 221 189 L
200 191 L 180 193 L 160 192 L 140 190 L 120 190 L 100 188 L 80
182 L 61 179 L 42 171 L 30 159 L 13 140 Z"/>
Slika 9. Primjer upotrebe ravnih i zakrivljenih linija
Donja patka je prikazana pomoću skupa zakrivljenih linija:
<path d="M 0 312
C 40 360 120 280 160 306 C 160 306 165 310 170 303
C 180 200 220 220 260 261 C 260 261 280 273 290 268
C 288 280 272 285 250 285 C 195 283 210 310 230 320
C 260 340 265 385 200 391 C 150 395 30 395 0 312 Z"/>
30
Iz primjera je vidljiva prednost upotrebe zakrivljenih linija, jer smo dobili patku koja
ima glađe linije i definirana je sa samo 23 točke, naspram 45 točaka koliko je bilo
potrebno za gornju patku.
SVG sadržava nekoliko semantičkih i sintaktičkih mjera za smanjivanje veličine
izraza kojima se opisuje put:
• korištenje relativnih koordinata
• glatke zakrivljene linije - često se susjedne zakrivljene linije trebaju zagladiti.
To se postiže definiranjem prve kontrolne točke druge linije kao refleksije od
druge kontrolne točke prve linije.
• sintaktičke simplifikacije - može se ispustiti prazno mjesto kada je rezultat
nedvosmislen. Na primjer, prazno mjesto nije potrebno između naredbenog
slova (M, L) i vrijednosti koordinate; negativne koordinate ne trebaju
razdvojenost od prethodne; ako je slijedeća naredba ista kao prethodna,
naredbeno slovo može biti ispušteno.
Primjenjujući gore navedena pravila, patku možemo nacrtati i sa samo 160 znakova
(u usporedbi sa početnih 443):
<path d="M 0 312c40 48 120-32 160-6c0 0 5 4 10-3c10-103 50-83
90-42c0 0 20 12 30 7c-2
12-18 17-40 17c-55-2-40 25-20 35c30 20 35 65-30 71c-50 4-170
4-200-79 z"/>
Izrazi puta su jako svestrani, ali mogu biti nepotrebno moćni kada definiramo
jednostavne oblike. Kao posljedica, SVG definira nekoliko drugih osnovnih
elemenata u svojoj specifikaciji, kao što su <rectangle>, <circle>,
<ellipse>, <line>, <polyline> i <polygon>. Osnovni atributi su opisani u
slijedećem primjeru (i na slici 10):
<svg tyle="stroke:orange;fill:green" width="820" height="820">
31
<circle cx="70" cy="100" r="50" />
<rect x="150" y="50" rx="20" ry="20" width="135"
height="100"/>
<line x1="325" y1="150" x2="375" y2="50" />
<polyline points="50, 250 75, 350 100, 250 125, 350 150, 250
175, 350" />
<polygon points=" 250, 250 297, 284 279, 340 220, 340 202,
284" />
<ellipse cx="400" cy="300" rx="72" ry="50" />
</svg>
Slika 10. Primjer osnovnih geometrijskih elemenata
32
3.8. Tekst u SVG-u
Tekst se u SVG-u može ostvariti pomoću više različitih elemenata koji ga opisuju.
Ovdje će biti definirana tri glavna (slika 11):
• tekst definiran pomoću elementa text
• tekst definiran pomoću elementa tspan kojim je moguće varirati značajke i
atribute korištene u prezentaciji teksta
• tekst čiji je put određen pomoću elementa textPath
<text x="220" y="20">
<tspan x="220" dy="30">Ovo je kompleksna linija</tspan>
<tspan x="220" dy="30">teksta ili tekst</tspan>
<tspan x="220" dy="30" style="fill:white;stroke:green">sa
različitim značajkama </tspan>
<tspan x="20" dy="30" rotate="10 20 30 40 0 50 60 70 0 80 90 0
100 110 120 140 150 160 170
180">koje sa mogu napraviti</tspan>
<tspan x="220" dy="30">korištenjem elementa tspan</tspan>
</text>
<path id="duck" d="M 0 312 C 40 360 120 280 160 306 C 160 306
165 310 170 303
C 180 200 220 220 260 261 C 260 261 280 273 290 268 C 288 280
272 285 250 285
C 195 283 210 310 230 320 C 260 340 265 385 200 391 C 150 395
30 395 0 312 Z"/>
<text style="font-size:10">
<textPath xlink:href="#duck">
Idemo gore, pa idemo dolje, onda opet gore oko glave. Sada smo
naopačke jer idemo uz vrati uzduž leđa do repa.
</textPath>
</text>
<text>
<tspan x="30" dy="30" font-size="16">Ovo </tspan>
33
<tspan x="330" dy="30" fill="red">je </tspan>
<tspan x="530" dy="30" font-weight="normal">jedna </tspan>
<tspan x="130" dy="30" font-family="Courier" font-
size="28">jedini </tspan>
<tspan x="330" dy="30" fill="blue">tekstualna </tspan>
<tspan x="30" dy="60" font-style="italic">rečenica </tspan>
<tspan x="430" dy="30" font-size="18">koja </tspan>
<tspan x="330" dy="30" font-size="20">je </tspan>
<tspan x="230" dy="30" font-size="24">razbacana </tspan>
<tspan x="130" dy="30" font-size="28">skroz </tspan>
<tspan dx="30" dy="30">po </tspan>
<tspan dx="130" dy="30">grafičkoj </tspan>
<tspan dx="-230" dy="30">podlozi</tspan>
</text>
Slika 11. Različiti tekstualni elementi
34
Upotrebom elementa text definiramo pomoću atributa x i y mjesto prikaza teksta.
Koordinate predstavljaju donji lijevi kut prvog znaka i znakovi su prikazani od lijevo
nadesno. Atributima povezanima s tekstom može se promijeniti početna pozicija,
karakteristike teksta i smjer. Tekst unutar tspan može imati koordinate definirane
apsolutno x i y ili relativno dx i dy. Trenutni položaj teksta je pomaknut za vrijednost
koja je specificirana u slučaju postojanja relativnih atributa. Za oba atributa, dx i dy,
može biti definirana lista u kojem slučaju prvi broj definira pomak za prvi znak, drugi
definira pomak od prvog znaka za drugi znak i tako dalje. Svaki od znakova u tekstu
unutar tspan elementa može biti zakrenut korištenjem atributa rotate.
3.9. Stiliziranje grafike
Stilske značajke definiraju kako će biti prikazani grafički elementi u SVG dokumentu.
SVG upotrjebljava te značajke za parametre kao na primjer fill, stroke
colors, line widths i dash styles, koji su vizualne prirode, parametre
povezane sa stilizacijom teksta kao na primjer font-family i font-size. Povrh
statičnog stiliziranja SVG elemenata, dopušteno je i stiliziranje pomoću deklaracijske
animacije ili skripte. Međutim, stiliziranje grafike je potencijalno složenije nego
stiliziranje teksta. Da li je boja u grafici, na primjer, stil ili sadržaj elementa? Ako se
boja koristi na karti za razlikovanje pojedinih zemalja, onda vjerojatno govorimo o
stilu. Važno je da je boja jedne zemlje različita od boje druge zemlje. Stiliziranje
može biti u ovoj situaciji od velikog značaja: najbolji izbor boje bi mogao ovisiti o
kontekstu u kojem se karta koristi, definiranje boje kroz mehanizme stiliziranja
omogućava promjenu boje od jednog konteksta do drugog. Boja ipak nije uvijek stil.
Boja u logu, u umjetničkoj slici ili u preciznoj prezentaciji objekata realnog svijeta je
svojstvo vezano uz sadržaj elementa. U ovom slučaju je boja atribut koji će biti
prikazan točno tako (ukoliko može) u svakom kontekstu. Promijeniti boju kroz
mehanizme stiliziranja bilo bi u ovom slučaju potpuno krivo.
35
Ovi slučajevi, boja kao stil i boja kao sadržaj elementa, se ostvaruje u SVG-u
pomoću dva različita mehanizama. Jedna metoda je postaviti vizualne atribute
direktno. Na primjer:
<rect fill="yellow" stroke="black" x="20" y="30" width="300"
height="200"/>
<rect fill="none" stroke="red" x="20" y="330" width="300"
height="200"/>
U primjeru smo definirali dva pravokutnika, prvi je žuti s crnom granicom, drugi je
proziran s crvenom granicom. Druga metoda stiliziranja je ilustrirana primjerom:
<svg viewbox= "0 0 500 300" >
<style type="text/css"> <![CDATA[
rect {stroke:black; fill:yellow}
rect.different {stroke:red; fill:none}
]]>
</style>
...
<rect x="20" y="30" width="300" height="200"/>
<rect class="different" x="20" y="330" width="300"
height="200"/>
</svg>
Ovime se postiže isti vizualni efekt kao i u prvom primjeru. Element <style> definira
listu pravila izraženu u CSS (Cascading Style Sheet) sintaksi. Oznaka CDATA se
koristi da se izbjegne parsiranje i provjeravanje XML-a sintakse. U primjeru su
opisana dva stila, prvi za pravokutnike općenito (ispunjavanje žutom bojom s crnom
granicom) i drugi za pravokutnike koji pripadaju u klasu «different». Koji su
prozirni i omeđeni crvenom bojom. Isti efekt se mogao postići definiranjem vanjskog
CSS-a mystyle.css :
rect (stroke:black; fill:yellow}
rect.different (stroke:red; fill:none}
36
i uključivanjem u SVG dokument:
<?xml-stylesheet type="text/css" href="mystyle.css" ?>
<svg viewbox= "0 0 500 300" >
<rect x="20" y="30" width="300" height="200"/>
<rect class="different" x="20" y="330" width="300"
height="200"/>
</svg>
Stil može također biti povezan izravno s elementom kojeg opisuje. Gornji primjer bi
se tako mogao napisati:
<rect style="stroke:black;fill:yellow" x="20" y="30"
width="300" height="200"/>
<rect style="stroke:red;fill:none" x="20" y="30" width="300"
height="200"/>
SVG dopušta da slike imaju proizvoljnu hijerarhijsku strukturu. CSS pruža
mehanizme kontrole izgleda, bazirane na vrijednostima atributa (obično atributi
pojedine klase) i strukturi SVG elemenata. Moguće je također napisati:
rect [class~="different"] {stroke:red; fill:none}
što bi selektiralo pravokutnike čija klasa sadržava vrijednost different. Pri tome
"." notacija predstavlja isto što i "~=". Slijedi složeniji primjer.
<svg width="400" height="250" >
<style type="text/css"> <![CDATA[
rect {stroke:black; fill:white}
rect.different {stroke:red; stroke-width:4; fill:none}
rect.different.again {stroke:none; fill:white}
rect.different.again.encore {stroke:blue; stroke-width:8;
fill:none}
37
]]>
</style>
<rect x="20" y="20" width="100" height="100"/>
<rect class="different" x="20" y="140" width="100"
height="100"/>
<rect class="different again" x="140" y="20" width="100"
height="100"/>
<rect class="different again encore" x="140" y="140"
width="100" height="100" />
</svg>
Na slici 12. je prikazan rezultat.
Slika 12. Selekcija klasa
38
3.10. Grupiranje elemenata u SVG-u
Često postoji potreba za grupiranjem grafičkih elemenata. Jedan razlog je ako skup
elemenata dijeli isti atribut. Međutim, najčešća potreba je kod definiranja novog
koordinatnog sustava za skup elemenata primjenom transformacija na svaku
koordinatu specificiranu u skupu elemenata. Grupiranje se u SVG postiže
korištenjem elementa g. Skup elemenata može biti određen kao grupa, njihovim
uključivanjem unutar g. Na primjer:
<g style="fill:red;stroke:black">
<circle cx="70" cy="100" r="50" />
<rect x="150" y="50" rx="20" ry="20" width="135" height="100"
/>
<line x1="325" y1="150" x2="375" y2="50" />
<polyline points="50, 250 75, 350 100, 250 125, 350 150, 250
175, 350" />
<polygon points=" 250, 250 297, 284 279, 340 220, 340 202,
284" />
<ellipse cx="400" cy="300" rx="72" ry="50" />
</g>
Element g može imati bilo koji od atributa ili značajki stila, definirane samo za njega,
koje su primjenjive na druge grafičke elemente. U primjeru iznad, svi osnovni oblici
će biti nacrtani s crvenom unutrašnjosti i crnom granicom.
3.11. Transformacije koordinata
Atribut transform primijenjen u g elementu, definira transformaciju nad svim
koordinatama u grupi. Na primjer:
39
<g transform="translate(100,0)">
<circle cx="70" cy="100" r="50" />
<rect x="150" y="50" rx="20" ry="20" width="135" height="100"
/>
</g>
Umjesto kruga nacrtanog sa centrom na točci (70,100), sada će centar biti pomaknut
na koordinate (170,100). Pravokutnik će imati gornji lijevi kut na (250,50) umjesto
(150,50). Dakle, korisna metoda definiranja kompozicije nad nekoliko grafičkih
objekata određuje svaki objekt kao grupu korištenjem odgovarajućeg koordiniranog
sustava i potom upotrebljava transformacije primijenjene nad grupom da bi dobili
grafički prikaz kao cjelinu. Grupe mogu biti ugniježđene do bilo koje dubine i
preobrazbe se primjenjuju na svaku od njih. Moguće preobrazbe su:
Transformacija Značenje Parametri
translate translacija koordinata x i y određuju vrijednost translacije
scale množenje koordinata sx i sy, množi x i y sa s
rotate rotacija oko točke kut, x i y
skewx pogreška po x-osi kut u stupnjevima, x=y*tan(angle)
skewy pogeška po y-osi kut u stupnjevima, y=x*tan(angle)
Tablica 2. Transformacije u SVG-u
Atribut transform može se sastojati od niza individualnih transformacija u kojem
slučaju se one izvode s lijeva na desno. Isti efekt se može postići na čitljiviji način
ugnježđivanjem nekoliko g elemenata, svakog s jednom transformacijom.
3.12. Ispunjavanje površina
Glavne značajke popunjavanja, koje mogu biti određene ili kao atributi ili kao
značajke osnovnih SVG elemenata, putova, teksta ili grupe su:
• fill - metoda ispunjavanja područja sa nekom bojom. Vrijednost none
definira da područje nije ispunjeno.
40
• opacitiy - govori o prozirnosti boje područja.
• fill-rule - koristi se za složene putove, definicija kako će biti ispunjeno
područje.
Primjer koji koristi sve tri mogućnosti: <path style="fill:red;opacity:0.5;fill-rule:evenodd"
d="M10,20h100v50h-80v-70h-20v20z" />
Boje se koriste za različite operacije u SVG-u, uključujući ispunjavanje i
naglašavanje. Boja može biti definirana na dva načina:
• ime boje (red, green)
• numerički, RGB specifikacijom
<rect width="10" height="10" style="fill:coral" />
<rect width="10" height="10" style="fill:rgb(255,127,80)" />
<rect width="10" height="10" style="fill:#f75" />
<rect width="10" height="10" style="fill:#ff7f50" />
Ispunjavanje područja definiranog nekim putem, osnovnim grafičkim elementima ili
tekstom, zahtijeva jasnu definiciju što je unutar granica, a što je vani. Za jednostavne
putove koji se ne sijeku, unutrašnjost je očita. Međutim, za put koji križa sebe ili se
sastoji od nekoliko segmenata, definicija unutrašnjosti i vanjštine je manje jasna.
SVG definira dvije metode kojima se može definirati unutrašnjost:
• evenodd: broji se broj sječenja linije između točke i beskonačnosti, ako broj je
neparan, točka je unutar područja i trebati biti ispunjena.
• nonzero: koliko puta element puta prolazi oko točke. Ako je broj različit od
nule, točka je unutra.
Slika 13. pokazuje različite rezultate koji se dobiju uporabom gornjih metoda.
41
Slika 13. Pravila ispunjavanja
3.13. Naglašavanje linija
Dio značajki kojima se postiže naglašavanje linija:
• stroke: metoda prikazivanja obrisa sa bojom. Moguće vrijednosti su iste kao
i za fill značajku.
• stroke-width: definira širinu obrisa.
• stroke-dashaarray: definira stil linije (dotted, solid, dashed).
• stroke-dashoffset: za isprekidanu liniju; pokazuje gdje bi uzorak trebao
početi.
• stroke-linecap: definira način prikazivanja kraja linije.
• stroke-linejoin: definira kako će biti prikazan spoj između dvije linije.
Načini naglašavanja obrisa su prikazani na slici 14.
42
Slika 14. Značajke naglašavanja obrisa
3.14. Interakcija u SVG-u
Kada se Web dokument (neki od jezika baziranih na XML-u) učitava u preglednik,
dokument se parsira i stvara se unutarnja struktura koja se koristi za prikazivanje
načina na koji je dokument kreiran. Za manipulaciju tim strukturama se koristi DOM
(eng. Document Object Model) sučelje. DOM dozvoljava upotrebu skriptnih jezika
čime se postiže dinamička modifikacija Web dokumenata unutar preglednika.
Modifikacije dokumenta pomoću DOM-a se obično okidaju na događaj u pregledniku,
npr. pomicanjem miša iznad određenog dijela dokumenta, klikom iznad nekog
poligona i sl. U slijedećem primjeru su ilustrirane osnovne ideje.
<svg width="500" height = "500">
<script language="JavaScript"
type="text/javascript">
<![CDATA[
function onmouseover(evt) {
var elem = evt.target;
var style = elem.getStyle();
43
style.setProperty("fill-opacity", 0.5);
}
function onmouseout(evt) {
var elem = evt.target;
var style = elem.getStyle();
style.setProperty("fill-opacity", 1.0);
}
]]></script>
<rect x="20" y="20" width="250" height="250" style="fill:red;
stroke:none"
onmouseover="onmouseover(evt)" onmouseout="onmouseout(evt)" />
<rect x="210" y="210" width="250" height="250"
style="fill:green; stroke:none"
onmouseover="onmouseover(evt)" onmouseout="onmouseout(evt)" />
</svg>
Interaktivnost dokumenta je prikazana na slikama 15. i 16.
Slika 15. Interaktivnost SVG dokumenta (1) Slika 16. Interaktivnost SVG dokumenta (2)
Atributi onmouseover i onmouseout specificiraju imena skriptnih funkcija koje se
pozivaju kad se pripadni događaj i dogodi. Određivanje elementa u stablu DOM-a se
44
određuje pomoću parametara koji se šalju funkciji. Funkcija onmouseover mijenja
značajku fill-opacity (prozirnost) elementa na vrijednost 0.5. Ova funkcija se
poziva kada se mišem dođe iznad područja prekrivenog pravokutnikom. Funkcija
onmouseout vraća prozirnost na inicijalnu vrijednost (1.0). Ova funkcija se poziva
kada se miš pomakne izvan područja pravokutnika.
Neki od događaja na koje se obavlja okidanje su:
• onclick
• onactivate
• onmousedown
• onmouseover
• onmousemove
• onmouseout
• onload
Događaj onactivate je širi pojam od događaja onclick i djeluje i za ostale
uređaje, a ne samo za miš. Element onload je osnovna metoda za aktiviranje
skripte kada se učitava SVG dokument.
U SVG-u se mogu koristiti razni skriptni jezici (EcmaScript, JavaScript). Za ovaj
primjer je odabran JavaScript. Definiranje skripte unutar SVG dokumenta se
ostvaruje sljedećom shemom.
<script language="JavaScript" type="text/javascript">
<![CDATA[
... funkcije definirane u skripti ...
]]></script>
Uključivanje vanjskog JavaScript dokumenta u SVG dokument se ostvaruje
naredbom <script xlink:href="file_name" />.
45
U tablici 3. se nalaze funkcije, varijable i metode koje su definirane i mogu se koristiti
u oblikovanju skripte.
Ime Tip Parametri Opis Primjer
evt varijabla nema varijabla na koju se SVG fokusira
<svg width="400" height="200" onload="funkcija(evt)">
ownerDocument getOwnerDocument()
funkcija nema vraća SVG dokument svgdoc = evt.target.ownerDocument()
target getTarget() funkcija nema
vraća objekt na koji se fokusira
objekt = evt.target
getElementById("rectangle") funkcija ID objekta
vraća objekt sa ID kao parametrom
objekt=svgdoc.getElementById("rectangle")
getAttribute("id") funkcija ime atributa vraća vrijednost atributa
širina=objekt.getAttribute("width")
setAttribute("id",vrijednost) metoda ime atributa i
vrijednost pridjeljuje vrijednost atributu
objekt.setAttribute("width",300)
setAttributeNS("...","xlink:href",vrijednost) metoda
NS referenca, atribut i vrijednost
pridjeljuje vrijednost atributu (za NS–prostor oznaka)
objekt.setAttributeNS("...","xlink:href", truc.htm)
Style getStyle() funkcija nema vraća stil aspect=objekt.style
setProperty("fill",vrijednost) metoda ime značajke
i vrijednost pridjeljuje vrijednost značajki
objekt.getStyle().setProperty("fill","red")
getPropertyValue("fill") funkcija ime značajke
vraća vrijednost značajke
boja=objet.getStyle().getPropertyValue ("fill")
attributes funkcija nema vraća atribute objekta kao imenovanu listu čvorova
att=objekt.attributes att.length – daje broj atributa att.item(i) – odnosi se na i-ti atribut att.item(i).name – daje njegovo ime att.item(i).value – daje njegovu vrijednost
createElement("rect") funkcija tip objekta kreira objekt Novi=svgdoc.createElement("rect")
appendChild(novi) metoda ime objekta umeće objekt kao dijete čvora
cvor.appendChild(novi)
replaceChild(novi,stari) metoda objekti
zamjenjuje stari čvor s novim
cvor.replaceChild(novi,stari)
insertBefore(novi,pozicija) metoda objekti umeće novi
objekt ispred cvor.insertBefore(novi,stari)
46
pozicije
createTextNode("tra la la") funkcija tekst kreira čvor s
tekstom tekst=svgdoc.createTextNode("tra la la");
setData("tra la la") metoda tekst pridjeljuje tekst djetetu tekstualnog čvora
objekt.setData("tra la la")
firstChild getFirstChild() funkcija nema vraća prvo
dijete čvora tekst=objekt.firstChild
addEventListener ("mousemove",funkcija,false)
metoda događaj, funkcija false
kreira događaj za objekt
objekt.addEventListener ("mousemove",alert,false)
removeChild(dijete) metoda ime objekta briše imenovano dijete čvora
cvor.removeChild(dijete)
cloneNode(true) funkcija false ili true kopira objekt i svu njegovu djecu ako je true
novi=objekt.cloneNode(true)
getCharCode() funkcija nema vraća kod pritisnute tipke tipka=evt.getCharCode()
String.fromCharCode (key) funkcija kod
vraća znakovnu vrijednost ključa
vrijednost = String.fromCharCode(key)
clientX getClientX() funkcija nema
vraća x vrijednost pokazivača u SVG-u
x_mouse=evt.clientX
clientY getClientY() funkcija nema
vraća y vrijednost SVG-u
y_mouse=evt.clientY
screenX getScreenX() funkcija nema
vraća x pokazivača u HTML-u
x_mouse=evt.screenX
screenY getScreenY() funkcija nema
vraća y pokazivača HTML
y_mouse=evt.screenY
childNodes getChilNodes() funkcija nema vraća djecu
čvora u listi grupa=node.childNodes
getElementsByTagName(tag) funkcija tip objekta
"*" džoker vraća djecu po tipu u listi
grupa=node.getElementsByTagName('rect')
length getLenght() funkcija nema
vraća broj objekata liste čvorova
broj=grupa.lenght
item(n) funkcija integer >=0 vraća ime objekta lista objekt=grupa.item(1)
nodeType funkcija nema vraća tip čvora i=objekt.nodeType
nodeName funkcija nema vraća ime čvora ima=objekt.nodeName
47
getCharNumAtPosition(d) funkcija SVGPoint
vraća kod znaka na poziciji
kod=objekt.getCharNumAtPosition(d)
getExtentOfChar(i) funkcija integer >=0
vraća pravokutnik oko slova kao SVGRect objekt
trace=objekt.getExtentOfChar(5); trace.x, trace.y, trace.width i trace.height
getStartPositionOfChar(i) getEndPositionOfChar(i)
funkcija integer>=0
vraća donju lijevu koordinatu slova kao SVGPoint
p=objekt.getStartPositionOfChar(1); p.x i p.y su koordinate
getNumberOfChars() funkcija nema vraća broj slova dužina=objekt.getNumberOfChars()
getComputedTextLength() funkcija nema
vraća broj točaka koje trebaju da bi se prikazao string
zauzmi=objekt.getComputedTextLength()
selectSubString(i,j) metoda indeks starta i duljina stringa
selektira podniz objekt.selectSubString(0,2)
getBBox() funkcija nema vraća granice oko objekta kao SVGRect object
trace=objekt.getBBox; trace.x, trace.y, trace.width i trace.height
getCTM() funkcija nema vraća matricu transformacija matrica=objekt.getCTM()
Inverse funkcija nema vraća inverz matrice inverzna_matrica=matrice.inverse
multiply(matrica2) funkcija matrica množi sa matricom2 rezultat=matrica1.multiply(matrica2)
currentScale broj Nema vraća faktor uvećanja currentScale=2
Tablica 3. Funkcije, metode i varijable JavaScript-a
Dublji prikaz i ostale mogućnosti SVG-a (animacije, uporabe filtara i dr.) se mogu
naći na Adobeovim stranicama.
48
4.Upotreba XSLT-a u vizualizaciji GML podataka
Glavna tema ovog poglavlja je opis načina na koje se GML podaci mogu vizualizirati
transformacijom u SVG format, odnosno, uloga XSLT-a (eng. Extensible Stylesheet
Language Transfomation) u tom procesu. Budući da XML ne upotrebljava unaprijed
definirane oznake, generički XML procesor koji čita XML dokument nema pojma što
je autor mislio pri dokumentiranju i kako je to želio predstaviti. Zato mora postojati
dodatni dokument koji pruža informaciju kako to predstaviti, a to je XSL.
XSL je specifikacija razvijena od strane World Wide Web konzorcija (W3C) za
formatiranje XML-a koja se dokumentira na uobičajeni način. Specifikacija definira da
je XSL jezik kojim se izražava lista pravila (stylesheet). Liste pravila se koriste za
opisivanje načina kako bi sadržaj danog strukturiranog dokumenta trebati biti
predstavljen. XSL se sastoji od triju sastavnih jezika koji su opisana W3C
standardom. To su XSLT, XSL Formatting Objects (XSL-FO) i XML Path Language
(Xpath). XSLT i XSL-FO mogu međusobno neovisno funkcionirati.
XSLT je najvažniji dio XSL standarda. On sadrži elemente koji definiraju pravila kako
se jedan XML dokument pretvara u drugi XML, HTML ili tekstualni dokument. Ako je
transformirani dokument u XML-u, može upotrijebiti tagove i DTD od izvornog
dokumenta ili može upotrijebiti sasvim drugačiji skup elemenata. XSLT može dodati
nove elemente u izlazni dokument, ukloniti postojeće elemente, preurediti sortiranje
elemenata i odlučivati kroz odgovarajuće liste pravila.
Transformacija se može izvršiti na tri glavna načina. Prvo, XML dokument i
pripadajuća lista pravila može biti dan Web pregledniku, koji zatim transformira
dokument kako je specificirano listom pravila. Druga mogućnost je da Web server
primijeni XSLT listu pravila na XML dokument i pošalje transformirani dokument
korisniku. Treća mogućnost je da XSLT procesor transformira izvorni XML dokument
u navedeni format po listi pravila, prije nego što je dokument stavljen na server. Svaki
49
od ovih triju pristupa upotrebljava drugačiju programsku podršku, iako svi
upotrebljavaju isti XML dokument i XSLT listu pravila. Pri tome se preferira treći
pristup kao najprikladniji za ostvarivanje željenih ciljeva.
4.1. XSL-FO i XPath
XSL-FO je XML aplikacija koja opisuje kako će dokument izgledati kada ga bude
čitao korisnik. To je omogućeno formatiranjem pomoću formatirajućih objekata i
formatirajućih svojstava pridijeljenih svakom objektu.
Xpath je jezik za referenciranje specifičnih dijelova XML-a dokumentira, bitan za
slučajeve gdje je potrebno odrediti točan dio dokumenta koji će biti transformiran
XSLT-om. Xpath ima proširivu sintaksu, temeljenu na znakovnim nizovima, koja
opisuje put između pojedinih dijelova jednog ili više dokumenata pomoću
path/file sintakse.
4.2. Stabla i čvorovi
Stablo je podatkovna struktura sastavljena od povezanih čvorova čiji početni čvor se
naziva korijen. Zato je svaki pravilno formiran (well-formed) XML dokument stablo.
Korijen je spojen sa svojim čvorovima djecom, od kojih je svaki spojen sa nula ili više
vlastitih čvorova djece. Najkorisnija značajka stabla je da svaki čvor i njegova djeca
također formira novo stablo. Tako je stablo zapravo hijerarhijska struktura stabala u
kojoj je svako stablo izgrađeno od manjih stabala. XSLT modelira XML dokument
kao stablo koje sadržava sedam vrsta čvorova: korijen, elemente, tekst, svojstva,
oznake imena, procesne instrukcije i komentare.
XSLT lista pravila je u osnovi skup pravila za transformaciju XML dokumenata. U
slučaju vizualizacije podataka, uloga XSLT-a je da transformira XML sadržaj
50
podataka u format pogodan za grafičko prikazivanje, kao na primjer HTML/XHTML,
SVG, XSL-FO, tekst ili bilo koji drugi strukturirani format. Međutim, tradicionalni
XSLT-ovi kodiraju informaciju o izgledu teksta i rasporedu sadržaja. Ali, u kontekstu
GIS-a, GML podaci temeljeni na XML-u moraju biti predstavljeni u grafičkom formatu
SVG-u koji je XML temeljen jezik za opisivanje 2D grafike.
4.3. XSLT struktura i elementi
XSLT lista pravila se sastoji od skupa pravila koja se nazivaju predložak (template).
Predložak sadržava skup pravila koja se dijele na dva dijela; uzorak koji se
uspoređuje sa čvorovima u izvornom stablu i sačinjava dio rezultata izlaznog stabla.
To dopušta listi pravila da bude primjenljiva na široku klasu dokumenata koji imaju
slične izvorne strukture stabla.
Kao i bilo koji drugi XML dokument, XSLT lista pravila počinje s XML deklaracijom.
Sljedeća linija je ili element <xsl:stylesheet> ili element <xsl:transform>
koji su sinonimi i definiraju početak liste pravila i korijenski element. U njima mora biti
deklarirana verzija XSLT-a na kojoj se lista pravila bazira. XSLT atribut xmlns
definira prostor oznaka imenom:
xmlns:xsl="http://www.w3.org/1999/XSL/Transform
(dogovorno se ”xsl” prefiks koristi za označavanje XSLT prostora oznaka). Osnovna
struktura liste pravile je definirana: <?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<!- predlošci idu ovdje-- >
</xsl:stylesheet>
51
4.4. Predložak
Predložak pravila je definiran elementom <xsl:template> i najvažniji je dio XSLT
liste pravila. Svaki <xsl:template> element sadržava pravila koja se primjenjuju
kada se navedeni čvor pronađe u izvornom dokumentu. Ova pravila opisuju
doprinose pojedinih pronađenih čvorova koji se dodaju izlaznom dokumentu. Pravila
mogu sadržavati i tekst koji će se pojaviti doslovno u izlaznom dokumentu i XSLT
naredbe koje kopiraju dijelove ulaznog XML dokumenta u rezultat.
Sljedeći primjer predloška transformira čvorove FeautreMember u ulaznom
dokumentu, dodaje sadržaj od čvorova djece koji se zovu identification i type i
stvara <g> element u izlaznom dokumentu s atributima id i class. Također,
upotrebljava drugi predložak za procesiranje čvora Polygon.
<xsl:template match="//FeatureMember">
<xsl:variable name="ID" select="identification"/>
<xsl:variable name="Tip_cvora" select="type"/>
<xsl:element name="g">
<xsl:attribute name="id">
<xsl:value-of select="$ID"/>
</xsl:attribute>
<xsl:attribute name="class">
<xsl:value-of select="$Tip_cvora"/>
</xsl:attribute>
<xsl:apply-templates select="..//gml:Polygon"/>
</xsl:element>
</xsl:template>
Podudarnost je opisana atributom match koji specificira na koji se čvor ulaznog
dokumenta odnosi predložak. Također se njime može definirati predložak za cijeli
XML dokument (s match="/" se definira cijeli dokument, ".." označava roditeljski
52
čvor, a "." trenutni). Kada XSLT procesor čita ulazni dokument, korijen je prvi čvor
koji nađe i tada se izvršavaju pravila koja su definirana za korijenski element.
Da bi se doseglo dalje od korijena, koristi se element <xsl:apply-template>.
Kod uključivanja ovog elementa, parser će uspoređivati svaki čvor dijete od trenutnog
čvora s predlošcima u listi pravila, i ako je pronađena podudarnost, izvršiti predložak
za svaki takav pronađeni čvor. Atribut select se označavaju djeca koja će biti
izabrana.
Atributom match se može odrediti podudarnost čvorova po imenu elementa,
čvorovima djece, roditeljima, atributima, ID-u elemenata, komentarima, tekstu, kao i
primjenom jednostavnih testova na nekima od ovih elemenata.
4.5. Selektiranje čvorova
Atribut select se koristi u xsl:apply-template, xsl:value-of, xsl:for-
each, xsl:copy-of, xsl:variable, xsl:param i xsl:sort za
specificiranje točno određenih čvorova nad kojima se vrši transformacija. Vrijednost
ovog atributa je izraz napisan u XPath-u. XPath jezik pruža sredstva identificiranja
određenog elementa, grupe elemenata, dijela teksta ili nekog drugog dijela XML
dokumenta. XPath pruža nekoliko poveznica koje mogu biti korištene pri odabiru
dijelova stabla, odnosno prema kontekstnom čvoru. Inicijalno je kontekstni čvor onaj
čvor na koji se odnosi predložak.
4.6. Imenovani predlošci
Element <xsl:template> može imati atribut name kojim može biti direktno pozvan,
čak i onda kada nije direktno primjenjiv. Takvi predlošci se zovu imenovani predlošci.
53
Imenovani predlošci se koriste za ponavljanje liste pravila unutar nekog drugog
predloška i omogućuju uključivanje podatka s mjesta od kuda je predložak pozvan.
Element <xsl:call-template> se koristi za pozivanje takvog predloška
4.7. Sadržaj izlaza
U transformaciji XML dokumenta često je nužno uključiti nove elemente, atribute,
procesne naredbe, komentare i sl. u izlazni dokument da bi se dobila željena izlazna
struktura. Na primjer, izlaz XSLT liste pravila dizajniran za transformaciju GML
sadržaja u SVG, treba udovoljiti SVG specifikaciji. To se postiže odgovarajućim XSL
elementima kao na primjer xsl:element, xsl:attribute, xsl:processing-
instruction, xsl:comment i xsl:text i atributnim vrijednostima predloška.
Atributne vrijednosti kopiraju podatke iz ulaznog dokumenta u atributne vrijednosti na
izlazu. Element <xsl:element> umeće novi element u izlazni dokument. Ime
ubačenog elementa je dano vrijednošću atributa name, a sadržaj je definiran
vrijednošću elementa <xsl:element>. Element <xsl:attribute> definira ime
atributa i njegovu vrijednost, i umeće ih u elemente izlaznog dokumenta. Zato se
mora pojaviti kao dijete od <xsl:element>. Kada se ista grupa atributa primjenjuje
u mnogim različitim elementima, takav skup atributa može biti određen kao element
na najvišoj razini stabla pomoću oznake <xsl:attribute-set> i umetnuti gdje
god je potrebno sa <xsl:use-attribute-sets>.
<xsl:processing-instruction> element stavlja procesnu naredbu u izlazni
dokument. Cilj procesne naredbe je specificiran atributom name, a sadržaj
<xsl:processing-instruction> elementa postaje sadržaj same procesne
naredbe. Elementi <xsl:comment> i <xsl:text> umeću komentare, odnosno
tekst u izlazni dokument.
54
4.8. Izlazne metode
Većina XSLT procesor podržava tri tipa izlaznih metoda: XML, HTML i Text. XSLT
procesor se ponaša drukčije, ovisno o tome koja od izlaznih metoda je specificirana.
Izlazna metoda je određena elementom najviše razine <xsl:output>.
XSLT ne pruža elemente za opisivanje unutarnjeg DTD podskupa za izlazni
dokument. Međutim, može se pomoću atributa doctype-system i doctype-
public elementa <xsl:output> uključiti DOCTYPE deklaracija koja ukazuje na
vanjski DTD.
Atributom indent elementa <xsl:output>, koji ima dvije vrijednosti “yes” i
“no”, se ostvaruje umetanje praznih mjesta u izlazni dokument, radi bolje čitljivosti.
4.9. Umetanje lista pravila
XSLT lista pravila se može direktno umetnuti u XML dokument. U tom slučaju
<xsl:stylesheet> element se mora pojaviti kao dijete elementa kojim se definira
XSLT dokumenta i ima ID atribut koji mu daje jedinstveno ime. Taj atribut se
pojavljuje kao vrijednost atributa href u elementu XML-stylesheet označen
pomoću znaka #:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xml" href="#mystyle"?>
<Root_Element>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
id="mystyle">
55
<xsl:template match="/">
<!—Sadržaj predloška ide ovdje-->
</xsl:template>
<!—Drugi predlošci idu ovdje-->
<xsl:template match="xsl:stylesheet"/>
</xsl:stylesheet>
<!—ostatak podataka ide ovdje-->
.....
.....
</Root_Element>
4.10. Stvaranje XSLT liste pravila
XSLT lista pravila mora biti pravilno oblikovan XML dokument i bi treba udovoljiti
XSLT specifikaciji koja opisuje je dopuštenu sintaksu. Sadržaj lista pravila u
potpunosti ovisi o ulaznoj strukturi dokumenta i zahtijevanoj izlaznoj strukturi.
Sljedeće smjernice se koriste u kreiranju XSLT liste pravila čiji je cilj transformacija
GML dokumenta u SVG.
1. XML deklaracija. <?xml version="1.0" encoding="UTF-8"?>
2. Korijenski element liste pravila uključuje verziju i prostor oznaka (uključujući
sve prostore nađene ulaznom dokumentu). <xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:gml="http://www.opengis.net/gml"
xmlns:xlink="http://www.w3.org/1999/xlink">
3. Deklariranje elemenata najviše razine.
56
<xsl:output method="xml" encoding="UTF-8" standalone="no"
indent="yes" omit-xml-declaration="no" media-
type="text/xml"
doctype-public="-//W3C//DTD SVG 20010904//EN"
doctype-system="http://www.w3.org/TR/2001/REC-SVG-
20010904 /DTD/svg-10.dtd"/>
Ova lista pravila proizvodi sljedeće deklaracije u izlaznom dokumentu. <?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg-
10.dtd">
4. Predložak koji kreće od korijenski element ulaznog dokumenta. Ovo može
uključivati mnoge izračune da bi se odredile vrijednosti atributa za korijenski
element izlaznog dokumenta i drugih predložaka u listi pravila. <xsl:template match= "/">
5. Procesne instrukcije trebaju biti uključene ovdje. To se odnosi na vanjske liste
pravila. <xsl:processing-instruction name="xml-stylesheet">
href="Style.css" type="text/css"
</xsl:processing-instruction>
To će dati u izlaznom dokumentu: <?xml-stylesheet href="Style.css" type="text/css" ?>
6. Stvoriti korijen element i povezati atribute u izlaznom dokumentu. <xsl:element name="svg">
<xsl:attribute name="xml:space">preserve</xsl:attribute>
<xsl:attribute name="width">100%</xsl:attribute>
...
...
Primjer za izlaz ovog dijela liste pravila je:
57
<svg xml:space="preserve" width="100%" height="100%"
viewBox="158000 -434000 2000 2000"
id="svgAll" onmousemove=" showCoords(evt)"
onzoom="resetCoords()" onscroll="resetCoords()"
onload="startMap(evt)">
7. Stvoriti elemente najviše razine u izlaznom dokumentu. <xsl:element name="script">
<xsl:attribute
name="xlink:href">External.js</xsl:attribute>
<xsl:attribute
name="type">text/javascript</xsl:attribute>
</xsl:element>
Time smo kreirali element <script> u izlaznom dokumentu koji se
referencira na vanjskom Display.js JavaScript dokument. <script xlink:href="Display_Data.js"
type="text/javascript"/>
8. Kreiranje čvorova djece u izlaznom dokumentu, u skladu sa hijerarhijom u
ulaznom dokumentu. <xsl:apply-templates select="//Feature"/>
<xsl:apply-templates select="//FeatureMember"/>
....
....
9. Primijeniti ostale predloške i imenovane predloške. Na primjer, u vizualizaciji
geografskih podataka, mreže linija granica, teksta i drugih efekata koji će
napraviti prezentaciju sadržajnijom. Sljedeći fragment poziva predložak kojim
se crtaju granice. <xsl:call-template name="Grids">
<xsl:with-parem name="Max_X" select="$Max_X"/>
....
....
</xsl:call-template>
58
10. Zatvoriti korijenski element u izlaznom dokumentu. </xsl:element>
11. Zatvoriti listu pravila koja se odnose na korijenski element ulaznog
dokumenta. </xsl:template>
12. Deklarirati predloške koje selektiraju čvorove djecu. Ovo su stvarni predlošci
koji utječu na selektirani čvor spominjan u osmoj točci. <xsl:template match="Feature">
<!—lista pravila ide ovdje-->
</xsl:template>
<xsl:template match="FeatureMember ">
<!—lista pravila ide ovdje-->
</xsl:template>
13. Deklarirati imenovane predloške. <xsl:template name="Grids">
<!—lista pravil ide ovdje-->
</xsl:template>
14. Zatvoriti korijenski element liste pravila. </xsl:stylesheet>
4.11. XSLT Procesori
Da bi se izvele transformacije definirane u XSLT listi pravila, mora postojati drugi
program nazvan XSLT procesor, zato što su i izvorni XML dokument i lista pravila
obični tekstualni dokumenti koje treba povezati. XSLT procesor uzima kao ulaz XML
dokument i listu transformacija XML dokumenta. Procesor u transformaciji prolazi
59
kroz stablo strukture XML dokumenta, promatrajući svaki čvor redom, i uspoređuje
ga s uvjetom svakog predloška definiranog u listi pravila. Kada procesor nađe čvor
koji se poklapa s uvjetom predloška, izvršava pravila zapisana u predlošku.
Postoje mnogi XSLT procesori koji su prilagođeni XSLT 1.0 specifikaciji, kao što su i
Instant SAXON, iXSLT, XML Spy, a u ovom radu je korišten Msxsl (opisan nešto
kasnije).
4.12. Zaključak
XML sadržaj može biti predstavljen na više načina. XSLT je W3C specifikacija za
formatiranje XML dokumenta. XSLT lista pravila sastoji se od pravila transformacija,
definiranih u predlošcima, a transformacija se postiže uporabom XSLT procesora.
GML podaci mogu se pretvarati u SVG format korištenjem ove metode. Struktura
XSLT liste pravila potpuno ovisi o strukturi ulaznog i izlaznog dokumenta.
60
5.0. Primjer vizualizacije GML-a
Za primjer vizualizacije GML podataka uzeta je razdjelna električna mreža čije
značajke su opisane u [19]. GML dokument (mreza.gml) je napisan u jednom od
alata pogodnih za pisanje podataka temeljenih na XML standardu. Potom je napisan
pripadajući XSLT (transf.xsl) kojim će se taj GML dokument transformirati u SVG
koji će se moći grafički predočiti u MS InternetExplorer pregledniku. Za povezivanje
GML dokumenta i pripadajućeg XSLT-a služi alat msxsl koji će biti opisan u poglavlju
5.2. Listing koda za dokument mreža.gml se nalazi u dodatku C, dok se listing koda
za datoteku transf.xsl nalazi u dodatku D.
5.1. XMLNotepad
Za pisanje GML dokumenta mreža.gml korišten je program XMLNotepad (slika 17).
To je program koji olakšava pisanje XML temeljenih aplikacija i provodi validaciju. U
lijevom polju je prikazana struktura dokumenta, dok se u desnom nalaze vrijednosti
pojedinih svojstava i njihovih značajki. Unošenje se obavlja jednostavnim klikom
iznad polja, dok se imena značajki i svojstava (i njihovo dodavanje ili brisanje) mogu
promijeniti klikom iznad samog imena.
61
Slika 17. XML Notepad
Ukoliko GML dokument nije valjan (well-formed), što znači da nije napisan u skladu s
pripadajućim DTD-ovima (gmlFeature.dtd i gmlGeometry.dtd) koji se nalaze u istoj
datoteci, XMLNotepad će pri ponovnom učitavanju tog GML dokumenta javiti grešku
(prikazano na slici 18). Listing gmlFeature.dtd se nalazi u dodatku A, dok se listing
gmlGeometry.dtd nalazi u dodatku B.
Slika 18. Greška koju javlja XMLNotepad ukoliko izvorni kod nije valjan
62
5.2. Msxsl
Msxsl.exe je alat koji se pokreće iz komandne linije datoteke u kojoj su smješteni
GML dokument i njegov pripadni XSLT i primjenjuje transformaciju zapisanu u XSLT-
u na GML dokument koristeći Microsoft XSL processor. Unutar njega se nalazi
Microsoft XML Parser 4.0 (msxml4.dll) koji izvodi transformaciju. Ukoliko navedemo
opciju –o (prikazano na slici 19) dobiveni izlaz će se zapisivati u izlaznu datoteku.
Slika 19. Msxsl komandni prozor
Komandna linija izgleda ovako:
E:\Martin\DIPLOMSKI>msxsl source stylesheet [options]
[param=value...] [xmlns:prefix=uri...]
Najbitnije opcije su:
- o filename ispisuje izlaz u imenovanu datoteku
- v provjerava da li je izvorni dokument valjano pisan
- t daje informaciju o vemenu učitavanja i vremenu transformacije
- koristi se kad se bilo izvorni dokumnet, bilo stylesheet unose sa
stdin ulaza.
63
Dakle, izvršenjem naredbe msxsl mreza.gml transf.xsl –o proba31.svg
dobili smo izlaznu datoteku u formatu SVG (nebitno je da li napišemo ekstenziju svg
ili svgz jer se transformacija iz GML formata u SVG format obavlja pomoću
transf.xsl, a ekstenzija izlazne datoteke je bitna samo za InternetExplorer jer on
za formate .svg i .svgz po definiciji pokreće SvgViewer koji je ugrađen u njega .
5.3. Rezultat transformacije prikazan u SVG obliku i vizualiziran pomoću MS IE
Izlazna datoteka proba31.svg će izgledati kao na slici 20.
Slika 20. Izlazna datoteka proba31.svg
64
Karta koju smo dobili predstavlja grafički prikaz dijela razdjelne sheme. Tamno plavi
kružići predstavjaju trafo-stanice čija imena su naznačena desno od svake točke.
Narančastom bojom su prikazani niskonaponski vodovi, a crvenom visokonaponski.
SVG dokument ima neka svojstva interaktivnosti koja su ugrađena u njega pomoću
XSLT-a, a ostvarena jezikom JavaScript. Konkretno, pomicanjem miša preko mreže
(i to samo nacrtanog dijela; pozadina je neosjetljiva jer je prazna) u dnu slike će se
pojaviti trenutne koordinate (ili zadnje koordinate mreže na kojima je miš bio, ako se
trenutno nalazi na praznom području). To je prikazano na slici 21.
Slika 21. Prikazivanje koordinata
65
Isto tako, ugrađen je i atribut onmouseover koji farba dotični element u zeleno kad
se mišem dođe iznad njega (dakle da znamo što ćemo selektirati). Originalna boja se
vraća kad se mišem maknemo izvan dotičnog elementa (pomoću atributa
onmouseout). Kada se klikne iznad selektiranog objekta dobit će se informacije o
njemu (pomoću atributa onclick).
Atributi koji su vezani uz trafo-stanicu mogu se dobiti klikom iznad kružića koji
predstavlja trafo-stanicu. To je prikazano na slici 22.
Slika 22. Ispisivanje atributa i značajki elementa trafo-stanica
66
Zanimljivo je pogledati prva tri atributa koji se nalaze u listi značajki svojstava trafo-
stanica. Prvi je atribut ID (identifikacijska oznaka) koji ima vrijednost 123. Ako se
pogleda karta, vidjet će se da je zelen kružić koji označava trafo-stanicu 123. atributi
cx i cy predstavljaju središte kružića kojim je predstavljena trafo-stanica i imaju
vrijednosti cx=326 i cy=383. Te vrijednosti se poklapaju s vrijednostima
koordinata koje se nalaze u dnu zaslona, što je i logično jer klikom miša iznad
dotične točke taj prozor prestaje biti aktivan (aktivan postaje prozor Alert u kojem se
nalaze vrijednosti značajki) pa prema tome u polju koordinata ostaju zapisane zadnje
vrijednosti, a to su upravo koordinate selektirane točke. Time je dokazana i
ispravnost ugrađene funkcije za određivanje koordinata meže.
Na slici 23. se može vidjeti ispis značajki vezanih uz svojstvo vod.
Slika 23. Ispisivanje atributa i značajki elementa vod
67
Vidljivo je na mapi da je selektiran vod koji spaja TS123 i TS124 jer je taj vod
označen zelenom bojom. U prozoru sa informacijama su navedene tehničke
značajke tog voda.
Još jedno bitno svojstvo SVG-a je da se tekst može selektirati, pretraživati (odnosno,
tekst ostaje tekst). Pretraživanje unutar SVG dokumenta prikazano je na slici 24.
Traženi pojam TS128 SVG je našao i selektirao.
Slika 24. Selektiranje teksta
68
6. Zaključak U informatičkom svijetu postoje stvari koje su do pred par godina bile potpuno
nepoznate, još jučer su bile luksuz, a danas su već nužnost. GML spada među njih.
U ovom radu je pokazana upotreba GML-a u modelu podataka za energetsku
razdijelnu mrežu. Prikaz takvih GML podataka se postiže transformacijom u SVG
format pomoću pripadnog XSLT-a. Grafički prikaz koji dobijemo je interaktivan. To
znači da možemo kreirati izgled mape (odnosno količine informacija na njoj) prema
vlastitoj želji, odabirom pojedinih objekata, odnosno njihovih svojstava. Također, svi
podaci potrebni za prikaz su učitani odmah.
U ubrzanom vremenu u kakvom živimo, korištenje takvih mapa bitno olakšava
snalaženje u prostoru i GML kao otvoreni standard ima svijetlu budućnost na
području geografskih informacijskih sustava.
69
7. Literatura [1] C. F. GOLDFARB, P. PRESCOND, The XML Handbook, Prentice-Hall, NJ
1998.
[2] A. WATT, Designing SVG web graphics, New Riders Publishing, 2002.
[3] A. WATT, C. LILLEY, SVG unleashed, SAMS, Indianapolis, 2002.
[4] D. FLANAGAN, JavaScript, The Definitive Guide, O`Reilly, Sebastopol 1996.
[5] A. H. ROBINSON, J. L. MORISSON, Elements of Cartography. John Wiley &
sons, USA, 1995.
[6] Open GIS Consortium Inc. www.opengis.net/index.htm (GML standard)
[7] Galdos Systems Inc. www.galdos.ca (GML primjeri)
[8] ESRI (ArcGis) www.esri.com/arcexplorer (ArcExplorer)
[9] Adobe www.adobe.com/SVG (definicija SVG standarda)
[10] W3C www.w3.org/XSLT (definicija XSLT standarda)
[11] www.w3schools.com/default.asp (primjeri XSLT-a)
[12] http://gip.inha.ac.kr/ (strategija razvoja GML-a)
[13] www.geoinformatics.com (vijesti iz područja GIS-a) [14] epil.urban.uiuc.edu/GIS/ (primjeri vizualizacije GML-a)
[15] W3C http://www.w3.org/XML/ (XML standard)
[16] www.ec-gis.org/Workshops/7ec-gis/papers/pdf/taladoire.pdf (integracija geo-
prostornih podataka)
[17] Microsoft corporation http://www.microsoft.com, (Microsoft XML Parser User's
Manual, Microsoft XML Core Services (MSXML) 4.0)
[18] M. ŽAGAR, GML, Seminarski rad, Fakultet elektrotehnike i računarstva,
Zagreb, 2003.
[19] T. SLIJEPAC, GML/XML model podataka za razdjelnu mrežu, Diplomski rad,
Fakultet elektrotehnike i računarstva, Zagreb, 2004.
[20] A. NAVARRO, C. WHITE, L. BURMAN, Mastering XML, SYBEX, San
Francisco, 2000.
[21] S. HOLZNER, Inside XML, New Riders, Indianapolis, 2001.
70
8. Sažetak Uvođenje XML-a je omogućilo lagano stvaranje specijaliziranih jezika. Jedan od
takvih je i Geography Markup Language (GML), predložen od strane OpenGIS
Consortiuma (OGC), čija je osnovna namjena prezentacija geografskih podataka.
Standard specificira strukturu za kodiranje podatka, način povezivanja podataka, te
definira prijenos i spremanje podatka u Internet okolini, uključujući i prostorne i
neprostorne značajke pojedinih svojstava. GML modelira geografske podatke kao
svojstva i zbirke svojstava. Međutim, GML ne pruža nikakve informacije o
prezentiranju i zato se sadržaj podataka mora pretvoriti u drugi grafički format.
U ovom diplomskom radu se opisuje vizualizacija GML-a transformiranjem u SVG
(Scalable Vector Graphics) format. Taj format je odabran zato jer se vrlo lako
vizualizira u Web pregledniku MS IE 6.0. Transformacija se obavlja pomoću liste
pravila u XSLT-u.
71
9. Abstract
Introduction of XML has enabled easy creation of specialized languages. One form
is Geography Markup Language (GML), suggested by OpenGIS Consortium (OGC),
whose basic purpose is presentation of geographic data. Standard specifies the
structure for the coding of data, way of connections between data, define the transfer
and data preparation in Internet environment, including spacial and non-spacial
characteristics of geographic features. GML models geographic data as features and
collections of properties. However, GML does not extend information about the
presentation and therefore the data content must be converted into another graphic
format.
In this graduation thesis visualisation of GML and transforming in SVG (Scalable
Vector Graphics) format is described. This format has been chosen as very easily
visualized in Web browser MS IE 6.0. Transformation is performed using the style
sheet defined by XSLT.
72
10. Zahvala
Zahvaljujem se svima koji su me podržavali i imali razumijevanja za nastanak ovog
rada. Posebna zahvala mentoru, prof.dr.sc. Davoru Škrlecu, koji mi je omogućio izbor
ove teme, dao mi smjernice po kojima je rad nastao i pružio pomoć kada je to bilo
potrebno.
73
11. Životopis Rođen sam 14. siječnja 1981. godine u Zagrebu. Nakon završetka osnovne škole
upisujem V. gimnaziju u Zagrebu. Zahvaljujući odličnom uspjehu kroz sve četiri
školske godine, oslobođen sam polaganja mature. Fakultet elektrotehnike i
računarstva u Zagrebu upisujem 1999. godine. 2003. godine dobivam od Fakulteta
priznanje «Josip Lončar» za primjeren uspjeh (5,00) na četvrtoj godini studija
računarstva. Oduvijek sam pokazivao sklonosti prema geografiji pa je i tema
diplomskog rada povezana s tim područjem.
Bavim se raznim sportskim aktivnostima, a posebno plivanjem već 17 godina. U
zadnje vrijeme to je disciplina maraton s dosta dobrim uspjehom. Proteklih godina
studija branio sam boje FER-a. Preostalo slobodno vrijeme namijenjeno je
tečajevima njemačkog i talijanskog jezika te druženju s klasičnom gitarom i
umjetničkom fotografijom.
74
Dodatak A: gmlFeature.dtd (izvor OpenGIS specifikacija) <?xml version="1.0" encoding="UTF-8"?>
<!-- ============================================================== -->
<!-- G e o g r a p h y -->
<!-- M a r k u p -->
<!-- L a n g u a g e -->
<!-- -->
<!-- ( G M L ) -->
<!-- -->
<!-- F E A T U R E D T D -->
<!-- -->
<!-- Copyright (c) 2000 OGC All Rights Reserved. -->
<!-- ============================================================== -->
<!-- The GML Feature DTD includes the GML Geometry DTD as an external
entity reference. -->
<!ENTITY % GMLGEOMETRYDTD SYSTEM "gmlgeometry.dtd">
%GMLGEOMETRYDTD;
<!-- A feature contains a set of properties (simple and/or geometric). In
addition a feature can optionally contain a description. A feature must
specify its feature type by name (typeName). It may optionally provide an
identifier for use within its containing feature collection (identifier)-->
<!ELEMENT Feature (
description?, name?, boundedBy?,
property*, geometricProperty* )>
<!ATTLIST Feature
typeName CDATA #REQUIRED
identifier CDATA #IMPLIED >
<!-- A feature collection has the same definition as a feature, but in
addition a feature collection may contain featureMembers. The boundedBy
element is mandatory for feature collections. -->
75
<!ELEMENT FeatureCollection (
description?, name?, boundedBy,
property*, geometricProperty*,
featureMember* )>
<!ATTLIST FeatureCollection
typeName CDATA #REQUIRED
identifier CDATA #IMPLIED >
<!-- A featureMember can be a Feature or a FeatureCollection. The name of
the relationship between the containing FeatureCollection and contained
Features is specified by the typeName attribute. -->
<!ELEMENT featureMember ( Feature | FeatureCollection )>
<!ATTLIST featureMember
typeName CDATA #REQUIRED >
<!-- Simple properties hold the property value as parsed character data.
The type of the value is specified by the type attribute, which defaults to
the 'string' type. The name of the property is specified by the typeName
attribute. -->
<!ELEMENT property (#PCDATA)>
<!ATTLIST property
typeName CDATA #REQUIRED
type ( boolean | integer | real | string ) "string" >
<!-- Geometric properties hold the property value as a contained geometry
element. The name of the property is specified by the typeName attribute.
-->
<!ELEMENT geometricProperty (%GeometryClasses;)>
<!ATTLIST geometricProperty
typeName CDATA #REQUIRED >
76
Dodatak B: gmlGeometry.dtd (izvor OpenGIS specifikacija) <!-- ============================================================== -->
<!-- G e o g r a p h y -->
<!-- M a r k u p -->
<!-- L a n g u a g e -->
<!-- -->
<!-- ( G M L ) -->
<!-- -->
<!-- G E O M E T R Y D T D -->
<!-- -->
<!-- Copyright (c) 2000 OGC All Rights Reserved. -->
<!-- ============================================================== -->
<!-- the coordinate element holds a list of coordinates as parsed character
data. Note that it does not reference a SRS and does not constitute a
proper geometry class. -->
<!ELEMENT coordinates (#PCDATA) >
<!ATTLIST coordinates
decimal CDATA #IMPLIED
cs CDATA #IMPLIED
ts CDATA #IMPLIED >
<!-- the Box element defines an extent using a pair of coordinates and a
SRS name. -->
<!ELEMENT Box (coordinates) >
<!ATTLIST Box
ID CDATA #IMPLIED
srsName CDATA #REQUIRED >
<!-- ============================================================== -->
<!-- G E O M E T R Y C L A S S D e f i n i t i o n s -->
<!-- ============================================================== -->
<!-- a Point is defined by a single coordinate. -->
<!ELEMENT Point (coordinates) >
<!ATTLIST Point
ID CDATA #IMPLIED
srsName CDATA #IMPLIED >
77
<!-- a LineString is defined by two or more coordinates, with linear
interoplation between them. -->
<!ELEMENT LineString (coordinates) >
<!ATTLIST LineString
ID CDATA #IMPLIED
srsName CDATA #IMPLIED >
<!-- a Polygon is defined by an outer boundary and zero or more inner
boundaries. These boundaries are themselves defined by LinerRings. -->
<!ELEMENT Polygon (outerBoundaryIs, innerBoundaryIs*) >
<!ATTLIST Polygon
ID CDATA #IMPLIED
srsName CDATA #IMPLIED >
<!ELEMENT outerBoundaryIs (LinearRing) >
<!ELEMENT innerBoundaryIs (LinearRing) >
<!-- a LinearRing is defined by four or more coordinates, with linear
interpolation between them. The first and last coordinates must be
coincident. -->
<!ELEMENT LinearRing (coordinates) >
<!ATTLIST LinearRing
ID CDATA #IMPLIED >
<!-- a MultiPoint is defined by zero or more Points, referenced through a
pointMember element. -->
<!ELEMENT MultiPoint (pointMember+) >
<!ATTLIST MultiPoint
ID CDATA #IMPLIED
srsName CDATA #IMPLIED >
<!ELEMENT pointMember (Point) >
<!-- a MultiLineString is defined by zero or more LineStrings, referenced
through a lineStringMember element. -->
<!ELEMENT MultiLineString (lineStringMember+) >
<!ATTLIST MultiLineString
ID CDATA #IMPLIED
srsName CDATA #IMPLIED >
<!ELEMENT lineStringMember (LineString) >
<!-- a MultiPolygon is defined by zero or more Polygons, referenced through
a polygonMember element. -->
78
<!ELEMENT MultiPolygon (polygonMember+) >
<!ATTLIST MultiPolygon
ID CDATA #IMPLIED
srsName CDATA #IMPLIED >
<!ELEMENT polygonMember (Polygon) >
<!-- a GeometryCollection is defined by zero or more geometries, referenced
through a geometryMember element. A geometryMember element may be any one
of the geometry classes. -->
<!ENTITY % GeometryClasses "(
Point | LineString | Polygon |
MultiPoint | MultiLineString | MultiPolygon |
GeometryCollection )" >
<!ELEMENT GeometryCollection (geometryMember+) >
<!ATTLIST GeometryCollection
ID CDATA #IMPLIED
srsName CDATA #IMPLIED >
<!ELEMENT geometryMember %GeometryClasses; >
<!-- ============================================================== -->
<!-- G E O M E T R Y P R O P E R T Y D e f i n i t i o n s -->
<!-- ============================================================== -->
<!-- GML provides an 'endorsed' name to define the extent of a feature. The
extent is defined by a Box element, the name of the property is boundedBy.
-->
<!ELEMENT boundedBy (Box) >
<!-- the generic geometryProperty can accept a geometry of any class. -->
<!ELEMENT geometryProperty (%GeometryClasses;) >
<!-- the pointProperty has three descriptive names: centerOf, location and
position. -->
<!ELEMENT pointProperty (Point) >
<!ELEMENT centerOf (Point) >
<!ELEMENT location (Point) >
<!ELEMENT position (Point) >
<!-- the lineStringProperty has two descriptive names: centerLineOf and
edgeOf. -->
79
<!ELEMENT lineStringProperty (LineString) >
<!ELEMENT centerLineOf (LineString)>
<!ELEMENT edgeOf (LineString)>
<!-- the polygonProperty has two descriptive names: coverage and extentOf.
-->
<!ELEMENT polygonProperty (Polygon) >
<!ELEMENT coverage (Polygon)>
<!ELEMENT extentOf (Polygon)>
<!-- the multiPointProperty has three descriptive names: multiCenterOf,
multiLocation and multiPosition. -->
<!ELEMENT multiPointProperty (MultiPoint) >
<!ELEMENT multiCenterOf (MultiPoint) >
<!ELEMENT multiLocation (MultiPoint) >
<!ELEMENT multiPosition (MultiPoint) >
<!-- the multiLineStringProperty has two descriptive names:
multiCenterLineOf and multiEdgeOf. -->
<!ELEMENT multiLineStringProperty (MultiLineString) >
<!ELEMENT multiCenterLineOf (MultiLineString) >
<!ELEMENT multiEdgeOf (MultiLineString) >
<!-- the multiPolygonProperty has two descriptive names: multiCoverage and
multiExtentOf. -->
<!ELEMENT multiPolygonProperty (MultiPolygon) >
<!ELEMENT multiCoverage (MultiPolygon) >
<!ELEMENT multiExtentOf (MultiPolygon) >
<!ELEMENT geometryCollectionProperty (GeometryCollection) >
<!-- ============================================================== -->
<!-- F E A T U R E M E T A D A T A D e f i n i t i o n s -->
<!-- ============================================================== -->
<!-- Feature metadata, included in GML Geometry DTD for convenience; name
and description are two 'standard' string properties defined by GML. -->
<!ELEMENT name (#PCDATA)>
<!ELEMENT description (#PCDATA)>
80
Dodatak C: mreza.gml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE FeatureCollection (View Source for full doctype...)>
- <FeatureCollection typeName="ulazni podaci">
- <boundedBy> <!-- okvir >
- <Box srsName="EPSG:4326">
<coordinates>100, 100 600, 600</coordinates>
</Box>
</boundedBy>
- <featureMember typeName="TS"> <!-- trafostanica>
- <FeatureCollection typeName="123">
- <boundedBy>
- <Box srsName="EPSG:4326">
<coordinates>100, 100 600, 600</coordintes>
</Box>
</boundedBy>
- <geometricProperty typeName="geometricCollectionProperty">
- <GeometryCollection srsName="EPSG:4326">
- <geometryMember>
- <MultiPoint>
- <pointMember>
- <Point ID="123">
<coordinates>326,383</coordinates> <!—definiranje pozicije>
</Point>
</pointMember>
</MultiPoint>
</geometryMember>
</GeometryCollection>
</geometricProperty>
- <featureMember typeName="pouzdanost"> <!-- atributi>
81
- <Feature typeName="dodaci1">
<property typeName="Nc" type="integer">400</property>
<property typeName="Lc" type="real">456</property>
<property typeName="a" type="real">34</property>
</Feature>
</featureMember>
- <featureMember typeName="pouzdanost">
- <Feature typeName="dodaci2">
<property typeName="lambda" type="real">0.235</property>
<property typeName="r" type="real">456</property>
<property typeName="U" type="real">34</property>
<property typeName="komp" type="real">6</property>
<property typeName="N" type="integer">67</property>
<property typeName="La" type="real">898</property>
</Feature>
</featureMember>
- <featureMember typeName="snaga1">
- <Feature typeName="snaga">
<property typeName="Sn" type="real">400</property>
<property typeName="P_tereta" type="real">78.59</property>
<property typeName="Q_tereta" type="real">3</property>
<property typeName="S_tereta" type="real">98</property>
<property typeName="cos_fi" type="real">0.56</property>
</Feature>
</featureMember>
</FeatureCollection>
</featureMember>
- <featureMember typeName="vod"> <!-- vod>
- <Feature typeName="344"> <!—atributi vezani uz vod>
<property typeName="Un" type="real">22000</property>
82
<property typeName="tipIPresjek" type="string">XHP48-
A,3x(1x185mm2)</property>
<property typeName="duljina" type="real">78.56</property>
<property typeName="R" type="real">1.345</property>
<property typeName="Xl" type="real">0.567</property>
- <geometricProperty typeName="geometricCollectionProperty">
- <GeometryCollection srsName="EPSG:4326">
- <geometryMember>
- <Polygon>
- <outerBoundaryIs>
- <LinearRing>
<coordinates>326,383 450,458 430,488</coordinates>
</LinearRing>
</outerBoundaryIs>
</Polygon>
</geometryMember>
</GeometryCollection>
</geometricProperty>
</Feature>
</featureMember>
- <featureMember typeName="vod">
- <Feature typeName="356">
<property typeName="Un" type="real">220</property>
<property typeName="tipIPresjek" type="string">XHP48-
A,3x(1x185mm2)</property>
<property typeName="duljina" type="real">300</property>
<property typeName="R" type="real">0.45</property>
<property typeName="Xl" type="real">0.45</property>
- <geometricProperty typeName="geometricCollectionProperty">
- <GeometryCollection srsName="EPSG:4326">
- <geometryMember>
83
- <Polygon>
- <outerBoundaryIs>
- <LinearRing>
<coordinates>326,383 133,540 170,550</coordinates>
</LinearRing>
</outerBoundaryIs>
</Polygon>
</geometryMember>
</GeometryCollection>
</geometricProperty>
</Feature>
</featureMember>
- <featureMember typeName="TS">
- <FeatureCollection typeName="231">
- <boundedBy>
- <Box srsName="EPSG:4326">
<coordinates>100, 100 600, 600</coordinates>
</Box>
</boundedBy>
- <geometricProperty typeName="geometricCollectionProperty">
- <GeometryCollection srsName="EPSG:4326">
- <geometryMember>
- <MultiPoint>
- <pointMember>
- <Point ID="231">
<coordinates>450,458</coordinates>
</Point>
</pointMember>
</MultiPoint>
</geometryMember>
</GeometryCollection>
84
</geometricProperty>
- <featureMember typeName="pouzdanost">
- <Feature typeName="dodaci1">
<property typeName="Nc" type="integer">400</property>
<property typeName="Lc" type="real">456</property>
<property typeName="a" type="real">34</property>
</Feature>
</featureMember>
- <featureMember typeName="pouzdanost2">
- <Feature typeName="dodaci2">
<property typeName="lambda" type="real">0.17</property>
<property typeName="r" type="real">123</property>
<property typeName="U" type="real">34</property>
<property typeName="komp" type="real">6</property>
<property typeName="N" type="integer">67</property>
<property typeName="La" type="real">898</property>
</Feature>
</featureMember>
- <featureMember typeName="snaga1">
- <Feature typeName="snaga">
<property typeName="Sn" type="real">400</property>
<property typeName="P_tereta" type="real">56</property>
<property typeName="Q_tereta" type="real">34.23</property>
<property typeName="S_tereta" type="real">45.9</property>
<property typeName="cos_fi" type="real">0.231</property>
</Feature>
</featureMember>
</FeatureCollection>
</featureMember>
- <featureMember typeName="TS">
- <FeatureCollection typeName="45">
85
- <boundedBy>
- <Box srsName="EPSG:4326">
<coordinates>100, 100 600, 600</coordinates>
</Box>
</boundedBy>
- <geometricProperty typeName="geometricCollectionProperty">
- <GeometryCollection srsName="EPSG:4326">
- <geometryMember>
- <MultiPoint>
- <pointMember>
- <Point ID="45">
<coordinates>430,488</coordinates>
</Point>
</pointMember>
</MultiPoint>
</geometryMember>
</GeometryCollection>
</geometricProperty>
- <featureMember typeName="pouzdanost">
- <Feature typeName="dodaci1">
<property typeName="Nc" type="integer">400</property>
<property typeName="Lc" type="real">456</property>
<property typeName="a" type="real">34</property>
</Feature>
</featureMember>
- <featureMember typeName="pouzdanost2">
- <Feature typeName="dodaci2">
<property typeName="lambda" type="real">0.567</property>
<property typeName="r" type="real">456</property>
<property typeName="U" type="real">34</property>
<property typeName="komp" type="real">6</property>
86
<property typeName="N" type="integer">67</property>
<property typeName="La" type="real">898</property>
</Feature>
</featureMember>
- <featureMember typeName="snaga1">
- <Feature typeName="snaga">
<property typeName="Sn" type="real">400</property>
<property typeName="P_tereta" type="real">56</property>
<property typeName="Q_tereta" type="real">3</property>
<property typeName="S_tereta" type="real">98</property>
<property typeName="cos_fi" type="real">0.9</property>
</Feature>
</featureMember>
</FeatureCollection>
</featureMember>
- <featureMember typeName="TS">
- <FeatureCollection typeName="67">
- <boundedBy>
- <Box srsName="EPSG:4326">
<coordinates>100, 100 600, 600</coordinates>
</Box>
</boundedBy>
- <geometricProperty typeName="geometricCollectionProperty">
- <GeometryCollection srsName="EPSG:4326">
- <geometryMember>
- <MultiPoint>
- <pointMember>
- <Point ID="67">
<coordinates>170,550</coordinates>
</Point>
</pointMember>
87
</MultiPoint>
</geometryMember>
</GeometryCollection>
</geometricProperty>
- <featureMember typeName="pouzdanost">
- <Feature typeName="dodaci1">
<property typeName="Nc" type="integer">400</property>
<property typeName="Lc" type="real">456</property>
<property typeName="a" type="real">34</property>
</Feature>
</featureMember>
- <featureMember typeName="pouzdanost2">
- <Feature typeName="dodaci2">
<property typeName="lambda" type="real">0.78</property>
<property typeName="r" type="real">100</property>
<property typeName="U" type="real">34</property>
<property typeName="komp" type="real">7.9</property>
<property typeName="N" type="integer">9</property>
<property typeName="La" type="real">898</property>
</Feature>
</featureMember>
- <featureMember typeName="snaga1">
- <Feature typeName="snaga">
<property typeName="Sn" type="real">400</property>
<property typeName="P_tereta" type="real">0.978</property>
<property typeName="Q_tereta" type="real">12.7</property>
<property typeName="S_tereta" type="real">98</property>
<property typeName="cos_fi" type="real">0.12</property>
</Feature>
</featureMember>
</FeatureCollection>
88
</featureMember>
- <featureMember typeName="TS">
- <FeatureCollection typeName="124">
- <boundedBy>
- <Box srsName="EPSG:4326">
<coordinates>100, 100 600, 600</coordinates>
</Box>
</boundedBy>
- <geometricProperty typeName="geometricCollectionProperty">
- <GeometryCollection srsName="EPSG:4326">
- <geometryMember>
- <MultiPoint>
- <pointMember>
- <Point ID="124">
<coordinates>315,290</coordinates>
</Point>
</pointMember>
</MultiPoint>
</geometryMember>
</GeometryCollection>
</geometricProperty>
- <featureMember typeName="pouzdanost">
- <Feature typeName="dodaci1">
<property typeName="Nc" type="integer">400</property>
<property typeName="Lc" type="real">10</property>
<property typeName="a" type="real">0.9</property>
</Feature>
</featureMember>
- <featureMember typeName="pouzdanost2">
- <Feature typeName="dodaci2">
<property typeName="lambda" type="real">0.0078</property>
89
<property typeName="r" type="real">456</property>
<property typeName="U" type="real">34</property>
<property typeName="komp" type="real">6</property>
<property typeName="N" type="integer">67</property>
<property typeName="La" type="real">898</property>
</Feature>
</featureMember>
- <featureMember typeName="snaga1">
- <Feature typeName="snaga">
<property typeName="Sn" type="real">400</property>
<property typeName="P_tereta" type="real">56</property>
<property typeName="Q_tereta" type="real">56.9</property>
<property typeName="S_tereta" type="real">98</property>
<property typeName="cos_fi" type="real">0.98</property>
</Feature>
</featureMember>
</FeatureCollection>
</featureMember>
- <featureMember typeName="TS">
- <FeatureCollection typeName="127">
- <boundedBy>
- <Box srsName="EPSG:4326">
<coordinates>100, 100 600, 600</coordinates>
</Box>
</boundedBy>
- <geometricProperty typeName="geometricCollectionProperty">
- <GeometryCollection srsName="EPSG:4326">
- <geometryMember>
- <MultiPoint>
- <pointMember>
- <Point ID="127">
90
<coordinates>150,170</coordinates>
</Point>
</pointMember>
</MultiPoint>
</geometryMember>
</GeometryCollection>
</geometricProperty>
- <featureMember typeName="pouzdanost">
- <Feature typeName="dodaci1">
<property typeName="Nc" type="integer">400</property>
<property typeName="Lc" type="real">456</property>
<property typeName="a" type="real">34</property>
</Feature>
</featureMember>
- <featureMember typeName="pouzdanost2">
- <Feature typeName="dodaci2">
<property typeName="lambda" type="real">0.78</property>
<property typeName="r" type="real">456</property>
<property typeName="U" type="real">34</property>
<property typeName="komp" type="real">6</property>
<property typeName="N" type="integer">67</property>
<property typeName="La" type="real">0.89</property>
</Feature>
</featureMember>
- <featureMember typeName="snaga1">
- <Feature typeName="snaga">
<property typeName="Sn" type="real">400</property>
<property typeName="P_tereta" type="real">3</property>
<property typeName="Q_tereta" type="real">3</property>
<property typeName="S_tereta" type="real">3</property>
<property typeName="cos_fi" type="real">0.56</property>
91
</Feature>
</featureMember>
</FeatureCollection>
</featureMember>
- <featureMember typeName="TS">
- <FeatureCollection typeName="128">
- <boundedBy>
- <Box srsName="EPSG:4326">
<coordinates>100, 100 600, 600</coordinates>
</Box>
</boundedBy>
- <geometricProperty typeName="geometricCollectionProperty">
- <GeometryCollection srsName="EPSG:4326">
- <geometryMember>
- <MultiPoint>
- <pointMember>
- <Point ID="128">
<coordinates>500,200</coordinates>
</Point>
</pointMember>
</MultiPoint>
</geometryMember>
</GeometryCollection>
</geometricProperty>
- <featureMember typeName="pouzdanost">
- <Feature typeName="dodaci1">
<property typeName="Nc" type="integer">400</property>
<property typeName="Lc" type="real">456</property>
<property typeName="a" type="real">34</property>
</Feature>
</featureMember>
92
- <featureMember typeName="pouzdanost2">
- <Feature typeName="dodaci2">
<property typeName="lambda" type="real">0.3</property>
<property typeName="r" type="real">6</property>
<property typeName="U" type="real">1.2</property>
<property typeName="komp" type="real">6</property>
<property typeName="N" type="integer">67</property>
<property typeName="La" type="real">898</property>
</Feature>
</featureMember>
- <featureMember typeName="snaga1">
- <Feature typeName="snaga">
<property typeName="Sn" type="real">400</property>
<property typeName="P_tereta" type="real">0</property>
<property typeName="Q_tereta" type="real">0</property>
<property typeName="S_tereta" type="real">0</property>
<property typeName="cos_fi" type="real">0.813</property>
</Feature>
</featureMember>
</FeatureCollection>
</featureMember>
- <featureMember typeName="vod">
- <Feature typeName="358">
<property typeName="Un" type="real">22000</property>
<property typeName="tipIPresjek" type="string">XHP48-
A,3x(1x185mm2)</property>
<property typeName="duljina" type="real">100</property>
<property typeName="R" type="real">0.07</property>
<property typeName="Xl" type="real">0.008</property>
- <geometricProperty typeName="geometricCollectionProperty">
- <GeometryCollection srsName="EPSG:4326">
93
- <geometryMember>
- <Polygon>
- <outerBoundaryIs>
- <LinearRing>
<coordinates>326,383 315,290</coordinates>
</LinearRing>
</outerBoundaryIs>
</Polygon>
</geometryMember>
</GeometryCollection>
</geometricProperty>
</Feature>
</featureMember>
- <featureMember typeName="vod">
- <Feature typeName="351">
<property typeName="Un" type="real">220</property>
<property typeName="tipIPresjek" type="string">XHP48-
A,3x(1x185mm2)</property>
<property typeName="duljina" type="real">300</property>
<property typeName="R" type="real">0.345</property>
<property typeName="Xl" type="real">0.02</property>
- <geometricProperty typeName="geometricCollectionProperty">
- <GeometryCollection srsName="EPSG:4326">
- <geometryMember>
- <Polygon>
- <outerBoundaryIs>
- <LinearRing>
<coordinates>315,290 500,200</coordinates>
</LinearRing>
</outerBoundaryIs>
</Polygon>
94
</geometryMember>
</GeometryCollection>
</geometricProperty>
</Feature>
</featureMember>
- <featureMember typeName="vod">
- <Feature typeName="356">
<property typeName="Un" type="real">220</property>
<property typeName="tipIPresjek" type="string">XHP48-
A,3x(1x185mm2)</property>
<property typeName="duljina" type="real">3470</property>
<property typeName="R" type="real">0.578</property>
<property typeName="Xl" type="real">0.123</property>
- <geometricProperty typeName="geometricCollectionProperty">
- <GeometryCollection srsName="EPSG:4326">
- <geometryMember>
- <Polygon>
- <outerBoundaryIs>
- <LinearRing>
<coordinates>150,170 315,290</coordinates>
</LinearRing>
</outerBoundaryIs>
</Polygon>
</geometryMember>
</GeometryCollection>
</geometricProperty>
</Feature>
</featureMember>
</FeatureCollection>
95
Dodatak D: transf.xsl
<?xml version="1.0" ?>
- <!--
-->
- <xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
- <!--
-->
<xsl:output method="xml" doctype-
system="http://www.w3.org/TR/2000/03/WD-SVG-20000303/DTD/svg-
20000303-stylable.dtd" doctype-public="-//W3C//DTD SVG 20000303
Stylable//EN" />
- <!--
-->
- <xsl:template match="/">
- <svg xml:space="preserve" width="800" height="800"
onmousemove="pokret(evt)"> <!— preserve služi za ljepši ispis u SVG>
- <script language="JavaScript" type="text/javascript">
- <![CDATA[
function onmouseover(evt) { // mis je preko
var elem = evt.target;
var style = elem.getStyle();
style.setProperty("stroke", "green"); // promijeni u zeleno
}
function onmouseout_hvod(evt) { // kada se maknemo mišem
var elem = evt.target; // izvan visokonaponskog voda
var style = elem.getStyle();
style.setProperty("stroke", "red"); // vrati ga u crveno
}
96
function onmouseout_lvod(evt) { // za niskonaponski vod
var elem = evt.target;
var style = elem.getStyle();
style.setProperty("stroke", "orange"); // vrati ga u narančasto
}
function informe_vod(evt) { // popis atributa elementa vod
objekt=evt.target;att=objekt.attributes;chaine='Podaci o elementu:\n';
for (i=0;i<att.length;i++)
{if (att.item(i).name=='onmouseover' || att.item(i).name=='onmouseout' ||
att.item(i).name=='style' || att.item(i).name=='r' ||
att.item(i).name=='onclick' || att.item(i).name=='d') {}else
{ chaine=chaine+'\n'+att.item(i).name+' : '+att.item(i).value}};
alert(chaine) // ispis u prozoru
}
function onmouseout_ts(evt) { // maknemo se od trafostanice
var elem = evt.target;
var style = elem.getStyle();
style.setProperty("stroke", "indigo"); // farbaj u svjetlo plavu
}
function informe_ts(evt) { // atributi vezani uz trafostanicu
objekt=evt.target;att=objekt.attributes;chaine='Podaci o elementu:\n';
for (i=0;i<att.length;i++)
{if (att.item(i).name=='onmouseover' || att.item(i).name=='onmouseout' ||
att.item(i).name=='style' || att.item(i).name=='r' ||
att.item(i).name=='onclick') {}else
{ chaine=chaine+'\n'+att.item(i).name+' : '+att.item(i).value}};
alert(chaine) // ispis
}
function pokret(evt) {xm=evt.clientX;ym=evt.clientY; // interaktivnost
svgdoc=evt.target.ownerDocument; // koordinata
svgdoc.getElementById('pos').firstChild.setData('Koordinate: '+xm+'
'+ym);
}
97
]]>
</script>
<text id="pos" x="200" y="600" style="font-size:16">Pomicite misa iznad mreze i
ovdje ce pisati koordinate</text>
<xsl:apply-templates select="/FeatureCollection/featureMember/Feature" />
<!-- poziva template za vod>
<xsl:apply-templates select="//featureMember/FeatureCollection" />
<!-- poziva template za trafostanicu>
</svg>
</xsl:template>
- <!--
template za trafostanicu
-->
- <xsl:template match="//featureMember/FeatureCollection">
- <xsl:element name="text">
<xsl:attribute name="style">font-family:Verdana;font-weight:bold; font-
size:14; fill:blue;</xsl:attribute>
<xsl:variable name="coor"
select="./geometricProperty/GeometryCollection/geometryMember/MultiPoint/
pointMember/Point/coordinates" />
<xsl:variable name="tcoor" select="normalize-space($coor)" />
<xsl:variable name="xtcoor" select="substring-before($tcoor,',')" />
<xsl:variable name="ytcoor" select="substring-after($tcoor,',')" />
- <xsl:attribute name="x">
<xsl:value-of select="$xtcoor + 7" />
</xsl:attribute>
- <xsl:attribute name="y">
<xsl:value-of select="$ytcoor" />
</xsl:attribute>
<xsl:value-of select="..//@typeName" /> <!—ispis imena trafostanice>
<xsl:value-of select=".//@typeName" />
</xsl:element>
- <xsl:element name="circle">
<xsl:attribute name="style">fill:indigo;fill-opacity:1.0; stroke:indigo; stroke-
width:0.1cm</xsl:attribute>
<xsl:attribute name="onmouseover">onmouseover(evt)</xsl:attribute>
<xsl:attribute name="onmouseout">onmouseout_ts(evt)</xsl:attribute>
98
<xsl:attribute name="onclick">informe_ts(evt)</xsl:attribute>
<xsl:variable name="coor"
select="./geometricProperty/GeometryCollection/geometryMember/
MultiPoint/pointMember/Point/coordinates" />
<xsl:variable name="tcoor" select="normalize-space($coor)" />
<xsl:variable name="xtcoor" select="substring-before($tcoor,',')" />
<xsl:variable name="ytcoor" select="substring-after($tcoor,',')" />
<xsl:attribute name="Trafo-stanica" /> <!-- definiranje atributa koji će se
pojaviti u prozoru ispisa>
- <xsl:attribute name="ID">
<xsl:value-of select=".//@typeName" />
</xsl:attribute>
- <xsl:attribute name="cx">
<xsl:value-of select="$xtcoor" />
</xsl:attribute>
- <xsl:attribute name="cy">
<xsl:value-of select="$ytcoor" />
</xsl:attribute>
<xsl:attribute name="r">4</xsl:attribute>
<xsl:attribute name="dodaci1" />
- <xsl:attribute name="Nc">
<xsl:value-of select=
"./featureMember/Feature/property[.//@typeName='Nc']" />
</xsl:attribute>
- <xsl:attribute name="Lc">
<xsl:value-of select=
"./featureMember/Feature/property[.//@typeName='Lc']" />
</xsl:attribute>
- <xsl:attribute name="a">
<xsl:value-of select="./featureMember/Feature/property[.//@typeName='a']"
/>
</xsl:attribute>
<xsl:attribute name="dodaci2" />
- <xsl:attribute name="lambda">
<xsl:value-of
select="./featureMember/Feature/property[.//@typeName='lambda']" />
</xsl:attribute>
99
- <xsl:attribute name="Ru">
<xsl:value-of select="./featureMember/Feature/property[.//@typeName='r']"
/>
</xsl:attribute>
- <xsl:attribute name="U">
<xsl:value-of select="./featureMember/Feature/property[.//@typeName='U']"
/>
</xsl:attribute>
- <xsl:attribute name="komp">
<xsl:value-of
select="./featureMember/Feature/property[.//@typeName='komp']" />
</xsl:attribute>
- <xsl:attribute name="N">
<xsl:value-of select="./featureMember/Feature/property[.//@typeName='N']"
/>
</xsl:attribute>
- <xsl:attribute name="La">
<xsl:value-of select="./featureMember/Feature/property[.//@typeName='La']"
/>
</xsl:attribute>
<xsl:attribute name="snaga" />
- <xsl:attribute name="Sn">
<xsl:value-of
select="./featureMember/Feature/property[.//@typeName='Sn']" />
</xsl:attribute>
- <xsl:attribute name="P_tereta">
<xsl:value-of
select="./featureMember/Feature/property[.//@typeName='P_tereta']" />
</xsl:attribute>
- <xsl:attribute name="Q_tereta">
<xsl:value-of
select="./featureMember/Feature/property[.//@typeName='Q_tereta']" />
</xsl:attribute>
- <xsl:attribute name="S_tereta">
<xsl:value-of
select="./featureMember/Feature/property[.//@typeName='S_tereta']" />
</xsl:attribute>
100
- <xsl:attribute name="cos_fi">
<xsl:value-of
select="./featureMember/Feature/property[.//@typeName='cos_fi']" />
</xsl:attribute>
</xsl:element>
</xsl:template>
- <!--
vod
-->
- <xsl:template match="/FeatureCollection/featureMember/Feature">
<xsl:variable name="clist"
select="./geometricProperty/GeometryCollection/geometryMember/Polygon/o
uterBoundaryIs/LinearRing/coordinates" />
<xsl:variable name="tclist" select="normalize-space($clist)" />
<xsl:variable name="start" select="concat( 'M ',translate(substring-
before($tclist,' '),',',' '))" />
<xsl:variable name="rest" select="substring-after($tclist,' ')" />
- <xsl:variable name="all">
- <xsl:call-template name="transform-coords">
<xsl:with-param name="list" select="$rest" />
</xsl:call-template>
</xsl:variable>
<xsl:variable name="all2" select="concat($start,$all)" />
<xsl:variable name="napon" select="./property[.//@typeName='Un']" />
- <xsl:element name="path">
<xsl:attribute name="strujni_vod" />
- <xsl:attribute name="ID">
<xsl:value-of select=".//@typeName" />
</xsl:attribute>
- <xsl:choose>
- <xsl:when test="$napon > 10000"> <!-- za visokonaponski vod>
<xsl:attribute name="style">stroke:red;fill:green;fill-opacity:0.0;stroke-
width:0.15cm</xsl:attribute>
<xsl:attribute name="onmouseout">onmouseout_hvod(evt)</xsl:attribute>
</xsl:when>
- <xsl:otherwise> <!-- za niskonaponski vod>
101
<xsl:attribute name="style">stroke:orange;fill:green;fill-opacity:0.0;stroke-
width:0.07cm</xsl:attribute>
<xsl:attribute name="onmouseout">onmouseout_lvod(evt)</xsl:attribute>
</xsl:otherwise>
</xsl:choose>
<xsl:attribute name="onmouseover">onmouseover(evt)</xsl:attribute>
<xsl:attribute name="onclick">informe_vod(evt)</xsl:attribute>
- <xsl:attribute name="d"> <!-- oblik linije voda>
<xsl:value-of select="$all2" />
</xsl:attribute>
- <xsl:attribute name="Un"> <!-- atributi vezani uz vod>
<xsl:value-of select="./property[.//@typeName='Un']" />
</xsl:attribute>
- <xsl:attribute name="tip_i_presjek">
<xsl:value-of select="./property[.//@typeName='tipIPresjek']" />
</xsl:attribute>
- <xsl:attribute name="duljina">
<xsl:value-of select="./property[.//@typeName='duljina']" />
</xsl:attribute>
- <xsl:attribute name="R">
<xsl:value-of select="./property[.//@typeName='R']" />
</xsl:attribute>
- <xsl:attribute name="Xl">
<xsl:value-of select="./property[.//@typeName='Xl']" />
</xsl:attribute>
</xsl:element>
</xsl:template>
- <!--
imenovani template za čitanje koordinata iz GML-a i prebacivanje u SVG format
-->
- <xsl:template name="transform-coords">
<xsl:param name="list" />
<xsl:variable name="wlist" select="normalize-space($list)" />
<xsl:variable name="first" select="translate(substring-before($wlist,' '),',',' ')"
/>
<xsl:variable name="rest" select="substring-after($wlist,' ')" />
- <xsl:choose>
102
- <xsl:when test="string-length($rest) > 0">
- <xsl:variable name="all">
- <xsl:call-template name="transform-coords">
<xsl:with-param name="list" select="$rest" />
</xsl:call-template>
</xsl:variable>
<xsl:value-of select="concat(' L ',concat($first,$all))" />
</xsl:when>
- <xsl:otherwise>
<xsl:value-of select="concat(' L ',translate($wlist,',',' '))" />
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
103
Dodatak E: SVG source dobiven transformacijom dokumenta mreza.gml
<?xml version="1.0" encoding="UTF-16"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20000303 Stylable//EN"
"http://www.w3.org/TR/2000/03/WD-SVG-20000303/DTD/svg-20000303-stylable.dtd">
<svg xml:space="preserve" width="800" height="800" onmousemove="pokret(evt)">
<script language="JavaScript" type="text/javascript">
function onmouseover(evt) {
var elem = evt.target;
var style = elem.getStyle();
style.setProperty("stroke", "green");
}
function onmouseout_hvod(evt) {
var elem = evt.target;
var style = elem.getStyle();
style.setProperty("stroke", "red");
}
function onmouseout_lvod(evt) {
var elem = evt.target;
var style = elem.getStyle();
style.setProperty("stroke", "orange");
}
function informe_vod(evt) {
objekt=evt.target;att=objekt.attributes;chaine='Podaci o elementu:\n';
for (i=0;i<att.length;i++)
{if (att.item(i).name=='onmouseover' || att.item(i).name=='onmouseout' ||
att.item(i).name=='style' || att.item(i).name=='r' || att.item(i).name=='onclick' ||
att.item(i).name=='d') {}else
{ chaine=chaine+'\n'+att.item(i).name+' : '+att.item(i).value}};
confirm(chaine)
}
function onmouseout_ts(evt) {
var elem = evt.target;
var style = elem.getStyle();
style.setProperty("stroke", "indigo");
}
104
function informe_ts(evt) {
objekt=evt.target;att=objekt.attributes;chaine='Podaci o elementu:\n';
for (i=0;i<att.length;i++)
{if (att.item(i).name=='onmouseover' || att.item(i).name=='onmouseout' ||
att.item(i).name=='style' || att.item(i).name=='r' || att.item(i).name=='onclick') {}else
{ chaine=chaine+'\n'+att.item(i).name+' : '+att.item(i).value}};
confirm(chaine)
}
function pokret(evt) {xm=evt.clientX;ym=evt.clientY;
svgdoc=evt.target.ownerDocument;
svgdoc.getElementById('pos').firstChild.setData('Koordinate: '+xm+' '+ym);
}
</script>
<text id="pos" x="200" y="600" style="font-size:16">Pomicite misa iznad
mreze i ovdje ce pisati koordinate</text>
<path strujni_vod="" ID="344" style="stroke:red;fill:green;fill-
opacity:0.0;stroke-width:0.15cm" onmouseout="onmouseout_hvod(evt)"
onmouseover="onmouseover(evt)" onclick="informe_vod(evt)" d="M 326 383 L 450 458
L 430 488" Un="22000" tip_i_presjek="XHP48-A,3x(1x185mm2)" duljina="78.56"
R="1.345" Xl="0.567" />
<path strujni_vod="" ID="356" style="stroke:orange;fill:green;fill-
opacity:0.0;stroke-width:0.07cm" onmouseout="onmouseout_lvod(evt)"
onmouseover="onmouseover(evt)" onclick="informe_vod(evt)" d="M 326 383 L 133 540
L 170 550" Un="220" tip_i_presjek="XHP48-A,3x(1x185mm2)" duljina="300" R="0.45"
Xl="0.45" />
<path strujni_vod="" ID="358" style="stroke:red;fill:green;fill-
opacity:0.0;stroke-width:0.15cm" onmouseout="onmouseout_hvod(evt)"
onmouseover="onmouseover(evt)" onclick="informe_vod(evt)" d="M 326 383 L 315
290" Un="22000" tip_i_presjek="XHP48-A,3x(1x185mm2)" duljina="100" R="0.07"
Xl="0.008" />
<path strujni_vod="" ID="351" style="stroke:orange;fill:green;fill-
opacity:0.0;stroke-width:0.07cm" onmouseout="onmouseout_lvod(evt)"
onmouseover="onmouseover(evt)" onclick="informe_vod(evt)" d="M 315 290 L 500
105
200" Un="220" tip_i_presjek="XHP48-A,3x(1x185mm2)" duljina="300" R="0.345"
Xl="0.02" />
<path strujni_vod="" ID="356" style="stroke:orange;fill:green;fill-
opacity:0.0;stroke-width:0.07cm" onmouseout="onmouseout_lvod(evt)"
onmouseover="onmouseover(evt)" onclick="informe_vod(evt)" d="M 150 170 L 315
290" Un="220" tip_i_presjek="XHP48-A,3x(1x185mm2)" duljina="3470" R="0.578"
Xl="0.123" />
<text style="font-family:Verdana;font-weight:bold; font-size:14; fill:blue;"
x="333" y="383">TS123</text>
<circle style="fill:indigo;fill-opacity:1.0; stroke:indigo; stroke-width:0.1cm"
onmouseover="onmouseover(evt)" onmouseout="onmouseout_ts(evt)"
onclick="informe_ts(evt)" Trafo-stanica="" ID="123" cx="326" cy="383" r=" 4"
dodaci1="" Nc="400" Lc="456" a="34" dodaci2="" lambda="0.235" Ru="456" U="34"
komp="6" N="67" La="898" snaga="" Sn="400" P_tereta="78.59" Q_tereta="3"
S_tereta="98" cos_fi="0.56" />
<text style="font-family:Verdana;font-weight:bold; font-size:14; fill:blue;"
x="457" y="458">TS231</text>
<circle style="fill:indigo;fill-opacity:1.0; stroke:indigo; stroke-width:0.1cm"
onmouseover="onmouseover(evt)" onmouseout="onmouseout_ts(evt)"
onclick="informe_ts(evt)" Trafo-stanica="" ID="231" cx="450" cy="458" r=" 4"
dodaci1="" Nc="400" Lc="456" a="34" dodaci2="" lambda="0.17" Ru="123" U="34"
komp="6" N="67" La="898" snaga="" Sn="400" P_tereta="56" Q_tereta="34.23"
S_tereta="45.9" cos_fi="0.231" />
<text style="font-family:Verdana;font-weight:bold; font-size:14; fill:blue;"
x="437" y="488">TS45</text>
<circle style="fill:indigo;fill-opacity:1.0; stroke:indigo; stroke-width:0.1cm"
onmouseover="onmouseover(evt)" onmouseout="onmouseout_ts(evt)"
onclick="informe_ts(evt)" Trafo-stanica="" ID="45" cx="430" cy="488" r=" 4"
dodaci1="" Nc="400" Lc="456" a="34" dodaci2="" lambda="0.567" Ru="456" U="34"
komp="6" N="67" La="898" snaga="" Sn="400" P_tereta="56" Q_tereta="3"
S_tereta="98" cos_fi="0.9" />
106
<text style="font-family:Verdana;font-weight:bold; font-size:14; fill:blue;"
x="177" y="550">TS67</text>
<circle style="fill:indigo;fill-opacity:1.0; stroke:indigo; stroke-width:0.1cm"
onmouseover="onmouseover(evt)" onmouseout="onmouseout_ts(evt)"
onclick="informe_ts(evt)" Trafo-stanica="" ID="67" cx="170" cy="550" r=" 4"
dodaci1="" Nc="400" Lc="456" a="34" dodaci2="" lambda="0.78" Ru="100" U="34"
komp="7.9" N="9" La="898" snaga="" Sn="400" P_tereta="0.978" Q_tereta="12.7"
S_tereta="98" cos_fi="0.12" />
<text style="font-family:Verdana;font-weight:bold; font-size:14; fill:blue;"
x="322" y="290">TS124</text>
<circle style="fill:indigo;fill-opacity:1.0; stroke:indigo; stroke-width:0.1cm"
onmouseover="onmouseover(evt)" onmouseout="onmouseout_ts(evt)"
onclick="informe_ts(evt)" Trafo-stanica="" ID="124" cx="315" cy="290" r=" 4"
dodaci1="" Nc="400" Lc="10" a="0.9" dodaci2="" lambda="0.0078" Ru="456" U="34"
komp="6" N="67" La="898" snaga="" Sn="400" P_tereta="56" Q_tereta="56.9"
S_tereta="98" cos_fi="0.98" />
<text style="font-family:Verdana;font-weight:bold; font-size:14; fill:blue;"
x="157" y="170">TS127</text>
<circle style="fill:indigo;fill-opacity:1.0; stroke:indigo; stroke-width:0.1cm"
onmouseover="onmouseover(evt)" onmouseout="onmouseout_ts(evt)"
onclick="informe_ts(evt)" Trafo-stanica="" ID="127" cx="150" cy="170" r=" 4"
dodaci1="" Nc="400" Lc="456" a="34" dodaci2="" lambda="0.78" Ru="456" U="34"
komp="6" N="67" La="0.89" snaga="" Sn="400" P_tereta="3" Q_tereta="3"
S_tereta="3" cos_fi="0.56" />
<text style="font-family:Verdana;font-weight:bold; font-size:14; fill:blue;"
x="507" y="200">TS128</text>
<circle style="fill:indigo;fill-opacity:1.0; stroke:indigo; stroke-width:0.1cm"
onmouseover="onmouseover(evt)" onmouseout="onmouseout_ts(evt)"
onclick="informe_ts(evt)" Trafo-stanica="" ID="128" cx="500" cy="200" r=" 4"
dodaci1="" Nc="400" Lc="456" a="34" dodaci2="" lambda="0.3" Ru="6" U="1.2"
komp="6" N="67" La="898" snaga="" Sn="400" P_tereta="0" Q_tereta="0"
S_tereta="0" cos_fi="0.813" />
</svg>