воскресенье, 24 мая 2009 г.

Создание собственной карты с использованием API Яндекс.Карт

Многие интересуются как можно использовать API Яндекс.Карт для создания собственной карты?

В нескольких заметках на своем блоге я подробно рассмотрю данный вопрос.

Для создания собственной карты существует специальный класс YMaps.MapLayer, который предназначен для создания пользовательского слоя с картой.

В нем указывается источник данных для слоя карты с помощью класса YMaps.TileDataSource.

Конструктор данного класса принимает следующие параметры:

tileUrlTemplate - шаблон, по которому строится url тайла;

isTransparent - загружаемые тайлы прозрачны;

isPng - загружаемые изображения тайлов имеют png формат.

И так, в начале, необходимо подготовить данные для создания собственного слоя карты.

В качестве источника нужно использовать растровое изображение представленное в нескольких масштабах, каждое из которых разрезано на кусочки размером 256 на 256 пикселей.

Файлы с кусочками изображений необходимо переименовать соответствующим образом , например так tile-zum-num.jpg

Здесь zum – уровень масштаба, num – номер тайтла по порядку.

Покажу как можно встроить свое изображение в интерфейс управления Яндекс.Карт на конкретном примере.

В качестве изображения я использую фотографию автомобиля Porsche Cayenne размером 1600х1200 пикселей.

Для создания набора тайтлов воспользуемся бесплатным сервисом Gmap Uploader расположенном по адресу http://gmapuploader.com

Пользоваться данным сервисом очень легко.

На главной странице сервиса нужно ввести Ваш адрес электронной почты, выбрать файл для загрузки в формате jpg, png или gif и нажать на кнопку Send для начала загрузки файла.

Через некоторое время (продолжительность зависит от размера загружаемого изображения) появиться страница с загруженным изображением в интерфейсе Google Maps.

И три ссылки внизу изображения.

Для моего примера они имеют следующий вид:

Link: http://gmapuploader.com/view/bsnYw5ReKw

Full Screen: http://gmapuploader.com/iframe/bsnYw5ReKw

Deep Zoom URL: http://dz.gmapuploader.com/bsnYw5ReKw.xml

Первая ссылка – адрес данной страницы, вторая на изображение карты во весь экран и третья на xml-файл с описание максимального уровня масштабирования.

В моем случае содержимое данного файла:

<Image TileSize="256" Overlap="0" Format="jpg"><Size Width="2048" Height="2048" />

</Image>



Для использования созданный тайтлов нам необходимо узнать адрес папки, где они хранятся.

Сделать это просто, нужно посмотреть свойства одного из фрагментов полученного изображения (Свойства рисунка) , например в моем случае http://mt2.gmapuploader.com/tiles/bsnYw5ReKw/tile-3-26.jpg

Нам сразу ясно что все файлы хранятся в папке по адресу http://mt2.gmapuploader.com/tiles/bsnYw5ReKw/

Теперь необходимо написать код для загрузки набора тайтлов в интерфейс Яндекс.Карт.

Привожу код примера:

<html xmlns="http://www.w3.org/1999/xhtml"><head>

<title>Примеры YMapsML. Своя карта с использованием сервиса Gmap Uploader.</title>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

<script src="http://api-maps.yandex.ru/1.0/index.xml?key=AIW0o0kBAAAAkwyUMwMAEkDz8ddCkU0UnlyLEu4ddFBXhQQAAAAAAAAAAAA1Md4ULCo5QbciEo5T26eV1lhuEQ==" type="text/javascript"></script>

<script type="text/javascript">

var map;

function init () {

map = new YMaps.Map(document.getElementById("YMapsID"));

map.setCenter(new YMaps.GeoPoint(0,0),1);

map.enableScrollZoom();

map.addControl(new YMaps.SmallZoom());

var myData = new YMaps.TileDataSource("http://mt0.gmapuploader.com/tiles/bsnYw5ReKw/", false, false);

myData.getTileUrl = function (tile, zoom) {

return this.getTileUrlTemplate() + "tile-" + zoom + "-" + (tile.y * Math.pow(2, zoom) + tile.x) + ".jpg";

}

map.addCopyright('Угольников Сергей');

map.setType(new YMaps.MapType([new YMaps.MapLayer(myData)], 'Пример карты', {minZoom:1, maxZoom:3}));

}

