JTS
A JTS (Java Topology Suite) egy nyílt forráskódú Java könyvtár síkgeometriai alakzatok modellezéséhez és informatikai alkalmazásukhoz. Az OpenGIS által kiadott "Simple Features Specification for SQL" leírásban meghatározott geometriai modelleket és API-kat implementálja. Része egy "JTS Test Builder" nevű alkalmazás, amely egy interaktív grafikus felületet biztosít a felhasználóknak a geometriák és funkciók kipróbálására.
Tartalomjegyzék
Története
A 2000-es évek elején kezdte meg a programcsomag készítését Martin Davis és Jonathan Aquino a Vivid Solutions cég alkalmazottjainként. A fejlesztést Brit Columbia kormánya támogatta. Azóta már Martin Davis egy önálló projektjeként volt karbantartva egészen 2016 végéig, amikor a projektet átvette a LocationTech vállalat.
Használat
Használatához legalább Java 1.6 verzió szükséges. Maven segítségével a projektbe importálható, csupán a következő sorokat kell bemásolni a pom.xml-be.
<dependency>
<groupId>com.vividsolutions</groupId>
<artifactId>jts</artifactId>
<version>1.13</version>
</dependency>
Felépítés
Java-ban készült, nyílt forráskódú programcsomag.
Alap modulok
jts-core: geometriák, geometriai függvények, algoritmusok, térbeli adatszerkezetek
jts-io-common: I/O osztályok térbeli adatszerkezetekhez
Teszteléshez használt modulok
jts-tests: a JTS XML teszt komponens és a Test Runner alkalmazás
jts-app: TestBuilder GUI a JTS geometriák teszteléséhez
Egyéb
jts-io-ora: Oracle író-,olvasó osztályok
jts-io-sde: SDE író-,olvasó osztályok
Felhasználási lehetőségei, jelenlegi felhasználása
Geometriai alakzatok készítéséhez, geometriai függvények alkalmazásához, számításokhoz használható. Támogatja a WKT (Well Known Test) és WKB (Well Known Binary) formátumokat.
Egyéb térinformatikai projektek is használják a JTS programcsomagot. Pl.:
- GeoTools
- GeoServer
- Geoforge
Főbb funkcionalitások
Geometriai modell
A geometria modell segítségével pontokat, vonalakat, íveket, sokszögeket és sokszögek gyűjteményét lehet definiálni.
Geometriai típusok készíthetőek a GeometryFactory osztály segítségével, illetve WKT és WBT formában is meg lehet adni őket. A geometriákat reprezentáló osztályok a Geometry absztrakt osztályból származnak. Geometriai típusok:
- GeometryCollection: geometriai objektumok tárolására szolgál
- Point (pont): egy koordinátapárral van reprezentálva
GeometryFactory fact = new GeometryFactory();
Point p1 = fact.createPoint(new Coordinate(0,0));
- MultiPoint (pontok halmaza): kizárólag pontokat tartalmazó gyűjtemény (GeometryCollection)
GeometryFactory fact = new GeometryFactory();
MultiPoint mpt = fact.createMultiPoint(new Coordinate[] { new Coordinate(0,0), new Coordinate(1,1) } );
- LineString (vonal): pontok tömbje határozza meg
GeometryFactory fact = new GeometryFactory();
LineString ls = fact.createLineString(new Coordinate[] { new Coordinate(0,0), new Coordinate(1,1), new Coordinate(2, 3) } );
- LinearRing (körvonal): koordináták tömbjéből áll, ahol az első és az utolsó koordináta megegyezik
GeometryFactory fact = new GeometryFactory();
LinearRing lr = fact.createLinearRing(new Coordinate[] { new Coordinate(0,0), new Coordinate(1,1), new Coordinate(2, 3), new Coordinate(0, 0) });
- MultiLineString (vonalak halmaza): LineString típusú objektumokból álló gyűjtemény (GeometryCollection)
GeometryFactory fact = new GeometryFactory();
MultiLineString mls = fact.createMultiLineString(new LineString[] {ls1, ls2, ls3, ls4});
- Polygon (sokszög): egy LinearRing típusú objektum határozza meg a körvonalát és LinearRing típusú objektumok tömbje adja a lyukakat
GeometryFactory fact = new GeometryFactory();
Polygon polygon = fact.createPolygon(coordinates);
- MultiPolygon (sokszögek halmaza): sokszögekből álló gyűjtemény (GeometryCollection)
GeometryFactory fact = new GeometryFactory();
MultiPolygon mp = fact.createMultiPolygon(polygons);
Geometriai objektumok közötti egyezőség vizsgálatára szolgál a normálformájuk. Ennek segítségével a topológiai egyezőségnél pontosabb ekvivalencia vizsgálható, de a pontról pontra való vizsgálatnál gyengébb. A normálforma a koordináták lexikografikus rendezéseként van megvalósítva.
Tulajdonságok:
- határ (Boundary): egy geometria határa az ő dimenziójánál eggyel kisebb dimenziójú geometriák gyűjteménye
- zártság (isClosed): csak körívekre értelmezett, megvizsgálja, hogy a kezdő és a végpont egybeesik-e
- érvényesség (isValid): megadja, hogy a geometria érvényes-e az SFS szabályai szerint
Geometriai funkciók, algoritmusok
A geometriai metódusok feltételezik, hogy a paraméterül szolgáló geometriák helyesek. Geometriai funkciók:
- Geometriák egymáshoz való viszonya
- Terület és távolság számítása
- Pufferek
- Topológiai egyezőség vizsgálata
- Sokszögesítés
- Vonalak egyesítése
- Konvex burok
- Voronoi diagram generálása
- Legkisebb befoglaló téglalap számítása
- Geometriai egyszerűsítések
Geometriák egymáshoz való viszonya
Ki lehet számítani a megadott geometriák közötti kapcsolatot. A kapott érték lehet:
- ekvivalencia: a geometriák topológiailag ekvivalensek
- diszjunkt: a geometriáknak nincs között pontjuk
- metsző: a geometriáknak van legalább egy közös pontja
- érintkező: a geometriák határának van legalább egy közös pontja, de egyik belső pontjuk sem közös
- tartalmazott: az A geometria benne van a B geometriában
- tartalmazó: a B geometria benne van az A geometriában
- átfedő: a geometriák néhány, de nem az összes pontja közös és a metszet dimenziója megegyezik a geometriák dimenziójával
Műveletek:
- unió: azon pontok összessége, melyek A és B geometriában is benne vannak
- metszet: azon pontok, melyek A vagy B geometriában benne vannak
- különbség (két féle van: A.difference(B) és B.difference(A)): azon pontok, melyek az A geometriában benne vannak, de B-ben nem (a másik esetben fordítva)
- szimmetrikus differencia: azon pontok, melyek vagy A, vagy B geometriában benne vannak, de nem mindkettőben
Pufferek
Kiszámíthatóak a geometriák körüli pufferek, egy távolság megadásával. Ekkor kiszámítja a geometria körüli területet a megadott távolságon belül. Megkülönböztet pozitív és negatív puffert. A pozitív puffer mindig tartalmazza az adott geometriát, míg a negatív a geometrián belül található (pl.: egy sokszög belseje).
A pufferek végének a létrehozásához három lehetőség közül lehet választani:
- Lekerekítés: lekerekíti a puffer sarkait
- Közvetlen a vonal végén végződik a puffer is, nincs lekerekítve
- A puffer a vonal után, a puffernek megadott távolságra végződik, a sarkai nincsenek lekerekítve
Geometry geom = fact.createLineString(new Coordinate[] { new Coordinate(0,0), new Coordinate(1,1), new Coordinate(2, 3) } );
BufferOp bufOp = new BufferOp(geom);
bufOp.setEndCapStyle(BufferParameters.CAP_ROUND);
Geometry buffer = bufOp.getResultGeometry(distance);
Sokszögesítés
A sokszögesítés során vonalakból és szakaszokból, melyek egy sokszöget zárnak körbe, jön létre egy sokszög. Erre a Polygonizer osztály használható. Hibásan megadott vonalakból is készíthető sokszög, de ekkor az elkészült geometria invalid állapotú lesz.
Polygonizer polygonizer = new Polygonizer();
polygonizer.add(lines);
Collection<Polygon> polygons = polygonizer.getPolygons();
Vonalak egyesítése
Vonalak (LineString) lánca egyesíthető egyetlne/kevesebb vonallá. A függvény feltételezi, hogy a vonalak nem metszik egymást, de a kezdő és a végpontjuk egybeeshet. Ha az egyesítendő vonalak iránya nem egyezik meg, akkor az új vonal iránya a többségével fog megegyezni.
LineMerger lineMerger = new LineMerger();
lineMerger.add(lines);
Collection mergedLines = lineMerger.getMergedLineStrings();
Adatszerkezetek és algoritmusok
A JTS programcsomag a következő, térinformatikai számításokhoz szükséges algoritmusokat szolgáltatja a felhasználóknak:
- Vonalszegmensek metszete
- Pontok számítása sokszögben
- Térbeli indexstruktúrák (pl.: bináris fa, STR-fa, negyedelő-fa)
- Gráfstruktúrák és algoritmusok
A kiválasztott és implementált algoritmusok többnyire egyszerre hatékonyak és robosztusokat. A JTS csupán néhány algoritmusnál (pl.: pont sokszögben) érzékeny a robosztusságra. A futás idejő hatékonyság fontos szempont volt a geometriai algoritmusok készítésénél.
I/O
A JTS támogatja a Well-Know Text formátumot. WKT-ben megadott geometriák feldolgozására a Well-Known Text Reader, geometriák WKT formátumra alakítására pedig a Well-Known Text Writer szolgál.
Well-Known Text Reader
A WKTReader geometriákat (Geometry) tud kiolvasni input stream-ekből és string-ekből. Így lehetővé válik más adatszerkezetekbe beágyazott (pl.: XML) szövegblokkokból is geometriák felismerése. Paraméterként meg kell adni a WKTReader-nek egy GeometryFactory-t, hogy a megfelelő implementációjú geometriákat létre lehessen hozni. A GeometryFactory fogja meghatározni az objektum precizíós modelljét és az SRID-t.
Geometry g1 = new WKTReader().read("LINESTRING (0 0, 10 10, 20 20)");
Well-Known Text Writer
A WKTWriter megadja a geometria szöveges reprezentációját egy Java Writer objektumnak. A koordinátákat a megadott precizíós modellnek megfelelő pontossággal fogja megadni.
WKTWriter writer = new WKTWriter();
writer.write(geometry)
Hivatkozások
https://github.com/locationtech/jts