UTM и выбор проекции под задачу

Урок про практический выбор проекции: почему для точных измерений берут локальные метровые зоны вроде UTM, а для хранения — градусы WGS84.

UTM (Universal Transverse Mercator) — система, которая делит Землю на 60 узких зон по долготе и проецирует каждую отдельно, чтобы искажения внутри зоны были минимальны.

Глобальный Меркатор удобен для целой планеты, но плох для точных измерений в конкретном городе. Идея UTM: раз искажения растут с удалением от линии касания, давайте разрежем Землю на узкие вертикальные дольки и каждую спроецируем со своей осью. Внутри одной зоны искажение масштаба меньше $0{,}1\%$ — этого хватает для инженерии, кадастра и строительства.

Как устроены зоны

Земля делится на 60 зон по $6°$ долготы каждая, пронумерованных с запада на восток. Зона 1 начинается на $180°$ западной долготы; зона 30 примыкает к Гринвичу. Москва ($37.6°$ в.д.) попадает в зону 37. Внутри зоны координаты задаются в метрах: easting (на восток) и northing (на север). Чтобы не было отрицательных значений, центральному меридиану присваивают easting $500000$ м — это «ложный восток».

def utm_zone(lon_deg):
    # Номер зоны UTM по долготе
    return int((lon_deg + 180) / 6) + 1

for city, lon in [("Лондон", -0.13), ("Москва", 37.62),
                  ("Новосибирск", 82.93), ("Владивосток", 131.89)]:
    print(f"{city:12}: зона {utm_zone(lon)}")

Вывод:

Лондон      : зона 30
Москва      : зона 37
Новосибирск : зона 44
Владивосток : зона 52

Правило выбора проекции

На практике действует простое правило двух режимов:

ЗадачаЧто брать
Хранить и обмениваться даннымиWGS84 в градусах (EPSG:4326)
Показывать веб-картуWeb Mercator (EPSG:3857)
Измерять расстояния и площади в регионелокальная UTM-зона (метры)
Статистика по площадям (вся страна)равновеликая проекция

Ключевая мысль: измерять в градусах нельзя. Градус долготы на экваторе — это около 111 км, а у полюса — почти ноль. Поэтому, чтобы корректно посчитать площадь поля или длину дороги, данные сперва перепроецируют в метровую систему (UTM), и уже там геометрия работает в честных метрах.

Как работает под капотом

UTM — это поперечная (transverse) версия Меркатора: цилиндр касается Земли не по экватору, а по выбранному меридиану зоны. Полная формула перевода широты-долготы в easting-northing громоздка (ряды по эксцентриситету эллипсоида), поэтому её всегда берут из библиотеки — pyproj в Python. В коде это выглядит как создание «трансформера» между EPSG-кодами:

from pyproj import Transformer

# из WGS84 (градусы) в UTM зону 37N (метры)
tr = Transformer.from_crs("EPSG:4326", "EPSG:32637", always_xy=True)
easting, northing = tr.transform(37.6173, 55.7558)
# теперь можно честно мерить метры

Частые ошибки

  • Считать площадь в градусах. Получится бессмысленное число «квадратных градусов»; сначала перепроецируйте в метры.
  • Взять чужую UTM-зону. Объект из зоны 37 в координатах зоны 38 сместится на километры.
  • Хранить данные сразу в проекции города. Храните в WGS84, проецируйте под конкретную задачу — так данные переносимы.

Дисциплина систем координат

Если выделить одну привычку, отличающую зрелого ГИС-специалиста, это дисциплина в обращении с системами координат. Правило простое и почти всегда верное: храни в WGS84, показывай в Web Mercator, измеряй в локальной метровой проекции. Нарушение любого из трёх пунктов — источник самых коварных багов, потому что они не вызывают ошибок и падений, а тихо дают неправильные числа. Слой в неверной зоне просто ляжет на карту со смещением в километры; площадь, посчитанная в градусах, выдаст правдоподобное на вид, но бессмысленное число. Эти ошибки переживают код-ревью и всплывают уже в отчёте перед заказчиком.

UTM в этой схеме отвечает за «измеряй». Выбор правильной зоны критичен: объект из 37-й зоны, истолкованный как координаты 38-й, уедет на километры, поэтому зону всегда выбирают по долготе центра данных, а для регионов на стыке зон берут ту, что покрывает большую часть. Для очень больших территорий (вся страна) одной UTM-зоны не хватает, и переходят к равновеликим проекциям, заточенным под площади. На практике все эти перепроекции делает одна функция ST_Transform в PostGIS или to_crs в geopandas — но решение, в какую систему проецировать под конкретную задачу, остаётся за вами, и оно важнее, чем умение вызвать функцию.

Итог

  • UTM режет Землю на 60 зон по 6°, в каждой искажение меньше 0,1%.
  • Координаты UTM — метры (easting, northing), удобны для измерений.
  • Храните в градусах WGS84, измеряйте в метрах UTM.
  • Полную формулу UTM берут из библиотеки (pyproj), а не пишут руками.
Проверьте себя
1. Зачем UTM делит Землю на узкие зоны?
AЧтобы карты были красивее
BЧтобы внутри каждой зоны искажения были минимальны (меньше 0,1%)
CЧтобы уместить больше цветов
DЭто требование GPS
2. В каких единицах заданы координаты внутри зоны UTM?
AВ градусах
BВ метрах (easting, northing)
CВ пикселях
DВ морских милях
3. Почему нельзя считать площадь поля прямо в градусах WGS84?
AМожно, разницы нет
BГрадус долготы на разных широтах соответствует разному числу метров
CГрадусы не числа
DPython не умеет умножать градусы