Geoserver基础配图研究

作者:刘端强

1面图层配图
1.1基本框架
这个是geoserver默认的polygon的代码,我们可以将它作为日后编辑面图层的基础框架。

<?xml version="1.0" encoding="ISO-8859-1"?>
<StyledLayerDescriptor version="1.0.0" 
 xsi:schemaLocation="http://www.opengis.net/sld StyledLayerDescriptor.xsd" 
 xmlns="http://www.opengis.net/sld" 
 xmlns:ogc="http://www.opengis.net/ogc" 
 xmlns:xlink="http://www.w3.org/1999/xlink" 
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <!-- a Named Layer is the basic building block of an SLD document -->
  <NamedLayer>
    <Name>default_polygon</Name>
    <UserStyle>
    <!-- Styles can have names, titles and abstracts -->
      <Title>Default Polygon</Title>
      <Abstract>A sample style that draws a polygon</Abstract>
      <!-- FeatureTypeStyles describe how to render different features -->
      <!-- A FeatureTypeStyle for rendering polygons -->
      <FeatureTypeStyle>
        <Rule>
          <Name>rule1</Name>
          <Title>Gray Polygon with Black Outline</Title>
          <Abstract>A polygon with a gray fill and a 1 pixel black outline</Abstract>
          <PolygonSymbolizer>
            <Fill>
              <CssParameter name="fill">#AAAAAA</CssParameter>
            </Fill>
            <Stroke>
              <CssParameter name="stroke">#000000</CssParameter>
              <CssParameter name="stroke-width">1</CssParameter>
            </Stroke>
          </PolygonSymbolizer>
        </Rule>
      </FeatureTypeStyle>
    </UserStyle>
  </NamedLayer>
</StyledLayerDescriptor>

在标红部分前面的是对style的命名和其他的一些基本框架语句,自动生成,不必理会。具体对style的编写从标红的FeatureTypeStyle开始。首先需要注意的是xml语句的一个特点就是有头必有尾,头尾命名一致,唯一的区别是尾部多了一个斜杠,若头尾不符肯定报错。
Rule:即规则,可以只有一个Rule,对复杂的style可以有多个Rule,Rule可以用Name,Title和Abstract来描述,相当于编程中的注释,不参与代码的运作。根据需要都可以省略掉或者填写。
PolygonSymbolizer:对Polygon元素的设置就在这里开始,我们想给面图层配色,设置边框等就要在PolygonSymbolizer关键字的包裹里面进行。
Fill:即填充,这个关键字参与对图层面颜色的填充。
Stroke:类似Fill,不过用于描述线。
基本的配置涉及到的基本就是这些,遇到更加复杂的面图层配图需要参照图层的具体属性来进行分析。

1.2设置面颜色
现在就修改geoserver默认的Polygon来进行详细的讲解。
图层准备:testpolygon(此图层是在styling cookbook里面下载的示例图层,有兴趣的可以自行下载)
Style准备:testpoly(这个style是对自带的Polygon的拷贝)
对准备的图层配置上面的style,预览图如下:
这里写图片描述

改变面图层的颜色只需要修改下面部分的代码即可:
这里写图片描述

AAAAAA是十六进制的颜色代码,现在我想将面改成别的颜色,我将其替换为#66CCFF,观察其效果:

这里写图片描述

1.3设置面边框
面的边框设置与颜色类似,不过边框作为一种线,是有宽度这个属性的,我们有时还需要设置其宽度。
我们发现,在设置面的颜色的时候,图里面有几条黑色的线已经设置好了,在代码里面也有对其设置的语句,就在Fill尾部的下面:
这里写图片描述
Stroke:这里设置的线的颜色;
Stroke-width:这里设置的线宽。
线的其他属性根据具体的图层来添加,这里仅修改这两个属性来作示范。
我将Stroke里面的#000000修改为#FFFFFF;
Stroke-width设置成2。
观察其效果:
这里写图片描述

Stroke-width设置成6,观察其效果:
这里写图片描述

