如何解决Mysql Haversine过程半径使用中心点
| 我是MysqL的新手,我想创建一个过程,在其中可以插入任何邮政编码和一段距离,然后取回该距离内的所有邮政编码。我确实找到了一个公式,并试图根据自己的需要重塑它,但我无法做到。我所拥有的如下。该示例位于此处http://code.google.com/apis/maps/articles/PHPsqlsearch.html。但是,我不想使用37,-122坐标,我想使用我推送到该过程中的任何邮政编码。如果可以的话,我将开始赏金计划,但我必须等待。这整天困扰着我,因此我们将不胜感激。这个让我很沮丧,因为我相信它使用了两组纬度/经度,而我只想要一个中心纬度/经度的半径SELECT state,city,zipcode,(3959
* acos(
cos(radians(37))
* cos(radians(x(location)))
* cos(radians(y(location)) - radians(-122))
+ sin(radians(37)) * sin(radians(x(location)))))
AS distance
FROM zipcodes
HAVING distance < 25
ORDER BY distance
LIMIT 0,20;
解决方法
您可以采用与碰撞检测样式算法相同的方法进行处理。通过找到一个点的最小和最大纬度/经度(给定半径),检查坐标是否在边界框内,并确保搜索满足快速评估标准(例如
lat <= 1.5
)的要求,然后再进行更多的资源密集型检查。
这里有一个使用SQL和Java代码的有效示例:
http://janmatuschek.de/LatitudeLongitudeBoundingCoordinates
总而言之,它表示以下内容:
只需将条件与
和:
SELECT * FROM Places WHERE
(Lat => 1.2393 AND Lat <= 1.5532) AND (Lon >= -1.8184 AND Lon <= 0.4221)
AND
acos(sin(1.3963) * sin(Lat) + cos(1.3963) * cos(Lat) * cos(Lon -
(-0.6981)))<= 0.1570;
大多数查询优化器足够聪明
快速执行索引扫描
找到满意的地方(Lat> = 1.2393
然后继续执行一些其他检查。在此主题下,有一些替代方法可用于同一主题。
这对您有帮助吗?看来您有技巧自己将其编写为一个过程,但是如果您愿意,我可以尝试为您编写一个过程。如果是这样,您可以粘贴/发布表或SQL批处理脚本。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。