Альтернативный алгоритм поиска по почтовому индексу радиуса?

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

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

$sql = 'ВЫБРАТЬ отдельный(ZipCode) FROM zipcode WHERE (3958*3.1415926*sqrt((Latitude-'.$lat.')*(Latitude-'.$lat.') + cos(Latitude/57.29578) cos('.$lat.'/57.29578)(Долгота-'.$lon.')*(Долгота-'.$lon.'))/180) ‹= '.$radius.';' ;

Он работает, но я обнаружил, что результаты не совсем такие, как ожидалось. Например, если я выполняю поиск в радиусе 40 миль от 11572 (Оушенсайд, штат Нью-Йорк), он не возвращает количество почтовых индексов Манхэттена (т. е. 10023), которые явно находятся в пределах этого радиуса 40 миль.

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

спасибо, Марк


person zargosh    schedule 06.06.2016    source источник
comment
попробуйте: где sqrt(pow(широта - '$.lat', 2) + pow(долгота -'.$lon', 2)) ‹= '$.radius'   -  person rocketspacer    schedule 06.06.2016
comment
Я могу предположить, что проблема заключается в том, что это измеряет центры почтовых индексов в радиусе 40 миль - и вам, вероятно, нужны почтовые индексы и районы в радиусе 40 миль. Возможно ли это?   -  person gbtimmon    schedule 06.06.2016
comment
Я сделал это, nmtuan, но он вернул огромный список далеко за пределы заданного радиуса 40 миль и вызвал фатальное исключение тайм-аута.   -  person zargosh    schedule 07.06.2016
comment
Спасибо, gbtimmon. Я понимаю, о чем вы говорите, но я не думаю, что это проблема. Радиус 40 миль от 11 572 охватывает и выходит за пределы Манхэттена так далеко, что отсутствующие почтовые индексы, в центре или где-то еще, обязательно попадают в радиус.   -  person zargosh    schedule 07.06.2016


Ответы (1)


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

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

person zargosh    schedule 08.06.2016