Resposta curta:
Basta converter seu x,y valores em tempo real usando
ST_MakePoint
(cuidado com a sobrecarga!) e calcule a distância de um determinado ponto, o SRS padrão será WGS84
:SELECT ST_Distance(ST_MakePoint(lon,lat)::GEOGRAPHY,
ST_MakePoint(23.73,37.99)::GEOGRAPHY) FROM places;
Usando
GEOGRAPHY
você obterá o resultado em metros, usando GEOMETRY
vai dar em graus. É claro que conhecer o SRS dos pares de coordenadas é imperativo para calcular distâncias, mas se você tem controle da qualidade dos dados e as coordenadas são consistentes (neste caso, omitindo o SRS), não há muito com o que se preocupar. Começará a ficar complicado se você estiver planejando realizar operações usando dados externos, dos quais você também desconhece o SRS e pode ser diferente do seu. Resposta longa:
Bem, se você estiver usando PostGIS, você não deveria estar usando x,y em colunas separadas em primeiro lugar. Você pode facilmente adicionar uma coluna de geometria/geografia fazendo algo assim.
Esta é a sua mesa ...
CREATE TABLE places (place TEXT, lon NUMERIC, lat NUMERIC);
Contendo os seguintes dados ..
INSERT INTO places VALUES ('Budva',18.84,42.92),
('Ohrid',20.80,41.14);
Veja como você adiciona uma coluna de tipo de geografia:
ALTER TABLE places ADD COLUMN geo GEOGRAPHY;
Depois que sua coluna for adicionada, é assim que você converte suas coordenadas em geografia/geometria e atualiza sua tabela:
UPDATE places SET geo = ST_MakePoint(lon,lat);
Para calcular a distância basta usar a função
ST_Distance
, como segue (distância em metros):SELECT ST_Distance(geo,ST_MakePoint(23.73,37.99)) FROM places;
st_distance
-----------------
686560.16822422
430876.07368955
(2 Zeilen)
Se você tiver seu parâmetro de localização em
WKT
, você também pode usar:SELECT ST_Distance(geo,'POINT(23.73 37.99)') FROM places;
st_distance
-----------------
686560.16822422
430876.07368955
(2 Zeilen)