使用Java基于Geotools的SLD文件编程式创建与磁盘生成实战

前言

        在地理信息系统(GIS)领域,地图的可视化呈现至关重要,而样式定义语言(SLD)文件为地图元素的样式配置提供了强大的支持。SLD 能够精确地定义地图图层中各类要素(如点、线、面、文本等)的颜色、大小、填充图案、边框样式等外观特征,使得地图不仅能够传递空间数据信息,还能以符合用户需求和业务场景的美观、直观形式展示出来。

        Java 作为一种广泛应用于企业级开发的编程语言,在 GIS 软件开发中也占据着重要地位。Geotools 作为开源的 Java GIS 工具库,为地理数据处理、地图渲染等提供了丰富的功能组件。借助 Geotools,开发者可以便捷地操作空间数据,并基于其丰富的 API 进行地图应用的定制开发。在实际项目中,常常需要根据不同的业务逻辑、数据状态或用户配置动态生成 SLD 文件,以实现地图样式的灵活调整与个性化定制。例如,一个环境监测系统可能需要根据实时监测数据的污染程度动态改变地图上对应区域的填充颜色,或者一个交通规划应用需要依据交通流量状况动态调整道路线条的宽度和颜色深浅等。

        本文将深入探讨如何使用 Java 语言基于 Geotools 库,通过编程的方式创建 SLD 文件,并将其生成到磁盘上,以便后续地图渲染引擎能够加载并应用这些样式配置。我们将详细阐述 SLD 文件的结构组成,解析 Geotools 中与 SLD 操作相关的类和接口,通过代码示例展示如何构建点、线、面等不同几何类型的样式规则,以及如何将这些规则组合成完整的 SLD 文件内容,并最终实现在磁盘上的存储,为 GIS 应用实现灵活多变的地图样式配置提供实战技术指导,帮助开发者掌握这一关键技能,提升地理信息系统的可视化质量和用户体验,满足复杂多样的业务需求,在快速变化的应用场景中高效地调整地图展示效果,增强系统对数据动态变化的响应能力,拓展基于 Java 和 Geotools 的 GIS 开发技术边界,为相关领域的项目实践提供有力的技术支撑和参考范例。

一、样式生成相关类

        为了让大家在Java中使用Geotools来创建SLD文件有一个比较全面的了解,这里我们将采用OOP的方法来进行讲解,分别从相关的类图和程序调用的时序图两个方面来讲解。

1、相关类图

        为了实现从PostGIS数据库中查询空间数据,将空间数据中解析Geometry信息,并且使用程序根据属性信息提取出相应的SLD文件,在程序中可能需要依赖的相关类如下:

序号类名作用
1org.geotools.styling.StyleFactory样式工厂
2org.geotools.styling.FilterFactory2升级版样式工厂
3org.geotools.xml.styling.SLDTransformersld转换器
4org.geotools.data.DataStoreFinder数据源查找器
5org.geotools.data.FeatureSource要素资源
6org.geotools.data.QueryCQL查询对象
7org.geotools.styling.Stylestyle样式对象
8org.geotools.styling.PolygonSymbolizer面状标注

        以上是本实例中可能涉及的相关类,仅将关键的类对象在此展示,其它对象暂不列出,感兴趣的朋友可以在代码中看到。

2、程序时序图

        与类图相似,这里仅描述关键的SLD样式文件的生成步骤,更完整的类信息,可以在评论区留言交流。 以上就是相关的类图和时序图示意。

二、编程式生成SLD实战

        在了解了SLD的类图和时序图之后,下面我们来深入讲解如何使用编程的方法来实现SLD的生成与保存到本地磁盘中。

1、SLD生成

        根据Style信息生成SLD的关键方法如下,这是标准的代码生成:

/**
* - 将生成的Style转换成sld文件进行磁盘输出
* @param style
* @throws TransformerException
* @throws IOException
*/
public static void generateSld(Style style) throws TransformerException, IOException {SLDTransformer transformer = new SLDTransformer();transformer.setIndentation(4);transformer.setNamespaceDeclarationEnabled(true);transformer.setOmitXMLDeclaration(false);String sldXml = transformer.transform(style);System.out.println(sldXml);
}

        这里主要使用的类就是SLDTransformer对象,通过这个类就可以实现SLD的生成,在设置好相应的模板和属性之后,调用transform方法就可以实现将SLD文件进行字符串的格式化输出,在程序的控制台中可以看到以下信息:

2、SLD回写磁盘结果

        在生成了SLD的信息之后,如何将字符串保存到本地磁盘呢?将生成好的文件发给别人就可以实现样式文件的共享,可以有效的提高制图的效率。实现将文本的SLD回写磁盘的方法很简单,在上面的生成方法中加入以下代码:

