我正在尝试根据速度获取经度和经度并启动基本点。尝试使用此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);
}
}
答案 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