2011-12-08 4 views
1

내 PHP 어플리케이션에서 주어진 포스트 코드의 가장 가까운 우편 번호를 얻고 싶습니다. 즉, 게시물 코드를 680721으로 입력해야합니다. 내 데이터베이스에서 가장 가까운 게시물 코드를 가져오고 싶습니다.주어진 포스트 코드의 가장 가까운 우편 번호 찾기

어떻게하면됩니까?

상점 우편 코드로 사용한 테이블입니다. 여기 varpin enter image description here

enter image description here

는 우편 번호 필드이다.

+0

데이터베이스의 형식과 순서를 알아야합니다. – Hossein

+0

예 나는 테이블 detals로 질문을 편집합니다. – Kichu

답변

3

영국 Postcodes Wikipedia 항목의 "External Links"를 빠르게 살펴본 결과, Paul Jenkins의 기사에서 영국의 Post Code Distance Calculation을 발견했습니다. 환상적입니다. 여기에서 다운로드하십시오 (uk_postcode_calc.zip). 짧은 시험 후에 주석이 말하는 것과 똑같은 것처럼 보이고 거리를 계산합니다. 그러나 php 거리 계산을위한 빠른 google을 사용하면 거리 계산에있어보다 세련된 등가물을 빠르게 찾을 수 있습니다. 대신 그 중 하나를 사용하는 것이 좋습니다. 조정이 약간 후 , 여기에 내가 결국 해낸 무엇 :

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; } 
} 
} 

위의 스크립트는 "min"함수를 사용하여 우리가 반환해야하는 것을 빨리 해결할 수 있습니다. 남은 작업은이 모든 것을 함께 묶는 것입니다. 데이터베이스에서 경도와 위도를 가져 오기 위해 우편 번호를 사용하여 거리를 가져옵니다. 포스트 코드를 키로 사용하고 거리를 값으로 사용하여 배열을 만듭니다. 매우 간단합니다!

: 그 수행에 기능 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에서 공개 라이센스에 따라 영국 우편 번호 데이터 - northings/eastings를 WGS84 lat/long으로 변환해야하지만 –

+1

그러나이 코드는 영국뿐만 아니라 모든 국가에서 사용할 수 있습니다.이 코드는 마스터 코드입니다. –

+0

귀하의 코드는 모든 국가에서 작동 할 수 있습니다. 그러나 우편 번호에 대한 위도/경도를 제공하기 위해 귀하의 우편 번호 데이터가 먼저 존재해야합니다 ... Paul Jenkins의 CSV는 언급했지만 우체국 PAF 또는 Ordnance Survey 데이터 세트는 좀 더 명확합니다. –