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.
Toute tentative d'inclure A inclura probablement D, E, F, G. Le problème ne peut pas être résolu sans avoir un chemin exact définissant chaque zone de code postal.
Trouvez une telle base de données, puis créez un
SPATIAL
index en utilisant de tels polygones arbitraires.la source
Vous le faites mal. Tout d'abord, si possible, utilisez PostGIS - qui est le principal RDMBS avec une solution spatiale.
Ensuite, vous souhaitez suivre ces étapes.
shp2pgsql
Indexez la géométrie que vous avez importée.
Exécutez une requête de point d'intérêt (POI) sur les fichiers de formes. Le point d'intérêt dans votre cas est les cordons d'entrée, cela ressemblera à ceci,
9 1609,344 mètres = 1 mille
MySQL
Avec MySQL, vous aurez
Utilisez
MBRIntersects
pour utiliser l'index spatial. La requête de fin doit ressembler à quelque chosela source
ST_DWithin
parMBRIntersects
Consultez cet ensemble de données de GreatData.com (notez qu'il ne s'agit pas d'un logiciel open source mais d'un service payant).
Ils utilisent la densité de population au lieu du centre du zip.
Et comment utiliser le type de données spatiales du serveur SQL pour obtenir rapidement des résultats corrects.
J'espère que cela t'aides.
la source