Радиус
Поиск в радиусе позволяет находить организации в указанном радиусе на карте. Для этого выполните следующие действия.
- Выберите инструмент Радиус в левом верхнем углу карты.
- Щелкните мышкой на карте и задайте необходимый радиус, в котором будет производиться поиск организаций. В появившемся диалоговом окне Радиус отображается величина выбранного радиуса на карте и приблизительное время, за которое можно преодолеть расстояние от центра до края выделенной области пешком.
- Щелкните по ссылке Найти организации в заданном радиусе. В результате поиска на карте и в справочнике отобразятся организации, находящиеся в заданном радиусе.
Квадратные голубые маркеры на окружности предназначены для изменения размера радиуса, а круглый голубой маркер в центре окружности — для изменения расположения радиуса на карте.
Поиск в Радиусе также можно совмещать с поиском в полях «Что» и «Где». К примеру, можно найти все кафе на улице Каменская недалеко от вашего дома, указав радиусом нужную область на карте.
Величину радиуса и его расположение на карте можно изменять также в том случае, когда инструмент Радиус отключен (то есть окно Радиус закрыто).
Другие страницы раздела:
- Управление слоями
- 3D
- Масштабная линейка
- Вращение карты
- Линейка
Как выполнить поиск организации в заданном радиусе
Поиск в радиусе, позволяет находить организации в указанном радиусе. Для этого выполните следующие действия:
1. Выберите инструмент «Поиск в радиусе».
2. Выберите место на карте и кликните один раз левой кнопкой мыши — так вы установите центр. Отпустив клавишу, отодвиньте курсор от центра, задайте необходимый радиус и кликните еще раз.
Для того чтобы «передвинуть» выделение, кликните на его центре левой кнопкой мыши и, не отпуская кнопку, переместите в нужное место.
3. Если Вы еще не вводили запрос в строку поиска, сделаете это сейчас или нажмите на ссылку «Найти все организации». В результате все организации или те, которые удовлетворяют запросу, находящиеся в заданном радиусе, отобразятся на карте и в списке найденных.
4. Полностью выключить радиус можно нажав кнопку «Закрыть».
При создании справочных ресурсов с использованием карт часто возникает проблема, как показать ближайшие объекты для того или иного пользователя.
В этой заметке я расскажу как это сделать, с использованием 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
<html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Поиск по своим данным от произвольной точки в пределах окружности заданного радиуса, с выводом на Google Maps</title> <script src="http://maps.google.com/maps/api/js?sensor=false" type="text/javascript"></script> <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script> <script type="text/javascript"> var map, infoWindow, userMarker = [], side_bar_html = ""; var gmarkers = new Array(); var infowindow = new google.maps.InfoWindow( { size: new google.maps.Size(150,50) }); function createMarker(latlng, name, html) { var contentString = html; var marker = new google.maps.Marker({ position: latlng, map: map }); google.maps.event.addListener(marker, 'click', function() { infowindow.setContent(contentString); infowindow.open(map,marker); }); gmarkers.push(marker); side_bar_html += '<a href="javascript:myclick(' + (gmarkers.length-1) + ')">' + name + '</a><br>'; } function initialize() { map = new google.maps.Map(document.getElementById("map"), { center: new google.maps.LatLng(56.317213,43.993976), zoom: 12, mapTypeId: 'roadmap', mapTypeControlOptions: {style: google.maps.MapTypeControlStyle.DROPDOWN_MENU} }); infoWindow = new google.maps.InfoWindow(); } function searchLocations() { var address = $('#addressLoc').val(); var radius = $('#radiusSelect').val(); var geocoder = new google.maps.Geocoder(); geocoder.geocode({address: address}, function(results, status) { if (status == google.maps.GeocoderStatus.OK) { var locations_lat = results[0].geometry.location.lat(); var locations_lng = results[0].geometry.location.lng(); while(userMarker[0]){ userMarker.pop().setMap(null); } var myLatLng = new google.maps.LatLng(locations_lat, locations_lng); userMarker[0] = new google.maps.Marker({ position: myLatLng, map: map, icon: 'home-1.png' }); var bounds = new google.maps.LatLngBounds(); clearOverlay(); var sidebar = $("#sidebar").html(); $("#sidebar").html(sidebar); //Загружаем данные в формате JSON из файла phpsqlsearch_genjson.php $.getJSON("phpsqlsearch_genjson.php", {lat : locations_lat, lng : locations_lng, radius:radius }, function(json){ var marker; if (json.length == null) { $("#sidebar").html('Ничего не найдено.'); return; } for (i = 0; i < json.length; i++) { var name = json[i].name; var address = '<strong>'+name+'</strong><br>'+json[i].address+'<br >Район: '+json[i].rayon; var point = new google.maps.LatLng(json[i].lat, json[i].lng); marker = createMarker(point, name, address); bounds.extend(point); } map.fitBounds(bounds); $("#sidebar").append(side_bar_html); }); } else { alert(address + ' not found'); } }); } function myclick(i) { var latLng = gmarkers[i].getPosition(); map.setCenter(latLng); map.setZoom(17); google.maps.event.trigger(gmarkers[i], "click"); } function clearOverlay() { infoWindow.close(); for (var i = 0; i < gmarkers.length; i++) { gmarkers[i].setMap(null); } gmarkers.length = 0; side_bar_html = ""; $("#sidebar").html(""); } </script> <style type="text/css"> html, body { height: 100%; } font-family: Arial, Helvetica, sans-serif; font-size: 10px; </style> </head> <body onload="initialize()"> <p>Ваш адрес: <input type="text" id="addressLoc" size="40" value="Нижний Новгород, "/> Радиус поиска в км: <input type="text" id="radiusSelect" size="5"/> <input type="button" onclick="searchLocations()" value="Найти"/> </p> <div id="mymap_div" style="width:1050px;"> <div id="sidebar" style="float:left; width: 250px; height: 600px; overflow: auto;"></div> <div id="map" style="margin-left: 250px; width: 800px; height:600px;"></div> </div> </body> </html>
В начале мы после подключения API Google Maps, добавляем к нашему html-файлу javascript-библиотеку Jquery, для выполнения асинхронных запросов.
По клику на кнопке «Найти», вызывается функция searchLocations, в которой мы получаем введенные данные из формы, производим геокодирование адреса и отправляем запрос скрипту phpsqlsearch_genjson.php, а затем принимаем полученный ответ в формате JSON.
Функция createMarker — добавляет метку на карту и ссылку в слайдбар.
Функция myclick обрабатывает клик по ссылке в слайдбаре, происходит центрирование и масштабирование карты на нужной метке.
Функция clearOverlay — служит для удаления предыдущего результата поиска.
Скачать архив с файлами примера
Для написания заметки использовались примеры из следующих статей «Реализация поиска по данным пользователя с использованием API Google Maps v3» на моем блоге и «Creating a Store Locator with PHP, MySQL & Google Maps».
Калькулятор радиуса карты
Примечание: С помощью этого инструмента вы можете узнать радиус круга в любом месте на Картах Google, просто щелкнув мышью в одной точке и увеличив или переместив круг, чтобы изменить радиус на Карте.
Нажмите кнопку Нарисуйте круг, затем нажмите на карту, чтобы поместить центр круга, и одновременно перетащите, чтобы начать создание круга. Вы также можете создать круг фиксированного размера.
Да оно и не обязательно внутри drag проверять.
Добавили круг на карту и сразу же проверяем вхождение в него и не входящие красим в другой цвет или удаляем.
circle = new ymaps.Circle([[55.43, 37.7], 50000], null, { draggable: true });
myMap.geoObjects.add(circle);
var objectsInsideCircle = objects.searchInside(circle);
objectsInsideCircle.setOptions('preset', 'islands#redIcon');
// Оставшиеся объекты - синими.
objects.remove(objectsInsideCircle).setOptions('preset', 'islands#blueIcon');