Превращаем данные OpenStreetMap в плакаты с помощью prettymaps
Иногда попадаются библиотеки, которые просто радуют глаз. Не решают сложнейшие задачи энтерпрайза, не ускоряют сборку в десять раз, а берут геоданные и превращают их в графику, которую хочется распечатать и повесить на стену в рамке.
Около трех лет назад на Reddit и Hacker News завирусились векторные круглые карты городов с мягкими пастельными цветами. Как выяснилось, за этой эстетикой стоял небольшой скрипт бразильского разработчика Марсело Пратса. Проект называется prettymaps.

Что под капотом
В основе библиотеки лежит простая связка инструментов. Библиотека забирает сырые географические объекты из OpenStreetMap через osmnx, обрабатывает геометрию полигонов с помощью shapely и рендерит итоговую композицию через привычный matplotlib. Для подготовки векторных контуров под плоттеры автор также задействовал vsketch.
Вместо того чтобы вручную выгружать слои, фильтровать теги дорог, рек и зданий, настраивать проекции и возиться со стилями осей в matplotlib, вы передаете адрес или координаты и получаете готовый рисунок.
Быстрый старт выглядит буквально так:
import prettymaps
plot = prettymaps.plot('Stad van de Zon, Heerhugowaard, Netherlands')
Один вызов функции скачивает данные нужного района, нарезает слои и строит график.
Как настроить карту под себя
Вся гибкость библиотеки раскрывается в тонких настройках функции prettymaps.plot().

Вот параметры, с которыми приходится работать чаще всего:
- layers определяет словарь слоев из OpenStreetMap. Здесь задаются теги, по которым отбираются объекты: водные ресурсы (
natural: water), здания (building: True), парки, улицы разных категорий или железнодорожные пути. - style задает правила отрисовки для каждого слоя. Сюда передаются привычные параметры matplotlib: цвет заливки (
fc), цвет обводки (ec), толщина линий (lw) и готовые цветовые палитры (palette). - circle, radius и dilate управляют границами холста. Можно обрезать карту идеальным кругом заданного радиуса в метрах или оставить прямоугольную область.
- preset загружает готовые конфигурации стилей (например,
default,minimal,macaoилиtijuca), чтобы не собирать цветовую схему с нуля.
Пример настройки конкретной локации:
plot = prettymaps.plot(
'Praça Ferreira do Amaral, Macau',
circle=True,
radius=1100,
layers={
"water": {"tags": {"natural": ["water", "bay"]}},
"building": {"tags": {"building": True}},
},
style={
"water": {"fc": "#a1e3ff", "ec": "#2F3737"},
"building": {"palette": ["#FFC857", "#E9724C", "#C5283D"]},
},
)
Результат работы функции возвращается в виде объекта датакласса Plot. Внутри лежат геодатафреймы каждого слоя (geodataframes), а также ссылки на объекты fig и ax из matplotlib. Это удобно, если вы захотите добавить поверх свои аннотации, маркеры или подписи стандартными методами питоновской графики.
Как запустить без написания кода
Если лень писать код или хочется быстро пощелкать палитры для разных городов, в репозитории есть готовый веб-интерфейс на streamlit.
Установка пакета:
pip install prettymaps
Запуск интерфейса:
streamlit run app.py
Для интерактивных экспериментов автор подготовил ноутбук под marimo (современная замена Jupyter). Его можно открыть локально командой marimo edit notebooks/tutorial.py или сразу запустить в Google Colab по ссылке из документации.

Зачем это нужно на практике
Первое применение, которое приходит в голову, генеративное искусство и мерч. Карты родных городов, районов или памятных мест в минималистичном стиле отлично подходят для постеров, открыток и футболок. Поскольку под капотом есть поддержка выгрузки векторных контуров, графику можно отправлять на перьевые плоттеры (pen plotters) и граверы.
Второй сценарий, оформление отчетов и презентаций. Если вы делаете урбанистическое исследование, анализируете транспортную доступность или готовите дашборд по недвижимости, стандартные тайлы карт часто выглядят перегруженными. Здесь же можно оставить только контуры кварталов и водоемов, раскрасив их строго в фирменные цвета бренда.
Лицензия и нюансы
У проекта есть пара моментов, о которых стоит знать до внедрения.
Код распространяется под лицензией GNU AGPL v3.0. Это накладывает обязательства: если вы используете библиотеку на бэкенде сетевого сервиса, придется открыть исходники этого сервиса.
При экспорте изображений нужно сохранять атрибуцию OpenStreetMap и самого репозитория, это прямое требование лицензии геоданных. Автор репозитория также принципиально выступает против использования своего генератора для продажи NFT и отдельно акцентирует на этом внимание в README.
Стоит ли пробовать
Библиотека отлично справляется со своей задачей. Если вам когда-нибудь требовалось сделать красивую схему города без ручной возни в Illustrator или QGIS, prettymaps сэкономит несколько часов работы.
Для старта достаточно установить пакет через pip и прогнать пару примеров из Colab. Проект работает с Python 3.11+, стабильно стягивает данные через API OSM и выдает предсказуемый результат.
