usporedba performansi struktura podataka iz programske knjižnice

27
SVEU ˇ CILIŠTE U ZAGREBU FAKULTET ELEKTROTEHNIKE I RA ˇ CUNARSTVA ZAVRŠNI RAD br. 4468 Usporedba performansi struktura podataka iz programske knjižnice JTS Marko Perkovi´ c Zagreb, lipanj 2016.

Upload: phungquynh

Post on 04-Feb-2017

229 views

Category:

Documents


6 download

TRANSCRIPT

Page 1: Usporedba performansi struktura podataka iz programske knjižnice

SVEUCILIŠTE U ZAGREBUFAKULTET ELEKTROTEHNIKE I RACUNARSTVA

ZAVRŠNI RAD br. 4468

Usporedba performansi strukturapodataka iz programske knjižnice

JTSMarko Perkovic

Zagreb, lipanj 2016.

Page 2: Usporedba performansi struktura podataka iz programske knjižnice

i

Page 3: Usporedba performansi struktura podataka iz programske knjižnice

iii

Page 4: Usporedba performansi struktura podataka iz programske knjižnice

SADRŽAJ

1. Uvod 1

2. O JTS knjižnici 22.1. Geometrijske strukture podataka . . . . . . . . . . . . . . . . . . . . 2

2.1.1. Point . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2

2.1.2. MultiPoint . . . . . . . . . . . . . . . . . . . . . . . . . . . 2

2.1.3. LineString . . . . . . . . . . . . . . . . . . . . . . . . . . . 3

2.1.4. MultiLineString . . . . . . . . . . . . . . . . . . . . . . . . 3

2.1.5. LinearRing . . . . . . . . . . . . . . . . . . . . . . . . . . . 3

2.1.6. Polygon . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3

2.1.7. MultiPolygon . . . . . . . . . . . . . . . . . . . . . . . . . . 3

2.1.8. GeometryCollection . . . . . . . . . . . . . . . . . . . . . . 4

2.2. Preciznost . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4

2.2.1. Fixed . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5

2.2.2. Floating . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5

2.3. Prostorna analiza . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5

2.3.1. Prostorni predikati . . . . . . . . . . . . . . . . . . . . . . . 5

2.3.2. Preklapajuce metode . . . . . . . . . . . . . . . . . . . . . . 6

2.3.3. Meduspremnik . . . . . . . . . . . . . . . . . . . . . . . . . 6

2.3.4. Konveksna ljuska . . . . . . . . . . . . . . . . . . . . . . . . 7

2.4. Ugradeni algoritmi . . . . . . . . . . . . . . . . . . . . . . . . . . . 8

2.4.1. Quadtree . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8

2.4.2. STRtree . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8

2.4.3. k-d tree . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9

2.4.4. Bintree . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9

2.4.5. PlanarGraph . . . . . . . . . . . . . . . . . . . . . . . . . . 9

iv

Page 5: Usporedba performansi struktura podataka iz programske knjižnice

3. Usporedba performansi 113.1. Quadtree . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11

3.2. STRtree . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12

3.3. k-d tree . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13

3.4. Bintree . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14

3.5. PlanarGraph . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15

3.6. Usporedba performansi . . . . . . . . . . . . . . . . . . . . . . . . . 16

3.7. ConvexHull . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17

3.8. Buffer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18

4. Zakljucak 20

Literatura 21

v

Page 6: Usporedba performansi struktura podataka iz programske knjižnice

1. Uvod

JTS (Java Topology Suite) programska knjižnica je Java API (Application program-

ming interface) u kojoj su implementirane metode i strukture podataka potrebne za

obradu topoloških podataka. Iako je primarna namjena ove knjižnice da se koristi kao

glavna komponenta programskih proizvoda namijenjenih za obradu i pohranjivanje ge-

ografskih podataka, njezini algoritmi mogu se koristiti u racunalnoj geometriji.

U ovom radu opisane su sve dostupne strukture podataka i metode implementirane

u programskoj knjižnici JTS. Razvijeni su testni slucajevi kojima se ispituje brzina

obrade velike kolicine podataka. Podatci su prikupljeni s javno dostupnog projekta

Open Street Maps u kojem ljudi mogu bilježiti svoje kretanje po nekom prostoru tako

da upisuju koordinate tocaka na kojima su bili. Karta odabrana za testiranje struk-

tura podataka sadrži preko 400 000 tocaka. Time ovaj rad prelazi u temu Big data -

podrucje racunarske znanosti koje se bavi obradom velike kolicine podataka za koju

