Inleiding tot GeoTools

1. Overzicht

In dit artikel bespreken we de basisprincipes van het GeoTools open source Java-bibliotheek - voor het werken met georuimtelijke gegevens. Deze bibliotheek biedt compatibele methoden voor het implementeren van geografische informatiesystemen (GIS) en implementeert en ondersteunt vele Open Geospatial Consortium (OGC) -standaarden.

Naarmate de OGC nieuwe standaarden ontwikkelt, worden deze geïmplementeerd door de GeoTools, wat het erg handig maakt voor geospatiaal werk.

2. Afhankelijkheden

We zullen de afhankelijkheden van GeoTools moeten toevoegen aan onze pom.xml het dossier. Aangezien deze afhankelijkheden niet op Maven Central worden gehost, moeten we ook hun repositories declareren zodat Maven ze kan downloaden:

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

Daarna kunnen we onze afhankelijkheden toevoegen:

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

3. GIS en Shapefiles

Om praktisch gebruik te kunnen maken van de GeoTools-bibliotheek, moeten we een paar dingen weten over geografische informatiesystemen en shapefiles.

3.1. GIS

Als we met geografische gegevens willen werken, hebben we een geografisch informatiesysteem (GIS) nodig. Dit systeem kan worden gebruikt om geografische gegevens te presenteren, vast te leggen, op te slaan, te manipuleren, te analyseren of te beheren.

Een deel van de geografische gegevens is ruimtelijk: het verwijst naar concrete locaties op aarde. De ruimtelijke gegevens gaan meestal vergezeld van de attribuutgegevens. Attribuutgegevens kunnen aanvullende informatie zijn over elk van de ruimtelijke kenmerken.

Een voorbeeld van geografische gegevens zijn steden. De feitelijke locatie van de steden zijn de ruimtelijke gegevens. Aanvullende gegevens zoals de naam van de stad en het aantal inwoners zouden de attribuutgegevens vormen.

3.2. Shapefiles

Er zijn verschillende formaten beschikbaar om met geospatiale gegevens te werken. Raster en vector zijn de twee primaire gegevenstypen.

In dit artikel gaan we zien hoe we kunnen werken met het vectorgegevenstypee. Dit gegevenstype kan worden weergegeven als punten, lijnen of polygonen.

Om vectorgegevens in een bestand op te slaan, gebruiken we een shapefile. Dit bestandsformaat wordt gebruikt bij het werken met het geospatiale vectorgegevenstype. Het is ook compatibel met een breed scala aan GIS-software.

We kunnen GeoTools gebruiken om functies zoals steden, scholen en oriëntatiepunten toe te voegen aan shapefiles.

4. Functies maken

De GeoTools documentatie specificeert dat een element alles is dat op een kaart kan worden getekend, zoals een stad of een herkenningspunt. En, zoals we al zeiden, eenmaal gemaakt, kunnen functies vervolgens worden opgeslagen in bestanden met de naam shapefiles.

4.1. Geospatiale gegevens bewaren

Voordat we een object maken, moeten we de geospatiale gegevens of de lengte- en breedtegraadcoördinaten van zijn locatie op aarde kennen. Wat betreft kenmerkgegevens, we moeten de naam weten van de functie die we willen maken.

Deze informatie is te vinden op internet. Sommige sites zoals simplemaps.com of maxmind.com bieden gratis databases met georuimtelijke gegevens.

Als we de lengte- en breedtegraad van een stad kennen, kunnen we ze gemakkelijk in een object opslaan. We kunnen een Kaart object dat de naam van de stad en een lijst met coördinaten bevat.

Laten we een hulpmethode maken om het opslaan van gegevens in ons Kaart voorwerp:

private static void addToLocationMap (String naam, dubbele lat, dubbele lng, Map locations) {List coordinates = new ArrayList (); coordinates.add (lat); coordinates.add (lng); locations.put (naam, coördinaten); }

Laten we nu onze invullen Kaart voorwerp:

Kaart locaties = nieuwe HashMap (); addToLocationMap ("Bangkok", 13.752222, 100.493889, locaties); addToLocationMap ("New York", 53.083333, -0.15, locaties); addToLocationMap ("Kaapstad", -33.925278, 18.423889, locaties); addToLocationMap ("Sydney", -33.859972, 151.211111, locaties); addToLocationMap ("Ottawa", 45.420833, -75.69, locaties); addToLocationMap ("Cairo", 30.07708, 31.285909, locaties);

Als we een CSV-database downloaden die deze gegevens bevat, kunnen we gemakkelijk een lezer maken om de gegevens op te halen in plaats van deze in een object zoals hier te bewaren.

4.2. Functietypen definiëren

Dus nu hebben we een kaart met steden. Om functies met deze gegevens te kunnen maken, moeten we eerst hun type definiëren. GeoTools biedt twee manieren om feature types te definiëren.

Een manier is om de createType methode van de DataUtilites klasse:

SimpleFeatureType TYPE = DataUtilities.createType ("Locatie", "locatie: Punt: srid = 4326," + "naam: String");

Een andere manier is om gebruik een SimpleFeatureTypeBuilder, wat meer flexibiliteit biedt. We kunnen bijvoorbeeld het coördinatenreferentiesysteem instellen voor het type en we kunnen een maximale lengte instellen voor het naamveld:

SimpleFeatureTypeBuilder-builder = nieuwe SimpleFeatureTypeBuilder (); builder.setName ("Locatie"); builder.setCRS (DefaultGeographicCRS.WGS84); builder .add ("Locatie", Point.class); .length (15) .add ("Naam", String.class); SimpleFeatureType CITY = builder.buildFeatureType ();

Beide typen slaan dezelfde informatie op. De locatie van de stad wordt opgeslagen als een Punt, en de naam van de stad wordt opgeslagen als een Draad.

