Obtener la distancia más pequeña que haya existido
{geo,tpoint} |=| {geo,tpoint} → 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 tgeompoint 'Interp=Step;(Point(1 1)@2001-01-01, Point(3 1)@2001-01-03]' |=| geometry 'Linestring(1 3,2 2,3 3)'; -- 1.4142135623731
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
Obtener el instante del primer punto temporal en el que los dos argumentos están a la distancia más cercana
nearestApproachInstant({geo,tpoint},{geo,tpoint}) → tpoint
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(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)')); -- POINT Z (0.75 0.75 0.75)@2001-01-03 12:00:00+00
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
Obtener la línea que conecta el punto de aproximación más cercano
shortestLine({geo,tpoint},{geo,tpoint}) → 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( 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)')); -- LINESTRING Z (0.75 0.75 0.75,1.25 0.75 0.75)
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.
Obtener la distancia temporal
{point,tpoint} <-> {point,tpoint} → 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 tgeompoint '[Point(0 0)@2001-01-01, Point(1 1)@2001-01-02)' <-> tgeompoint '[Point(0 1)@2001-01-01, Point(1 2)@2001-01-02)'; -- [1@2001-01-01,1@2001-01-02)