2009-08-07 15 views
6

私はこの人気のあるPHP/MySQLスクリプトをSaniSoftのZip Locationという名前で見つけました。それは1つの事以外に素晴らしいことです。特定の半径の郵便番号を見つける

20マイル未満の半径は、20マイルと同じ郵便番号を返すようです。私はGoogleの全面を検索しましたが、役に立たないと私は誰かがこの状況についていくつかの洞察を持っていたかどうか疑問に思っていた。

私は、プログラムの支払いを受ける前にこの問題を解明したいと思います。また、学習環境を利用することもできます。データベースは、各郵便番号の郵便番号と経度と緯度のリストです。スクリプトは、入力された郵便番号の周囲の距離を決定し、その半径/緯度に基づいてその半径の郵便番号を返すメソッドを使用します。

ありがとうございました!

編集: スクリプトが提供する距離関数を使用することから、プログラムが私に与える郵便番号と郵便番号の距離が0マイルになることがわかりました。

MAJOR UPDATE

研究から、それはデータベースが緯度/経度値を重複していることが判明しました。 Zip Locatorを使用する場合は、この点に注意してください。 PHPはその仕事をしていますが、郵便番号の新しいデータベースを見つける必要があります。私は後日、私の所見を掲載する予定です。

答えて

1

2回目!

編集した問題文を見て、私はあなたのジップ値の割り当て方法を見ていきたいと思います。

郵便番号が文字列ではなく整数の場合は、エラーが多く発生する可能性があります。最大の問題はアメリカの郵便番号は0から始めることができるということです。

ziptest.phpの例は、zipsを整数として扱うので良くありません。あなたが整数で自分の郵便番号を記述しようとすると:

$zip1 = 02446; 

その8進数2446 phpZipLocator明示的な変換せずに値を文字列としての用途としてPHPによって解釈します。したがって、PHPは8進数2446の10進値を郵便番号ではない文字列(1318)として返します。

代わりに、それは郵便番号を見つけられませんでしたことを通知する、phpZipLocatorは1

た場合でなければなりません、それは決定存在しないものの一定の半径内のすべての郵便番号の半径検索を行います文字列を使用して郵便番号を設定します。

$zip1 = '02446'; 

私は正しい結果を得ます。

IMHO phpZipLocatorが少しの作業を使用するようです。

+0

ありがとうございました。 +1しても問題は解決しません。私が使用している郵便番号は11950で、半径は5に設定されています。73の郵便番号が付いています。私は郵便番号変数を現在ポスト変数を通して送信しています。しかし、変数を$ zip1 = '11950'に変更しました。私はまだ同じ結果を得る。 –

+0

私はそれがあなたの郵便番号、興味深いものとここで働いているのを見ます。 –

+0

さらに興味深いことに、出てくる73の郵便番号のいくつかは約20マイル離れています。 –

10

以下のおおよその距離の計算は比較的簡単ですが、 は10%の距離誤差を生成する可能性があります。これらのおおよそ の計算は、の緯度と経度の値を使用して実行されます。最初の近似は、単純な数学関数を必要とします。

Approximate distance in miles = sqrt(x * x + y * y) 

where 
     x = 69.1 * (lat2 - lat1) 
and 
     y = 53 * (lon2 - lon1) 

あなたは によって、このおおよその距離計算の精度を向上させることができるコサイン演算機能追加:

Approximate distance in miles = sqrt(x * x + y * y) 

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

をあなたはより高い精度が必要な場合は、あなたが使用する必要があります。正確な距離計算。 地球が球であるため、正確な距離計算には球形のジオメトリが必要です。 正確な距離計算には、浮動小数点数学精度の高いレベル が必要です。これは約15桁の精度 (「倍精度」と呼ばれることもあります)です。さらに、正確な計算に使用される三角関数 の関数は、緯度 と経度の度数をラジアンに変換する必要があります。緯度または 経度を度からラジアンに変換するには、このデータベースの緯度および経度の値 を180/piまたは57.2958で除算します。地球の半径は で、6,371キロメートル、つまり3,958.75マイルとなります。

計算には、度からラジアンへの変換を含める必要があります。ラジアンため度を代入し、計算は次のとおり

  Exact distance in miles = 3958.75 * arccos[sin(lat1/57.2958) * 
           sin(lat2/57.2958) + 
           cos(lat1/57.2958) * 
           cos(lat2/57.2958) * 
           cos(lon2/57.2958 - lon1/57.2958)] 
0

phpZipLocatorためのデモスクリプトの半径のデフォルト値(ziptest。PHPは)$radiusのためにその値があなたのコードにまだあるし、使用する半径を上書きしていることになり、デフォルトの半径20マイル

$radius = 20; 
$zipArray = $zipLoc->inradius($zipOne,$radius); 

私の推測を使用しています。 $radiusの検索と置換を行ってください。

さらに、inradius()を呼び出すと、デバッガでコードを見て、$radiusが20に設定されているかどうかを確認します。

+0

初めてこの値を直接変更しました。しかし、あなたの助けをありがとう。 –

+0

Iveは距離関数を使用しました。驚いたことに、郵便番号は郵便番号から0マイルです。 –

関連する問題