Порівняйте подібні лінії та оновіть шари


16

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

Qgis шарів.

Наприклад: У середині зображення є квадрат в обох шарах, але як мені зробити на карті, щоб розпізнати синій такий, як зелений та оновити останній шар?

Як я можу це зробити? Чи є якийсь плагін чи інструмент, який допомагає в цьому?


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

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

Існують частина документації тут для конфлаціі плагіна. Не впевнений, чи завершено розробку.
Barbarossa

1
ви спробували стрибати?
radouxju

Але стовпець "d" лінії blu та "d" червоної - це унікальний загальний ідентифікатор? Що вони містять?
Серхіо

Відповіді:


6

Це чудове запитання, мені довелося зробити щось подібне останнім часом, але зі значно меншим набором даних, тому я зміг використати простий перехрестя з деякою додатковою візуальною якістю перевірки, і це було чудово.

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

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

  2. повторіть кожну з функцій буфера:

    2а. обчислити загальну орієнтацію функції (max_y - min_y / max_x - min_x або щось подібне)

    2б. зробіть вибір за запитом місцеположення на іншому шарі, використовуючи цю єдину функцію

    1. у вас буде більше однієї функції, яка відповідає вибору за запитом про місцезнаходження, тому перегляньте ці вибрані функції та обчисліть орієнтацію кожного

    2. отримувати атрибути від тієї функції, яка має орієнтацію, найбільш близьку до функції буфера.

* Я б почав з дуже невеликої відстані (одна одиниця карти чи щось), а потім запустив цей процес із збільшенням відстаней, обережно, щоб не перезаписати атрибути, які ви вже перенесли.

** Насправді ви, можливо, відмовилися від створення функцій буфера, і просто зробіть вибір за місцеположенням із розміщенням буфера. Я не дуже знайомий із QGIS, але впевнений, що ви зможете це зробити.

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

РЕДАКТИ Розмірковуючи про це більше, ось базовий приклад, який би повністю розбив систему, якби ви починали з дуже невеликої відстані в буфері і вибирали функцію з найкращою відповідністю орієнтації, як я рекомендував:

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

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

EDIT 2 На жаль, це багатокутники? Напевно, я просто припускав, що це лінії на сірому тлі. Якщо вони є багатокутниками, я не знаю, чи хороша ця концепція орієнтації. Але ви можете вибрати всі функції, що перетинаються, і визначити, яка має найбільше перекриття (запустіть інструмент типу Union, а потім скористайтеся багатокутником з найбільшою площею ...).


Ця логіка є здоровою. Я використовував подібний підхід у C # / ArcObjects, щоб скопіювати атрибути з неточного набору даних з атрибутами в точний набір даних без атрибутів ... вірно 95%. Ручна перевірка / фіксація була потрібна у тісних місцях, але це, звичайно, швидше, ніж це робити вручну.
Майкл Стімсон

2

Якщо ви хочете додати деякі атрибути від червоного шару до синього шару, і один атрибут є загальним для обох шарів, вам потрібно використовувати Add Vector Join .

Я про це писав тут .

  1. Клацніть правою кнопкою миші на шарі червоного формату на панелі шару та виберіть " Властивості" .
  2. Потім перейдіть на вкладку Приєднання .
  3. Натисніть кнопку + , це створить нове з'єднання.
  4. Шар приєднання - ваш червоний шар формату. Поле приєднання - це поле із загальними значеннями в обох. Поле цілі - це поле, до якого ви хочете приєднатись із синього шару.
  5. Після цього ви отримаєте новий атрибут у таблиці форм.

Це воно.

Тут ви маєте приклад із скріншотами.


1

Я дуже вважаю за краще відповідь від @ dmh126, оскільки його метод дозволяє оновити шар red_line досить легко.

Просто для додавання альтернативи ви можете скористатися інструментом таблиці атрибутів приєднання з панелі інструментів обробки та вибрати шари із загальним полем. Зауважте, що цей метод створює новий файл форми замість оновлення наявного:

Приєднати таблицю атрибутів


0

Якщо у вас є обидва унікальні ідентифікатори в обох шарах, які ви можете використовувати для легкого приєднання значень до нового шару зі старого, це шматок пирога. Але це не схоже на той випадок.

Якщо ні, то це досить складна проблема. Цікаво, чому коментар від користувача 30184, що пропонує використовувати 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.