如何使用Libpqxx访问Postgres中存储的多边形的点?

时间:2009-07-07 01:45:27

标签: c++ postgresql polygon libpqxx

我想检索存储在。中的多边形的点 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。

我正在使用libpqxx库进行C ++。

假设我想检索并访问顶点列中的点, 我会用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 个答案:

答案 0 :(得分: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;
   }

答案 1 :(得分:2)

你不能使用ST_X() ST_Y()吗?

为了访问线串中的第N个点,有ST_PointN

答案 2 :(得分:0)

我不熟悉libpqxx,但在大多数客户端库中,结果都以字符串形式返回。因此,第一步尝试将字段转换为字符串并打印它。然后,如果它看起来像psql显示它的方式解析它自己更容易使用。

答案 3 :(得分:0)

您可以使用正则表达式构建您的poylgon:/(\ d,\ d)/

请注意,内部数字已分组,以便您可以检索迭代匹配对象的内部数字。 Ieach迭代将xy对添加到多边形。而不是\ d你可以使用一个可以匹配浮点数的正则表达式。

但是,在检索坐标之前,无法正确验证字符串。