„JTS” változatai közötti eltérés
(6 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 == | ||
15. sor: | 17. sor: | ||
== 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 | ||
37. sor: | 40. sor: | ||
* GeoServer | * GeoServer | ||
* Geoforge | * Geoforge | ||
− | |||
== Főbb funkcionalitások == | == Főbb funkcionalitások == | ||
83. sor: | 85. sor: | ||
− | Geometriai objektumok közötti egyezőség vizsgálatára szolgál a normálformájuk. Ennek segítségével a | + | 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. | 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: | 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 | * ekvivalencia: a geometriák topológiailag ekvivalensek | ||
95. sor: | 114. sor: | ||
* tartalmazó: a B geometria benne van az A 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 | * á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. | ||
− | == | + | === 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.
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