Почтовые индексы и расстояние - PullRequest
4 голосов
/ 19 августа 2010

У меня есть список zip-кодов в базе данных MySQL вместе с их данными о широте и долготе (имена столбцов: ZipCode, Lat, Lon).

Теперь мне нужно выполнить поисковые запросы (поиск по почтовому индексу)) извлекать информацию с сайта.Когда я выполняю поисковые запросы, результаты включают всю информацию в радиусе 50 км от почтового индекса.

Теперь я не хочу делать слишком много поисковых запросов, поэтому я хотел бы свести к минимумуколичество почтовых индексов.Поэтому я ищу способ фильтрации всех почтовых индексов, чтобы у меня были только почтовые индексы с расстоянием между ними> 50 км.

К сожалению, я не знаю, как это сделать.Может кто-нибудь помочь мне решить эту проблему?

Ответы [ 6 ]

1 голос
/ 19 августа 2010

Вас может заинтересовать следующая презентация:

Автор описываеткак вы можете использовать формула Haversine в MySQL, чтобы ограничить ваши поиски определенным диапазоном.Он также описывает, как избежать полного сканирования таблицы для таких запросов, используя традиционные индексы для столбцов широты и долготы.

0 голосов
/ 08 августа 2013

У меня была похожая проблема, и я использовал это решение, чтобы найти ответ.Не уверен, что вы используете Java или какой-либо другой язык, но логику можно использовать на любом языке программирования Geo Location API и поиск пользователя в радиусе

0 голосов
/ 19 августа 2010

Проблема обсуждалась ранее здесь, на SO с различными решениями

0 голосов
/ 19 августа 2010

Ссылка Дэниела касается выбора всех почтовых индексов в пределах 50 км от заданной широты / долготы. Как только вы это сделаете, вы можете создать отфильтрованный список почтовых индексов, как это ...

  1. Выберите случайный почтовый индекс и добавьте его в отфильтрованный список
  2. Удалить все почтовые индексы, которые находятся в пределах 50 км от выбранного почтового индекса
  3. Выберите новый почтовый индекс случайным образом из оставшихся почтовых индексов, повторяйте, пока не останется больше.

Вы знаете, что выбираете только почтовые индексы, которые> 50 км от уже выбранных, и знаете, что, если исходная таблица пуста, это должно быть потому, что все почтовые индексы находятся в пределах 50 км от хотя бы одного из выбранных вами. почтовые индексы.

Это не гарантирует наименьший возможный список почтовых индексов, а размер результата будет зависеть от случайного выбора. Тем не менее, я думаю, что этот простой алгоритм, вероятно, будет «достаточно хорошим», и что сохранение нескольких поисков не оправдывает дополнительных усилий, связанных с поиском действительно оптимального решения.

0 голосов
/ 19 августа 2010

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

Я использую что-то похожее ... http://webarto.com/googlemaps http://webarto.com/izrada-web-stranica/belgrade

PHP функция для расстояния между двумя LL ...

function distance($lat1, $lon1, $lat2, $lon2){ 
  $theta = $lon1 - $lon2; 
  $dist = sin(deg2rad($lat1)) * sin(deg2rad($lat2)) +  cos(deg2rad($lat1)) * cos(deg2rad($lat2)) * cos(deg2rad($theta)); 
  $dist = acos($dist); 
  $dist = rad2deg($dist); 
  $miles = $dist * 60 * 1.1515;
  return round($miles * 1.609344,3);
}

Я вычисляю это так ...

$sql = mysql_query("SELECT * FROM geoip WHERE city = '$city'");
while($row = mysql_fetch_array($sql)){
    $ll = explode(",",$row["ll"]);
    $x = distance(44.5428009033,18.6693992615,$ll[0],$ll[1]);
    $road = intval($x+($x/3));

    echo "Distance between ".$row["city"]." and Tuzla is ".$x." kilometers of airline, that's about ".$road." kilometers of road way.";
}
0 голосов
/ 19 августа 2010

Вы можете использовать google geocoding api , он позволяет вам получать расстояния между двумя точками (широта / долгота, он также позволяет вам получать zip от широта / долгота).Исходя из этого, вы сможете получить расстояние между каждым из ваших почтовых индексов и поместить их в таблицу, тогда вы сможете выполнять поиск только по этим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...