На своем блоге я как-то уже рассказывал в заметке «Реализация поиска по данным пользователя с использованием API Google Maps», как можно осуществить поиск по данным пользователя с использованием PHP и MySQL.
В этой заметке мы переделаем пример для использования с API Google Maps v3.
И так нам понадобятся файлы из уже упомянутой заметки:
index.html – содержит html и Java script код вывода карты и результатов поиска;
файл phpsqlinfo_dbinfo.php – служит для соединения с базой данных;
phpsqlsearch_genxml.php – в нем осуществляется поисковый запрос к таблице в базе данных и формируется XML-код с результатами поиска.
И файл файл markers.sql — для создания таблицы markers в базе данных и заполнения ее.
Мы будем изменять файл index.html — основной файл с выводом карты.
Еще один важный момент, дело в том, что в третьей версии API Google Maps отсутствует функция для загрузки и разбора XML-файлов GdownloadUrl.
Поэтому для релизации необходимой функциональности мы будем использовать готовый скрипт файл downloadxml.js.
Загрузить его можно отсюда или с моего сайта.
И естественно его необходимо подключить для использования строкой:
<script type="text/javascript" src="downloadxml.js"></script>
Открываем файл index.html в текстовом редакторе, сохраняем его копию под новым именем, например, usersearch_gmapv3.html и начинаем его изменение.
Первое, что необходимо сделать — это изменить параметры для вызова API и определение начальных параметров карты.
Строку вызова API
<script src="http://maps.google.com/maps?file=api&v=2&key=ABQIAAAACHCJdlgAEGcD_flKUFEmVhQlAYd20Yeej0MiKNuYPUGBnCwDThQlwUCPtCqtX3RC7LUKE-JYan3T4g"
type="text/javascript"></script> |
заменяем на
<script src="http://maps.google.com/maps/api/js?sensor=false"
type="text/javascript"></script> |
И сразу после нее добавляем строку для подключения файла downloadxml.js
<script type="text/javascript" src="downloadxml.js"></script>
Определяем глобальные переменные, используемые в данной версии.
var map, infoWindow;
var side_bar_html = "";
var gmarkers = new Array();
var infowindow = new google.maps.InfoWindow(
{
size: new google.maps.Size(150,50)
}); |
Затем определяем начальные параметры для инициализации карты.
Вместо кода:
function load() {
if (GBrowserIsCompatible()) {
map = new GMap2(document.getElementById('map'));
map.addControl(new GLargeMapControl());
map.addControl(new GMapTypeControl());
map.setCenter(new GLatLng(56.317213,43.993976), 12);
}
} |
Пишем следующий код:
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();
} |
И также нам нужно изменить код в теге body c
<body onload="load()" onunload="GUnload()">
на <body onload="initialize()">
Теперь мы должны изменить код функции searchLocations, в которой мы передаем поисковый запрос в скрипт phpsqlsearch_genxml.php и обрабатываем полученный ответ в виде XML-файла с параметрами для найденных меток.
Новый код функции searchLocations:
function searchLocations() {
var name = document.getElementById('addressInput').value;
var searchUrl = 'phpsqlsearch_genxml.php?name=' + name;
downloadUrl(searchUrl, function(data) {
var marker;
var xml = xmlParse(data);
var markers = xml.documentElement.getElementsByTagName("marker");
var bounds = new google.maps.LatLngBounds();
clearOverlay();
var sidebar = document.getElementById('sidebar');
sidebar.innerHTML = '';
if (markers.length == 0) {
sidebar.innerHTML = 'Ничего не найдено.';
return;
}
for (var i = 0; i < markers.length; i++) {
var name = markers[i].getAttribute('name');
var address = '<strong>'+name+'</strong><br>'+markers[i].getAttribute('address');
var point = new google.maps.LatLng(parseFloat(markers[i].getAttribute('lat')),
parseFloat(markers[i].getAttribute('lng')));
marker = createMarker(point, name, address);
bounds.extend(point);
}
map.fitBounds(bounds);
document.getElementById("sidebar").innerHTML = side_bar_html;
});
} |
В начале функции мы берем введенное значение для поиска из элемента формы input с Id addressInput и передаем в файл phpsqlsearch_genxml.php.
После этого полученный ответ обрабатывается функцией downloadUrl.
Мы задаем значения для переменных и удаляем с карты предыдущие результаты поиска, вызывая функцию clearOverlay();
Также очищаем слайдбар, если ничего не найдено, то выводим соответствующие сообщение.
Иначе, мы формируем из полученных данных, маркеры на карте и ссылки в слайдбаре.
За это отвечает функция createMarker, которая получает в качестве входных параметров координаты точки, наименование маркера и содержимое балуна (в нашем случае html-код с именем и адресом).
Координаты точки добавляются в массив, для дальнейшего показа области с найденными данными (Bounds) на карте.
Код функции createMarker:
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>';
} |
В этой функции из преданных данных формируется маркер на карте, а по клику по маркеру открывается балун с необходимым содержанием.
Также в слайдбар добавляется ссылка, по нажатию на которую проиходит сдвиг и масштабирование карты, а также открывается балун с информацией о метке.
Код функции myclick:
function myclick(i) {
var latLng = gmarkers[i].getPosition();
map.setCenter(latLng);
map.setZoom(17);
google.maps.event.trigger(gmarkers[i], "click");
} |
И последняя фуккция clearOverlay:
function clearOverlay() {
infoWindow.close();
for (var i = 0; i < gmarkers.length; i++) {
gmarkers[i].setMap(null);
}
gmarkers.length = 0;
side_bar_html = "";
document.getElementById("sidebar").innerHTML = side_bar_html;
} |
Здесь мы закрываем все открытие балуны infoWindow.close();, удаляем метки с карты, очищаем слайдбар.
Функциии createMarker и createSidebarEntry, которые использоваолись в старой версии файла, мы удаляем.
Окончательный код файла usersearch_gmapv3.html
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Пример поиск по своим данным с выводом на Google Maps v3</title>
<script src="http://maps.google.com/maps/api/js?sensor=false"
type="text/javascript"></script>
<script type="text/javascript" src="downloadxml.js"></script>
<script type="text/javascript">
var map, infoWindow;
var 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 name = document.getElementById('addressInput').value;
var searchUrl = 'phpsqlsearch_genxml.php?name=' + name;
downloadUrl(searchUrl, function(data) {
var marker;
var xml = xmlParse(data);
var markers = xml.documentElement.getElementsByTagName("marker");
var bounds = new google.maps.LatLngBounds();
clearOverlay();
var sidebar = document.getElementById('sidebar');
sidebar.innerHTML = '';
if (markers.length == 0) {
sidebar.innerHTML = 'Ничего не найдено.';
return;
}
for (var i = 0; i < markers.length; i++) {
var name = markers[i].getAttribute('name');
var address = '<strong>'+name+'</strong><br>'+markers[i].getAttribute('address');
var point = new google.maps.LatLng(parseFloat(markers[i].getAttribute('lat')),
parseFloat(markers[i].getAttribute('lng')));
marker = createMarker(point, name, address);
bounds.extend(point);
}
map.fitBounds(bounds);
document.getElementById("sidebar").innerHTML = side_bar_html;
});
}
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 = "";
document.getElementById("sidebar").innerHTML = side_bar_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="addressInput"/>
<input type="button" onclick="searchLocations()" value="Найти"/>
</p>
<div id="mymap_div" style="width:800px;">
<div id="sidebar" style="float:left; width: 200px; height: 500px; overflow: auto;"></div>
<div id="map" style="margin-left: 200px; width: 600px; height:500px;"></div>
</div>
</body>
</html> |
Посмотреть работу примера в действии

