Получить атрибуты points-touch-a-line обратно на слой линий, используя QGIS?
12
Я использую QGIS 2.14.4-Essen. У меня есть два слоя:
points.shp, содержащий точки со столбцом YEAR
lines.shp, который содержит линии, которые точно соединяют точки из points.shp
Я хотел бы получить атрибут YEAR из points.shp обратно в lines.shp. Каждая линия представляет собой отдельный сегмент с одной точкой на каждом конце (см. Рисунок ниже). То, что я хотел бы получить, это ГОД от первой точки и ГОД от второй точки обратно в атрибуты каждой линии.
Например: линия 1 касается первой точки с YEAR = 2010, а вторая точка с YEAR = 2011. Я хотел бы вернуть что-то вроде '2010-2011' в атрибуты строки 1. Результат должен выглядеть так:
Хотя ответ @radouxju действителен, я объясню его немного подробнее.
Вам нужно убедиться, что полилиния разбита точно над точечными местоположениями.
Использование Join attribute by location. Выберите объект линии разделения в точечных местах в качестве целевого слоя - в моем случае я называю его «взорванным».
В разделе «Сводка» выберите «Свести итоги пересекающихся объектов». Здесь вместо запуска инструмента два раза; один для Мин и другой раз для Макс, вы можете запустить его один раз и выбрать Мин и Макс.
Выходной файл будет иметь следующий атрибут:
Добавьте новое поле типа string с именем «Year» в новый шейп-файл, начиная с шага 4.
Используйте Калькулятор поля и перейдите для обновления существующего поля. Выберите «Год» и напишите следующее выражение:
Таблица слева - это данные точек после создания нового поля типа integer, а таблица справа - после объединения строки с данными точек с помощью шага 2, упомянутого выше. Затем я использовал шаги 5-6 для создания окончательных данных.
Обновить
Я попытался преобразовать поле YEAR из строки в целое, используя выражение to_int (), и это сработало. Так что вам не нужно делать это вручную. Однако тип поля должен иметь тип Integernot Integer64. Убедитесь, что длина поля равна 9. Если вы выбрали длину поля 10, оно будет преобразовано в Interger64, и с ним работать не будет Interger64. Затем вы можете следить за процессом с шага 2-6
Вот окончательный вывод после использования выражения to_int ():
В приведенной выше таблице атрибутов слева YEAR имеет тип string, а YEAR2 имеет тип integer, преобразованный с использованием выражения to_int (). Вы можете видеть в таблице атрибутов справа после выполнения шагов 2-6, я получил MINYEAR2 и MAXYEAR2, затем снова преобразовал в строку обратно, чтобы объединить все вместе в поле YEAR.
Большое спасибо! Именно это я и делал несколько раз. Я предполагаю, что объекты ломаной линии разделены точно над точками, потому что я создал линии из слоев точек с помощью плагина Points2One. Можете ли вы попробовать использовать это подмножество данных: drive.google.com/file/d/0B7ZWEFkkfYgheG92Q29sa0I3LW8/view ? Еще раз спасибо!
wiltomap
Поле YEAR в таблице атрибутов имеет тип string. Вам нужно добавить новое поле типа integer и ввести годы вручную. После создания поля целочисленного типа и сохранения изменений удалите поле старой строки. Затем выполните описанный выше подробный процесс.
Ахмадханб
Я пытался преобразовать поле YEAR из строки в целое, используя выражение to_int (), но также не получилось. Когда я ввел годы вручную, все заработало как положено.
Ахмадханб
Четкое объяснение @ahmadhanb
Шико
Спасибо @ahmadhanb! Дело в том, что данные, которыми я поделился выше, являются подмножеством. У меня есть несколько тысяч линий и точек, поэтому ввод вручную вручную будет довольно трудоемким! Это ошибка?
wiltomap
5
Когда вы соедините точки соединения с линией, у вас будет несколько отношений. С помощью «атрибута присоединения по местоположению» вы сможете запросить данный сводный метод. В вашем случае, сделайте это дважды: один раз с минимумом и один раз с максимумом. После этого вы можете объединить два поля в новом поле и получить то, что вам нужно.
Этот метод возвращает дополнительный столбец с именем COUNTи значением 2для каждой строки. Параметры Min и Max возвращают эту информацию. Я выбрал слой линий в качестве целевого слоя и слой точек в качестве слоя соединения, я прав?
wiltomap
у вас год поля числовой или текстовый?
Radouxju
YEARПоле целое число. Я пытался создать новый столбец с, to_string("YEAR")но результат точно такой же ...
wiltomap
Я сделал быстрый тест, чтобы убедиться (QGIS 2.8.3), и это сработало. Если ваш счет равен 2, это означает, что у вас есть 2 балла за каждый сегмент, и это правильно. Но со мной у меня есть значения атрибута MINYEAR MAXYEAR в новом векторе линии, созданном пространственным соединением. Я не понимаю, почему это не работает в вашем случае. Не могли бы вы попробовать с другим файлом?
Радучжу
4
Предполагая, что топология идеальна, создаем поле 'WKT' с выражением
geom_to_wkt( $geometry)
в вашем точечном слое вы можете использовать выражение:
в полевом калькуляторе слоя трубы, создающего текстовую строку.
attribute (feature, attribute_name) Возвращает значение указанного атрибута из объекта, здесь - год получения точечного объекта
.
get_feature (layer, attribute, value) возвращает первый элемент слоя, соответствующий данному значению атрибута. Здесь мы проверяем, можем ли мы найти точку с теми же координатами (в формате WKT), что
и у начальной и конечной вершин вашей линии.
start_point (geometry) возвращает первый узел из геометрии. Здесь первая вершина вашей линии.
end_point (geometry) возвращает последний узел из геометрии. Здесь последняя вершина вашей линии.
geom_to_wkt (geometry) возвращает представление геометрии "Хорошо известный текст" (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).
Основным преимуществом этого метода является то, что если ваши данные меняются в ваших точках, вы можете очень быстро обновить их с помощью только одного полевого калькулятора.
Вы даже можете добавить это правило в качестве автоматического поля при создании новых строк.
Ура,
Когда вы соедините точки соединения с линией, у вас будет несколько отношений. С помощью «атрибута присоединения по местоположению» вы сможете запросить данный сводный метод. В вашем случае, сделайте это дважды: один раз с минимумом и один раз с максимумом. После этого вы можете объединить два поля в новом поле и получить то, что вам нужно.
В полевом калькуляторе:
источник
COUNT
и значением2
для каждой строки. Параметры Min и Max возвращают эту информацию. Я выбрал слой линий в качестве целевого слоя и слой точек в качестве слоя соединения, я прав?YEAR
Поле целое число. Я пытался создать новый столбец с,to_string("YEAR")
но результат точно такой же ...Предполагая, что топология идеальна, создаем поле 'WKT' с выражением
в вашем точечном слое вы можете использовать выражение:
в полевом калькуляторе слоя трубы, создающего текстовую строку.
.
и у начальной и конечной вершин вашей линии.
Вы даже можете обновить его до:
чтобы показать только один год, если две точки с одним и тем же годом соединены (получая 200X вместо 200X-200X).
Основным преимуществом этого метода является то, что если ваши данные меняются в ваших точках, вы можете очень быстро обновить их с помощью только одного полевого калькулятора.
Вы даже можете добавить это правило в качестве автоматического поля при создании новых строк.
Ура,
источник