Cartes Yandex pour l'application Taxi

Pour la plupart des applications qui utilisent la géolocalisation, les cartes et les directions, je préfère Google Maps. Parce que Google Maps possède un ensemble complet de fonctions, une bonne documentation, ainsi qu'un excellent mapkit pour mettre en œuvre toutes les idées visuelles et de programmation. Malheureusement, Google Maps n'est pas une panacée pour la mise en œuvre de toutes les tâches possibles. Le problème est qu'il y a des localités, des villes, etc. qui ne sont pas entièrement comprises par l'entreprise, et à cause de cela, les numéros de maison et même des rues entières peuvent ne pas être disponibles.

Dans la fig. 1 vous pouvez voir à quoi ressemble l'un des quartiers de la ville sur Google Maps, et sur la fig. 2 vous pouvez voir à quoi ressemble cette même zone uniquement sur les cartes Yandex.

image
fig. 1

image
fig. 2

À mon avis, la différence est visible à l'œil nu, il est immédiatement clair que pour une raison quelconque, les cartes de Google n'ont pas / pourraient / ne voulaient pas fonctionner dans cette partie de la ville et, comme vous pouvez le voir, il manque à la fois les numéros de maison et les noms de rue.

Comme il est très important pour une application de taxi d'avoir les informations les plus fiables sur la ville et ses rues (entreprises, institutions, etc.), il a été décidé d'utiliser les cartes Yandex. Peu importe combien de temps je travaille avec des cartes Yandex, le sentiment est comme la première fois, malheureusement, beaucoup d'entre elles provoquent des émotions pas tout à fait positives. Peut-être que quelqu'un peut me réparer, mais la documentation de mapkit est assez rare, et j'ai dû sculpter beaucoup de fonctionnalités nécessaires à partir de ce qu'elles étaient.

Style de carte


Afin de donner à votre carte un caractère unique ou d'intégrer une carte dans votre conception, vous devez lui donner le style nécessaire. La seule méthode que j'ai trouvée ne me plaisait pas vraiment parce que la façon de personnaliser une carte en l'utilisant est assez gênante, et si je comprends bien, je ne comprenais que les paramètres teinte, saturation, légèreté.

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

Demande de suggestions


Avant d'atteindre la version finale de la demande d'invite, plusieurs méthodes ont été revérifiées, le dernier et le plus efficace moyen de recevoir des invites via SuggestSession.

Créez d'abord une instance de l'objet SearchManager et une instance de l'objet SuggestSession :

 private SearchManager searchManager; private SuggestSession suggestSession = null; 

initialiser searchManager dans la méthode onCreate ()

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

De plus, dans la méthode requestSuggest (String query), nous initialisons l'objet suggestSession, et nous n'oublions pas que nous n'avons pas besoin de créer une nouvelle session à chaque fois.

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

Pour obtenir des conseils sur les entreprises, nous utilisons le paramètre SuggestType.BIZ et pour obtenir des données sur la région de l'utilisateur, vous devez utiliser BoundigBox, qui est initialisé comme suit:

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

où le premier point est le coin inférieur gauche et le deuxième coin supérieur droit de votre secteur rectangulaire.

 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) { } }); 

Si nous devons obtenir des rues, des maisons, etc., nous utilisons le paramètre 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) { } }); 

De plus, l'un des problèmes notés était le fait que pour le même nom, plusieurs valeurs identiques sont sorties, je vous conseille donc de les trier immédiatement.

Et la dernière chose que je voudrais partager aujourd'hui est d'afficher votre SuggestItem dans la liste. Au départ, tout semblait clair car l'objet a plusieurs propriétés:

 getSearchText(); getDisplayText(); 

Ce qui, à mon avis, implique qu'il existe une ligne complète pour la recherche et une ligne pour l'affichage, mais dans 99% des cas, ces lignes coïncident afin d'obtenir un nom de rue simple sans utiliser d'expressions régulières (cela pourrait nuire à l'affichage, car pourrait couper les données nécessaires à la compréhension: nom de la rue, numéro de la maison, appartement, etc.), la fonction suivante a été utilisée:

 suggestItem.getTitle().getText(); 

Curieusement, cette fonction donne le résultat nécessaire, même si au départ cette option ne semblait pas si évidente.

En fait, ce ne sont que quelques petites choses qui ont dû être rencontrées dans cette application. Afin de ne pas étirer l’article, je laisse le soin à la deuxième partie, car construire des itinéraires, afficher des marqueurs et! ce qui est tout aussi important dans une application comme un taxi, le déplacement d'une voiture sur une carte avec sa rotation.

Matvienko Alexander, Hossein Fakhr.

Source: https://habr.com/ru/post/fr472798/


All Articles