基于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的使用默认浏览器打开,但是这种做法在我的程序里不是很友好,我需要自定义这种行为,当我点击我自己的链接的时候,使用默认浏览器打开,当点击别的链接的…...
网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...
Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)
文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...
【第二十一章 SDIO接口(SDIO)】
第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...
Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...
今日科技热点速览
🔥 今日科技热点速览 🎮 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售,主打更强图形性能与沉浸式体验,支持多模态交互,受到全球玩家热捧 。 🤖 人工智能持续突破 DeepSeek-R1&…...
pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)
目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关࿰…...
DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”
目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...
用机器学习破解新能源领域的“弃风”难题
音乐发烧友深有体会,玩音乐的本质就是玩电网。火电声音偏暖,水电偏冷,风电偏空旷。至于太阳能发的电,则略显朦胧和单薄。 不知你是否有感觉,近两年家里的音响声音越来越冷,听起来越来越单薄? —…...
MFC 抛体运动模拟:常见问题解决与界面美化
在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...
BLEU评分:机器翻译质量评估的黄金标准
BLEU评分:机器翻译质量评估的黄金标准 1. 引言 在自然语言处理(NLP)领域,衡量一个机器翻译模型的性能至关重要。BLEU (Bilingual Evaluation Understudy) 作为一种自动化评估指标,自2002年由IBM的Kishore Papineni等人提出以来,…...
