usporedba performansi struktura podataka iz programske knjižnice
TRANSCRIPT
SVEUCILIŠTE U ZAGREBUFAKULTET ELEKTROTEHNIKE I RACUNARSTVA
ZAVRŠNI RAD br. 4468
Usporedba performansi strukturapodataka iz programske knjižnice
JTSMarko Perkovic
Zagreb, lipanj 2016.
i
iii
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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.
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