
Привет, я Александр Мещеряков, более 3-х лет работаю в компании «Синимекс» специалистом по анализу данных. Мне удалось поработать с различными ML-проектами, и больше всего меня увлекла работа с геоданными. Для многих эта тема кажется немного «магией» и я хотел бы на страницах Хабра пролить на нее немного света.
Геопространственная обработка признаков. Часть 1: основы работы с геоданными.
Основная задача обработки признаков — преобразовать данные в числовой вид, потому что ML-модели могут работать только с числами. Геопространственный контекст добавляет слои смысла: например, расположение кафе в центре города или на окраине может влиять на посещаемость сильнее, чем его меню. Представьте, что моделируете спрос на такси — координаты точек подачи станут важнее времени суток, если рядом метро закрывается на ремонт.
Эта статья — как шпаргалка для шеф-повара: берите готовые рецепты под ваши задачи. Здесь вы найдёте ключевые библиотеки (geopandas, h3-py) и принципы работы с геоданными — от парсинга OpenStreetMap до агрегации по шестиугольникам. И да, мы обойдёмся без воды: только кейсы и термины.
Геоданные с нуля: как найти хороший источник данных?
Первое правило геопространственного анализа: «Мусор на входе — мусор на выходе». Готовые датасеты с Kaggle или Google Dataset Search подходят для учебных проектов, но в продакшене часто нужны кастомизированные данные.

Рассмотрим варианты:
-
OpenStreetMap (OSM) — «Википедия карт» с открытым исходным кодом. Для небольших задач (до 5000 объектов) используйте OSM API.
-
Нужен полный дамп? Качайте региональные сборки с Geofabrik и загружайте в PostGIS. Но помните: OSM зависит от пользовательского ввода — иногда метки зданий путают с парковками, а многоугольники имеют дыры.
-
Яндекс.Карты идеальны для постсоветского пространства: детализация дорог и маршрутов здесь выше, чем в OSM. Но бесплатный API обязывает показывать логотип и ограничивает 1 000 запросов в сутки — для ETL-пайплайнов это не вариант.
-
Google Maps — лидер глобального покрытия. Он предоставляет бесплатные инструменты для визуализации с использованием 3D-карт, но платные тарифы на геокодирование (от $5 за 1000 запросов) быстро «съедят» бюджет.
Растр vs Вектор
Геопространственные данные делятся на два принципиально разных типа: растровые и векторные.
Спутниковые снимки (растр) полезны для анализа землепользования, но требуют навыков компьютерного зрения. Векторные данные (точки, линии, полигоны) гибче: их можно агрегировать, фильтровать и комбинировать. Например, формат WKT (Well-Known Text) кодирует координаты как POINT(долгота широта) — обратите внимание на порядок, это частая ошибка новичков.
Пример: Кофеен в OSM может не хватать, но вы можете дополнить данные парсингом Google Places API — если готовы платить за каждый запрос.
Помимо спутниковых снимков, растровые, они же «пиксельные», данные — это температурные карты в инфракрасном спектре или даже карты светового загрязнения (индикатор урбанизации региона). Каждый пиксель здесь имеет значение — например, яркость ночного неба или температуру поверхности. Технически их можно конвертировать в векторные полигоны, но такой подход требует ресурсоёмких вычислений — будьте готовы к CSV-файлам астрономических габаритов.
Векторные данные — это «цифровой LEGO»: точки (POINT), линии (LINESTRING) и полигоны (POLYGON), описанные координатами. Стандарты WKT2 (Well-Known Text) и его бинарная версия WKB — основа GeoJSON и PostGIS.

Внимание: в WKT координаты записываются как (долгота, широта), что часто становится подводным камнем для новичков (вечная путаница с порядком).
Типы геометрий в WKT: от точек до коллекций
В WKT геометрии делятся на простые (примитивы) и комплексные (композиции). Начнём с базовых элементов.
Точки
Обозначаются как POINT(долгота широта) — идеальны для объектов без площади: парковок, кафе, станций метро. Например, координаты билетных киосков Русского музея можно представить, как набор точек.

Линии
Формат LINESTRING(x1 y1, x2 y2, …) описывает линейные объекты: дороги, реки, границы районов. Контур площади Искусств в Петербурге — типичный пример LINESTRING.

Полигоны
Записываются как POLYGON((x1 y1, x2 y2, …, x1 y1), (x1 y1, x2 y2 …, x1 y1)).

Первый набор точек задаёт внешний контур (обязательно замкнутый), последующие — внутренние «дыры». Например, здание Русского музея описывается полигоном с координатами по часовой стрелке, где первая и последняя точки совпадают. Нарушение этого правила вызовет ошибку валидации — как забыть закрыть тег в HTML.


