从数据库中获取点的最近点



我使用MariaDB数据库,使用Hibernatejts.geom.Point类型存储大量点(纬度和经度(。在数据库中存储为geometry类型。

我想知道在给定某一点的情况下,我如何才能获得最接近的10分。如何使用SQL查询来完成此操作?或者在后台进行查询并发布代码。

谢谢!

例如,您可以执行:

create table t (loc point);
insert into t (loc) values
(POINT(10, 0)), 
(POINT(15, 20)),
(POINT(50, 50));

然后你可以找到离(49,49(最近的两点:

select *,
st_distance_sphere(loc, POINT(49, 49)) as dist
from t
order by st_distance_sphere(loc, POINT(49, 49)) 
limit 2 -- only the closest two points

结果:

loc              dist
---------------  -----------------
{"x":50,"y":50}  132584.0664606239
{"x":15,"y":20}  4416195.256674154

请参阅DB Fiddle上的运行示例。

现在,这是可行的,但对于数百万行,它的效率不会很高。您需要使用";矩形";或";区域";,因此索引是有用的。

MariaDB编辑

MariaDB的语法略有不同。见下文:

select ST_AsText(t.loc) as point, 
ST_Distance(loc, POINT(49, 49)) as dist
from t
order by ST_Distance(loc, POINT(49, 49))
limit 2;

结果:

point         dist
------------  ------------------
POINT(50 50)  1.4142135623730951
POINT(15 20)  44.68780594300866

请参阅db<gt;不停摆弄

这里有5种算法,具有不同的复杂性和性能。加上Haversine代码。

http://mysql.rjweb.org/doc.php/find_nearest_in_mysql

最新更新