如何利用速度和时间来计算下一次的纬度和经度

时间:2015-01-14 07:35:18

标签: java gps

我正在尝试根据速度获取经度和经度并启动基本点。尝试使用此JAVA代码。

我的目标是基本开始纬度,经度点A,0速度,下一个找到位置点-B即30秒后32速度下一个位置点是18.473993,79.14167,然后点c..etc ..

这是我的代码:

      public class DemoCallLatLng {
        public static void main(String s[]){        
        double speed = 32.5;//random speed
        double time = 0.5;//30seconds
        double lat1 = 18.4742516;//start latitude point
        double lon1 = 79.14007;//start longitude point
        double distance = speed * time;//distance calculation
        double lon2;
        double lat2;
        lat2 =asin(Math.sin(lat1)*Math.cos('K')+Math.cos(lat1)*Math.sin('K')*Math.cos('K'))
        double dlon=atan2(Math.sin(tc)*Math.sin('K')*Math.cos(lat1),Math.cos('K')-Math.sin(lat1)*Math.sin(lat2))
        lon2=mod( lon1-dlon +Math.PI,2*Math.PI )-Math.PI;
        System.out.println(lat2+" : "+dlon+" : "+lon2);
    }
}

3 个答案:

答案 0 :(得分:2)

如果您不知道前进的方向,则只能通过了解距离和速度来找到新位置。 (速度是标量)。

你需要有速度(单独的x和y分量)。

如果您以某种方式知道方向(方向角θ可能),您甚至可以将速度分解为x和y分量。

  

velocityX =速度* cos(θ)

     

速度Y =速度* sin(θ)


当您知道速度的两个组成部分时,您可以使用以下内容。

  

newPositionX = oldPositionX + velocityX * time

  

newPositionY = oldPositionY + velocityY * time

速度分量应具有适当的单位(按比例缩放以适用于纬度)


确保θ是您前往的方向与北方向之间的角度

希望这有帮助。
祝你好运。

答案 1 :(得分:2)

您的代码和所有其他答案会产生相同的基本错误。

sin()和cos()需要一个以弧度表示的角度,而不是度数。

所以在使用

之前将纬度和经度转换为弧度
double latRad = Math.toRadians(latitude);

还有很多其他问题:

  • 速度以米/秒为单位。所以总是在公式中使用这个单位,如果输入是英里或公里/小时,则转换之前。
  • 时间:时间单位是1秒,而不是一分钟:在您的代码中更正。

  • 如果您的变量不是SI单位(Internationaly标准系统单位:米,秒等),那么您应该将它们命名为包含单位名称:例如speedKmh或numMinutes

  • 要计算给定位置,您需要一个方向,以度(0 - 360)为单位。所以这是附加输入。在你的代码中,这是变量tc:tc意味着方向。它可以来自“真正的课程”这个词。这可能也应该是弧度。但可能是一个数学角度(东= 0,逆时针),而地理角度是北= 0°,顺时针方向上升。

  • 你想用罪来实现什么('K')???你应该从学校里记得sin()以一个角度作为参数,而不是一个字母。

  • -

最后你应该找到一个更好的代码来源,你从中获取代码,还有另外两个答案,它们更好,可以随时使用。看那里然后扔掉当前的方法。

答案 2 :(得分:0)

您的代码有几个语法错误

下面是正确的代码, 只有1个问题,tc,我使用常量= 11只是为了运行代码

public class DemoCallLatLng {
    public static void main(String s[]){        
    double speed = 32.5;//random speed
    double time = 0.5;//30seconds
    double lat1 = 18.4742516;//start latitude point
    double lon1 = 79.14007;//start longitude point
    double distance = speed * time;//distance calculation
    double lon2;
    double lat2;

        lat2 =Math.asin(Math.sin(lat1)*Math.cos('K')+Math.cos(lat1)*Math.sin('K')*Math.cos('K'));
        double dlon=Math.atan2(Math.sin(11)*Math.sin('K')*Math.cos(lat1),Math.cos('K')-Math.sin(lat1)*Math.sin(lat2));
        lon2=( lon1-dlon +Math.PI % 2*Math.PI )-Math.PI;
        System.out.println(lat2+" : "+dlon+" : "+lon2);
    }
}

您的错误是:

1- asin ==> Math.asin()

2- atan2 ==> Math.atan2()

3-没有这样的方法mod(),如果你的意思是模数,在java中它是% 所以mod( lon1-dlon +Math.PI,2*Math.PI ) ==> lon1-dlon +Math.PI % 2*Math.PI

我不确定我是否错过了其他语法错误,但主要是他们错过了Math. mod()函数,最后我在行

告诉你tc变量
double dlon=atan2(Math.sin(tc)*...

此代码现在生成输出,但由于使用11代替tc

,我认为它不正确

<强>输出:

-0.7347912647318792 : 0.4902491126709713 : 79.094647327649