sql >> データベース >  >> NoSQL >> MongoDB

距離でソートされたmongodbのLineStringの近くのポイントを検索します

    おっしゃるように、Mongoは現在Point以外のものをサポートしていません 。ルートボクサーのコンセプトに出くわしたことがありますか? 1 > それは数年前にグーグルマップで非常に人気がありました。描いた線を前提として、dist(x)内にある停車地を見つけます 。これは、ラインの各ポイントの周りに一連のバウンディングボックスを作成し、バケット内にあるポイントを検索することによって行われました。

    Mongoはポイントでしか機能しないことに気付いた後、あなたの質問に出くわしました。これは私が推測する合理的なことです。

    私はすでにそれを行う方法のいくつかのオプションを持っています(それらは@mnemosynがコメントで言っていることを拡張します)。私が取り組んでいるデータセットでは、すべてクライアント側にあるため、ルートボクサーを使用できますが、パフォーマンス上の理由からサーバー側に実装したいと思います。これが私の提案です:

    1. LineStringを壊す 個々の座標セットに移動し、$nearをクエリします それらのそれぞれを使用して、結果を組み合わせ、一意のセットを抽出します。ポイントの数を減らすことによって複雑な線を単純化するためのアルゴリズムがありますが、単純なものは簡単に記述できます。

    2. 上記と同じように実行しますが、ストアドプロシージャ/関数として実行します。私はMongoの保存された関数をいじったことがなく、それらがドライバーでどれほどうまく機能するかはわかりませんが、ラウンドトリップを行う必要がないため、上記の最初のオプションよりも高速である可能性があります。 Mongoのインスタンスがホストされている場合、計算はマイクロ秒速くなる可能性があります。

    3. サーバー側でルートボクサーアプローチを実装し(PHPで実行済み)、上記の2つのいずれかを使用して、$withinの停車地を見つけます。 結果のバウンディングボックス。 routeboxerメソッドは長方形を返すため、これらすべての長方形をルートをカバーする1つのポリゴンにマージし、$withinを実行するだけで済みます。 その上で。 (@mnemosynが提案したこと)

    4. 編集: 私はこれを考えましたが、それを忘れましたが、集約フレームワークを使用して上記のいくつかを達成できる可能性があります。

    これは私が間もなく(うまくいけば)取り組む予定のことです。結果に基づいて結果をオープンソース化します。

    編集: ただし、1と2には、2 km離れたラインに2つのポイントがあり、ラインから1.8 km以内にポイントが必要な場合、その部分の間のすべてのポイントを見逃してしまうという欠点があります。あなたのラインの。解決策は、ラインを単純化するときにポイントをラインに注入することです(新しいポイントを追加するときにポイントを減らすという目的を上回ります)。

    3の欠点は、ポリゴン内の一部のポイントの距離が制限よりも大きい可能性があるため、常に正確であるとは限らないことです。ただし、その差は制限の重要なパーセンテージにはなりません。

    [ 1 ] google maps utils routeboxer >



    1. クエリが一致した後に更新を実行するには、mongodbで集計を使用します

    2. Redis統計

    3. 推奨事項を支援するMongoDB

    4. Pymongoカーソル反復の代替