2013-08-07 4 views
0

Я пытаюсь настроить базу данных MySQL для своего сайта, которая будет иметь список различных мест. Можно ли настроить поиск по местоположению для этого списка? Например, если кто-то ищет «Олбани, Нью-Йорк, США», тогда должны быть результаты из соседнего «Нью-Йорка, Нью-Йорк», если база данных не имеет результатов от Олбани.Поиск местоположения базы данных

Я думаю, что аккуратный способ сделать это - использовать координаты широты и долготы. Однако, если пользователь входит в случайный город, есть ли способ получить географические координаты этого города для моего веб-сайта?

Кроме того, если пользователь неправильно называет свой запрос, существует ли опрятный способ обработки информации?

+0

Я предполагаю, что для этого вам понадобится включить некоторый тип геолокации. – Malkus

+0

Как вы храните данные о местонахождении nerby? – jaczes

ответ

0

Для первого варианта можно использовать запрос в РНР, как следующее:

$sql = "SELECT DISTINCT * FROM (`yourtable`) 
WHERE (`cityname` LIKE '%".$_POST('search')."%')" 

Этот запрос будет искать со словом вы ввели в в searchfield под названием «Поиск»

Так пример:

<input type="search" name="search"> 

Для второй части вашего вопроса вы можете использовать несколько более сложный запрос для searchterm.

Итак, вы сопоставляете, например, первые два символа.

Если вы хотите найти ближайшее местоположение, вы можете использовать google geolocation api для вычисления расстояния между двумя строками в базе данных.

https://developers.google.com/maps/documentation/business/geolocation/

0

Я использую эту функцию, чтобы получить лат/LNG из адреса.

function buildGeocode($address_1, $address_2, $city, $state, $zip_code, $country){ 

    $base_url = "http://maps.googleapis.com/maps/api/geocode/json"; 

    $address = $address_1 . ' ' . $address_2 . ', ' . $city . ' ' . $state . ' ' . $zip_code . ' ' . $country; 

    $request_url = $base_url . "?address=" . urlencode($address) . "&sensor=false"; 

    $data = json_decode(file_get_contents($request_url), true); 

    return array('lat' => $data['results'][0]['geometry']['location']['lat'], 'lng' => $data['results'][0]['geometry']['location']['lng']); 

} 

И это SQL, чтобы получить строки с определенным расстоянием (мили) в LAT/LNG (это должно быть обновлено, чтобы использовать PDO или маскирование).

SELECT SQL_CALC_FOUND_ROWS * 
    FROM (SELECT location_tbl.*, (3959*(2*ASIN(SQRT(POW(SIN(((location_tbl.lat-" . $lat . ")*(PI()/180))/2),2)+COS(location_tbl.lat*0.017453293)*COS(" . $lat . "*0.017453293)*POW(SIN(((location_tbl.lng-" . $lng . ")*(PI()/180))/2),2))))) AS distance 
      FROM location_tbl 
     WHERE location_tbl.active = 1) AS tmp_tbl 
    WHERE distance <= '" . $dis . "' 
    ORDER BY distance ASC 
+0

Вам нужно будет изменить его, чтобы изменить функцию на 'buildGeocode ($ city, $ state, $ country)' и '$ address = $ city. ''. $ state. ''. $ country; 'и он должен работать. Это URL-адрес, запрашивающий http://maps.googleapis.com/maps/api/geocode/json?address=New+York+NY+USA&sensor=false – cmorrissey

+0

Спасибо, заработал! Согласно лицензионному соглашению, я предполагаю, что мне нужно отображать результаты на карте, если я собираюсь использовать службу Google API ... – user2660845

0

Поскольку апи Google не позволяет использовать геокодирования для целей, отличных отображения вам придется создать таблицу в базе данных со всех городов целей Int он США и их почтовые индексы. Существует большой свободный ресурс доступен здесь:

http://federalgovernmentzipcodes.us/

Что касается написания названий городов, я хотел бы использовать JQuery для создания автозаполнения поля на основе имеющихся городов в базе данных. Таким образом, вы будете уверены, что ваши пользователи всегда вводят элемент, который можно найти.

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