如何从NpgsqlDataReader中检索NpgsqlTypes.PostgisGeometry类型字段的几何坐标?

时间:2016-04-01 13:14:55

标签: geometry postgis npgsql

.NET 4.5,C#,Npgsql 3.1.0

我有一个检索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地图上显示结果。

任何答案都非常感激。这是我的第一篇文章,所以如果礼仪笨拙或问题不清楚,我会道歉。

2 个答案:

答案 0 :(得分:2)

提供另一个答案,因为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;
...

答案 1 :(得分:1)

正如你在这里看到的那样 https://github.com/npgsql/npgsql/blob/dev/src/Npgsql.LegacyPostgis/PostgisTypes.cs PostgisGeometry类型是一组xy对。

例如,线串是一个点数组,一个多边形是一个环数组,依此类推。 你可以遍历那些结构并获得坐标。

但是,如果您只想使用openlayers显示几何图形,我建议您使用wkt格式。 您应该更改查询,选择st_astext(几何)而不是几何,而不是将结果视为字符串并将其返回给OpenLayers。 然后使用OpenLayers.Geometry.fromWKT将WKT解析为OpenLayers.Geometry