KML в Google Maps API v3

KML в Google Maps API v3

Всем привет!

В прошлый раз мы говорили про полигоны и линии в Google Maps API. В конце я упомянул, что рассмотренный метод имеет существенный недостаток — при большом количестве отрезков (части линии или грани полигона) браузер начинает тормозить.

С этой проблемой я столкнулся при создании карты визового режима. При отображении на карте более десяти стран работать стало невозможно. Поэтому я решил переделать все с помощью KML. В статье я расскажу о том, что такое KML, как он работает и как им пользоваться на примерах маркеров и полигонов.

Узнайте как составить договор на создание сайта
в блоге DesignFire.ru.

Что такое KML

Посмотрим цитату из справочника Google Code KML:

KML — это формат представления географических данных для отображения в программах Google Планета Земля, Карты Google и Карты Google для мобильных устройств. Файлы KML позволяют точно обозначать места, накладывать изображения и по-новому отображать данные. KML — международный стандарт, поддерживаемый компанией Open Geospatial Consortium, Inc. (OGC).

Если проще — это такой XML файл, который содержит данные об отображаемых объектах в специальном формате.

Как работает KML

Все очень просто:

  1. вы формируете необходимый вам KML файл у себя на сервере;
  2. вы отправляете его через Google Maps API на сервер Google Maps;
  3. Google Maps отображает данные из вашего KML файла на вашей карте.

В итоге ваш KML файл будет выведен поверх тайлов Google Maps, то есть ваши данные будут отображены как изображение поверх карты Гугла. При этом все объекты из KML файла будут кликабельные, и к ним можно будет обращаться. А так как данные «зашиты» в тайлы карт, в DOM вашей карты не будет лишних элементов, и вам не придется переживать о производительности. Вдобавок ко всему, итоговые изображения кешируются и все работает супер быстро.

Итак, давайте рассмотрим общую схему работы с KML:

<script type="text/javascript">
function initialize() {
// Инициализируем карту
var myLatlng = new google.maps.LatLng(30.3, 59.94);
var myOptions = {
zoom: 4,
center: myLatlng,
mapTypeId: google.maps.MapTypeId.ROADMAP
}

var map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);

// Хак для отключения кеширования
var timestamp = new Date().getTime();

// Отображение KML
var yourKML = new google.maps.KmlLayer('http://absolute_path_to.kml?' + timestamp);
yourKML.setMap(map);
}
</script>

Да да, это все. Теперь вам надо лишь создать нужный формат файла и записать в него данные. Давайте посмотрим пару простых примеров.

Вывод маркеров в KML

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

<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://www.google.com/earth/kml/2">
<Document>
<name>markers.kml</name>

<Placemark>
<name>Маркер №1</name>
<description>
<![CDATA[
Описание маркера №1
]]>
</description>
<Point>
<coordinates>30.3, 59.94</coordinates>
</Point>
</Placemark>

<Placemark>
<name>Маркер №2</name>
<description>
<![CDATA[
Описание маркера №2
]]>
</description>
<Point>
<coordinates>30.35, 59.945</coordinates>
</Point>
</Placemark>

<Placemark>
<name>Маркер №3</name>
<description>
<![CDATA[
Описание маркера №3
]]>
</description>
<Point>
<coordinates>30.4, 59.95</coordinates>
</Point>
</Placemark>
</Document>
</kml>

И подключить его к карте:

<script type="text/javascript">
function initialize() {
...
var markersKML = new google.maps.KmlLayer('http://vremenno.net/examples/google-maps-kml/markers.kml?' + timestamp);
...
}
</script>

Вот и все. Смотрим пример:

Маркеры с помощью KML

Вывод полигонов в KML

Теперь давайте рассмотрим более сложный пример. Скажем, нам обвести Россию на карте и сделать так, чтобы при клике на ней показывался бабл и описанием. Страну мы будет обводить с помощью полигонов. Пример кода KML урезан, так как для обводки России необходимо много полигонов:

<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://earth.google.com/kml/2.0">
<Document>
<name>Пример работы с полигонами с помощью KML в Google Maps API</name>
<Style id="style-1">
<PolyStyle>
<color>7bff0090</color>
<fill>1</fill>
<outline>1</outline>
</PolyStyle>
<LineStyle>
<color>7bff0090</color>
<width>2</width>
</LineStyle>
</Style>


<Placemark id="Russia">
<name>Россия</name>
<description><![CDATA[ Описание в бабле ]]></description>
<styleUrl>#style-1</styleUrl>
<MultiGeometry>
<Polygon>
<outerBoundaryIs>
<LinearRing>
<coordinates>
131.87329, 42.95694, 0
131.77997, 43.04944, 0
131.9172, 43.0211, 0
131.87329, 42.95694, 0
</coordinates>
</LinearRing>
</outerBoundaryIs>
</Polygon>
<Polygon>
<outerBoundaryIs>
<LinearRing>
<coordinates>
146.13748, 43.45888, 0
146.07608, 43.51333, 0
146.22607, 43.52555, 0
146.13748, 43.45888, 0
</coordinates>
</LinearRing>
</outerBoundaryIs>
</Polygon>
...
</MultiGeometry>
</Placemark>
</Document>
</kml>

