在SLD中指定合成和混合

复合材料

合成和混合都可以通过在符号或FeatureTypeStyle的末尾添加以下VendorOption在SLD中指定:

<VendorOption name="composite">multiply</VendorOption>

如果需要自定义不透明度,可以将其添加到用逗号分隔的操作名称之后:

<VendorOption name="composite">multiply, 0.5</VendorOption>

警告

使用OpenJDK时,与符号混合会导致JDK内部出现异常。这个 issue is known 据报道已经修复,但只在OpenJDK9中。

使用OpenJDK 7/8解决此问题的一种方法是安装 Marlin renderer .这将替换OpenJDK核心渲染器,并且不会遇到相同的问题。

Oracle JDK 7或8不显示此问题。

复合地基

对于FeatureTypeStyles,可以添加其他供应商选项来控制合成组:

<VendorOption name="composite-base">true</VendorOption>

这将告诉渲染引擎使用该FeatureTypeStyle作为目标,并在其上组合所有后续FeatureTypeStyle/层,直到找到另一个基。一旦构成了一个基础上的完整层集,那么基础本身将使用其自己的合成操作符(如果存在)针对下一组组成的层进行组合。

如果不使用此设置,目标将是在当前特征类型和图层之前绘制的所有先前特征类型和图层的完整堆栈。这有两个限制原因:

  • 它限制了alpha复合屏蔽操作的实用性。

  • 它打破了WMS模型,在该模型中,客户机可以自由决定如何堆叠层(仅当使用特定的层堆栈时,才会达到所需的合成效果)。

请考虑以下示例:

../../../../_images/stacking.png

在本例中,前两个层相互上拉,形成“merge1”。

第三层是合成层,因此它不会立即合并到已绘制地图的顶部,但它将被绘制到屏幕外的缓冲区,并且第4层和第5层将在其顶部绘制/合成。一旦发生这种情况,“merge2”就准备好了,并在“merge1”之上绘制,

下一层是另一个基底,因此“base2”将再次被绘制到屏幕外的缓冲区,第7层和第8层将在其上绘制/合成,形成merge3。一旦merge3准备就绪,它将在已经融合的merge1/merge2的顶部绘制/合成,生成最终映射。