На своем блоге «Занимательная веб-картография» я писал заметку «Генерируем файл в формате YmapsML с данными автоматически».
В этой заметке я расскажу как можно этот же код использовать для API Яндекс.Карт 2.х.
Первый пример YmapsML-файла мы возьмем из «Моих карт» Яндекс.Карт.

Вот ссылка на него: http://maps.yandex.ru/export/usermaps/BcVPilYqehBtG-z1TiqfSq78WGuklbNm/
Попробуем вывести его содержимое на карту.

Код нашего примера:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Примеры. Загрузка XML.</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<script src="http://api-maps.yandex.ru/2.0/?load=package.full&lang=ru-RU"
type="text/javascript"></script>
<script type="text/javascript">
ymaps.ready(init);
function init () {
var myMap = new ymaps.Map("map", {
center: [56.326944, 44.0075],
zoom: 12
});
myMap.controls
.add("zoomControl")
.add("mapTools")
.add('typeSelector');
ymaps.geoXml.load('http://maps.yandex.ru/export/usermaps/BcVPilYqehBtG-z1TiqfSq78WGuklbNm/').then(function (res) {
myMap.geoObjects.add(res.geoObjects);
if (res.mapState) {
res.mapState.applyToMap(myMap);
}
});
}
</script>
</head>
<body>
<div id="map" style="width: 800px; height: 600px"></div>
</body>
</html> |
Щелкаем по одной из меток и открывается балун с информацией

Теперь возьмем файл create_ymapsml.php из первого примера заметки «Генерируем файл в формате YmapsML с данными автоматически» и подставим полный путь к нему в код первого примера.
Получим следующий код:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Примеры. Загрузка XML.</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<script src="http://api-maps.yandex.ru/2.0/?load=package.full&lang=ru-RU"
type="text/javascript"></script>
<script type="text/javascript">
ymaps.ready(init);
function init () {
var myMap = new ymaps.Map("map", {
center: [56.326944, 44.0075],
zoom: 12
});
myMap.controls
.add("zoomControl")
.add("mapTools")
.add('typeSelector');
ymaps.geoXml.load('http://webmap-blog.ru/examples/ymap-ymapsml/create_ymapsml.php').then(function (res) {
myMap.geoObjects.add(res.geoObjects);
if (res.mapState) {
res.mapState.applyToMap(myMap);
}
});
}
</script>
</head>
<body>
<div id="map" style="width: 800px; height: 600px"></div>
</body>
</html> |

