【问题标题】:selecting results by postcode / longitude / latitude按邮政编码/经度/纬度选择结果
【发布时间】:2009-10-03 16:24:21
【问题描述】:

我有 3 张桌子: 1 包含他们的城市(来自其他表)和他们想要找到的范围(int,1-20)(以英里为单位) 1 包含城市和邮政编码的开头(即 BB2) 1 包含城市及其对数/纬度

我要做的是根据某人输入的邮政编码选择人员。如果此邮政编码是针对其范围内的城市,则应从 DB 中选择此人。

我有这个 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 变量是 = range 吗?

标签: php sql mysql


【解决方案1】:

这是我不久前创建的 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”附近使用正确的语法
  • 如果您在 phpMyAdmin 中运行查询,请从查询本身中删除 DELIMITER 语句,并在查询下方的框中设置分隔符字段。
猜你喜欢
  • 2012-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多