【问题标题】:GeoTools - How to do Dead Reckoning and course calculations using GeoTools classesGeoTools - 如何使用 GeoTools 类进行航位推算和课程计算
【发布时间】:2010-10-12 17:21:24
【问题描述】:

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

要求 #1: 计算移动容器的Dead Reckoning 位置。

输入值:

  • 当前经度
  • 当前纬度
  • 当前速度(可以很容易地转换为距离,给定时间 'T')
  • 当前课程

预期输出:

  • 经过时间“T”后估计的经度/纬度位置

要求 #2: 计算从位置“A”到位置“B”的路线。

输入值:

  • 经度'A'
  • 纬度'A'
  • 经度'B'
  • 纬度'B'

预期输出:

  • 直接从“A”指向“B”的课程

问题

谁能指导我到 GeoTools 中能够执行这些计算的类? GeoTools 中的类数量之多让我不知所措,我似乎找不到我需要做的事情。

【问题讨论】:

  • 如果没有这个页面有你需要的所有数学williams.best.vwh.net/avform.htm#Crs
  • @RomainHippeau 你这么说很有趣。我公司的某个人已经花了一些时间手动将部分 JavaScript 代码重新实现为 Java 类。不过,理想情况下,我们宁愿为所有这些东西坚持使用适当维护的开源库。

标签: java geospatial latitude-longitude geotools dead-reckoning


【解决方案1】:

如何计算从“A”位置到“B”位置的路线

  • 需要有位置“A”和“B”的纬度/经度
  • 获取GeodeticCalculator 类的实例
  • 致电setStartingGeographicPoint()
  • 致电setDestinationGeographicPoint()
  • 致电getAzimuth()
  • 从方位角转换为十进制度数

如何从位置“A”开始计算航位推算位置“X”

  • 需要有位置“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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-01
    相关资源
    最近更新 更多