Je hebt waarschijnlijk gemerkt dat de typevariabelen TYPE en STAD worden genoemd met hoofdletters, zoals constanten. Typevariabelen moeten worden behandeld als laatste variabelen en mogen niet worden gewijzigd nadat ze zijn gemaakt, dus deze manier van benoemen kan worden gebruikt om precies dat aan te geven.

4.3. Feature Creation en Feature Collections

Zodra we het objecttype hebben gedefinieerd en we een object hebben met de gegevens die nodig zijn om objecten te maken, kunnen we beginnen met het maken ervan met hun builder.

Laten we een instantiëren SimpleFeatureBuilder het verstrekken van ons kenmerktype:

SimpleFeatureBuilder featureBuilder = nieuwe SimpleFeatureBuilder (CITY);

We hebben ook een verzameling nodig om alle gemaakte feature-objecten op te slaan:

DefaultFeatureCollection collection = nieuw DefaultFeatureCollection ();

Omdat we in ons kenmerktype hebben verklaard om een Punt voor de locatie moeten we dat doen punten creëren voor onze steden op basis van hun coördinaten. We kunnen dit doen met de GeoTools's JTSGeometryFactoryFinder:

GeometryFactory geometryFactory = JTSFactoryFinder.getGeometryFactory (null);

Let daar op we kunnen ook andere gebruiken Geometrie klassen zoals Lijn en Veelhoek.

We kunnen een functie waarmee we functies in de collectie kunnen opnemen:

privé statische functie<>, SimpleFeature> toFeature (SimpleFeatureType CITY, GeometryFactory geometryFactory) {retourlocatie -> {Point point = geometryFactory.createPoint (nieuwe coördinaat (location.getValue () .get (0), location.getValue (). Get (1))) ; SimpleFeatureBuilder featureBuilder = nieuwe SimpleFeatureBuilder (CITY); featureBuilder.add (punt); featureBuilder.add (location.getKey ()); retourneer featureBuilder.buildFeature (null); }; }

Zodra we de bouwer en de collectie hebben, gebruiken we de eerder gemaakte functie, wij kunnen functies maken en opslaan in onze collectie:

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

De collectie bevat nu alle functies die zijn gemaakt op basis van onze Kaart object dat de georuimtelijke gegevens bevatte.

5. Creëren van een datastore

GeoTools bevat een DataStore-API dat wordt gebruikt om een ​​bron van geospatiale gegevens weer te geven. Deze bron kan een bestand, een database of een service zijn die gegevens retourneert. We kunnen een DataStoreFactory om onze Gegevensopslag, die onze functies zal bevatten.

Laten we het bestand instellen dat de functies zal bevatten:

Bestand shapeFile = nieuw bestand (nieuw bestand ("."). GetAbsolutePath () + "shapefile.shp");

Laten we nu de parameters instellen die we gaan gebruiken om de DataStoreFactory welk bestand we moeten gebruiken en aangeven dat we een ruimtelijke index moeten opslaan wanneer we onze Gegevensopslag:

Mapparams = nieuwe HashMap (); params.put ("url", shapeFile.toURI (). toURL ()); params.put ("create spatial index", Boolean.TRUE);

Laten we het DataStoreFactory met behulp van de parameters die we zojuist hebben gemaakt, en die fabriek gebruiken om het Gegevensopslag:

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

6. Schrijven naar een Shapefile

De laatste stap die we moeten doen, is onze gegevens naar een shapefile. Om dit veilig te doen, gaan we gebruik de Transactie koppel dat is een onderdeel van de GeoTools API.

Deze interface geeft ons de mogelijkheid om gemakkelijk plegen onze de wijzigingen in het bestand. Het biedt ook een manier om voer een terugrollen van de mislukte wijzigingen als zich een probleem voordoet tijdens het schrijven naar het bestand:

Transactietransactie = nieuwe DefaultTransaction ("create"); String typeName = dataStore.getTypeNames () [0]; SimpleFeatureSource featureSource = dataStore.getFeatureSource (typeName); if (featureSource instantie van SimpleFeatureStore) {SimpleFeatureStore featureStore = (SimpleFeatureStore) featureSource; featureStore.setTransaction (transactie); probeer {featureStore.addFeatures (verzameling); transactie.commit (); } catch (uitzonderingsprobleem) {transaction.rollback (); } tenslotte {transaction.close (); }}

De SimpleFeatureSource wordt gebruikt om functies te lezen, en de SimpleFeatureStore wordt gebruikt voor lees- / schrijftoegang. Het is gespecificeerd in het GeoTools documentatie die gebruikmaakt van de instantie van methode om te controleren of we naar het bestand kunnen schrijven, is de juiste manier om dit te doen.

Dit shapefile kan later worden geopend met elke GIS-viewer die shapefile ondersteuning.

7. Conclusie

In dit artikel hebben we gezien hoe we gebruik kunnen maken van de GeoTools bibliotheek om zeer interessant geospatiaal werk te doen.

Hoewel het voorbeeld eenvoudig was, kan het worden uitgebreid en gebruikt om rijk te worden shapefiles voor verschillende doeleinden.

Dat moeten we in gedachten houden GeoTools is een levendige bibliotheek, en dit artikel dient slechts als een basisinleiding tot de bibliotheek. Ook, GeoTools is niet beperkt tot het maken van alleen vectorgegevenstypen - het kan ook worden gebruikt om rastergegevenstypen te maken of ermee te werken.

U kunt de volledige voorbeeldcode die in dit artikel wordt gebruikt, vinden in ons GitHub-project. Dit is een Maven-project, dus u zou het moeten kunnen importeren en uitvoeren zoals het is.


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