https://blog.csdn.net/zbcx_ZGIS/article/details/82216151
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>
<sld:PointSymbolizer>
<sld:Graphic>
<sld:Mark>
<sld:WellKnownName>circle</sld:WellKnownName>
<sld:Fill>
<sld:CssParameter name="fill">#0033CC</sld:CssParameter>
</sld:Fill>
</sld:Mark>
<sld:Size>8</sld:Size>
</sld:Graphic>
</sld:PointSymbolizer>
</sld:Rule>
<sld:Rule>
<ogc:Filter>
<ogc:And>
<ogc:PropertyIsGreaterThanOrEqualTo>
<ogc:PropertyName>pop</ogc:PropertyName>
<ogc:Literal>50000</ogc:Literal>
</ogc:PropertyIsGreaterThanOrEqualTo>
<ogc:PropertyIsLessThan>
<ogc:PropertyName>pop</ogc:PropertyName>
<ogc:Literal>100000</ogc:Literal>
</ogc:PropertyIsLessThan>
</ogc:And>
</ogc:Filter>
<sld:PointSymbolizer>
<sld:Graphic>
<sld:Mark>
<sld:WellKnownName>circle</sld:WellKnownName>
<sld:Fill>
<sld:CssParameter name="fill">#0033CC</sld:CssParameter>
</sld:Fill>
</sld:Mark>
<sld:Size>12</sld:Size>
</sld:Graphic>
</sld:PointSymbolizer>
</sld:Rule>
<sld:Rule>
<ogc:Filter>
<ogc:PropertyIsGreaterThanOrEqualTo>
<ogc:PropertyName>pop</ogc:PropertyName>
<ogc:Literal>100000</ogc:Literal>
</ogc:PropertyIsGreaterThanOrEqualTo>
</ogc:Filter>
<sld:PointSymbolizer>
<sld:Graphic>
<sld:Mark>
<sld:WellKnownName>circle</sld:WellKnownName>
<sld:Fill>
<sld:CssParameter name="fill">#0033CC</sld:CssParameter>
</sld:Fill>
</sld:Mark>
<sld:Size>16</sld:Size>
</sld:Graphic>
</sld:PointSymbolizer>
</sld:Rule>
<sld:VendorOption name="ruleEvaluation">first</sld:VendorOption>
</sld:FeatureTypeStyle>
</sld:UserStyle>
</sld:NamedLayer>
</sld:StyledLayerDescriptor>
標紅部分就是過濾條件的設置。在對之前的線進行設置的時候,我們根據線的type有三種值來進行過濾,這里則是根據點的pop值來進行過濾。相比較而言,這里的ogc語言更加豐富,用到了PropertyIsLessThan、PropertyIsGreaterThanOrEqualTo還有And三個過濾條件,可見過濾條件關鍵字是很多的,要根據實際情況選擇合適的使用。
以上語句分別設置了pop<50000,50000<=pop<100000,pop>100000三種屬性的點,我們可以看看效果:

3線圖層配圖
3.1基本框架
這個是geoserver默認的line的代碼,我們可以將它作為日后編輯線圖層的基礎框架。
<?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_line</Name>
<UserStyle>
<!-- Styles can have names, titles and abstracts -->
<Title>Default Line</Title>
<Abstract>A sample style that draws a line</Abstract>
<!-- FeatureTypeStyles describe how to render different features -->
<!-- A FeatureTypeStyle for rendering lines -->
<FeatureTypeStyle>
<Rule>
<Name>rule1</Name>
<Title>Blue Line</Title>
<Abstract>A solid blue line with a 1 pixel width</Abstract>
<LineSymbolizer>
<Stroke>
<CssParameter name="stroke">#0000FF</CssParameter>
</Stroke>
</LineSymbolizer>
</Rule>
</FeatureTypeStyle>
</UserStyle>
</NamedLayer>
</StyledLayerDescriptor>
基本結構和之前的Polygon非常相似,不過對線進行編輯的關鍵字是LineSymbolizer而非PolygonSymbolizer,注意不要寫錯。
3.2設置線顏色
現在就修改geoserver默認的Line來進行詳細的講解。
圖層准備:testline(此圖層是在styling cookbook里面下載的示例圖層,有興趣的可以自行下載)
Style准備:testlin(這個style是對自帶的Line的拷貝)
對准備的圖層配置上面的style,預覽圖如下:

修改線的顏色修改相應地方的代碼即可。

現在我將Stroke填充的顏色改成#FF0000,觀察效果:

3.3設置線寬度
在默認的style里面沒有設置線寬,這里我加上stroke-width語句,將寬度設置為6,方便觀察。

Stroke-width插入的地方就在#FF0000這一行的下方,格式類似。
6
觀察效果:

3.4設置線邊框
線圖層和面圖層、點圖層有一個顯著的區別,對線的顏色填充只能用“Stroke”,不能用“fill”。在前面講面圖層的時候,對面的邊框設置顏色我們用到了stroke關鍵字,而對於線來說我們不能使用兩個stroke一個設置線顏色,一個設置邊框。這里提供另一種方法來對線的邊框進行設置。
我們可以將同一條線顯示兩次,而將其線寬和顏色設置成不同。比如一條設置成寬度為5顏色為黑色,另一條設置成寬度為3顏色為藍色,兩條線重疊在一起就可以顯示出一條線寬為3,邊框寬度為1的線了。
這里有一點要注意:寬的線應該處在圖層下面,窄的線應該處在圖層上面,否則寬的線會完全遮擋窄的線,無法達到效果。因此在編寫代碼的時候,我們應該先設置線寬較寬的線,這樣它會顯示在圖層的下方。
這里先給出正確的代碼:
<?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>
<sld:LineSymbolizer>
<sld:Stroke>
<sld:CssParameter name="stroke">#333333</sld:CssParameter>
<sld:CssParameter name="stroke-linecap">round</sld:CssParameter>
<sld:CssParameter name="stroke-width">5</sld:CssParameter>
</sld:Stroke>
</sld:LineSymbolizer>
</sld:Rule>
<sld:VendorOption name="ruleEvaluation">first</sld:VendorOption>
</sld:FeatureTypeStyle>
<sld:FeatureTypeStyle>
<sld:Rule>
<sld:LineSymbolizer>
<sld:Stroke>
<sld:CssParameter name="stroke">#6699FF</sld:CssParameter>
<sld:CssParameter name="stroke-linecap">round</sld:CssParameter>
<sld:CssParameter name="stroke-width">3</sld:CssParameter>
</sld:Stroke>
</sld:LineSymbolizer>
</sld:Rule>
<sld:VendorOption name="ruleEvaluation">first</sld:VendorOption>
</sld:FeatureTypeStyle>
</sld:UserStyle>
</sld:NamedLayer>
</sld:StyledLayerDescriptor>
上面紅色部分設置了一條寬度為5顏色為#333333的線,綠色部分設置了一條寬度為3顏色為#6699FF的線,先觀察其效果:

現在將紅藍部分順序調換,再觀察其效果:

藍色部分被完全遮蓋。
參考上面的設置方法,我們可以設置多個線邊框,現在我將線顯示三次。

這個是在之前的基礎上加了一條顏色為#FF0000,寬度為7的線,可以看到最外圈多了一個紅色的邊框。
注:從這里我們可以得出結論,如果一個style里面存在多個Rule,排在前面的Rule將會優先參與繪制,繪制的圖在下方。如果我們想要以多個Rule實現某些功能,要注意順序,不要讓想展示的圖層被遮蓋。
3.5設置不連續的線
這里所謂的不連續的線其實就是虛線,將一條線顯示為每隔五個像素打斷,空兩個像素,再繪制五個像素長度,這樣配置的線就是不連續的虛線。虛線一般設置得比較少,不過仍時不時用到,比如設置鐵路就需要用到相關的方法。對虛線的設置只需要在相關位置添加一行代碼即可。

