yyyy to_char postgres longitud insensitive examples cast cadena postgresql postgis

longitud - postgresql to_char date examples



PostgreSQL latitud longitud consulta (4)

Tengo columnas de latitude y longitude en location tabla de location en la base de datos PostgreSQL, y estoy tratando de ejecutar la consulta a distancia con una función PostgreSQL.

Leí este capítulo del manual:

https://www.postgresql.org/docs/current/static/earthdistance.html

Pero creo que me estoy perdiendo algo allí.

¿Cómo debo hacer eso? ¿Hay más ejemplos disponibles?


Aquí hay otro ejemplo usando el operador de puntos:

Configuración inicial (solo se necesita ejecutar una vez):

create extension cube; create extension earthdistance;

Y luego la consulta:

select (point(-0.1277,51.5073) <@> point(-74.006,40.7144)) as distance; distance ------------------ 3461.10547602474 (1 row)

Tenga en cuenta que los points se crean con LONGITUD PRIMERO . Según la documentation :

Los puntos se toman como (longitud, latitud) y no al revés, porque la longitud está más cerca de la idea intuitiva del eje x y la latitud al eje y.

Que es un diseño terrible ... pero así es como es.

Su salida será en millas .

Indica la distancia en millas estatutarias entre dos puntos en la superficie de la Tierra.


Este módulo es opcional y no está instalado en la instalación predeterminada de PostgreSQL. Debe instalarlo desde el directorio contrib.

Puede usar la siguiente función para calcular la distancia aproximada entre coordenadas (en millas):

CREATE OR REPLACE FUNCTION distance(lat1 FLOAT, lon1 FLOAT, lat2 FLOAT, lon2 FLOAT) RETURNS FLOAT AS $$ DECLARE x float = 69.1 * (lat2 - lat1); y float = 69.1 * (lon2 - lon1) * cos(lat1 / 57.3); BEGIN RETURN sqrt(x * x + y * y); END $$ LANGUAGE plpgsql;


Suponiendo que haya instalado correctamente el módulo de distancia terrestre, esto le dará la distancia en millas entre dos ciudades. Este método utiliza las distancias terrestres más simples basadas en puntos. Tenga en cuenta que los argumentos para señalar () son la primera longitud, luego la latitud.

create table lat_lon ( city varchar(50) primary key, lat float8 not null, lon float8 not null ); insert into lat_lon values (''London, GB'', 51.67234320, 0.14787970), (''New York, NY'', 40.91524130, -73.7002720); select ( (select point(lon,lat) from lat_lon where city = ''London, GB'') <@> (select point(lon,lat) from lat_lon where city = ''New York, NY'') ) as distance_miles distance_miles -- 3447.58672105301


Una versión más precisa de la respuesta de @ strkol, utilizando la fórmula de Haversine

CREATE OR REPLACE FUNCTION distance( lat1 double precision, lon1 double precision, lat2 double precision, lon2 double precision) RETURNS double precision AS $BODY$ DECLARE R integer = 6371e3; -- Meters rad double precision = 0.01745329252; φ1 double precision = lat1 * rad; φ2 double precision = lat2 * rad; Δφ double precision = (lat2-lat1) * rad; Δλ double precision = (lon2-lon1) * rad; a double precision = sin(Δφ/2) * sin(Δφ/2) + cos(φ1) * cos(φ2) * sin(Δλ/2) * sin(Δλ/2); c double precision = 2 * atan2(sqrt(a), sqrt(1-a)); BEGIN RETURN R * c; END $BODY$ LANGUAGE plpgsql VOLATILE COST 100;

La entrada está en grados (por ejemplo, 52.34273489, 6.23847) y la salida está en metros.