Devuelve la distancia más pequeña que haya existido
{geo,tgeo} |=| {geo,tgeo} → float
SELECT tgeompoint '[Point(0 0)@2001-01-02, Point(1 1)@2001-01-04, Point(0 0)@2001-01-06)' |=| geometry 'Linestring(2 2,2 1,3 1)'; -- 1 SELECT tgeompoint '[Point(0 0)@2001-01-01, Point(1 1)@2001-01-03, Point(0 0)@2001-01-05)' |=| tgeompoint '[Point(2 0)@2001-01-02, Point(1 1)@2001-01-04, Point(2 2)@2001-01-06)'; -- 0.5 SELECT tgeompoint '[Point(0 0 0)@2001-01-01, Point(1 1 1)@2001-01-03, Point(0 0 0)@2001-01-05)' |=| tgeompoint '[Point(2 0 0)@2001-01-02, Point(1 1 1)@2001-01-04, Point(2 2 2)@2001-01-06)'; -- 0.5 SELECT tgeometry '(Point(1 1)@2001-01-01, Linestring(3 1,1 1)@2001-01-03]' |=| geometry 'Linestring(1 3,2 2,3 3)'; -- 1
El operador |=| se puede utilizar para realizar una búsqueda de vecino más cercano utilizando un índice GiST o SP-GIST (ver la “Indexación”). Esta función corresponde a la función ST_DistanceCPA proporcionada por PostGIS, aunque este última requiere que ambos argumentos sean una trayectoria.
SELECT ST_DistanceCPA(
tgeompoint '[Point(0 0 0)@2001-01-01, Point(1 1 1)@2001-01-03,
Point(0 0 0)@2001-01-05)'::geometry,
tgeompoint '[Point(2 0 0)@2001-01-02, Point(1 1 1)@2001-01-04,
Point(2 2 2)@2001-01-06)'::geometry);
-- 0.5
Devuelve el instante del primer punto temporal en el que los dos argumentos están a la distancia más cercana
nearestApproachInstant({geo,tgeo},{geo,tgeo}) → tgeo
La función sólo devuelve el primer instante que encuentre si hay más de uno. El instante resultante puede tener un límite exclusivo.
SELECT asText(nearestApproachInstant(tgeompoint '(Point(1 1)@2001-01-01, Point(3 1)@2001-01-03]', geometry 'Linestring(1 3,2 2,3 3)')); -- POINT(2 1)@2001-01-02 SELECT asText(nearestApproachInstant(tgeompoint 'Interp=Step;(Point(1 1)@2001-01-01, Point(3 1)@2001-01-03]', geometry 'Linestring(1 3,2 2,3 3)')); -- POINT(1 1)@2001-01-01 SELECT asText(nearestApproachInstant(tgeompoint '(Point(1 1)@2001-01-01, Point(2 2)@2001-01-03]', tgeompoint '(Point(1 1)@2001-01-01, Point(4 1)@2001-01-03]')); -- POINT(1 1)@2001-01-01 SELECT asText(nearestApproachInstant(tgeometry '[Linestring(0 0 0,1 1 1)@2001-01-01, Point(0 0 0)@2001-01-03]', tgeometry '[Point(2 0 0)@2001-01-02, Point(1 1 1)@2001-01-04, Point(2 2 2)@2001-01-06]')); -- LINESTRING Z (0 0 0,1 1 1)@2001-01-02
La función nearestApproachInstant generaliza the la función PostGIS ST_ClosestPointOfApproach. Primero, la última función requiere que ambos argumentos sean trayectorias. Segundo, la función nearestApproachInstant devuelve tanto el punto como la marca de tiempo del punto de aproximación más cercano, mientras que la función PostGIS sólo proporciona la marca de tiempo como se muestra a continuación.
SELECT to_timestamp(ST_ClosestPointOfApproach(
tgeompoint '[Point(0 0 0)@2001-01-01, Point(1 1 1)@2001-01-03,
Point(0 0 0)@2001-01-05)'::geometry,
tgeompoint '[Point(2 0 0)@2001-01-02, Point(1 1 1)@2001-01-04,
Point(2 2 2)@2001-01-06)'::geometry));
-- 2001-01-03 12:00:00+00
Devuelve la distancia espacial mínima entre dos geometrías temporales sobre la unión de sus extensiones temporales
minDistance({tgeo,geo},{tgeo,geo}) → float
minDistance(tgeo[],tgeo[]) → float
minDistance(tgeo,tgeo) → float (agregado)
La forma escalar devuelve la distancia mínima alcanzada entre los dos argumentos sobre la intersección de sus extensiones temporales, equivalente al valor mínimo de la distancia temporal <->. La forma de arreglo generaliza esto a dos conjuntos de geometrías temporales y devuelve el mínimo sobre todos los pares. La forma de agregado, utilizada con GROUP BY, devuelve la distancia mínima alcanzada sobre todos los pares agregados en el grupo.
SELECT minDistance(tgeompoint '[Point(0 0)@2001-01-01, Point(1 1)@2001-01-03)',
geometry 'Point(0 1)');
-- 0.707106781186548
SELECT minDistance(
ARRAY[tgeompoint '[Point(0 0)@2001-01-01, Point(1 1)@2001-01-03)',
tgeompoint '[Point(5 5)@2001-01-01, Point(6 6)@2001-01-03)'],
ARRAY[tgeompoint '[Point(0 1)@2001-01-01, Point(1 0)@2001-01-03)']);
-- 0
SELECT g, minDistance(t1.Trip, t2.Trip)
FROM Trips t1, Trips t2, Groups g
WHERE t1.GroupId = g AND t2.GroupId = g AND t1.TripId < t2.TripId
GROUP BY g;
La forma de agregado se adapta bien a las consultas tipo BerlinMOD que calculan la distancia mínima de aproximación entre pares de trayectorias agrupados por licencia o tipo de vehículo. En un grupo de una sola fila, el agregado se reduce a la distancia mínima escalar entre el par.
Devuelve la línea que conecta el punto de aproximación más cercano
shortestLine({geo,tgeo},{geo,tgeo}) → geo
La función sólo devolverá la primera línea que encuentre si hay más de una.
SELECT ST_AsText(shortestLine(tgeompoint '(Point(1 1)@2001-01-01, Point(3 1)@2001-01-03]', geometry 'Linestring(1 3,2 2,3 3)')); -- LINESTRING(2 1,2 2) SELECT ST_AsText(shortestLine(tgeompoint 'Interp=Step;(Point(1 1)@2001-01-01, Point(3 1)@2001-01-03]', geometry 'Linestring(1 3,2 2,3 3)')); -- LINESTRING(1 1,2 2) SELECT ST_AsText(shortestLine(tgeometry '[Linestring(0 0 0,1 1 1)@2001-01-01, Point(0 0 0)@2001-01-03]', tgeometry '[Point(2 0 0)@2001-01-02, Point(1 1 1)@2001-01-04, Point(2 2 2)@2001-01-06]')); -- LINESTRING Z (0 0 0,2 0 0)
La función shortestLine se puede utilizar para obtener el resultado proporcionado por la función PostGIS ST_CPAWithin cuando ambos argumentos son trayectorias como se muestra a continuación.
SELECT ST_Length(shortestLine(
tgeompoint '[Point(0 0 0)@2001-01-01, Point(1 1 1)@2001-01-03,
Point(0 0 0)@2001-01-05)',
tgeompoint '[Point(2 0 0)@2001-01-02, Point(1 1 1)@2001-01-04,
Point(2 2 2)@2001-01-06)')) <= 0.5;
-- true
SELECT ST_CPAWithin(
tgeompoint '[Point(0 0 0)@2001-01-01, Point(1 1 1)@2001-01-03,
Point(0 0 0)@2001-01-05)'::geometry,
tgeompoint '[Point(2 0 0)@2001-01-02, Point(1 1 1)@2001-01-04,
Point(2 2 2)@2001-01-06)'::geometry, 0.5);
-- true
El operador de distancia temporal, denotado <->, calcula la distancia en cada instante de la intersección de las extensiones temporales de sus argumentos y da como resultado un número flotante temporal. Calcular la distancia temporal es útil en muchas aplicaciones de movilidad. Por ejemplo, un grupo en movimiento (también conocido como convoy o bandada) se define como un conjunto de objetos que se mueven cerca unos de otros durante un intervalo de tiempo prolongado. Esto requiere calcular la distancia temporal entre dos objetos en movimiento.
El operador de distancia temporal acepta una geometría/geografía restringida a un punto o un punto temporal como argumentos. Observe que los tipos temporales sólo consideran la interpolación lineal entre valores, mientras que la distancia es una raíz de una función cuadrática. Por lo tanto, el operador de distancia temporal proporciona una aproximación lineal del valor de distancia real para los puntos de secuencia temporal. En este caso, los argumentos se sincronizan en la dimensión de tiempo y para cada uno de los segmentos de línea que componen los argumentos, se calcula la distancia espacial entre el punto inicial, el punto final y el punto de aproximación más cercano, como se muestra en los ejemplos a continuación.
Devuelve la distancia temporal
{geo,tgeo} <-> {geo,tgeo} → tfloat
SELECT tgeompoint '[Point(0 0)@2001-01-01, Point(1 1)@2001-01-03)' <-> geometry 'Point(0 1)'; -- [1@2001-01-01, 0.707106781186548@2001-01-02, 1@2001-01-03) SELECT tgeompoint '[Point(0 0)@2001-01-01, Point(1 1)@2001-01-03)' <-> tgeompoint '[Point(0 1)@2001-01-01, Point(1 0)@2001-01-03)'; -- [1@2001-01-01, 0@2001-01-02, 1@2001-01-03) SELECT tgeompoint '[Point(0 1)@2001-01-01, Point(0 0)@2001-01-03)' <-> tgeompoint '[Point(0 0)@2001-01-01, Point(1 0)@2001-01-03)'; -- [1@2001-01-01, 0.707106781186548@2001-01-02, 1@2001-01-03) SELECT tgeometry '[Point(0 0)@2001-01-01, Linestring(0 0,1 1)@2001-01-02]' <-> tgeometry '[Point(0 1)@2001-01-01, Point(1 0)@2001-01-02)'; -- Interp=Step;[1@2001-01-01, 1@2001-01-02]