/**
* - 将生成的Style转换成sld文件进行磁盘输出
* @param style
* @throws TransformerException
* @throws IOException
*/
public static void generateSld(Style style) throws TransformerException, IOException {SLDTransformer transformer = new SLDTransformer();transformer.setIndentation(4);transformer.setNamespaceDeclarationEnabled(true);transformer.setOmitXMLDeclaration(false);String sldXml = transformer.transform(style);System.out.println(sldXml);// 保存到文件Files.write(Paths.get("D:/hubei_style.sld"), sldXml.getBytes());System.out.println("SLD文件已成功生成!");
}

        接下来,我们在本地磁盘中来看一下是否成功的生成sld文件,到电脑的磁盘中看一下,

        在本次的磁盘中可以看到,预期的sld文件已经成功的生成,在文本编辑器中看一下它的主要内容,如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<sld:UserStyle xmlns="http://www.opengis.net/sld" xmlns:sld="http://www.opengis.net/sld" xmlns:gml="http://www.opengis.net/gml" xmlns:ogc="http://www.opengis.net/ogc"><sld:Name>Default Styler</sld:Name><sld:FeatureTypeStyle><sld:Name>name</sld:Name><sld:Rule><sld:Name>仙桃市</sld:Name><ogc:Filter><ogc:PropertyIsEqualTo><ogc:PropertyName>city_name</ogc:PropertyName><ogc:Literal>仙桃市</ogc:Literal></ogc:PropertyIsEqualTo></ogc:Filter><sld:PolygonSymbolizer><sld:Fill><sld:CssParameter name="fill">#E62E2E</sld:CssParameter><sld:CssParameter name="fill-opacity">0.8</sld:CssParameter></sld:Fill><sld:Stroke><sld:CssParameter name="stroke">#404040</sld:CssParameter><sld:CssParameter name="stroke-width">0.8</sld:CssParameter></sld:Stroke></sld:PolygonSymbolizer><sld:TextSymbolizer><sld:Label><ogc:PropertyName>city_name</ogc:PropertyName></sld:Label><sld:Font><sld:CssParameter name="font-family">楷体</sld:CssParameter><sld:CssParameter name="font-size">22</sld:CssParameter><sld:CssParameter name="font-style">Regular</sld:CssParameter><sld:CssParameter name="font-weight">normal</sld:CssParameter></sld:Font><sld:LabelPlacement><sld:PointPlacement><sld:AnchorPoint><sld:AnchorPointX>0.5</sld:AnchorPointX><sld:AnchorPointY>0.5</sld:AnchorPointY></sld:AnchorPoint></sld:PointPlacement></sld:LabelPlacement><sld:Fill><sld:CssParameter name="fill">#FFFFFF</sld:CssParameter></sld:Fill></sld:TextSymbolizer></sld:Rule><sld:Rule><sld:Name>十堰市</sld:Name><ogc:Filter><ogc:PropertyIsEqualTo><ogc:PropertyName>city_name</ogc:PropertyName><ogc:Literal>十堰市</ogc:Literal></ogc:PropertyIsEqualTo></ogc:Filter><sld:PolygonSymbolizer><sld:Fill><sld:CssParameter name="fill">#2E63E6</sld:CssParameter><sld:CssParameter name="fill-opacity">0.8</sld:CssParameter></sld:Fill><sld:Stroke><sld:CssParameter name="stroke">#404040</sld:CssParameter><sld:CssParameter name="stroke-width">0.8</sld:CssParameter></sld:Stroke></sld:PolygonSymbolizer><sld:TextSymbolizer><sld:Label><ogc:PropertyName>city_name</ogc:PropertyName></sld:Label><sld:Font><sld:CssParameter name="font-family">楷体</sld:CssParameter><sld:CssParameter name="font-size">22</sld:CssParameter><sld:CssParameter name="font-style">Regular</sld:CssParameter><sld:CssParameter name="font-weight">normal</sld:CssParameter></sld:Font><sld:LabelPlacement><sld:PointPlacement><sld:AnchorPoint><sld:AnchorPointX>0.5</sld:AnchorPointX><sld:AnchorPointY>0.5</sld:AnchorPointY></sld:AnchorPoint></sld:PointPlacement></sld:LabelPlacement><sld:Fill><sld:CssParameter name="fill">#FFFFFF</sld:CssParameter></sld:Fill></sld:TextSymbolizer></sld:Rule><sld:Rule><sld:Name>咸宁市</sld:Name><ogc:Filter><ogc:PropertyIsEqualTo><ogc:PropertyName>city_name</ogc:PropertyName><ogc:Literal>咸宁市</ogc:Literal></ogc:PropertyIsEqualTo></ogc:Filter><sld:PolygonSymbolizer><sld:Fill><sld:CssParameter name="fill">#99E62E</sld:CssParameter><sld:CssParameter name="fill-opacity">0.8</sld:CssParameter></sld:Fill><sld:Stroke><sld:CssParameter name="stroke">#404040</sld:CssParameter><sld:CssParameter name="stroke-width">0.8</sld:CssParameter></sld:Stroke></sld:PolygonSymbolizer><sld:TextSymbolizer><sld:Label><ogc:PropertyName>city_name</ogc:PropertyName></sld:Label><sld:Font><sld:CssParameter name="font-family">楷体</sld:CssParameter><sld:CssParameter name="font-size">22</sld:CssParameter><sld:CssParameter name="font-style">Regular</sld:CssParameter><sld:CssParameter name="font-weight">normal</sld:CssParameter></sld:Font><sld:LabelPlacement><sld:PointPlacement><sld:AnchorPoint><sld:AnchorPointX>0.5</sld:AnchorPointX><sld:AnchorPointY>0.5</sld:AnchorPointY></sld:AnchorPoint></sld:PointPlacement></sld:LabelPlacement><sld:Fill><sld:CssParameter name="fill">#FFFFFF</sld:CssParameter></sld:Fill></sld:TextSymbolizer></sld:Rule><sld:Rule><sld:Name>天门市</sld:Name><ogc:Filter><ogc:PropertyIsEqualTo><ogc:PropertyName>city_name</ogc:PropertyName><ogc:Literal>天门市</ogc:Literal></ogc:PropertyIsEqualTo></ogc:Filter><sld:PolygonSymbolizer><sld:Fill><sld:CssParameter name="fill">#E62ECF</sld:CssParameter><sld:CssParameter name="fill-opacity">0.8</sld:CssParameter></sld:Fill><sld:Stroke><sld:CssParameter name="stroke">#404040</sld:CssParameter><sld:CssParameter name="stroke-width">0.8</sld:CssParameter></sld:Stroke></sld:PolygonSymbolizer><sld:TextSymbolizer><sld:Label><ogc:PropertyName>city_name</ogc:PropertyName></sld:Label><sld:Font><sld:CssParameter name="font-family">楷体</sld:CssParameter><sld:CssParameter name="font-size">22</sld:CssParameter><sld:CssParameter name="font-style">Regular</sld:CssParameter><sld:CssParameter name="font-weight">normal</sld:CssParameter></sld:Font><sld:LabelPlacement><sld:PointPlacement><sld:AnchorPoint><sld:AnchorPointX>0.5</sld:AnchorPointX><sld:AnchorPointY>0.5</sld:AnchorPointY></sld:AnchorPoint></sld:PointPlacement></sld:LabelPlacement><sld:Fill><sld:CssParameter name="fill">#FFFFFF</sld:CssParameter></sld:Fill></sld:TextSymbolizer></sld:Rule><sld:Rule><sld:Name>孝感市</sld:Name><ogc:Filter><ogc:PropertyIsEqualTo><ogc:PropertyName>city_name</ogc:PropertyName><ogc:Literal>孝感市</ogc:Literal></ogc:PropertyIsEqualTo></ogc:Filter><sld:PolygonSymbolizer><sld:Fill><sld:CssParameter name="fill">#2EE6C7</sld:CssParameter><sld:CssParameter name="fill-opacity">0.8</sld:CssParameter></sld:Fill><sld:Stroke><sld:CssParameter name="stroke">#404040</sld:CssParameter><sld:CssParameter name="stroke-width">0.8</sld:CssParameter></sld:Stroke></sld:PolygonSymbolizer><sld:TextSymbolizer><sld:Label><ogc:PropertyName>city_name</ogc:PropertyName></sld:Label><sld:Font><sld:CssParameter name="font-family">楷体</sld:CssParameter><sld:CssParameter name="font-size">22</sld:CssParameter><sld:CssParameter name="font-style">Regular</sld:CssParameter><sld:CssParameter name="font-weight">normal</sld:CssParameter></sld:Font><sld:LabelPlacement><sld:PointPlacement><sld:AnchorPoint><sld:AnchorPointX>0.5</sld:AnchorPointX><sld:AnchorPointY>0.5</sld:AnchorPointY></sld:AnchorPoint></sld:PointPlacement></sld:LabelPlacement><sld:Fill><sld:CssParameter name="fill">#FFFFFF</sld:CssParameter></sld:Fill></sld:TextSymbolizer></sld:Rule><sld:Rule><sld:Name>宜昌市</sld:Name><ogc:Filter><ogc:PropertyIsEqualTo><ogc:PropertyName>city_name</ogc:PropertyName><ogc:Literal>宜昌市</ogc:Literal></ogc:PropertyIsEqualTo></ogc:Filter><sld:PolygonSymbolizer><sld:Fill><sld:CssParameter name="fill">#E6912E</sld:CssParameter><sld:CssParameter name="fill-opacity">0.8</sld:CssParameter></sld:Fill><sld:Stroke><sld:CssParameter name="stroke">#404040</sld:CssParameter><sld:CssParameter name="stroke-width">0.8</sld:CssParameter></sld:Stroke></sld:PolygonSymbolizer><sld:TextSymbolizer><sld:Label><ogc:PropertyName>city_name</ogc:PropertyName></sld:Label><sld:Font><sld:CssParameter name="font-family">楷体</sld:CssParameter><sld:CssParameter name="font-size">22</sld:CssParameter><sld:CssParameter name="font-style">Regular</sld:CssParameter><sld:CssParameter name="font-weight">normal</sld:CssParameter></sld:Font><sld:LabelPlacement><sld:PointPlacement><sld:AnchorPoint><sld:AnchorPointX>0.5</sld:AnchorPointX><sld:AnchorPointY>0.5</sld:AnchorPointY></sld:AnchorPoint></sld:PointPlacement></sld:LabelPlacement><sld:Fill><sld:CssParameter name="fill">#FFFFFF</sld:CssParameter></sld:Fill></sld:TextSymbolizer></sld:Rule><sld:Rule><sld:Name>恩施土家族苗族自治州</sld:Name><ogc:Filter><ogc:PropertyIsEqualTo><ogc:PropertyName>city_name</ogc:PropertyName><ogc:Literal>恩施土家族苗族自治州</ogc:Literal></ogc:PropertyIsEqualTo></ogc:Filter><sld:PolygonSymbolizer><sld:Fill><sld:CssParameter name="fill">#5C2EE6</sld:CssParameter><sld:CssParameter name="fill-opacity">0.8</sld:CssParameter></sld:Fill><sld:Stroke><sld:CssParameter name="stroke">#404040</sld:CssParameter><sld:CssParameter name="stroke-width">0.8</sld:CssParameter></sld:Stroke></sld:PolygonSymbolizer><sld:TextSymbolizer><sld:Label><ogc:PropertyName>city_name</ogc:PropertyName></sld:Label><sld:Font><sld:CssParameter name="font-family">楷体</sld:CssParameter><sld:CssParameter name="font-size">22</sld:CssParameter><sld:CssParameter name="font-style">Regular</sld:CssParameter><sld:CssParameter name="font-weight">normal</sld:CssParameter></sld:Font><sld:LabelPlacement><sld:PointPlacement><sld:AnchorPoint><sld:AnchorPointX>0.5</sld:AnchorPointX><sld:AnchorPointY>0.5</sld:AnchorPointY></sld:AnchorPoint></sld:PointPlacement></sld:LabelPlacement><sld:Fill><sld:CssParameter name="fill">#FFFFFF</sld:CssParameter></sld:Fill></sld:TextSymbolizer></sld:Rule><sld:Rule><sld:Name>武汉市</sld:Name><ogc:Filter><ogc:PropertyIsEqualTo><ogc:PropertyName>city_name</ogc:PropertyName><ogc:Literal>武汉市</ogc:Literal></ogc:PropertyIsEqualTo></ogc:Filter><sld:PolygonSymbolizer><sld:Fill><sld:CssParameter name="fill">#36E62E</sld:CssParameter><sld:CssParameter name="fill-opacity">0.8</sld:CssParameter></sld:Fill><sld:Stroke><sld:CssParameter name="stroke">#404040</sld:CssParameter><sld:CssParameter name="stroke-width">0.8</sld:CssParameter></sld:Stroke></sld:PolygonSymbolizer><sld:TextSymbolizer><sld:Label><ogc:PropertyName>city_name</ogc:PropertyName></sld:Label><sld:Font><sld:CssParameter name="font-family">楷体</sld:CssParameter><sld:CssParameter name="font-size">22</sld:CssParameter><sld:CssParameter name="font-style">Regular</sld:CssParameter><sld:CssParameter name="font-weight">normal</sld:CssParameter></sld:Font><sld:LabelPlacement><sld:PointPlacement><sld:AnchorPoint><sld:AnchorPointX>0.5</sld:AnchorPointX><sld:AnchorPointY>0.5</sld:AnchorPointY></sld:AnchorPoint></sld:PointPlacement></sld:LabelPlacement><sld:Fill><sld:CssParameter name="fill">#FFFFFF</sld:CssParameter></sld:Fill></sld:TextSymbolizer></sld:Rule><sld:Rule><sld:Name>潜江市</sld:Name><ogc:Filter><ogc:PropertyIsEqualTo><ogc:PropertyName>city_name</ogc:PropertyName><ogc:Literal>潜江市</ogc:Literal></ogc:PropertyIsEqualTo></ogc:Filter><sld:PolygonSymbolizer><sld:Fill><sld:CssParameter name="fill">#E62E6B</sld:CssParameter><sld:CssParameter name="fill-opacity">0.8</sld:CssParameter></sld:Fill><sld:Stroke><sld:CssParameter name="stroke">#404040</sld:CssParameter><sld:CssParameter name="stroke-width">0.8</sld:CssParameter></sld:Stroke></sld:PolygonSymbolizer><sld:TextSymbolizer><sld:Label><ogc:PropertyName>city_name</ogc:PropertyName></sld:Label><sld:Font><sld:CssParameter name="font-family">楷体</sld:CssParameter><sld:CssParameter name="font-size">22</sld:CssParameter><sld:CssParameter name="font-style">Regular</sld:CssParameter><sld:CssParameter name="font-weight">normal</sld:CssParameter></sld:Font><sld:LabelPlacement><sld:PointPlacement><sld:AnchorPoint><sld:AnchorPointX>0.5</sld:AnchorPointX><sld:AnchorPointY>0.5</sld:AnchorPointY></sld:AnchorPoint></sld:PointPlacement></sld:LabelPlacement><sld:Fill><sld:CssParameter name="fill">#FFFFFF</sld:CssParameter></sld:Fill></sld:TextSymbolizer></sld:Rule><sld:Rule><sld:Name>神农架林区</sld:Name><ogc:Filter><ogc:PropertyIsEqualTo><ogc:PropertyName>city_name</ogc:PropertyName><ogc:Literal>神农架林区</ogc:Literal></ogc:PropertyIsEqualTo></ogc:Filter><sld:PolygonSymbolizer><sld:Fill><sld:CssParameter name="fill">#2EA1E6</sld:CssParameter><sld:CssParameter name="fill-opacity">0.8</sld:CssParameter></sld:Fill><sld:Stroke><sld:CssParameter name="stroke">#404040</sld:CssParameter><sld:CssParameter name="stroke-width">0.8</sld:CssParameter></sld:Stroke></sld:PolygonSymbolizer><sld:TextSymbolizer><sld:Label><ogc:PropertyName>city_name</ogc:PropertyName></sld:Label><sld:Font><sld:CssParameter name="font-family">楷体</sld:CssParameter><sld:CssParameter name="font-size">22</sld:CssParameter><sld:CssParameter name="font-style">Regular</sld:CssParameter><sld:CssParameter name="font-weight">normal</sld:CssParameter></sld:Font><sld:LabelPlacement><sld:PointPlacement><sld:AnchorPoint><sld:AnchorPointX>0.5</sld:AnchorPointX><sld:AnchorPointY>0.5</sld:AnchorPointY></sld:AnchorPoint></sld:PointPlacement></sld:LabelPlacement><sld:Fill><sld:CssParameter name="fill">#FFFFFF</sld:CssParameter></sld:Fill></sld:TextSymbolizer></sld:Rule><sld:Rule><sld:Name>荆州市</sld:Name><ogc:Filter><ogc:PropertyIsEqualTo><ogc:PropertyName>city_name</ogc:PropertyName><ogc:Literal>荆州市</ogc:Literal></ogc:PropertyIsEqualTo></ogc:Filter><sld:PolygonSymbolizer><sld:Fill><sld:CssParameter name="fill">#D6E62E</sld:CssParameter><sld:CssParameter name="fill-opacity">0.8</sld:CssParameter></sld:Fill><sld:Stroke><sld:CssParameter name="stroke">#404040</sld:CssParameter><sld:CssParameter name="stroke-width">0.8</sld:CssParameter></sld:Stroke></sld:PolygonSymbolizer><sld:TextSymbolizer><sld:Label><ogc:PropertyName>city_name</ogc:PropertyName></sld:Label><sld:Font><sld:CssParameter name="font-family">楷体</sld:CssParameter><sld:CssParameter name="font-size">22</sld:CssParameter><sld:CssParameter name="font-style">Regular</sld:CssParameter><sld:CssParameter name="font-weight">normal</sld:CssParameter></sld:Font><sld:LabelPlacement><sld:PointPlacement><sld:AnchorPoint><sld:AnchorPointX>0.5</sld:AnchorPointX><sld:AnchorPointY>0.5</sld:AnchorPointY></sld:AnchorPoint></sld:PointPlacement></sld:LabelPlacement><sld:Fill><sld:CssParameter name="fill">#FFFFFF</sld:CssParameter></sld:Fill></sld:TextSymbolizer></sld:Rule><sld:Rule><sld:Name>荆门市</sld:Name><ogc:Filter><ogc:PropertyIsEqualTo><ogc:PropertyName>city_name</ogc:PropertyName><ogc:Literal>荆门市</ogc:Literal></ogc:PropertyIsEqualTo></ogc:Filter><sld:PolygonSymbolizer><sld:Fill><sld:CssParameter name="fill">#BF2EE6</sld:CssParameter><sld:CssParameter name="fill-opacity">0.8</sld:CssParameter></sld:Fill><sld:Stroke><sld:CssParameter name="stroke">#404040</sld:CssParameter><sld:CssParameter name="stroke-width">0.8</sld:CssParameter></sld:Stroke></sld:PolygonSymbolizer><sld:TextSymbolizer><sld:Label><ogc:PropertyName>city_name</ogc:PropertyName></sld:Label><sld:Font><sld:CssParameter name="font-family">楷体</sld:CssParameter><sld:CssParameter name="font-size">22</sld:CssParameter><sld:CssParameter name="font-style">Regular</sld:CssParameter><sld:CssParameter name="font-weight">normal</sld:CssParameter></sld:Font><sld:LabelPlacement><sld:PointPlacement><sld:AnchorPoint><sld:AnchorPointX>0.5</sld:AnchorPointX><sld:AnchorPointY>0.5</sld:AnchorPointY></sld:AnchorPoint></sld:PointPlacement></sld:LabelPlacement><sld:Fill><sld:CssParameter name="fill">#FFFFFF</sld:CssParameter></sld:Fill></sld:TextSymbolizer></sld:Rule><sld:Rule><sld:Name>襄阳市</sld:Name><ogc:Filter><ogc:PropertyIsEqualTo><ogc:PropertyName>city_name</ogc:PropertyName><ogc:Literal>襄阳市</ogc:Literal></ogc:PropertyIsEqualTo></ogc:Filter><sld:PolygonSymbolizer><sld:Fill><sld:CssParameter name="fill">#2EE689</sld:CssParameter><sld:CssParameter name="fill-opacity">0.8</sld:CssParameter></sld:Fill><sld:Stroke><sld:CssParameter name="stroke">#404040</sld:CssParameter><sld:CssParameter name="stroke-width">0.8</sld:CssParameter></sld:Stroke></sld:PolygonSymbolizer><sld:TextSymbolizer><sld:Label><ogc:PropertyName>city_name</ogc:PropertyName></sld:Label><sld:Font><sld:CssParameter name="font-family">楷体</sld:CssParameter><sld:CssParameter name="font-size">22</sld:CssParameter><sld:CssParameter name="font-style">Regular</sld:CssParameter><sld:CssParameter name="font-weight">normal</sld:CssParameter></sld:Font><sld:LabelPlacement><sld:PointPlacement><sld:AnchorPoint><sld:AnchorPointX>0.5</sld:AnchorPointX><sld:AnchorPointY>0.5</sld:AnchorPointY></sld:AnchorPoint></sld:PointPlacement></sld:LabelPlacement><sld:Fill><sld:CssParameter name="fill">#FFFFFF</sld:CssParameter></sld:Fill></sld:TextSymbolizer></sld:Rule><sld:Rule><sld:Name>鄂州市</sld:Name><ogc:Filter><ogc:PropertyIsEqualTo><ogc:PropertyName>city_name</ogc:PropertyName><ogc:Literal>鄂州市</ogc:Literal></ogc:PropertyIsEqualTo></ogc:Filter><sld:PolygonSymbolizer><sld:Fill><sld:CssParameter name="fill">#E6542E</sld:CssParameter><sld:CssParameter name="fill-opacity">0.8</sld:CssParameter></sld:Fill><sld:Stroke><sld:CssParameter name="stroke">#404040</sld:CssParameter><sld:CssParameter name="stroke-width">0.8</sld:CssParameter></sld:Stroke></sld:PolygonSymbolizer><sld:TextSymbolizer><sld:Label><ogc:PropertyName>city_name</ogc:PropertyName></sld:Label><sld:Font><sld:CssParameter name="font-family">楷体</sld:CssParameter><sld:CssParameter name="font-size">22</sld:CssParameter><sld:CssParameter name="font-style">Regular</sld:CssParameter><sld:CssParameter name="font-weight">normal</sld:CssParameter></sld:Font><sld:LabelPlacement><sld:PointPlacement><sld:AnchorPoint><sld:AnchorPointX>0.5</sld:AnchorPointX><sld:AnchorPointY>0.5</sld:AnchorPointY></sld:AnchorPoint></sld:PointPlacement></sld:LabelPlacement><sld:Fill><sld:CssParameter name="fill">#FFFFFF</sld:CssParameter></sld:Fill></sld:TextSymbolizer></sld:Rule><sld:Rule><sld:Name>随州市</sld:Name><ogc:Filter><ogc:PropertyIsEqualTo><ogc:PropertyName>city_name</ogc:PropertyName><ogc:Literal>随州市</ogc:Literal></ogc:PropertyIsEqualTo></ogc:Filter><sld:PolygonSymbolizer><sld:Fill><sld:CssParameter name="fill">#2E3EE6</sld:CssParameter><sld:CssParameter name="fill-opacity">0.8</sld:CssParameter></sld:Fill><sld:Stroke><sld:CssParameter name="stroke">#404040</sld:CssParameter><sld:CssParameter name="stroke-width">0.8</sld:CssParameter></sld:Stroke></sld:PolygonSymbolizer><sld:TextSymbolizer><sld:Label><ogc:PropertyName>city_name</ogc:PropertyName></sld:Label><sld:Font><sld:CssParameter name="font-family">楷体</sld:CssParameter><sld:CssParameter name="font-size">22</sld:CssParameter><sld:CssParameter name="font-style">Regular</sld:CssParameter><sld:CssParameter name="font-weight">normal</sld:CssParameter></sld:Font><sld:LabelPlacement><sld:PointPlacement><sld:AnchorPoint><sld:AnchorPointX>0.5</sld:AnchorPointX><sld:AnchorPointY>0.5</sld:AnchorPointY></sld:AnchorPoint></sld:PointPlacement></sld:LabelPlacement><sld:Fill><sld:CssParameter name="fill">#FFFFFF</sld:CssParameter></sld:Fill></sld:TextSymbolizer></sld:Rule><sld:Rule><sld:Name>黄冈市</sld:Name><ogc:Filter><ogc:PropertyIsEqualTo><ogc:PropertyName>city_name</ogc:PropertyName><ogc:Literal>黄冈市</ogc:Literal></ogc:PropertyIsEqualTo></ogc:Filter><sld:PolygonSymbolizer><sld:Fill><sld:CssParameter name="fill">#73E62E</sld:CssParameter><sld:CssParameter name="fill-opacity">0.8</sld:CssParameter></sld:Fill><sld:Stroke><sld:CssParameter name="stroke">#404040</sld:CssParameter><sld:CssParameter name="stroke-width">0.8</sld:CssParameter></sld:Stroke></sld:PolygonSymbolizer><sld:TextSymbolizer><sld:Label><ogc:PropertyName>city_name</ogc:PropertyName></sld:Label><sld:Font><sld:CssParameter name="font-family">楷体</sld:CssParameter><sld:CssParameter name="font-size">22</sld:CssParameter><sld:CssParameter name="font-style">Regular</sld:CssParameter><sld:CssParameter name="font-weight">normal</sld:CssParameter></sld:Font><sld:LabelPlacement><sld:PointPlacement><sld:AnchorPoint><sld:AnchorPointX>0.5</sld:AnchorPointX><sld:AnchorPointY>0.5</sld:AnchorPointY></sld:AnchorPoint></sld:PointPlacement></sld:LabelPlacement><sld:Fill><sld:CssParameter name="fill">#FFFFFF</sld:CssParameter></sld:Fill></sld:TextSymbolizer></sld:Rule><sld:Rule><sld:Name>黄石市</sld:Name><ogc:Filter><ogc:PropertyIsEqualTo><ogc:PropertyName>city_name</ogc:PropertyName><ogc:Literal>黄石市</ogc:Literal></ogc:PropertyIsEqualTo></ogc:Filter><sld:PolygonSymbolizer><sld:Fill><sld:CssParameter name="fill">#E62EA9</sld:CssParameter><sld:CssParameter name="fill-opacity">0.8</sld:CssParameter></sld:Fill><sld:Stroke><sld:CssParameter name="stroke">#404040</sld:CssParameter><sld:CssParameter name="stroke-width">0.8</sld:CssParameter></sld:Stroke></sld:PolygonSymbolizer><sld:TextSymbolizer><sld:Label><ogc:PropertyName>city_name</ogc:PropertyName></sld:Label><sld:Font><sld:CssParameter name="font-family">楷体</sld:CssParameter><sld:CssParameter name="font-size">22</sld:CssParameter><sld:CssParameter name="font-style">Regular</sld:CssParameter><sld:CssParameter name="font-weight">normal</sld:CssParameter></sld:Font><sld:LabelPlacement><sld:PointPlacement><sld:AnchorPoint><sld:AnchorPointX>0.5</sld:AnchorPointX><sld:AnchorPointY>0.5</sld:AnchorPointY></sld:AnchorPoint></sld:PointPlacement></sld:LabelPlacement><sld:Fill><sld:CssParameter name="fill">#FFFFFF</sld:CssParameter></sld:Fill></sld:TextSymbolizer></sld:Rule></sld:FeatureTypeStyle>
