Java GeoTools-如何使用GeoTools类进行航位推算和航向计算

Java GeoTools-如何使用GeoTools类进行航位推算和航向计算,java,geospatial,latitude-longitude,geotools,dead-reckoning,Java,Geospatial,Latitude Longitude,Geotools,Dead Reckoning,我目前正在使用GeoTools工具包对海洋船舶数据进行计算,例如计算两个lon/lat点之间的大圆距离。我还需要满足另外两个要求,但我不确定在GeoTools中的哪里可以找到进行此类计算的类 要求#1: 计算移动船舶的位置 输入值: 当前经度 当前纬度 当前速度(在给定时间“T”的情况下,可轻松转换为距离) 当前课程 预期产出: 经过时间“T”后的估计经纬度位置 要求#2: 计算从位置“A”到位置“B”的航向 输入值: 经度‘A’ 纬度‘A’ 经度'B' 纬度'B' 预期产出: 直

我目前正在使用GeoTools工具包对海洋船舶数据进行计算,例如计算两个lon/lat点之间的大圆距离。我还需要满足另外两个要求,但我不确定在GeoTools中的哪里可以找到进行此类计算的类

要求#1: 计算移动船舶的位置

输入值:

  • 当前经度
  • 当前纬度
  • 当前速度(在给定时间“T”的情况下,可轻松转换为距离)
  • 当前课程
预期产出:

  • 经过时间“T”后的估计经纬度位置
要求#2: 计算从位置“A”到位置“B”的航向

输入值:

  • 经度‘A’
  • 纬度‘A’
  • 经度'B'
  • 纬度'B'
预期产出:

  • 直接从“A”指向“B”的路线
问题


有人能告诉我GeoTools中能够执行这些计算的类吗?GeoTools的课程数量之多让我不知所措,我似乎找不到我需要做什么。

如何计算从“A”位置到“B”位置的课程。

  • 需要具有位置“A”和“B”的纬度/经度
  • 获取
    大地测量计算器
    类的实例
  • 调用
    setStartingGeographicPoint()
  • 调用setDestinationGeographicPoint()
  • 调用
    getAxitation()
  • 从方位角转换为十进制度数
如何从位置“A”开始计算航位推算位置“X”

  • 需要具有位置“A”的纬度/经度
  • 需要有船舶当前航向的方位角
  • 需要有以米为单位的行驶距离(或计算为速度*时间)
  • 获取
    大地测量计算器
    类的实例
  • 调用
    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;
}
public static final double KNOTS\u PER\u MPS=1.9438444924406;
公共静态最终双MPS_/u结=0.51444;
公共静态双米每秒(双速每秒){
返回速度米/秒*节/分钟;
}
公共静态双结每秒(双速){
返回speedInKnots*每节MPS;
}
公共静态双航向指示器方位角(双航向指示器){
Validate.isTrue(courseInDegrees>=0.0和&courseInDegrees 180.0){
方位=-180.0+(航向指数-180.0);
}否则{
方位角=航向指数;
}
返回方位角;
}
公共静态双方位角航向索引(双方位角){

Validate.isTrue(Aximust>=-180.0&&Aximust If not此页面具备@Romainippeau所需的所有数学知识。你这么说很有趣。我公司的某位员工已经花了一些时间手动将部分JavaScript代码重新实现到Java类中。不过,理想情况下,我们更愿意为所有这些内容使用一个适当维护的开源库。