在缓冲区调用之后丢失自定义点类型中的数据

时间:2017-10-10 21:27:49

标签: c++ boost boost-geometry

我有自己的点类型

class LocationWayPoint
{
    public:
        latlong_container location;
        WORD index;
        PWeakBasicStation station;      
};

namespace boost { namespace geometry { namespace traits {
    BOOST_GEOMETRY_DETAIL_SPECIALIZE_POINT_TRAITS(LocationWayPoint, 2, double, cs::cartesian)

    template<> struct access<LocationWayPoint, 0> {
        static inline double get(LocationWayPoint const& p) {return p.location.longitude; }
        static inline void set(LocationWayPoint& p, double const& value) {p.location.longitude = value; }
    };
    template<> struct access<LocationWayPoint, 1> {
        static inline double get(LocationWayPoint const& p) {return p.location.latitude; }
        static inline void set(LocationWayPoint& p, double const& value) {p.location.latitude = value; }
    };
}}}
typedef bg::model::linestring<LocationWayPoint> location_linestring_t;

...

location_linestring_t ls1;

我完全赞同这一点(循环中)

LocationWayPoint point;
/* point.index = counter;            */
point.index = 7777;         
point.location.longitude = (lo_type == mongo::NumberDouble) ? point_record.getField("lo").Double() : std::atof(point_record.getField("lo").String().c_str());
point.location.latitude = (lo_type == mongo::NumberDouble) ? point_record.getField("lat").Double() : std::atof(point_record.getField("lat").String().c_str());
 ls1.push_back(point); 

当我使用ls1.push_back(point);我可以访问索引值

LOG4CPLUS_DEBUG(logger,  "LocationWay::LoaderWay in " << bg::get<0>(ls1[0]) << " d2 "  << bg::get<1>(ls1[0]) << " index "<< ls1[0].index);

out = DEBUG - LocationWay::LoaderWay in xxx d2 xxx index 7777

但是当我调用替换push_back方法

bg::append(ls1, point);  

我看到了

DEBUG - LocationWay::LoaderWay in xxx d2 xxx index 17 <--uninit value

当我调用bg :: buffer

boost::geometry::model::multi_polygon<location_polygon_t> result; 

    boost::geometry::buffer(ls1, result,
                distance_strategy, side_strategy,
                join_strategy, end_strategy, circle_strategy);

没有位置的任何值设置为未初始化(

1 个答案:

答案 0 :(得分:2)

我认为您已直接诊断出问题:使用算法“丢失”附加的外部信息,原因很简单,创建的点数是新点

顺便提一下,这是初始化所有成员数据的一个很好的理由 - 即使在POD结构中也是如此。

因此,你的问题的基础似乎是假设缓冲算法以某种方式保留原始点 - 只需移动它们并保留其包含的其余值。这个假设是不正确的。

我可以推测其原因:也许是为了容纳使用共享点/几何和(因此?)不可变数据的自定义几何模型。

文档支持

文档没有直接描述这个(作为a)限制。但这是关键点:它没有描述允许/处理无关数据的点概念,这是图书馆无法处理的明确信号。这是Point Concept,例如:

enter image description here

请注意 traits::access但它没有克隆点的概念(包含无关数据?)。