Filter是一中语言,一种植XML实现之言语,这就是让其非常适合于分布式系统。我们沾过之OWS服务都不同水平之行使到它。SLD用它来贯彻复杂的Rule选择。WFS在所有需要固定操作对象的地方都见面采取Filter。这同一回我们换一栽讨论的章程,我未思再次罗列乏味的Tag,然后加上翻译过来的诠释。我们该的确的实现一个程序,在贯彻之过程中落成我们的座谈。

前的回我们一直维护着一个WMS服务器“ShapeMapServer”,刚开自己连不曾将她当回事,我只是怀念管其看成一个范例来采取,但是随着话题的刻骨铭心,这个范例也决定逐渐复杂,功能为逐步丰富起来。这同一段我们拿联袂来给这个序,我们一同来为他加效果,通过编码我们用对准Filter有所体会。我们的职责是改进服务器处理SLD文件之力量,我们将为它们长Filter功能。

优先来简单介绍一下OGC的Filter。Filter的意是构建一个表达式,返回值就是Feature的会师,换句话说Filter就使他的名字一般也我们从一个集合中了滤出一个饱我们渴求的子集。而过滤的道就是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。我们之所以一个例证来展示他们之企图。假设我们怀念获取有人数于一千万之上,并且于咱们加的限量外的市,我们设这样来构建我们的Filter:

XML 1XML 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子句,事实上如果你若落实一个无敌的WFS服务器,你虽只能提供用Filter翻译成SQL的力量。

现我们回到我们的任务及来,实现支持Filter的Style。为了能够当一个回的岁月里成功这个职责,我们第一得划定工作范围,也就算是要求:

1、 支持有的操作符;

2、 提供个别独函数,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也当是一个看似,而且其吧生一个吃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其实是一个抽象概念,我们以这里以他定义成接口:IFilter。而他的兑现类似分别是ComparisonOp,SpatialOp,LogicOp。他们吧是抽象概念,就是Abstract类。他们再也各自派生出实际的操作符类。

XML 3

XML 4

XML 5

顿时三张大图占了好多空中,但是呢作证了广大题目。

今昔来看看另外一个概念Expression。想像一下,如果我们盼望于的是市男女的百分比要非是先生要妻之数码该如何处置,我们需要先由子女数量来计量比例,然后重新于。OGC的科班吗我们提供了匡表达式(Expression)来化解这问题。它包括:Add,Sub,Mul,Div和Function。显然这个Expression也是一个抽象概念,于是我们发了另外一个接口:IExpression。

XML 6

齐图也认证了咱们的宏图。到是有Filter的计划性算是功德圆满了。我们呢堪用开始编码,虽然还非可知于咱们的服务器被运行,但是得以测试框架下检查职能。

下面我们得经XML文件充分成当下套Rule的点子。我们以祭工厂类(Factory)来形成这工作。感谢DotNet提供的反光(Reflect)机制,我们的工厂类可十分容易的及Xml的Tag关联起来,大大简化了代码。由于这不是依照章的重要性,我就是未以这边详细描述了。

贯彻了打Xml创建Rule我们的天职就基本形成了。现在咱们可来看看效果了。

生图是原来的渲染效果,它只是采用了一个Symbolizer来渲染线段,这里是SLD文件。

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

 

XML 26

产图是新的渲染效果,我们期待“Amazon”流域的兼具河流除了原的功力外尚因此蓝色之粗线渲染一不良,这里是SLD文件

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

 

XML 64

 代码

相关文章

网站地图xml地图