首页 / PHP / php – mysql查询中的距离计算
php – mysql查询中的距离计算
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了php – mysql查询中的距离计算,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2401字,纯文字阅读大概需要4分钟。
内容图文
![php – mysql查询中的距离计算](/upload/InfoBanner/zyjiaocheng/890/df805283e5514f7f87e03e9792be8e17.jpg)
我必须查询数千个条目的数据库,并按指定点的距离对其进行排序.
问题是每个条目都有纬度和经度,我需要检索每个条目来计算它的距离.使用大型数据库,我不想检索每一行,这可能需要一些时间.
有没有办法将其构建到mysql查询中,这样我只需要检索最近的15个条目.
例如.
`SELECT events.id, caclDistance($latlng, events.location) AS distance FROM events ORDER BY distance LIMIT 0,15`
function caclDistance($old, $new){
//Calculates the distance between $old and $new
}
解决方法:
选项1:
通过切换到支持GeoIP的数据库对数据库进行计算.
选项2:
使用如下存储过程对数据库进行计算:
CREATE FUNCTION calcDistance (latA double, lonA double, latB double, LonB double)
RETURNS double DETERMINISTIC
BEGIN
SET @RlatA = radians(latA);
SET @RlonA = radians(lonA);
SET @RlatB = radians(latB);
SET @RlonB = radians(LonB);
SET @deltaLat = @RlatA - @RlatB;
SET @deltaLon = @RlonA - @RlonB;
SET @d = SIN(@deltaLat/2) * SIN(@deltaLat/2) +
COS(@RlatA) * COS(@RlatB) * SIN(@deltaLon/2)*SIN(@deltaLon/2);
RETURN 2 * ASIN(SQRT(@d)) * 6371.01;
END//
如果数据库中有纬度和经度的索引,则可以通过计算PHP中的初始边界框($minLat,$maxLat,$minLong和$maxLong)来减少需要计算的计算次数,并限制行的子行根据(WHERE纬度BETWEEN $minLat和$maxLat以及经度BETWEEN $minLong和$maxLong).然后,MySQL只需要为该行子集执行距离计算.
如果您只是使用存储过程来计算距离),那么SQL仍然必须查看数据库中的每条记录,并计算数据库中每条记录的距离,然后才能决定是返回该行还是丢弃该行.
因为计算执行起来相对较慢,所以如果你可以减少需要计算的行集会更好,消除明显超出所需距离的行,这样我们只执行昂贵的计算行数较少.
如果你认为你正在做的事情基本上是在地图上绘制一个圆圈,以你的初始点为中心,并且距离的半径;那么公式只是简单地确定哪些行落在那个圆圈内……但它仍然必须检查每一行.
使用边界框就像在地图上首先绘制一个正方形,左边,右边,顶边和底边与我们的中心点保持适当的距离.然后我们的圆圈将被绘制在该框内,圆圈上的最北端,最东端,最南端和最西端的点接触到框的边界.有些行会落在该框之外,因此SQL甚至不愿意尝试计算这些行的距离.它仅计算落在边界框内的那些行的距离,以查看它们是否也在圆圈内.
在你的PHP中(猜测你是从$变量名运行PHP),我们可以使用一个非常简单的计算,根据我们的距离计算最小和最大纬度和经度,然后在SQL的WHERE子句中设置这些值声明.这实际上就是我们的盒子,任何不属于它的东西都会被自动丢弃,而不需要实际计算它的距离.
对于计划在PHP中进行任何GeoPositioning工作的任何人来说,在Movable Type website上有一个很好的解释(使用PHP代码).
编辑
calcDistance存储过程中的值6371.01是乘数,用于以公里为单位返回返回的结果.如果您想要产生里程,海里,米,等等,请使用适当的替代乘数
内容总结
以上是互联网集市为您收集整理的php – mysql查询中的距离计算全部内容,希望文章能够帮你解决php – mysql查询中的距离计算所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。