Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/google-maps/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android GPS精度圆(米)与地图上的一条线相交_Android_Google Maps_Gps_Latitude Longitude - Fatal编程技术网

Android GPS精度圆(米)与地图上的一条线相交

Android GPS精度圆(米)与地图上的一条线相交,android,google-maps,gps,latitude-longitude,Android,Google Maps,Gps,Latitude Longitude,我正在画一个反映我当前位置的点。我在地图上也有一些形状。然而,由于GPS精度的变化,我需要证明我已经在地图上越过了这条线,即使一个LatLng点仍然在它之前,但精度为~20(m)。 我所拥有的: -线的起点和终点 -圆心 -圆的半径(以米为单位) 我能够计算直线和圆的中心点之间的距离,但这给了我一个值,比如:0.0098750668990474,这给了我什么都没有,因为这个值没有反映米的距离,我不能将它转换为米,并与精度半径进行比较。 我甚至不确定我是否有足够的目标来获取这些信息。如果有交叉路口

我正在画一个反映我当前位置的点。我在地图上也有一些形状。然而,由于GPS精度的变化,我需要证明我已经在地图上越过了这条线,即使一个LatLng点仍然在它之前,但精度为~20(m)。 我所拥有的: -线的起点和终点 -圆心 -圆的半径(以米为单位)

我能够计算直线和圆的中心点之间的距离,但这给了我一个值,比如:0.0098750668990474,这给了我什么都没有,因为这个值没有反映米的距离,我不能将它转换为米,并与精度半径进行比较。 我甚至不确定我是否有足够的目标来获取这些信息。如果有交叉路口或没有交叉路口,可能还有其他方法来获取信息

谢谢你的提示

更新: 使用110公里的距离,我得到了更好的结果。 快乐脸=未检测到交点-距离<半径,悲伤脸=检测到交点-距离>半径。 黄色区域边缘是矿线段。正如您所看到的,当交叉点位于顶部(/底部)时,它可以工作,但不在左侧(/右侧)。 这是我的计算算法,计算线段到点的距离。原谅这一团糟。。。我仍在努力解决这一问题,因此它尚未优化:

public static double pointLineSegmentDistance(final List<Double> point, final List<List<Double>> line)
{
    List<Double> v = line.get(0);
    List<Double> w = line.get(1);
    double d = pointPointSquaredDistance(v, w);
    double t;
    List<Double> calculateThis;
    if (d > 0)
    {
        boolean test = (t = ((point.get(0) - v.get(0)) * (w.get(0) - v.get(0)) + (point.get(1) - v.get(1)) * (w.get(1) - v.get(1))) / d) < 0;
        if (test)
        {
            calculateThis = v;
        }
        else
        {
            if (t > 1)
            {
                calculateThis = w;
            }
            else
            {
                calculateThis = new ArrayList<Double>();
                calculateThis.add(v.get(0) + t * (w.get(0) - v.get(0)));
                calculateThis.add(v.get(1) + t * (w.get(1) - v.get(1)));
            }
        }
    }
    else
    {
        calculateThis = v;
    }
    return Math.sqrt(pointPointSquaredDistance(point, calculateThis));
}

public static double pointPointSquaredDistance(final List<Double> v, final List<Double> w)
{
    double dx = v.get(0) - w.get(0);
    double dy = v.get(1) - w.get(1);
    return dx * dx + dy * dy;
}
公共静态双点LineSegmentDistance(最终列表点,最终列表线)
{
列表v=行。获取(0);
列表w=行。获取(1);
双d=点平方距离(v,w);
双t;
列出这一点;
如果(d>0)
{
布尔测试=(t=((point.get(0)-v.get(0))*(w.get(0)-v.get(0))+(point.get(1)-v.get(1))*(w.get(1)-v.get(1))/d)<0;
如果(测试)
{
计算这个=v;
}
其他的
{
如果(t>1)
{
计算这个=w;
}
其他的
{
calculateThis=新的ArrayList();
加上(v.get(0)+t*(w.get(0)-v.get(0));
加上(v.get(1)+t*(w.get(1)-v.get(1));
}
}
}
其他的
{
计算这个=v;
}
返回Math.sqrt(pointpointsquaredInstance(point,calculateThis));
}
公共静态双点平方距离(最终列表v,最终列表w)
{
双dx=v.get(0)-w.get(0);
双dy=v.get(1)-w.get(1);
返回dx*dx+dy*dy;
}
最终列表点-包含2个元素-(0)纬度(1)经度
列表>直线-包含两个列表-(0)线段起点(0/0)纬度/(0/1)长(1)线段终点(1/0)纬度/(1/1)长

您有两种可能性:

1) 便宜的方法:

您可以使用android api(distanceBetween())计算直线起点/终点和圆心之间的距离。结果将以米为单位,并通过点对点距离计算进行校正。取起点/终点到中心圆距离的最小值。 如果直线段相对于圆半径很长,那么直线到中心的正常距离,使用这种计算是错误的

2) 更好但更复杂的方法:
将直线的起点和终点以及圆心变换为笛卡尔x,y空间,单位为米,并计算到直线的距离 使用笛卡尔数学进行分段。(请参见到线段的距离计算)

首先检查选项1,因为它只是一行代码


您的结果为0.0098750668990474这看起来像是以度为单位的距离,而不是以米为单位的距离。将其乘以111km,得到的值约为1km。(在赤道)

我终于解决了我的问题。解决方案非常简单。比我想象的简单多了。此处提供了maputil库:

该库有一个名为“isLocationOnPath”的函数:

布尔isLocationOnPath(板条点、列表多段线、布尔测地线、双公差)
点-是一个中心或我的点。 折线-根据我的需要是多边形的边, 测地线-正确(当然) 公差-(以米为单位)是我从GPS精度中获得的精度-基本是一个圆半径

有关该方法的详细信息:


我希望这有帮助

那个距离值是用哪个单位表示的?这是定位类的精度。上面写着单位是米。???你说这是一段距离,你计算过了。如果它来自location类,那么说明如何获得它。如果你计算它,然后显示你的计算。这样的米精度是不可能的。不幸的是,我不能使用选项1。圆半径始终保持在5-20米之间,但线段通常有1-2公里。使用选项2。。。给了我相当好的成绩。。。但是我很确定我在计算中遗漏了一些东西。当圆形接触顶部或底部的线条时,它几乎可以完美地工作。问题出在圆圈的左右两侧。该线在圆边缘和圆心之间切割约20-30%的圆。我将很快更新这个问题,并附上屏幕截图以显示它的外观。我还要附上我的计算算法。你把坐标变换到笛卡尔空间了吗?嗯。。我不知道你在说什么。。。看来不是。问题更新。你的坐标单位是多少?屏幕像素?纬度经度?经纬度是球坐标,这不是一个以等距单位表示的平面x,y。你不能像在学校里学的那样只使用平面数学。要么你确切地知道什么是允许的,什么不是,要么先转换到笛卡尔空间。距离计算不起作用,两条线是否相交是个问题。我从android的位置提供商那里得到坐标,它们是纬度/经度。平面数学(甚至3d)对我来说仍然很清楚,但是。。。我现在面临的问题对我来说太多了。我现在读了很多关于这方面的书
boolean isLocationOnPath(LatLng point, List<LatLng> polyline, boolean geodesic, double tolerance)