Ускорить сериализацию полигонов

Я использую геометрию повышения в своем проекте, и мне нужно сериализовать полигоны. Я использовал ускоренную сериализацию без проблем для многих типов данных повышения, но кажется, что геометрия повышения в настоящее время не поддерживает сериализацию, так как я не могу найти заголовок в папке сериализации.

Есть ли какой-нибудь известный метод для достижения этого?

Спасибо.

EDIT: Пример двоичной сериализации в: Сериализация Boost Polygon: Ring


person Alvaro Luis Bustamante    schedule 13.11.2013    source источник


Ответы (2)


Я согласен, странно, что Boost.Geometry не поддерживает Boost.Serialization. Наверное тяжело поддерживать все возможные комбинации параметров шаблона, а может и не заморачивались так как WKT уже есть.

По крайней мере, в случае типов контейнеров «по умолчанию» добавить такую ​​функциональность тривиально. Приведенный ниже код реализует это и полностью функционален.

Ниже я предполагаю, что вы используете пользовательский класс (QPoint из Qt) в качестве класса точек. Код для других типов точек будет почти идентичен моему.

Во-первых, вы добавляете сериализацию для класса 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(ами) точек и колец соответственно, а сериализация для 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);
}

Наслаждаться!

person Michael Simbirsky    schedule 17.11.2013
comment
Спасибо за вашу помощь! Я пытался сделать что-то подобное, но безуспешно. Попозже попробую на вашем примере =) - person Alvaro Luis Bustamante; 18.11.2013
comment
Привет Майкл! Я публикую еще один вопрос, связанный с сериализацией, так как я не могу заставить работать кольцевую сериализацию. Вот вопрос с примером кода. Спасибо! stackoverflow.com/questions/21438732/ - person Alvaro Luis Bustamante; 29.01.2014

Boost.Geometry не поддерживает Boost.Serialization. Вы можете читать и писать WKT (общеизвестный текст), это стандартизированный формат ASCII, который также используется во многих базах данных. См., например: http://en.wikipedia.org/wiki/Well-known_text

Существует также WKB (известный двоичный файл), но он еще не поддерживается на 100%. Однако для полигонов это поддерживается.

person Barend Gehrels    schedule 13.11.2013