tradicionalne metode obrade nisu efikasne.

1

Page 7: Usporedba performansi struktura podataka iz programske knjižnice

2. O JTS knjižnici

JTS knjižnicu razvila je tvrtka Vivid solutions 2002. godine. Knjižnica je u potpunosti

napisana u programskom jeziku Java, prilagodena je jednostavnim svojstvenim spe-

cifikacijama SQL-a (Simple Features Specification for SQL) te programerima pristup

temeljnim algoritmima za obradu linearne geometrije u dvodimenzionalnoj Kartezi-

jevoj ravnini. Cijeli projekt je javno dostupan i svatko može pridonijeti razvoju JTS

knjižnice. Na službenim stranicama tvrtke Vivid solutions možemo naci JTS verziju

1.8, ali posljednja stabilna verzija je 1.13. U sklopu ovog rada korištena je verzija 1.14koja je još uvijek u razvoju.

2.1. Geometrijske strukture podataka

Svi geometrijski razredi omogucavaju korisniku da kreira prazne objekte što se repre-

zentira internim nizom duljine 1. Oblici su definirani u Simple Feature Specificati-ons (SFS) te prate nekoliko pravila (posebno za svaki oblik). Razredi sadrže metode

equalsExact() koja vraca vrijednost true ako su objekti istog razreda te sadrže

isti niz koordinata (jedina iznimka su LineString i LinearRing ciji razredi se smatraju

jednakim u evaluiranju) i clone() koja vraca kopiju objekta.

2.1.1. Point

Point je osnovna struktura podataka programske knjižnice JTS. Implementirana je po-

mocu razreda Coordinate ciji objekti predstavljaju dvodimenzionalne ili trodimenzi-

onalne tocke u prostoru. Metode koje sadrži razred Point služe za dobivanje koordinata

tocke i provjeru je li tocka valjana, odnosno, postoji li u prostoru.

2.1.2. MultiPoint

MultiPoint je kolekcija objekata koju sacinjavaju samo objekti razreda Point. Tocke

medusobno nisu povezane, niti se nužno nalaze na istom pravcu.

2

Page 8: Usporedba performansi struktura podataka iz programske knjižnice

2.1.3. LineString

LineString je struktura implementirana kao niz koordinata, a definirana je prema u

Simple Features Specification. Ono što je posebno kod ove strukture jest to da može

biti ne-jednostavna - linije koje su zadane ovom strukturom mogu se medusobno sjeci.

2.1.4. MultiLineString

MultiLineString je kolekcija objekata koju sacinjavaju samo objekti razreda LineS-

tring.

2.1.5. LinearRing

LinearRing je temeljna gradivna struktura poligona iz razreda Polygon. Definira se kao

minimalno tri nekolinearne tocke (tocke koje nisu na istom pravcu), a linije se ne smiju

medusobno sjeci. Struktura je implementirana kao niz od n + 1 koordinata pri cemu

je prva koordinata jednaka zadnjoj (pri stvaranju se provjerava broj tocaka i lokacija

prve i posljednje tocke te se po potrebi baca iznimka). S obzirom da u Simple Features

Specifications nije naveden obavezan smjer spajanja tocaka (u smjeru kazaljke na satu

ili suprotno), JTS dozvoljava oba smjera spajanja.

2.1.6. Polygon

Polygon je struktura podataka napravljena od jednog ili više objekta razreda Linear-

Ring. Jedan objekt je obavezno ljuska (obrub) poligona dok svi ostali cine rupe u

poligonu. Ljuska i rupe se medusobno ne smiju sjeci, ali mogu se dodirivati u samo

jednoj tocci (brid rupe ne smije ležati na bridu ljuske). Nije obavezno da tocke dodira

ljuske i rupa budu vrhovi ljuske. Na slici 2.1 prikazani su svi moguci položaji ljuske

i rupa. Prazni poligoni ne smiju sadržavati rupe. Razred je implementiran kao jedan

Polygon koji cini ljusku i niz Polygona koji cine rupe. Implementirane su i razne me-

tode koje se koriste za dobivanje koordinata ljuske, provjeru je li poligon pravokutnik

i racunanje površine i opsega.

2.1.7. MultiPolygon

MultiPolygon je kolekcija objekata koju sacinjavaju samo objekti razreda Polygon.

3

Page 9: Usporedba performansi struktura podataka iz programske knjižnice

Slika 2.1: Svi moguci odnosi ljuske i rupa poligona

(JTS Technical Specs str. 30)

2.1.8. GeometryCollection

GeometryCollection je kolekcija objekata razreda Geometry. Implementirana je tako

da sadrži niz objekata apstraktnog razreda Geometry zbog cega može sadržavati bilo

koje od do sad opisanih razreda. Neke od metoda koje sadrži koriste se racunanje op-

sega i površine svih elemenata zajedno, vracanje broja elemenata, vracanje pojedinog

elementa te provjeru jednakosti s drugim objektima razreda Geometry.

2.2. Preciznost

Buduci da se u sklopu knjižnice JTS koristi puno matematickih operacija, preciznost

brojeva ima jako bitnu ulogu u brzini izvodenja pojedinih metoda. Postoje tri razine

preciznosti kod racunanja, a to su:

– Fixed,

– Floating,

– Exact.

Ono što je specificno za knjižnicu JTS je da dozvoljava korisnicima da sami odrede

razinu preciznosti koju žele koristiti, a preciznosti koje podržava su Fixed i Floating

(Exact preciznost koristi previše resursa i nije prihvatljiva za algoritme koji zahtjevaju

brzinu).

4

Page 10: Usporedba performansi struktura podataka iz programske knjižnice

2.2.1. Fixed

U Fixed nacinu preciznosti radi se sa cijelim brojevima, tj pretpostavlja se da koordi-

nate padaju na sjecišta diskretne rešetke. S obzirom da Java koristi standard IEEE-754,

dostupna preciznost je 53-bitna što omogucava maksnimalnu vrijednost od 9 007 199

254 740 992. Koordinate su dane sljedecim jednažbama u kodu:

j t s P t . x = round ( i n p u t P t . x ∗ s c a l e ) / s c a l e

j t s P t . y = round ( i n p u t P t . y ∗ s c a l e ) / s c a l e

Prije kreiranja samih struktura, metode za unošenje su odgovorne za zaokruživanje

koordinata prema zadanom modelu preciznosti.

2.2.2. Floating

Postoje dvije vrste preciznosti s pomicnom tockom: dvostruka i jednostruka preciz-

nost. Obje su temeljenje na Javinom modelu broja s pomicnom tockom što rezultira

preciznošcu od 16 znamenaka za dvostruku preciznost i 6 znamenaka za jednostruku

preciznost. Pri unosu koordinata, brojevi se ne zaokružuju, ali se u radu s modelom

jednostruke preciznosti zaokružuju na šest decimala.

2.3. Prostorna analiza

Simple Feature Specifications definira nekoliko osnovnih metoda za prostornu analizu

koje su implementirane u JTS.

2.3.1. Prostorni predikati

Prostorni predikati (engl. Spacial predicates) koriste se za provjeru odnosa raznih

objekata razreda Geometry. Vrijednosti koje vracaju su true ili false, a implementirane

su i metode koje racunaju opseg i površinu presjeka dva objekta. Dostupni predikati

su:

intersects: provjerava sjeku li se objekti,

contains: provjerava sadrži li jedan objekt drugoga,

within: provjerava je li ispitivani objekt unutar nekog objekta,

equals: provjerava jesu li objekti jednaki,

5

Page 11: Usporedba performansi struktura podataka iz programske knjižnice

disjoint: provjerava jesi li objekti disjunktni (nemaju zajednickih tocaka),

touches: provjerava dira li jedan objekt drugoga,

crosses: provjerava sjeku li se objekti,

overlaps: provjerava preklapaju li se objekti,

covers: provjerava prekriva li objekt u potpunosti neki drugi objekt,

coveredBy: provjerava je li objekt prekriven nekim drugim objektom u potpunosti.

2.3.2. Preklapajuce metode

Preklapajuce metode (engl. Overlay methods) su metode iz teorije skupova; vracaju

rezultat operacija presjeka, unije, razlike ili simetricne razlike. Na slici 2.2 prikazane

su sve preklapajuce metode te rezultati koje vracaju.

Slika 2.2: Prikaz preklapajucih metoda

