Я хочу обрезать набор полилиний (черные линии на изображении ниже) по внешней границе многоугольника. Любые пустоты внутри многоугольника должны игнорироваться. Мой идеальный выход - пунктирные желтые линии. Начальные линии могут быть или не быть прямыми. Изображение является упрощенным примером, в действительности многоугольник намного сложнее и содержит сотни линий. Я не думаю, что выпуклый корпус будет работать (но я могу ошибаться). Я открыт для решений в arcgis, qgis, arcpy, shapely и т. Д. Кодирование желательно выполнять на python, поскольку я открыт для других вариантов, если это необходимо. Arcgis также предпочтительнее, чтобы моим коллегам было проще делиться инструментом, но это не является обязательным требованием.
Лучшее, о чем я могу думать сейчас, - это пересечь отдельную линию с многоугольником, создавая набор точек на всех пересечениях границ. Сортировка точек по расстоянию до начала линии. Самая дальняя и ближайшая (FAC) точки будут внешней границей многоугольника. Затем используйте точки FAC, чтобы выбрать правильные вершины из исходной линии и создать желтую пунктирную линию из соответствующих точек. Это должно работать, но кажется более сложным, чем необходимо.
Несколько дополнительных мыслей:
- Линии линейные «достаточно», чтобы простой расчет расстояния между точками работал, линейные ссылки не должны быть необходимыми.
- Это было бы легко в arcpy, если бы был инструмент для разделения линии в точке, но я не могу найти ее.
Мысли кто-нибудь?
источник
Ответы:
Я хочу добавить свое решение pyQGIS, больше ничего.
Мой тестовый пример - до отсечения:
После отсечения:
Чтобы получить полный набор атрибутов исходных линий, я думаю, что было бы лучше объединить их с результатом. В противном случае они должны быть созданы в разделе подготовки и установлены в самом внутреннем цикле. Но я не проверял, проходят ли они процесс растворения или теряются, потому что в принципе они могут иметь разные значения.
источник
Если вы запустите Интегрировать с полигонами и линиями в качестве входных данных, он добавит вершину к каждой точке пересечения. (Осторожно, поскольку Integrate изменяет входы вместо создания новых выходов.)
Убедившись, что есть совпадающие вершины, вы можете перебрать вершины линии и проверить, не касается ли каждая из них другой функции. Из упорядоченного списка вершин, которые касаются, возьмите минимум и максимум из набора. Затем сделайте две строки для каждого объекта: A: (начало, ..., мин) и B: (максимум, ..., конец).
Другой вариант, хотя я не уверен, что ArcPy сохранит упорядочение частей объекта на основе упорядочения вершин во входном объекте, это запустить клип как есть. Для средней линии в вашем примере это должно привести к составной функции из трех частей. В зависимости от порядка вы можете выполнить итерацию для каждой составной строки, созданной Clip, и удалить все элементы, кроме первой и последней, из выходной многокомпонентной функции.
источник
В этом случае нужно решить три вопроса:
Отверстия
Поскольку любая линия в отверстии будет сохранена, удалите отверстия из полигонов. В приведенном ниже сценарии я делаю это с помощью курсоров и геометрий.
Линии между полигонами
Линии, которые касаются двух полигонов, должны быть удалены. В приведенном ниже сценарии я делаю это, выполняя пространственное соединение
one to many
с моими линиями в качестве входного класса объектов и полигонами в качестве класса объектов соединения. Любая линия, которая генерируется дважды, касается двух многоугольников и удаляется.Конечные строки
Чтобы удалить линии, которые касаются только многоугольника на одном конце, я конвертирую линии в конечные точки. Затем я использую слои объектов и выборки, чтобы определить, какие конечные точки являются плавающими. Я выбираю конечные точки, которые пересекают полигоны. Затем я переключаю свой выбор. Это выбирает конечные точки, которые не пересекаются с полигонами. Я выбираю любую линию, которая пересекает эти выбранные точки и удаляю их.
Результат
Предположения
erase
иfeature vertices to points
)скрипт
Сценарий ниже выводит класс пространственных объектов с именем вашего класса линейных пространственных объектов плюс
_GreedyClip
, в той же базе геоданных, что и ваш линейный класс пространственных объектов. Расположение рабочей области также необходимо.источник