2016-06-06 4 views
0

У меня есть запрос к базе данных sql, чтобы найти все подходящие zipcodes в пределах заданного радиуса от заданного zipcode (таблица db содержит информацию о долготе и широте).Альтернативный алгоритм поиска радиуса zipcode?

Я использовал этот алгоритм, который я нашел здесь, на StackOverflow:

$ SQL = 'SELECT отчетливый (ZipCode) FROM почтовый индекс WHERE (3958 * 3,1415926 * SQRT ((широта -' $ ш '). *. (Широта - '. $ Lat.') + Cos (Широта/57.29578) cos ('. $ Lat.'/57.29578) (Долгота - '. $ Lon.') * (Долгота - '. $ Lon.'))/180) < = '. $ Radius.'; ';

Он функционирует, но я нахожу, что результаты не совсем так, как ожидалось. Например, если я выполняю поиск в радиусе 40 миль от 11572 (Oceanside, NY), он не возвращает ряд почтовых индексов Манхэттена (т. Е. 10023), которые явно находятся в радиусе 40 миль.

Я надеюсь, что у кого-то может быть альтернативный подход?

благодарит, Mark

+0

try: where sqrt (pow (Latitute - '$ .lat', 2) + pow (Longitude - '. $ Lon', 2)) <= '$ .radius' – rocketspacer

+0

Я мог догадаться, что проблема в том, что это измеряет центры почтовых индексов в радиусе 40 миль - и вы, вероятно, хотите, и почтовые индексы с площадью и радиусом 40 миль. Звучит ли это так? – gbtimmon

+0

Я дал этот выстрел, nmtuan, но он вернул огромный список намного выше заданного радиуса 40 миль и вызвал фатальное исключение таймаута. – zargosh

ответ

0

Решено! Оказывается, в алгоритме нет ничего плохого. Я пренебрегал floatval() широтой и долготой, которые передавались в формулу в виде строки. Отсюда и нечетные результаты. С floatval результаты будут такими, какими они и должны быть. Может быть, это поможет кому-то, кто окажется в подобной ситуации.

С другой стороны, дамп zipcode geonames, который я использую, определенно пропускает ряд zip-кодов. Кто-нибудь знает более всеобъемлющую альтернативу?

Смежные вопросы