Отсебятина
Кросс-пост четвертого перевода туториалов по Google Maps API из моего блога.
Этот туториал предназначен для разработчиков, знакомых с PHP и MySQL и желающих узнать, как можно сгенерировать KML-файл, используя данные из MySQL-базы.В этом туториале Вы создадите два скрипта, которые динамически создают KML-файл, содержащий данные о заведениях Сиэтла. Первый скрипт создает набор координат и определяет тип заведения – бар или ресторан – и отмечает их на карте. Когда пользователь кликнет по маркеру, появится инфо-окно, содержащее название и адрес заведения. Задача второго скрипта – соединить все рестораны сплошной линией. Также в этом туториале Вы узнаете, как можно отобразить созданный файл KML при помощи Google Earth.
Этот урок основывается на статье «Использование связки из PHP и MySQL совместно с Google Maps», написанной Памелой Фокс и показывающей, как экспортировать данные из таблицы БД в Google Maps, используя PHP. Вы можете пропустить первые два шага этого туториала, если Вы уже прочитали статью Памелы. Остальные же шаги весьма отличаются от того, что было описано в вышеуказанной статье – мы, все-таки, будем иметь дело с KML.
Урок разбит на следующие части:
- Создание таблицы БД;
- Наполнение таблицы данными;
- Вывод информации в KML при помощи PHP;
- Отображение KML-файла;
- Что еще можно придумать.

Шаг 1: Создание таблицы
Примечание: в этом уроке используются места, значения широты и долготы которых уже известно и используются для нанесения маркеров на карту. Если же Вы попробуете использовать свою информацию, не имея данных о координатах места, то воспользуйтесь сервисом геокодинга для преобразования адреса места в его координаты. Вот список некоторых геокодинг-сервисов: http://groups.google.com/group/Google-Maps-API/web/resources-non-google-geocoders.
Если Вы предпочитаете создавать таблицы в БД с помощью phpMyAdmin, то ниже расположен скриншот создания таблицы:

Если же Вы не имеете доступ к phpMyAdmin или отдаете предпочтение чистому SQL, то ниже приведен код SQL-запроса:
CREATE TABLE `markers` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
`name` VARCHAR( 60 ) NOT NULL,
`address` VARCHAR( 80 ) NOT NULL,
`lat` FLOAT( 10, 6 ) NOT NULL,
`lng` FLOAT( 10, 6 ) NOT NULL,
`type` VARCHAR( 30 ) NOT NULL
) ENGINE = MYISAM ;
Шаг 2: Наполнение таблицы
После создания таблицы пришло время наполнить ее информацией. Данные о 10 заведениях Сиэтла приведены ниже. В phpMyAdmin Вы можете использовать опцию ИМПОРТ для того, чтобы вставить в таблицу данные, хранящиеся в различных форматах, включая и CSV. Приложения MS Excel и Google Spreadsheets поддерживают экспорт данных в CSV-формат. Так что Вы легко можете передавать данные из этих приложений в БД MySQL, используя опции экспорта/импорта.
Вот информация, представленная в формате CSV:
Pan Africa Market," 1521 1st Ave, Seattle, WA",47.608941,-122.340145,restaurant
Buddha Thai & Bar," 2222 2nd Ave, Seattle, WA",47.613591,-122.344394,bar
The Melting Pot," 14 Mercer St, Seattle, WA",47.624562,-122.356442,restaurant
Ipanema Grill," 1225 1st Ave, Seattle, WA",47.606366,-122.337656,restaurant
Sake House," 2230 1st Ave, Seattle, WA",47.612825,-122.34567,bar
Crab Pot," 1301 Alaskan Way, Seattle, WA",47.605961,-122.34036,restaurant
Mama's Mexican Kitchen," 2234 2nd Ave, Seattle, WA ",47.613975,-122.345467,bar
Wingdome," 1416 E Olive Way, Seattle, WA",47.617215,-122.326584,bar
Piroshky Piroshky," 1908 Pike pl, Seattle, WA",47.610127,-122.342838,restaurant
А вот скриншот, показывающий импорт данных из CSV в таблицу БД:

