Карты глубин и высот известны давно и широко используются в топографии. Надо отметить что линии эквивалентных высот и глубин называются изогипсы и изобаты соответственно, но для упрощения дальше будем использовать «линии высот» и «линии глубин». В этой статье я хочу рассказать как создавать карты высот и глубин в Tableau и делать их более привлекательными для зрителя. Карты, которые мы будем создавать, нацелены на быстрое понимание рельефа. Сама идея таких визуализаций у меня появилась после того, как я  рассматривал классические топографические карты. Дело в том, что линии глубин и высот не всегда быстро можно считать и понять рельеф местности.

Давайте посмотрим на карту острова O’Ahu, Hawaii 1938 года:

На карте есть много информации, включая линии высот. Проблема в том, что очень сложно понять рельеф острова на таких картах. Это могут сделать лишь профессионалы, работающие постоянно с картами. Обычный же пользователь мало что поймет. На следующей карте показаны контуры высот острова Hawaii. Эту картинку понять намного проще, но надо сверяться с цифрами высот на контурах.

Или возьмем пример топографической карты из википедии:

В школе мне всегда сложно было понять на таких картах где какие высоты и глубины — эти карты обычно перегружены данными и прочитать высоты и представить картину рельефа довольно трудно. Сейчас картографические программы и инструменты визуализации значительно шагнули вперед и позволяют работать со слоями используют различные интерактивные фичи. Именно проблема понимания таких карт 20 лет назад и работа с картами сегодня побудили меня написать эту статью. Сейчас с линиями высот и глубин можно работать увлекательно и получать удовольствие от процесса.

1. Контуры высот

Давайте построим контуры высот островов штата Гавайи. На портале hawaii.gov есть множество интересных географических датасетов. В том числе, есть контуры острова O’Ahu c шагом 20 футов. Загрузим контуры в формате .shp и подключим этот файл к Tableau. Если перенести поле Geometry на лист, то карта с линиями создастся автоматически. Я поменял цвет карты на темно-серый.

Линий на карте много, Поэтому они накладываются друг на друга, и картину высот не видно. Можно уменьшить непрозрачность линий:

Более интересная картина получается при переносе поля Contour в цвет. Это поле имеет значения: 0, 20, 40…, то есть, это высота. поэтому цвет контуров меняется в соответствии с высотой:

Эта картина сама по себе красива. За счет изменения цвета создается 3d — эффект рельефа. Давайте рассмотрим случай когда нужно показывать не все линии, а, например, нужно убрать часть линий, то есть, увеличить шаг высот. Для этого сделаем вычисление Contour Filter:

[Contour]%500 = 0

Это булево поле, которое будет соответствовать True, когда высота делится на 500 без остатка. Если бросим поле в фильтр и оставим только значения True, то останутся контуры с высотами 0, 500, 1000…:

Получили другую картинку. Можно менять значение 500 и делать любой шаг высот. 

Добавление анимации позволяет видеть подъем по высотам, а для острова Оаху это выглядит как замерзание воды. С анимацией рельеф воспринимается совершенно на другом уровне — можно видеть все неровности поверхности по мере увеличения высот в динамике.

Сама визуализация на Tаbleau Public здесь. Карту можно приближать.

Эту анимацию хорошо приняли пользователи Reddit в сабреддите r/dataisbeautiful. Пост cобрал больше 15000 upvotes и 200 комментариев.

Удивительно что люди сравнивали анимацию линий высот с инеем, растеканием чернил на бумаге, листьями растений. Эта картина также напоминает фрактальные структуры.

И еще пара примеров анимации визов, cделанных по этому принципу. Та же карта острова Oahu, но высоты показываются, начиная с самой высокой точки:

Контуры высот Пуэрто Рико. Точками обозначены населенные пункты. Саму визуализацию можно найти здесь.

Про создание такой анимации я рассказывал в статье «Создание видео при помощи Tableau и программных роботов».

Теперь рассмотрим другой остров. Картина рельефа острова Hawaii или Big Island сильно отличается от рельефа острова Oahu. Этот остров имеет 5 вулканов, включая спящий вулкан Мауна-Кеа (4205 м над уровнем моря). Шаг линий — 100 футов.

До этого мы работали только с линиями высот, но можно визуализировать рельеф при помощи полигонов. В архивах stanford.edu есть датасет с контурами всех островов архипелага Гавайи. Здесь данные представлены в виде замкнутых контуров с шагом 500 футов, и Tableau определяет геометрию как Polygon, а не как Linestring. В Tableau такие полигоны будут выглядеть так:

В настройках Marks можно устанавливать цвета границы полигонов. На нижнем рисунке слева нет границы, справа она есть.

2. Линии глубин

Визуализация линий глубин в Tableau не отличается от визуализации линий высот. Но в этом разделе мы рассмотрим новую возможность Tableau, которая появилась в версии 2020.4 и называется Multiple marks layer support for maps.

