我发现很多解决方案可以使用MySQL基于lat / long获取数据库中最近的点,但我无法找到如何在查询中引用包含Point数据类型的列它似乎总是单独的lat和long列。
除了不理解值111.045
在查询中的重要性之外,这似乎是我想要完成的事情,但我不明白如何参考coords列中的coords查询distance_in_km
,或者是否有更好的解决方案,因为我使用了点数据类型。
如何在此查询中使用coords
列来表示lat和lng,或者如果您在此查询中获得了数千个结果,那么是否有更好(或更高效)的方式来执行此查询表
查询
$lat
和$lng
已退出服务器上的$_POST
,我假设其他lat
和lng
是列引用
$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
);
答案 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