2017-02-21 62 views
0

Я пытаюсь сделать службу REST, которая возвращает список мест, упорядоченных по расстоянию от пользовательской координаты. Я нашел этот запрос, используя postgis:Postgis ближайшие координаты

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

Но я не могу применить это к своей фактической базе данных. У меня есть таблица, которая содержит эти столбцы:

title, address, description, latitude, longitude 

все эти значения как строки.

Я буду очень рад, если кто-нибудь поможет мне. Спасибо!

+0

У вас нет поля geom на вашем столе? –

+0

[''] (http://postgis.net/docs/geometry_distance_knn.html) * Для PostgreSQL ниже 9.5 дается только центроидное расстояние ограничивающих полей и для PostgreSQL 9.5+, действительно ли поиск расстояний KNN дает истинное расстояние между геометриями, и дистанционная сфера для географических регионов. * – pozs

ответ

2

Я не знаю почему, но ORDER BY <-> не является точным. Когда-то ближайшая связь находится на третьей позиции. Поэтому я получаю 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 
+0

+1; это действительно близко к примеру [«гибридный запрос» в документах] (http://postgis.net/docs/geometry_distance_knn.html) об обработке оператора '<->' до 9.5. – pozs

+0

Спасибо @pozs. Теперь я знаю, почему 'порядок <->' не является точным. Это связано с тем, что 'для PostgreSQL ниже 9.5 дает только центроидное расстояние ограничивающих полей и для PostgreSQL 9.5+, действительно ли поиск расстояния по КНН дает истинное расстояние между геометриями и дистанционной сферой для географических районов.« Я имел 9.4 до самого последнего времени. –

+0

@pozs Интересно, что они больше не используют функцию 'ST_GeomFromText'. просто переведите строку в геометрию. Я думаю, что я становлюсь старше :( –

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 < -> не всегда надежно.

+0

Очень ТНХ вы мне очень помогли я сделал некоторые улучшения по запросу Что вы думаете:..!. 'SELECT *, ST_Distance_Sphere (ST_MakePoint (долгота , широта), ST_MakePoint (-46,4890173, -23,5185825)) как расстояние ОТ MYTABLE ORDER BY расстояние LIMIT 5; ' – aKANJ

+0

Да уж' ST_Distance_Sphere' дает вам хорошее решение (если вам не нужно очень точные расстояния) ,Извините, я забыл упомянуть в своем ответе, что 'ST_Distance' или' <-> 'не является хорошим способом измерения расстояний, если вы используете SRID 4326. – banazs