Теперь подключим к карте и все готово:

Полиноны с помощью KML

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

Итак, теперь вы знаете как работать с KML в Google Maps API.

Есть вопросы? Пишите в комментариях и делитесь ссылками на статью с друзьями в Твиттере, вКонтакте или Фейсбуке. Пока!

P. S. Всю мужскую аудиторию — с праздником!

Расскажите друзьям

Оцените статью:
  • 1
  • 2
  • 3
  • 4
  • 5

Комментарии — 22

Александр
ОО!!! То, что я уже даже не надеялся найти. Надеюсь данный способ поможет )
#
Александр
Сергей
А страны сами обводили или где можно взять готовые kml?
#
Сергей
Grin
Сергей, я брал где-то базу с координатами границ
Сергей
А Вы не сильно обидитесь, если я у вас эти контуры украду?
#
Сергей
Сергей
А, пардон, у вас там не все страны, а только те, что обозначены?
#
Сергей
Сергей
Забудьте, я уже нашел. Кстати, опытным путем обнаружил, что Google таким же образом прекрасно отображает kmz
#
Сергей
Владимир
Я использовал KML когда нужно было показывать объекты на картах, недоступных через API (речь об Израиле).
При этом, столкнулся с ограничением - невозможно открыть балун. Т.е. с помощью KML можно указать группу маркеров и содержимое балунов для них. Эти балуны будут открываться при клике посетителя по маркеру, но указать в KML, что один из балунов нужно открыть сразу - не получилось.
Яна
Интересный пост, некоторые моменты поставлю на заметку.
Семён
Напишите ещё про API 3, столько ещё не освещено..
#
Семён
Павел
Хорошие статьи. А получается при использовании KML карта сама выбирает увеличение чтоб показать все маркеры на карте, а если делать например чтоб маркеры загружались не все сразу, а секторами (на видимой части), то надо писать функцию обработки данного файла по координатам или есть стандартные функции?
#
Павел
Grin
Павел, да, API само подгоняет карту по размеру. Вы можете затем сами изменить масштаб и центр
Денис
Добрый день.
Подскажите пожалуйста:
1. Как организовать KML для линий (Polyline)?
2. Текст в балуне не отображает кириллицу, что можно сделать?
Спасибо.
#
Денис
Алексей
Павел, здравствуйте! На локальном компьютере попробовал прикрутить карту вышеуказанным способом. Карта отображается, а вот метки - нет. Если указать Ваш файл kml то метки отображает, а если я пытаюсь разместить этот kml файл на своем компьютере или на одном из своих серверов - ничего не отображается. Есть какие ограничения?
#
Алексей
Алексей
"Ваш файл" - это я имел ввиду в коде прописать var markersKML = new google.maps.KmlLayer('http://vremenno.net/examples/google-maps-kml/markers.kml?' + timestamp);
#
Алексей
Алексей
Разобрался с файлом KML - теперь все грузится!
Павел, а есть ли способ, при помощи которого можно было бы тайлы, созданные Google из моего файла KML наложить на карту Google?
#
Алексей
Grin
Алексей, не понял ваш вопрос
#
Grin  
Алексей
Ой, неправильно написал! А есть ли способ, при помощи которого можно было бы тайлы, созданные Google из моего файла KML наложить на карту Яндекс и использовать их как активные области?
#
Алексей
Grin
Алексей, скорее всего есть, но я ни разу не делал
#
Grin  
Saint_Byte
Я сделал хостинг для KML на http://ural.im =)
Паша
А можно ли сделать кластеризацию маркеров добавленных на карту через KML? если можно расскажите мне пожалуйста как)в api v.2
#
Паша
наталья
Хорошо было бы увидеть побольше примеров практического применения
наталья
Нельзя ли побольше примеров практического применения

Новый комментарий

как выглядит какой тег
жирный текст <b>жирный текст</b>
курсивный тект <i>курсивный тект</i>
зачеркнутый текст <s>зачеркнутый текст</s>
подчеркнутый текст <u>подчеркнутый текст</u>
ссылка <a href="адрес">ссылка</a>
function foo() { ... }
<pre><code>function foo() { ... } </code></pre>
разрешенные теги или посмотреть как будет выглядеть
как выглядит какой тег
жирный текст <b>жирный текст</b>
курсивный тект <i>курсивный тект</i>
зачеркнутый текст <s>зачеркнутый текст</s>
подчеркнутый текст <u>подчеркнутый текст</u>
ссылка <a href="адрес">ссылка</a>
function foo() { ... }
<pre><code>function foo() { ... } </code></pre>
разрешенные теги или посмотреть как будет выглядеть
counter strike mt2 silkroad pvp metin2 metin2 pvp knight pvp gm olarak başlayan pvpler pvp silkroad pvp serverler counter strike serverler msn show cam show görüntülü sohbet oyunlar suskunlar gazete oku