1.4*图片填充
除了一般用到的颜色填充面,我们还可以用图片来对面图层进行填充。这时候我们需要预先下载好要用到的图片,一般是.jpg或者.png格式(在测试的时候我用到的是.jpg和.png,其他格式的可行性有待发掘),将其拷贝到存放style的地方。出于习惯考虑,我们建立style的时候一般会将其与要配置的图层放在一个工作区,对图片的拷贝也要找到对应工作区的style文件夹,否则不能找到图片的路径。准备工作做好后我们再来修改代码。
这是我下载好的.jpg图片:
这里写图片描述
代码部分的修改比较简单,我们先看之前用颜色填充的代码:

 <FeatureTypeStyle>
        <Rule>
          <Name>rule1</Name>
          <Title>Gray Polygon with Black Outline</Title>
          <Abstract>A polygon with a gray fill and a 1 pixel black outline</Abstract>
          <PolygonSymbolizer>
            <Fill>
              <CssParameter name="fill">#AAAAAA</CssParameter>
            </Fill>
            <Stroke>
              <CssParameter name="stroke">#000000</CssParameter>
              <CssParameter name="stroke-width">1</CssParameter>
            </Stroke>
          </PolygonSymbolizer>
        </Rule>
      </FeatureTypeStyle>

现在要用图片填充,Fill里面的部分就需要修改了,现在给出用图片填充部分的代码:

<sld:Fill>
      <sld:GraphicFill>
        <sld:Graphic>
          <sld:ExternalGraphic>
             <sld:OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="test.jpg"/>
             <sld:Format>image/png</sld:Format>
          </sld:ExternalGraphic>
        </sld:Graphic>
      </sld:GraphicFill>
  </sld:Fill>

仅仅是对Fill里面的语句进行了修改,原来只有一行说明颜色的代码,现在看起来复杂了许多。但是框架是固定的,我们以后可以直接使用这段代码,路径都不需要修改,只需修改图片名即可。
GraphicFill:表示现在是进行图片填充;
Graphic:我们在下面完善要填充的图片的具体信息;
ExternalGraphic:字面翻译,外部图片,表示我们要用到自己下载的图片;
接下来就是输入路径了,此处类似网址的是一个相对路径,不用管它,唯一需要注意的是最后部分我们要输入图片的名称及拓展名;
Format:图片格式,这里是image/png,我选择.png和.jpg格式的图片都能正常使用,其他格式的尚未尝试。
总的看来,代码虽多,要修改的也就是一个文件名,不算麻烦。现在我们来看看成果:
这里写图片描述

图片成功应用,边框我没有修改,仍然显示了出来。
1.5不同属性面配置
对于面图层来说,一般来说源数据就是根据不同属性分好了面图层,不需要在一个面图层里面再来配置不同的属性,因此面图层配置几乎是最简单的,如果需要用到不同属性面的配置,可以参考线和点的配置方法。
1.6配置伪3D建筑
仔细观察百度地图,我们发现其中的建筑物都有阴影,非常有立体感。本节将要介绍的配置伪3D建筑即是将原本平面显示的建筑物配置出阴影来。
配置阴影需要用到函数方面的内容,我们需要用到isometric函数和offset函数,这两个函数一个用来设置阴影,一个用来设置屋顶。这里我们先来看看函数的写法。

<PolygonSymbolizer>  
          <Geometry>  
             <ogc:Function name="isometric">  
             <ogc:PropertyName>the_geom</ogc:PropertyName>  
             <ogc:Literal>0.0001</ogc:Literal>  
              </ogc:Function>  
         </Geometry>  
         <Fill>  
           <CssParameter name="fill">#dddddd</CssParameter>  
         </Fill>  
         <Stroke>  
            <CssParameter name="stroke">#999999</CssParameter>  
            <CssParameter name="stroke-width">0</CssParameter> 
         </Stroke>  
     </PolygonSymbolizer>  

这段代码设置的是建筑物的阴影,红色部分用来控制阴影的面积。我们来看看仅设置这段代码的预览图:
这里写图片描述

