2017-01-12 12 views
1

私は2つのテーブルを持っています: ポイントがあるテーブルが1つ、 ポリゴンが1つのテーブル。MySQL:各点に最も近いポリゴンを見つけよう

私は各点に最も近いポリゴンを結合するクエリを探しています。

points表は次のようになります。

|-id-|-name-|-location---| 
|====|======|============| 
|-1--|-A----|-POINT(1 0)-| 
|-2--|-B----|-POINT(3 4)-| 
|-3--|-C----|-POINT(2 9)-| 
|-4--|-D----|-POINT(6 2)-| 

polygons表は次のようになります。

|-id-|-name-|-area---------------------| 
|====|======|==========================| 
|-1--|-A----|-POLYGON(1 0,3 4,2 9,1 0)-| 
|-2--|-B----|-POLYGON(3 4,2 9,6 2,3 4)-| 
|-3--|-C----|-POLYGON(2 9,6 2,1 0,2 9)-| 
|-4--|-D----|-POLYGON(6 2,1 0,3 4,6 2)-| 

このクエリの好ましい出力はこのようなものになるだろう:(ダミーデータ)

|-id-|-name-|-location---|-id-|-name-|-area---------------------| 
|====|======|============|====|======|==========================| 
|-1--|-A----|-POINT(1 0)-|-2--|-B----|-POLYGON(3 4,2 9,6 2,3 4)-| 
|-2--|-B----|-POINT(3 4)-|-3--|-C----|-POLYGON(2 9,6 2,1 0,2 9)-| 
|-3--|-C----|-POINT(2 9)-|-2--|-B----|-POLYGON(3 4,2 9,6 2,3 4)-| 
|-4--|-D----|-POINT(6 2)-|-1--|-A----|-POLYGON(1 0,3 4,2 9,1 0)-| 

( 、代わりのみの最寄りの

SELECT *, ST_DISTANCE(points.point, polygons.polygon) FROM points INNER JOIN polygons 

しかし、それはすべてのポリゴンの距離を返します:EDITは:https://gist.github.com/badeend/dfdf826a1afbeeac5866be286a9bd30e)私は次のクエリを試してみました

:単純にこのスキーマを作成するには、次の.SQLを実行します。

+0

「SHOW CREATE TABLE [your_table]」の出力といくつかのサンプルデータを提供してください。http://www.sqlfiddle.com –

+0

@RaymondNijland例データとともに.sqlを追加しました。バイナリデータが大きすぎるため、sqlfiddle.comは自分のSQLを受け入れません。 – dbntsq

答えて

0

簡単な方法は、使用がでordereあると

SELECT *, ST_DISTANCE(points.point, polygons.polygon) 
FROM points INNER JOIN polygons 
order by ST_DISTANCE(points.point, polygons.polygon) asc limit 1 

を制限していますが分(のようにも集計機能を使用することができます)

また、明示的な条件fornを割り当てる必要があるなどを使用して参加:ポイントに.col = polygons.col

+0

これは1ポイントあたりのST_DISTANCEの最小値を返しません。 また、GROUP BYとMIN _will_を使用すると、最小距離が返されますが、関連付けられているポリゴン行は返されません。 – dbntsq

+0

最小単位はascで返されます(descではありません)。minを使用する場合は、列を直接取得することはできませんが、一致する行を選択することはできません。 – scaisEdge

関連する問題