Использование PHP и MySQL для расчета расстояния геолокации - PullRequest
1 голос
/ 31 января 2012

У меня есть скрипт php и база данных геолокации.

В настоящее время мои пользователи могут вводить свой почтовый индекс, используя Yahaa, я получаю их географическое местоположение.

Теперь, когда у меня есть их геолокация, я хочу написать скрипт, который загружает их местные предприятия в порядке расстояния. Я предполагаю, что для этого мне нужно загрузить записи из базы данных, которые имеют координаты, наиболее похожие на текущую геолокацию пользователей. Я попробовал этот код:

$sql = "SELECT * FROM dirlistings WHERE ABS(latitude - $lat) AND ABS(longitude - $long)";

Однако результаты отображаются в обычном порядке.

Я что-то пропустил?

Ответы [ 5 ]

3 голосов
/ 31 января 2012

Я думаю, что вы хотите где-то там ORDER предложение.

Но то, что вы действительно хотите, это формула Хаверсайна: MySQL Великий круг (формула Хаверсайна)

3 голосов
/ 31 января 2012

Это сложнее, чем вы думаете.

Это отличная статья, которая мне очень помогла.Хотя он написан на JavaScript, вы легко можете изменить его на php.

http://www.movable -type.co.uk / scripts / latlong.html

2 голосов
/ 31 января 2012

Обратите внимание, что круговое расстояние не будет достаточно точным, если вы говорите о больших расстояниях (например, в тысячах миль), поскольку поверхность Земли не плоская.Если вам нужна более точная формула для расчета географического расстояния, вы можете использовать что-то вроде этого:

$dlat = ((double)$lat) / 57.29577951;
$dlon = ((double)$lon) / 57.29577951;

$sql = "SELECT *
        FROM dirlistings
        WHERE 3963.0 * acos(sin(latitude / 57.29577951) * sin($dlat) + cos(latitude / 57.29577951) * cos($dlat) * cos($dlon - longitude / 57.29577951)) < MAX_DIST
        ORDER BY acos(sin(latitude / 57.29577951) * sin($dlat) + cos(latitude / 57.29577951) * cos($dlat) * cos($dlon - longitude / 57.29577951))
        ";

Расстояния указаны в милях - обязательно укажите правильное максимальное расстояние - и эта формула даст очень близкорезультаты для расстояний даже в десять тысяч миль.Заметьте, однако, что такие вычисления довольно трудоемки и энергоемки, и если вы не имеете дело с большими расстояниями (т. Е. Не более пары сотен миль), то вам следует использовать более быстрое приближение.

2 голосов
/ 31 января 2012

Вы пропустили довольно много вещей.Чтобы сделать то, что вы пытаетесь сделать, вам нужно вычислить (используя теорему Пифагора) расстояние между двумя точками, а затем упорядочить по этому расстоянию.

Вы можете рассчитать расстояние ( (lat - $lat)^2 + (lon - $lon)^2 )^0.5 с помощью:

SQRT(
    POW(latitude - ' . $lat . ',2) 
    + 
    POW(longitude - ' . $lon . ',2)
) AS distance

Тогда все просто:

ORDER BY distance ASC
1 голос
/ 31 января 2012

Попробуйте ORDER BY latitude, longitude в конце.Это должно сделать это или приблизительно сделать это.

...