使用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文件,在程序中可能需要依赖的相关类如下:
| 序号 | 类名 | 作用 |
| 1 | org.geotools.styling.StyleFactory | 样式工厂 |
| 2 | org.geotools.styling.FilterFactory2 | 升级版样式工厂 |
| 3 | org.geotools.xml.styling.SLDTransformer | sld转换器 |
| 4 | org.geotools.data.DataStoreFinder | 数据源查找器 |
| 5 | org.geotools.data.FeatureSource | 要素资源 |
| 6 | org.geotools.data.Query | CQL查询对象 |
| 7 | org.geotools.styling.Style | style样式对象 |
| 8 | org.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 应用实现灵活多变的地图样式配置提供实战技术指导。行文仓促,定有不足之处,欢迎各位朋友在评论区批评指正,不胜感激。
相关文章:
使用Java基于Geotools的SLD文件编程式创建与磁盘生成实战
前言 在地理信息系统(GIS)领域,地图的可视化呈现至关重要,而样式定义语言(SLD)文件为地图元素的样式配置提供了强大的支持。SLD 能够精确地定义地图图层中各类要素(如点、线、面、文本等&#x…...
Git 命令速查手册
听说用美图可以钓读者? 一、基础操作核心命令 1. 仓库初始化与克隆 命令作用示例git init创建新仓库git init my-projectgit clone克隆远程仓库git clone [https://github.com/user/repo.git](https://github.com/user/repo.git)git remote add关联远程仓库git re…...
PKI 公钥基础设施
PKI 的全称是公钥基础设施(Public Key Infrastructure),是一个基于公钥加密技术,为网络环境中的各种应用提供安全服务的基础设施,由多个部分组成,各部分协同工作以实现数字证书的管理、密钥的生成与管理以及…...
android测试硬件工具 安卓硬件测试命令
Android开发常用ADB命令大全 在Android开发过程中,ADB(Android Debug Bridge)是一个非常重要的调试工具。掌握这些命令可以大大提高开发效率。如果你正在使用克魔开发助手(Keymob)这样的开发工具,你会发现它已经集成了很多ADB功能,让调试变得…...
网络编程 - 4 ( TCP )
目录 TCP 流套接字编程 API 介绍 SeverSocket Socket 用 TCP 实现一个回显服务器 服务端 客户端 运行调试 第一个问题:PrintWriter 内置的缓冲区 - flush 刷新解决 第二个问题:上述代码中,需要进行 close 操作吗? 第三…...
OSPF综合实验(HCIP)
1,R5为ISP,其上只能配置Ip地址;R4作为企业边界路由器, 出口公网地址需要通过ppp协议获取,并进行chap认证 2,整个OSPF环境IP基于172.16.0.0/16划分; 3,所有设备均可访问R5的环回&…...
真实波幅策略思路
该策略是一种基于ATR(Average True Range)指标的交易策略,主要用于期货市场中的日内交易。策略的核心思想是利用ATR指标来识别市场的波动范围,并结合均线过滤来确定买入和卖出的时机。 交易逻辑思维 1. 数据准备与初始化 - 集合竞…...
ESB —— 企业集成架构的基石:功能、架构与应用全解析
企业服务总线(Enterprise Service Bus,ESB)是一种重要的企业级集成架构,以下为你详细介绍: 一、概念与定义 ESB 是一种基于面向服务架构(SOA)的中间件技术,它充当了企业内部不同应…...
leetcode 674. Longest Continuous Increasing Subsequence
目录 题目描述 第一步,明确并理解dp数组及下标的含义 第二步,分析明确并理解递推公式 第三步,理解dp数组如何初始化 第四步,理解遍历顺序 代码 题目描述 这是动态规划解决子序列问题的例子。与第300题的唯一区别就是&#…...
STM32 外部中断EXTI
目录 外部中断基础知识 STM32外部中断框架 STM32外部中断机制框架 复用功能 重映射 中断嵌套控制器NVIC 外部中断按键控制LED灯 外部中断基础知识 STM32外部中断框架 中断的概念:在主程序运行过程中,出现了特点的中断触发条件,使得…...
Linux:基础IO---动静态库
文章目录 1. 动静态库前置知识1.1 动静态库知识回顾1.2 什么是动静态库 2. 动静态库2.1 站在库的制作者的角度2.2 站在库的使用者的角度2.3 动态库是怎么被加载的(原理) 序:上一篇文章我们从认识到理解,从理解到实现场景ÿ…...
深度学习-torch,全连接神经网路
3. 数据集加载案例 通过一些数据集的加载案例,真正了解数据类及数据加载器。 3.1 加载csv数据集 代码参考如下 import torch from torch.utils.data import Dataset, DataLoader import pandas as pd class MyCsvDataset(Dataset):def __init__(self, fil…...
SQL注入相关知识
一、布尔盲注 1、布尔盲简介 布尔盲注是一种SQL注入攻击技术,用于在无法直接获取数据库查询结果的情况下,通过页面的响应来判断注入语句的真假,从而获取数据库中的敏感信息 2、布尔盲注工作原理 布尔盲注的核心在于利用SQL语句的布尔逻辑…...
Codex CLI - 自然语言命令行界面
本文翻译整理自:https://github.com/microsoft/Codex-CLI 文章目录 一、关于 Codex CLI相关链接资源 二、安装系统要求安装步骤 三、基本使用1、基础操作2、多轮模式 四、命令参考五、提示工程与上下文文件自定义上下文 六、故障排查七、FAQ如何查询可用OpenAI引擎&…...
实现窗口函数
java 实现窗口函数 public class SlidingWin {public static void main(String[] args) {SlidingWin slidingWin new SlidingWin();double v slidingWin.SlidWin(2);System.out.println(v);}public double SlidWin(int k){int [] array new int[]{2,4,5,6,9,10,12,23,1,3,8…...
pycharm中怎么解决系统cuda版本高于pytorch可以支持的版本的问题?
在PyCharm中安装与系统CUDA版本不一致的PyTorch是可行的。以下是解决方案的步骤: 1. 确认系统驱动兼容性 检查NVIDIA驱动支持的CUDA版本:运行 nvidia-smi,右上角显示的CUDA版本是驱动支持的最高版本。只要该版本不低于PyTorch所需的CUDA版本…...
Day57 | 79. 单词搜索、89. 格雷编码
79. 单词搜索 题目链接:79. 单词搜索 - 力扣(LeetCode) 题目难度:中等 代码: class Solution {public boolean exist(char[][] board, String word) {char[] wordsword.toCharArray();for(int i0;i<board.lengt…...
清华《数据挖掘算法与应用》K-means聚类算法
使用k均值聚类算法对表4.1中的数据进行聚类。代码参考P281。 创建一个名为 testSet.txt 的文本文件,将以下内容复制粘贴进去保存即可: 0 0 1 2 3 1 8 8 9 10 10 7 表4.1 # -*- coding: utf-8 -*- """ Created on Thu Apr 17 16:59:58 …...
MATLAB - 小车倒立摆的非线性模型预测控制(NMPC)
系列文章目录 目录 系列文章目录 前言 一、摆锤/小车组件 二、系统方程 三、控制目标 四、控制结构 五、创建非线性 MPC 控制器 六、指定非线性设备模型 七、定义成本和约束 八、验证非线性 MPC 控制器 九、状态估计 十、MATLAB 中的闭环仿真 十一、使用 MATLAB 中…...
深入解析进程与线程:区别、联系及Java实现
引言 在现代操作系统中,进程和线程是并发编程的两大核心概念。理解它们的区别与联系对开发高性能、高可靠性的程序至关重要。本文将通过原理分析和Java代码示例,深入探讨这两个关键概念。 一、基本概念 1.1 进程(Process) 定义&…...
【Flutter深度解析】多线程编程
Flutter作为单线程模型的框架,在处理复杂计算时可能会遇到性能瓶颈。本文将全面剖析Flutter中的多线程编程方案,帮助你充分利用设备的多核性能,构建流畅的Dart应用。 一、Flutter线程模型基础 1. Dart的单线程事件循环 Flutter应用运行在单…...
HAL库配置RS485+DMA+空闲中断收发数据
前言: (1)DMA是单片机集成在芯片内部的一个数据搬运工,它可以代替单片机对数据进行传输、存储,节约CPU资源。一般应用场景,ADC多通道采集,串口收发(频繁进入接收中断)&a…...
【java实现+4种变体完整例子】排序算法中【计数排序】的详细解析,包含基础实现、常见变体的完整代码示例,以及各变体的对比表格
以下是计数排序的详细解析,包含基础实现、常见变体的完整代码示例,以及各变体的对比表格: 一、计数排序基础实现 原理 通过统计每个元素的出现次数,按顺序累加得到每个元素的最终位置,并填充到结果数组中。 代码示…...
嵌入式单片机开发 - Keil MDK 编译与烧录程序
Keil MDK 编译程序 1、Keil MDK 编译按钮 Build 按钮:重新编译整个工程的所有源文件,无论它们是否被修改过 Rebuild 按钮:仅编译修改过的文件及其依赖项,未修改的文件直接使用之前的编译结果 2、Keil MDK 编译结果 linking... …...
裂项法、分式分解法——复杂分式的拆解
目录 一、裂项法 1. 核心思想 2. 适用场景 3. 步骤 4. 例题 二、分式分解 1. 核心思想 2. 适用场景 3. 步骤 4.例题 一、裂项法 1. 核心思想 将一项拆解为多项之差,使得在求和时中间项相互抵消,最终仅剩首尾少数项。 2. 适用场景 级数求和…...
黑马点评秒杀优化
异步优化秒杀业务 回顾之前的内容黑马点评 秒杀优惠券集群下一人一单超卖问题-CSDN博客,为了处理并发情况下的线程安全和数据一致性的问题,我们已经完成了查询优惠券信息、判断秒杀是否开始和结束、检查库存、用户ID加锁、创建订单和扣减库存。 尽管之前…...
JavaScript 的演变:2023-2025 年的新特性解析
随着Web技术的飞速发展,ECMAScript(简称ES)作为JavaScript的语言标准,也在不断进化。 本文将带你学习 ECMAScript 2023-2025 的新特性。 一、ECMAScript 2023 新特性 1.1 数组的扩展 Array.prototype.findLast()/Array.protot…...
[Java · 初窥门径] Java 注释符
🌟 想系统化学习 Java 编程?看看这个:[编程基础] Java 学习手册 0x01:Java 注释符简介 在编写程序时,为了使代码易于理解,通常会为代码加一些注释。Java 注释就是用通俗易懂的语言对代码进行描述或解释&a…...
Spring MVC 全栈指南:RESTful 架构、核心注解与 JSON 实战解析
目录 RESTful API 设计规范Spring MVC 核心注解解析静态资源处理策略JSON 数据交互全解高频问题与最佳实践 一、RESTful API 设计规范 1.1 核心原则 原则说明示例 URI资源为中心URI 使用名词(复数形式)/users ✔️ /getUser ❌HTTP 方法语义化GET&…...
【web服务_负载均衡Nginx】三、Nginx 实践应用与高级配置技巧
一、Nginx 在 Web 服务器场景中的深度应用 1.1 静态网站部署与优化 在 CentOS 7 系统中,使用 Nginx 部署静态网站是最基础也最常见的应用场景。首先,准备网站文件,在/var/www/html目录下创建index.html文件: sudo mkdir -p…...
