public static List <TangramLayerGroup> ProcessLayers(Dictionary <string, string> replacedSources, IList <Layer> layers) { List <Layer> layerWithNoSourceList = layers.Where(item => item.Type == null && !IsLayerIgnored(item)).ToList(); List <Layer> layerWithSourceList = layers.Where(item => item.Type != null && !IsLayerIgnored(item)).ToList(); List <Layer> reSourcedList = new List <Layer>(); List <Layer> usedLayers = new List <Layer>(); List <TangramLayerGroup> tangramLayerGroups = new List <TangramLayerGroup>(); ProcessLayers(replacedSources, layerWithNoSourceList, layerWithSourceList, reSourcedList, tangramLayerGroups, usedLayers); if (reSourcedList.Count > 0) { layerWithSourceList.Clear(); layerWithSourceList.AddRange(reSourcedList); reSourcedList.Clear(); ProcessLayers(replacedSources, layerWithNoSourceList, layerWithSourceList, reSourcedList, tangramLayerGroups, usedLayers); } foreach (Layer layer in usedLayers) { TangramLayer layerFound = null; foreach (var layerGroup in tangramLayerGroups) { foreach (var layerGroupLayer in layerGroup) { if (layerGroupLayer.LayerWithSource == layer) { layerFound = layerGroupLayer; } } if (layerFound != null) { layerGroup.Remove(layerFound); break; } } } foreach (var layerMissed in layerWithNoSourceList) { Converter.AppendDebug("missed layer", layerMissed.Id); } return(tangramLayerGroups); }
private static void ProcessLayers(Dictionary <string, string> replacedSources, List <Layer> layerWithNoSourceList, List <Layer> layerWithSourceList, List <Layer> reSourcedList, List <TangramLayerGroup> tangramLayerGroups, List <Layer> usedLayers) { foreach (var layerWithSource in layerWithSourceList) { bool isCasing = IsCasing(layerWithSource.Id); List <Layer> refLayers = null; if (layerWithSource.Ref == null) { refLayers = layerWithNoSourceList.Where(item => item.Ref == layerWithSource.Id).ToList <Layer>(); if (refLayers != null) { foreach (Layer refLayer in refLayers) { layerWithNoSourceList.Remove(refLayer); refLayer.Filter = layerWithSource.Filter; refLayer.Source = layerWithSource.Source; refLayer.SourceLayer = layerWithSource.SourceLayer; if (refLayer.Layout != null) { refLayer.Layout.LineCap = layerWithSource.Layout.LineCap; refLayer.Layout.LineJoin = layerWithSource.Layout.LineJoin; } else { refLayer.Layout = layerWithSource.Layout; } reSourcedList.Add(refLayer); } } //refLayers.Clear(); } if (layerWithSource.Id.StartsWith("bridge") && (layerWithSource.Id.EndsWith(CaseSuffix) || layerWithSource.Id.EndsWith(CasingSuffix))) { var realLayers = layerWithSourceList.Where(item => item.Id == NormaliseName(layerWithSource.Id)).ToList(); if (realLayers.Count > 0) { refLayers.Add(realLayers[0]); usedLayers.Add(realLayers[0]); } } // to join OpenMapTiles casing and regular road layers together as we need to specify width for lines with outlines if (layerWithSource.Id.EndsWith("_casing") && refLayers.Count == 0) { var lineWidthLayers = layerWithSourceList.Where(item => item.Id == layerWithSource.Id.Replace("_casing", "")).ToList(); if (lineWidthLayers.Count == 1) { refLayers.Add(lineWidthLayers[0]); } } TangramLayer tangramLayer = new TangramLayer(layerWithSource, refLayers); TangramLayerGroup tangramLayerGroup = tangramLayerGroups.FirstOrDefault(item => item.SourceLayer != null && item.SourceLayer.ToString() == layerWithSource.SourceLayer && item.IsCasing == isCasing); if (tangramLayerGroup == null) { tangramLayerGroup = new TangramLayerGroup(replacedSources, layerWithSource.SourceLayer, isCasing); tangramLayerGroups.Add(tangramLayerGroup); } tangramLayerGroup.Add(tangramLayer); } }