mergeStyles static method
void
mergeStyles(})
Merges overlayStyle sources and layers into the baseStyle.
Useful for combining roads/railways into the active map style map.
Implementation
static void mergeStyles(
Map<String, dynamic> baseStyle,
Map<String, dynamic> overlayStyle, {
String? sourcePrefix,
String? layerPrefix,
}) {
// 1. Merge sources
if (overlayStyle['sources'] != null) {
baseStyle['sources'] ??= <String, dynamic>{};
final overlaySources = overlayStyle['sources'] as Map<String, dynamic>;
overlaySources.forEach((key, value) {
final newKey = sourcePrefix != null ? '$sourcePrefix-$key' : key;
baseStyle['sources'][newKey] = value;
});
}
// 2. Merge layers
if (overlayStyle['layers'] != null) {
baseStyle['layers'] ??= <dynamic>[];
final overlayLayers = overlayStyle['layers'] as List<dynamic>;
final baseLayers = baseStyle['layers'] as List<dynamic>;
for (final layer in overlayLayers) {
final layerMap = layer as Map<String, dynamic>;
// Update layer ID
if (layerPrefix != null) {
layerMap['id'] = '$layerPrefix-${layerMap['id']}';
}
// Update source reference
if (sourcePrefix != null && layerMap['source'] != null) {
if ((overlayStyle['sources'] as Map<String, dynamic>?)?.containsKey(
layerMap['source'],
) ==
true) {
layerMap['source'] = '$sourcePrefix-${layerMap['source']}';
}
}
// Initialize layout so we can toggle visibility later
layerMap['layout'] ??= <String, dynamic>{};
// Append or replace
final existingIndex = baseLayers.indexWhere(
(l) => (l as Map)['id'] == layerMap['id'],
);
if (existingIndex >= 0) {
baseLayers[existingIndex] = layerMap;
} else {
// Insert before symbols if possible to keep labels on top
baseLayers.insert(max(0, baseLayers.length - 2), layerMap);
}
}
}
}