</script>

</head>

<body onload="init();">

<div id="YMapsID" style="height:100%; width:100%;"></div>

</body>

</html>



Поясню, на что здесь следует обратить внимание.

Строкой map.setCenter(new YMaps.GeoPoint(0,0),1); задается центр карты на первом уровне масштаба.

Строка var myData = new YMaps.TileDataSource("http://mt0.gmapuploader.com/tiles/bsnYw5ReKw/", false, false); - служит для задания источника тайтлов и значения параметров isTransparent = false - загружаемые тайлы не прозрачны, isPng= false - загружаемые изображения тайлов не имеют формат png.

В строке myData.getTileUrl = function (tile, zoom) {return this.getTileUrlTemplate() + "tile-" + zoom + "-" + (tile.y * Math.pow(2, zoom) + tile.x) + ".jpg";

}



Мы задаем правила для формирования имени файла для конкретного тайтла на соответствующем уровне масштаба.

Строкой  map.addCopyright('Угольников Сергей'); добавляем копирайт на нашу карту.

И строка map.setType(new YMaps.MapType([new YMaps.MapLayer(myData)], 'Пример карты', {minZoom:1, maxZoom:3})); служит для указания нового типа карты с названием Пример карты, тамже мы вводим ограничение на изменение уровня масштаба от 1 до 3.

Загружаем пример в браузере и наблюдаем результат

Своя карта с использованием сервиса Gmap Uploader

Посмотреть пример в действии можно здесь.

понедельник, 18 мая 2009 г.

Онлайн сервис для конвертирования gpx-треков в YMapsML

Если у Вас имеется GPS-навигатор, то возможно сохранять путевые треки в формате GPX.

GPX (GPS eXchange Format) — это текстовый формат хранения и обмена данными GPS, являющийся подмножеством XML.

Формат позволяет хранить информацию об ориентирах (waypoints), маршрутах (routes) и треках (tracklogs). Для каждой точки хранятся её долгота, широта и высота над уровнем моря (если имеется информация о высоте). Для точек трека хранится также время прохождения точки. XML-схема предусматривает также хранение произвольной пользовательской информации по каждой точке.

Я хочу познакомить Вас с одним онлайн сервисом для конвертирования  gpx-треков в YMapsML и отображения на Яндекс.Картах.

Сервис расположен по адресу http://map.z66.ru/gpx2ymaps/

Использовать его очень просто.

Вы выбираете gpx-файл на своем компьютере для его загрузки (максимальный размер файла 300 кб).

Нажимаете на кнопку загрузить.

После этого отображается Яндекс.Карта с загруженным треком.

Яндекс.Карта с загруженным треком gpx

Дополнительные возможности сервиса: вы можете получить ссылку на страницу Яндекс.Карта с загруженным треком для последующего использования (разместить ссылку в своем блоге или послать по e-mail), сохранить исходный gpx-трек, сохранить сформированный YMapsML-файл для работы с ним.

Ссылка на пример http://map.z66.ru/gpx2ymaps/view/d816d1634d0e88db3ef155c58fcaf607

Загрузить сформированный YMapsML-файл здесь

понедельник, 11 мая 2009 г.

Продолжаем изучать язык YMapsML для Яндекс.Карт

В предыдущей заметке «Начинаем изучать язык YMapsML для Яндекс.Карт» мы начали с Вами изучать язык YMapsML для описания географических данных на картах Яндекса.

В этой заметке мы продолжим его изучение.

Узнаем, как описываются несколько объектов в одном файле, о использовании стилей и задания начальных параметров карты.

Давайте рассмотрим это на конкретном примере файла в формате  YMapsML (загрузить полный код файла).

Часть кода файла prim_YMapsML_2.xml

<?xml  version="1.0" encoding="utf-8"?>

<ymaps xmlns="http://maps.yandex.ru/ymaps/1.x" xmlns:gml="http://www.opengis.net/gml">



<Representation xmlns="http://maps.yandex.ru/representation/1.x">

