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

0

Решение

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

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

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

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

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

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]