9

現在、ほとんどのレストランやその他の企業のウェブサイトには、特定の住所/郵便番号に最も近い場所を一覧表示する「場所の検索」機能があります。これはどのように実装されていますか?zipcode を DB と照合するのは簡単な方法ですが、常にうまくいくとは限りません。たとえば、特定の場所により近いブランチがあっても、別の zip にある可能性があります。私の頭に浮かぶ 1 つのアプローチは、指定された郵便番号/住所をマップ座標に変換し、事前定義された半径に該当するブランチを一覧表示することです。これがどのように実装されたかについてのご意見をお待ちしております。可能であれば、使用されている Web サービスなど、より詳細な実装の詳細を提供してください。

4

8 に答える 8

7

多くの地理空間フレームワークがこれに役立ちます。地理空間の世界では、郵便番号は単なる「多角形」です。これは、明確な境界を定義する地図上の領域です (数学的な意味での多角形ではありません)。たとえば、SQL 2008 空間では、元のポリゴンに基づいて新しいポリゴンを作成できます。したがって、すべてのポイントで特定の距離だけ延長された郵便番号であるポリゴンを動的に作成できます。郵便番号のファンキーな形状が考慮されています。住所を使用すると、1 つのポイントを囲む円であるポリゴンを作成するだけなので簡単です。その後、クエリを実行して、いずれかの方法で作成した新しいポリゴン内のすべてのポイントを取得できます。

これらのサイトの多くは、基本的にこれを行っているだけです。それらは、5 マイルの拡張ポリゴン内のすべてのポイントを提供し、次に 10 マイルの拡張ポリゴンなどを提供します。彼らは実際に距離を計算していません。Web 上のほとんどの ma はまったく洗練されていません。

ここでいくつかの基本的な例を見て、私が話していることの一般的なアイデアを得ることができます。

于 2008-12-01T00:14:27.183 に答える
4

標準の zipode/ロケーション データベースが利用可能です。これは、郵便番号の緯度/経度およびその他の情報を含むAccess 形式の 1 つのバージョンです。次に、PostgreSQL GIS 拡張機能を使用して、たとえば場所の検索を行うことができます。

(もちろん、アクセス データベースを抽出し、PostgreSQL などのより使いやすいデータベースに挿入すると仮定します)

于 2008-12-01T00:02:24.713 に答える
1

まず、住所をジオコーディングして、(通常は) 緯度と経度に変換します。次に、関心のあるポイントについて、データベースで最近隣クエリを実行します。

ほとんどの空間インデックスは最近傍クエリを直接サポートしていないため、ここでの通常のアプローチは、ジオコーディングされたポイントを中心にして妥当なサイズの境界ボックスに対してクエリを実行し、メモリ内の結果を並べ替えて最も近いものを選択することです。

于 2008-12-01T10:17:44.363 に答える
0

ポイント、ライン、および/または領域データに対するより低いO(...)の最も近い位置クエリをサポートする実際の幾何学的アルゴリズムおよび/またはデータ構造があります。

ボロノイ図、四分木など、それらのいくつかに関する情報の例として、この本を参照してください。

ただし、ここでの他の答えは、今日のソフトウェアに見られるほとんどの場合に正しいと思います。

  1. 検索エリアのジオコード(単一のポイント)
  2. 最初の球場を取得するためのバウンディングボックスクエリ
  3. メモリ内の並べ替え/選択
于 2009-01-12T08:56:12.983 に答える
0

6 か月ごとに 3 つの列を含むデータベース テーブルをコンパイルするテーブルがありました。オーストラリアのいくつかのクライアントに使用しました。約 40k の行が含まれており、クエリを実行するのに非常に軽量です。クライアントのために何かを軌道に乗せようとしているだけなら、これは非常に迅速です

  1. からの郵便番号
  2. 郵便番号
  3. 距離

    SELECT Store_ID, Store_AccountName, Store_PostalCode, Store_Address, Store_Suburb, Store_Phone, Store_State, Code_Distance FROM Store, (SELECT Code_To As Code_To, Code_Distance FROM Code WHERE Code_From = @PostalCode UNION ALL SELECT Code_From As Code_To, Code_Distance FROM Code WHERE Code_To = @PostalCode UNION ALL SELECT @PostalCode As Code_To, 0 As Code_Distance) As Code WHERE Store_PostalCode = Code_To AND Code_Distance <= @Distance ORDER BY Code_Distance

このクエリを高速化するためにできる最適化はたくさんあります。

于 2009-02-02T01:42:41.480 に答える
0

あなたが言ったように。住所/ZIP を 2D 世界座標に変換し、それを他の既知の場所と比較します。最も近いものを選択してください。:) 一部の DB (Oracle、MSSQL 2008) は役立つ機能を提供していると思いますが、私はそれらを使用したことがありません。

于 2008-11-30T23:54:49.877 に答える
0

かなり普遍的だと思います。彼らは住所または郵便番号を取得し、それを「地図座標」に変換します(実装によって異なります。おそらく緯度/経度です)。データベース内の物の「地図座標」を使用すると、距離を簡単に計算できます。

一部の不適切な実装では、郵便番号が郵便番号エリアの中心を表す座標に変換され、悪い結果が生じる場合があることに注意してください。

于 2008-11-30T23:56:51.963 に答える
0

それを行う方法についてのあなたの考えは、私がおそらく行う方法です。郵便番号の調整をジオコーディングし、それに基づいて計算を行うことができます。SQL Server 2008 には、これらの地理コード化された経度/緯度座標に基づいてクエリを実行するのに役立ついくつかの特別な新機能があることを知っています。

于 2008-11-30T23:57:44.660 に答える