Докуметация Cтарт Статьи Форум Лента Вход
Не официальное русскоязычное сообщество
Главная
    Документация jMonkeyEngine
        jMonkeyEngine Уроки и Документация
            Пользовательские Инструменты
                Введение в морскую навигацию

Введение в морскую навигацию

Опубликованно: 04.07.2017, 20:00
Последняя редакция, Andry: 07.07.2017 16:43

Следующий урок: Визуализация 3D-карт

В этой статье описывается инструмент проекция меркатора JME. Если вы не знаете, что это значит, мы предлагаем начать с чтения или просмотра Википедии. Если вы знаете, что такое проекция Меркатора, то наше «Введение в морскую навигацию» может помочь вам освежить ваш знания.

Википедия является источником приведенных здесь формул. Прочтите. Изучите это.

Термины, условное обозначения и определения карт определяются как «графические изображения зон Земли использующиеся в морской или воздушной навигации, для осуществления которой морские карты изображают особенности поверхности земли, представляющие особый интерес для мореплавателей [1].

Нулевой меридиан обозначается Гринвичский меридианом с 1884 года.

Расстояние обозначено в морских милях, где одна морская миля соответствует одной меридианной дуге (1852 метра) на экваторе.

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

назначение координат — определить точное положение на земле. Для целей этого проекта важны только широта и долгота, хотя читатель должен знать, что существуют другие системы координат, такие как UMT (Universal Transverse Mercator) и UPS (Universal Polar Stereographic).

Широта — это угловое расстояние от экватора, измеренное на север или на юг вдоль меридиана от 0◦ на экваторе до 90◦ на полюсах [1]. В пределах авиации и морского судоходства широта обозначается север (N) или юг (S), чтобы указать направление измерения. В равной степени допустимая нотация означает, что север (N) должен быть положительным, а юг (S) отрицательным. Например, 18◦ N становится 18, а 18◦ S становится -18. Долгота — это угловое расстояние между главным меридианом и меридианом точки на Земле, измеренное на восток или на запад от основного меридиана на 180 °. Он обозначается восточным (E) или западным (W), чтобы указать направление измерения [1], но похожее на угловые измерения экватора, может быть выражено через отрицательные (W) и положительные (S). Например, 18◦ E становится 18, а 18◦ W становится -18. Стоит отметить, что степени можно далее подразделить на минуты, при этом одна степень равна 60 минутам. Минуты в свою очередь подразделяются на секунды, в течение которых каждая минута равна 60 секундам. Поэтому координаты широты и долготы обычно определяются как градусы (◦), минуты (‘) и секунды («).

Например: 1◦ 2 ‘3 «W означает 1 градус, 2 минуты и 3 секунды на запад. Это, в свою очередь, может быть переведено в десятичную нотацию, в которой степени выражаются как десятичная дробь: поэтому 1◦ 2 ‘3 «W станет -1.034167. В качестве альтернативы эти угловые измерения могут быть преобразованы в радианы (в этом случае они будут выражаться как подписанная доля π). Разница широты между двумя местами — это угловая длина дуги любого меридиана между их параллелями. То есть, это числовое различие широт, если места находятся на одной стороне экватора или сумма широт, если точки находятся на противоположных сторонах экватора. [1]

Точно так же разница долготы между двумя местами — более короткая дуга параллельного или меньшего угла на полюсе между меридианами двух мест. Если оба места находятся на одной стороне (т.е. на востоке или западе) Гринвича, то разница долготы — это численное различие долготы двух мест; В противном случае разница долготы является их числовой суммой (если, конечно, это не превышает 180. В этом случае она равна 360◦ минус сумма).

globe_lat_long

Меридиональные части Как описано Bowditch, меридиональные части — это «единицы широты, которые были скорректированы для компенсации искажений, возникающих в результате проецирования трехмерного глобуса на двумерную карту Меркатора».

Подшипник В морской навигации подшипник определяется как «направление одного объекта от другого объекта, как правило, направление объекта от собственного судна». Обратите внимание, что это не следует путать с эквивалентным термином в авиации, поскольку подшипник относится к «фактическому (скорректированному) направлению компаса переднего хода летательного аппарата».

