Como eu tentei consertar uma pesquisa no mapa por drivers. Parte 3 (final)

Portanto, esta é a terceira parte da minha tentativa de repensar a pesquisa usual no mapa. A primeira parte está aqui e a segunda aqui - elas são mais técnicas, mas você pode passar por seus olhos para entender melhor. Em poucas palavras, soa assim: estou cansado de vasculhar os mapas enquanto dirige, tentando encontrar o posto de gasolina mais próximo entre pequenos ícones e anúncios. Em vez disso, gostaria apenas de olhar a tela do aplicativo. Para classificar os locais mais próximos por tempo de condução, ele os mostraria com uma lista, explicaria quais deles estão a caminho e qual tráfego é para eles. Que ideia.



Na verdade, pela versão 3.0 do aplicativo, finalmente foi possível implementar todas as funções básicas que eu queria. Após o último artigo desta série, várias pessoas fizeram o download e até escreveram críticas - obrigado, ouvi todos. Trabalhei intensamente na nova versão do mês por dois meses, não consigo listar todas as pequenas alterações - na verdade, esse é um aplicativo 80% novo. Com uma interface radicalmente aprimorada, duas vezes mais rápida e muito mais estável. Mais uma vez, convido simpatizantes a avaliar e repreender. E sob o corte novamente pontos técnicos.

Aqui estão os links para iPhone e Android

Engarrafamentos


Uma das principais reclamações sobre a versão anterior do aplicativo foi o cálculo incorreto do tempo - eu o implementei por meio da Open Source Routing Machine, e ele considerou o tempo líquido da estrada. Durante períodos de tráfego mínimo (por exemplo, à noite), meus números coincidiam com o fato de terem emitido os mesmos cartões do Google, mas na maioria dos casos a estimativa era pelo menos extremamente otimista. Isso nivelou o próprio significado do aplicativo em si e foi necessário criar alguma coisa.

Há duas maneiras de resolver isso: recorrer a uma API de terceiros ou tentar extrair pesos de tráfego de algum lugar e importar para si mesmo. Eu realmente não queria depender de ninguém, então passei algum tempo procurando uma segunda solução. Os resultados foram decepcionantes: nunca encontrei um banco de dados de pesos de tráfego com uma cobertura global compatível com o OpenStreetMap. Existem algumas bases abertas para partes da Europa e da América que, em teoria, podem ser costuradas com OSM ao pular com um pandeiro - mas, no final, refletindo, decidi não me envolver. É claro que a oportunidade de hospedar a navegação com tráfego atraiu, mas eles assustaram a cobertura incompleta, as dificuldades de integração, os erros e o fato de o tráfego ter sido armazenado em cache, e não em tempo real. Em suma, novamente gaste muito tempo e obtenha um minúsculo no final.

Percebendo que, em nosso tempo sem API, um tio grande não está em lugar algum, comecei a procurar um tio adequado e barato. Tendo tropeçado, optei pelos serviços HERE - esses são antigos cartões Nokia, e a Microsoft os levou para mim, deixando-os como uma unidade separada. Pelo que entendi, eles agora trabalham principalmente com clientes corporativos (por exemplo, na logística) e têm uma API bastante sã e limpa. E o mais importante, eles têm tráfego global em tempo real e cotas bastante generosas. Uma escolha óbvia, mas eu decidi tentar.

A integração acabou sendo bem simples. Um papel significativo aqui foi desempenhado pela flexibilidade geral da arquitetura, que eu inspirei. Se desejar, agora é fácil integrar pelo menos o Google, pelo menos congestionamentos de tráfego Yandex. Eu fiz o HERE HERE desconectado do fallback para a minha navegação antiga. Finalmente, comparando os valores sem tráfego (o meu) e com o tráfego, você pode derivar uma estimativa geral - uma estrada vazia, tráfego leve, média e assim por diante.

Mapas - Lista


Os mapas foram a segunda reivindicação principal do aplicativo. Passei uma quantidade incrível de tempo desenhando minhas próprias visualizações da rota e do mapa geral, e até funcionou - mas a geração de blocos rasterizados com um design elegante desperdiçou drasticamente o servidor. Se, no modo de teste, as imagens aparecerem em meio segundo, com uma audiência real (mesmo que pequena), as pessoas podem esperar até cinco ou até dez (!!!!) segundos. Especialmente se o pedaço do mapa era grande - então meu código mastigava e renderizava um monte de dados vetoriais. Além disso, esse processo não é particularmente paralelo: houve gargalos e todas as linhas foram rapidamente entupidas. Em geral, tristeza.

