Làm thế nào để thêm đỉnh vào linestrings hiện có?


10

Nếu tôi có

Linestring(1 2, 1 5, 1 9)

và một

Point(1 3)

Có bất kỳ chức năng nào có thể hợp nhất linestring và điểm duy trì trật tự để đầu ra sẽ là:

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

Vì vậy, bạn sẽ chỉ thêm các đỉnh vào các dòng hiện có?
RK

có, thêm đỉnh vào linestring hiện có, dẫn đến linestring.
BorisT

Tại sao bạn cần phải làm điều đó btw?
RK

Câu trả lời:


8

Nếu LineString chỉ đơn giản là được chia nhỏ tại một vị trí gần Điểm nhất định, bạn có thể làm những gì bạn muốn với điều này (tách LineString tại Điểm gần nhất cho Điểm đã cho và kết hợp lại hai phần sau đó)

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;

Tuy nhiên, nếu Điểm của bạn không được dự kiến ​​trên LineString, điều này sẽ không hoạt động.


2

PostGIS có ST_AddPoint sẽ cho phép bạn làm điều này mặc dù bạn phải chỉ định nơi để thêm điểm.

ST_AddPoint - Thêm một điểm vào LineString trước điểm (chỉ mục dựa trên 0).

Ví dụ:

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

Vâng, tôi biết chức năng này nhưng tôi không biết nên đặt điểm mới của mình vào đâu.
BorisT
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.