</sld:UserStyle>

        以上仅是一个示例的SLD文件,大家可以根据自己的样式编辑需要来动态设置,然后使用Geotools来进行效果的浏览,也可以将结果放在Qgis中进行数据渲染。

三、总结

        以上就是本文的主要内容,本文将深入探讨如何使用 Java 语言基于 Geotools 库,通过编程的方式创建 SLD 文件,并将其生成到磁盘上,以便后续地图渲染引擎能够加载并应用这些样式配置。我们将详细阐述 SLD 文件的结构组成,解析 Geotools 中与 SLD 操作相关的类和接口,通过代码示例展示如何构建点、线、面等不同几何类型的样式规则,以及如何将这些规则组合成完整的 SLD 文件内容,并最终实现在磁盘上的存储,为 GIS 应用实现灵活多变的地图样式配置提供实战技术指导。行文仓促,定有不足之处,欢迎各位朋友在评论区批评指正,不胜感激。

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

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

相关文章

kubernetes》》k8s》》Service

Kubernetes 中的 Service 是用于暴露应用服务的核心抽象&#xff0c;为 Pod 提供稳定的访问入口、负载均衡和服务发现机制。Service在Kubernetes中代表了一组Pod的逻辑集合&#xff0c;通过创建一个Service&#xff0c;可以为一组具有相同功能的容器应用提供一个统一的入口地址…

