выбор результатов по почтовому индексу / долготе / широте - PullRequest
3 голосов
/ 03 октября 2009

у меня есть 3 таблицы: 1 содержит людей с их городом (из другой таблицы) и диапазоном (int, 1-20), в котором они хотят быть найдены (в милях) 1 содержит города и начало почтового индекса (то есть BB2) 1 содержит города и их значения / широты

я пытаюсь выбрать людей по почтовому индексу, который кто-то вводит. если этот почтовый индекс относится к городу, находящемуся в пределах их диапазона, то этот человек должен быть выбран из БД.

У меня есть этот php код:

  // Latitude calculation
  $limit = (1 / 69.1703234283616) * $radius;
  $latitude_min = $latitude - $limit;
  $latitude_max = $latitude + $limit;

  // Longitude calculation
  $limit = (1 / (69.1703234283616 * cos($userLat * (pi/180)))) * $radius;
  $longitude_min = $longitude - $limit;
  $longitude_max = $longitude + $limit;

теперь вот самая сложная часть. Я не знаю, как я собираюсь выбирать людей из БД, в зависимости от того, какой почтовый индекс был введен и их диапазон.

Может кто-нибудь помочь мне немного здесь?

1 Ответ

3 голосов
/ 03 октября 2009

Здесь хранится функция для MySQL, которую я создал некоторое время назад - она ​​возвращает (приблизительное) расстояние между двумя парами широты и долготы в метрах .

DELIMITER $$

CREATE FUNCTION LAT_LNG_DISTANCE(lat1 FLOAT, lng1 FLOAT, lat2 FLOAT, lng2 FLOAT) RETURNS int(11)
BEGIN
  DECLARE latD FLOAT;
  DECLARE lngD FLOAT;
  DECLARE latS FLOAT;
  DECLARE lngS FLOAT;
  DECLARE a FLOAT;
  DECLARE c FLOAT;

  SET lat1 = RADIANS(lat1);
  SET lng1 = RADIANS(lng1);
  SET lat2 = RADIANS(lat2);
  SET lng2 = RADIANS(lng2);

  SET latD = lat2 - lat1;
  SET lngD = lng2 - lng1;

  SET latS = SIN(latD / 2);
  SET lngS = SIN(lngD / 2);

  SET a = POW(latS, 2) + COS(lat1) * COS(lat2) * POW(lngS, 2);
  SET c = 2 * ASIN(LEAST(1, SQRT(a)));

  RETURN ROUND(c * 6378137);
END;
$$
DELIMITER ;

Теперь мы определили, что нам нужно получить источник поиска на основе почтового индекса, который нам дал пользователь. Поскольку я не знаю точную структуру вашей базы данных, я буду использовать общие объединения и условия, которые, я надеюсь, будут достаточно похожи на реальные, чтобы вы могли легко адаптироваться. Я собираюсь использовать $var, чтобы подразумевать передачу значения из PHP; само собой разумеется, ему нужно будет уйти соответствующим образом.

SELECT l.lat, l.lng
FROM city_locations l
INNER JOIN city_postcodes c
ON l.city_id = c.city_id
WHERE c.postcode = $postcode;

Теперь мы можем передать результаты этого запроса следующему запросу, который будет использовать функцию LAT_LNG_DISTANCE, которую мы определили ранее.

SELECT *
FROM people p
INNER JOIN city_locations l
ON p.city_id = l.city_id
WHERE LAT_LNG_DISTANCE(l.lat, l.lng, $search_lat, $search_lng) < p.range * 1609;
Кстати,

1609 - это количество метров в миле. Надеюсь, я правильно понял вопрос!

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