PHP & MySQL Store Калькулятор расстояния - почтовые индексы - PullRequest
1 голос
/ 26 апреля 2011

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

Это в основном из интереса, а не из-за того, что я спрашиваю у вас совета, а затем продаю его клиенту: -O

Прежде всего после исследования я обнаружил, что вы должны делать расстояние с Lat / Long, поэтому я нашел API, который преобразует почтовые индексы / почтовые индексы в lat long, и теперь моя БД имеет структуру, такую ​​как id, store_name, lat, long, postcode, и я могу преобразовать данный почтовый индекс в лат. long.

Но как в SQL я могу сделать запрос для тех, кто ближе всего к данному лату?

Ответы [ 3 ]

1 голос
/ 26 апреля 2011

Попробуйте что-то вроде этого:

// get all the zipcodes within the specified radius - default 20
    function zipcodeRadius($lat, $lon, $radius)
    {
        $radius = $radius ? $radius : 20;
        $sql = 'SELECT distinct(ZipCode) FROM zipcode  WHERE (3958*3.1415926*sqrt((Latitude-'.$lat.')*(Latitude-'.$lat.') + cos(Latitude/57.29578)*cos('.$lat.'/57.29578)*(Longitude-'.$lon.')*(Longitude-'.$lon.'))/180) <= '.$radius.';';
        $result = $this->db->query($sql);
        // get each result
        $zipcodeList = array();
        while($row = $this->db->fetch_array($result))
        {
            array_push($zipcodeList, $row['ZipCode']);
        }
        return $zipcodeList;
    }

ОБНОВЛЕНИЕ: Существует некоторое обсуждение эффективности.Вот небольшой тест для вас с этим запросом.У меня есть база данных, которая содержит КАЖДЫЙ почтовый индекс в США.Некоторые из них дублируются из-за способа работы почтовых индексов (выходящий за рамки этой темы).Так что у меня чуть менее 80 тысяч записей.Я пробежал дистанцию ​​в 20 миль по радиусу 90210:

SELECT distinct(ZipCode) FROM zipcodes  WHERE (3958*3.1415926*sqrt((Latitude-34.09663010)*(Latitude-34.09663010) + cos(Latitude/57.29578)*cos(34.09663010/57.29578)*(Longitude- -118.41242981)*(Longitude- -118.41242981))/180) <= 20

Я получил 366 записей , и запрос занял 0,1770 с .Насколько эффективнее вы нуждаетесь?

0 голосов
/ 26 апреля 2011

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

0 голосов
/ 26 апреля 2011

ознакомьтесь с этим замечательным проектом с открытым исходным кодом

Отказ от ответственности: Не мой проект и не мой участник.Чисто рекомендация.

...