Ищем ближайшие организации от указанного места и показываем их на Google Maps
При создании справочных ресурсов с использованием карт часто возникает проблема, как показать ближайшие объекты для того или иного пользователя.
В этой заметке я расскажу как это сделать, с использованием API Google Maps v3.
Для примера мы будем искать ближайшие кафе в Нижнем Новгорде.
Пользователь вводит свой адрес в форму над картой и радиус поиска в километрах, ему выдается найденный результат на карте, а слева от карты список кафе отсортированный по растоянию.
В начале необходимо подготовить исходные данные о кафе.
Они взяты из открытых источников в интернете.
Затем, с помощью скрипта из заметки «Используем HTML-геокодер для Google Maps JavaScript API v3», были получены значения координат для собранных адресов и записаны в базу данных.
Как работает данный пример.
Введенное пользователем значение адреса, мы используя геокодер API Google Maps v3 преобразуем в пару координат — значения широрты и долготы, которые затем в месте с радиусом передаем скрипту phpsqlsearch_genjson.php.
В данном скрипте производится специальный запрос к таблице в базе данных, в результате мы получаем сведения об организациях попадающих в окружность заданного радиуса и с определенным центром.
Данные сортируются по расстоянию от центра окружности.
Вот код запроса:
$query = sprintf("SELECT address, name, rayon, lat, lng, ( 6371 * acos( cos( radians('%s') ) * cos( radians( lat ) ) * cos( radians( lng ) - radians('%s') ) + sin( radians('%s') ) * sin( radians( lat ) ) ) ) AS distance FROM markers_ussearch HAVING distance < '%s' ORDER BY distance LIMIT 0 , 50", mysql_real_escape_string($lat), mysql_real_escape_string($lng), mysql_real_escape_string($lat), mysql_real_escape_string($radius));
Из массива полученных данных формируется ответ в формате JSON, который отправляется на страницу с картой.
Полный код файла phpsqlsearch_genjson.php:
<?php header("Content-type: text/html;charset=UTF-8"); require("config.php"); $lat = $_GET["lat"]; $lng = $_GET["lng"]; $radius = $_GET["radius"]; $query = sprintf("SELECT address, name, rayon, lat, lng, ( 6371 * acos( cos( radians('%s') ) * cos( radians( lat ) ) * cos( radians( lng ) - radians('%s') ) + sin( radians('%s') ) * sin( radians( lat ) ) ) ) AS distance FROM markers_ussearch HAVING distance < '%s' ORDER BY distance LIMIT 0 , 50", mysql_real_escape_string($lat), mysql_real_escape_string($lng), mysql_real_escape_string($lat), mysql_real_escape_string($radius)); $result = mysql_query($query); if (!$result) < die("Invalid query: " . mysql_error()); >while ($par1 = mysql_fetch_array($result)) < $places[] = array("name"=>$par1['name'], "address" => $par1['address'], "rayon" => $par1['rayon'], "lat" => $par1['lat'], "lng" => $par1['lng']); >$json = json_encode($places); echo $json; ?>
Файл config.php служит для соединения с базой данных и имеет следующий код:
<?php $sdb_name = "localhost"; $user_name = "root"; $user_password = ""; $db_name = "gmap_bd"; // соединение с сервером базы данных if(!$link = mysql_connect($sdb_name, $user_name, $user_password)) < echo "<br>Не могу соединиться с сервером базы данных<br>"; exit(); >// выбираем базу данных if(!mysql_select_db($db_name, $link)) < echo "<br>Не могу выбрать базу данных<br>"; exit(); >mysql_query('SET NAMES utf8'); ?>
Давайте теперь рассмотрим код основного файла usersearch_gmapv3_radius.html
В начале мы после подключения API Google Maps, добавляем к нашему html-файлу javascript-библиотеку Jquery, для выполнения асинхронных запросов. По клику на кнопке «Найти», вызывается функция searchLocations, в которой мы получаем введенные данные из формы, производим геокодирование адреса и отправляем запрос скрипту phpsqlsearch_genjson.php, а затем принимаем полученный ответ в формате JSON.
Функция createMarker — добавляет метку на карту и ссылку в слайдбар.
Функция myclick обрабатывает клик по ссылке в слайдбаре, происходит центрирование и масштабирование карты на нужной метке.
Функция clearOverlay — служит для удаления предыдущего результата поиска.
Ищем ближайшие организации от указанного места и показываем их на Google Maps : 6 комментариев
Отличная вещь, спасибо огромное, но есть вопрос… Как я понял, скрипт ищет не кафе, а данные из БД по координатам — то, что есть близко к объекту. Вопрос — необходимо самому создавать эту БД со всеми кафе или прочими центрами услуг? Или как-то интегрируются данные из данных Гугла? Например, я бы хотел, чтобы пользователь находил супермаркеты. В идеале, конечно, чтобы был выпадающий список (кафе, супермаркет, техобслуживание и т.д.), но думаю, что это тема отдельного урока. То есть суть вопроса — как и где находить необходимые объекты для БД? Спасибо!
Нужно создавать базу данных самому. Можно еще использовать сервис Google Places API, но есть проблема с содержанием базы по городам России, если по Москве и Санкт-Петербургу много данных, то по другим городам они могут быть минимальными или вообще отсутствовать. Можно еще использовать API 2GIS
Спасибо, будем пробовать! Наткнулся на урок по этому вопросу http://www.script-tutorials.com/google-places-api-practice/comment-page-1/ но почему-то не смог приспособить к своей местности — упрямо показывает только узкий спектр и только в том месте, про который пример (Нью-Йорк). Подозреваю, что где-то идет запрос в БД, но нигде в коде не смог обнаружить этого запроса. Если Вам будет интересно, то было бы прекрасно, если выложите здесь этот урок, думаю всем будет полезно. Спасибо за уроки!
Как переделать запрос чтобы выводились обекты которые лежат между двумя точками, учитывать например только долготу
В файле «phpsqlsearch_genjson.php» echo $json выводит null
Может я что-то не так пишу в запросе? Не могли бы Вы расписать сам запрос более подробно? Что значит цифра 6371? И вообще вся эта длинная конструкция которая потом объявляется как distance — для чего это все? ) Спасибо.
И еще сразу вопрос: зачем нужны эти записи:
Каким образом например все эти переменные окажутся в $_GET если мы туда ничего не передаем вроде…