Примечание: Хотя я использую базу данных zipcode с голландскими zipcodes, этот вопрос не зависит от страны.mySQL выбирает zipcodes в пределах x км/миль в пределах y
У меня есть база данных с каждым почтовым индексом в Нидерландах + координата x и y (lat/long).
У меня есть, например, почтовый индекс: $baseZipCode = 1044;
со следующими координатами:
x coordinate = 4,808855
y coordinate = 52,406332
Теперь я хочу, чтобы найти все другие Почтовые индексы с $range
от $baseZipCode
.
Например:
SELECT
zipcode
FROM
zipcodes
WHERE
????? // Need help here
Проблема заключается в том, что земля не совсем круглая. Я нахожу много учебников с расчетами from a to b
, но это не то, что мне нужно.
У кого-нибудь есть идеи?
UPDATE Благодаря Captaintokyo я нашел это:
Хочет найти все Почтовые индексы и соответствующие расстояния в пределах определенного радиуса мили/километре от другого почтового индекса или точек? Эти проблемы требуют решения координат широты и долготы. Геокодирование адреса дает координаты широты/долготы с адреса.
Сначала вам потребуется база данных всех Почтовые индексы и их соответствующие координаты широты и долготы:
CREATE TABLE `zipcodes` (
`zipcode` varchar(5) NOT NULL DEFAULT '',
`city` varchar(100) NOT NULL DEFAULT '',
`state` char(2) NOT NULL DEFAULT '',
`latitude` varchar(20) NOT NULL DEFAULT '',
`longitude` varchar(20) NOT NULL DEFAULT '',
KEY `zipcode` (`zipcode`),
KEY `state` (`state`)
)
Поэтому, как только у вас есть база данных, который вы хотите найти все Почтовые индексы в определенном радиусе мили от центральной точки. Если центральной точкой является другой zipcode, просто запросите базу данных для координат широты и долготы этого zipcode. Затем код выглядит следующим образом:
// ITITIAL POINT
$coords = array('latitude' => "32.8", 'longitude' => "-117.17");
//RADIUS
$radius = 30;
// SQL FOR KILOMETERS
$sql = "SELECT zipcode, (6371 * acos(cos(radians({$coords['latitude']})) * cos(radians(latitude)) * cos(radians(longitude) - radians({$coords['longitude']})) + sin(radians({$coords['latitude']})) * sin(radians(latitude)))) AS distance FROM zipcodes HAVING distance <= {$radius} ORDER BY distance";
// SQL FOR MILES
$sql = "SELECT zipcode, (3959 * acos(cos(radians({$coords['latitude']})) * cos(radians(latitude)) * cos(radians(longitude) - radians({$coords['longitude']})) + sin(radians({$coords['latitude']})) * sin(radians(latitude)))) AS distance FROM zipcodes HAVING distance <= {$radius} ORDER BY distance";
// OUTPUT THE ZIPCODES AND DISTANCES
$query = mysql_query($sql);
while($row = mysql_fetch_assoc($query)){
echo "{$row['zipcode']} ({$row['distance']})<br>\n";
}
(Оба Yahoo и Google предлагают бесплатные услуги геокодирования.)
Ваш комментарий к формуле haversine мне очень помог. Однако ваш запрос не совпадает с тем, который я нашел. Я обновил свою тему с правильным запросом. –
Похоже, вы предлагаете мой ответ неверно. Просто хочу отметить, что он отлично работает с моим приложением. Поздравляем с поиском другой функции, которая делает то же самое. – Mischa
Какая единица измерения расстояния находится здесь? –