Bevezetés a GeoTools-ba
1. Áttekintés
Ebben a cikkben áttekintjük a GeoTools nyílt forráskódú Java könyvtár - térinformatikai adatok kezeléséhez. Ez a könyvtár megfelelő módszereket kínál a földrajzi információs rendszerek (GIS) megvalósításához, és számos Open Geospatial Consortium (OGC) szabványt valósít meg és támogat.
Mivel az OGC új szabványokat fejleszt ki, azokat a GeoTools hajtja végre, ami meglehetősen hasznos a térinformatikai munkához.
2. Függőségek
Hozzá kell adnunk a GeoTools függőségeket a sajátunkhoz pom.xml fájl. Mivel ezeket a függőségeket nem a Maven Central üzemelteti, deklarálnunk kell a tárhelyeiket is, hogy a Maven letölthesse őket:
osgeo Open Source Geospatial Foundation Repository //download.osgeo.org/webdav/geotools/ opengeo OpenGeo Maven Repository //repo.opengeo.org
Ezt követően hozzáadhatjuk függőségeinket:
org.geotools gt-shapefile 15.2 org.geotools gt-epsg-hsql 15.2
3. GIS és Shapefiles
A GeoTools könyvtár gyakorlati használatához tudnunk kell néhány dolgot a földrajzi információs rendszerekről és a alakfájlok.
3.1. GIS
Ha földrajzi adatokkal akarunk dolgozni, szükségünk lesz egy földrajzi információs rendszerre (GIS). Ez a rendszer használható földrajzi adatok bemutatása, rögzítése, tárolása, manipulálása, elemzése vagy kezelése.
A földrajzi adatok bizonyos része térbeli - konkrét földrajzi helyekre utal. A téradatokat általában az attribútumadatok kísérik. Az attribútum adatok bármilyen további információt jelenthetnek az egyes térbeli jellemzőkről.
A földrajzi adatokra példa lehet a város. A városok tényleges helye a térbeli adat. További adatok, például a város neve és a lakosság alkotnák az attribútum adatait.
3.2. Alakfájlok
Különböző formátumok állnak rendelkezésre a térinformatikai adatok kezeléséhez. A raszter és a vektor a két elsődleges adattípus.
Ebben a cikkben megnézzük, hogyan kell működni a vektor adattípussale. Ez az adattípus ábrázolható pontok, vonalak vagy sokszögek formájában.
A vektoradatok fájlban történő tárolásához a alakfájl. Ezt a fájlformátumot használják, amikor a térinformatikai vektor adattípusával dolgozik. Kompatibilis a GIS szoftverek széles skálájával.
A GeoTools segítségével olyan funkciókat adhatunk hozzá, mint városok, iskolák és tereptárgyak alakfájlok.
4. Funkciók létrehozása
A GeoTools A dokumentáció meghatározza, hogy a szolgáltatás bármi, amit a térképre meg lehet rajzolni, például egy város vagy valamilyen nevezetesség. És amint említettük, a létrehozás után a funkciókat el lehet menteni az úgynevezett fájlokba alakfájlok.
4.1. Földrajzi adatok megőrzése
Mielőtt létrehoznánk egy funkciót, ismernünk kell annak térinformatikai adatait, illetve földi elhelyezkedésének hossz- és szélességi koordinátáit. Ami az attribútumadatokat illeti, tudnunk kell a létrehozni kívánt szolgáltatás nevét.
Ez az információ megtalálható az interneten. Egyes webhelyek, például az simplemaps.com vagy a maxmind.com ingyenes adatbázisokat kínálnak térinformatikai adatokkal.
Amikor ismerjük a város hosszúságát és szélességét, könnyen tárolhatjuk őket valamilyen tárgyban. Használhatjuk a Térkép objektum, amely a város nevét és koordinátáinak listáját fogja tartalmazni.
Hozzunk létre egy segítő módszert az adatok belső tárolásának megkönnyítésére Térkép tárgy:
privát statikus void addToLocationMap (Karakterlánc neve, dupla lat, dupla lng, Térkép helyek) {Lista koordinátái = új ArrayList (); koordináták.add (lat); koordináták.add (lng); helyek.bevitel (név, koordináták); }
Most töltsük ki a Térkép tárgy:
Térkép helyek = új HashMap (); addToLocationMap ("Bangkok", 13.752222, 100.493889, helyszínek); addToLocationMap ("New York", 53.083333, -0.15, helyszínek); addToLocationMap ("Fokváros", -33.925278, 18.423889, helyszínek); addToLocationMap ("Sydney", -33.859972, 151.211111, helyek); addToLocationMap ("Ottawa", 45.420833, -75.69, helyszínek); addToLocationMap ("Kairó", 30.07708, 31.285909, helyek);
Ha letöltünk valamilyen CSV-adatbázist, amely ezeket az adatokat tartalmazza, akkor könnyen létrehozhatunk egy olvasót az adatok lekérésére ahelyett, hogy itt tárolnánk.
4.2. Funkciótípusok meghatározása
Tehát most megvan a városok térképe. Ahhoz, hogy szolgáltatásokat hozzunk létre ezen adatokkal, először meg kell határoznunk a típusukat. A GeoTools kétféle módon kínálja a szolgáltatás típusait.
Az egyik mód a createType módszere DataUtilites osztály:
SimpleFeatureType TYPE = DataUtilities.createType ("Hely", "hely: Pont: srid = 4326," + "név: String");
Egy másik út az használj SimpleFeatureTypeBuilder, amely nagyobb rugalmasságot biztosít. Beállíthatjuk például a koordináta-referenciarendszert a típushoz, és beállíthatjuk a név mező maximális hosszát:
SimpleFeatureTypeBuilder builder = new SimpleFeatureTypeBuilder (); builder.setName ("Hely"); builder.setCRS (DefaultGeographicCRS.WGS84); építő .add ("Hely", Pont.osztály); .length (15) .add ("Név", String.osztály); SimpleFeatureType CITY = builder.buildFeatureType ();
Mindkét típus ugyanazt az információt tárolja. A város helyét a Pont, és a város nevét a-ként tárolják Húr.
Valószínűleg észrevette, hogy a típusváltozók TÍPUS és VÁROS az összes nagybetűvel meg van nevezve, mint az állandók. A típusváltozókat úgy kell kezelni végső változók, és létrehozásuk után nem szabad őket megváltoztatni, tehát a névadás ezen módja éppen arra utalhat.
4.3. Feature Creation és Feature Collections
Miután meghatároztuk a szolgáltatás típusát, és van egy objektumunk, amely rendelkezik a funkciók létrehozásához szükséges adatokkal, elkezdhetjük létrehozni őket a készítőjükkel.
Példányozzuk a SimpleFeatureBuilder szolgáltatástípusunk megadása:
SimpleFeatureBuilder featureBuilder = new SimpleFeatureBuilder (CITY);
Szükségünk lesz egy gyűjteményre is az összes létrehozott szolgáltatásobjektum tárolásához:
DefaultFeatureCollection gyűjtemény = új DefaultFeatureCollection ();
Mivel a funkciótípusunkban kijelentettük, hogy tartjuk a Pont a helyszínhez szükségünk lesz koordinátáik alapján pontokat hozhat létre városunk számára. Megtehetjük ezt a A GeoTools JTSGeometryFactoryFinder:
GeometryFactory geometryFactory = JTSFactoryFinder.getGeometryFactory (null);
Vegye figyelembe, hogy használhatunk másokat is Geometria osztályok, mint Vonal és Poligon.
Hozhatunk létre a funkció ami segít a funkciók elhelyezésében a gyűjteményben:
privát statikus függvény<>, SimpleFeature> toFeature (SimpleFeatureType CITY, GeometryFactory geometryFactory) {visszatérési hely -> {Pont pont = geometryFactory.createPoint (új Koordinátor (hely.getValue () .get (0), hely.getValue (). Get (1))) ; SimpleFeatureBuilder featureBuilder = new SimpleFeatureBuilder (CITY); featureBuilder.add (pont); featureBuilder.add (hely.getKey ()); return featureBuilder.buildFeature (null); }; }
Miután elkészült az építtető és a gyűjtemény, a korábban létrehozott felhasználásával funkció, tudunk hozzon létre funkciókat és tárolja őket gyűjteményünkben:
helyek.entrySet (). stream () .map (toFeature (CITY, geometryFactory)) .forEach (collection :: add);
A gyűjtemény most az összes, a mi alapján létrehozott funkciót tartalmazza Térkép a földrajzi adatokat tároló objektum.
5. DataStore létrehozása
GeoTools tartalmaz egy DataStore API amelyet a térinformatikai adatok forrásának képviseletére használnak. Ez a forrás lehet fájl, adatbázis vagy valamilyen szolgáltatás, amely adatokat ad vissza. Használhatjuk a DataStoreFactory hogy létrehozza a mi DataStore, amely tartalmazza a jellemzőinket.
Állítsuk be a fájlt, amely tartalmazza a jellemzőket:
Fájl shapeFile = új fájl (új fájl ("."). GetAbsolutePath () + "shapefile.shp");
Most állítsuk be azokat a paramétereket, amelyeket használni fogunk a DataStoreFactory melyik fájlt kell használni, és jelezzük, hogy térbeli indexet kell tárolnunk, amikor létrehozunk DataStore:
Térképparaméterek = new HashMap (); params.put ("url", shapeFile.toURI (). toURL ()); params.put ("térbeli index létrehozása", Boolean.TRUE);
Hozzuk létre a DataStoreFactory az imént létrehozott paraméterek felhasználásával, és a gyár használatával hozza létre a DataStore:
ShapefileDataStoreFactory dataStoreFactory = new ShapefileDataStoreFactory (); ShapefileDataStore dataStore = (ShapefileDataStore) dataStoreFactory.createNewDataStore (paraméterek); dataStore.createSchema (CITY);
6. Alakfájlba való írás
Az utolsó lépés, amelyet meg kell tennünk, az, hogy megírjuk adatainkat a alakfájl. Ahhoz, hogy ezt biztonságosan tegyük, megyünk használja a Tranzakció felület ez része a GeoTools API.
Ez a felület lehetőséget ad arra, hogy könnyen elkövetni a fájl változásai. Lehetőséget nyújt arra is végre a visszagörgetés a sikertelen változásokból, ha valamilyen probléma jelentkezik miközben írt a fájlba:
Tranzakciós tranzakció = new DefaultTransaction ("create"); String typeName = dataStore.getTypeNames () [0]; SimpleFeatureSource featureSource = dataStore.getFeatureSource (typeName); if (featureSource példánya a SimpleFeatureStore-ból) {SimpleFeatureStore featureStore = (SimpleFeatureStore) featureSource; featureStore.setTransaction (tranzakció); próbáld ki a {featureStore.addFeatures (gyűjtemény); ügylet.vállalás (); } fogás (Kivételi probléma) {tranzakció.visszahúzás (); } végül {tranzakció.close (); }}
A SimpleFeatureSource a funkciók olvasására szolgál, és a SimpleFeatureStore írási és olvasási hozzáférésre használható. A GeoTools dokumentáció, amely a Például az A módszer annak ellenőrzésére, hogy tudunk-e írni a fájlba, a megfelelő módszer erre.
Ez alakfájl később bármely GIS-nézővel megnyitható alakfájl támogatás.
7. Következtetés
Ebben a cikkben azt láttuk, hogy miként használhatjuk a GeoTools könyvtárt nagyon érdekes földrajzi munkák elvégzésére.
Bár a példa egyszerű volt, kibővíthető és felhasználható gazdagok létrehozására alakfájlok különféle célokra.
Ezt szem előtt kell tartanunk GeoTools egy élénk könyvtár, és ez a cikk csak a könyvtár alapvető bevezetőjeként szolgál. Is, GeoTools nem korlátozódik csak vektoros adattípusok létrehozására - használható raszteres adattípusok létrehozására vagy velük való együttműködésre is.
A cikkben használt teljes példakód megtalálható a GitHub projektünkben. Ez egy Maven projekt, ezért képesnek kell lennie arra, hogy importálja és futtassa úgy, ahogy van.