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的注记策略极不相同,应次规则几乎很难等价匹配