Encoder in GeoTools does not work for SLD












1















I'm trying to use GeoTools to write SLDs on the fly for an application I am developing. But try as I might, I can't get the SLDs to be output.



Starting with an SLD that looks like this:



<StyledLayerDescriptor xmlns="http://www.opengis.net/sld" version="1.0.0"
xsi:schemaLocation="http://www.opengis.net/sld http://schemas.opengis.net/sld/1.0.0/StyledLayerDescriptor.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<NamedLayer>
<Name>named_layer</Name>
<UserStyle>
<Name>style</Name>
<IsDefault>true</IsDefault>
<FeatureTypeStyle>
<Rule>
<PointSymbolizer>
<Graphic>
<Mark>
<WellKnownName>circle</WellKnownName>
<Fill>
<CssParameter name="fill">#00aa00</CssParameter>
</Fill>
<Stroke>
<CssParameter name="stroke">#000000</CssParameter>
<CssParameter name="stroke-width">0.15</CssParameter>
</Stroke>
</Mark>
<Size>8</Size>
</Graphic>
</PointSymbolizer>
</Rule>
</FeatureTypeStyle>
</UserStyle>
</NamedLayer>
</StyledLayerDescriptor>


I use the following code:



package com.example.sld;

import org.geotools.sld.SLDConfiguration;
import org.geotools.sld.bindings.SLD;
import org.geotools.styling.StyledLayerDescriptor;
import org.geotools.xml.Configuration;
import org.geotools.xml.Encoder;
import org.geotools.xml.Parser;
import org.xml.sax.SAXException;

import javax.xml.parsers.ParserConfigurationException;
import java.io.IOException;
import java.io.InputStream;

public class TestStyle {

private String style;

public TestStyle() {

Configuration config = new SLDConfiguration();
Parser parser = new Parser(config);

InputStream is = getClass().getResourceAsStream("test-sld.xml");

StyledLayerDescriptor sld = null;
try {
sld = (StyledLayerDescriptor) parser.parse(is);
} catch (SAXException e) {
e.printStackTrace();
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}

Configuration configuration = new SLDConfiguration();
Encoder encoder = new Encoder(configuration);
encoder.setOmitXMLDeclaration(true);
try {
this.style = encoder.encodeAsString(sld, SLD.STYLEDLAYERDESCRIPTOR);
} catch (IOException e) {
e.printStackTrace();
}

this.style = new String();

}
}


The SLD parses OK. I can inspect its structure in my debugger and it is read correctly. But on encoding, the resultant SLD is empty:



<sld:StyledLayerDescriptor xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:ogc="http://www.opengis.net/ogc" xmlns:sld="http://www.opengis.net/sld" xmlns:xlink="http://www.w3.org/1999/xlink"/>


What am I doing wrong?



