Для большинства приложений, которые используют работу с геопозицией, картами и маршрутами, я предпочитаю Google Maps. Потому как Google Maps имеет обширный набор функций, хорошую документацию, а также отличный mapkit для реализации любых визуальных и программных идей. К большому сожалению Google Maps не является панацей для реализации всех возможных задач. Проблема заключается в том что имеются местности, города и т.д., которые не до конца изучены компанией, и ввиду этого могут отсутствовать номера домов и даже целые улицы.

На рис. 1 вы можете рассмотреть то как выглядит один из районов города на Google Maps, а на рис. 2 вы можете увидеть то как выглядит этот же район только на картах Яндекса.

image
рис. 1

image
рис. 2

По-моему разница видна на глаз, сразу понятно что по каким-то причинам карты от Google не успели/смогли/захотели прорабатывать эту часть города и, как видно, на ней отсутствуют как номера домов так и названия улиц.

Так как для приложения-такси очень важно иметь как можно более достоверную информацию о городе и его улицах (компаниях, заведениях и т.д.), решено было использовать карты от Яндекс. Сколько бы времени я не работал с картами от Яндекс, ощущения как в первый раз, к сожалению много из них вызывают не совсем положительные эмоции. Может кто-то сможет меня поправить, но документация для mapkit довольно таки скудная, и большое количество необходимого функционала приходилось лепить из того что было.

Стилизация карт


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

String style = "[" +
       "  {" +
       "    \"featureType\" : \"all\"," +
       "    \"stylers\" : {" +
       "      \"hue\" : \"1\"," +
       "      \"saturation\" : \"-1\"," +
       "      \"lightness\" : \"0.78\"" +
       "    }" +
       "  }" +
       "]";
mapView.getMap().setMapStyle(style);

Запрос подсказок (suggestions)


До того как прийти к окончательному варианту запроса подсказок, было перепроверено несколько способов, последним и самым результативным был способ получения подсказок через SuggestSession.

Изначально создаем экземпляр объекта SearchManager и экземпляр объекта SuggestSession:

private SearchManager searchManager;
private SuggestSession suggestSession = null;

инициализируем searchManager в методе onCreate()

searchManager = SearchFactory.getInstance()
       .createSearchManager(SearchManagerType.COMBINED);

далее в методе requestSuggest(String query) инициализируем объект suggestSession, при этом не забываем о том что каждый раз создавать новую сессию нам не нужно.

if (suggestSession == null)
   suggestSession = searchManager.createSuggestSession();

Для того чтобы получить подсказки по компаниям используем параметр SuggestType.BIZ, также для того чтобы получить данные по региону пользователя необходимо использовать BoundigBox, который инициализируется следующим образом:

private final BoundingBox BOUNDING_BOX = new BoundingBox(
       new Point(66.066191, 76.468435),
       new Point(66.149326, 76.824836));

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

suggestSession.suggest(query, BOUNDING_BOX, new SuggestOptions()
               .setSuggestTypes(SuggestType.BIZ.value)
               .setUserPosition(CENTER),
       new SuggestSession.SuggestListener() {
           @Override
           public void onResponse(@NonNull List<SuggestItem> list) {
           }
           @Override
           public void onError(@NonNull Error error) {
           }
       });

Если же нам необходимо получить улицы, дома и т.д., тогда используем параметр SuggestType.BIZ:

suggestSession.suggest(query, BOUNDING_BOX, new SuggestOptions()
               .setSuggestTypes(SuggestType.GEO.value)
               .setUserPosition(CENTER),
       new SuggestSession.SuggestListener() {
           @Override
           public void onResponse(@NonNull List<SuggestItem> list) {
           }
           @Override
           public void onError(@NonNull Error error) {
           }
       });

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

И последнее чем хотелось бы сегодня поделится — это отображение вашего SuggestItem в списке. Изначально было вроде бы все понятно потому как объект имеет несколько свойств:

getSearchText();
getDisplayText();

Что как по-мне подразумевает что есть полная строка для поиска и строка для отображения, но при этом в 99% случаев эти строки совпадают и для того чтобы получить простое название улицы, при этом не используя регулярных выражений (это могло навредить отображению, так как могло обрезать необходимые для понимания данные: название улицы, номер дома, квартиры и т.д.), было использована след функция:

suggestItem.getTitle().getText();

Как ни странно данная функция отдает необходимый результат, хотя изначально этот вариант и не казался столь очевидным.

На самом деле это всего лишь пара мелочей с которыми пришлось столкнуться в этом приложении. Для того чтобы не растягивать статью оставлю это на вторую часть, так как построение маршрутов, отображение маркеров и! что не менее важное в таком приложении как такси движение автомобиля по карте с его поворотом.

Матвиенко Александр, Хоссейн Фахр.

Комментарии (5)


  1. DirectX
    24.10.2019 07:38
    +1

    Не хотелось бы расстраивать, но основной вопрос при использовании Яндекс карт в приложении такси не в стилизации и построении маршрутов, а в том, что его вообще нельзя использовать в приложении такси и подобных применениях. Гуглокарты — можно (и то только платный вариант API), Яндексом же может пользоваться только Яндекс в своем такси. Увы.


    Поэтому лучше обратить внимание на Open Street Map и производные от него библиотеки вроде MapBox.


    1. dronsovest
      24.10.2019 08:46
      +1

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

      Работаю в компании Таксомёт. Мы конкурент Яндекс.такси о котором он скорее всего не знает. Пользуемся ОSM. Для построения маршрутов — производную от них систему OSRM.

      Справедливости ради нужно сказать, что Яндекс.Карты действительно очень качественные для России. В целом пронумерованных домов получается больше чем в OSM. Хотя время от времени встречаются города, где OSM значительно подробнее, чем Я.Карты. Возможно там живут активные энтузиасты OSM.

      Ну и минус OSM в том что тэги однородных объектов в разных городах могут отличаться. Не хватает единообразия в данных. Лечиться это всё автозаменой, но отнимает время.

      В качестве резюме: если бы Я.карты были бесплатные или хотя бы вменяемые по цене, то скорее всего пользовались бы ими. OpenStreetMap очень достойная альтернатива. Чуть хуже по качеству, зато free. Во всех смыслах этого слова.


      1. istepan
        24.10.2019 09:16
        +1

        Чуть хуже по качеству,

        Вы вполне можете помочь.
        Например загружать GPX треки.
        Сделать в программе отдельный справочный раздел где можно описать в кратце что такое OSM и как водитель может её отредактировать.

        Есть ещё проект www.mapillary.com/app


        1. dronsovest
          24.10.2019 09:41

          Я знаю. Я даже пробовал. И зарегистрировался. И на форуме отметился.

          Но вот не моё. Понимаю что нужно не только брать, но и отдавать. На форуме OSM понял что люди ловят кайф от картографирования. А я не ловлю. Для меня это труд, обязанность и ответственность.

          В походах по Кавказским горам полностью перешел на OSM. Для города использую 2GIS, а в походах приложение OSMAnd. Тут видимо тоже энтузиасты очень круто постарались. Обозначены тропы, места отдыха, обзорные площадки, источники питьевой воды. Вот просто респект и уважуха. Но самому писать треки и вводить объекты не хочется. Прошу понять и простить.


  1. eumorozov
    24.10.2019 10:35

    Качество всех карт очень отличается в зависимости от города. Например, Яндекс.Карты за пределами России почти бесполезны, зато в России очень подробные. В Индии карты Google зачастую проигрывают по детализации OSM, но при этом чаще строят более оптимальные маршруты (парадокс). Для Камбоджи OSM почти отсутствуют, местные видимо вообще об OSM не слышлали. Монголия по-моему на всех картах — белое пятно.


    Если еще начать сравнивать построение маршрутов и удобство навигации… Для нас Google вообще неприменим, по-моему, т.к. он сообщает голосовые подсказки используя стороны света: «Поверните на юго-запад». Мама родная, откуда ж я знаю где юг, где запад, если я ночью под дождем стою на неизвестном перекрестке?! У Яндекса голосовые подсказки отвратительного качества, если ориентироваться на них. Часто он говорит: «Поверните направо» когда ты уже на середине перекрестка или за ним. Или уже на перекрестке, но стоишь в крайнем левом ряду.


    В общем, идеала нет, у меня в телефоне стоит куча различных карт и 3 или 4 различных навигатора для разных случаев жизни. Хоть и не таксист.