9

私は場所(緯度と経度)を持っています。自分の場所から半径 10 マイル以内に部分的または完全に含まれる郵便番号のリストを取得するにはどうすればよいですか?

解決策は、よく知られている Web サービス (Google マップ、Bing マップなど)、ローカル データベース ソリューション (クライアントに SQL Server 2005 がある)、またはアルゴリズムへの呼び出しです。

やや似た質問を見たことがありますが、そこにあるすべての回答は、私が利用できないSQL Server 2008地理機能の使用にほとんど関係しています。

4

3 に答える 3

10

郵便番号とそれに対応する緯度と経度の座標を含む郵便番号データベースから始めます。

http://www.zipcodedownload.com/Products/Product/Z5Commercial/Standard/Overview/

緯度と経度の間の距離を取得するには、適切な距離式が必要です。このサイトにはいくつかのバリエーションがあります。

http://www.meridianworlddata.com/distance-calculation/

「大円距離」の式は少し極端です。これは私の経験から十分に機能します:

sqrt(x * x + y * y)

where x = 69.1 * (lat2 - lat1)
and y = 69.1 * (lon2 - lon1) * cos(lat1/57.3)

SQL クエリは次のようになります。

select zd.ZipCode
from ZipData zd
where 
    sqrt(
        square(69.1 * (zd.Latitude - @Latitude)) +
        square(69.1 * (zd.Longitude - @Longitude) * cos(@Latitude/57.3))
    ) < @Distance

幸運を!

于 2010-11-18T04:28:11.250 に答える
5

まず、すべての郵便番号とそれに対応する緯度と経度のデータベースが必要です。オーストラリアでは数千しかありません (そして情報は簡単に入手できます) が、アメリカではおそらくもっと難しい作業だと思います.

第 2 に、現在地と探している半径がわかれば、その半径内にあるすべての郵便番号を調べることができます。PHP で書かれた単純なものは次のようになります: (C# ではないことをお詫びします)

function distanceFromTo($latitude1,$longitude1,$latitude2,$longitude2,$km){
  $latitude1  = deg2rad($latitude1);
  $longitude1 = deg2rad($longitude1);
  $latitude2  = deg2rad($latitude2);
  $longitude2 = deg2rad($longitude2);
  $delta_latitude  = $latitude2  - $latitude1;
  $delta_longitude = $longitude2 - $longitude1;
  $temp = pow(sin($delta_latitude/2.0),2) + cos($latitude1) * cos($latitude2) * pow(sin($delta_longitude/2.0),2);
  $earth_radius = 3956;
  $distance = $earth_radius * 2 * atan2(sqrt($temp),sqrt(1-$temp));
  if ($km)
    $distance = $distance * 1.609344;
  return $distance;
}
于 2010-11-16T01:01:29.483 に答える
5

ほとんどの検索は重心で機能します。10 マイル以内の部分的な郵便番号を処理するには、郵便番号ポリゴンのデータベースを購入する必要があります (*)。次に、半径 10 マイル以内の頂点を持つ郵便番号をチェックするアルゴリズムを実装します。適切に行うには、距離測定に Haversine 式を使用する必要があります。巧妙なデータ構造を使用すると、検索スペースを大幅に削減できます。同様に、zipcoe 範囲 (North、West、East、South) を保存して最初に比較することで、検索を大幅に高速化できます。

(*) 注: 技術的には、郵便番号はポリゴンではありません! 私たちは皆、それらをそのように考えていることを知っていますが、実際にはそれらはデータポイント (住所) のコレクションであり、これが USPS が実際に使用する方法です. これは、郵便番号に他の郵便番号を含めることができることを意味します。郵便番号は複数の「ポリゴン」で構成できます。また、郵便番号は他の郵便番号と重複する場合があります。これらの状況のほとんどは問題になりませんが、複数のポリゴンとして定義できる郵便番号を処理する必要があります。

于 2010-11-16T00:35:03.070 に答える