2011-12-18 8 views
2

私は、特定の郵便番号の半径内に店舗を見つけるために、あらゆる種類の「店舗ロケータ」型のソリューションをウェブ上で見たことがあります。最寄りの店舗などです。多くはGoogleマップやその他のデータベースを使用していますが、多くは正確な緯度と経度の変換にも依存しています。PHPでの郵便番号の近接度計算

私のケースでは、PHPを使用してバックエンドで注文を処理しているだけで、私のベンダーのすべての倉庫のすべての郵便番号のリストをすでに持っています。

私は顧客に自分の郵便番号を提供したいと願うだけで、私の顧客に一番近い倉庫のソートされたリストを取得したいと思います。郵便番号は十分です - 私は緯度と経度を気にしたくありません。

アイデア?

+0

緯度と経度を郵便番号に関連付ける必要があります。郵便番号だけでは、(正確に)近接度を計算するのに十分な地理情報がエンコードされていません。 (私が郵便番号の形式で欠けているものがない限り...ウィキペディアの記事を今読んで) – Corbin

答えて

5

Popular Data's ZIP code databaseをダウンロードしてください。

これで、次のように距離を計算できます。

function calc_distance($point1, $point2) 
{ 
    $radius  = 3958;  // Earth's radius (miles) 
    $deg_per_rad = 57.29578; // Number of degrees/radian (for conversion) 

    $distance = ($radius * pi() * sqrt(
       ($point1['lat'] - $point2['lat']) 
       * ($point1['lat'] - $point2['lat']) 
       + cos($point1['lat']/$deg_per_rad) // Convert these to 
       * cos($point2['lat']/$deg_per_rad) // radians for cos() 
       * ($point1['long'] - $point2['long']) 
       * ($point1['long'] - $point2['long']) 
     )/180); 

    return $distance; // Returned using the units used for $radius. 
} 

上記は、Adam Bellaire's answer in Calculating distance between zip codes in PHPから盗まれました。この計算を実行した後、結果を単純に並べ替えることができます。

+0

これはちょうど良い順番で、距離の順序によく対応する数字の順序を扱うだけです。しかし、これにはいくつかの重大な制限があります。心に浮かぶ主なものは、国境(または郵便番号がどのように配置されているかに応じて地域境界かもしれない)です。言い換えれば、彼の問題が非常に具体的でない限り、これは解決策ではありません。また、そのグローバルは単純な小さなクラスのクロージャで回避することもできます。 – Corbin

+0

これは間違ったアプローチです。彼はそれを単純化しようとしている。彼はちょうど郵便番号でそれをすることができます(ビジネスルールがたくさんなくても、あなたのアプローチはおそらく最高です)。その点で、あなたの答えは良いものです。私が言ったように、それはそれがその正確さに限られていることに言及することを無視する。 – Corbin

+0

最寄りの倉庫の物がちょうどヒューリスティックなもので、2番目に近い倉庫または3番目に近い倉庫から何かが出荷されると、実際には悪いことは起こりません。 – Gravity