SLD関連:
https://blog.goo.ne.jp/pianyi/e/b81969d6e1fa29e878e49c30b37f2fc8
geoserver の SLD を作ってますが、やはり難しいですね。
今回は、SQLで言うLIKE の実装です。
やりたい事:
Aカラム内に Bカラムの値が存在する。
かつ
Aカラム内にenv引数のC値が存在する。
場合、マークを表示する。
SLDのフィルター部:
説明:
・<ogc:Filter></ogc:Filter>
フィルターの開始(SQLで言うWHEREの開始終了)
・<ogc:And></ogc:And>
かつ条件(SQLで言うAND条件)
【Aカラム内に Bカラムの値が存在する】の条件説明:
https://docs.geoserver.org/main/en/user/styling/sld/reference/filters.html#sld-filter-expression
・<ogc:PropertyIsLike></ogc:PropertyIsLike>
LIKE検索(SQLで言うLIKE検索)
・ wildCard="*" singleChar="#" escape="!"
wildCard:ワイルドカード(*の代わり)、singleChar:任意の1文字(ドットの代わり)、escape:文字のエスケープ文字(\の代わり) これらを指定します。
・<ogc:PropertyName></ogc:PropertyName>
プロパティ名(SQLで取得したカラム名称)の指定なので、SQLは基本ASで別名つけた方が分かりやすい。
・<ogc:Literal></ogc:Literal>
値の範囲指定
となるため、
SQL(Postgresql)で表現すると「testOthers LIKE '%' || testValue || '%'」となる。
【Aカラム内にenv引数のC値が存在する】の条件説明:
https://docs.geoserver.org/stable/en/user/filter/function_reference.html
やりたい事は上記と同じだが、DBカラムを使うか、URLパラメータのenvを使うかで同じやり方が出来なかった
・<ogc:PropertyIsEqualTo></ogc:PropertyIsEqualTo>
値が一致するかどうかの判断
・<ogc:Function name="isLike"></ogc:Function>
LIKE検索(SQLで言うLIKE検索)ちなみにこっちはJava の正規表現を使う。
・<ogc:Function name="Concatenate"></ogc:Function>
文字の連結
・<ogc:Literal>.*</ogc:Literal>
連結する文字列
・<ogc:Function name="env"></ogc:Function>
URL等のパラメータで指定されたenv内に記載された値
例:[env=testValue:あいうえお;testValue2=aaa;]
・<ogc:Literal>1</ogc:Literal>
値が一致するかどうかの判定値(1=true、0=false)
となるため、
「isLike が動いて testOthers カラムの値の中に(.*あいうえお.*) が含まれている場合true が返却される。その後(true==1) が比較され、その結果を元にフィルタが掛かる」
Javaの「Match+if文」になります。
このように、あいまい検索を行いたいだけなのに、やり方が異なりました。
・「DBのカラム+固定値」「DBのカラム+DBのカラム」は「ogc:PropertyIsLike」
・「DBのカラム+envパラメータ」は「ogc:PropertyIsEqualTo と ogc:Function name="isLike” の合成」
<ogc:Literal> タグの中で<Function name="env”"> が使えないようですね。
ついでに、文字列結合に <ogc:Function name="Concatenate">タグ じゃないとダメっていうのが何とも…
<CssParameter> タグとかで色を出す場合「#」はFunctionの前に直書きで良いのになぁ…
ま、これで出来たっぽいのでOKとしましょう。
ちなみに宣言部はこれです
https://blog.goo.ne.jp/pianyi/e/b81969d6e1fa29e878e49c30b37f2fc8
geoserver の SLD を作ってますが、やはり難しいですね。
今回は、SQLで言うLIKE の実装です。
やりたい事:
Aカラム内に Bカラムの値が存在する。
かつ
Aカラム内にenv引数のC値が存在する。
場合、マークを表示する。
SLDのフィルター部:
<ogc:Filter> <ogc:And> <ogc:PropertyIsLike wildCard="*" singleChar="#" escape="!"> <ogc:PropertyName>testOthers</ogc:PropertyName> <ogc:Literal>*<ogc:PropertyName>testValue</ogc:PropertyName>*</ogc:Literal> </ogc:PropertyIsLike> <ogc:PropertyIsEqualTo> <ogc:Function name="isLike"> <ogc:PropertyName>testOthers</ogc:PropertyName> <ogc:Function name="Concatenate"> <ogc:Literal>.*</ogc:Literal> <ogc:Function name="env"> <ogc:Literal>testValue</ogc:Literal> </ogc:Function> <ogc:Literal>.*</ogc:Literal> </ogc:Function> </ogc:Function> <ogc:Literal>1</ogc:Literal> </ogc:PropertyIsEqualTo> </ogc:And> </ogc:Filter>
説明:
・<ogc:Filter></ogc:Filter>
フィルターの開始(SQLで言うWHEREの開始終了)
・<ogc:And></ogc:And>
かつ条件(SQLで言うAND条件)
【Aカラム内に Bカラムの値が存在する】の条件説明:
https://docs.geoserver.org/main/en/user/styling/sld/reference/filters.html#sld-filter-expression
・<ogc:PropertyIsLike></ogc:PropertyIsLike>
LIKE検索(SQLで言うLIKE検索)
・ wildCard="*" singleChar="#" escape="!"
wildCard:ワイルドカード(*の代わり)、singleChar:任意の1文字(ドットの代わり)、escape:文字のエスケープ文字(\の代わり) これらを指定します。
・<ogc:PropertyName></ogc:PropertyName>
プロパティ名(SQLで取得したカラム名称)の指定なので、SQLは基本ASで別名つけた方が分かりやすい。
・<ogc:Literal></ogc:Literal>
値の範囲指定
となるため、
SQL(Postgresql)で表現すると「testOthers LIKE '%' || testValue || '%'」となる。
【Aカラム内にenv引数のC値が存在する】の条件説明:
https://docs.geoserver.org/stable/en/user/filter/function_reference.html
やりたい事は上記と同じだが、DBカラムを使うか、URLパラメータのenvを使うかで同じやり方が出来なかった
・<ogc:PropertyIsEqualTo></ogc:PropertyIsEqualTo>
値が一致するかどうかの判断
・<ogc:Function name="isLike"></ogc:Function>
LIKE検索(SQLで言うLIKE検索)ちなみにこっちはJava の正規表現を使う。
・<ogc:Function name="Concatenate"></ogc:Function>
文字の連結
・<ogc:Literal>.*</ogc:Literal>
連結する文字列
・<ogc:Function name="env"></ogc:Function>
URL等のパラメータで指定されたenv内に記載された値
例:[env=testValue:あいうえお;testValue2=aaa;]
・<ogc:Literal>1</ogc:Literal>
値が一致するかどうかの判定値(1=true、0=false)
となるため、
「isLike が動いて testOthers カラムの値の中に(.*あいうえお.*) が含まれている場合true が返却される。その後(true==1) が比較され、その結果を元にフィルタが掛かる」
Javaの「Match+if文」になります。
このように、あいまい検索を行いたいだけなのに、やり方が異なりました。
・「DBのカラム+固定値」「DBのカラム+DBのカラム」は「ogc:PropertyIsLike」
・「DBのカラム+envパラメータ」は「ogc:PropertyIsEqualTo と ogc:Function name="isLike” の合成」
<ogc:Literal> タグの中で<Function name="env”"> が使えないようですね。
ついでに、文字列結合に <ogc:Function name="Concatenate">タグ じゃないとダメっていうのが何とも…
<CssParameter> タグとかで色を出す場合「#」はFunctionの前に直書きで良いのになぁ…
ま、これで出来たっぽいのでOKとしましょう。
ちなみに宣言部はこれです
<StyledLayerDescriptor version="1.0.0" 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" xsi:schemaLocation="http://www.opengis.net/sld http://schemas.opengis.net/sld/1.0.0/StyledLayerDescriptor.xsd">