【HDFS】EC重构过程中的校验功能:DecodingValidator

一、动机 DecodingValidator是在HDFS-15759中引入的一个用于校验EC数据重构正确性的组件。 先说下引入DecodingValidator的动机,据很多已知的ISSUE(如HDFS-14768, HDFS-15186, HDFS-15240,这些目前都已经fix了)反馈, EC在重构的时候可能会有各种各样的问题,导致数据错误…

现代c++获取linux系统架构

现代c获取linux系统架构 前言一、使用命令获取系统架构二、使用c代码获取系统架构三、验证四、总结 前言 本文介绍一种使用c获取linux系统架构的方法。 一、使用命令获取系统架构 linux系统中可以使用arch或者uname -m命令来获取当前系统架构&#xff0c;如下图所示 archuna…

didFinishLaunching 与「主线程首次 idle」, 哪个是更优的启动结束时间点 ?

结论先行 在这两个候选时间点里—— application:didFinishLaunchingWithOptions: 执行结束主线程第一次进入 idle&#xff08;RunLoop kCFRunLoopBeforeWaiting&#xff09; 若你只能二选一&#xff0c;以「主线程首次 idle」作为 启动结束 更合理。它比 didFinishLaunchin…

Vue3 + TypeScript中defineEmits 类型定义解析

