Quantum GIS: картограммы

Mar 30, 2013 20:21


Сегодня про то, как присоединять статистику и закрашивать области по значению показателя. Результатом должна стать вот такая карта


Кстати, по-русски она назыавется картограмма, а по-английски - choropleth map. А cartogram - это то, что по-русски называется анаморфоза.

Статистика

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

Статистику по населению я взял здесь в файле xls.

Там на третьем листе (Table 2) есть разбивка населения по дистриктам - это второй уровень АТД.



Векторные основы с АТД

Второго уровня АТД нет на NaturalEarthData, поэтому его придётся поискать в другом месте. Шейпы с АТД по всем странам мира лежат на www.gadm.org. Их качество периодически вызывает некоторые нарекания (вероятно, причина в том, что это краудсорсинг), но хотя бы в качестве «точки отправления» для составления правильных карт с сеткой АТД эти шейпы вполне годятся.

Архив с сайта содержит шейпы с нулевым (вся страна), первым (регионы), вторым (дистрикты) и даже третьим (территориальные образования) уровнями АТД. Правда, как выясняется, у третьего не прописаны в атрибутивной таблице никакие признаки, так что прежде, чем им пользоваться надо ещё его пообрабатывать, а вот второй уровень, который нам и нужен вполне нам подходит.

После отключения группы слоёв от предыдущей карты (административного деления НЗ) и загрузке файла NZL_adm2 окно ГИС выглядит вот так:



Упрощение геометрии

Шейп-файл занимает 5 с лишним мегабайт и грузится (а потом ещё перепроецируется) довольно ощутимое время. Причина этого в том, что он очень детальный. Для нашего масштаба вполне можно некоторые детали выкинуть, упростить контуры границ.

Выбирая в меню «Вектор» - «Обработка геометрии» - «Упростить геометрию», попадаем в диалоговое окно:


Самым важным и не вполне очевидным параметром является поле «Порог упрощения». При его заполнении стоит помнить о том, что у нас слой хранится в системе координат WGS84, где единицы измерения градусы. Вписывая в это поле 0,01 , я прошу упрощать все элементы, которые имеют «размер» меньше одной сотой градуса. Чтобы понять «масштаб бедствия», можно считать, что градус - это очень примерно 100 км, так что я попросил выкинуть всё, что меньше 1км. После этого преобразования вид карты практически не изменился:


Однако теперь она занимает меньше 200 килобайт и быстро грузится. Старый подробный слой NZL_adm2, естественно, можно удалить.

Соединение информации

В атрибутивной таблице этого слоя прописаны названия дистриктов в поле NAME_2:

На наше счастье, они практически совпадают с названиями дистриктов в xls-файле. Только в xls ещё добавлены слова district и city после названий, но их легко убрать с помощью поиска и замены. Нужные мне данные из xls (названия дистриктов и население в 2012 году) я копирую в новый файл:


Названия столбцов (DNAME и POP2012) я выбрал сам для своего удобства. Теперь этот файл я сохраняю в формате CSV (значения, разделённые запятыми). (Справедливости ради надо сказать, что всевозможные офисы по умолчанию разделяют не запятыми, а точками с запятой, но нас это тоже устраивает.) Вообще, создание такого CSV, чтобы QGIS его правильно понял, иногда становится похоже на шаманство, но самым главным элементом этого шаманства является создание csvt-файла. Во-первых, настоятельно рекомендую называть csv-файл латинскими буквами без пробелов. В той же папке, где лежит csv-файл, надо создать csvt-файл: называться он должен так же, только вместо последних трёх букв (расширения) csv должны стоять четыре буквы csvt. Если у вас Windows, расширения файлов не показываются, и вы не знаете, как это включить, а всё это вам мешает создать csvt-файл, можно просто взять здесь архив с двумя файлами NZ_pop2012.csv и NZ_pop2012.csvt, которые я использовал, чтобы воспользоваться ими для этой или какой-то другой карты. При этом csvt-файл надо будет переименовать и отредактировать Блокнотом.