<sld:CssParameter name="stroke-dasharray">5.0 2.0</sld:CssParameter>
1
我們這里用到了新的關鍵字:stroke-dasharray。它的賦值有兩個,前面的5.0為實線的長度,后面的2.0為空白的長度。這里所做的設置就是每五個像素線被打斷,空兩個像素的長度再接着繪制,我們可以來看看效果。

3.6以“點”連線
我們前面顯示的線都可以看作是一支筆按照一定的規則繪出,其寬度固定,顏色取決於設置。我們同樣可以用一個個圖片來取代這一支“筆”,將它們按照同樣的規則放置連成線。這里我們講解顯示線的新方式,以形狀來連線。這里先使用geoserver自帶的circle來示范。
我們先來看看代碼:
<sld:LineSymbolizer>
<sld:Stroke>
<sld:GraphicStroke>
<sld:Graphic>
<sld:Mark>
<WellKnownName>circle</WellKnownName>
<sld:Stroke> <sld:CssParameter name="stroke">#333333</sld:CssParameter></sld:Stroke>
</sld:Mark>
<sld:Size>12</sld:Size>
</sld:Graphic>
</sld:GraphicStroke>
</sld:Stroke>
</sld:LineSymbolizer>
這里修改的部分和2.2里面的修改類似,我引用了自帶的circle來繪制線。Circle可以是空心的圓,也可以是實心的圓面,這取決於綠色部分的代碼。這里我繪制的是邊框為#333333的圓,可以看看效果:

將綠色部分的Stroke換成Fill

注:我們也可以使用外部圖片來連線,將相應部分代碼修改即可,具體方法和2.3類似。
3.7線上加“點”
上面說到了用圖片連線的問題,我們也可以使用圖片對線來進行修飾。在2.4小節里,我們講到了可以將線顯示兩次來顯示線邊框,我們這里同樣可以將線顯示兩次來達到線上加“點”的目的。我們直接看看效果,這里不作詳細講解。

這里先繪制了黑色的實線,再繪制了以空心圓連接成的線。它們交叉在一起,看起來很不美觀。結合2.5所講的內容,我們可以將兩條線全部繪制成虛線,穿插繪制,以達到線-圓-線這樣的目的。
這里就引入了新的問題,兩者在一個起點進行繪制的話,由於開始就有重疊的地方,無論怎么設置打斷的長度,在后面的繪圖里面肯定還會有重疊的地方。因此我們需要將其中某條線進行偏移,也就是說起點偏移到合適的地方。這里引入新的關鍵字:stroke-dashoffset,當其取值為正時,表示朝起點方向進行偏移。我們可以使用這個關鍵字對線進行微調,這里不作詳細講解。可以看看代碼及效果圖:
<sld:Rule>
<sld:LineSymbolizer>
<sld:Stroke>
<sld:CssParameter name="stroke">#0000ff</sld:CssParameter>
<sld:CssParameter name="stroke-dasharray">10.0 10.0</sld:CssParameter>
</sld:Stroke>
</sld:LineSymbolizer>
<sld:LineSymbolizer>
<sld:Stroke>
<sld:GraphicStroke>
<sld:Graphic>
<sld:Mark>
<sld:WellKnownName>circle</sld:WellKnownName>
<sld:Stroke>
<sld:CssParameter name="stroke">#000033</sld:CssParameter>
</sld:Stroke>
</sld:Mark>
<sld:Size>5</sld:Size>
</sld:Graphic>
</sld:GraphicStroke>
<sld:CssParameter name="stroke-dashoffset">7.5</sld:CssParameter>
<sld:CssParameter name="stroke-dasharray">5.0 15.0</sld:CssParameter>
</sld:Stroke>
</sld:LineSymbolizer>
</sld:Rule>
3.8*不同屬性線配置
相對於面來說,往往一個線圖層有各種類型,而不像面圖層一樣單一。比如“路”,一般屬於線圖層,我們需要根據公路、鐵路、小徑、高速公路等各種類型來為其配置不同的style。
首先要做的就是過濾了。根據圖層各種字段具體的屬性來過濾,如果在路圖層的屬性表中,公路、鐵路等這些字段歸屬於一個名為“TYPE”的類,那么我們就可以根據TYPE的值來進行過濾,下面依舊根據示例數據進行講解。
在示例數據中,有三種類型的線,它們的“type”的值分別為“local-road”,“secondary”,“highway”,那么我們就可以根據這個來設置過濾條件。這里貼出完整代碼:
<?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:PropertyIsEqualTo>
<ogc:PropertyName>type</ogc:PropertyName>
<ogc:Literal>local-road</ogc:Literal>
</ogc:PropertyIsEqualTo>
</ogc:Filter>
<sld:LineSymbolizer>
<sld:Stroke>
<sld:CssParameter name="stroke">#009933</sld:CssParameter>
<sld:CssParameter name="stroke-width">2</sld:CssParameter>
</sld:Stroke>
</sld:LineSymbolizer>
</sld:Rule>
<sld:VendorOption name="ruleEvaluation">first</sld:VendorOption>
</sld:FeatureTypeStyle>
<sld:FeatureTypeStyle>
<sld:Rule>
<ogc:Filter>
<ogc:PropertyIsEqualTo>
<ogc:PropertyName>type</ogc:PropertyName>
<ogc:Literal>secondary</ogc:Literal>
</ogc:PropertyIsEqualTo>
</ogc:Filter>
<sld:LineSymbolizer>
<sld:Stroke>
<sld:CssParameter name="stroke">#0055CC</sld:CssParameter>
<sld:CssParameter name="stroke-width">3</sld:CssParameter>
</sld:Stroke>
</sld:LineSymbolizer>
</sld:Rule>
<sld:VendorOption name="ruleEvaluation">first</sld:VendorOption>
</sld:FeatureTypeStyle>
<sld:FeatureTypeStyle>
<sld:Rule>
<ogc:Filter>
<ogc:PropertyIsEqualTo>
<ogc:PropertyName>type</ogc:PropertyName>
<ogc:Literal>highway</ogc:Literal>
</ogc:PropertyIsEqualTo>
</ogc:Filter>
<sld:LineSymbolizer>
<sld:Stroke>
<sld:CssParameter name="stroke">#FF0000</sld:CssParameter>
<sld:CssParameter name="stroke-width">6</sld:CssParameter>
</sld:Stroke>
</sld:LineSymbolizer>
</sld:Rule>
<sld:VendorOption name="ruleEvaluation">first</sld:VendorOption>
</sld:FeatureTypeStyle>
</sld:UserStyle>
</sld:NamedLayer>
</sld:StyledLayerDescriptor>
從代碼中我們可以發現,過濾條件的設置放在了對線配色、線寬設置的前面,這里的原因是顯而易見的——我們需要先過濾出對象再根據對象來配置。
過濾的關鍵字為ogc:Filter,表示我們要輸入過濾條件了。ogc:PropertyIsEqualTo是條件的設置,PropertyIsEqualTo表示等於,還有類似的語句如PropertyIsGreaterthan、PropertyIsLike等來進行過濾,具體情況具體分析。ogc:PropertyName>typehighway
4*自帶圖形預覽 
本章節僅用於參考。自帶圖形的配置方法多種多樣,盡管大部分圖形看起來都很簡單,但是種類繁多,在配置的時候其實可供的選擇有很多,雖然常用到的很少。在此僅做一個簡單的介紹。
我們在設置各種類型圖層的style的時候,有時會用到外部的圖片,外部圖片由自己命名,比較自由。內部的圖形也很多,但是我們並不知道它們的名字和預覽效果,用起來有些束手束腳。現在給出部分圖形及符號的名稱以及效果,方便以后的配圖。
4.1Standard symbols
這種類別的比較常見,我們多用於配置點。當然,也可以像第三章所說的用來配置線,一切都視具體情況而定,只要你的代碼不報錯,且能夠成功預覽,那么你的用法就是對的。

預覽效果:
Circle:

Square:

Triangle:

Star:

Cross:

X:

