Сравните похожие строки и обновите слои


16

Здесь есть два слоя с представлением улиц, и идея такова: мы хотим обновить самый последний слой (с красной линией), чтобы некоторые данные хранились в другом (светло-голубом), но эти слои аналогично географическому положению, которое может быть очень близким и немного более отдаленным в зависимости от места на карте, и только один атрибут совпадает в случаях, когда линия совпадает с другой (codlog x codlog5).

Слои Qgis.

Например: в середине изображения есть квадрат в обоих слоях, но как мне сделать на карте, чтобы распознать синий такой же, как зеленый, и обновить последний слой?

Как мне это сделать? Есть ли плагин или инструмент, который помогает с этим?


Вы хотите обновить красный слой с атрибутами из синего слоя или с дополнительными функциями из синего слоя?
dmh126

Атрибуты. Ситуация: красный слой содержит столбцы (a, b, c, d), а синий - столбцы (d, e, f). Я хочу добавить в красный слой столбцы (e, f) из другого слоя и его результаты, которые совпадают.
Джонатан Оливейра

Существуют некоторая документация здесь для конфлации плагина. Не уверен, что разработка была завершена.
Барбаросса

1
ты пробовал прыгать?
Radouxju

Но столбец «d» голубой линии и «d» красной линии - это уникальный общий идентификатор? Что они содержат?
Серхио

Ответы:


6

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

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

  1. взять хороший набор геометрии (где вы хотите, чтобы атрибуты заканчивались) и создать его буфер *

  2. перебираем все функции буфера:

    2а. рассчитать общую ориентацию объекта (max_y - min_y / max_x - min_x или что-то в этом роде)

    2b. сделать запрос выбора по местоположению на другом слое, используя эту единственную функцию

    1. у вас будет более одной функции, которая соответствует запросу выбора по местоположению, поэтому итерируйте эти выбранные функции и рассчитайте ориентацию каждой из них

    2. получить атрибуты от того объекта, который имеет ориентацию, наиболее близкую к ориентации объекта буфера.

* Я бы начал с очень малого расстояния (одна единица карты или что-то еще), а затем запустил этот процесс с увеличением расстояния, стараясь не перезаписывать какие-либо атрибуты, которые вы уже передали.

** Вы могли бы, вероятно, отказаться от создания буферных объектов и просто выполнить запрос выбора по местоположению с буферным расстоянием в нем. Я не очень знаком с QGIS, но я уверен, что вы сможете это сделать.

Нет никакого способа, чтобы это работало идеально для всех ваших функций, но это только начало, а потом все сводится к разработке хорошей стратегии QA / QC для проверки и завершения передачи.

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

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

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

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


Эта логика это звук. Я использовал аналогичный подход в C # / ArcObjects для копирования атрибутов из неточного набора данных с атрибутами в точный набор данных без атрибутов ... 95% правильно. Ручная проверка / исправление была необходима в труднодоступных местах, но это было, конечно, быстрее, чем делать все вручную.
Майкл Стимсон

2

Если вы хотите добавить некоторые атрибуты из красного слоя в синий слой и один атрибут является общим для обоих слоев, вы должны использовать Add Vector Join .

Я написал об этом здесь .

  1. Щелкните правой кнопкой мыши на своем красном слое шейп-файла на панели слоев и выберите Свойства .
  2. Затем перейдите на вкладку Joins .
  3. Нажмите кнопку + , это создаст новое соединение.
  4. Слой объединения - это ваш красный слой с шейп-файлом. Поле соединения - это поле с общими значениями в обоих. Целевое поле - это ваше поле, к которому вы хотите присоединиться из синего слоя.
  5. После этого вы получите новый атрибут в вашей таблице шейп-файлов.

Вот и все.

Здесь у вас есть пример со скриншотами.


1

Я очень предпочитаю ответ от @ dmh126, так как его метод позволяет довольно легко обновлять ваш слой red_line .

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

Присоединиться к таблице атрибутов


0

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

Если нет, то это довольно сложная проблема. Интересно, почему комментарий пользователя user30184, предлагающего использовать OpenJUMP и плагин http://www.vividsolutions.com/products.asp?catg=spaapp&code=roadmatcher, не был опубликован вместо ответа, потому что в данном случае это звучит совершенно законно для меня.

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

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

for r_line in red_lines:
  r_line_buf = r_line.buffer()
  intersecting_b_lines = []
  for b_line in blue_lines:
    if r_line_buf.intersects(b_line):
      intersect_length = calculateIntersectionLength(r_line_buf,b_line)
      b_line_values = getAttributes(b_line)
      intersecting_b_lines.append((b_line_values,intersect_length))
  b_line_best_fit = findLongestLineWithinIntersected(intersecting_b_lines)
  r_line_length = r_line.length
  b_vs_r_line_ratio = compareLength(r_line_length,b_line_best_fit)
  saveToNewColumns(r_line, b_line_best_fit.Atribute1, b_line_best_fit.Atribute2..., b_vs_r_line_ratio)
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.