Суть этой фичи заключается в том, что на карты теперь можно добавлять любое количество слоев. Подробнее можно прочитать в статье Marc Reid «Tableau Map Layers» и в статье Ivett Covacs «What’s New in Tableau 2021.1: Snowflake Geospatial Support with Map Layers».

Рассмотрим как можно создать такую визуализацию:

Для начала нужно найти данные. Данные по всем великим озерам кроме озера Верхнего есть здесь. А батиметрические линии озера Верхнего можно найти здесь.

Все данные в формате Esri shapefile format сохраняем на локальной машине и разархивируем в одну папку. Коннектимся сначала к одному .shp файлу (File — Spatial file в настройках подключения Tableau).

Получим такой набор данных:

Построим сами контуры, обозначив глубину цветом:

Далее подключим остальные файлы. В качестве поля соединения выберем глубину. Обратим внимание, то файлы с разных ресурсов, и названия полей разные. Поэтому приводим DEPTH к целому числу INT(DEPTH) и соединяем c полем Contour.

На одном листе создаем несколько слоев простым перетаскиванием полей Geometry на лист:

Получили 5 слоев, каждый из которых можно настраивать индивидуально при желании:

Обратим внимание, что мы не пользуемся программами типа QGis для работы с геоданными, а соединяем все в Tableau — эту существенно экономит время.

В исходных данных каждого слоя линии глубин имеют разный шаг. Например, для озера Верхнего шаг 20 метров, а для озера Эри — 1 метр. Кроме этого, у трех озер линии глубины начинаются с 1, а у других — с нуля. То есть, мы имеем неэквивалентные данные, и нужно их нормализовать для получения корректной картины на одном листе. Давайте во всех слоях оставим только линии с шагом 20 метров, то есть, 0,20,40….

Создадим вычисление Depth Filter:

[Contour]%20 = 0 OR [Contour] = 1

Число 20 здесь — это желаемый шаг глубины. В настройках экстракта оставим только True для этого поля. Таким образом, в экстракте останутся только значения глубин 0,1,20,40…

Установив диапазон цвета от -400 до 0 для каждого слоя, получим нормализованную картину:

Озеро Верхнее — самое глубокое, а озеро Эри — мелкое. Поэтому озеро Эри плохо проявилось на нашей картинке. Для детального отображения каждого озера можно использовать свой источник с одной таблицей — так сделано в итоговой визуализации.

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

3. Эффект 3D на картах

Про контуры Tanaka я рассказывал в статье Contour Plots и оценка плотности событий в Tableau . На картах неровности рельефа при помощи такого метода выглядят так:

Картинка отсюда.

Чтобы построить подобное в Tableau, нужен с датасет с батиметрическими контурами. Выше мы рассмотривали линии глубин, и в датасетах линии хранились как linestring. Кроме того, далеко не всегда такие линии замыкались. Для задачи добавления 3D эффекта нам нужны данные с замкнутыми контурами (contours). Нужно либо тип Linestrings приводить к Polygons в программах типа QGis, что может быть не очень просто; либо найти датасет с готовыми контурами. В открытом доступе не там много хороших датасетов с контурами. Для Малого Невольничьего озера датасет в формате SHP есть здесь. Построим следующую визуализацию с 3D эффектом:

В Tableau исходные данные выглядят так:

Если построить контуры в Tableau по исходному датасету, получим такую картину:

Проблема в том, что исходные данные здесь в формате linestrings, и полигоны в Tableau не получится построить. Для построение полигонов нужно определить порядок следования точек в каждом контуре и добавить в данные новое поле point_order.

Для того, чтобы перевести формат .shp в формат .csv с координатами X,Y,Z, воспользуемся подходом, про который мне рассказал Егор Ларин. Этот подход описан на форуме Tableau, его разработал Richard Leeke. Я конвертировал данные в .csv утилитой ShapeToTab, ссылка на нее есть в описании подхода.

Утилита для нашего датасета возвращает данные в таком виде:

Sl_ID здесь идентификатор контура, point order — порядок точек в контуре. line_segment_id мы использовать не будем.

Сделаем UNION для полученного файла Sl_Points.csv, соединив 3 одинаковых файла, а также сделаем INNER JOIN с исходной таблицей, исключив из нее геоданные:

Далее рисуем полигоны на карте. Про то как делать Tanaka Contours в Tableau я подробно писал в в статье Contour Plots и оценка плотности событий в Tableau. Здесь сделано то же самое за тем лишь исключением, что поля X и Y являются широтой и долготой, поэтому точки отображаются на карте. Cаму подложку карты я делал в Mapbox Studio.

Можно сделать параметр, отключающий слои теней, чтобы получить обычные двумерные контуры глубин:

Добавим легенду и интерактив, теперь можно убирать слои полигонов по глубине. Получится интересная картина:

Саму визуализацию можно найти здесь.

Conclusion

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