Obter todos os nós de uma lista de LineStrings adjacentes no PostGIS

8

Eu uso PostGis e pgRouting. Eu tenho uma tabela com geometrias das bordas adjacentes retornadas por uma consulta de caminho mais curto. Quero concatenar essas arestas e recuperar uma lista de todos os nós em que essas arestas são compostas. Como faço isso no SQL?

Eu acho que a solução seria uma mistura de LineMerge e GeomUnion, mas existe uma maneira inteligente de fazer isso?

Obrigado.

hokkos
fonte
ST_LineMerge não fará o trabalho. ST_LineMerge - Retorna um (conjunto de) LineString (s) formado pela costura de uma MULTILINESTRING. O PGRouting envia de volta uma lista de cadeias de linhas. Talvez o GemUnion seja a chave. Vou verificar se puder.
Fabien Ancelin

Respostas:

4

Ok, então eu mesmo fiz essa função sql:

CREATE OR REPLACE FUNCTION adjacent_linestring_array_to_set_of_points(array_geom geometry[])
   RETURNS SETOF geometry AS
$$
DECLARE
    accu_line geometry;
    temp_line geometry;
BEGIN

FOR temp_line in select * from unnest(array_geom) LOOP
    IF accu_line is NULL THEN
        accu_line := temp_line;
    END IF;
    accu_line := linemerge(GeomUnion(accu_line, temp_line));
END LOOP;

RETURN QUERY SELECT ST_PointN(accu_line, generate_series(1, ST_NPoints(accu_line)));
END;
$$

LANGUAGE 'plpgsql' VOLATILE STRICT;
hokkos
fonte