通過(guò)Java的geoserver-manager管理GeoServer自定義SLD樣式,實(shí)現(xiàn)不同圖斑展示不同顏色
SLD是風(fēng)格化圖層描述器(Styled Layer Descriptor)的簡(jiǎn)稱,是2005年OGC提出的一個(gè)標(biāo)準(zhǔn),這個(gè)標(biāo)準(zhǔn)在一定條件下允許WMS服務(wù)器對(duì)地圖可視化的表現(xiàn)形式進(jìn)行擴(kuò)展。在沒(méi)有SLD之前,只能使用一些已經(jīng)在服務(wù)器上規(guī)定好的樣式來(lái)對(duì)地圖進(jìn)行可視化。而當(dāng)使用了實(shí)現(xiàn)了SLD標(biāo)準(zhǔn)之后,它允許我們從客戶端來(lái)對(duì)地圖進(jìn)行定義自己的樣式,分級(jí)顯示等操作,極大的擴(kuò)展了地圖可視化的靈活性。
簡(jiǎn)單來(lái)說(shuō),sld就是用于描述圖層樣式的一個(gè)xml格式的文本
SLD文檔的元素架構(gòu)如下:
掌握使用java api 發(fā)布樣式
一、前置準(zhǔn)備
以我本地的環(huán)境為例
導(dǎo)入依賴 geoserver-manager
<!--圖層發(fā)布--> <dependency> <groupId>nl.pdok</groupId> <artifactId>geoserver-manager</artifactId> <version>1.7.0-pdok2</version> </dependency>
獲取manager對(duì)象 —— 比較簡(jiǎn)單,配置一些必要的參數(shù)即可
從指定路徑讀取sld文件文本,在進(jìn)行發(fā)布
為什么使用后string字符串進(jìn)行發(fā)布 —— 為了便于后期進(jìn)行數(shù)據(jù)庫(kù)配置后進(jìn)行發(fā)布
設(shè)計(jì)從數(shù)據(jù)庫(kù)字段自定義樣式
一、數(shù)據(jù)庫(kù)設(shè)計(jì)
目標(biāo):根據(jù)數(shù)據(jù)庫(kù)動(dòng)態(tài)生成發(fā)布所需的sld文件。
其實(shí)就是需要6個(gè)核心參數(shù):條件x2, stroke x2 , fill x2
property_name 字段名
literal 條件
fill_color 填充顏色
fill_opacity 不透明度
stroke_color 線條顏色
stroke_width 線寬
給出初版表結(jié)構(gòu)如下
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 '名稱(如是根節(jié)點(diǎn)的話,代表樣式名稱,子節(jié)點(diǎn)澤表示圖例名稱)'; COMMENT ON COLUMN "public"."geoserver_publish_style"."sorting" IS '排序'; COMMENT ON TABLE "public"."geoserver_publish_style" IS '圖層樣式';
邏輯其實(shí)以拼接出所需要的sld文檔為主,邏輯思路如下:
構(gòu)建出一個(gè)sld文件雛形(string
從數(shù)據(jù)庫(kù)獲取自定義的字段結(jié)構(gòu)
將每個(gè)數(shù)據(jù)庫(kù)實(shí)體拼接成一個(gè)單獨(dú)的rule標(biāo)簽
將所有rule標(biāo)簽拼接后,存入1.中的sld文件中
返回結(jié)果即可
/** * 根據(jù)樣式名稱name 查詢出對(duì)應(yīng)的整個(gè)實(shí)體列表 */ 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(); // 循環(huán)生成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>"); // 存結(jié)尾 str.append(SLD_RULE_END); /// 插入rules中 rules.append(str); } // 將rule替換掉sld的文本 sld.replace(684,689 , rules.toString()); return sld.toString(); }
使用到的靜態(tài)變量
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>";
來(lái)看看測(cè)試代碼 ,獲取最終數(shù)據(jù)
@SpringBootTest class GeoserverPublishStyleServiceTest { @Resource IGeoserverPublishStyleService geoserverPublishStyleService; @Test void composeSLDStirng(){ String s = geoserverPublishStyleService.composeSldText(null); System.out.println(s); } }
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場(chǎng)。
轉(zhuǎn)載請(qǐng)注明,如有侵權(quán),聯(lián)系刪除。