J'ai un tableau des codes postaux qui comprend le centre lat, lng pour chaque code postal. Je l'utilise pour obtenir une liste de codes postaux dans un rayon de mile donné à partir de n'importe quel point arbitraire.
Je viens de penser que le fait que le point central d'un zip ne se trouve pas dans un rayon donné ne signifie pas que le zip lui-même ne se trouve pas dans le rayon.
J'ai utilisé mes compétences artistiques super avancées pour illustrer le point ici:
Les taches à rayures vertes représentent les codes postaux A, B et C.
Les taches rouges sont les centres géographiques de chaque code postal
Le point fuchsia est l'emplacement cible, et ..
Le cercle bleu bosselé est un rayon de 1 mile de l'emplacement cible
Si j'exécute une requête pour tous les codes postaux dans un rayon de 1 mile à partir du maculage rose, seuls les codes postaux B et C seront retournés car le point central du zip A n'est pas dans le rayon d'un mile, même si le maculage rose lui-même est clairement dans le code postal 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
Comment diable puis-je écrire une requête qui inclura le zip A dans les résultats?
J'ai accès à l'espace / géométrie pour chaque code postal que je peux ajouter au tableau si nécessaire, mais je n'ai aucune idée de la façon dont je l'utiliserais à cette fin dans MySQL.
Edit : J'ai passé une journée à lire les documents Oracle et MySQL pour les données spatiales et j'ai réussi à convertir mes données spatiales en MySQL . Comment puis-je écrire une requête similaire qui utilise la colonne de géométrie au lieu du lat et du long? J'utilise des données 2D .. la géométrie est des polygones et des multipolygones uniquement ..
Je pense que je l'ai en quelque sorte compris ..
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
Je vais laisser la prime ouverte pour le moment au cas où quelqu'un aurait une solution meilleure et plus efficace.