Después de buscar durante días y probar todo lo que encuentro, estoy aquí para preguntar cómo calcular la distancia entre dos puntos en Postgres con PostGis. Tengo una tabla llamada ubicación. Esta tabla tiene una columna "coordenada" de tipo punto. Cuando el usuario inserta un valor en la aplicación, necesito obtener las ubicaciones ordenadas por la distancia de cierre. Sé que necesito usar ST_Distance, pero cada vez que trato de lanzar el PUNTO de coordenadas no puedo. Necesito el resultado en Km.
Lo intento:
SELECT ST_Distance('POINT(0.0 0.0)', ST_GeomFromText(location.coordenate)) FROM app.location as location;
Para obtener distancias en metros/kilómetros, debe transformar sus coordenadas en un SRS que tenga el metro como unidad o, si es posible, usar geography en lugar de la geometry , ya que ST_Distance devuelve la distancia de dos parámetros geography en metros (1 km = 1000 m), p.ej
SELECT ST_Distance(ST_MakePoint(0.0,0.0)::geography, coordenate::geography)/1000 FROM app.location;geometry / text a geography Demostración: db<>fiddle
CREATE TABLE location (gid int, coordenate geometry(point,4326)); INSERT INTO location VALUES (1,'SRID=4326;POINT(10 10)'),(2,'SRID=4326;POINT(0.1 0.1)'); SELECT gid, ST_AsText(coordenate), ST_Distance(ST_MakePoint(0.0,0.0)::geography, coordenate::geography)/1000 FROM location ORDER BY coordenate::geography <-> ST_MakePoint(0.0,0.0)::geography; gid | st_astext | ?column? -----+----------------+-------------------- 2 | POINT(0.1 0.1) | 15.690343289660001 1 | POINT(10 10) | 1565.1090992178902 (2 rows) El operador <-> significa distancia, por lo que al usarlo en la cláusula ORDER BY puede ordenar el conjunto de resultados por distancia.
point de lanzamiento a geography El point de tipo de datos no es un tipo de datos de PostGIS, sino un geometric data type de PostgreSQL. Para usar ST_Distance , debe convertir los puntos en geometría o geografía.
Demostración: db<>fiddle
CREATE TABLE location (gid int, coordenate point); INSERT INTO location VALUES (1,point(10,10)),(2,point(0.1,0.1)); SELECT *, ST_Distance( ST_MakePoint(0.0,0.0)::geography, ST_MakePoint(coordenate[0],coordenate[1])::geography)/1000 FROM location ORDER BY ST_MakePoint(coordenate[0],coordenate[1])::geography <-> ST_MakePoint(0.0,0.0)::geography; gid | coordenate | ?column? -----+------------+-------------------- 2 | (0.1,0.1) | 15.690343289660001 1 | (10,10) | 1565.1090992178902 (2 rows)Otras lecturas: