GEOS C++ geos::Geometry Buffer(0) ложное утверждение на выпуклом Hull

В настоящее время я использую C++ GEOS API для перебора vector typedef Points (переменные члена x и y).

Я превращаю этот вектор в выпуклый корпус, создавая geos::geom::Geometry объект, буферизация в 0 для предотвращения самопересечений, а затем создание выпуклой оболочки.

Всякий раз, когда я отправляю объект, который уже является выпуклым, я получаю следующее утверждение: Assertion 'precisionModel' failed,

Это ошибка GEOS? Нужно ли быть осторожным, чтобы не буферизовать выпуклый многоугольник?

geo_algos_test2: /tmp/libgeos/src/operation/buffer/BufferBuilder.cpp:373: geos:: geom:: Geometry * geos:: operation:: buffer:: BufferBuilder:: buffer (const geos:: geom:: Geometry *, double): утверждение `precisionModel'не удалось.*

Вот мой код:

// Remove self intersections or collinear points

geos::geom::GeometryFactory factory;
geos::geom::CoordinateSequence* temp =
    factory.getCoordinateSequenceFactory()->create((std::size_t)0, 0);

// Convert vector of cruise points to GEOS
for (auto point : poly) {
    temp->add(geos::geom::Coordinate(point.x, point.y));
}
// Add beggining point to create linear ring
temp->add(geos::geom::Coordinate(poly.begin()->x, poly.begin()->y));

// Create Linear Ring For Constructor
geos::geom::LinearRing* box = factory.createLinearRing(temp);
// Factory returns a pointer, dereference this
geos::geom::Geometry* GEOSPoly = factory.createPolygon(box, NULL);

// Remove Self Intersections and create Hull
return GEOSPoly->buffer(0); //line that causes assertion

1 ответ

Утверждение указывает, что ваш factory и / или box геометрия не имеет какого-либо экземпляра PrecisionModel прилагается.

В текущем API GEOS C++ конструктор по умолчанию недоступен, и вы создаете фабрику следующим образом:

auto factory = geos::geom::GeometryFactory::create()

Сейчас, factory использует модель точности с плавающей точкой по умолчанию и factory->getPrecisionModel() должен быть неnullptr,

Любой экземпляр геометрии, созданный с geos::geom::GeometryFactory::create* Семейство функций получает фабричную модель точности, а именно: box->getPrecisionModel() возвращает указатель на тот же экземпляр PrecisionModel учебный класс.

Другие вопросы по тегам