2016-04-01 14 views
2

.NET 4.5、C#のが、NpgsqlDataReaderからNpgsqlTypes.PostgisGeometry型フィールドのジオメトリ座標を取得するにはどうすればよいですか?

Npgsqlの3.1.0 I持つPostGISジオメトリフィールドを取得するクエリ - 私はこれを行うの見ることができる唯一の方法だった:

public class pgRasterChart 
{ 
    ... 
    public NpgsqlTypes.PostgisGeometry GEOMETRY;  
    ... 
} 
... 
NpgsqlDataReader reader = command.ExecuteReader(); 
try 
    { 
     while (reader.Read()) 
     { 
      pgRasterChart chart = new pgRasterChart(); 
      chart.GEOMETRY = (PostgisGeometry) reader.GetValue(21); 
... 

この機能を私は必要としますGEOMETRYフィールドの座標を取得するには、私はそれを行う方法を見つけることができません? OpenLayersマップで結果を表示するために座標を使用したいと思います。

最も感謝していただいた回答があります。これは私の最初の投稿ですので、礼儀が不潔で不明確な場合は謝罪します。

答えて

0

ご覧のとおり、 https://github.com/npgsql/npgsql/blob/develop/src/Npgsql/NpgsqlTypes/PostgisTypes.cs PostgisGeometryタイプは、xyペアのセットです。

たとえば、線ストリングはポイントの配列、ポリゴンはリングの配列などです。 これらの構造をトラバースして座標を取得できます。

ただし、openlayersを使用してジオメトリを表示するだけの場合は、wkt形式を使用することをお勧めします。 結果を文字列として扱い、OpenLayersに返すよりも、ジオメトリではなくst_astext(ジオメトリ)を選択してクエリを変更する必要があります。 OpenLayers.Geometry.fromWKTを使用してWKTをOpenLayers.Geometryに解析します。

+0

おかげフランチェスコ!あなたのご意見は大いに助けになりました。 PostgisPolygonを取得したら、その時点で取得できます。それは本当にきれいです。 これを受け入れられた回答としてフラグを立てる方法が不思議です...? – pdc

+0

http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work?rq=1 – fradal83

1

PostGisTypesのドキュメントの上のリンクが壊れているため、別の答えが返されます。

PostGisGeometryは、SRIDより多く存在しない抽象基本クラスです。代わりに、あなたは適切なタイプ(次のいずれか)にあなたのDataReaderオブジェクトによって得られたオブジェクトをキャストします:

  • PostGisLineString
  • PostGisMultiLineString
  • PostGisMultiPoint
  • PostGisMultiPolygon
  • PostGisPoint
  • PostGisPolygon

これらのクラスは、座標に到達する方法を持っています。

例:

... 
NpgsqlDataReader reader = command.ExecuteReader(); 
try 
    { 
     while (reader.Read()) 
     { 
      var geom = (PostgisLineString) reader.GetValue(0); 
      var firstCoordinate = geom[0]; // Coordinate in linestring at index 0 
      var X = firstCoordinate.X; 
      var Y = firstCoordinate.Y; 
... 
関連する問題