geoserver 圖層樣式

1.Styled Layer Descriptorapi

    標準描述了妥當的結構合使用規則。一個文檔包含了符號定義和繪製規則,那麼這個文檔就叫作Styled Layer Desciptor(SLD)樣式,它是一個text/Xml文件,擴展名爲.sld。SLD基於XML標記語言,附加的標準是一個XSD schema,XSD schema定義了SLD語法。ide

2.樣式文檔結構svg

    樣式最外層部分包含以下片斷:字體

<?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">

    第一行包含xml定義,每個樣式文件的根節點都爲StyledLayerDescriptor,包含了樣式標準的版本屬性version(Geoserver可以使用1.0.0和1.1.0 SLD版本),還包含了命名空間和模型屬性。
    StyledLayerDescriptor節點包含了一個NamedLayer或者UserLayer的集合,這兩個節點下面又包含了UserStyle節點集合。
UserStyle節點下包含FeatureTypeStyle或者CoverageStyle節點。它們下面都包含了rule集合元素。rule節點定義了怎樣繪製features。下面是一個簡單的樣式文件:ui

<?xml version="1.0" encoding="UTF-8"?>
<StyledLayerDescriptor version="1.0.0"
xsi:schemaLocation="http://www.opengis.net/sld http://schemas.opengis.net/sld/1.0.0/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">
    <NamedLayer>
        <Name>capitals</Name>
        <UserStyle>
            <Name>capitals</Name>
            <Title>Capital cities</Title>
            <FeatureTypeStyle>
                <Rule>
                    <Title>Capitals</Title>
                    <PointSymbolizer>
                        <Graphic>
                        <Mark>
                        <WellKnownName>circle</WellKnownName>
                        <Fill>
                        <CssParameter name="fill">
                        <ogc:Literal>#FFFFFF</ogc:Literal>
                        </CssParameter>
                        </Fill>
                        <Stroke>
                        <CssParameter name="stroke">
                        <ogc:Literal>#000000</ogc:Literal>
                        </CssParameter>
                        <CssParameter name="stroke-width">
                        <ogc:Literal>2</ogc:Literal>
                        </CssParameter>
                        </Stroke>
                        </Mark>
                        <Opacity>
                        <ogc:Literal>1.0</ogc:Literal>
                        </Opacity>
                        <Size>
                        <ogc:Literal>6</ogc:Literal>
                        </Size>

                        </Graphic>
                    </PointSymbolizer>
                </Rule>
            </FeatureTypeStyle>
        </UserStyle>
    </NamedLayer>
</StyledLayerDescriptor>

    UserStyle定義了一個circle符號使用白色填充,黑色邊界。WellKnownName包括:circle、square、triangle、star、cross、x。spa

使用geoserver-數據-Styles可查看配置並校驗Style文件是否合法。.net

    Rule節點下課包含多個PointSymbolizer,樣式文件渲染順序是倒序的,放在後面的PointSymbolizer渲染在地圖上一層,前面的PointSymbolizer渲染在地圖的下一層,至關於z-index的順序。3d

3.實現一個點包含多個形狀(包含多個PointSymbolizer)的樣式例子code

    實現一個比較複雜的點的樣式定義,顯示效果以下:orm

image

    樣式定義以下:

