既存のラインストリングに頂点を追加する方法は?


10

私が持っている場合

Linestring(1 2, 1 5, 1 9)

Point(1 3)

出力が次のようになるように、折れ線とポイントを保持して順序を維持できる関数はありますか?

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

では、既存のラインに頂点を追加するだけですか?
RK

はい、既存の折れ線に頂点を追加すると、折れ線になります。
BorisT

なぜそれをやる必要があるのですか?
RK

回答:


8

LineStringが特定のポイントに最も近い位置で単に分割される場合、これを使用して必要な操作を実行できます(特定のポイントに最も近いポイントでLineStringを分割し、その後2つのセグメントを再マージします)。

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 —ポイントの前のラインストリングにポイントを追加します(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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.