21

アプリケーションはどのように近接検索を実行しますか? たとえば、ユーザーが郵便番号を入力すると、アプリケーションは 20 マイル以内にあるすべてのビジネスを近さ順にリストします。

そのようなものを PHP と MySQL で構築したいと考えています。このアプローチは正しいですか?

  1. 興味のある場所の住所を取得し、データベースに保存する
  2. Google のジオコーディング サービスを使用してすべての住所をジオコーディングする
  3. 近接検索と順序付けを行うための Haversine 式を含むデータベース クエリを記述します。

これでよろしいですか?ステップ 3 では、すべてのクエリの近接度を計算します。すべてのビジネスといくつかの参照場所の間の距離をリストする PROXIMITY テーブルを用意したほうがよいでしょうか?

4

3 に答える 3

13

速度が重要なほど十分な数のレコードがある場合は、事前にインデックスを作成する方法があります。

一辺約 20 マイルのビンのグリッドを定義します。各店舗のレコードでビン番号を保存します。検索時に、検索ポイントから半径 20 マイルと交差するすべてのビンの数を計算します。次に、それらのビンのいずれかですべてのストアを取得し、前と同じように続行します。

于 2008-11-03T23:38:23.043 に答える
13

これを使用して、何千ものポイントを実行します。これを SQL で実行する場合、緯度と経度の列にインデックスを作成することが重要です。空間インデックスを使用して SQL 2008 でこれを実行しようとしましたが、期待したほどのパフォーマンスの向上は見られませんでした。ただし、郵便番号から特定の距離内で計算したい場合は、郵便番号の重心またはポリゴン表現を使用するかどうかを考慮する必要があります。

Haversine forumlaは、開始するのに適した場所です。

その場で距離を計算するパフォーマンスの問題はありませんでした。ポイントが事前にわかっていて、何百万ものレコードが存在するいくつかのアプリケーションでは、事前に距離を計算しています。

SELECT
        [DistanceRadius]=
        69.09 *
        DEGREES(
          ACOS(
            SIN( RADIANS(latitude) )*SIN( RADIANS(@ziplat) ) 
           +
            COS( RADIANS(latitude) )*COS( RADIANS(@ziplat) ) 
           *
            COS( RADIANS(longitude - (@ziplon)) )
          )
        )
        ,*
        FROM
            table

    ) sub
WHERE
    sub.DistanceRadius < @radius
于 2008-11-04T00:18:12.573 に答える
2

これを約 1200 か所で行います。アプリケーションによっては、SQL ではなく PHP に格納する方がよい場合もありますが、その場で Haversine 式を使用します。(私たちの実装は .net にあるため、マイレージは異なる場合があります)。

私たちが実装した方法の最大の欠点は、(最近まで) すべての計算をデータ層で計算する必要があったことです。 ) ですが、これは、指定された郵便番号に基づいて 1200 か所すべての場所の距離を計算する必要があったためです。

選択したルートによっては、経度と緯度を確認し、定義済みの範囲外のものを削除することで、距離の計算を高速化する方法があります (たとえば、20 マイル以内のすべての住所を確認している場合、経度範囲を計算すると、20 マイル離れた場所にあるすべての住所を計算できます)。これにより、必要に応じてクエリを高速化できます。

実際に、考えられるすべての組み合わせをデータベースに保存することを検討しました。実際には、大規模なデータ ストアになる可能性があるように思えますが、実際には大規模な範囲ではありません。インデックスを使用すると、非常に高速になり、アルゴリズムの最適化などを心配する必要がなくなります。C# に方程式があり、すべての計算を実行するために必要な情報をビジネス層。どちらでも問題なく動作します。好みの問題です。

于 2008-11-04T00:03:28.720 に答える