Comment j'ai essayé de corriger une recherche de carte pour les pilotes. Partie 3 (finale)

Donc, c'est la troisième partie de ma tentative de repenser la recherche de carte habituelle. La première partie est ici , et la seconde ici - elles sont plus techniques, mais vous pouvez parcourir vos yeux pour une meilleure compréhension. En résumé, cela ressemble à ceci: je suis fatigué de fouiller dans les cartes en conduisant, en essayant de trouver la station-service la plus proche parmi les petites icônes et les publicités. Au lieu de cela, je voudrais simplement regarder l'écran de l'application. Pour lui permettre de trier les lieux les plus proches en fonction du temps de conduite, il leur montrerait une liste, leur expliquerait lesquels sont en route et quel trafic leur est destiné. Une telle idée.



En fait, par la version 3.0 de l'application, il était enfin possible d'implémenter toutes les fonctions de base que je voulais. Après le dernier article de cette série, un certain nombre de personnes l'ont téléchargé et ont même écrit des critiques - merci, j'ai écouté tout le monde. J'ai travaillé intensivement sur la nouvelle version du mois pendant deux mois, je ne peux pas lister toutes les modifications mineures - en fait c'est une nouvelle application à 80%. Avec une interface radicalement améliorée, 2 fois plus rapide et beaucoup plus stable. Encore une fois, j'invite les sympathisants à évaluer et à réprimander. Et sous la coupe encore des points techniques.

Voici les liens vers iPhone et Android

Embouteillages


L'une des principales plaintes concernant la version précédente de l'application était le calcul incorrect du temps - je l'ai implémenté par moi-même via l'Open Source Routing Machine, et il a considéré le temps net de la route. Pendant les périodes de trafic minimal (par exemple, la nuit), mes chiffres coïncidaient avec le fait qu'ils émettaient les mêmes cartes Google, mais dans la plupart des cas, l'estimation était au moins extrêmement optimiste. Cela a nivelé le sens même de l'application elle-même et il a fallu trouver quelque chose.

Il existe deux façons de résoudre ce problème: tournez-vous vers une API tierce ou essayez de pomper les poids du trafic de quelque part et importez-les vous-même. Je ne voulais vraiment dépendre de personne. J'ai donc passé un peu de temps à chercher une deuxième solution. Les résultats ont été décevants: je n'ai jamais trouvé de base de données de poids de trafic avec une couverture globale compatible avec OpenStreetMap. Il existe des bases ouvertes pour des morceaux d'Europe et d'Amérique, qui en théorie peuvent être cousus avec OSM en sautant avec un tambourin - mais à la fin, après réflexion, j'ai décidé de ne pas m'impliquer. Bien sûr, la possibilité d'héberger la navigation avec du trafic a attiré, mais ils ont effrayé une couverture incomplète, des difficultés d'intégration, des erreurs et le fait que le trafic était mis en cache, et pas en temps réel. En bref, encore une fois, passez beaucoup de temps et obtenez un minuscule à la fin.

Réalisant qu'à notre époque sans api un grand oncle n'est nulle part, j'ai commencé à chercher un oncle adéquat et bon marché. Après avoir trébuché, j'ai opté pour les services ICI - ce sont d'anciennes cartes Nokia, puis Microsoft me les a prises, les laissant comme une unité distincte. Si je comprends bien, ils travaillent maintenant principalement avec des clients d'entreprise (par exemple, sur la logistique) et ont une api assez saine et propre. Et surtout, ils ont un trafic mondial en temps réel et des quotas assez généreux. Un choix peu évident, mais j'ai décidé de l'essayer.

L'intégration s'est avérée assez simple. Un rôle important a été joué ici par la flexibilité générale de l'architecture, que j'ai inspirée. Si vous le souhaitez, il est désormais facile d'intégrer au moins Google, au moins les embouteillages Yandex. J'ai fait ICI le trafic déconnecté du repli vers mon ancienne navigation. Enfin, en comparant les valeurs sans trafic (le mien) et avec le trafic, vous pouvez dériver une estimation générale - une route vide, un trafic léger, une moyenne, etc.

Cartes - Liste


Les cartes étaient la deuxième revendication majeure de l'application. J'ai passé un temps incroyable à dessiner mes propres aperçus de l'itinéraire et de la carte générale, et cela a même fonctionné - mais la génération de tuiles raster avec un design à la mode a drastiquement dilapidé le serveur. Si en mode test, les images apparaissent dans une demi-seconde, alors avec un public réel (même petit), les gens peuvent attendre jusqu'à cinq voire dix (!!!!) secondes. Surtout si la partie de la carte était grande - alors mon code a mâché et rendu un tas de données vectorielles. De plus, ce processus n'est pas particulièrement parallélisé: il y avait des goulots d'étranglement, et toutes les lignes se sont de toute façon rapidement bouchées. En général, la tristesse.

