GPS精度圆(以米为单位)与地图上的一条线相交

时间:2015-12-02 15:33:18

标签: android google-maps gps latitude-longitude

我画了一个反映我当前位置的点。我在地图上也有一些形状。但是,由于GPS精度的变化,我需要表明即使LatLng点仍然在它之前我已经在地图上划线,但精度是~20(m)。 是)我有的:   - 线路的起点和终点   - 圈子的中心   - 圆的半径(以米为单位)

我能够计算直线和圆的中心点之间的距离,但这给了我像:0.00987506668990474这样的值,它给了我什么都没有,因为这个值不反映以米为单位的距离我可以& #39; t真的将其转换为米并与精度半径进行比较。 我甚至不确定我是否有良好的目标来获取这些信息。如果有交叉点,可能还有另一种获取信息的方法。

感谢任何提示

更新: 使用距离* 110km我得到了更好的结果。 Intersections 幸福的脸=没有检测到交叉 - 距离<半径,悲伤的脸=检测到的交叉点 - 距离>半径。 黄区边缘是矿线段。正如您所看到的那样,当交叉点位于顶部(/底部)而不是左侧(/右侧)时,它可以正常工作。 这是我的计算算法,计算从线段到点的距离。原谅这个烂摊子......我还在努力解决这个问题,所以它还没有优化:

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

最终列表点 - 包含2个元素 - (0)纬度(1)经度 列表&gt; line - 包含2个列表 - (0)线段起点(0/0)lat /(0/1)long(1)线段终点(1/0)lat /(1/1)long

2 个答案:

答案 0 :(得分:0)

您有两种可能性:

1)便宜的方式:

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

2)更好的方式,但更复杂:
您将线的起点和终点以及圆心转换为笛卡尔x,y空格,单位为米,并计算到线的距离 段使用笛卡尔数学。 (参见线段计算的距离)

首先检查option1,因为它只是一行代码。

您的结果0.00987506668990474这看起来像是以度为单位的距离,而不是米。乘以111km给出的值约为1km。 (在赤道上)

答案 1 :(得分:0)

最后我解决了我的问题。它的解决方案非常简单。比我想象的要简单得多。这里有maputil库: https://github.com/googlemaps/android-maps-utils

该库提供名为“isLocationOnPath”的函数:

boolean isLocationOnPath(LatLng point, List<LatLng> polyline, boolean geodesic, double tolerance)

点 - 是一个中心或我的观点。 折线 - 根据我的需要是多边形的边缘, 测地线 - 真(当然) 公差 - (以米为单位)是我从GPS精度中获得的精度 - 基本是圆半径。

有关方法的详细信息: http://googlemaps.github.io/android-maps-utils/javadoc/com/google/maps/android/PolyUtil.html#isLocationOnPath-LatLng-java.util.List-boolean-

我希望有所帮助。