2016-04-01 5 views
2

.NET 4.5, C#, Npgsql 3.1.0Wie kann ich die Geometriekoordinaten eines NpgsqlTypes.PostgisGeometry-Typ-Felds aus dem NpgsqlDataReader abrufen?

Ich habe eine Abfrage, die ein PostGIS-Geometriefeld ruft - die einzige Art, wie ich sehen konnte, dies zu tun war:

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

Diese Funktion aber ich brauche um an die Koordinaten des GEOMETRIE-Feldes zu kommen und ich finde keinen Weg, das zu tun? Ich möchte die Koordinaten verwenden, um die Ergebnisse auf einer OpenLayers-Karte anzuzeigen.

Alle Antworten am dankbarsten erhalten. Dies ist mein erster Beitrag, also entschuldige ich mich, wenn die Etikette plump ist oder die Frage unklar ist.

Antwort

0

Wie Sie hier sehen können https://github.com/npgsql/npgsql/blob/develop/src/Npgsql/NpgsqlTypes/PostgisTypes.cs PostgisGeometry-Typen sind eine Reihe von XY-Paaren.

Zum Beispiel ist eine Linienfolge ein Array von Punkten, ein Polygon ist ein Array von Ringen und so weiter. Sie könnten diese Strukturen durchqueren und die Koordinaten erhalten.

Wenn Sie Geometrien nur mit Openlayern anzeigen möchten, empfehle ich Ihnen, das Format wkt zu verwenden. Sie sollten Ihre Abfrage ändern, indem Sie st_astext (Geometrie) anstelle von Geometrie auswählen, dann das Ergebnis als String behandeln und es an OpenLayers zurückgeben. Verwenden Sie dann OpenLayers.Geometry.fromWKT, um das WKT in ein OpenLayers.Geometry

+0

Dank Francesco! Ihre Kommentare haben sehr geholfen. Sobald ich den PostgisPolygon habe, kann ich an den Punkten ankommen. Es ist wirklich sehr gepflegt. Fragen Sie sich, wie Sie dies als eine akzeptierte Antwort kennzeichnen ...? – pdc

+0

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

1

zu analysieren, das eine andere Antwort liefert, weil der Link oben zu der Dokumentation für PostGisTypes jetzt gebrochen ist.

PostGisGeometry ist eine abstrakte Basisklasse, die nichts mehr enthält als die SRID. Stattdessen möchten Sie das Objekt von Ihrem Datareader in den entsprechenden Typ (eine der folgenden) erhalten würfen

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

Diese Klassen haben Möglichkeiten, zu den Koordinaten zu gelangen.

zB:

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