PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

PostGIS:Consultar dimensões z e m (linestringzm)


Se você quiser verificar todos os pontos de sua LineString, você pode ST_DumpPoints e obtenha o M dimensão com ST_M . Depois disso, extraia o subconjunto como um LineString contendo o M sobreposto valores e aplique ST_MakeLine com um GROUP BY :
WITH j AS (
  SELECT id,geom,(ST_DumpPoints(geom)).geom AS p 
  FROM t 
) 
SELECT id,ST_AsText(ST_MakeLine(p))
FROM j
WHERE ST_M(p) BETWEEN 1618388000 AND 1618388700
GROUP BY id;

Demonstração:db<>fiddle

Observação :Dependendo dos tamanhos de sua tabela e LineString, essa consulta pode se tornar bastante lenta, pois os valores estão sendo analisados ​​no tempo da consulta e, portanto, não são indexados. Imho uma alternativa mais elegante seria ..

.. 1) para criar um tstzrange coluna
ALTER TABLE t ADD COLUMN line_interval tstzrange;

.. 2) para indexá-lo corretamente
CREATE INDEX idx_t_line_interval ON t USING gist (line_interval);

.. e 3) para preenchê-lo com a hora de geom de primeiro e último pontos:
UPDATE t SET line_interval = 
  tstzrange(
    to_timestamp(ST_M(ST_PointN(geom,1))),
    to_timestamp(ST_M(ST_PointN(geom,ST_NPoints(geom)))));

Depois disso, você pode acelerar as coisas verificando se a coluna indexada se sobrepõe a um determinado intervalo. Isso melhorará significativamente o tempo de consulta:
SELECT * FROM t
WHERE line_interval && tstzrange(
                        to_timestamp(1618138148), 
                        to_timestamp(1618388700));

Demonstração:db<>fiddle

Leitura adicional: