盛开GIS标准OGC之路(4)之 解密Filter

Filter是一中语言,一种XML已毕的言语,这就使得它万分适合于分布式系统。大家接触过的OWS服务都分裂水平的运用到它。SLD用它来已毕复杂的Rule拔取。WFS在富有需求稳定操作对象的地点都会利用Filter。这一章大家换一种探讨的点子,作者不想再罗列乏味的Tag,然后加上翻译过来的诠释。咱们应该的确的落实3个主次,在落成的进度中形成大家的探究。

后边的章节我们一贯维护着3个WMS服务器“ShapeMapServer”,刚早先我并从未把它当回事,作者只是想把它看成二个范例来采用,可是随着话题的深深,这么些范例也尘埃落定逐渐复杂,作用也逐步丰裕起来。这一章我们将协同来面对那个顺序,大家一起来为他充实效果,通过编码大家将对Filter有所体会。大家的义务是改革服务器处理SLD文件的能力,我们将为它扩充Filter功效。

先来总结介绍一下OGC的Filter。Filter的作用是创设1个说明式,再次来到值就是Feature的汇合,换句话说Filter就像是他的名字一般为大家从三个聚集中过滤出2个满意大家渴求的子集。而过滤的法门就是Filter定义的操作符。Filter定义了三种操作符:地理操作符(Spatial
operators),相比较操作符(Comparison operators)和逻辑操作符(Logical
operators)。大家来挨家挨户解释。

Spatial
operators定义了地理本性的操作形式,他们有:Equals,Disjoint,Touches,Within,Overlaps,Crosses,Intersects,Contains,DWithin,

Beyond,BBOX。Comparison
operators定义了标量属性的操作方法,他们有:PropertyIsEqualTo,PropertyIsNotEqualTo,PropertyIsLessThan,PropertyIsGreaterThan,

PropertyIsLessThanOrEq,PropertyIsGreaterThanO,PropertyIsLike,PropertyIsNull,

PropertyIsBetween。Logical
operators定义了组合那么些操作的主意,他们有:And,Or,Not。大家用2个例子来呈现他们的效应。假若大家想博得全部人数在一千万以上,并且在我们加以的范围内的都会,我们要如此来营造我们的Filter:

图片 1图片 2Code
<Filter>
    <And>
        <PropertyIsGreaterThan>
            <PropertyName>population</PropertyName>
            <Literal>10000000</Literal>
        </PropertyIsGreaterThan>
        <BBOX>
            <PropertyName>geom</PropertyName>
            <Envelope srsName=”EPSG:4326″>
                <lowerCorner>-180 -90</lowerCorner>
                <upperCorner>180 90</upperCorner>
            </Envelope>
        </BBOX>
    </And>
</Filter>

Filter如同SQL的where子句,事实上如若你要贯彻3个强大的WFS服务器,你就只能提供将Filter翻译成SQL的效果。

近年来我们回到大家的天职上来,完成支持Filter的Style。为了能够在二个章节的小运里形成那么些职分,大家先是得划定工作范围,相当于要求:

一, 帮衬具有的操作符;

贰, 提供三个函数,sin和cos;

必要很粗略,义务却很繁重,大家先是需求增添测试框架。一直以来我们的主次都在“裸奔”而且也不算坏,然而随着结构先河复杂,那种景观就很难保障了,大家须要回归测试。于是作者选拔NUnit来做那几个工作。作者并不是要用时下很盛行的“TDD”来落成支付,实际上自身很喜欢TDD,可是本身平昔也未曾实际领悟它。所以大家只用自动测试框架来测试,仅此而已。

通过一番解析,这些历程是在自小编的脑际里成功的,作者以为有要求设计三个名叫“StyledLayer”的类,它是从“SharpMap.Layers.Layer”派生来的。这一个Layer负责依照Style定义的办法渲染Feature。我们在Style之谜中曾经观察Style是由Rule组成的。每多个Rule都有七个Symbolizer代表渲染方式,至多二个Filter来决定哪些Feature将运用这些Rule,还有至多一对Zoom限制来支配这一个Rule是还是不是被选取。以前我们平昔忽略Rule的那一个特色,仅仅使用了Symbolizer,未来大家必须面对它们了。SLD标准文档告诉大家,二个SLD数据块包罗几个Rule,各种Feature在渲染的时候都急需通过这么些Rule,只要满足Rule的条件,Feature就应当根据Rule定义的Symbolizer渲染三回。顺序与Rule的逐一一致。Rule还足以经过定义ElseFilter来充实分支,全部的长河就是如此了。

咱俩得以用伪代码来讲述上述进度:

for rule in rules
   for feature in features
      symbolizer = rule.Test(feature)
      if symbolizer then
         symbolizer.Render(feature)
      endif
   endfor
endfor

那段代码对我们的规划将有早晚的带领意义,以后让大家把StyledLayer放一放,先来探视Rule。Rule无疑是最重视的概念之一,有必不可少为它定义三个类,方法就是Test(feature:Feature):Symbolizer。然后是Symbolizer,它的不二法门是Render(feature:Feature)。Filter呢,大家直接在座谈的Filter并不曾出现在那里。Filter将躲在Rule的幕后起成效。Rule的Test方法将会用到SLD文件中定义的Filter表达式。大家明日来看望Test方法的伪代码:

