web-dev-qa-db-fra.com

requête de longitude et de latitude mySQL pour les autres lignes dans un rayon de x mile

J'ai actuellement une base de données remplie d'environ 10 000 lignes. Tous ont une longitude/latitude basée sur le centre d'un code postal. J'ai trouvé une requête que j'essaie maintenant d'étendre, mais dans l'ensemble, cela fonctionne bien jusqu'à un certain point. Cependant, dans mon exemple ci-dessous, j'essaie de trouver des choses dans un rayon de 25 miles, ce qui semble fonctionner en grande partie. La plupart de mes résultats sont conformes aux critères des 25 milles, mais j'en ai une poignée qui est loin de 86 milles à 800 milles de la marque.

Exemple: Ceci est mon centre lat/lon: 37.2790669, -121.874722 = San Jose, CA Im obtenant des résultats comme: 33.016928, -116.846046 = San Diego, CA qui est à environ 355 miles de San Jose.

ma requête actuelle ressemble à:

SELECT *,(((acos(sin(($lat*pi()/180)) * sin((`latitude`*pi()/180))+cos(($lat*pi()/180))
* cos((`latitude`*pi()/180)) * cos((($lon - `longitude`)*pi()/180))))*180/pi())*60*1.1515)
AS `distance` FROM `geo_locations` HAVING `distance` <= 25 ORDER BY `distance` ASC"
36
chris

Voici la requête que j'utilise sur le localisateur de magasin avec lequel je travaille:

SELECT
    `id`,
    (
        6371 *
        acos(
            cos( radians( :lat ) ) *
            cos( radians( `lat` ) ) *
            cos(
                radians( `long` ) - radians( :long )
            ) +
            sin(radians(:lat)) *
            sin(radians(`lat`))
        )
    ) `distance`
FROM
    `location`
HAVING
    `distance` < :distance
ORDER BY
    `distance`
LIMIT
    25

:lat et :long sont les points transmis par l'utilisateur où lat et long sont les points stockés dans la base de données.

La: distance est mesurée en miles, dans la version de travail du code la: distance est en fait tirée d'une liste déroulante allant de 10 à 50 miles

Changer le code pour travailler avec des kilomètres peut être accompli en changeant 3959 (la distance du centre de la terre à sa surface en miles) à 6371 (3959 miles convertis en kilomètres) grâce à joshhendo pour cette solution.

98
Gordnfreeman