2

postgres db に格納されているポリゴンのポイントを取得したいと考えています。db の内容は次のとおりです。

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

頂点列のタイプは Polygon です。

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

頂点列のポイントを取得してアクセスしたいとします。C++ で次のステートメントを実行します。

    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 は初めてです。libpqxx がどのように機能するかはほぼ理解できましたが、Polygon 型に固執しています。実際には、Postgres にポリゴン用の単純なストレージが必要なだけですが、libpqxx を使用してポリゴンにアクセスする方法がわかりません。

4

4 に答える 4

2

使えませんST_X() ST_Y()か?

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

于 2011-05-12T15:27:52.757 に答える
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;
   }
于 2009-07-10T01:45:04.823 に答える
0

libpqxx にも詳しくありませんが、ほとんどのクライアント ライブラリでは結果が文字列として返されます。したがって、最初のステップとして、フィールドを文字列に変換して出力してみてください。次に、psql が示すように見える場合は、自分で解析して、作業しやすいものにします。

于 2009-07-07T09:27:06.763 に答える
0

正規表現を使用して poylgon を構築できます: /(\d,\d)/

内部の数値はグループ化されているため、一致オブジェクトを反復処理して取得できることに注意してください。反復ごとに xy ペアがポリゴンに追加されます。\d の代わりに、浮動小数点数に一致する正規表現を使用する必要があります。

ただし、これでは、座標を取得する前に文字列を適切に検証できません。

于 2009-07-07T11:37:25.190 に答える