Как видите наш код работает без изменений.
Теперь попробуем отобразить второй пример из заметки «Генерируем файл в формате YmapsML с данными автоматически».
Для этого будем использовать код файла create_ymapsml-2.php, скопируем его в нашу рабочую директорию на сервере и немного поправим, чтобы окончательно он имел следующий код:
<?php
header("Content-type: text/xml");
include("bd.php");
$styleorg = array("#styleHotels", "#styleTrain", "#styleInternetcafe", "#styleCafe", "#styleCinema", "#styleMuseum", "#styleParks", "#styleShips", "#styleTheater", "#styleTurism", "#styleFitness");
echo '<ymaps xmlns="http://maps.yandex.ru/ymaps/1.x" xmlns:gml="http://www.opengis.net/gml" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maps.yandex.ru/schemas/ymaps/1.x/ymaps.xsd">
<Representation xmlns="http://maps.yandex.ru/representation/1.x">
<Style gml:id="commonStyle">
<iconStyle>
<size x="32" y="37"/>
<offset x="-16" y="-18"/>
</iconStyle>
<balloonContentStyle>
<template>#balloonTemplate</template>
</balloonContentStyle>
</Style>
<Style gml:id="styleHotels">
<parentStyle>#commonStyle</parentStyle>
<iconStyle>
<href>http://webmap-blog.ru/examples/ymap-ymapsml/images/hotel.png</href>
</iconStyle>
</Style>
<Style gml:id="styleTrain">
<parentStyle>#commonStyle</parentStyle>
<iconStyle>
<href>http://webmap-blog.ru/examples/ymap-ymapsml/images/train.png</href>
</iconStyle>
</Style>
<Style gml:id="styleInternetcafe">
<parentStyle>#commonStyle</parentStyle>
<iconStyle>
<href>http://webmap-blog.ru/examples/ymap-ymapsml/images/internet.png</href>
</iconStyle>
</Style>
<Style gml:id="styleCafe">
<parentStyle>#commonStyle</parentStyle>
<iconStyle>
<href>http://webmap-blog.ru/examples/ymap-ymapsml/images/coffee.png</href>
</iconStyle>
</Style>
<Style gml:id="styleCinema">
<parentStyle>#commonStyle</parentStyle>
<iconStyle>
<href>http://webmap-blog.ru/examples/ymap-ymapsml/images/cinema.png</href>
</iconStyle>
</Style>
<Style gml:id="styleMuseum">
<parentStyle>#commonStyle</parentStyle>
<iconStyle>
<href>http://webmap-blog.ru/examples/ymap-ymapsml/images/museum.png</href>
</iconStyle>
</Style>
<Style gml:id="styleParks">
<parentStyle>#commonStyle</parentStyle>
<iconStyle>
<href>http://webmap-blog.ru/examples/ymap-ymapsml/images/parks.png</href>
</iconStyle>
</Style>
<Style gml:id="styleShips">
<parentStyle>#commonStyle</parentStyle>
<iconStyle>
<href>http://webmap-blog.ru/examples/ymap-ymapsml/images/ships.png</href>
</iconStyle>
</Style>
<Style gml:id="styleTheater">
<parentStyle>#commonStyle</parentStyle>
<iconStyle>
<href>http://webmap-blog.ru/examples/ymap-ymapsml/images/theater.png</href>
</iconStyle>
</Style>
<Style gml:id="styleTurism">
<parentStyle>#commonStyle</parentStyle>
<iconStyle>
<href>http://webmap-blog.ru/examples/ymap-ymapsml/images/turism.png</href>
</iconStyle>
</Style>
<Style gml:id="styleFitness">
<parentStyle>#commonStyle</parentStyle>
<iconStyle>
<href>http://webmap-blog.ru/examples/ymap-ymapsml/images/fitness.png</href>
</iconStyle>
</Style>
<Template gml:id="balloonTemplate">
<text><![CDATA[
<div style="font-size:12px;">
<div style="color:#ff0303;font-weight:bold">$[name]</div>
<div>Адрес: $[metaDataProperty.AnyMetaData.adres|не задан]</div>
<div>Телефон: $[metaDataProperty.AnyMetaData.telefon|не задан]</div>
<div>Тип: $[metaDataProperty.AnyMetaData.type|не задан]</div>
</div>]]></text>
</Template>
</Representation>
<GeoObjectCollection>
<gml:name>Объекты карте</gml:name>
<gml:featureMembers>';
for($i=1; $i<12; $i++)
{
$query1= "SELECT * FROM org_yandexmapnn WHERE CAT_ID = '$i'";
$result1 = mysql_query($query1);
while ($par1 = mysql_fetch_array($result1))
{
echo '<GeoObject gml:id="', $par1['ID'], '">';
echo '<gml:name>', htmlspecialchars($par1['NAME']), '</gml:name>';
echo '<gml:metaDataProperty>';
echo '<AnyMetaData>';
echo '<adres>', $par1['ADRES'], '</adres>';
echo '<telefon>', $par1['TELEPHON'], '</telefon>';
echo '<type>', $par1['TYPE'], '</type>';
echo '</AnyMetaData>';
echo '</gml:metaDataProperty>';
echo '<gml:Point>';
echo '<gml:pos>', $par1['XX'], ' ', $par1['YY'], '</gml:pos>';
echo '</gml:Point>';
echo '<style>', $styleorg[$i-1], '</style>';
echo '</GeoObject>';
echo "\n";
}
}
echo '</gml:featureMembers>
</GeoObjectCollection>
</ymaps>';
?> |
А код файла для вывода карты будет таким:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Примеры. Загрузка XML.</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<script src="http://api-maps.yandex.ru/2.0/?load=package.full&lang=ru-RU"
type="text/javascript"></script>
<script type="text/javascript">
ymaps.ready(init);
function init () {
var myMap = new ymaps.Map("map", {
center: [56.326944, 44.0075],
zoom: 12
});
myMap.controls
.add("zoomControl")
.add("mapTools")
.add('typeSelector');
ymaps.geoXml.load('http://webmap-blog.ru/files/ymapsml-api2/create_ymapsml-2.php').then(function (res) {
myMap.geoObjects.add(res.geoObjects);
if (res.mapState) {
res.mapState.applyToMap(myMap);
}
});
}
</script>
</head>
<body>
<div id="map" style="width: 800px; height: 600px"></div>
</body>
</html> |

