You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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实现,步骤如下:

  1. 在项目的src/main/resources/META-INF/services目录下,创建名为org.geotools.renderer.style.MarkFactory的文件
  2. 在文件中写入自定义工厂类的全限定类名,例如:
    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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 08:05:16