Повернення атрибутів, що торкаються точок-ліній, повертаються до шару рядків за допомогою QGIS?


12

Я використовую QGIS 2.14.4-Essen. У мене два шари:

  • points.shp, який містить точки зі стовпцем YEAR
  • lines.shp, що містить рядки, які точно з'єднують точки з points.shp

Я хотів би отримати атрибут YEAR від points.shp назад до lines.shp. Кожен рядок - це один сегмент з однією точкою на кожному кінці (див. Малюнок нижче). Я хотів би отримати YEAR з першої точки та YEAR з другої точки назад в атрибути кожного рядка.

Наприклад: рядок 1 торкається першої точки з YEAR = 2010 та другої точки з YEAR = 2011. Я хотів би повернути щось на зразок "2010-2011" в атрибути рядка 1. Результат повинен виглядати приблизно так:

id  | points
----+-----------------
1   | 2010-2011
2   | 2011-2012
3   | 2012-2016

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

Чи є спосіб досягти цього за допомогою QGIS?

Відповіді:


9

Хоча відповідь @radouxju справедлива, я поясню її трохи детальніше.

  1. Вам потрібно переконатися, що функція полілінії розбита саме над точками.
  2. Використовуйте Join attribute by location. Виберіть функцію розбиття лінії в точкових місцях як цільовий шар - у моєму випадку я називаю її "вибухнув".
  3. У розділі підсумків виберіть "Зробити резюме функції, що перетинається". Тут замість запуску інструменту два рази; один для Min та інший раз для Max, ви можете запустити його один раз і вибрати як Min, так і Max.

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

  1. Вихідний файл матиме такий атрибут:

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

  1. Додайте нове поле рядка типу з назвою "Рік" до нового файлу форми з кроку 4.
  2. Використовуйте калькулятор поля та перейдіть до оновлення наявного поля. Виберіть "Рік" і напишіть такий вираз:

    to_string ("MINYEAR2") + '-' + to_string ("MAXYEAR2")

  3. Кінцевий вихідний атрибут буде виглядати приблизно так:

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

  1. Кінцевий вихід буде таким:

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


Ось результат після тестування ваших даних:

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

Таблиця зліва - це дані точки після створення нового поля цілого числа, а таблиця праворуч - після з'єднання рядка з точковими даними, використовуючи етап 2, згаданий вище. Потім я використав кроки 5-6 для створення підсумкових даних.

Оновлення

Я намагався перетворити поле YEAR з рядка в ціле число, використовуючи вираз to_int (), і воно спрацювало. Тому вам не потрібно робити це вручну. Однак тип поля повинен бути типу Integerне Integer64. Переконайтеся, що довжина поля до 9. Якщо ви вибрали довжину поля 10, воно буде перетворене на Interger64, і воно не працюватиме Interger64. Потім ви можете прослідкувати процес з кроку 2-6

Ось підсумковий результат після використання виразу to_int ():

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

У наведеній вище таблиці атрибутів ліворуч YEAR є рядком типу, а YEAR2 є цілим числом типу, перетвореним за допомогою виразу to_int (). Ви можете бачити в таблиці атрибутів праворуч, виконуючи кроки 2-6, я отримав MINYEAR2 та MAXYEAR2, потім знову перейшов у рядок назад, щоб об'єднати все разом у полі YEAR.


Дуже дякую! Саме це я робив кілька разів. Я здогадуюсь, що функції полілінії розбиті саме над точками, оскільки я створив лінії з шарів точок за допомогою плагіна Points2One. Чи можете ви спробувати це підмножина даних: drive.google.com/file/d/0B7ZWEFkkfYgheG92Q29sa0I3LW8/view ? Знову дякую!
wiltomap

Поле YEAR у таблиці атрибутів є рядковим типом. Вам потрібно додати нове поле типу цілого числа та ввести роки вручну. Після створення поля цілого типу та збереження правки видаліть старе поле рядка. Потім виконайте описаний вище процес.
ахмадханб

