„JTS” változatai közötti eltérés

Innen: GIS Wiki
(Új oldal, tartalma: „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 kiad…”)
 
 
(10 közbenső módosítás ugyanattól a szerkesztőtől nincs mutatva)
1. sor: 1. sor:
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.  
+
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 ==
 +
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.
  
 +
<syntaxhighlight>
 +
<dependency>
 +
    <groupId>com.vividsolutions</groupId>
 +
    <artifactId>jts</artifactId>
 +
    <version>1.13</version>
 +
</dependency>
 +
</syntaxhighlight>
  
 
== Felépítés ==
 
== Felépítés ==
 +
Java-ban készült, nyílt forráskódú programcsomag.
 
=== Alap modulok ===
 
=== Alap modulok ===
 
jts-core: geometriák, geometriai függvények, algoritmusok, térbeli adatszerkezetek
 
jts-core: geometriák, geometriai függvények, algoritmusok, térbeli adatszerkezetek
21. sor: 33. sor:
 
jts-io-sde: SDE í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.
  
== Főbb funkcionalitások==
+
Egyéb térinformatikai projektek is használják a JTS programcsomagot. Pl.:
 +
* GeoTools
 +
* GeoServer
 +
* Geoforge
 +
 
 +
== Főbb funkcionalitások ==
 
=== Geometriai modell ===
 
=== 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
 +
<syntaxhighlight lang="java">
 +
GeometryFactory fact = new GeometryFactory();
 +
Point p1 = fact.createPoint(new Coordinate(0,0));
 +
</syntaxhighlight>
 +
* MultiPoint (pontok halmaza): kizárólag pontokat tartalmazó gyűjtemény (GeometryCollection)
 +
<syntaxhighlight lang="java">
 +
GeometryFactory fact = new GeometryFactory();
 +
MultiPoint mpt = fact.createMultiPoint(new Coordinate[] { new Coordinate(0,0), new Coordinate(1,1) } );
 +
</syntaxhighlight>
 +
* LineString (vonal): pontok tömbje határozza meg
 +
<syntaxhighlight lang="java">
 +
GeometryFactory fact = new GeometryFactory();
 +
LineString ls = fact.createLineString(new Coordinate[] { new Coordinate(0,0), new Coordinate(1,1), new Coordinate(2, 3) } );
 +
</syntaxhighlight>
 +
* LinearRing (körvonal): koordináták tömbjéből áll, ahol az első és az utolsó koordináta megegyezik
 +
<syntaxhighlight lang="java">
 +
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) });
 +
</syntaxhighlight>
 +
* MultiLineString (vonalak halmaza): LineString típusú objektumokból álló gyűjtemény (GeometryCollection)
 +
<syntaxhighlight lang="java">
 +
GeometryFactory fact = new GeometryFactory();
 +
MultiLineString mls = fact.createMultiLineString(new LineString[] {ls1, ls2, ls3, ls4});
 +
</syntaxhighlight>
 +
* 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
 +
<syntaxhighlight lang="java">
 +
GeometryFactory fact = new GeometryFactory();
 +
Polygon polygon = fact.createPolygon(coordinates);
 +
</syntaxhighlight>
 +
* MultiPolygon (sokszögek halmaza): sokszögekből álló gyűjtemény (GeometryCollection)
 +
<syntaxhighlight lang="java">
 +
GeometryFactory fact = new GeometryFactory();
 +
MultiPolygon mp = fact.createMultiPolygon(polygons);
 +
</syntaxhighlight>
 +
 +
 +
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 ===
 
=== 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
 +
 +
<syntaxhighlight lang="java">
 +
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);
 +
</syntaxhighlight>
 +
 +
==== 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.
 +
<syntaxhighlight lang="java">
 +
Polygonizer polygonizer = new Polygonizer();
 +
polygonizer.add(lines);
 +
Collection<Polygon> polygons = polygonizer.getPolygons();
 +
</syntaxhighlight>
 +
 +
==== 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.
 +
<syntaxhighlight lang="java">
 +
LineMerger lineMerger = new LineMerger();
 +
lineMerger.add(lines);
 +
Collection mergedLines = lineMerger.getMergedLineStrings();
 +
</syntaxhighlight>
  
 
=== Adatszerkezetek és algoritmusok ===
 
=== 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.
  
== Példák ==
+
=== 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.
 +
<syntaxhighlight lang="java">
 +
Geometry g1 = new WKTReader().read("LINESTRING (0 0, 10 10, 20 20)");
 +
</syntaxhighlight>
  
 +
=== 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.
 +
<syntaxhighlight lang="java">
 +
WKTWriter writer = new WKTWriter();
 +
writer.write(geometry)
 +
</syntaxhighlight>
 
== Hivatkozások ==
 
== Hivatkozások ==
 
[https://github.com/locationtech/jts https://github.com/locationtech/jts]
 
[https://github.com/locationtech/jts https://github.com/locationtech/jts]

A lap jelenlegi, 2017. május 1., 01:14-kori változata

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