GeoTools - Как выполнять расчеты и расчеты курса с использованием классов GeoTools
В настоящее время я использую инструментарий GeoTools для выполнения расчетов по данным морских судов, таких как вычисление расстояния по Большому кругу между двумя точками lon/lat. У меня есть два других требования, которые мне нужно выполнить, но я не уверен, где искать в GeoTools, чтобы найти классы для таких вычислений.
ТРЕБОВАНИЕ № 1: Рассчитать мертвую позицию для движущегося судна.
ВХОДНЫЕ ЦЕННОСТИ:
- текущая долгота
- текущая широта
- текущая скорость (которая может быть легко преобразована в расстояние с учетом времени 'T')
- текущий курс
ОЖИДАЕМЫЕ ВЫХОДЫ:
- расчетное положение долготы / широты после истечения времени 'T'
ТРЕБОВАНИЕ № 2: Рассчитайте курс от положения "A" до положения "B".
ВХОДНЫЕ ЦЕННОСТИ:
- долгота 'A'
- широта 'A'
- долгота 'B'
- широта 'B'
ОЖИДАЕМЫЕ ВЫХОДЫ:
- Конечно, который указывает непосредственно от "А" до "В"
ВОПРОС
Кто-нибудь может направить меня в классы в GeoTools, которые способны выполнять эти вычисления? Я поражен большим количеством классов в GeoTools, и я не могу найти то, что мне нужно для этого.
1 ответ
КАК РАССЧИТАТЬ КУРС ОТ ПОЗИЦИИ 'A' К ПОЗИЦИИ 'B'
- Нужно иметь широту / долготу позиций 'A' и 'B'
- Получить экземпляр
GeodeticCalculator
учебный класс - Вызов
setStartingGeographicPoint()
- Вызов
setDestinationGeographicPoint()
- Вызов
getAzimuth()
- Преобразовать из азимута в десятичные градусы
КАК РАСЧЕТИТЬ МЕРТВУЮ ОТКРЫТУЮ ПОЗИЦИЮ "X", НАЧИНАЮЩУЮСЯ ИЗ ПОЗИЦИИ "А"
- Нужно иметь широту / долготу позиции "А"
- Нужно иметь текущий курс судна по азимуту
- Необходимо указать расстояние в метрах (или рассчитать это как скорость * время)
- Получить экземпляр
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;
}