Заголовок и направление курса — это направление, в котором судно заострено и выражено в градусах от 0 до 359. Курс — это надземная трасса, в которой движется судно. С ветром, движением воды и ошибкой рулевого управления, курсом и курсом не обязательно равны.

Проекция Меркатора представляют собой стандарт в морских картах, представляющих собой линейные линии (a.k.a loxodromes) как прямые сегменты. Проекция меркатора имеет нелинейный масштаб, поскольку он учитывает искажение по широте, когда человек отходит от экватора и к полюсам (при этом полюса определяются как бесконечность. Это понятие показано справа на рис. 1.2). Эти искажения возникают из-за того, что земля является сплюснутым сферием, то есть сферой с плоской вершиной и дном (полюсами). Поэтому, когда человек отходит от экватора, морские метрики перегибаются до такой степени, что длина одной градуса широты вдоль полюсов покрывает примерно на 1 процент больше расстояния, чем на экваторе.

Проектирование карт

Проекция Меркатора определяется его меридианами и параллелями, оба из которых расширяются в равном соотношении с увеличением широты. Это расширение связано с искажением, которое возникает в результате проецирования сплющенного сфероида на двумерную поверхность (см. Вступительные примечания выше) и приравнивается к секущей широты в дополнение к поправке на это искажение. Заметим, что секущий 90◦ бесконечен, и поэтому проекции Меркатора не могут включать полюса (таким образом, проекция меркатора, используемая здесь, останавливается на 85 ° севернее и южнее экватора).

Линии резуса появляются как прямые.

Расчет проекции обрабатывается классом MapModel2D, в случае 2D и MapModel3D, в случае 3D-проекции. Принципиально обе проекции функционируют одинаково, с их единственными реальными отличиями в том, что MapModel3D вводит дополнительную координату (z) и замену метода toPixel () с помощью метода toWorldUnit (), который преобразует объект координат широты / долготы в (x , Y, z) в отличие от координат пикселя (x, y). Основная функциональность всей системы основана на точном преобразовании широты / долготы в пиксельные / мировые единицы и наоборот. Эти преобразования обрабатываются toPixel (), toWorldUnit () и toPosition () соответственно. Обратите внимание, что все плавания, используемые этим классом, находятся внутри класса NavCalculator и будут рассмотрены в следующем разделе этой главы.

Минуты на пиксель / Минуты на мировую единицу Количество пикселей или мировых единиц в минуту служит базой для всех преобразований координат и получается путем деления общего количества минут долготы, составляющих диаграмму (т.е. 360 * 60), на ширину Холст, на котором можно сделать проекцию (aka viewport): minutesPerPixel = (mapWidthInLongitude * 60) / (double) viewportWidth;

ToPixel В отличие от общепринятого, этот метод не получен из обратной функции Гудермана. Принимая набор координат широты / долготы, инкапсулированных в объект Position как параметр, метод возвращает эквивалентный пиксель (x, y), инкапсулированный как объект Point. Это преобразование можно суммировать следующим образом [2]:

  1. Элемент упорядоченного списка Получите расстояние между координатой долготы данной позиции и центром долготы графика.
  2. Преобразуйте полученное расстояние в пиксели, разделив его на количество пикселей, которые содержатся в течение одной минуты. Обратитесь к нему как distanceInPixels.
  3. Вычислите x-координату, вычитая или добавив ее в координату x-центра холста (координата x-центра холста — ширина холста, разделенная двумя) в зависимости от местоположения самой позиции и центра графика: Если диаграмма центрирована к западу от простого меридиана, и если положение, подлежащее преобразованию, находится к западу от центра, то полученная координата x представляет собой разницу между x-центром и расстояниемInPixels, полученными на шаге 2 выше. Если, однако, центр находится в западном направлении, а положение находится к востоку от центра, то результирующая координата x совпадает с суммой x-центра и его расстояния InPixels. Противоположное верно для восточного центра и положения к западу от этого центра или восточного центра и к востоку от этого центра.
  4. Элемент упорядоченного списка. Для y-координаты разница в меридиональных частях между центром широты диаграммы и широтой положения служит в качестве базовой линии. Преобразуйте разницу в пиксели, разделив ее на количество пикселей

