从数据库中获取点的最近点
Get closest points of a point from a DB
我使用 MariaDB 数据库,其中我使用 Hibernate jts.geom.Point
类型存储大量点(纬度和经度)。在数据库中存储为 geometry
类型。
我想知道给定某个点如何得到最接近的 10 点。我如何使用 SQL 查询来做到这一点?或者可能是后端中的查询和 post 代码。
谢谢!
例如你可以这样做:
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 中的 运行 示例。
这里有 5 种算法,具有不同的复杂性和性能。加 Haversine 代码。
我使用 MariaDB 数据库,其中我使用 Hibernate jts.geom.Point
类型存储大量点(纬度和经度)。在数据库中存储为 geometry
类型。
我想知道给定某个点如何得到最接近的 10 点。我如何使用 SQL 查询来做到这一点?或者可能是后端中的查询和 post 代码。
谢谢!
例如你可以这样做:
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 中的 运行 示例。
这里有 5 种算法,具有不同的复杂性和性能。加 Haversine 代码。