O que fazer, era óbvio - jogue fora as miniaturas das cartas para o inferno. Eu lutei comigo mesmo por um longo tempo (tudo o que fiz por tanto tempo), mas no final tomei uma decisão forte e, em geral, fiz a coisa certa. Quando as fotos enormes e muitas vezes não carregadas deixaram, ficou mais calmo e muito espaço na tela foi liberado. Mesmo preenchendo-o com novos dados e aumentando os rótulos, fui capaz de pressionar na tela duas vezes mais resultados do que antes.



Mapas - Novo modo


Mas com o cartão comum, eu agi de maneira diferente. Ninguém (inclusive eu) conseguia entender por que, de fato, é necessário. Foi feito por conta própria, desajeitado, carregado para sempre e, em geral, foi criado originalmente para depuração. No entanto, a imagem visual do isócrono, por algum motivo, continuou aquecendo minha alma e, como resultado, permaneceu ocupando um lugar na interface. Então decidi: vamos tentar criar um modo de visualização alternativo completo a partir dessa imagem sem sentido. Se alguém não gostar da lista e ler o mapa com mais facilidade - por que não? Além disso, eu ainda tinha algumas idéias que não poderiam ser encontradas em nenhum outro lugar.

Relutantemente, joguei fora minha foto (o servidor que estava gemendo com a carga ficou agradecido por isso). Em vez disso, construí um mapa completo por meio do plug-in flutter_map - peguei os blocos de fundo do Mapbox - e comecei a mostrar nele minha posição e os pontos dos resultados. A necessidade de agrupar esses pontos surgiu quase imediatamente, e rapidamente descrevi o código de agrupamento baseado em distância. É bastante primitivo, mas cobre 90% dos casos. Sob tudo isso, plantei novamente minha amada mancha verde de isocrona. Por fim, a legenda do mapa também se tornou interativa: toque no número de resultados e concentre o mapa em pontos e toque no isócrono de tempo. Bastante confortável.



Uma das idéias em que senti o valor, mas não consegui formulá-lo de nenhuma maneira, foi exibir a rota atual e o vetor de movimento do veículo. Tentei colocá-lo nos cartões de rota de maneiras diferentes, mas em nenhum lugar parecia orgânico e em seu lugar. E, finalmente, quase desesperado, percebi: o novo modo de mapa é ideal para esse chip. Porque no modo de lista, escrevo diretamente com texto, em algum lugar ou não - mas no mapa isso é sempre incompreensível. Mesmo no Google ou na Apple, você observa um setor da bússola em constante rotação e, durante muito tempo, não entende em que direção está indo.

Inspirado, sentei-me para trabalhar. Eu tive que refatorar um monte de código ao longo do caminho, mas depois de alguns dias a lógica estava pronta. Decidi não atualizar a posição a cada 200 metros, como resultado, mas com mais frequência a 10 metros. Cada atualização recalcula o vetor de movimento e, por isso, é muito preciso, porque depende não do acelerômetro, mas da posição anterior. A rota (isto é, uma matriz da história de nossas coordenadas) eu traço no mapa com uma linha e a direção do movimento - com uma seta. Tudo isso é atualizado quase em tempo real, e você nem imagina o quanto o mapa transformou e se tornou mais conveniente.



Uma nuance separada foi o fato de que, nos primeiros segundos de recebimento de um local, o GPS ainda é calibrado. Você já reparou como o ponto se arrasta no mapa por um tempo no começo? Na minha lógica, esses movimentos fantasmas dariam imediatamente conclusões falsas sobre a direção do movimento. E levando em conta o fato de que a próxima atualização dos resultados já após 200 metros, isso desinformaria o motorista. Resolvi esse problema de maneira muito simples: finja que estamos diante da primeira atualização. Ou seja, não mostre no mapa nem uma seta (embora o ponto ainda se arraste), nem uma rota. E para desbloquear esses dados depois disso, quando mudamos uma distância significativa, passaram 5 segundos e as chances de obter informações falsas são praticamente nulas.

Também adicionei um cartão que trava quando seleciono um resultado no mapa. Na verdade, esses são os mesmos dados da lista, mas uma visualização da rota é adicionada a eles (sim, ele ainda retornou) e um botão que inicia a navegação.



Interface


Em geral, a interface foi completamente redesenhada. Não vou descrever como reescrevi os menus, reconstruí a paleta de cores e tudo mais. Vou me concentrar nos pontos mais interessantes. Todas as inscrições foram aumentadas proporcionalmente (minha visão de queda veio a calhar aqui - aumentou até que eu mesma a vi do banco do motorista). A fonte foi alterada para SF Pro Rounded - esta é uma variação arredondada da Apple San Francisco. Baixe aqui , fonte sensata. Eu recomendo fortemente nos casos em que você não possui texto sólido, mas matrizes grandes que devem ser legíveis de longe.

