Как стать автором
Обновить

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

Проверяли ли работу алгоритма, в случае если река уходит под поверхность земли на некоторое расстояние?
Не возникает ли проблема в случае больших островов или редких случаях бифуркации рек? Или в случае разбиения реки на протоки (например, в дельте)
Мы пробовали алгоритм на нескольких речных сетях (данные OpenStreetMap), из крупных рек: Урал и Обь. Постараюсь ответить по пунктам:

«Проверяли ли работу алгоритма, в случае если река уходит под поверхность земли на некоторое расстояние?» — Нет, такой ситуации мы не встречали при тестировании плагина. Но если вдруг в линейном векторном слое будет присутствовать разрыв, то алгоритм дальше этого разрыва не пойдет присваивать ранги. Так что если имеется разрыв в речной сети, и Вы точно знаете, что сегменты рядом с разрывом в действительности связаны, а не изолированы друг от друга, то можно исправить векторный слой вручную — соединить их. В таком случае алгоритм отработает как требуется.

«Не возникает ли проблема в случае больших островов или редких случаях бифуркации рек?» — Острова в линейном векторном слое — вещь довольная специфическая, они могут возникнуть, если например, мы имели не только векторный линейный слой с реками, а еще и полигональный векторный слой с водохранилищами, озерами и др. В таком случае эти площадные объекты действительно являются частью речной сети и если их не использовать, то речная сеть получится с разрывами (должно было быть водохранилище на этом месте, а его мы отбросили, и водотока в слое на этом месте тоже не оказывается). Выход довольно простой — переводим векторный полигональный слой в линейный (инструмент в QGIS Полигон в линии) и объединяем с изначальным линейным слоем с реками. Вот в таком слое могут быть ситуации, когда алгоритм считает за 2 разные реки берега одного водохранилища. Но с этим ничего поделать мы не смогли, исправлять данные вещи насильно при применении алгоритма мы не пытались, потому что вполне возможен случай, когда река просто разделяется на несколько рукавов, а потом снова сходится и никакие полигональные водные объекты тут не при чем. А вот с бифуркацией да, есть загвоздка. Так как определяющим фактором является местоположение точки впадения реки в водоём, то алгоритм считает, что именно в эту указанную пользователем точку, вся речная сеть и стекает. В таком случае алгоритм будет считать, что отошедшая ранее ветвь является притоком. Как-то отсеять это алгоритм не сможет. Тогда проще будет вручную отделить рукав от речной сети, а затем запустить алгоритм для каждой из частей речной сети отдельно — потом слои можно будет вновь соединить.

«Или в случае разбиения реки на протоки (например, в дельте)» — На рисунке 8 и в анимациях как раз приведен пример такого разбиения. Проблем возникнуть не должно, так как мы в любом случае опираемся на главную реку (назовем её опорным маршрутом в графе), и уже от неё начинаем обходить граф и присваивать ранги. Введение опорного маршрута как раз помогло нам адекватно обрабатывать подобные случаи.

То есть, после того как реку прогнать через ваш плагин, получится склеить отдельные куски рек в одну за пару кликов?

Теоретически да, но это не основная задача, в QGIS для этого есть специализированные инструменты. Плагин (и алгоритм в нём реализованный) предназначен для ранжирования сегментов в рамках уже единого векторного слоя без разрывов. Определенно алгоритм может автоматически исправлять неточности в топологии, такие как небольшие разрывы между рукавами рек. Но если сеть густая, а "дырки" продолжительные и частые, то "исправление геометрии" вполне может испортить исходный слой если попытаться объединять такие сегменты в единую сеть путём варьирования порога склейки. То есть плагин скорее призван справляться с такими разрывами, которые появляются при неточном импорте / экспорте файлов или после применения векторных операций с различными неточностями. Но не задумывался для исправления именно неточных по своей природе слоёв, когда например кто-то просто забыл отвекторизовать канал между двумя реками.

С другой стороны, если разрывы маленькие, то выставление порога склейки вполне может справиться с такой сетью и тогда на выходе вы получите не только корректный векторный слой, но и ещё отранжированный в соответствии с описанным в посте алгоритмом.

Спасибо за пояснение. Про это "в QGIS для этого есть специализированные инструменты." немного подробнее пожалуйста? Никак не могу найти способ ускорения склейки рек.

Тут важно понять что именно понимается под "ускорением склейки" - не встречал бенчмарки где сравнивалось бы быстродействие разных лагинов. По инструментам, в Lines Ranking плагине, например, используется связка "Исправление геометрии и v.clean GRASS" для модификации не совсем корректных слоёв. Ещё довольно быстро работает инструмент "Примыкание геометрий к слою (Snap geometries to layer eng)". Только нужно выбирать порог склейки вручную. Ниже пример того какие слои можно получать устанавливая различные пороги:

Пример применения инструмента "Примыкание геометрий к слою"
Пример применения инструмента "Примыкание геометрий к слою"

Но это, как говорится, что лежало на поверхности. Вполне возможно, что есть и более подходящие Вам инструменты в арсенале QGIS и не только, просто я о них не слышал

Спасибо. Попробую ещё по копать на эту тему.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Изменить настройки темы

Истории