Навигация по Mapbox по настроенным маршрутам - PullRequest
0 голосов
/ 24 декабря 2018

Итак, Mapbox предоставляет замечательный Navigation SDK для Android, и я пытался создать собственные маршруты, представляя каждую точку как элемент в файле Geojson, а затем передавая их в модуль MapMatching для получения маршрутов.что я могу потом передать в Navigation Engine.

Мое решение состоит из двух основных частей.Первый включает в себя итерацию точек, по которым я хочу перейти, путем добавления их в качестве входных данных к элементу .coordinates MapboxMapMatching.builder () и последующего преобразования его в .toDirectionRoute ();за инструкциями Mapbox и примером здесь: https://www.mapbox.com/android-docs/java/examples/use-map-matching/

private void getWaypointRoute(List<Point> features) {

    originPosition = features.get(0);
    destinationPosition = features.get(features.size() - 1);

    MapboxMapMatching.builder()
            .accessToken(Mapbox.getAccessToken())
            .coordinates(features)
            .steps(true) // Setting this will determine whether to return steps and turn-by-turn instructions.
            .voiceInstructions(true)
            .bannerInstructions(true)
            .profile(DirectionsCriteria.PROFILE_DRIVING)
            .build().enqueueCall(new Callback<MapMatchingResponse>() {

        @Override
        public void onResponse(Call<MapMatchingResponse> call, Response<MapMatchingResponse> response) {
            if (response.body() == null) {
                Log.e(TAG, "Map matching has failed.");
                return;
            }

            if (response.isSuccessful()) {
                currentRoute = response.body().matchings().get(0).toDirectionRoute();

Второй бит включает просто передачу currentRoute на NavigationLauncher, как показано ниже:

                NavigationLauncherOptions options = NavigationLauncherOptions.builder()
                        .origin(origin)
                        .destination(destination)
                        .directionsRoute(currentRoute)
                        .shouldSimulateRoute(simulateRoute)
                        .enableOffRouteDetection(false)
                        .build();

                // Call this method with Context from within an Activity
                NavigationLauncher.startNavigation(MainActivity.this, options);

Пример маршрута можетможно посмотреть здесь Снимок Android-симулятора с маршрутом .Каждая точка на маршруте является пересечением и соответствует объекту в моем файле GeoJson.Проблема становится, когда я запускаю навигацию.Каждый раз, в симуляторе или на реальном устройстве, каждая точка интерпретируется как пункт назначения, поэтому голосовая команда звучит так: «Вы достигли своего первого (второго, третьего и т. Д.) Пункта назначения».Я нахожу это раздражающим, поскольку я хотел бы иметь единственный маршрут с пунктом назначения, и это все.Я просто хотел бы иметь эти точки, чтобы у меня был свой собственный путь вместо кратчайшего, обычно возвращаемого приложениями маршрутизации.Я пытаюсь избежать этой проблемы, отключив voiceInstructions, но затем система переходит на бананы, и экран навигации перемещается к широте, lng (0,0), которая в значительной степени находится где-то к западу от Африки.Любая помощь в том, как я мог решить эту проблему, была бы очень признательна, и я был бы счастлив купить пиво или два для человека, который дает правильный ответ.Я также обратился в службу поддержки Mapbox, но мы не нашли ответа на эту проблему, поэтому я попросил их расширить его внутри своей команды инженеров, как я полагаю, хотя проблема, которую я решаю, не редкость, она все еще неочень проверено разработчиками.Ура!

1 Ответ

0 голосов
/ 22 января 2019

Так что вот я и после любезной поддержки Mapbox Support и Rafa Gutierrez теперь я могу ответить на этот пост сам.

Проблема возникла из-за того, что MapboxMapMatching автоматически устанавливает .coordinates в качестве путевых точек.Если вместо этого кто-то явно редактирует переменную waypoints, чтобы иметь только две путевые точки: начальную и конечную точки, то система может обработать входной настраиваемый маршрут без преобразования каждой входной координаты в качестве путевой точки.Пример кода ниже, надеюсь, проясняет точку, описанную выше:

MapboxMapMatching.builder()
                .accessToken(Mapbox.getAccessToken())
                .coordinates(lineStringRep.coordinates())
                .waypoints(OD)
                .steps(true) 
                .voiceInstructions(true)
                .bannerInstructions(true)
                .profile(DirectionsCriteria.PROFILE_DRIVING)
                .build().enqueueCall(new Callback<MapMatchingResponse>() 

, где OD - массив целых чисел, хранящий первый (начало) и последний индекс (пункт назначения) ваших координат

    OD[0] = 0;
    OD[1] = features.size() - 1;
...