Jak dodać wierzchołki do istniejących linii?

10

Jeżeli mam

Linestring(1 2, 1 5, 1 9)

i a

Point(1 3)

Czy jest jakaś funkcja, która może scalać znakowanie linii i wskazywać zachowanie kolejności, więc wynik będzie:

Linestring(1 2, 1 3, 1 5, 1 9)
BorisT
źródło
Więc dodasz wierzchołki do istniejących linii?
RK
tak, dodaj wierzchołek do istniejącego oznaczenia linii, co spowoduje utworzenie oznaczenia linii.
BorisT
Dlaczego musisz to zrobić btw?
RK

Odpowiedzi:

8

Jeśli LineString ma być po prostu podzielony na pozycję najbliższą danemu punktowi, możesz zrobić z tym, co chcesz (dzieli LineString na najbliższy punkt od danego punktu i ponownie łączy dwa segmenty)

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;

Jednak jeśli twój punkt nie ma być rzutowany na LineString, to nie zadziała.

chriserik
źródło
2

PostGIS ma ST_AddPoint, który powinien ci na to pozwolić, choć musisz określić, gdzie dodać punkt.

ST_AddPoint - Dodaje punkt do LineString przed punktem (indeks oparty na 0).

Przykłady:

--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
źródło
tak, wiem o tej funkcji, ale nie wiem, gdzie powinienem położyć nowy punkt.
BorisT