Que faire, c'était évident - jeter les vignettes des cartes en enfer. J'ai lutté avec moi-même pendant longtemps (tout ce que j'ai fait pendant si longtemps), mais à la fin j'ai pris une décision ferme et, en général, j'ai fait la bonne chose. Lorsque les images énormes et souvent non chargées sont parties, elles sont devenues plus calmes et beaucoup d'espace sur l'écran a été libéré. Même en les remplissant de nouvelles données et en augmentant le nombre d'étiquettes, j'ai pu insérer deux fois plus de résultats dans l'écran qu'auparavant.



Cartes - Nouveau mode


Mais avec la carte commune, j'ai agi différemment. Personne (y compris moi-même) ne pouvait comprendre pourquoi, en fait, c'était nécessaire. Il était autodidacte, maladroit, chargé pour toujours et en général a été créé à l'origine pour le débogage. Cependant, l'image visuelle de l'isochron a continué pour une raison quelconque à réchauffer mon âme et, par conséquent, elle est restée occuper une place dans l'interface. J'ai alors décidé: essayons de créer un mode de visualisation alternatif à part entière à partir de cette image vide de sens. Si quelqu'un n'aime pas la liste et lit la carte plus facilement - pourquoi pas? De plus, j'avais encore quelques idées qui ne pouvaient être trouvées nulle part ailleurs.

À contrecœur, j'ai jeté ma photo (le serveur gémissant de la charge en était reconnaissant). Au lieu de cela, j'ai construit une carte à part entière via le plugin flutter_map - j'ai pris les tuiles d'arrière-plan de Mapbox - et j'ai commencé à montrer ma position et les points des résultats autour. Le besoin de regrouper ces points est apparu presque immédiatement, et j'ai rapidement esquissé le code de regroupement basé sur la distance. Il est assez primitif, mais couvre 90% des cas. Dans tout cela, j'ai de nouveau planté ma tache verte bien-aimée d'isochrone. Enfin, la légende de la carte est également devenue interactive: appuyez sur le nombre de résultats pour focaliser la carte sur des points et appuyez sur le temps - sur l'isochron. Assez confortable.



L'une des idées dont j'ai ressenti la valeur, mais que je ne pouvais en aucun cas la formuler, était d'afficher l'itinéraire actuel et le vecteur de mouvement du véhicule. J'ai essayé de le mettre dans les fiches de route de différentes manières, mais il ne semblait nulle part organique et à sa place. Et enfin, presque désespéré, je me suis rendu compte: le nouveau mode de carte est idéal pour cette puce. Parce qu'en mode liste, j'écris directement avec du texte, en cours de route ou non - mais sur la carte c'est toujours incompréhensible. Même chez Google ou Apple, vous observez un secteur en rotation constante de la boussole et pendant longtemps vous ne comprenez pas dans quelle direction vous allez.

Inspiré, je me suis assis pour travailler. J'ai dû refactoriser un tas de code en cours de route, mais après quelques jours, la logique était prête. J'ai décidé de ne pas mettre à jour la position tous les 200 mètres, car les résultats, mais plus souvent sur 10 mètres. Chaque mise à jour, je recalcule le vecteur de mouvement, et il s'avère donc très précis, car cela ne dépend pas de l'accéléromètre, mais de la position précédente. L'itinéraire (c'est-à-dire un tableau de l'historique de nos coordonnées) que je dessine sur la carte avec une ligne et la direction du mouvement - avec une flèche. Tout cela est mis à jour presque en temps réel, et vous ne pouvez même pas imaginer à quel point la carte s'est transformée et est devenue plus pratique.



Une nuance distincte était le fait que dans les premières secondes de réception d'un emplacement, le GPS est toujours calibré. Avez-vous remarqué comment le point se glisse sur la carte pendant un certain temps au début? Avec ma logique, ces mouvements fantômes donneraient immédiatement de fausses conclusions sur la direction du mouvement. Et compte tenu du fait que la prochaine mise à jour des résultats déjà après 200 mètres, cela désinformerait froidement le pilote. J'ai résolu ce problème très simplement: faites comme si nous étions debout avant la première mise à jour. C'est-à-dire, ne montrez sur la carte ni une flèche (bien que le point glisse toujours), ni un itinéraire. Et pour débloquer ces données après cela, lorsque nous avons parcouru une distance importante, 5 secondes se sont écoulées et les chances d'obtenir de fausses informations sont pratiquement nulles.

J'ai également ajouté une carte qui se bloque lorsque je sélectionne un résultat sur la carte. En fait, ce sont les mêmes données que dans la liste, mais un aperçu de l'itinéraire leur est ajouté (oui, il est toujours retourné) et un bouton qui démarre la navigation.



Interface


En général, l'interface a été entièrement redessinée. Je ne décrirai pas comment j'ai réécrit les menus, reconstruit la palette de couleurs et tout ça. Je vais me concentrer sur les points les plus intéressants. Toutes les inscriptions ont été agrandies proportionnellement (ma vision tombante a été utile ici - a augmenté jusqu'à ce que je la voie depuis le siège du conducteur). Modification de la police en SF Pro Rounded - il s'agit d'une variante arrondie d'Apple San Francisco. Téléchargez ici , police sensible. Je recommande fortement dans les cas où vous n'avez pas de texte solide, mais des matrices volumineuses qui devraient être lisibles de loin.

Après réflexion, j'ai pris la décision évidente de supprimer le filtre «Le long du chemin». Comme le filtre par le temps, au début, il semblait presque la fonction principale de l'application. Cependant, à un moment donné, j'ai réalisé que je ne l'utilisais pas. En mode liste, vous pouvez clairement voir quels endroits sont sur le chemin, et en mode carte, c'est complètement déroutant. Pendant un certain temps, j'ai fait glisser ce commutateur inutilement sur les interfaces, après quoi je l'ai simplement caché et je n'ai rien perdu. De plus, purement technique, il a produit des nuances mornes et complètement facultatives.

Les données


En fait, le principal problème au moment de la demande concerne les données. Je les reprends toujours à OSM avec tous les problèmes qui en découlent: couverture inégale, beaucoup de données obsolètes, manque d'heures, de téléphones, etc. Mon backend est construit de telle manière qu'il est très facile d'intégrer n'importe quelle API tierce - seulement ici où l'obtenir? Le premier (et meilleur) candidat est Google Places, mais après une récente augmentation du prix de 1400% (Lord), je ne peux toujours pas me le permettre. Tout le reste - TripAdvisor, Foursquare et autres - sont chers ou avec des API maladroites. Certains services (la même Mapbox ou ICI), sous couvert de leurs données, fournissent des endroits mâchés d'OSM que j'ai moi-même.

De toute cette fraternité, j'ai décidé d'essayer de visser Yelp - il semble être bon marché et l'api avait l'air décent. J'ai cru comprendre qu'il s'agissait d'un portail américain, respectivement, qu'il y aurait un minimum de données sur d'autres parties du monde, mais au moins quelques progrès. Et au début, tout avait l'air plutôt bien: j'ai tout intégré en quelques heures, et j'ai même lu qu'ils revendiquent une couverture de près de la moitié du monde. Cependant, je n'ai pas eu le temps de me réjouir quand un cirque a commencé. Un grand nombre d'endroits dans leurs données avaient des coordonnées incorrectes. De toute évidence, ils sont entrés dans des lieux non pas par des points, mais par des adresses - et leur géocodeur a arrangé les coordonnées arbitrairement. En conséquence, j'ai une station-service au bon endroit, mais à l'exception de l'adresse, elle n'a presque pas de données; et ils ont des avis, des notes et des heures d'ouverture - seules les coordonnées sont généralement gauchers. Les seules propriétés par lesquelles nos données peuvent être réduites sont le nom et l'adresse. Et souvent cela et cela est écrit arbitrairement, avec des erreurs, un formatage incorrect, etc. J'ai essayé de les comparer via mon géocodeur + correspondance floue, et, en principe, cela a fonctionné - même si nous perdons toujours un certain pourcentage de places de cette façon.

Mais ce n'était que le premier problème. Le reste est tombé sur eux: ils ont une recherche de rayon très instable, un tas de bugs (si vous lisez les commentaires des gens dans leur git, alors rien ne fonctionne du tout là-bas) et ainsi de suite. En fin de compte, j'ai vérifié les exigences de la marque - il s'avère que vous devez utiliser leurs étoiles rouges (!!!) pour classer les places. Après avoir vu à quoi ça ressemble dans mon interface, j'ai craché et éteint tout ce stand.



En conséquence, il n'y a pas beaucoup de progrès avec les données. En fait, la seule chose qui peut être (et très facile) à faire est de foutre Google Places. Tout va bien là-bas, à la fois avec la couverture et avec les coordonnées. Seulement maintenant, cela coûte beaucoup d'argent maintenant. Par conséquent, je vous demande votre avis: que pensez-vous d'un abonnement payant? Dans la version gratuite, ce serait comme maintenant, mais pour un montant symbolique par mois, des données Google ou Yandex seraient disponibles (vous devez lire combien elles coûtent). Je ne vais donc probablement pas faire faillite.

Résumé


En général, j'ai récemment compris: pendant près d'un an et demi, cette application m'a pris. Bien sûr, je n'ai pas consacré tout mon temps libre à cela, mais la majeure partie est à coup sûr. Je l'ai jeté quelques fois pendant un mois, parfois il semblait que je ne le finirais jamais - mais je l'ai quand même fait. Et, en principe, il ressemble maintenant exactement à ce que je voulais depuis le début. En cours de route, j'ai maîtrisé plus d'une nouvelle technologie et acquis beaucoup d'expérience. En général, c'était intéressant. Maintenant, je serais heureux si le résultat était utile à quelqu'un.

PS


Sur les droits de l'autopromotion: dans l'intervalle, j'ai fait une autre demande pour moi, très petite - un assistant de stationnement. Je ne l'ai pas traduit en russe, mais il existe une interface à un bouton. Peut-être que quelqu'un sera intéressé.

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


All Articles