Prefácio
Com o desenvolvimento generalizado da Internet móvel hoje, o desenvolvimento de aplicativos se tornou a primeira escolha para muitas empresas entrarem na Internet móvel. O autor desenvolveu muitos aplicativos e descobriu que muitos aplicativos têm essa função, ou seja, para obter pessoas próximas. Como obter pessoas próximas? De fato, é muito simples. É sempre registrar as informações das coordenadas do usuário (latitude e longitude) no banco de dados e, em seguida, pesquisar todos os usuários no banco de dados e a posição de coordenada atual dentro de um determinado intervalo com base nas coordenadas do usuário atual.
De fato, para a distância entre dois indivíduos cuja localização geográfica não muda, é melhor o resultado diretamente estático. Isto é, escreva -o diretamente na configuração.
Por exemplo, encontre uma estação de metrô perto de sua casa.
Nesse caso, de um modo geral, o assunto de "Home" não "correr" com facilidade ". Não faz sentido calcular a distância uma vez a cada consulta. É melhor persistir a distância e consultá -la diretamente.
Outro caso:
Obtenha a estação de metrô perto da localização do usuário do aplicativo
Nesse caso, a localização geográfica do usuário muda. Portanto, a distância real deve ser calculada em tempo real sempre.
Idéias de implementação
Trate a Terra como uma esfera padrão e use a fórmula de distância esférica para calcular o comprimento do arco do grande círculo entre dois pontos na superfície esférica.
Distância esférica
public static duplo getDistance2 (Double Long1, Double Lat1, Double Long2, Double Lat2) {Lat1 = Rad (Lat1); lat2 = rad (lat2); duplo a = lat1 - lat2; duplo b = rad (long1 - long2); duplo sa2 = math.sin (a / 2.0); duplo sb2 = math.sin (b / 2.0); Retornar 2 * Earth_mean_radius_km * Math.asin (Math.sqrt (SA2 * SA2 + Math.cos (Lat1) * Math.cos (Lat2) * Sb2 * SB2));}Apenas saiba a latitude e a longitude entre dois pontos.
Obviamente, esse cálculo deve ser colocado no banco de dados e depois classificado de volta de acordo com a distância. Basta trazer a fórmula acima para o SQL.
Exemplos de estações de metrô próximas
Tabela de exemplo para construir uma estação de metrô
Criar estação de tabela (ID int Auto_increment Primária Chave, Nome Varchar (20) Comentário Nulo 'Nome da Estação MRT', LNG Double Null Comment 'Longitude', Lat Double Null Comment 'Dimension');
Exemplo SQL
Set @targetLat = 31.175702; set @targetlng = 121.519095; selecione s.id, s.name, s.lng, s.lat, redondo (6378.138 * 2 * asin (sqrt (pow (sin (@TargetLat * Pi () / 180 - S.L (sqrt (sin (@TargetLat * Pi () / 180 - S.L (sqrt (sin (@TargetLat * Pi () / 180 - @targetlat * pi () / 180) * cos (s.lat * pi () / 180) * pow (sin ((@targetlng * pi () / 180 - s.lng * pi () / 180) / 2), 2))) * 1000) como sorvedor de distância a distância por ASC, s.idlim 20;
Entre eles, TargetLat e Targetlng estão os locais geográficos dos usuários.
Isso pode realmente atingir o objetivo. No entanto, isso é para calcular a distância entre todos os dados e o usuário primeiro e depois classificá -los.
Quando o número de estações de metrô é muito grande, essa operação será menos elegante. Não apenas não é elegante o suficiente, mas também é muito eficiente.
otimização
De fato, muitos dados podem ser filtrados antes de calcular a distância.
Não há necessidade de calcular a distância entre a estação de metrô dos EUA ao calcular a distância entre as estações de metrô de Xangai.
Isso pode ser filtrado alguns dados indesejados primeiro na maioria dos aplicativos.
Por exemplo, quando os dados distinguem as cidades, você pode alterar o SQL para o seguinte:
Set @targetLat = 31.175702; set @targetlng = 121.519095; set @cityId = 605; select s.id, s.name, s.lng, s.lat, redou (6378.138 * 2 * (sqrt (pow (sin (s. (@Targetlat * Pi * 2) + cos (@targetlat * pi () / 180) * cos (s.lat * pi () / 180) * pow (sin ((@targetlng * pi () / 180 - s.lng * Pi () / 180) / 2), 2) * 1000) como a distância da estação de distância swhere_id =
A melhoria acima é remover a maioria dos dados a serem calculados antes de calcular. Ao procurar uma estação de metrô Changsha, não há necessidade de pesquisar primeiro em Xangai.
Obviamente, essa situação é um pouco especial porque você pode conhecer a cidade onde o usuário está localizado com antecedência.
Outra melhoria é:
Com a localização do usuário como centro, desenhe um círculo com um raio r e ejete reversamente a faixa de latitude e longitude do quadriláster externo do círculo. Antes de calcular a distância, filtre os dados fora da longitude e longitude do quadrilateral externo.
Especifique um raio ideal r e filtre os dados que não podem atender primeiro aos critérios.
Faixa quadrilateral externa reversa
/*** Obtenha a latitude e a longitude dos quatro vértices do ponto na latitude e longitude especificadas {@code raio} quadrilateral externo de km (estritamente falando, deve ser um cubo externo)** @param lng longitude* @param latitude* @paramgius, unidade: km* @Return> <l2), lng Lng* @param latitude* @paramgius, unidade: km* @Return> Tuple4 <bloun> calcboxbyDistFrompt (LNG duplo, duplo lat, raio duplo) {contexto spatialContext = spatialcontext.geo; Retângulo retângulo = context.getDistCalc () // .calcboxbydistfrompt (// context.makepoint (lng, lat), // radius * com.spatial4j.core.distance.distanceutils.km_to_deg, contexto null //); Retornar novo tuple4 <> (retangle.getminx (), retangle.getmaxx (), retangle.getMiny (), retangle.getMaxy ());}As coordenadas do Maven usadas aqui são as seguintes:
<Depencency> <Puerpid> com.spatial4j </groupiD> <TRARFACTID> SPATIAL4J </ARTIFACTID> <versão> 0.5 </sipers> </dependency>
Neste momento, o SQL pode ser alterado para isso:
Set @targetLat = 31.175702; set @targetlng = 121.519095; selecione s.id, s.name, s.lng, s.lat, redondo (6378.138 * 2 * asin (sqrt (pow (sin (@TargetLat * Pi () / 180 - S.L (sqrt (sin (@TargetLat * Pi () / 180 - S.L (sqrt (sin (@TargetLat * Pi () / 180 - @targetlat * pi () / 180) * cos (s.lat * pi () / 180) * pow (sin ((@targetlng * pi () / 180 - s.lng * pi () / 180) / 2), lng)) * 1000) como a distância e a distância swhere (s.lng entre $ {2). $ {Lat1} e $ {Lat2}) Ordem por distância ASC, s.idlimit 20;O LNG1, LNG2, LAT1, LAT2 acima é a faixa do quadrilátero externo.
Informações citadas: http://blog.csdn.net/a364572/article/details/50483568
Amostra de código -fonte
Serviço: https: //github.com/hylexus/bl ...
Inicialize dados: https: //github.com/hylexus/bl ...
Resumir
O acima é o conteúdo inteiro deste artigo. Espero que o conteúdo deste artigo tenha certo valor de referência para o estudo ou trabalho de todos. Se você tiver alguma dúvida, pode deixar uma mensagem para se comunicar. Obrigado pelo seu apoio ao wulin.com.