ポイントから特定の距離内にあるMySQLデータベースのすべてのポリゴンを取得する方法を知っている人はいますか? 実際の距離は、見つかったポリゴンごとに後で計算されるため、それほど重要ではありませんが、「近い」ポリゴンに対してその計算を行うだけで、非常に最適化されます。
私は MBR を見て、関数を含んでいますが、問題は、ポリゴンの一部が非常に大きいため、ポイントの周りに描かれたバウンディング ボックス内に含まれていないことですが、それらの頂点の一部はまだ近くにあります。
助言がありますか?
遅いバージョン (空間インデックスなし):
SELECT *
FROM mytable
WHERE MBRIntersects(mypolygon, LineString(Point(@X - @distance, @Y - @distance), Point(@X + @distance, @Y + @distance))
空間インデックスを利用するには、各ポリゴン頂点が独自のレコードに格納されるように、テーブルを非正規化する必要があります。
次にSPATIAL INDEX
、頂点の座標を含むフィールドに を作成し、次のクエリを発行します。
SELECT DISTINCT polygon_id
FROM vertices
WHERE MBRContains(vertex, LineString(Point(@X - @distance, @Y - @distance), Point(@X + @distance, @Y + @distance))
UTM
緯度と経度ではなく座標をデータベースに保存すると、作業がはるかに簡単になります。
これに対する答えは一つではないと思います。一般に、問題に固有の空間的局所性を利用できるようにデータを整理する方法の問題です。
私の頭に浮かんだ最初のアイデアは、グリッドを使用し、各ポイントを四角形に割り当て、ポイントが入っている四角形とその周囲の四角形をチェック選択することです。無限グリッドについて話している場合は、正方形のハッシュ値を使用します。これにより、必要以上に多くのポイントが得られますが (衝突がある場合)、それでも量が大幅に削減されます。もちろん、これはポリゴンにすぐに適用できるわけではなく、単なるブレインストーミングです。あまりにも多くの衝突を引き起こす可能性のあるアプローチは、ハッシュされたすべての値を一緒に OR し、その値と AND されたハッシュがゼロではないすべてのエントリを選択することです (これが MySQL で可能かどうかは不明です)。しかし、ビットの量。
このアプローチの問題は、極に近づくにつれてグリッドの「正方形」が狭くなるため、球座標 (緯度、経度は一般的にそうです) が特異点であると仮定すると、. これに対する簡単なアプローチは... 極の近くにポイントを置かないことです... :)
すべてのポリゴンの境界ボックスを作成し、(必要に応じてこれらの結果をデータベースに保存すると、複雑なポリゴンの場合にはるかに高速になります)。次に、各ポリゴンの境界ボックスを、目的のサイズでポイントを囲む境界ボックスと比較できます。交差するバウンディング ボックスを持つすべてのポリゴンを選択します。