设为首页收藏本站

GeoServer中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 4251|回复: 1

[GeoTools] Style Layer Descripter(五)

[复制链接]
发表于 2014-1-5 10:56:38 | 显示全部楼层 |阅读模式
Geotools的样式化是构建在如下SLD数据模型之上的(来自于gt-api)。
<img></img>
Geotools的渲染总是聚焦在“UserStyle”,也就是上面的Style类,它用来控制我们如何来渲染地图数据。
(1)Style
   Style接口符合SLD 1.0规范(如果你需要说明或者样例的话你可以查看OGC的SLD文档以获得更多信息)
创建
我们可以使用一个StyleFactory来创建一个StyleLayerDescriptor。
StyleFactory styleFactory = CommonFactoryFinder.getStyleFactory();

    StyledLayerDescriptor sld = styleFactory.createStyledLayerDescriptor();
    sld.setName("example");
    sld.setAbstract("Example Style Layer Descriptor");

    UserLayer layer = styleFactory.createUserLayer();
    layer.setName("layer");

    FeatureTypeConstraint constraint = styleFactory.createFeatureTypeConstraint("Feature",
            Filter.INCLUDE, null);

    layer.layerFeatureConstraints().add(constraint);

    Style style = styleFactory.createStyle();

    style.getDescription().setTitle("Style");
    style.getDescription().setAbstract("Definition of Style");

    // define feature type styles used to actually
    // define how features are rendered
    //
    layer.userStyles().add(style);

    sld.layers().add(layer);

这是我们最后一次讨论StyleLayerDescriptor对象—在控制渲染过程中它并没有太多用处。
访问
从StyleLayerDescriptor对象中获取一些有用的信息
FeatureTypeStyle useful[] = SLD.featureTypeStyles( sld );

或者根据你的要素类型查找一个样式
FeatureTypeStyle applicable = SLD.featureTypeStyle( sld, schema );

文档
OpenGIS标准中的SLD相关文档定义了一个XML文档,使用这个文档我们可以持久化一个Geotools中的Style对象。随着功能的不断完善,该标准已经成为权威的定义,如果你发现我们和标准有些偏差的话请提交bug报告给我们。
(1)如何解析一个SLD
你可以使用一个SLD文档来创建一个Style(其实就是创建一个符合SLD标准的XML文件)
·      // create the parser with the sld configuration
·          org.geotools.xml.Configuration configuration = new org.geotools.sld.SLDConfiguration();
·          org.geotools.xml.Parser parser = new org.geotools.xml.Parser(configuration);
·         
·          // the xml instance document above
·          InputStream xml = new FileInputStream("markTest.sld");
·         
·          // parse
·          StyledLayerDescriptor sld = (StyledLayerDescriptor) parser.parse(xml);

(2)SAX StyleReader
一个SAX是基于StyleReader的,从Geotools2.2源码中我们可以找到。
·      private Style loadStyleFromXml() throws Exception {
·          java.net.URL base = getClass().getResource("rs-testData");
·      
·          StyleFactory factory = StyleFactory.createStyleFactory();
·          java.net.URL surl = new java.net.URL(base + "/markTest.sld");
·      
·          //A class to read and parse an SLD file based on verion 0.7.2 of the OGC
·          SLDStyle stylereader = new SLDStyle(factory, surl);
·          Style[] style = stylereader.readXML();
·      
·          return style[0];
·      }


如何转换成一个SLD
(1)Geotools有一个传输转换器可以生成SLD 格式

  • SLDTransformer styleTransform = new SLDTransformer();
  • String xml = styleTransform.transform(sld);

(1)   如果只使用一个style如何生成SLD
为了生成一个有效的SLD文件,上面的代码样例需要一个完整的StyleLayerDescriptor对象。
下面看一下如何从一个Style转成SLD
·      StyledLayerDescriptor sld = styleFactory.createStyledLayerDescriptor();
·      UserLayer layer = styleFactory.createUserLayer();
·      layer.setLayerFeatureConstraints(new FeatureTypeConstraint[] {null});
·      sld.addStyledLayer(layer);
·      layer.addUserStyle(style);
·      
·      SLDTransformer styleTransform = new SLDTransformer();
·      String xml = styleTransform.transform(sld);

