2017-01-24 11 views
0

以下のコードは検索した郵便番号の50マイル以内で半径検索を行うよう書いています。クリニックの場所のリストの代わりに、最も近いクリニックの場所だけを見つけるようにこのコードを変更するにはどうすればよいですか?したがって、コロラド州デンバーの郵便番号を入力して、私の所在地がニューヨーク、PA、オハイオ州にある場合、どうすれば最も近い場所をオハイオ州に置くことができますか?PHP/MYSQLで最寄りの郵便番号の場所を見つけよう

/* RADIUS SEARCH - 50 MILES FROM THE ZIP CODE VARIABLE */ 
$zipcode=trim($_REQUEST['zipcode']); 


//Find Out The Longitude & Latitude of Zipcode in existing database 
$zcquery = "SELECT * FROM wp_nava5jxxyp_zipcodes WHERE zipcode = $zipcode"; 
    $result = mysqli_query($dbc, $zcquery); 
    $row = mysqli_fetch_array($result); 

    $lat = $row['latitude']; 
    $long = $row['longitude']; 


//Setting the Default Distance 50 Miles 
// (Equation 1/69 = 0.0144927536231884 * 50 miles equals result below) 
$miles = 0.7246376811594203; 

    /* Query To Search for all of the Zip Codes within the range */ 
    $query = 'SELECT zipcode from wp_nava5jxxyp_zipcodes 
    WHERE latitude between ' . $lat . ' - ' . $miles . ' and ' . $lat . ' + ' . $miles . ' 
    and longitude between ' . $long . ' - ' . $miles . ' and ' . $long . ' + ' . $miles; 
    $result = mysqli_query($dbc, $query); 


    //Put those zip codes into a variable array 
    $variabele = array(); 
while($row = mysqli_fetch_array($result)) 
{ 
if($row['zipcode'] != '') 
    $variabele[] = $row['zipcode']; 
} 
$zipcodelist = implode(', ', $variabele); 


// Close Connection 
mysqli_close($dbc); 

//Query Database For Any Clinics that are included in zip code list 
$args = array(
'posts_per_page' => 10, 
'orderby'   => 'post_title', 
'order'   => 'DESC', 
'post_type' => 'clinics', 
    'meta_query' => array (
     array (
      'key' => 'cliniczipcode', 
      'value' => $zipcodelist, 
      'compare' => 'IN' 
     ) 
    )); 

// the query 
$the_query = new WP_Query($args); 
+0

使用半正矢式を与えます。 「MySQLでの場所の検索」を参照してください。 – chris85

+0

Sql Statementを1に制限した場合、それは私に最も近い場所を教えてくれますか? – user2593040

+0

距離で 'Limit'と' order'を距離で指定します。 – chris85

答えて

0

このFastest Way to Find Distance Between Two Lat/Long Points

は基本的にソートすることにより最短距離、お使いのベースlatlonまでの距離を計算し、一番上のアイテムを取得する参照してください。複雑なクエリを気にしたくなければ、これをコードで行うこともできます。

キーワードは「大圏距離」であり、「半正矢式」

EDIT

だが、私はLA

Limehouse Veterinary Clinic 34.1534500122 -118.3630599976 
LA Pet Clinic     34.0838623047 -118.3284454346 
Bestfriends Animal Hospital 34.1692466736 -118.3970489502 

に獣医クリニックのデータベースを持っているとしましょうそして、私のベース座標はハリウッドにありますlat 34.092324、lon -118.337122

haversine式では、度の代わりにラジアンでコードが必要です。

360度2つのπラジアンよう Yラジアン= 6.28319 * X度/ 360(Yについて解く)

は、以下があるが2 r arcsinrは地球の半径で半正矢式である:6371000メートル

したがって
-- haversine 
--       latdif         londif 
-- 2 r arcsin [ sqrt[ sin^2(------) + cos(lat1) * cos(lat2) * sin^2(------) ] ] 
--       2          2 

私の場所の近く、最寄りの診療所を得るために、私は上記の式

select 
name, 
2 * 6371000 * ASIN(
    sqrt(
     SIN(6.28319 * (34.092324 - lat)/360/2) * SIN(6.28319 * (34.092324 - lat)/360/2) 
     + 
     COS(6.28319 * 34.092324/360 ) * COS(6.28319 * lat/360 ) 
     * 
     SIN(6.28319 * (-118.337122 - lon)/360/2) * SIN(6.28319 * (-118.337122 - lon)/360/2) 
    ) 
) 
as dist_in_meters 
from locations ORDER BY dist_in_meters; 
の翻訳として、このクエリを使用することができます

https://developers.google.com/maps/articles/phpsqlsearch_v3、私に

name        dist_in_meters 
LA Pet Clinic     1234.3897096551932 
Limehouse Veterinary Clinic  7204.075434291492 
Bestfriends Animal Hospital 10177.689847331932 
+0

2番目の場所はどのようにして計算できますか?私はデンバーのlong/latを知っていますが、データベースの郵便番号のリストについては、どの点を第2のポイントとして使用するかをどのように知ることができますか?デンバーから "?"までの図距離 – user2593040

+0

診療所の実際の座標が必要です。 Googleマップを使用してこれらを手動で見つけることができます。次に、ベース郵便番号の座標をこれらと比較します。理想的には、郵便番号の座標はカバレッジエリアの中央にあります。しかし、実際のアプリケーションでは、診療所の場所と比較するために、ユーザーの実際の場所を使用する必要があります。 –

+0

私のコードを変更してください。私は既存のコードを使用することさえできないかもしれません。 – user2593040