Data Layer представляет собой слой отображения и управления геопространственными данными, построенный поверх базовой карты. Он оперирует объектами GeoJSON и внутренними геометрическими сущностями API, предоставляя механизм связывания данных и визуального представления.
Каждый объект Data Layer включает:
Стилизация Data Layer отделяет данные от визуального представления, позволяя динамически изменять внешний вид объектов без модификации исходного GeoJSON.
Основной инструмент управления внешним видом объектов Data Layer —
метод setStyle. Он принимает либо объект стиля, либо
функцию, возвращающую стиль для каждого feature.
Фиксированный стиль применяется ко всем объектам слоя:
map.data.setStyle({
fillColor: "#2E86DE",
fillOpacity: 0.5,
strokeColor: "#1B4F72",
strokeWeight: 2,
clickable: true
});
Поддерживаемые параметры стиля включают:
fillColor — цвет заливки полигоновfillOpacity — прозрачность заливкиstrokeColor — цвет границыstrokeOpacity — прозрачность линииstrokeWeight — толщина линииicon — иконка для точечных объектовzIndex — порядок наложенияvisible — отображение объектаclickable — интерактивностьФункция стилизации позволяет задавать внешний вид в зависимости от свойств объекта:
map.data.setStyle((feature) => {
const type = feature.getProperty("type");
if (type === "park") {
return {
fillColor: "#27AE60",
strokeColor: "#145A32",
fillOpacity: 0.6
};
}
if (type === "water") {
return {
fillColor: "#3498DB",
strokeColor: "#21618C",
fillOpacity: 0.4
};
}
return {
fillColor: "#BDC3C7",
strokeColor: "#7F8C8D"
};
});
Такой подход используется при работе с тематическими картами, где визуализация зависит от атрибутов данных.
GeoJSON-объекты, загружаемые в Data Layer, могут содержать произвольные свойства:
map.data.addGeoJson({
type: "Feature",
geometry: {
type: "Polygon",
coordinates: [...]
},
properties: {
population: 120000,
region: "north"
}
});
Стилизация на основе числовых диапазонов:
map.data.setStyle((feature) => {
const population = feature.getProperty("population");
return {
fillColor: population > 100000 ? "#E74C3C" : "#F1C40F",
fillOpacity: 0.5,
strokeWeight: 1
};
});
Применение порогов и категорий позволяет формировать хлороплетные карты и аналитические визуализации.
Data Layer поддерживает события взаимодействия с объектами, что позволяет изменять стиль в реальном времени.
map.data.addListener("mouseover", (event) => {
map.data.overrideStyle(event.feature, {
fillColor: "#8E44AD",
strokeWeight: 3
});
});
map.data.addListener("mouseout", (event) => {
map.data.revertStyle(event.feature);
});
Методы:
overrideStyle(feature, style) — временное
переопределениеrevertStyle(feature) — возврат к базовому стилюТакой механизм используется для эффектов hover, выделения и интерактивного анализа.
Стили Data Layer применяются в следующем порядке:
setStyleoverrideStyleOverride всегда имеет наивысший приоритет до момента сброса.
Для точечных объектов используется параметр icon,
который поддерживает как растровые иконки, так и SVG-описания:
map.data.setStyle((feature) => {
const category = feature.getProperty("category");
return {
icon: {
url: category === "restaurant"
? "/icons/restaurant.png"
: "/icons/default.png",
scaledSize: new google.maps.Size(24, 24)
}
};
});
SVG-иконки позволяют динамически менять цвет и форму:
icon: {
path: google.maps.SymbolPath.CIRCLE,
scale: 6,
fillColor: "#2C3E50",
fillOpacity: 1,
strokeWeight: 1
}
Функция стиля вызывается для каждого feature при рендеринге. При большом объёме данных критично избегать:
Оптимизированный подход — предварительная индексация свойств:
const styleCache = {
high: { fillColor: "#E74C3C" },
medium: { fillColor: "#F39C12" },
low: { fillColor: "#2ECC71" }
};
map.data.setStyle((feature) => {
return styleCache[feature.getProperty("level")] || {};
});
Использование прозрачности позволяет формировать многослойную визуализацию:
map.data.setStyle((feature) => {
const importance = feature.getProperty("importance");
return {
fillOpacity: importance === "high" ? 0.7 : 0.2,
strokeOpacity: importance === "high" ? 1 : 0.3
};
});
Такой подход используется для выделения ключевых зон без скрытия контекста карты.
LineString-объекты требуют настройки strokeWeight,
strokeColor и strokeOpacity.
map.data.setStyle((feature) => {
const routeType = feature.getProperty("route");
return {
strokeColor: routeType === "main" ? "#C0392B" : "#7F8C8D",
strokeWeight: routeType === "main" ? 4 : 2,
strokeOpacity: 0.9
};
});
Дополнительный эффект достигается использованием пунктирных линий
через icons в полилиниях.
Хотя Data Layer не предоставляет прямого события масштаба в стиле,
изменение стилей возможно через слушатель zoom_changed:
map.addListener("zoom_changed", () => {
const zoom = map.getZoom();
map.data.setStyle({
strokeWeight: zoom > 10 ? 3 : 1,
fillOpacity: zoom > 12 ? 0.6 : 0.3
});
});
Такой подход используется для адаптивной детализации.
Сложные визуализации часто объединяют несколько факторов:
map.data.setStyle((feature) => {
const type = feature.getProperty("type");
const value = feature.getProperty("value");
let baseColor = "#95A5A6";
if (type === "urban") baseColor = "#2980B9";
if (type === "rural") baseColor = "#27AE60";
return {
fillColor: baseColor,
fillOpacity: value > 50 ? 0.7 : 0.3,
strokeWeight: value > 50 ? 2 : 1
};
});
Свойство visible позволяет исключать объекты из
рендеринга без удаления из слоя:
map.data.setStyle((feature) => {
const active = feature.getProperty("active");
return {
visible: active === true
};
});
Этот механизм используется для фильтрации данных на клиенте.
Полный сброс стилизации возвращает Data Layer к базовому состоянию:
map.data.setStyle(null);
При этом все override-стили также очищаются:
map.data.revertStyle();
При проектировании сложных картовых систем стилизация Data Layer обычно выносится в отдельный модуль:
Такой подход снижает связность и упрощает поддержку больших GeoJSON-наборов, где количество features измеряется тысячами или десятками тысяч объектов.