libgeos BufferOp дает TopologyException "несоответствие глубины"
Я создаю LineString, содержащую CoordinateSequence длины 167, а затем выполняю буферную операцию, используя следующий код:
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
Что это значит и что я могу с этим сделать?
1 ответ
Надо использовать PrecisionModel::makePrecise
при создании геометрии GEOS. Решением было добавить вызовы 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);
}