ST_LineLocatePoint — ポイントに最も近いライン上のポイントの位置を割合で返します。
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_Point(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)