QGIS C++ 4. 地图工程 与 SLD 实战问题

80 阅读1分钟

QGIS C++ 4. 地图工程 与 SLD 实战问题

前文讲解了不同平台针对sld的实现基础落地。下面重点讲解以下由于不同的厂商对OGC-SLD的理解的偏差导致的一些工程性问题。

Filter

可以直接翻译的语法常见如下

等于

<ogc:PropertyIsEqualTo>
   <ogc:PropertyName>编码</ogc:PropertyName>
   <ogc:Literal>100</ogc:Literal>
</ogc:PropertyIsEqualTo>

不等于

<ogc:And>
   <ogc:PropertyIsNotEqualTo>
      <ogc:PropertyName>编码</ogc:PropertyName>
      <ogc:Literal>100</ogc:Literal>
   </ogc:PropertyIsNotEqualTo>
   <ogc:PropertyIsNotEqualTo>
      <ogc:PropertyName>编码</ogc:PropertyName>
      <ogc:Literal>200</ogc:Literal>
   </ogc:PropertyIsNotEqualTo>
</ogc:And>

大于或者小于

<ogc:And>
   <ogc:PropertyIsGreaterThanOrEqualTo>
        <ogc:PropertyName>编码</ogc:PropertyName>
        <ogc:Literal>100</ogc:Literal>
   </ogc:PropertyIsGreaterThanOrEqualTo>
   <ogc:PropertyIsLessThanOrEqualTo>
        <ogc:PropertyName>编码</ogc:PropertyName>
        <ogc:Literal>300</ogc:Literal>
   </ogc:PropertyIsLessThanOrEqualTo>
</ogc:And>

与和或

<ogc:And>
  ....
</ogc:And>
<ogc:Or>
  ...
</ogc:Or>

Filter问题

无法翻译的语法常常和平台的**[特殊函数]**相关:

$area

"编码"  =  100 AND  $area > 5000000000

直接导出,发现SLD里面居然连Filter的语法整个都消失了,我还以为是值保留前面半个部分的规则呢,由此可见QGIS的商业成熟度还是不行。需要自己定制这部分代码。

right()

"编码"  = 100 AND right( "代码" ,1)=1

Label

  if(  length( "编号") >6,  substr( "编号", 1, length( "编号") - 6), "编号")

注记由于QGIS和geoserver以及Mapbox的注记策略极不相同,应次规则几乎很难等价匹配