Pull to refresh

Использование PHP и MySQL для создания KML

Reading time17 min
Views6.1K
Original author: Mano Marks, Google Geo Team

Отсебятина


Кросс-пост четвертого перевода туториалов по Google Maps API из моего блога.

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

Шаг 1: Создание таблицы


Примечание: в этом уроке используются места, значения широты и долготы которых уже известно и используются для нанесения маркеров на карту. Если же Вы попробуете использовать свою информацию, не имея данных о координатах места, то воспользуйтесь сервисом геокодинга для преобразования адреса места в его координаты. Вот список некоторых геокодинг-сервисов: http://groups.google.com/group/Google-Maps-API/web/resources-non-google-geocoders.
Если Вы предпочитаете создавать таблицы в БД с помощью phpMyAdmin, то ниже расположен скриншот создания таблицы:
picture
Если же Вы не имеете доступ к 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 в таблицу БД:
picture
Если же Вы не используете 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-форме.
  1. Подключаемся к БД и выполняем запрос вида SELECT * к таблице с маркерами;
  2. Создаем строковый массив, в элементах которого будет содержаться основная структура KML-документа;
  3. Проходимся по результатам выборки данных из БД и добавляем их к массиву;
  4. Для каждой записи таблицы создаем элемент <Placemark> и передаем ему значения названия заведения и его адреса через функцию htmlentities, чтобы исключить вхождение специальных символов;
  5. Соединяем все элементы массива в одну строку, придаем заголовок файлу и выводим полученную нами строку.
Код соответствующего скрипта:
<?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-файла на сервере.
picture
Чтобы отобразить этот файл в 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);
  }
}

Карты должна выглядеть примерно так:picture

Шаг 5: Что еще можно придумать


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

Articles