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 los pares de índices que cumplen la relación entre dos arreglos de geometrías temporales, generalizando las relaciones espaciales escalares a una unión espacial conjunto-conjunto
eDwithinPairs(tgeo[],tgeo[],float) → setof(i integer, j integer)
aDwithinPairs(tgeo[],tgeo[],float) → setof(i integer, j integer)
eIntersectsPairs(tgeo[],tgeo[]) → setof(i integer, j integer)
aIntersectsPairs(tgeo[],tgeo[]) → setof(i integer, j integer)
eDisjointPairs(tgeo[],tgeo[]) → setof(i integer, j integer)
aDisjointPairs(tgeo[],tgeo[]) → setof(i integer, j integer)
eTouchesPairs(tgeometry[],tgeometry[]) → setof(i integer, j integer)
aTouchesPairs(tgeometry[],tgeometry[]) → setof(i integer, j integer)
tDwithinPairs(tgeo[],tgeo[],float) → setof(i integer, j integer, periods tstzspanset)
tIntersectsPairs(tgeo[],tgeo[]) → setof(i integer, j integer, periods tstzspanset)
tDisjointPairs(tgeo[],tgeo[]) → setof(i integer, j integer, periods tstzspanset)
tTouchesPairs(tgeometry[],tgeometry[]) → setof(i integer, j integer, periods tstzspanset)
Cada función resuelve el producto cruzado podado de los dos arreglos de entrada en una sola llamada y devuelve los índices basados en uno i y j de los pares que cumplen la relación. Las funciones con prefijo e devuelven los pares para los que la relación se cumple alguna vez, las funciones con prefijo a los pares para los que se cumple siempre, y las funciones con prefijo t devuelven además los períodos durante los cuales se cumple. La caja espaciotemporal de cada entrada se usa como prefiltro de caja envolvente, de modo que la relación exacta se calcula solo sobre los pares candidatos que sobreviven, y los pares cuyas extensiones temporales no se solapan se excluyen, igual que en las relaciones escalares. Las funciones están definidas para puntos temporales y geometrías temporales tanto en el caso planar como en el geodésico, excepto la relación de toca, que está definida solo para geometrías planares. Los índices se relacionan con las identidades originales mediante un array_agg(identidad ORDER BY ...) paralelo.
SELECT i, j FROM eDwithinPairs(
ARRAY[tgeompoint '[Point(0 0)@2001-01-01, Point(0 10)@2001-01-02]',
tgeompoint '[Point(50 50)@2001-01-01, Point(50 60)@2001-01-02]'],
ARRAY[tgeompoint '[Point(1 0)@2001-01-01, Point(1 10)@2001-01-02]'], 2.0);
-- 1 | 1
SELECT i, j, periods FROM tDwithinPairs(
ARRAY[tgeompoint '[Point(0 0)@2001-01-01, Point(0 10)@2001-01-02]'],
ARRAY[tgeompoint '[Point(1 0)@2001-01-01, Point(1 10)@2001-01-02]'], 2.0);
-- un par, con el período durante el cual está dentro de la distancia
SELECT i, j FROM aDisjointPairs(
ARRAY[tgeompoint '[Point(0 0)@2001-01-01, Point(0 10)@2001-01-02]'],
ARRAY[tgeompoint '[Point(5 0)@2001-01-01, Point(5 10)@2001-01-02]']);
-- 1 | 1
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]