Obter nome da cidade via latitude e longitude (e bônus)
- Muitos usuários não autorizam a coleta dos dados
- É necessário pagar pelos serviços de geolocalização por IP ou do Google
- Não existe serviço gratuito de geolicalização
- Não existe uma lib que faça toda a parte de geolocalização
Você terá que pagar o uso da maioria desses serviços com diversas limitações. Que tal ter sua própria lista de estados e cidades, juntamente com a latitude e longitude conhecidas?
A base de dados brasileira que já está pronta
Não tente construir a lista sozinho. Este projeto GRATUITO, por exemplo, é um banco de dados brasileiro de estados e cidades: Uma lista de 5.568 cidades e 27 estados tem o tamanho de 430 KB!
Vale muito a pena, considerando a quantidade de dados que você precisa armazenar e os benefícios que obtém com eles.
API
É necessário configurar uma rota/endpoint em seu framework pra receber latitude e longitude, e retornar os dados da cidade, através da consulta detalhada no final do artigo.
Agora que tenho minha própria lista de cidades, e uma API, posso indicar ao usuário o nome da cidade dele, ou ainda outras cidades próximas, como detalhado no BÔNUS.
BÔNUS
Posso mostrar apenas a cidade do usuário, mas também consigo exibir pra ele os nomes das 5 cidades mais próximas pra expandir resultados ou fazer qualquer outra coisa que eu quiser. Com esta consulta simples ao banco de dados MySQL do meu aplicativo! Veja como é simples, mas poderoso
set @lat=-20.0080509185791; set @lng=-44.003021240234375; -- The main SQL query that returns the closest 5 airports. SELECT id, nome, lat, lng, 111.045 * DEGREES(ACOS(COS(RADIANS(@lat)) * COS(RADIANS(lat)) * COS(RADIANS(lng) - RADIANS(@lng)) + SIN(RADIANS(@lat)) * SIN(RADIANS(lat)))) AS distance_in_km FROM cities ORDER BY distance_in_km ASC LIMIT 0,5;
OpenLayers
Através da biblioteca OpenLayers é possível desenhar pontos ou polígonos no mapa. Isso abre possibilidade para uma ampla gama de aplicações. Saiba mais sobre o projeto
Quer saber mais sobre como funciona? Fale com um desenvolvedor agora mesmo!