4

プロジェクトでブースト ジオメトリを使用しており、ポリゴンをシリアル化する必要があります。多くのブースト データ型に対して問題なくブースト シリアライゼーションを使用してきましたが、シリアライゼーション フォルダー内にヘッダーが見つからないため、ブースト ジオメトリは現在シリアライゼーションをサポートしていないようです。

これを達成するためのよく知られた方法はありますか?

ありがとう。

編集: バイナリ シリアル化の例:ブースト ポリゴンのシリアル化: リング

4

2 に答える 2

3

Boost.Geometry が Boost.Serialization をサポートしていないのは奇妙です。おそらく、テンプレート パラメーターのすべての可能な組み合わせをサポートするのは難しいか、WKT が既に提供されているため、それらが気にならなかったのかもしれません。

少なくとも「デフォルト」のコンテナ タイプの場合、そのような機能を追加するのは簡単です。以下のコードはそれを実装しており、完全に機能しています。

以下では、ポイント クラスとしてカスタム クラス (Qt の QPoint) を使用していると仮定します。他のポイント タイプのコードは、私のコードとほぼ同じです。

まず、Point クラスのシリアル化を追加します。

#include <QPoint>

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

BOOST_GEOMETRY_REGISTER_POINT_2D_GET_SET(QPoint, int, cs::cartesian, x, y, setX, setY);
typedef QPoint MyPoint;


namespace  boost {
namespace serialization {

template<class Archive>
void serialize(Archive & ar, MyPoint& pt, const unsigned int version) {
    ar &  boost::serialization::make_nvp("x", pt.rx() );
    ar &  boost::serialization::make_nvp("y", pt.ry() );
}
} //namespace serialization
} //namespace boost

次に、Ring と Polygon のシリアル化を追加します。ここでは、Ring と Polygon が基本的にそれぞれポイントとリングの std::vector(s) であり、std::vector のシリアル化が Boost.Serialization に組み込まれているという事実を使用します。

#include <boost/serialization/vector.hpp>
#include <boost/geometry/geometries/polygon.hpp>
#include <boost/geometry/geometries/ring.hpp>

//change template flags as you are pleased but ring and polygon has to be
//in correspondence w.r.t. to "closed" and "clockwise" policies
typedef boost::geometry::model::ring<MyPoint, false, true> MyRing;
typedef boost::geometry::model::polygon<MyPoint, false, true> MyPolygon; 

namespace  boost {
namespace serialization {

//Default ring<MyPoint> simply inherits from std::vector<MyPoint>, 
//its serialization is trivial and no implementation is needed. 

//Default polygon<MyPoint> gives direct access to outer ring and the container of inner rings
template<class Archive>
void serialize(Archive & ar, MyPolygon& poly, const unsigned int version) {
    ar &  boost::serialization::make_nvp("outer", poly.outer());
    ar &  boost::serialization::make_nvp("inners", poly.inners());
}


} //namespace serialization
} //namespace boost

これで、MyPolygon と Boost.Serialize を他のクラスとして使用できるようになりました。

#include <boost/archive/xml_iarchive.hpp>
#include <boost/archive/xml_oarchive.hpp>

void foo_out(std::ostream & oss, const MyPolygon & poly)
{
    boost::archive::xml_oarchive oa(oss);
    oa & BOOST_SERIALIZATION_NVP(poly);
}

void foo_in(std::istream & iss, MyPolygon & poly)
{
    boost::archive::xml_iarchive ia(iss);
    ia & BOOST_SERIALIZATION_NVP(poly);
}

楽しみ!

于 2013-11-17T00:53:38.097 に答える
1

Boost.Geometry は Boost.Serialization をサポートしていません。WKT (well-known text) を読み書きできます。これは、多くのデータベースでも使用されている標準化された ASCII 形式です。例を参照してください: http://en.wikipedia.org/wiki/Well-known_text

WKB (well-known binary) もありますが、まだ 100% サポートされていません。ただし、ポリゴンの場合はサポートされています。

于 2013-11-13T17:50:59.807 に答える