代码之家  ›  专栏  ›  技术社区  ›  user924

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

  •  1
  • user924  · 技术社区  · 7 年前

    下一个函数 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 )

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

    1 回复  |  直到 7 年前
        1
  •  2
  •   Subrata Mondal    7 年前

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

    返回true,其中:

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

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

    你可以用 findIntersectingPoint() 方法求相交位置的纬度。

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

    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)));
    }
    
    推荐文章