Pergunta

Na minha DB i armazenar um ponto central, juntamente com um raio (em metros).

Eu estou olhando para passar em uma latitude / longitude, e depois ter os valores mysql eu já armazenados criar um círculo para me dizer se o meu ponto i passado é dentro desse círculo. Existe algo que me permita fazer isso, semelhante ao forumla haversine (que iria assumir que o meu ponto já estava no db).

Fórmula Haversine: (3959 acos * (cos (radianos (40)) * cos (radianos (lat)) * cos (radianos (long) - radianos (-110)) + sin (radianos (40)) * sin (radianos (long)) )

db:

circleLatCenter, circleLngCenter, Radius

passando em> selecionar ID do foo, onde LAT, LNG (Função círculo marca: circleLat, circleLng, raio)

Foi útil?

Solução

O MySQL tem toda uma série de funções de dados espaciais:

espacial Extensões para MySQL

Eu acho que a seção sobre a medição das relações entre geometrias é o que você está depois:

Relações Entre Geometrias

Outras dicas

Eu tenho feito pesquisas geográficas semelhantes computando caixa delimitadora via grande distância círculo e consultar o banco de dados para isso. Você ainda precisa de uma outra passagem em seu aplicativo para "arredondar os cantos" da caixa delimitadora para o círculo.

Assim, dado um banco de dados de pontos, um ponto de busca (X, Y) e uma distância D, encontrar todos os pontos dentro D de (X, Y):

  1. Computar deltaX, que é o ponto de se moveu distância D ao longo do eixo Y.
  2. Compute deltaY, que é o ponto, se você moveu distância D ao longo do eixo X.
  3. Compute sua caixa delimitadora: (X-deltaX, Y-deltaY), (X + deltaX, Y + deltaY)
  4. banco de dados de consulta de pontos usar SQL ENTRE operador: SELECT * FROM tabela onde X ENTRE X-deltaX E X + deltaX e Y ENTRE Y-deltaY e Y + deltaY
  5. Depois do processo da lista de pontos voltou, computando a grande distância real de círculo, para remover os pontos nos cantos da praça que não estão dentro de seu círculo distância.

Como um atalho, eu normalmente calcular graus-per-milha para ambos lat e lon (no equador, desde a milha graus per-é diferente nos pólos para lon), e derivar deltaX e deltaY como ( D * graus-Lat-per-milhas) ou graus-lon-per-milha. A diferença no equador vs pólo não importa muito, desde que eu já estou computar a distância real depois que a consulta SQL.

FYI - 0.167469 para 0.014564 graus-lon-per-milha, e 0.014483 graus-Lat-per-milha

Eu sei que este é um post morto há muito tempo, mas, no caso de alguém que nunca vem através deste, você não precisa criar uma "fórmula haversine reversa" em tudo. A fórmula Haversine dá a distância entre o ponto A e ponto b. Você precisa da distância entre o ponto b e ponto um, para o seu cálculo. Estes são o mesmo valor.

SELECT *, 
( 3959 * acos( cos( radians(40) ) * cos( radians( `circleLatCenter` ) ) * cos( radians( `circleLngCenter` ) - radians(-110) ) + sin( radians(40) ) * sin( radians( `circleLngCenter` ) ) ) as `haversine` 
FROM `table` WHERE 1=1 
HAVING `haversine` < `Radius`
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top