В csvt-файле прописываются типы данных, которые хранятся в столбцах. Типов данных бывает три: "String" - текст, "Integer" - целые числа, "Real" - действительные числа. В файле должна быть строчка, в которой через запятую без пробелов перечислены типы каждого из столбцов. В моём случае столбцов два, поэтому в файле одна строчка:

"String","Integer"

Если бы было больше столбцов с данными, было бы больше типов перечислено. Хозяйке на заметку: если вдруг вам надо воспользоваться типом "Real", стоит помнить о том, что десятичным разделителем в QGIS является точка, а не запятая.

После того, как csvt-файл создан и отредактирован, можно загружать наши данные в ГИС. Делается это той же самой кнопкой, что и добавление слоёв, только при выборе типа файла надо вместо «ESRI shape-файлы» указать тип файлов «CSV»:


После загрузки csv-файла он появится в списке слоёв с иконкой в виде таблички. Пространственных данных у этого «слоя» нет, но его атрибутивную таблицу можно открыть. Если с csvt-файлом всё получилось, то во второй колонке таблицы числа должны быть выровнены по правому краю:


Если вдруг числа слева, то это значит, что ГИС их восприняла как текст, и что-то не так с csvt-файлом.

Если с числами всё хорошо, то их можно привязывать к векторной основе NZ_admin2. Для этого надо открыть свойства слоя NZ_admin2 (например, двойным щелчком по названию слоя в списке) и выбрать вкладку «Связи»:


Здесь надо добавить новую связь нажатием на кнопку с плюсом. Откроется диалоговое окно:


Связанный слой - это тот, слой из которого мы хотим добавить данные. В нашем случае - NZ_pop2012. Дальше идут два названия столбцов: один из привязываемого слоя, другой - из того, к которому привязывают (в нашем случае - NZ_admin2). Это те два столбца, по совпадению значений в которых будут сопоставляться данные. Здесь я выбираю в «Поле для объединения» DNAME, а в «Целевом поле» - NAME_2. Это означает, что в конце строчки, в которой в таблице слоя NZ_admin2 в поле NAME_2 стоит, например Auckland будет дописаны значения из той строчки, второй таблицы, у которой Auckland записано в столбце DNAME.

После того, как эта связь добавлена, можно посмотреть на атрибутивную таблицу слоя NZ_admin2 и увидеть, что справа в ней появилась новая колонка POP2012:

В большинстве строчек напротив дистрикта написано его население.
Правда, у некоторых строчек там написано NULL, что означает, что данные по населению сопоставить не удалось. Такие строчки, во-первых оказались напротив всяких островов, находящихся под юрисдикцией НЗ, во-вторых у Hastings city, Hutt city, а в третьих - у пригородов Окленда (Franklin, Manukau, Rodney, Waitakere), причём Franklin состоит из двух кусочков.

Прежде, чем двигаться дальше, стоит эти неприятности поправить. Прежде всего, удалим на время связь между слоей NZ_admin2 и csv-файлом (во вкладке «Связи» свойств слоя выбираем связь и нажимаем на кнопку с зелёным минусом). Теперь внесём исправления в слой NZ_admin2. Изучение файла со статистикой и сторонних источников показывают, что все пригороды Окленда надо присоединить к городу, Hastings city присоеднить к Hastings, а Hutt city переименовать в Lower Hutt. Самое простое - это переименование, на нём я останавливаться не буду.

Объединение регионов проведём на примере Окленда. Наверху атрибутивной таблицы перечислены 5 «кусочков» Окленда, которые нам надо объединить, а ещё 6-й кусочек - фрагмент Franklin из региона Waikato находится где-то внизу. Выберем первые пять строчек таблицы, удерживая Shift и нажимая сначала на цифру 0 слева от первой строки, а затем на цифру 4 слева от пятой:


Теперь пролистаем таблицу вниз до Franklin в Waikato и добавим его к выделению, удерживая Ctrl и нажав на кнопку слева от его строчки:


Если всё сделано правильно, то выделенные регионы должны выглядеть на карте так:


Теперь открываем слой NZ_admin2 для редактирования и нажимаем на кнопку «Объединить выбранные объекты»
(первая из двух одинаково выглядящих кнопок), после чего откроется окно, спрашивающее, что делать с атрибутами объектов при объединении:


Вариант, который предложен по умолчанию меня устраивает (в NAME_2 написано Auckland, но если не подходит, можно выбрать нужную строчку, нажав слева от неё, а затем нажать на кнопку «Использовать атрибуты выбранного объекта»). Если теперь сохранить слой, закрыть режим редактирования и выбрать Окленд, становится видно, что он единый и целый (хоть и с «дырками»):


Аналогично присоединяем Hastings city к Hastings. Теперь, если связать слой NZ_admin2 с NZ_pop2012 значение NULL окажется уже только у всяких тихоокеанских островов, которые нам не нужны.

При включённой связи нажимаем правой кнопкой на слой NZ_admin2 и выбираем «Сохранить как...»: в новом слое (я его назвал NZ_populat) информация о населении будет уже полноправной частью атрибутивной таблицы. Слой NZ_admin2 и таблицу NZ_pop2012 теперь можно удалить из списка слоёв.

Вычисление площади

В принципе, можно было бы взять значения площадей дистриктов из какого-то стороннего источника и также привязать их к слою, или вообще посчитать плотности населения по дистриктам в электронных таблицах и сразу привязывать к слою не население, а значения плотности. Но я хочу воспользоваться возможностью показать, как площади считаются в самой ГИС.

Для того, чтобы это сделать надо перевести слой в равноплощадную проекцию. Мне нравится Equal Area Cylindrical: NSIDC EASE-Grid Global (EPSG:3410). Для того, чтобы сохранить слой в эту проекцию, надо выбрать «Сохранить как...» и в окне указать её, выбрав из списка.

Добавлять новый слой на карту не надо, лучше вообще запустить ещё одно окно QGIS и работать в нём отдельно от первого. Загруженный в отдельное окно этот слой выглядит так:


Теперь, чтобы вычислить площади регионов, надо зайти в атрибутивную таблицу, открыть её для редактирования и включить калькулятор.

В калькуляторе надо создать новое поле AREA, типа «Действительное число (real)» с размером 10 точностью 4 (4 - количество знаков после запятой), а в поле для выражения вписать $area/1000000 (или выбрать функцию $area из списка функций в левом столбце, в разделе «Геометрические»):


На миллион мы делим потому, что единицами измерения карты являются метры, и чтобы перевести из м² в км² надо разделить на 1000².

Если всё прошло успешно, то после сохранения атрибутивная таблица в своём правом конце должна выглядеть так:



Закрепить успех можно, посчитав плотность здесь же, зайдя снова в калькулятор и создав новое поле (например, DENSITY) типа действительное число, значение которого вычисляется как POP2012/AREA.

Вместе с этим полем таблица выглядит так:



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

Собственно картограммы

Отображение регионов в виде картограммы настраивается во владке «Стиль» свойств слоя. Вместо обычного знака надо выбрать в выпадающем меню «Градуированный знак»:
. Далее настраиваются параметры градуированного знака.
С настройками «Поля» и «Градиента» всё довольно понятно. Особое внимание стоит уделить полю «Знак». Понятно, что цвет закраски будет меняться, поэтому настраивать его нет смысла. Однако, например, цвет обводки вполне имеет смысл настроить, и это делается именно нажатием на кнопку знак. Я решил, что буду рисовать дистрикты вообще без обводки и настроил её толщину на ноль:


После всех настроек и выбора подходящего градиента окно настроек выглядит так:


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


Теперь карта выглядит так:


Остаётся лишь создать для неё макет, загрузить туда шаблон НЗ-карты и внести необходимые изменения. Итоговая карта выглядит так:


Опубликовано у меня в блоге.
Previous post Next post
Up