TypeScript 中 Vue 3 的 defineEmits 函数的类型定义&#xff0c;用于声明组件可以触发的事件。以下是分步解释&#xff1a; 1. 泛型定义 ts <"closeDialog" | "getApplySampleAndItemX"> 作用&#xff1a;定义允许的事件名称集合&#xff0c;即组…

树莓派超全系列教程文档--(34)树莓派配置GPIO

配置GPIO GPIO控制gpio 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 GPIO控制 gpio 通过 gpio 指令&#xff0c;可以在启动时将 GPIO 引脚设置为特定模式和值&#xff0c;而以前需要自定义 dt-blob.bin 文件。每一行都对一组引脚应用相同的设…

AladdinEdu(H卡GPU算力平台)使用教程: 1)注册与开通流程 2)插件使用流程

一、注册与开通流程 首先进入AladdinEdu官网&#xff1a;AladdinEdu-同学们用得起的H卡算力平台-高效做AI就上Aladdin 完成注册&#xff0c;并进行学生认证&#xff1a;学生认证账户&#xff0c;认证期间享受教育优惠价。 登录官网进入控制台 二、插件使用流程 VScode中…

精益数据分析(6/126):深入理解精益分析的核心要点

精益数据分析&#xff08;6/126&#xff09;&#xff1a;深入理解精益分析的核心要点 在创业和数据驱动的时代浪潮中&#xff0c;我们都在不断探索如何更好地利用数据推动业务发展。我希望通过和大家分享对《精益数据分析》的学习心得&#xff0c;一起在这个充满挑战和机遇的领…

