Как найти организации в радиусе на карте

Радиус

Поиск в радиусе позволяет находить организации в указанном радиусе на карте. Для этого выполните следующие действия.

  1. Выберите инструмент Радиус в левом верхнем углу карты.

  2. Щелкните мышкой на карте и задайте необходимый радиус, в котором будет производиться поиск организаций. В появившемся диалоговом окне Радиус отображается величина выбранного радиуса на карте и приблизительное время, за которое можно преодолеть расстояние от центра до края выделенной области пешком.
  3. Щелкните по ссылке Найти организации в заданном радиусе. В результате поиска на карте и в справочнике отобразятся организации, находящиеся в заданном радиусе.


    Квадратные голубые маркеры на окружности предназначены для изменения размера радиуса, а круглый голубой маркер в центре окружности — для изменения расположения радиуса на карте.

Поиск в Радиусе также можно совмещать с поиском в полях «Что» и «Где». К примеру, можно найти все кафе на улице Каменская недалеко от вашего дома, указав радиусом нужную область на карте.

Величину радиуса и его расположение на карте можно изменять также в том случае, когда инструмент Радиус отключен (то есть окно Радиус закрыто).


Другие страницы раздела:

  • Управление слоями
  • 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');

Понравилась статья? Поделить с друзьями:
  • Как найти вкладку параметры эксель
  • Как найти стикеры телеграм по названию
  • Как найти работу на своем полуприцепе
  • Как найти значение суммы на алгоритме
  • Как найти мои закладки в контакте