Depois de pensar um pouco, tomei uma decisão óbvia para remover o filtro "Ao longo do caminho". Como o filtro por tempo, a princípio parecia quase a principal função do aplicativo. No entanto, em algum momento, percebi que não estava usando. No modo de lista, você pode ver claramente quais lugares estão a caminho e, no modo de mapa, é completamente confuso. Por algum tempo, arrastei esse comutador sem sentido pelas interfaces, após o que simplesmente o ocultei e não perdi nada. Além disso, puramente tecnicamente, ele produziu nuances sombrias e completamente opcionais.

Dados


Na verdade, o principal problema no momento da aplicação são os dados. Ainda os retiro do OSM com todos os problemas decorrentes: cobertura desigual, muitos dados desatualizados, falta de horas, telefones e assim por diante. Meu back-end é construído de tal maneira que é muito fácil integrar qualquer API de terceiros a ele - apenas aqui onde obtê-lo? O primeiro (e melhor) candidato é o Google Places, mas depois de um aumento recente no preço de 1400% (Senhor), ainda não posso pagar. Todo o resto - TripAdvisor, Quadrangular e similares - é caro ou tem uma API desajeitada. Alguns serviços (o mesmo Mapbox ou HERE), sob o disfarce de seus dados, fornecem locais mastigados do OSM que eu mesmo possuo.

De toda essa fraternidade, decidi tentar estragar o Yelp - parece ser barato e a API parecia decente. Eu entendi que este é um portal americano, respectivamente, haverá um mínimo de dados em outras partes do mundo, mas pelo menos algum progresso. E, a princípio, tudo parecia muito bom: integrei tudo em algumas horas e até li que eles reivindicam cobertura para quase metade do mundo. No entanto, não tive tempo de me alegrar quando um circo começou. Um grande número de lugares em seus dados tinha coordenadas incorretas. Obviamente, eles entraram em lugares não através de pontos, mas através de endereços - e seu geocoder organizou as coordenadas arbitrariamente. Como resultado, tenho um posto de gasolina no lugar certo, mas, exceto pelo endereço, ele quase não possui dados; e eles têm avaliações, classificações e horário de funcionamento - somente as coordenadas geralmente são canhotos. As únicas propriedades pelas quais nossos dados podem ser reduzidos são o nome e o endereço. E muitas vezes isso e aquilo são escritos arbitrariamente, com erros, formatados incorretamente etc. Tentei compará-los através do meu geocoder + correspondência difusa e, em princípio, funcionou - embora ainda percam uma certa porcentagem de lugares dessa maneira.

Mas este foi apenas o primeiro problema. O resto caiu sobre eles: eles têm uma pesquisa de raio muito instável, um monte de bugs (se você ler os comentários das pessoas no git deles, então nada funcionará lá) e assim por diante. No final, verifiquei os requisitos de branding - você deve usar as estrelas vermelhas (!!!) para classificar os lugares. Depois de ver como fica na minha interface, cuspi e desliguei todo o estande.



Como resultado, não há muito progresso com os dados. Na verdade, a única coisa que pode ser (e muito fácil) é estragar o Google Places. Está tudo bem lá, tanto com cobertura quanto com coordenadas. Só que agora custa muito dinheiro agora. Portanto, peço sua opinião: como você se sentiria com uma assinatura paga? Na versão gratuita, seria como é agora, mas por alguma quantia simbólica por mês os dados do Google ou Yandex estariam disponíveis (você precisa ler quanto eles custam). Então provavelmente não vou falir.

Sumário


Em geral, eu descobri recentemente: por quase um ano e meio essa inscrição me levou. Claro, nem todo o meu tempo livre que gastei nele, mas a maior parte é com certeza. Joguei-o algumas vezes durante um mês, às vezes parecia que eu nunca terminaria - mas ainda assim o fiz. E, em princípio, agora parece exatamente como eu queria desde o início. Ao longo do caminho, dominei mais de uma nova tecnologia e ganhei muita experiência. Em geral, foi interessante. Agora eu ficaria feliz se o resultado fosse útil para alguém.

PS


Sobre os direitos de autopromoção: nesse intervalo, fiz outro pedido para mim, muito pequeno - um assistente de estacionamento. Não o traduzi para o russo, mas existe uma interface de um botão. Talvez alguém esteja interessado.

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


All Articles