2.深入剖析 Rust+Axum 类型安全路由系统

摘要 详细解读 RustAxum 路由系统的关键设计原理&#xff0c;涵盖基于 Rust 类型系统的路由匹配机制、动态路径参数与正则表达式验证以及嵌套路由与模块化组织等多种特性。 一、引言 在现代 Web 开发中&#xff0c;路由系统是构建 Web 应用的核心组件之一&#xff0c;它负责…

运筹学之模拟退火

目录 一、历史二、精髓思想三、案例与代码实现 一、历史 问&#xff1a;谁在什么时候提出模拟退火&#xff1f;答&#xff1a;模拟退火算法&#xff08;Simulated Annealing&#xff0c;SA&#xff09;是由斯图尔特柯尔斯基&#xff08;Scott Kirkpatrick&#xff09; 等人在 …

android测试依赖

Android 项目中常用的测试相关库 1. androidx.arch.core:core-testing:2.2.0 作用&#xff1a; 提供与 Android Architecture Components&#xff08;如 LiveData、ViewModel&#xff09;相关的测试工具。主要用于测试基于 LiveData 的异步操作。 常见功能&#xff1a; 即时…

stack,queue和priority_queue

1. stack 1.1 stack 的介绍 栈是一种容器适配器&#xff0c;专门设计用于LIFO环境&#xff08;后进先出&#xff09;&#xff0c;其中元素仅从容器的一端插入和提取。 容器适配器&#xff0c;也就是使用特定容器类的封装对象作为其底层容器&#xff0c;提供一组特定的成员函…

