按多个邮政编码PHP&的距离排序MySQL的

时间:2014-05-08 04:36:53

标签: php mysql haversine

嗨,朋友们,我需要帮助解决这个问题 问题定义:

共有4个表:

  1. 项目
    • 项目名称
    • 项目ID
    • 邮政编码
  2. 供应商
    • 供应商ID
    • 供应商名称
    • 电话
    • 服务区距离
  3. 供应商服务区域
    • 供应商ID
    • 服务区邮政编码
  4. 邮政编码详情
    • 邮政编码
    • 纬度
    • 经度
    • 每个项目都有一个邮政编码
    • 供应商可以拥有多个服务区域邮政编码
    1. 当供应商登录时,我将获得供应商服务区内的所有项目。

      例如:如果供应商在其服务区22032中有两个邮政编码,10031和他的服务区距离是20英里,则这些服务区内的所有项目大约20英里。

    2. 我正在计算项目邮政编码和供应商邮政编码之间的距离,并在列中显示最小距离

      例如:项目邮政编码22032和供应商邮政编码是22031和22040:
          22032至22031 = 3.01英里
          22032至22040 = 7.98英里
      然后距离= 3.01

    3. 问题:现在客户希望SORT BY DISTANCE

      我的尝试:

      1. 我尝试使用PHP数组和对象执行此操作但使用大数据这会​​使进程变慢
      2. 我试图从MYSQL距离计算中计算出半身公式,但无法弄清楚
      3. 我试图在单独的表中绘制距离,但是有太多的zipcodes
      4. 请建议任何可以花费更少时间的逻辑。

3 个答案:

答案 0 :(得分:0)

您可以尝试Nearest neighbor search

查看here并查看此related SO question

答案 1 :(得分:0)

我建议使用这样的函数在你的mysql中定义距离公式:

CREATE DEFINER=`root`@`localhost` FUNCTION `calc_distance`(`p1lat` DECIMAL(10,5), `p1long` DECIMAL(10,5), `p2lat` DECIMAL(10,5), `p2long` DECIMAL(10,5)) RETURNS decimal(10,5)
    NO SQL
BEGIN
    DECLARE radius INT;
    DECLARE deg_per_rad DECIMAL;
    SET radius = 3958;
    SET deg_per_rad = 57.29578;
    RETURN      (radius * PI() * SQRT(
                (p1lat-p2lat)
                * (p1lat - p2lat)
                + cos(p1lat / deg_per_rad)
                * cos(p2lat / deg_per_rad)
                * (p1long - p2long)
                * (p1long - p2long)
                )/180);

END

然后,您可以调用此函数在自定义列中按距离计算和排序。

reference

答案 2 :(得分:0)

我有同样的问题选择整个表格只是想知道哪一个更接近,我之前回答过类似的问题。

  1. 首先,你需要通过我的方法减少95%无用的行。 How to efficiently find the closest locations nearby a given location

  2. 收集距离在数组中的所有拉链码,并在此次使用您需要的所有信息对该数组进行另一次查询,计算每个目标的距离并按ASC对其进行排序。