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

#c# #geometry #geospatial #nettopologysuite

Вопрос:

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

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

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

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

 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 для обсуждения, потому что мы близки к дате выпуска, и я надеялся, что кто-нибудь сможет дать дополнительную информацию (идеи для обходного пути), поскольку это похоже на ошибку в библиотеке de, потому что сами полигоны кажутся допустимыми.

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

Комментарии:

1. вы могли бы сами создать nts и отладить его.

Ответ №1:

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

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

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

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

 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» для всего приложения.

Комментарии:

1. Это частично работает для меня, но теперь я получаю NetTopologySuite.Geometries.TopologyException: side location conflict: arg 0 [ (-83.57245950413224, 35.19678095041322, NaN) ] . Данные и код слишком сложны, чтобы сейчас публиковать содержательное сообщение. Как только / если я доберусь до сути проблемы, я опубликую больше комментариев.