MySQL 5最近的点基于lat和long

时间:2018-01-27 01:27:35

标签: mysql

我发现很多解决方案可以使用MySQL基于lat / long获取数据库中最近的点,但我无法找到如何在查询中引用包含Point数据类型的列它似乎总是单独的lat和long列。

除了不理解值111.045在查询中的重要性之外,这似乎是我想要完成的事情,但我不明白如何参考coords列中的coords查询distance_in_km,或者是否有更好的解决方案,因为我使用了点数据类型。

如何在此查询中使用coords列来表示lat和lng,或者如果您在此查询中获得了数千个结果,那么是否有更好(或更高效)的方式来执行此查询表

查询

$lat$lng已退出服务器上的$_POST,我假设其他latlng是列引用

$sql = "SELECT id, AsText(coords) as coords, owner, pgm, 
111.045 * DEGREES(ACOS(COS(RADIANS({$lat}))
* COS(RADIANS(lat))
* COS(RADIANS(lng) - RADIANS({$lng}))
+ SIN(RADIANS({$lat}))
* SIN(RADIANS(lat))))
AS distance_in_km
FROM buoy_stations
ORDER BY distance_in_km ASC
LIMIT 0,5";

模式

CREATE TABLE `buoy_stations` (
  `id` VARCHAR(10) NOT NULL,
  `coords` POINT NOT NULL,
  `name` VARCHAR(150) NOT NULL,
  `owner` VARCHAR(150) NOT NULL,
  `pgm` VARCHAR(150) NOT NULL,
  `met` CHAR(1) NOT NULL,
  `currents` CHAR(1) NOT NULL
);

1 个答案:

答案 0 :(得分:0)

感谢@Barmar指出在文档中找到它的位置。找到最近点的最终查询最终是:

SELECT id, AsText(coords) as coords, owner, pgm, 
111.045 * DEGREES(ACOS(COS(RADIANS(48.68))
* COS(RADIANS(ST_X(coords)))
* COS(RADIANS(ST_Y(coords)) - RADIANS(-125.32))
+ SIN(RADIANS(48.68))
* SIN(RADIANS(ST_X(coords)))))
AS distance_in_km
FROM buoy_stations
ORDER BY distance_in_km ASC
LIMIT 0,5