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

ГИС Оставить комментарий

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

Кстати, по-русски она назыавется картограмма, а по-английски — 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), добавить его в наш проект со всеми остальными слоями и там уже работать с ним дальше.

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

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

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

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

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

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

11 комментариев к “Quantum GIS: картограммы”

  • К вопросу об упрощении геометрии:

    Принятая на печатных картах точность изображения - 0,1 мм в масштабе карты. Соответственно, при использовании "топографической" проекции (Гаусс-Крюгер, UTM и всевозможных их модификаций) вполне допустимо (как правило) устанавливать пороговое значение как 0,01 от знаменателя масштаба.
    В описанном примере: масштаб 1 : 7 500 000, следовательно, в 1 см 75 км или в 0,1 мм 750 м. Следовательно, 750 м - максимальный допустимый порог. Перевести в градусы по курсу 1 градус = 111 км (или, например, 1 минута = 1 852 м) не составит труда.

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

    • Алексей Яшунский:

      Спасибо за квалифицированный комментарий, буду знать.

      Про «расхождение» я знал, но не стал писать как раз потому, что в данном случае оно практически незаметно.

  • Борис:

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

    • Алексей Яшунский:

      Здравствуйте! Насколько я понимаю, такая ситуация не предусмотрена «идеологией» ГИС: по идее, полигоны не должны перекрываться. Если хочется иметь перекрывающиеся, они должны быть в разных слоях.

      • Борис:

        спасибо!
        да как я понял, и в других программах, таких как в arcview точно также.
        максимум что можно сделать, это вырезать нижний полигон и вставить его поверх, но в таком случае поля таблицы обнуляются.

  • Тимур:

    Здравствуйте!

    Я столкнулся вот с какой проблемой. При необходимости разместить при помощи QGIS на макете несколько картограмм (по той технологии, которую Вы описали выше, за что Вам спасибо) необходимо создать несколько групп слоев, переключая которые будут получаться отличающиеся друг от друга картограммы, которые в последствие можно выносить в макет. Однако при дублировании первоначальной группы слоев копия не распознает имена объектов (регионов) и, как следствие, не дает привязать регионы к заданным характеристикам, которые можно было бы отобразить на карте при помощи градуированного знака. Иллюстрировано я данный вопрос задал здесь: http://gis-lab.info/forum/viewtopic.php?f=27&t=18446. Возможно есть решение такой проблемы, но пока не могу найти.

    • Алексей Яшунский:

      Здравствуйте! Там Вам на форуме, насколько я смог понять, вполне по делу ответили. Если я правильно понял суть вопроса, то всё должно решаться настройками закрепления слоев каждой карты в макете (т.е. если хоть где-то вам удалось получить надписи в нормальном виде, то это можно сделать и на любых других картах).

    • Тимур:

      Проблему, описанную в посте выше я решил. Еще раз спасибо за статью о создании картограммам в QGIS.

  • Андрей:

    Уважаемый Алексей!В QGIS версии 2.10 очень мало наименований значков для карт. Пытался импортировать файлы XTM - не получается. Может есть дополнительные модули, что бы решить данную проблему? Заранее спасибо!

  • Алексей Яшунский:

    Здравствуйте, Андрей! Про дополнительные модули, к сожалению, не знаю, но, например, вот здесь http://gis-lab.info/qa/qgis-symbols.html есть набор значков, которые мне удавалось успешно загружать в свежие версии QGIS.

Оставить комментарий

Тема WordPress и иконки разработаны N.Design Studio
© 2018 Страница Алексея Яшунского RSS записей RSS комментариев Войти