posta kodu / boylam / enlem sonuçları seçerek

1 Cevap php

i have 3 tables: 1 contains people with their city (comes from other table) and the range (int, 1-20) they want to be found in (in miles) 1 contains cities and the beginning of the postcode (i.e. BB2) 1 contains cities and their logitudes/latitudes

ne yapmam çalışıyorum birisi girer bir posta koduna göre insanları seçmek kalıyor. Bu posta kodu kendi aralığında bir şehir için ise o kişinin DB seçilmelidir.

ben bu php kodu var:

  // 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;

Şimdi heres zor kısmı. i girdi ve onların aralığı ne posta kodu bağlı olarak, DB insanları seçmek için gidiyorum nasıl bilmiyorum.

Birisi burada biraz bana yardımcı olabilir?

1 Cevap

Burada bir süre önce oluşturulan MySQL için saklanan bir fonksiyonudur - enlem ve boylam iki çift arasındaki (yaklaşık) mesafeyi döndürür in meters.

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 ;

Şimdi tanımlanmış, biz kullanıcı bize vermiş posta kodu dayalı arama kökenini almak gerek var. Ben veritabanı tam yapısını bilmiyorum, ben katıldı ve umarım kolayca uyum için gerçek bir şeye yeterince benzer olacaktır koşullar genel kullanacağız. I $var kullanmak için gidiyorum PHP değerini geçen ima; söylemeye gerek yok, uygun bir şekilde kaçan gerekir.

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;

Şimdi biz daha önce tanımlanmış LAT_LNG_DISTANCE işlevini kullanmak hangi, sonraki sorgu için bu sorgunun sonuçlarını iletebilirsiniz.

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 arada bir mil içinde metre sayıdır. Ben doğru soruyu anladım umut!