Las funciones de distancia calculan la distancia entre el cuerpo de una geometría rígida temporal y una geometría, un punto temporal o el cuerpo de otra geometría rígida temporal. El cuerpo en un instante es la geometría de referencia desplazada y girada por la pose en ese instante.
Los valores de una distancia temporal son exactos. Cuando un cuerpo gira, la distancia entre dos instantes no varía linealmente, por lo que la distancia temporal tiene también un instante en cada mínimo y cada máximo de la distancia. Así, la distancia de aproximación más cercana y el instante de aproximación más cercana son exactos.
Las funciones de distancia requieren una geometría de referencia que sea un polígono convexo sin agujeros. Un polígono del otro argumento también debe ser convexo y sin agujeros. Otros valores dan un error.
SELECT tDistance(trgeometry 'Polygon((0 0,4 0,4 4,2 1,0 4,0 0)); Pose(Point(0 0),0)@2001-01-01', geometry 'Point(7 3)'); -- ERROR: The distance of a temporal rigid geometry needs a reference geometry that is -- a convex polygon without holes
Devuelve la distancia temporal
{geometry,tgeompoint,trgeometry} <-> {geometry,tgeompoint,trgeometry} → tfloat
tDistance({geometry,tgeompoint,trgeometry},{geometry,tgeompoint,trgeometry}) → tfloat
En el primer ejemplo, un cuadrado pasa junto a un punto. Su lado permanece a distancia 2 del punto desde las 10:00 hasta las 14:00. En el segundo ejemplo, el cuadrado gira un cuarto de vuelta junto al punto. Una esquina del cuadrado se acerca más al punto a las 12:00, y el resultado tiene un instante allí.
SELECT trgeometry 'Polygon((-1 -1,1 -1,1 1,-1 1,-1 -1)); [Pose(Point(-6 0),0)@2001-01-01, Pose(Point(6 0),0)@2001-01-02]' <-> geometry 'Point(0 3)'; -- [5.385164807134504@2001-01-01, 2@2001-01-01 10:00:00, 2@2001-01-01 14:00:00, -- 5.385164807134504@2001-01-02] SELECT round(trgeometry 'Polygon((-1 -1,1 -1,1 1,-1 1,-1 -1)); [Pose(Point(0 0),0)@2001-01-01, Pose(Point(0 0),1.5707963267948966)@2001-01-02]' <-> geometry 'Point(3 0)', 6); -- [2@2001-01-01, 1.828427@2001-01-01 05:11:32.371809, 1.585786@2001-01-01 12:00:00, -- 1.828427@2001-01-01 18:48:27.628191, 2@2001-01-02] SELECT trgeometry 'Polygon((-1 -1,1 -1,1 1,-1 1,-1 -1)); [Pose(Point(0 0),0)@2001-01-01, Pose(Point(0 0),0)@2001-01-02]' <-> tgeompoint '[Point(3 -4)@2001-01-01, Point(3 4)@2001-01-02]'; -- [3.605551275463989@2001-01-01, 2@2001-01-01 09:00:00, 2@2001-01-01 15:00:00, -- 3.605551275463989@2001-01-02] SELECT trgeometry 'Polygon((0 0,1 0,1 1,0 1,0 0)); [Pose(Point(0 0),0)@2001-01-01, Pose(Point(0 0),0)@2001-01-02]' <-> trgeometry 'Polygon((0 0,1 0,1 1,0 1,0 0)); [Pose(Point(2 0),0)@2001-01-01, Pose(Point(10 0),0)@2001-01-02]'; -- [1@2001-01-01, 9@2001-01-02]
Devuelve la distancia de aproximación más cercana
{geometry,stbox,tgeompoint,trgeometry} |=| {geometry,stbox,tgeompoint,trgeometry} → float
nearestApproachDistance({geometry,stbox,tgeompoint,trgeometry},
{geometry,stbox,tgeompoint,trgeometry}) → float
SELECT trgeometry 'Polygon((0 0,1 0,1 1,0 1,0 0)); [Pose(Point(0 0),0)@2001-01-01, Pose(Point(10 0),0)@2001-01-02]' |=| trgeometry 'Polygon((0 0,1 0,1 1,0 1,0 0)); [Pose(Point(50 0),0)@2001-01-01, Pose(Point(50 0),0)@2001-01-02]'; -- 39 SELECT round(nearestApproachDistance(trgeometry 'Polygon((-1 -1,1 -1,1 1,-1 1,-1 -1)); [Pose(Point(0 0),0)@2001-01-01, Pose(Point(0 0),1.5707963267948966)@2001-01-02]', geometry 'Point(3 0)')::numeric, 6); -- 1.585786
El operador |=| se puede utilizar para búsquedas de vecino más cercano con índices GiST o SP-GiST (véase “Indexación”).
Devuelve el instante del primer argumento en el que los dos argumentos están más cerca
nearestApproachInstant({geometry,tgeompoint,trgeometry},
{geometry,tgeompoint,trgeometry}) → trgeometry
Si la distancia permanece en su mínimo durante un intervalo, el resultado es el primer instante del intervalo. En el segundo ejemplo, el cuadrado está a distancia 4 del punto desde las 09:36 hasta las 12:00.
SELECT asText(nearestApproachInstant(trgeometry 'Polygon((-1 -1,1 -1,1 1,-1 1,-1 -1)); [Pose(Point(0 0),0)@2001-01-01, Pose(Point(0 0),1.5707963267948966)@2001-01-02]', geometry 'Point(3 0)'), 6); -- POLYGON((-1 -1,1 -1,1 1,-1 1,-1 -1));Pose(POINT(0 0),0.785398)@2001-01-01 12:00:00 SELECT asText(nearestApproachInstant(trgeometry 'Polygon((0 0,1 0,1 1,0 1,0 0)); [Pose(Point(0 0),0)@2001-01-01, Pose(Point(10 0),0)@2001-01-02]', geometry 'Point(5 5)')); -- POLYGON((0 0,1 0,1 1,0 1,0 0));Pose(POINT(4 0),0)@2001-01-01 09:36:00
Devuelve la línea entre los puntos más cercanos de los dos argumentos en su instante de aproximación más cercana
shortestLine({geometry,tgeompoint,trgeometry},{geometry,tgeompoint,trgeometry})
→ geometry
SELECT ST_AsText(shortestLine(trgeometry 'Polygon((0 0,1 0,1 1,0 1,0 0)); Pose(Point(0 0),0)@2001-01-01', geometry 'Point(10 0)')); -- LINESTRING(1 0,10 0)