<View>

<mapType>MAP</mapType>

<gml:boundedBy>

<gml:Envelope>

<gml:upperCorner>44.121546 56.372383</gml:upperCorner>

<gml:lowerCorner>43.799509 56.231518</gml:lowerCorner>

</gml:Envelope>

</gml:boundedBy>

</View>

<Style gml:id="styleCinimaNN">

<iconStyle>

<href>http://www.map.cek.ru/images/stories/kinoteatrs.jpg</href>

<size x="20" y="20"></size>

<offset x="-10" y="-10"></offset>

</iconStyle>

<balloonContentStyle>

<template>#balloonTemplate</template>

</balloonContentStyle>

</Style>

<Template gml:id="balloonTemplate">

<text>

<![CDATA[<div style="text-align:center"><strong>$[name]</strong><br /><img src="http:$[metaDataProperty.AnyMetaData.link]" alt="" width="100" height="62"/><br />$[description]</div>]]>

</text>

</Template>

</Representation>

<GeoObjectCollection>

<gml:name>Кинотеатры Нижнего Новгорода</gml:name>

<style>#styleCinimaNN</style>

<gml:featureMembers>

<GeoObject>

<gml:name>Кинотеатр Импульс</gml:name>

<gml:description>пр. Гагарина, 192</gml:description>

<gml:metaDataProperty>

<AnyMetaData>

<link>//www.map.cek.ru/images/stories/afisha/cinema/imp.jpg</link>

</AnyMetaData>

</gml:metaDataProperty>

<gml:Point>

<gml:pos>43.959184 56.237457</gml:pos>

</gml:Point>

</GeoObject><GeoObject>

<gml:name>Кинотеатр Канавинскийсий</gml:name>

<gml:description>ул. Фильченкова, 7</gml:description>

<gml:metaDataProperty>

<AnyMetaData>

<link>//www.map.cek.ru/images/stories/afisha/cinema/kanaviskiy.jpg</link>

</AnyMetaData>

</gml:metaDataProperty>

<gml:Point>

<gml:pos>43.944335 56.317977</gml:pos>

</gml:Point>

</GeoObject>



<GeoObject>

<gml:name>Кинотеатр Электрон</gml:name>

<gml:description>пр. Гагарина, 98</gml:description>

<gml:metaDataProperty>

<AnyMetaData>

<link>//www.map.cek.ru/images/stories/afisha/cinema/elektron.jpg</link>

</AnyMetaData>

</gml:metaDataProperty>

<gml:Point>

<gml:pos>43.978839 56.274389</gml:pos>

</gml:Point>

</GeoObject>

</gml:featureMembers>

</GeoObjectCollection>



</ymaps>

Если отобразить содержимое этого файла на Яндекс.Карте, мы увидим следующее

Продолжаем изучать язык YMapsML для Яндекс.Карт

Посмотреть работающий пример и исходный код можно здесь.

И так что же здесь интересного.

Первые две строки нам уже известны.

В них задается формат файла XML версии 1.0 и его кодировка utf-8.

Далее идет корневой элемент файла ymaps:ymaps. В его атрибутах описываются пространства имен XML и используемые XSD-схемы.

Элемент ymaps:ymaps содержит внутри себя два контейнера repr:Repsentation и GeoObjectCollection.

Первый  repr:Repsentation содержит в себе правила отображения геообъектов на карте – это элементы View (задает область показа геообъектов) и Style (содержит описание внешнего вида объектов), элемент Template – содержит шаблон для представления html-объектов карты.

Второй  GeoObjectCollection  служит для описания набора геообъектов.

Рассмотрим подробнее назначение и параметры каждого из элементов кода.

Элемент View включает в себя следующие теги:

mapType – задает тип карты, в нашем случае MAP обычная карта.

gml:boundedBy – задет границы области показа на карте, в нашем случае задается прямоугольная область с координатами нижнего левого угла gml:lowerCorner - 43.799509 56.231518 и правого верхнего угла gml:upperCorner - 44.121546 56.372383.

После этого задается стиль для отображения меток кинотеатров iconStyle и для содержимого балуна balloonContentStyle.

