Как добавить вершины к существующим строкам линии?


10

Если у меня есть

Linestring(1 2, 1 5, 1 9)

и

Point(1 3)

Есть ли какая-нибудь функция, которая может объединить линейную строку и точку, сохраняя порядок, чтобы результат был:

Linestring(1 2, 1 3, 1 5, 1 9)

То есть вы будете просто добавлять вершины к существующим линиям?
РК

да, добавить вершины к существующей строке, в результате чего получится строка.
BorisT

Зачем тебе это делать?
РК

Ответы:


8

Если LineString просто нужно разделить в позиции, ближайшей к данной точке, вы можете делать с ней все, что хотите (разбивает LineString в ближайшей точке к данной точке и впоследствии объединяет два сегмента)

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;

Однако, если ваша точка не должна проецироваться на LineString, это не сработает.


2

PostGIS имеет ST_AddPoint, который должен позволять вам делать это, хотя вам нужно будет указать, куда добавить точку.

ST_AddPoint - добавляет точку в строку LineString перед точкой (индекс на основе 0).

Примеры:

--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)

да, я знаю, для этой функции, но я не знаю, где я должен поставить свою новую точку.
BorisT
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.