mysqlで長いポリゴンを緯度に近づけます
質問
ポイントから特定の距離内でMySQL DBですべてのポリゴンをフェッチする方法を知っている人はいますか?実際の距離は、後で発見された各ポリゴンについて計算されるため、それほど重要ではありませんが、「近い」ポリゴンの計算を行うことは大きな最適化になります。
私は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
緯度や経度ではなく、データベースで調整します。
他のヒント
これには単一の答えがあるとは思わない。一般的に、問題に固有の空間的局所性を利用できるように、データを整理する方法の問題です。
私の頭に飛び込む最初のアイデアは、グリッドを使用し、各ポイントを正方形に割り当て、ポイントが入っている正方形とその周りの人々を選択することです。無限のグリッドについて話している場合は、正方形のハッシュ値を使用すると、必要以上のポイント(衝突がある場合)が得られますが、それでも量を削減します。もちろん、これはポリゴンにすぐには適用できません。ただのブレーンストーミングです。衝突が多すぎる可能性のあるアプローチは、またはすべてのハッシュ値を一緒にハッシュし、その値でハッシュアンドヘッドがゼロでない場合(これがMySQLで可能かどうかはわかりません)、大規模なものを使用することをお勧めします。ただし、ビットの量。
このアプローチの問題は、グリッドの「正方形」が極に近づくと狭くなるため、球状の座標(lat、長い間は一般的にはそうです)を話していると仮定することです。これへの簡単なアプローチは...極の近くにポイントを置かないでください... :)
すべてのポリゴンの境界ボックスを作成します(オプションでこれらの結果をデータベースに保存すると、複雑なポリゴンでこれがはるかに高速になります)。次に、各ポリゴンの境界ボックスを、目的のサイズのポイントのラウンドと比較できます。境界ボックスが交差するすべてのポリゴンを選択します。