<?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">
    <NamedLayer>
        <Name>opulatedPlacesComplex</Name>
        <UserStyle>
            <Title>Geoserver Beginners Guide: mark composed of three basic shapes</Title>
            <FeatureTypeStyle>
                <Rule>
                    <PointSymbolizer>
                        <Graphic>
                            <Mark>
                                <WellKnownName>circle</WellKnownName>
                                <Fill>
                                    <CssParameter name="fill">#00FF00</CssParameter>
                                </Fill>
                                <Stroke>
                                    <CssParameter name="stroke">#000000</CssParameter>
                                    <CssParameter name="stroke-width">1</CssParameter>
                                </Stroke>
                            </Mark>
                            <Size>16</Size>
                        </Graphic>
                    </PointSymbolizer>
                    <PointSymbolizer>
                        <Graphic>
                            <Mark>
                                <WellKnownName>square</WellKnownName>
                                <Fill>
                                    <CssParameter name="fill">#FF0000</CssParameter>
                                </Fill>
                                <Stroke>
                                    <CssParameter name="stroke">#000000</CssParameter>
                                    <CssParameter name="stroke-width">1</CssParameter>
                                </Stroke>
                            </Mark>
                            <Size>10</Size>
                        </Graphic>
                    </PointSymbolizer>
                    <PointSymbolizer>
                        <Graphic>
                            <Mark>
                                <WellKnownName>circle</WellKnownName>
                                <Fill>
                                    <CssParameter name="fill">#000000</CssParameter>
                                </Fill>
                            </Mark>
                            <Size>5</Size>
                        </Graphic>
                    </PointSymbolizer>
                </Rule>
            </FeatureTypeStyle>
        </UserStyle>
    </NamedLayer>
</StyledLayerDescriptor>

4.實現一個點包含外部資源形狀(ExternalGraphic)的樣式例子

    顯示的點經過一個外部svg圖片來顯示,效果以下:

image

    樣式定義以下:

<?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">
    <NamedLayer>
        <Name>PopulatedPlacesGraphic</Name>
        <UserStyle>
            <Title>Geoserver Beginners Guide: Populated Places with external graphics</Title>
            <FeatureTypeStyle>
                <Rule>
                    <PointSymbolizer>
                        <Graphic>
                            <ExternalGraphic>
                                <OnlineResource 
                                xlink:type="simple" 
                                xlink:href="town.svg"/>
                                <Format>image/svg+xml</Format>
                            </ExternalGraphic>
                            <Size>20</Size>
                        </Graphic>
                    </PointSymbolizer>
                </Rule>
            </FeatureTypeStyle>
        </UserStyle>
    </NamedLayer>
</StyledLayerDescriptor>

    若是想組合不一樣的符號,可經過Inkscape來設置圖形樣式,地址:https://inkscape.org/en/

5.線條樣式,大天然水渠的樣式

    想象輸入去表達大天然的水渠?在地圖中,水渠常常使用虛線和遠點來表示。效果以下:

image

    實現樣式的Xml以下所示:

<?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">
    <NamedLayer>
        <Name>DashingAndMarkers</Name>
        <UserStyle>
            <Title>Title>Geoserver Beginners Guide: Aqueducts with dashing and circle</Title>
            <FeatureTypeStyle>
                <Rule>
                    <LineSymbolizer>
                        <Stroke>
                            <CssParameter name="stroke">#ADD8E6</CssParameter>
                            <CssParameter name="stroke-width">2</CssParameter>
                            <CssParameter name="stroke-dasharray">10 10</CssParameter>
                        </Stroke>
                    </LineSymbolizer>
                    <LineSymbolizer>
                        <Stroke>
                            <GraphicStroke>
                                <Graphic>
                                    <Mark>
                                        <WellKnownName>circle</WellKnownName>
                                        <Stroke>
                                            <CssParameter name="stroke">#ADD8E6</CssParameter>
                                            <CssParameter name="stroke-width">1</CssParameter>
                                        </Stroke>
                                    </Mark>
                                    <Size>5</Size>
                                </Graphic>
                            </GraphicStroke>
                            <CssParameter name="stroke-dasharray">5 15</CssParameter>
                            <CssParameter name="stroke-dashoffset">7.5</CssParameter>
                        </Stroke>
                    </LineSymbolizer>
                </Rule>
            </FeatureTypeStyle>
        </UserStyle>
    </NamedLayer>
</StyledLayerDescriptor>

    第一個LineSymbolizer畫出了虛線效果,第二個LineSymbolizer畫出了圓點的效果。