(Version of GeoTools is 20.1, following the guide here: http://docs.geotools.org/latest/userguide/library/xml/style.html#encoder)



Thanks in advance










share|improve this question



























    1















    I'm trying to use GeoTools to write SLDs on the fly for an application I am developing. But try as I might, I can't get the SLDs to be output.



    Starting with an SLD that looks like this:



    <StyledLayerDescriptor xmlns="http://www.opengis.net/sld" version="1.0.0"
    xsi:schemaLocation="http://www.opengis.net/sld http://schemas.opengis.net/sld/1.0.0/StyledLayerDescriptor.xsd"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <NamedLayer>
    <Name>named_layer</Name>
    <UserStyle>
    <Name>style</Name>
    <IsDefault>true</IsDefault>
    <FeatureTypeStyle>
    <Rule>
    <PointSymbolizer>
    <Graphic>
    <Mark>
    <WellKnownName>circle</WellKnownName>
    <Fill>
    <CssParameter name="fill">#00aa00</CssParameter>
    </Fill>
    <Stroke>
    <CssParameter name="stroke">#000000</CssParameter>
    <CssParameter name="stroke-width">0.15</CssParameter>
    </Stroke>
    </Mark>
    <Size>8</Size>
    </Graphic>
    </PointSymbolizer>
    </Rule>
    </FeatureTypeStyle>
    </UserStyle>
    </NamedLayer>
    </StyledLayerDescriptor>


    I use the following code:



    package com.example.sld;

    import org.geotools.sld.SLDConfiguration;
    import org.geotools.sld.bindings.SLD;
    import org.geotools.styling.StyledLayerDescriptor;
    import org.geotools.xml.Configuration;
    import org.geotools.xml.Encoder;
    import org.geotools.xml.Parser;
    import org.xml.sax.SAXException;

    import javax.xml.parsers.ParserConfigurationException;
    import java.io.IOException;
    import java.io.InputStream;

    public class TestStyle {

    private String style;

    public TestStyle() {

    Configuration config = new SLDConfiguration();
    Parser parser = new Parser(config);

    InputStream is = getClass().getResourceAsStream("test-sld.xml");

    StyledLayerDescriptor sld = null;
    try {
    sld = (StyledLayerDescriptor) parser.parse(is);
    } catch (SAXException e) {
    e.printStackTrace();
    } catch (ParserConfigurationException e) {
    e.printStackTrace();
    } catch (IOException e) {
    e.printStackTrace();
    }

    Configuration configuration = new SLDConfiguration();
    Encoder encoder = new Encoder(configuration);
    encoder.setOmitXMLDeclaration(true);
    try {
    this.style = encoder.encodeAsString(sld, SLD.STYLEDLAYERDESCRIPTOR);
    } catch (IOException e) {
    e.printStackTrace();
    }

    this.style = new String();

    }
    }


    The SLD parses OK. I can inspect its structure in my debugger and it is read correctly. But on encoding, the resultant SLD is empty:



    <sld:StyledLayerDescriptor xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:ogc="http://www.opengis.net/ogc" xmlns:sld="http://www.opengis.net/sld" xmlns:xlink="http://www.w3.org/1999/xlink"/>


    What am I doing wrong?



    (Version of GeoTools is 20.1, following the guide here: http://docs.geotools.org/latest/userguide/library/xml/style.html#encoder)



    Thanks in advance










    share|improve this question

























      1












      1








      1


      1






      I'm trying to use GeoTools to write SLDs on the fly for an application I am developing. But try as I might, I can't get the SLDs to be output.



      Starting with an SLD that looks like this:



      <StyledLayerDescriptor xmlns="http://www.opengis.net/sld" version="1.0.0"
      xsi:schemaLocation="http://www.opengis.net/sld http://schemas.opengis.net/sld/1.0.0/StyledLayerDescriptor.xsd"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
      <NamedLayer>
      <Name>named_layer</Name>
      <UserStyle>
      <Name>style</Name>
      <IsDefault>true</IsDefault>
      <FeatureTypeStyle>
      <Rule>
      <PointSymbolizer>
      <Graphic>
      <Mark>
      <WellKnownName>circle</WellKnownName>
      <Fill>
      <CssParameter name="fill">#00aa00</CssParameter>
      </Fill>
      <Stroke>
      <CssParameter name="stroke">#000000</CssParameter>
      <CssParameter name="stroke-width">0.15</CssParameter>
      </Stroke>
      </Mark>
      <Size>8</Size>
      </Graphic>
      </PointSymbolizer>
      </Rule>
      </FeatureTypeStyle>
      </UserStyle>
      </NamedLayer>
      </StyledLayerDescriptor>


      I use the following code:



      package com.example.sld;

      import org.geotools.sld.SLDConfiguration;
      import org.geotools.sld.bindings.SLD;
      import org.geotools.styling.StyledLayerDescriptor;
      import org.geotools.xml.Configuration;
      import org.geotools.xml.Encoder;
      import org.geotools.xml.Parser;
      import org.xml.sax.SAXException;

      import javax.xml.parsers.ParserConfigurationException;
      import java.io.IOException;
      import java.io.InputStream;

      public class TestStyle {

      private String style;

      public TestStyle() {

      Configuration config = new SLDConfiguration();
      Parser parser = new Parser(config);

      InputStream is = getClass().getResourceAsStream("test-sld.xml");

      StyledLayerDescriptor sld = null;
      try {
      sld = (StyledLayerDescriptor) parser.parse(is);
      } catch (SAXException e) {
      e.printStackTrace();
      } catch (ParserConfigurationException e) {
      e.printStackTrace();
      } catch (IOException e) {
      e.printStackTrace();
      }

      Configuration configuration = new SLDConfiguration();
      Encoder encoder = new Encoder(configuration);
      encoder.setOmitXMLDeclaration(true);
      try {
      this.style = encoder.encodeAsString(sld, SLD.STYLEDLAYERDESCRIPTOR);
      } catch (IOException e) {
      e.printStackTrace();
      }

      this.style = new String();

      }
      }


      The SLD parses OK. I can inspect its structure in my debugger and it is read correctly. But on encoding, the resultant SLD is empty:



      <sld:StyledLayerDescriptor xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:ogc="http://www.opengis.net/ogc" xmlns:sld="http://www.opengis.net/sld" xmlns:xlink="http://www.w3.org/1999/xlink"/>


      What am I doing wrong?



      (Version of GeoTools is 20.1, following the guide here: http://docs.geotools.org/latest/userguide/library/xml/style.html#encoder)



      Thanks in advance










      share|improve this question














      I'm trying to use GeoTools to write SLDs on the fly for an application I am developing. But try as I might, I can't get the SLDs to be output.



      Starting with an SLD that looks like this:



      <StyledLayerDescriptor xmlns="http://www.opengis.net/sld" version="1.0.0"
      xsi:schemaLocation="http://www.opengis.net/sld http://schemas.opengis.net/sld/1.0.0/StyledLayerDescriptor.xsd"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
      <NamedLayer>
      <Name>named_layer</Name>
      <UserStyle>
      <Name>style</Name>
      <IsDefault>true</IsDefault>
      <FeatureTypeStyle>
      <Rule>
      <PointSymbolizer>
      <Graphic>
      <Mark>
      <WellKnownName>circle</WellKnownName>
      <Fill>
      <CssParameter name="fill">#00aa00</CssParameter>
      </Fill>
      <Stroke>
      <CssParameter name="stroke">#000000</CssParameter>
      <CssParameter name="stroke-width">0.15</CssParameter>
      </Stroke>
      </Mark>
      <Size>8</Size>
      </Graphic>
      </PointSymbolizer>
      </Rule>
      </FeatureTypeStyle>
      </UserStyle>
      </NamedLayer>
      </StyledLayerDescriptor>


      I use the following code:



      package com.example.sld;

      import org.geotools.sld.SLDConfiguration;
      import org.geotools.sld.bindings.SLD;
      import org.geotools.styling.StyledLayerDescriptor;
      import org.geotools.xml.Configuration;
      import org.geotools.xml.Encoder;
      import org.geotools.xml.Parser;
      import org.xml.sax.SAXException;

      import javax.xml.parsers.ParserConfigurationException;
      import java.io.IOException;
      import java.io.InputStream;

      public class TestStyle {

      private String style;

      public TestStyle() {

      Configuration config = new SLDConfiguration();
      Parser parser = new Parser(config);

      InputStream is = getClass().getResourceAsStream("test-sld.xml");

      StyledLayerDescriptor sld = null;
      try {
      sld = (StyledLayerDescriptor) parser.parse(is);
      } catch (SAXException e) {
      e.printStackTrace();
      } catch (ParserConfigurationException e) {
      e.printStackTrace();
      } catch (IOException e) {
      e.printStackTrace();
      }

      Configuration configuration = new SLDConfiguration();
      Encoder encoder = new Encoder(configuration);
      encoder.setOmitXMLDeclaration(true);
      try {
      this.style = encoder.encodeAsString(sld, SLD.STYLEDLAYERDESCRIPTOR);
      } catch (IOException e) {
      e.printStackTrace();
      }

      this.style = new String();

      }
      }


      The SLD parses OK. I can inspect its structure in my debugger and it is read correctly. But on encoding, the resultant SLD is empty:



      <sld:StyledLayerDescriptor xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:ogc="http://www.opengis.net/ogc" xmlns:sld="http://www.opengis.net/sld" xmlns:xlink="http://www.w3.org/1999/xlink"/>


      What am I doing wrong?



      (Version of GeoTools is 20.1, following the guide here: http://docs.geotools.org/latest/userguide/library/xml/style.html#encoder)



      Thanks in advance







      java xml gis geotools sld






      share|improve this question













      share|improve this question











      share|improve this question




      share|improve this question










      asked Nov 28 '18 at 6:10









      MichaelMichael

      174




      174
























          1 Answer
          1






          active

          oldest

          votes


















          1














          Your approach would work if you had a version 1.1.0 SLD (or more properly an SE) document, and if you used a import org.geotools.sld.v1_1.SLD object to pass to the encoder. However you have a version 1.0.0 SLD document so you need to use a
          SLDTransformer class to output your style objects. So something like:



          ByteArrayOutputStream bos = new ByteArrayOutputStream();
          SLDTransformer transformer = new SLDTransformer();
          transformer.setIndentation(2);
          transformer.transform(sld, bos);
          String style = bos.toString();
          System.out.println(style);





          share|improve this answer

























            Your Answer






            StackExchange.ifUsing("editor", function () {
            StackExchange.using("externalEditor", function () {
            StackExchange.using("snippets", function () {
            StackExchange.snippets.init();
            });
            });
            }, "code-snippets");

            StackExchange.ready(function() {
            var channelOptions = {
            tags: "".split(" "),
            id: "1"
            };
            initTagRenderer("".split(" "), "".split(" "), channelOptions);

            StackExchange.using("externalEditor", function() {
            // Have to fire editor after snippets, if snippets enabled
            if (StackExchange.settings.snippets.snippetsEnabled) {
            StackExchange.using("snippets", function() {
            createEditor();
            });
            }
            else {
            createEditor();
            }
            });

            function createEditor() {
            StackExchange.prepareEditor({
            heartbeatType: 'answer',
            autoActivateHeartbeat: false,
            convertImagesToLinks: true,
            noModals: true,
            showLowRepImageUploadWarning: true,
            reputationToPostImages: 10,
            bindNavPrevention: true,
            postfix: "",
            imageUploader: {
            brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
            contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
            allowUrls: true
            },
            onDemand: true,
            discardSelector: ".discard-answer"
            ,immediatelyShowMarkdownHelp:true
            });


            }
            });














            draft saved

            draft discarded


















            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53513177%2fencoder-in-geotools-does-not-work-for-sld%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown

























            1 Answer
            1






            active

            oldest

            votes








            1 Answer
            1






            active

            oldest

            votes









            active

            oldest

            votes






            active

            oldest

            votes









            1














            Your approach would work if you had a version 1.1.0 SLD (or more properly an SE) document, and if you used a import org.geotools.sld.v1_1.SLD object to pass to the encoder. However you have a version 1.0.0 SLD document so you need to use a
            SLDTransformer class to output your style objects. So something like:



            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            SLDTransformer transformer = new SLDTransformer();
            transformer.setIndentation(2);
            transformer.transform(sld, bos);
            String style = bos.toString();
            System.out.println(style);





            share|improve this answer






























              1














              Your approach would work if you had a version 1.1.0 SLD (or more properly an SE) document, and if you used a import org.geotools.sld.v1_1.SLD object to pass to the encoder. However you have a version 1.0.0 SLD document so you need to use a
              SLDTransformer class to output your style objects. So something like:



              ByteArrayOutputStream bos = new ByteArrayOutputStream();
              SLDTransformer transformer = new SLDTransformer();
              transformer.setIndentation(2);
              transformer.transform(sld, bos);
              String style = bos.toString();
              System.out.println(style);





              share|improve this answer




























                1












                1








                1







                Your approach would work if you had a version 1.1.0 SLD (or more properly an SE) document, and if you used a import org.geotools.sld.v1_1.SLD object to pass to the encoder. However you have a version 1.0.0 SLD document so you need to use a
                SLDTransformer class to output your style objects. So something like:



                ByteArrayOutputStream bos = new ByteArrayOutputStream();
                SLDTransformer transformer = new SLDTransformer();
                transformer.setIndentation(2);
                transformer.transform(sld, bos);
                String style = bos.toString();
                System.out.println(style);





                share|improve this answer















                Your approach would work if you had a version 1.1.0 SLD (or more properly an SE) document, and if you used a import org.geotools.sld.v1_1.SLD object to pass to the encoder. However you have a version 1.0.0 SLD document so you need to use a
                SLDTransformer class to output your style objects. So something like:



                ByteArrayOutputStream bos = new ByteArrayOutputStream();
                SLDTransformer transformer = new SLDTransformer();
                transformer.setIndentation(2);
                transformer.transform(sld, bos);
                String style = bos.toString();
                System.out.println(style);






                share|improve this answer














                share|improve this answer



                share|improve this answer








                edited Nov 29 '18 at 9:09

























                answered Nov 29 '18 at 8:48









                Ian TurtonIan Turton

                4,67612036




                4,67612036
































                    draft saved

                    draft discarded




















































                    Thanks for contributing an answer to Stack Overflow!


                    • Please be sure to answer the question. Provide details and share your research!

                    But avoid



                    • Asking for help, clarification, or responding to other answers.

                    • Making statements based on opinion; back them up with references or personal experience.


                    To learn more, see our tips on writing great answers.




                    draft saved


                    draft discarded














                    StackExchange.ready(
                    function () {
                    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53513177%2fencoder-in-geotools-does-not-work-for-sld%23new-answer', 'question_page');
                    }
                    );

                    Post as a guest















                    Required, but never shown





















































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown

































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown







                    Popular posts from this blog

                    Contact image not getting when fetch all contact list from iPhone by CNContact

                    count number of partitions of a set with n elements into k subsets

                    A CLEAN and SIMPLE way to add appendices to Table of Contents and bookmarks