如何在GeoServer中重写ShapeMarkerFactory以自定义SLD标记?
在GeoServer中扩展SLD自定义标记的实现步骤
一、明确类的归属
MarkFactory和ShapeMarkFactory并非GeoServer源码自带,而是属于GeoTools的gt-render模块,类路径为org.geotools.renderer.style.MarkFactory和org.geotools.renderer.style.ShapeMarkFactory。GeoServer依赖GeoTools完成渲染逻辑,因此需要在GeoServer项目中引入对应GeoTools依赖。
二、重写ShapeMarkFactory添加自定义WellKnownName
1. 编写自定义工厂类
创建继承自ShapeMarkFactory的类,重写getShape方法处理自定义标记名:
import org.geotools.renderer.style.ShapeMarkFactory; import java.awt.Shape; import java.awt.geom.Rectangle2D; public class CustomMarkFactory extends ShapeMarkFactory { @Override public Shape getShape(String wellKnownName, double size) { // 处理自定义标记,示例新增"MY_CUSTOM_RECT" if ("MY_CUSTOM_RECT".equals(wellKnownName)) { // 返回自定义Shape,这里是一个扁矩形 return new Rectangle2D.Double(-size/2, -size/4, size, size/2); } // 保留父类对默认标记(如circle、square)的处理逻辑 return super.getShape(wellKnownName, size); } }
2. 配置依赖
如果是Maven项目,在pom.xml中添加gt-render依赖(版本必须与GeoServer使用的GeoTools版本匹配,比如GeoServer 2.23.x对应GeoTools 29.x):
<dependency> <groupId>org.geotools</groupId> <artifactId>gt-render</artifactId> <version>${geotools.version}</version> </dependency>
三、让自定义工厂生效
GeoServer通过SPI机制加载MarkFactory实现,步骤如下:
- 在项目的
src/main/resources/META-INF/services目录下,创建名为org.geotools.renderer.style.MarkFactory的文件 - 在文件中写入自定义工厂类的全限定类名,例如:
com.yourpackage.CustomMarkFactory
若需要更高优先级加载(比如覆盖默认的ShapeMarkFactory),也可通过GeoServer的Spring配置扩展:在GeoServer的applicationContext.xml中添加自定义工厂的bean定义:
<bean id="customMarkFactory" class="com.yourpackage.CustomMarkFactory"/>
四、测试自定义标记
在SLD样式中直接使用自定义的WellKnownName:
<FeatureTypeStyle> <Rule> <PointSymbolizer> <Mark> <WellKnownName>MY_CUSTOM_RECT</WellKnownName> <Fill> <CssParameter name="fill">#E74C3C</CssParameter> </Fill> <Stroke> <CssParameter name="stroke">#2C3E50</CssParameter> <CssParameter name="stroke-width">1</CssParameter> </Stroke> </Mark> <Size>18</Size> </PointSymbolizer> </Rule> </FeatureTypeStyle>
内容的提问来源于stack exchange,提问作者Glad
相关产品推荐
相关产品推荐

