3

boost::geometry::simplifysでメソッドを使用したいと思いOGRLineStringます。OGRPointマクロを介して登録することはできますが:

BOOST_GEOMETRY_REGISTER_POINT_2D_GET_SET(OGRPoint, double, cs::cartesian, OGRPoint::getX, OGRPoint::getY, OGRPoint::setX, OGRPoint::setY)

現在、次のコードを使用できません。

#include <boost/geometry/geometry.hpp>
#include <boost/geometry/geometries/register/point.hpp>
#include <boost/geometry/geometries/register/linestring.hpp>
#include <boost/geometry/geometries/linestring.hpp>
#include <boost/geometry/geometries/point_xy.hpp>

BOOST_GEOMETRY_REGISTER_POINT_2D_GET_SET(OGRPoint, double, cs::cartesian, OGRPoint::getX, OGRPoint::getY, OGRPoint::setX, OGRPoint::setY)
BOOST_GEOMETRY_REGISTER_LINESTRING(OGRLineString)

void example()
{
  OGRLineString test;
  OGRLineString simplified;
  boost::geometry::simplify(test, simplified, 0.5);
}

Simplyfy メソッドがコンパイルされず、boost:mpl::eval_if_c に関する何かを示すエラーが表示されますが、これは役に立ちません。

4

1 に答える 1

3

Boost.Geometry ラインストリングは、Boost.Range コンセプトを満たす必要があります。たとえば、 std::vector がそうです。しかし、すぐに使える OGRLineString です。

まず、OGRLineString に含まれるポイントを走査するイテレータを定義する必要があります。OGRLineString::getPoint(...) を使用すると、これは基本的に可能になるはずです。

第 2 に、イテレータが実装されている場合は、これがおそらく最も難しい部分ですが、ここで説明されているように、OGRLineString を Boost.Range に適合させる必要があります。

これが完了すると、Boost.Geometry は OGRLineString を折れ線として認識し、読み取ることができるようになります。

ただし、OGRLineString に書き込むには、追加の手順を実行する必要があります。「変更可能な範囲」である必要があります。これは Boost.Range で (まだ) 定義されていないため、これまでジオメトリのみのものであり、boost::geometry::traits 名前空間 (clear、push_back、および resize) で 3 つのクラスを特殊化することで実装できます。

于 2012-11-02T18:59:39.960 に答える