[Перевод] Красивая и подробная геологическая карта Марса, сделанная на Python, GDAL
На этой неделе — творческое переосмысление геологической (или все же ареологической?) карты Марса на основе карты, сделанной USCS. Использовалась те же геологические данные, что и для оригинальной, но было добавлено больше топонимов и подписей, проведен редизайн визуального стиля, а термины из легенды карты упрощены для общего понимания.
Одной из самых сложных частей проекта было сделать перевод условных обозначений на язык не специалистов. Оригинальная карта была сделана для геологов, поэтому большую часть вокабуляра пришлось пересмотреть. Например, новая расшифровка значения края кальдеры — «Граница пустой магматической камеры, оставшейся после извержения вулкана». В оригинале было «Овоидный бугорок, очерчивающий одну или несколько слитых частично или полностью закрытых впадин; коллапс вулкана, связанный с извержениями и, возможно, взрывными извержениями».
Во многих случаях переведенные обозначения были более неточными или менее информативными, чем оригинальные, поэтому также включили оригинальные аббревиатуры для каждого типа геологического элемента. Эти метки могут содержать ссылки на исходные данные, если вдруг захочется узнать больше о каждом типе геологического образования в научных терминах.
Некоторые из особо-примечательных геологических объектов на Марсе. 1: Гора Олимп, самый большой вулкан в Солнечной системе. 2: Долины Маринер, система глубоких каньонов длиной более 4000 км. 3: Равнина Эллада, самый большой видимый ударный кратер в Солнечной системе. 4: Марс геологически разделен на Северную низменность (бледно-зеленую) и Южную горную местность (коричневая). Ударные кратеры, образованные падающими астероидами и кометами (неоново-желтые), разбросаны по всей планете.
Для карты использовались следующие отдельные слои. 1–3: Геологические элементы, геологические контакты и геологические особенности из набора данных USGS. 4–5: уровень наклона и из двух источников USGS. 6: Номенклатура от IAU (Международный Астрономический Союз). 7–8: линии сетки и 3D-эффект, разработанный в Photoshop.
Много времени ушло на выбор проекции для проекта. Чтобы точно показать, какая часть планеты состояла из каждого геологического образования, в итоге использовалась проекция Эккерта IV. Этот тип проекции карты искажает контуры объекта, но сохраняет относительную площадь фигур по всей поверхности планеты. Такая проекция не подходит для визуализации полярных регионов, поэтому также добавили четыре карты-врезки в углы, чтобы показать каждое полушарие Марса (северное, южное, восточное и западное).
Чтобы сравнить эти различные проекции карты, вы можете использовать индикатрису Тиссо — набор кругов одинакового размера, нанесенных в разных местах земного шара. Все проекции карты искажают пространство, но вы можете видеть, что эффекты сильно различаются в зависимости от проекции.
1: Равнопромежуточная. 2: Экерт IV. 3–5: Ортографические проекции с центром на разных долготах и широтах
Рассказ о реализации
В данном проекте использовались открытые данные USGS, IAU и NASA.
Стек технологий: Python 3.7.1, GDAL 2.4.1, Illustrator CC 2019 и Photoshop CC 2019 (можно заменить на бесплатные Gimp и Inkscape, например).
Также нужно установить пакеты: matplotlib numpy, pandas, cartopy, jupyter.
Сбор и обработка данных
Создание модели рельефа (DEM)
Модель рельефа — это данные, содержащие информацию о высоте различных точек на планете. В проекте использовались данные, полученные из Геологической Службы США. Каждый пиксель в файле GeoTIFF — это 16-битное число, которое описывает высоту точки.
Примечание: многие программы не могут нормально прочитать этот файл, так что то, что он выглядит странно в формате предпросмотра или в других неспециализированных программах — это нормально. В рамках проекта работа с ними шла через GDAL (англ. Geospatial Data Abstraction Library — библиотека абстракции гео-пространственных данных).
Создание проекций карты
Как уже говорили выше, для основной карты использовали проекцию Эккерт IV, которая сохраняет неизменной площадь, а для врезанных карт полюсов использовалась ортографическая проекция.
Изменяем проекцию в DEM-файле: в исходном файле использовалась равнопромежуточная проекция, поэтому нужно ввести следующий код в командную строку, чтобы осуществить перевод. Код использует оригинальный файл intif и создает новый outtif, в формате eck4 (Эккерт IV) проекции.
gdalwarp -t_srs "+proj=eck4" ./path_to_intif.tif ./path_to_outtif.tif
Потом уменьшаем разрешение DEM, просто сокращая размер каждого пикселя до 1500×1500 метров, используя метод average. Это позволит сократить время обработки, да и уменьшение разрешения в этот момент сделать проще, чем потом.
gdalwarp -tr 1500 1500 -r average ./path_to_intif.tif ./path_to_outtif.tif
Отмывка и карта склонов
Дальше мы используем получившийся файл для создания карты с отмывкой и карты склонов для каждого полушария планеты.
Карта после отмывки показывает тени из воображаемого источника света, свет падает на карту сверху. Он воображаемый, потому что в реальном мире так не бывает — одиночный источник света создаст тени под разными углами в разных частях шара. Встроенная функция hillshade в GDAL устанавливает угол падения света одинаковый для всей карты. Для данного проекта z, вертикальное увеличение, поставили равным 20. Это увеличивает каждое значение высоты в 20 раз, чтобы сделать рельеф более контрастным и обеспечить отображение теней.
gdaldem hillshade -z 20 ./path_to_intif.tif ./path_to_hillshade.tif
Карты склона выделяют крутые части карты и добавляют больше информации к топографической отмывке (которая подчеркивает абсолютную высоту, а не крутизну).
gdaldem slope ./path_to_intif.tif ./path_to_slope.tif
Ортографические проекции
В дополнение к карте в проекции Эккерт IV также сделаны четыре карты полушарий Марса. Проекция Эккерт IV плохо подходит для отображения Северного и Южного полюсов, поэтому эти две врезки очень полезны для их понимания. Для получения отмывки и карты склонов повторяем код с небольшими изменениями — ortho вместо eck4 и обозначаем центр долготы и широты для каждой карты (North:+lat_0=90 +lon_0=90, South:+lat_0=-90 +lon_0=90, East:+lat_0=0 +lon_0=90, West:+lat_0=0 +lon_0=270).
gdalwarp -t_srs "+proj=ortho +lat_0=90 +lon_0=0" ./path_to_intif.tif ./path_to_outtif.tif
gdalwarp -tr 1500 1500 -r average ./path_to_intif.tif ./path_to_outtif.tif
gdaldem hillshade -z 20 ./path_to_intif.tif ./path_to_hillshade.tif
gdaldem slope ./path_to_intif.tif ./path_to_slope.tif
Легенда карты
Международный Астрономический Союз отвечает за присвоение имен внеземным объектам. Можно просто скачать файл в формате CSV, содержащий все объекты для каждой планеты прямо с их сайта. Для этого надо использовать функцию Advanced Search (расширенного поиска), чтобы скачать All Feature Types (все типы объектов) для вашей планеты — Target (Mars), но только с Approval Status of Adopted by IAU — одобренные МАС. В разделе Columns to Include section (столбцы для включения) выберите Feature ID, Feature Name, Clean Feature Name, Target, Diameter, Center Lat/Lon, Feature Type и Feature Type Code. Также можно включить Origin (происхождение), если хотите добавить в проект дополнительную информацию об объектах, такую как, например, в честь кого он был назван.
Геологические структуры и элементы
Геологическая карта показывает различные типы пород и другие особенности, такие как линии разломов и русла рек. У USGS есть красивая геологическая карта Марса, которую мы и используем в качестве исходной. Для работы с этими данными загрузите архив базы данных (790 МБ) с USGS Geologic Map. В следующем разделе, посвященному дизайну карты в Python, объясняется, как получить доступ и отобразить каждый тип данных в этой базе данных.
Дизайн карты в Python
Мы создаем шесть чертежей (plots) с геологическими элементами, структурами, особенностями, двумя видами текстовых подписей и сеткой. Часто стоит разделять данные для обработки, чтобы легко применять при необходимости эффекты из Photoshop или Illustrator. В matplotlib использовался gridspec, чтобы настроить все элементы так, чтобы каждый subplot занимал конкретное место в пределах декоративной рамки.
Геологические элементы — это различные виды рельефа, составляющие поверхность планеты. Разные скальные элементы обычно представлены разными цветами. Набор данных USGS помечает каждую породу 2–3 буквенным кодом, обозначающим тип элемента. Назначаем цвет каждому буквенному коду, составив таблицу пар код-цвет в Mars_geologic_units.csv. Мы обращаемся к этому файлу при построении каждого элемента в cartopy и matplotlib. Сохранение графических параметров в отдельном файле облегчает использование различных цветовых схем и обособляет дизайн от кода.
Геологические контакты — это границы между геологическими породами. Некоторые геологические границы являются приблизительными или скрыты под пылью. Как и для геологических пород, используем файл конфигурации Mars_geologic_boundaries.csv, чтобы отобразить каждый тип геологического контакта в другом цвете. На окончательной карте настраиваем отображение некоторых геологических контактов в виде пунктирных линий, просто открыв PDF в Illustrator и выбрав все объекты одного цвета (Select → Same → Stroke color).
Геологические особенности — это другие видимые линии на поверхности планеты, такие как каналы, края кратеров или гребни гор. В датасете есть 13 различных типов. Чтобы отобразить каждый из них в особом стиле, каждый отобразили в другом цвете, а затем стилизовали линии в Illustrator. Это позволило применить специальных эффекты, такие как градиентные хвосты, чтобы показать направление движения каналов оттока и лавовых потоков.
Условные обозначения
Для карты использовалось два набора данных для меток. Первый — это официальный от IAU. Размеры меток создаются в соответствии с размером объекта, хотя все равно финальную настройку размеров необходимо делать в Illustarator.
Второй набор меток добавляет для каждой крупного геологического элемента аббревиатуру. Это облегчает пользование легендой карты, поскольку некоторые цвета изменяются из-за теней. К коду здесь пришлось подойти творчески, а именно — нарисовать каждую аббревиатуру в геометрическом центре геологической формы, что не для всех случаев идеально. Но для данного проекта это было нормально, поскольку потом по плану все равн эти подписи будут двигаться вручную, чтобы избежать наложения на будущие подписи.
Места высадки: чтобы отобразить места высадки марсоходов и других космических аппаратов, использовалось улучшенное цифровое изображение от NASA в качестве фона. Чтобы показывать все 4 полушария планеты, пришлось поменять проекцию — landing_sites.ipynb.
Сохранение результатов из Matplotlib
Обычно результаты сохраняются в формате pdf, чтобы провести финальные правки текста и форм в Illustrator. Вот пара стандартных команд, которые облегчают последующую редактуруt:
import matplotlib
import matplotlib.pyplot as plt
import matplotlib.backends.backend_pdf as pdf
# Выгружает текст в редактируемом формате, а не в формате формы:
matplotlib.rcParams['pdf.fonttype'] = 42
# Сохраняет вертикальное положение для картинок
matplotlib.rcParams['image.composite_image'] = False
# Удаляет границы и тики из subplot
ax.axis('off')
# Убирает padding и margins отовсюду
plt.margins(0,0)
plt.subplots_adjust(top=1, bottom=0, right=1, left=0, hspace=0, wspace=0)
plt.gca().xaxis.set_major_locator(plt.NullLocator())
plt.gca().yaxis.set_major_locator(plt.NullLocator())
#Сохраняет в pdf
pp = pdf.PdfPages('./savename.pdf', keep_empty=False)
pp.savefig(fig)
pp.close()
# если не нужно сохранять в векторах
# можно делать сразу в PNG и правит сразу в Photoshop:
plt.savefig('./savename.png', format='png', dpi=600, pad_inches=0, transparent=True)
После сохранения PDF его нужно отредактировать так, чтобы каждый объект можно было редактировать независимо. В Illustrator выберите все в файле и идите в Object --> Clipping Mask --> Release. В этот момент стоит также удалить бэкграунд и границы, если вы их делали раньше.
Дизайн в Illustrator и Photoshop
Экспортирование из Python в PDF позволяет использовать некоторые функции графических редакторов, которых или нет, или их реализация гораздо более трудозатратна.
В этом проекте не так много особых текстовых эффектов, так что редактирование было минимально.
Создание теней под текстом в Photoshop
Для создания этого эффекта нужно скопировать слой с подписями и зайти в Filter --> Blur Gallery --> Field Blur. Для теней хорошо создавать два слоя с blur на 20% прозрачности — один с Blur равным 4 px, а другой — 10 px.
Цвета и шрифты
Чтобы карты выглядела продумано, для карты выбирались цвета из заранее продуманной палитры на 70 цветов. Два шрифта (Redflowers and Moon).
Разработка цветовой схемы
В начале проекта было создано 14 различных цветовых схем. Первоначальная идея состояла в том, чтобы иметь уникальную цветовую палитру для каждой планеты, но в итоге использовалась одна и та же коллекция цветов во всех проектах.
Декоративные иллюстрации
В проекте хотелось комбинировать большие датасеты и ручные элементы в стиле художников William Morris или Alphonse Mucha. Для этого перед разработкой была собрана большая коллекция картин для вдохновения.
На старте хотелось попробовать разные вариации рамок для карты. Была создана коллекция из 18 разных паттернов.
Однако в процесс реализации стало понятно, что данных слишком много и все и так выглядит очень скучено. В итоге был выбран только один паттерн для обрамления главной проекции.
Итоговый результат:
Ссылка на github: github.com/eleanorlutz/mars_geology_atlas_of_space
Реферальные ссылки:
Astronomy. Andrew Fraknoi, David Morrison, Sidney C. Wolff et al. OpenStax 2016.
Gazetteer of Planetary Nomenclature. International Astronomical Union (IAU) Working Group for Planetary System Nomenclature (WGPSN) 2019.
Planetary Symbology Mapping Guidelines. Federal Geographic Data Committee.
Mars HRSC MOLA Blended DEM Global 200m v2. NASA PDS and Derived Products Annex. USGS Astrogeology Science Center 2018.
Geologic Map of Mars SIM 3292. Kenneth L. Tanaka, James A. Skinner, Jr., James M. Dohm, Rossman P. Irwin, III, Eric J. Kolb, Corey M. Fortezzo, Thomas Platz, Gregory G. Michael, and Trent M. Hare. USGS 2014.
Viking Global Color Mosaic 925m v1. NASA PDS, 2019
Missions to Mars. The Planetary Society.
Fonts: Moon by Jack Harvatt and RedFlower by Type & Studio.
Advice: Thank you to Henrik Hargitai, Oliver Fraser, Thomas Mohren, Chris Liu, Chloe Pursey, and Leah Willey for their helpful advice in making this map.