Слой KmlLayer выполняет визуализацию элементов KML и GeoRSS на мозаичном наложении Maps API V3.
Обзор
Google Maps API поддерживает форматы данных KML и GeoRSS для отображения географической информации. Эти форматы данных отображаются на карте с помощью объекта KmlLayer, конструктор которого использует URL общедоступного файла KML или GeoRSS.
Примечание. На странице Поддержка KML в документации по KML можно найти информацию о поддерживаемых элементах и ограничениях по размеру и сложности.
Maps API преобразует предоставленные географические данные XML в представление KML, которое отображается на карте с помощью мозаичного наложения V3. Слой KML выглядит как знакомые элементы наложения V3 (и иногда имеет аналогичное поведение). Элементы KML <Placemark> и GeoRSS point визуализируются как маркеры, например, визуализация элементов <LineString> выполняется в виде ломаных линий, а визуализация элементов <Polygon> выполняется в виде многоугольников. Элементы <GroundOverlay> визуализируются как прямоугольные изображения на карте. Следует отметить, что эти объекты не являются объектами Marker, Polyline, Polygon или GroundOverlay Google Maps API, а визуализируются в виде отдельного объекта на карте.
Объекты KmlLayer отображаются на карте, если для них установлено свойство map. Их можно удалить с карты, вызвав метод setMap() и передав ему значение null. Объект KmlLayer управляет визуализацией этих дочерних элементов, автоматически получая соответствующие элементы для заданных границ области на карте. При изменении границ автоматически выполняется визуализация элементов в текущей области просмотра карты.
Поскольку визуализация компонентов в слое KmlLayer выполняется по запросу, этот слой позволяет легко управлять визуализацией тысяч маркеров, ломаных линий и многоугольников. Хотя каждый из этих объектов поддерживает события нажатия, возвращающие данные по конкретным объектам, вы не можете обращаться к этим объектам напрямую.
Параметры слоя KML
Конструктор KmlLayer() может передавать ряд параметров KmlLayerOptions:
map– указывает объектMapдля визуализации слояKmlLayer. Вы можете скрыть слойKmlLayer, установив для этого параметра значениеnullс помощью методаsetMap().preserveViewport– указывает, что карту не следует подстраивать под границы содержимогоKmlLayerпри отображении слоя. По умолчанию при отображении слояKmlLayerмасштаб карты изменяется, а сама карта смещается так, чтобы все содержимое слоя отображалось полностью.suppressInfoWindows– указывает, что поддерживающие нажатие элементы в слоеKmlLayerне должны отображать объектыInfoWindow.
Кроме того, после визуализации слой KmlLayer имеет постоянное свойство metadata, которое содержит название слоя, описание, фрагмент текста и данные автора в литерале объекта KmlLayerMetadata. Эту информацию можно просмотреть с помощью метода getMetadata(). Поскольку для визуализации объекта KmlLayer требуется асинхронная связь с внешним сервером, вам понадобится отслеживать событие metadata_changed, указывающее на установку значения свойства.
В следующем примере создается слой KmlLayer по указанным данным GeoRSS:
function initMap() {
var map = new google.maps.Map(document.getElementById('map'), {
zoom: 4,
center: {lat: 49.496675, lng: -102.65625}
});
var georssLayer = new google.maps.KmlLayer({
url: 'http://api.flickr.com/services/feeds/geo/?g=322338@N20&lang=en-us&format=feed-georss'
});
georssLayer.setMap(map);
}
В следующем примере создается слой KmlLayer по указанным данным KML:
function initMap() {
var map = new google.maps.Map(document.getElementById('map'), {
zoom: 11,
center: {lat: 41.876, lng: -87.624}
});
var ctaLayer = new google.maps.KmlLayer({
url: 'http://googlemaps.github.io/js-v2-samples/ggeoxml/cta.kml',
map: map
});
}
Детали элементов KML
Поскольку слой KML может содержать большое количество элементов, вы не можете получить их данные непосредственно из объекта KmlLayer. Вместо этого вы можете использовать визуализированные элементы аналогично наложениям Maps API, поддерживающим нажатия. По умолчанию при нажатии отдельных элементов выводится объект InfoWindow, который содержит данные KML <title> и <description> соответствующего элемента. Кроме того, при нажатии элемента KML генерируется событие KmlMouseEvent, которое передает следующую информацию:
position– указывает координаты (широту и долготу), к которым будет привязан объектInfoWindowдля данного элемента KML. Эта позиция обычно соответствует точке нажатия для многоугольников, ломаных линий и наземных наложений, либо реальному местоположению для маркеров.pixelOffset– указывает смещение относительно вышеуказанных координатpositionдля привязки "указателя" объектаInfoWindow. Для многоугольных объектов это смещение обычно равно0,0, а для маркеров оно включает высоту маркера.featureData– содержит структуру JSON данныхKmlFeatureData.
Пример объекта KmlFeatureData приведен ниже:
{
author: {
email: "[email protected]",
name: "Mr Nobody",
uri: "http://example.com"
},
description: "description",
id: "id",
infoWindowHtml: "html",
name: "name",
snippet: "snippet"
}
В следующем примере при нажатии элемента KML отображается соответствующий ему текст <Description> в боковой панели <div>:
function initMap() {
var map = new google.maps.Map(document.getElementById('map'), {
zoom: 12,
center: {lat: 37.06, lng: -95.68}
});
var kmlLayer = new google.maps.KmlLayer({
url: 'http://kml-samples.googlecode.com/svn/trunk/kml/Placemark/placemark.kml',
suppressInfoWindows: true,
map: map
});
kmlLayer.addListener('click', function(kmlEvent) {
var text = kmlEvent.featureData.description;
showInContentWindow(text);
});
function showInContentWindow(text) {
var sidediv = document.getElementById('content-window');
sidediv.innerHTML = text;
}
}
