Introduktion til GeoTools

1. Oversigt

I denne artikel gennemgår vi det grundlæggende i GeoTools open source Java-bibliotek - til arbejde med geospatiale data. Dette bibliotek leverer kompatible metoder til implementering af geografiske informationssystemer (GIS) og implementerer og understøtter mange Open Geospatial Consortium (OGC) standarder.

Da OGC udvikler nye standarder, implementeres de af GeoTools, hvilket gør det ganske praktisk til geospatialt arbejde.

2. Afhængigheder

Vi bliver nødt til at tilføje GeoTools afhængigheder til vores pom.xml fil. Da disse afhængigheder ikke er hostet på Maven Central, er vi også nødt til at erklære deres arkiver, så Maven kan downloade dem:

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

Derefter kan vi tilføje vores afhængigheder:

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

3. GIS og Shapefiles

For at få praktisk anvendelse af GeoTools-biblioteket skal vi vide et par ting om geografiske informationssystemer og shapefiles.

3.1. GIS

Hvis vi vil arbejde med geografiske data, har vi brug for et geografisk informationssystem (GIS). Dette system kan bruges at præsentere, fange, gemme, manipulere, analysere eller administrere geografiske data.

En del af de geografiske data er rumlige - de refererer til konkrete placeringer på jorden. De geodata ledsages normalt af attributdataene. Attributdata kan være enhver yderligere information om hver af de rumlige funktioner.

Et eksempel på geografiske data ville være byer. Byernes faktiske placering er de geodata. Yderligere data såsom bynavn og befolkning udgør attributdataene.

3.2. Shapefiles

Forskellige formater er tilgængelige til arbejde med geospatiale data. Raster og vektor er de to primære datatyper.

I denne artikel skal vi se, hvordan man arbejder med vektordatatypene. Denne datatype kan repræsenteres som punkter, linjer eller polygoner.

For at gemme vektordata i en fil bruger vi en shapefile. Dette filformat bruges, når du arbejder med geospatial vektordatatype. Det er også kompatibelt med en bred vifte af GIS-software.

Vi kan bruge GeoTools til at tilføje funktioner som byer, skoler og vartegn til shapefiles.

4. Oprettelse af funktioner

Det GeoTools dokumentation specificerer, at en funktion er alt, hvad der kan tegnes på et kort, som en by eller et vartegn. Og som vi nævnte, når de først er oprettet, kan funktioner derefter gemmes i filer, der kaldes shapefiles.

4.1. Opbevaring af geospatiale data

Før vi opretter en funktion, skal vi kende dens geospatiale data eller længde- og breddegradskoordinaterne for dens placering på jorden. Med hensyn til attributdata skal vi kende navnet på den funktion, vi vil oprette.

Disse oplysninger kan findes på internettet. Nogle websteder som simplemaps.com eller maxmind.com tilbyder gratis databaser med geospatiale data.

Når vi kender længden og bredden af ​​en by, kan vi nemt gemme dem i et eller andet objekt. Vi kan bruge en Kort objekt, der indeholder bynavnet og en liste over dets koordinater.

Lad os oprette en hjælpemetode til at lette lagring af data i vores Kort objekt:

private static void addToLocationMap (String name, double lat, double lng, Map placeringer) {Listekoordinater = ny ArrayList (); koordinater.add (lat); koordinater.add (lng); locations.put (navn, koordinater); }

Lad os nu udfylde vores Kort objekt:

Kort placeringer = nyt HashMap (); addToLocationMap ("Bangkok", 13.752222, 100.493889, placeringer); addToLocationMap ("New York", 53.083333, -0.15, placeringer); addToLocationMap ("Cape Town", -33.925278, 18.423889, placeringer); addToLocationMap ("Sydney", -33.859972, 151.211111, placeringer); addToLocationMap ("Ottawa", 45.420833, -75.69, locations); addToLocationMap ("Cairo", 30.07708, 31.285909, locations);

Hvis vi downloader en CSV-database, der indeholder disse data, kan vi nemt oprette en læser til at hente dataene i stedet for at gemme dem i et objekt som her.

4.2. Definition af funktionstyper

Så nu har vi et kort over byer. For at kunne oprette funktioner med disse data skal vi først definere deres type. GeoTools tilbyder to måder at definere funktionstyper på.

En måde er at bruge createType metode til DataUtilites klasse:

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

En anden måde er at brug en SimpleFeatureTypeBuilder, hvilket giver mere fleksibilitet. For eksempel kan vi indstille koordinatsystemet for typen, og vi kan indstille en maksimal længde for navnefeltet:

SimpleFeatureTypeBuilder builder = ny SimpleFeatureTypeBuilder (); builder.setName ("Placering"); builder.setCRS (DefaultGeographicCRS.WGS84); bygherre .add ("Location", Point.class); .length (15) .add ("Name", String.class); SimpleFeatureType CITY = builder.buildFeatureType ();

Begge typer gemmer de samme oplysninger. Byens placering er gemt som en Punkt, og byens navn er gemt som en Snor.

Du bemærkede sandsynligvis, at typen variabler TYPE og CITY er navngivet med alle store bogstaver, som konstanter. Type variabler skal behandles som endelig variabler og bør ikke ændres, når de er oprettet, så denne måde at navngive kan bruges til at angive netop det.

