Name

ST_3DClosestPoint — g1上の、g2に最も近い3次元ポイントを返します。これは3次元の最短ラインの始点です。

Synopsis

geometry ST_3DClosestPoint(geometry g1, geometry g2);

説明

g1上の、g2に最も近い3次元ポイントを返します。3次元最短線の一つ目のポイントです。3次元最短線の長さは、3次元距離と同じです。

この関数は3次元に対応し、Z値を削除しません。

この関数は多面体サーフェスに対応しています。

Availability: 2.0.0

Changed: 2.2.0 - 二つの2次元ジオメトリが入力である場合には、2次元ポイントが返ります (古い挙動では、存在しないZの値について0を仮定していました)。2次元と3次元の場合には、もはや、存在しないZの値について0を仮定しません。

ラインストリングとポイント -- 3次元と2次元の両方の最も近いポイント

SELECT ST_AsEWKT(ST_3DClosestPoint(line,pt)) AS cp3d_line_pt,
                ST_AsEWKT(ST_ClosestPoint(line,pt)) As cp2d_line_pt
        FROM (SELECT 'POINT(100 100 30)'::geometry As pt,
                        'LINESTRING (20 80 20, 98 190 1, 110 180 3, 50 75 1000)'::geometry As line
                ) As foo;

cp3d_line_pt                                                |               cp2d_line_pt
-----------------------------------------------------------+------------------------------------------
POINT(54.69937988676193 128.93502291722837 11.547586950660556) | POINT(73.07692307692307 115.38461538461539)

ラインストリングとマルチポイント -- 3次元と2次元の両方の最も近いポイント

SELECT ST_AsEWKT(ST_3DClosestPoint(line,pt)) AS cp3d_line_pt,
                ST_AsEWKT(ST_ClosestPoint(line,pt)) As cp2d_line_pt
        FROM (SELECT 'MULTIPOINT(100 100 30, 50 74 1000)'::geometry As pt,
                        'LINESTRING (20 80 20, 98 190 1, 110 180 3, 50 75 900)'::geometry As line
                ) As foo;

cp3d_line_pt                        | cp2d_line_pt
-----------------------------------------------------------+--------------
POINT(54.69937988676193 128.93502291722837 11.547586950660556) | POINT(50 75)

マルチラインストリングとポリゴン -- 3次元と2次元の両方の最も近いポイント

SELECT ST_AsEWKT(ST_3DClosestPoint(poly, mline)) As cp3d,
    ST_AsEWKT(ST_ClosestPoint(poly, mline)) As cp2d
        FROM (SELECT  ST_GeomFromEWKT('POLYGON((175 150 5, 20 40 5, 35 45 5, 50 60 5, 100 100 5, 175 150 5))') As poly,
                ST_GeomFromEWKT('MULTILINESTRING((175 155 2, 20 40 20, 50 60 -2, 125 100 1, 175 155 1),
                (1 10 2, 5 20 1))') As mline ) As foo;

cp3d                    |     cp2d
-------------------------------------------+--------------
POINT(40.45454545454545 53.63636363636364 5) | POINT(20 40)