В прошлой статье мы рассматривали организацию отображения на карте Яндекс.Карты объектов из БД MS SQL Server при помощи http-обработчика, написанного на ASP.Net (C#). Однако, это решение не является единственным (кто бы мог подумать J ). В API Яндекс.Карты существует возможность загрузки объектов посредством специального файла в XML формате. Объекты в этом файле описываются специальным YMapsML языком. В общем виде такой файл имеет вид как на листинге 1.
Листинг 1 – Пример YMapsML – файла
<?xml version="1.0" encoding="utf-8"?><ymaps:ymaps xmlns:ymaps="http://maps.yandex.ru/ymaps/1.x"
xmlns:gml="http://www.opengis.net/gml"
xmlns:repr="http://maps.yandex.ru/representation/1.x"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maps.yandex.ru/schemas/ymaps/1.x/ymaps.xsd"><ymaps:GeoObjectCollection>
<ymaps:style>#anyStyle</ymaps:style>
<gml:featureMembers>
<ymaps:GeoObject>
<gml:description>Описание</gml:description>
<gml:Point>
<gml:pos>37.63 55.75</gml:pos>
</gml:Point>
</ymaps:GeoObject>
<ymaps:GeoObject>
<gml:LineString>
<gml:pos>70 55</gml:pos>
<gml:pos>80 70</gml:pos>
<gml:pos>120 30</gml:pos>
</gml:LineString>
</ymaps:GeoObject>
</gml:featureMembers>
</ymaps:GeoObjectCollection>
</ymaps:ymaps>
Итак, получим из таблицы (листинг 2) YMapsML – файл, который загрузим на нашу страницу.Листинг 2 – Таблица с объектами
CREATE TABLE [dbo].[t_Map] (
[id] int IDENTITY(1, 1) NOT NULL,
[ObjectName_Var] nvarchar(128) COLLATE Cyrillic_General_CI_AS NULL,
[Address_Var] nvarchar(256) COLLATE Cyrillic_General_CI_AS NULL,
[Longitude_Var] nvarchar(128) COLLATE Cyrillic_General_CI_AS NULL,
[Latitude_Var] nvarchar(1) COLLATE Cyrillic_General_CI_AS NULL,
PRIMARY KEY CLUSTERED ([id])
)
Как видно из листинга 1, файл YMapsML представляет собой довольно сложную иерархическую структуру. Поэтому для преобразования наших реляционных данных (листинг 2) воспользуемся режимом форматирования FOR XML EXPLICIT.Запрос приведен в листинге 3, я не буду подробно его разбирать, там все довольно понятно, хотя и весьма громоздко.Листинг 3 – Получение XML из реляционных данныхCREATE PROCEDURE dbo.p_Get_XMLASSET NOCOUNT ONBEGIN SELECT 1 Tag , NULL Parent , NULL [ymaps:ymaps!1] , 'http://maps.yandex.ru/ymaps/1.x' [ymaps:ymaps!1!xmlns:ymaps] , 'http://maps.yandex.ru/representation/1.x' [ymaps:ymaps!1!xmlns:repr] , 'http://www.opengis.net/gml' [ymaps:ymaps!1!xmlns:gml] , 'http://www.w3.org/2001/XMLSchema-instance' [ymaps:ymaps!1!xmlns:xsi] , 'http://maps.yandex.ru/schemas/ymaps/1.x/ymaps.xsd' [ymaps:ymaps!1!xsi:schemaLocation] , NULL [repr:Representation!2] , NULL [repr:View!3] , NULL [repr:mapType!4] , NULL [ymaps:GeoObjectCollection!5] , NULL [ymaps:style!6] , NULL [gml:featureMembers!7] , NULL [ymaps:GeoObject!8] , NULL [gml:name!9] , NULL [gml:description!10] , NULL [gml:Point!11] , NULL [gml:pos!12] UNION ALL SELECT 2 Tag, 1 Parent, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'MAP', NULL, '#customStyle', NULL, NULL, NULL, NULL, NULL, NULL UNION ALL SELECT 3 Tag, 2 Parent, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'MAP', NULL, '#customStyle', NULL, NULL, NULL, NULL, NULL, NULL UNION ALL SELECT 4 Tag, 3 Parent, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'MAP', NULL, '#customStyle', NULL, NULL, NULL, NULL, NULL, NULL UNION ALL SELECT 5 Tag, 1 Parent, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'MAP', NULL, '#customStyle', NULL, NULL, NULL, NULL, NULL, NULL UNION ALL SELECT 6 Tag, 5 Parent, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'MAP', NULL, '#customStyle', NULL, NULL, NULL, NULL, NULL, NULL UNION ALL SELECT 7 Tag, 5 Parent, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'MAP', NULL, '#customStyle', NULL, NULL, NULL, NULL, NULL, NULL UNION ALL SELECT 8 Tag, 7 Parent, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'MAP', NULL, '#customStyle', NULL, NULL, m.ObjectName_Var, m.Address_Var, NULL, NULL FROM t_Map m UNION ALL SELECT 9 Tag, 8 Parent, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'MAP', NULL, '#customStyle', NULL, NULL, m.ObjectName_Var, m.Address_Var, NULL, NULL FROM t_Map m UNION ALL SELECT 10 Tag, 8 Parent, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'MAP', NULL, '#customStyle', NULL, NULL, m.ObjectName_Var, m.Address_Var, NULL, NULL FROM t_Map m UNION ALL SELECT 11 Tag, 8 Parent, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'MAP', NULL, '#customStyle', NULL, NULL, m.ObjectName_Var, m.Address_Var, NULL, NULL FROM t_Map m UNION ALL SELECT 12 Tag, 11 Parent, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'MAP', NULL, '#customStyle', NULL, NULL, m.ObjectName_Var, m.Address_Var, NULL, m.Longitude_Var + ' ' + m.Latitude_Var FROM dbo.t_Map m ORDER BY [ymaps:style!6], [gml:description!10], Tag FOR XML explicitENDКак было сказано, запрос громоздкий, но один раз стоит потратить время. Я не стал подробно расписывать раздел repr:Representation, для нас сейчас не это главное.Теперь надо сделать, чтоб результат данного запроса сохранялся в файл *.xml. Скрипт, который делает это, приведен в листинге 4.Листинг 4 – Сохранение XML в файлDECLARE @result int
DECLARE @OutputFileName varchar(150)
DECLARE @cmd varchar( 150)
SET @OutputFileName = 'c:\YMapsML.xml'
SET @cmd = 'BCP "EXEC Site..p_Get_XML" queryout "' + @OutputFileName + '" -w -C1251 -r -T'
EXEC @result = master..xp_cmdshell @cmd
Не забыть проверить, чтоб у файла, куда произойдет выгрузка был открыт доступ и назначены права на редактирование.
Далее файл нужно выложить в интернете так, чтоб он был доступен парсеру Яндекс.Карты. В этом есть ограничение использования данного метода. Например, мой сайт находится в локальной сети, и парсер сюда зайти не может.Ну и напоследок страничка с подключенным YMapsML (листинг 5).Листинг 5 – Подключение 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>Примеры. Визуализация YMapsML.</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script src="http://api-maps.yandex.ru/1.1/index.xml?key=ANpUFEkBAAAAf7jmJwMAHGZHrcKNDsbEqEVjEUtCmufxQMwAAAAAAAAAAAAvVrubVT4btztbduoIgTLAeFILaQ==" type="text/javascript"></script>
<script type="text/javascript">
// Создание обработчика для события window.onLoad
YMaps.jQuery(function () {
// Создание экземпляра карты и его привязка к созданному контейнеру
var map = new YMaps.Map(YMaps.jQuery("#YMapsID")[0]);
// Установка для карты ее центра и масштаба
map.setCenter(new YMaps.GeoPoint(55.983161, 54.73794), 12);
// Создание YMapsML-документа и добавление его на карту
var ml = new YMaps.YMapsML("http://download1317.mediafire.com/6v198lba6hdg/a4a6lovzelap5b9/1.xml");
map.addOverlay(ml);
// Обработчик неудачного создание документа YMapsML
YMaps.Events.observe(ml, ml.Events.Fault, function (ml, error) {
alert("Ошибка: " + error);
});
});
</script>
</head>
<body>
<div id="YMapsID" style="width:600px;height:400px"></div>
</body>
</html>
Удачи!