В течение одной минуты. Обратитесь к нему как dmp1.

  1. Элемент упорядоченного списка Подобно шагу 3 выше, вычислите y-координату путем вычитания или

Добавив его в координату y-центра холста (холст ‘y-center — высота холста, деленная на два) в зависимости от местоположения самой позиции и центра диаграммы: То есть, если центр находится на севере и позиция К северу от центра, то полученные y-координаты соответствуют разности между dmp и координатой y-центра. Если, однако, центр северный, но положение южнее центра, то результирующая координата y равна их сумме. Противоположности верны, учитывая, что центр лежит в южном полушарии.

Следующее преобразует координатную пару широты / долготы в векторный единичный вектор JME:

try {
    int worldWidth = 800;
    MapModel3D m = new MapModel3D(worldWidth);
    Vector3f v = m.toWorldUnit(new Position(-53, 8.0));
} catch (InvalidPositionException e) { e.printStackTrace(); }

Чтобы преобразовать мировые единицы в координаты широты / долготы, используйте модель карты для метода Position:

try {
     int worldWidth = 800; MapModel3D m = new MapModel3D(worldWidth);
     Position pos = m.toPosition(new Vector3f(10, 10, 10));
     System.out.println("Latitude: " + pos.getLatitude() + " Longitude: " + pos.getLongitude());
} catch (InvalidPositionException e) {
     e.printStackTrace();
}

Навигационные вычисления выполняются внутри класса NavCalculator.

Плавание «Меркатор Парусное Меркатор» определяется как «процесс решения проблем, связанных с курсом, расстоянием, разностью широт и разностью долготы, рассматривая их применительно к карте Меркатора» [1]. По сути, это относится к построению линии rhumb2 на карте Меркатора, в которой линия румба появится как прямая линия. То есть, учитывая постоянный подшипник β к северу от линии румба, долготу λ0, где линия проходит экватор, λ1 — любая точка долготы линии ребра, а φ — любая точка широты на линии ребра, то ее проекция Меркатора может быть выведена в виде:

  • x = λ1
  • y = m(λ1 − λ0)