(http://www.vividsolutions.com/jts/JTSHome.htm)

2.3.3. Meduspremnik

Meduspremnik (engl. buffer) je podrucje oko neke komponente karte izracunato u

jedinicama udaljenosti ili vremena. Koristi se za analizu udaljenosti, a definiran je

kao skup tocaka na definiranoj udaljenosti. JTS omogucava racunanje pozitivnih i

negativnih spremnika, a rezultate tih operacija možemo vidjeti na slici 2.3. Pozitivni

spremnik vraca površinu oko linije za zadani radijus, dok negativni spremnik vraca

površinu unutar poligona koja nije zahvacena pozitivnim spremnikom.

Uz to, JTS omogucava korisniku da definira izgled spremnika na krajnjim toc-

kama linije. Dostupni završetci su CAP_ROUND, CAP_BUTT i CAP_SQUARE, a

njihovi izgledi prikazani su na slici 2.4. CAP_ROUND je podrazumijevani završetak

6

Page 12: Usporedba performansi struktura podataka iz programske knjižnice

Slika 2.3: Pozitivni i negativni spremnik

(JTS Topology Suite Technical Specs, str. 30)

spremnika i racuna površinu u zadanom radijusu od krajnje tocke. CAP_BUTT ra-

cuna površinu tako da podvuce okomitu liniju na krajnju tocku u odnosu na liniju, a

CAP_SQUARE podvlaci okomitu liniju na zadanoj udaljenosti od krajnje tocke.

Slika 2.4: Prikaz završetaka meduspremnika

(JTS Topology Suite Technical Specs, str. 30)

2.3.4. Konveksna ljuska

Konveksna ljuska (engl. Convex hull) je najmanji konveksni poligon koji sadrži sve

tocke nekog objekta razreda Geometry. Konveksna ljuska ne uvodi nikakve nove ko-

ordinate u proces racunanja, za razliku od meduspremnika pa zbog toga uvijek vraca

tocan rezultat. No, zbog nemogucnosti prikazivanja zakrivljenih lukova u JTS-u, me-

duspremnici se koriste zbog približnih procjena. Na slici 2.5 prikazana je razlika iz-

medu meduspremnika i konveksne ljuske.

7

Page 13: Usporedba performansi struktura podataka iz programske knjižnice

Slika 2.5: Konveksna ljuska i meduspremnik nad zadanim objektom

(JTS Topology Suite Technical Specs, str. 28)

2.4. Ugradeni algoritmi

JTS nudi korisnicima implementirane brojne osnovne algoritme racunalne grafike (iz-

racun duljine presjeka, odnos tocke i drugih likova, itd.) kao i neke prostorne strukture

podataka i algoritme. Ono što nas posebno zanima u sklopu ovog rada su prostorne

strukture podataka. JTS dolazi sa sljedecim strukturama:

– Quadtree,

– STRtree,

– kD-tree,

– Bintree,

– PlanarGraph.

2.4.1. Quadtree

Quadtree je stablasta struktura podataka u kojoj svaki cvor ima tocno cetvero djece.

Najcešce se koristi kako bi se dvodimenzionalni prostor rekurzivno podijelio u ce-

tiri kvadranta. U knjižnici JTS koristi se za efikasno ispitivanje dvodimenzionalnih

pravokutnika. Implementirane metodu ispituju koji se segmenti sjeku sa zadanim seg-

mentom te koje se tocke nalaze u zadanom segmentu. Na slici 2.6 prikazan je izgled

strukture podataka Quadtree.

2.4.2. STRtree

STRtree je stablasta struktura podataka napravljena korištenjem Sort-Tile-Recursive

algoritma. Koristi se za dvodimenzionalne prostorne podatke i grupira podatke prema

minimalnom zajednickom granicnom pravokutniku. Sama struktura implementirana je

8

Page 14: Usporedba performansi struktura podataka iz programske knjižnice

Slika 2.6: Prikaz strukture Quadtree

(http://static.notdot.net/uploads/quadtree.png)

tako da maksimizira popunjenost listova. U stablo se ne mogu dodavati novi elementi,

niti se mogu brisati postojeci - nad strukturom samo možemo izvršavati upite. Iako se

cini kao veliki nedostatak, struktura nadoknaduje time što ima najbolje performanse

pretrage u ovoj programskoj knjižnici.

2.4.3. k-d tree

k-d tree (k-dimenzionalno stablo) je binarno stablo u kojem je svaki cvor k-dimenzionalna

tocka. Koristi se za brzo pretragu najbližih susjeda i za pretragu raspona tocaka.

2.4.4. Bintree

Bintree je jednodimenzionalna inacica strukture Quadtree. Pogodna je za pretragu in-

tervala u jednoj dimenziji (dvodimenzionalni objekti mogu biti projicirani u jednu di-

menziju). Ako projiciramo dvodimenzionalne objekte, upitom cemo dobiti listu obje-

kata koji mogu sjeci zadani interval u upitu (ne sjeku nužno). Specificnost ove strukture

je ta da ne trebamo unaprijed zadati velicinu vec se ona sama dinamicki povecava po

potrebi.

2.4.5. PlanarGraph

PlanarGraph je struktura podataka u obliku grafa koji je smješten u ravnini i koristi se

za izvedbu nekih specificnih algoritama. Graf se sastoji od cvorova, bridova i usmje-

9

Page 15: Usporedba performansi struktura podataka iz programske knjižnice

renih bridova.

Primarna namjena topoloških grafova u knjižnici JTS je izracun sjecišta bridova i

cvorova unutar pojedinog grafa ili izmedu dva odvojena grafa. Koriste se i za racunanje

matrice presjeka koja se može dobiti preko oznaka ili preko "odnosnog" algoritma

(engl. The relate algorithm). Takoder možemo izvoditi i operacije iz teorije skupova

što nam omogucava pokrovni algoritam (engl. Overlay Algorithm).

10

Page 16: Usporedba performansi struktura podataka iz programske knjižnice

3. Usporedba performansi

Za potrebe ispitivanja, s web stranica preuzeta je korisnicka karta sa preko 400 000

unešenih tocaka. Kod ispitivanja cemo se ograniciti na odredeni broj tocaka zbog

nedovoljnih resursa za obradu svih tocaka.

Testiranje je zamišljeno tako da se sve tocke iz .gpx datoteke ucitaju u strukturu

CoordinateSequence te se iz toga izvedu sve prostorne strukture podataka navedene u

prethodnom poglavlju. Nakon toga, izvode se upiti sa razlicitim tockama i omotnicama

kao argumentima. U svakom testu je implementirana štoperica koja ce izmjeriti tocno

vrijeme potrebno za izvodenje upita u milisekundama ili nanosekundama. Za svaki

skup podataka, testiranje je pokrenuto deset puta i zabilježeno je prosjecno vrijeme

izvodenja.

Drugi dio testiranja ce biti izracun konveksne ljuske i meduspremnika. Iz ucita-

nih koordinata možemo dobiti strukturu LineString nad kojom ce se pozvati metode

convexHull() i buffer(). Buduci da ne možemo sa sigurnošcu znati da su prva

i posljednja tocka jednake (ne cine zatvoreni krug), te strukture podataka cemo presko-

citi u testiranju.

3.1. Quadtree

U strukturi Quadtree ispitana je brzina ubacivanja elemenata u stablo, brzina traženja

pojedine omotnice te brzina vracanja svih omotnica. Kod testnih metoda dan je u

nastavku:

p u b l i c vo id c r e a t e Q u a d T r e e ( ) {

q t = new Q u a d t r e e ( ) ;

Geomet ryFac to ry g f = new Geomet ryFac to ry ( ) ;

f i n a l long s t a r t T i m e = System . c u r r e n t T i m e M i l l i s ( ) ;

f o r ( C o o r d i n a t e c : c s . t o C o o r d i n a t e A r r a y ( ) ) {

i f ( c == n u l l ) break ;

11

Page 17: Usporedba performansi struktura podataka iz programske knjižnice

q t . i n s e r t ( new Envelope ( c ) , g f . c r e a t e P o i n t ( c ) ) ;

}

f i n a l long endTime = System . c u r r e n t T i m e M i l l i s ( ) ;

a v e r a g e += ( endTime − s t a r t T i m e ) ;

}

p u b l i c vo id t e s t Q u e r y ( Enve lope env ) {

f i n a l long s t a r t T i m e = System . nanoTime ( ) ;

t h i s . q t . que ry ( env ) ;

f i n a l long endTime = System . nanoTime ( ) ;

que ryAverage += ( endTime − s t a r t T i m e ) ;

}

p u b l i c vo id t e s t Q u e r y A l l ( ) {

f i n a l long s t a r t T i m e = System . nanoTime ( ) ;

t h i s . q t . q u e r y A l l ( ) ;

f i n a l long endTime = System . nanoTime ( ) ;

q u e r y A l l A v e r a g e += ( endTime − s t a r t T i m e ) ;

}

Rezultati su dani u tablici 3.1.

Tablica 3.1: Rezultati ispitivanja strukture Quadtree

Broj tocaka Ubacivanje [ms] Jedna omotnica [ns] Sve omotnice [ns]

1000 2.3 295955.6 15650.6

10000 4.2 218355.7 75380.7

25000 5.4 176226.1 109185.5

50000 10.2 138082.8 197422.5

100000 17.2 94322.7 367080.2

3.2. STRtree

U strukturi STRtree ispitana je brzina ubacivanja elemenata u stablo i brzina traženja

pojedine omotnice. Takoder je zabilježena dubina stabla kako bi se docarala prostorna

efikasnost ove strukture. Kod testnih metoda dan je u nastavku:

p u b l i c vo id c r e a t e S T R t r e e ( ) {

12

Page 18: Usporedba performansi struktura podataka iz programske knjižnice

s t r = new STRtree ( ) ;

Geomet ryFac to ry g f = new Geomet ryFac to ry ( ) ;

f i n a l long s t a r t T i m e = System . c u r r e n t T i m e M i l l i s ( ) ;

f o r ( C o o r d i n a t e c : c s . t o C o o r d i n a t e A r r a y ( ) ) {

i f ( c == n u l l ) break ;

s t r . i n s e r t ( new Envelope ( c ) , g f . c r e a t e P o i n t ( c ) ) ;

}

f i n a l long endTime = System . c u r r e n t T i m e M i l l i s ( ) ;

a v e r a g e += ( endTime − s t a r t T i m e ) ;

}

p u b l i c vo id t e s t Q u e r y ( Enve lope env ) {

f i n a l long s t a r t T i m e = System . nanoTime ( ) ;

t h i s . s t r . que ry ( env ) ;

f i n a l long endTime = System . nanoTime ( ) ;

que ryAverage += ( endTime − s t a r t T i m e ) ;

}

Rezultati su dani u tablici 3.2.

Tablica 3.2: Rezultati ispitivanja strukture STRtree

Broj tocaka Ubacivanje [ms] Jedna omotnica [ms] Dubina stabla

1000 0.8 2.921 4

10000 1.6 7.587 5

25000 7.6 19.662 5

50000 16.2 40.43 5

100000 17.3 49.463 6

3.3. k-d tree

U strukturi k-d tree ispitana je brzina ubacivanja elemenata u stablo i brzina traženja

pojedine omotnice. Kod testnih metoda dan je u nastavku:

p u b l i c vo id c r e a t e K D t r e e ( ) {

k t = new KdTree ( ) ;

f i n a l long s t a r t T i m e = System . c u r r e n t T i m e M i l l i s ( ) ;

f o r ( C o o r d i n a t e c : c s . t o C o o r d i n a t e A r r a y ( ) ) {

13

Page 19: Usporedba performansi struktura podataka iz programske knjižnice

i f ( c == n u l l ) break ;

k t . i n s e r t ( c ) ;

}

f i n a l long endTime = System . c u r r e n t T i m e M i l l i s ( ) ;

a v e r a g e += ( endTime − s t a r t T i m e ) ;

}

p u b l i c vo id t e s t Q u e r y ( Enve lope env ) {

f i n a l long s t a r t T i m e = System . nanoTime ( ) ;

t h i s . k t . que ry ( env ) ;

f i n a l long endTime = System . nanoTime ( ) ;

que ryAverage += ( endTime − s t a r t T i m e ) ;

}

Rezultati su dani u tablici 3.3.

Tablica 3.3: Rezultati ispitivanja strukture k-d tree

Broj tocaka Ubacivanje [ms] Jedna omotnica [ns]

1000 1.4 15467.8

10000 113.3 52177.4

25000 765.8 22640.3

50000 1453.9 22585.8

100000 3563.1 24261.5

3.4. Bintree

U strukturi STRtree ispitana je brzina ubacivanja elemenata u stablo i brzina traženja

pojedinog broja te je zabilježena dubina stabla. Kod testnih metoda dan je u nastavku:

p u b l i c vo id c r e a t e B i n t r e e ( ) {

b t r = new B i n t r e e ( ) ;

Geomet ryFac to ry g f = new Geomet ryFac to ry ( ) ;

C o o r d i n a t e [ ] c o o r d s = cs . t o C o o r d i n a t e A r r a y ( ) ;

i n t l e n g t h = c o o r d s . l e n g t h ;

f i n a l long s t a r t T i m e = System . c u r r e n t T i m e M i l l i s ( ) ;

f o r ( i n t i = 0 ; i < l e n g t h − 1 ; i ++) {

i f ( c o o r d s [ i + 1 ] == n u l l ) break ;

14

Page 20: Usporedba performansi struktura podataka iz programske knjižnice

b t r . i n s e r t ( new I n t e r v a l ( c o o r d s [ i ] . x ∗ 1000 ,

c o o r d s [ i + 1 ] . x ∗ 1 0 0 0 ) ,

g f . c r e a t e P o i n t ( c o o r d s [ i ] ) ) ;

}

f i n a l long endTime = System . c u r r e n t T i m e M i l l i s ( ) ;

a v e r a g e += ( endTime − s t a r t T i m e ) ;

}

p u b l i c vo id t e s t Q u e r y ( double x ) {

f i n a l long s t a r t T i m e = System . nanoTime ( ) ;

t h i s . b t r . que ry ( x ) ;

f i n a l long endTime = System . nanoTime ( ) ;

que ryAverage += ( endTime − s t a r t T i m e ) ;

}

Rezultati su dani u tablici 3.4.

Tablica 3.4: Rezultati ispitivanja strukture Bintree

Broj tocaka Ubacivanje [ms] Traženje jednog broja [ns] Dubina stabla

999 2.8 12395.8 20

9999 8.5 17249.3 26

24999 14.2 17040.1 26

49999 25.6 17820.4 26

99999 46.7 20506.0 29

3.5. PlanarGraph

U strukturi k-d tree ispitana je brzina ubacivanja elemenata u graf i brzina pronalaženja

jednog cvora. Kod testnih metoda dan je u nastavku:

p u b l i c vo id c r e a t e G r a p h ( ) {

f i n a l long s t a r t T i m e = System . c u r r e n t T i m e M i l l i s ( ) ;

f o r ( C o o r d i n a t e c : c s . t o C o o r d i n a t e A r r a y ( ) ) {

i f ( c == n u l l ) break ;

pg . addNode ( c ) ;

}

f i n a l long endTime = System . c u r r e n t T i m e M i l l i s ( ) ;

15

Page 21: Usporedba performansi struktura podataka iz programske knjižnice

a v e r a g e += ( endTime − s t a r t T i m e ) ;

}

p u b l i c vo id t e s t F i n d N o d e ( C o o r d i n a t e c ) {

f i n a l long s t a r t T i m e = System . nanoTime ( ) ;

t h i s . pg . f i n d ( c ) ;

f i n a l long endTime = System . nanoTime ( ) ;

ave rageF indNode += ( endTime − s t a r t T i m e ) ;

}

Rezultati su dani u tablici 3.5.

Tablica 3.5: Rezultati ispitivanja strukture k-d tree

Broj tocaka Vrijeme ubacivanja [ms] Traženje jednog cvora [ns]

1000 1.0 1658.2

10000 2.8 3447.2

25000 5.2 4989.9

50000 8.7 3317.0

100000 23.3 4347.1

3.6. Usporedba performansi

Na slikama 3.1 i 3.2 dani su grafovi koji prikazuju usporedbu vremena ubacivanja i

pretrage pojedinog elementa u ispitanima strukturama.

16

Page 22: Usporedba performansi struktura podataka iz programske knjižnice

Slika 3.1: Prikaz vremena ubacivanja elemenata u strukture podataka

Slika 3.2: Prikaz vremena potrebnog za pretragu elemenata

3.7. ConvexHull

Za potrebe testiranja metode convexHull() napravljen je razred ConvexHull-Testing.

Kod metode koja pokrece test dan je u nastavku:

p u b l i c vo id r u n T e s t ( Geometry g ) {

f i n a l long s t a r t T i m e = System . c u r r e n t T i m e M i l l i s ( ) ;

g . convexHul l ( ) ;

f i n a l long endTime = System . c u r r e n t T i m e M i l l i s ( ) ;

a v e r a g e += ( endTime − s t a r t T i m e ) ;

17

Page 23: Usporedba performansi struktura podataka iz programske knjižnice

System . o u t . p r i n t l n ( " Convex h u l l found i n " +

( endTime − s t a r t T i m e ) + " m i l l i s e c o n d s " ) ;

}

Rezultati izvodenja za razlicit broj tocaka dani su u tablici 3.6. Testiranje je na-

pravljeno tako da se iz skupa ulaznih tocaka napravila struktura MultiPoint nad kojom

je onda moguce izvršiti traženu naredbu. Vremena izvodenja nisu konzistenta zbog

raspodjele resursa drugim procesima na racunalu.

Tablica 3.6: Rezultati izvodenja metode convexHull()

Broj tocaka Vrijeme izvodenja [ms]

1000 18.1

10000 45.8

25000 18.4

50000 75.6

100000 52.5

3.8. Buffer

Za potrebe testiranja metode buffer() napravljen je razred BufferTesting.

Kod metode koja pokrece test dan je u nastavku:

p u b l i c vo id r u n T e s t ( Geometry g , Double d i s t ) {

f i n a l long s t a r t T i m e = System . c u r r e n t T i m e M i l l i s ( ) ;

g . b u f f e r ( d i s t ) ;

f i n a l long endTime = System . c u r r e n t T i m e M i l l i s ( ) ;

a v e r a g e += ( endTime − s t a r t T i m e ) ;

}

Rezultati izvodenja za razlicit broj tocaka dani su tablicom 3.7. U ovom testu

koristimo manji broj tocaka zato što je buffer() skupa operacija i vec za 500 tocaka

ponestalo je memorije na Java heap-u (Java heap-u je dodijeljeno 2 GB memorije).

18

Page 24: Usporedba performansi struktura podataka iz programske knjižnice

Tablica 3.7: Rezultati izvodenja metode buffer()

Broj tocaka Vrijeme izvodenja [ms]

10 34.7

25 31.4

100 152.9

250 3644.2

19

Page 25: Usporedba performansi struktura podataka iz programske knjižnice

4. Zakljucak

Iz provedenih testova možemo zakljuciti po cemu je svaka od struktura podataka po-

sebna i što joj je primarna namjena. Sve strukture su dovoljno brze da se za njihovo

izvodenje može reci da je u stvarnom vremenu. Upravo zbog te cinjenice, knjižnica

JTS koriste se u razvoju nekih drugih projekata. Neki od njih su: GeoServer, GeoTo-ols, OpenJUMP, uDig, gvSIG i dr. Svi navedeni projekti koriste se za implementaciju

geografskih informacijskih sustava.

Iako su rezultati zapanjujuce brzi, testiranje nije provedeno u idealnim uvjetima te

su resursi racunala u pojedinim trenutcima dodijeljivani drugim procesima što znaci da

se testirane operacije mogu izvoditi i brže.

Geometrijske operacije poput traženja konveksne ljuske i meduspremnika su dale

iznenadujuce rezultate. Dok za traženje ljuske i nije potrebno mnogo vremena, traženje

meduspremnika iscrpilo je sve resurse racunala i vec za 500 tocaka nije uspjelo vratiti

rezultate. Operacija je jako zahtjevna te bi na njoj trebalo poraditi kako bi ju se ubrzalo.

Zbog svojeg znacaja, knjižnica JTS je prevedena i u druge programske jezike, od

kojih izdvajamo C/C++. Zbog ogranicavajucih faktora kod izvodenja u Javinoj virtu-

alnoj mašini, kod je preveden kako bi se iskoristila snaga prevodenja u strojni jezik i s

time dodatno dobilo na brzini.

20

Page 26: Usporedba performansi struktura podataka iz programske knjižnice

LITERATURA

https://en.wikipedia.org/wiki/Buffer_(GIS), a.

https://en.wikipedia.org/wiki/Planar_graph, b.

https://en.wikipedia.org/wiki/Simple_Features, c.

https://en.wikipedia.org/wiki/Convex_hull, d.

https://en.wikipedia.org/wiki/Geographic_information_

system#Map_overlay, e.

https://docs.google./presentation/d/1xzwcyQkfxUem599iq_

waR2RIwaJujfU1j4GwWjFhKu0/present?slide=id.i50, f.

http://tsusiatsoftware.net/jts/main.html, g.

https://en.wikipedia.org/wiki/JTS_Topology_Suite, h.

http://tsusiatsoftware.net/jts/files/jts_secrets_

foss4g2007.pdf, i.

https://en.wikipedia.org/wiki/Quadtree, j.

https://en.wikipedia.org/wiki/R-tree, k.

http://tsusiatsoftware.net/jts/files/JTS%20State%20of%

20the%20Lib%202015.pdf, l.

https://en.wikipedia.org/wiki/K-d_tree, m.

Jonathan Aquino. JTS Topology Suite Developer’s Guide, 2003.

M. Davis. JTS Topology Suite Technical Specifications, 2004.

Vivid Solutions Inc. JTS Topology Suite Test Plan (Version 1.1), 2003.

Page 27: Usporedba performansi struktura podataka iz programske knjižnice

Kljucne rijeci: JTS, Java, topologija, grafika, prostorna, analiza, graf, skupovi

A Performance Comparison of JTS Data Structures

Abstract

JTS library is a Java API which is used GIS implementing projects. It contains

a lot of data structures for spatial analysis and simple computer graphics operations.

It is written purely in Java as an open-source technology so users could contribute to

development as well. By testing it is shown that methods in spatial data structures

compute in real time, whereas mathematical operations have some room to improve.

Keywords: JTS, Java, topology, graphics, spatial, analysis, graph, sets

22