Я пытаюсь использовать QGIS 2.14 для привязки дорожной сети к шестиугольной сетке, но у меня появляются странные артефакты.
Я создал шестнадцатеричную сетку с MMQGIS , ячейки размером около 20 х 23 м. Я забуферен дорожной сетью на 1 м и уплотнил ее, чтобы через каждые несколько метров находился узел. Вы можете увидеть то, что я пытаюсь достичь ниже. Как видите, я могу заставить его работать в некоторых случаях:
- синий - уплотненная дорога (буферизованная линия)
- красный - это «шестнадцатеричная» версия - это то, что я хочу найти
- серый - это шестнадцатеричная сетка
Затем я использовал новую функцию привязки геометрии, чтобы привязать узлы к ближайшему шестиугольному углу. Результаты многообещающие, но, похоже, существуют некоторые крайние случаи, когда линия расширяется, чтобы заполнить шестиугольник (или его часть):
Причиной для буфера является то, что привязка геометрий не позволяет привязываться к слою, геометрия которого отличается. Например, вы не можете привязать узлы на слое LINE к точкам на слое POINT). Кажется, это самый счастливый привязать POLYGON к POLYGON.
Я подозреваю, что дороги расширяются, когда одна сторона буферизованной дорожной линии переходит на одну сторону гекс-ячейки, а другая - на другую сторону гекс-ячейки. В моем примере дороги, которые пересекают запад-восток под острым углом, кажутся худшими.
Вещи, которые я пытался без успеха: -
- буферизует дорожную сеть незначительным количеством, поэтому она остается многоугольником, но очень тонкой.
- уплотнение шестнадцатеричных ячеек (так что по краям есть узлы, а не только по углам)
- изменение максимального расстояния привязки (это имеет самый большой эффект, но я не могу найти идеальное значение)
- используя слои LINE, а не многоугольники
Я обнаружил, что если я перехожу к использованию только слоев LINE, он работает некоторое время, а затем падает. Кажется, он сохраняет свою работу, поскольку некоторые строки были частично обработаны.
Кто-нибудь знает какой-либо другой способ привязки точек на линии к ближайшей точке на другом слое линий / полигонов, в идеале без необходимости использовать postgres / postgis (хотя решение с postgis также будет приветствоваться)?
РЕДАКТИРОВАТЬ
Для тех, кто хотел бы попробовать, я разместил стартовый проект QGIS здесь, на Dropbox . Это включает в себя слои Hex Grid и Densified lines. (Дорожная сеть основана на OSM, поэтому ее можно загрузить с помощью QuickOSM, например, если вам нужно получить оригинал для определения дороги).
Обратите внимание, что в OSGB (epsg: 27700) локализованный UTM для Великобритании с единицами измерения в метрах.
Ответы:
Мое решение включает сценарий PyQGIS, который работает быстрее и эффективнее, чем рабочий процесс с привязкой (я тоже попробовал). Используя мой алгоритм, я получил эти результаты:
Вы можете запустить следующие фрагменты кода последовательно из QGIS (в консоли Python QGIS). В конце вы получите слой памяти с привязанными маршрутами, загруженными в QGIS.
Единственным предварительным условием является создание Shapefile из нескольких частей дороги (используйте
Processing->Singleparts to multipart
, я использовал поле вfictitiuos
качествеUnique ID field
параметра). Это даст намroads_multipart.shp
файл с одной функцией.Вот алгоритм объяснил:
Получите ближайшие стороны шестиугольника, где пересекаются маршруты. Для каждого шестиугольника мы создаем 6 треугольников между каждой парой соседних вершин и соответствующим центроидом. Если какая-либо дорога пересекает треугольник, сегмент, разделенный шестиугольником и треугольником, добавляется к окончательному привязанному маршруту. Это более тяжелая часть всего алгоритма, она занимает 35 секунд на моей машине. В первых двух строках есть 2 пути Shapefile, вы должны настроить их так, чтобы они соответствовали вашим собственным путям к файлам.
Избавьтесь от отключенных (или «открытых») сегментов с помощью списков, кортежей и словарей Python . На данный момент осталось несколько отсоединенных сегментов, то есть сегментов, у которых одна вершина отключена, а другая соединена, по крайней мере, с двумя другими сегментами (см. Красные сегменты на следующем рисунке). Мы должны избавиться от них.
Теперь мы можем создать векторный слой из списка координат и загрузить его на карту QGIS. :
Другая часть результата:
Если вам нужны атрибуты в привязанных маршрутах, мы могли бы использовать пространственный индекс для быстрой оценки пересечений (например, в /gis//a/130440/4972 ), но это уже другая история.
Надеюсь это поможет!
источник
Я сделал это в ArcGIS, конечно, может быть реализован с использованием QGIS или просто Python с пакетом, способным читать геометрии. Убедитесь, что дороги представляют собой сеть, т.е. пересекаются друг с другом только на концах. Вы имеете дело с OSM, я полагаю, это так.
Если вы не хотите видеть это:
Не пытайтесь использовать цепные точки на Вороной. Боюсь, это только усугубит ситуацию. Таким образом, ваш единственный вариант - создать сеть из линий Вороного и найти маршруты между конечными точками дороги, что тоже не составляет особого труда.
источник
Я понимаю, что вы спрашиваете о методе QGIS, но терпите меня за дрянной ответ:
Примечания:
источник
Если бы вы разделили линию дороги на сегменты, где каждый сегмент полностью содержался шестиугольником, ваше решение о том, какие сегменты линии шестиугольника использовать, будет зависеть от того, было ли расстояние от центроида сегмента дороги до средней точки каждой стороны шестиугольника меньше половины диаметр шестиугольника (или меньше радиуса круга, который входит в шестигранник).
Таким образом, если бы вы (по одному сегменту за раз) выбирали сегменты линий шестиугольника (где каждый сегмент является стороной шестиугольника), которые находятся на расстоянии от радиуса шестиугольника, вы можете скопировать эти геометрии линий и объединить их в любой уникальный идентификатор, который вы используете для своего набора данных дороги.
Если у вас возникли проблемы с объединением уникального идентификатора, вы можете применить буфер и выбрать по местоположению только те сегменты, чтобы применить атрибуты вашего набора данных дороги; таким образом, вам не придется беспокоиться о ложных совпадениях с слишком большим буфером.
Проблема с инструментом привязки заключается в том, что он фиксирует точки без разбора; Трудно найти идеальный допуск для использования. Используя эту методологию, вы будете правильно определять, какие сегменты линий шестиугольника использовать, а затем заменять геометрию ваших дорожных данных (или вставлять геометрии в другой набор данных).
Кроме того, если у вас все еще есть проблема с отрезками линий, которые перепрыгивают с одной стороны шестиугольника на другую, вы можете разбить линию на сегменты по вершинам, рассчитать длину каждой линии, а затем удалить все отрезки линии, которые больше, чем средняя длина одной стороны шестиугольника.
источник
В qgis 3.0 был добавлен объект геометрии, теперь он позволяет привязываться к различным типам геометрии. В нем также есть много исправлений. Вы можете попробовать версию «ежедневного снимка», чтобы получить доступ к улучшенному snapper до официального выпуска 3.0.
источник