2017-01-24 5 views
0

Код ниже, который я написал для поиска радиуса в пределах 50 миль от найденного почтового индекса. Как я могу изменить этот код, чтобы найти только ближайшее местонахождение клиники, а не список мест для клиник? Поэтому, если я набрал почтовый индекс для Денвера, штат Колорадо и мои офисы в основном в Нью-Йорке, ОАЭ и Огайо, как я могу добраться до ближайшего места, расположенного в Огайо?Найти ближайший почтовый индекс в 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

Используйте гаверсинус формулы, https://developers.google.com/maps/articles/phpsqlsearch_v3. См. «Поиск мест с MySQL». – chris85

+0

Если я LIMIT заявление Sql только 1, это даст мне ближайшее местоположение? – user2593040

+0

'Limit' и' заказать' на расстоянии. – chris85

ответ

0

Смотреть это Fastest Way to Find Distance Between Two Lat/Long Points

В принципе вы вычислить расстояние до базовой LatLon, сортировать по кратчайшему расстоянию, и получить деталь сверху. Вы также можете сделать это в коде, если не хотите беспокоиться о сложных запросах.

Ключевые слова являются «большой круг расстояние» и «гаверсинуса формула»

EDIT

Скажем, у меня есть база данных ветеринара клиники в Лос-Анджелесе

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

Формула галерса нуждается в коордах в радианах вместо градусов.

Есть 2 пи радиан в 360 градусов, так у радиан = 6,28319 * х градусов/360 (решение для у)

Ниже приводится гаверсинуса формула, где r в 2 r arcsin является радиус Земли: 6,371,000 метров

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

Давая мне

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

Как я могу определить второе местоположение? Я знаю длинный/лат для Денвера, но для списка почтовых индексов в моей базе данных, как я мог узнать, какой из них использовать в качестве второго пункта? Расстояние от Денвера до «?» – user2593040

+0

Вам нужны фактические координаты клиник. Вы можете найти их вручную, используя карты Google. Затем вы сравните свою базовую координату почтового индекса с ними. В идеале координата почтового индекса находится в центре зоны покрытия.НО В реальном приложении вам нужно будет использовать фактическое местоположение вашего пользователя (с использованием функции GPS-навигации мобильного устройства или браузера) для сравнения с местоположениями клиник. –

+0

. Хорошо, у меня есть эти поля в моей базе данных местоположений, я просто смущен тем, как могу измените мой код. Я даже не могу использовать какой-либо из существующих кодов. – user2593040

Смежные вопросы