Pull to refresh

Yandex maps для приложения Такси

Reading time4 min
Views7.7K
Для большинства приложений, которые используют работу с геопозицией, картами и маршрутами, я предпочитаю 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();

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

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

Матвиенко Александр, Хоссейн Фахр.
Tags:
Hubs:
Total votes 8: ↑6 and ↓2+4
Comments6

Articles