Проверьте, находится ли текущая точка на маршруте (пути) и получите те точки из списка, где это соответствует - PullRequest
0 голосов
/ 01 ноября 2018

Следующая функция 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 Ответ

0 голосов
/ 01 ноября 2018

Предположим, что p - это ломаная линия, и вы узнали, что:

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

возвращает true, где:

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

Итак, latLng где-то на стр.

Вы можете использовать метод findIntersectingPoint(), чтобы найти LatLong пересекающегося местоположения.

Просто передайте список 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)));
}
...