mergeStyles static method

void mergeStyles(
  1. Map<String, dynamic> baseStyle,
  2. Map<String, dynamic> overlayStyle, {
  3. String? sourcePrefix,
  4. String? layerPrefix,
})

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);
      }
    }
  }
}