MinnowBoard MAX单板UEFI BIOS代码编译教程

此教程用于UEFI EDK2代码的研究&#xff0c;虽然EDK2框架代码开源&#xff0c;但是都是在模拟器上跑仿真&#xff0c;差点意思&#xff0c;搞过嵌入式的应该有一个共识&#xff0c;是骡子是马&#xff0c;你得把板子点亮啊。MinnowBoard MAX单板是intel10多年前发布的软硬件全部…

AI Transformers 架构体系 权重文件类型 safeterson和gguf格式转换【2-1】

模型权重文件&#xff1a;存储训练好的模型参数,也就是w和b&#xff0c;是模型推理和微调的基础 .pt、.ckpt、.safetensors、gguf 配置文件&#xff1a;确保模型架构的一致性&#xff0c;使得权重文件能够正确加载 config.json、generation_config.json 词汇表文件&#xff1a;…

K8S微服务部署及模拟故障观测

概述 本文介绍了如何在 Kubernetes (K8S) 集群中部署微服务&#xff0c;并模拟常见的故障场景&#xff08;如 Pod 故障、节点故障、网络故障&#xff09;以测试系统的容错能力。通过本实验&#xff0c;了解 Kubernetes 的自动恢复机制以及如何通过监控和日志分析快速定位和解决…

