Einführung in GeoTools

Einführung in GeoTools

1. Überblick

In diesem Artikel werden die Grundlagen derGeoTools open source Java library – for working with geospatial data erläutert. Diese Bibliothek bietet kompatible Methoden zur Implementierung von Geographic Information Systems (GIS) und implementiert und unterstützt viele Open Geospatial Consortium (OGC) -Standards.

Während das OGC neue Standards entwickelt, werden diese von den GeoTools implementiert, was es für die Geodatenarbeit sehr praktisch macht.

2. Abhängigkeiten

Wir müssen die GeoTools-Abhängigkeiten zu unsererpom.xml-Datei hinzufügen. Da diese Abhängigkeiten nicht auf Maven Central gehostet werden, müssen wir auch ihre Repositorys deklarieren, damit Maven sie herunterladen kann:


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

Danach können wir unsere Abhängigkeiten hinzufügen:


    org.geotools
    gt-shapefile
    15.2


    org.geotools
    gt-epsg-hsql
    15.2

3. GIS und Shapefiles

Um die GeoTools-Bibliothek praktisch nutzen zu können, müssen wir einige Dinge über geografische Informationssysteme undshapefileswissen.

3.1. GIS

Wenn wir mit geografischen Daten arbeiten möchten, benötigen wir ein geografisches Informationssystem (GIS). Dieses System kannto present, capture, store, manipulate, analyze, or manage geographical data verwendet werden.

Ein Teil der geografischen Daten ist räumlich und bezieht sich auf konkrete Orte auf der Erde. Die räumlichen Daten werden normalerweise von den Attributdaten begleitet. Attributdaten können zusätzliche Informationen zu jedem der räumlichen Merkmale sein.

Ein Beispiel für geografische Daten wären Städte. Der tatsächliche Standort der Städte sind die räumlichen Daten. Zusätzliche Daten wie der Name der Stadt und die Bevölkerung würden die Attributdaten ausmachen.

3.2. Shapefiles

Für die Arbeit mit Geodaten stehen verschiedene Formate zur Verfügung. Raster und Vektor sind die beiden primären Datentypen.

In diesem Artikel erfahren Sie, wie Sie mit den Vektordatentypene arbeiten. Dieser Datentyp kann als Punkte, Linien oder Polygone dargestellt werden.

Um Vektordaten in einer Datei zu speichern, verwenden wirshapefile. Dieses Dateiformat wird beim Arbeiten mit dem Geodaten-Vektordatentyp verwendet. Außerdem ist es mit einer Vielzahl von GIS-Software kompatibel.

Wir können GeoTools verwenden, umshapefiles Funktionen wie Städte, Schulen und Sehenswürdigkeiten hinzuzufügen.

4. Features erstellen

In der Dokumentation zuGeoToolswird angegeben, dass ein Feature alles ist, was auf einer Karte gezeichnet werden kann, z. B. eine Stadt oder ein Wahrzeichen. Und wie bereits erwähnt, können Features nach ihrer Erstellung in Dateien mit dem Namenshapefiles gespeichert werden.

4.1. Geodaten aufbewahren

Before creating a feature, we need to know its geospatial data or the longitude and latitude coordinates of its location on earth. Bei Attributdaten müssen wir den Namen des Features kennen, das wir erstellen möchten.

Diese Informationen finden Sie im Internet. Einige Websites wiesimplemaps.com odermaxmind.com bieten kostenlose Datenbanken mit Geodaten an.

Wenn wir den Längen- und Breitengrad einer Stadt kennen, können wir sie leicht in einem Objekt speichern. Wir können einMap-Objekt verwenden, das den Städtenamen und eine Liste seiner Koordinaten enthält.

Erstellen wir eine Hilfsmethode, um das Speichern von Daten in unseremMap-Objekt zu vereinfachen:

private static void addToLocationMap(
  String name,
  double lat,
  double lng,
  Map> locations) {
    List coordinates = new ArrayList<>();

    coordinates.add(lat);
    coordinates.add(lng);
    locations.put(name, coordinates);
}

Füllen wir nun dasMap-Objekt aus:

Map> locations = new HashMap<>();

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

Wenn wir eine CSV-Datenbank herunterladen, die diese Daten enthält, können wir auf einfache Weise einen Reader zum Abrufen der Daten erstellen, anstatt sie in einem Objekt wie diesem zu speichern.

4.2. Feature-Typen definieren

Nun haben wir also eine Karte der Städte. To be able to create features with this data, we’ll need to define their type first. GeoTools bietet zwei Möglichkeiten zum Definieren von Feature-Typen.

Eine Möglichkeit besteht darin, diecreateType-Methode derDataUtilites-Klasse zu verwenden:

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

Ein anderer Weg istuse a SimpleFeatureTypeBuilder, which provides more flexibility. Beispielsweise können wir das Koordinatenreferenzsystem für den Typ und eine maximale Länge für das Namensfeld festlegen:

SimpleFeatureTypeBuilder builder = new SimpleFeatureTypeBuilder();
builder.setName("Location");
builder.setCRS(DefaultGeographicCRS.WGS84);

builder
  .add("Location", Point.class);
  .length(15)
  .add("Name", String.class);

SimpleFeatureType CITY = builder.buildFeatureType();

Both types store the same information. Der Standort der Stadt wird alsPoint und der Name der Stadt alsString gespeichert.

Sie haben wahrscheinlich bemerkt, dass die TypvariablenTYPE undCITY mit allen Großbuchstaben wie Konstanten benannt sind. Type variables should be treated as final variables and should not be changed after they are created, daher kann diese Art der Benennung verwendet werden, um genau das anzuzeigen.