可以看到阴影部分没有按照客观的视角来显示,应该被遮挡的部分也显示了出来,因此我们需要对屋顶进行单独设置,使其遮盖掉不应该显示的部分。
在我参考的教程中,都是在两个FeatureTypeStyle里面分别完成阴影和屋顶的设置,但是在我自己尝试的过程中,我将它们包含在一个FeatureTypeStyle里面,建立两个rule来实现,也可以展现出同样的效果。因此就我个人理解而言,设置阴影是将同样一个面图层实现了两次,第一次只显示阴影,由于代码在前面,可以被第二次显示的屋顶所遮挡掉一部分。原理大致如此。
那么在第二次显示的时候,我们是否可以不用offset函数呢?我没有使用函数,直接使用Fill关键字对面图层进行填充,现在配合阴影来看看效果:
这里写图片描述

现在显示的建筑物与正常视角下观察的相反,因此我们还得用到offset函数。
Offset函数的代码如下:

  <PolygonSymbolizer>    
                        <Geometry>    
                            <ogc:Function name="offset">    
                                <ogc:PropertyName>the_geom</ogc:PropertyName>    
                                <ogc:Literal>0</ogc:Literal>    
                                <ogc:Literal>0.0001</ogc:Literal> 
                            </ogc:Function>    
                        </Geometry>    
                        <Fill>    
                            <CssParameter name="fill">#ffffe0</CssParameter>    
                        </Fill>    
                        <Stroke>    
                            <CssParameter name="stroke">#999999</CssParameter>    
                            <CssParameter name="stroke-width">0.1</CssParameter>    
                        </Stroke>    
                    </PolygonSymbolizer> 

可以看到offset函数有两个参数需要赋值,根据我个人理解,offset表示偏移,两个赋值分别设置的是x方向和y方向的偏移量,由于我们需要纵深方向的阴影,因此x方向的赋值给0,我们需要将屋顶上移以保证将上方的阴影盖住,露出下方的阴影,因此y方向给一个正值,前面给isometric赋值的时候取值为0.0001,这里偏移量应该相同。现在效果看起来还不错:

这里写图片描述

注:在小比例尺的时候如果不需要显示出阴影,可以用比例尺进行限制。在两个rule里面分别设置不同的比例尺,可以达到放大到一定程度才有阴影的效果。
2点图层配图
2.1基本框架
这个是geoserver默认的point的代码,我们可以将它作为日后编辑点图层的基础框架。

<?xml version="1.0" encoding="ISO-8859-1"?>
<StyledLayerDescriptor version="1.0.0" 
 xsi:schemaLocation="http://www.opengis.net/sld StyledLayerDescriptor.xsd" 
 xmlns="http://www.opengis.net/sld" 
 xmlns:ogc="http://www.opengis.net/ogc" 
 xmlns:xlink="http://www.w3.org/1999/xlink" 
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <!-- a Named Layer is the basic building block of an SLD document -->
  <NamedLayer>
    <Name>default_point</Name>
    <UserStyle>
    <!-- Styles can have names, titles and abstracts -->
      <Title>Default Point</Title>
      <Abstract>A sample style that draws a point</Abstract>
      <!-- FeatureTypeStyles describe how to render different features -->
      <!-- A FeatureTypeStyle for rendering points -->
      <FeatureTypeStyle>
        <Rule>
          <Name>rule1</Name>
          <Title>Red Square</Title>
          <Abstract>A 6 pixel square with a red fill and no stroke</Abstract>
            <PointSymbolizer>
              <Graphic>
                <Mark>
                  <WellKnownName>square</WellKnownName>
                  <Fill>
                    <CssParameter name="fill">#FF0000</CssParameter>
                  </Fill>
                </Mark>
              <Size>6</Size>
            </Graphic>
          </PointSymbolizer>
        </Rule>
      </FeatureTypeStyle>
    </UserStyle>
  </NamedLayer>
</StyledLayerDescriptor>