6.多邊形樣式,使用陰影填充多邊形

    通常多邊形都是經過邊界和單一填充顏色來表示。但多邊形也可使用其餘圖形來做爲陰影。下圖給每一個國家使用點來填充,效果以下:

    image

    實現樣式的Xml文件內容以下:

<?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">
    <NamedLayer>
        <Name>CountriesHatching</Name>
        <UserStyle>
            <Title>Geoserver Beginners Guide: Countries with hatching</Title>
            <FeatureTypeStyle>
                <Rule>
                    <PolygonSymbolizer>
                        <Fill>
                            <GraphicFill>
                                <Graphic>
                                    <Mark>
                                        <WellKnownName>shape://dot</WellKnownName>
                                        <Stroke>
                                            <CssParameter name="stroke">#29A6A6</CssParameter>
                                            <CssParameter name="stroke-width">3</CssParameter>
                                        </Stroke>
                                    </Mark>
                                    <Size>16</Size>
                                </Graphic>
                            </GraphicFill>
                        </Fill>
                        <Stroke>
                            <CssParameter name="stroke">#A52A2A</CssParameter>
                            <CssParameter name="stroke-width">2</CssParameter>
                        </Stroke>
                    </PolygonSymbolizer>
                </Rule>
            </FeatureTypeStyle>
        </UserStyle>
    </NamedLayer>
</StyledLayerDescriptor>

    多邊形的標記爲PolygonSymbolizer,使用WellKnownName爲shape://dot顯示點效果。Stroke設置了點的邊框顏色和大小。Geoserver爲咱們提供了不少標記效果。

    shape://vertline:垂直線。

    shape://horline: 水平線。

    shape://slash: 對角線向前傾斜(「/」)。

    shape://backslash:對角線向後斜線(「\」)。

    shape://dot: 一個小的圓圈,圓圈之間有空隙。

    shape://plus: 一個加號,加號以前沒有空隙。

    shape://times:一個「X」符號,沒有空隙。

    shape://oarrow:一個向外的箭頭。

    shape://carrow:一個向內 箭頭。

7.在點上顯示文字

    在顯示每一個國家的首都時,通常都會在中心座標顯示首都名字,可經過字體標記來顯示字體。效果以下:

image

    實現樣式的xml文件以下:

<?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">
    <NamedLayer>
        <Name>PopulatedPlacesLabeled</Name>
        <UserStyle>
            <Title>Geoserver Beginners Guide: Populated Places with styled labels</Title>
            <FeatureTypeStyle>
                <Rule>
                    <PointSymbolizer>
                        <Graphic>
                            <Mark>
                                <WellKnownName>circle</WellKnownName>
                                <Fill>
                                    <CssParameter name="fill">#FF0000</CssParameter>
                                </Fill>
                                <Stroke>
                                    <CssParameter name="stroke">#000000</CssParameter>
                                    <CssParameter name="stroke-width">1</CssParameter>
                                </Stroke>
                            </Mark>
                            <Size>8</Size>
                        </Graphic>
                    </PointSymbolizer>
                    <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">italyc</CssParameter>
                        </Font>
                        <LabelPlacement>
                            <PointPlacement>
                                <AnchorPoint>
                                    <AnchorPointX>0</AnchorPointX>
                                    <AnchorPointY>0</AnchorPointY>
                                </AnchorPoint>
                                <Displacement>
                                    <DisplacementX>2</DisplacementX>
                                    <DisplacementY>5</DisplacementY>
                                </Displacement>
                            </PointPlacement>
                        </LabelPlacement>
                        <Fill>
                            <CssParameter name="fill">#000000</CssParameter>
                        </Fill>
                    </TextSymbolizer>
                </Rule>
            </FeatureTypeStyle>
        </UserStyle>
    </NamedLayer>
</StyledLayerDescriptor>

8.在連線上顯示文字

    通常某一段線路都會對應有名稱,顯示效果以下:

image

    實現樣式的xml文件以下:

<?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">
    <NamedLayer>
        <Name>RoadsLabeled</Name>
        <UserStyle>
            <Title>Title>Geoserver Beginners Guide: Roads with labels along the line</Title>
            <FeatureTypeStyle>
                <Rule>
                    <LineSymbolizer>
                        <Stroke>
                            <CssParameter name="stroke">#000000</CssParameter>
                            <CssParameter name="stroke-width">4</CssParameter>
                        </Stroke>
                    </LineSymbolizer>
                    <LineSymbolizer>
                        <Stroke>
                            <CssParameter name="stroke">#FF0000</CssParameter>
                            <CssParameter name="stroke-width">2</CssParameter>
                        </Stroke>
                    </LineSymbolizer>
                    <TextSymbolizer>
                        <Label>
                            <ogc:PropertyName>continent</ogc:PropertyName>
                        </Label>
                        <LabelPlacement>
                            <LinePlacement>
                                <PerpendicularOffset>10</PerpendicularOffset>
                            </LinePlacement>
                        </LabelPlacement>
                        <Fill>
                            <CssParameter name="fill">#000000</CssParameter>
                        </Fill>
                        <VendorOption name="followLine">true</VendorOption>
                        <VendorOption name="maxAngleDelta">90</VendorOption>
                        <VendorOption name="maxDisplacement">400</VendorOption>
                        <VendorOption name="repeat">300</VendorOption>
                    </TextSymbolizer>
                </Rule>
            </FeatureTypeStyle>
        </UserStyle>
    </NamedLayer>
</StyledLayerDescriptor>

    VendorOption設置一些文字的渲染參數,repeat表示道路顯示文字的間隔距離,followLine設置文字是否顏色線路方向顯示。

9.在多邊形上顯示文字

    在每一個國家的多邊形邊界中顯示名稱,效果以下:

    image

    實現效果的xml文件內容以下:

<?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">
    <NamedLayer>
        <Name>CountriesLabeled</Name>
        <UserStyle>
            <Title>Geoserver Beginners Guide: Countries with labels</Title>
            <FeatureTypeStyle>
                <Rule>
                    <PolygonSymbolizer>
                        <Fill>
                            <CssParameter name="fill">#29A6A6</CssParameter>
                        </Fill>
                        <Stroke>
                            <CssParameter name="stroke">#A52A2A</CssParameter>
                            <CssParameter name="stroke-width">2</CssParameter>
                        </Stroke>
                    </PolygonSymbolizer>
                    <TextSymbolizer>
                        <Label>
                            <ogc:PropertyName>name</ogc:PropertyName>
                        </Label>
                        <Font>
                            <CssParameter name="font-family">Arial</CssParameter>
                            <CssParameter name="font-size">11</CssParameter>
                            <CssParameter name="font-style">normal</CssParameter>
                            <CssParameter name="font-weight">bold</CssParameter>
                        </Font>
                        <LabelPlacement>
                            <PointPlacement>
                                <AnchorPoint>
                                    <AnchorPointX>0.5</AnchorPointX>
                                    <AnchorPointY>0.5</AnchorPointY>
                                </AnchorPoint>
                            </PointPlacement>
                        </LabelPlacement>
                        <Fill>
                            <CssParameter name="fill">#000000</CssParameter>
                        </Fill>
                        <VendorOption name="autoWrap">50</VendorOption>
                        <VendorOption name="maxDisplacement">150</VendorOption>
                        <Halo>
                            <Radius>3</Radius>
                            <Fill>
                                <CssParameter name="fill">#FFFFFF</CssParameter>
                            </Fill>
                        </Halo>
                    </TextSymbolizer>
                </Rule>
            </FeatureTypeStyle>
        </UserStyle>
    </NamedLayer>
</StyledLayerDescriptor>

    Halo節點下設置文字的陰影效果,geoserver校驗該字段會失敗,可是能夠正常使用。

相關文章
相關標籤/搜索