Композитные геометрии: когда примитивы объединяются в суперструктуры
Геометрии уровня «про» — это композиты из базовых примитивов WKT. Их синтаксис похож на Lego: те же кирпичики, но с возможностью создавать многоуровневые конструкции:
● MULTIPOINT — россыпь несвязанных точек. Формат: MULTIPOINT((x1 y1), (x2 y2)). Пример: сеть ATM-терминалов в городе.
● MULTILINESTRING — наборы линейных сегментов. Синтаксис: MULTILINESTRING((x1 y1, x2 y2), (x3 y3, x4 y4)). Используется для дорог с разрывом (как мост через реку) или веток метро.
● MULTIPOLYGON — матрёшка полигонов. Формат: MULTIPOLYGON(((x1 y1, x2 y2 …)), ((x1 y1, …))). Обязательный формат для границ стран с эксклавами: например, Калининградская область как часть РФ требует отдельного полигона внутри основного контура.
● GEOMETRYCOLLECTION — «чёрный ящик» геоданных. Может содержать микс из точек, линий и полигонов:
GEOMETRYCOLLECTION(POINT(…), POLYGON(…)). Представьте коробку из «Пикника на обочине», где детали от замка, космического корабля и фермерского домика перемешаны. Технически возможно, но на практике — ад для парсинга. Рекомендация: избегайте коллекций там, где можно обойтись типовыми структурами.
Рекомендация: если ваш геообъект выглядит как швейцарский нож — скорее всего, это GEOMETRYCOLLECTION. Пересмотрите логику агрегации данных.
Геокодирование: от текста к координатам и подводные камни
Современные геопространственные данные редко представлены в «чистом» виде координат — чаще мы имеем дело с текстовыми адресами, которые требуют преобразования в геометрические объекты. Этот процесс, известный как геокодирование, превращает, например, «Санкт-Петербург, ул. Ташкентская, д. 4» в точку с широтой и долготой.

Открытым стандартом в этой области считается Nominatim — геокодер на основе данных OpenStreetMap (OSM) с ограничением в 1 запрос/секунду для публичного API. Для серьёзных проектов можно развернуть локальную версию Nominatim, но это потребует 128 ГБ ОЗУ, 1 ТБ дискового пространства и 7-8 дней на импорт данных OSM — идеальный повод пересмотреть своё отношение к облачным решениям.
Коммерческие альтернативы вроде ArcGIS Geocoder предлагают пакетную обработку до 16 параллельных запросов с детальной географической покрытием для 100+ стран. Mapbox предоставляет бесплатный тариф до 100К запросов, но с нюансом: сохранение результатов требует подключения Permanent Geocoding API — своеобразный DLC для разработчиков.
Интересно, что качество геокодирования может варьироваться даже у топовых сервисов: например, OSM иногда содержит ошибки маркировки объектов, а коммерческие решения вроде ArcGIS демонстрируют лучшую точность для специфических регионов. При выборе инструмента стоит учитывать не только стоимость, но и требования к частоте запросов, объёмам данных и географической специфике.
Координаты как пространственные маркеры: сила и границы применения
Координаты объектов могут стать мощным признаком для моделей машинного обучения — особенно при работе с нейросетями, деревьями решений или нелинейными алгоритмами, способными улавливать сложные пространственные паттерны. Например, южные регионы Финляндии концентрируют 84% населения страны благодаря мягкому климату, тогда как северные территории остаются малонаселёнными. В Объединённых Арабских Эмиратах координаты городов на побережье Персидского залива (например, Дубай) тесно связаны с экономической активностью, тогда как 92% территории страны занимают пустыни.