Я намагався перетворити поле YEAR з рядка в ціле число, використовуючи вираз to_int (), але також не вийшло. Коли я вводив роки вручну, це працювало як очікувалося.
ахмадханб

Чітке пояснення @ahmadhanb
Шико

Дякую @ahmadhanb! Справа в тому, що дані, якими я поділився вище, є підмножиною. У мене є кілька тисяч рядків і точок, тому введення років вручну буде досить багато роботи! Це помилка?
wiltomap

5

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

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

У польовому калькуляторі:

tostring(minYEAR) + '-' + tostring(maxYEAR)

Цей метод повертає додатковий стовпець, названий COUNTі містить значення 2для кожного рядка. Альбо параметри Min та Max повертають ці відомості. Я вибрав шар ліній як цільовий шар, а шар точок - як шар приєднання, я прав?
wiltomap

ти числове число чи текст у році?
radouxju

YEARПоле ціле число. Я спробував створити нову колонку з, to_string("YEAR")але результат точно такий же ...
wiltomap

Я зробив швидкий тест, щоб переконатися (QGIS 2.8.3), і він спрацював. Якщо ваша кількість дорівнює 2, це означає, що у вас є 2 бали за кожен сегмент, що є правильним. Але у мене є значення атрибута MINYEAR MAXYEAR у новому векторі рядка, створеному просторовим з'єднанням. Я не розумію, чому це не працює у вашому випадку. Чи можете ви спробувати з іншим файлом?
radouxju

4

Припустимо, що топологія ідеальна, створюючи поле "WKT" з виразом

geom_to_wkt( $geometry) 

у вашому точковому шарі ви можете використовувати вираз:

min( attribute( get_feature('points','WKT', geom_to_wkt(start_point($geometry)  )),'year'),attribute( get_feature('points','WKT', geom_to_wkt(end_point($geometry)  )),'year'))||'-'|| max( attribute( get_feature('points','WKT', geom_to_wkt(start_point($geometry)  )),'year'),attribute( get_feature('points','WKT', geom_to_wkt(end_point($geometry)  )),'year'))

у польовому калькуляторі шару труби, створюючи текстовий рядок.

  • атрибут (особливість, атрибут_ ім'я) Повертає значення визначеного атрибуту з функції, тут, рік отриманої точки точки
    .
  • get_feature (шар, атрибут, значення) повертає першу особливість шару, що відповідає заданому значенню атрибута. Тут ми перевіряємо, чи можемо ми знайти точку з тими самими координатами (у форматі WKT), що
    і вершини початку та кінця вашої лінії.
  • start_point (геометрія) повертає перший вузол з геометрії. Ось перша вершина вашого рядка.
  • end_point (геометрія) повертає останній вузол з геометрії. Ось остання вершина вашого рядка.
  • geom_to_wkt (геометрія) повертає добре відомий текст (WKT) подання геометрії. введіть тут опис зображення

Ви навіть можете оновити його на:

CASE
WHEN attribute( get_feature('points','WKT', geom_to_wkt(start_point($geometry)  )),'year') = attribute( get_feature('points','WKT', geom_to_wkt(end_point($geometry)  )),'year')
THEN attribute( get_feature('points','WKT', geom_to_wkt(end_point($geometry)  )),'year')
ELSE min( attribute( get_feature('points','WKT', geom_to_wkt(start_point($geometry)  )),'year'),attribute( get_feature('points','WKT', geom_to_wkt(end_point($geometry)  )),'year'))||'-'|| max( attribute( get_feature('points','WKT', geom_to_wkt(start_point($geometry)  )),'year'),attribute( get_feature('points','WKT', geom_to_wkt(end_point($geometry)  )),'year'))
END

щоб показати лише рік, якщо два пункти з тим самим роком пов’язані (отримуючи 200X замість 200X-200X).

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.