Время прочтения: 8-9 минут
Версия QGIS: 3.40.1
Уровень владения QGIS: вы знаете, что такое слои, как их создавать и подгружать в программу
Уровень владения QGIS: вы знаете, что такое слои, как их создавать и подгружать в программу
Пространственный аспект - та часть информации о мире, которая делает работу ГИС-специалистов уникальной. А дата-инженерам и аналитикам дает возможность с гордостью добавлять в свое резюме слово “spatial”. В то же время, эта уникальность может создавать сложности при работе. Например, если мы хотим сделать карту с отображением какой-либо статистической информации в привязке к административно-территориальному делению, то можно быть уверенным, что эта информация в лучшем случае будет в формате CSV таблицы.
В данной статье вы узнаете, как можно в QGIS объединить внешние таблицы и слои пространственных данных, а также получите пару рабочих кодов для калькулятора полей, которые помогут упростить этот процесс.
Общий принцип
Присоединение таблиц или table joins - процесс, когда мы объединяем пространственный слой и таблицу в формате CSV с помощью колонок, которые содержат одинаковые значения (можно и другие форматы, например, TSV, но CSV самый частый и предпочтительный). То есть и в слое и в таблице должно быть по колонке, которые содержат одинаковые значения, например, наименования единиц административно-территориального деления. Как это работает, объясню на примере.
Пример присоединения таблицы к слою
В нашем примере мы будем делать карту распространения Джедаизма (от слова “джедай”, это такие рыцари из вселенной Звездных Войн) в Англии и Уэльсе по результатам переписи населения 2001 года.
Итого, у нас на входе есть два вида данных:
- слой с административными границами Великобритании (далее - слой);
- таблица в формате CSV, которая содержит информацию о численности населения, количестве джедаев и проценте джедаев в единице административно-территориального деления (атд) (далее - таблица).

Для того, чтобы присоединить данные из таблицы к слою нужно сделать как минимум следующие действия:
- посмотреть как называются колонки с названиями единиц атд в слое и в таблице;
- убедиться, что таблица не открыта в другом приложении, например, в excel, иначе мы не сможем ее редактировать прямо в QGIS;
- нажать правой клавишей мыши на слой, открыть свойства и выбрать вкладку “Связи” (“Joins”) и нажать на зеленый плюсик слева внизу, после чего выставляем настройки по примеру скриншота ниже.

С помощью выделенных на скриншоте настроек мы делаем следующее:
- “Связанный слой” - та таблица, которую мы привязываем к слою;
- “Связываемое поле” - название поля с названиями единиц атд в нашей таблице;
- “Целевое поле” - название поля с названиями единиц атд в нашем слое;
- “Редактируемый связанный слой” и “Изменения или вставка при редактировании” позволят нам в случае изменения данных в таблице, автоматически менять их в слое. Это будет нам очень полезно в будущем, чтобы посмотреть для скольких объектов слоя привязалась информация из таблицы ;
- “Присоединенные поля” - тут QGIS нам позволяет выбрать, какие колонки таблицы мы будем присоединять к слою;
- “Пользовательский префикс имени поля” - это то, что будет добавляться к названию колонки таблицы при присоединении к слою, то есть после присоединения слоя в таблице атрибутов слоя появится колонка с названием префикс + наименование поля в таблице, которое как раз указано в “Присоединенные поля”.
Если вам повезет с вашими данными, то у вас сразу все привяжется, и дальше читать не нужно. Но часто бывает так, что часть таблицы не привязывается, как в моем случае:

Обработка данных
Дело в том, что объединение происходит при полном соответствии наименования в колонке слоя и наименования в колонке таблицы, поэтому лишние пробелы, различия в названиях, опечатки и прочее не позволяют привязаться значениям. В нашем случае у нас есть самое настоящее ассорти таких проблем, которые видны с первого взгляда:
- в таблице есть некоторые названия в кавычках, а в слое - нет;
- в слое написано “Saint”, а в таблице сокращение “St.”;
- в таблице есть названия атд с добавлением в конце “ UA”, “; City of UA” и подобные;
- единицы атд Уэльса содержат также названия на валлийском, которые записаны через знак “/”.

