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

使用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 应用实现灵活多变的地图样式配置提供实战技术指导。行文仓促,定有不足之处,欢迎各位朋友在评论区批评指正,不胜感激。

Read more

双指针算法详解:从原理到实战(含LeetCode经典例题)

双指针算法详解:从原理到实战(含LeetCode经典例题)

欢迎来到 s a y − f a l l 的文章 欢迎来到say-fall的文章 欢迎来到say−fall的文章 🌈say-fall:个人主页🚀专栏:《手把手教你学会C++》 | 《C语言从零开始到精通》 | 《数据结构与算法》 | 《小游戏与项目》💪格言:做好你自己,才能吸引更多人,与他们共赢,这才是最好的成长方式。 前言: 基于数据结构的扎实基础,算法思想能够有效提升问题解决的效率。为此,我们开设一个专门的算法专栏,用来探讨各类算法题目的解决方案。 在算法学习的道路上,双指针是一种简洁、高效且应用广泛的解题思想,它并非局限于某一种特定的数据结构,而是一种通过设置两个“标记点”(指针),协同遍历、筛选或修改数据,从而简化问题复杂度的核心思路。无论是数组、链表的遍历处理,还是数值组合、环形问题的求解,双指针都能发挥其独特优势——相较于暴力枚举的多层循环,它往往能将时间复杂度从O(n²)优化至O(n)

By Ne0inhk
【强化学习】深度确定性策略梯度算法(DDPG)详解(附代码)

【强化学习】深度确定性策略梯度算法(DDPG)详解(附代码)

📢本篇文章是博主强化学习(RL)领域学习时,用于个人学习、研究或者欣赏使用,并基于博主对相关等领域的一些理解而记录的学习摘录和笔记,若有不当和侵权之处,指出后将会立即改正,还望谅解。文章分类在👉强化学习专栏:        【强化学习】- 【单智能体强化学习】(10)---《深度确定性策略梯度算法(DDPG)详解》 深度确定性策略梯度算法(DDPG)详解 目录 DDPG算法详细介绍 算法特点 核心改进点 算法公式推导 1. Q值函数更新 2. 策略更新(Actor网络) 3. 目标网络更新 算法流程 [Python] DDPG算法实现 1. 导入必要库 2. 定义 Actor 网络 3. 定义 Critic 网络 4. 定义经验回放池 5.

By Ne0inhk
Linux Socket编程核心:深入解析sockaddr数据结构族

Linux Socket编程核心:深入解析sockaddr数据结构族

Linux Socket编程核心:深入解析sockaddr数据结构族 * 引言:网络编程的基石 * 一、sockaddr:通用套接字地址结构 * 1.1 基本定义与设计哲学 * 1.2 为什么需要这样的设计? * 二、sockaddr家族成员详解 * 2.1 IPv4专用结构:sockaddr_in * 2.2 IPv6专用结构:sockaddr_in6 * 2.3 本地通信结构:sockaddr_un * 2.4 其他重要成员 * 三、字节序:网络编程的隐形陷阱 * 3.1 大端序 vs 小端序 * 3.2 常见错误示例 * 四、实际应用案例 * 4.1 创建TCP服务器

By Ne0inhk
机器学习详解(26):梯度提升决策树(GBDT)原理

机器学习详解(26):梯度提升决策树(GBDT)原理

梯度提升(Gradient Boosting)已经彻底改变了机器学习的格局,在回归和分类任务中都表现出色。梯度提升树(Gradient-Boosted Trees)被用来处理复杂的非线性数据集,将决策树的简洁性与集成学习的鲁棒性结合在一起。 文章目录 * 1 介绍 * 2 梯度提升工作原理 * 3 梯度提升的变种 * 4 代码实例 * 5 结论 1 介绍 梯度提升是一种广泛用于回归和分类的机器学习技术。它通过顺序构建预测模型,每一步都在前一步模型的基础上进行改进,以纠正错误。 组成部分 * 决策树作为基本学习器:梯度提升使用简单的决策树,按顺序构建,以纠正前一棵树的误差。 * 梯度下降算法:该算法通过迭代地改进预测来最小化损失函数。 * 损失函数优化:模型的目标是最小化损失函数,从而量化预测误差。 梯度提升树 梯度提升树(GBT)是梯度提升的基础,通过组合多棵决策树来创建强大的预测模型。每棵树都是依次构建的,重点是纠正前一棵树的残差误差。这个迭代过程增强了模型的准确性和鲁棒性。 * 构建决策树:树的划分基于特征,以最小化损失函数。 * 使

By Ne0inhk