4.3. Feature Creation og Feature Collections

Når vi først har defineret funktionstypen, og vi har et objekt, der har de data, der er nødvendige for at oprette funktioner, kan vi begynde at oprette dem med deres builder.

Lad os instantiere en SimpleFeatureBuilder leverer vores funktionstype:

SimpleFeatureBuilder featureBuilder = ny SimpleFeatureBuilder (CITY);

Vi har også brug for en samling til at gemme alle de oprettede funktionsobjekter:

DefaultFeatureCollection samling = ny DefaultFeatureCollection ();

Da vi i vores funktionstype erklærede at have en Punkt for placeringen skal vi oprette point for vores byer baseret på deres koordinater. Vi kan gøre dette med GeoTools JTSGeometryFactoryFinder:

GeometryFactory geometryFactory = JTSFactoryFinder.getGeometryFactory (null);

Noter det vi kan også bruge andet Geometri klasser som Linie og Polygon.

Vi kan oprette en fungere der hjælper os med at placere funktioner i samlingen:

privat statisk funktion<>, SimpleFeature> toFeature (SimpleFeatureType CITY, GeometryFactory geometryFactory) {return location -> {Point point = geometryFactory.createPoint (new Coordinate (location.getValue () .get (0), location.getValue (). Get (1))) ; SimpleFeatureBuilder featureBuilder = ny SimpleFeatureBuilder (CITY); featureBuilder.add (punkt); featureBuilder.add (location.getKey ()); return featureBuilder.buildFeature (null); }; }

Når vi har bygherren og samlingen, ved hjælp af det tidligere oprettede fungere, vi kan Opret funktioner og gem dem i vores samling:

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

Samlingen indeholder nu alle de funktioner, der er oprettet baseret på vores Kort objekt, der indeholdt geospatiale data.

5. Oprettelse af en DataStore

GeoTools indeholder en DataStore API der bruges til at repræsentere en kilde til geospatiale data. Denne kilde kan være en fil, en database eller en tjeneste, der returnerer data. Vi kan bruge en DataStoreFactory at skabe vores DataStore, som indeholder vores funktioner.

Lad os indstille den fil, der skal indeholde funktionerne:

File shapefile = ny fil (ny fil ("."). GetAbsolutePath () + "shapefile.shp");

Lad os nu indstille de parametre, som vi skal bruge til at fortælle DataStoreFactory hvilken fil der skal bruges og angiver, at vi skal gemme et geografisk indeks, når vi opretter vores DataStore:

Kortparametre = nyt HashMap (); params.put ("url", shapeFile.toURI (). toURL ()); params.put ("Opret rumligt indeks", Boolean.TRUE);

Lad os oprette DataStoreFactory ved hjælp af de parametre, vi lige har oprettet, og brug den fabrik til at oprette DataStore:

ShapefileDataStoreFactory dataStoreFactory = ny ShapefileDataStoreFactory (); ShapefileDataStore dataStore = (ShapefileDataStore) dataStoreFactory.createNewDataStore (params); dataStore.createSchema (CITY);

6. Skrivning til en Shapefile

Det sidste trin, vi skal gøre, er at skrive vores data til en shapefile. For at gøre dette sikkert, vil vi brug Transaktion interface det er en del af GeoTools API.

Denne grænseflade giver os mulighed for at let begå vores ændringer til filen. Det giver også en måde at udføre en tilbageførsel af de mislykkede ændringer, hvis der opstår et problem mens du skriver til filen:

Transaktionstransaktion = ny DefaultTransaction ("opret"); String typeName = dataStore.getTypeNames () [0]; SimpleFeatureSource featureSource = dataStore.getFeatureSource (typeName); if (featureSource instanceof SimpleFeatureStore) {SimpleFeatureStore featureStore = (SimpleFeatureStore) featureSource; featureStore.setTransaction (transaktion); prøv {featureStore.addFeatures (samling); transaktion.forpligtelse (); } fange (Undtagelsesproblem) {transaction.rollback (); } endelig {transaction.close (); }}

Det SimpleFeatureSource bruges til at læse funktioner, og SimpleFeatureStore bruges til læse- / skriveadgang. Det er specificeret i GeoTools dokumentation, der bruger forekomst af metode til at kontrollere, om vi kan skrive til filen, er den rigtige måde at gøre det på.

Det her shapefile kan senere åbnes med enhver GIS-seer, der har shapefile support.

7. Konklusion

I denne artikel så vi, hvordan vi kan gøre brug af GeoTools bibliotek for at udføre meget interessant geo-rumligt arbejde.

Selvom eksemplet var simpelt, kan det udvides og bruges til at skabe rig shapefiles til forskellige formål.

Det skal vi have i tankerne GeoTools er et levende bibliotek, og denne artikel fungerer bare som en grundlæggende introduktion til biblioteket. Også, GeoTools er ikke begrænset til kun at oprette vektordatatyper - det kan også bruges til at oprette eller arbejde med rasterdatatyper.

Du kan finde den fulde eksempelkode, der bruges i denne artikel, i vores GitHub-projekt. Dette er et Maven-projekt, så du skal kunne importere det og køre det som det er.


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