NetTopology 'обнаружил пересечение без узлов' Исключение при определении разницы между двумя конкретными геометриями

Используя NetTopology в C #, я получаю исключение «найдено пересечение без узлов» при определении разницы между двумя конкретными геометриями.

Эти геометрические формы являются результатом использования нескольких подпрограмм, таких как CascadedPolygonUnion.Union, Intersection и Difference.

В какой-то момент у нас есть MultiPolygon, из которого мы хотим вырезать другую геометрию (Polygon):  image

Мы используем этот код, чтобы попытаться отрезать «красный» многоугольник:

Geometry difference = multiPolygon.Difference(geometryToRemove);

Но тогда мы получаем NetTopologySuite.Geometries.TopologyException с сообщением:

found non-noded intersection between LINESTRING (240173.28029999882 493556.2806000002, 240173.28177031482 493556.28131837514) and LINESTRING (240173.28176154062 493556.2813140882, 240173.28176153247 493556.2813140842) [ (240173.28176153894, 493556.2813140874) ]

Я задал этот вопрос также на форуме NetTopologySuite Discussuion, потому что мы близки к дате выпуска и я надеялся, что кто-то сможет дать дополнительную информацию (идеи обходного пути), поскольку это выглядит как ошибка в библиотеке, потому что сами полигоны кажутся действительными.

Данные о многоугольниках можно найти здесь - мы используем ' RDNew 'для выполнения действия Difference, но я также добавил версии этих многоугольников WGS84, чтобы иметь возможность просматривать их в таких инструментах, как geojson.io.


person R. Hoek    schedule 18.06.2021    source источник
comment
вы можете сами построить NTS и отлаживать его.   -  person citykid    schedule 18.06.2021


Ответы (1)


Благодаря одному из сопровождающих библиотеки я получил ответ.

По сути, мне нужно было обновиться до версии 2.2 (что я уже сделал сначала, чтобы посмотреть, решит ли это проблему).

Но во-вторых, мне нужно было настроить приложение для использования - в версии 2.2 - генератора оверлеев NextGen, который по умолчанию не включен.

Чтобы использовать генератор наложений Next Gen, добавьте следующий код в какой-то момент запуска вашего приложения:

var curInstance = NetTopologySuite.NtsGeometryServices.Instance;
NetTopologySuite.NtsGeometryServices.Instance = new NetTopologySuite.NtsGeometryServices(
    curInstance.DefaultCoordinateSequenceFactory,
    curInstance.DefaultPrecisionModel,
    curInstance.DefaultSRID,
    GeometryOverlay.NG, // RH: use 'Next Gen' overlay generator
    curInstance.CoordinateEqualityComparer);

Я использую текущий экземпляр NtsGeometryServices, чтобы получить и повторно использовать текущие экземпляры по умолчанию для других настраиваемых частей. Но вы можете создавать новые экземпляры необходимой части (как указано в исходном сообщении по адресу https://github.com/NetTopologySuite/NetTopologySuite/discussions/530#discussioncomment-888410

Также есть возможность использовать оба генератора наложений рядом друг с другом (также упомянутые в исходном сообщении), но я никогда не пробовал этого, поскольку мы будем использовать версию NextGen для всего приложения.

person R. Hoek    schedule 22.06.2021