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
учебный класс.