Если же Вы не используете phpMyAdmin, то ниже расположен код запроса к БД на языке SQL:
INSERT INTO `markers` (`name`, `address`, `lat`, `lng`, `type`) VALUES ('Pan Africa Market', '1521 1st Ave, Seattle, WA', '47.608941', '-122.340145', 'restaurant');
INSERT INTO `markers` (`name`, `address`, `lat`, `lng`, `type`) VALUES ('Buddha Thai & Bar', '2222 2nd Ave, Seattle, WA', '47.613591', '-122.344394', 'bar');
INSERT INTO `markers` (`name`, `address`, `lat`, `lng`, `type`) VALUES ('The Melting Pot', '14 Mercer St, Seattle, WA', '47.624562', '-122.356442', 'restaurant');
INSERT INTO `markers` (`name`, `address`, `lat`, `lng`, `type`) VALUES ('Ipanema Grill', '1225 1st Ave, Seattle, WA', '47.606366', '-122.337656', 'restaurant');
INSERT INTO `markers` (`name`, `address`, `lat`, `lng`, `type`) VALUES ('Sake House', '2230 1st Ave, Seattle, WA', '47.612825', '-122.34567', 'bar');
INSERT INTO `markers` (`name`, `address`, `lat`, `lng`, `type`) VALUES ('Crab Pot', '1301 Alaskan Way, Seattle, WA', '47.605961', '-122.34036', 'restaurant');
INSERT INTO `markers` (`name`, `address`, `lat`, `lng`, `type`) VALUES ('Mama Mexican Kitchen', '2234 2nd Ave, Seattle, WA', '47.613975', '-122.345467', 'bar');
INSERT INTO `markers` (`name`, `address`, `lat`, `lng`, `type`) VALUES ('Wingdome', '1416 E Olive Way, Seattle, WA', '47.617215', '-122.326584', 'bar');
INSERT INTO `markers` (`name`, `address`, `lat`, `lng`, `type`) VALUES ('Piroshky Piroshky', '1908 Pike pl, Seattle, WA', '47.610127', '-122.342838', 'restaurant');
Шаг 3: Вывод информации в KML при помощи PHP
К этому моменту у Вас должна быть таблица (которая называется markers) базы данных, заполненная данными. Сейчас Вам нужно написать некоторый PHP-код, который позволит подключиться к БД, взять из нее необходимую информацию и экспортировать ее в KML-файл. Если же Вы никогда не писали на PHP код, позволяющий подключиться к БД, то Вам необходимо посетить сайт php.net и почитать о функциях mysql_connect()
, mysql_select_db()
, my_sql_query()
, и mysql_error()
.
Теперь Вы должны вынести информацию о подключении к БД в отдельный файл. Ниже приведен PHP-код, в котором Вы должны прописать собственные имя пользователя, пароль и имя БД:
<?
$username="username";
$password="password";
$database="username-databaseName";
?>
Использование DOM-функций PHP5 для генерации файла KML
Вот как раз с этого момента и пойдет новый материал. В предыдущей статье Памела представила Вам код на PHP4, в котором использовалось расширение dom_xml
для создания простого файла с маркерами, который впоследствии обрабатывался с помощью JavaScript. В этом туториале Вам необходимо получить KML-файл. Вместо того, чтобы производить парсинг KML при помощи JavaScript, мы сразу же построим этот файл при помощи специфических тэгов Placemark. Далее будут показаны оба способа формирования файла KML: с помощью встроенного DOM-функционала в PHP5 и с помощью расширения dom_xml
в PHP4.
Для начала, проверьте работает ли DOMDocument()
на вашем PHP-сервере. Если же DOM-функционал отключен, то можно попробовать создать XML-файл, как это описано в статье Памелы. Или использовать методы создания KML, показанные ниже.
Если Вы все же решили использовать DOM-функции, то начнем создавать маркеры для каждой строки из таблицы БД. Для начала, необходимо инициализировать новый XML-документ и создадим в нем родительский узел “kml”. Добавим к нему пространство имен KML в качестве атрибута. После создания базового тэга KML <document>
, Вы должны создать два стиля – один для ресторанов, другой для баров – которые впоследствии будут представлять маркеры через тэг <styleURL>
.
Далее подключаемся к базе данных и выполняем запрос вида SELECT *
(выбрать все) к таблице с маркерами и проходимся по всем результатам этой выборки. Для каждой строки таблицы создаем элемент <Placemark>
. Извлеченную из базы данных информацию используем для создания дочерних элементов для <Placemark>
таких, как <name>
, <description>
, <styleURL>
, <Point>
. Значение, записанное в тэге <styleURL>
будет зависеть от значения записи type
. После добавьте к <Placemark>
дочерний элемент <coordinates>
, и в качестве значения этого элемента запишем координаты заведения, содержащиеся в полях lat
и lng
.
Нижерасположенный PHP-код создает KML-файл с соответствующим HTML-заголовком. После генерации KML-файла Вы должны проверить этот файл на наличие ошибок.
<?php
require('phpsqlajax_dbinfo.php');
// Открываем соединение с MySQL-сервером.
$connection = mysql_connect ($server, $username, $password);
if (!$connection)
{
die('Нет подключения : ' . mysql_error());
}
// Выбираем активную БД.
$db_selected = mysql_select_db($database, $connection);
if (!$db_selected)
{
die('Невозможно использовать БД : ' . mysql_error());
}
// Выбираем все строки в таблице markers.
$query = 'SELECT * FROM markers WHERE 1';
$result = mysql_query($query);
if (!$result)
{
die('Неверный запрос: ' . mysql_error());
}
// Создаем документ.
$dom = new DOMDocument('1.0', 'UTF-8');
// Создаем главный узел KML и присоединяем его к документу.
$node = $dom->createElementNS('http://earth.google.com/kml/2.1', 'kml');
$parNode = $dom->appendChild($node);
// Создаем элемент Document и присоединяем его к элементу KML.
$dnode = $dom->createElement('Document');
$docNode = $parNode->appendChild($dnode);
// Создаем два стиля: один для ресторанов, другой для баров. И присоединяем их к элементу KML.
$restStyleNode = $dom->createElement('Style');
$restStyleNode->setAttribute('id', 'restaurantStyle');
$restIconstyleNode = $dom->createElement('IconStyle');
$restIconstyleNode->setAttribute('id', 'restaurantIcon');
$restIconNode = $dom->createElement('Icon');
$restHref = $dom->createElement('href', 'http://maps.google.com/mapfiles/kml/pal2/icon63.png');
$restIconNode->appendChild($restHref);
$restIconstyleNode->appendChild($restIconNode);
$restStyleNode->appendChild($restIconstyleNode);
$docNode->appendChild($restStyleNode);
$barStyleNode = $dom->createElement('Style');
$barStyleNode->setAttribute('id', 'barStyle');
$barIconstyleNode = $dom->createElement('IconStyle');
$barIconstyleNode->setAttribute('id', 'barIcon');
$barIconNode = $dom->createElement('Icon');
$barHref = $dom->createElement('href', 'http://maps.google.com/mapfiles/kml/pal2/icon27.png');
$barIconNode->appendChild($barHref);
$barIconstyleNode->appendChild($barIconNode);
$barStyleNode->appendChild($barIconstyleNode);
$docNode->appendChild($barStyleNode);
// Проходимся по результатам выборки данных из БД и для каждой строки создаем элемент Placemark.
while ($row = @mysql_fetch_assoc($result))
{
// Создаем элемент Placemark и присоединяем его к элемент Document.
$node = $dom->createElement('Placemark');
$placeNode = $docNode->appendChild($node);
// Создаем атрибут id.
$placeNode->setAttribute('id', 'placemark' . $row['id']);
// Создаем элементы name и description и присваиваем им значения из результатов выборки.
$nameNode = $dom->createElement('name',htmlentities($row['name']));
$placeNode->appendChild($nameNode);
$descNode = $dom->createElement('description', $row['address']);
$placeNode->appendChild($descNode);
$styleUrl = $dom->createElement('styleUrl', '#' . $row['type'] . 'Style');
$placeNode->appendChild($styleUrl);
// Создаем жлемент Point.
$pointNode = $dom->createElement('Point');
$placeNode->appendChild($pointNode);
// Создаем элемент coordinates.
$coorStr = $row['lng'] . ',' . $row['lat'];
$coorNode = $dom->createElement('coordinates', $coorStr);
$pointNode->appendChild($coorNode);
}
$kmlOutput = $dom->saveXML();
header('Content-type: application/vnd.google-earth.kml+xml');
echo $kmlOutput;
?>
Использование расширения
dom_xml
PHP4Код на PHP4, использующий расширение dom_xml, очень похож на код, написанный выше:
<?php
require('phpsqlajax_dbinfo.php');
// Открываем соединение с MySQL-сервером.
$connection=mysql_connect ($server, $username, $password);
if (!$connection)
{
die('Нет подключения : ' . mysql_error());
}
// Выбираем активную БД.
$db_selected = mysql_select_db($database, $connection);
if (!$db_selected)
{
die ('Невозможно использовать БД : ' . mysql_error());
}
// Выбираем все строки в таблице markers.
$query = 'SELECT * FROM markers WHERE 1';
$result = mysql_query($query);
if (!$result)
{
die('Неверный запрос: ' . mysql_error());
}
// Создаем документ.
$dom = new domxml_new_doc('1.0');
// Создаем главный узел KML и присоединяем его к документу.
$node = $dom->create_element_ns('http://earth.google.com/kml/2.1', 'kml');
$parNode = $dom->append_child($node);
// Создаем элемент Document и присоединяем его к элементу KML.
$dnode = $dom->create_element('Document');
$docNode = $parNode->append_child($dnode);
//Создаем два элемента со стилями: один - для ресторанов, второй - для баров.
$restStyleNode = $dom->create_element('Style');
$restStyleNode->set_attribute('id', 'restaurantStyle');
$restIconstyleNode = $dom->create_element('IconStyle');
$restIconstyleNode->set_attribute('id', 'restaurantIcon');
$restIconNode = $dom->create_element('Icon');
$restHref = $dom->create_element('href', 'http://maps.google.com/mapfiles/kml/pal2/icon63.png');
$restIconNode->append_child($restHref);
$restIconstyleNode->append_child($restIconNode);
$restStyleNode->append_child($restIconstyleNode);
$docNode->append_child($restStyleNode);
$barStyleNode = $dom->create_element('Style');
$barStyleNode->set_attribute('id', 'barStyle');
$barIconstyleNode = $dom->create_element('IconStyle');
$barIconstyleNode->set_attribute('id', 'barIcon');
$barIconNode = $dom->create_element('Icon');
$barHref = $dom->create_element('href', 'http://maps.google.com/mapfiles/kml/pal2/icon27.png');
$barIconNode->append_child($barHref);
$barIconstyleNode->append_child($barIconNode);
$barStyleNode->append_child($barIconstyleNode);
$docNode->append_child($barStyleNode);
// Проходимся по результатам выборки данных из БД и для каждой строки создаем элемент Placemark.
while ($row = @mysql_fetch_assoc($result))
{
// Создаем элемент Placemark и присоединяем его к элемент Document.
$node = $dom->create_element('Placemark');
$placeNode = $docNode->append_child($node);
// Создаем атрибут id.
$placeNode->set_attribute('id', 'placemark' . $row['id']);
// Создаем элементы name и description и присваиваем им значения из результатов выборки.
$nameNode = $dom->create_element('name',htmlentities($row['name']));
$placeNode->append_child($nameNode);
$descNode = $dom-> create_element('description', $row['address']);
$placeNode->append_child($descNode);
$styleUrl = $dom->create_element('styleUrl', '#' . $row['type'] . 'Style');
$placeNode->append_child($styleUrl);
// Создаем жлемент Point.
$pointNode = $dom->create_element('Point');
$placeNode->append_child($pointNode);
// Создаем элемент coordinates.
$coorStr = $row['lng'] . ',' . $row['lat'];
$coorNode = $dom->create_element('coordinates', $coorStr);
$pointNode->append_child($coorNode);
}
$kmlOutput = $dom->dump_mem(TRUE, 'UTF-8');
header('Content-type: application/vnd.google-earth.kml+xml');
echo $kmlOutput;
?>
Как Вы могли заметить, все различие заключено лишь в названии функции, отвечающей за создание XML-элемента (createElement
). В PHP4 это название пишется в нижнем регистре и с символом «_», необходимым для разделения слов в имени функции.
Исключение составляет имя функции, инициализирующей новый документ: в PHP5 она именуется DOMDocument
, а в PHP4 – domxml_new_doc
.
Использование функции PHP
echo
для вывода KMLЕсли Вы не имеете доступа к DOM-функционалу PHP, то можно использовать функцию echo для вывода информации в KML-форме.
- Подключаемся к БД и выполняем запрос вида
SELECT *
к таблице с маркерами; - Создаем строковый массив, в элементах которого будет содержаться основная структура KML-документа;
- Проходимся по результатам выборки данных из БД и добавляем их к массиву;
- Для каждой записи таблицы создаем элемент
<Placemark>
и передаем ему значения названия заведения и его адреса через функциюhtmlentities
, чтобы исключить вхождение специальных символов; - Соединяем все элементы массива в одну строку, придаем заголовок файлу и выводим полученную нами строку.
Код соответствующего скрипта:
<?php
require('phpsqlajax_dbinfo.php');
// Открываем соединение с MySQL-сервером.
$connection = mysql_connect ($server, $username, $password);
if (!$connection)
{
die('Нет подключения : ' . mysql_error());
}
// Выбираем активную БД.
$db_selected = mysql_select_db($database, $connection);
if (!$db_selected)
{
die ('Невозможно использовать БД : ' . mysql_error());
}
// Выбираем все строки в таблице markers.
$query = 'SELECT * FROM markers WHERE 1';
$result = mysql_query($query);
if (!$result)
{
die('Неверный запрос: ' . mysql_error());
}
// Создаем строковый массив.
$kml = array('<? xml version="1.0" encoding="UTF-8"?>');
$kml[] = '<kml xmlns="http://earth.google.com/kml/2.1">';
$kml[] = ' <Document>';
$kml[] = ' <Style id="restaurantStyle">';
$kml[] = ' <IconStyle id="restuarantIcon">';
$kml[] = ' <Icon>';
$kml[] = ' <href>http://maps.google.com/mapfiles/kml/pal2/icon63.png</href>';
$kml[] = ' </Icon>';
$kml[] = ' </IconStyle>';
$kml[] = ' </Style>';
$kml[] = ' <Style id="barStyle">';
$kml[] = ' <IconStyle id="barIcon">';
$kml[] = ' <Icon>';
$kml[] = ' <href>http://maps.google.com/mapfiles/kml/pal2/icon27.png</href>';
$kml[] = ' </Icon>';
$kml[] = ' </IconStyle>';
$kml[] = ' </Style>';
// Проходимся по результатам выборки.
while ($row = @mysql_fetch_assoc($result))
{
$kml[] = ' <Placemark id="placemark' . $row['id'] . '">';
$kml[] = ' <name>' . htmlentities($row['name']) . '</name>';
$kml[] = ' <description>' . htmlentities($row['address']) . '</description>';
$kml[] = ' <styleUrl>#' . ($row['type']) .'Style</styleUrl>';
$kml[] = ' <Point>';
$kml[] = ' <coordinates>' . $row['lng'] . ',' . $row['lat'] . '</coordinates>';
$kml[] = ' </Point>';
$kml[] = ' </Placemark>';
}
// Завершаем XML-файл
$kml[] = ' </Document>';
$kml[] = '</kml>';
$kmlOutput = join("\n", $kml);
header('Content-type: application/vnd.google-earth.kml+xml');
echo $kmlOutput;
?>
Проверяем правильность полученного KML-файла
Вызовем наш скрипт и проверим правильность отображения KML в браузере. Если все в порядке, то Вы должны увидеть нечто, похожее на это:
<?xml version="1.0" encoding=«UTF-8»?>
<kml xmlns = "http://earth.google.com/kml/2.1">
<Document>
<Style id="restaurantStyle">
<IconStyle id="restuarantIcon">
<Icon>
<href>http://maps.google.com/mapfiles/kml/pal2/icon63.png</href>
</Icon>
</IconStyle>
</Style>
<Style id="barStyle">
<IconStyle id="barIcon">
<Icon>
<href>http://maps.google.com/mapfiles/kml/pal2/icon27.png</href>
</Icon>
</IconStyle>
</Style>
<Placemark id="placemark1">
<name>Pan Africa Market</name>
<description>1521 1st Ave, Seattle, WA</description>
<styleUrl>#restaurantStyle</styleUrl>
<Point>
<coordinates>-122.340141,47.608940</coordinates>
</Point>
</Placemark>
<Placemark id="placemark2">
<name>Buddha Thai & Bar</name>
<description>2222 2nd Ave, Seattle, WA</description>
<styleUrl>#barStyle</styleUrl>
<Point>
<coordinates>-122.344391,47.613590</coordinates>
</Point>
</Placemark>
<Placemark id="placemark3">
<name>The Melting Pot</name>
<description>14 Mercer St, Seattle, WA</description>
<styleUrl>#restaurantStyle</styleUrl>
<Point>
<coordinates>-122.356445,47.624561</coordinates>
</Point>
</Placemark>
<Placemark id="placemark4">
<name>Ipanema Grill</name>
<description>1225 1st Ave, Seattle, WA</description>
<styleUrl>#restaurantStyle</styleUrl>
<Point>
<coordinates>-122.337654,47.606365</coordinates>
</Point>
</Placemark>
<Placemark id="placemark5">
<name>Sake House</name>
<description>2230 1st Ave, Seattle, WA</description>
<styleUrl>#barStyle</styleUrl>
<Point>
<coordinates>-122.345673,47.612823</coordinates>
</Point>
</Placemark>
<Placemark id="placemark6">
<name>Crab Pot</name>
<description>1301 Alaskan Way, Seattle, WA</description>
<styleUrl>#restaurantStyle</styleUrl>
<Point>
<coordinates>-122.340363,47.605961</coordinates>
</Point>
</Placemark>
<Placemark id="placemark7">
<name>Mama's Mexican Kitchen</name>
<description>2234 2nd Ave, Seattle, WA</description>
<styleUrl>#barStyle</styleUrl>
<Point>
<coordinates>-122.345467,47.613976</coordinates>
</Point>
</Placemark>
<Placemark id="placemark8">
<name>Wingdome</name>
<description>1416 E Olive Way, Seattle, WA</description>
<styleUrl>#barStyle</styleUrl>
<Point>
<coordinates>-122.326584,47.617214</coordinates>
</Point>
</Placemark>
<Placemark id="placemark9">
<name>Piroshky Piroshky</name>
<description>1908 Pike pl, Seattle, WA</description>
<styleUrl>#restaurantStyle</styleUrl>
<Point>
<coordinates>-122.342834,47.610126</coordinates>
</Point>
</Placemark>
</Document>
</kml>
Создаем линию
Одной из замечательных особенностью БД является возможность комбинировать информацию, содержащуюся в них. Например, имея данные о координатах можно легко составить из них необходимую последовательность — линию. Напишем скрипт, который создает структуру одного элемента <Placemark>
. Поместим <linestring>
внутрь <Placemark>
. Затем выполним запрос к базе данных и произведем выборку координат по полю id
.
Это PHP-код, который создает линию, соединяющую все рестораны:
<?php
require('phpsqlajax_dbinfo.php');
// Открываем соединение с MySQL-сервером
$connection = mysql_connect ($server, $username, $password);
if (!$connection)
{
die('Нет подключения : ' . mysql_error());
}
// Подключаемся к БД
$db_selected = mysql_select_db($database, $connection);
if (!$db_selected)
{
die ('Невозможно использовать БД : ' . mysql_error());
}
// Производим выборку всех строк из таблицы markers
$query = " SELECT GROUP_CONCAT(lng, ',', lat, ',', '100' separator ' ') AS coordinates FROM markers WHERE type = 'restaurant';";
$result = mysql_query($query);
if (!$result)
{
die('Неверный запрос: ' . mysql_error());
}
// Начало KML-файла, создаем родительский узел
$dom = new DOMDocument('1.0','UTF-8');
//Создаем управляющий элемент KML и присоединяем его к Document
$node = $dom->createElementNS('http://earth.google.com/kml/2.1','kml');
$parNode = $dom->appendChild($node);
//Создаем элемент Folder
$fnode = $dom->createElement('Folder');
$folderNode = $parNode->appendChild($fnode);
//Проходимся по результатам выборки
$row = @mysql_fetch_assoc($result);
//Создаем элементы Placemark
$node = $dom->createElement('Placemark');
$placeNode = $folderNode->appendChild($node);
//Создаем атрибут id
$placeNode->setAttribute('id','linestring1');
//Создаем элементы name, description и adress
$nameNode = $dom->createElement('name','My path');
$placeNode->appendChild($nameNode);
$descNode= $dom->createElement('description', 'This is the path that I took through my favorite restaurants in Seattle');
$placeNode->appendChild($descNode);
//Создаем элемент LineString
$lineNode = $dom->createElement('LineString');
$placeNode->appendChild($lineNode);
$exnode = $dom->createElement('extrude', '1');
$lineNode->appendChild($exnode);
$almodenode =$dom->createElement(altitudeMode,'relativeToGround');
$lineNode->appendChild($almodenode);
//Создаем элемент coordinates
$coorNode = $dom->createElement('coordinates',$row['coordinates']);
$lineNode->appendChild($coorNode);
$kmlOutput = $dom->saveXML();
//Выдаем заголовок KML
header('Content-type: application/vnd.google-earth.kml+xml');
echo $kmlOutput;
?>
Должно получиться что-то похожее на это:
<?xml version='1.0' encoding='UTF-8'?>
<kml xmlns='http://earth.google.com/kml/2.1'>
<Folder>
<Placemark id='linestring1'>
<name>My path</name>
<description>This is the path that I took through my favorite restaurants in Seattle</description>
<LineString>
<extrude>1</extrude>
<altitudeMode>relativeToGround</altitudeMode>
<coordinates>-122.340141,47.608940,100 -122.356445,47.624561,100
-122.337654,47.606365,100 -122.340363,47.605961,100
-122.342834,47.610126,100
</coordinates>
</LineString>
</Placemark>
</Folder>
</kml>
Шаг 4: Отображаение KML-файла
Отображение в Google Earth
Вы можете легко и просто отобразить эти данные в Google Earth. Самый простой способ – это создание NetworkLink-файла, указывающего на скрипт. Если Вы часто обновляете информацию, то можно задать время обновления. Вот пример файла, который будет работать так, как надо:
<?xml version='1.0' encoding='UTF-8'?>
<kml xmlns = 'http://earth.google.com/kml/2.1'>
<Folder>
<NetworkLink>
<Link>
<href>http://example.com/phpsql_genkml.kml</href>
<refreshMode>onInterval</refreshMode>
<refreshInterval>3600</refreshInterval>
</Link>
</NetworkLink>
<NetworkLink>
<Link>
<href>http://example.com/phpsql_genkml_ls.kml</href>
<refreshMode>onInterval</refreshMode>
<refreshInterval>3600</refreshInterval>
</Link>
</NetworkLink>
</Folder>
</kml>
Элемент <href> отвечает за расположение KML-файла на сервере.