4.2Shape symbols
這種類型的圖形都是shape://開頭,它們多用於描述線,我們依舊按照之前的辦法來使用它,除了命名格式不同,其他的都是一樣的。
一共有這么幾種類型:vertline、horline、slash、backslash、dot、plus、times、oarrow、carrow(注意前面加上shape://)。為了直觀地看到它們的配置效果,這里都是用它們來配置點圖層,實際上用在點圖層上並不多。
Vertline:

Slash:

Backslash:

plus:

和前面的cross形狀相同,區別在於cross包含其外接矩形的的空間,而plus僅是自身形狀的范圍
Times:

和前面x的形狀相同,性質的區別和類似於cross和plus
Oarrow:

多用於線的末尾,表示箭頭
Carrow:

多用於線的末尾,表示箭頭
細心的人可以發現我在上面省略了兩個關鍵字:horline和dot,在配置點、線圖層的時候用這兩個關鍵字均告失敗,具體用法有待研究。
常用到的圖形就是以上兩種,下面對其他類別的圖形做一個粗略的介紹
4.3Extshape symbols(待完善)
這個是對上面的shape symbols的擴充,一般在描述天氣的時候用到,關鍵字有triangle、emicircle、triangleemicircle、narrow、sarrow等。
4.4Custom WKT shapes(待完善)
WKT是一種文本標記語言,可以用於表示矢量幾何對象,這種方式的代碼非常復雜,是最麻煩的一種方式。
4.5Bulk TTF marks(待完善)
我們可以用網絡上包含的符號來描述點圖層,如Wingdings,Webdings等。具體格式為ttf://webdings#圖片編碼。
5多條件過濾
前面講到了對不同屬性的點、線、面進行過濾來讓它們以不同的style顯示。所設置的過濾條件基本都是單個的,只有在講點的過濾的時候有一段是兩個過濾條件。現在就對過濾方法以及過濾的關鍵字做一個歸納。
5.1過濾關鍵字
下面是過濾的關鍵字:

上面的關鍵字大致分為三類,我將其命名為普通關鍵字和條件關鍵字,普通關鍵字里面有兩個帶*的關鍵字再分為一類。為何這樣分類,在后面的示例里面將會詳細講解。
5.2多條件過濾
多條件過濾必須用到And或者Or,它們用來設置兩個乃或更多條件的關系(不建議寫太過復雜的條件語句)。我們用普通關鍵字設置好條件,然后用And或者Or進行連接,下面看一則示例。
圖層准備:testline(此圖層是在styling cookbook里面下載的示例圖層,有興趣的可以自行下載)
Style准備:testlin(這個style是對自帶的Line的拷貝。)
為了便於理解,也給出線的屬性表。

預覽圖如下:

現在先設置一個過濾條件,添加如下代碼:
<ogc:Filter>
<ogc:PropertyIsEqualTo>
<ogc:PropertyName>type</ogc:PropertyName>
<ogc:Literal>local-road</ogc:Literal>
</ogc:PropertyIsEqualTo>
</ogc:Filter>
上面講線圖層過濾的時候已經說過,這段代碼的意思是過濾出type=local-road的線。還是先看一下效果:

這里我再添加一個條件,由於我下載的圖層比較簡單,屬性有限,除了type屬性外,還有Shape和name兩個屬性,其中Shape的值均為折線,name的值各不相同。因此我只能選擇name屬性來做二次過濾。
新添加這么一段代碼:
<ogc:PropertyIsEqualTo>
<ogc:PropertyName>name</ogc:PropertyName>
<ogc:Literal>Rokey Road</ogc:Literal>
</ogc:PropertyIsEqualTo>
由於兩個屬性都是字符型的,因此我過濾關鍵字的選取都是用的等於,若是以后遇到數值型的可以使用大於、小於等關鍵字。
要插入這么一段代碼,就需要使用條件關鍵字來對它和上面的條件進行連接,想要同時滿足就用And,想要滿足其一就用Or,這里我選擇And,先看看插入之后的代碼:
<ogc:Filter>
<ogc:And>
<ogc:PropertyIsEqualTo>
<ogc:PropertyName>type</ogc:PropertyName>
<ogc:Literal>local-road</ogc:Literal>
</ogc:PropertyIsEqualTo>
<ogc:PropertyIsEqualTo>
<ogc:PropertyName>name</ogc:PropertyName>
<ogc:Literal>Rocky Road</ogc:Literal>
</ogc:PropertyIsEqualTo>
</ogc:And>
</ogc:Filter>
插入部分我已標紅,后面的過濾語句緊跟在之前的過濾語句后面,它們共同被And所包裹,也可以用And和Or來層層嵌套實現復雜的條件,不過不建議寫過多的條件來過濾,很容易出錯,而且一般也沒有必要。
現在看看加入上面代碼之后的預覽圖:

此時過濾出了type為local-road,name為Rocky Road的線。若是沒有同時符合兩個條件的線,則預覽圖里面為空白,這里就不進行演示了,有興趣的可以嘗試一下。
注:如果將type下面的值或者name下面的值寫錯,語句執行時無法找到相應的值,將會返回空白的結果參與圖像的生成,不會報錯;如果將type或name這一級別的值寫錯了,那么過濾的時候就會直接報錯,盡管在檢查代碼的時候會發現沒有問題,但是進行圖片預覽時無法預覽。
5.3*PropertyIsLike的用法
PropertyIsLike是一個特殊的過濾條件,其語句的寫法和其他的普通關鍵字不同,故而單獨進行說明。
在使用數據庫進行查詢的時候,我們也會用到like這個關鍵字,使用like之后,對查詢的關鍵字某個位置加上%表示該處省略多個字符,加上_表示該處省略一個字符,以此來實現模糊查詢的目的。這里的PropertyIsLike和like的用法有相似之處。這里先給出一段使用PropertyIsLike來過濾的代碼:
<ogc:Filter>
<ogc:PropertyIsLike wildCard="*" singleChar="." escape="!">
<ogc:PropertyName>name</ogc:PropertyName>
<ogc:Literal>L*</ogc:Literal>
</ogc:PropertyIsLike>
</ogc:Filter>
我們發現在PropertyIsLike后面還有一串代碼。wildCard,用來設置表示多個字符的符號,我這里給的是“”,表示代表的是多個字符;singleChar,用來設置表示單個字符的符號,我這里給出的是“.”。我這里設置的條件是name的值為L開頭的字符串。我們對比源數據的屬性表,有三條線符合要求,那么在生成的圖片當中應當有三條線:

PropertyIsNotLike,多了一個Not,表示否定,用法類似。
6設置比例尺
6.1重要性
如果將一幅地圖上的元素不作限制全部顯示出來的話,可能會顯得非常混亂。在大比例尺的時候,一些比較小的對象完全可以不必顯示。比如在中國地圖第0級的時候,整個湖北省也只能占據一小塊地方,這種情況下如果將所有的房屋設置成顯示狀態,地圖就會非常龐雜且不美觀,可見設置比例尺將不同圖層或者圖層下的各種對象分級顯示非常重要。
從本質上來說,比例尺設置也是一種條件過濾。在講解點、線、面的不同屬性配置的時候也提到過過濾的方法。但是鑒於比例尺過濾的特殊性和其通用性,我在此單獨開辟一章講解設置比例尺的方法。
線圖層的分級顯示易於觀察,這里我就在示例數據的線圖層基礎上來對比例尺設置進行講解。
6.2設置比例尺
圖層准備:testline(此圖層是在styling cookbook里面下載的示例圖層,有興趣的可以自行下載)
Style准備:testlin(這個style是對自帶的Line的拷貝,經過前面的修改,現在根據其type類型顯示了三種不同的顏色)
初始圖:

我將對這三種顏色的線進行分級顯示(上圖比例尺:1:140M)
首先我們研究源代碼。
<sld:FeatureTypeStyle>
<sld:Rule>
<ogc:Filter>
<ogc:PropertyIsEqualTo>
<ogc:PropertyName>type</ogc:PropertyName>
<ogc:Literal>local-road</ogc:Literal>
</ogc:PropertyIsEqualTo>
</ogc:Filter>
<sld:LineSymbolizer>
<sld:Stroke>
<sld:CssParameter name="stroke">#009933</sld:CssParameter>
<sld:CssParameter name="stroke-width">2</sld:CssParameter>
</sld:Stroke>
</sld:LineSymbolizer>
</sld:Rule>
<sld:VendorOption name="ruleEvaluation">first</sld:VendorOption>
</sld:FeatureTypeStyle>
這是其中一段代碼,設置了type的值為local-road的線顏色為#009933,線寬為2。紅色部分為過濾語句,現在我們再加上一段過濾語句:
100000000.0
這一段代碼表示顯示的最小比例尺為1:100M。這里的設置取值是取右邊的整數,因此值越大比例尺越小,MaxScaleDenominator中的Max即最大的意思,這一段的完整意思是,比例尺右邊的數字最大值為100M,超過100M不予顯示。
那么這一段代碼放在什么地方呢?作為一個過濾的條件,它應該放在“%Symbolizer”語句的前面,前面已經有了一段過濾語句,我們是應該放在它的前面、中間還是后面?這里不作詳細測試了,直接說結論。在語法上來說,放在前面后面是沒有問題的,放在中間會報錯。示例里面是將這段代碼放在了ogc語句的后面,放在前面會可不可行,會出現什么問題,有待研究。
現在我將該段代碼加入上面的語句:

注:這里我只對local-road設置了比例尺。
現在是比例尺為1:140M的時候的預覽圖:

現在只顯示了兩種類型了線。
比例尺為1:70M的預覽圖:

現在之前未顯示的線已經顯示。
前面對比例尺的設置用到了MaxScaleDenominator關鍵字,這里設置的是比例尺分母的最大值,當然還可以設置比例尺分母的最小值,關鍵字為MinScaleDenominator。現在我們將<sld:MinScaleDenominator>100000000.0</sld:MinScaleDenominator>插入同樣的地方,將之前的比例尺語句刪掉,觀察效果:

這是1:140M時候的預覽圖,三條線全部顯示。

這是1:70M的時候的預覽圖,此時只顯示了兩種線,情況與之前的完全相反。
還有的時候我們需要使用兩個關鍵字聯合限制,規定出一個顯示圖層的比例尺范圍。比如我們現在要規定只允許之前作限制的那條線在1:140M和1:70M之間顯示,比例尺小於1:140M或大於1:70M都不予顯示,這種情況應該怎么做呢?非常簡單,只用按照要求寫出最小和最大比例尺即可,它們中間甚至都不需要其它關鍵字來連接。
現在我將這么兩句代碼插入相應的位置,將之前的比例尺刪除。
<sld:MinScaleDenominator>70000000.0</sld:MinScaleDenominator>
<sld:MaxScaleDenominator>140000000.0</sld:MaxScaleDenominator>
1
2
預覽圖如下:

這個是1:279M時候的預覽圖,限制的線沒有顯示。

這個是1:140M時候的預覽圖,限制的線已經顯示。

這個是1:70M時候的預覽圖,限制的線又被隱藏。
從這里可以發現,設置最大的分母值的時候,其實際含義是大於或等於的;設置最小分母值的時候,其含義只是小於。這一點在配置的時候需要注意。已知的設置比例尺的關鍵字就這么兩個,如果想要將上面1:70M的時候隱藏的線也顯示出來,我們可以適當做一些變通,將范圍設置成60M至140M就可以了。
7設置標注
7.1顯示標注
一般來說,一幅地圖的標注是必不可少的。在我們配置的圖層里往往有標注的屬性字段,因此我們要做的就是將其顯示出來。一幅地圖中點的標注是最為復雜的,這里我就以點來進行示例。
圖層准備:testpnt(此圖層是在styling cookbook里面下載的示例圖層,有興趣的可以自行下載)
Style准備:pnt2(這是對某個帶標注的style的拷貝)
配置之后,預覽圖如下:

依舊給出源碼來詳細說明。
<?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>
<sld:PointSymbolizer>
<sld:Graphic>
<sld:Mark>
<sld:WellKnownName>circle</sld:WellKnownName>
<sld:Fill>
<sld:CssParameter name="fill">#ff0000</sld:CssParameter>
</sld:Fill>
</sld:Mark>
<sld:Size>6</sld:Size>
</sld:Graphic>
</sld:PointSymbolizer>
<sld:TextSymbolizer>
<sld:Label>
<ogc:PropertyName>name</ogc:PropertyName>
</sld:Label>
<sld:Font>
<sld:CssParameter name="font-family">Arial</sld:CssParameter>
<sld:CssParameter name="font-size">12</sld:CssParameter>
<sld:CssParameter name="font-style">normal</sld:CssParameter>
<sld:CssParameter name="font-weight">bold</sld:CssParameter>
</sld:Font>
<sld:Fill>
<sld:CssParameter name="fill">#000000</sld:CssParameter>
</sld:Fill>
</sld:TextSymbolizer>
</sld:Rule>
<sld:VendorOption name="ruleEvaluation">first</sld:VendorOption>
</sld:FeatureTypeStyle>
</sld:UserStyle>
</sld:NamedLayer>
</sld:StyledLayerDescriptor>
可以看到在Rule中包含兩個模塊,一個是PointSymbolizer,還有就是標紅部分的TextSymbolizer。從字面意思上也可以看出,前一個是對點本身屬性的描述,后一個則是標注的設置。現在我們對紅色部分逐段分析。
<sld:Label>
<ogc:PropertyName>name</ogc:PropertyName>
</sld:Label>
1
2
3
Lable關鍵字設置了標注顯示的標准。在原圖層里面,各種標注都存儲在一個“name”的字段里面,想要顯示標注,我就將lable的值設置為name即可。
<sld:Font>
<sld:CssParameter name="font-family">Arial</sld:CssParameter>
<sld:CssParameter name="font-size">12</sld:CssParameter>
<sld:CssParameter name="font-style">normal</sld:CssParameter>
<sld:CssParameter name="font-weight">bold</sld:CssParameter>
</sld:Font>
1
2
3
4
5
6
這里設置了標注的字體之類的屬性。這里的四個關鍵字分別對應於字體、大小、字形(斜體、正常等)和粗細設置。其他屬性也可以添加代碼來設置。
<sld:Fill>
<sld:CssParameter name="fill">#000000</sld:CssParameter>
</sld:Fill>
字的顏色在此設置,類似於對圖層顏色設置。
7.2標注的復雜設置
上一節講到了標注的顯示和標注顏色、字體的設置,這些設置都比較基礎,如果要將標注顯示得更加美觀、有特色,我們需要用到很多其他的關鍵字。標注語句是配圖最為復雜的一環,如果能熟練的配置標注,那么配圖方法基本就掌握得差不多了。
由於點、線、面標注各有特點,因此配置方法有的地方會有所不同。僅囿於以點標注作示例的話,可能以后配圖時會出現配置線、面時不適用的情況,因此我將詳細地說明配置點、線、面的相同點和不同點。
7.2.1點標注的特性設置
配置點標注的時候,我們會考慮以下問題:
1.標注在點的左邊、右邊,還是上邊、下邊?
2.標注的角度是水平,還是傾斜?傾斜多少度?
Geoserver為點標注的特性准備了一個關鍵字:PointPlacement,專門用來配置上面的情況。PointPlacement里面有三個關鍵字用來調整點標注的位置和角度,分別為AnchorPoint、DisPlacement和Rotation。我們來看看具體的功能。
先觀察上一節配置點標注部分的代碼:
<sld:TextSymbolizer>
<sld:Label>
<ogc:PropertyName>name</ogc:PropertyName>
</sld:Label>
<sld:Font>
<sld:CssParameter name="font-family">Arial</sld:CssParameter>
<sld:CssParameter name="font-size">12</sld:CssParameter>
<sld:CssParameter name="font-style">normal</sld:CssParameter>
<sld:CssParameter name="font-weight">bold</sld:CssParameter>
</sld:Font>
<sld:Fill>
<sld:CssParameter name="fill">#000000</sld:CssParameter>
</sld:Fill>
</sld:TextSymbolizer>
PointPlacement必須被LablePlacement所包裹,加上這兩個關鍵字之后,我們先加入AnchorPoint語句。
<sld:TextSymbolizer>
<sld:Label>
<ogc:PropertyName>name</ogc:PropertyName>
</sld:Label>
<sld:Font>
<sld:CssParameter name="font-family">Arial</sld:CssParameter>
<sld:CssParameter name="font-size">12</sld:CssParameter>
<sld:CssParameter name="font-style">normal</sld:CssParameter>
<sld:CssParameter name="font-weight">bold</sld:CssParameter>
</sld:Font>
<sld:LabelPlacement>
<sld:PointPlacement>
<sld:AnchorPoint>
<sld:AnchorPointX>0.5</sld:AnchorPointX>
<sld:AnchorPointY>0.5</sld:AnchorPointY>
</sld:AnchorPoint>
</sld:PointPlacement>
</sld:LabelPlacement>
<sld:Fill>
<sld:CssParameter name="fill">#000000</sld:CssParameter>
</sld:Fill>
</sld:TextSymbolizer>
注意插入AnchorPoint語句的位置,其X、Y取值范圍一般為【0,1】,這里給出的的取值為0.5,0.5,以下是預覽圖:

現在點在標注的正中間。
我們改變X、Y的取值,X=0,Y=0,觀察效果:

改變X、Y的取值,X=1,Y=1,觀察效果:

從上面的三幅圖可以得出結論,X的值越趨近於0,標注越靠右,在X值為0的時候在與點相距0像素的正右方;Y的值越趨近於0,標注越靠上,在Y值為0時在與點相距0像素的正上方。我們可以根據這兩個值來共同調控標注的位置。
注1:我們可以不加AnchorPoint語句,那么系統將默認X=0,Y=0,。一旦我們加了AnchorPoint語句,那么我們必須將其寫完,只給X的值或者Y的值都不行。
前面說到X、Y取值一般為【0,1】,那么可否取范圍外的值呢?答案是可行的。標注是有長度和寬度的(這里不考慮實際的寬度,將水平方向規定為長,豎直方向規定為寬)。通過前面的示例可以發現,X=1時,將標注向左平移了1個單位的標注長度,那么X=-1的時候,就相當於將標注向右平移了一個單位的標注長度。只是一般來說,標注不會離點太遠,因此取值盡量在【0,1】范圍內。
將AnchorPoint語句刪掉,插入DisPlacement語句,我們來觀察其效果。
這是插入的語句:
<sld:LabelPlacement>
<sld:PointPlacement>
<Displacement>
<DisplacementX>10</DisplacementX>
<DisplacementY>0</DisplacementY>
</Displacement>
</sld:PointPlacement>
</sld:LabelPlacement>
預覽圖如下:

由於我將之前的AnchorPoint語句刪除,因此標注默認在點的右上角。現在我們發現,標注向右又偏移了一段距離,這就是Displacement語句的作用。我設置的是X=10,Y=0,其效果是將標注向右偏移10個像素。
從效果上看,Displacement和AnchorPoint的作用極其相似,都是用來調整標注的位置。AnchorPoint根據標注本身的屬性來進行調整,Displacement根據固定的像素來進行調整。對標注位置的調整一般用不着使用兩個關鍵字聯合調整,我們選擇合適的語句進行調整即可。
將Displacement語句刪掉,現在加入Rotation語句:
<sld:LabelPlacement>
<sld:PointPlacement>
<sld:Rotation>45</sld:Rotation>
</sld:PointPlacement>
</sld:LabelPlacement>
預覽圖如下:

可以看到標注順時針偏轉了45°,那么Rotation的作用就顯而易見了。在Rotation之間輸入角度值可以實現對標注一定的旋轉。
現在就有一個矛盾的地方,在我們將標注移動語句和旋轉語句共同使用的時候,若是我們先進行旋轉再進行移動,那么移動時是按照水平和豎直方向進行移動還是根據旋轉后的方向進行移動呢?geoserver不允許此類情況的發生,如果將旋轉語句寫在移動語句的前方,那么將無法完成style的提交。
7.2.2線標注的特性設置
和點標注類似的是,線標注也需要注意標注和線的位置關系,標注在線上還是線的外面?需要設置。線往往綿延很長的距離,其標注是一條線上多個標注好還是單個標注好?需要考慮。現在我們就根據具體的示例來看看線標注的配置方法。
圖層准備:testline(此圖層是在styling cookbook里面下載的示例圖層,有興趣的可以自行下載)
Style准備:testlin(這個style是對自帶的Line的拷貝)
現在我將顯示標注的代碼插入進去,全代碼如下:
<?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_line</Name>
<UserStyle>
<!-- Styles can have names, titles and abstracts -->
<Title>Default Line</Title>
<Abstract>A sample style that draws a line</Abstract>
<!-- FeatureTypeStyles describe how to render different features -->
<!-- A FeatureTypeStyle for rendering lines -->
<FeatureTypeStyle>
<Rule>
<Name>rule1</Name>
<Title>Blue Line</Title>
<Abstract>A solid blue line with a 1 pixel width</Abstract>
<LineSymbolizer>
<Stroke>
<CssParameter name="stroke">#0000FF</CssParameter>
</Stroke>
</LineSymbolizer>
<TextSymbolizer>
<Label>
<ogc:PropertyName>name</ogc:PropertyName>
</Label>
<Font>
<CssParameter name="font-family">Arial</CssParameter>
<CssParameter name="font-size">12</CssParameter>
<CssParameter name="font-style">normal</CssParameter>
<CssParameter name="font-weight">bold</CssParameter>
</Font>
<Fill>
<CssParameter name="fill">#000000</CssParameter>
</Fill>
</TextSymbolizer>
</Rule>
</FeatureTypeStyle>
</UserStyle>
</NamedLayer>
</StyledLayerDescriptor>
代碼和顯示點圖層的標注一模一樣,因為它們標注都存放在name下面。
預覽圖如下:

線標注默認都是以線的中點為起點,標注水平顯示,從上圖可以看到,顯示得非常混亂,要一眼看出哪個標注屬於哪條線有些困難,因此我們需要對它進行設置。
對線標注設置也有一個專屬的關鍵字:LinePlacement,使用這個關鍵字可以調整線標注的位置。我們先加入其包含的Perpendicularoffset關鍵字來進行設置。
<TextSymbolizer>
<Label>
<ogc:PropertyName>name</ogc:PropertyName>
</Label>
<Font>
<CssParameter name="font-family">Arial</CssParameter>
<CssParameter name="font-size">12</CssParameter>
<CssParameter name="font-style">normal</CssParameter>
<CssParameter name="font-weight">bold</CssParameter>
</Font>
<LabelPlacement>
<LinePlacement>
<PerpendicularOffset>0</PerpendicularOffset>
</LinePlacement>
</LabelPlacement>
<Fill>
<CssParameter name="fill">#000000</CssParameter>
</Fill>
</TextSymbolizer>
插入部分為綠色部分,先來看看效果,再來解釋其作用。
預覽圖如下:

現在標注依附在線上,與線基本平行。
我將offset的值修改為10,再來看看效果:

現在標注平行於線的上方,距離線10個長度,單位是像素。這個功能非常實用,我們對線標注的調整基本都要用到這個關鍵字。
線標注的文字不能添加Rotation關鍵字。
線標注還有一個特殊的地方,例如下圖:

我們習慣把國道類的標注用帶一個有顏色的外邊框包裹着標注文字來混合着表示。相比於其他的標注,看似很復雜,其實這種標注要實現只需要添加幾行代碼即可。
在前面講到過引用外部圖片對面圖層進行填充或使用外部圖片來改變點的形狀,實際上,標注也可以引用外部圖片。我們就在示例圖層上看看具體的實現。
這是之前為示例圖層配置標注的代碼:
<TextSymbolizer>
<Label>
<ogc:PropertyName>name</ogc:PropertyName>
</Label>
<Font>
<CssParameter name="font-family">Arial</CssParameter>
<CssParameter name="font-size">12</CssParameter>
<CssParameter name="font-style">normal</CssParameter>
<CssParameter name="font-weight">bold</CssParameter>
</Font>
<LabelPlacement>
<LinePlacement/>
</LabelPlacement>
<Fill>
<CssParameter name="fill">#000000</CssParameter>
</Fill>
</TextSymbolizer>
</Rule>
</FeatureTypeStyle>
</UserStyle>
</NamedLayer>
</StyledLayerDescriptor>
其效果可以參考前面的圖片,默認標注文字在線上中部的位置。
現在在</TextSymbolizer>前面加上引用外部圖片的語句:
<Graphic>
<ExternalGraphic>
<OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="2.png"/>
<Format>image/png</Format>
</ExternalGraphic>
<Size>24</Size>
</Graphic>
我下載的外部圖片:

位置如下:

加入上述代碼后,新的預覽圖如下:

內部自帶圖片也可以引用,比如square、circle等自帶的圖片等,配置方法參考第二、三章。
這種設置方法點、線、面均可使用,不過在線上使用得比較常見。注意引用外部圖片的大小設置問題,其大小默認為本身的大小,我引用的外部圖片過大,因此不得不加上限制語句限制其Szie為24。
7.2.3面標注的特性設置
面標注的大部分設置模式都和點、線類似,這里僅介紹一個去除重復面標注的方法。下圖為僅做標注顯示處理的矢量圖,可以發現標注重復顯示了。一般情況下,區域標注我們希望它在區域的中心顯示就可以了,要實現這樣的顯示,我們需要用到相關的函數。

<sld:FeatureTypeStyle>
<sld:Rule>
<sld:MaxScaleDenominator>136000.0</sld:MaxScaleDenominator>
<sld:TextSymbolizer>
<!-- <Geometry>
<ogc:Function name="centroid">
<ogc:PropertyName>the_geom</ogc:PropertyName>
</ogc:Function>
</Geometry> !-->
<sld:Label>
<ogc:PropertyName>NAME</ogc:PropertyName>
</sld:Label>
<sld:Font>
<sld:CssParameter name="font-family">宋體</sld:CssParameter>
<sld:CssParameter name="font-size">12.0</sld:CssParameter>
<sld:CssParameter name="font-style">normal</sld:CssParameter>
<sld:CssParameter name="font-weight">normal</sld:CssParameter>
</sld:Font>
<sld:LabelPlacement>
<sld:LinePlacement>
<sld:PerpendicularOffset>10.0</sld:PerpendicularOffset>
</sld:LinePlacement>
</sld:LabelPlacement>
<sld:Fill>
<sld:CssParameter name="fill">#000000</sld:CssParameter>
</sld:Fill>
</sld:TextSymbolizer>
</sld:Rule>
</sld:FeatureTypeStyle>
這是本次標注的顯示部分的代碼,標紅部分為控制標注居中不重復的代碼,我已經將其注釋掉,現在取消注釋,看看居中顯示的效果:

目前的顯示效果就比較好了。
7.2.4*VendorOption關鍵字的用法
前面依據點、線標注各自的特點講解了PointPlacement和LinePlacement,從縱向上了解了點、線標注各自的配置方法。其實它們的特點並不止這些,比如點過多的時候,顯示得很擁擠,該如何處理?線太長,顯示了很多重復的標注,怎么讓它只顯示一個?這些的設置都涉及到VendorOption關鍵字,因此在本章橫向地講講VentorOption關鍵字的用法。
1.<VendorOption name="group">yes</VendorOption>
這個語句處理的是重復標注的情況。如果使用上述語句,那么在預覽圖里將不再顯示重復的標注,這對處理線圖層標注重復顯示的問題有很重要的意義。具體的情況我們來看示例。
在前面給出的示例都比較簡單,因此這里更換一個較為復雜的示例。
圖層准備:gismm:road(此圖層是茂名市道路的矢量圖,其道路類型多樣,錯綜復雜)。
Style准備:mmroad(為road配置的style)。
由於代碼過長,這里給出style的一個部分:
<sld:Rule>
<sld:Name>Mstreet</sld:Name>
<ogc:Filter>
<ogc:PropertyIsEqualTo>
<ogc:PropertyName>TYPE</ogc:PropertyName>
<ogc:Literal>Expressway</ogc:Literal>
</ogc:PropertyIsEqualTo>
</ogc:Filter>
<sld:MaxScaleDenominator>250000.0</sld:MaxScaleDenominator>
<sld:LineSymbolizer>
<sld:Stroke>
<sld:CssParameter name="stroke">#E69800</sld:CssParameter>
<sld:CssParameter name="stroke-width">6.0</sld:CssParameter>
</sld:Stroke>
</sld:LineSymbolizer>
<sld:TextSymbolizer>
<sld:Label>
<ogc:PropertyName>NAME</ogc:PropertyName>
</sld:Label>
<sld:Font>
<sld:CssParameter name="font-family">宋體</sld:CssParameter>
<sld:CssParameter name="font-size">24.0</sld:CssParameter>
<sld:CssParameter name="font-style">normal</sld:CssParameter>
<sld:CssParameter name="font-weight">normal</sld:CssParameter>
</sld:Font>
<sld:LabelPlacement>
<sld:LinePlacement>
<sld:PerpendicularOffset>10.0</sld:PerpendicularOffset>
</sld:LinePlacement>
</sld:LabelPlacement>
<sld:Fill>
<sld:CssParameter name="fill">#C0686F</sld:CssParameter>
</sld:Fill>
</sld:TextSymbolizer>
</sld:Rule>
經過前面的講解現在想看懂這一部分的代碼應該不再困難。這一部分過濾出了TYPE的值為Expressway的道路,同時設置了顯示的比例尺的最大分母為250K。下面是對標注的設置。我們先來看看預覽圖:

截取部分預覽圖,上面的style配置的就是高速公路這個圖層。可以看到,沈海高速公路的標注顯示了三次。
現在我們加上VendorOption的代碼進行限制,其位置應當放在標注顏色設置的后面,TextSymbolizer的前面,如圖;

加入上述代碼之后,重新查看預覽圖:

現在只顯示一個標注了。
注:VendorOption語句如果用來對標注進行限制,一般是放在上面標記的地方,以后使用帶VendorOption關鍵字的語句的時候,注意位置不要放錯。此外這個語句在處理面圖層的標注時可能會有問題,面標注去除重復標注的方法見7.2.3。
2.<VendorOption name="labelAllGroup">true</VendorOption>
這個語句從字面上來說,意思是顯示所有的重復的標注,其實際用法也的確如此,與上面的例子完全相反。注意lableAllGroup的賦值是true而不是yes。
3.<VendorOption name="spaceAround">10</VendorOption>
這個語句用來控制兩個標注之間的距離,如果兩個標注在設置的距離內,那么只會顯示一個標注(而不是默認的知道兩個標注即將重疊才隱藏)。這里將spaceAround賦值為10,單位是像素,那么每個標注距離其他標注至少有20個像素的距離。
之前給出的例子過於簡單,這里依然選取一個復雜的例子來講解。
圖層准備:gismm:POI(此圖層是茂名市各個地點的矢量圖,數據量很大)。
Style准備:mmpnt2(原圖層設置了比例尺分級顯示,這里我將其簡化,去掉所有過濾條件直接顯示)。
mmpnt2的代碼去掉種種篩選條件后非常簡單,源碼如下:
<?xml version="1.0" encoding="GB2312"?><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>
<sld:PointSymbolizer>
<sld:Graphic>
<sld:Mark>
<sld:WellKnownName>circle</sld:WellKnownName>
<sld:Fill>
<sld:CssParameter name="fill">#ff0000</sld:CssParameter>
</sld:Fill>
</sld:Mark>
<sld:Size>6</sld:Size>
</sld:Graphic>
</sld:PointSymbolizer>
<sld:TextSymbolizer>
<sld:Label>
<ogc:PropertyName>NAME</ogc:PropertyName>
</sld:Label>
<sld:Font>
<sld:CssParameter name="font-family">宋體</sld:CssParameter>
<sld:CssParameter name="font-size">12</sld:CssParameter>
<sld:CssParameter name="font-style">normal</sld:CssParameter>
<sld:CssParameter name="font-weight">normal</sld:CssParameter>
</sld:Font>
<sld:Fill>
<sld:CssParameter name="fill">#000000</sld:CssParameter>
</sld:Fill>
</sld:TextSymbolizer>
</sld:Rule>
<sld:VendorOption name="ruleEvaluation">first</sld:VendorOption>
</sld:FeatureTypeStyle>
</sld:UserStyle>
</sld:NamedLayer>
</sld:StyledLayerDescriptor>
預覽圖如下(原圖非常混亂,這是放大之后的預覽圖):

現在我加入spaceAround語句,為了更加直觀地觀察,我設置其值為20,預覽圖如下:

標注明顯變得稀疏了。
設置兩個標注之間的距離在配圖的時候經常用到,這是一個很常用的功能。Geoserver一般默認VendorOption的取值為0,我們可以手動設置來調整標注的顯示。
注:VendorOption的值可以取負數,這樣會造成標注重疊的情況。如果不是特別重要的標注,不建議這么做。
4.<VendorOption name="followLine">true</VendorOption>
在前面“線標注的特性設置”這一小節里,我們提到了將線標注設置成和線平行的方法。在所設置的線是直線的情況下,這種設置沒什么問題。但是很多時候我們會遇到曲線的情況。將標注設置成與曲線平行的時候,系統會取曲線的中點,在該點顯示一個與該點切線平行的標注。使用本語句可以強制規定標注始終跟隨線的走向,不會出現脫離線的情況。
5.<VendorOption name="maxDisplacement">10</VendorOption>
這個語句也是用來處理點、線、面標注出現重疊的情況。一般來說,geoserver遇到標注重疊時會默認有的標注不顯示,來規避重疊。我們在前面也了解到可以強制將VendorOption設置成負數來避免重要的標注被隱藏。本語句提供了一個折中的方法:當出現標注會被隱藏的情況的時候,標注會在設置的值的范圍內自動尋找合適的位置來顯示。比如兩條線的距離過近,彼此平行,長度相同,設置其標注在中點沿線顯示,可能就會出現標注的重疊。使用上面語句之后,將被隱藏的標注將會尋找線上10個像素范圍內的其他位置來進行顯示。這個功能在點、線、面的標注顯示上都可以應用。
6.<VendorOption name="repeat">100</VendorOption>
此語句主要用來設置過長的線的標注顯示問題。我們在給地圖配置標注的時候,為了提升地圖加載的速度,一般將road類圖層每條線打斷成很多的對象,因此一般不會出現過長的線標注只有一個這種情況。有時遇到了非常長的線只有一個標注,想要增加它的標注,就需要使用這個語句。Repeat,即重繪,可以將標注反復顯示。后面的值設置的是標注之間的距離,可以理解為重繪的參數。將值設置為100,那么標注將會隔100個像素顯示1次。
注:將5、6的語句一起使用的時候,maxDisplacement的值必須要小於repeat的值,否則標注無法顯示。
7.<VendorOption name="maxAngleDelta">15</VendorOption>
本語句用來控制線標注的最大角度。我們知道,線標注一般顯示在線的中間,如果一條線剛好在中間彎曲,而我們設置了標注始終在線上的話,標注的文字就會不在一條直線上。如果彎曲程度過大,看起來字就會不夠美觀。這里控制的就是標注文字顯示的最大角度,不建議其值超過30。我們可以將本語句與MaxDisplacement配合使用,將標注盡量顯示在一條直線上。
8.<VendorOption name="autoWrap">50</VendorOption>
這里控制的是標注的換行問題,一般用在面圖層的標注顯示上面。我們假設這樣一個場景,“中華人民共和國”七個字在世界地圖上的小比例尺上勉強可以一排顯示,“大不列顛及北愛爾蘭聯合王國”要一排顯示完就有點困難了。在之前的配圖中,一旦一個區域過窄,無法容納標注在相應的范圍內顯示完(超出一小部分沒問題),其標注會被隱藏。設置標注換行后,標注就不再被隱藏了。在上面的語句中,我設置的值為50,那么允許一行顯示標注的最大寬度為50個像素,超過50個像素寬度的標注將會換行。
9.<VendorOption name="forceLeftToRight">true</VendorOption>
前面設置線標注的時候,標注與線平行。大多數情況下,這種設置美觀而且便於識別標注的歸屬。但是我們知道,0°和180°的線也是平行的,這就意味着有的標注可能和我們理想的完全相反,一條水平的線其標注可能倒着來顯示。我們使用這個語句可以強制設定標注一定是由左向右讀的,使其顯示符合我們的習慣。
10.<VendorOption name="conflictResolution">false</VendorOption>
前面很多地方說到了標注的重疊問題,本語句對標注重疊的情況進行設置。如果將spaceAround設置為負數的話,標注是可以重疊的,但是其取值決定了容忍重疊的范圍。使用本語句不需要設置范圍,其值為false的時候,所有的標注均可重疊。
11.<VendorOption name="goodnessOfFit">0.3</VendorOption>
這個語句是用來過濾掉一些特別不適合有標注的地方,系統默認其取值為0.5。一般來說不適合有標注的地方還是很少的,取值的大小和過濾的程度之間的關系暫時沒有符合條件的樣本進行測試。如果以后配圖遇到這種情況可以加上這個語句嘗試過濾。
12.<VendorOption name="polygonAlign">mbr</VendorOption>
前面提到過區域里的標注顯示問題。如果區域水平方向過窄,標注將無法顯示,會被隱藏。使用這個語句可以將標注旋轉,自動調整至可以顯示的方向。這里給出兩張預覽圖來進行對比:


13.<VendorOption name="graphic-resize">stretch</VendorOption>
這句代碼是針對顯示在圖片里的標注的設置,前面講到線標注配置的時候,有的標注並不單純是文字,其外面有一個有顏色填充的邊框。邊框默認大小一致,因此有的字比較多會超出,有的字比較少比較空曠。使用這句代碼可以根據字段的長短將邊框調整至自適應的大小。
注:只有對引用圖片使用默認大小的可以使用本語句,如果你加了size對外部圖片的大小進行了限制,那么可能會出現標注不顯示等問題。在提供的簡單圖層上面嘗試本語句標注沒有顯示,原因不明。其用法有待發掘。
14.<VendorOption name="partials">true</VendorOption>
本代碼是用來處理在邊界的點的情況(點出現這種情況比較多)。在一幅地圖的邊界部分,其標注如果長度超出了地圖范圍,將會被隱藏。使用本語句之后,標注將會在鄰近合適的地方進行顯示。
注:VendorOption關鍵字很多,這里只是選取了部分,而且它不只是用來對標注進行控制,其用法的靈活多變給我們的學習造成了很多困難。如果日后了解了它其他的用法,歡迎對本部分進行補充。
7.3其他設置
本節對標注的一些美化做一些講解。前面講解的大部分是英文示例,沒有中文亂碼的問題。我們配置地圖一般都是中文,因此第一個需要注意的就是中文的問題。
1.中文編碼
進行sld的編寫時默認的編碼格式是UTF-8或ISO-8859-1,如果代碼存在中文或者要顯示的標注是中文,一定要將編碼格式轉為GB2312格式。

2.字體支持
style支持的字體非常多,基本上word里面支持的大部分普通字體都支持。如果使用中文字體,記得先修改編碼格式。下表是對字體及其他格式的設置,可以進行參考。
分類表:

取值表(font-family):

取值表(font-size):

取值表(font-style):

取值表(font-weight):

3.Halo配置
halo是標注外面的光暈,通過這個關鍵字可以配置出比較美觀的效果,其語法也比較簡單,現給出一段代碼:
<sld:Halo>
<sld:Radius>1</sld:Radius>
<sld:Fill>
<sld:CssParameter name="fill">#FFFF00</sld:CssParameter>
</sld:Fill>
</sld:Halo>
可以發現,光暈只需要設置一個半徑和光暈的顏色就可以了。這里的半徑是緩沖區半徑,整個光暈其實就是以字來生成緩沖區。我們將這段代碼加入到點圖層里面,看看效果。
原圖:

加入代碼后:

4.優先度設置
優先度設置用來處理標注在只能顯示部分的時候的取舍問題。Geoserver為了避免標注重疊的情況,會在發生重疊時隱藏部分標注。在對城市進行配置標注的時候,這種情況比較常見,由於城市過多,在小比例尺下,很多城市僅有點的形狀,沒有標注。我們設想這樣一種情況:將一幅地圖一直縮小,開始的時候,武漢和周邊城市都顯示出來,在放大到全國范圍的時候,整個湖北省只顯示了武漢。為什么會選擇武漢進行顯示呢?這就是對武漢做了優先度的設置,在武漢和其他地方沖突的時候,優先顯示武漢。我們來看看優先度設置的代碼:
<Priority>
<PropertyName>population</PropertyName>
</Priority>
很簡單的幾句代碼。即優先度的意思,下面就是優先度條件的設置。population是圖層的屬性字段,選擇population之后地圖會參考population來優先顯示取值大的點的標注。這樣地圖上那些大都市就不會被隱藏了。
這句代碼的位置在VendorOption的前面。在參考上面的示例設置的時候一直報錯,后面參考之前帶PropertyName關鍵字的部分,在前面加了過濾關鍵字(ogc:PropertyName)就可以正常使用了,多條件過濾是否可行有待嘗試。
插入位置:

7.4為圖層和標注設置不同的比例尺
設想這么一個場景:在一幅地圖的某個層級,顯示了很多個點,由於空間有限,有的地方標注顯示了,有的地方標注沒有顯示,這種不統一的表現方式降低了地圖的美感。我們可以將其設置成在該層級統一顯示點,但是點的標注不顯示,接着放大地圖的時候所有的標注都顯示出來,由於空間變大,此時地圖上的標注都顯示出來了。這里我們來看看具體的實現方法。
我們在前面設置標注的時候,一般都是將標注和圖層的配置放在同一個rule里面,兩個模塊關鍵字分別為%Symbolizer和TextSymbolizer。但是一個rule里面只能對其作一次比例尺限制。我們不能在前面按照比例尺顯示圖層,然后在后面又設置一個比例尺來顯示標注。那么有時我們想要為標注和圖層配置不同的顯示比例尺,這時候該怎么做呢?
在前面很多地方提到過,對同一個圖層,我們可以寫兩個rule將其顯示兩次。配置簡單的圖層時,我們基本只用到了%Symbolizer關鍵字,沒有標注部分。我們也可以只用TextSymbolizer關鍵字,舍棄掉圖層的顯示。綜合這幾點,方法已經呼之欲出了。我們可以在第一個rule里面寫%Symbolizer部分,為其設置比例尺;然后在第二個rule里面寫TextSymbolizer部分,為其設置另一個比例尺。注意圖層不應該遮擋標注,因此圖層顯示應當放在前一個rule里面。這樣我們就能實現標注與圖層比例尺的分離了。
7.5標注順序總覽
標注配置極為復雜,上面講解或橫向、或縱向對標注的配置進行了一個講解,其繁復的關鍵字使得我們配置的時候必須花很多時間來摸索關鍵字插入的正確位置。本節對之前的內容作一個概括,總結標注配置的順序,希望在標注的配置中能有所幫助。
以下是標注配置的關鍵字,按順序排列。

在進行標注的時候如果不按照上面的順序,將會報錯。除了Lable必須配置以外,其他的都是可選項。
8附錄(配色)
以下顏色均參考百度地圖
8.1 地圖配色選取

8.2標注配置

9附錄(鐵路)
鐵路的配置對線的各種關鍵字運用得比較多,很多關鍵字比較少見,只有在配置鐵路的時候會用到。因此在這里直接給出鐵路的style,方面日后配圖。
<Rule>
<sld:Name>Railway</sld:Name>
<ogc:Filter>
<ogc:PropertyIsEqualTo>
<ogc:PropertyName>TYPE</ogc:PropertyName>
<ogc:Literal>Railway</ogc:Literal>
</ogc:PropertyIsEqualTo>
</ogc:Filter>
<sld:MaxScaleDenominator>250000.0</sld:MaxScaleDenominator>
<LineSymbolizer>
<Stroke>
<CssParameter name="stroke">
<ogc:Literal>#000000</ogc:Literal>
</CssParameter>
<CssParameter name="stroke-linejoin">
<ogc:Literal>round</ogc:Literal>
</CssParameter>
<CssParameter name="stroke-opacity">
<ogc:Literal>1.0</ogc:Literal>
</CssParameter>
<CssParameter name="stroke-width">
<ogc:Literal>4.0</ogc:Literal>
</CssParameter>
</Stroke>
</LineSymbolizer>
<LineSymbolizer>
<Stroke>
<CssParameter name="stroke">
<ogc:Literal>#ffffff</ogc:Literal>
</CssParameter>
<CssParameter name="stroke-linejoin">
<ogc:Literal>round</ogc:Literal>
</CssParameter>
<CssParameter name="stroke-opacity">
<ogc:Literal>1.0</ogc:Literal>
</CssParameter>
<CssParameter name="stroke-width">
<ogc:Literal>3.0</ogc:Literal>
</CssParameter>
<CssParameter name="stroke-dasharray">10 10</CssParameter>
</Stroke>
</LineSymbolizer>
</Rule>
上面linejoin是描述線拐角的表現方式,取值有三種情況:“miter”“round”“bevel”(除去繼承父類關鍵字inherit)。一般默認為miter,這里我們需要改成round,因此需要寫出來。

明白了這些之后,結合前面線圖層配圖的章節,我們可以很輕松地讀懂描述鐵路的代碼了。上面有兩段Stroke代碼,將同一條線繪制了兩次。一條線是顏色為黑色,線寬為4的線,一條是顏色為白色,線寬為3的線。由於我們是先顯示黑線,再顯示白線,因此白線在黑線之上,顯示的是一條邊框寬度為0.5,邊框顏色為黑色,線寬為3的白線。我們在中間添加了dasharay語句,將白線每10個像素打斷一次,空出10個像素,露出下面的黑線,造成黑白相間的結果。
10總結
這份教程講解的都是比較基礎的配置方法,示例圖層選取的也是非常簡單的圖層。一幅地圖涉及到的元素非常多,可能會出現很多本教程沒有涉及到的情況。但是從另一個方面來說,本教程將基本的配置框架都已經搭好了,對於復雜的情況我們可以將其拆解為一個個小問題來解決。配圖是一個熟能生巧的過程,本教程旨在給出方法,要熟練仍需日常的練習。
我在寫這份教程的過程中也是在不斷的摸索,自己也發現了很多錯漏之處,有的地方我更正了,有的地方可能我還沒有發現。如果您在閱讀過程中發現錯誤,歡迎指正。同時如果您在配圖的過程中有的新的發現,也歡迎您對這份文檔作出適當的完善,不勝感激。
---------------------
作者:ZGIS智博創享
來源:CSDN
原文:https://blog.csdn.net/zbcx_ZGIS/article/details/82216151
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!
