【问题标题】:how to use of speed and time to calculate next time's latitude and longitude如何使用速度和时间计算下一次的经纬度
【发布时间】:2015-01-14 07:35:17
【问题描述】:

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

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

这是我的代码:

      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);
    }
}

【问题讨论】:

  • 那么问题出在哪里?
  • 没有得到输出。代码有什么问题吗。
  • 您在下面发布的链接中复制了错误答案中的代码。不幸的是,这是公认的答案。看看其他两个答案,它们的代码更好,代码更清晰。虽然第一个只是非常糟糕的解释伪代码

标签: java gps


【解决方案1】:

如果你不知道你要去的方向,你不能只知道距离和速度就找到新的位置。 (速度是一个标量)。

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

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

velocityX = 速度 * cos(θ)

速度Y = 速度 * sin(θ)


当你知道速度的两个分量时,你可以使用跟随。

newPositionX = oldPositionX + velocityX * time

newPositionY = oldPositionY + velocityY * time

速度分量应具有适当的单位(缩放以使用经纬度)


只要确保 θ 是您前进的方向和北方向之间的角度

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

【讨论】:

    【解决方案2】:

    您的代码和所有其他答案都犯了同样的基本错误。

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

    所以在使用之前将纬度和经度转换为弧度

    double latRad = Math.toRadians(latitude);
    

    还有很多其他问题:

    • 速度以米/秒为单位。因此,请始终在公式中使用此单位,如果输入以英里或公里/小时为单位,请先转换。
    • 时间:时间单位是 1 秒,而不是一分钟:在您的代码中更正。

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

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

    • 你到底想用 sin('K') 达到什么目的???。你应该记得在学校里 sin() 需要一个角度作为参数,而不是一个字母。

    • -

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

    【讨论】:

    • 谢谢@AlexWien,请你帮我写一些代码。以及如何避开海洋、海洋、森林纬度..等,如何仅获取纬度的有效道路路径。
    • @Hydrogen 为了避开海洋、海洋等:这似乎超出了您的技术范围。如果您在使用相对简单的代码时遇到此类问题,那么您需要多年的经验:您需要街道多边形的矢量数据,这些数据由 OpenStreetMap 免费提供,或由 TomTom 和诺基亚付费。
    【解决方案3】:

    您的代码有几个语法错误

    下面是正确的代码, 只剩下 1 个问题,tc 是什么,我使用 constant = 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
    

    【讨论】:

    • 感谢@Yazan,我从 stackoverflow.com/questions/19352921/… 获得此代码,
    • @acecloudsmaps 它看起来更像是一个伪代码而不是运行代码,如果你弄清楚tc 是什么,你就可以使用它。也许:)
    • tc 是以弧度为单位的角度,不应该有 11 (0 - 2*Pi) 的值,为什么你要取'K'的 sin()。这一切都毫无意义。代码永远不会运行那个appoorach。
    • @AlexWien 我使用11 作为常量随机选择只是为了使此代码运行,这在我的回答中提到。其他 'K' ... 被 OP 使用。
    • 让代码编译干净是没有意义的,它永远不会产生任何有意义的输出。首先是理解,然后是代码。
    猜你喜欢
    • 2013-10-21
    • 1970-01-01
    • 1970-01-01
    • 2012-08-16
    • 2014-03-19
    • 2010-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多