XML
MarkTest.sld包含如下的XML代码:
·      <StyledLayerDescriptor version="0.7.2">
·      <!-- a named layer is the basic building block of an sld document -->
·      <NamedLayer>
·      <Name>A Random Layer</Name>
·      <title>The title of the layer</title>
·      <abstract>
·      A longer and some would say less random peice of text
·      that allows you to describe the latyer in more detail
·      </abstract>
·      <!-- with in a layer you have Named Styles -->
·      <UserStyle>
·          <!-- again they have names, titles and abstracts -->
·        <Name>MyStyle</Name>
·          <!-- FeatureTypeStyles describe how to render different features -->
·          <FeatureTypeStyle>
·              <FeatureTypeName>testPoint</FeatureTypeName>
·              <rule>
·                  <;PointSymbolizer>
·                      <graphic>
·                          <size><;PropertyName>size</PropertyName></size>
·                          <rotation><;PropertyName>rotation</PropertyName></rotation>
·                          <mark>
·                              <wellknownname><;PropertyName>name</PropertyName></wellknownname>
·                              <Fill>
·                                  <!-- CssParameters allowed are fill (the color) and fill-opacity -->
·                                  <CssParameter name="fill">#FF0000</CssParameter>
·                                  <CssParameter name="fill-opacity">0.5</CssParameter>
·                              </Fill>
·                          </mark>
·                      </graphic>
·                  </PointSymbolizer>
·              </rule>
·          </FeatureTypeStyle>
·          <FeatureTypeStyle>
·              <FeatureTypeName>labelPoint</FeatureTypeName>
·              <rule>
·                  <TextSymbolizer>
·                      <Label><;PropertyName>name</PropertyName></Label>
·                      <Font>
·                          <CssParameter name="font-family">SansSerif</CssParameter>
·                          <CssParameter name="font-Size">
·                              <literal>10</literal>
·                          </CssParameter>
·                      </Font>
·                     
·                      <LabelPlacement>
·                          <;PointPlacement>
·                              <AnchorPoint>
·                                  <AnchorPointX><;PropertyName>X</PropertyName> </AnchorPointX>
·                                  <AnchorPointY><;PropertyName>Y</PropertyName> </AnchorPointY>
·                              </AnchorPoint>
·                          </PointPlacement>
·                      </LabelPlacement>
·                      <Fill>
·                          <CssParameter name="fill">#000000</CssParameter>
·                      </Fill>
·                      <Halo/>
·                  </TextSymbolizer>
·                  <;PointSymbolizer>
·                      <graphic>
·                          <size>4</size>
·                          <mark>
·                              <wellknownname>circle</wellknownname>
·                              <Fill>
·                                  <!-- CssParameters allowed are fill (the color) and fill-opacity -->
·                                  <CssParameter name="fill">#FF0000</CssParameter>
·                              </Fill>
·                          </mark>
·                      </graphic>
·                  </PointSymbolizer>
·              </rule>
·          </FeatureTypeStyle>
·      </UserStyle>
·      </NamedLayer>
·      </StyledLayerDescriptor>

上面的样式也可以利用StyleBuilder来进行创建:
·        StyleBuilder sb = new StyleBuilder();
·          FilterFactory ff = sb.getFilterFactory();
·          Style style = sb.createStyle();
·          style.setName("MyStyle");
·         
·          // "testPoint" feature type style
·          Mark testMark = sb.createMark(sb.attributeExpression("name"), sb.createFill(Color.RED, 0.5),
·                  null);
·          Graphic graph = sb.createGraphic(null, new Mark[] { testMark }, null, sb.literalExpression(1),
·                  sb.attributeExpression("size"), sb.attributeExpression("rotation"));
·          style.featureTypeStyles().add(
·                  sb.createFeatureTypeStyle("testPoint", sb.createPointSymbolizer(graph)));
·         
·          // "labelPoint" feature type style

·          AnchorPoint anchorPoint = sb.createAnchorPoint(sb.attributeExpression("X"),
·                  sb.attributeExpression("Y"));
·          PointPlacement pointPlacement = sb.createPointPlacement(anchorPoint, null,
·                  sb.literalExpression(0));
·          TextSymbolizer textSymbolizer = sb.createTextSymbolizer(sb.createFill(Color.BLACK), new Font[] {
·                  sb.createFont("Lucida Sans", 10), sb.createFont("Arial", 10) }, sb.createHalo(),
·                  sb.attributeExpression("name"), pointPlacement, null);
·          Mark circle = sb.createMark(StyleBuilder.MARK_CIRCLE, Color.RED);
·          Graphic graph2 = sb.createGraphic(null, circle, null, 1, 4, 0);
·          PointSymbolizer pointSymbolizer = sb.createPointSymbolizer(graph2);
·          style.featureTypeStyles().add(
·                  sb.createFeatureTypeStyle("labelPoint", new Symbolizer[] { textSymbolizer,
·                          pointSymbolizer }));


转载请注明        www.opengeo.cn

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐 上一条 /1 下一条

手机版|小黑屋|Archiver| GeoServer中文社区 ( 蜀ICP备08111674号-2 )     

GMT+8, 2017-10-18 04:14 , Processed in 0.146287 second(s), 30 queries .

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表