if filter.Test(feature) then
    return symbolizer
else if elseFilter.Test(feature) then
    return elseSymbolizer

肯定Filter也应有是三个类,而且它也有2个叫Test的格局。除了那一点大家还亟需注意ElseFilter在这边是怎么样起成效的,那几个企划不是很好,大家修改一下:

if filter.Test(feature) then
    return symbolizer
return elseRule.Test(feature)

那两回感觉好多了。小编在那里提到“感觉”是因为本人也说不清为啥那几个比上一个好。以后拥有骨干的规划就完了了。大家有了七个类Rule,Symbolizer和Filter。而且大家早就落到实处了Rule的办法Test。不过大家还尚未落到实处Filter的Test方法(Symbolizer的布置性是自作者原先就已经到位的,就不再赘言了)。我们驾驭有两种Filter操作符,每个还有温馨的子类操作符。大家可以那样来促成Filter的Test:

switch op:

case And:…

case Or:…

case Not:…

case…

好了自家不开玩笑了。毫无疑问,稍微有点OO常识的人都领会Filter其实是1个抽象概念,大家在此地将他定义成接口:IFilter。而他的兑现类分别是ComparisonOp,SpatialOp,LogicOp。他们也是抽象概念,就是Abstract类。他们再各自派生出切实可行的操作符类。

图片 3

图片 4

图片 5

这三张大图占了很多空间,可是也认证了过多难点。

明天来看看其它贰个概念Expression。想像一下,倘使大家希望相比的是都市男女的比例而不是匹夫或女子的数量该怎么做,我们须求先从男女数量来总结比例,然后再比较。OGC的正经为我们提供了总结表明式(Expression)来缓解那么些难点。它归纳:Add,Sub,Mul,Div和Function。显明那些Expression也是多个抽象概念,于是大家有了其它3个接口:IExpression。

图片 6

上图也认证了作者们的宏图。到此有所Filter的布署性算是水到渠成了。大家也得以为此开端编码,即使还不可以在咱们的服务器中运作,不过足以在测试框架下检查成效。

下边大家需要通过XML文件生成那套Rule的方法。大家将利用工厂类(Factory)来成功这几个工作。感激DotNet提供的反射(Reflect)机制,大家的厂子类可以很不难的与Xml的Tag关联起来,大大简化了代码。由于那不是本章的第一,作者就不在那里详细描述了。

兑现了从Xml创设Rule大家的天职就基本做到了。以往大家得以来看看效果了。

下图是原本的渲染效果,它只是使用了3个Symbolizer来渲染线段,那里是SLD文件。

图片 7图片 8Code
图片 9<UserStyle>
图片 10  <Title>A boring default style</Title>
图片 11  <Abstract>A sample style that just prints out a green line</Abstract>
图片 12  <FeatureTypeStyle>
图片 13    <Rule>
图片 14      <Name>Rule 1</Name>
图片 15      <Title>Green Line</Title>
图片 16      <Abstract>A green line with a 2 pixel width</Abstract>
图片 17      <LineSymbolizer>
图片 18        <Stroke>
图片 19          <CssParameter name=”stroke”>#ff00ff</CssParameter>
图片 20          <CssParameter name=”stroke-width”>3</CssParameter>
图片 21        </Stroke>
图片 22      </LineSymbolizer>
图片 23    </Rule>
图片 24  </FeatureTypeStyle>
图片 25</UserStyle>

 

图片 26

下图是新的渲染效果,咱们期望“亚马逊”流域的有所河流除了原来的效用外还用粉红色的粗线渲染三遍,那里是SLD文件

图片 27图片 28Code
图片 29<UserStyle>
图片 30  <Title>A boring default style</Title>
图片 31  <Abstract>A sample style that just prints out a green line</Abstract>
图片 32  <FeatureTypeStyle>
图片 33    <Rule>
图片 34      <Name>Rule 1</Name>
图片 35      <Title>Green Line</Title>
图片 36      <Abstract>A green line with a 2 pixel width</Abstract>
图片 37      <Filter>
图片 38        <PropertyIsEqualTo>
图片 39          <PropertyName>SYSTEM</PropertyName>
图片 40          <Literal>Amazon</Literal>
图片 41        </PropertyIsEqualTo>
图片 42      </Filter>
图片 43      <LineSymbolizer>
图片 44        <Stroke>
图片 45          <CssParameter name=”stroke”>#0000ff</CssParameter>
图片 46          <CssParameter name=”stroke-width”>5</CssParameter>
图片 47        </Stroke>
图片 48      </LineSymbolizer>
图片 49    </Rule>
图片 50    
图片 51    <Rule>
图片 52      <Name>Rule 1</Name>
图片 53      <Title>Green Line</Title>
图片 54      <Abstract>A green line with a 2 pixel width</Abstract>      <LineSymbolizer>
图片 55        <Stroke>
图片 56          <CssParameter name=”stroke”>#ff0000</CssParameter>
图片 57          <CssParameter name=”stroke-width”>1</CssParameter>
图片 58        </Stroke>
图片 59      </LineSymbolizer>
图片 60    </Rule>
图片 61
图片 62  </FeatureTypeStyle>
图片 63</UserStyle>

 

图片 64

 代码

相关文章