从数据库获取点的最近点

时间:2020-07-09 21:15:43

标签: mysql hibernate mariadb topology jts

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

我想知道如何在给定点的情况下获得最接近的10点。如何使用SQL查询做到这一点?或后端的查询和邮政编码。

谢谢!

2 个答案:

答案 0 :(得分:1)

例如,您可以这样做:

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<>fiddle上的运行示例。

答案 1 :(得分:1)

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

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