Пожалуйста, опишите ошибку

Нашли баг? Помогите нам его исправить, заполнив эту форму

Новое в блоге: Анимация Skeleton

Skobbler maps

Марк Левковский
Android-разработчик

Эта статья о картах Skobbler, об их применении и основных плюсах на примере использования под Android SDK.

 

Начнем с информационной справки. Помимо Android, имеется SDK для IOS и плагины под Web интерфейс. Разработчики взяли за основу технологии OSM (Open Street Maps) и доработали некоторые алгоритмы, например, определение реальной скорости движения и обнаружение полос движения.

Плюсы использования OSM в том, что это open source карты, которые может редактировать любой желающий (на данный момент это около 1.5 миллиона человек). Благодаря этому они очень детальны и регулярно обновляются. На фото ниже сравнение OSM (слева) и Google Maps (справа).

сравнение OSM (слева) и Google Maps (справа)

Еще одна важная особенность Skobbler — карты рендерятся на устройстве в реальном времени при помощи Open GL 2, благодаря чему кэш и размер пакетов для использования оффлайн имеют небольшой вес. Так, например, пакет с любым более-менее крупным городом — в пределах 10-15 Мб.

Прочие достоинства Skobbler — это встроенная навигация с подсказками, детальное API и почти бесплатное использование.

3

Как работать с картами

Рассмотрим всё более детально на примере приложения Go Beyond и официального демо-приложения от Skobbler.

В первую очередь необходимо установить SDK для карт. Есть два пути:

  1. Скачать репозиторий самостоятельно и закинуть в нужные директории в проекте
  2. Прописать команды в Gradle. Все произойдет в автоматическом режиме и установится куда нужно.

Помимо этого, в манифесте прописываются разрешения на использование GPS и доступ в Интернет, а также ключ к картам, который легко получается на сайте Skobbler.

Следующий шаг — это отображение карты на экране нашего устройства. Также два способа: в xml устанавливаем либо стандартный фрагмент, либо View из SDK самих карт. Далее непосредственно в коде происходит инициализация в зависимости от выбранного ранее способа.

Перейдем к взаимодействию с картами. Самое важное в приложении Go Beyond — это отображение маршрута (тура) на карте. Задается он, как и все в картах, всего парой строчек кода.

public void initTourWay(ArrayList pois, Context context, boolean isNavigationModeOn, boolean isFirstCoordinateReceived) {
        if (isNavigationModeOn && !isFirstCoordinateReceived) {
            Toast.makeText(context, "Waiting for GPS coordinate", Toast.LENGTH_SHORT).show();
            return;
        }

        if (pois != null && pois.size() >= 2) {
            SKRouteSettings route = new SKRouteSettings();

            route.setStartCoordinate(new SKCoordinate(pois.get(0).getLongitude(), pois.get(0).getLatitude()));
            int poisArrLenght = pois.size() - 1;
            route.setDestinationCoordinate(new SKCoordinate(pois.get(poisArrLenght).getLongitude(),
                    pois.get(poisArrLenght).getLatitude()));

            if (pois.size() > 2) {
                ArrayList tourViaPoints = new ArrayList<>();
                for (int i = 1; i < pois.size() - 1; ++i) {
                    tourViaPoints.add(new SKViaPoint(i - 1, new SKCoordinate(pois.get(i).getLongitude(),
                            pois.get(i).getLatitude())));
                }
                route.setViaPoints(tourViaPoints);
            }
            if (isNavigationModeOn) {
                SKAdvisorSettings advisorSettings = new SKAdvisorSettings();
                setAdvisorSettings(advisorSettings);
            }

            route.setRouteMode(SKRouteSettings.SKRouteMode.PEDESTRIAN);
            setRoute(route);
        }
    }

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

4

Второй момент — это маркеры на карте. В моем случае ими являлись сами точки тура. Для отображения такого маркера, опять же, нужна точка с координатами для установки положения маркера и View, которое этим маркером и будет являться. Ограничений особо нет, можно использовать хоть целый layout (что я и делал, так как маркеры имели у меня свой номер, который они и отображали). Я также применял возможность установки маркера в том месте, куда кликнешь на карте.

