Как соединить линии в сети?

15

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

введите описание изображения здесь

Есть идеи?

vascobnunes
источник
1
Пространственно соедините конечные точки полилинии с полигонами и суммируйте их по многоугольникам. Для каждого многоугольника, содержащего более одной соединенной конечной точки, создайте ломаную линию, состоящую из сегментов, идущих от центра тяжести этих конечных точек к самим конечным точкам («звезда»). Слияние звезд с оригинальными полилиниями. Очистите результат, чтобы удалить любые возникающие самопересечения. Каждый из этих шагов поддерживается (и может быть автоматизирован) полностью функциональными ГИС. Поскольку я не знаком с деталями QGIS или GRASS, я предлагаю это решение только в качестве комментария.
whuber
но иногда все линии заканчиваются вне многоугольника ...
vascobnunes
1
Что представляют эти строки? Если они реки, они закодированы с дополнительной информацией, такой как имя или Порядок потока? Направлена ​​ли сеть (например, речная сеть), как, скажем, два потока первого порядка должны перетекать в поток второго порядка. Полагаю, я пытаюсь сказать, что вы, возможно, захотите использовать некоторый интеллект в процессе привязки, чтобы преодолеть проблему с помощью хитроумных привязок с увеличением терпимости к поиску.
Хорнбидд
1
Ваш комментарий, кажется, противоречит вопросу. Кажется, вопрос говорит о том, что вы хотите привязать вершины, которые попадают в общий многоугольник. Если вершина выходит за пределы многоугольника, вы не даете никаких критериев того, как ее следует обрабатывать! Итак, каковы именно отношения между полигонами и полилиниями?
whuber
1
Я согласен с Whuber; возможно, вам следует уточнить вопрос. Похоже, вы хотите линии, которые находятся «в» многоугольнике, а также «близкие», но исключая те, которые «в», но правильно соединены?
Даррен Коуп

Ответы:

7

Мое понимание проблемы заключается в следующем:

Если конечная точка полилинии пересекает многоугольник, то полилинию необходимо соединить (путем добавления или корректировки вершин) со всеми дополнительными конечными точками полилинии, которые пересекают один и тот же многоугольник.

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

Этот ответ основан на некоторых уже полученных, но не завершен, так как я не знаю всех команд QGIS - возможно, кто-то еще может добавить к этому?

  1. Для каждой полилинии извлеките координаты конечной точки ( Вектор> Инструменты геометрии> Извлечь узлы, затем навести порядок) и рассчитайте, находятся ли они внутри многоугольника ( Вектор> Инструменты исследования> Выбрать по местоположению ).

  2. Для конечных точек ломаной линии, которые находятся в пределах многоугольника, вытяните этот конец ломаной линии к центру многоугольника (Извлеките центр многоугольника, используя Вектор> Инструменты геометрии> Центроид многоугольника , не уверен в модификации линии, хотя вы могли бы работать с вершины полилинии в виде точек и добавление дополнительных с соответствующей нумерацией перед восстановлением модифицированной полилинии с помощью плагина «Точки на пути»)

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

  3. Если конечные точки ломаной линии выходят за пределы многоугольника, вытяните этот конец ломаной линии до центра ближайшего многоугольника. Опять же, я не уверен насчет вычисления ближайшего многоугольника, хотя модуль GRASS v.distance выглядит для этого.

Энди Харфут
источник
это хорошее обоснование для решения проблемы. Я также получил что-то подобное с ответом от alexgleith. Но я застрял в операции «расширить этот конец ломаной линии до центра ближайшего многоугольника». Вопрос сейчас в том, как мне это сделать? Если я использую v.clean.snap для центроидов многоугольников, он все равно будет перемещать любые вершины, которые не являются конечными точками ...
vascobnunes
Один из подходов состоит в том, чтобы преобразовать полилинии в точки, как описано, и, если необходимо, добавить дополнительную точку в начале или конце данной линии в соответствии с расположением существующей начальной или конечной точки. Расположение добавленной точки будет центром тяжести многоугольника, и точка будет приписана порядковым номером вершины -1 или 1000000, чтобы поместить ее в начало или конец полилинии. Это позволило бы реконструировать полилинии с помощью инструмента «Точки к пути»
Энди Харфут
2

Я думаю, что я мог бы сделать это с помощью некоторого пользовательского алгоритма ... Обратите внимание, конечно, как вы хотели бы реализовать это, но я думаю, что это будет работать.

Для каждой линии, для каждой конечной точки сделайте точку в многоугольнике для вершины в конечной точке и свяжите ее с многоугольником.

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

Это довольно просто. Но не доступно в стандартных операторах. Я думаю, что это можно сделать в ArcGIS за несколько дней.

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

Алекс Лейт
источник
1

Интересная проблема! Я не могу придумать способ автоматического выполнения привязки, но вот шаг в определении областей, по крайней мере, для ручного исправления:

  • Добавьте новый столбец в линейный слой и установите его равным «1» для всех объектов.
  • В разделе «Вектор»> «Атрибуты соединения по местоположению» установите целевой слой в качестве слоя многоугольника, а слой линии - в качестве слоя соединения. Затем выберите «Свести итоги пересекающихся объектов» и нажмите «Сумма». Укажите местоположение выходного файла и нажмите «ОК».
  • Полученный файл многоугольника будет вашим исходным слоем многоугольника, но с некоторыми дополнительными полями. Поле SUM - это то, что вы хотите; когда это 2, это означает, что тогда вы можете увеличить его и вручную привязать функции.

В зависимости от ситуации (количество функций, количество находящихся в этой ситуации и других и т. Д.) Это может сэкономить вам время.

РЕДАКТИРОВАТЬ: Вы также можете использовать полигоны с суммой 2, чтобы создать подмножество ваших линейных слоев, а затем запустить очистку на тех с большим допуском, чтобы не изменять другие функции.

Даррен Коуп
источник
Я уже сделал что-то подобное. Я даже использовал v.net для извлечения узлов для линий и сделал пространственный выбор полигонов, соответствующих узлам. Я нахожу множество ошибок, чтобы исправить это, но у меня все еще есть 3 большие проблемы: 1) есть тысячи ошибок, которые нужно исправить вручную, что занимает много времени; 2) Я не получаю все ошибки, потому что в некоторых случаях линии или узлы даже не «касаются» многоугольников; 3) я получаю ошибки, которые не являются ошибками, потому что при правильном соединении двух линий они также выбираются.
vascobnunes
0

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

Это будет работать даже для тех, кто заканчивается за пределами полигонов. Как это сделать в QGIS, я не знаю, извините, но я бы сделал это в продуктах ESRI, которые я хорошо знаю. Это я понял, когда в первом ответе предложил построить «звезду».

Я почти уверен, что здесь есть люди, которые знают, как проводить такой анализ в QGIS.

ankilosado
источник
4
Добро пожаловать в GIS Stack Exchange! Я заметил, что ваш ответ вызвал некоторые отрицательные отзывы и подозрения, что это потому, что вы предложили альтернативу технологии, которую использует спрашивающий (GRASS / QGIS). Я бы рекомендовал размещать такие предложения в виде комментариев, а не ответов, и если спрашивающий заинтересован, то перенесите информацию в ответ.
PolyGeo