2016-04-01 4 views
2

.NET 4.5, C#, Npgsql 3.1.0Как получить геометрические координаты поля типа NpgsqlTypes.PostgisGeometry из NpgsqlDataReader?

У меня есть запрос, который извлекает поле геометрии 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 Тип PostgisGeometty представляет собой набор пар xy.

Например, линейная строка представляет собой массив точек, многоугольник представляет собой массив колец и т. Д. Вы можете пройти эти структуры и получить координаты.

Однако, если вы просто хотите отображать геометрии с использованием openlayers, я предлагаю вам использовать формат wkt. Вы должны изменить свой запрос, выбрав st_astext (geometry) вместо геометрии, чем обрабатывать результат как строку и вернуть его OpenLayers. Затем используйте 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; 
... 

 Смежные вопросы

  • Нет связанных вопросов^_^