いつもどこかでデスマーチ♪

不定期に、私の日常を書き込みしていきます。

geoserver の SLD はやっぱり難しい

2024年01月05日 20時40分13秒 | メモ
SLD関連:
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">

コメント    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« 自宅PCをWindows11に上げたら... | トップ | postgresql の 数値キャスト... »

コメントを投稿

ブログ作成者から承認されるまでコメントは反映されません。

メモ」カテゴリの最新記事