На страницах своего блога я рассказывал уже о том, как можно вывести данные на карту Google Maps, используя PHP и MySQL.
В этой заметке я продолжу рассказ об этой теме, я расскажу, как можно вывести в информационное окно (балун) html-код: картинку и ссылку на сайт.
В начале, мы в базе данных создадим таблицу markers , в которой будем хранить информацию о метках.
Это можно сделать, используя утилиту PhpMyAdmin выполнив следующий SQL-код:
CREATE TABLE IF NOT EXISTS `markers` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) NOT NULL, `address` varchar(255) NOT NULL, `ssilka` varchar(255) NOT NULL, `images` varchar(255) NOT NULL, `lat` float(10,6) NOT NULL, `lng` float(10,6) NOT NULL, `type` varchar(255) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; |
Здесь, id – уникальный идентификатор записи, name – служит для хранения названия метки, address – адрес метки, ssilka — адрес для гиперссылки, images — адрес файла с изображением, поля lat и lng – служат для хранения значений широты и долготы соответственно, type – тип объекта.
Добавим в таблицу предварительно мной подготовленные данные.
Это также можно сделать, используя утилиту PhpMyAdmin выполнив следующий SQL-код:
INSERT INTO `markers` (`id`, `name`, `address`, `ssilka`, `images`, `lat`, `lng`, `type`) VALUES (1, 'Кинотеатр Канавинский', 'ул. Фильченкова, 7', 'http://centerfilm.ru.proton.mtw.ru/kt/detail.php?ID=1851', 'images/kanavinskiy.jpg', 43.944336, 56.317978, 'kinoteatr'), (2, 'Кинотеатр Синема Парк', 'ул. Родионова, 187', 'http://www.cinemapark.ru', 'images/sinimapark.jpg', 44.073826, 56.308056, 'kinoteatr'), (3, 'Кинотеатр КАРО ФИЛЬМ в ТЦ Шоколад', 'ул. Белинского, 124', 'http://www.karofilm.ru/cgi-bin/show.pl?option=cinema_description&id=19', 'images/chocolate_1.jpg', 44.026299, 56.319271, 'kinoteatr'), (4, 'Комедия, Нижегородский театр', 'Грузинская ул., 23', 'http://comedia.nnov.ru/', 'images/comedia.jpg', 44.002319, 56.320202, 'teatr'), (5, 'Нижегородский государственный академический театр оперы и балета им. А. С. Пушкина', 'Белинского ул., 59', 'http://www.opera.nnov.ru/', 'images/operteatr.jpg', 44.017063, 56.315697, 'teatr'), (6, 'Нижегородский театр юного зрителя', 'Горького Максима ул., 145', 'http://www.tyuz.ru/', 'images/tyuz.jpg', 44.010487, 56.316444, 'teatr'); |
После этого формируем XML-файл с данными с последующем выводом маркеров на карту Google Maps.
В начале, мы должны получить XML-файл с параметрами маркеров из базы данных MySQL.
Для соединения с базой данных используем файл phpsqlinfo_dbinfo.php из заметки Google Maps – добавление меток на карту пользователями
Для этого я использую самый простой способ – применение оператора echo.
Привожу код файла:
<?php
require("phpsqlinfo_dbinfo.php");
function parseToXML($htmlStr)
{
$xmlStr=str_replace('<','<',$htmlStr);
$xmlStr=str_replace('>','>',$xmlStr);
$xmlStr=str_replace('"','"',$xmlStr);
$xmlStr=str_replace("'",''',$xmlStr);
$xmlStr=str_replace("&",'&',$xmlStr);
return $xmlStr;
}
// Выбираем данные о маркерах из таблицы
$query = "SELECT * FROM markers WHERE 1";
$result = mysql_query($query);
if (!$result) {
die('Invalid query: ' . mysql_error());
}
header("Content-type: text/xml");
// Начало XML-файла, вывод с помощью echo
echo '<markers>';
// Повторяем вывод для каждой записи
while ($row = @mysql_fetch_assoc($result)){
// ADD TO XML DOCUMENT NODE
echo '<marker ';
echo 'name="' . parseToXML($row['name']) . '" ';
echo 'address="' . parseToXML($row['address']) . '" ';
echo 'ssilka="' . parseToXML($row['ssilka']) . '" ';
echo 'images="' . parseToXML($row['images']) . '" ';
echo 'lat="' . $row['lng'] . '" ';
echo 'lng="' . $row['lat'] . '" ';
echo 'type="' . $row['type'] . '" ';
echo '/>';
}
//Конец XML-файла
echo '</markers>';
?> |
После того как Вы получили XML-файл с данными необходимо создать карту , используя JavaScript и подгрузить его на нее.
Для того, чтобы загрузить XML-файл на страницу, необходимо использовать API-функцию GDownloadURL. GDownloadURL является как бы оболочкой для метода XMLHttpRequest, который используется для отправки запросов в XML-форме. Первым параметром функции GDownloadURL является путь к XML-файлу. Второй же параметр – это функция, которая будет выполняться при получении ответа от XML.
Примечание: очень важно понять, что GDownloadURL работает асинхронно – функция, являющаяся вторым параметром GDownloadURL, не будет срабатывать, как только Вы применили этот метод. Чем объемней Ваш XML-файл, тем больше потребуется времени для вызова этой функции-параметра. Не следует помещать никакого кода, отвечающего за размещение маркеров на карте, после метода GDownloadURL – его нужно помещать в функцию-параметр.
Функция-параметр необходима для того, чтобы отыскать все элементы “markers” в XML. Для каждого маркера мы восстанавливаем значения названия, адреса, изображения, ссылки, типа и координат, а затем мы передаем эти значения функции creatMarker, которая помещает маркеры на карту.
GDownloadUrl("phpsqlajax_genxml.php", function(data) {
var xml = GXml.parse(data);
var markers = xml.documentElement.getElementsByTagName("marker");
for (var i = 0; i < markers.length; i++) {
var name = markers[i].getAttribute("name");
var address = markers[i].getAttribute("address");
var ssilka = markers[i].getAttribute("ssilka");
var images = markers[i].getAttribute("images");
var type = markers[i].getAttribute("type");
var point = new GLatLng(parseFloat(markers[i].getAttribute("lat")),
parseFloat(markers[i].getAttribute("lng")));
var marker = createMarker(point, name, address, ssilka, images, type);
map.addOverlay(marker);
}
}); |
Далее задаем иконки для маркеров аналогично заметке – Организация вывода данных на карту Google Maps, используя PHP и MySQL
После этого мы создаем маркеры и информационные окна.
Вы должны поместить весь код, который необходим для создания маркеров в функцию createMarker. Так как массив customIcons был определен глобально, то мы без помех можем передавать его элементы конструктору класса GMarker. Затем нужно написать HTML-код, который будет отображаться в инфо-окне.
function createMarker(point, name, address, ssilka, images, type) {
var marker = new GMarker(point, customIcons[type]);
var html ='<div style="width: 250px;"><b>' + name +'</b> <br/>' + address+'<br/><img src="'+images+'" with="200"/><br/><a href="'+ssilka+'" target="_blank"/>На сайт</a></div>';
GEvent.addListener(marker, 'click', function() {
marker.openInfoWindowHtml(html);
});
return marker;
} |
Полный код для вывода карты:
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8"/>
<title>Пример вывод данных из базы на карту Google, используя XML-вариант-2</title>
<script src="http://maps.google.com/maps?file=api&v=2&key=ABQIAAAACHCJdlgAEGcD_flKUFEmVhT2yXp_ZAY8_ufC3CFXhHIE1NvwkxTeukKcKHF3ezmjTB0q6gzSBmoIUQ"
type="text/javascript"></script>
<script type="text/javascript">
//<![CDATA[
var iconBlue = new GIcon();
iconBlue.image = 'http://labs.google.com/ridefinder/images/mm_20_blue.png';
iconBlue.shadow = 'http://labs.google.com/ridefinder/images/mm_20_shadow.png';
iconBlue.iconSize = new GSize(12, 20);
iconBlue.shadowSize = new GSize(22, 20);
iconBlue.iconAnchor = new GPoint(6, 20);
iconBlue.infoWindowAnchor = new GPoint(5, 1);
var iconRed = new GIcon();
iconRed.image = 'http://labs.google.com/ridefinder/images/mm_20_red.png';
iconRed.shadow = 'http://labs.google.com/ridefinder/images/mm_20_shadow.png';
iconRed.iconSize = new GSize(12, 20);
iconRed.shadowSize = new GSize(22, 20);
iconRed.iconAnchor = new GPoint(6, 20);
iconRed.infoWindowAnchor = new GPoint(5, 1);
var iconGreen = new GIcon();
iconGreen.image = 'http://labs.google.com/ridefinder/images/mm_20_green.png';
iconGreen.shadow = 'http://labs.google.com/ridefinder/images/mm_20_shadow.png';
iconGreen.iconSize = new GSize(12, 20);
iconGreen.shadowSize = new GSize(22, 20);
iconGreen.iconAnchor = new GPoint(6, 20);
iconGreen.infoWindowAnchor = new GPoint(5, 1)
var customIcons = [];
customIcons["kinoteatr"] = iconBlue;
customIcons["teatr"] = iconRed;
customIcons["cafe"] = iconGreen;
function load() {
if (GBrowserIsCompatible()) {
var map = new GMap2(document.getElementById("map"));
map.addControl(new GSmallMapControl());
map.addControl(new GMapTypeControl());
map.setCenter(new GLatLng(56.31,44.01), 13);
GDownloadUrl("phpsqlajax_genxml.php", function(data) {
var xml = GXml.parse(data);
var markers = xml.documentElement.getElementsByTagName("marker");
for (var i = 0; i < markers.length; i++) {
var name = markers[i].getAttribute("name");
var address = markers[i].getAttribute("address");
var ssilka = markers[i].getAttribute("ssilka");
var images = markers[i].getAttribute("images");
var type = markers[i].getAttribute("type");
var point = new GLatLng(parseFloat(markers[i].getAttribute("lat")),
parseFloat(markers[i].getAttribute("lng")));
var marker = createMarker(point, name, address, ssilka, images, type);
map.addOverlay(marker);
}
});
}
}
function createMarker(point, name, address, ssilka, images, type) {
var marker = new GMarker(point, customIcons[type]);
var html ='<div style="width: 250px;"><b>' + name +'</b> <br/>' + address+'<br/><img src="'+images+'" with="200"/><br/><a href="'+ssilka+'" target="_blank"/>На сайт</a></div>';
GEvent.addListener(marker, 'click', function() {
marker.openInfoWindowHtml(html);
});
return marker;
}
//]]>
</script>
</head>
<body onload="load()" onunload="GUnload()">
<div id="map" style="width: 800px; height: 600px"></div>
<p><a href="/?p=247" title="Организация вывода данных на карту Google Maps, используя PHP и MySQL" target="_blank">Вернуться к тексту заметки</a></p>
</body>
</html> |
Загружаем нашу карту в браузере и наблюдаем
Щелкаем по одному из маркеров
Посмотреть пример в действии можно здесь


Спасибо! Я не думал что можно выводить так на карту
Спасибо Вам за информацию.
Вопрос такой:
Вот если надо обработать GPX файл. Это обычный XML.
Предполжим надо выбрать все точки, это делается элементарно с тегом <wpt
Примерно так как Вы писали:
……
GDownloadUrl("phpsqlajax_genxml.php", function(data) {
var xml = GXml.parse(data);
var markers = xml.documentElement.getElementsByTagName("wpt");
for (var i = 0; i < markers.length; i++) {
var name = markers[i].getAttribute("lat");
var address = markers[i].getAttribute("lon");
и так далее…..
Аналочино обрабатывается gpx в случаи с треками, но там другой тег, впрочем это сути не меняет.
Я довольно быстро написал вывод собственных треков и точек на карты Google (через его API)
C треками вообще проблем нет.
Проблема небольшая с точками. Необходимо получить имя точки.
Вот фрагмент GPX:
2010-04-19T06:31:21Z
001
Waypoint
SymbolAndName
Видно что нужно имя в
001
Пока я тупо решаю проблему исправив в блакноте:
То есть искуственно введя атрибут wpt
Cпособ конечно варварский но верный 🙂
К сожалению, потом такой исправленный файл не инпортируется в мапсоурце.
Чего делать? Я просто не понимаю как средствами javaskript (если конечно это возможно) пропарсить xml и получить 001?
В PHP подобная проблема решается несколько проще.
возможно ли таким же способом(с занесением точек ломаной в БД), выводить ломаные линии на карту? заранее, спс.