Geodesy
Geodesy — это пакет Julia для работы с точками в различных мировых и местных системах координат. Главное преимущество пакета Geodesy заключается в возможности определять и выполнять преобразования координат на удобной и безопасной платформе с использованием пакета CoordinateTransformations. Преобразования производятся очень точно и эффективно, причем реализованы они в виде собственного кода Julia (многие функции портированы из библиотеки GeographicLib Чарлза Карни (Charles Karney) на C++). Кроме того, для удобства предоставляются некоторые стандартные геодезические датумы.
Быстрое начало работы
Давайте определим трехмерную точку по ее широте, долготе и высоте (ШДВ):
x_lla = LLA(-27.468937, 153.023628, 0.0) # Здание мэрии, Брисбен, Австралия
Ее можно преобразовать в декартовы геоцентрические координаты, связанные с Землей (ECEF), просто вызвав конструктор:
x_ecef = ECEF(x_lla, wgs84)
Здесь для расчета преобразования мы использовали эллипсоид WGS-84, но доступны и другие датумы, такие как osgb36
, nad27
и grs80
. Все преобразования используют интерфейс CoordinateTransformations, и приведенный выше вызов является краткой формой для следующего:
x_ecef = ECEFfromLLA(wgs84)(x_lla)
где ECEFfromLLA
— это тип, наследуемый от типа Transformation
в CoordinateTransformations. (Для каждого типа координат имеются схожие имена XfromY
.)
Иногда точки требуется измерять в местной системе, например в координатах «север, восток, высота», относительно заданной точки отсчета. Тип ENU
представляет точки в этой координатной системе, и мы можем выполнять преобразование между ENU и координатами с глобальной привязкой с помощью ENUfromLLA
и т. д.
origin_lla = LLA(-27.468937, 153.023628, 0.0) # Здание мэрии, Брисбен, Австралия
point_lla = LLA(-27.465933, 153.025900, 0.0) # Главный вокзал, Брисбен, Австралия
# Определяем преобразование и выполняем его
trans = ENUfromLLA(origin_lla, wgs84)
point_enu = trans(point_lla)
# То же самое
point_enu = ENU(point_lla, origin_lla, wgs84)
Аналогичным образом можно выполнить преобразование в координаты UTM/UPS, и для этого есть два типа: UTM
хранит трехмерные координаты (x
, y
и z
) без указания зоны, а UTMZ
включает в себя номер зоны (zone
) и логическое значение hemisphere
(true
= север, false
= юг). Для получения канонической зоны для координат достаточно следующего выражения.
x_utmz = UTMZ(x_lla, wgs84)
При преобразовании большого количества точек в заданную зону или наоборот более эффективным подходом может быть определение преобразования явным образом и использование более легкого типа UTM
для хранения данных.
points_lla::Vector{LLA{Float64}}
utm_from_lla = UTMfromLLA(56, false, wgs84) # Зона 56-юг
points_utm = map(utm_from_lla, points_lla) # Новый вектор для координат UTM
Пакет Geodesy особенно эффективен при сцеплении преобразований. Например, можно определить единственное преобразование данных на диске в координатах UTM в местную систему в координатах ENU. На внутреннем уровне это происходит так: UTM (+ зона) → LLA → ECEF → ENU, путем составления преобразований с помощью ∘
в ComposedTransformation
:
julia> origin = LLA(-27.468937, 153.023628, 0.0) # Здание мэрии, Брисбен, Австралия
LLA(lat=-27.468937°, lon=153.023628°, alt=0.0)
julia> trans = ENUfromUTMZ(origin, wgs84)
(ENUfromECEF(ECEF(-5.046925124630393e6, 2.5689157252069353e6, -2.924416653602336e6), lat=-27.468937°, lon=153.023628°) ∘ (ECEFfromLLA(wgs84) ∘ LLAfromUTMZ(wgs84)))
Это преобразование затем можно составить с помощью поворотов и преобразований в CoordinateTransformations (или собственное пользовательское преобразование AbstractTransformation
для определения других систем координат). Например, точку, положение которой в определенный момент времени измеряется сканером на движущемся транспортном средстве, таким образом можно привязать географически в глобальном масштабе с помощью единственного вызова Transformation
!
Наконец, декартово расстояние между мировыми точками можно вычислить путем автоматического преобразования в декартову систему координат:
x_lla = LLA(-27.468937, 153.023628, 0.0) # Здание мэрии, Брисбен, Австралия
y_lla = LLA(-27.465933, 153.025900, 0.0) # Главный вокзал, Брисбен, Австралия
euclidean_distance(x_lla, y_lla) # 401,54 м
(при условии использования датума wgs84
, который можно настроить в distance(x, y, datum)
).
Основные термины
В этом разделе описываются некоторые термины и понятия, имеющие отношение к Geodesy.jl, с попыткой привлечь внимание к некоторым геодезическим терминам. Более развернутое и менее техническое обсуждение с дополнительной исторической справкой см. на странице ICSM Основы картографии.
Эталонные системы координат и идентификаторы пространственной привязки
Положение на поверхности Земли можно выразить через некоторые числовые значения координат, но без дополнительной информации они имеют мало смысла. Эта дополнительная информация называется эталонной системой координат (CRS) или системой пространственной привязки (SRS). CRS определяет два основных момента.
-
Процедуру измерения: какие реальные объекты использовались для определения системы отсчета или датума измерения?
-
Систему координат: как числовые значения координат связаны с системой отсчета, определяемой датумом?
Полная спецификация CRS может быть сложной, поэтому вместо нее обычно используется краткое обозначение, называемое идентификатором пространственной привязки или SRID. Например, EPSG:4326 — это один из способов обозначения двухмерной широты и долготы WGS84, которая может быть получена с помощью GPS-модуля мобильного телефона. SRID имеет формат AUTHORITY:CODE
, где CODE (код) — это число, а AUTHORITY (орган) — название организации, которая ведет список кодов со связанной информацией CRS. CRS можно получить с помощью ряда сервисов, например, http://epsg.io — это удобный интерфейс для SRID, который поддерживает организация European Petroleum Survey Group (EPSG). Существует также открытый реестр http://spatialreference.org, в который кто угодно может добавлять информацию.
При ведении пространственной базы данных обычно определяется внутренний список идентификаторов SRID (вследствие чего организация становится уполномоченным органом) и их сопоставление с информацией CRS. По возможности также включается ссылка на определенный SRID от внешнего органа.
Датумы
В контексте пространственного измерения и позиционирования датум — это набор ориентиров с заданными координатами, относительно которых можно определять положение других объектов. Например, при обычном межевании земли датум может представлять собой пару вбитых в землю колышек, находящихся друг от друга на тщательно измеренном расстоянии. При топографическом определении положения неизвестной точки, находящейся поблизости, угол относительно исходных объектов датума можно измерить теодолитом. После этого относительное положение новой точки можно измерить путем простой триангуляции. Если повторить этот прием с любой из трех уже известных точек, триангуляционную сеть промеряемых объектов можно расширить наружу. Когда любая точка промеряется относительно сети, говорят, что она измеряется в датуме исходных объектов. Датумы обычно обозначают сокращенно, например, OSGB36 расшифровывается как «Картографическое управление Великобритании, 1936 г.».
В эпоху спутниковой геодезии координаты объекта определяются с помощью сигналов времени от группировки спутников (например, спутников GPS), относительно которых вычисляется положение. Где здесь датум? На первый взгляд, ситуация отличается от традиционной, описанной выше. Однако положение спутников как функция времени (эфемериды) само должно определяться относительной некоторой системы координат. Для этого спутники постоянно отслеживаются рядом очень стабильных наземных станций, оснащенных приемниками GPS. Датум образует полный набор этих наземных станций и присвоенных им координат.
Давайте рассмотрим весь поток позиционной информации в обоих случаях:
-
При традиционной топографической съемке
datum object positions -> triangulation network -> newly surveyed point
-
В случае со спутниковой геодезией
datum object positions -> satellite ephemerides -> newly surveyed point
Как мы видим, суть датума не меняется, будь то традиционная топографическая съемка или съемка с помощью приемника GPS.
Земные системы координат
Координаты новых точек измеряются путем переноса координат с объектов датума, как было описано выше. Однако как определить координаты самих объектов датума? Это вопрос исключительно соглашения, согласованности и измерения.
Например, Международная система наземных координат (ITRS) — это система координат, которая вращается вместе с Землей, так что средняя скорость земной коры равна нулю. То есть в этой системе координат возможны только геофизические движения земной коры. Грубо говоря, соглашения об определении ITRS выглядят так:
-
Космос моделируется как трехмерное евклидово аффинное пространство.
-
Точка отсчета находится в центре масс Земли (является геоцентрической).
-
Ось Z — это ось вращения Земли.
-
Единицей масштаба является 1 метр СИ.
-
Ось X ортогональна оси Z и выровнена относительно международного нулевого меридиана, проходящего через Гринвич.
-
Осью Y является векторное произведение осей Z и X, благодаря чему образуется правосторонняя система координат.
-
Следует также задать различные скорости изменения приведенных выше элементов, например, масштаб должен оставаться постоянным во времени.
Соглашения полностью определены в главе 4 соглашений IERS, которые публикуются Международной службой вращения Земли (IERS). Эти соглашения определяют идеальную систему координат, но они бесполезны без физических измерений, с помощью которых находятся координаты набора реальных объектов датума. Процесс измерения и вычисления координат объектов датума называется реализацией системы координат, а результат — системой отсчета. Например, Международная система наземных координат 2014 года (ITRF2014) реализует соглашения ITRS посредством необработанных данных измерений, собранных в течение 25 лет до 2014 года.
Для измерения и вычисления координат применяется ряд методов космической геодезии, с помощью которых собираются необработанные данные измерений. В настоящее время IERS включает такие методы, как VLBI (интерферометрия со сверхдлинной базой) для удаленных астрономических источников радиоизлучения, SLR (спутниковая лазерная локация), GPS (система глобального позиционирования) и DORIS (сколько же сокращений). Необработанные данные существуют не в форме позиций: они должны сводиться к задаче масштабной подгонки, в идеале с обязательной физической и статистической согласованностью всех измерений в различных местах, которые связываются с помощью физических моделей.
Системы координат
В геометрии система координат — это система, которая предполагает использование одного или нескольких чисел (координат) с целью однозначного определения положения точки в математическом пространстве, например евклидовом. Например, в геодезии точку обычно определяют по геодезическим широте, долготе и высоте относительно заданного отсчетного эллипсоида; это называется геодезической системой координат.
Эллипсоид выбран по той причине, что это достаточно разумная модель для формы Земли и ее гравитационного поля и при этом не слишком сложная: она имеет лишь несколько параметров и простую математическую форму. Также применяется термин сфероид, поскольку используемые в настоящее время эллипсоиды осесимметричны относительно полюса. Обратите внимание, что определить широту на эллипсоиде можно несколькими способами. Наиболее естественной в геодезии является геодезическая широта. Она используется по умолчанию, поскольку ее можно физически определить в любом месте как хорошее приближение к углу между вектором силы тяжести и экваториальной плоскостью. (Данная широта не соответствует углу, измеренному в центре эллипсоида, что может показаться странным, если вы привыкли к сферическим координатам.)
Для одного и того же пространства обычно имеется несколько полезных систем координат. Помимо упомянутых выше геодезических координат, часто применяются следующие.
-
Компоненты x, y, z в геоцентрической декартовой системе координат, вращающейся вместе с Землей. Традиционно такая система называется геоцентрической системой координат, связанной с Землей (ECEF). Это естественная система координат для определения координат объектов датума, образующих систему наземных координат.
-
Компоненты «восток, север, высота» ENU декартовой системы координат в определенной точке на эллипсоиде. Такая система координат полезна в качестве локальной системы для навигации.
-
Компоненты «восток, север, вертикаль» спроецированной системы координат или картографической проекции. Таких координат множество, и все они служат для представления криволинейной поверхности эллипсоида посредством плоской карты.
В разных системах координат координаты одной и той же точки будут разными, поэтому очевидно, что необходимо указывать используемую систему. В частности, для широты и долготы следует указывать используемые параметры эллипсоида, так как, в принципе, эллипсоидов может быть несколько. Это вызывает путаницу, так как с датумом в геодезии традиционно связан отсчетный эллипсоид (поэтому такой датум называется геодезическим).
Помимо общепринятого эллипсоида, геодезический датум также определяет общепринятую геодезическую систему координат, вследствие чего сближаются связанные, но, по сути, отдельные понятия. Подчеркнем.
-
Система координат — это математическая абстракция, позволяющая производить операции с геометрическими величинами числовыми и алгебраическими методами. Сама по себе математическая геометрия — это чистая абстракция, не связанная с физическим миром.
-
Датум — это набор физических объектов со связанными координатами. Таким образом, он определяет физически измеримую систему отсчета. Датум — это мост, который соединяет физическую действительность с абстрактным идеалом математической геометрии посредством алгебраического механизма системы координат.
API
Типы координат
Пакет Geodesy предоставляет несколько встроенных типов для удобного и безопасного хранения координат. Замысел состоит в том, чтобы необработанные данные не приходилось хранить в универсальных контейнерах, таких как Vector
, по которым нельзя судить об используемой системе координат.
LLA{T}
— широта, долгота и высота
Глобальный тип LLA
предполагает хранение данных в порядке «широта, долгота, высота», где широта и долгота задаются в градусах (не радианах). Также имеется конструктор с именованными аргументами LLA(lat=x, lon=y, alt=z)
, который позволяет не запоминать порядок компонентов.
LatLon{T}
— широта и долгота
Двухмерный тип LatLon
предполагает хранение данных в порядке «широта, долгота», где широта и долгота задаются в градусах (не радианах). Также имеется конструктор с именованными аргументами LatLon(lat=x, lon=y)
. LatLon
в настоящее время является единственной поддерживаемой двухмерной координатой.
ECEF{T}
— геоцентрическая, связанная с Землей
В глобальном типе ECEF
декартовы координаты x
, y
, z
хранятся в соответствии с обычным соглашением. Будучи декартовой системой, ECEF
является подтипом типа StaticVector
из пакета StaticArrays, поэтому объекты данного типа поддерживают операции сложения и вычитания друг с другом или с другими векторами.
UTM{T}
— универсальная поперечная проекция Меркатора
Тип UTM
кодирует восточное положение x
, северное положение y
и высоту z
координаты UTM без указания зоны. Этот тип данных также применяется для кодирования координат в универсальной полярной стереографической проекции (UPS) (зона равна 0
).
UTMZ{T}
— универсальная поперечная проекция Меркатора с зоной
Помимо восточного положения x
, северного положения y
и высоты z
, глобальный тип UTMZ
также кодирует зону (zone
) и полушарие (hemisphere
) UTM, где zone
имеет значение UInt8
, а hemisphere
— значение Bool
для компактного хранения. Северное полушарие обозначается значением true
, а южное — значением false
. Зона 0
соответствует проекции UPS относительно соответствующего полюса; в противном случае zone
имеет целочисленное значение от 1
до 60
.
ENU{T}
— восток, север, высота
Тип ENU
служит для хранения локальной декартовой координаты и кодирует расстояние до точки в восточном направлении e
, северном направлении n
и по высоте u
относительно неуказанной точки отсчета. Как и ECEF
, ENU
является подтипом типа StaticVector
.
Геодезические датумы
Геодезические датумы моделируются как подтипы абстрактного типа Datum
. Соответствующий эллипсоид можно получить путем вызова функции ellipsoid()
, например ellipsoid(NAD83())
.
Имеется несколько предварительно определенных датумов. Мировые датумы:
-
WGS84
— стандартный датум GPS для работы с умеренной точностью (представляет как новейшую реализацию системы координат, так и, если указано время, разрывный динамический датум, в котором по времени находится дата реализации системы координат в транслируемых эфемеридах). -
WGS84{GpsWeek}
— конкретные реализации системы координат WGS84. -
ITRF{Year}
— реализации Международной системы наземных координат для топографической съемки с высокой точностью.
Государственные датумы:
-
OSGB36
— Картографическое управление Великобритании, 1936 г. -
NAD27
,NAD83
— североамериканские датумы за 1927 и 1983 год соответственно. -
GDA94
— геоцентрический датум Австралии, 1994 г.
Датумы можно также передавать в конструкторы преобразований координат, такие как поперечная проекция Меркатора и полярная стереографическая проекция. В этом случае связанный эллипсоид извлекается с целью формирования преобразования. Для датумов без лишних параметров (то есть всех датумов, кроме ITRF
и WGS84{Week}
) определен стандартный экземпляр, позволяющий сократить количество вводимых скобок. Например, LLAfromECEF(NAD83())
и LLAfromECEF(nad83)
эквивалентны.
Преобразования и конвертации
Пакет Geodesy предоставляет два интерфейса для изменения систем координат.
«Преобразования» основаны на интерфейсе CoordinateTransformations, позволяющем определять объекты AbstractTransformation
, которые пользователь может вызывать, обращать посредством inv()
и составлять посредством compose()
или ∘
. При преобразованиях все возможные предварительные вычисления кэшируются для повышения эффективности, когда одно и то же преобразование применяется ко множеству точек.
«Конвертации» основаны на конструкторах типов и имеют простой синтаксис, например LLA(ecef, datum)
. datum
и другая информация обязательны, так как пакет Geodesy не предусматривает допущений из соображений безопасности и согласованности. Аналогичным образом, функция Base.convert
не определена, потому что без допущений она потребовала бы дополнительной информации. Главный недостаток такого подхода заключается в том, что некоторые вычисления (например, точка отсчета при преобразовании ENU) могут не кэшироваться предварительно.
Между LLA
и ECEF
Преобразования LLAfromECEF
и ECEFfromLLA
требуют эллипсоидального датума для выполнения конвертации. Само преобразование выполняется в обоих направлениях с использованием преобразования ECEF → LLA из GeographicLib.
Обратите внимание, что в некоторых случаях, когда точки находятся очень близко к центру эллипсоида, решением задачи преобразования может быть множество эквивалентных точек LLA
. Здесь, как и в GeographicLib, выбирается точка с наибольшей высотой.
Между LLA
и UTM
/UTMZ
Преобразования LLAfromUTM(Z)
и UTM(Z)fromLLA
также требуют эллипсоидального датума для выполнения конвертации. При преобразовании сохраняется кэш использованных параметров, что в случае с поперечной проекцией Меркатора дает существенную экономию.
Во всех случаях зона 0
соответствует системе координат UPS, а для выполнения преобразования в Julia портирована полярная стереографическая проекция из GeographicLib.
Для поперечной проекции Меркатора и обратной ей проекции применяется приблизительное разложение 6-го порядка (хотя также определены порядки 4—8). Данный алгоритм портирован в Julia из GeographicLib и имеет точность порядка нанометров на расстоянии в несколько зон UTM от нулевого меридиана. Однако разложение в ряд дает отклонение ±90° от нулевого меридиана. В то время как методы UTMZ
автоматически выбирают каноническую зону и полусферу для входных данных, при выборе подходящей зоны для методов UTM
следует соблюдать предельную осторожность. (В будущем вы реализуем точное преобразование UTM в качестве резервного варианта и будем рады вашему участию!)
Есть также преобразования UTMfromUTMZ
и UTMZfromUTM
, которые помогают производить конвертацию между этими двумя форматами и помещать данные в одну зону UTM
.
В локальные системы ENU
и из них
Преобразования ECEFfromENU
и ENUfromECEF
определяют преобразование относительно заданной точки отсчета. Как координаты точки отсчета в виде ECEF
, так и соответствующие долгота и широта хранятся в преобразовании для максимальной эффективности при выполнении нескольких transform
. Преобразование можно обратить с помощью inv
. В этом случае будет выполнено обратное преобразование относительно той же точки отсчета.
Веб-проекция Меркатора
Мы поддерживаем веб-проекцию Меркатора (псевдопроекцию Меркатора) посредством преобразований WebMercatorfromLLA
и LLAfromWebMercator
с целью обеспечения совместимости со множеством картографических веб-систем. Масштаб северного и восточного положений определен в метрах на экваторе, так же как в proj (см. https://proj.org/operations/projections/webmerc.html).
Если вам необходимо работать с мозаичными картографическими веб-системами координат (уровни масштаба, координаты пикселей и т. д.), их можно добавить путем составления еще одного преобразования поверх веб-проекции Меркатора, определенной в этом пакете.
Составные преобразования
В качестве удобных конструкторов составных преобразований для перехода между любыми двумя определенными здесь типами координат существует множество других методов. К ним относятся следующие.
-
ECEFfromUTMZ(datum) = ECEFfromLLA(datum) ∘ LLAfromUTMZ(datum)
-
UTMZfromECEF(datum) = UTMZfromLLA(datum) ∘ LLAfromECEF(datum)
-
UTMfromECEF(zone, hemisphere, datum) = UTMfromLLA(zone, hemisphere, datum) ∘ LLAfromECEF(datum)
-
ECEFfromUTM(zone, hemisphere, datum) = ECEFfromLLA(datum) ∘ LLAfromUTM(zone, hemisphere, datum)
-
ENUfromLLA(origin, datum) = ENUfromECEF(origin, datum) ∘ ECEFfromLLA(datum)
-
LLAfromENU(origin, datum) = LLAfromECEF(datum) ∘ ECEFfromENU(origin, datum)
-
ECEFfromUTMZ(datum) = ECEFfromLLA(datum) ∘ LLAfromUTMZ(datum)
-
ENUfromUTMZ(origin, datum) = ENUfromLLA(origin, datum) ∘ LLAfromUTMZ(datum
-
UTMZfromENU(origin, datum) = UTMZfromLLA(datum) ∘ LLAfromENU(origin, datum)
-
UTMfromENU(origin, zone, hemisphere, datum) = UTMfromLLA(zone, hemisphere, datum) ∘ LLAfromENU(origin, datum)
-
ENUfromUTM(origin, zone, hemisphere, datum) = ENUfromLLA(origin, datum) ∘ LLAfromUTM(zone, hemisphere, datum)
Для них также предоставляются преобразования на основе конструкторов, например UTMZ(ecef, datum)
для промежуточного преобразования в LLA
. При конвертации нескольких точек в одну и ту же систему отсчета ENU в целях эффективности рекомендуется использовать подход на основе преобразований. Однако другие конвертации на основе конструкторов должны иметь одинаковое быстродействие с аналогами на основе преобразований.
Расстояние
В настоящее время единственной определенной мерой расстояния является прямая линия или евклидово расстояние, euclidean_distance(x, y, [datum = wgs84])
, которое подходит для всех сочетаний типов x
и y
за тем исключением, что для типов UTM
необходимо также указать зону UTM и полушарие, как в вызове euclidean_distance(utm1, utm2, zone, hemisphere, [datum = wgs84])
(декартово расстояние для типов UTM
не аппроксимируется, а получается путем конвертации в ECEF
).
В настоящее время это единственная функция в пакете Geodesy, которая принимает датум по умолчанию и должна быть относительно точной для близких точек, когда наиболее важны евклидовы расстояния. В дальнейшем больше внимания при разработке может быть уделено геодезии и связанным вычислениям (будем рады вашему участию).