4.3. Feature-Erstellung und Feature-Sammlungen

Sobald wir den Feature-Typ definiert haben und ein Objekt mit den zum Erstellen von Features erforderlichen Daten haben, können wir sie mit ihrem Builder erstellen.

Lassen Sie uns einSimpleFeatureBuilder instanziieren, das unseren Feature-Typ bereitstellt:

SimpleFeatureBuilder featureBuilder = new SimpleFeatureBuilder(CITY);

Wir benötigen außerdem eine Sammlung, um alle erstellten Feature-Objekte zu speichern:

DefaultFeatureCollection collection = new DefaultFeatureCollection();

Da wir in unserem Feature-Typ deklariert haben, dassPoint für den Speicherort gespeichert werden sollen, müssen wircreate points for our cities based on their coordinates angeben. Wir können dies mitGeoTools’s JTSGeometryFactoryFinder tun:

GeometryFactory geometryFactory
  = JTSFactoryFinder.getGeometryFactory(null);

Beachten Sie, dasswe can also use other Geometry classes like Line and Polygon.

Wir könnenfunction erstellen, mit deren Hilfe wir Features in die Sammlung aufnehmen können:

private static Function>, SimpleFeature>
  toFeature(SimpleFeatureType CITY, GeometryFactory geometryFactory) {
    return location -> {
        Point point = geometryFactory.createPoint(
           new Coordinate(location.getValue()
             .get(0), location.getValue().get(1)));

        SimpleFeatureBuilder featureBuilder
          = new SimpleFeatureBuilder(CITY);
        featureBuilder.add(point);
        featureBuilder.add(location.getKey());
        return featureBuilder.buildFeature(null);
    };
}

Sobald wir den Builder und die Sammlung haben, können wir mithilfe der zuvor erstelltenfunctioncreate features and store them in our collection:

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

Die Sammlung enthält jetzt alle Funktionen, die basierend auf unseremMap-Objekt erstellt wurden, das die Geodaten enthielt.

5. Erstellen eines DataStore

GeoTools enthältDataStore API, das als Quelle für Geodaten verwendet wird. Diese Quelle kann eine Datei, eine Datenbank oder ein Dienst sein, der Daten zurückgibt. Wir können einDataStoreFactory verwenden, um unserDataStore zu erstellen, das unsere Funktionen enthält.

Legen Sie die Datei fest, die die Funktionen enthält:

File shapeFile = new File(
  new File(".").getAbsolutePath() + "shapefile.shp");

Legen Sie nun die Parameter fest, mit denen wir denDataStoreFactory mitteilen, welche Datei verwendet werden soll, und geben Sie an, dass wir beim Erstellen unsererDataStore einen räumlichen Index speichern müssen:

Map params = new HashMap<>();
params.put("url", shapeFile.toURI().toURL());
params.put("create spatial index", Boolean.TRUE);

Erstellen wir dieDataStoreFactory mit den gerade erstellten Parametern und verwenden diese Factory, um dieDataStore zu erstellen:

ShapefileDataStoreFactory dataStoreFactory
  = new ShapefileDataStoreFactory();

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

6. Schreiben in ein Shapefile

Der letzte Schritt, den wir tun müssen, besteht darin, unsere Daten inshapefile zu schreiben. Um dies sicher zu tun, gehen wir zuuse the Transaction interface, das Teil derGeoTools-API ist.

Diese Schnittstelle gibt uns die Möglichkeit zueasily commit our the changes to the file. Es bietet auch eine Möglichkeit zuperform a rollback of the unsuccessful changes if some problem occurs beim Schreiben in die Datei:

Transaction transaction = new DefaultTransaction("create");

String typeName = dataStore.getTypeNames()[0];
SimpleFeatureSource featureSource
  = dataStore.getFeatureSource(typeName);

if (featureSource instanceof SimpleFeatureStore) {
    SimpleFeatureStore featureStore
      = (SimpleFeatureStore) featureSource;

    featureStore.setTransaction(transaction);
    try {
        featureStore.addFeatures(collection);
        transaction.commit();

    } catch (Exception problem) {
        transaction.rollback();
    } finally {
        transaction.close();
    }
}

DasSimpleFeatureSource wird zum Lesen von Features verwendet, und dasSimpleFeatureStore wird zum Lesen / Schreiben verwendet. In der Dokumentation zuGeoToolsist angegeben, dass die Verwendung der Methodeinstanceofzur Überprüfung, ob in die Datei geschrieben werden kann, der richtige Weg ist.

Dieseshapefile können später mit jedem GIS-Viewer geöffnet werden, dershapefileunterstützt.

7. Fazit

In diesem Artikel haben wir gesehen, wie wir dieGeoTools-Bibliothek nutzen können, um einige sehr interessante georäumliche Arbeiten durchzuführen.

Obwohl das Beispiel einfach war, kann es erweitert und zum Erstellen von Richshapefiles für verschiedene Zwecke verwendet werden.

Wir sollten bedenken, dassGeoTools eine lebendige Bibliothek ist und dieser Artikel nur als grundlegende Einführung in die Bibliothek dient. Außerdem istGeoTools nicht nur auf das Erstellen von Vektordatentypen beschränkt, sondern kann auch zum Erstellen oder Arbeiten mit Rasterdatentypen verwendet werden.

Den vollständigen Beispielcode für diesen Artikel finden Sie in unserenGitHub project. Dies ist ein Maven-Projekt. Sie sollten es also importieren und so ausführen können, wie es ist.