El filtro de alcanzabilidad elimina los reportes de un objeto móvil que este no pudo haber alcanzado: un reporte se conserva cuando el último reporte conservado puede alcanzarlo a una velocidad máxima, dada en unidades de los valores por segundo, que son metros por segundo para una geografía. La distancia es la diferencia de dos flotantes, la distancia plana de dos puntos geométricos o la distancia de dos puntos geográficos sobre el esferoide. El filtro confía en su primer reporte, por lo que el recorrido parte de una semilla, el más temprano de los once primeros reportes que la mayoría de ellos puede alcanzar, y recorre hacia atrás desde ella los reportes anteriores a la semilla. Un valor cuya proporción de reportes inalcanzables desde el reporte anterior supera la mitad se descarta por completo.
Devuelve un flotante temporal o un punto temporal con los instantes que conserva el filtro de alcanzabilidad
reachabilityFilter({tfloat,tgeompoint,tgeogpoint},maxspeed float)
→ {tfloat,tgeompoint,tgeogpoint}
Los instantes conservados mantienen sus secuencias y la interpolación del valor. La función devuelve NULL cuando el valor se descarta por completo.
SELECT asText(reachabilityFilter(tgeompoint '[Point(0 0)@2001-01-01 00:00:00, Point(10 0)@2001-01-01 00:00:01, Point(5000 0)@2001-01-01 00:00:02, Point(30 0)@2001-01-01 00:00:03]', 100)); -- [POINT(0 0)@2001-01-01 00:00:00, POINT(10 0)@2001-01-01 00:00:01, POINT(30 0)@2001-01-01 00:00:03] SELECT reachabilityFilter(tgeompoint '[Point(0 0)@2001-01-01 00:00:00, Point(5000 0)@2001-01-01 00:00:01, Point(0 0)@2001-01-01 00:00:02, Point(5000 0)@2001-01-01 00:00:03]', 100) IS NULL; -- true
Devuelve un flotante temporal o un punto temporal con los instantes que conserva el filtro de alcanzabilidad entre los instantes de un grupo
reachabilityFilterAgg({tfloat,tgeompoint,tgeogpoint},maxspeed float)
→ {tfloat,tgeompoint,tgeogpoint}
El agregado toma los instantes en el orden de sus tiempos, que la consulta indica con ORDER BY, y decide cada uno a su llegada, como lo hace un flujo. Un instante en el tiempo del instante anterior es el mismo reporte, que el agregado toma una sola vez, como lo hace la función. Devuelve una secuencia con la interpolación por defecto del tipo, y NULL cuando los instantes se descartan por completo. Su nombre difiere del de la función, ya que PostgreSQL no admite una función y un agregado con el mismo nombre y los mismos argumentos.
SELECT asText(reachabilityFilterAgg(inst, 5 ORDER BY getTimestamp(inst)))
FROM unnest(instants(tfloat '{1@2001-01-01 00:00:00, 2@2001-01-01 00:00:01,
1000@2001-01-01 00:00:02, 3@2001-01-01 00:00:03}')) AS inst;
-- [1@2001-01-01 00:00:00, 2@2001-01-01 00:00:01, 3@2001-01-01 00:00:03]