Home > C# > PostgreSQL > Npgsql > ドキュメント

PostGIS/NetTopologySuite型のプラグイン

新規作成日 2019-02-25
最終更新日

PostGIS/NetTopologySuite型のプラグイン

PostGIS/NetTopologySuite Type Plugin

4.0以前は、Npgsqlは、いくつかのバンドルされた.NETクラスを通して、PostGIS型の読み書きをサポートしています。:PostgisPoint、PostgisLineStringなど。このモデルは、いくつかの基本的なサポートを提供していますが、空間型の適切な表示は、Npgsqlの範囲を超えた複雑な作業です。そして、代わりに、特殊な空間ライブラリによって処理する必要があります。.NETの世界でも有数の空間ライブラリは、現在NetTopologySuiteです。そして、Npgsql 4.0の型プラグインの導入で、現在、NetTopologySuite型に、直接、PostGIS型をマッピングすることができます。これは、現在、PostGIS型を格納し、読み込む推奨された方法です。

あなたが、4.0より前の型の作業を優先する場合、あなたは、依然として、Npgsql.LegacyPostgisプラグインを使用することにより、それを行うことができます。

設定

Setup

NetTopologySuiteプラグインを使用するために、単純に、Npgsql.NetTopologySuiteへの依存関係を追加し、設定します。:

using Npgsql;

// Place this at the beginning of your program to use NetTopologySuite everywhere (recommended)
// どこでもNetTopologySuiteを使う(推奨)ために、あなたのプログラムの先頭に、これを配置します。
NpgsqlConnection.GlobalTypeMapper.UseNetTopologySuite();

// Or to temporarily use NetTopologySuite on a single connection only
// あるいは、一時的に、単独の結合だけで、NetTopologySuiteを使います。
conn.TypeMapper.UseNetTopologySuite();

デフォルトでは、プラグインは、GeometryServiceProvider.InstanceのDefaultCoordinateSequenceFactoryにより提供される縦座標のみを処理します。

GeometryServiceProviderが自動的に初期化される場合、XとYの縦座標が、処理されます。

次の例のように、動作を変更するために、handleOrdinatesパラメータを指定します。:

conn.TypeMapper.UseNetTopologySuite(handleOrdinates: Ordinates.XYZ);

M縦座標を処理するために、あなたは、DotSpatialAffineCoordinateSequenceFactoryに設定する、coordinateSequenceFactoryを持つGeometryServiceProvider.Instanceを、新しいNtsGeometryServicesインスタンスに初期化する必要があります。あるいは、UseNetTopologySuiteを呼び出すとき、あなたは、ファクトリーを指定することができます。

// Place this at the beginning of your program to use the specified settings everywhere (recommended)
// どこでも指定された設定を使う(推奨)ために、あなたのプログラムの先頭に、これを配置します。
GeometryServiceProvider.Instance = new NtsGeometryServices(
    new DotSpatialAffineCoordinateSequenceFactory(Ordinates.XYM),
    new PrecisionModel(PrecisionModels.Floating),
    -1);

// Or specify settings for Npgsql only
// あるいは、Npgsqlのみの設定を指定します
conn.TypeMapper.UseNetTopologySuite(
    new DotSpatialAffineCoordinateSequenceFactory(Ordinates.XYM));

ジオメトリ値の読み書き

Reading and Writing Geometry Values

データベースから、PostGIS値を読み込むとき、Npgsqlは、適切な、NetTopologySuite型を自動的に返します。:Point、LineStringなど、Npgsqlは、自動的に、NetTopologySuiteのパラメータの型も認識します。そして、自動的に、対応するPostGIS型をデータベースに送信します。次のコードは、NetTopologySuite点とデータベースの往復を説明します。:

var point = new Point(new Coordinate(1d, 1d));
conn.ExecuteNonQuery("CREATE TEMP TABLE data (geom GEOMETRY)");
using (var cmd = new NpgsqlCommand("INSERT INTO data (geom) VALUES (@p)", conn))
{
    cmd.Parameters.AddWithValue("@p", point);
    cmd.ExecuteNonQuery();
}

using (var cmd = new NpgsqlCommand("SELECT geom FROM data", conn))
using (var reader = cmd.ExecuteReader())
{
    reader.Read();
    Assert.That(reader[0], Is.EqualTo(point));
}

あなたは、NpgsqlDbType.Geometryを設定して、パラメータの型を明示的に指定することもできます。

地理(測地)のサポート

Geography (geodetic) Support

PostGISは、2つの型を持っています。:(直角座標のための)ジオメトリーと(測地や球状座標のための)地理。幾何学/地理学の違いについては、あなたは、PostGISのドキュメントこのブログ記事で読むことができます。一言で言えば、長距離にわたって計算する場合、地理は、遙かに正確ですが、更に、計算が、高くつきます。そして、ジオメトリーによって、サポートされている空間操作の小さなサブセットだけをサポートします。

Npgsqlは、ジオメトリーと地理学を表現するために、同じ、NetTopologySuite型を使用します。-Point型は、Cartesianや測地空間の点を示します。PostgreSQLが、通常、必要に応じて、前後に型をキャストするため、あなたは、通常、この違いについて気にする必要ありません。しかしながら、通常の要件であるため、デフォルトで、Npgsqlが、Cartesian幾何を送信する価値があります。あなたは、代わりに、NpgsqlDbType.Geographyを指定することによって、Npgsqlにジオメトリ送信するように指示するオプションを持っています。:

using (var cmd = new NpgsqlCommand("INSERT INTO data (geog) VALUES (@p)", conn))
{
    cmd.Parameters.AddWithValue("@p", NpgsqlDbType.Geography, point);
    cmd.ExecuteNonQuery();
}

あなたが、既定で、どこでも、ジオメトリを使用したい場合、あなたは、プラグインを設定するとき、それを指定することもできます:

NpgsqlConnection.GlobalTypeMapper.UseNetTopologySuite(geographyAsDefault: true);
このエントリーをはてなブックマークに追加

Home PC C# Illustration

Copyright (C) 2011 Horio Kazuhiko(kukekko) All Rights Reserved.
kukekko@gmail.com
ご連絡の際は、お問い合わせページのURLの明記をお願いします。
「掲載内容は私自身の見解であり、所属する組織を代表するものではありません。」