MySQL выбирает почтовые индексы в пределах x км / миль в пределах y

Примечание. Хотя я использую базу данных почтовых индексов с голландскими почтовыми индексами, этот вопрос не зависит от страны.

У меня есть база данных с каждым почтовым индексом в Нидерландах + его координаты x и y (широта / долгота).

У меня есть, например, почтовый индекс:$baseZipCode = 1044; со следующими координатами:

x coordinate = 4,808855
y coordinate = 52,406332

Теперь я хочу найти все другие почтовые индексы с$range от$baseZipCode.

Например:

SELECT
  zipcode
FROM
  zipcodes
WHERE
  ????? // Need help here

Проблема в том, что земля не совсем круглая. Я нахожу много уроков сfrom a to b расчеты, но это не то, что мне нужно.

У кого-нибудь есть идеи?

ОБНОВИТЬ Благодаря 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`)
)

Поэтому, когда у вас есть база данных, вы хотите найти все почтовые индексы в пределах определенного радиуса мили от центральной точки. Если центральной точкой является другой почтовый индекс, просто запросите в базе данных координаты широты и долготы этого почтового индекса. Тогда код выглядит следующим образом:

// 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( radi,ans( 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 предлагают бесплатные услуги геокодирования.)

Ответы на вопрос(0)

Ваш ответ на вопрос