基于GeoTools的GIS专题图自适应边界及高宽等比例生成实践
目录
前言
一、原来的生成方案问题
1、无法自动读取数据的Bounds
2、专题图高宽比例不协调
二、专题图生成优化
1、直接读取矢量数据的Bounds
2、专题图成果抗锯齿
3、专题成果高宽比例自动调节
三、总结
前言
在当今数字化浪潮中,地理信息系统(GIS)的应用场景日益丰富,从城市规划到环境监测,从交通运输到资源管理,GIS 技术为各领域提供了强大的空间数据分析与可视化支持。而专题图作为 GIS 表达的重要形式,其生成质量直接影响着信息传达的准确性和直观性。以下图为例,要求绘制与湖南省相邻的其它市级行政区划的专题图:
传统的 GIS 专题图制作往往面临着诸多挑战。一方面,地图边界固定,当面对不同尺度或范围的数据时,要么出现数据超出边界的情况,要么导致画面留白过多,严重影响视觉效果与信息呈现完整性。另一方面,高宽比例的把控难度较大,不同数据集或应用场景下,要确保地图在各种尺寸的屏幕和页面布局中保持协调的比例展示,避免图形拉伸或压缩变形,这需要耗费大量的时间和精力进行手动调整,极大地降低了工作效率,也难以满足批量生产与动态更新的需求。
GeoTools 作为一款功能强大的开源 GIS 工具库,为解决上述问题提供了丰富的 API 和灵活的开发框架。利用 GeoTools,开发者能够深入底层数据处理与图形渲染流程,实现对专题图生成过程的精细化管控。通过自定义投影变换、数据裁剪算法以及图形布局策略,可以轻松应对各种复杂场景,让专题图自动适应不同边界,并始终保持高宽等比例的精准呈现。
本文将深入探讨基于 GeoTools 实现 GIS 专题图自适应边界及高宽等比例生成的实践方法。从 GeoTools 的环境搭建与核心模块介绍入手,详细讲解如何利用其数据访问、样式定义和渲染引擎等功能,结合实际案例代码演示,逐步剖析实现自动适应边界和等比例生成的关键技术要点与优化技巧。同时,还会分享在实际项目应用中的经验教训,以及如何根据业务需求进行扩展定制,旨在为广大 GIS 开发者提供一份实用、高效的解决方案参考资料,助力提升 GIS 专题图制作的自动化水平与质量,使其能够更好地服务于各行业的空间信息分析与决策支持工作。
一、原来的生成方案问题
在之前的博客中曾经介绍过,如何使用Geotools来生成shapefile的缩略图,原文地址:基于Java和GeoTools的Shapefile矢量数据缩略图生成实践,虽然实现了基本的功能。可以使用Geotools来渲染SLD样式,并且生成本地的缩略图。但是也还是存在一些点没有优化,比如以下两点。第一是没有实现自动的从待生成的Shapefile数据中获取数据的Bounds边界,而是使用Qgis软件来进行手动设置的模式。第二个是对于生成的专题图结果,专题图的高度和宽度比例跟shapefile的原始尺寸没有很好的兼容,从实际效果上来看,就是比较不协调,很生硬。下面将对这两点来进行深入说明。
1、无法自动读取数据的Bounds
为了让第一次看到博客的朋友也有一个简单的认识,这里我将原来生成图片的关键方法贴出来公共大家参考:
public static void createUSA() {long start = System.currentTimeMillis();Shp2Image shp2img = new Shp2Image();shp2img.setMap(new MapContent());String shpPath = "F:/xxx/maps/countries.shp";String sldPath = "F:/xxx/maps/countries1.1.0-2.sld";String imgPath = "D:/countries0228-美国.png";Map<String, Object> paras = new HashMap<String, Object>();double[] bbox_usa = new double[] { -145.40999, 9.93976, -65.062300,81.12722 };paras.put("bbox", bbox_usa);paras.put("width", 1020);paras.put("height", 800);shp2img.addShapeLayer(shpPath, sldPath);shp2img.getMapContent(paras, imgPath);System.out.println("生成完成,共耗时" + (System.currentTimeMillis() - start) + "ms");
}
在以上的代码中就包含了两个关键的信息。第一个就是bbox_usa,这表示漂亮国的Bbox值,也就是Bounds边界信息。 关于Bounds,可以使用Qgis或者Arcgis等软件进行获取,以Qgis为例,当我们打开一份shapefile矢量数据之后,右键属性可以看到数据的Bounds值,如下图所示:
这里的范围值就是我们需要的目标值,将上述值复制到代码中的bbox_usa数组中即可。如果是处理单张缩略图生成,使用qgis等辅助软件来帮助提取固然没有问题,如果需要批量作业,这么大量的人工干预无疑降低了工作效率。
2、专题图高宽比例不协调
关于专题图的高度和宽度比例不协调的原因其实跟边界范围差不多,但是又存在一定的差异即边界值使用qgis获取的值是非常固定的,但是生成的专题图的高度和宽度是我们通过硬编码的方式指定的,因此具体的比例与原始的数据无法实现对应,从而导致将数据渲染到图片后,整体效果是失真的,即比例非常不协调,比如在指定宽度和高度为:1068*749的设置下,湖南省的乡镇区划专题图效果如下:
通过上图可以看到,通过预设的高度和宽度不能很好的进行专题图渲染。这也是第二个需要解决的问题。
二、专题图生成优化
那么如何优化专题图的生成,让专题图做的更加美观,符合我们的业务需要呢?主要的优化方向也是包含一下三点。第一个是为了提高效率,需要使用Geotools来自动读取矢量文件的边界,以此来达到自动计算范围的目的。第二个是为了在地图放大时也能保持一定的清晰度,因此在生成PNG图片时需要抗锯齿,以此满足图片的方法需求。第三是可以根据自动读取的边界范围自动进行高度和宽度的比例自适应调整。本节将主要介绍这三点优化内容。
1、直接读取矢量数据的Bounds
在GeoTools中,要想实现自动读取Shapefile的地图边界数据,可以通过以下两种形式获取,第一个是通过Layer对象,第二个是从mapContent对象的视图对象中获取。首先来介绍如何从Layer图层对象获取,关键代码如下:
Layer layer = new FeatureLayer(featureSource, style);
this.map.addLayer(layer);
//这里这是范围
this.setEnvelope(layer.getBounds());
第二种是可以通过mapContent对象来获取,关键代码如下:
renderer.setMapContent(map);
// 从MapContent中获取地图边界范围
ReferencedEnvelope bounds = map.getViewport().getBounds();
以上者两种方法都是可以的,大家可以根据实际情况使用。
2、专题图成果抗锯齿
针对专题图生成后,如果有图片放大的需求,在放大的时候就会失真,这时候就需要进行抗锯齿的设置。这要求在进行专题图的图片渲染输出时,设置图片渲染的参数,以此来进行图片的抗锯齿效果,实现关键代码如下:
/**
* 设置抗锯齿以及其他相关渲染提示。
* @param g2d 绘制目标的 {@link Graphics2D} 上下文。
*/
private static void setAntiAliasing(Graphics2D g2d,int width,int height) {g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER));g2d.setColor(Color.WHITE);g2d.fillRect(0, 0, width,height);// 启用抗锯齿g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);g2d.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON);g2d.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE);g2d.setRenderingHint(RenderingHints.KEY_COLOR_RENDERING, RenderingHints.VALUE_COLOR_RENDER_QUALITY);g2d.setRenderingHint(RenderingHints.KEY_ALPHA_INTERPOLATION, RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY);g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_GASP);g2d.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
}
3、专题成果高宽比例自动调节
要想实现专题成果图的尺寸比例自动调节,最关键的操作是需要知道本身数据的高宽比,通过固定的高宽比来求解实际生成图片的高宽,这样设置的效果应该是比较符合实际需要的专题图的。所以问题的关键就是自动计算高宽比,而矢量文件的高宽我们可以通过bounds来获取。因此高宽比可以通过bounds的高度和宽度的计算得到。
// 输出图像大小(例如:宽度x高度)
int width = 1920; // 可根据需求调整
// 计算地理宽高比
double aspectRatio = bounds.getWidth() / bounds.getHeight();
//根据比例计算新高度
int height = (int) Math.round(width / aspectRatio);
上面代码中的1920只是一个示意,实际情况可以设置成一个范围值,固定了宽度后,可以根据宽高比自动计算另一个参数,在得到Height后,再进行画布的渲染和出图。关键代码如下:
// 创建一个缓冲区用于接收渲染的结果
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB_PRE);
Graphics2D gr = image.createGraphics();
// 设置渲染提示以提高质量和减少锯齿
setAntiAliasing(gr,width,height);
最终可以得到一张比较符合我们业务需要的专题图,如下图所示,可以看到,专题图的边界范围是自动获取、图片放大后锯齿感比较小,经过计算高宽比之后的图片尺寸,看起来也比较协调:
三、总结
以上就是本文的主要内容,本文将深入探讨基于 GeoTools 实现 GIS 专题图自适应边界及高宽等比例生成的实践方法。从 GeoTools 的环境搭建与核心模块介绍入手,详细讲解如何利用其数据访问、样式定义和渲染引擎等功能,结合实际案例代码演示,逐步剖析实现自动适应边界和等比例生成的关键技术要点与优化技巧。同时,还会分享在实际项目应用中的经验教训,以及如何根据业务需求进行扩展定制,旨在为广大 GIS 开发者提供一份实用、高效的解决方案参考资料,助力提升 GIS 专题图制作的自动化水平与质量,使其能够更好地服务于各行业的空间信息分析与决策支持工作。行文仓促,定有不当之处,恳请各位专家学者博友在评论区留下宝贵的意见,万分感激。
相关文章:

