sql >> Base de Datos >  >> RDS >> PostgreSQL

Cómo configurar PostgreSQL con Postgis para calcular distancias

Respuesta corta:

Simplemente convierta su x,y valores sobre la marcha usando ST_MakePoint (¡cuidado con la sobrecarga!) y calcule la distancia desde un punto dado, el SRS predeterminado será WGS84 :

SELECT ST_Distance(ST_MakePoint(lon,lat)::GEOGRAPHY,
                   ST_MakePoint(23.73,37.99)::GEOGRAPHY) FROM places;

Usando GEOGRAPHY obtendrá el resultado en metros, mientras usa GEOMETRY lo dará en grados. Por supuesto, conocer el SRS de los pares de coordenadas es imprescindible para calcular distancias, pero si tiene el control de la calidad de los datos y las coordenadas son consistentes (en este caso, omitiendo el SRS), no hay mucho de qué preocuparse. Comenzará a ser complicado si planea realizar operaciones con datos externos, de los cuales tampoco conoce el SRS y podría diferir del suyo.

Respuesta larga:

Bueno, si está usando PostGIS, no debería usar x,y en columnas separadas en primer lugar. Puede agregar fácilmente una columna de geometría/geografía haciendo algo como esto.

Esta es tu mesa...

CREATE TABLE places (place TEXT, lon NUMERIC, lat NUMERIC);

Que contiene los siguientes datos..

INSERT INTO places VALUES ('Budva',18.84,42.92),
                          ('Ohrid',20.80,41.14);

Así es como agrega una columna de tipo de geografía:

ALTER TABLE places ADD COLUMN geo GEOGRAPHY;

Una vez que se agrega su columna, así es como convierte sus coordenadas a geografía/geometría y actualiza su tabla:

UPDATE places SET geo = ST_MakePoint(lon,lat);

Para calcular la distancia solo necesitas usar la función ST_Distance , de la siguiente manera (distancia en metros):

SELECT ST_Distance(geo,ST_MakePoint(23.73,37.99)) FROM places;

   st_distance   
-----------------
 686560.16822422
 430876.07368955
(2 Zeilen)

Si tiene su parámetro de ubicación en WKT , también puedes usar:

SELECT ST_Distance(geo,'POINT(23.73 37.99)') FROM places;
   st_distance   
-----------------
 686560.16822422
 430876.07368955
(2 Zeilen)