OpenStack Yoga版安装笔记(23)Swift安装

一、官方文档 Object Storage Install Guide — Swift 2.29.3.dev5 documentation 二、环境准备 之前的实验&#xff0c;已经有controller, compute1, block1节点&#xff0c;并已经完成Keystone、Glance、Nova、Neutron、Cinder等主要OpenStack Service的安装。 此处新增…

06-libVLC的视频播放器:推流RTMP

创建媒体对象 libvlc_media_t* m = libvlc_media_new_path(m_pInstance, inputPath.toStdString().c_str()); if (!m) return -1; // 创建失败返回错误 libvlc_media_new_path:根据文件路径创建媒体对象。注意:toStdString().c_str() 在Qt中可能存在临时字符串析构问题,建议…

少儿编程路线规划

少儿编程路线规划—一文写明白 现在有很多的编程机构&#xff0c;五花八门的。我有幸也见识到了大家的营销策略。这些策略有黑有白吧&#xff0c;从业几年&#xff0c;沉淀下来一些客户角度的干货&#xff0c;分享给大家。 如果是想以很远很远的就业为目的&#xff0c;毕业就…

ios app的ipa文件提交最简单的方法

ipa文件是ios的app打包后生成的二级制文件&#xff0c;在上架app store connect或做testflight测试的时候&#xff0c;它提示我们需要使用xcode、transporter或xcode命令行等方式来上传。 而xcode、transporter或xcode命令行的安装都需要使用mac电脑&#xff0c;假如没有mac电…

怎么查看LLM Transformer 架构进行并行计算和设备映射

怎么查看LLM Transformer 架构进行并行计算和设备映射 num_hidden_layers = model.config.num_hidden_layers print(num_hidden_layers) print(model) LLM(大语言模型)通常是基于 Transformer 架构 构建的,它由多个模块化的层(Layer)堆叠组成,每个层都有其独特的作用。…