GeoTools - Как сделать Dead Reckoning и вычислить курс, используя классы GeoTools - PullRequest
3 голосов
/ 12 октября 2010

В настоящее время я использую инструментарий GeoTools для выполнения расчетов по данным морского судна, таких как вычисление расстояния по Большому кругу между двумя точками lon / lat.У меня есть два других требования, которые мне нужно выполнить, но я не уверен, где искать в GeoTools, чтобы найти классы для таких вычислений.

ТРЕБОВАНИЕ № 1: Рассчитать Мертвый расчет позиция для движущегося судна.

ВХОДНЫЕ ЗНАЧЕНИЯ:

  • текущая долгота
  • текущая широта
  • текущая скорость(которое может быть легко преобразовано в расстояние с учетом времени 'T')
  • текущий курс

ОЖИДАЕМЫЕ ВЫХОДЫ:

  • расчетная долгота / широтаПозиция после времени 'T' истекла

ТРЕБОВАНИЕ № 2: Рассчитайте курс от положения 'A' к положению 'B'.

ВХОДНЫЕ ЗНАЧЕНИЯ:

  • долгота 'A'
  • широта 'A'
  • долгота 'B'
  • широта 'B'

ОЖИДАЕМЫЕ РЕЗУЛЬТАТЫ:

  • курс, который указывает непосредственно от 'A' до 'B'

ВОПРОС

Может кто-нибудь режРасскажете мне о классах в GeoTools, которые способны выполнять эти вычисления?Я поражен огромным количеством классов в GeoTools и не могу найти то, что мне нужно для этого.

1 Ответ

6 голосов
/ 14 октября 2010

КАК РАССЧИТАТЬ КУРС ОТ ПОЗИЦИИ 'A' К ПОЗИЦИИ 'B'

  • Необходимо иметь широту / долготу позиций 'A' и 'B'
  • Получить экземпляр класса GeodeticCalculator
  • Позвонить setStartingGeographicPoint()
  • Позвонить setDestinationGeographicPoint()
  • Позвонить getAzimuth()
  • Преобразоватьот азимута до десятичных градусов

КАК РАСЧЕТИТЬ МЕРТВУЮ ОТЧЕТНУЮ ПОЗИЦИЮ 'X' НАЧАТЬ ИЗ ПОЛОЖЕНИЯ 'A'

  • Необходимо иметь латlon позиции 'A'
  • Необходимо указать текущий курс судна по азимуту
  • Необходимо указать расстояние в метрах (или рассчитать это как скорость * время)
  • Получить экземпляр класса GeodeticCalculator
  • Позвонить setStartingGeographicPoint()
  • Позвонить setDirection()
  • Позвонить getDestinationGeographicPoint()

Вот несколько простых методов преобразования единиц измерения, которые мне нужно было реализовать самостоятельно.Азимут был немного запутанным.Азимут колеблется от -180 до +180, причем значения увеличиваются по мере увеличения направления «угол» по часовой стрелке.Значит -180 к югу, -90 к западу, 0 к истинному северу, +90 к востоку и +180 к югу.

public static final double KNOTS_PER_MPS = 1.9438444924406;
public static final double MPS_PER_KNOT = 0.514444444444444;


public static double metersPerSecondToKnots(double speedInMetersPerSecond) {
    return speedInMetersPerSecond * KNOTS_PER_MPS;
}

public static double knotsToMetersPerSecond(double speedInKnots) {
    return speedInKnots * MPS_PER_KNOT;
}

public static double courseInDegreesToAzimuth(double courseInDegrees) {
    Validate.isTrue(courseInDegrees >= 0.0 && courseInDegrees <= 360.0);
    double azimuth;
    if (courseInDegrees > 180.0) {
        azimuth = -180.0 + (courseInDegrees - 180.0);
    } else {
        azimuth = courseInDegrees;
    }
    return azimuth;
}

public static double azimuthToCourseInDegrees(double azimuth) {
    Validate.isTrue(azimuth >= -180.0 && azimuth <= 180.0);
    double courseInDegrees;
    if (azimuth < 0.0) {
        courseInDegrees = 360.0 + azimuth;
    } else {
        courseInDegrees = azimuth;
    }
    return courseInDegrees;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...