查找距离其他位置最近的位置

时间:2015-07-25 20:05:57

标签: sql geolocation location

我有_id | xcoord | ycoord格式的PostgreSQL位置表 并且需要找到给定点的x个最近位置。数据库相对较大,因此我需要编写尽可能高效的查询。

我目前的解决方案是使用毕达哥拉斯定理并使用限制条款按距离排序。

select * from locations
order by sqrt(($1-xcoord)^2+($2-ycoord)^2)
limit $3

不幸的是,此解决方案计算表中每个元素的距离,使其无法用于大型数据集。

1 个答案:

答案 0 :(得分:0)

您应该安装Postgis扩展程序

http://postgis.net/

然后你会有很多可用的地理功能,你可以用毫秒来查询大表。

然后创建一个像这样的函数

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对象