Все это создает для нас необходимость их исправления. Но исправлять вручную десятки однотипных проблем довольно долго, поэтому решить такие проблемы можно с помощью следующих небольших строчек кода на языке запросов QGIS, которые вы легко сможете адаптировать под свои нужды.
По факту у нас есть две типичные задачи для исправления вышеуказанных проблем, чтобы больше значений таблицы привязалось к слою:
- превращение однотипных фраз (“ UA”) или символов типа кавычек в отсутствие символов, либо в нужные слова (“St.” превратить в “Saint”);
- отсечение ненужной части, которая идет после символа “/” включительно. Это немного сложнее, так как после него всегда идет разный текст.
Для начала начнем с превращения, которое делается с помощью команды replace. Она работает следующим образом:
replace(“Название колонки в кавычках”, “Что мы хотим заменить в тексте”, “Чем должно быть заменено”)
А куда же вводить этот код? Сначала делаем таблицу редактируемой (аналогично тому, как делать редактируемым слой), а потом нажимаем правой клавишей на нашу таблицу в списке слоев, выбираем “Таблица атрибутов”, а далее “Калькулятор полей” (значок выделен на скриншоте ниже). После это в открывшемся поле вводим код:
replace(“Area”, ‘ UA’, ‘’).
Если обновляете колонку, то не забудьте нажать на галочку “Обновить существующее поле”, слева внизу можно увидеть предпросмотр того, как работает код.

Еще раз объясняю как работает код со скриншота на примере replace(“Area”, ‘ UA’, ‘’):
“Area” — наименование колонки в таблице, в которой будем заменять символы;
‘ UA’ — те символы, которые мы хотим удалить, обязательно ставим одинарные кавычки ‘, чтобы QGIS искал именно символы, текст в двойных кавычках QGIS воспринимает как название колонки, что приведет к тому, что код работать не будет;
‘’ — одинарные кавычки означают, что ‘ UA’ будет заменено ничем, можно сказать просто удалено, и пробелов не останется.
Если мы хотим заменить “St.” на “Saint”, то код будет такой:
replace(“Area”, ‘St.’, ‘Saint’)
С помощью такой комбинации мы можем поправить все наши проблемы с превращением фраз, кроме одной: проблемы с кавычками . Если мы также через калькулятор полей, введем код replace(“Area”, ‘“‘, ‘’), то он ничего не изменит, потому что в QGIS в калькуляторе полей бывают проблемы со считыванием кавычек, и их нужно решать немного другим способом, но с тем же кодом.
Для этого заходим в таблице в таблицу атрибутов и вводим код replace(“Area”, ‘“‘, ‘’) в поле, которое выделено на скриншоте ниже. Слева от поля для ввода кода дополнительно выбираем колонку (имя атрибута), которую будем изменять кодом. Чтобы код работал, мы кавычку копируем прямо из поля в таблице атрибутов. После того, как введем код, нажимаем “Обновить все” справа.


Теперь сделаем задачу посложнее. Нам нужно отсечь ту часть названия в таблице, что идет после символа “/”, включая сам символ. Для этого заходим в калькулятор полей таблицы и пишем следующий код:
CASE
WHEN strpos("Area", '/') > 0 THEN substr("Area", 1, strpos("Area", '/') - 1)
ELSE "Area"
END
Как работает код:
- CASE — запускает код, содержащий WHEN, THEN, ELSE;
- END — завершает код;
- WHEN strpos("Area", '/') > 0 — когда в поле с названиями атд в таблице символ расположен по счету дальше чем 0 (0 ставится, если данного символа нет в строчке);
- THEN substr("Area", 1, strpos("Area", '/') - 1) — тогда оставляй все символы в поле “Area” с первого по номер позиции включительно, который вычисляется по формуле номер символа “/” в строке по счету минус 1;
- ELSE “Area” — если другой случай, то есть strpos("Area", '/') не больше 0, в случае, если нет символа “/” в строке, то записываются просто все символы, что уже есть в поле “Area”.
Программа проверяет, есть ли “/” в строчке в поле с названиями единиц атд “Area”. Если этот символ есть, то тогда оставляем все символы, что идут под номерами от одного до номера символа, который расположен перед “/”. Если же символа “/” нет в строчке, то оставляем все как есть.
С помощью данного кода мы дополнительно привязали еще 20 значений. Поверьте, вручную было бы дольше. Поэтому, если вам нужно удалить что-то после определенного символа массово, то можете использовать код выше, просто меняйте “Area” на название вашей колонки, а “/” на тот символ, с которого включительно нужно все удалить.
Если же хотите глубже понять как работает код и QGIS, и как можно с его помощью визуализировать данные, то не забывайте, что у нас в Картетике периодически проводятся курсы по QGIS: введение и продвинутый.

Материал подготовил Александр Зуев