プロジェクトでブースト ジオメトリを使用しており、ポリゴンをシリアル化する必要があります。多くのブースト データ型に対して問題なくブースト シリアライゼーションを使用してきましたが、シリアライゼーション フォルダー内にヘッダーが見つからないため、ブースト ジオメトリは現在シリアライゼーションをサポートしていないようです。
これを達成するためのよく知られた方法はありますか?
ありがとう。
編集: バイナリ シリアル化の例:ブースト ポリゴンのシリアル化: リング
プロジェクトでブースト ジオメトリを使用しており、ポリゴンをシリアル化する必要があります。多くのブースト データ型に対して問題なくブースト シリアライゼーションを使用してきましたが、シリアライゼーション フォルダー内にヘッダーが見つからないため、ブースト ジオメトリは現在シリアライゼーションをサポートしていないようです。
これを達成するためのよく知られた方法はありますか?
ありがとう。
編集: バイナリ シリアル化の例:ブースト ポリゴンのシリアル化: リング
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);
}
楽しみ!
Boost.Geometry は Boost.Serialization をサポートしていません。WKT (well-known text) を読み書きできます。これは、多くのデータベースでも使用されている標準化された ASCII 形式です。例を参照してください: http://en.wikipedia.org/wiki/Well-known_text
WKB (well-known binary) もありますが、まだ 100% サポートされていません。ただし、ポリゴンの場合はサポートされています。