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

How can I retrieve the geometry coordinates of a NpgsqlTypes.PostgisGeometry type field from the NpgsqlDataReader?

.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 地图上显示结果。

非常感谢收到的任何答复。这是我的第一个post,如果礼仪笨拙或问题不清楚,我深表歉意。

如您所见 https://github.com/npgsql/npgsql/blob/dev/src/Npgsql.LegacyPostgis/PostgisTypes.cs PostgisGeometry 类型是一组 xy 对。

例如,线串是点数组,多边形是环数组等等。 您可以遍历这些结构并获取坐标。

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

提供另一个答案,因为上面的 link PostGisTypes 文档现在已损坏。

PostGisGeometry 是一个抽象基础 class,不包含比 SRID 更现有的任何内容。相反,您想将数据读取器获得的对象转换为适当的类型(以下任何一种):

  • PostGisLineString
  • PostGisMultiLineString
  • PostGisMultiPoint
  • PostGisMultiPolygon
  • PostGisPoint
  • PostGis多边形

这些 classes 有到达坐标的方法。

例如:

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