Uvod u GeoTools

1. Pregled

U ovom ćemo članku proći kroz osnove Java biblioteka GeoTools otvorenog koda - za rad s geoprostornim podacima. Ova knjižnica pruža sukladne metode za implementaciju Geografskih informacijskih sustava (GIS) te implementira i podržava mnoge standarde Otvorenog geoprostornog konzorcija (OGC).

Kako OGC razvija nove standarde, implementiraju ih GeoTools, što ga čini vrlo praktičnim za geoprostorni rad.

2. Ovisnosti

Morat ćemo dodati ovisnosti GeoTools u našu pom.xml datoteka. Budući da ove ovisnosti nisu hostirane na Maven Central, također moramo deklarirati njihova spremišta kako bi ih Maven mogao preuzeti:

  osgeo Open Source Geospatial Foundation Repository //download.osgeo.org/webdav/geotools/ opengeo OpenGeo Maven Repository //repo.opengeo.org 

Nakon toga možemo dodati svoje ovisnosti:

 org.geotools gt-shapefile 15.2 org.geotools gt-epsg-hsql 15.2 

3. GIS i Shapefiles

Da bismo praktično koristili biblioteku GeoTools, trebamo znati nekoliko stvari o geografskim informacijskim sustavima i shapefiles.

3.1. GIS

Ako želimo raditi s geografskim podacima, trebat će nam geografski informacijski sustav (GIS). Ovaj se sustav može koristiti za predstavljanje, hvatanje, pohranjivanje, manipuliranje, analizu ili upravljanje geografskim podacima.

Neki su dijelovi zemljopisnih podataka prostorni - odnose se na konkretna mjesta na zemlji. Prostorni podaci obično su popraćeni atributnim podacima. Podaci o atributima mogu biti bilo kakve dodatne informacije o svakoj od prostornih značajki.

Primjer geografskih podataka bili bi gradovi. Stvarni položaj gradova su prostorni podaci. Dodatni podaci kao što su ime grada i stanovništvo činili bi podatke o atributima.

3.2. Shapefiles

Dostupni su različiti formati za rad s geoprostornim podacima. Raster i vektor su dvije primarne vrste podataka.

U ovom ćemo članku vidjeti kako raditi s vektorskim tipom podatakae. Ovaj tip podataka može se predstaviti kao točke, crte ili poligoni.

Za spremanje vektorskih podataka u datoteku koristit ćemo a shapefile. Ovaj format datoteke koristi se pri radu s geoprostornim vektorskim tipom podataka. Također je kompatibilan sa širokim spektrom GIS softvera.

GeoTools možemo koristiti za dodavanje značajki poput gradova, škola i orijentira shapefiles.

4. Stvaranje značajki

The GeoTools dokumentacija određuje da je značajka sve što se može nacrtati na karti, poput grada ili neke orijentacije. I, kao što smo spomenuli, jednom stvorene značajke mogu se spremiti u datoteke pod nazivom shapefiles.

4.1. Čuvanje geoprostornih podataka

Prije stvaranja značajke, moramo znati njezine geoprostorne podatke ili koordinate dužine i širine svog položaja na zemlji. Što se tiče podataka o atributima, moramo znati naziv značajke koju želimo stvoriti.

Te se informacije mogu naći na webu. Neke web stranice poput simplemaps.com ili maxmind.com nude besplatne baze podataka s geoprostornim podacima.

Kad znamo dužinu i širinu grada, lako ih možemo pohraniti u neki objekt. Možemo koristiti a Karta objekt koji će sadržavati ime grada i popis njegovih koordinata.

Stvorimo pomoćnu metodu kako bismo olakšali pohranu podataka u našoj Karta objekt:

private static void addToLocationMap (Naziv niza, dvostruki lat, dvostruki lng, Map lokacije) {Koordinate popisa = novi ArrayList (); koordinate.add (lat); koordinate.add (lng); locations.put (ime, koordinate); }

Sad ispunimo naš Karta objekt:

Karta lokacije = nova HashMap (); addToLocationMap ("Bangkok", 13.752222, 100.493889, lokacije); addToLocationMap ("New York", 53.083333, -0.15, lokacije); addToLocationMap ("Cape Town", -33,925278, 18,423889, lokacije); addToLocationMap ("Sydney", -33,859972, 151,211111, lokacije); addToLocationMap ("Ottawa", 45.420833, -75,69, lokacije); addToLocationMap ("Kairo", 30.07708, 31.285909, lokacije);

Ako preuzmemo neku CSV bazu podataka koja sadrži te podatke, lako možemo stvoriti čitač za preuzimanje podataka, umjesto da ih držimo u objektu kao ovdje.

4.2. Utvrđivanje vrsta značajki

Dakle, sada imamo kartu gradova. Da bismo mogli stvoriti značajke s tim podacima, prvo ćemo morati definirati njihov tip. GeoTools nudi dva načina definiranja vrsta značajki.

Jedan od načina je korištenje createType metoda DataUtilites razred:

SimpleFeatureType TYPE = DataUtilities.createType ("Location", "location: Point: srid = 4326," + "name: String");

Drugi način je da koristi SimpleFeatureTypeBuilder, koji pruža veću fleksibilnost. Na primjer, možemo postaviti Referenčni sustav koordinata za tip, a možemo postaviti i maksimalnu duljinu polja imena:

Graditelj SimpleFeatureTypeBuilder = novi SimpleFeatureTypeBuilder (); builder.setName ("Lokacija"); builder.setCRS (DefaultGeographicCRS.WGS84); builder .add ("Lokacija", Point.class); .length (15) .add ("Name", String.class); SimpleFeatureType CITY = builder.buildFeatureType ();

Obje vrste pohranjuju iste podatke. Mjesto grada pohranjeno je kao Točka, a ime grada pohranjeno je kao Niz.

