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.


$config[zx-auto] not found$config[zx-overlay] not found