И на последок, давайте получим код YmapsML-файла аналогичный коду примера из «Моих карт».
Это можно сделать с помощью файла create_ymapsml-new.php
Вот его код:
<?php
header("Content-type: text/xml");
include("bd.php");
echo '<?xml version="1.0" encoding="utf-8"?>
<ym:ymaps xmlns:ym="http://maps.yandex.ru/ymaps/1.x">
<Representation xmlns="http://maps.yandex.ru/representation/1.x">
<Style xmlns:gml="http://www.opengis.net/gml" gml:id="userobject">
<iconContentStyle>
<template>#placemark</template>
</iconContentStyle>
<balloonContentStyle>
<template>#balloon</template>
</balloonContentStyle>
</Style>
<Template xmlns:gml="http://www.opengis.net/gml" gml:id="placemark">
<text>$[metaDataProperty.AnyMetaData.number]</text>
</Template>
<Template xmlns:gml="http://www.opengis.net/gml" gml:id="balloon">
<text><div style="max-width:400px;*width:400px;"><div style="color:#ff0303;font-weight:bold">$[name]</div><div>$[description]</div></div></text>
</Template>
</Representation>
<ym:GeoObjectCollection xmlns="http://www.opengis.net/gml">
<featureMembers>';
$query1= "SELECT * FROM org_yandexmapnn";
$result1 = mysql_query($query1);
while ($par1 = mysql_fetch_array($result1))
{
echo '<ym:GeoObject>';
echo '<metaDataProperty>';
echo '<ym:AnyMetaData>';
echo '<ym:number>', $par1['ID'], '</ym:number>';
echo '</ym:AnyMetaData>';
echo '</metaDataProperty>';
echo '<name>', htmlspecialchars($par1['NAME']), '</name>';
echo '<description>Адрес: ', $par1['ADRES'], '<br/>Телефон: ', $par1['TELEPHON'], '<br/>Тип: ', $par1['TYPE'], '</description>';
echo '<Point>';
echo '<pos>', $par1['XX'], ' ', $par1['YY'], '</pos>';
echo '</Point>';
echo '<ym:style>default#redPoint</ym:style>';
echo '</ym:GeoObject>';
echo "\n";
}
echo '</featureMembers>
<gml:name xmlns:gml="http://www.opengis.net/gml">Объекты карте</gml:name>
<ym:style>#userobject</ym:style>
</ym:GeoObjectCollection>
</ym:ymaps>';
?> |
А код вывода карты будет иметь вид:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Примеры. Загрузка XML.</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<script src="http://api-maps.yandex.ru/2.0/?load=package.full&lang=ru-RU"
type="text/javascript"></script>
<script type="text/javascript">
ymaps.ready(init);
function init () {
var myMap = new ymaps.Map("map", {
center: [56.326944, 44.0075],
zoom: 12
});
myMap.controls
.add("zoomControl")
.add("mapTools")
.add('typeSelector');
ymaps.geoXml.load('http://webmap-blog.ru/files/ymapsml-api2/create_ymapsml-new.php').then(function (res) {
myMap.geoObjects.add(res.geoObjects);
if (res.mapState) {
res.mapState.applyToMap(myMap);
}
});
}
</script>
</head>
<body>
<div id="map" style="width: 800px; height: 600px"></div>
</body>
</html> |

Как видите всё предельно просто.
Загрузить архив с файлами примеров
И два замечания в заключении.
1. Для работы примеров нужно чтобы файлы, генерирующие код YmapsML были доступны из интернета, т.е примеры и база данных были установлены на какой либо хостинг.
2. Если в YmapsML-файле меток очень много (1000 и более), можно не выводить их все одним файлом YmapsML, а разбить на несколько по категориям. Иначе данные будут долго подгружаться на карту.
Альтернативой YmapsML может быть представление данных в формате JSON.