2009-07-07 7 views
2

Ich möchte die Punkte eines Polygons abrufen, die in der Postgres-Datenbank gespeichert sind. Der Inhalt der db ist:Wie kann ich mit Libpqxx auf die in Postgres gespeicherten Punkte des Polygons zugreifen?

polygonid |vertices 
-----------+--------------------------------------------------------------------- 
     2 |((1,0),(1.5,-1),(2,-1),(2,1),(1,1),(0,0),(0,2),(3,2),(3,-2),(1,-2)) 
     4 | ((3,3),(4,4),(5,5)) 

Die Vertices Spalte ist vom Typ Polygon.

Ich benutze libpqxx Bibliothek für C++.

Angenommen, ich möchte abrufen und die Punkte in der Scheitel Spalte zuzugreifen, ich diese Aussagen in C ausführen würde ++:

result R = W.exec ("select * from polygon_tbl"); 
    for (result::const_iterator r = R.begin(); 
     r != R.end(); 
     ++r) 
    { 
     int x = 0; 
     cout << "Polygon ID: " << r[0].to(x) << endl; 

     //Suppose i would like to print the first point of every polygon, 
     //how would i access it? 
     cout << "First vertex: " << r[1][0] << endl; ??? 

     //Or suppose i would like to print the first x coordinate of 
     //every polygon, how would i access it? 
     cout << "First x coordinate: " << r[1][0][0] << endl; //???? (am just guessing here..) 

    } 

Sorry, ich bin sehr neu libpqxx. Ich habe ziemlich verstanden, wie die libpqxx funktioniert, aber ich bin mit den Polygontypen fest. Wir brauchen eigentlich nur einen einfachen Speicher für unsere Polygone in Postgres, aber ich bin mir nicht sicher, wie man mit libpqxx auf diese zugreifen kann.

Antwort

0

Ich kenne mich mit libpqxx nicht aus, aber in den meisten Client-Bibliotheken werden die Ergebnisse als Strings zurückgegeben. Versuchen Sie also zunächst, das Feld in einen String zu konvertieren und auszudrucken. Dann, wenn es so aussieht, wie es psql zeigt, analysiere es selbst etwas, mit dem man leichter arbeiten kann.

+0

Hallo danke für deinen Kommentar. Wir können es tatsächlich als eine Zeichenfolge abrufen, die das r [1] .c_str() verwendet. Dann parsen wir die Zeichenfolge, um die Werte zu erhalten. Die Zeichenfolge, die wir erhalten, ist ungefähr so: ((3,3), (4,4), (5,5)). Daraus können wir es analysieren, aber ich halte dies als meinen letzten Ausweg. Wenn dies der einzige Weg ist, ist das Parsen die Antwort. Aber da es nicht viel Ressource für libpqxx gibt, bin ich mir nicht sicher, ob das der beste Weg ist .... –

0

Sie können einen regulären Ausdruck verwenden, um Ihre poylgon zu bauen:/(\ d, \ d)/

Beachten Sie, dass die inneren Zahlen gruppiert sind, so dass Sie sie über das Spiel-Objekt iteriert abrufen können. Jede Iteration fügt dem Polygon ein xy-Paar hinzu. Anstelle von \ d sollten Sie eine Regex verwenden, die mit schwebenden Zahlen übereinstimmt.

Mit diesem können Sie die Zeichenfolge nicht ordnungsgemäß überprüfen, bevor Sie die Koordinaten abrufen.

+0

Hallo Danke für die Info. Stringmanipulation kann durchgeführt werden, aber ich dachte daran, den Postgres-Polygon-/Punkttyp in einen Container eines Typs umzuwandeln, den C++/libpqxx ohne weiteres verwenden kann. Das ist, was ich suche. Wenn es keine gibt, muss ich auf die String-Manipulation zurückgreifen. –

2

Für die Zwischenzeit werde ich nur die Zeichenfolge tokenize dies mit:

typedef boost::tokenizer<boost::char_separator<char> > tokenizer; 
boost::char_separator<char> sep(",()"); 
tokenizer tokens(str_coordinates, sep); 
for (tokenizer::iterator tok_iter = tokens.begin(); 
    tok_iter != tokens.end(); ++tok_iter) 
    { 
     std::cout << "x:<" << *tok_iter << "> "; 
     ++tok_iter; 
     std::cout << "y:<" << *tok_iter << "> " << endl; 
    } 
2

Können Sie nicht verwenden ST_X()ST_Y()?

Für den Zugriff auf den N-ten Punkt in einer Linienfolge gibt es ST_PointN.