通过Java的geoserver
通过Java的geoserver-manager管理GeoServer自定义SLD样式,实现不同图斑展示不同颜色
SLD是风格化图层描述器(Styled Layer Descriptor)的简称,是2005年OGC提出的一个标准,这个标准在一定条件下允许WMS服务器对地图可视化的表现形式进行扩展。在没有SLD之前,只能使用一些已经在服务器上规定好的样式来对地图进行可视化。而当使用了实现了SLD标准之后,它允许我们从客户端来对地图进行定义自己的样式,分级显示等操作,极大的扩展了地图可视化的灵活性。
简单来说,sld就是用于描述图层样式的一个xml格式的文本
SLD文档的元素架构如下:
掌握使用java api 发布样式
一、前置准备
以我本地的环境为例
导入依赖 geoserver-manager
<!--图层发布--><dependency><groupId>nl.pdok</groupId><artifactId>geoserver-manager</artifactId><version>1.7.0-pdok2</version></dependency>
获取manager对象 —— 比较简单,配置一些必要的参数即可
从指定路径读取sld文件文本,在进行发布
为什么使用后string字符串进行发布 —— 为了便于后期进行数据库配置后进行发布
设计从数据库字段自定义样式
一、数据库设计
目标:根据数据库动态生成发布所需的sld文件。
其实就是需要6个核心参数:条件x2, stroke x2 , fill x2
property_name 字段名
literal 条件
fill_color 填充颜色
fill_opacity 不透明度
stroke_color 线条颜色
stroke_width 线宽
给出初版表结构如下
CREATETABLE"public"."geoserver_publish_style"("id"int8NOTNULLDEFAULTnextval('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)DEFAULTnow(),"last_modify_id"int8,"last_modify_time"timestamp(6)DEFAULTnow(),"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"PRIMARYKEY("id"));ALTERTABLE"public"."geoserver_publish_style"OWNERTO"postgres";COMMENTONCOLUMN"public"."geoserver_publish_style"."property_name"IS'字段名';COMMENTONCOLUMN"public"."geoserver_publish_style"."literal"IS'条件';COMMENTONCOLUMN"public"."geoserver_publish_style"."fill_color"IS'填充颜色';COMMENTONCOLUMN"public"."geoserver_publish_style"."fill_opacity"IS'不透明度';COMMENTONCOLUMN"public"."geoserver_publish_style"."stroke_color"IS'线条颜色';COMMENTONCOLUMN"public"."geoserver_publish_style"."stroke_width"IS'线宽';COMMENTONCOLUMN"public"."geoserver_publish_style"."parent_id"IS'父类id';COMMENTONCOLUMN"public"."geoserver_publish_style"."table_name"IS'所属表名';COMMENTONCOLUMN"public"."geoserver_publish_style"."is_sm"IS'是否为多色(1为单色;2为多色)';COMMENTONCOLUMN"public"."geoserver_publish_style"."name"IS'名称(如是根节点的话,代表样式名称,子节点泽表示图例名称)';COMMENTONCOLUMN"public"."geoserver_publish_style"."sorting"IS'排序';COMMENTONTABLE"public"."geoserver_publish_style"IS'图层样式';
逻辑其实以拼接出所需要的sld文档为主,逻辑思路如下:
构建出一个sld文件雏形(string
从数据库获取自定义的字段结构
将每个数据库实体拼接成一个单独的rule标签
将所有rule标签拼接后,存入1.中的sld文件中
返回结果即可
/***根据样式名称name查询出对应的整个实体列表*/publicRestResult<List<GeoserverPublishStyleResponse>>getListByName(Stringname){LambdaQueryWrapper<GeoserverPublishStyle>wrapper=newLambdaQueryWrapper<>();//wrapper.eq(GeoserverPublishStyle::getName,name);List<GeoserverPublishStyle>list=this.list(wrapper);List<GeoserverPublishStyleResponse>responses=newArrayList<>();for(GeoserverPublishStylegeoserverPublishStyle:list){GeoserverPublishStyleResponseresponse=GeoserverPublishStyleConvert.INSTANCE.toResponse(geoserverPublishStyle);responses.add(response);}returnRestResultUtils.success(responses);}@OverridepublicStringcomposeSldText(Stringname){List<GeoserverPublishStyleResponse>styleResponses=this.getListByName(name).getData();//获取初始sld文本StringBuffersld=newStringBuffer(SLD_ORIGIN_TEXT);StringBufferrules=newStringBuffer();//循环生成rule文本for(GeoserverPublishStyleResponsestyle:styleResponses){StringBufferstr=newStringBuffer(SLD_RULE_HEAD);//存titlestr.append(style.getPropertyName()+"="+style.getLiteral());//存条件名PropertyNamestr.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><CssParametername="fill">");str.append(style.getFillColor()!=null?style.getFillColor():"#DDDDDD");//存填充颜色的透明度str.append("</CssParameter><CssParametername="fill-opacity">");str.append(style.getFillOpacity()!=null?style.getFillOpacity():"0.7");str.append("</CssParameter></Fill><Stroke>");存线条信息StringstrokeColor=style.getStrokeColor();StringstrokeWidth=style.getStrokeWidth();if(StringUtils.hasText(strokeColor)){str.append("<CssParametername="stroke">");str.append(strokeColor);str.append("</CssParameter>");}if(StringUtils.hasText(strokeWidth)){str.append("<CssParametername="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());returnsld.toString();}
使用到的静态变量
SLD_ORIGIN_TEXT="<?xmlversion="1.0"encoding="GBK"?><StyledLayerDescriptorversion="1.0.0"xsi:schemaLocation="http://www.opengis.net/sldStyledLayerDescriptor.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><CssParametername="fill">#DDDDDD</CssParameter><CssParametername="fill-opacity">0.7</CssParameter></Fill><Stroke><CssParametername="stroke">#808080</CssParameter><CssParametername="stroke-width">0.3</CssParameter></Stroke></PolygonSymbolizer></Rule>"+"@rule"+"</FeatureTypeStyle></UserStyle></NamedLayer></StyledLayerDescriptor>";StringSLD_RULE_HEAD="<Rule><Title>";StringSLD_RULE_2="</Title><ogc:Filter><ogc:PropertyIsEqualTo><ogc:PropertyName>";StringSLD_RULE_3="</ogc:PropertyName><ogc:Literal>";StringSLD_RULE_4="</ogc:Literal></ogc:PropertyIsEqualTo></ogc:Filter><PolygonSymbolizer>";StringSLD_RULE_END="</PolygonSymbolizer></Rule>";
来看看测试代码 ,获取最终数据
@SpringBootTestclassGeoserverPublishStyleServiceTest{@ResourceIGeoserverPublishStyleServicegeoserverPublishStyleService;@TestvoidcomposeSLDStirng(){Strings=geoserverPublishStyleService.composeSldText(null);System.out.println(s);}}评论可见,查看隐藏内容
本网站文章未经允许禁止转载,合作/权益/投稿 请联系平台管理员 Email:epebiz@outlook.com