Як додати вершини до існуючих рядків?


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.