2009-07-07 3 views
2

私は、 postgres dbに格納されているポリゴンのポイントを取得したいと考えています。 DBの内容は次のとおりLibpqxxを使用してPostgresに保存されているポリゴンのポイントにアクセスするにはどうすればよいですか?

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

頂点列は、型多角形です。

私はlibpqxxライブラリをC++に使用しています。

私はC++でこれらのステートメントを実行します 、私は頂点列にポイントを取得し、アクセスしたいと仮定します。私はlibpqxxするのは非常に新しいです

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

    } 

は申し訳ありません。私はlibpqxx がどのように動作するのかかなり分かりましたが、私はPolygonの種類に固執しています。私たちは実際にPostgresのポリゴンのための単純な ストレージが必要ですが、libpqxxを使って にアクセスする方法がわかりません。

答えて

0

私はlibpqxxに慣れていませんが、ほとんどのクライアントライブラリでは結果が文字列として返されます。最初のステップとして、フィールドを文字列に変換して印刷してみてください。それから、psqlの見た目が見えたら、それを自分で解析して作業しやすいものにします。

+0

ご意見ありがとうございます。 実際には、r [1] .c_str()を使用して文字列として取得できます。次に、文字列を解析して値を取得します。私たちが得る文字列は、((3,3)、(4,4)、(5,5))のようなものです。それから私達はそれを解析することができますが、私はこれを私の最後の手段として持っています。それが唯一の方法であれば、構文解析が答えです。しかし、libpqxxのためのリソースがあまりないので、それが最善の方法であるかどうかはわかりません。 –

0

あなたのpoylgonを構築するために正規表現を使用することができます/あなたはマッチオブジェクトを反復して取得できるように、内側の数字がグループ化されていること(\ dは、\ D)/

注意してください。各反復は、ポリゴンにxyペアを追加します。 \ dの代わりに浮動小数点数にマッチする正規表現を使用する必要があります。

ただし、これで座標を取得する前にStringを正しく検証することはできません。それまでの間については

+0

こんにちは、情報ありがとうございます。文字列の操作はできますが、私はPostgresのポリゴン/ポイント型を、C++/libpqxxが使いやすい型のコンテナにキャストしようと考えていました。これは私が探しているものです。もし存在しなければ、文字列の操作に頼らなければならないでしょう。 –

2

私はこれを使用して文字列をトークン化されます:

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

あなたはST_X()ST_Y()を使用することができませんか?

ラインストリングのN番目のポイントにアクセスするには、ST_PointNがあります。

関連する問題