Bagaimana cara menambahkan simpul ke linestrings yang ada?

10

Jika saya punya

Linestring(1 2, 1 5, 1 9)

dan a

Point(1 3)

Apakah ada fungsi apa pun yang dapat menggabungkan linestring dan point mempertahankan pesanan sehingga output akan menjadi:

Linestring(1 2, 1 3, 1 5, 1 9)
Boris
sumber
Jadi, Anda hanya akan menambahkan simpul ke baris yang ada?
RK
ya, tambahkan vertice ke linestring yang ada, menghasilkan linestring.
BorisT
Mengapa Anda perlu melakukannya dengan baik?
RK

Jawaban:

8

Jika LineString hanya akan dibagi lagi pada posisi terdekat dengan Point yang diberikan, Anda dapat melakukan apa yang Anda inginkan dengan ini (membagi LineString pada Point terdekat ke Point yang diberikan dan mem-remergasi dua segmen setelahnya)

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;

Namun, jika Poin Anda tidak seharusnya diproyeksikan di LineString, ini tidak akan berfungsi.

chriserik
sumber
2

PostGIS memiliki ST_AddPoint yang memungkinkan Anda melakukan ini meskipun Anda harus menentukan di mana menambahkan titik.

ST_AddPoint - Menambahkan titik ke LineString sebelum titik (indeks berbasis 0).

Contoh:

--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
sumber
ya, saya tahu untuk fungsi ini tetapi saya tidak tahu di mana saya harus meletakkan poin baru saya.
BorisT