GeoToolsの紹介

GeoToolsの概要

1. 概要

この記事では、GeoTools open source Java library – for working with geospatial dataの基本について説明します。 このライブラリは、地理情報システム(GIS)を実装するための準拠メソッドを提供し、多くのOpen Geospatial Consortium(OGC)標準を実装およびサポートします。

OGCが新しい標準を開発すると、それらはGeoToolsによって実装されるため、地理空間作業に非常に便利です。

2. 依存関係

GeoToolsの依存関係をpom.xmlファイルに追加する必要があります。 これらの依存関係はMaven Centralでホストされていないため、Mavenがダウンロードできるようにリポジトリを宣言する必要もあります。


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

その後、依存関係を追加できます。


    org.geotools
    gt-shapefile
    15.2


    org.geotools
    gt-epsg-hsql
    15.2

3. GISとシェープファイル

GeoToolsライブラリを実際に使用するには、地理情報システムとshapefilesについていくつか知っておく必要があります。

3.1. GIS

地理データを処理する場合は、地理情報システム(GIS)が必要です。 このシステムはto present, capture, store, manipulate, analyze, or manage geographical dataで使用できます。

地理データの一部は空間データであり、地球上の具体的な場所を参照しています。 通常、空間データには属性データが付随します。 属性データは、各空間フィーチャに関する追加情報です。

地理データの例は都市です。 都市の実際の場所は空間データです。 都市名や人口などの追加データが属性データを構成します。

3.2. シェープファイル

地理空間データの操作には、さまざまな形式が利用可能です。 ラスターとベクターは、2つの主要なデータ型です。

この記事では、ベクトルデータtypeを操作する方法を説明します。 このデータ型は、ポイント、ライン、またはポリゴンとして表すことができます。

ベクターデータをファイルに保存するには、shapefileを使用します。 このファイル形式は、地理空間ベクトルデータタイプを操作するときに使用されます。 また、広範囲のGISソフトウェアと互換性があります。

GeoToolsを使用して、都市、学校、ランドマークなどの機能をshapefilesに追加できます。

4. フィーチャーの作成

GeoToolsのドキュメントでは、都市やランドマークなど、地図上に描画できるものをフィーチャと指定しています。 そして、前述したように、作成されたフィーチャは、shapefilesというファイルに保存できます。

4.1. 地理空間データの保持

Before creating a feature, we need to know its geospatial data or the longitude and latitude coordinates of its location on earth.属性データについては、作成するフィーチャの名前を知っている必要があります。

この情報はウェブで見つけることができます。 simplemaps.commaxmind.comのようないくつかのサイトは、地理空間データを備えた無料のデータベースを提供しています。

都市の経度と緯度がわかれば、オブジェクトに簡単に保存できます。 都市名とその座標のリストを保持するMapオブジェクトを使用できます。

Mapオブジェクト内のデータの保存を容易にするヘルパーメソッドを作成しましょう。

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);
}

それでは、Mapオブジェクトに入力してみましょう。

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);

このデータを含むCSVデータベースをダウンロードすると、データをここにあるようなオブジェクトに保持する代わりに、簡単にリーダーを作成してデータを取得できます。

4.2. フィーチャータイプの定義

これで、都市の地図ができました。 To be able to create features with this data, we’ll need to define their type first. GeoToolsは、フィーチャタイプを定義する2つの方法を提供します。

1つの方法は、DataUtilitesクラスのcreateTypeメソッドを使用することです。

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

別の方法はuse a SimpleFeatureTypeBuilder, which provides more flexibilityです。 たとえば、タイプの座標参照系を設定し、名前フィールドの最大長を設定できます。

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.都市の場所はPointとして保存され、都市の名前はStringとして保存されます。

型変数TYPECITYは、定数のようにすべて大文字で名前が付けられていることに気付いたと思います。 Type variables should be treated as final variables and should not be changed after they are createdなので、この命名方法を使用して、それを示すことができます。

4.3. 特徴の作成とコレクション

フィーチャタイプを定義し、フィーチャの作成に必要なデータを持つオブジェクトを取得したら、ビルダーで作成を開始できます。

機能タイプを提供するSimpleFeatureBuilderをインスタンス化してみましょう。

SimpleFeatureBuilder featureBuilder = new SimpleFeatureBuilder(CITY);

作成されたすべてのフィーチャオブジェクトを保存するためのコレクションも必要です。

DefaultFeatureCollection collection = new DefaultFeatureCollection();

場所のPointを保持するようにフィーチャタイプで宣言したので、create points for our cities based on their coordinatesにする必要があります。 これはGeoTools’s JTSGeometryFactoryFinderで実行できます。

GeometryFactory geometryFactory
  = JTSFactoryFinder.getGeometryFactory(null);

we can also use other Geometry classes like Line and Polygonに注意してください。

コレクションに機能を配置するのに役立つfunctionを作成できます。

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);
    };
}

ビルダーとコレクションを取得したら、以前に作成したfunctionを使用して、create features and store them in our collectionを実行できます。

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

コレクションには、地理空間データを保持するMapオブジェクトに基づいて作成されたすべてのフィーチャが含まれるようになりました。

5. データストアの作成

GeoToolsには、地理空間データのソースを表すために使用されるDataStore APIが含まれています。 このソースは、ファイル、データベース、またはデータを返すサービスです。 DataStoreFactoryを使用して、機能を含むDataStoreを作成できます。

機能を含むファイルを設定しましょう。

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

次に、使用するファイルをDataStoreFactoryに指示するために使用するパラメーターを設定し、DataStoreを作成するときに空間インデックスを格納する必要があることを示します。

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

作成したパラメータを使用してDataStoreFactoryを作成し、そのファクトリを使用してDataStoreを作成しましょう。

ShapefileDataStoreFactory dataStoreFactory
  = new ShapefileDataStoreFactory();

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

6. シェープファイルへの書き込み

私たちがする必要がある最後のステップは、データをshapefileに書き込むことです。 これを安全に行うために、GeoTools APIの一部であるuse the Transaction interfaceに移動します。

このインターフェースは、easily commit our the changes to the fileの可能性を提供します。 また、ファイルへの書き込み中にperform a rollback of the unsuccessful changes if some problem occursを実行する方法も提供します。

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();
    }
}

SimpleFeatureSourceは機能の読み取りに使用され、SimpleFeatureStoreは読み取り/書き込みアクセスに使用されます。 GeoToolsのドキュメントでは、ファイルに書き込めるかどうかを確認するためにinstanceofメソッドを使用することが正しい方法であると指定されています。

このshapefileは、後でshapefileをサポートする任意のGISビューアで開くことができます。

7. 結論

この記事では、GeoToolsライブラリを使用して、非常に興味深い地理空間作業を行う方法を説明しました。

例は単純ですが、拡張して、さまざまな目的でリッチshapefilesを作成するために使用できます。

GeoToolsは活気のあるライブラリであり、この記事はライブラリの基本的な紹介にすぎないことを覚えておく必要があります。 また、GeoToolsは、ベクターデータ型の作成のみに限定されず、ラスターデータ型の作成または操作にも使用できます。

この記事で使用されている完全なサンプルコードは、GitHub projectにあります。 これはMavenプロジェクトなので、インポートしてそのまま実行できるはずです。