2016-02-07 20 views
5

私は郵便番号に基づいて商品を検索するアプリケーションを持っています。郵便番号による商品検索| Haversineアルゴリズム|パフォーマンス

郵便番号を検索すると、その都道府県/市区町村のすべての商品が返されます(郵便番号の解析によって行われます)。

これで、元の郵便番号からの距離に基づいてこれらの商品を並べ替える必要があります。

DBにLat/Longが格納されており、Haversineの式を使用して元のクエリからのapprx距離を計算する予定です。

私の質問は、これをどこで計算するかです。 データセットを返す前に、ストアドプロシージャでこれを行う必要がありますか?

また、緯度/経度でデータセットを返し、ユーザーに返す前にサーバー側を計算する必要があります。

計算結果を最大1000件まで実行する必要があります。

+0

DBMSとは何ですか? – jdphenix

+0

Sql Server MS。 – Mark

+1

私はこのトピック(私はPostGISとvincentyを使って空間クエリを扱ってきました)から専門家ではありませんが、おそらくデータベースで、 'STDistance()'でlat/lonデータと順序に空間インデックスを付けることができます。距離でソートする必要があります。データベースの外にあるものはどれもうまくいくかもしれませんが、あなたはホイールを再発明しています。 – jdphenix

答えて

3

通常、DBサーバーはCPUバインディングではなくIOバインドです。 YMMVですが、あなたのケースが典型的な場合は、Haversine計算をDBサーバーで実行することが望ましいでしょう。

あなたはおそらくのような対数スケール上のおおよその距離を提供することができますように私は、あなたのアークサイン計算にカスタマイズされたルックアップテーブルを使用することをお勧めします:

  • 100メートル、
  • 300メートル、
  • 1キロを、
  • 3キロ、
  • 10キロ、
  • 30キロ、
  • > 30km

    そして、線形補間を精細化として使用します。典型的な距離のために

あなたではなく、より正確な計算よりもthe Taylor expansion for sin and cosのちょうど2または3用語を使用して検討するかもしれない、単一首都圏で発生しました:

  • 罪(x)は=〜X - X^3/6 + X^120分の5
  • COS(X)=〜1 - X^2/2 + X^4月24日

もその収束テイラー級数のためのリコール、エラー後n番目の項は厳密に(n + 1)番目の項の大きさ。これにより、地球が一様球でないために一般的にHaversineの公式がわずか0.5%であるため、所望の精度が達成されれば効率的に計算を終了することができます。

1

SQL Server 2008以上のバージョンを使用していますか?その場合は、Haversine計算を直接行うのではなく、組み込み地理データ型を使用することをお勧めします。郵便番号の表(たとえば90210)と、郵便番号の中心点または郵便番号で囲まれた領域全体を別の列に(またはその両方が用途に合っている場合は)両方持つことができます。次に、STDistance()関数を使用して距離を計算することができます。また、空間索引付けを使用すると、あまりにも多くの労力をかけずに距離でランク付けしたリストを取得できます。