Nano Hash - криптовалюты, майнинг, программирование

Mapbox (Android) не показывает направления

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

Я использую этот учебник, предоставленный самими Mapbox: https://www.mapbox.com/android-sdk/examples/directions/ . Ошибки сообщений нет, на самом деле всплывающее сообщение, показывающее расстояние маршрута, отображается после того, как я открываю вид карты. ("Route is 0.0 meters long.") Я проверил журналы, общий HTML-код — 200 (это нормально), а в отладочном сообщении показан маршрут длиной 0,0 метра. Кроме этого ошибок в логе не обнаружено.

Я дважды проверял код в течение недели на наличие ошибок, которые я сделал, но я не нашел ничего, что могло бы спровоцировать ошибку, чтобы не показывать маршрут. Я также отладил код, и он без проблем достигает функции drawRoute, я также проверил токен, и он работает нормально.

Что я сделал, чтобы не показывать маршрут? Большое спасибо!

Пример изображения, когда вы пытаетесь увидеть маршрут.

Java-код:

public class Mapa extends Activity {
private static final String TAG = "Mapa"; //Tag para usar no log de debug e error

private MapView mapView;
private MapboxMap map;
private DirectionsRoute currentRoute;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // Mapbox usa esse token de acesso atraves de uma conta do mapbox, so precisa ser configurado uma vez!
    MapboxAccountManager.start(this,getString(R.string.access_token));

    // Contem o mapview exposto em XML e precisa ser chamado LOGO APOS o account manager
    setContentView(R.layout.activity_main);

    // Funcao que pede permissao para o usuario no seu celular -- TODO
    PedePermissao();

    // Origem: Rodoviaria
    final Position origin = Position.fromCoordinates(-15.794082, -47.882645);
    // Destino: Reitoria
    final Position destination = Position.fromCoordinates(-15.762604, -47.866611);


    //Configuracao do mapa
    mapView = (MapView) findViewById(R.id.mapView);
    mapView.onCreate(savedInstanceState);
    mapView.getMapAsync(new OnMapReadyCallback() {
        @Override
        public void onMapReady(MapboxMap mapboxMap) {
            map = mapboxMap;

            // Criacao e declaracao do icone
            IconFactory iconFactory = IconFactory.getInstance(Mapa.this);
            Drawable iconDrawable = ContextCompat.getDrawable(Mapa.this, R.drawable.infoicon);
            Icon icon = iconFactory.fromDrawable(iconDrawable);
            Drawable iconeDrawableRota = ContextCompat.getDrawable(Mapa.this, R.drawable.infoicon_rota);
            Icon iconeRota = iconFactory.fromDrawable(iconeDrawableRota);

            //Marcadores das instalacoes
            mapboxMap.addMarker(new MarkerViewOptions()
                    .position(new LatLng(-15.76363, -47.86949))
                    .title("ICC Centro")
                    .snippet(getString(R.string.desc_ICC_Centro))
                    .icon(icon));

            mapboxMap.addMarker(new MarkerViewOptions()
                    .position(new LatLng(-15.7629936, -47.86717415))
                    .title("Reitoria")
                    .snippet(getString(R.string.desc_Reitoria))
                    .icon(icon));

            mapboxMap.addMarker(new MarkerViewOptions()
                    .position(new LatLng(-15.76196106, -47.87008166))
                    .title("FAU")
                    .snippet(getString(R.string.desc_FAU))
                    .icon(icon));

            // Adicionando os marcadores de destino da rota
            mapboxMap.addMarker(new MarkerOptions()
                    .position(new LatLng(origin.getLatitude(), origin.getLongitude()))
                    .title("Origem")
                    .icon(iconeRota));
            mapboxMap.addMarker(new MarkerOptions()
                    .position(new LatLng(destination.getLatitude(), destination.getLongitude()))
                    .title("Destino")
                    .icon(iconeRota));

            try {
                getRoute(origin, destination);
            } catch (ServicesException servicesException) {
                servicesException.printStackTrace();
            }

            //Dados da janela (infowindow) quando clicar em um ponteiro (marker)
            mapboxMap.setInfoWindowAdapter(new MapboxMap.InfoWindowAdapter() {
                    //...
                }
            });
        }
    });
}

private void getRoute(Position origin, Position destination) throws ServicesException {

    MapboxDirections client = new MapboxDirections.Builder()
            .setOrigin(origin)
            .setDestination(destination)
            .setProfile(DirectionsCriteria.PROFILE_DRIVING)
            .setAccessToken(MapboxAccountManager.getInstance().getAccessToken())
            .build();


    client.enqueueCall(new Callback<DirectionsResponse>() {
        @Override
        public void onResponse(Call<DirectionsResponse> call, Response<DirectionsResponse> response) {

            // Voce pode pegar mensagens de erro genericas do http sobre o response

            Log.d(TAG, "Codigo de resposta: " + response.code());
            if (response.body() == null) {
                Log.e(TAG, "Sem rotas encontradas, porém sem o uso do token, verifique o token de acesso");
                return;
            } else if (response.body().getRoutes().size() < 1) {
                Log.e(TAG, "Sem rotas encontradas!");
                return;
            }

            // Printa algumas informacoes sobre a rota
            currentRoute = response.body().getRoutes().get(0);
            Log.d(TAG, "Distancia: " + currentRoute.getDistance());
            Toast.makeText(
                    Mapa.this,
                    "A rota tem " + currentRoute.getDistance() + " metros de distância.",
                    Toast.LENGTH_SHORT).show();

            // Desenhar a rota no mapa
            drawRoute(currentRoute);
        }

        @Override
        public void onFailure(Call<DirectionsResponse> call, Throwable throwable) {
            Log.e(TAG, "Erro: " + throwable.getMessage());
            Toast.makeText(Mapa.this, "Erro: " + throwable.getMessage(), Toast.LENGTH_SHORT).show();
        }
    });
}

private void drawRoute(DirectionsRoute route) {

    // Converter as coordenadas LineString em LatLng[]
    LineString lineString = LineString.fromPolyline(route.getGeometry(), Constants.OSRM_PRECISION_V5);
    List<Position> coordinates = lineString.getCoordinates();
    LatLng[] points = new LatLng[coordinates.size()];
    for (int i = 0; i < coordinates.size(); i++) {
        points[i] = new LatLng(
                coordinates.get(i).getLatitude(),
                coordinates.get(i).getLongitude());
    }

    // Escrever os pontos no MapView
    map.addPolyline(new PolylineOptions()
            .add(points)
            .color(Color.parseColor("#009688"))
            .width(5));
}

Ответы:


1

Ваши координаты указаны в неправильном порядке. В то время как LatLng создается в порядке latitude, longitude, Position имеет порядок xy или longitude, latitude. Таким образом, ваш пункт отправления и назначения должен быть:

// Origem: Rodoviaria
final Position origin = Position.fromCoordinates(-47.882645, -15.794082);
// Destino: Reitoria
final Position destination = Position.fromCoordinates(-47.866611, -15.762604);
28.11.2016
  • ... Убей меня. Спасибо за помощь! ... Очередной раз! 30.11.2016
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..