基于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的使用默认浏览器打开,但是这种做法在我的程序里不是很友好,我需要自定义这种行为,当我点击我自己的链接的时候,使用默认浏览器打开,当点击别的链接的…...

【大模型基础_毛玉仁】1.1 基于统计方法的语言模型
【大模型基础_毛玉仁】1.1 基于统计方法的语言模型 1.语言模型基础1.1 基于统计方法的语言模型1.1.1 n-grams 语言模型1.1.2 n-grams 的统计学原理 1.语言模型基础 语言是概率的。语言模型(LanguageModels, LMs)旨在准确预测语言符号的概率。 将按照语…...

使用 Docker 部署 RabbitMQ 并实现数据持久化
非常好!以下是一份完整的 Docker 部署 RabbitMQ 的博客文档,包含从安装到问题排查的详细步骤。你可以直接将其发布到博客中。 使用 Docker 部署 RabbitMQ 并实现数据持久化 RabbitMQ 是一个开源的消息队列系统,广泛应用于分布式系统中。使用…...

Pandas的数据转换函数
Pandas的数据转换函数:map, apply, applymap 参数描述map只用于Series,实现每个值->值的映射apply用于Series实现每个值的处理,用于DataFrame实现某个轴的Series的处理applymap只能用于DataFrame, 用于处理该DataFrame的每个元素 1. map用于Series值…...

影刀 RPA 实战开发阶段总结
目录 1. 影刀 RPA 官方教程的重要性 1.1系统全面的知识体系 1.2 权威准确的技术指导 1.3 贴合实际的案例教学 1.4高效的学习方法引导 2. 官方视频教程与实战 2.1 官方视频教程:奠定坚实基础 2.2 实战:拓展应用视野 3. 往期实战博文导航 3.1 初级…...

Linux系统上安装kafka
目录 1. 安装Java环境 2. 下载和解压Kafka 3. 配置Kafka 4. 启动ZooKeeper和Kafka 5. 测试Kafka 6. 停止服务 7.常见问题 1. 安装Java环境 Kafka依赖Java运行环境(JDK 8或更高版本): # 安装OpenJDK(推荐) yum…...

DeepSeek如何快速开发PDF转Word软件
一、引言 如今,在线工具的普及让PDF转Word成为了一个常见需求,常见的PDF转Word工具有收费的WPS,免费的有PDFGear,以及在线工具SmallPDF、iLovePDF、24PDF等。然而,大多数免费在线转换工具存在严重隐私风险——文件需上…...

虚拟机 | Ubuntu图形化系统: open-vm-tools安装失败以及实现文件拖放
系列文章目录 虚拟机 | Ubuntu 安装流程以及界面太小问题解决 文章目录 系列文章目录虚拟机 | Ubuntu 安装流程以及界面太小问题解决 前言一、VMware Tools 和 open-vm-tools 是什么1、VMware Tools2、open-vm-tools 二、推荐使用open-vm-tools(简单)1、…...

Mysql-经典故障案例(1)-主从同步由于主键问题引发的故障
故障报错 Could not execute Write_rows event on table test.users; Duplicate entry 3 for key PRIMARY, Error_code: 1062; handler error HA_ERR_FOUND_DUPP_KEY; the events master log mysql-bin.000031, end_log_pos 3297这是由于从库存在与主库相同主键值,…...

Linux下学【MySQL】中如何实现:多表查询(配sql+实操图+案例巩固 通俗易懂版~)
每日激励:“不设限和自我肯定的心态:I can do all things。 — Stephen Curry” 绪论: 本章是MySQL篇中,非常实用性的篇章,相信在实际工作中对于表的查询,很多时候会涉及多表的查询,在多表查询…...

ubuntu局域网部署stable-diffusion-webui记录
需要局域网访问,如下设置: 过程记录查看源码: 查看源码,原来修改参数:--server-name 故启动: ./webui.sh --server-name0.0.0.0 安装下载记录: 快速下载可设置: export HF_ENDPOI…...