Cómo intenté arreglar un mapa de búsqueda de controladores. Parte 3 (final)

Entonces, esta es la tercera parte de mi intento de repensar la búsqueda de mapas habitual. La primera parte está aquí , y la segunda aquí : son más técnicas, pero puede pasar por sus ojos para una mejor comprensión. En pocas palabras, suena así: estoy cansado de hurgar en los mapas mientras conduzco, tratando de encontrar la estación de servicio más cercana entre pequeños iconos y anuncios. En cambio, me gustaría ir a mirar la pantalla de la aplicación. Para que pueda clasificar los lugares más cercanos por tiempo de conducción, les mostrará una lista, explicará cuáles de ellos están en camino y qué tráfico hay para ellos. Que idea.



En realidad, con la versión 3.0 de la aplicación, finalmente fue posible implementar todas las funciones básicas que quería. Después del último artículo de esta serie, varias personas lo descargaron e incluso escribieron reseñas; gracias, escuché a todos. Trabajé intensamente en la nueva versión del mes durante dos meses, no puedo enumerar todos los cambios menores; de hecho, esta es una aplicación 80% nueva. Con una interfaz radicalmente mejorada, 2 veces más rápida y mucho más estable. Nuevamente, invito a simpatizantes a evaluar y regañar. Y bajo el corte nuevamente puntos técnicos.

Aquí están los enlaces a iPhone y Android

Embotellamientos


Una de las quejas clave sobre la versión anterior de la aplicación fue el cálculo incorrecto del tiempo: lo implementé por mi cuenta a través de la máquina de enrutamiento de código abierto, y él consideró el tiempo neto del camino. Durante los períodos de tráfico mínimo (por ejemplo, de noche), mis números coincidieron con el hecho de que emitieron las mismas tarjetas de Google, pero en la mayoría de los casos la estimación fue al menos extremadamente optimista. Esto nivelaba el significado de la aplicación en sí, y era necesario encontrar algo.

Hay dos formas de resolver esto: recurrir a una API de terceros o tratar de bombear pesos de tráfico desde algún lugar e importar a usted mismo. Realmente no quería depender de nadie, así que pasé un tiempo buscando una segunda solución. Los resultados fueron decepcionantes: nunca he encontrado una base de datos de pesos de tráfico con una cobertura global que sea compatible con OpenStreetMap. Hay algunas bases abiertas para piezas de Europa y América, que, en teoría, se pueden coser con OSM saltando con una pandereta, pero al final, después de reflexionar, decidí no involucrarme. Por supuesto, la oportunidad de alojar la navegación con tráfico atrajo, pero ahuyentaron la cobertura incompleta, las dificultades con la integración, los errores y el hecho de que el tráfico estaba en caché, y no en tiempo real. En resumen, de nuevo pasa mucho tiempo y obtén un minúsculo al final.

Al darme cuenta de que en nuestro tiempo sin API, un tío grande no está en ninguna parte, comencé a buscar un tío adecuado y barato. Después de tropezar, opté por los servicios AQUÍ : estas son tarjetas Nokia anteriores, luego Microsoft me las llevó, dejándolas como una unidad separada. Según tengo entendido, ahora trabajan principalmente con clientes corporativos (por ejemplo, en logística) y tienen una API bastante sana y limpia. Y lo más importante, tienen tráfico global en tiempo real y cuotas bastante generosas. Una elección obvia, pero decidí probarlo.

La integración terminó siendo bastante simple. Aquí desempeñó un papel importante la flexibilidad general de la arquitectura, que he inspirado. Si lo desea, ahora es fácil integrar al menos Google, al menos atascos de tráfico Yandex en él. Hice el tráfico AQUÍ desconectado del respaldo de mi navegación anterior. Finalmente, al comparar los valores sin tráfico (mina) y con tráfico, puede obtener una estimación general: una carretera vacía, tráfico ligero, promedio, etc.

Mapas - Lista


Los mapas fueron el segundo reclamo principal de la aplicación. Pasé una cantidad increíble de tiempo dibujando mis propias vistas previas de la ruta y el mapa general, e incluso funcionó, pero generar mosaicos de trama con un diseño moderno derrochó drásticamente el servidor. Si en el modo de prueba las imágenes aparecieron en medio segundo, entonces con una audiencia real (incluso una pequeña), la gente podría esperar hasta cinco o incluso diez (!!!!) segundos. Especialmente si la parte del mapa era grande, entonces mi código masticaba y mostraba un montón de datos vectoriales. Además, este proceso no está particularmente paralelo: había cuellos de botella y todas las líneas se obstruyeron rápidamente de todos modos. En general, tristeza.

