Здесь есть два слоя с представлением улиц, и идея такова: мы хотим обновить самый последний слой (с красной линией), чтобы некоторые данные хранились в другом (светло-голубом), но эти слои аналогично географическому положению, которое может быть очень близким и немного более отдаленным в зависимости от места на карте, и только один атрибут совпадает в случаях, когда линия совпадает с другой (codlog x codlog5).
Например: в середине изображения есть квадрат в обоих слоях, но как мне сделать на карте, чтобы распознать синий такой же, как зеленый, и обновить последний слой?
Как мне это сделать? Есть ли плагин или инструмент, который помогает с этим?
qgis
layers
latitude-longitude
Джонатан Оливейра
источник
источник
Ответы:
Это отличный вопрос, мне недавно пришлось сделать нечто подобное, но с гораздо меньшим набором данных, поэтому я смог использовать простое пересечение с некоторой дополнительной проверкой качества изображения, и это было прекрасно.
Но вот идея для этого, хотя у меня нет кода, и это довольно тяжелый процесс. Обязательно сначала протестируйте образец из полного набора данных. Вы можете, вероятно, немного полезного кода здесь. (Отступ стал немного странным ниже.):
взять хороший набор геометрии (где вы хотите, чтобы атрибуты заканчивались) и создать его буфер *
перебираем все функции буфера:
2а. рассчитать общую ориентацию объекта (max_y - min_y / max_x - min_x или что-то в этом роде)
2b. сделать запрос выбора по местоположению на другом слое, используя эту единственную функцию
у вас будет более одной функции, которая соответствует запросу выбора по местоположению, поэтому итерируйте эти выбранные функции и рассчитайте ориентацию каждой из них
получить атрибуты от того объекта, который имеет ориентацию, наиболее близкую к ориентации объекта буфера.
* Я бы начал с очень малого расстояния (одна единица карты или что-то еще), а затем запустил этот процесс с увеличением расстояния, стараясь не перезаписывать какие-либо атрибуты, которые вы уже передали.
** Вы могли бы, вероятно, отказаться от создания буферных объектов и просто выполнить запрос выбора по местоположению с буферным расстоянием в нем. Я не очень знаком с QGIS, но я уверен, что вы сможете это сделать.
Нет никакого способа, чтобы это работало идеально для всех ваших функций, но это только начало, а потом все сводится к разработке хорошей стратегии QA / QC для проверки и завершения передачи.
РЕДАКТИРОВАТЬ Размышляя об этом подробнее, вот базовый пример, который полностью сломал бы систему, если бы вы начинали с очень небольшого буферного расстояния и выбирали функцию с наилучшей согласованной ориентацией, как я рекомендовал:
Атрибуты от неправильной красной линии будут взяты. Чтобы избежать этого, вы можете захотеть создать некоторый вид допуска и использовать атрибуты объекта только в том случае, если его ориентация (по сравнению с ориентацией исходного синего объекта) находится в пределах этого допуска.
РЕДАКТИРОВАТЬ 2 Ой, это полигоны? Наверное, я просто предположил, что это были линии на сером фоне. Если они многоугольники, я не знаю, является ли эта концепция ориентации хорошей. Но вы можете выбрать все пересекающиеся объекты и выяснить, какие из них имеют наибольшее перекрытие (запустить инструмент типа Union, а затем использовать многоугольник с наибольшей площадью ...).
источник
Если вы хотите добавить некоторые атрибуты из красного слоя в синий слой и один атрибут является общим для обоих слоев, вы должны использовать Add Vector Join .
Я написал об этом здесь .
Вот и все.
Здесь у вас есть пример со скриншотами.
источник
Я очень предпочитаю ответ от @ dmh126, так как его метод позволяет довольно легко обновлять ваш слой red_line .
Просто чтобы добавить альтернативу, вы можете использовать инструмент присоединения таблицы атрибутов на панели инструментов обработки и выбрать слои с общим полем. Обратите внимание, что этот метод создает новый шейп-файл вместо обновления существующего:
источник
Если у вас есть несколько уникальных идентификаторов в обоих слоях, которые вы можете использовать для простого присоединения значений к новому слою из старого, это просто. Но это не похоже на тот случай.
Если нет, то это довольно сложная проблема. Интересно, почему комментарий пользователя user30184, предлагающего использовать OpenJUMP и плагин http://www.vividsolutions.com/products.asp?catg=spaapp&code=roadmatcher, не был опубликован вместо ответа, потому что в данном случае это звучит совершенно законно для меня.
В противном случае я не думаю, что вы можете сделать это без некоторого кодирования. С QGIS вы можете использовать стройную форму, а при комбинировании буферизации и пересечения вы сможете выполнить значительную автоматическую проверку.
Одним из подходов может быть сравнение некоторого достаточно большого буфера красных линий с синими линиями и получение соответствующих атрибутов и соотношения, насколько оно соответствует. В псевдокоде:
источник