Чтобы отобразить этот файл в Google Maps, Вам нужно добавить ссылку на этот скрипт или же на NetworkLink-файл. Например:
function load()
{
var map;
var geoXml;
if (GBrowserIsCompatible())
{
map = new GMap2(document.getElementById('map'));
map.addControl(new GSmallMapControl());
map.addControl(new GMapTypeControl());
geoXml = new GGeoXml('http://example.com/phpmysql_kmlnl.kml');
map.addOverlay(geoXml);
map.setCenter(new GLatLng(47.613976,-122.345467), 13);
}
}
Карты должна выглядеть примерно так:

Шаг 5: Что еще можно придумать
Что же еще можно сделать с имеющейся БД? БД хороши тем, Вы можете добавить к базе данных какие угодно данные. А формат KML хорош тем, что он может разбавить содержимое ваших карт. Если соединить это вместе, то можно сделать что-нибудь интересненькое.
И это получится намного лучше, чем, если бы Вы использовали только KML. Используйте некоторые уникальные возможности Google Earth, такие, как файлы <NetworkLink>
, использующие <viewFormat>
. Эта функция позволяет отсылать какие-либо параметры Вашему скрипту. Еще Вы можете использовать эту функцию для модификации возвращаемых данных. Или используйте <TimeStamp>
или <TimeSpan>
, которые позволяют сделать анимацию для ваших меток. Также можно создать таблицу БД с более сложной структурой, в которой будут храниться данные о многоугольниках <Polygons>
, которые тоже можно отображать на карте. Или создайте страницу, с помощью которой другие люди тоже смогут добавлять новые данные на Вашу карту. Вам предоставлены бесконечные возможности!