Где наклон m является cot (β), то λ и φ могут быть выражены как

  • x = λ1
  • y = tanh−1(sin(φ) φ = sin−1(tanh(m(λ1 − λ0)))

То есть, tan (курс) = (разница в неравномерности) / (разница между отдельными частями) и расстояние = (разница в значении / cos (курс)), где различие в меридиональных частях определяется в терминах Кларка Сфероида.

Это выполняется следующим образом, где RLSailing и Position являются классами-оболочками.

public RLSailing mercatorSailing(Position p1, Position p2) {
     double dLat = computeDLat(p1.getLatitude(), p2.getLatitude());
     if (dLat == 0) {
          RLSailing rl = planeSailing(p1, p2); return rl;
     }
     double dLong = computeDLong(p1.getLongitude(), p2.getLongitude());
     double dmp = (float) computeDMPClarkeSpheroid(p1.getLatitude(), p2.getLatitude());
     trueCourse = (float) Math.toDegrees(Math.atan(dLong / dmp));
     double degCrs = convertCourse((float) trueCourse, p1, p2);
     distance = (float) Math.abs(dLat / Math.cos(Math.toRadians(trueCourse)));

     RLSailing rl = new RLSailing(degCrs, (float) distance);
     trueCourse = rl.getCourse();
     return rl;
}

Где dmp означает разницу в меридиональных частях.

Разница в меридиональных частях Меридиональные части — это единицы широты, которые были скорректированы для компенсации искажений, возникающих в результате проецирования сплющенного сфероида на двумерную поверхность.

Хотя другие данные (например, WGS 84) одинаково действительны, навигационный модуль выполняет все вычисления в контексте сфероида Кларка 1880 года, который имеет экваториальный радиус 6 378 249,145 метров, полярный радиус 6 356 514 870 метров и обратное сглаживание 293,465 метров , Меридиональная часть для любой широты L поэтому определяется как: M = 7915.704468 * log (tan (45 + (L / 2))) — 23.268932 * (sin (L)) — 0,052500 * (sin (L)) 3 — 0,000213 * (Sin (L)) 5

Если m1 и m2 относятся к меридиональным частям точки смещения и пункта назначения соответственно, разность меридиональных частей рассчитывается как | m1 — m2 | Если обе точки северны или южнее экватора или как их сумма, если одна из точек находится на севере, а другая к югу от экватора:

public static double computeDMPClarkeSpheroid(double lat1, double lat2) {
     double absLat1 = Math.abs(lat1); double absLat2 = Math.abs(lat2);
     double m1 = (7915.704468 * (Math.log(Math.tan(Math.toRadians(45 + (absLat1 / 2)))) / Math.log(10)) - 23.268932 *
 Math.sin(Math.toRadians(absLat1)) - 0.052500 * Math.pow(Math.sin(Math.toRadians(absLat1)), 3) - 0.000213 *
 Math.pow(Math.sin(Math.toRadians(absLat1)), 5));
double m2 = (7915.704468 * (Math.log(Math.tan(Math.toRadians(45 + (absLat2 / 2)))) / Math.log(10))
- 23.268932 * Math.sin(Math.toRadians(absLat2)) - 0.052500 * Math.pow(Math.sin(Math.toRadians(absLat2)), 3) - 0.000213 * 
Math.pow(Math.sin(Math.toRadians(absLat2)), 5));
     if ((lat1 <= 0 && lat2 <= 0) || (lat1 > 0 && lat2 > 0)) {
          return Math.abs(m1 - m2);
     } else {
          return m1 + m2;
     }
}

Конверсия курса Преобразование истинного курса в эквивалентный курс компаса (т.е. переход истинного курса к курсу цели над землей (COG), где «истинный курс» определяется как курс, который должен управляться с настоящего северного 3), как используется Метод mercatorSailing достигается путем вычитания вариации хода от истинного хода, где изменение представляет собой угловую разницу между истинным севером и направлением магнитного поля Земли (следовательно, изменение называется Востоком или Западом в зависимости от положения цели относительно истинного севера) , Учитывая истинный курс между двумя позициями, COG рассчитывается по вызову NavCalculator.convertCourse (tc, p1, p2)

Разница в широте Разница в широте зависит от полушария, в котором обе позиции могут быть определены путем вызова NavCalculator.computeDLat (lat1, lat2).

Разница в долготе Как и разница в широте, разница в долготе зависит от того, какая сторона первичного меридиана находится в обеих позициях, и может быть определена путем вызова NavCalculator.computeDLong (long1, long2).

Подшипник Направление, в котором одна цель находится от другой. Учитывая широту двух точек (φ0 и φ1) и долготу двух точек (λ0 и λ1), подшипник (θ) определяется следующим образом: Пусть dLon — разность долготы λ0 и λ1, тогда

  • x = (sin(dLon) ∗ cos(φ1)
  • y = cos(φ0) ∗ sin(φ1) − sin(φ0) ∗ cos(φ1) ∗ cos(dLon))
  • θ = 2arctan√ θ = atan2(y, x)
  • y

x2+y2+x

Что можно определить следующим образом:

try {
     double bearing = NavCalculator.computeBearing(new Position(-53.6, 8.1), new Position(-53, 8.
  } catch (InvalidPositionException e) {
     e.printStackTrace();
  }

    1. Натаниэль Боудич (1995), Американский практический навигатор. Правительство Соединенных Штатов, Издание национальной океанической службы.

    2. Gebruers C., «JMarine

Переведено для jmonkeyengine.ru, оригинал
Автор перевода: Andry

Добавить комментарий

jMonkeyEngine.ru © 2017. Все права сохранены.