PostGIS/GeoJSON型のプラグイン
4.0以前は、Npgsqlは、いくつかのバンドルされた.NETクラスを通して、PostGIS型の読み書きをサポートしています。:PostgisPoint、PostgisLineStringなど。このモデルは、いくつかの基本的なサポートを提供していますが、空間型の適切な表示は、複雑な作業です。それは、Npgsqlの範囲を超えています。そして、代わりに、特殊な空間ライブラリによって処理する必要があります。
Npgsql.GeoJSONプラグインは、Npgsqlを読み込みを作成します。そして、GeoJSON.NETライブラリを通して、GeoJSON(RFC7946)型として、PostGISに空間型を記述します。
代わりに、あなたは、多くの機能を持った、本格的な.NET空間ライブラリのNpgsql.NetTopologySuiteを使用することができます。あなたが、4.0より前の型の作業を優先する場合、あなたは、依然として、Npgsql.LegacyPostgisプラグインを使用することにより、それを行うことができます。
設定
Setup
GeoJSONプラグインを使用するために、単純に、Npgsql.GeoJSONへの依存関係を追加し、設定するだけです。:
using Npgsql;
// Place this at the beginning of your program to use NetTopologySuite everywhere (recommended)
// どこでもNetTopologySuiteを使う(推奨)ために、あなたのプログラムの先頭に、これを配置します。
NpgsqlConnection.GlobalTypeMapper.UseGeoJSON();
// Or to temporarily use GeoJSON on a single connection only:
// あるいは、単一の接続でのみで、GeoJSONを一時的に使用するには:
conn.TypeMapper.UseGeoJSON();
ジオメトリ値の読み書き
Reading and Writing Geometry Values
データベースから、PostGIS値を読み込むとき、Npgsqlは、適切な、GeoJSON型を自動的に返します。:Point、LineStringなど、Npgsqlは、自動的に、パラメータのGeoJSONの型も認識します。そして、自動的に、対応するPostGIS型をデータベースに送信します。次のコードは、GeoJSON Pointとデータベースの往復を説明します。:
var point = new Point(new Position(51.899523, -2.124156));
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は、ジオメトリーと地理を表現するために、同じ、GeoJSON型を使用します。-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.UseGeoJSON(geographyAsDefault: true);