В контейнере Template задается шаблон для html-содержания балуна.

Далее в контейнере GeoObjectCollection описывается набор точек.

Задается его наименование gml:name и общий стиль для всех styleCinimaNN.

Каждая точка задается конкретными параметрами:

  • Наименование кинотеатра – name,

  • Описание – description,

  • Ссылка на картинку внутри балуна – link

  • Координаты точки – Point


Продолжение следует …

четверг, 7 мая 2009 г.

Формат файлов KML и его использование на картах Google. Продолжение

В этой заметке мы продолжаем изучать формат файлов KML начатый в заметке «Формат файлов KML и его использование на картах Google. Введение».

В этой заметке мы рассмотрим как можно задавать в файле KML несколько географических объектов и задавать стили для их отображения.

Давайте рассмотрим это на конкретном примере.

Привожу часть кода  KML-файла:

<?xml version="1.0" encoding="UTF-8"?>

<kml xmlns="http://www.opengis.net/kml/2.2">

<Document>

<name>Кинотеатры Нижнего Новгорода</name>

<description>Местоположение кинотеатров Нижнего Новгорода на GoogleMaps</description>

<Style id="kino_st">

<IconStyle>

<scale>1.2</scale>

<Icon>

<href>http://maps.google.com/mapfiles/kml/pal2/icon30.png</href>

</Icon>

<hotSpot x="0.5" y="0" xunits="fraction" yunits="fraction"/>

</IconStyle>

<BalloonStyle>

<text>$[description]</text>

</BalloonStyle>

</Style>

<Placemark>

<name>Кинотеатр Импульс</name>

<description>

<![CDATA[

<div style="text-align:center"><strong>Кинотеатр Импульс</strong><br /><a href="http://www.map.cek.ru/index.php?option=com_content&view=article&id=25&Itemid=136" target="blank"><img src="http://www.map.cek.ru/images/stories/afisha/cinema/imp.jpg" alt="Информация о кинотеатре Импульс с афишой фильмов" title="Информация о кинотеатре Импульс с афишой фильмов" width="100" height="62" /></a><br />пр. Гагарина, 192</div>

]]>

</description>

<styleUrl>#kino_st</styleUrl>

<Point>

<altitudeMode>relativeToGround</altitudeMode>

<coordinates>43.959184,56.237457,0</coordinates>

</Point>

</Placemark>

…..

<Placemark>

<name>Кинотеатр Электрон</name>

<description>

<![CDATA[

<div style="text-align:center"><strong>Кинотеатр Электрон</strong><br /><a href="http://www.map.cek.ru/index.php?option=com_content&view=article&id=31&Itemid=146" target="blank"><img src="http://www.map.cek.ru/images/stories/afisha/cinema/elektron.jpg" alt="Информация о кинотеатре Электрон с афишой фильмов" title="Информация о кинотеатре Электрон с афишой фильмов" width="100" height="62" /></a><br />пр. Гагарина, 98</div>

]]>

</description>

<styleUrl>#kino_st</styleUrl>

<Point>

<altitudeMode>relativeToGround</altitudeMode>

<coordinates>43.978839,56.274389,0</coordinates>

</Point>

</Placemark>

</Document>

</kml>

Полный текст файла можно загрузить http://webmap-blog.ru/examples/kml/primer_kml_2.km.

Что же мы видим нового в этом примере?

Здесь появился новый тег <Document>.

Внутрь него помещается все содержимое kml-файла.

Затем мы указываем имя и описание создаваемого документа.

В файле kml возможно задание стилей для отображения элементов на карте.

Если мы определяем стиль в начале документа, тогда мы можем использовать его для последующих элементов.

В нашем примере мы определяем стиль с идентификатором  kino_st.

Внутри него мы задаем стиль для значка метки  IconStyle и для балуна BalloonStyle.

Параметр scale задает масштаб значка метки.

<Icon>  <href> - указывают на файл с изображением значка, в нашем случае icon30.png.

Параметр hotspot задает отступы от координат точки метки для изображнеия по х и по y.

Для стиля балуна мы указаваем, что это будет текст параметра description.

После задания стиля идет список меток на карте с параметрами.

