名前

ST_Line_Substring — 2次元長に対する割合で示された開始位置と終了位置で切り取られた部分ラインストリングを返します。第2引数と第3引数は、float8で0から1の区間です。

概要

geometry ST_Line_Substring(geometry a_linestring, float startfraction, float endfraction);

説明

2次元長に対する割合で示された開始位置と終了位置で切り取られた部分ラインストリングを返します。第2引数と第3引数は、float8で0から1の区間です。この関数はLINESTRINGでのみ動作します。MULTILINESTRINGで使用するには、ST_LineMergeと併用します。

'start'と'end'が同じ値を持つ場合は、ST_Line_Interpolate_Pointと等価になります。

ポイントに最も近いライン位置の計算についてはST_Line_Locate_Pointを参照して下さい。

[注記]

1.1.1から、この関数はM軸やZ軸の内挿点も(存在するなら)計算するようになりました。それより前の版では不定値となります。

初出: 1.1.0, Z軸とM軸のサポートが1.1.1で追加されました。

この関数は3次元に対応しています。Zインデクスを削除しません。

1/3の真ん中(0.333, 0.666)のラインストリング

-- ラインストリングの概ね1/3の真ん中の線を返します
SELECT ST_AsText(ST_Line_SubString(ST_GeomFromText('LINESTRING(25 50, 100 125, 150 190)'), 0.333, 0.666));

										   st_astext
------------------------------------------------------------------------------------------------
LINESTRING(69.2846934853974 94.2846934853974,100 125,111.700356260683 140.210463138888)

--次に示す例では、PostgreSQLのgenerate_series()を
--使ったwhileループに似たことを行って、
--テーブル内の全てのラインストリングを100単位の
--区分にカットしています。
--単位はSRIDで決まります。
--全てのジオメトリがラインストリングまたは
--隣接するマルチラインストリングで、
--100単位*10000より長いジオメトリが無いと仮定します。
--パフォーマンスを良くするために、10000を減らして、
--期待する最大区分数にあわせることができます。

SELECT field1, field2, ST_Line_Substring(the_geom, 100.00*n/length,
  CASE
	WHEN 100.00*(n+1) < length THEN 100.00*(n+1)/length
	ELSE 1
  END) As the_geom
FROM
  (SELECT sometable.field1, sometable.field2,
  ST_LineMerge(sometable.the_geom) AS the_geom,
  ST_Length(sometable.the_geom) As length
  FROM sometable
  ) AS t
CROSS JOIN generate_series(0,10000) AS n
WHERE n*100.00/length < 1;
			

関連情報

ST_Length, ST_Line_Interpolate_Point, ST_LineMerge