我有_id | xcoord | ycoord
格式的PostgreSQL位置表
并且需要找到给定点的x个最近位置。数据库相对较大,因此我需要编写尽可能高效的查询。
我目前的解决方案是使用毕达哥拉斯定理并使用限制条款按距离排序。
select * from locations
order by sqrt(($1-xcoord)^2+($2-ycoord)^2)
limit $3
不幸的是,此解决方案计算表中每个元素的距离,使其无法用于大型数据集。
答案 0 :(得分:0)
您应该安装Postgis扩展程序
然后你会有很多可用的地理功能,你可以用毫秒来查询大表。
然后创建一个像这样的函数
CREATE OR REPLACE FUNCTION map.get_near_link(x double precision, y double precision)
RETURNS map.get_near_link AS
$BODY$
DECLARE
strPoint text;
sRow map.get_near_link;
BEGIN
strPoint = 'POINT('|| X || ' ' || Y || ')';
with index_query as (
SELECT
Link_ID,
TRUNC(ST_Distance(ST_GeomFromText(strPoint,4326), geom )*100000)::integer as Distance,
ST_AsText(geom),
geom
FROM map.mapfile S
ORDER BY
geom <-> ST_GeomFromText(strPoint, 4326)
LIMIT 101
)
SELECT i.Link_ID, i.Distance, v.geom into sRow
FROM
index_query i
ORDER BY
distance limit 1;
RETURN sRow;
END;
$BODY$
LANGUAGE plpgsql IMMUTABLE
COST 100;
ALTER FUNCTION map.get_near_link(double precision, double precision)
OWNER TO postgres;
使用<->
是按距离排序的空间索引
您将拥有GEOMETRIC对象或geom
并且可以使用ST_Distance
来计算两个GEOMETRIC之间的距离
ST_GeomFromText(strPoint, 4326)
从字符串
geom
对象