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

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

Александр
ОО!!! То, что я уже даже не надеялся найти. Надеюсь данный способ поможет )
#
Александр
Сергей
А страны сами обводили или где можно взять готовые 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
#
Паша
наталья
Хорошо было бы увидеть побольше примеров практического применения
наталья
Нельзя ли побольше примеров практического применения
Сергей
Я правильно понял. Я должен закинуть на сервер файл KML и в коде добавить ссылку на этот файл и больше ничего?

function initialize() {
var latlng = new google.maps.LatLng(48.828565527993234,2.3400878906254);
var myOptions = {
zoom: 11,
center: latlng,
mapTypeId: google.maps.MapTypeId.ROADMAP
};
var map = new google.maps.Map(document.getElementById("map_canvas"),
myOptions);
var yourKML = new google.maps.KmlLayer('http://absolute_path_to.kml?' + timestamp);
yourKML.setMap(map);
var markersKML = new google.maps.KmlLayer('Вот тут ссылка на файлик каторый будет на сервере?' + timestamp);
}
#
Сергей
Сергей
Ой забыл дописать какую команду именно брать var yourKML или var markersKML
Потому что не знаю поэтому для вас в коде написал и то и то.
#
Сергей
Easy code
Спасибо большое полезная статья

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

как выглядит какой тег
жирный текст <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>
разрешенные теги или посмотреть как будет выглядеть

metin2 pvp metin2 pvp serverler pvp serverler