ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

php – 用于确定邮政编码接近度/范围的MySQL函数

2019-06-06 21:01:42  阅读:247  来源: 互联网

标签:php mysql function proximity zipcode


我已经能够创建php函数来确定给定邮政编码的特定范围内的邮政编码列表.但是,我的下一个任务有点复杂.

可以说该表包含以下列:

id,
username
info
latitude
longitude
range

每条记录都有一个唯一的行ID,一些信息,一个纬度,一个经度,以及该人希望找到该条目的那些坐标的最大范围.因此,如果我创建一个坐标为-20,50且范围为15的条目,这意味着我只希望坐标-20,50之内15英里范围内的人能够看到我的条目.确定运行搜索的用户的纬度和经度是一件小事.

当用户搜索数据库时,应检索所有记录,以获取用户lat / long范围内的纬度和经度坐标.

因此,使用距离公式的代码的非功能性示例将说明这一点

$userLat =正在运行搜索的用户的纬度

$userLong =运行搜索的用户的经度

SELECT info FROM table 
WHERE sqrt(($userLat - lat)^2 - ($userLong - long)^2) <= range 
ORDER BY username ASC

这将是理想的,但从编码的角度来看它是无效的.有没有办法在一个查询中使用PHP和MySQL运行上述比较?这将涉及能够使用来自给定行的多个列值来运行操作.

更新解决方案

我创建了另一个问题条目来解决这个问题,并且有一个非常紧凑的功能来完成这个问题. coderpros给出的功能是它的灵感(他的功能在某些情况下有更好的处理).但是,由于我使用我的函数对输入有很大程度的控制,我创建了一个单独的函数.它可以在以下链接中找到:

MySQL User Defined Function for Latitude Longitude Syntax

解决方法:

我编写的这个漂亮的lil mySQL函数应该绝对适合你.

BEGIN
   DECLARE x decimal(18,15);
   DECLARE EarthRadius decimal(7,3);
   DECLARE distInSelectedUnit decimal(18, 10);

   IF originLatitude = relativeLatitude AND originLongitude = relativeLongitude THEN
          RETURN 0; -- same lat/lon points, 0 distance
   END IF;

   -- default unit of measurement will be miles
   IF measure != 'Miles' AND measure != 'Kilometers' THEN
          SET measure = 'Miles';
   END IF;

   -- lat and lon values must be within -180 and 180.
   IF originLatitude < -180 OR relativeLatitude < -180 OR originLongitude < -180 OR relativeLongitude < -180 THEN
          RETURN 0;
   END IF;

   IF originLatitude > 180 OR relativeLatitude > 180 OR originLongitude > 180 OR relativeLongitude > 180 THEN
         RETURN 0;
   END IF;

   SET x = 0.0;

   -- convert from degrees to radians
   SET originLatitude = originLatitude * PI() / 180.0,
       originLongitude = originLongitude * PI() / 180.0,
       relativeLatitude = relativeLatitude * PI() / 180.0,
       relativeLongitude = relativeLongitude * PI() / 180.0;

   -- distance formula, accurate to within 30 feet
   SET x = Sin(originLatitude) * Sin(relativeLatitude) + Cos(originLatitude) * Cos(relativeLatitude) * Cos(relativeLongitude - originLongitude);

   IF 1 = x THEN
          SET distInSelectedUnit = 0; -- same lat/long points
          -- not enough precision in MySQL to detect this earlier in the function
   END IF;

   SET EarthRadius = 3963.189;
   SET distInSelectedUnit = EarthRadius * (-1 * Atan(x / Sqrt(1 - x * x)) + PI() / 2);

   -- convert the result to kilometers if desired
   IF measure = 'Kilometers' THEN
          SET distInSelectedUnit = MilesToKilometers(distInSelectedUnit);
   END IF;

   RETURN distInSelectedUnit;
END

它将originLatitude,originLongitude,relativeLatitude,relativeLongitude和measure作为参数.测量可以简单地为英里或公里

希望有所帮助!

标签:php,mysql,function,proximity,zipcode
来源: https://codeday.me/bug/20190606/1190037.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有