Eu tenho uma tabela de códigos postais que inclui o centro lat, lng para cada código postal. Eu o uso para obter uma lista de códigos postais dentro de um raio de milha a partir de qualquer ponto arbitrário.
Apenas me ocorreu que, apenas porque o ponto central de um zip não está dentro de um determinado raio, não significa que o próprio zip não esteja dentro do raio.
Eu usei minhas habilidades de arte super avançadas para ilustrar o ponto aqui:
Os blobs listrados verdes representam os códigos postais A, B e C.
As manchas vermelhas são os centros geográficos de cada código postal
O ponto fúcsia é o local de destino e ..
O círculo azul irregular é um raio de 1,6 km do local de destino
Se eu executar uma consulta para todos os códigos postais dentro de um raio de 1,6 km a partir da mancha rosa, apenas os códigos postais B e C serão retornados como o ponto central do CEP A não estiver dentro do raio de uma milha, mesmo que a própria mancha rosa está claramente no CEP A.
SELECT *,
p.distance_unit
* DEGREES(ACOS(COS(RADIANS(p.latpoint))
* COS(RADIANS(z.y))
* COS(RADIANS(p.longpoint) - RADIANS(z.x))
+ SIN(RADIANS(p.latpoint))
* SIN(RADIANS(z.y)))) AS dist
FROM standard_zip AS z
JOIN ( /* these are the query parameters */
SELECT $lat AS latpoint, $lng AS longpoint,
$miles AS radius, 69 AS distance_unit
) AS p ON 1=1
WHERE z.y
BETWEEN p.latpoint - (p.radius / p.distance_unit)
AND p.latpoint + (p.radius / p.distance_unit)
AND z.x
BETWEEN p.longpoint - (p.radius / (p.distance_unit * COS(RADIANS(p.latpoint))))
AND p.longpoint + (p.radius / (p.distance_unit * COS(RADIANS(p.latpoint))))
ORDER BY dist
Como diabos eu escrevo uma consulta que incluirá o zip A nos resultados?
Eu tenho acesso a geometria / espacial para cada código postal que eu posso adicionar à tabela, se necessário, mas não tenho idéia de como usá-lo para essa finalidade no MySQL.
Edit : Passei um dia lendo os documentos Oracle e MySQL para dados espaciais e consegui converter meus dados espaciais para MySQL com sucesso . Como escrevo uma consulta semelhante que usa a coluna geometry em vez de lat e long? Estou usando dados 2D .. a geometria é apenas polígonos e multipolígonos ..
Eu acho que meio que descobri isso ..
select
*
from
(
select
MIN(st_distance(geom, POINT(-82.765136, 28.0914015))) * 69 as miles,
zip
from
zip_spatial
group by
zip
order by
miles asc
) d
where
d.miles < 5
Deixarei a recompensa em aberto por enquanto, caso alguém tenha uma solução melhor e mais eficiente.