在前面讲解面和线的时候,在“%Symbolizer”关键字的后面直接开始配置面线的颜色和其它属性,点这里多了两个关键字:Graphic和Mark。Graphic是对点属性设置的专用关键字,Mark中设置点的基本属性,如形状、颜色,但不包括大小,在Mark外面可以设置点的大小,它们都被Graphic包裹。
2.2设置点形状(自带形状)
现在就修改geoserver默认的Point来进行详细的讲解。
图层准备:testpnt(此图层是在styling cookbook里面下载的示例图层,有兴趣的可以自行下载)
Style准备:testpnt(这个style是对自带的Point的拷贝)
对准备的图层配置上面的style,预览图如下:

这里写图片描述

点形状的设置非常简单,可以使用geoserver自带的一些形状,也可以引用外部的形状。这里使用圆形和三角形来进行演示。

这里我将square换成circle,观察效果:这里写图片描述

方块点变成了圆点。
将square换成triangle,观察效果:
这里写图片描述

方块点变成了三角形点。
2.3设置点形状(外部图片)
要引用到外部图片来对点进行描述的话,我们仍然需要自己先下载好要用到的图片。与用图片来填充面类似,这里的流程与其极其类似,我们直接来看看代码:

<sld:PointSymbolizer>
            <sld:Graphic>
              <sld:ExternalGraphic>
                <sld:OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="3.png"/>
                <sld:Format>image/png</sld:Format>
              </sld:ExternalGraphic>
            </sld:Graphic>
          </sld:PointSymbolizer>

这里的代码也是固定格式,原图片3.png预览图如下:

这里写图片描述

现在将其应用到点形状的配置上,观察效果:
这里写图片描述

上面代码只给了引用的图片路径,没有说明图片的大小,因此所有的图片大小都默认和原图一样,现在我们尝试添加限制图片大小的语句:24
经过测试,这段代码应当放在ExternalGraphic后面。

<sld:PointSymbolizer>
            <sld:Graphic>
              <sld:ExternalGraphic>
                <sld:OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="3.png"/>
                <sld:Format>image/png</sld:Format>
              </sld:ExternalGraphic>
             <Size>24</Size>
            </sld:Graphic>
          </sld:PointSymbolizer>

现在来看看限制大小后的效果:
这里写图片描述
对一些比较小巧的、本来就适合描述点形状的图片,我们可以直接使用默认的大小,如果要用到大一些的图片,就可以加上上面的限制语句进行限制了。
2.4设置点颜色
点颜色的设置就在其形状设置的后面,将代码里面的#FF0000改成别的颜色,比如#66CCFF,观察效果:
这里写图片描述

2.5设置点大小
点大小的设置在mark关键字的外面,现在将size的值从6改为12,观察效果:
这里写图片描述

2.6设置点边框
点边框的设置远没有线那么麻烦,与面类似,在fill语句后面加上stroke语句就可以了,这里我在上图的基础上加上边框,方便观察。
这里写图片描述

这里写图片描述

2.7*不同属性点配置
与线类似,点的不同属性分别显示也只需要设置好过滤条件即可。由于设置方法和线差不多,这里略讲,直接贴出源码:

<?xml version="1.0" encoding="UTF-8"?><sld:StyledLayerDescriptor xmlns="http://www.opengis.net/sld" xmlns:sld="http://www.opengis.net/sld" xmlns:ogc="http://www.opengis.net/ogc" xmlns:gml="http://www.opengis.net/gml" version="1.0.0">
  <sld:NamedLayer>
    <sld:Name>Default Styler</sld:Name>
    <sld:UserStyle>
      <sld:Name>Default Styler</sld:Name>
      <sld:FeatureTypeStyle>
        <sld:Rule>
          <ogc:Filter>
            <ogc:PropertyIsLessThan>
              <ogc:PropertyName>pop</ogc:PropertyName>
              <ogc:Literal>50000</ogc:Literal>
            </ogc:PropertyIsLessThan>
          </ogc:Filter>
          <
  • 12
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值