【Java+GS】GeoServer,通过配置自定义样式,实现不同图斑展示不同颜色。附java实现方法

news2025/2/25 21:26:41

文章目录

    • 客户端发布样式
      • 一、[GeoServer中使用SLD样式](https://www.cnblogs.com/tuboshu/p/10752292.html)
      • 二、分属性渲染
      • 三、客户端操作发布图层
    • 掌握使用java api 发布样式
      • 一、前置准备
      • 二、发布图层
      • 三、发布工具类
    • 设计从数据库字段自定义样式
      • 一、数据库设计
      • 二、业务逻辑分享

写在前面,在配置geoserver图层时,需要了如下需求:

  1. 每个不同的图层要求配置不同的样式
  2. 一个图层内,根据不同条件的也要展示不同的颜色

所以为了方便知识整理,将把简单的样式发布和一些实际的样式配置结合做一个整理。

思路整理如下:

  1. 掌握sld文件发布样式(客户端)
  2. 掌握使用java api 发布样式
  3. 设计从数据库字段自定义样式

客户端发布样式

一、GeoServer中使用SLD样式

SLD是风格化图层描述器(Styled Layer Descriptor)的简称,是2005年OGC提出的一个标准,这个标准在一定条件下允许WMS服务器对地图可视化的表现形式进行扩展。在没有SLD之前,只能使用一些已经在服务器上规定好的样式来对地图进行可视化。而当使用了实现了SLD标准之后,它允许我们从客户端来对地图进行定义自己的样式,分级显示等操作,极大的扩展了地图可视化的灵活性。

  • 简单来说,sld就是用于描述图层样式的一个xml格式的文本
  • SLD文档的元素架构如下:

img

关于详细的解释可以看博客[GeoServer中使用SLD样式]

  • 根据需求,这里着重提到的是《3.4 分属性渲染》

二、分属性渲染

各标签含义

标签名含义
……Rule声明一个规则
………Filter过滤器
………PolygonSymbolizer样式
………TextSymbolizer注记

格式如下

image-20230506093452902

三、客户端操作发布图层

  1. 新建样式

    image-20230506093848417

  2. 输入样式名称,输入sld文本,点击验证

    image-20230506094009742

  3. 图层展示测试,进入图层编辑界面,进入layer preview标签下即可预览。效果如下

    image-20230506094439656

掌握使用java api 发布样式

一、前置准备

以我本地的环境为例

  1. 导入依赖 geoserver-manager
<!--图层发布-->
<dependency>
    <groupId>nl.pdok</groupId>
    <artifactId>geoserver-manager</artifactId>
    <version>1.7.0-pdok2</version>
</dependency>
  1. 获取manager对象 —— 比较简单,配置一些必要的参数即可

二、发布图层

发布图层有以下几个常用的方法:

image-20230506095110818

分别是使用file文件发布,和使用string文件发布

三、发布工具类

    /**
     *  创建样式
     *   逻辑修改
     * @param manager geoserver图层管理类
     * @param styleName 样式名称  
     * @param geoStylePath 从配置文件获取的
     * @return
     */
    public static boolean createStyle(GeoServerRESTManager manager, String styleName, String geoStylePath) throws IOException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        boolean existsStyle = manager.getReader().existsStyle(styleName);
        if (!existsStyle) {
			String style = FileUtils.readFileToString(new File(geoStylePath));
            //创建样式
            existsStyle = manager.getPublisher().publishStyle(style,styleName);
        }
        return existsStyle;
  • 从指定路径读取sld文件文本,在进行发布
  • 为什么使用后string字符串进行发布 —— 为了便于后期进行数据库配置后进行发布

设计从数据库字段自定义样式

一、数据库设计

目标:根据数据库动态生成发布所需的sld文件。

其实就是需要6个核心参数:条件x2, stroke x2 , fill x2

  • property_name 字段名
  • literal 条件
  • fill_color 填充颜色
  • fill_opacity 不透明度
  • stroke_color 线条颜色
  • stroke_width 线宽

给出初版表结构如下

CREATE TABLE "public"."geoserver_publish_style" (
  "id" int8 NOT NULL DEFAULT nextval('geoserver_publish_style_id_seq'::regclass),
  "property_name" varchar(255) COLLATE "pg_catalog"."default",
  "literal" varchar(255) COLLATE "pg_catalog"."default",
  "fill_color" varchar(255) COLLATE "pg_catalog"."default",
  "fill_opacity" varchar(255) COLLATE "pg_catalog"."default",
  "stroke_color" varchar(255) COLLATE "pg_catalog"."default",
  "stroke_width" varchar(53) COLLATE "pg_catalog"."default",
  "parent_id" int8,
  "created_id" int8,
  "created_time" timestamp(6) DEFAULT now(),
  "last_modify_id" int8,
  "last_modify_time" timestamp(6) DEFAULT now(),
  "is_valid" int2,
  "bsm" varchar(255) COLLATE "pg_catalog"."default",
  "table_name" varchar(255) COLLATE "pg_catalog"."default",
  "is_sm" varchar(255) COLLATE "pg_catalog"."default",
  "name" varchar(255) COLLATE "pg_catalog"."default",
  "sorting" int4,
  CONSTRAINT "geoserver_publish_style_pkey" PRIMARY KEY ("id")
)
;

ALTER TABLE "public"."geoserver_publish_style" 
  OWNER TO "postgres";

COMMENT ON COLUMN "public"."geoserver_publish_style"."property_name" IS '字段名';

COMMENT ON COLUMN "public"."geoserver_publish_style"."literal" IS '条件';

COMMENT ON COLUMN "public"."geoserver_publish_style"."fill_color" IS '填充颜色';

COMMENT ON COLUMN "public"."geoserver_publish_style"."fill_opacity" IS '不透明度';

COMMENT ON COLUMN "public"."geoserver_publish_style"."stroke_color" IS '线条颜色';

COMMENT ON COLUMN "public"."geoserver_publish_style"."stroke_width" IS '线宽';

COMMENT ON COLUMN "public"."geoserver_publish_style"."parent_id" IS '父类id';

COMMENT ON COLUMN "public"."geoserver_publish_style"."table_name" IS '所属表名';

COMMENT ON COLUMN "public"."geoserver_publish_style"."is_sm" IS '是否为多色(1为单色;2为多色)';

COMMENT ON COLUMN "public"."geoserver_publish_style"."name" IS '名称(如是根节点的话,代表样式名称,子节点泽表示图例名称)';

COMMENT ON COLUMN "public"."geoserver_publish_style"."sorting" IS '排序';

COMMENT ON TABLE "public"."geoserver_publish_style" IS '图层样式';

二、业务逻辑分享

初版,测试可行

逻辑其实以拼接出所需要的sld文档为主,逻辑思路如下:

  1. 构建出一个sld文件雏形(string
  2. 从数据库获取自定义的字段结构
  3. 将每个数据库实体拼接成一个单独的rule标签
  4. 将所有rule标签拼接后,存入1.中的sld文件中
  5. 返回结果即可
 /**
     * 根据样式名称name 查询出对应的整个实体列表
     */
    public RestResult<List<GeoserverPublishStyleResponse>> getListByName(String name) {
        LambdaQueryWrapper<GeoserverPublishStyle> wrapper = new LambdaQueryWrapper<>();
//        wrapper.eq(GeoserverPublishStyle::getName , name);
        List<GeoserverPublishStyle> list = this.list(wrapper);
        List<GeoserverPublishStyleResponse> responses = new ArrayList<>();
        for (GeoserverPublishStyle geoserverPublishStyle : list) {
            GeoserverPublishStyleResponse response = GeoserverPublishStyleConvert.INSTANCE.toResponse(geoserverPublishStyle);
            responses.add(response);
        }

        return RestResultUtils.success(responses);
    }



    @Override
    public String composeSldText(String name) {
        List<GeoserverPublishStyleResponse> styleResponses = this.getListByName(name).getData();
        // 获取初始sld文本
        StringBuffer sld = new StringBuffer(SLD_ORIGIN_TEXT);
        StringBuffer rules = new StringBuffer();
        // 循环生成rule文本
        for (GeoserverPublishStyleResponse style : styleResponses) {
            StringBuffer str = new StringBuffer(SLD_RULE_HEAD);
            // 存title
            str.append(style.getPropertyName() + "=" + style.getLiteral());
            // 存条件名PropertyName
            str.append(SLD_RULE_2);
            str.append(style.getPropertyName());
            // 存属性值
            str.append(SLD_RULE_3);
            str.append(style.getLiteral());
            str.append(SLD_RULE_4);
            // 存填充颜色
            str.append("<Fill><CssParameter name=\"fill\">");
            str.append(style.getFillColor() != null ?
                    style.getFillColor() :
                    "#DDDDDD");
            // 存填充颜色的透明度
            str.append("</CssParameter> <CssParameter name=\"fill-opacity\">");
            str.append(style.getFillOpacity() != null ? style.getFillOpacity() : "0.7");
            str.append("</CssParameter></Fill><Stroke>");
             存线条信息
            String strokeColor = style.getStrokeColor();
            String strokeWidth = style.getStrokeWidth();
            if (StringUtils.hasText(strokeColor) ) {
                str.append("<CssParameter name=\"stroke\">");
                str.append(strokeColor);
                str.append("</CssParameter>");
            }
            if(StringUtils.hasText(strokeWidth)){
                str.append("<CssParameter name=\"stroke-width\">");
                str.append(strokeWidth);
                str.append("</CssParameter>");
            }
            str.append("</Stroke>");
            // 存结尾
            str.append(SLD_RULE_END);

            /// 插入rules中
            rules.append(str);
        }
        // 将rule替换掉sld的文本
        sld.replace(684,689 , rules.toString());

        return sld.toString();
    }

使用到的静态变量

    String SLD_ORIGIN_TEXT = "<?xml version=\"1.0\" encoding=\"GBK\"?><StyledLayerDescriptor version=\"1.0.0\" xsi:schemaLocation=\"http://www.opengis.net/sld StyledLayerDescriptor.xsd\" xmlns=\"http://www.opengis.net/sld\" xmlns:ogc=\"http://www.opengis.net/ogc\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"><NamedLayer><Name>name</Name><UserStyle><FeatureTypeStyle><Rule><Title>default</Title><PolygonSymbolizer><Fill><CssParameter name=\"fill\">#DDDDDD</CssParameter><CssParameter name=\"fill-opacity\">0.7</CssParameter></Fill><Stroke><CssParameter name=\"stroke\">#808080</CssParameter><CssParameter name=\"stroke-width\">0.3</CssParameter></Stroke></PolygonSymbolizer></Rule>" +
            "@rule" +
            "</FeatureTypeStyle></UserStyle></NamedLayer></StyledLayerDescriptor>";

    String SLD_RULE_HEAD = "<Rule><Title>";
    String SLD_RULE_2 = "</Title><ogc:Filter><ogc:PropertyIsEqualTo><ogc:PropertyName>";
    String SLD_RULE_3 = "</ogc:PropertyName><ogc:Literal>";
    String SLD_RULE_4 = "</ogc:Literal></ogc:PropertyIsEqualTo></ogc:Filter><PolygonSymbolizer>";
    String SLD_RULE_END = "</PolygonSymbolizer></Rule>";

来看看测试代码 ,获取最终数据

@SpringBootTest
class GeoserverPublishStyleServiceTest {
    @Resource
    IGeoserverPublishStyleService geoserverPublishStyleService;

    @Test
    void composeSLDStirng(){
        String s = geoserverPublishStyleService.composeSldText(null);
        System.out.println(s);
    }

}

image-20230508092127651

结果是符合预期的,测试通过

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/501271.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

「容器云架构」K8s 多区域部署介绍

背景 Kubernetes的设计使得单个Kubernetes集群可以跨多个故障区域multiple failure zones运行&#xff0c;通常这些区域&#xff08;zones &#xff09;位于称为区域&#xff08;region&#xff09;的逻辑分组中。主要的云提供商将一个区域定义为一组故障区域 failure zones&am…

Linux高性能服务器编程|阅读笔记:第7章 - Linux服务器程序规范

目录 简介系列笔记7.1 日志7.1.1 Linux系统日志7.1.2 syslog函数7.2 用户信息7.2.1 UID、EUID、GID和EGID7.2.2 切换用户7.3 进程间关系7.3.1 进程组7.3.2 会话7.3.3 用ps命令查看进程关系7.4 系统资源限制7.5 改变工作目录和根目录7.6 服务器程序后台化结语简介 Hello! 非常感…

基于html+css的图展示50

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

【UE】高级载具插件-02-坦克开火

1. 添加开火的操作映射 2. 创建一个actor蓝图类&#xff0c;添加一个静态网格体组件 添加发射物移动组件 设置初始速度和最大速度 发射物重力范围设为0.05 添加音频组件 设置音效 3. 打开炮管的静态网格体 在插槽管理器中创建插槽 将创建的插槽放到炮口位置 4. 打开“BP_BaseT…

《物联网安全关键技术白皮书》解读

物联网技术作为物理世界与信息世界融合的具象体现&#xff0c;有效地连接分离的物理世界和信息空间&#xff0c;囊括了传感器网络、通信网络以及互联网&#xff0c;构建物与物互联、人与物互联、人与人互联的协同共生关系&#xff0c;推进了信息产业的新变革&#xff0c;同时也…

南大通用数据库-Gbase-8a-学习-35-rmt(远程导出数据文件)

目录 一、测试环境 二、引入 三、rmt导出流程 四、Linux环境模拟实验 1、不加rmt导出数据 2、加rmt导出数据 一、测试环境 名称值CPUIntel(R) Core(TM) i5-1035G1 CPU 1.00GHz操作系统CentOS Linux release 7.9.2009 (Core)内存3G逻辑核数2目的端Gbase8a版本8.6.2-R43源…

单词背诵 2023.5.8

preceding dawn sunset segregate restless oblige mature martial vital virtually

PHP+MYSQL——大学生心理健康测试网站源码

一、功能 前台功能&#xff1a; 1、心理百科、心理书籍、心理健康测试 2、用户注册、用户登录、重置密码、退出登录、个人信息修改 3、心理健康测试成绩查看、心理健康状态解决办法 4、预约心理咨询师、预约审批查看 5、留言板 后台功能&#xff1a; 1、后台登录、修改管理员…

【C++】1.语言基础:八股文

心口如一&#xff0c;犹不失为光明磊落丈夫之行也。——梁启超 文章目录 :smirk:1. 语言基础内存分配指针参数传递和引用参数传递四种强制转换面向对象的三大特性并举例#define 和别名 typedef 的区别 :blush:2. 标准库STL介绍频繁调⽤ push_back() 的影响i 和 i 的区别⼤端⼩…

ePWM模块(1)

ePWM模块 ePWM模块内部包含有7个子模块,分别是时间基准子模块TB、比较功能子模块CC,动作限定子模块AQ、死区控制子模块DB、斩波控制子模块PC、事件触发子模块ET和故障捕获子模块TZ。 每个ePWM模块都具有以下功能: 可以输出两路PWM,EPWMxA和EPWMxB两路PWM可以独立输出,也可…

数字座舱带动液晶仪表升级,哪些企业「领跑」前装量产份额

作为人机交互的关键一环&#xff0c;传统汽车机械仪表也在经历数字化、智能化的升级。尤其是整车智能化的升级、电动化的转型&#xff0c;传统仪表存在反应慢、精度低和显示方式单一的缺点&#xff0c;已经不能满足市场要求。 比如&#xff0c;相比于传统机械式仪表&#xff0…

Qt5.9学习笔记-事件(五) 事件调试和排查

⭐️我叫忆_恒心&#xff0c;一名喜欢书写博客的在读研究生&#x1f468;‍&#x1f393;。 如果觉得本文能帮到您&#xff0c;麻烦点个赞&#x1f44d;呗&#xff01; 近期会不断在专栏里进行更新讲解博客~~~ 有什么问题的小伙伴 欢迎留言提问欧&#xff0c;喜欢的小伙伴给个三…

vue+node.js高校青年志愿者管理系统

1&#xff0e;系统登录&#xff1a;系统登录是用户访问系统的路口&#xff0c;设计了系统登录界面&#xff0c;包括用户名、密码和验证码&#xff0c;然后对登录进来的用户判断身份信息&#xff0c;判断是管理员用户还是普通用户。 2&#xff0e;系统用户管理&#xff1a;不管是…

软件设计师内容记载

栈和队列 栈是按照 先进后出或者 后进先出&#xff0c;队列是先进先出 栈只能在栈顶进行插入和删除&#xff0c;栈底不动。 队列是在一端插入&#xff0c;一端删除。 允许插入的是队尾&#xff0c;允许删除的是队头。 循环队列&#xff1a; 队头 队尾&#xff1a;队尾指针指向的…

PXI 国产化测试系统中数据采集与分析软件的设计

数据采集与分析系统需求分析和总体设计 数据采集与分析系统是 PXI 测试系统的上位机软件子系统&#xff0c;在系统中有着重 要的作用。本章将首先简要介绍 PXI 测试系统&#xff0c;分析其整体结构与功能&#xff0c;说明数 据分析系统与 PXI 测试系统的关系&#xff…

每天一道算法练习题--Day25 第一章 --算法专题 --- ----------单调栈

单调栈 栈是什么&#xff1f;栈的常用操作栈的常用操作时间复杂度应用及题目推荐 单调栈又是什么&#xff1f;适用场景伪代码代码题目推荐 总结 顾名思义&#xff0c; 单调栈是一种栈。因此要学单调栈&#xff0c;首先要彻底搞懂栈。 栈是什么&#xff1f; 栈是一种受限的数据…

国产安全芯片,请关注他们!

一、华大电子 http://www.hed.com.cn/ 1.1 公司简介 北京中电华大电子设计有限责任公司 &#xff08;简称“华大电子”&#xff09;成立于2002年6月&#xff0c;是国家认定的高新技术企业&#xff0c;是国内最早的集成电路设计企业之一&#xff0c;是中国安全芯片产业的核心…

【ROS】如何让ROS中节点实现数据交换Ⅱ --服务通信

Halo&#xff0c;这里是Ppeua。平时主要更新C语言&#xff0c;C&#xff0c;数据结构算法…感兴趣就关注我吧&#xff01;你定不会失望。 本章将介绍如何通过服务通信的方式实现节点数据交换以及ROS相关指令 本章将介绍如何通过服务通信的方式实现节点数据交换以及ROS相关指令…

【数据结构与算法】常用数据结构(二)

&#x1f600;大家好&#xff0c;我是白晨&#xff0c;一个不是很能熬夜&#xff0c;但是也想日更的人✈。如果喜欢这篇文章&#xff0c;点个赞&#x1f44d;&#xff0c;关注一下&#x1f440;白晨吧&#xff01;你的支持就是我最大的动力&#xff01;&#x1f4aa;&#x1f4…

asp.net+sqlserver基于web的奖学金助学金评定系统

管理员部分功能 管理员管理&#xff0c;管理系统内的所有管理人员信息 1.学生信息管理&#xff0c;管理系统内需要进行奖助学金评定的学生信息 2.教师信息管理&#xff0c;管理学院内的所有教师信息 3.一级指标管理&#xff0c;管理奖助学金评定过程中的一级指标内容 4.二级指标…