使用位置

时间:2015-06-23 14:40:44

标签: android math gps geolocation geometry

我需要找到以度为单位测量的车辆转弯角度。

Problem description

位置点以相等间隔(1秒)更新。因此装置在转弯时会产生4-5分。我在图片上示意地显示了这一点。

是否可以使用位置计算转弯角度?如果可能,怎么做?

我尝试了什么:

  1. 分别从点3,4和1,2创建两个几何向量,并找到这些向量之间的角度。我计算的向量坐标如Vector1 (lat2 - lat1; lon2 - lon2)。不确定这种方法是否可以应用于位置坐标。
  2. 使用location1.bearingTo(location2)。但这并没有给出预期的结果。好像它给了"指南针"结果。 Perhabs我可以用某种方式但不确定。
  3. 还尝试了一些像hereherehere这样的三角公式。他们没有给出预期的角度。
  4. 编辑:解决方案 接受的答案很有效。但要完成答案,我必须展示angleDifference的方法。这个对我有用:

    public int getAngleDifference(int currentAngle){
        int r = 0;
        angleList.add(currentAngle);
        if (angleList.size() == 4) {
            int d = Math.abs(angleList.get(0) - angleList.get(3)) % 360;
            r = d > 180 ? 360 - d : d;
    
            angleList.clear();
        }
        return r;
    }
    

    我将点数添加到列表中,直到其中有4个,然后计算第1点和第4点之间的角度差,以获得更好的结果。

    希望它对某人有所帮助!

2 个答案:

答案 0 :(得分:2)

vect1 = LatLon2 - LatLon1; // vector subtraction

vect2 = LatLon4 - LatLon3;

根据dot产品的定义具有以下属性:

vect1.vect2 = ||vect1||*||vect2||*Cos(theta)

这里是符号

的细分

术语vect1.vect2vect1vect2的点积。

点积的一般形式可以按组件分解为v1 = <x1,y1>v2=<x2,y2>两个任意向量v1v2点积为:< / p>

v1.v2 = x1*x2 + y1*y2 

并且某个任意向量v的大小为:

||v|| = sqrt(v.v); which is a scalar.

以上等同于具有分量x和y的欧几里德距离公式:

||v|| = sqrt(x^2 + y^2)

获得角度

根据两个向量thetavect1找到vect2的值:

theta = Math.ArcCos(vect1.vect2/(||vect1||*||vect2||))

答案 1 :(得分:1)

方法1不能像你描述的那样工作:Lat,Lon不是笛卡尔坐标(以米为单位表示的一度经度不是一度的latitide,这仅在赤道上有效)。您将首先转换为(本地)笛卡儿系统。

图中有错误:标有“?”的角度放在错误的一边。你最想要的角度:180 - ? 在你的例子中,汽车转动不到90°,尽管你的角度超过90°。 为了更好地理解另一个绘图,汽车只向左转10度。在你的绘图中,这将是170°,这是错误的。

方法2)效果更好,但需要总结角度差异。 你必须自己写一个方法

double angleDifference(double angle1, double angle2);

这看起来比它容易,虽然代码只有几行。 确保您有一些测试用例在超过360°限制时测试行为。 实施例

 (从轴承10转到轴承350),应该给20或-20,这取决于你是否希望该方法给出绝对值或相对角度