根据邮编/经度/纬度选择结果

3
我有三个表: 1 包含人员及其城市(来自其他表)和他们希望被找到的范围(整数,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;

现在是困难的部分。我不知道如何根据输入的邮政编码和其范围从数据库中选择人员。
有人能在这里帮助我一下吗?

你是否提供了两个参数:邮政编码和范围?然后查找所有在该范围内城市的人?例如,如果您输入邮政编码AAA和范围2,则查找所有在距离AAA 2英里半径内的所有城市中的人?那么上面的$radius变量是否等于范围? - Vincent Ramdhanie
1个回答

3

这是我一段时间前为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是一英里的米数。希望我理解了问题!


当我尝试执行函数创建脚本时,phpMyAdmin会给我这些错误:您的SQL语法有误;请检查相应的MySQL服务器版本手册以获取正确的语法格式,在第1行附近使用'DELIMITER'。 - kevin
如果您正在phpMyAdmin中运行查询,请从查询本身中删除DELIMITER语句,并在查询下方的框中设置分隔符字段。 - Alex Barrett

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接