Как описать широту от минус девяносто градусов
Что проверяют
Формулировка размытая, и интервьюер ждёт, что вы уточните задачу, а затем покажете, как описать широту в коде, чтобы некорректное значение туда не попало. Следом обычно спрашивают про долготу и порядок координат в форматах и базах.
Как отвечать
Предметная часть. Широта отсчитывается от экватора: 0 на экваторе, 90 на Северном полюсе, -90 на Южном. Отрицательное значение означает южное полушарие, -33.87 это то же, что 33.87° ю. ш. Границы включительные, а на полюсах долгота теряет смысл: все меридианы сходятся в точке.
Дальше Python:
- pydantic v2:
Latitude = Annotated[float, Field(ge=-90, le=90)], проверка срабатывает при создании модели. Готовые типыLatitudeиLongitudeесть в пакетеpydantic-extra-types; - dataclass:
@dataclass(frozen=True)с проверкой в__post_init__иValueErrorпри выходе за диапазон; NewType: только метка для тайпчекера, в рантайме ничего не проверяет;- точность: градус широты около 111 км, шестой знак после запятой даёт порядка 11 см. Обычно хватает
float.
Проверку пишите в прямом виде -90 <= lat <= 90: такое сравнение заодно отсекает NaN, а вариант not (lat < -90 or lat > 90) его пропустит. Долгота живёт от -180 до 180 и при выходе за границу заворачивается (190 превращается в -170). Широту заворачивать нельзя, значение 95 это ошибка данных. В PostGIS координаты обычно хранят в geography(Point, 4326), то есть в системе WGS 84.
Где спотыкаются
Путают порядок координат. В GeoJSON и в ST_MakePoint сначала долгота, потом широта, а люди и многие картографические API пишут наоборот. Точка уезжает на другой конец Земли или выходит за диапазон.
Неправильно переводят градусы с минутами: 33°52′ ю. ш. это -(33 + 52/60), а не -33 + 52/60. Во втором случае выходит -32.13 вместо -33.87.
Заворачивают широту как долготу или молча обрезают до 90. Значение за пределами диапазона почти всегда означает перепутанные поля или битый источник, его стоит отклонить с понятной ошибкой.