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), а не пишут руками.