Postgis最近的坐标

时间:2017-02-21 13:54:31

标签: postgresql location postgis

我正在尝试创建一个REST服务,该服务返回按用户坐标距离排序的位置列表。我使用postgis找到了这个查询:

SELECT *
FROM your_table 
ORDER BY your_table.geom <-> "your location..."
LIMIT 5;

但是我无法将其应用到我的实际数据库中。我有一个包含这些列的表:

title, address, description, latitude, longitude

所有这些值都是字符串。

如果有人帮助我,我会很高兴。 THX!

2 个答案:

答案 0 :(得分:2)

我不知道为什么,但ORDER BY <->并不准确。有时最近的链接在第3个位置。所以我得到了101个元素,然后使用距离来选择最接近的元素。

CREATE OR REPLACE FUNCTION map.get_near_link(
    x numeric,
    y numeric)
  RETURNS TABLE(Link_ID int, distance int) AS
$BODY$
DECLARE
    strPoint text;      
  BEGIN
    strPoint = 'POINT('|| X || ' ' || Y || ')';

    With CTE AS (
        SELECT Link_ID, 
               TRUNC(ST_Distance(ST_GeomFromText(strPoint,4326), geom  )*100000)::integer as distance             
        FROM map.vzla_seg S
        ORDER BY 
                geom <-> ST_GeomFromText(strPoint, 4326)
        LIMIT 101
   )
   SELECT *
   FROM CTE
   ORDER BY distance
   LIMIT 5

答案 1 :(得分:1)

要使用PostGIS,您必须在数据库中启用扩展程序。理想情况下,您只需运行CREATE EXTENSION postgis;命令即可​​。 注意形成安装页面:请勿在名为postgres的数据库中安装它。有关更多信息,请访问site

将几何列(空间数据可以存储在此类列中)添加到表中:

SELECT AddGeometryColumn(
   'your_schema', 
   'your_table', 
   'geom',   -- name of the column
   4326,     -- SRID, for GPS coordinates you can use this, for more information https://en.wikipedia.org/wiki/Spatial_reference_system
   'POINT',  -- type of geometry eg. POINT, POLYGON etc.
   2         -- number of dimension (2 xy - 3 xyz)
);

UPDATE yourtable t SET t.geom = ST_SetSRID(ST_MakePoint(t.x, t.y), 4326)
-- the x and y is the latitude and longitude

现在您可以在表格上使用空格查询,如下所示:

SELECT 
  *
FROM 
  your_table 
ORDER BY 
  your_table.geom <-> ST_SetSRID(ST_MakePoint(x, y), 4326)
LIMIT 5;

注意:正如其他人所提到的,在PostgreSQL 9.5&lt; - &gt;下面了并不总是可靠的。