Name

ST_LineLocatePoint — ラインストリング上の、与えたポイントへの最短点を、2次元長に対する割合として0から1の区間で返します。

Synopsis

float8 ST_LineLocatePoint(geometry a_linestring, geometry a_point);

説明

ラインストリング上の、与えたポイントへの最短点を、2次元ラインストリングの総延長に対する割合として0から1の区間で返します。

返された位置は、ポイント(ST_LineInterpolatePoint)または、部分ラインストリング(ST_LineSubstring)の抽出に使用することができます。

この関数は、住所番号に近づくのに使えます (訳注: 道路方式の住居表示の場合)。

Availability: 1.1.0

Changed: 2.1.0 2.0.xまでではST_Line_Locate_Pointと呼んでいました。

-- ストリートに沿った、ストリート番号の点の、粗い探索です。
-- なお、foo全体は住居の重心と通りのように見えるダミーデータです。
-- ST_DWithInで対象とする通りから大きく外れる住居を除外しています。
SELECT ST_AsText(house_loc) As as_text_house_loc,
        startstreet_num +
                CAST( (endstreet_num - startstreet_num)
                        * ST_LineLocatePoint(street_line, house_loc) As integer) As street_num
FROM
(SELECT ST_GeomFromText('LINESTRING(1 2, 3 4)') As street_line,
        ST_MakePoint(x*1.01,y*1.03) As house_loc, 10 As startstreet_num,
                20 As endstreet_num
FROM generate_series(1,3) x CROSS JOIN generate_series(2,4) As y)
As foo
WHERE ST_DWithin(street_line, house_loc, 0.2);

 as_text_house_loc | street_num
-------------------+------------
 POINT(1.01 2.06)  |         10
 POINT(2.02 3.09)  |         15
 POINT(3.03 4.12)  |         20

 -- ポイントまたは他のジオメトリへのライン上の最短点の探索
 SELECT ST_AsText(ST_LineInterpolatePoint(foo.the_line, ST_LineLocatePoint(foo.the_line, ST_GeomFromText('POINT(4 3)'))))
FROM (SELECT ST_GeomFromText('LINESTRING(1 2, 4 5, 6 7)') As the_line) As foo;
   st_astext
----------------
 POINT(3 4)

関連情報

ST_DWithin, ST_Length2D, ST_LineInterpolatePoint, ST_LineSubstring