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);
        }
Beispiel #6
0
        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);
        }
Beispiel #7
0
        /// <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());
        }
Beispiel #8
0
        /// <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;
    }