PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Como configurar o PostgreSQL com Postgis para calcular distâncias


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)