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

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

HERE maps для Android: обзор технологии

Владислав Герасименко
Android-разработчик

HERE — это быстроразвивающийся молодой картографический проект от компании Nokia. Here maps уже используется в продуктах таких крупных компаний как BMW и Nissan. Компания Nokia выпустила SDK для работы с Here maps для платформ IOS и Android весной 2016 года. За такой малый период SDK для мобильных платформ стала очень популярна по всему миру. В данной статье я хочу поделится своими хорошими впечатлениями после работы с Here maps SDK на Android. Этот проект обладает поистине богатым функционалом.

Простота в использовании

На мой взгляд, главным достоинством SDK является простота в его использовании. Комплекс создан таким образом, что за все отвечает движок, который инициализируется перед использованием карт. Для того что бы добавить карту в Activity, нужно добавить MapFragment в ее разметку:

<fragment
  class="com.here.android.mpa.mapping.MapFragment"
  android:id="@+id/mapfragment"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
/>

Затем инициализировать движок и начинать работать с картой после вызова сallback метода с результатом инициализации:

mapFragment = (MapFragment)getFragmentManager().findFragmentById(
            R.id.mapfragment);
    mapFragment.init(new OnEngineInitListener() {
      @Override
      public void onEngineInitializationCompleted(
              OnEngineInitListener.Error error)
      {
        if (error == OnEngineInitListener.Error.NONE) {
          // инициализация прошла успешно, можно начинать работать
         Map map = mapFragment.getMap();
        } else {
           // или произошла какая-то ошибка при инициализации
        }
      }
    });

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

3D модели

Here maps способна отображать трехмерные модели зданий, а некоторые достопримечательности имеют точный графический образ реальных объектов. Существуют отдельный классы для работы со зданиями. Например, MapBuildingObject позволяет получать наименование сооружения и даже его высоту. При клике на модель можно получить сам экземпляр класса и необходимую информацию о здании. Есть класс MapBuildingGroup, который предназначен для работы с группой зданий. Для нее можно менять стиль оформления графической модели.

Вот пример добавления здания к группе и изменения цвета для этой группы:

// создадим группу зданий
MapBuildingGroup  buildingGroup = map.getMapBuildingLayer().createNewBuildingGroup();
// зададим тип модели здания с крышей и изменим цвет крыши на красный
buildingGroup.setColor(Color.RED, EnumSet.of(MapBuildingGroup.BuildingFace.ROOF));
//добавляем новое здание к группе
MapBuildingObject building = (MapBuildingObject) vo;
buildingGroup.addBuilding(building.getIdentifier());

После этого добавленное в группу здание будет выглядеть на карте следующим образом:

Теперь давайте попробуем изменить облик здания на его реалистичную модель. Для этого группе зданий зададим облик BuildingFace.LANDMARKS:

buildingGroup.setColor(Color.RED, EnumSet.of(MapBuildingGroup.BuildingFace.LANDMARKS));

Теперь, если в базе HERE занесена точная 3D модель данного здания, оно обретет следующий вид:

Отличный дизайн

На мой взгляд, дизайн карт Here очень интересный, необычный и многим отличается от других популярных карт, таких как google maps или mapbox. Here карты позволяют просматривать не только 3d модель здания, но и 3d модель всего земного шара. При уменьшении зума до минимальных значений на экране будет просматриваться модель земного шара.

Here maps поддерживает несколько схем отображения: «Нормальная», «Спутник», «Ландшафтная» и «Гибридная». Кроме того, у каждой схемы есть и ночная версия отображения, и версия для отображения дорожного трафика. Для изменения схемы, например на гибридную, дневную с отображением дорожного трафика, нам понадобится вызов всего одного метода:

map.setMapScheme(Map.Scheme.HYBRID_TRAFFIC_DAY);

Вот несколько скриншотов карты с разными схемами:

Навигация

В HERE maps SDK реализован очень простой и удобный процесс навигации к определенному местоположению. Для построения маршрута между точками, достаточно добавить их к классу RoutePlan, а затем вызвать один метод calculateRoute. Перед этим добавим listener на событие построения маршрута, на callback метод поступит объект RouteResult, который мы добавим на карту. И все!

//класс CoreRouter - управляет вычислением маршрута
    CoreRouter router = new CoreRouter();
    RoutePlan routePlan = new RoutePlan();
    // добавляем точки
    routePlan.addWaypoint(new RouteWaypoint(new GeoCoordinate(49.1966286, -123.0053635)));
    routePlan.addWaypoint(new RouteWaypoint(new GeoCoordinate(49.1947289, -123.1762924)));
    // вычисляем маршрут
    router.calculateRoute(routePlan, new RouteListener());


    ..........
    private class RouteListener implements CoreRouter.Listener {

    public void onProgress(int percentage) {
    // если нужно, показываем прогресс вычисления маршрута
  }

  // Method defined in Listener
  public void onCalculateRouteFinished(List<RouteResult> routeResult, RoutingError error) {
    // если маршрут вычислен успешно
    if (error == RoutingError.NONE) {
      // добавляем результат на карту
      mapRoute = new MapRoute(routeResult.get(0).getRoute());
      map.addMapObject(mapRoute);
    }
  }
}

На карту добавится проложенный маршрут между точками в виде полилинии:

Оффлайн карты

<

p>В функционал SDK входит возможность кэшировать карты в памяти устройства. Это позволяет пользователям просматривать карты без доступа к интернету. Управление кэшем происходит автоматически на уровне движка SDK. Простое кэширование карт идет всегда по дефолту, когда пользователь прокручивает карту. Но также, есть возможность скачивать в память устройства целые пакеты карт – начиная от городов и заканчивая континентами. За загрузку карт в память устройства отвечает класс MapLoader. Для старта скачивания достаточно вызвать один метод installMapPackages и указать id пакета, которые хотим загрузить.

installMapPackages(List packageIdList);

Все остальное here сделает за вас!

Даже если пользователи захотят перемещать свои скачанные карты на SD card устройства, мы можем изменять директорию для скачивания карт по умолчанию. Более подробно об оффлайн картах в Here maps SDK можно прочитать в официальной документации.

Заключение

Во время работы с Here maps SDK на Android я получил хорошие впечатления. Простота и насыщенность этого проекта функционалом позволяет быстро и качественно создавать продукт. Думаю, компания Nokia будет иметь большой успех на рынке картографических систем в будущем и будет активно поддерживать SDK для мобильных платформ.

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