В нашем примере это перечень кинотеатров Нижнего Новгорода.

Каждая метка заключена в парный тег <Placemark>.

Для которой задается название name, описание description, которое будет появлятся в балуне при щелчке по метке.

Стиль отображения и координаты точки.

Для написания HTML-кода внутри тега <description> его помещают внутрь тега CDATA.

Тег <altitudeMode> служит для задания наземного режима отображения.

В Google Earth 5.0 появилась возможность работы с новыми режимами – Окен и Космическое пространство.

Посмотреть работающий пример и исходный код можно здесь.

Подробнее о формате KML можно узнать по адресу http://code.google.com/intl/ru_ALL/apis/kml/documentation/

Продолжение следует …

пятница, 1 мая 2009 г.

Начинаем изучать язык YMapsML для Яндекс.Карт

Также как у API карт Google (язык – KML) для описания географических данных на картах Яндекса  используется специальный язык YMapsML (Yandex Maps Markup Language).

YMapsML – это XML язык с помощью которого возможно в текстовом виде задать участок карты с нанесенными метками и другими объектами, а затем отобразить его в браузере средствами JS API Яндекс.Карт.

Также он используется сервисом геокодирования для описания найденных по запросу географических объектов.

В качестве геометрических объектов можно использовать метку или линию.

Можно задавать стиль отображения объектов и границы области показа.

Давайте для начала рассмотрим простейший пример файла на языке YMapsML и как вывести его содержимое с использованием API Яндекс.Карт.

Привожу код файла примера:

<?xml version="1.0" encoding="utf-8"?>

<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">

<GeoObjectCollection>

<gml:name>Объекты карте</gml:name>

<gml:featureMembers>

<GeoObject>

<gml:name>Дворец спорта</gml:name>

<gml:description>Дворец спорта «Нагорный» просп. Гагарина, 29</gml:description>

<gml:Point>

<gml:pos>43.979459 56.291908</gml:pos>

</gml:Point>

</GeoObject>

</gml:featureMembers>

</GeoObjectCollection>

</ymaps>

В этом примере:

В первой строке задается формат файла XML версии 1.0 и его кодировка utf-8.

Далее идет корневой элемент файла ymaps:ymaps. В его атрибутах описываются пространства имен XML и используемые XSD-схемы.

Элемент  ymaps:ymaps может содержать в себе несколько тегов, служащих контейнерами для различных данных или групп данных, отображаемых на карте.

Это repr:Repsentation – который содержит в себе правила отображения геообъектов на карте (в нашем примере отсутствует).

И контейнер GeoObjectCollection – содержит в себе описания объектов, помещаемых на карту.

Элемент gml:featureMembers – содержит в себе описание отдельного геообъекта или группы.

В нашем случае это простой элемент метка.

О имеет имя - name Дворец спорта, описание – description Дворец спорта «Нагорный» просп. Гагарина, 29.

Координаты метки задаются следующим кодом:

<gml:Point>

<gml:pos>43.979459 56.291908</gml:pos>

</gml:Point>

Для визуализации данного файла в наш пример вывода Яндекс.Карты (см.первый код в заметке "Добавляем маркер на карту используя API Яндекс.Карт") необходимо добавить несколько строк в функцию init.

var ml = new YMaps.YMapsML( 'http://webmap-blog.ru/examples/YMapsML/prim_YMapsML_1.xml' );

map.addOverlay(ml);

YMaps.Events.observe(ml, ml.Events.Fault, function (error) {

alert('Ошибка: ' + error);

});

В первой строке мы присваиваем переменной ml путь к файлу с нашим примером prim_YMapsML_1.xml.

И затем добавляем его на нашу карту.

Последние три строки служат для контроля ошибок, возникающих при загрузке YMapsML-документа.

Загружаем пример в браузере и наблюдаем результат.

Отображаем файйл YMapsML с использованием API Яндекс.Карт

Посмотреть работающий пример и исходный код можно здесь.

Далее я продолжу описания работы с языком YMapsML

Более подробную информацию Вы можете найти в документации на странице по адресу http://api.yandex.ru/maps/ymapsml/doc/ref/concepts/About.xml