Но пространственные корреляции не ограничиваются социально-экономическими показателями. Распространение малярии привязано к экваториальным зонам — баланс температуры, влажности и растительности в Африке, Южной Америке и Южной Азии создаёт идеальные условия для комаров-переносчиков.
Однако есть нюансы:
-
Координаты дают глобальный контекст, но игнорируют локальные особенности: широта/долгота не объяснят, почему конкретный квартал Дубая стал деловым центром.
-
Для алгоритмов типа линейной регрессии «сырые» координаты бесполезны — требуется преобразование в расстояния, кластеры или полиномиальные признаки.
-
Любопытное наблюдение: модель на основе координат предскажет расположение города в пустыне ОАЭ, но не объяснит, почему он возник именно там — для этого нужны данные о запасах нефти и логистике портов.
Геометрические признаки: от прямоугольников до ориентации
Формы объектов содержат кладезь информации для моделей машинного обучения. Даже без меток можно распознать тип здания: частные дома редко выходят за пределы 600 м² и имеют квадратные контуры, склады — это гигантские прямоугольники, а современные больницы часто напоминают букву X — например, как легендарный Королевский госпиталь в Мельбурне.
Интересный факт: почему именно современные больницы? Всё просто: до антибиотиков больницы строили отдельными павильонами, чтобы не распространять инфекцию среди пациентов.
Приведём ключевые подходы к работе с геометрическими признаками:
-
Ограничивающий прямоугольник (Bounding Rectangle)
Базовый метод — найти минимальные/максимальные координаты объекта (экстремальные точки) и построить по ним прямоугольник-«оболочку». Однако он игнорирует ориентацию — для точного учёта используется минимальная ориентированная оболочка (Minimum Bounding Rectangle, MBR), которая вращается вместе с полигоном. Кстати, MBR может выродиться в линию для отрезка или точку для единственного координатного пикселя. -
Минимальная ограничивающая окружность
Полезная альтернатива прямоугольникам — окружность, полностью охватывающая объект. Для анализа можно использовать её радиус, длину окружности (2πr) или площадь (πr²). -
Соотношение сторон — отношение ширины к высоте минимального ограничивающего прямоугольника (Bounding Box). Для ориентационно скорректированного анализа используйте ориентированные оболочки (Minimum Oriented Bounding Box), которые автоматически поворачиваются вместе с объектом.
Пример: для вытянутой речной долины соотношение достигает 10:1, тогда как городской квартал может иметь 1.2:1. (Лайфхак: чтобы отсечь артефакты вроде «нитевидных» полигонов, фильтруйте объекты с соотношением >50:1). -
Площадь полигона. Площадь объекта — базовый, но информативный признак, который можно комбинировать с другими метриками. Например, отношение площади к периметру (APR = Area/Perimeter) выше для крупных округлых форм. Интересный факт: круг имеет максимальное APR среди всех геометрических фигур, что делает это соотношение полезным индикатором «округлости».
-
Площадь выпуклой оболочки. Выпуклая оболочка (convex hull) — минимальный выпуклый многоугольник, содержащий все точки объекта. Её площадь всегда ≥ исходной площади. Пример: для фигуры в форме буквы «П» выпуклая оболочка превратит её в полный круг, игнорируя вогнутость.

-
Плотность (solidity) — отношение площади объекта к площади его выпуклой оболочки. Идеальный индикатор вогнутости: 1 для выпуклых форм, <1 для объектов с «выемками». Для расчёта в коде: solidity = polygon_area / convex_hull_area. Противоположный параметр — дефект выпуклости (1 – solidity).
-
Протяжённость (extent) — отношение площади полигона к площади минимального ограничивающего прямоугольника (MBR). В отличие от плотности, которая сравнивает площадь с выпуклой оболочкой, протяжённость проще вычислить: прямоугольные объекты будут иметь значение 1, а для круга с MBR размером 2r×2r коэффициент составит (πr²)/(4r²) ≈ 0.785. На практике этот признак помогает быстро идентифицировать «квадратные» геометрии: например, административные границы городов России часто формируют вытянутые прямоугольники из-за межевания по параллелям и меридианам.
-
Ориентация полигона определяется как угол между его самой длинной стороной (major axis) и направлением на восток (параллель экватора). Значение угла варьируется от 0° до 180°, и при работе с ориентированным прямоугольным контуром (minimum bounding rectangle) важно заранее определить стратегию для объектов с равными сторонами. В таких случаях можно задать приоритет для первой зафиксированной стороны или добавить флаг is_square для маркировки квадратных форм — это поможет избежать ошибок в алгоритмах классификации форм.

Резюме
Мы разобрали ключевые концепции работы с геоданными в Python. Вы узнали про:
– источники данных: открытые API (OpenStreetMap, Google Maps), специализированные форматы вроде WKB и WBT;
– типы данных: растровые (пиксельные сетки) и векторные (точки, линии, полигоны), включая их представление в формате Well Known Text (WKT). Например, POLYGON ((30 10, 40 40, 20 40, 10 20, 30 10)) описывает четырехугольник;
– базовые пространственные признаки: площадь полигона, длина линии, расстояние между точками (подробнее о нём мы поговорим в следующей статье) — всё, что можно вычислить «в лоб» средствами GeoPandas;
– геокодирование: преобразование адресов в координаты через библиотеки типа geopy или сервисы вроде Google Maps API.
В следующих статьях вас ждёт:
1. Пространственные объединения:не просто SQL-джойны, а анализ отношений типа «пересекает», «содержит», «граничит» и т. п.;
2. Метрики расстояний: от плоского Евклида до геодезических расчётов на сфере (формула гаверсинусов) и маршрутов через OSRM/Google Maps;
3. Системы координат: почему WGS84 подходит не для всех задач, и как избежать ошибок вроде «Москва-Сочи в 2D ближе, чем Москва-Берлин».
Подписывайтесь на блог компании «Синимекс» на Хабр, чтобы знать, как вычислять расстояние для ваших моделей точнее GPS-трекера в смартфоне.
Автор: rolling_meaning