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