我正在尝试创建一个REST服务,该服务返回按用户坐标距离排序的位置列表。我使用postgis找到了这个查询:
SELECT *
FROM your_table
ORDER BY your_table.geom <-> "your location..."
LIMIT 5;
但是我无法将其应用到我的实际数据库中。我有一个包含这些列的表:
title, address, description, latitude, longitude
所有这些值都是字符串。
如果有人帮助我,我会很高兴。 THX!答案 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;下面了并不总是可靠的。