Vjerojatno ste primijetili da varijable tipa TIP i GRAD nazivaju se velikim slovima, poput konstanti. Tipske varijable treba tretirati kao konačni varijable i ne smiju se mijenjati nakon što su stvorene, pa se ovaj način imenovanja može koristiti za označavanje upravo toga.

4.3. Stvaranje značajki i zbirke značajki

Jednom kada definiramo vrstu značajke i imamo objekt koji ima podatke potrebne za stvaranje značajki, možemo ih početi stvarati s njihovim graditeljem.

Instancirajmo a SimpleFeatureBuilder pružajući naš tip značajke:

SimpleFeatureBuilder featureBuilder = novi SimpleFeatureBuilder (CITY);

Trebat će nam i zbirka za pohranu svih stvorenih objekata značajke:

DefaultFeatureCollection collection = nova DefaultFeatureCollection ();

Budući da smo u našem tipu značajke proglasili da držimo Točka za mjesto trebat ćemo stvoriti točke za naše gradove na temelju njihovih koordinata. To možemo učiniti s GeoTools-ov JTSGeometryFactoryFinder:

GeometryFactory geometryFactory = JTSFactoryFinder.getGeometryFactory (null);

Imajte na umu da možemo koristiti i druge Geometrija klase poput Crta i Poligon.

Možemo stvoriti funkcija koji će nam pomoći da stavimo značajke u kolekciju:

privatna statička funkcija<>, SimpleFeature> toFeature (SimpleFeatureType CITY, GeometryFactory geometryFactory) {return location -> {Point point = geometryFactory.createPoint (nova koordinata (location.getValue () .get (0), location.getValue (). Get (1))) ; SimpleFeatureBuilder featureBuilder = novi SimpleFeatureBuilder (CITY); featureBuilder.add (točka); featureBuilder.add (location.getKey ()); vratiti featureBuilder.buildFeature (null); }; }

Nakon što imamo graditelj i kolekciju, pomoću prethodno stvorenih funkcija, možemo stvorite značajke i pohranite ih u našu kolekciju:

locations.entrySet (). stream () .map (toFeature (CITY, geometryFactory)) .forEach (collection :: add);

Kolekcija sada sadrži sve značajke stvorene na temelju naših Karta objekt koji je sadržavao geoprostorne podatke.

5. Stvaranje DataStore

GeoTools sadrži a DataStore API koja se koristi za predstavljanje izvora geoprostornih podataka. Ovaj izvor može biti datoteka, baza podataka ili neka usluga koja vraća podatke. Možemo koristiti a DataStoreFactory stvoriti naše DataStore, koji će sadržavati naše značajke.

Postavimo datoteku koja će sadržavati značajke:

Datoteka shapeFile = nova datoteka (nova datoteka ("."). GetAbsolutePath () + "shapefile.shp");

Sada, postavimo parametre pomoću kojih ćemo reći DataStoreFactory koju datoteku koristiti i naznačiti da moramo pohraniti prostorni indeks kada stvaramo svoj DataStore:

Parametri karte = novi HashMap (); params.put ("url", shapeFile.toURI (). toURL ()); params.put ("izradi prostorni indeks", Boolean.TRUE);

Stvorimo DataStoreFactory koristeći parametre koje smo upravo stvorili i upotrijebite tu tvornicu za izradu DataStore:

ShapefileDataStoreFactory dataStoreFactory = novo ShapefileDataStoreFactory (); ShapefileDataStore dataStore = (ShapefileDataStore) dataStoreFactory.createNewDataStore (params); dataStore.createSchema (GRAD);

6. Pisanje u Shapefile

Posljednji korak koji moramo učiniti je zapisati svoje podatke u a shapefile. Da bismo to učinili sigurno, idemo koristiti Transakcija sučelje to je dio GeoTools API.

Ovo sučelje daje nam mogućnost da lako počiniti naše promjene u datoteci. Također pruža način za izvesti a vraćanje neuspješnih promjena ako se pojavi neki problem dok pišem u datoteku:

Transakcijska transakcija = nova DefaultTransaction ("stvori"); Niz tipaName = dataStore.getTypeNames () [0]; SimpleFeatureSource featureSource = dataStore.getFeatureSource (typeName); if (featureSource instanceof SimpleFeatureStore) {SimpleFeatureStore featureStore = (SimpleFeatureStore) featureSource; featureStore.setTransaction (transakcija); isprobajte {featureStore.addFeatures (zbirka); transakcija.commit (); } catch (problem iznimke) {action.rollback (); } napokon {action.close (); }}

The SimpleFeatureSource koristi se za čitanje značajki, a SimpleFeatureStore koristi se za pristup čitanju / pisanju. Navedeno je u GeoTools dokumentacija koja pomoću instanceof Način provjere možemo li zapisati u datoteku je pravi način za to.

Ovaj shapefile može se kasnije otvoriti s bilo kojim GIS preglednikom koji ima shapefile podrška.

7. Zaključak

U ovom smo članku vidjeli kako možemo iskoristiti GeoTools knjižnicu obaviti vrlo zanimljiv geo-prostorni posao.

Iako je primjer bio jednostavan, može se proširiti i koristiti za stvaranje bogatih shapefiles u razne svrhe.

To bismo trebali imati na umu GeoTools živahna je knjižnica, a ovaj članak samo služi kao osnovni uvod u knjižnicu. Također, GeoTools nije ograničen samo na stvaranje vektorskih vrsta podataka - može se koristiti i za stvaranje ili rad s rasterskim vrstama podataka.

Cjelovit primjer koda korištenog u ovom članku možete pronaći u našem projektu GitHub. Ovo je Maven projekt, pa biste ga trebali moći uvesti i pokrenuti kakav jest.