PostGIS es una extensión de PostgreSQL que agrega soporte para datos geoespaciales. Una de las operaciones más comunes es calcular la distancia entre dos puntos geográficos. Esto se puede hacer fácilmente utilizando las funciones espaciales que ofrece PostGIS, como ST_Distance
.
Primero, asegúrate de que tienes PostGIS instalado en tu base de datos PostgreSQL:
CREATE EXTENSION postgis;
Esto habilita las funciones geoespaciales en PostgreSQL. Una vez activado, podrás trabajar con tipos de datos espaciales, como geometry
y geography
.
Para calcular la distancia entre dos puntos, es necesario almacenar las coordenadas de los puntos en la base de datos. Por ejemplo:
CREATE TABLE lugares (
id SERIAL PRIMARY KEY,
nombre VARCHAR(50),
ubicacion GEOGRAPHY(Point, 4326)
);
INSERT INTO lugares (nombre, ubicacion)
VALUES
('Punto A', ST_GeogFromText('SRID=4326;POINT(-73.935242 40.730610)')),
('Punto B', ST_GeogFromText('SRID=4326;POINT(-74.0060 40.7128)'));
Aquí estamos insertando dos puntos en formato geográfico (latitud y longitud).
Para obtener la distancia entre estos dos puntos, se utiliza la función ST_Distance
:
SELECT
a.nombre AS punto_a,
b.nombre AS punto_b,
ST_Distance(a.ubicacion, b.ubicacion) AS distancia_metros
FROM
lugares a, lugares b
WHERE
a.nombre = 'Punto A' AND b.nombre = 'Punto B';
Este ejemplo devuelve la distancia en metros entre el "Punto A" y el "Punto B".
Si prefieres obtener la distancia en kilómetros, puedes dividir el resultado entre 1000:
SELECT
ST_Distance(a.ubicacion, b.ubicacion) / 1000 AS distancia_km
FROM
lugares a, lugares b
WHERE
a.nombre = 'Punto A' AND b.nombre = 'Punto B';
Para obtener la distancia entre varios puntos, puedes modificar la consulta para devolver todas las combinaciones posibles:
SELECT
a.nombre AS punto_a,
b.nombre AS punto_b,
ST_Distance(a.ubicacion, b.ubicacion) AS distancia_metros
FROM
lugares a, lugares b
WHERE
a.id < b.id;
Para encontrar todos los puntos dentro de un radio específico de otro punto:
SELECT
nombre,
ST_Distance(ubicacion, ST_GeogFromText('SRID=4326;POINT(-73.935242 40.730610)')) AS distancia_metros
FROM
lugares
WHERE
ST_DWithin(ubicacion, ST_GeogFromText('SRID=4326;POINT(-73.935242 40.730610)'), 10000);
Este ejemplo busca todos los puntos que están dentro de un radio de 10 kilómetros del "Punto A".
Para más información sobre PostGIS, visita el sitio oficial de PostGIS.
Jorge García
Fullstack developer