Era obvio qué hacer: tirar las miniaturas de las cartas al infierno. Luché conmigo mismo durante mucho tiempo (todo lo que hice durante tanto tiempo), pero al final tomé una decisión decidida y, en general, hice lo correcto. Cuando las imágenes enormes y a menudo no cargadas se fueron, se calmó y se liberó mucho espacio en la pantalla. Incluso llenándolo con nuevos datos y aumentando las etiquetas, pude meter en la pantalla el doble de resultados que antes.



Mapas - Nuevo modo


Pero con la carta común, actué de manera diferente. Nadie (incluido yo mismo) podría entender por qué, de hecho, es necesario. Fue hecho a sí mismo, torpe, cargado para siempre y, en general, se creó originalmente para la depuración. Sin embargo, la imagen visual de la isocrón por alguna razón continuó calentando mi alma y, como resultado, permaneció ocupando un lugar en la interfaz. Entonces decidí: intentemos hacer un modo de visualización alternativo completo de esta imagen sin sentido. Si a alguien no le gusta la lista y lee el mapa más fácilmente, ¿por qué no? Además, todavía tenía un par de ideas que no se podían encontrar en ningún otro lado.

De mala gana, tiré mi foto (el servidor gimiendo por la carga estaba agradecido por esto). En cambio, construí un mapa completo a través del complemento flutter_map (tomé los mosaicos de fondo de Mapbox ) y comencé a mostrar mi posición y los puntos de resultados. La necesidad de agrupar estos puntos surgió casi de inmediato, y rápidamente dibujé el código de agrupación basado en la distancia. Es bastante primitivo, pero cubre el 90% de los casos. Debajo de todo esto, nuevamente planté mi amada mancha verde de isocrona. Finalmente, la leyenda del mapa también se volvió interactiva: toque por el número de resultados enfoca el mapa en puntos, y toque en tiempo - en isocrón. Bastante comodo



Una de las ideas en las que sentí el valor, pero no pude formularlo de ninguna manera, fue mostrar la ruta actual y el vector de movimiento del vehículo. Traté de ponerlo en las tarjetas de ruta de diferentes maneras, pero en ningún lugar parecía orgánico y en su lugar. Y finalmente, casi desesperado, me di cuenta: el nuevo modo de mapa es ideal para este chip. Porque en el modo de lista, escribo directamente con texto, en el camino en algún lugar o no, pero en el mapa esto siempre es incomprensible. Incluso en Google o Apple, observa un sector de la brújula que gira constantemente y durante mucho tiempo no comprende en qué dirección va.

Inspirado, me senté a trabajar. Tuve que refactorizar un montón de código en el camino, pero después de un par de días la lógica estaba lista. Decidí no actualizar la posición cada 200 metros, como resultado, sino más a menudo a través de 10 metros. Cada actualización recalculo el vector de movimiento, por lo que resulta ser muy preciso, porque no depende del acelerómetro, sino de la posición anterior. La ruta (es decir, un conjunto de la historia de nuestras coordenadas) que dibujo en el mapa con una línea y la dirección del movimiento, con una flecha. Todo esto se actualiza casi en tiempo real, y ni siquiera puede imaginar cuánto se ha transformado el mapa y se ha vuelto más conveniente.



Un matiz separado fue el hecho de que en los primeros segundos de recibir una ubicación, el GPS todavía está calibrado. ¿Has notado cómo el punto se arrastra en el mapa durante un tiempo al principio? Con mi lógica, estos movimientos fantasmas darían inmediatamente conclusiones falsas sobre la dirección del movimiento. Y teniendo en cuenta el hecho de que la próxima actualización de los resultados ya después de 200 metros, esto mal informaría fríamente al controlador. Resolví este problema de manera muy simple: finja que estamos parados antes de la primera actualización. Es decir, no muestre en el mapa ni una flecha (aunque el punto todavía se arrastra) ni una ruta. Y para desbloquear estos datos después de eso, cuando nos movimos una distancia significativa, pasaron 5 segundos y las posibilidades de obtener información falsa son prácticamente nulas.

También agregué una tarjeta que se bloquea cuando selecciono un resultado en el mapa. De hecho, estos son los mismos datos que en la lista, pero se les agrega una vista previa de ruta (sí, aún regresó) y un botón que inicia la navegación.



Interfaz


En general, la interfaz ha sido completamente rediseñada. No describiré cómo reescribí los menús, reconstruí la paleta de colores y todo eso. Me centraré en los puntos más interesantes. Todas las inscripciones se ampliaron proporcionalmente (mi visión descendente fue útil aquí, aumentó hasta que yo mismo la vi desde el asiento del conductor). Cambió la fuente a SF Pro Rounded: esta es una variación redondeada de Apple San Francisco. Descargar aquí , fuente sensata. Recomiendo encarecidamente en los casos en que no tenga texto sólido, pero los troqueles grandes deben ser legibles desde lejos.

Después de pensarlo un poco, tomé la decisión obvia de eliminar el filtro "Along the Way". Al igual que el filtro por tiempo, al principio parecía casi la función principal de la aplicación. Sin embargo, en algún momento me di cuenta de que no lo estaba usando. En el modo de lista, puede ver claramente qué lugares están en camino, y en el modo de mapa, es completamente confuso. Durante algún tiempo, arrastré este interruptor sin sentido a través de las interfaces, después de lo cual simplemente lo oculté y no perdí nada. Además, puramente técnico, produjo matices que eran tristes y completamente opcionales.

Datos


En realidad, el principal problema en el momento de la aplicación son los datos. Todavía los tomo de OSM con todos los problemas concomitantes: cobertura desigual, muchos datos obsoletos, falta de horas, teléfonos, etc. Mi backend está construido de tal manera que es muy fácil integrar cualquier API de terceros en él, ¿solo aquí dónde obtenerlo? El primer (y mejor) candidato es Google Places, pero después de un reciente aumento en el precio del 1400% (Lord) todavía no puedo pagarlos. Todo lo demás, TripAdvisor, Foursquare y similares, son caros o con una API torpe. Algunos servicios (el mismo Mapbox o AQUÍ), bajo la apariencia de sus datos, proporcionan lugares masticados de OSM que yo mismo tengo.

De toda esta fraternidad, decidí tratar de joder a Yelp , parece ser barato y la API parecía decente. Comprendí que este es un portal estadounidense, respectivamente, habrá un mínimo de datos en otras partes del mundo, pero al menos algún progreso. Y al principio todo parecía bastante bueno: integé todo en un par de horas e incluso leí que afirman tener cobertura en casi la mitad del mundo. Sin embargo, no tuve tiempo de alegrarme cuando comenzó un circo. Una gran cantidad de lugares en sus datos tenían coordenadas incorrectas. Obviamente, ingresaron a lugares no a través de puntos, sino a través de direcciones, y su geocodificador organizó las coordenadas arbitrariamente. Como resultado, tengo una estación de servicio en el lugar correcto, pero a excepción de la dirección, casi no tiene datos; y tienen revisiones, calificaciones y horarios de apertura; solo las coordenadas son generalmente zurdas. Las únicas propiedades por las cuales se pueden reducir nuestros datos son el nombre y la dirección. Y a menudo tanto eso, como eso está escrito arbitrariamente, con errores, formateado incorrectamente, etc. Traté de compararlos a través de mi geocodificador + coincidencia difusa, y, en principio, funcionó, aunque todavía perdemos un cierto porcentaje de lugares de esta manera.

Pero este fue solo el primer problema. El resto recayó en ellos: tienen una búsqueda de radio muy inestable, un montón de errores (si lees los comentarios de las personas en su git, entonces nada funciona) y así sucesivamente. Al final, verifiqué los requisitos para la marca: resulta que debes usar sus estrellas rojas (!!!) para clasificar los lugares. Después de ver cómo se ve en mi interfaz, escupí y apagué todo este stand.



Como resultado, no hay mucho progreso con los datos. En realidad, lo único que puede ser (y muy fácil) hacer es atornillar Google Places. Todo está bien allí, tanto con cobertura como con coordenadas. Solo que ahora cuesta mucho dinero. Por lo tanto, le pido su opinión: ¿qué le parecería una suscripción paga? En la versión gratuita, sería como es ahora, pero por una cantidad simbólica por mes, los datos de Google o Yandex estarán disponibles (debe leer cuánto cuestan). Así que probablemente no voy a ir a la quiebra.

Resumen


En general, descubrí recientemente: durante casi un año y medio, esta aplicación me llevó. Por supuesto, no todo mi tiempo libre lo pasé en él, pero la mayor parte es seguro. Lo tiré un par de veces durante un mes, a veces parecía que nunca lo terminaría, pero aún así lo hice. Y, en principio, ahora se ve exactamente como quería desde el principio. En el camino, dominé más de una nueva tecnología y gané mucha experiencia. En general, fue interesante. Ahora me alegraría si el resultado fuera útil para alguien.

PS


Sobre los derechos de autopromoción: en el intervalo hice otra solicitud para mí, muy pequeña: un asistente de estacionamiento. No lo traduje al ruso, pero hay una interfaz de un botón. Quizás alguien esté interesado.

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


All Articles