Como adicionar vértices a cadeias de linhas existentes?

10

Se eu tiver

Linestring(1 2, 1 5, 1 9)

e um

Point(1 3)

Existe alguma função que possa mesclar cadeia de linhas e apontar preservando a ordem para que a saída seja:

Linestring(1 2, 1 3, 1 5, 1 9)
BorisT
fonte
Então, você adicionará vértices às linhas existentes?
RK
sim, adicione vértice à cadeia de linhas existente, resultando em uma cadeia de linhas.
precisa saber é o seguinte
Por que você precisa fazer isso?
RK

Respostas:

8

Se o LineString for simplesmente subdividido em uma posição mais próxima do ponto especificado, você poderá fazer o que quiser com isso (divida o LineString no ponto mais próximo do ponto especificado e repare os dois segmentos posteriormente)

SELECT ST_AsText(
         ST_LineMerge(
           ST_Union(
             ST_Line_Substring(line, 0, ST_Line_Locate_Point(line, point)),
             ST_Line_Substring(line, ST_Line_Locate_Point(line, point), 1)
       )))
FROM  ST_GeomFromText('Linestring(1 2, 1 5, 1 9)') as line, 
      ST_GeomFromText('Point(1 3)') as point;

No entanto, se o seu ponto não deve ser projetado no LineString, isso não funcionará.

chriserik
fonte
2

O PostGIS possui ST_AddPoint que deve permitir isso, embora você precise especificar onde adicionar o ponto.

ST_AddPoint - Adiciona um ponto a um LineString antes do ponto (índice baseado em 0).

Exemplos:

--guarantee all linestrings in a table are closed
        --by adding the start point of each linestring to the end of the line string
        --only for those that are not closed
        UPDATE sometable
        SET the_geom = ST_AddPoint(the_geom, ST_StartPoint(the_geom))
        FROM sometable
        WHERE ST_IsClosed(the_geom) = false;

        --Adding point to a 2-d line
        SELECT ST_AsEWKT(ST_AddPoint(ST_GeomFromEWKT('LINESTRING(1 2, 1 5, 1 9)'), ST_MakePoint(1, 3), 1));

        --result
        st_asewkt
        ----------
        LINESTRING(1 2, 1 3, 1 5, 1 9)
RK
fonte
Sim, eu conheço essa função, mas não sei onde devo colocar meu novo argumento.
precisa saber é o seguinte