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

рис. 1

рис. 2
По-моему разница видна на глаз, сразу понятно что по каким-то причинам карты от Google не успели/смогли/захотели прорабатывать эту часть города и, как видно, на ней отсутствуют как номера домов так и названия улиц.
Так как для приложения-такси очень важно иметь как можно более достоверную информацию о городе и его улицах (компаниях, заведениях и т.д.), решено было использовать карты от Яндекс. Сколько бы времени я не работал с картами от Яндекс, ощущения как в первый раз, к сожалению много из них вызывают не совсем положительные эмоции. Может кто-то сможет меня поправить, но документация для mapkit довольно таки скудная, и большое количество необходимого функционала приходилось лепить из того что было.
Для того чтобы придать вашей карте уникальности, либо же внедрить карту в ваш дизайн, необходимо придать ей необходимый стиль. Единственный найденный мной способ не особо понравился мне потому как кастомизировать карту при помощи него довольно таки неудобно, и изменять я так понял только параметры hue, saturation, lightness.
До того как прийти к окончательному варианту запроса подсказок, было перепроверено несколько способов, последним и самым результативным был способ получения подсказок через SuggestSession.
Изначально создаем экземпляр объекта SearchManager и экземпляр объекта SuggestSession:
инициализируем searchManager в методе onCreate()
далее в методе requestSuggest(String query) инициализируем объект suggestSession, при этом не забываем о том что каждый раз создавать новую сессию нам не нужно.
Для того чтобы получить подсказки по компаниям используем параметр SuggestType.BIZ, также для того чтобы получить данные по региону пользователя необходимо использовать BoundigBox, который инициализируется следующим образом:
где первая точка — левый нижний угол, а вторая правый верхний угол вашего прямоугольного сектора.
Если же нам необходимо получить улицы, дома и т.д., тогда используем параметр SuggestType.BIZ:
Также одной из замеченных проблем было то что по одному и тому же наименованию в результате выходило несколько одинаковых значений, поэтому советую сразу сортировать это на своей стороне.
И последнее чем хотелось бы сегодня поделится — это отображение вашего SuggestItem в списке. Изначально было вроде бы все понятно потому как объект имеет несколько свойств:
Что как по-мне подразумевает что есть полная строка для поиска и строка для отображения, но при этом в 99% случаев эти строки совпадают и для того чтобы получить простое название улицы, при этом не используя регулярных выражений (это могло навредить отображению, так как могло обрезать необходимые для понимания данные: название улицы, номер дома, квартиры и т.д.), было использована след функция:
Как ни странно данная функция отдает необходимый результат, хотя изначально этот вариант и не казался столь очевидным.
На самом деле это всего лишь пара мелочей с которыми пришлось столкнуться в этом приложении. Для того чтобы не растягивать статью оставлю это на вторую часть, так как построение маршрутов, отображение маркеров и! что не менее важное в таком приложении как такси движение автомобиля по карте с его поворотом.
Матвиенко Александр, Хоссейн Фахр.
На рис. 1 вы можете рассмотреть то как выглядит один из районов города на Google Maps, а на рис. 2 вы можете увидеть то как выглядит этот же район только на картах Яндекса.

рис. 1

рис. 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();
Как ни странно данная функция отдает необходимый результат, хотя изначально этот вариант и не казался столь очевидным.
На самом деле это всего лишь пара мелочей с которыми пришлось столкнуться в этом приложении. Для того чтобы не растягивать статью оставлю это на вторую часть, так как построение маршрутов, отображение маркеров и! что не менее важное в таком приложении как такси движение автомобиля по карте с его поворотом.
Матвиенко Александр, Хоссейн Фахр.