检查当前点是不是在路线(路径)上并从匹配的列表中获取这些点

Posted

技术标签:

【中文标题】检查当前点是不是在路线(路径)上并从匹配的列表中获取这些点【英文标题】:Check if current point is on route (path) and get those points from list where it matches检查当前点是否在路线(路径)上并从匹配的列表中获取这些点 【发布时间】:2019-04-05 12:47:57 【问题描述】:

下一个函数com.google.maps.android.PolyUtil.isLocationOnPath 只返回布尔值来判断检查点(位置)是否在路径上

PolyUtil.isLocationOnPath(latLng, mPointsOfRoute, true, 10);

(https://github.com/googlemaps/android-maps-utils/blob/master/library/src/com/google/maps/android/PolyUtil.java#L158)

但我也想知道这个点在哪里匹配,在我的点列表中的哪些点之间 (mPointsOfRoute)

因为我需要缩短这条路线(路径),所以删除经过的点并缩短从新当前位置到同一目的地的路线

【问题讨论】:

您可以遍历 mPointsOfRoute 并为每个 n 和 n+1 对坐标调用 isLocationOnPath() 。例如,在第一次迭代中检查 mPointsOfRoute.get(0) 和 mPointsOfRoute.get(1)。对于下一次迭代,您检查 mPointsOfRoute.get(1) 和 mPointsOfRoute.get(2) 等... @GavinWright 是的,我已经做过类似的事情了。同样据我所知,在这种情况下,我可以将 false 而不是 true 设置为 isLocationOnPath 函数的第三个参数,即 geodesic 【参考方案1】:

假设 p 是折线,你发现:

PolyUtil.isLocationOnPath(latLng, mPointsOfRoute, true, 10);

返回真,其中:

List<LatLng> mPointsOfRoute = p.getPoints();

所以,latLng 在 p 的某个地方。

您可以使用findIntersectingPoint() 方法查找相交位置的经纬度。

只需将 LatLngs 列表传递给此方法,如下所示:

LatLng intersectingLocationOnPath = findIntersectingPoint(latLng, mPointsOfRoute.get(0), mPointsOfRoute.get(mPointsOfRoute.size() - 1));

private LatLng findIntersectingPoint(final LatLng p, final LatLng start, final LatLng end) 
    if (start.equals(end)) 
        return start;
    

    final double s0lat = Math.toRadians(p.latitude);
    final double s0lng = Math.toRadians(p.longitude);
    final double s1lat = Math.toRadians(start.latitude);
    final double s1lng = Math.toRadians(start.longitude);
    final double s2lat = Math.toRadians(end.latitude);
    final double s2lng = Math.toRadians(end.longitude);

    double s2s1lat = s2lat - s1lat;
    double s2s1lng = s2lng - s1lng;
    final double u = ((s0lat - s1lat) * s2s1lat + (s0lng - s1lng) * s2s1lng)
            / (s2s1lat * s2s1lat + s2s1lng * s2s1lng);
    if (u <= 0) 
        return start;
    
    if (u >= 1) 
        return end;
    

    return new LatLng(start.latitude + (u * (end.latitude - start.latitude)),
            start.longitude + (u * (end.longitude - start.longitude)));

【讨论】:

我想最好先遍历所有点 mPointsOfRoute 并为每个 nn+1 调用 isLocationOnPath() 如果它返回 true 然后在它们之间调用 findIntersectingPoint点(对)。你必须删除通过的分数。虽然我不确定findIntersectingPoint 方法的工作原理有多完美,但它找到了相交点,但它并不那么准确。所以我们不能像这样findIntersectingPoint(latLng, mPointsOfRoute.get(0), mPointsOfRoute.get(mPointsOfRoute.size() - 1));,对于第一点和最后一点 似乎 findIntersectingPoint 工作正常,如果点距离其他两点不远 我会用不同的方式来做,虽然所有点都迭代,但我也会使用你的函数findIntersectingPoint,谢谢,它非常有用 好的。伟大的。谢谢。

以上是关于检查当前点是不是在路线(路径)上并从匹配的列表中获取这些点的主要内容,如果未能解决你的问题,请参考以下文章

A*寻路算法详解

在Shapely中查找路径起点的坐标距离

设置列表项的值时自定义适配器中的空指针异常

检查列表是不是包含多个值android

检查字符串是不是包含子字符串列表并保存匹配的子字符串

检查列表是不是有一个或多个与正则表达式匹配的字符串