2011-12-08 17 views
1

私のPHPアプリケーションでは、特定の郵便番号の最寄りの郵便番号を取得したいと思います。 つまり、私は680721として郵便番号を入力することを意味します。私はこのデータベースの最も近い郵便番号をデータベースから取得したいと考えています。特定の郵便番号の最も近い郵便番号の検索

どうすればいいですか?

これは私が店舗の郵便番号のために使用したテーブルです。 enter image description here

enter image description hereここ

varpin郵便番号フィールドです。

+0

データベースの形式と順序を知る必要があります。 – Hossein

+0

はい私はテーブルdetalsで質問を編集します – Kichu

答えて

3

英国ポストコードウィキペディアの「外部リンク」をすばやくブラウズして、ポール・ジェンキンスの記事「英国ポストコード距離計算」をすぐに見つけることができました。これは素晴らしいことですここでダウンロードしてください(uk_postcode_calc.zip)。 短い試験の後、これはスズのことを正確に示し、距離を単純に計算するようです。 しかし、php距離計算のための素早いgoogleを使用すると、距離計算のより洗練された等価物がすぐに見つかることがあります。代わりにそれらの1つを使うのは良い考えだと思いました。 は微調整の少し後に、ここで私が最後に思い付いたものです:

function distance($lat1, $lon1, $lat2, $lon2, $u=’1′) { 
$u=strtolower($u); 
if ($u == ‘k’) { $u=1.609344; } // kilometers 
elseif ($u == ‘n’) { $u=0.8684; } // nautical miles 
elseif ($u == ‘m’) { $u=1; } // statute miles (default) 
$d=sin(deg2rad($lat1))*sin(deg2rad($lat2))+cos(deg2rad($lat1))*cos(deg2rad($lat2))*cos(deg2rad($lon1-$lon2)); 
$d=rad2deg(acos($d)); 
$d=$d*60*1.1515; 
$d=($d*$u); // apply unit 
$d=round($d); // optional 
return $d; 
} 

だから、それは(データベースおよび数学)で行わ難しい部分だ、次単に「を見つけるために、この情報を利用する場合であります私たちが供給しているポストコードの配列に入力したポストコードから最も近い ""最も近いポストコードを見つけるには、ポストコード間の "最短"距離、またはその結果を、郵便番号としてのキーと値としての距離を持つ配列に格納すると仮定します。 私たちがしなければならないことは、与えられた配列の中で最小の数を見つけ出し、適切なキーを返す単純なスクリプトを作ることだけです。シンプル!

function closest ($needle,$haystack) { 
if (!$needle || !$haystack) { return; } 
if (!is_array($haystack)) { return; } 
$smallest=min($haystack); //smallest value 
foreach ($haystack as $key => $val) { 
if ($val == $smallest) { return $key; } 
} 
} 

上記のスクリプトでは、我々はすぐに我々が戻るために必要なものを考え出すことができ、「分」機能を使用して、我々が望むものを正確に行います。 残っている唯一の作業は、これらをまとめてバインドすることです。 郵便番号を使用して距離を取得し、データベースから経度と緯度を取得します。 ポストコードをキーとして、距離を値として配列を作成します。 非常に簡単です!

:それは行われて 機能1、郵便番号の距離

function postcode_distance ($from,$to) { 
// Settings for if you have a different database structure 
$table=’postcodes_uk’; 
$lat=’lat’; 
$lon=’lon’; 
$postcode=’postcode’; 
// This is a check to ensure we have a database connection 
if ([email protected]_query(‘SELECT 0′)) { return; } 
// Simple regex to grab the first part of the postcode 
preg_match(‘/[A-Z]{1,2}[0-9R][0-9A-Z]?/’,strtoupper($from),$match); 
$one=$match[0]; 
preg_match(‘/[A-Z]{1,2}[0-9R][0-9A-Z]?/’,strtoupper($to),$match); 
$two=$match[0]; 
$sql = “SELECT `$lat`, `$lon` FROM `$table` WHERE `$postcode`=’$one’”; 
$query = mysql_query($sql); 
$one = mysql_fetch_row($query); 
$sql = “SELECT `$lat`, `$lon` FROM `$table` WHERE `$postcode`=’$two’”; 
$query = mysql_query($sql); 
$two = mysql_fetch_row($query); 
$distance = distance($one[0], $one[1], $two[0], $two[1]); 
// For debug only… 
//echo “The distance between postcode: $from and postcode: $to is $distance miles\n”; 
return $distance; 
} 
Function 2, Postcode Closest 
function postcode_closest ($needle,$haystack) { 
if (!$needle || !$haystack) { return; } 
if (!is_array($haystack)) { return; } 
foreach ($haystack as $postcode) { 
$results[$postcode]=postcode_distance($needle,$postcode); 
} 
return closest($needle,$results); 
} 

ので、このような「postcode.php」、現実の世界で使用するための準備ができて... テストケースとしてファイルへの機能の上に4を置きます

<?php 
include_once(‘postcode.php’); 
if ($_POST) { 
include_once(‘db.php’); 
$postcodes=array(‘TF9 9BA’,'ST4 3NP’); 
$input=strtoupper($_POST['postcode']); 
$closest=postcode_closest($input,$postcodes); 
} 
if (isset($closest)) { 
echo “The closest postcode is: $closest”; 
} 
?> 
<form action=”" method=”post”> 
Postcode: <input name=”postcode” maxlength=”9″ /><br /> 
<input type=”submit” /> 
</form> 

ここでこのスクリプトをダウンロードすることができます:postcode_search.phps 注:上記のテストケースでは、データベースの詳細を含む「db.php」ファイルがあり、データベース接続を開始します。私は同じことをお勧めします。 データベースが作成されていることを確認したら、独自のテーブル構造を使用できるように、Paul JenkinsのUK Postcode csvを使用できるはずです。 それは皆さんだから、このスクリプトを使用して、「最も近い」郵便番号に一致する場所を提供することができます。

+1

英国の郵便番号で働いていて、あなたの郵便番号データの郵便局PAFを買う余裕がないなら...あなたはIrdnance Surveyが無料でダウンロードできます英国のポストコードデータはオープンライセンスでhttps://www.ordnancesurvey.co.uk/oswebsite/products/code-point-open/index.htmlからダウンロードできます。北西/東西をWGS84緯度/経度に変換する必要がありますが、 –

+1

しかし、私のこのコードは、英国だけでなく、すべての国で有効です。これはマスターコードです。 –

+0

あなたのコードはすべての国で機能しますが、郵便番号のデータは郵便番号の緯度/経度を示すためには最初に存在する必要があります...あなたはPaul JenkinsのCSVについて言及しましたが、郵便局のPAFまたはOrdnance Surveyデータセットはかなり確定的です。 –