ユーザーが通勤ルートをデータベースに保存するアプリケーションがあります。
ルートはポリライン (折れ線) として保存されます。データベースにはインシデント、交通事故なども保存されています。定期的にルートを照会して、ルートの半径 1k 以内にインシデントがあるかどうかを確認する必要があります。
クエリの結合は次のように構成されています。
Route r left outer join Incident i on
r.PolyLine.STDistance(i.Location) < 1000
今、私も次のようなことを試しました:
Route r left outer join Incident i on
r.PolyLine.STBuffer(1000).STIntersects(i.Location) = 1
速度を改善するためにこれまでに試みたことは次のとおりです。
- ラインストリングに沿ってポイントの数を減らします
- 空間インデックスを追加します (ただし、微調整する方法はわかりません)
1) 上記はうまくいきましたが、十分ではなく、インシデントがルートに沿ったすべてのポイントと比較されていて、本当に効率が悪いと思われます。
バウンディング ボックスにアクセスし、STContains を取得するために、長い緯度を幾何学と地理学として強く検討しています。
インシデントをチェックする前に、PolyLine で reduce を呼び出すことも検討してください。