В форме поиска набираем — кафе.
Найденные результаты отображаются в боковой панели и виде маркеров на карте.

Щелкнув по одному из названий в панели с боку, например Безухов, арт-кафе ЗАО "Кофебук" , откроется окно с информацией о кафе и произойдет центрирование карты.

Сутки пытаюсь заставить работать скрипт — толку 0.
В указанном Вами архиве файла index.html нет, вместо него я так понимаю usersearch_gmap.html. При попытке поиска кириллицей и латиницей названий кафе — выдает «Ничего не найдено». Смена кодировок в базе и файлах не дает результатов. Да кстати если указать неправильные данные БД, скрипт «проглатывает» и никаких результатов не выдает.
Не могли бы Вы выложить все файлы окончательного варианта проекта?
Архив с файлами проекта.
Замечание, для корректной работы примера необходимо наличие PHP 5.
Проверьте, создается ли и в каком виде XML-файл с результатами поиска в файле phpsqlsearch_genxml.php
Тоже уже вторые сутки пинаю скрипт — ничегошеньки.
Уже и ручками по пунктам все переписывал и готовый заливал, и права триста раз переапроверял. Не работает.
При попытке поиска — ничего не найдено.
База есть. Коннект к ней верен.
Вот что выдает
phpsqlsearch_genxml.php :
This page contains the following errors:
error on line 1 at column 1: Document is empty
Below is a rendering of the page up to the first error.
Если чем-то можете помочь, буду очень рад. Так как в коде вообще ничего не смыслю — тупо перепечатываю символы ))
Спасибо.
В IE — высыпается в ошибку: Invalid query: Table ‘wifi.markers_ussearch’ doesn’t exist
БД — wifi
Ребята, он в IE не работает. с JS видимо проблемы
Все отлично работает, но вот хотел спросить, как можно реализовать чтобы при нажатии на ссылку карта подгружалась в отдельном окне, а не постоянно весела в центре страничке
Добрый день!
Решил построить карту именно на API 3, но решений по реализации поиска по типу API 2 или как на Яндекс.Картах я не нашел. Неужели нет возможности добавить на карту возможность поиска по карте обычным методом addControl или как это реализовано в API 3 через добавление элементов контроля?
Буду благодарен за любую посказку. Сам уже кажется все просмотрел и перепробовал ничего не работает(((
По каким данным осуществлять поиск? По своим меткам или по Google Maps?
А у меня так и не заработало. И данные базы правильные, и файлы в кодировке UTF-8 без BOM — не работает и всё. Выдаёт «Ничего не найдено». Что не так может быть? У Никиты, вижу, заработало?
В файле phpsqlsearch_genxml.php в запросе к базе убрал «WHERE MATCH ( name ) AGAINST(‘».$name.»‘ IN BOOLEAN MODE)» и заработало Почему так? Ну и название таблицы в нем не «markers_ussearch», а «markers».
И еще вопрос. Как изначально на карте вывести все маркеры из базы?
а как в функции searchLocations()передать кроме категории и другие параметры для поиска?
var minvalue = document.getElementById(‘minPrice’).value;
var maxvalue = document.getElementById(‘maxPrice’).value;
var searchUrl = ‘/modules/mod_ea_google/phpsqlsearch_genxml.php?cat=’+cat +’&minvalue=4000000&maxvalue=30000000’;
У меня ничего не происходит.
Если поля для поиска заключить в теги (в данном примере их нету почему-то), — не работает. Почему?