Volver a la página principal
viernes 13 septiembre 2024
36

Cómo saber la distancia entre dos puntos con PostGIS en PostgreSQL

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.

Configurar PostGIS

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.

Insertar puntos geográficos

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).

Calcular la distancia entre dos puntos

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".

Convertir a otras unidades

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';

Ejemplos de uso con PostGIS

Ejemplo: Calcular distancias entre múltiples puntos

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;

Ejemplo: Buscar puntos dentro de un radio

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".

Referencias

Para más información sobre PostGIS, visita el sitio oficial de PostGIS.

Compartir:
Creado por:
Author photo

Jorge García

Fullstack developer