Data Layer представляет собой специализированный слой в Google Maps JavaScript API, предназначенный для работы с геопространственными данными в формате GeoJSON и внутренними объектами Feature. Он отделяет визуализацию геометрии от бизнес-логики, позволяя управлять наборами объектов как единым целым.
Ключевая идея заключается в том, что карта перестаёт быть набором разрозненных маркеров и фигур. Вместо этого формируется структурированная модель данных, где каждая сущность имеет:
Data Layer становится промежуточным уровнем между источником данных (GeoJSON, API, база данных) и визуальным представлением на карте.
Основной единицей Data Layer является Feature. Она соответствует объекту GeoJSON и может содержать:
Каждая Feature включает:
Пример GeoJSON-объекта:
const geoJsonObject = {
type: "FeatureCollection",
features: [
{
type: "Feature",
geometry: {
type: "Polygon",
coordinates: [
[
[37.62, 55.75],
[37.65, 55.75],
[37.65, 55.77],
[37.62, 55.77],
[37.62, 55.75]
]
]
},
properties: {
name: "Зона интереса",
category: "restricted"
}
}
]
};
Загрузка данных в Data Layer выполняется через метод
addGeoJson:
map.data.addGeoJson(geoJsonObject);
Этот вызов автоматически преобразует GeoJSON в внутренние объекты API.
Data Layer доступен через свойство map.data после
создания карты.
const map = new google.maps.Map(document.getElementById("map"), {
center: { lat: 55.75, lng: 37.62 },
zoom: 10
});
Даже без добавления данных слой существует и готов к работе:
console.log(map.data);
map.data.addGeoJson(geoJsonObject);
Метод возвращает массив созданных Feature-объектов, что позволяет сразу работать с ними программно.
map.data.add({
geometry: new google.maps.Data.Point({ lat: 55.75, lng: 37.62 }),
properties: {
name: "Точка интереса"
}
});
Такой способ используется, когда данные формируются динамически и не представлены в GeoJSON.
Одной из ключевых возможностей Data Layer является централизованная стилизация.
Метод setStyle позволяет задавать функцию или объект
стиля:
map.data.setStyle((feature) => {
const category = feature.getProperty("category");
return {
fillColor: category === "restricted" ? "red" : "green",
strokeWeight: 2,
strokeColor: "#333",
fillOpacity: 0.4
};
});
Особенность подхода заключается в том, что стиль вычисляется на основе свойств Feature, а не задаётся отдельно для каждого объекта.
Поддерживаемые параметры стиля:
Каждая Feature может генерировать события, что делает Data Layer интерактивным уровнем.
map.data.addListener("click", (event) => {
const feature = event.feature;
const name = feature.getProperty("name");
console.log("Выбран объект:", name);
});
map.data.addListener("mouseover", (event) => {
map.data.overrideStyle(event.feature, {
fillColor: "blue"
});
});
map.data.addListener("mouseout", (event) => {
map.data.revertStyle();
});
Механизм overrideStyle позволяет временно изменять
отображение объекта без изменения глобального стиля.
Data Layer предоставляет API для работы с атрибутами объектов.
feature.setProperty("status", "active");
const status = feature.getProperty("status");
feature.setProperty("status", null);
Свойства используются как основной механизм хранения бизнес-логики внутри геометрических объектов.
Data Layer позволяет скрывать или показывать объекты без удаления данных.
map.data.setStyle((feature) => {
return {
visible: feature.getProperty("visible") !== false
};
});
Альтернативный подход — использование forEach и ручного
контроля:
map.data.forEach((feature) => {
if (feature.getProperty("type") === "temporary") {
map.data.remove(feature);
}
});
map.data.remove(feature);
map.data.forEach((feature) => {
map.data.remove(feature);
});
Или более короткий вариант:
map.data.setMap(null);
map.data.setMap(map);
Последний способ полностью пересоздаёт слой.
Каждый объект может иметь ID, что позволяет получать его напрямую:
const feature = map.data.getFeatureById("zone-1");
ID задаётся при создании GeoJSON:
{
type: "Feature",
id: "zone-1",
geometry: { ... },
properties: { ... }
}
Использование ID критично при работе с динамическими наборами данных.
const exported = map.data.toGeoJson((json) => {
console.log(json);
});
Метод формирует полный GeoJSON из текущего состояния слоя.
map.data.addGeoJson(jsonData);
Таким образом Data Layer может выступать в роли двустороннего адаптера между API и внешними источниками данных.
Хотя Data Layer не является GIS-движком, он поддерживает базовые операции над геометрией:
Пример MultiPolygon:
geometry: {
type: "MultiPolygon",
coordinates: [
[
[
[37.6, 55.7],
[37.7, 55.7],
[37.7, 55.8],
[37.6, 55.8],
[37.6, 55.7]
]
],
[
[
[37.8, 55.7],
[37.9, 55.7],
[37.9, 55.8],
[37.8, 55.8],
[37.8, 55.7]
]
]
]
}
Data Layer оптимизирован для работы с большими наборами GeoJSON, но имеет ряд особенностей:
addGeoJson, а не по одномуОптимизационные практики:
setStyleremove/add операций в
циклеData Layer строится вокруг событийной модели:
Пример обработки добавления:
map.data.addListener("addfeature", (event) => {
console.log("Добавлен объект:", event.feature);
});
Это позволяет строить реактивные интерфейсы поверх карты, где любое изменение данных автоматически отслеживается.
Data Layer работает независимо от:
Однако при необходимости можно синхронизировать данные:
map.data.addListener("click", (event) => {
new google.maps.Marker({
position: event.latLng,
map: map
});
});
Такая комбинация используется для создания гибридных визуализаций: статические данные через Data Layer и интерактивные элементы через стандартные overlay-объекты.
Data Layer часто становится центральным компонентом в приложениях, где требуется:
В таких системах Data Layer выступает как слой представления данных, отделённый от источника и бизнес-логики, что упрощает масштабирование и поддержку архитектуры.