基于GeoTools的GIS专题图自适应边界及高宽等比例生成实践
目录 前言 一、原来的生成方案问题 1、无法自动读取数据的Bounds 2、专题图高宽比例不协调 二、专题图生成优化 1、直接读取矢量数据的Bounds 2、专题图成果抗锯齿 3、专题成果高宽比例自动调节 三、总结 前言 在当今数字化浪潮中,地理信息系统(…...

各种DCC软件使用Datasmith导入UE教程
3Dmax: 先安装插件 https://www.unrealengine.com/zh-CN/datasmith/plugins 左上角导出即可 虚幻中勾选3个插件,重启引擎 左上角选择文件导入即可 Blender导入Datasmith进UE 需要两个插件, 文章最下方链接进去下载安装即可 一样的,直接导出,然后UE导入即可 C4D 直接保存成…...

尚硅谷爬虫note15
一、当当网 1. 保存数据 数据交给pipelines保存 items中的类名: DemoNddwItem class DemoNddwItem(scrapy.Item): 变量名 类名() book DemoNddwItem(src src, name name, price price)导入: from 项目名.items import 类…...

云原生系列之本地k8s环境搭建
前置条件 Windows 11 家庭中文版,版本号 23H2 云原生环境搭建 操作系统启用wsl(windows subsystem for linux) 开启wsl功能,如下图 安装并开启github加速器 FastGithub 2.1 下载地址:点击下载 2.2 解压安装文件fastgithub_win-x64.zip 2…...

关于tomcat使用中浏览器打开index.jsp后中文显示不正常是乱码,但英文正常的问题
如果是jsp文件就在首行加 “<% page language"java" contentType"text/html; charsetUTF-8" pageEncoding"UTF-8" %>” 如果是html文件 在head标签加入: <meta charset"UTF-8"> 以jsp为例子,我们…...
mysql foreign_key_checks
foreign_key_checks是一个用于设置是否在DML/DDL操作中检查外键约束的系统变量。该变量默认启用,通常在正常操作期间启用以强制执行参照完整性。 功能描述 foreign_key_checks用于控制是否在DML(数据操纵语言)和DDL(数据定义…...

开发环境搭建-06.后端环境搭建-前后端联调-Nginx反向代理和负载均衡概念
一.前后端联调 我们首先来思考一个问题 前端的请求地址是:http://localhost/api/employee/login 后端的接口地址是:http://localhost:8080/admin/employee/login 明明请求地址和接口地址不同,那么前端是如何请求到后端接口所响应回来的数…...
REST API前端请求和后端接收
1、get请求,带"?" http://localhost:8080/api/aop/getResult?param123 GetMapping("getResult")public ResponseEntity<String> getResult(RequestParam("param") String param){return new ResponseEntity<>("12…...
道可云人工智能每日资讯|《奇遇三星堆》VR沉浸探索展(淮安站)开展
道可云元宇宙每日简报(2025年3月5日)讯,今日元宇宙新鲜事有: 《奇遇三星堆》VR沉浸探索展(淮安站)开展 近日,《奇遇三星堆》VR沉浸探索展(淮安站)开展。该展将三星堆文…...

服务器数据恢复—raid5阵列中硬盘掉线导致上层应用不可用的数据恢复案例
服务器数据恢复环境&故障: 某公司一台服务器,服务器上有一组由8块硬盘组建的raid5磁盘阵列。 磁盘阵列中2块硬盘的指示灯显示异常,其他硬盘指示灯显示正常。上层应用不可用。 服务器数据恢复过程: 1、将服务器中所有硬盘编号…...
【Pandas】pandas Series swaplevel
Pandas2.2 Series Computations descriptive stats 方法描述Series.argsort([axis, kind, order, stable])用于返回 Series 中元素排序后的索引位置的方法Series.argmin([axis, skipna])用于返回 Series 中最小值索引位置的方法Series.argmax([axis, skipna])用于返回 Series…...

esp32s3聊天机器人(二)
继续上文,硬件软件准备齐全,介绍一下主要用到的库 sherpa-onnx 开源的,语音转文本、文本转语音、说话人分类和 VAD,关键是支持C#开发 OllamaSharp 用于连接ollama,如其名C#开发 虽然离可玩还有一段距离࿰…...

pyside6学习专栏(九):在PySide6中使用PySide6.QtCharts绘制6种不同的图表的示例代码
PySide6的QtCharts类支持绘制各种型状的图表,如面积区域图、饼状图、折线图、直方图、线条曲线图、离散点图等,下面的代码是采用示例数据绘制这6种图表的示例代码,并可实现动画显示效果,实际使用时参照代码中示例数据的格式将实际数据替换即可…...

DVI分配器2进4出,2进8出,2进16出,120HZ
DVI(Digital Visual Interface)分配器GEFFEN/HDD系列是一种设备,它能够将一个DVI信号源的内容复制到多个显示设备上。根据您提供的信息,这里我们关注的是具有2个输入端口和多个(4个、8个或16个)输出端口的D…...
迷你世界脚本文字板接口:Graphics
文字板接口:Graphics 彼得兔 更新时间: 2024-08-27 11:12:18 具体函数名及描述如下: 序号 函数名 函数描述 1 makeGraphicsText(...) 创建文字板信息 2 makeflotageText(...) 创建漂浮文字信息 3 makeGraphicsProgress(...) 创建进度条信息…...

5分钟速览深度学习经典论文 —— attention is all you need
《Attention is All You Need》是一篇极其重要的论文,它提出的 Transformer 模型和自注意力机制不仅推动了 NLP 领域的发展,还对整个深度学习领域产生了深远影响。这篇论文的重要性体现在其开创性、技术突破和广泛应用上,是每一位深度学习研究…...

Cursor + IDEA 双开极速交互
相信很多开发者朋友应该和我一样吧,都是Cursor和IDEA双开的开发模式:在Cursor中快速编写和生成代码,然后在IDEA中进行调试和优化 在这个双开模式的开发过程中,我就遇到一个说大不大说小不小的问题: 得在两个编辑器之间来回切换查…...

HDFS的设计架构
HDFS 是 Hadoop 生态系统中的分布式文件系统,设计用于存储和处理超大规模数据集。它具有高可靠性、高扩展性和高吞吐量的特点,适合运行在廉价硬件上。 1. HDFS 的设计思想 HDFS 的设计目标是解决大规模数据存储和处理的问题,其核心设计思想…...
为wordpress自定义一个留言表单并可以在后台进行管理的实现方法
要为WordPress添加留言表单功能并实现后台管理,你可以按照以下步骤操作: 1. 创建留言表单 首先,你需要创建一个留言表单。可以使用插件(如Contact Form 7)或手动编写代码。 使用Contact Form 7插件 安装并激活Contact Form 7插件。 创建…...

tauri-plugin-shell插件将_blank的a标签用浏览器打开了,,,解决办法
不要使用这个插件,这个插件默认会将网页中a标签为_blank的使用默认浏览器打开,但是这种做法在我的程序里不是很友好,我需要自定义这种行为,当我点击我自己的链接的时候,使用默认浏览器打开,当点击别的链接的…...

PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建
制造业采购供应链管理是企业运营的核心环节,供应链协同管理在供应链上下游企业之间建立紧密的合作关系,通过信息共享、资源整合、业务协同等方式,实现供应链的全面管理和优化,提高供应链的效率和透明度,降低供应链的成…...

vscode(仍待补充)
写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh? debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...
Neo4j 集群管理:原理、技术与最佳实践深度解析
Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...

手机平板能效生态设计指令EU 2023/1670标准解读
手机平板能效生态设计指令EU 2023/1670标准解读 以下是针对欧盟《手机和平板电脑生态设计法规》(EU) 2023/1670 的核心解读,综合法规核心要求、最新修正及企业合规要点: 一、法规背景与目标 生效与强制时间 发布于2023年8月31日(OJ公报&…...
Qt 事件处理中 return 的深入解析
Qt 事件处理中 return 的深入解析 在 Qt 事件处理中,return 语句的使用是另一个关键概念,它与 event->accept()/event->ignore() 密切相关但作用不同。让我们详细分析一下它们之间的关系和工作原理。 核心区别:不同层级的事件处理 方…...

nnUNet V2修改网络——暴力替换网络为UNet++
更换前,要用nnUNet V2跑通所用数据集,证明nnUNet V2、数据集、运行环境等没有问题 阅读nnU-Net V2 的 U-Net结构,初步了解要修改的网络,知己知彼,修改起来才能游刃有余。 U-Net存在两个局限,一是网络的最佳深度因应用场景而异,这取决于任务的难度和可用于训练的标注数…...
【FTP】ftp文件传输会丢包吗?批量几百个文件传输,有一些文件没有传输完整,如何解决?
FTP(File Transfer Protocol)本身是一个基于 TCP 的协议,理论上不会丢包。但 FTP 文件传输过程中仍可能出现文件不完整、丢失或损坏的情况,主要原因包括: ✅ 一、FTP传输可能“丢包”或文件不完整的原因 原因描述网络…...

C++_哈希表
本篇文章是对C学习的哈希表部分的学习分享 相信一定会对你有所帮助~ 那咱们废话不多说,直接开始吧! 一、基础概念 1. 哈希核心思想: 哈希函数的作用:通过此函数建立一个Key与存储位置之间的映射关系。理想目标:实现…...

相关类相关的可视化图像总结
目录 一、散点图 二、气泡图 三、相关图 四、热力图 五、二维密度图 六、多模态二维密度图 七、雷达图 八、桑基图 九、总结 一、散点图 特点 通过点的位置展示两个连续变量之间的关系,可直观判断线性相关、非线性相关或无相关关系,点的分布密…...