#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) ]
. Данные и код слишком сложны, чтобы сейчас публиковать содержательное сообщение. Как только / если я доберусь до сути проблемы, я опубликую больше комментариев.