public void addEndPoint(SKCoordinate coordinate) {
        View view = View.inflate(context, R.layout.poi_search, null);
        SKAnnotation annotation = new SKAnnotation(15);
        annotation.setUniqueID(45);
        setAnnotationView(coordinate, view, annotation);
    }

5

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

@Override
    public void onDoubleTap(SKScreenPoint skScreenPoint) {  }

    @Override
    public void onSingleTap(SKScreenPoint skScreenPoint) {   }

    @Override
    public void onRotateMap() {   }

    @Override
    public void onLongPress(SKScreenPoint skScreenPoint) {   }

    @Override
    public void onInternetConnectionNeeded() {   }

    @Override
    public void onMapActionDown(SKScreenPoint skScreenPoint) {   }

    @Override
    public void onMapActionUp(SKScreenPoint skScreenPoint) {   }

    @Override
    public void onPOIClusterSelected(SKPOICluster skpoiCluster) {   }

    @Override
    public void onMapPOISelected(SKMapPOI skMapPOI) {   }

    @Override
    public void onAnnotationSelected(SKAnnotation skAnnotation) {  }

    @Override
    public void onCustomPOISelected(SKMapCustomPOI skMapCustomPOI) {   }

    @Override
    public void onCompassSelected() {   }

    @Override
    public void onCurrentPositionSelected() {  }

    @Override
    public void onObjectSelected(int i) {  }

    @Override
    public void onInternationalisationCalled(int i) {  }

    @Override
    public void onBoundingBoxImageRendered(int i) {  }

    @Override
    public void onGLInitializationError(String errorMessage) {  }

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

Перейдем к самому главному в картах Skobbler — это навигация. Работает она «из коробки»: подключается к построенному туру и ведет по нему, используя аудио и визуальные подсказки. Аудио подсказки есть двух типов — заранее записанные фразы, которые хранятся в SDK, или просто перевод текстовой подсказки в речь. Визуальные подсказки представляют собой отображение следующего направления движения.

6

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

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

Как говорилось ранее, существуют оффлайн пакеты со странами и городами. Их загрузка происходит только через демоприложение Skobbler. Загруженные пакеты перемещаются в проект, а в коде прописывается путь к ним. Если установлены оффлайн пакеты, то можно пользоваться и оффлайн геокодингом, который будет работать только по пакету, который вы установили.

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

private void searchAtCurrentLevel(long parentId, SKListLevel level) {
        // get a search manager object
        SKSearchManager mgr = new SKSearchManager(this);
        // get a multi-step search object
        SKMultiStepSearchSettings searchSettings = new SKMultiStepSearchSettings();
        // set the offline package in which to search
        // the France package in this case needs to be installed
        searchSettings.setOfflinePackageCode("FR");
        // set list level of the search
        searchSettings.setListLevel(level );
        // set maximum number of results to be received
        searchSettings.setMaxSearchResultsNumber(20);
        // set the id of the parent in which to search
        searchSettings.setParentIndex(parentId);
        // set a filter for the results
        searchSettings.setSearchTerm("P");
        // initiate the search
        mgr.multistepSearch(searchSettings);
    }

    private void startSearch() {
        // this will start a search at country level (for city results) in France
        searchAtCurrentLevel(-1, listLevel );
    }

Остальные особенности я не использовал, но про них стоит упомянуть.

У карт есть 4 стиля: стандартный, ночной, уличный и черно-белый.

7

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

8

И последнее это HEATMAP. На карте можно отобразить концентрацию каких-либо объектов. Чем «теплее», тем их больше в данном области. Видов объектов огромное количество: парковки, кафе, яхтклубы, парки и прочее.

9

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

Читать и комментировать

Краснодар

Коммунаров, 268,
3 эт, офисы 705, 707

+7 (861) 200 27 34

Хьюстон

3523 Brinton trails Ln Katy

+1 833 933 0204

Москва

+7 (495) 145-01-05