geoserver の SLD がちょっとわかったのでメモ
SLD関連:
https://blog.goo.ne.jp/pianyi/e/705613a012cc5b543b931d58977d59d9
geoserver の SDL を使って画像表示をさせているけど、本当に資料が無い…
やりたい事が出来るはずなのにすごく苦労するのでまとめるようにする
バージョン:geoserver 2.12.2
(多少古くてもあまり変わってないと思う)
やっていること
1.DBの値をもとに、ラインを引く(DBの値の参照)
2.ラインの太さは拡大・縮小に合わせて大きさが変わるようにする(QGISの「地図上の単位」)
3.DBの値をもとに、始終点のシンボルを変更する(if else の実装)
4.シンボル角度の回転(足し算)
まずは前提
・【ストア】を正しく設定しDBに接続できる
・【レイヤ】を設定し【データ】タブの一番下【機能タイプ詳細】に参照するためのカラムが出ていること
1.DBの値をもとに、ラインを引く(DBの値の参照)
「<ogc:PropertyName>XXXXX</ogc:PropertyName>」 このXXXXの部分にカラム名を入れるだけ
カラム名を入れることでレコードごとに値を変えて表示してくれます
2.ラインの太さは拡大・縮小に合わせて大きさが変わるようにする(QGISの「地図上の単位」)
参考URL:http://docs.geoserver.org/latest/en/user/styling/sld/extensions/uom.html
Symbolizerタグに「 uom="http://www.opengeospatial.org/se/units/metre"」を追加する
設定したタグ以下の単位を「地図上の単位」に設定します。
「メートル」「ピクセル」の場合は、拡大・縮小しても常に一定の線の太さになります。
「地図上の単位」の場合は、拡大・縮小したときに値を変更してそのズームレベルに合った線の太さに変えてくれます。
今回は、Openlayers側 でズームレベルによって線の太さを変更していたため、この機能が無かったら死んでました…見つかってよかった。
ちなみにOpenlayers側の書き方:「Math.round(size / map.getResolution());」
3.DBの値をもとに、始終点のシンボルを変更する(if else の実装)
参考URL:http://docs.geoserver.org/stable/en/user/filter/function_reference.html
正直本当によくわからない。
・【<ogc:Function name="if_then_else">】 if-else 文
1つ目:判定文、2つ目:判定文がtrueの時のreturn 値、3つ目:判定文がfalseの時のreturn 値
1~3つ目とは何か? → タグの中身のことなので、<XXXXX>~</XXXXX> をさします。
例:
1つ目:1つ目は判定文が入ります。そのため、参考URLにある【Comparison functions】に記載されている Function を使うことになります。
また、arguments の順番が、タグの順番になるので注意してください。
上記例の場合「<ogc:PropertyName>endType</ogc:PropertyName>」が第1引数【a:Object】、「<ogc:Literal>farrow</ogc:Literal>」が第2引数【b:Object】
betweenとか、inとか引数が多いものは順番を間違えないようにしてください。
2・3つ目:2・3つ目は戻り値になります。注意点は【ogc:Literalタグ】が範囲(Javaでいう所の{}と同じ)になります。
なので、タグの中にタグを入れてしまえば、いくらでも入れ子ができます。
インデントをきちんと管理しないとわけのわからないものが出来上がるでしょう。(geoserver のstyle作成画面でフォーマッタがあるから大丈夫か?)
入れ子のやり方は下記「完成したサンプル」を参照
4.シンボル角度の回転(足し算)
参考URL:http://docs.geoserver.org/stable/en/user/styling/sld/reference/filters.html#filter-expressions
今回は三角形を反転させたかったので使いました。
割り算の場合、前のタグ値が0の場合は例外でしょうね。「<ogc:Function name="equalTo">」などを使って、0の場合の対処が必要でしょう。
Add:addition :足し算
Sub:subtraction :引き算
Mul:multiplication:掛け算
Div:division :割り算
例:下記の場合、90+180=270 になります。
完成したサンプル(!は全角なので、半角に直してください)
まとめ(備考):
<ogc:PropertyName></ogc:PropertyName> タグの中身:レイヤに表示されているプロパティ(カラム)名
<ogc:Function name="XXXX"> に入るXXXXの値:http://docs.geoserver.org/stable/en/user/filter/function_reference.html
<ogc:Literal></ogc:Literal> タグの中身:固定値
その他参考URL:
SLDのサンプル
https://gist.github.com/dwins/5859680
https://gist.github.com/dwins/5859628
https://gis.stackexchange.com/questions/116712/how-do-i-draw-the-arrow-on-the-line-using-sld-of-geoserver
https://blog.goo.ne.jp/pianyi/e/705613a012cc5b543b931d58977d59d9
geoserver の SDL を使って画像表示をさせているけど、本当に資料が無い…
やりたい事が出来るはずなのにすごく苦労するのでまとめるようにする
バージョン:geoserver 2.12.2
(多少古くてもあまり変わってないと思う)
やっていること
1.DBの値をもとに、ラインを引く(DBの値の参照)
2.ラインの太さは拡大・縮小に合わせて大きさが変わるようにする(QGISの「地図上の単位」)
3.DBの値をもとに、始終点のシンボルを変更する(if else の実装)
4.シンボル角度の回転(足し算)
まずは前提
・【ストア】を正しく設定しDBに接続できる
・【レイヤ】を設定し【データ】タブの一番下【機能タイプ詳細】に参照するためのカラムが出ていること
1.DBの値をもとに、ラインを引く(DBの値の参照)
「<ogc:PropertyName>XXXXX</ogc:PropertyName>」 このXXXXの部分にカラム名を入れるだけ
カラム名を入れることでレコードごとに値を変えて表示してくれます
2.ラインの太さは拡大・縮小に合わせて大きさが変わるようにする(QGISの「地図上の単位」)
参考URL:http://docs.geoserver.org/latest/en/user/styling/sld/extensions/uom.html
Symbolizerタグに「 uom="http://www.opengeospatial.org/se/units/metre"」を追加する
設定したタグ以下の単位を「地図上の単位」に設定します。
「メートル」「ピクセル」の場合は、拡大・縮小しても常に一定の線の太さになります。
「地図上の単位」の場合は、拡大・縮小したときに値を変更してそのズームレベルに合った線の太さに変えてくれます。
今回は、Openlayers側 でズームレベルによって線の太さを変更していたため、この機能が無かったら死んでました…見つかってよかった。
ちなみにOpenlayers側の書き方:「Math.round(size / map.getResolution());」
3.DBの値をもとに、始終点のシンボルを変更する(if else の実装)
参考URL:http://docs.geoserver.org/stable/en/user/filter/function_reference.html
正直本当によくわからない。
・【<ogc:Function name="if_then_else">】 if-else 文
1つ目:判定文、2つ目:判定文がtrueの時のreturn 値、3つ目:判定文がfalseの時のreturn 値
1~3つ目とは何か? → タグの中身のことなので、<XXXXX>~</XXXXX> をさします。
例:
<ogc:Function name="if_then_else">
<!-- 1つ目開始 -->
<ogc:Function name="equalTo">
<ogc:PropertyName>判定元カラム名(ogc:PropertyNameタグだからカラム名)</ogc:PropertyName>
<ogc:Literal>判定先値(ogc:Literalだから値)</ogc:Literal>
</ogc:Function>
<!-- 1つ目終わり -->
<!-- 2つ目開始 -->
<ogc:Literal>あ</ogc:Literal>
<!-- 2つ目終わり -->
<!-- 3つ目開始 -->
<ogc:Literal>い</ogc:Literal>
<!-- 3つ目終わり -->
</ogc:Function>
1つ目:1つ目は判定文が入ります。そのため、参考URLにある【Comparison functions】に記載されている Function を使うことになります。
また、arguments の順番が、タグの順番になるので注意してください。
上記例の場合「<ogc:PropertyName>endType</ogc:PropertyName>」が第1引数【a:Object】、「<ogc:Literal>farrow</ogc:Literal>」が第2引数【b:Object】
betweenとか、inとか引数が多いものは順番を間違えないようにしてください。
2・3つ目:2・3つ目は戻り値になります。注意点は【ogc:Literalタグ】が範囲(Javaでいう所の{}と同じ)になります。
なので、タグの中にタグを入れてしまえば、いくらでも入れ子ができます。
インデントをきちんと管理しないとわけのわからないものが出来上がるでしょう。(geoserver のstyle作成画面でフォーマッタがあるから大丈夫か?)
入れ子のやり方は下記「完成したサンプル」を参照
4.シンボル角度の回転(足し算)
参考URL:http://docs.geoserver.org/stable/en/user/styling/sld/reference/filters.html#filter-expressions
今回は三角形を反転させたかったので使いました。
割り算の場合、前のタグ値が0の場合は例外でしょうね。「<ogc:Function name="equalTo">」などを使って、0の場合の対処が必要でしょう。
Add:addition :足し算
Sub:subtraction :引き算
Mul:multiplication:掛け算
Div:division :割り算
例:下記の場合、90+180=270 になります。
<ogc:Add> <ogc:Literal>90</ogc:Literal> <ogc:Literal>180</ogc:Literal> </ogc:Add>
完成したサンプル(!は全角なので、半角に直してください)
<?xml version="1.0" encoding="UTF-8"?>
<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>map</Name>
<UserStyle>
<Title>Map</Title>
<Abstract>Map</Abstract>
<FeatureTypeStyle>
<Rule>
<Name>Map</Name>
<Title>MapLineStyle</Title>
<!-- uom は地図座標に合わせた大きさ(太さ)を指定するための指定 -->
<LineSymbolizer uom="http://www.opengeospatial.org/se/units/metre">
<Stroke>
<CssParameter name="stroke">
<ogc:PropertyName>color</ogc:PropertyName>
</CssParameter>
<CssParameter name="stroke-width">
<ogc:PropertyName>width</ogc:PropertyName>
</CssParameter>
</Stroke>
</LineSymbolizer>
<!-- 始点側のマークを作成 -->
<PointSymbolizer>
<Geometry>
<ogc:Function name="startPoint">
<ogc:PropertyName>theGeom</ogc:PropertyName>
</ogc:Function>
</Geometry>
<Graphic>
<WellKnownName>
<!-- if(else付) -->
<ogc:Function name="if_then_else">
<ogc:Function name="equalTo">
<ogc:PropertyName>startType</ogc:PropertyName>
<ogc:Literal>farrow</ogc:Literal>
</ogc:Function>
<!-- startType が farrow の場合 shape://oarrow にする -->
<ogc:Literal>shape://oarrow</ogc:Literal>
<!-- else if -->
<ogc:Function name="if_then_else">
<ogc:Function name="equalTo">
<ogc:PropertyName>startType</ogc:PropertyName>
<ogc:Literal>square</ogc:Literal>
</ogc:Function>
<!-- startType が square の場合 square にする -->
<ogc:Literal>square</ogc:Literal>
<!-- else -->
<!-- startType が 上記以外 の場合 circle にする -->
<ogc:Literal>circle</ogc:Literal>
</ogc:Function>
</ogc:Function>
</WellKnownName>
<Fill>
<CssParameter name="fill">
<ogc:PropertyName>color</ogc:PropertyName>
</CssParameter>
<CssParameter name="fill-opacity">1</CssParameter>
</Fill>
<Stroke>
<CssParameter name="stroke">
<ogc:PropertyName>color</ogc:PropertyName>
</CssParameter>
<CssParameter name="stroke-width">1</CssParameter>
</Stroke>
<Size>
<ogc:PropertyName>startSize</ogc:PropertyName>
</Size>
<Rotation>
<!-- 始点側は三角の方向が正しくないため、180度逆転させる(他は丸・四角なので180度回しても関係なのでフィルタしない) -->
<ogc:Add>
<ogc:Function name="startAngle">
<ogc:PropertyName>theGeom</ogc:PropertyName>
</ogc:Function>
<ogc:Literal>180</ogc:Literal>
</ogc:Add>
</Rotation>
</Graphic>
</PointSymbolizer>
<!-- 終点側のマークを作成 -->
<PointSymbolizer>
<Geometry>
<ogc:Function name="endPoint">
<ogc:PropertyName>theGeom</ogc:PropertyName>
</ogc:Function>
</Geometry>
<Graphic>
<WellKnownName>
<!-- if(else付) -->
<ogc:Function name="if_then_else">
<ogc:Function name="equalTo">
<ogc:PropertyName>endType</ogc:PropertyName>
<ogc:Literal>farrow</ogc:Literal>
</ogc:Function>
<!-- endType が farrow の場合 shape://oarrow にする -->
<ogc:Literal>shape://oarrow</ogc:Literal>
<!-- else if -->
<ogc:Function name="if_then_else">
<ogc:Function name="equalTo">
<ogc:PropertyName>endType</ogc:PropertyName>
<ogc:Literal>square</ogc:Literal>
</ogc:Function>
<!-- endType が square の場合 square にする -->
<ogc:Literal>square</ogc:Literal>
<!-- else -->
<!-- endType が 上記以外 の場合 circle にする -->
<ogc:Literal>circle</ogc:Literal>
</ogc:Function>
</ogc:Function>
</WellKnownName>
<Fill>
<CssParameter name="fill">
<ogc:PropertyName>color</ogc:PropertyName>
</CssParameter>
<CssParameter name="fill-opacity">1</CssParameter>
</Fill>
<Stroke>
<CssParameter name="stroke">
<ogc:PropertyName>color</ogc:PropertyName>
</CssParameter>
<CssParameter name="stroke-width">1</CssParameter>
</Stroke>
<Size>
<ogc:PropertyName>endSize</ogc:PropertyName>
</Size>
<Rotation>
<ogc:Function name="endAngle">
<ogc:PropertyName>theGeom</ogc:PropertyName>
</ogc:Function>
</Rotation>
</Graphic>
</PointSymbolizer>
</Rule>
</FeatureTypeStyle>
</UserStyle>
</NamedLayer>
</StyledLayerDescriptor>まとめ(備考):
<ogc:PropertyName></ogc:PropertyName> タグの中身:レイヤに表示されているプロパティ(カラム)名
<ogc:Function name="XXXX"> に入るXXXXの値:http://docs.geoserver.org/stable/en/user/filter/function_reference.html
<ogc:Literal></ogc:Literal> タグの中身:固定値
その他参考URL:
SLDのサンプル
https://gist.github.com/dwins/5859680
https://gist.github.com/dwins/5859628
https://gis.stackexchange.com/questions/116712/how-do-i-draw-the-arrow-on-the-line-using-sld-of-geoserver
コメント
コメントを投稿