Mysql-Haversine过程(半径)使用一个中心点
本文关键字:中心点 一个 过程 半径 Mysql-Haversine | 更新日期: 2023-09-27 17:59:05
我对MySql还很陌生,我想创建一个过程,在这个过程中,我只需插入任何邮政编码和一段距离,就可以取回该距离内的所有邮政编码。我确实找到了一个配方,并试图根据我的需要重塑它,但我做不到。我有什么在下面。示例来自这里http://code.google.com/apis/maps/articles/phpsqlsearch.html.然而,我不想使用37-122坐标,我想使用我在过程中使用的任何邮政编码。如果可以的话,我会开始悬赏,但我必须等待。这件事困扰了我一整天,所以我们非常感谢您的帮助。这个让我很困惑,因为我相信它使用了两组lat/lon,我只想要一个中心lat/lon 的半径
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批处理脚本。