JTS

Innen: GIS Wiki

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.

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

https://www.locationtech.org/proposals/jts-topology-suite

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