public void RenderViewContextTest() { StringDictionary parameters = new StringDictionary(); parameters.Add("styles", "default"); parameters.Add("width", "512"); parameters.Add("height", "512"); parameters.Add("crs", "EPSG:4326"); parameters.Add("layers", "world_admin"); parameters.Add("bgcolor", "0x0000FF"); parameters.Add("version", "1.3.0"); parameters.Add("format", "image/png"); parameters.Add("request", "GetMap"); parameters.Add("bbox", "-180,-85,180,85"); ViewContext context = new ViewContext(); // add context details inline for test, this is normally done by ViewContext(parameters) // which applies details from configuration files etc. context.General.Window.Width = 512; context.General.Window.Height = 512; Layer layer = new Layer(); layer.Title = "World Administration Boundaries"; layer.Table = "world_admin"; layer.Name = "world_admin"; layer.GeometryColumn = "shape"; layer.FeatureIdColumn = "fid"; layer.ConnectionString = "Data Source=.\\SQLEXPRESS;AttachDbFilename=C:\\Projects\\GeospatialServices\\TestGeospatialServices\\Input\\Runtime\\TestGeospatialServicesDatabase.mdf;Integrated Security=True;User Instance=True"; Style style = new Style(); UserLayer userLayer = new UserLayer(); userLayer.UserStyles = new List <UserStyle>(); UserStyle userStyle = new UserStyle(); FeatureTypeStyle featureTypeStyle = new FeatureTypeStyle(); Rule rule = new Rule(); PolygonSymbolizer polygon = new PolygonSymbolizer(); style.Name = "default"; userLayer.Name = "World in green"; polygon.Fill.SvgParameters.Add(new SvgParameter("fill", "#2E8C7C")); BaseSymbolizer[] symbolizers = new BaseSymbolizer[] { polygon }; rule.Symbolizers = symbolizers; featureTypeStyle.Rules.Add(rule); userStyle.FeatureTypeStyles.Add(featureTypeStyle); userLayer.UserStyles.Add(userStyle); style.SLD.StyledLayerDescriptor.UserLayers.Add(userLayer); layer.StyleList.Add(style); context.Layers.Add(layer); System.Drawing.Image mapImage = context.Render(parameters); }
public override void ProcessStyles(FeatureTypeStyleCollection styles) { if (styles.Count > 0) { FeatureTypeStyleCollection newStyles = new FeatureTypeStyleCollection(); foreach (FeatureTypeStyle style in styles) { for (int ri = 0; ri < style.Rules.Count; ri++) { Rule rule = style.Rules[ri]; for (int si = 0; si < rule.Symbolizers.Count; si++) { Symbolizer sym = rule.Symbolizers[si]; Dictionary<string, string> props = sym.Tag as Dictionary<string, string>; if (props != null && props.ContainsKey("comp-op")) { // Create new style and copy all previous rules. FeatureTypeStyle newStyle = CopyStyle(style, 0, ri + 1, si); newStyles.Add(newStyle); FeatureTypeStyle newStyle2 = new FeatureTypeStyle(style.Name + "_comp-op_" + props["comp-op"]); newStyle2.BlendingOptions.CompositingMode = ToCompositingMode(props["comp-op"]); Rule newRule = CopyRule(rule); newRule.Symbolizers.Add(sym); newStyle2.Rules.Add(newRule); newStyles.Add(newStyle2); rule.Symbolizers.RemoveRange(0, si + 1); style.Rules.RemoveRange(0, ri + 1); ri = -1; break; } } } if (style.Rules.Count > 0) newStyles.Add(style); } if (newStyles.Count > styles.Count) { styles.Clear(); styles.AddRange(newStyles); } } }
private FeatureTypeStyle CopyStyle(FeatureTypeStyle style, int ruleIndex, int length, int lastRuleSymIndex) { FeatureTypeStyle newStyle = new FeatureTypeStyle(); newStyle.Name = style.Name; newStyle.BlendingOptions = style.BlendingOptions; newStyle.Enabled = style.Enabled; for (int ri = ruleIndex; ri < ruleIndex + length; ri++) { Rule rule = style.Rules[ri]; if (lastRuleSymIndex < 0) newStyle.Rules.Add(rule); else { if (ri + 1 == ruleIndex + length) { Rule newRule = CopyRule(rule, 0, lastRuleSymIndex); newStyle.Rules.Add(newRule); } else newStyle.Rules.Add(rule); } } return newStyle; }
public void ExerciseWmcFromCodeTest() { ViewContext context = new ViewContext(); // Context -> General context.General.Window.Width = 500; context.General.Window.Height = 300; context.General.BoundingBox.SRS = "EPSG:4326"; context.General.BoundingBox.MinX = -180; context.General.BoundingBox.MinY = -90; context.General.BoundingBox.MaxX = 180; context.General.BoundingBox.MaxY = 90; context.General.Title = "EOS Data Gateways"; context.General.KeywordList.Add("EOS"); context.General.KeywordList.Add("EOSDIS"); context.General.KeywordList.Add("NASA"); context.General.KeywordList.Add("CCRS"); context.General.KeywordList.Add("CEOS"); context.General.KeywordList.Add("OGC"); context.General.Abstract = "Map View of EOSDIS partners locations"; context.General.LogoURL.Width = 130; context.General.LogoURL.Height = 74; context.General.LogoURL.Format = "image/gif"; context.General.LogoURL.OnlineResource.Type = "simple"; context.General.LogoURL.OnlineResource.Href = "http://redhook.gsfc.nasa.gov/~imswww/pub/icons/logo.gif"; context.General.DescriptionURL.Format = "text/html"; context.General.DescriptionURL.OnlineResource.Type = "simple"; context.General.DescriptionURL.OnlineResource.Href = "http://eos.nasa.gov/imswelcome"; context.General.ContactInformation.ContactPersonPrimary.ContactPerson = "Tom Kralidis"; context.General.ContactInformation.ContactPersonPrimary.ContactOrganisation = "Canada Centre for Remote Sensing"; context.General.ContactInformation.ContactPosition = "Systems Scientist"; context.General.ContactInformation.ContactAddress.AddressType = "postal"; context.General.ContactInformation.ContactAddress.Address = "615 Booth Street, room 650"; context.General.ContactInformation.ContactAddress.City = "Ottawa"; context.General.ContactInformation.ContactAddress.StateOrProvince = "Ontario"; context.General.ContactInformation.ContactAddress.Country = "Canada"; context.General.ContactInformation.ContactVoiceTelephone = "+01 613 947 1828"; context.General.ContactInformation.ContactFacsimileTelephone = "+01 613 947 2410"; context.General.ContactInformation.ContactElectronicMailAddress = "*****@*****.**"; context.Version = "1.0"; context.Id = "TEST"; // Context -> Layer Layer layer = new Layer(); layer.Queryable = 1; layer.Hidden = 0; layer.Server.Service = GeospatialServices.Ogc.Common.ServiceNames.WMS; layer.Server.Version = "1.0.7"; layer.Title = "The GLOBE Program Visualization Server"; layer.Server.OnlineResource.Type = "simple"; layer.Server.OnlineResource.Href = "http://globe.digitalearth.gov/viz-bin/wmt.cgi"; layer.Name = "NATIONAL"; layer.Title = "National Boundaries"; layer.Abstract = "Context layer: National Boundaries"; layer.SRS = "EPSG:4326"; // Context -> Layer -> Format layer.FormatList.Add(new Format("GIF", 1)); // Context -> Layer -> Style Style style1 = new Style(); style1.Current = 1; style1.Name = "default"; style1.LegendURL.Width = 16; style1.LegendURL.Height = 16; style1.LegendURL.Format = "image/gif"; style1.LegendURL.OnlineResource.Type = "simple"; style1.LegendURL.OnlineResource.Href = "http://mapserv2.esrin.esa.it/cubestor/cubeserv.cgi?VERSION=1.1.0&REQUEST=GetLegendIcon&LAYER=WORLD_MODIS_1KM:MapAdmin&SPATIAL_TYPE=RASTER&STYLE=default&FORMAT=image//gif"; // Context -> Layer -> Style -> Named Layer NamedLayer namedLayer = new NamedLayer(); namedLayer.Name = "Roads"; // Context -> Layer -> Style -> Named Layer -> Named Styles namedLayer.NamedStyles.Add(new NamedStyle("Casing")); namedLayer.NamedStyles.Add(new NamedStyle("Centerline")); // Context -> Layer -> Style -> Named Layer -> User Style UserStyle userStyle1 = new UserStyle(); // Context -> Layer -> Style -> Named Layer -> User Style -> FeatureTypeStyle FeatureTypeStyle featureTypeStyle1 = new FeatureTypeStyle(); Rule rule1 = new Rule(); // Context -> Layer -> Style -> Named Layer -> User Style -> FeatureTypeStyle -> Rule -> Symbolizers BaseSymbolizer[] symbolizers = new BaseSymbolizer[6]; SymbolizerTypes[] symbolizerSelections = new SymbolizerTypes[6]; // Line Symbolizer LineSymbolizer lineSymbolizer = new LineSymbolizer(); lineSymbolizer.Geometry.PropertyName = "center-line"; lineSymbolizer.Stroke.SvgParameters.Add(new SvgParameter("stroke", "#0000ff")); lineSymbolizer.Stroke.SvgParameters.Add(new SvgParameter("stroke-width", "2")); symbolizers[0] = lineSymbolizer; symbolizerSelections[0] = SymbolizerTypes.LineSymbolizer; // Polygon Symbolizer PolygonSymbolizer polygonSymbolizer = new PolygonSymbolizer(); polygonSymbolizer.Geometry.PropertyName = "the_area"; polygonSymbolizer.Fill.SvgParameters.Add(new SvgParameter("fill", "#aaaaff")); polygonSymbolizer.Stroke.SvgParameters.Add(new SvgParameter("stroke", "#0000aa")); symbolizers[1] = polygonSymbolizer; symbolizerSelections[1] = SymbolizerTypes.PolygonSymbolizer; // Point Symbolizer PointSymbolizer pointSymbolizer = new PointSymbolizer(); // Point Symbolizer - > External Graphic 1 ExternalGraphic externalGraphic1 = new ExternalGraphic(); externalGraphic1.OnlineResource.Type = "simple"; externalGraphic1.OnlineResource.Href = "http://www.vendor.com/geosym/2267.svg"; externalGraphic1.Format = "image/svg+xml"; pointSymbolizer.Graphic.ExternalGraphics.Add(externalGraphic1); // Point Symbolizer - > External Graphic 2 ExternalGraphic externalGraphic2 = new ExternalGraphic(); externalGraphic2.OnlineResource.Type = "simple"; externalGraphic2.OnlineResource.Href = "http://www.vendor.com/geosym/2267.png"; externalGraphic2.Format = "image/png"; pointSymbolizer.Graphic.ExternalGraphics.Add(externalGraphic2); pointSymbolizer.Graphic.Size = 15.0; symbolizers[2] = pointSymbolizer; symbolizerSelections[2] = SymbolizerTypes.PointSymbolizer; // Text Symbolizer TextSymbolizer textSymbolizer = new TextSymbolizer(); textSymbolizer.Geometry.PropertyName = "locatedAt"; textSymbolizer.Label = @"ogc:PropertyName[hospitalName]"; textSymbolizer.Font.SvgParameters.Add(new SvgParameter("font-family", "Arial")); textSymbolizer.Font.SvgParameters.Add(new SvgParameter("font-family", "Sans-Serif")); textSymbolizer.Font.SvgParameters.Add(new SvgParameter("font-style", "italic")); textSymbolizer.Font.SvgParameters.Add(new SvgParameter("font-size", "10")); textSymbolizer.Fill.SvgParameters.Add(new SvgParameter("fill", "#000000")); textSymbolizer.LabelPlacement.PointPlacement = new PointPlacement(); textSymbolizer.LabelPlacement.PointPlacement.AnchorPoint.AnchorPointX = 456; textSymbolizer.LabelPlacement.PointPlacement.AnchorPoint.AnchorPointY = 123; textSymbolizer.LabelPlacement.PointPlacement.Rotation = 180; textSymbolizer.LabelPlacement.PointPlacement.Displacement.DisplacementX = 111; textSymbolizer.LabelPlacement.PointPlacement.Displacement.DisplacementY = 222; textSymbolizer.LabelPlacement.LinePlacement = new LinePlacement(); textSymbolizer.LabelPlacement.LinePlacement.Gap = 12; textSymbolizer.LabelPlacement.LinePlacement.GeneraliseLine = 3; textSymbolizer.LabelPlacement.LinePlacement.InitialGap = 3; textSymbolizer.LabelPlacement.LinePlacement.IsAligned = 0; textSymbolizer.LabelPlacement.LinePlacement.IsRepeated = 1; textSymbolizer.LabelPlacement.LinePlacement.PerpendicularOffset = 5; textSymbolizer.Halo.Fill = new Fill(); textSymbolizer.Halo.Fill.SvgParameters.Add(new SvgParameter("fill", "#000000")); textSymbolizer.Halo.Radius = 3; symbolizers[3] = textSymbolizer; symbolizerSelections[3] = SymbolizerTypes.TextSymbolizer; // Raster Symbolizer 1 RasterSymbolizer rasterSymbolizer1 = new RasterSymbolizer(); rasterSymbolizer1.Opacity = 1.0; rasterSymbolizer1.OverlapBehaviour = OverlapBehaviourTypes.Average; rasterSymbolizer1.ColourMap.Categorize.LookupValue = "Rasterdata"; rasterSymbolizer1.ColourMap.Categorize.Values.Add("#00ff00"); rasterSymbolizer1.ColourMap.Categorize.Thresholds.Add(-417); rasterSymbolizer1.ColourMap.Categorize.Values.Add("#00fa00"); rasterSymbolizer1.ColourMap.Categorize.Thresholds.Add(-333); symbolizers[4] = rasterSymbolizer1; symbolizerSelections[4] = SymbolizerTypes.RasterSymbolizer; // Raster Symbolizer 2 RasterSymbolizer rasterSymbolizer2 = new RasterSymbolizer(); rasterSymbolizer2.Opacity = 1.0; rasterSymbolizer2.OverlapBehaviour = OverlapBehaviourTypes.LatestOnTop; rasterSymbolizer2.ChannelSelection.RedChannel.SourceChannelName = "1"; rasterSymbolizer2.ChannelSelection.GreenChannel.SourceChannelName = "2"; rasterSymbolizer2.ChannelSelection.GreenChannel.ContrastEnhancement.GammaValue = 2.5; rasterSymbolizer2.ChannelSelection.BlueChannel.SourceChannelName = "3"; rasterSymbolizer2.ColourMap.Interpolate.FallBackValue = "#dddddd"; rasterSymbolizer2.ColourMap.Interpolate.LookupValue = "Rasterdata"; rasterSymbolizer2.ColourMap.Interpolate.InterpolationPoints.Add(new InterpolationPoint(0, "#000000")); rasterSymbolizer2.ColourMap.Interpolate.InterpolationPoints.Add(new InterpolationPoint(255, "#ffffff")); rasterSymbolizer2.ContrastEnhancement.GammaValue = 1; rasterSymbolizer2.Geometry.PropertyName = "Coastlines"; symbolizers[5] = rasterSymbolizer2; symbolizerSelections[5] = SymbolizerTypes.RasterSymbolizer; rule1.SymbolizerSelections = symbolizerSelections; rule1.Symbolizers = symbolizers; featureTypeStyle1.Rules.Add(rule1); Rule rule2 = new Rule(); rule2.ElseFilter = new ElseFilter(); featureTypeStyle1.Rules.Add(rule2); Rule rule3 = new Rule(); GeospatialServices.Ogc.Wmc.PropertyIsEqualTo propEqualTo = new PropertyIsEqualTo(); propEqualTo.Literal.Value = "NEW YORK"; propEqualTo.PropertyName = "SALES_AREA"; //BaseComparisonOps ComparisonOps[] = new BaseComparisonOps[2]; rule3.Filter.FilterExpression = propEqualTo; featureTypeStyle1.Rules.Add(rule3); userStyle1.FeatureTypeStyles.Add(featureTypeStyle1); namedLayer.UserStyles.Add(userStyle1); // Context - > Layer -> Style -> User Layer UserLayer userLayer = new UserLayer(); userLayer.Name = "Lakes and Rivers"; UserStyle userStyle = new UserStyle("Default"); userStyle.FeatureTypeStyles.Add(featureTypeStyle1); userLayer.UserStyles = new List <UserStyle>(); userLayer.UserStyles.Add(userStyle); style1.SLD.StyledLayerDescriptor.NamedLayers.Add(namedLayer); style1.SLD.StyledLayerDescriptor.UserLayers.Add(userLayer); layer.StyleList.Add(style1); context.Layers.Add(layer); }
public void RenderSLDInParametersTest() { StringBuilder sld = new StringBuilder(); sld.Append("<SLD>"); sld.Append("<sld:StyledLayerDescriptor>"); sld.Append("<sld:UserLayer>"); sld.Append("<sld:Name>World</sld:Name>"); sld.Append("<sld:UserStyles>"); sld.Append("<sld:UserStyle>"); sld.Append("<se:FeatureTypeStyle>"); sld.Append("<se:Rule>"); sld.Append("<se:PointSymbolizer>"); sld.Append("<se:Graphic>"); sld.Append("<se:Opacity>255</se:Opacity>"); sld.Append("<se:Mark>"); sld.Append("<se:WellKnownName>font://Webdings?CharIndex=114</se:WellKnownName>"); sld.Append("<se:Fill>"); sld.Append("<se:SvgParameter name=\"fill\">#000000</se:SvgParameter>"); sld.Append("</se:Fill>"); sld.Append("</se:Mark>"); sld.Append("<se:Size>12</se:Size>"); sld.Append("</se:Graphic>"); sld.Append("</se:PointSymbolizer>"); sld.Append("<se:PolygonSymbolizer>"); sld.Append("<se:Fill>"); sld.Append("<se:SvgParameter name=\"fill\">#2E8C7C</se:SvgParameter>"); sld.Append("<se:SvgParameter name=\"fill-opacity\">255</se:SvgParameter>"); sld.Append("</se:Fill>"); sld.Append("<se:Stroke>"); sld.Append("<se:SvgParameter name=\"stroke\">#206055</se:SvgParameter>"); sld.Append("<se:SvgParameter name=\"stroke-opacity\">255</se:SvgParameter>"); sld.Append("<se:SvgParameter name=\"stroke-width\">1</se:SvgParameter>"); sld.Append("</se:Stroke>"); sld.Append("</se:PolygonSymbolizer>"); sld.Append("<se:LineSymbolizer>"); sld.Append("<se:Stroke>"); sld.Append("<se:SvgParameter name=\"stroke\">#000000</se:SvgParameter>"); sld.Append("<se:SvgParameter name=\"stroke-width\">1</se:SvgParameter>"); sld.Append("<se:SvgParameter name=\"stroke-opacity\">255</se:SvgParameter>"); sld.Append("<se:SvgParameter name=\"stroke-dasharray\">Solid</se:SvgParameter>"); sld.Append("<se:SvgParameter name=\"stroke-linecap\">Flat</se:SvgParameter>"); sld.Append("<se:SvgParameter name=\"stroke-linejoin\">Miter</se:SvgParameter>"); sld.Append("</se:Stroke>"); sld.Append("</se:LineSymbolizer>"); sld.Append("</se:Rule>"); sld.Append("</se:FeatureTypeStyle>"); sld.Append("</sld:UserStyle>"); sld.Append("</sld:UserStyles>"); sld.Append("</sld:UserLayer>"); sld.Append("</sld:StyledLayerDescriptor>"); sld.Append("</SLD>"); StringDictionary parameters = new StringDictionary(); parameters.Add(WmsParameters.Styles, "default"); parameters.Add(WmsParameters.Width, "512"); parameters.Add(WmsParameters.Height, "512"); parameters.Add(WmsParameters.Crs, "EPSG:4326"); parameters.Add(WmsParameters.Layers, "world_admin"); parameters.Add(WmsParameters.BgColor, "0x0000FF"); parameters.Add("version", "1.3.0"); parameters.Add(WmsParameters.Format, "image/png"); parameters.Add("request", "GetMap"); parameters.Add(WmsParameters.Bbox, "-180,-85,180,85"); parameters.Add(WmsParameters.SldBody, sld.ToString()); ViewContext context = new ViewContext(); // add context details inline for test, this is normally done by ViewContext(parameters) // which applies details from configuration files etc. context.General.Window.Width = 512; context.General.Window.Height = 512; Layer layer = new Layer(); layer.Title = "World Administration Boundaries"; layer.Table = "world_admin"; layer.Name = "world_admin"; layer.GeometryColumn = "shape"; layer.FeatureIdColumn = "fid"; layer.ConnectionString = "Data Source=.\\SQLEXPRESS;AttachDbFilename=C:\\Projects\\GeospatialServices\\TestGeospatialServices\\Input\\Runtime\\TestGeospatialServicesDatabase.mdf;Integrated Security=True;User Instance=True"; Style style = new Style(); UserLayer userLayer = new UserLayer(); userLayer.UserStyles = new List <UserStyle>(); UserStyle userStyle = new UserStyle(); FeatureTypeStyle featureTypeStyle = new FeatureTypeStyle(); Rule rule = new Rule(); PolygonSymbolizer polygon = new PolygonSymbolizer(); style.Name = "default"; userLayer.Name = "World in green"; polygon.Fill.SvgParameters.Add(new SvgParameter("fill", "#2E8C7C")); BaseSymbolizer[] symbolizers = new BaseSymbolizer[] { polygon }; rule.Symbolizers = symbolizers; featureTypeStyle.Rules.Add(rule); userStyle.FeatureTypeStyles.Add(featureTypeStyle); userLayer.UserStyles.Add(userStyle); style.SLD.StyledLayerDescriptor.UserLayers.Add(userLayer); layer.StyleList.Add(style); context.Layers.Add(layer); System.Drawing.Image mapImage = context.Render(parameters); }
public static Map ReadFromFile(string fileContent, string fileName) { string path = Path.GetDirectoryName(fileName); CartoProject cartoProject = null; switch (Path.GetExtension(fileName).ToLower()) { case ".mml": cartoProject = JsonConvert.DeserializeObject <CartoProject>(fileContent); if (cartoProject.Interactivity != null) { try { Dictionary <string, object> dict = JsonConvert.DeserializeObject <Dictionary <string, object> >(cartoProject.Interactivity.ToString()); cartoProject.Interactivity = dict; } catch { } try { bool enabled = JsonConvert.DeserializeObject <bool>(cartoProject.Interactivity.ToString()); cartoProject.Interactivity = enabled; } catch { } } break; case ".yaml": using (StringReader input = new StringReader(fileContent)) { Deserializer deserializer = new Deserializer(namingConvention: new CamelCaseNamingConvention(), ignoreUnmatched: true); var parser = new MergingParser(new YamlDotNet.Core.Parser(input)); cartoProject = deserializer.Deserialize <CartoProject>(new EventReader(parser)); } break; default: throw new Exception("Unknown extension of the CartoCSS project."); } Map map = null; if (cartoProject.Stylesheet != null && cartoProject.Stylesheet.Length > 0 && cartoProject.Layers.Length > 0) { ICartoTranslator cartoTranslator = CartoGeneratorConverterFactory.CreateTranslator(cartoProject.Generator); CartoParser parser = new CartoParser(); parser.NodeProvider = new CartoNodeProvider(); Env env = new Env(); List <Ruleset> ruleSets = new List <Ruleset>(); List <CartoDefinition> definitions = new List <CartoDefinition>(); foreach (string styleName in cartoProject.Stylesheet) { string styleFileName = Path.Combine(path, styleName); try { Ruleset ruleSet = parser.Parse(File.ReadAllText(styleFileName), styleFileName, env); ruleSets.Add(ruleSet); // Get an array of Ruleset objects, flattened // and sorted according to specificitySort var defs = new List <CartoDefinition>(); defs = ruleSet.Flatten(defs, null, env); defs.Sort(new SpecificitySorter()); definitions.AddRange(defs); env.Frames.Push(ruleSet); } catch (Exception ex) { Exception ex2 = new IOException(string.Format("An error occured during parsing of the style '{0}'.", styleFileName) + ex.Message); LogFactory.WriteLogEntry(Logger.Default, ex2); throw ex2; } } string interactivityLayer = null; if (cartoProject.GetInteractivity() != null && cartoProject.GetInteractivity().ContainsKey("layer")) { interactivityLayer = cartoProject.GetInteractivity()["layer"].ToString(); } map = CreateMap(cartoProject, definitions, env, cartoTranslator); foreach (CartoLayer cartoLayer in cartoProject.Layers) { CartoDatasource datasource = cartoLayer.Datasource; StyledLayer styledLayer = CreateStyledLayer(cartoLayer, map, cartoTranslator); try { string[] classes = (cartoLayer.Class.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries)); Dictionary <string, bool> classIndex = new Dictionary <string, bool>(classes.Length); for (int i = 0; i < classes.Length; i++) { classIndex[classes[i]] = true; } var matching = definitions.FindAll(delegate(CartoDefinition def) { return(def.AppliesTo(cartoLayer.Name, classIndex)); }); if (matching.Count > 0) { List <CartoStyle> rules = InheritDefinitions(matching, env); if (rules.Count > 0) { SortStyles(rules, env); for (int k = 0; k < rules.Count; k++) { CartoStyle cartoStyle = rules[k]; cartoStyle.Fold(env); string styleName = cartoLayer.Name + (cartoStyle.Attachment != "__default__" ? "-" + cartoStyle.Attachment : ""); FeatureTypeStyle style = CreateStyle(styleName, cartoStyle, env, cartoTranslator); if (style.Rules.Count > 0) { styledLayer.Styles.Add(style); } } cartoTranslator.ProcessStyles(styledLayer.Styles); } if (!string.IsNullOrEmpty(interactivityLayer) && interactivityLayer.Equals(styledLayer.Name)) { styledLayer.Enabled = false; } map.AddLayer(styledLayer); } } catch (Exception ex) { Exception ex2 = new IOException(string.Format("Unable to create data source provider with type '{0}' for the layer '{1}'.", datasource.Type, cartoLayer.Name) + ex.Message); LogFactory.WriteLogEntry(Logger.Default, ex2); } } } return(map); }
/// <summary> /// Creates rules /// </summary> /// <param name="style"></param> /// <param name="def"></param> /// <param name="env"></param> /// <param name="existingFilters"></param> /// <param name="cartoTranslator"></param> private static void CreateRules(FeatureTypeStyle style, CartoDefinition def, Env env, Dictionary <string, int> existingFilters, ICartoTranslator cartoTranslator) { string filter = def.Filters.ToString(); if (!(existingFilters.ContainsKey(filter))) { existingFilters[filter] = 0x7FFFFF; } int available = 0x7FFFFF; ZoomStruct zooms = new ZoomStruct(); zooms.Available = available; NodeList <CartoRule> rules = def.Rules; for (int i = 0; i < rules.Count; i++) { CartoRule cartoRule = rules[i]; zooms.Rule = cartoRule.Zoom; if ((existingFilters[filter] & zooms.Rule) == 0) { continue; } while (((zooms.Current = zooms.Rule) & available) != 0) { Dictionary <string, Dictionary <string, CartoRule> > symbolizers = CollectSymbolizers(def, zooms, i, env, cartoTranslator); if (symbolizers != null && symbolizers.Count > 0) { if ((existingFilters[filter] & zooms.Current) == 0) { continue; } int zoom = existingFilters[filter] & zooms.Current; int startZoom = -1, endZoom = 0; for (int zi = 0; zi <= 22; zi++) { if ((zoom & (1 << zi)) != 0) { if (startZoom == -1) { startZoom = zi; } endZoom = zi; } } Rule rule = new Rule(); rule.Filter = ConvertUtility.ToFilter(def.Filters, cartoTranslator); rule.Name = cartoRule.Instance; if (startZoom > 0) { rule.MaxScale = ConvertUtility.ToScaleDenominator(startZoom); } if (endZoom > 0) { rule.MinScale = ConvertUtility.ToScaleDenominator(endZoom + 1); } CreateSymbolizers(rule, symbolizers, env, cartoTranslator); existingFilters[filter] &= ~zooms.Current; // Check whether the rule has at least one visible symbolizer if (rule.Symbolizers.Count > 0 && rule.Symbolizers.Any(s => s.Enabled == true)) { style.Rules.Add(rule); } } } } //style.Rules.Sort(new RuleComparer()); }
/// <summary> /// Creates <see cref="FeatureTypeStyle"/> object /// </summary> /// <param name="styleName"></param> /// <param name="cartoStyle"></param> /// <param name="env"></param> /// <param name="cartoTranslator"></param> /// <returns></returns> private static FeatureTypeStyle CreateStyle(string styleName, CartoStyle cartoStyle, Env env, ICartoTranslator cartoTranslator) { FeatureTypeStyle style = new FeatureTypeStyle(styleName); style.ProcessFeatureOnce = true; List <CartoDefinition> definitions = cartoStyle.Definitions; Dictionary <string, int> existingFilters = null; List <string> imageFilters = new List <string>(); List <string> imageFiltersBuffer = new List <string>(); int k = 0; for (int i = 0; i < definitions.Count; i++) { CartoDefinition def = definitions[i]; NodeList <CartoRule> rules = def.Rules; for (int j = 0; j < rules.Count; j++) { CartoRule cartoRule = rules[j]; string ruleName = cartoRule.Name; if (ruleName == "image-filters") { string filter = cartoRule.Value.ToString(); if (!imageFilters.Contains(filter)) { style.ImageFiltersOptions.Filters.Add(cartoTranslator.ToImageFilter(filter)); style.ImageFiltersOptions.Enabled = true; imageFilters.Add(filter); } k++; } else if (ruleName == "image-filters-inflate") { bool inflate = Convert.ToBoolean(cartoRule.Value.ToString()); if (inflate) { style.ImageFiltersOptions.Enabled = true; } k++; } else if (ruleName == "direct-image-filters") { string filter = cartoRule.Value.ToString(); if (!imageFiltersBuffer.Contains(filter)) { style.ImageFiltersOptions.BufferFilters.Add(cartoTranslator.ToImageFilter(filter)); style.ImageFiltersOptions.Enabled = true; imageFiltersBuffer.Add(filter); } k++; } else if (ruleName == "comp-op") { style.BlendingOptions.CompositingMode = cartoTranslator.ToCompositingMode(cartoRule.Value.Evaluate(env).ToString()); k++; } else if (ruleName == "opacity") { style.BlendingOptions.Opacity = (float)(cartoRule.Value.Evaluate(env) as Number).Value; k++; } if (ruleName == "filter-mode") { string filterMode = cartoRule.Value.Evaluate(env).ToCSS(env); if (string.Equals(filterMode, "all")) { style.ProcessFeatureOnce = false; } else if (string.Equals(filterMode, "first")) { style.ProcessFeatureOnce = true; } k++; } } if (k < rules.Count) { if (existingFilters == null) { existingFilters = new Dictionary <string, int>(); } CreateRules(style, def, env, existingFilters, cartoTranslator); } } return(style); }
/// <summary> /// Creates rules /// </summary> /// <param name="style"></param> /// <param name="def"></param> /// <param name="env"></param> /// <param name="existingFilters"></param> /// <param name="cartoTranslator"></param> private static void CreateRules(FeatureTypeStyle style, CartoDefinition def, Env env, Dictionary<string, int> existingFilters, ICartoTranslator cartoTranslator) { string filter = def.Filters.ToString(); if (!(existingFilters.ContainsKey(filter))) existingFilters[filter] = 0x7FFFFF; int available = 0x7FFFFF; ZoomStruct zooms = new ZoomStruct(); zooms.Available = available; NodeList<CartoRule> rules = def.Rules; for (int i = 0; i < rules.Count; i++) { CartoRule cartoRule = rules[i]; zooms.Rule = cartoRule.Zoom; if ((existingFilters[filter] & zooms.Rule) == 0) continue; while (((zooms.Current = zooms.Rule) & available) != 0) { Dictionary<string, Dictionary<string, CartoRule>> symbolizers = CollectSymbolizers(def, zooms, i, env, cartoTranslator); if (symbolizers != null && symbolizers.Count > 0) { if ((existingFilters[filter] & zooms.Current) == 0) continue; int zoom = existingFilters[filter] & zooms.Current; int startZoom = -1, endZoom = 0; for (int zi = 0; zi <= 22; zi++) { if ((zoom & (1 << zi)) != 0) { if (startZoom == -1) startZoom = zi; endZoom = zi; } } Rule rule = new Rule(); rule.Filter = ConvertUtility.ToFilter(def.Filters, cartoTranslator); rule.Name = cartoRule.Instance; if (startZoom > 0) rule.MaxScale = ConvertUtility.ToScaleDenominator(startZoom); if (endZoom > 0) rule.MinScale = ConvertUtility.ToScaleDenominator(endZoom + 1); CreateSymbolizers(rule, symbolizers, env, cartoTranslator); existingFilters[filter] &= ~zooms.Current; // Check whether the rule has at least one visible symbolizer if (rule.Symbolizers.Count > 0 && rule.Symbolizers.Any(s => s.Enabled == true)) style.Rules.Add(rule); } } } //style.Rules.Sort(new RuleComparer()); }
/// <summary> /// Creates <see cref="FeatureTypeStyle"/> object /// </summary> /// <param name="styleName"></param> /// <param name="cartoStyle"></param> /// <param name="env"></param> /// <param name="cartoTranslator"></param> /// <returns></returns> private static FeatureTypeStyle CreateStyle(string styleName, CartoStyle cartoStyle, Env env, ICartoTranslator cartoTranslator) { FeatureTypeStyle style = new FeatureTypeStyle(styleName); style.ProcessFeatureOnce = true; List<CartoDefinition> definitions = cartoStyle.Definitions; Dictionary<string, int> existingFilters = null; List<string> imageFilters = new List<string>(); List<string> imageFiltersBuffer = new List<string>(); int k = 0; for (int i = 0; i < definitions.Count; i++) { CartoDefinition def = definitions[i]; NodeList<CartoRule> rules = def.Rules; for (int j = 0; j < rules.Count; j++) { CartoRule cartoRule = rules[j]; string ruleName = cartoRule.Name; if (ruleName == "image-filters") { string filter = cartoRule.Value.ToString(); if (!imageFilters.Contains(filter)) { style.ImageFiltersOptions.Filters.Add(cartoTranslator.ToImageFilter(filter)); style.ImageFiltersOptions.Enabled = true; imageFilters.Add(filter); } k++; } else if (ruleName == "image-filters-inflate") { bool inflate = Convert.ToBoolean(cartoRule.Value.ToString()); if (inflate) style.ImageFiltersOptions.Enabled = true; k++; } else if (ruleName == "direct-image-filters") { string filter = cartoRule.Value.ToString(); if (!imageFiltersBuffer.Contains(filter)) { style.ImageFiltersOptions.BufferFilters.Add(cartoTranslator.ToImageFilter(filter)); style.ImageFiltersOptions.Enabled = true; imageFiltersBuffer.Add(filter); } k++; } else if (ruleName == "comp-op") { style.BlendingOptions.CompositingMode = cartoTranslator.ToCompositingMode(cartoRule.Value.Evaluate(env).ToString()); k++; } else if (ruleName == "opacity") { style.BlendingOptions.Opacity = (float)(cartoRule.Value.Evaluate(env) as Number).Value; k++; } if (ruleName == "filter-mode") { string filterMode = cartoRule.Value.Evaluate(env).ToCSS(env); if (string.Equals(filterMode, "all")) style.ProcessFeatureOnce = false; else if (string.Equals(filterMode, "first")) style.ProcessFeatureOnce = true; k++; } } if (k < rules.Count) { if (existingFilters == null) existingFilters = new Dictionary<string, int>(); CreateRules(style, def, env, existingFilters, cartoTranslator); } } return style; }