0

ユーザーが私のサイトにサインアップし、郵便番号を入力します。他のユーザーを照会し、距離で並べ替えたい。

各郵便番号の緯度/経度ポイントを含む郵便番号でいっぱいのデータベースがあります。

zip_code (char)
lat (float)
lon (float)

緯度/経度の 2 つのセット間の距離を計算する方法がありますが、データベース内の他のすべての郵便番号でこれを実行するにはコストがかかります。すべての郵便番号の組み合わせでこれを実行する必要があります。一度作ってどこかに保管できると思いますが、どこに保管しますか?他のすべての郵便番号までの距離を含むすべての郵便番号のテーブルを用意するのは奇妙に思えます。これを行うためのきれいな方法はありますか?

4

2 に答える 2

0

これは、かなりのオーバーヘッドを伴うソリューションですが、データセットのサイズ、ユーザー ベース、および/またはトランザクション数が増加するにつれて効果があります。

まだ持っていない場合は、空間タイプと空間インデックスをサポートするデータベースを使用してください。PostGres のPostGIS拡張機能をお勧めしますが、これらの手順のほとんどは、他の空間対応データベースに適用されます。

  1. 緯度と経度の 2 つの列ではなく、ポイント ジオメトリ タイプとして郵便番号の場所を保存します。
  2. ポイント ジオメトリ列に対して空間インデックスを作成します。新しい郵便番号を追加するたびに、その場所が空間インデックスに自動的に追加されます。
  3. 何千マイルも離れた「最も近い」隣人を表示したくない場合は、Within 関数 ( PostGIS ではST_DWithin ) を使用して、遠すぎる郵便番号を除外します。これにより、近接する近隣の検索スペースが大幅に削減されます。
  4. 最後に、Distance 関数 ( PostGIS ではST_Distance ) を使用して、対象の郵便番号とその近くの郵便番号との間の距離を計算し、DB を使用して距離でソートされた結果を返します。

空間インデックスを持つデータベースと、そのインデックスを使用するフィルター機能を使用すると、検索を大幅に高速化できます。さらに空間分析を行ったり、マップを表示したりするときは、その新しい機能をサポートするためのフレームワークが既に用意されています。

于 2013-07-08T17:28:01.823 に答える