Неправильный вычисленный азимут для географических координат с использованием Apache Sedona в Spark

Я запускаю приложение Spark, используя Apache Sedona.

Я пытаюсь вычислить пеленг/азимут между двумя координатами, используя следующий скрипт:

import org.apache.sedona.sql.utils.SedonaSQLRegistrator
SedonaSQLRegistrator.registerAll(spark)

spark.sql("SELECT DEGREES(ST_AZIMUTH(ST_POINT(9.942731, 57.042649), ST_POINT(9.940315, 57.04348))) AS azimuth").show

В результате 288 градусов:

scala> spark.sql("SELECT DEGREES(ST_AZIMUTH(ST_POINT(9.942731, 57.042649), ST_POINT(9.940315, 57.04348))) AS azimuth").show
+-----------------+
|          azimuth|
+-----------------+
|288.9810116333513|
+-----------------+

Проблема в том, что когда я пытаюсь проверить подшипник с помощью нескольких онлайн-инструментов, таких как, например. https://www.sunearthtools.com/tools/distance.php, все они вычисляют угол до 302 градусов. Поскольку все веб-инструменты соглашаются, я предполагаю, что Sedona неправильно вычисляет угол.

Итак, я ожидал, что результат будет 302 градуса, а получил 288.

Может ли кто-нибудь увидеть, сделал ли я ошибку, как ее исправить, или есть ли проблема с вычислениями Sedona?

Версии: Скала: 2.11 Искра: 2,4 Седона: 1.2.1-инкубационный jts-ядро: 1.19.0 геоинструменты-обертка: 1.1.0-25.2

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
110
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Седона предполагает евклидову геометрию (т.е. плоскую плоскость для двумерных координат). Таким образом, он предоставляет азимут сетки, который является арктангенсом разницы координат (также внесены некоторые корректировки, чтобы не иметь отрицательных результатов):

ST_AZIMUTH(ST_POINT(9.942731, 57.042649), ST_POINT(9.940315, 57.04348)) == ATAN2(57.04348 - 57.042649, 9.940315 - 9.942731)

Размещенный вами справочный веб-сайт вычисляет геодезический азимут (с идеальной сферой). Эта функциональность в настоящее время не предоставляется в Sedona.

Чтобы ответить на ваши вопросы:

  1. Единственная ошибка, которую вы, возможно, допустили, это сравнение геодезических и координатных азимутов.
  2. Вы можете осуществить геодезический расчет по предоставленной вами ссылке. Это будет грязно, но просто. Я бы, вероятно, сделал это поэтапно: сначала создал столбцы для X и Y, а затем сделал окончательный расчет.
  3. Насколько я вижу, в расчетах Седоны нет никаких проблем. Это текущий метод расчета при последнем коммите на момент написания этого: ссылка

Кроме того, вот ссылка с некоторыми хорошими иллюстрациями разницы между геодезическим азимутом и азимутом сетки: https://www.e-education.psu.edu/geog862/node/1816

Спасибо за ваше объяснение! Это имеет смысл. Я попытаюсь найти другой модуль, который может выполнять нужные мне вычисления.

Christian Schou Jødal 06.02.2023 14:17

Другие вопросы по теме