特定のポイントにラインストリングの最も近いポイントを取得する方法は?


28

私はもう長い間PostGISを使用していますが、LINESTRINGジオメトリを使用する必要はありませんでした...!:)

私がやりたいことは次のとおりです:私は線ストリングのテーブル(特定の都市の道路を表すSRID 3395)があり、特定のポイント(GPS位置、SRID 4326)に最も近い線ストリングを見つけたいです。

私が見つけた解決策は、expand()メソッドを使用して私のポイント内のすべてのラインストリングを選択し、メソッドを使用して各ラインストリングと私のポイントの間の距離を決定するST_Distance()ことです。

SQLは次のとおりです。

SELECT myLineId, myLineName, ST_Distance(ST_Transform(GeomFromText('POINT(LON LAT)',4326),3395),myLineGeom) AS myLineDistance
FROM myLines
WHERE myLineGeom && expand(ST_Transform(GeomFromText('POINT(LON LAT)',4326),3395), 100)
ORDER BY myLineDistance;

結果は問題ないように見えますが、実装に何か問題があると感じています。

1)expand()関係するすべてのラインストリングを取得できると思いますか?

2)ST_Distance()使用するのに適切な方法だと思いますか?私が取得したい距離は、ポイントとライン間の最短距離であり、ポイントとラインストリングのポイントの1つとの間の距離ではないため、間違っていると思います。

図:

代替テキスト

回答:


11

ad 1)使用されている関数のドキュメントを見て、「はい、関係するすべてのラインストリングが見つかります。」と言います。

expand(geometry、float)

この関数は、2番目の引数で指定された量だけ、入力ジオメトリの境界ボックスから全方向に展開された境界ボックスを返します。クエリにインデックスフィルターを追加するためのdistance()クエリに非常に便利です。

A && B

「&&」演算子は「overlaps」演算子です。AのバウンディングボックスがBのバウンディングボックスに重なる場合、演算子はtrueを返します。

広告2)次の方法で目的を達成できるはずです。

line_interpolate_point(linestring, line_locate_point(LineString, Point))

line_interpolate_point(ラインストリング、場所)

線に沿ってポイントを補間します。最初の引数はLINESTRINGでなければなりません。2番目の引数は0〜1のfloat8で、ポイントを配置する必要がある合計2dの長さの端数を表します。

line_locate_point(LineString、Point)

指定されたPointに最も近いLineString上のポイントの位置を表す0〜1の浮動小数点数を、合計2dライン長の一部として返します。返された場所を使用して、ポイントを抽出できます(line_interpolate_point)

ソース:http : //main.merlin.com.ua/doc/postgis/docs/ch06.html


ポイント2)については、POINTジオメトリとLINESTRINGジオメトリの間のST_Distanceがこれらの間の最短距離(ポイントとLINGESTRING間の垂直線の長さ)を与えるかどうか疑問に思っていました。すべてのLINESTRINGジオメトリからの距離が必要です:)
Vivi

「line_locate_point関数は、指定されたポイントに最も近いLineString上のポイントの位置を表す0から1の間の値を与える」ため、探している距離ではないと思います:/
Vivi

あなたの最後のコメントで私を失ったのではないかと思います。今、私はあなたが何を望むのかもう
わかり

1
申し訳ありません:)私はこれが欲しいです:LINESTRINGジオメトリ(パスを表す)とPOINTジオメトリを与え、パス上にある最も近いPOINTジオメトリ(LINESTRINGジオメトリ定義のポイントではないかもしれません)を持ちたいです。明確ですか?たぶん私は図面で私の投稿を更新する必要があります:D-
ヴィヴィ

投稿を更新できないため、取得したいものの図面へのリンクを次に示し
Vivi

7

ハロー

まず、ST_Distanceが返すものに関する質問。ST_Distanceは、ラインとポイント間の最短距離(または入力されたジオメトリタイプ)を返します。つまり、ポイント(1 3)とラインストリング(0 0,0 10)間のST_Distanceは1を返します。ポイントと(0 0)またはポイントと(0 10)、ただしポイント(1 3)から(0 3)まで。

私が理解していることから、ST_Distanceはあなたが望む答えを与えてくれます。

上記の例でポイント(0 3)を検索する場合、PostGIS 1.5がある場合はST_Closestpointを使用できます。私の例では、ST_Closestpoint( 'LINESTRING(0 0,0 10)' :: geometry、 ' POINT(1 3) ':: geometry)次に、ポイント(0 3)を取得する必要があります。これは、ポイントに最も近いライン上のポイントです。

HTHニクラス


5

私はそれを見つけました:)(まあ私は推測する:P)

使用するST_Line_Locate_Point()ST_Line_Interpolate_point()、私はLINESTRING定義の一部ではなく、ライン:)すべて私がしなければならないと述べた上にあるポイントを得るために管理することは、この時点までの私の点からの距離を取得することであると私は終わりです。

SELECT AsText(ST_Line_Interpolate_Point(myLineGeom,ST_Line_Locate_Point(myLineGeom,ST_Transform(GeomFromText('POINT(LON LAT)',4326),3395))))
FROM myLines
WHERE myGeom && expand(ST_Transform(GeomFromText('POINT(LON LAT)',4326),3395), 100)

このST_Line_Locate_Point()メソッドは、指定されたポイントにライン上で最も近いポイントの位置を見つけ、ST_Line_Interpolate_Pointこの位置をポイントに変換します。


1
ポイントと線の間のSt_distanceは同じ答えを与えます。どうしてこのようにしなければならないと思いますか?
ニックラスアベン

1
ST_Distanceはどのジオメトリタイプでも使用できると思います。postgis.refractions.net/docs/ST_Distance.htmlST_Distance(geometry g1, geometry g2)
マグノC

2

このPostgisアーカイブスレッドは、http: //postgis.refractions.net/pipermail/postgis-users/2007-June/016045.htmlに回答できます


reflections.netが機能しません:「refractions.netは2010年9月14日に期限切れになり、更新または削除が保留されています。」
暗闇

@underdarkそれは私のために働く
-dassouki

@dassouki:それは奇妙だ:|
暗闇

@ underdarkreflections.netが再び機能する
ThomasG77
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.