2014-09-22 18 views
0

我创建包含长度167的的CoordinateSequence线段形式,然后使用下面的代码做的缓冲操作:libgeos BufferOp给出TopologyException“深度不匹配”

geos::operation::buffer::BufferParameters buffer_params; 
geos::operation::buffer::BufferOp buffer_op(input, buffer_params); 
std::unique_ptr<geos::geom::Geometry> output(buffer_op.getResultGeometry(1.5)); 

这将引发geos::geom::TopologyException与消息:

TopologyException: depth mismatch at at -6 -10.5 

这是什么意思,我能做些什么呢?

回答

0

创建GEOS几何时必须使用PrecisionModel::makePrecise。解决的办法是增加makePrecise电话这样的:

geos::geom::LineString* LineStringFromPath(const std::vector<Math::LineSegment2D>& segments, 
              const geos::geom::GeometryFactory& factory) { 
    const geos::geom::PrecisionModel& pm = *factory.getPrecisionModel(); 

    // Geos will take ownership over this coordinate sequence: 
    geos::geom::CoordinateSequence* cl = new geos::geom::CoordinateArraySequence(); 
    cl->add(geos::geom::Coordinate(pm.makePrecise(segments.front().start[0]), 
            pm.makePrecise(segments.front().start[1]))); 

    for (const auto& segment : segments) { 
     // Geos will take ownership over this coordinatesequence: 
     cl->add(geos::geom::Coordinate(pm.makePrecise(segment.end[0]), 
             pm.makePrecise(segment.end[1]))); 
    } 

    // Create the full geometry. Object returned from this method must be deleted by caller. 
    return factory.createLineString(cl); 
}