Использовать проезде или направление MapBox API для реализации моих собственных навигации в мое приложение


Я хотел бы реализовать навигационную карту для водителей в моем Android-приложении. Я не хочу использовать схему URL, чтобы открыть приложение google Maps для навигации по нему. Я предпочитаю реализовывать эту функцию навигации в своем приложении, как это делает Google Map.

Мои требования довольно просты. Переход пользователя от PlaceA к PlaceB.

После того, как я прочитал документы с сайта google и MapBox. существуют направления api для пользователя, чтобы получить всю информацию, как маршруты.

1 Направление Карты GoogleMap ПРИКЛАДНОЙ ПРОГРАММНЫЙ ИНТЕРФЕЙС: https://developers.google.com/maps/documentation/directions/intro?hl=en

2 Mapbox Direction API: https://www.mapbox.com/developers/api/directions/

Мой вопрос ниже: 1 Как я узнаю, когда подходящее время, чтобы подсказать пользователю, что он должен повернуть направо / налево? 2 Как узнать, как далеко от моего текущего местоположения до следующего маневра / шага? Нужно ли мне пересчитывать расстояние после изменения моего местоположения, так как мое местоположение всегда меняется? 3 откуда я знаю пользователь совершил неправильное действие? Например, предполагается повернуть направо, но пользователь повернул налево. Мне нужно попросить ваш сервер пересчитать маршрут.

Есть предложения? Заранее спасибо.

2 4

2 ответа:

Я отвечу на ваши вопросы ниже, как если бы вы использовали новый Android Mapbox Directions API.

1. Как я узнаю, когда настало подходящее время, чтобы подсказать пользователю, что он должен повернуть направо/налево?

Во-первых, как вы, возможно, знаете, вы должны вызвать .setSteps(true) внутри вашего MapboxDirections.Builder(). Это вернет направления со всей информацией, которая вам понадобится. Теперь для того, чтобы подсказать пользователю шаг в правильном месте, вам нужно будет получить координаты маневра шага, которые приведены в списке. Это абсолютная координата, в которой происходит шаг, поэтому будет редко, когда пользователь действительно маневрирует через точку при прохождении маршрута. Поэтому лучше всего измерять расстояние от местоположения пользователя до координат следующих шагов, и если пользователь находится в пределах заданного расстояния (скажем, 0,0189394 миль, что составляет ~100 футов), вы затем предлагаете пользователю следующий шаг. Для измерения расстояния я приведу надежный метод, который вы можете использовать ниже:

private double computeDistance(Waypoint from, Waypoint to) {
    double dLat = Math.toRadians(to.getLatitude() - from.getLatitude());
    double dLon = Math.toRadians(to.getLongitude() - from.getLongitude());
    double lat1 = Math.toRadians(from.getLatitude());
    double lat2 = Math.toRadians(to.getLatitude());

    double a = Math.pow(Math.sin(dLat/2), 2) + Math.pow(Math.sin(dLon/2), 2) * Math.cos(lat1) * Math.cos(lat2);
    double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));

    double R = 3960;

    double distance = R * c;
    return distance;
}

Используя этот метод, вы просто сравниваете расстояние, возвращаемое (в милях) до вашего порога (в нашем примере 0.0189394 миль), и если возвращаемое расстояние меньше порога, мы знаем пользователей в пределах диапазона следующего шага.

2. Как узнать, как далеко от моего текущего местоположения до следующего маневра / шага? Нужно ли пересчитывать расстояние после изменения моего местоположения, так как мое местоположение всегда меняется?

Ответ на первую часть вашего вопроса содержится в вопросе 1. Чтобы ответить на вторую часть, вы можете позвонить mapView.setOnMyLocationChangeListener и сделать новый MapView.OnMyLocationChangeListener(). В нем вам нужно будет пересчитать расстояние между Пользователем и координатами следующих шагов, как в Примере в вопросе 1.

3. Как узнать, что пользователь совершил неверное действие? Например, предполагается повернуть направо, но пользователь повернул налево. Мне нужно попросить ваш сервер пересчитать маршрут.

Вы можете сделать это, используя метод isOffRoute(), который вычислит расстояние между предоставленной userLocation и каждой путевой точкой в маршрут, приводящий к статусу вне маршрута, если расстояние всегда больше порогового значения (в настоящее время 0,1 мили). Поэтому в вашем случае, поскольку вы хотите пересчитать новый маршрут, если пользователь отклоняется от маршрута, я бы создал оператор if, подобный этому примеру:

if (route.isOffRoute(userLocation)) {
    Toast.makeText(this, "You are off-route.", Toast.LENGTH_SHORT).show();
}

Вместо того, чтобы показывать сообщение пользователю, я бы запросил новый маршрут. Важно отметить, что в настоящее время в методе есть ошибка, которая будет исправлена в версии 1.1, а также позволит вам установить порог себе. Я постараюсь обновить этот ответ, как только он будет выпущен и исправлена ошибка.

Я надеюсь, что ответил на все ваши вопросы и не стесняйтесь задавать вопросы ниже, и я отвечу на них как можно быстрее.

Я также рекомендую вам попробовать заглянуть в Open by Mapzen.

Вот ссылка на сообщение в блоге https://mapzen.com/blog/we-made-an-app и видео https://vimeo.com/112231821 для некоторого озарения.