Tabla de contenidos
Restringe a (al complemento de) una geometría
atGeometry(tgeom,geometry) → tgeom minusGeometry(tgeom,geometry) → tgeom
La geometría debe ser 2D y el cálculo con respecto a ella se realiza en 2D. El resultado conserva la dimensión Z del punto temporal, si existe.
Un punto geodésico se restringe a una geography, que debe ser un polígono o un multipolígono, y el cálculo se realiza sobre la esfera: el punto recorre el círculo máximo entre dos posiciones y la región está delimitada por los círculos máximos que pasan por sus propios vértices, de modo que el viaje entra y sale donde esos caminos se cruzan. La diferencia crece con la latitud, ya que un viaje a lo largo de un paralelo se sitúa bastante al norte de él.
SELECT asText(atGeometry(tgeompoint '[Point(0 0)@2001-01-01, Point(3 3)@2001-01-04)',
geometry 'Polygon((1 1,1 2,2 2,2 1,1 1))'));
-- {"[POINT(1 1)@2001-01-02, POINT(2 2)@2001-01-03]"}
SELECT astext(atGeometry(tgeompoint '[Point(0 0 0)@2001-01-01, Point(4 4 4)@2001-01-05]',
geometry 'Polygon((1 1,1 2,2 2,2 1,1 1))'));
-- {[POINT Z (1 1 1)@2001-01-02, POINT Z (2 2 2)@2001-01-03]}
SELECT asText(atGeometry(tgeompoint '[Point(1 1 1)@2001-01-01, Point(3 1 1)@2001-01-03,
Point(3 1 3)@2001-01-05]', 'Polygon((2 0,2 2,2 4,4 0,2 0))'));
-- {[POINT Z (2 1 1)@2001-01-02, POINT Z (3 1 1)@2001-01-03, POINT Z (3 1 3)@2001-01-05]}
SELECT asText(atGeometry(tgeometry 'Linestring(1 1,10 1)@2001-01-01',
'Polygon((0 0,0 5,5 5,5 0,0 0))'));
-- LINESTRING(1 1,5 1)@2001-01-01
SELECT asText(minusGeometry(tgeompoint '[Point(0 0)@2001-01-01, Point(3 3)@2001-01-04)',
geometry 'Polygon((1 1,1 2,2 2,2 1,1 1))'));
/* {[POINT(0 0)@2001-01-01, POINT(1 1)@2001-01-02), (POINT(2 2)@2001-01-03,
POINT(3 3)@2001-01-04)} */
SELECT astext(minusGeometry(tgeompoint '[Point(0 0 0)@2001-01-01,
Point(4 4 4)@2001-01-05]', geometry 'Polygon((1 1,1 2,2 2,2 1,1 1))'));
/* {[POINT Z (0 0 0)@2001-01-01, POINT Z (1 1 1)@2001-01-02),
(POINT Z (2 2 2)@2001-01-03, POINT Z (4 4 4)@2001-01-05]} */
SELECT asText(minusGeometry(tgeompoint '[Point(1 1 1)@2001-01-01, Point(3 1 1)@2001-01-03,
Point(3 1 3)@2001-01-05]', 'Polygon((2 0,2 2,2 4,4 0,2 0))'));
-- {[POINT Z (1 1 1)@2001-01-01, POINT Z (2 1 1)@2001-01-02)}
SELECT asText(minusGeometry(tgeometry 'Linestring(1 1,10 1)@2001-01-01',
'Polygon((0 0,0 5,5 5,5 0,0 0))'));
-- LINESTRING(5 1,10 1)@2001-01-01
SELECT asText(atGeometry(tgeogpoint 'SRID=4326;[Point(-170 65)@2001-01-01,
Point(-100 65)@2001-01-03]',
geography 'SRID=4326;Polygon((-150 60,-150 70,-120 70,-120 60,-150 60))'), 6);
/* {[POINT(-150 68.423603)@2001-01-01 14:39:22.550164,
POINT(-120 68.423603)@2001-01-02 09:20:37.449835]} */
Restringe a (al complemento de) un stbox
atStbox(tgeom,stbox,borderInc boolean=true) → tgeompoint minusStbox(tgeom,stbox,borderInc boolean=true) → tgeompoint
El tercer argumento opcional se utiliza para mosaicos multidimensionales (ver “Mosaicos multidimensionales”) para excluir el borde superior de los mosaicos cuando un valor temporal se divide en varios mosaicos, de modo que todos los fragmentos de la geometría temporal sean exclusivos.
Un punto temporal se restringe en 3D. La dimensión Z se tiene en cuenta únicamente cuando tanto el punto temporal como la caja la tienen, de modo que se pueden mezclar argumentos 2D y 3D, y el resultado conserva la dimensión Z del punto temporal. El cuerpo de una geometría temporal, en cambio, se recorta en 2D: una caja que contiene coordenadas rechaza una geometría temporal que tiene dimensión Z, mientras que una caja que contiene únicamente un período la restringe en el tiempo como para cualquier otro tipo temporal. La restricción de un tgeography a una caja espaciotemporal no está implementada.
Un punto temporal geodésico recorre el círculo máximo entre dos posiciones, y la caja lo contiene donde ese círculo entra en ella y sale de ella: un viaje de Point(10 60) a Point(50 60) alcanza la latitud 61.518762, y un viaje que cruza el antimeridiano recorre las longitudes por el camino corto. Dos cajas que se encuentran en un cruce indican el mismo instante para él, de modo que las piezas de un viaje contienen el período del viaje y sus posiciones.
SELECT asText(atStbox(tgeogpoint '[Point(10 60)@2001-01-01, Point(50 60)@2001-01-02]',
stbox 'SRID=4326;GEODSTBOX X((0 55),(60 61))', false), 6);
/* {[POINT(10 60)@2001-01-01, POINT(18.168064 61)@2001-01-01 05:02:50.433397),
[POINT(41.831936 61)@2001-01-01 18:57:09.566602, POINT(50 60)@2001-01-02]} */
SELECT asText(atStbox(tgeompoint '[Point(0 0)@2001-01-01, Point(3 3)@2001-01-04)',
stbox 'STBOX XT(((0,0),(2,2)),[2001-01-02, 2001-01-04])'));
-- {[POINT(1 1)@2001-01-02, POINT(2 2)@2001-01-03]}
SELECT asText(atStbox(tgeompoint '[Point(1 1 1)@2001-01-01, Point(3 3 3)@2001-01-03,
Point(3 3 2)@2001-01-04, Point(3 3 7)@2001-01-09]', stbox 'STBOX Z((2,2,2),(3,3,3))'));
/* {[POINT Z (2 2 2)@2001-01-02, POINT Z (3 3 3)@2001-01-03, POINT Z (3 3 2)@2001-01-04,
POINT Z (3 3 3)@2001-01-05]} */
SELECT asText(atStbox(tgeometry '[Point(1 1)@2001-01-01, Linestring(1 1,3 3)@2001-01-03,
Point(2 2)@2001-01-04, Linestring(3 3,4 4)@2001-01-09]', stbox 'STBOX X((2,2),(3,3))'));
-- {[LINESTRING(2 2,3 3)@2001-01-03, POINT(2 2)@2001-01-04, POINT(3 3)@2001-01-09]}
SELECT asText(minusStbox(tgeompoint '[Point(1 1)@2001-01-01, Point(4 4)@2001-01-04)',
stbox 'STBOX XT(((1,1),(2,2)),[2001-01-03,2001-01-04])'));
-- {(POINT(2 2)@2001-01-02, POINT(3 3)@2001-01-03)}
SELECT asText(minusStbox(tgeompoint '[Point(1 1 1)@2001-01-01, Point(3 3 3)@2001-01-03,
Point(3 3 2)@2001-01-04, Point(3 3 7)@2001-01-09]', stbox 'STBOX Z((2,2,2),(3,3,3))'));
/* {[POINT Z (1 1 1)@2001-01-01, POINT Z (2 2 2)@2001-01-02),
(POINT Z (3 3 3)@2001-01-05, POINT Z (3 3 7)@2001-01-09]} */
SELECT asText(minusStbox(tgeometry '[Point(1 1)@2001-01-01,
Linestring(1 1,3 3)@2001-01-03, Point(2 2)@2001-01-04, Linestring(1 1,4 4)@2001-01-09]',
stbox 'STBOX X((2,2),(3,3))'));
/* {[POINT(1 1)@2001-01-01, LINESTRING(1 1,2 2)@2001-01-03,
LINESTRING(1 1,2 2)@2001-01-04),[MULTILINESTRING((1 1,2 2),(3 3,4 4))@2001-01-09]} */
Restringe a (al complemento de) un rango de altitud
atElevation(tpoint,floatspan) → tpoint minusElevation(tpoint,floatspan) → tpoint
La altitud de un punto temporal es su coordenada Z, que varía linealmente en el tiempo tanto si el punto es planar como si es geodésico, de modo que los períodos que el rango admite son los mismos para ambos. Las posiciones en los límites de esos períodos no lo son: un punto geodésico recorre el círculo máximo entre dos posiciones y alcanza allí la altitud de un límite, y no sobre la línea recta en longitud y latitud.
SELECT astext(atElevation(tgeompoint '[Point(1 1 1)@2001-01-01, Point(4 4 4)@2001-01-04,
Point(1 1 1)@2001-01-07]', floatspan '[2,3]'));
/* {[POINT Z (2 2 2)@2001-01-02, POINT Z (3 3 3)@2001-01-03],
[POINT Z (3 3 3)@2001-01-05, POINT Z (2 2 2)@2001-01-06]} */
SELECT astext(minusElevation(tgeompoint '[Point(1 1 1)@2001-01-01,
Point(4 4 4)@2001-01-04, Point(1 1 1)@2001-01-07]', floatspan '[2,3]'));
/* {[POINT Z (1 1 1)@2001-01-01, POINT Z (2 2 2)@2001-01-02),
(POINT Z (3 3 3)@2001-01-03, POINT Z (4 4 4)@2001-01-04,
POINT Z (3 3 3)@2001-01-05), (POINT Z (2 2 2)@2001-01-06,
POINT Z (1 1 1)@2001-01-07]} */
SELECT asText(atElevation(tgeogpoint 'SRID=4326;[Point(1 1 1)@2001-01-01,
Point(4 4 4)@2001-01-04, Point(1 1 1)@2001-01-07]', floatspan '[2,3]'), 6);
/* {[POINT Z (1.998577 2.00071 2)@2001-01-02, POINT Z (2.998373 3.000812 3)@2001-01-03],
[POINT Z (2.998373 3.000812 3)@2001-01-05, POINT Z (1.998577 2.00071 2)@2001-01-06]} */